[ecflow] 01/50: ecflow 4.0.7

Alastair McKinstry mckinstry at moszumanska.debian.org
Wed Sep 20 15:30:27 UTC 2017


This is an automated email from the git hooks/post-receive script.

mckinstry pushed a commit to branch debian/master
in repository ecflow.

commit 977e3915da9a8d6e10b6d77c6b67a9e6921fd20e
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Fri May 15 09:55:45 2015 +0100

    ecflow 4.0.7
---
 ecbuild/.cproject                                  |     66 +
 ecbuild/.gitignore                                 |      2 +
 ecbuild/.project                                   |     27 +
 ecbuild/.settings/language.settings.xml            |     25 +
 ecbuild/AUTHORS                                    |     12 +
 ecbuild/CMakeLists.txt                             |     48 +
 ecbuild/COPYING                                    |    201 +
 ecbuild/INSTALL                                    |     19 +
 ecbuild/LICENSE                                    |    190 +
 ecbuild/NOTICE                                     |     10 +
 ecbuild/VERSION.cmake                              |      1 +
 ecbuild/bamboo/flags.cmake                         |      0
 ecbuild/bin/CMakeLists.txt                         |     17 +
 ecbuild/bin/apply_license.sh                       |     55 +
 ecbuild/bin/check_install.sh                       |     76 +
 ecbuild/bin/ecbuild                                |    267 +
 ecbuild/bin/git-meld                               |      3 +
 ecbuild/bin/git-mproj                              |     54 +
 ecbuild/bin/license.pl                             |    150 +
 ecbuild/cmake/2.8/CMakePushCheckState.cmake        |     61 +
 ecbuild/cmake/CMakeLists.txt                       |      5 +
 ecbuild/cmake/CheckFortranCompilerFlag.cmake       |     37 +
 ecbuild/cmake/CheckFortranSourceCompiles.cmake     |     94 +
 ecbuild/cmake/FindADSM.cmake                       |     43 +
 ecbuild/cmake/FindAEC.cmake                        |     34 +
 ecbuild/cmake/FindAIO.cmake                        |     66 +
 ecbuild/cmake/FindArmadillo.cmake                  |     33 +
 ecbuild/cmake/FindCMath.cmake                      |     23 +
 ecbuild/cmake/FindCairo.cmake                      |     58 +
 ecbuild/cmake/FindDl.cmake                         |     20 +
 ecbuild/cmake/FindEMOS.cmake                       |     37 +
 ecbuild/cmake/FindEcLib.cmake                      |     49 +
 ecbuild/cmake/FindEcregrid.cmake                   |     48 +
 ecbuild/cmake/FindFDB.cmake                        |     35 +
 ecbuild/cmake/FindGeoTIFF.cmake                    |     37 +
 ecbuild/cmake/FindHPSS.cmake                       |     39 +
 ecbuild/cmake/FindLEX.cmake                        |    129 +
 ecbuild/cmake/FindLegacyFDB.cmake                  |     35 +
 ecbuild/cmake/FindLibGFortran.cmake                |     52 +
 ecbuild/cmake/FindNDBM.cmake                       |     34 +
 ecbuild/cmake/FindNetCDF.cmake                     |    167 +
 ecbuild/cmake/FindNetCDF3.cmake                    |    129 +
 ecbuild/cmake/FindODB.cmake                        |     53 +
 ecbuild/cmake/FindOpenJPEG.cmake                   |     43 +
 ecbuild/cmake/FindPGIFortran.cmake                 |     46 +
 ecbuild/cmake/FindPango.cmake                      |     33 +
 ecbuild/cmake/FindPangoCairo.cmake                 |     91 +
 ecbuild/cmake/FindProj4.cmake                      |     67 +
 ecbuild/cmake/FindREADLINE.cmake                   |     87 +
 ecbuild/cmake/FindRPCGEN.cmake                     |     20 +
 ecbuild/cmake/FindRealtime.cmake                   |     22 +
 ecbuild/cmake/FindSZip.cmake                       |     32 +
 ecbuild/cmake/FindScin.cmake                       |     48 +
 ecbuild/cmake/FindTrilinos.cmake                   |     52 +
 ecbuild/cmake/FindXLFortranLibs.cmake              |     49 +
 ecbuild/cmake/FindYACC.cmake                       |    157 +
 ecbuild/cmake/Findgrib_api.cmake                   |    135 +
 ecbuild/cmake/Findodb_api.cmake                    |     99 +
 ecbuild/cmake/Findspot.cmake                       |     67 +
 ecbuild/cmake/VERSION.cmake                        |      7 +
 .../cmake/contrib/CheckFortranCompilerFlag.cmake   |     25 +
 .../cmake/contrib/CheckFortranSourceCompiles.cmake |     61 +
 ecbuild/cmake/contrib/FindEigen3.cmake             |     93 +
 ecbuild/cmake/contrib/FindFFTW.cmake               |    124 +
 ecbuild/cmake/contrib/FindNetCDF4.cmake            |    314 +
 ecbuild/cmake/contrib/FindNumPy.cmake              |    101 +
 .../cmake/contrib/GetGitRevisionDescription.cmake  |    123 +
 .../contrib/GetGitRevisionDescription.cmake.in     |     38 +
 .../cmake/contrib/GreatCMakeCookOff/.gitattributes |     22 +
 ecbuild/cmake/contrib/GreatCMakeCookOff/.gitignore |      6 +
 .../contrib/GreatCMakeCookOff/AddCPP11Flags.cmake  |     56 +
 .../cmake/contrib/GreatCMakeCookOff/AddGTest.cmake |     72 +
 .../GreatCMakeCookOff/CheckCXX11Features.cmake     |    197 +
 .../contrib/GreatCMakeCookOff/CheckIsNaN.cmake     |     53 +
 .../contrib/GreatCMakeCookOff/FindEigen.cmake      |    131 +
 ecbuild/cmake/contrib/GreatCMakeCookOff/LICENSE    |     20 +
 ecbuild/cmake/contrib/GreatCMakeCookOff/README.md  |    176 +
 .../contrib/GreatCMakeCookOff/TestCMake.cmake      |     58 +
 .../GreatCMakeCookOff/cpp11/__func__-N2340.cpp     |      8 +
 .../contrib/GreatCMakeCookOff/cpp11/auto-N2546.cpp |     12 +
 .../GreatCMakeCookOff/cpp11/begin_function.cc      |     12 +
 .../GreatCMakeCookOff/cpp11/constexpr-N2235.cpp    |     19 +
 .../cpp11/constructor_delegate.cpp                 |     32 +
 .../contrib/GreatCMakeCookOff/cpp11/cstdint.cpp    |     10 +
 .../GreatCMakeCookOff/cpp11/decltype-N2343.cpp     |     11 +
 .../cpp11/deleted_constructor.cpp                  |     10 +
 .../cpp11/deleted_constructor_fail_compile.cpp     |     11 +
 .../contrib/GreatCMakeCookOff/cpp11/enable_if.cpp  |      8 +
 .../GreatCMakeCookOff/cpp11/explicit_cast.cpp      |     13 +
 .../GreatCMakeCookOff/cpp11/initialization.cpp     |      7 +
 .../GreatCMakeCookOff/cpp11/lambda-N2927.cpp       |      5 +
 .../GreatCMakeCookOff/cpp11/long_double.cpp        |      4 +
 .../GreatCMakeCookOff/cpp11/long_long-N1811.cpp    |      7 +
 .../contrib/GreatCMakeCookOff/cpp11/noexcept.cpp   |      9 +
 .../GreatCMakeCookOff/cpp11/nullptr-N2431.cpp      |      5 +
 .../cpp11/nullptr-N2431_fail_compile.cpp           |      5 +
 .../contrib/GreatCMakeCookOff/cpp11/override.cpp   |     22 +
 .../cpp11/override_fail_compile.cpp                |     22 +
 .../GreatCMakeCookOff/cpp11/random_device.cpp      |     13 +
 .../cpp11/rvalue_references-N2118.cpp              |     15 +
 .../contrib/GreatCMakeCookOff/cpp11/shared_ptr.cpp |      6 +
 .../cpp11/sizeof_member-N2253.cpp                  |     14 +
 .../cpp11/static_assert-N1720.cpp                  |      5 +
 .../cpp11/static_assert-N1720_fail_compile.cpp     |      5 +
 .../GreatCMakeCookOff/cpp11/template_alias.cpp     |      8 +
 .../cpp11/trivial_type_traits.cpp                  |      7 +
 .../GreatCMakeCookOff/cpp11/type_traits.cpp        |      7 +
 .../contrib/GreatCMakeCookOff/cpp11/unique_ptr.cpp |      6 +
 .../cpp11/variadic_templates-N2555.cpp             |     23 +
 .../contrib/GreatCMakeCookOff/tests/CMakeLists.txt |     12 +
 .../contrib/GreatCMakeCookOff/tests/addgtest.cmake |     20 +
 .../GreatCMakeCookOff/tests/checkcpp11flags.cmake  |      1 +
 .../GreatCMakeCookOff/tests/checkisnan.cmake       |     19 +
 .../GreatCMakeCookOff/tests/cpp11/CMakeLists.txt   |      3 +
 .../tests/cpp11/allfeatures.cmake                  |      7 +
 .../tests/cpp11/check_features.cmake               |      9 +
 .../tests/cpp11/parse_input_features.cmake         |     68 +
 ecbuild/cmake/ecbuild_add_cxx11_flags.cmake        |     25 +
 ecbuild/cmake/ecbuild_add_executable.cmake         |    197 +
 ecbuild/cmake/ecbuild_add_extra_search_paths.cmake |     34 +
 ecbuild/cmake/ecbuild_add_library.cmake            |    328 +
 ecbuild/cmake/ecbuild_add_option.cmake             |    194 +
 ecbuild/cmake/ecbuild_add_persistent.cmake         |     61 +
 ecbuild/cmake/ecbuild_add_resources.cmake          |    158 +
 ecbuild/cmake/ecbuild_add_test.cmake               |    315 +
 ecbuild/cmake/ecbuild_append_to_rpath.cmake        |     82 +
 ecbuild/cmake/ecbuild_bundle.cmake                 |    284 +
 ecbuild/cmake/ecbuild_cache.cmake                  |     65 +
 ecbuild/cmake/ecbuild_check_c_source.cmake         |    161 +
 ecbuild/cmake/ecbuild_check_compiler.cmake         |    141 +
 ecbuild/cmake/ecbuild_check_cxx11.cmake            |     67 +
 ecbuild/cmake/ecbuild_check_cxx_source.cmake       |    160 +
 ecbuild/cmake/ecbuild_check_fortran_source.cmake   |    157 +
 ecbuild/cmake/ecbuild_check_functions.cmake        |    125 +
 ecbuild/cmake/ecbuild_check_os.cmake               |    342 +
 ecbuild/cmake/ecbuild_config.h.in                  |    167 +
 ecbuild/cmake/ecbuild_debug_var.cmake              |     35 +
 ecbuild/cmake/ecbuild_declare_project.cmake        |    151 +
 ecbuild/cmake/ecbuild_define_build_types.cmake     |    110 +
 ecbuild/cmake/ecbuild_define_options.cmake         |     40 +
 ecbuild/cmake/ecbuild_define_paths.cmake           |     41 +
 ecbuild/cmake/ecbuild_echo_targets.cmake           |    198 +
 ecbuild/cmake/ecbuild_enable_fortran.cmake         |     56 +
 ecbuild/cmake/ecbuild_find_fortranlibs.cmake       |    131 +
 ecbuild/cmake/ecbuild_find_lexyacc.cmake           |     60 +
 ecbuild/cmake/ecbuild_find_mpi.cmake               |    230 +
 ecbuild/cmake/ecbuild_find_omp.cmake               |    204 +
 ecbuild/cmake/ecbuild_find_package.cmake           |    190 +
 ecbuild/cmake/ecbuild_find_perl.cmake              |     45 +
 ecbuild/cmake/ecbuild_find_python.cmake            |    131 +
 .../cmake/ecbuild_generate_config_headers.cmake    |     47 +
 ecbuild/cmake/ecbuild_generate_rpc.cmake           |     73 +
 ecbuild/cmake/ecbuild_generate_yy.cmake            |    113 +
 ecbuild/cmake/ecbuild_get_date.cmake               |     32 +
 ecbuild/cmake/ecbuild_get_resources.cmake          |     52 +
 ecbuild/cmake/ecbuild_get_test_data.cmake          |    271 +
 ecbuild/cmake/ecbuild_install_package.cmake        |    286 +
 ecbuild/cmake/ecbuild_links_target.cmake           |     74 +
 .../cmake/ecbuild_list_extra_search_paths.cmake    |    108 +
 ecbuild/cmake/ecbuild_list_macros.cmake            |     57 +
 ecbuild/cmake/ecbuild_pkgconfig.cmake              |    365 +
 ecbuild/cmake/ecbuild_print_summary.cmake          |    115 +
 ecbuild/cmake/ecbuild_project_files.cmake          |     73 +
 ecbuild/cmake/ecbuild_requires_macro_version.cmake |     15 +
 ecbuild/cmake/ecbuild_separate_sources.cmake       |     63 +
 ecbuild/cmake/ecbuild_setup_test_framework.cmake   |     42 +
 ecbuild/cmake/ecbuild_system.cmake                 |    281 +
 ecbuild/cmake/ecbuild_use_package.cmake            |    206 +
 ecbuild/cmake/ecbuild_version.h.in                 |     20 +
 ecbuild/cmake/ecbuild_warn_unused_files.cmake      |     58 +
 .../cmake/include/ecbuild/boost_test_framework.h   |     17 +
 ecbuild/cmake/md5.in                               |      1 +
 ecbuild/cmake/pkg-config.pc.in                     |     35 +
 ecbuild/cmake/project-config-version.cmake.in      |     12 +
 ecbuild/cmake/project-config.cmake.in              |     80 +
 ecbuild/cmake/sg.pl                                |    573 +
 ecbuild/cmake/sha1.in                              |      1 +
 ecbuild/examples/cpp/bar/CMakeLists.txt            |     60 +
 ecbuild/examples/cpp/bar/VERSION.cmake             |      1 +
 ecbuild/examples/cpp/bar/bar.c                     |      6 +
 ecbuild/examples/cpp/bar/bar.h                     |      6 +
 ecbuild/examples/cpp/bar/main.cc                   |     10 +
 ecbuild/examples/cpp/bar/test.cc                   |     13 +
 .../examples/cpp/boost-python-lib/CMakeLists.txt   |     60 +
 ecbuild/examples/cpp/boost-python-lib/mypython.py  |     10 +
 .../examples/cpp/boost-python-lib/pythonlib.cpp    |      6 +
 .../examples/cpp/boost-python-lib/pythonlib.hpp    |      6 +
 ecbuild/examples/cpp/foo/CMakeLists.txt            |     62 +
 ecbuild/examples/cpp/foo/VERSION.cmake             |      1 +
 ecbuild/examples/cpp/foo/foo.c                     |      4 +
 ecbuild/examples/cpp/foo/foo.h                     |      6 +
 ecbuild/examples/cpp/foo/main.cc                   |     10 +
 ecbuild/examples/cpp/foo/test.cc                   |     13 +
 ecbuild/examples/fortran/CMakeLists.txt            |     21 +
 ecbuild/examples/fortran/area_circle.f90           |     15 +
 ecbuild/examples/fortran/area_circle.h             |      5 +
 ecbuild/examples/fortran/circle.f90                |     11 +
 ecbuild/examples/fortran/constants.f90             |     12 +
 ecbuild/examples/fortran/lolo_circle.f90           |      0
 ecbuild/examples/fortran/main.F90                  |     25 +
 ecbuild/project_summary.cmake                      |     21 +
 ecbuild/share/CMakeLists.txt                       |      3 +
 ecbuild/share/ecbuild/cmake                        |      1 +
 .../share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake |     63 +
 ecbuild/share/ecmwf_license_header.txt             |      8 +
 ecflow_4_0_7/.gitignore                            |     39 +
 ecflow_4_0_7/ACore/CMakeLists.txt                  |     34 +
 ecflow_4_0_7/ACore/Jamfile.jam                     |     46 +
 ecflow_4_0_7/ACore/doc/File_r.cpp_old              |     48 +
 ecflow_4_0_7/ACore/doc/StackTrace.cpp_old          |    107 +
 ecflow_4_0_7/ACore/doc/StackTrace.hpp_old          |     37 +
 ecflow_4_0_7/ACore/ecflow_version.h.in             |     10 +
 ecflow_4_0_7/ACore/fred.o                          |    Bin 0 -> 74080 bytes
 ecflow_4_0_7/ACore/src/Archive.hpp                 |     57 +
 ecflow_4_0_7/ACore/src/ArgvCreator.cpp             |     53 +
 ecflow_4_0_7/ACore/src/ArgvCreator.hpp             |     43 +
 ecflow_4_0_7/ACore/src/AssertTimer.cpp             |     32 +
 ecflow_4_0_7/ACore/src/AssertTimer.hpp             |     43 +
 ecflow_4_0_7/ACore/src/Calendar.cpp                |    383 +
 ecflow_4_0_7/ACore/src/Calendar.hpp                |    255 +
 ecflow_4_0_7/ACore/src/CalendarUpdateParams.hpp    |     71 +
 ecflow_4_0_7/ACore/src/CheckPt.hpp                 |     42 +
 ecflow_4_0_7/ACore/src/Child.cpp                   |    167 +
 ecflow_4_0_7/ACore/src/Child.hpp                   |     61 +
 ecflow_4_0_7/ACore/src/DState.cpp                  |    136 +
 ecflow_4_0_7/ACore/src/DState.hpp                  |     72 +
 ecflow_4_0_7/ACore/src/DurationTimer.hpp           |     39 +
 ecflow_4_0_7/ACore/src/Ecf.cpp                     |     66 +
 ecflow_4_0_7/ACore/src/Ecf.hpp                     |     92 +
 ecflow_4_0_7/ACore/src/Extract.cpp                 |    125 +
 ecflow_4_0_7/ACore/src/Extract.hpp                 |     57 +
 ecflow_4_0_7/ACore/src/File.cpp                    |    984 +
 ecflow_4_0_7/ACore/src/File.hpp                    |    152 +
 ecflow_4_0_7/ACore/src/File_r.cpp                  |     24 +
 ecflow_4_0_7/ACore/src/File_r.hpp                  |     42 +
 ecflow_4_0_7/ACore/src/Host.cpp                    |     82 +
 ecflow_4_0_7/ACore/src/Host.hpp                    |     52 +
 ecflow_4_0_7/ACore/src/Indentor.cpp                |     31 +
 ecflow_4_0_7/ACore/src/Indentor.hpp                |     37 +
 ecflow_4_0_7/ACore/src/Log.cpp                     |    343 +
 ecflow_4_0_7/ACore/src/Log.hpp                     |    166 +
 ecflow_4_0_7/ACore/src/LogVerification.cpp         |    138 +
 ecflow_4_0_7/ACore/src/LogVerification.hpp         |     41 +
 ecflow_4_0_7/ACore/src/NOrder.cpp                  |     55 +
 ecflow_4_0_7/ACore/src/NOrder.hpp                  |     31 +
 ecflow_4_0_7/ACore/src/NState.cpp                  |    113 +
 ecflow_4_0_7/ACore/src/NState.hpp                  |     69 +
 ecflow_4_0_7/ACore/src/NodePath.cpp                |     83 +
 ecflow_4_0_7/ACore/src/NodePath.hpp                |     46 +
 ecflow_4_0_7/ACore/src/Passwd.cpp                  |     84 +
 ecflow_4_0_7/ACore/src/Passwd.hpp                  |     47 +
 ecflow_4_0_7/ACore/src/PrintStyle.cpp              |     53 +
 ecflow_4_0_7/ACore/src/PrintStyle.hpp              |     50 +
 ecflow_4_0_7/ACore/src/SState.cpp                  |     58 +
 ecflow_4_0_7/ACore/src/SState.hpp                  |     46 +
 ecflow_4_0_7/ACore/src/Serialization.hpp           |    135 +
 ecflow_4_0_7/ACore/src/SerializationTest.hpp       |     71 +
 ecflow_4_0_7/ACore/src/Stl.hpp                     |     71 +
 ecflow_4_0_7/ACore/src/Str.cpp                     |    346 +
 ecflow_4_0_7/ACore/src/Str.hpp                     |    150 +
 ecflow_4_0_7/ACore/src/TimeSeries.cpp              |    836 +
 ecflow_4_0_7/ACore/src/TimeSeries.hpp              |    215 +
 ecflow_4_0_7/ACore/src/TimeSlot.cpp                |     89 +
 ecflow_4_0_7/ACore/src/TimeSlot.hpp                |     86 +
 ecflow_4_0_7/ACore/src/TimeStamp.cpp               |     40 +
 ecflow_4_0_7/ACore/src/TimeStamp.hpp               |     35 +
 ecflow_4_0_7/ACore/src/Version.cpp                 |    131 +
 ecflow_4_0_7/ACore/src/Version.hpp                 |     56 +
 ecflow_4_0_7/ACore/src/WhiteListFile.cpp           |    163 +
 ecflow_4_0_7/ACore/src/WhiteListFile.hpp           |     47 +
 ecflow_4_0_7/ACore/src/boost_archive.cpp           |     60 +
 ecflow_4_0_7/ACore/src/boost_archive.hpp           |     96 +
 ecflow_4_0_7/ACore/src/ecflow_version.h            |     10 +
 .../ACore/src/polymorphic_portable_archive.hpp     |     35 +
 ecflow_4_0_7/ACore/src/portable_archive.hpp        |     35 +
 .../ACore/src/portable_archive_exception.hpp       |     93 +
 ecflow_4_0_7/ACore/src/portable_binary_archive.hpp |     49 +
 .../ACore/src/portable_binary_iarchive.cpp         |    136 +
 .../ACore/src/portable_binary_iarchive.hpp         |    216 +
 .../ACore/src/portable_binary_oarchive.cpp         |    102 +
 .../ACore/src/portable_binary_oarchive.hpp         |    195 +
 ecflow_4_0_7/ACore/src/portable_iarchive.hpp       |    484 +
 ecflow_4_0_7/ACore/src/portable_oarchive.hpp       |    471 +
 ecflow_4_0_7/ACore/test/TestArgvCreator.cpp        |     67 +
 ecflow_4_0_7/ACore/test/TestCalendar.cpp           |    454 +
 ecflow_4_0_7/ACore/test/TestExceptionSafety.cpp    |     51 +
 ecflow_4_0_7/ACore/test/TestFile.cpp               |    312 +
 ecflow_4_0_7/ACore/test/TestGetUserDetails.cpp     |     57 +
 ecflow_4_0_7/ACore/test/TestLog.cpp                |    365 +
 ecflow_4_0_7/ACore/test/TestMigration.cpp          |     73 +
 ecflow_4_0_7/ACore/test/TestNodePath.cpp           |    148 +
 ecflow_4_0_7/ACore/test/TestRealCalendar.cpp       |    355 +
 ecflow_4_0_7/ACore/test/TestSerialisation.cpp      |    135 +
 ecflow_4_0_7/ACore/test/TestStackTrace.cpp         |     80 +
 ecflow_4_0_7/ACore/test/TestStr.cpp                |    694 +
 ecflow_4_0_7/ACore/test/TestTimeSeries.cpp         |    676 +
 ecflow_4_0_7/ACore/test/TestTimeSlot.cpp           |    109 +
 ecflow_4_0_7/ACore/test/TestVersion.cpp            |     85 +
 ecflow_4_0_7/ACore/test/TestVersioning.cpp         |     68 +
 ecflow_4_0_7/ACore/test/TestVersioning.hpp         |     97 +
 ecflow_4_0_7/ACore/test/TestWhiteListFile.cpp      |    148 +
 .../ACore/test/data/badWhiteListFiles/bad2.lists   |      9 +
 .../ACore/test/data/badWhiteListFiles/bad3.lists   |      9 +
 .../ACore/test/data/badWhiteListFiles/bad5.lists   |      9 +
 .../ACore/test/data/badWhiteListFiles/badsms.lists |      7 +
 .../ACore/test/data/goodWhiteListFiles/good1.lists |     22 +
 .../test/data/goodWhiteListFiles/goodsms.lists     |      7 +
 .../ACore/test/data/migration/calendar_v1.9        |      1 +
 .../test/data/migration/timeseries_10_10_v1_9      |      1 +
 .../migration/timeseries_default_constructor_v1.9  |      1 +
 .../ACore/test/data/migration/timeslot_1_1_v1_9    |      1 +
 .../ACore/test/data/migration/timeslot_99_59_v1_9  |      1 +
 .../migration/timeslot_default_constructor_v1.9    |      1 +
 ecflow_4_0_7/ANattr/CMakeLists.txt                 |     22 +
 ecflow_4_0_7/ANattr/jamfile.jam                    |     44 +
 ecflow_4_0_7/ANattr/src/AutoCancelAttr.cpp         |    103 +
 ecflow_4_0_7/ANattr/src/AutoCancelAttr.hpp         |     59 +
 ecflow_4_0_7/ANattr/src/ClockAttr.cpp              |    169 +
 ecflow_4_0_7/ANattr/src/ClockAttr.hpp              |    100 +
 ecflow_4_0_7/ANattr/src/CronAttr.cpp               |    724 +
 ecflow_4_0_7/ANattr/src/CronAttr.hpp               |    140 +
 ecflow_4_0_7/ANattr/src/DateAttr.cpp               |    293 +
 ecflow_4_0_7/ANattr/src/DateAttr.hpp               |    102 +
 ecflow_4_0_7/ANattr/src/DayAttr.cpp                |    192 +
 ecflow_4_0_7/ANattr/src/DayAttr.hpp                |     90 +
 ecflow_4_0_7/ANattr/src/LateAttr.cpp               |    126 +
 ecflow_4_0_7/ANattr/src/LateAttr.hpp               |    105 +
 ecflow_4_0_7/ANattr/src/NodeAttr.cpp               |    366 +
 ecflow_4_0_7/ANattr/src/NodeAttr.hpp               |    211 +
 ecflow_4_0_7/ANattr/src/RepeatAttr.cpp             |    957 +
 ecflow_4_0_7/ANattr/src/RepeatAttr.hpp             |    479 +
 ecflow_4_0_7/ANattr/src/TimeAttr.cpp               |    188 +
 ecflow_4_0_7/ANattr/src/TimeAttr.hpp               |    134 +
 ecflow_4_0_7/ANattr/src/TodayAttr.cpp              |    193 +
 ecflow_4_0_7/ANattr/src/TodayAttr.hpp              |    185 +
 ecflow_4_0_7/ANattr/src/Variable.cpp               |     87 +
 ecflow_4_0_7/ANattr/src/Variable.hpp               |     74 +
 ecflow_4_0_7/ANattr/src/VerifyAttr.cpp             |     77 +
 ecflow_4_0_7/ANattr/src/VerifyAttr.hpp             |     73 +
 ecflow_4_0_7/ANattr/src/Zombie.cpp                 |    216 +
 ecflow_4_0_7/ANattr/src/Zombie.hpp                 |    166 +
 ecflow_4_0_7/ANattr/src/ZombieAttr.cpp             |    240 +
 ecflow_4_0_7/ANattr/src/ZombieAttr.hpp             |     82 +
 ecflow_4_0_7/ANattr/test/TestAttrSerialization.cpp |    297 +
 ecflow_4_0_7/ANattr/test/TestCron.cpp              |    439 +
 ecflow_4_0_7/ANattr/test/TestDayAttr.cpp           |     78 +
 ecflow_4_0_7/ANattr/test/TestLabel.cpp             |     83 +
 ecflow_4_0_7/ANattr/test/TestMigration.cpp         |    185 +
 ecflow_4_0_7/ANattr/test/TestRepeat.cpp            |    425 +
 ecflow_4_0_7/ANattr/test/TestTimeAttr.cpp          |    345 +
 ecflow_4_0_7/ANattr/test/TestTodayAttr.cpp         |    181 +
 ecflow_4_0_7/ANattr/test/TestVariable.cpp          |     57 +
 .../default_constructor_v1_9/AutoCancelAttr        |      1 +
 .../migration/default_constructor_v1_9/ClockAttr   |      1 +
 .../migration/default_constructor_v1_9/CronAttr    |      1 +
 .../migration/default_constructor_v1_9/DateAttr    |      1 +
 .../migration/default_constructor_v1_9/DayAttr     |      1 +
 .../data/migration/default_constructor_v1_9/Event  |      1 +
 .../data/migration/default_constructor_v1_9/Label  |      1 +
 .../migration/default_constructor_v1_9/LateAttr    |      1 +
 .../data/migration/default_constructor_v1_9/Meter  |      1 +
 .../migration/default_constructor_v1_9/RepeatDate  |      2 +
 .../default_constructor_v1_9/RepeatEnumerated      |      2 +
 .../default_constructor_v1_9/RepeatInteger         |      2 +
 .../default_constructor_v1_9/RepeatString          |      2 +
 .../migration/default_constructor_v1_9/TimeAttr    |      1 +
 .../migration/default_constructor_v1_9/TodayAttr   |      1 +
 .../migration/default_constructor_v1_9/Variable    |      1 +
 .../migration/default_constructor_v1_9/VerifyAttr  |      1 +
 .../migration/default_constructor_v1_9/ZombieAttr  |      1 +
 .../ANattr/test/data/migration/v1_9/AutoCancelAttr |      1 +
 .../test/data/migration/v1_9/AutoCancelAttr_1      |      1 +
 .../ANattr/test/data/migration/v1_9/ClockAttr      |      1 +
 .../ANattr/test/data/migration/v1_9/CronAttr       |      1 +
 .../ANattr/test/data/migration/v1_9/DateAttr       |      1 +
 .../ANattr/test/data/migration/v1_9/DayAttr        |      1 +
 .../ANattr/test/data/migration/v1_9/Event_1        |      1 +
 .../ANattr/test/data/migration/v1_9/Event_2        |      1 +
 ecflow_4_0_7/ANattr/test/data/migration/v1_9/Label |      1 +
 .../ANattr/test/data/migration/v1_9/LateAttr       |      1 +
 ecflow_4_0_7/ANattr/test/data/migration/v1_9/Meter |      1 +
 .../ANattr/test/data/migration/v1_9/RepeatDate     |      2 +
 .../test/data/migration/v1_9/RepeatEnumerated      |      2 +
 .../ANattr/test/data/migration/v1_9/RepeatInteger  |      2 +
 .../ANattr/test/data/migration/v1_9/RepeatString   |      2 +
 .../ANattr/test/data/migration/v1_9/TimeAttr       |      1 +
 .../ANattr/test/data/migration/v1_9/TodayAttr      |      1 +
 .../ANattr/test/data/migration/v1_9/Variable       |      1 +
 .../ANattr/test/data/migration/v1_9/VerifyAttr     |      1 +
 .../ANattr/test/data/migration/v1_9/ZombieAttr     |      1 +
 ecflow_4_0_7/ANode/CMakeLists.txt                  |     72 +
 ecflow_4_0_7/ANode/jamfile.jam                     |     64 +
 ecflow_4_0_7/ANode/src/AbstractObserver.hpp        |     35 +
 ecflow_4_0_7/ANode/src/Alias.cpp                   |    168 +
 ecflow_4_0_7/ANode/src/Alias.hpp                   |     94 +
 ecflow_4_0_7/ANode/src/Aspect.hpp                  |     42 +
 ecflow_4_0_7/ANode/src/ChangeMgrSingleton.cpp      |    253 +
 ecflow_4_0_7/ANode/src/ChangeMgrSingleton.hpp      |    107 +
 ecflow_4_0_7/ANode/src/ChildAttrs.cpp              |    545 +
 ecflow_4_0_7/ANode/src/ChildAttrs.hpp              |    132 +
 ecflow_4_0_7/ANode/src/ClientSuiteMgr.cpp          |    280 +
 ecflow_4_0_7/ANode/src/ClientSuiteMgr.hpp          |    118 +
 ecflow_4_0_7/ANode/src/ClientSuites.cpp            |    332 +
 ecflow_4_0_7/ANode/src/ClientSuites.hpp            |    145 +
 ecflow_4_0_7/ANode/src/CmdContext.cpp              |     29 +
 ecflow_4_0_7/ANode/src/CmdContext.hpp              |     36 +
 ecflow_4_0_7/ANode/src/Defs.cpp                    |   1468 +
 ecflow_4_0_7/ANode/src/Defs.hpp                    |    399 +
 ecflow_4_0_7/ANode/src/DefsDelta.cpp               |     80 +
 ecflow_4_0_7/ANode/src/DefsDelta.hpp               |     88 +
 ecflow_4_0_7/ANode/src/EcfFile.cpp                 |   1348 +
 ecflow_4_0_7/ANode/src/EcfFile.hpp                 |    107 +
 ecflow_4_0_7/ANode/src/ExprAst.cpp                 |   1238 +
 ecflow_4_0_7/ANode/src/ExprAst.hpp                 |    516 +
 ecflow_4_0_7/ANode/src/ExprAstVisitor.cpp          |     74 +
 ecflow_4_0_7/ANode/src/ExprAstVisitor.hpp          |    148 +
 ecflow_4_0_7/ANode/src/ExprDuplicate.cpp           |     61 +
 ecflow_4_0_7/ANode/src/ExprDuplicate.hpp           |     44 +
 ecflow_4_0_7/ANode/src/ExprParser.cpp              |    933 +
 ecflow_4_0_7/ANode/src/ExprParser.hpp              |     64 +
 ecflow_4_0_7/ANode/src/Expression.cpp              |    237 +
 ecflow_4_0_7/ANode/src/Expression.hpp              |    153 +
 ecflow_4_0_7/ANode/src/Family.cpp                  |    202 +
 ecflow_4_0_7/ANode/src/Family.hpp                  |     86 +
 ecflow_4_0_7/ANode/src/Flag.cpp                    |    164 +
 ecflow_4_0_7/ANode/src/Flag.hpp                    |    119 +
 ecflow_4_0_7/ANode/src/InLimit.cpp                 |     83 +
 ecflow_4_0_7/ANode/src/InLimit.hpp                 |     72 +
 ecflow_4_0_7/ANode/src/InLimitMgr.cpp              |    436 +
 ecflow_4_0_7/ANode/src/InLimitMgr.hpp              |    131 +
 ecflow_4_0_7/ANode/src/JobCreationCtrl.cpp         |     32 +
 ecflow_4_0_7/ANode/src/JobCreationCtrl.hpp         |     52 +
 ecflow_4_0_7/ANode/src/JobProfiler.cpp             |     81 +
 ecflow_4_0_7/ANode/src/JobProfiler.hpp             |     53 +
 ecflow_4_0_7/ANode/src/Jobs.cpp                    |    126 +
 ecflow_4_0_7/ANode/src/Jobs.hpp                    |     69 +
 ecflow_4_0_7/ANode/src/JobsParam.hpp               |     81 +
 ecflow_4_0_7/ANode/src/Limit.cpp                   |    209 +
 ecflow_4_0_7/ANode/src/Limit.hpp                   |     89 +
 ecflow_4_0_7/ANode/src/LimitFwd.hpp                |     22 +
 ecflow_4_0_7/ANode/src/Memento.cpp                 |    113 +
 ecflow_4_0_7/ANode/src/Memento.hpp                 |    742 +
 ecflow_4_0_7/ANode/src/MiscAttrs.cpp               |    178 +
 ecflow_4_0_7/ANode/src/MiscAttrs.hpp               |     89 +
 ecflow_4_0_7/ANode/src/Node.cpp                    |   1870 +
 ecflow_4_0_7/ANode/src/Node.hpp                    |    748 +
 ecflow_4_0_7/ANode/src/NodeAdd.cpp                 |    299 +
 ecflow_4_0_7/ANode/src/NodeChange.cpp              |    188 +
 ecflow_4_0_7/ANode/src/NodeContainer.cpp           |   1000 +
 ecflow_4_0_7/ANode/src/NodeContainer.hpp           |    151 +
 ecflow_4_0_7/ANode/src/NodeDelete.cpp              |    263 +
 ecflow_4_0_7/ANode/src/NodeFind.cpp                |    738 +
 ecflow_4_0_7/ANode/src/NodeFwd.hpp                 |    107 +
 ecflow_4_0_7/ANode/src/NodeMemento.cpp             |    585 +
 ecflow_4_0_7/ANode/src/NodeState.hpp               |     70 +
 ecflow_4_0_7/ANode/src/NodeTreeVisitor.cpp         |     23 +
 ecflow_4_0_7/ANode/src/NodeTreeVisitor.hpp         |     40 +
 ecflow_4_0_7/ANode/src/ResolveExternsVisitor.cpp   |    125 +
 ecflow_4_0_7/ANode/src/ResolveExternsVisitor.hpp   |     81 +
 ecflow_4_0_7/ANode/src/ServerState.cpp             |    455 +
 ecflow_4_0_7/ANode/src/ServerState.hpp             |    139 +
 ecflow_4_0_7/ANode/src/Signal.cpp                  |     66 +
 ecflow_4_0_7/ANode/src/Signal.hpp                  |     38 +
 ecflow_4_0_7/ANode/src/Submittable.cpp             |    906 +
 ecflow_4_0_7/ANode/src/Submittable.hpp             |    196 +
 ecflow_4_0_7/ANode/src/Suite.cpp                   |    727 +
 ecflow_4_0_7/ANode/src/Suite.hpp                   |    175 +
 ecflow_4_0_7/ANode/src/SuiteChanged.cpp            |     89 +
 ecflow_4_0_7/ANode/src/SuiteChanged.hpp            |     68 +
 ecflow_4_0_7/ANode/src/System.cpp                  |    411 +
 ecflow_4_0_7/ANode/src/System.hpp                  |     89 +
 ecflow_4_0_7/ANode/src/Task.cpp                    |    804 +
 ecflow_4_0_7/ANode/src/Task.hpp                    |    172 +
 ecflow_4_0_7/ANode/src/TaskScriptGenerator.cpp     |    263 +
 ecflow_4_0_7/ANode/src/TaskScriptGenerator.hpp     |     46 +
 ecflow_4_0_7/ANode/src/TimeDepAttrs.cpp            |    872 +
 ecflow_4_0_7/ANode/src/TimeDepAttrs.hpp            |    148 +
 ecflow_4_0_7/ANode/test/MyDefsFixture.hpp          |    249 +
 ecflow_4_0_7/ANode/test/TestAdd.cpp                |     51 +
 ecflow_4_0_7/ANode/test/TestAlias.cpp              |    103 +
 ecflow_4_0_7/ANode/test/TestChangeMgrSingleton.cpp |    130 +
 ecflow_4_0_7/ANode/test/TestDefStatus.cpp          |    154 +
 ecflow_4_0_7/ANode/test/TestDefs.cpp               |     84 +
 ecflow_4_0_7/ANode/test/TestEcfFile.cpp            |    857 +
 .../ANode/test/TestEnviromentSubstitution.cpp      |     85 +
 ecflow_4_0_7/ANode/test/TestExprParser.cpp         |    393 +
 .../ANode/test/TestExprRepeatDateArithmetic.cpp    |    216 +
 ecflow_4_0_7/ANode/test/TestFindAbsNodePath.cpp    |     75 +
 ecflow_4_0_7/ANode/test/TestFlag.cpp               |     75 +
 ecflow_4_0_7/ANode/test/TestHistoryParser.cpp      |     93 +
 ecflow_4_0_7/ANode/test/TestInLimit.cpp            |     76 +
 ecflow_4_0_7/ANode/test/TestJobCreator.cpp         |    121 +
 ecflow_4_0_7/ANode/test/TestJobProfiler.cpp        |     89 +
 ecflow_4_0_7/ANode/test/TestLimit.cpp              |    157 +
 ecflow_4_0_7/ANode/test/TestMigration.cpp          |    113 +
 ecflow_4_0_7/ANode/test/TestMissNextTimeSlot.cpp   |    114 +
 ecflow_4_0_7/ANode/test/TestNodeBeginReque.cpp     |     75 +
 ecflow_4_0_7/ANode/test/TestOrder.cpp              |    336 +
 ecflow_4_0_7/ANode/test/TestPersistence.cpp        |     79 +
 ecflow_4_0_7/ANode/test/TestPreProcessing.cpp      |    232 +
 ecflow_4_0_7/ANode/test/TestReplace.cpp            |    575 +
 ecflow_4_0_7/ANode/test/TestSetState.cpp           |     97 +
 ecflow_4_0_7/ANode/test/TestSingleExprParse.cpp    |     67 +
 ecflow_4_0_7/ANode/test/TestSmsLocator.cpp         |    128 +
 .../ANode/test/TestTaskScriptGenerator.cpp         |    205 +
 ecflow_4_0_7/ANode/test/TestVariableGeneration.cpp |     93 +
 .../ANode/test/TestVariableInheritance.cpp         |     78 +
 .../ANode/test/TestVariableSubstitution.cpp        |    438 +
 .../ANode/test/TestVariableSubstitutionDefs.cpp    |    174 +
 ecflow_4_0_7/ANode/test/TestZombies.cpp            |     77 +
 ecflow_4_0_7/ANode/test/Test_ECFLOW-195.cpp        |     97 +
 ecflow_4_0_7/ANode/test/data/SMSHOME/suite.man     |      4 +
 .../ANode/test/data/SMSHOME/suite/family.man       |      5 +
 .../ANode/test/data/SMSHOME/suite/family/head.h    |     44 +
 .../ANode/test/data/SMSHOME/suite/family/t1.ecf    |     81 +
 .../ANode/test/data/SMSHOME/suite/family/t2.ecf    |     19 +
 .../ANode/test/data/SMSHOME/suite/family/t3.ecf    |     39 +
 .../ANode/test/data/SMSHOME/suite/family/tail.h    |     10 +
 .../ANode/test/data/SMSHOME/suite1_task1.ecf       |      0
 .../ANode/test/data/SMSHOME/suite1_task2.ecf       |      0
 .../ANode/test/data/SMSHOME/suite1_task3.ecf       |      0
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad.ecf  |      6 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad1.ecf |      5 +
 .../ANode/test/data/SMSHOME2/bad/bad10.ecf         |      6 +
 .../ANode/test/data/SMSHOME2/bad/bad11.ecf         |      6 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad2.ecf |      6 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad3.ecf |      6 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad4.ecf |     13 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad5.ecf |     15 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad6.ecf |     15 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad7.ecf |      8 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad8.ecf |      8 +
 ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad9.ecf |     12 +
 .../ANode/test/data/SMSHOME2/bad/bad_ecfmicro.ecf  |      6 +
 .../test/data/SMSHOME2/bad/bad_ecfmicro_1.ecf      |      5 +
 .../data/SMSHOME2/bad/includes/recursive_head.h    |     14 +
 .../ANode/test/data/SMSHOME2/good/.gitignore       |      1 +
 .../ANode/test/data/SMSHOME2/good/ecf_micro_2.ecf  |     10 +
 .../ANode/test/data/SMSHOME2/good/ecfmicro.ecf     |     10 +
 .../ANode/test/data/SMSHOME2/good/good.ecf         |     27 +
 .../ANode/test/data/SMSHOME2/good/good1.ecf        |      8 +
 .../test/data/SMSHOME2/good/includes/config.h      |   1527 +
 .../test/data/SMSHOME2/good/includes/config.oc.h   |    197 +
 .../ANode/test/data/SMSHOME2/good/includes/endt.h  |     13 +
 .../ANode/test/data/SMSHOME2/good/includes/head.h  |     43 +
 .../ANode/test/data/SMSHOME2/good/includes/law.h   |     43 +
 .../ANode/test/data/SMSHOME2/good/includes/qsub.h  |     11 +
 .../ANode/test/data/SMSHOME2/good/includes/rcp.h   |     41 +
 .../test/data/SMSHOME2/good/includes/set_traps.h   |      6 +
 .../ANode/test/data/SMSHOME2/good/includes/setup.h |    535 +
 .../ANode/test/data/SMSHOME2/good/includes/sms.h   |     55 +
 .../ANode/test/data/SMSHOME2/good/includes/tail.h  |     10 +
 .../ANode/test/data/SMSHOME2/good/includes/trap.h  |    137 +
 .../test/data/SMSHOME2/good/micro_in_comment.ecf   |      7 +
 .../ANode/test/data/SMSHOME2/good/operations.ecf   |     16 +
 ecflow_4_0_7/ANode/test/data/common.h              |      7 +
 ecflow_4_0_7/ANode/test/data/includes/head.h       |     65 +
 ecflow_4_0_7/ANode/test/data/includes/manual.h     |      1 +
 .../ANode/test/data/includes/simple_head.h         |      1 +
 .../ANode/test/data/includes/simple_tail.h         |      1 +
 ecflow_4_0_7/ANode/test/data/includes/tail.h       |     19 +
 .../ANode/test/data/includes/used_variables.h      |     12 +
 .../data/includes/used_variables_with_comments.h   |      9 +
 .../data/migration/default_constructor/Defs.def    |      1 +
 .../data/migration/default_constructor/Family.def  |      2 +
 .../data/migration/default_constructor/Limit.def   |      2 +
 .../data/migration/default_constructor/Suite.def   |      2 +
 .../data/migration/default_constructor/Task.def    |      2 +
 .../test/data/migration/fixture/boost_1_47.checkpt |     77 +
 ecflow_4_0_7/AParser/CMakeLists.txt                |     71 +
 ecflow_4_0_7/AParser/Jamfile.jam                   |    126 +
 ecflow_4_0_7/AParser/src/AutoCancelParser.cpp      |     55 +
 ecflow_4_0_7/AParser/src/AutoCancelParser.hpp      |     27 +
 ecflow_4_0_7/AParser/src/CalendarParser.cpp        |     39 +
 ecflow_4_0_7/AParser/src/CalendarParser.hpp        |     28 +
 ecflow_4_0_7/AParser/src/ClockParser.cpp           |    143 +
 ecflow_4_0_7/AParser/src/ClockParser.hpp           |     29 +
 ecflow_4_0_7/AParser/src/CronParser.cpp            |     47 +
 ecflow_4_0_7/AParser/src/CronParser.hpp            |     30 +
 ecflow_4_0_7/AParser/src/DateParser.cpp            |     51 +
 ecflow_4_0_7/AParser/src/DateParser.hpp            |     28 +
 ecflow_4_0_7/AParser/src/DayParser.cpp             |     46 +
 ecflow_4_0_7/AParser/src/DayParser.hpp             |     27 +
 ecflow_4_0_7/AParser/src/DefsParser.cpp            |    425 +
 ecflow_4_0_7/AParser/src/DefsParser.hpp            |     27 +
 ecflow_4_0_7/AParser/src/DefsStateParser.cpp       |     42 +
 ecflow_4_0_7/AParser/src/DefsStateParser.hpp       |     35 +
 ecflow_4_0_7/AParser/src/DefsStatusParser.cpp      |     52 +
 ecflow_4_0_7/AParser/src/DefsStatusParser.hpp      |     28 +
 ecflow_4_0_7/AParser/src/DefsStructureParser.cpp   |    220 +
 ecflow_4_0_7/AParser/src/DefsStructureParser.hpp   |     79 +
 ecflow_4_0_7/AParser/src/EventParser.cpp           |     75 +
 ecflow_4_0_7/AParser/src/EventParser.hpp           |     28 +
 ecflow_4_0_7/AParser/src/ExternParser.cpp          |     48 +
 ecflow_4_0_7/AParser/src/ExternParser.hpp          |     41 +
 ecflow_4_0_7/AParser/src/InlimitParser.cpp         |     45 +
 ecflow_4_0_7/AParser/src/InlimitParser.hpp         |     28 +
 ecflow_4_0_7/AParser/src/LabelParser.cpp           |     35 +
 ecflow_4_0_7/AParser/src/LabelParser.hpp           |     28 +
 ecflow_4_0_7/AParser/src/LateParser.cpp            |     73 +
 ecflow_4_0_7/AParser/src/LateParser.hpp            |     27 +
 ecflow_4_0_7/AParser/src/LimitParser.cpp           |     64 +
 ecflow_4_0_7/AParser/src/LimitParser.hpp           |     28 +
 ecflow_4_0_7/AParser/src/MeterParser.cpp           |     54 +
 ecflow_4_0_7/AParser/src/MeterParser.hpp           |     28 +
 ecflow_4_0_7/AParser/src/Parser.cpp                |    167 +
 ecflow_4_0_7/AParser/src/Parser.hpp                |     80 +
 ecflow_4_0_7/AParser/src/RepeatParser.cpp          |    178 +
 ecflow_4_0_7/AParser/src/RepeatParser.hpp          |     33 +
 ecflow_4_0_7/AParser/src/TimeParser.cpp            |     48 +
 ecflow_4_0_7/AParser/src/TimeParser.hpp            |     28 +
 ecflow_4_0_7/AParser/src/TodayParser.cpp           |     45 +
 ecflow_4_0_7/AParser/src/TodayParser.hpp           |     28 +
 ecflow_4_0_7/AParser/src/TriggerParser.cpp         |    180 +
 ecflow_4_0_7/AParser/src/TriggerParser.hpp         |     46 +
 ecflow_4_0_7/AParser/src/VariableParser.cpp        |    103 +
 ecflow_4_0_7/AParser/src/VariableParser.hpp        |     48 +
 ecflow_4_0_7/AParser/src/VerifyParser.cpp          |     53 +
 ecflow_4_0_7/AParser/src/VerifyParser.hpp          |     29 +
 ecflow_4_0_7/AParser/src/ZombieAttrParser.cpp      |     39 +
 ecflow_4_0_7/AParser/src/ZombieAttrParser.hpp      |     27 +
 ecflow_4_0_7/AParser/test/ParseOnly.cpp            |     51 +
 ecflow_4_0_7/AParser/test/ParseTimer.cpp           |    224 +
 ecflow_4_0_7/AParser/test/PersistHelper.cpp        |    237 +
 ecflow_4_0_7/AParser/test/PersistHelper.hpp        |     58 +
 ecflow_4_0_7/AParser/test/TestAutoAddExterns.cpp   |     69 +
 .../test/TestDefsStructurePersistAndReload.cpp     |     96 +
 ecflow_4_0_7/AParser/test/TestJobGenPerf.cpp       |     84 +
 ecflow_4_0_7/AParser/test/TestMigration.cpp        |    427 +
 ecflow_4_0_7/AParser/test/TestParser.cpp           |    125 +
 ecflow_4_0_7/AParser/test/TestSingleDefsFile.cpp   |    304 +
 ecflow_4_0_7/AParser/test/TestVariableParsing.cpp  |     81 +
 .../AParser/test/data/bad_defs/clock/clock1.def    |     12 +
 .../AParser/test/data/bad_defs/clock/clock2.def    |     11 +
 .../AParser/test/data/bad_defs/cron/cron1.def      |      3 +
 .../AParser/test/data/bad_defs/cron/cron2.def      |      3 +
 .../AParser/test/data/bad_defs/cron/cron3.def      |      3 +
 .../AParser/test/data/bad_defs/cron/cron4.def      |      3 +
 .../AParser/test/data/bad_defs/cron/cron5.def      |      3 +
 .../AParser/test/data/bad_defs/cron/cron5_1.def    |      3 +
 .../AParser/test/data/bad_defs/cron/cron6.def      |      3 +
 .../AParser/test/data/bad_defs/cron/cron7.def      |      3 +
 .../test/data/bad_defs/cron/repeat_with_cron.def   |      9 +
 .../AParser/test/data/bad_defs/date/date.def       |      5 +
 .../AParser/test/data/bad_defs/date/date0.def      |      3 +
 .../AParser/test/data/bad_defs/date/date1.def      |      6 +
 .../AParser/test/data/bad_defs/date/date2.def      |      5 +
 .../AParser/test/data/bad_defs/date/date3.def      |      5 +
 .../AParser/test/data/bad_defs/date/date4.def      |      5 +
 .../AParser/test/data/bad_defs/date/date5.def      |      4 +
 .../AParser/test/data/bad_defs/day/day.def         |      3 +
 .../test/data/bad_defs/defstatus/defstatus.def     |     10 +
 .../AParser/test/data/bad_defs/event/event_1.def   |      8 +
 .../AParser/test/data/bad_defs/event/event_2.def   |      8 +
 .../AParser/test/data/bad_defs/event/event_3.def   |      8 +
 .../AParser/test/data/bad_defs/event/event_4.def   |      8 +
 .../test/data/bad_defs/event/simple_event.txt      |      7 +
 .../AParser/test/data/bad_defs/extern/bad.def      |     12 +
 .../AParser/test/data/bad_defs/extern/complete.def |     11 +
 .../AParser/test/data/bad_defs/extern/trigger1.def |     11 +
 .../AParser/test/data/bad_defs/extern/trigger2.def |     10 +
 .../AParser/test/data/bad_defs/family/family.def   |      7 +
 .../AParser/test/data/bad_defs/family/family_1.def |     14 +
 .../test/data/bad_defs/family/simple_family.txt    |      5 +
 .../AParser/test/data/bad_defs/inlimit/limit.def   |     26 +
 .../AParser/test/data/bad_defs/inlimit/limt2.def   |     22 +
 .../AParser/test/data/bad_defs/late/late.def       |      7 +
 .../AParser/test/data/bad_defs/late/late2.def      |      7 +
 .../AParser/test/data/bad_defs/late/late3.def      |      7 +
 .../AParser/test/data/bad_defs/late/late4.def      |      8 +
 .../AParser/test/data/bad_defs/limit/limit.def     |     10 +
 .../AParser/test/data/bad_defs/meter/meter.def     |      6 +
 .../AParser/test/data/bad_defs/meter/meter2.def    |      6 +
 .../AParser/test/data/bad_defs/meter/meter3.def    |      7 +
 .../data/bad_defs/repeat/date_missing_name.def     |      3 +
 .../bad_defs/repeat/duplicate_repeats_per_node.def |      4 +
 .../test/data/bad_defs/repeat/invalid_dates.def    |      5 +
 .../test/data/bad_defs/repeat/invalid_dates_2.def  |      5 +
 .../test/data/bad_defs/repeat/repeat_integer.def   |      7 +
 .../test/data/bad_defs/repeat/repeat_month.def     |      4 +
 .../test/data/bad_defs/repeat/repeat_with_cron.def |      5 +
 .../test/data/bad_defs/repeat/repeat_year.def      |      4 +
 .../data/bad_defs/repeat/string_missing_name.def   |      4 +
 .../AParser/test/data/bad_defs/suite/clock.def     |      7 +
 .../AParser/test/data/bad_defs/suite/clock1.def    |      7 +
 .../test/data/bad_defs/suite/simple_suite.txt      |      2 +
 .../test/data/bad_defs/task/simple_task.txt        |      6 +
 .../AParser/test/data/bad_defs/task/task.def       |      8 +
 .../AParser/test/data/bad_defs/task/task_1.def     |     12 +
 .../AParser/test/data/bad_defs/time/time.def       |     16 +
 .../AParser/test/data/bad_defs/time/time_1.def     |      4 +
 .../AParser/test/data/bad_defs/time/time_2.def     |     15 +
 .../AParser/test/data/bad_defs/time/time_3.def     |     16 +
 .../AParser/test/data/bad_defs/time/time_4.def     |      6 +
 .../AParser/test/data/bad_defs/time/time_5.def     |      5 +
 .../AParser/test/data/bad_defs/time/time_6.def     |      6 +
 .../AParser/test/data/bad_defs/time/time_7.def     |     16 +
 .../AParser/test/data/bad_defs/time/time_8.def     |      6 +
 .../AParser/test/data/bad_defs/today/today.def     |      6 +
 .../AParser/test/data/bad_defs/today/today1.def    |      4 +
 .../test/data/bad_defs/trigger/bad_trigger2.txt    |      7 +
 .../test/data/bad_defs/trigger/bad_trigger3.txt    |      7 +
 .../test/data/bad_defs/trigger/bad_trigger4.txt    |     20 +
 .../test/data/bad_defs/trigger/bad_trigger5.txt    |     14 +
 .../AParser/test/data/bad_defs/trigger/complex.def |     16 +
 .../test/data/bad_defs/trigger/divide_by_zero.txt  |      9 +
 .../test/data/bad_defs/trigger/extern_trigger.def  |     11 +
 .../test/data/bad_defs/trigger/modulo_by_zero.txt  |      6 +
 .../trigger/simple_trigger_bad_expression.txt      |     11 +
 .../AParser/test/data/bad_defs/trigger/trigger.txt |      9 +
 .../test/data/bad_defs/trigger/trigger_1.def       |     10 +
 .../AParser/test/data/bad_defs/variable/bad.def    |      3 +
 .../AParser/test/data/bad_defs/variable/bad1.def   |      3 +
 .../AParser/test/data/bad_defs/variable/bad2.def   |      3 +
 .../AParser/test/data/bad_defs/variable/bad3.def   |      3 +
 .../AParser/test/data/bad_defs/variable/bad4.def   |      3 +
 .../AParser/test/data/bad_defs/variable/bad5.def   |      3 +
 .../test/data/bad_defs/variable/comment.def        |      3 +
 .../test/data/bad_defs/variable/comment2.def       |      3 +
 .../AParser/test/data/bad_defs/verify/verfiy3.def  |      3 +
 .../AParser/test/data/bad_defs/verify/verify.def   |      3 +
 .../AParser/test/data/bad_defs/verify/verify2.def  |      3 +
 .../AParser/test/data/bad_defs/verify/verify4.def  |      4 +
 .../AParser/test/data/bad_defs/zombie/bad.def      |      4 +
 .../AParser/test/data/bad_defs/zombie/bad2.def     |      7 +
 .../AParser/test/data/bad_defs/zombie/bad3.def     |      4 +
 .../AParser/test/data/bad_defs/zombie/bad4.def     |      4 +
 .../AParser/test/data/bad_defs/zombie/bad5.def     |      4 +
 .../AParser/test/data/good_defs/clock/clock.def    |      5 +
 .../AParser/test/data/good_defs/clock/clock1.def   |      5 +
 .../AParser/test/data/good_defs/clock/clock2.def   |      5 +
 .../AParser/test/data/good_defs/clock/clock3.def   |      5 +
 .../AParser/test/data/good_defs/clock/clock4.def   |      6 +
 .../AParser/test/data/good_defs/clock/clock5.def   |      5 +
 .../AParser/test/data/good_defs/clock/clock6.def   |     24 +
 .../test/data/good_defs/comment/comment.txt        |     35 +
 .../test/data/good_defs/complete/complete.def      |     14 +
 .../test/data/good_defs/complete/complex.def       |     27 +
 .../AParser/test/data/good_defs/cron/cron.def      |     13 +
 .../AParser/test/data/good_defs/cron/cron1.def     |      4 +
 .../AParser/test/data/good_defs/cron/cron2.def     |      3 +
 .../AParser/test/data/good_defs/date/date.def      |     25 +
 .../AParser/test/data/good_defs/day/day.def        |     26 +
 .../test/data/good_defs/defstatus/defstatus.txt    |     19 +
 .../AParser/test/data/good_defs/edit/edit.def      |     24 +
 .../AParser/test/data/good_defs/event/event_1.def  |     14 +
 .../AParser/test/data/good_defs/event/event_2.def  |      7 +
 .../test/data/good_defs/event/family_event.def     |     10 +
 .../AParser/test/data/good_defs/event/spaces.def   |     15 +
 .../test/data/good_defs/event/suite_event.def      |      8 +
 .../AParser/test/data/good_defs/extern/extern.def  |     52 +
 .../AParser/test/data/good_defs/extern/first.def   |     20 +
 .../AParser/test/data/good_defs/extern/plain.def   |      7 +
 .../AParser/test/data/good_defs/extern/second.def  |     17 +
 .../test/data/good_defs/extern/simple_extern.def   |     40 +
 .../data/good_defs/family/hierarchical_family.txt  |     38 +
 .../test/data/good_defs/family/missingEnds.txt     |      3 +
 .../test/data/good_defs/family/simple_family.txt   |      5 +
 .../AParser/test/data/good_defs/label/label.txt    |     16 +
 .../data/good_defs/label/multi_line_lables.def     |      7 +
 .../AParser/test/data/good_defs/label/spaces.def   |     10 +
 .../AParser/test/data/good_defs/late/late.def      |     15 +
 .../AParser/test/data/good_defs/lifecycle.txt      |     16 +
 .../AParser/test/data/good_defs/limit/limit.def    |     27 +
 .../AParser/test/data/good_defs/limit/limit2.def   |      6 +
 .../AParser/test/data/good_defs/meter/negative.def |      6 +
 .../test/data/good_defs/meter/simple_meter.txt     |      7 +
 .../AParser/test/data/good_defs/meter/spaces.def   |     14 +
 .../test/data/good_defs/repeat/repeat_date.def     |      6 +
 .../test/data/good_defs/repeat/repeat_day.def      |      3 +
 .../good_defs/repeat/repeat_enumerate_quotes.def   |     11 +
 .../data/good_defs/repeat/repeat_enumerated.def    |     11 +
 .../test/data/good_defs/repeat/repeat_file.def     |      4 +
 .../test/data/good_defs/repeat/repeat_integer.def  |      5 +
 .../data/good_defs/repeat/repeat_integer_1.def     |      5 +
 .../data/good_defs/repeat/repeat_integer_2.def     |      3 +
 .../test/data/good_defs/repeat/repeat_string.def   |      4 +
 .../data/good_defs/repeat/repeat_string_quotes.def |      3 +
 .../good_defs/suite/multi_statements_per_line.def  |     16 +
 .../test/data/good_defs/suite/multi_suite.def      |      8 +
 .../test/data/good_defs/suite/simple_suite.txt     |      5 +
 .../data/good_defs/suite/suite_with_hierarchy.def  |     20 +
 .../test/data/good_defs/suite/suite_with_task.def  |      5 +
 .../test/data/good_defs/task/simple_task.txt       |     17 +
 .../AParser/test/data/good_defs/task/spaces.def    |     12 +
 .../AParser/test/data/good_defs/task/task.def      |      9 +
 .../AParser/test/data/good_defs/time/time.def      |     16 +
 .../AParser/test/data/good_defs/time/time_1.def    |     20 +
 .../AParser/test/data/good_defs/time/time_2.def    |     11 +
 .../AParser/test/data/good_defs/today/today.def    |     14 +
 .../AParser/test/data/good_defs/today/today1.def   |     16 +
 .../test/data/good_defs/trigger/anded_ored.def     |     12 +
 .../test/data/good_defs/trigger/complex_hier.def   |     34 +
 .../data/good_defs/trigger/complex_trigger.txt     |     60 +
 .../test/data/good_defs/trigger/extension.def      |     12 +
 .../test/data/good_defs/trigger/simple_trigger.txt |      8 +
 .../data/good_defs/trigger/trigger_references.def  |     10 +
 .../AParser/test/data/good_defs/variable/alias.def |     49 +
 .../test/data/good_defs/variable/duplicate.def     |      4 +
 .../test/data/good_defs/variable/variable.txt      |     24 +
 .../AParser/test/data/good_defs/verify/verify.def  |     32 +
 .../AParser/test/data/good_defs/zombie/zombie.def  |     21 +
 .../test/data/good_defs_state/defs/defs_state.def  |      4 +
 .../AParser/test/data/single_defs/ealadin.def      |   3671 +
 .../AParser/test/data/single_defs/mega.def         | 194073 ++++++++++++++++++
 .../test/data/single_defs/test_auto_add_extern.def |     42 +
 .../test/data/single_defs/test_complete.def        |     16 +
 .../AParser/test/data/single_defs/test_repeat.def  |      8 +
 ecflow_4_0_7/Base/CMakeLists.txt                   |    108 +
 ecflow_4_0_7/Base/Jamfile.jam                      |     70 +
 ecflow_4_0_7/Base/src/AbstractClientEnv.hpp        |     66 +
 ecflow_4_0_7/Base/src/AbstractServer.hpp           |    193 +
 ecflow_4_0_7/Base/src/Client.cpp                   |    342 +
 ecflow_4_0_7/Base/src/Client.hpp                   |     83 +
 ecflow_4_0_7/Base/src/ClientToServerRequest.cpp    |     58 +
 ecflow_4_0_7/Base/src/ClientToServerRequest.hpp    |     67 +
 ecflow_4_0_7/Base/src/Cmd.hpp                      |     27 +
 ecflow_4_0_7/Base/src/Connection.hpp               |    315 +
 ecflow_4_0_7/Base/src/Gnuplot.cpp                  |    358 +
 ecflow_4_0_7/Base/src/Gnuplot.hpp                  |     69 +
 ecflow_4_0_7/Base/src/ServerReply.cpp              |     36 +
 ecflow_4_0_7/Base/src/ServerReply.hpp              |    138 +
 ecflow_4_0_7/Base/src/ServerToClientResponse.cpp   |     70 +
 ecflow_4_0_7/Base/src/ServerToClientResponse.hpp   |     62 +
 ecflow_4_0_7/Base/src/Stats.cpp                    |    333 +
 ecflow_4_0_7/Base/src/Stats.hpp                    |    216 +
 ecflow_4_0_7/Base/src/WhyCmd.cpp                   |     58 +
 ecflow_4_0_7/Base/src/WhyCmd.hpp                   |     37 +
 ecflow_4_0_7/Base/src/ZombieCtrl.cpp               |    772 +
 ecflow_4_0_7/Base/src/ZombieCtrl.hpp               |    142 +
 ecflow_4_0_7/Base/src/cts/AlterCmd.cpp             |    977 +
 ecflow_4_0_7/Base/src/cts/BeginCmd.cpp             |    177 +
 ecflow_4_0_7/Base/src/cts/CFileCmd.cpp             |    309 +
 ecflow_4_0_7/Base/src/cts/CSyncCmd.cpp             |    156 +
 ecflow_4_0_7/Base/src/cts/CheckPtCmd.cpp           |    202 +
 ecflow_4_0_7/Base/src/cts/ClientHandleCmd.cpp      |    336 +
 ecflow_4_0_7/Base/src/cts/ClientToServerCmd.cpp    |    194 +
 ecflow_4_0_7/Base/src/cts/ClientToServerCmd.hpp    |   1828 +
 ecflow_4_0_7/Base/src/cts/CtsApi.cpp               |    710 +
 ecflow_4_0_7/Base/src/cts/CtsApi.hpp               |    216 +
 ecflow_4_0_7/Base/src/cts/CtsCmd.cpp               |    390 +
 ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.cpp       |    145 +
 ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.hpp       |     56 +
 ecflow_4_0_7/Base/src/cts/CtsNodeCmd.cpp           |    338 +
 ecflow_4_0_7/Base/src/cts/EditHistoryMgr.cpp       |     88 +
 ecflow_4_0_7/Base/src/cts/EditHistoryMgr.hpp       |     41 +
 ecflow_4_0_7/Base/src/cts/EditScriptCmd.cpp        |    400 +
 ecflow_4_0_7/Base/src/cts/ForceCmd.cpp             |    259 +
 ecflow_4_0_7/Base/src/cts/FreeDepCmd.cpp           |    154 +
 ecflow_4_0_7/Base/src/cts/GroupCTSCmd.cpp          |    293 +
 ecflow_4_0_7/Base/src/cts/LoadDefsCmd.cpp          |    154 +
 ecflow_4_0_7/Base/src/cts/LogCmd.cpp               |    234 +
 ecflow_4_0_7/Base/src/cts/LogMessageCmd.cpp        |     72 +
 ecflow_4_0_7/Base/src/cts/OrderNodeCmd.cpp         |    110 +
 ecflow_4_0_7/Base/src/cts/PathsCmd.cpp             |    505 +
 ecflow_4_0_7/Base/src/cts/PlugCmd.cpp              |    392 +
 ecflow_4_0_7/Base/src/cts/ReplaceNodeCmd.cpp       |    203 +
 ecflow_4_0_7/Base/src/cts/RequeueNodeCmd.cpp       |    219 +
 ecflow_4_0_7/Base/src/cts/RunNodeCmd.cpp           |    170 +
 ecflow_4_0_7/Base/src/cts/ServerVersionCmd.cpp     |     80 +
 ecflow_4_0_7/Base/src/cts/ShowCmd.cpp              |    104 +
 ecflow_4_0_7/Base/src/cts/TaskApi.cpp              |     80 +
 ecflow_4_0_7/Base/src/cts/TaskApi.hpp              |     43 +
 ecflow_4_0_7/Base/src/cts/TaskCmds.cpp             |    923 +
 ecflow_4_0_7/Base/src/cts/UserCmd.cpp              |    126 +
 ecflow_4_0_7/Base/src/cts/ZombieCmd.cpp            |    226 +
 ecflow_4_0_7/Base/src/stc/DefsCmd.cpp              |     99 +
 ecflow_4_0_7/Base/src/stc/DefsCmd.hpp              |     52 +
 ecflow_4_0_7/Base/src/stc/ErrorCmd.cpp             |     63 +
 ecflow_4_0_7/Base/src/stc/ErrorCmd.hpp             |     45 +
 ecflow_4_0_7/Base/src/stc/GroupSTCCmd.cpp          |    124 +
 ecflow_4_0_7/Base/src/stc/GroupSTCCmd.hpp          |     44 +
 ecflow_4_0_7/Base/src/stc/PreAllocatedReply.cpp    |    201 +
 ecflow_4_0_7/Base/src/stc/PreAllocatedReply.hpp    |     71 +
 ecflow_4_0_7/Base/src/stc/SClientHandleCmd.cpp     |     34 +
 ecflow_4_0_7/Base/src/stc/SClientHandleCmd.hpp     |     42 +
 .../Base/src/stc/SClientHandleSuitesCmd.cpp        |    118 +
 .../Base/src/stc/SClientHandleSuitesCmd.hpp        |     47 +
 ecflow_4_0_7/Base/src/stc/SNewsCmd.cpp             |    262 +
 ecflow_4_0_7/Base/src/stc/SNewsCmd.hpp             |     63 +
 ecflow_4_0_7/Base/src/stc/SNodeCmd.cpp             |    144 +
 ecflow_4_0_7/Base/src/stc/SNodeCmd.hpp             |     58 +
 ecflow_4_0_7/Base/src/stc/SServerLoadCmd.cpp       |     45 +
 ecflow_4_0_7/Base/src/stc/SServerLoadCmd.hpp       |     48 +
 ecflow_4_0_7/Base/src/stc/SStatsCmd.cpp            |     57 +
 ecflow_4_0_7/Base/src/stc/SStatsCmd.hpp            |     50 +
 ecflow_4_0_7/Base/src/stc/SStringCmd.cpp           |     46 +
 ecflow_4_0_7/Base/src/stc/SStringCmd.hpp           |     54 +
 ecflow_4_0_7/Base/src/stc/SStringVecCmd.cpp        |     50 +
 ecflow_4_0_7/Base/src/stc/SStringVecCmd.hpp        |     46 +
 ecflow_4_0_7/Base/src/stc/SSuitesCmd.cpp           |     86 +
 ecflow_4_0_7/Base/src/stc/SSuitesCmd.hpp           |     48 +
 ecflow_4_0_7/Base/src/stc/SSyncCmd.cpp             |    466 +
 ecflow_4_0_7/Base/src/stc/SSyncCmd.hpp             |    160 +
 ecflow_4_0_7/Base/src/stc/ServerToClientCmd.cpp    |     26 +
 ecflow_4_0_7/Base/src/stc/ServerToClientCmd.hpp    |     62 +
 ecflow_4_0_7/Base/src/stc/StcCmd.cpp               |     69 +
 ecflow_4_0_7/Base/src/stc/StcCmd.hpp               |     57 +
 ecflow_4_0_7/Base/src/stc/ZombieGetCmd.cpp         |     66 +
 ecflow_4_0_7/Base/src/stc/ZombieGetCmd.hpp         |     49 +
 ecflow_4_0_7/Base/test/MockServer.hpp              |     98 +
 ecflow_4_0_7/Base/test/TestAlterCmd.cpp            |    780 +
 ecflow_4_0_7/Base/test/TestClientHandleCmd.cpp     |    260 +
 ecflow_4_0_7/Base/test/TestCmd.cpp                 |    109 +
 ecflow_4_0_7/Base/test/TestDeleteNodeCmd.cpp       |    163 +
 ecflow_4_0_7/Base/test/TestECFLOW-189.cpp          |     87 +
 ecflow_4_0_7/Base/test/TestForceCmd.cpp            |    922 +
 ecflow_4_0_7/Base/test/TestFreeDepCmd.cpp          |    304 +
 ecflow_4_0_7/Base/test/TestHelper.hpp              |     90 +
 ecflow_4_0_7/Base/test/TestLimit.cpp               |    669 +
 ecflow_4_0_7/Base/test/TestMeterCmd.cpp            |     96 +
 ecflow_4_0_7/Base/test/TestRequest.cpp             |    316 +
 ecflow_4_0_7/Base/test/TestRequeueNodeCmd.cpp      |    150 +
 ecflow_4_0_7/Base/test/TestResolveDependencies.cpp |    277 +
 ecflow_4_0_7/Base/test/TestSSyncCmd.cpp            |    383 +
 ecflow_4_0_7/Base/test/TestSSyncCmdOrder.cpp       |    233 +
 ecflow_4_0_7/Base/test/TestSSyncCmd_CH1.cpp        |    678 +
 ecflow_4_0_7/CMAKE_failed_tests.txt                |     22 +
 ecflow_4_0_7/CMakeLists.txt                        |    191 +
 ecflow_4_0_7/COPYING                               |    201 +
 ecflow_4_0_7/CSim/CMakeLists.txt                   |     50 +
 ecflow_4_0_7/CSim/jamfile.jam                      |     95 +
 ecflow_4_0_7/CSim/src/Analyser.cpp                 |     57 +
 ecflow_4_0_7/CSim/src/Analyser.hpp                 |     31 +
 ecflow_4_0_7/CSim/src/AstAnalyserVisitor.cpp       |     58 +
 ecflow_4_0_7/CSim/src/AstAnalyserVisitor.hpp       |     64 +
 ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.cpp      |    167 +
 ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.hpp      |     47 +
 ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.cpp      |    111 +
 ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.hpp      |     43 +
 ecflow_4_0_7/CSim/src/Simulator.cpp                |    360 +
 ecflow_4_0_7/CSim/src/Simulator.hpp                |     61 +
 ecflow_4_0_7/CSim/src/SimulatorVisitor.cpp         |    148 +
 ecflow_4_0_7/CSim/src/SimulatorVisitor.hpp         |     73 +
 ecflow_4_0_7/CSim/test/TestAnalysis.cpp            |     82 +
 ecflow_4_0_7/CSim/test/TestAutoCancel.cpp          |    271 +
 ecflow_4_0_7/CSim/test/TestMeter.cpp               |    108 +
 ecflow_4_0_7/CSim/test/TestRepeat.cpp              |    412 +
 ecflow_4_0_7/CSim/test/TestSimulator.cpp           |    135 +
 ecflow_4_0_7/CSim/test/TestSingleSimulator.cpp     |    107 +
 ecflow_4_0_7/CSim/test/TestTime.cpp                |    380 +
 ecflow_4_0_7/CSim/test/TestToday.cpp               |    158 +
 ecflow_4_0_7/CSim/test/TestUtil.cpp                |     28 +
 ecflow_4_0_7/CSim/test/TestUtil.hpp                |     36 +
 ecflow_4_0_7/CSim/test/data/bad_defs/today.def     |      6 +
 ecflow_4_0_7/CSim/test/data/bad_defs/xde.def       |      8 +
 .../test/data/good_defs/ECFLOW-130/radarlvl2.def   |     24 +
 .../test/data/good_defs/SingleDefsTest/test.def    |      8 +
 .../CSim/test/data/good_defs/cron/cron.def         |     10 +
 .../CSim/test/data/good_defs/cron/cron2.def        |     10 +
 .../CSim/test/data/good_defs/cron/cron3.def        |     10 +
 .../CSim/test/data/good_defs/cron/cron4.def        |     10 +
 .../CSim/test/data/good_defs/cron/cron5.def        |     10 +
 .../CSim/test/data/good_defs/cron/cron6.def        |     10 +
 .../CSim/test/data/good_defs/cron/cron7.def        |     10 +
 ecflow_4_0_7/CSim/test/data/good_defs/day/day.def  |     12 +
 .../CSim/test/data/good_defs/day/hybrid_day.def    |     12 +
 .../CSim/test/data/good_defs/today/today.def       |      6 +
 .../CSim/test/data/good_defs/today/today2.def      |     15 +
 .../CSim/test/data/good_defs/today/today_range.def |     13 +
 ecflow_4_0_7/Client/.gitignore                     |      1 +
 ecflow_4_0_7/Client/CMakeLists.txt                 |    125 +
 ecflow_4_0_7/Client/Jamfile.jam                    |    137 +
 ecflow_4_0_7/Client/doc/config_file.doc            |     63 +
 ecflow_4_0_7/Client/doc/environment.cfg            |     68 +
 ecflow_4_0_7/Client/ecf_hostsfile                  |      9 +
 ecflow_4_0_7/Client/src/ClientEnvironment.cpp      |    391 +
 ecflow_4_0_7/Client/src/ClientEnvironment.hpp      |    150 +
 ecflow_4_0_7/Client/src/ClientInvoker.cpp          |   1321 +
 ecflow_4_0_7/Client/src/ClientInvoker.hpp          |    365 +
 ecflow_4_0_7/Client/src/ClientMain.cpp             |     32 +
 ecflow_4_0_7/Client/src/ClientOptions.cpp          |    328 +
 ecflow_4_0_7/Client/src/ClientOptions.hpp          |     50 +
 ecflow_4_0_7/Client/src/Rtt.cpp                    |    180 +
 ecflow_4_0_7/Client/src/Rtt.hpp                    |     62 +
 ecflow_4_0_7/Client/src/UrlCmd.cpp                 |     66 +
 ecflow_4_0_7/Client/src/UrlCmd.hpp                 |     40 +
 ecflow_4_0_7/Client/test/EcfPortLock.hpp           |     79 +
 ecflow_4_0_7/Client/test/InvokeServer.hpp          |    158 +
 ecflow_4_0_7/Client/test/SCPort.cpp                |     42 +
 ecflow_4_0_7/Client/test/SCPort.hpp                |     42 +
 ecflow_4_0_7/Client/test/TestCheckPtDefsCmd.cpp    |    237 +
 ecflow_4_0_7/Client/test/TestClientEnvironment.cpp |    256 +
 ecflow_4_0_7/Client/test/TestClientInterface.cpp   |    515 +
 ecflow_4_0_7/Client/test/TestClientInvoker.cpp     |     63 +
 ecflow_4_0_7/Client/test/TestClientTimeout.cpp     |     77 +
 ecflow_4_0_7/Client/test/TestGroupCmd.cpp          |    219 +
 ecflow_4_0_7/Client/test/TestJobGenOnly.cpp        |     97 +
 ecflow_4_0_7/Client/test/TestLifeCycle.cpp         |    216 +
 ecflow_4_0_7/Client/test/TestLoadDefsCmd.cpp       |    160 +
 ecflow_4_0_7/Client/test/TestMigration.cpp         |    107 +
 ecflow_4_0_7/Client/test/TestPlugCmd.cpp           |    321 +
 ecflow_4_0_7/Client/test/TestRtt.cpp               |     53 +
 ecflow_4_0_7/Client/test/TestServer.cpp            |    318 +
 .../Client/test/TestServerAndLifeCycle.cpp         |    249 +
 ecflow_4_0_7/Client/test/TestSignalSIGTERM.cpp     |     82 +
 ecflow_4_0_7/Client/test/TestSinglePerf.cpp        |    211 +
 ecflow_4_0_7/Client/test/TestUrlCmd.cpp            |     65 +
 ecflow_4_0_7/Client/test/TestWhiteListFile.cpp     |     88 +
 .../Client/test/data/ECF_HOME/includes/head.h      |     43 +
 .../Client/test/data/ECF_HOME/includes/tail.h      |      9 +
 .../Client/test/data/ECF_HOME/suite/family/head.h  |     37 +
 .../Client/test/data/ECF_HOME/suite/family/t1.ecf  |     72 +
 .../Client/test/data/ECF_HOME/suite/family/t2.ecf  |     19 +
 .../Client/test/data/ECF_HOME/suite/family/t3.ecf  |     39 +
 .../Client/test/data/ECF_HOME/suite/family/tail.h  |      3 +
 ecflow_4_0_7/Client/test/data/bad.def              |      5 +
 ecflow_4_0_7/Client/test/data/first.def            |     20 +
 ecflow_4_0_7/Client/test/data/good_hostfile        |     13 +
 ecflow_4_0_7/Client/test/data/jobgenonly.def       |     15 +
 ecflow_4_0_7/Client/test/data/lifecycle.txt        |     19 +
 ecflow_4_0_7/Client/test/data/second.def           |     17 +
 ecflow_4_0_7/Doc/user-manual/client_options.docx   |    Bin 0 -> 66463 bytes
 ecflow_4_0_7/Doc/user-manual/user_manual.docx      |    Bin 0 -> 555789 bytes
 ecflow_4_0_7/Doc/user-manual/user_manual.pdf       |    Bin 0 -> 4922737 bytes
 ecflow_4_0_7/Jamroot.jam                           |    187 +
 ecflow_4_0_7/LICENSE                               |    201 +
 ecflow_4_0_7/Makefile                              |      9 +
 ecflow_4_0_7/Makefile.old                          |     24 +
 ecflow_4_0_7/NOTICE                                |     56 +
 ecflow_4_0_7/Pyext/.gitignore                      |      2 +
 ecflow_4_0_7/Pyext/CMakeLists.txt                  |    143 +
 ecflow_4_0_7/Pyext/doc/jamfile.jam                 |    299 +
 ecflow_4_0_7/Pyext/doc/overload.txt                |     14 +
 ecflow_4_0_7/Pyext/ecflow/__init__.py              |     12 +
 ecflow_4_0_7/Pyext/jamfile.jam                     |    205 +
 ecflow_4_0_7/Pyext/migrate/abort_and_label_bug.def |     93 +
 ecflow_4_0_7/Pyext/migrate/aborted_reason_bug.def  |     82 +
 ecflow_4_0_7/Pyext/migrate/ecflow_migrate.py       |    416 +
 ecflow_4_0_7/Pyext/migrate/history_bug.def         |     18 +
 ecflow_4_0_7/Pyext/migrate/label_bug.def           |     11 +
 ecflow_4_0_7/Pyext/migrate/no_migration.def        |     11 +
 ecflow_4_0_7/Pyext/migrate/py_u_TestMigrate.py     |    189 +
 ecflow_4_0_7/Pyext/migrate/variable_bug.def        |     11 +
 ecflow_4_0_7/Pyext/samples/ListVariables.py        |     65 +
 ecflow_4_0_7/Pyext/samples/TestBench.py            |    200 +
 ecflow_4_0_7/Pyext/samples/TestJobGenPerf.py       |    155 +
 ecflow_4_0_7/Pyext/samples/TestServerGetDefs.py    |     59 +
 ecflow_4_0_7/Pyext/samples/ecf.py                  |   1012 +
 ecflow_4_0_7/Pyext/samples/printdefs.py            |    178 +
 ecflow_4_0_7/Pyext/script.py                       |     11 +
 ecflow_4_0_7/Pyext/setup.py.in                     |    135 +
 ecflow_4_0_7/Pyext/src/BoostPythonUtil.cpp         |     56 +
 ecflow_4_0_7/Pyext/src/BoostPythonUtil.hpp         |     37 +
 ecflow_4_0_7/Pyext/src/ClientDoc.cpp               |   1419 +
 ecflow_4_0_7/Pyext/src/ClientDoc.hpp               |     92 +
 ecflow_4_0_7/Pyext/src/DefsDoc.cpp                 |    800 +
 ecflow_4_0_7/Pyext/src/DefsDoc.hpp                 |     71 +
 ecflow_4_0_7/Pyext/src/EcfExt.cpp                  |     45 +
 ecflow_4_0_7/Pyext/src/ExportClient.cpp            |    329 +
 ecflow_4_0_7/Pyext/src/ExportCore.cpp              |    247 +
 ecflow_4_0_7/Pyext/src/ExportDefs.cpp              |    189 +
 ecflow_4_0_7/Pyext/src/ExportNode.cpp              |    279 +
 ecflow_4_0_7/Pyext/src/ExportNodeAttr.cpp          |    386 +
 ecflow_4_0_7/Pyext/src/ExportSuiteAndFamily.cpp    |     91 +
 ecflow_4_0_7/Pyext/src/ExportTask.cpp              |     66 +
 ecflow_4_0_7/Pyext/src/NodeAttrDoc.cpp             |    567 +
 ecflow_4_0_7/Pyext/src/NodeAttrDoc.hpp             |     54 +
 ecflow_4_0_7/Pyext/test/CleanupOnlineTutorial.py   |     28 +
 ecflow_4_0_7/Pyext/test/TestEmbedded.cpp           |    139 +
 ecflow_4_0_7/Pyext/test/TestEmbeddedEcf.cpp        |     84 +
 ecflow_4_0_7/Pyext/test/data/.gitignore            |      1 +
 .../test/data/ECF_HOME/suite_job_gen/family/t1.ecf |     72 +
 .../test/data/ECF_HOME/suite_job_gen/family/t2.ecf |      9 +
 .../test/data/ECF_HOME/suite_job_gen/family/t3.ecf |     34 +
 ecflow_4_0_7/Pyext/test/data/includes/head.h       |     45 +
 ecflow_4_0_7/Pyext/test/data/includes/tail.h       |      4 +
 .../Pyext/test/data/python_includes/head.py        |     26 +
 .../Pyext/test/data/python_includes/tail.py        |      7 +
 ecflow_4_0_7/Pyext/test/ecflow_test_util.py        |    220 +
 ecflow_4_0_7/Pyext/test/py_s_TestClientApi.py      |   1539 +
 ecflow_4_0_7/Pyext/test/py_s_TestPythonChildApi.py |    140 +
 ecflow_4_0_7/Pyext/test/py_u_TestAddDelete.py      |    484 +
 ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteError.py |     86 +
 ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteFunc.py  |    311 +
 ecflow_4_0_7/Pyext/test/py_u_TestAddNodeFunc.py    |     69 +
 ecflow_4_0_7/Pyext/test/py_u_TestDefs.py           |    221 +
 ecflow_4_0_7/Pyext/test/py_u_TestDefsCheck.py      |     72 +
 ecflow_4_0_7/Pyext/test/py_u_TestDerivable.py      |     28 +
 ecflow_4_0_7/Pyext/test/py_u_TestEcf.py            |     38 +
 ecflow_4_0_7/Pyext/test/py_u_TestError.py          |    443 +
 ecflow_4_0_7/Pyext/test/py_u_TestFind.py           |     54 +
 .../Pyext/test/py_u_TestGeneratedVariable.py       |     76 +
 ecflow_4_0_7/Pyext/test/py_u_TestGetAllTasks.py    |     73 +
 ecflow_4_0_7/Pyext/test/py_u_TestJobGeneration.py  |    135 +
 ecflow_4_0_7/Pyext/test/py_u_TestParent.py         |     77 +
 .../Pyext/test/py_u_TestRepeatArithmetic.py        |     52 +
 ecflow_4_0_7/Pyext/test/py_u_TestSimulator.py      |     82 +
 ecflow_4_0_7/Pyext/test/py_u_TestTraversal.py      |    221 +
 ecflow_4_0_7/Pyext/test/py_u_TestUserManual.py     |    156 +
 ecflow_4_0_7/Pyext/test/py_u_TestWith.py           |     79 +
 ecflow_4_0_7/Pyext/unicode.py                      |      7 +
 ecflow_4_0_7/README                                |    157 +
 ecflow_4_0_7/Server/CMakeLists.txt                 |     80 +
 ecflow_4_0_7/Server/Jamfile.jam                    |     93 +
 ecflow_4_0_7/Server/server_environment.cfg         |    153 +
 ecflow_4_0_7/Server/src/CConnection.cpp            |    237 +
 ecflow_4_0_7/Server/src/CConnection.hpp            |     74 +
 ecflow_4_0_7/Server/src/CheckPtSaver.cpp           |    243 +
 ecflow_4_0_7/Server/src/CheckPtSaver.hpp           |     86 +
 ecflow_4_0_7/Server/src/NodeTreeTraverser.cpp      |    396 +
 ecflow_4_0_7/Server/src/NodeTreeTraverser.hpp      |     86 +
 ecflow_4_0_7/Server/src/Server.cpp                 |    716 +
 ecflow_4_0_7/Server/src/Server.hpp                 |    159 +
 ecflow_4_0_7/Server/src/ServerEnvironment.cpp      |    635 +
 ecflow_4_0_7/Server/src/ServerEnvironment.hpp      |    216 +
 ecflow_4_0_7/Server/src/ServerMain.cpp             |     79 +
 ecflow_4_0_7/Server/src/ServerOptions.cpp          |    160 +
 ecflow_4_0_7/Server/src/ServerOptions.hpp          |     38 +
 ecflow_4_0_7/Server/test/TestServer1.cpp           |    135 +
 ecflow_4_0_7/Server/test/TestServerEnvironment.cpp |    364 +
 ecflow_4_0_7/Test/CMakeLists.txt                   |     75 +
 ecflow_4_0_7/Test/DummyMain.cpp                    |     13 +
 ecflow_4_0_7/Test/Jamfile.jam                      |    115 +
 ecflow_4_0_7/Test/TestAbortCmd.cpp                 |     99 +
 ecflow_4_0_7/Test/TestAlias.cpp                    |    218 +
 ecflow_4_0_7/Test/TestClkSync.cpp                  |     85 +
 ecflow_4_0_7/Test/TestComplete.cpp                 |    178 +
 ecflow_4_0_7/Test/TestCron.cpp                     |    145 +
 ecflow_4_0_7/Test/TestCtsWaitCmd.cpp               |    216 +
 ecflow_4_0_7/Test/TestEvents.cpp                   |    107 +
 ecflow_4_0_7/Test/TestFileCmd.cpp                  |    132 +
 ecflow_4_0_7/Test/TestHandle.cpp                   |    391 +
 ecflow_4_0_7/Test/TestKillCmd.cpp                  |    149 +
 ecflow_4_0_7/Test/TestLate.cpp                     |     85 +
 ecflow_4_0_7/Test/TestLimit.cpp                    |    118 +
 ecflow_4_0_7/Test/TestOrderCmd.cpp                 |    216 +
 ecflow_4_0_7/Test/TestRepeat.cpp                   |    338 +
 ecflow_4_0_7/Test/TestRequeueNode.cpp              |    112 +
 ecflow_4_0_7/Test/TestRunner.cpp                   |     21 +
 ecflow_4_0_7/Test/TestServer.cpp                   |    135 +
 ecflow_4_0_7/Test/TestSingle.cpp                   |    182 +
 ecflow_4_0_7/Test/TestSuspend.cpp                  |    228 +
 ecflow_4_0_7/Test/TestToday.cpp                    |    201 +
 ecflow_4_0_7/Test/TestTrigger.cpp                  |     92 +
 ecflow_4_0_7/Test/TestWhyCmd.cpp                   |    538 +
 ecflow_4_0_7/Test/TestZombies.cpp                  |    948 +
 ecflow_4_0_7/Test/Test_Time.cpp                    |    387 +
 ecflow_4_0_7/Test/data/.gitignore                  |      2 +
 ecflow_4_0_7/Test/data/includes/head.h             |     63 +
 ecflow_4_0_7/Test/data/includes/tail.h             |     17 +
 ecflow_4_0_7/Test/samples/cron.def                 |    105 +
 ecflow_4_0_7/Test/samples/time.def                 |     84 +
 ecflow_4_0_7/Test/samples/today.def                |     75 +
 ecflow_4_0_7/Test/src/ServerTestHarness.cpp        |    558 +
 ecflow_4_0_7/Test/src/ServerTestHarness.hpp        |    109 +
 ecflow_4_0_7/Test/src/TestFixture.cpp              |    381 +
 ecflow_4_0_7/Test/src/TestFixture.hpp              |    103 +
 ecflow_4_0_7/Test/src/ZombieUtil.hpp               |     38 +
 ecflow_4_0_7/Test/src/ZombieUtill.cpp              |    184 +
 ecflow_4_0_7/VERSION.cmake                         |      7 +
 ecflow_4_0_7/boost-build.jam                       |     45 +
 ecflow_4_0_7/build/aix_fix/README                  |    118 +
 ecflow_4_0_7/build/aix_fix/boost_1_53_0/README     |     11 +
 ecflow_4_0_7/build/aix_fix/boost_1_53_0/thread.cpp |    744 +
 ecflow_4_0_7/build/aix_fix/force_include.hpp       |     64 +
 .../build/aix_fix/force_include.hpp_boost_1.44     |     64 +
 ecflow_4_0_7/build/aix_fix/header_diff_item2.txt   |     49 +
 ecflow_4_0_7/build/aix_fix/path.hpp                |    714 +
 ecflow_4_0_7/build/aix_fix/singleton.hpp           |    158 +
 ecflow_4_0_7/build/boost_1_47_fix.sh               |     46 +
 ecflow_4_0_7/build/boost_1_48_fix.sh               |     52 +
 ecflow_4_0_7/build/boost_1_51_fix.sh               |     36 +
 ecflow_4_0_7/build/boost_1_53_fix.sh               |     53 +
 ecflow_4_0_7/build/boost_1_56_fix.sh               |     14 +
 ecflow_4_0_7/build/boost_1_57_fix.sh               |     54 +
 ecflow_4_0_7/build/boost_build.sh                  |    152 +
 ecflow_4_0_7/build/clean.sh                        |     64 +
 ecflow_4_0_7/build/cray_fix/boost_1_55_0/README    |    111 +
 ecflow_4_0_7/build/cray_fix/boost_1_55_0/cray.hpp  |     88 +
 ecflow_4_0_7/build/cray_fix/boost_1_55_0/smalldiff |    144 +
 ecflow_4_0_7/build/cray_fix/swap.sh                |    100 +
 ecflow_4_0_7/build/cray_fix/update_cray_swap.sh    |      9 +
 .../build/fix/boost_1_56_0/shared_ptr_helper.hpp   |    216 +
 ecflow_4_0_7/build/hpux_fix/README                 |    199 +
 .../build/hpux_fix/boost_1_51_0/future.hpp         |   1704 +
 .../hpux_fix/boost_1_51_0/overflow_helpers.hpp     |    397 +
 .../build/hpux_fix/boost_1_51_0/system_clocks.hpp  |    234 +
 .../hpux_fix/boost_1_51_0/utf8_codecvt_facet.ipp   |    309 +
 ecflow_4_0_7/build/hpux_fix/boost_1_53_0/README    |     24 +
 .../build/hpux_fix/boost_1_53_0/smart_cast.hpp     |    303 +
 .../hpux_fix/boost_1_53_0/utf8_codecvt_facet.ipp   |    309 +
 ecflow_4_0_7/build/hpux_fix/cstdint.hpp            |    512 +
 ecflow_4_0_7/build/hpux_fix/socket_ops.hpp         |   1914 +
 ecflow_4_0_7/build/hpux_fix/utf8_codecvt_facet.cpp |    307 +
 ecflow_4_0_7/build/install_ecflow.sh               |    258 +
 ecflow_4_0_7/build/kill_ecf.sh                     |     26 +
 ecflow_4_0_7/build/massif.sh                       |     33 +
 ecflow_4_0_7/build/migrate.sh                      |     15 +
 ecflow_4_0_7/build/p4_sync.sh                      |     27 +
 ecflow_4_0_7/build/rmbin.sh                        |     23 +
 ecflow_4_0_7/build/site_config/site-config-AIX.jam |    108 +
 .../build/site_config/site-config-HPUX.jam         |    113 +
 .../build/site_config/site-config-Linux.jam        |     91 +
 .../site_config/site-config-Linux64-clang.jam      |     91 +
 .../site_config/site-config-Linux64-intel.jam      |     98 +
 .../build/site_config/site-config-Linux64.jam      |     96 +
 .../build/site_config/site-config-cray.jam         |    203 +
 ecflow_4_0_7/build/tar_ecflow.sh                   |    146 +
 ecflow_4_0_7/build/tar_ecflow_doc.sh               |     78 +
 ecflow_4_0_7/build/test.sh                         |    185 +
 ecflow_4_0_7/build/update_site_config.sh           |     83 +
 ecflow_4_0_7/cmake.sh                              |     53 +
 ecflow_4_0_7/configure.sh                          |     69 +
 ecflow_4_0_7/project_summary.cmake                 |     21 +
 ecflow_4_0_7/tools/ecf_cmd                         |    868 +
 ecflow_4_0_7/tools/ecf_kill                        |    243 +
 ecflow_4_0_7/tools/ecf_status                      |    209 +
 ecflow_4_0_7/tools/ecf_submit                      |    868 +
 ecflow_4_0_7/tools/ecflow_logsvr.pl                |    Bin 0 -> 2674 bytes
 ecflow_4_0_7/tools/ecflow_logsvr.sh                |     51 +
 ecflow_4_0_7/tools/ecflow_start.sh                 |    283 +
 ecflow_4_0_7/tools/ecflow_stop.sh                  |    111 +
 ecflow_4_0_7/tools/noconnect.sh                    |     32 +
 ecflow_4_0_7/version.sh                            |      7 +
 ecflow_4_0_7/view/CMakeLists.txt                   |    278 +
 ecflow_4_0_7/view/Jamfile.jam                      |    117 +
 ecflow_4_0_7/view/Makefile                         |     99 +
 ecflow_4_0_7/view/data/includes/head.h             |     54 +
 ecflow_4_0_7/view/data/includes/tail.h             |      8 +
 ecflow_4_0_7/view/install_server.sh                |     29 +
 ecflow_4_0_7/view/servers                          |     48 +
 ecflow_4_0_7/view/servers.od                       |      8 +
 ecflow_4_0_7/view/src/ArrayP.h                     |     60 +
 ecflow_4_0_7/view/src/Hyper.c                      |   1589 +
 ecflow_4_0_7/view/src/Hyper.h                      |    119 +
 ecflow_4_0_7/view/src/HyperP.h                     |    110 +
 ecflow_4_0_7/view/src/SimpleBase.c                 |   1304 +
 ecflow_4_0_7/view/src/SimpleBase.h                 |     95 +
 ecflow_4_0_7/view/src/SimpleBaseP.h                |    133 +
 ecflow_4_0_7/view/src/SimpleGraph.c                |   1324 +
 ecflow_4_0_7/view/src/SimpleGraph.h                |     42 +
 ecflow_4_0_7/view/src/SimpleGraphP.h               |     72 +
 ecflow_4_0_7/view/src/SimpleTime.c                 |    784 +
 ecflow_4_0_7/view/src/SimpleTime.h                 |     76 +
 ecflow_4_0_7/view/src/SimpleTimeP.h                |     74 +
 ecflow_4_0_7/view/src/SimpleTree.c                 |    656 +
 ecflow_4_0_7/view/src/SimpleTree.h                 |     49 +
 ecflow_4_0_7/view/src/SimpleTreeP.h                |     60 +
 ecflow_4_0_7/view/src/Tab.c                        |    784 +
 ecflow_4_0_7/view/src/Tab.h                        |     66 +
 ecflow_4_0_7/view/src/TabP.h                       |     80 +
 ecflow_4_0_7/view/src/aborted.cc                   |     33 +
 ecflow_4_0_7/view/src/aborted.h                    |    109 +
 ecflow_4_0_7/view/src/alerts.cc                    |     26 +
 ecflow_4_0_7/view/src/alias.cc                     |     38 +
 ecflow_4_0_7/view/src/arch.h                       |     20 +
 ecflow_4_0_7/view/src/array.cc                     |     79 +
 ecflow_4_0_7/view/src/array.h                      |    131 +
 ecflow_4_0_7/view/src/ask.cc                       |     46 +
 ecflow_4_0_7/view/src/ask.h                        |     41 +
 ecflow_4_0_7/view/src/autoAlarm.h                  |     42 +
 ecflow_4_0_7/view/src/auto_alarm.cc                |     47 +
 ecflow_4_0_7/view/src/auto_alarm.h                 |     44 +
 ecflow_4_0_7/view/src/base.cc                      |    203 +
 ecflow_4_0_7/view/src/base.h                       |     65 +
 ecflow_4_0_7/view/src/bool.h                       |     25 +
 ecflow_4_0_7/view/src/cdp.cmd                      |     71 +
 ecflow_4_0_7/view/src/choice.h                     |     37 +
 ecflow_4_0_7/view/src/collector.cc                 |    280 +
 ecflow_4_0_7/view/src/collector.h                  |    100 +
 ecflow_4_0_7/view/src/colors_prefs.cc              |     24 +
 ecflow_4_0_7/view/src/colors_prefs.h               |     47 +
 ecflow_4_0_7/view/src/configurable.cc              |     23 +
 ecflow_4_0_7/view/src/configurable.h               |     38 +
 ecflow_4_0_7/view/src/configurator.h               |    128 +
 ecflow_4_0_7/view/src/confirm.cc                   |     44 +
 ecflow_4_0_7/view/src/confirm.h                    |     40 +
 ecflow_4_0_7/view/src/counted.cc                   |     37 +
 ecflow_4_0_7/view/src/counted.h                    |    124 +
 ecflow_4_0_7/view/src/date.cc                      |    106 +
 ecflow_4_0_7/view/src/date.h                       |     48 +
 ecflow_4_0_7/view/src/depend.cc                    |     72 +
 ecflow_4_0_7/view/src/depend.h                     |    126 +
 ecflow_4_0_7/view/src/dialog.cc                    |     83 +
 ecflow_4_0_7/view/src/dialog.h                     |     50 +
 ecflow_4_0_7/view/src/directory.cc                 |     72 +
 ecflow_4_0_7/view/src/directory.h                  |     40 +
 ecflow_4_0_7/view/src/doer.sh                      |     29 +
 ecflow_4_0_7/view/src/dummy_node.cc                |     58 +
 ecflow_4_0_7/view/src/dummy_node.h                 |     53 +
 ecflow_4_0_7/view/src/ecf.cmd                      |     71 +
 ecflow_4_0_7/view/src/ecf_node.cc                  |   1193 +
 ecflow_4_0_7/view/src/ecf_node.h                   |    582 +
 ecflow_4_0_7/view/src/ecflow.cc                    |    289 +
 ecflow_4_0_7/view/src/ecflow.h                     |    258 +
 ecflow_4_0_7/view/src/ecflowview.cc                |    165 +
 ecflow_4_0_7/view/src/ecflowview.h                 |     53 +
 ecflow_4_0_7/view/src/ecflowview.menu              |    313 +
 ecflow_4_0_7/view/src/ecflowview.menu.h            |    317 +
 ecflow_4_0_7/view/src/edit.cc                      |    264 +
 ecflow_4_0_7/view/src/edit.h                       |     76 +
 ecflow_4_0_7/view/src/edit_label.cc                |     86 +
 ecflow_4_0_7/view/src/edit_label.h                 |    137 +
 ecflow_4_0_7/view/src/edit_limit.cc                |    146 +
 ecflow_4_0_7/view/src/edit_limit.h                 |     60 +
 ecflow_4_0_7/view/src/edit_meter.cc                |     91 +
 ecflow_4_0_7/view/src/edit_meter.h                 |    137 +
 ecflow_4_0_7/view/src/edit_repeat.cc               |    140 +
 ecflow_4_0_7/view/src/edit_repeat.h                |     51 +
 ecflow_4_0_7/view/src/edit_variable.cc             |     70 +
 ecflow_4_0_7/view/src/edit_variable.h              |     58 +
 ecflow_4_0_7/view/src/editor.cc                    |     47 +
 ecflow_4_0_7/view/src/editor.h                     |    108 +
 ecflow_4_0_7/view/src/error.cc                     |     38 +
 ecflow_4_0_7/view/src/error.h                      |    106 +
 ecflow_4_0_7/view/src/eval.h                       |     49 +
 ecflow_4_0_7/view/src/event_node.cc                |     75 +
 ecflow_4_0_7/view/src/event_node.h                 |     42 +
 ecflow_4_0_7/view/src/events.h                     |    132 +
 ecflow_4_0_7/view/src/extent.h                     |     74 +
 ecflow_4_0_7/view/src/external.cc                  |     64 +
 ecflow_4_0_7/view/src/external.h                   |     53 +
 ecflow_4_0_7/view/src/find.cc                      |    173 +
 ecflow_4_0_7/view/src/find.h                       |     58 +
 ecflow_4_0_7/view/src/flags.cc                     |     85 +
 ecflow_4_0_7/view/src/flags.h                      |    117 +
 ecflow_4_0_7/view/src/fonts_prefs.cc               |     24 +
 ecflow_4_0_7/view/src/fonts_prefs.h                |    133 +
 ecflow_4_0_7/view/src/fsb.cc                       |     91 +
 ecflow_4_0_7/view/src/fsb.h                        |    125 +
 ecflow_4_0_7/view/src/gen.sh                       |     21 +
 ecflow_4_0_7/view/src/gen_translator.h             |     25 +
 ecflow_4_0_7/view/src/globals.cc                   |     92 +
 ecflow_4_0_7/view/src/globals.h                    |     53 +
 ecflow_4_0_7/view/src/graph_layout.cc              |    455 +
 ecflow_4_0_7/view/src/graph_layout.h               |     74 +
 ecflow_4_0_7/view/src/gui.cc                       |    377 +
 ecflow_4_0_7/view/src/gui.h                        |     83 +
 ecflow_4_0_7/view/src/history.cc                   |    116 +
 ecflow_4_0_7/view/src/history.h                    |     59 +
 ecflow_4_0_7/view/src/host.cc                      |   1791 +
 ecflow_4_0_7/view/src/host.h                       |    353 +
 ecflow_4_0_7/view/src/host_prefs.cc                |     24 +
 ecflow_4_0_7/view/src/host_prefs.h                 |     46 +
 ecflow_4_0_7/view/src/html_lister.cc               |     72 +
 ecflow_4_0_7/view/src/html_lister.h                |    133 +
 ecflow_4_0_7/view/src/http.cc                      |    112 +
 ecflow_4_0_7/view/src/http.h                       |    143 +
 ecflow_4_0_7/view/src/hyper_lister.cc              |     73 +
 ecflow_4_0_7/view/src/hyper_lister.h               |     57 +
 ecflow_4_0_7/view/src/icon_Josstatus3.cc           |     41 +
 ecflow_4_0_7/view/src/icon_W.cc                    |     86 +
 ecflow_4_0_7/view/src/icon_byrule.cc               |     38 +
 ecflow_4_0_7/view/src/icon_cmd_failed.cc           |     52 +
 ecflow_4_0_7/view/src/icon_edit_failed.cc          |     54 +
 ecflow_4_0_7/view/src/icon_force_abort.cc          |     39 +
 ecflow_4_0_7/view/src/icon_killed.cc               |     47 +
 ecflow_4_0_7/view/src/icon_no_script.cc            |     56 +
 ecflow_4_0_7/view/src/icon_queuelimit.cc           |     47 +
 ecflow_4_0_7/view/src/icon_task_aborted.cc         |     53 +
 ecflow_4_0_7/view/src/icon_user_edit.cc            |     52 +
 ecflow_4_0_7/view/src/info.cc                      |     55 +
 ecflow_4_0_7/view/src/info.h                       |     46 +
 ecflow_4_0_7/view/src/init.cc                      |     36 +
 ecflow_4_0_7/view/src/init.h                       |    127 +
 ecflow_4_0_7/view/src/inlimit_node.cc              |     71 +
 ecflow_4_0_7/view/src/inlimit_node.h               |     49 +
 ecflow_4_0_7/view/src/input.cc                     |     67 +
 ecflow_4_0_7/view/src/input.h                      |    127 +
 ecflow_4_0_7/view/src/interface.cc                 |     26 +
 ecflow_4_0_7/view/src/interface.h                  |     55 +
 ecflow_4_0_7/view/src/job.cc                       |     61 +
 ecflow_4_0_7/view/src/job.h                        |     65 +
 ecflow_4_0_7/view/src/jobcheck_panel.cc            |     92 +
 ecflow_4_0_7/view/src/jobcheck_panel.h             |     66 +
 ecflow_4_0_7/view/src/jobstatus.cc                 |    109 +
 ecflow_4_0_7/view/src/jobstatus.h                  |     71 +
 ecflow_4_0_7/view/src/label.cc                     |     89 +
 ecflow_4_0_7/view/src/label_node.h                 |     53 +
 ecflow_4_0_7/view/src/late.cc                      |     32 +
 ecflow_4_0_7/view/src/late.h                       |    109 +
 ecflow_4_0_7/view/src/late_node.cc                 |     29 +
 ecflow_4_0_7/view/src/late_node.h                  |     49 +
 ecflow_4_0_7/view/src/layout.cc                    |     26 +
 ecflow_4_0_7/view/src/layout.h                     |    134 +
 ecflow_4_0_7/view/src/lexyacc.h                    |     70 +
 ecflow_4_0_7/view/src/libicon/icon_Apply.cc        |     42 +
 ecflow_4_0_7/view/src/libicon/icon_Apply.xpm       |     40 +
 ecflow_4_0_7/view/src/libicon/icon_Chat.cc         |     41 +
 ecflow_4_0_7/view/src/libicon/icon_Chat.xpm        |     39 +
 ecflow_4_0_7/view/src/libicon/icon_Check.cc        |     71 +
 ecflow_4_0_7/view/src/libicon/icon_Check.xpm       |     69 +
 ecflow_4_0_7/view/src/libicon/icon_Edit.cc         |     47 +
 ecflow_4_0_7/view/src/libicon/icon_Edit.xpm        |     43 +
 ecflow_4_0_7/view/src/libicon/icon_Info.cc         |     40 +
 ecflow_4_0_7/view/src/libicon/icon_Info.xpm        |     39 +
 ecflow_4_0_7/view/src/libicon/icon_Jobstatus.cc    |     41 +
 ecflow_4_0_7/view/src/libicon/icon_Jobstatus.xpm   |     39 +
 ecflow_4_0_7/view/src/libicon/icon_Josstatus3.xpm  |     39 +
 ecflow_4_0_7/view/src/libicon/icon_Load.cc         |     39 +
 ecflow_4_0_7/view/src/libicon/icon_Load.xpm        |     38 +
 ecflow_4_0_7/view/src/libicon/icon_Manual.cc       |     56 +
 ecflow_4_0_7/view/src/libicon/icon_Manual.xpm      |     54 +
 ecflow_4_0_7/view/src/libicon/icon_Merge.cc        |     40 +
 ecflow_4_0_7/view/src/libicon/icon_Merge.xpm       |     38 +
 ecflow_4_0_7/view/src/libicon/icon_Messages.cc     |     40 +
 ecflow_4_0_7/view/src/libicon/icon_Messages.xpm    |     41 +
 ecflow_4_0_7/view/src/libicon/icon_Output.cc       |     45 +
 ecflow_4_0_7/view/src/libicon/icon_Output.xpm      |     42 +
 ecflow_4_0_7/view/src/libicon/icon_QuickFind.cc    |     38 +
 ecflow_4_0_7/view/src/libicon/icon_QuickFind.xpm   |     36 +
 ecflow_4_0_7/view/src/libicon/icon_Script.cc       |     43 +
 ecflow_4_0_7/view/src/libicon/icon_Script.xpm      |     41 +
 ecflow_4_0_7/view/src/libicon/icon_Search.cc       |     49 +
 ecflow_4_0_7/view/src/libicon/icon_Search.xpm      |     45 +
 ecflow_4_0_7/view/src/libicon/icon_Status.cc       |     50 +
 ecflow_4_0_7/view/src/libicon/icon_Status.xpm      |     48 +
 ecflow_4_0_7/view/src/libicon/icon_Submit.cc       |     42 +
 ecflow_4_0_7/view/src/libicon/icon_Submit.xpm      |     40 +
 ecflow_4_0_7/view/src/libicon/icon_Time_line.cc    |     42 +
 ecflow_4_0_7/view/src/libicon/icon_Time_line.xpm   |     40 +
 ecflow_4_0_7/view/src/libicon/icon_Triggers.cc     |     39 +
 ecflow_4_0_7/view/src/libicon/icon_Triggers.xpm    |     37 +
 ecflow_4_0_7/view/src/libicon/icon_Update.cc       |     50 +
 ecflow_4_0_7/view/src/libicon/icon_Update.xpm      |     48 +
 .../view/src/libicon/icon_Use_external_editor.cc   |     43 +
 .../view/src/libicon/icon_Use_external_editor.xpm  |     43 +
 .../view/src/libicon/icon_Use_external_viewer.cc   |     42 +
 .../view/src/libicon/icon_Use_external_viewer.xpm  |     40 +
 ecflow_4_0_7/view/src/libicon/icon_Variables.cc    |     38 +
 ecflow_4_0_7/view/src/libicon/icon_Variables.xpm   |     36 +
 ecflow_4_0_7/view/src/libicon/icon_W.xpm           |     84 +
 ecflow_4_0_7/view/src/libicon/icon_Why_.cc         |     42 +
 ecflow_4_0_7/view/src/libicon/icon_Why_.xpm        |     25 +
 ecflow_4_0_7/view/src/libicon/icon_Z.cc            |     86 +
 ecflow_4_0_7/view/src/libicon/icon_Z.xpm           |     69 +
 ecflow_4_0_7/view/src/libicon/icon_Zbw.cc          |     68 +
 ecflow_4_0_7/view/src/libicon/icon_Zbw.xpm         |     66 +
 ecflow_4_0_7/view/src/libicon/icon_calendar.cc     |     40 +
 ecflow_4_0_7/view/src/libicon/icon_calendar.xpm    |     38 +
 ecflow_4_0_7/view/src/libicon/icon_clock.cc        |     42 +
 ecflow_4_0_7/view/src/libicon/icon_clock.xpm       |     40 +
 ecflow_4_0_7/view/src/libicon/icon_clock_free.cc   |     42 +
 ecflow_4_0_7/view/src/libicon/icon_complete.cc     |     65 +
 ecflow_4_0_7/view/src/libicon/icon_complete.xpm    |     57 +
 ecflow_4_0_7/view/src/libicon/icon_defstatus.cc    |    164 +
 ecflow_4_0_7/view/src/libicon/icon_defstatus.xpm   |    162 +
 ecflow_4_0_7/view/src/libicon/icon_folded.cc       |     39 +
 ecflow_4_0_7/view/src/libicon/icon_folded.xpm      |     37 +
 ecflow_4_0_7/view/src/libicon/icon_late.cc         |     39 +
 ecflow_4_0_7/view/src/libicon/icon_late.xpm        |     37 +
 ecflow_4_0_7/view/src/libicon/icon_limit0.cc       |     32 +
 ecflow_4_0_7/view/src/libicon/icon_limit0.xpm      |     30 +
 ecflow_4_0_7/view/src/libicon/icon_limit1.cc       |     34 +
 ecflow_4_0_7/view/src/libicon/icon_limit1.xpm      |     32 +
 ecflow_4_0_7/view/src/libicon/icon_limit2.cc       |     34 +
 ecflow_4_0_7/view/src/libicon/icon_limit2.xpm      |     32 +
 ecflow_4_0_7/view/src/libicon/icon_locked.cc       |     40 +
 ecflow_4_0_7/view/src/libicon/icon_locked.xpm      |     38 +
 ecflow_4_0_7/view/src/libicon/icon_memo.cc         |     15 +
 ecflow_4_0_7/view/src/libicon/icon_memo.xpm        |     67 +
 ecflow_4_0_7/view/src/libicon/icon_message.cc      |     40 +
 ecflow_4_0_7/view/src/libicon/icon_message.xpm     |     41 +
 ecflow_4_0_7/view/src/libicon/icon_migrated.cc     |     40 +
 ecflow_4_0_7/view/src/libicon/icon_migrated.xpm    |     37 +
 ecflow_4_0_7/view/src/libicon/icon_noway.cc        |     65 +
 ecflow_4_0_7/view/src/libicon/icon_noway.xpm       |     63 +
 ecflow_4_0_7/view/src/libicon/icon_rerun.cc        |     39 +
 ecflow_4_0_7/view/src/libicon/icon_rerun.xpm       |     37 +
 ecflow_4_0_7/view/src/libicon/icon_waiting.cc      |     38 +
 ecflow_4_0_7/view/src/libicon/icon_waiting.xpm     |     36 +
 ecflow_4_0_7/view/src/libicon/xpm2cc               |     27 +
 ecflow_4_0_7/view/src/libui/uiask.cc               |     84 +
 ecflow_4_0_7/view/src/libui/uiask.h                |     34 +
 ecflow_4_0_7/view/src/libui/uicollector.cc         |    204 +
 ecflow_4_0_7/view/src/libui/uicollector.h          |     50 +
 ecflow_4_0_7/view/src/libui/uicolors.cc            |    495 +
 ecflow_4_0_7/view/src/libui/uicolors.h             |     30 +
 ecflow_4_0_7/view/src/libui/uiconfirm.cc           |     79 +
 ecflow_4_0_7/view/src/libui/uiconfirm.h            |     33 +
 ecflow_4_0_7/view/src/libui/uidepend.cc            |    122 +
 ecflow_4_0_7/view/src/libui/uidepend.h             |     32 +
 ecflow_4_0_7/view/src/libui/uiedit.cc              |    160 +
 ecflow_4_0_7/view/src/libui/uiedit.h               |     43 +
 ecflow_4_0_7/view/src/libui/uiedit_label.cc        |    139 +
 ecflow_4_0_7/view/src/libui/uiedit_label.h         |     34 +
 ecflow_4_0_7/view/src/libui/uiedit_limit.cc        |    139 +
 ecflow_4_0_7/view/src/libui/uiedit_limit.h         |     39 +
 ecflow_4_0_7/view/src/libui/uiedit_meter.cc        |    117 +
 ecflow_4_0_7/view/src/libui/uiedit_meter.h         |     36 +
 ecflow_4_0_7/view/src/libui/uiedit_repeat.cc       |    126 +
 ecflow_4_0_7/view/src/libui/uiedit_repeat.h        |     37 +
 ecflow_4_0_7/view/src/libui/uiedit_variable.cc     |    110 +
 ecflow_4_0_7/view/src/libui/uiedit_variable.h      |     34 +
 ecflow_4_0_7/view/src/libui/uierror.cc             |     72 +
 ecflow_4_0_7/view/src/libui/uierror.h              |     33 +
 ecflow_4_0_7/view/src/libui/uifind.cc              |    229 +
 ecflow_4_0_7/view/src/libui/uifind.h               |     45 +
 ecflow_4_0_7/view/src/libui/uifonts.cc             |    421 +
 ecflow_4_0_7/view/src/libui/uifonts.h              |     30 +
 ecflow_4_0_7/view/src/libui/uifsb.cc               |     80 +
 ecflow_4_0_7/view/src/libui/uifsb.h                |     33 +
 ecflow_4_0_7/view/src/libui/uihistory.cc           |     62 +
 ecflow_4_0_7/view/src/libui/uihistory.h            |     30 +
 ecflow_4_0_7/view/src/libui/uiinfo.cc              |     81 +
 ecflow_4_0_7/view/src/libui/uiinfo.h               |     28 +
 ecflow_4_0_7/view/src/libui/uijob.cc               |    120 +
 ecflow_4_0_7/view/src/libui/uijob.h                |     34 +
 ecflow_4_0_7/view/src/libui/uijobcheck.cc          |    100 +
 ecflow_4_0_7/view/src/libui/uijobcheck.h           |     32 +
 ecflow_4_0_7/view/src/libui/uijobstatus.cc         |    150 +
 ecflow_4_0_7/view/src/libui/uijobstatus.h          |     48 +
 ecflow_4_0_7/view/src/libui/uimail.cc              |    136 +
 ecflow_4_0_7/view/src/libui/uimail.h               |     33 +
 ecflow_4_0_7/view/src/libui/uimanual.cc            |    102 +
 ecflow_4_0_7/view/src/libui/uimanual.h             |     33 +
 ecflow_4_0_7/view/src/libui/uimenu.cc              |    229 +
 ecflow_4_0_7/view/src/libui/uimenu.h               |     44 +
 ecflow_4_0_7/view/src/libui/uimessages.cc          |    103 +
 ecflow_4_0_7/view/src/libui/uimessages.h           |     33 +
 ecflow_4_0_7/view/src/libui/uinode_alert.cc        |    164 +
 ecflow_4_0_7/view/src/libui/uinode_alert.h         |     38 +
 ecflow_4_0_7/view/src/libui/uioption.cc            |   1022 +
 ecflow_4_0_7/view/src/libui/uioption.h             |     45 +
 ecflow_4_0_7/view/src/libui/uioutput.cc            |    166 +
 ecflow_4_0_7/view/src/libui/uioutput.h             |     39 +
 ecflow_4_0_7/view/src/libui/uipanel.cc             |    200 +
 ecflow_4_0_7/view/src/libui/uipanel.h              |     55 +
 ecflow_4_0_7/view/src/libui/uipasswd.cc            |    135 +
 ecflow_4_0_7/view/src/libui/uipasswd.h             |     38 +
 ecflow_4_0_7/view/src/libui/uipref.cc              |    105 +
 ecflow_4_0_7/view/src/libui/uipref.h               |     34 +
 ecflow_4_0_7/view/src/libui/uiscript.cc            |    126 +
 ecflow_4_0_7/view/src/libui/uiscript.h             |     34 +
 ecflow_4_0_7/view/src/libui/uisearch.cc            |    565 +
 ecflow_4_0_7/view/src/libui/uisearch.h             |     65 +
 ecflow_4_0_7/view/src/libui/uiservers.cc           |    225 +
 ecflow_4_0_7/view/src/libui/uiservers.h            |     45 +
 ecflow_4_0_7/view/src/libui/uisuites.cc            |    127 +
 ecflow_4_0_7/view/src/libui/uisuites.h             |     34 +
 ecflow_4_0_7/view/src/libui/uitimetable.cc         |    351 +
 ecflow_4_0_7/view/src/libui/uitimetable.h          |     59 +
 ecflow_4_0_7/view/src/libui/uitip.cc               |     71 +
 ecflow_4_0_7/view/src/libui/uitip.h                |     26 +
 ecflow_4_0_7/view/src/libui/uitop.cc               |   1053 +
 ecflow_4_0_7/view/src/libui/uitop.h                |     79 +
 ecflow_4_0_7/view/src/libui/uitree.cc              |    144 +
 ecflow_4_0_7/view/src/libui/uitree.h               |     45 +
 ecflow_4_0_7/view/src/libui/uitriggers.cc          |    298 +
 ecflow_4_0_7/view/src/libui/uitriggers.h           |     66 +
 ecflow_4_0_7/view/src/libui/uiuser.cc              |    107 +
 ecflow_4_0_7/view/src/libui/uiuser.h               |     30 +
 ecflow_4_0_7/view/src/libui/uiusers.cc             |     76 +
 ecflow_4_0_7/view/src/libui/uiusers.h              |     28 +
 ecflow_4_0_7/view/src/libui/uivariables.cc         |    216 +
 ecflow_4_0_7/view/src/libui/uivariables.h          |     46 +
 ecflow_4_0_7/view/src/libui/uiwhy.cc               |     81 +
 ecflow_4_0_7/view/src/libui/uiwhy.h                |     28 +
 ecflow_4_0_7/view/src/libui/uizombies.cc           |    143 +
 ecflow_4_0_7/view/src/libui/uizombies.h            |     37 +
 ecflow_4_0_7/view/src/libxec/xec_Cursor.c          |     52 +
 ecflow_4_0_7/view/src/libxec/xec_Label.c           |     42 +
 ecflow_4_0_7/view/src/libxec/xec_List.c            |    276 +
 ecflow_4_0_7/view/src/libxec/xec_Regexp.c          |     91 +
 ecflow_4_0_7/view/src/libxec/xec_Strings.c         |    134 +
 ecflow_4_0_7/view/src/libxec/xec_Text.c            |    551 +
 ecflow_4_0_7/view/src/libxec/xec_Toggle.c          |     41 +
 ecflow_4_0_7/view/src/libxec/xec_Widget.c          |    215 +
 ecflow_4_0_7/view/src/limit_node.cc                |    459 +
 ecflow_4_0_7/view/src/limit_node.h                 |     74 +
 ecflow_4_0_7/view/src/line.c                       |     42 +
 ecflow_4_0_7/view/src/lister.cc                    |     65 +
 ecflow_4_0_7/view/src/lister.h                     |     42 +
 ecflow_4_0_7/view/src/log_event.cc                 |    355 +
 ecflow_4_0_7/view/src/log_event.h                  |    132 +
 ecflow_4_0_7/view/src/log_file.h                   |    129 +
 ecflow_4_0_7/view/src/logsvr.cc                    |    246 +
 ecflow_4_0_7/view/src/logsvr.h                     |     54 +
 ecflow_4_0_7/view/src/mail.cc                      |    246 +
 ecflow_4_0_7/view/src/mail.h                       |     67 +
 ecflow_4_0_7/view/src/manual.cc                    |     53 +
 ecflow_4_0_7/view/src/manual.h                     |     66 +
 ecflow_4_0_7/view/src/menu2c.sh                    |     16 +
 ecflow_4_0_7/view/src/menu_prefs.cc                |     75 +
 ecflow_4_0_7/view/src/menu_prefs.h                 |     60 +
 ecflow_4_0_7/view/src/menul.c                      |   3230 +
 ecflow_4_0_7/view/src/menul.l                      |    230 +
 ecflow_4_0_7/view/src/menus.cc                     |    796 +
 ecflow_4_0_7/view/src/menus.h                      |     73 +
 ecflow_4_0_7/view/src/menuy.c                      |   2428 +
 ecflow_4_0_7/view/src/menuy.y                      |    328 +
 ecflow_4_0_7/view/src/messages.cc                  |     78 +
 ecflow_4_0_7/view/src/messages.h                   |     68 +
 ecflow_4_0_7/view/src/meter_node.cc                |    160 +
 ecflow_4_0_7/view/src/meter_node.h                 |     59 +
 ecflow_4_0_7/view/src/node.cc                      |   1086 +
 ecflow_4_0_7/view/src/node.h                       |    350 +
 ecflow_4_0_7/view/src/node_alert.cc                |    112 +
 ecflow_4_0_7/view/src/node_alert.h                 |     76 +
 ecflow_4_0_7/view/src/node_editor.cc               |     66 +
 ecflow_4_0_7/view/src/node_editor.h                |    134 +
 ecflow_4_0_7/view/src/node_list.cc                 |    129 +
 ecflow_4_0_7/view/src/node_list.h                  |     62 +
 ecflow_4_0_7/view/src/node_lister.h                |     41 +
 ecflow_4_0_7/view/src/node_window.cc               |    253 +
 ecflow_4_0_7/view/src/node_window.h                |     73 +
 ecflow_4_0_7/view/src/not_enqueued.cc              |     32 +
 ecflow_4_0_7/view/src/not_enqueued.h               |     45 +
 ecflow_4_0_7/view/src/observable.cc                |     79 +
 ecflow_4_0_7/view/src/observable.h                 |     45 +
 ecflow_4_0_7/view/src/observer.cc                  |     48 +
 ecflow_4_0_7/view/src/observer.h                   |     48 +
 ecflow_4_0_7/view/src/opener.h                     |    126 +
 ecflow_4_0_7/view/src/option.cc                    |    205 +
 ecflow_4_0_7/view/src/option.h                     |     48 +
 ecflow_4_0_7/view/src/option_panel.cc              |     60 +
 ecflow_4_0_7/view/src/option_panel.h               |     58 +
 ecflow_4_0_7/view/src/output.cc                    |    221 +
 ecflow_4_0_7/view/src/output.h                     |     67 +
 ecflow_4_0_7/view/src/panel.cc                     |    125 +
 ecflow_4_0_7/view/src/panel.h                      |    110 +
 ecflow_4_0_7/view/src/panel_factories.h            |     40 +
 ecflow_4_0_7/view/src/panel_window.cc              |    432 +
 ecflow_4_0_7/view/src/panel_window.h               |    118 +
 ecflow_4_0_7/view/src/parser.cc                    |    101 +
 ecflow_4_0_7/view/src/parser.h                     |    125 +
 ecflow_4_0_7/view/src/passwrd.cc                   |     71 +
 ecflow_4_0_7/view/src/passwrd.h                    |    116 +
 ecflow_4_0_7/view/src/patch.pl                     |     20 +
 ecflow_4_0_7/view/src/persist.cc                   |    149 +
 ecflow_4_0_7/view/src/persist.h                    |    139 +
 ecflow_4_0_7/view/src/pixmap.cc                    |    103 +
 ecflow_4_0_7/view/src/pixmap.h                     |     53 +
 ecflow_4_0_7/view/src/pref_editor.cc               |     87 +
 ecflow_4_0_7/view/src/pref_editor.h                |     55 +
 ecflow_4_0_7/view/src/pref_window.cc               |     54 +
 ecflow_4_0_7/view/src/pref_window.h                |     51 +
 ecflow_4_0_7/view/src/prefs.cc                     |     41 +
 ecflow_4_0_7/view/src/prefs.h                      |    126 +
 ecflow_4_0_7/view/src/re.h                         |     54 +
 ecflow_4_0_7/view/src/reach.cc                     |    255 +
 ecflow_4_0_7/view/src/reach.h                      |     48 +
 ecflow_4_0_7/view/src/relation.cc                  |    186 +
 ecflow_4_0_7/view/src/relation.h                   |     74 +
 ecflow_4_0_7/view/src/repeat.h                     |    151 +
 ecflow_4_0_7/view/src/repeat_node.cc               |    308 +
 ecflow_4_0_7/view/src/repeat_node.h                |     66 +
 ecflow_4_0_7/view/src/resource.cc                  |    112 +
 ecflow_4_0_7/view/src/resource.h                   |     71 +
 ecflow_4_0_7/view/src/restart.cc                   |     32 +
 ecflow_4_0_7/view/src/restart.h                    |    109 +
 ecflow_4_0_7/view/src/result.cc                    |     32 +
 ecflow_4_0_7/view/src/result.h                     |     38 +
 ecflow_4_0_7/view/src/runnable.cc                  |     64 +
 ecflow_4_0_7/view/src/runnable.h                   |     49 +
 ecflow_4_0_7/view/src/script_panel.cc              |     61 +
 ecflow_4_0_7/view/src/script_panel.h               |     64 +
 ecflow_4_0_7/view/src/scripting.cc                 |    390 +
 ecflow_4_0_7/view/src/scripting.h                  |     49 +
 ecflow_4_0_7/view/src/search.cc                    |    288 +
 ecflow_4_0_7/view/src/search.h                     |     82 +
 ecflow_4_0_7/view/src/searchable.cc                |    151 +
 ecflow_4_0_7/view/src/searchable.h                 |     61 +
 ecflow_4_0_7/view/src/selection.cc                 |    153 +
 ecflow_4_0_7/view/src/selection.h                  |     56 +
 ecflow_4_0_7/view/src/server.cc                    |    179 +
 ecflow_4_0_7/view/src/server.h                     |     40 +
 ecflow_4_0_7/view/src/servers_prefs.cc             |    259 +
 ecflow_4_0_7/view/src/servers_prefs.h              |     79 +
 ecflow_4_0_7/view/src/show.cc                      |     93 +
 ecflow_4_0_7/view/src/show.h                       |    104 +
 ecflow_4_0_7/view/src/simple_node.cc               |   1062 +
 ecflow_4_0_7/view/src/simple_node.h                |    158 +
 ecflow_4_0_7/view/src/singleton.h                  |     32 +
 ecflow_4_0_7/view/src/std.h                        |      6 +
 ecflow_4_0_7/view/src/stl.h                        |     19 +
 ecflow_4_0_7/view/src/str.cc                       |     99 +
 ecflow_4_0_7/view/src/str.h                        |     59 +
 ecflow_4_0_7/view/src/substitute.cc                |    139 +
 ecflow_4_0_7/view/src/substitute.h                 |     55 +
 ecflow_4_0_7/view/src/suites_panel.cc              |    146 +
 ecflow_4_0_7/view/src/suites_panel.h               |     54 +
 ecflow_4_0_7/view/src/super_node.cc                |     96 +
 ecflow_4_0_7/view/src/super_node.h                 |     72 +
 ecflow_4_0_7/view/src/task_node.cc                 |    281 +
 ecflow_4_0_7/view/src/task_node.h                  |     58 +
 ecflow_4_0_7/view/src/text_layout.cc               |    123 +
 ecflow_4_0_7/view/src/text_layout.h                |    143 +
 ecflow_4_0_7/view/src/text_lister.h                |     79 +
 ecflow_4_0_7/view/src/text_window.cc               |    194 +
 ecflow_4_0_7/view/src/text_window.h                |     65 +
 ecflow_4_0_7/view/src/time.cc                      |    163 +
 ecflow_4_0_7/view/src/time_node.h                  |     49 +
 ecflow_4_0_7/view/src/timeout.cc                   |     86 +
 ecflow_4_0_7/view/src/timeout.h                    |     53 +
 ecflow_4_0_7/view/src/timetable_panel.cc           |    731 +
 ecflow_4_0_7/view/src/timetable_panel.h            |    123 +
 ecflow_4_0_7/view/src/tip.cc                       |    114 +
 ecflow_4_0_7/view/src/tip.h                        |     52 +
 ecflow_4_0_7/view/src/tmp_file.cc                  |    109 +
 ecflow_4_0_7/view/src/tmp_file.h                   |     83 +
 ecflow_4_0_7/view/src/tmpnam.c                     |     63 +
 ecflow_4_0_7/view/src/to_check.h                   |     40 +
 ecflow_4_0_7/view/src/top.cc                       |    512 +
 ecflow_4_0_7/view/src/top.h                        |     72 +
 ecflow_4_0_7/view/src/trans.sh                     |      5 +
 ecflow_4_0_7/view/src/translator.cc                |    211 +
 ecflow_4_0_7/view/src/translator.h                 |    114 +
 ecflow_4_0_7/view/src/tree.cc                      |    340 +
 ecflow_4_0_7/view/src/tree.h                       |    105 +
 ecflow_4_0_7/view/src/trigger_lister.h             |     41 +
 ecflow_4_0_7/view/src/trigger_node.cc              |    274 +
 ecflow_4_0_7/view/src/trigger_node.h               |     59 +
 ecflow_4_0_7/view/src/trigger_panel.cc             |    160 +
 ecflow_4_0_7/view/src/trigger_panel.h              |     85 +
 ecflow_4_0_7/view/src/url.cc                       |    240 +
 ecflow_4_0_7/view/src/url.h                        |    142 +
 ecflow_4_0_7/view/src/user_prefs.cc                |     24 +
 ecflow_4_0_7/view/src/user_prefs.h                 |     49 +
 ecflow_4_0_7/view/src/users.cc                     |     62 +
 ecflow_4_0_7/view/src/users.h                      |    136 +
 ecflow_4_0_7/view/src/variable_node.cc             |    135 +
 ecflow_4_0_7/view/src/variable_node.h              |     54 +
 ecflow_4_0_7/view/src/variables.cc                 |    417 +
 ecflow_4_0_7/view/src/variables.h                  |     58 +
 ecflow_4_0_7/view/src/viewer.cc                    |     57 +
 ecflow_4_0_7/view/src/viewer.h                     |    134 +
 ecflow_4_0_7/view/src/why.cc                       |     64 +
 ecflow_4_0_7/view/src/why.h                        |     49 +
 ecflow_4_0_7/view/src/window.cc                    |     59 +
 ecflow_4_0_7/view/src/window.h                     |     44 +
 ecflow_4_0_7/view/src/x.c                          |     19 +
 ecflow_4_0_7/view/src/xcdp.menu                    |    257 +
 ecflow_4_0_7/view/src/xcdp.menu.h                  |    258 +
 ecflow_4_0_7/view/src/xdclass.h                    |    225 +
 ecflow_4_0_7/view/src/xdxmdialog.cc                |     66 +
 ecflow_4_0_7/view/src/xdxtclass.cc                 |    223 +
 ecflow_4_0_7/view/src/xec.h                        |     24 +
 ecflow_4_0_7/view/src/xecp.h                       |     75 +
 ecflow_4_0_7/view/src/xmstring.cc                  |    107 +
 ecflow_4_0_7/view/src/xmstring.h                   |    128 +
 ecflow_4_0_7/view/src/xnode.cc                     |     56 +
 ecflow_4_0_7/view/src/xnode.h                      |     85 +
 ecflow_4_0_7/view/src/xresources.h                 |    628 +
 ecflow_4_0_7/view/src/zombie.h                     |     39 +
 ecflow_4_0_7/view/src/zombies_panel.cc             |    125 +
 ecflow_4_0_7/view/src/zombies_panel.h              |     62 +
 ecflow_4_0_7/view/test/TestRunner.cpp              |     21 +
 ecflow_4_0_7/view/test/TestView.cpp                |    126 +
 ecflow_4_0_7/view/test/ViewTestFixture.hpp         |     33 +
 ecflow_4_0_7/view/test/test_flags.sh               |     27 +
 ecflow_4_0_7/view/tool/reload.sdef                 |     97 +
 1743 files changed, 416518 insertions(+)

diff --git a/ecbuild/.cproject b/ecbuild/.cproject
new file mode 100644
index 0000000..18ccafc
--- /dev/null
+++ b/ecbuild/.cproject
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1298805696">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.1298805696" moduleId="org.eclipse.cdt.core.settings" name="Default">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration buildProperties="" id="cdt.managedbuild.toolchain.gnu.base.1298805696" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
+					<folderInfo id="cdt.managedbuild.toolchain.gnu.base.1298805696.343791376" name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.base.222734635" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.base">
+							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.base.1421442229" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
+							<builder id="cdt.managedbuild.target.gnu.builder.base.1628994041" managedBuildOn="false" name="Gnu Make Builder.Default" superClass="cdt.managedbuild.target.gnu.builder.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.284779640" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1978772046" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.2058316558" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.base.1694186035" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.616621355" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.base.1802178549" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base"/>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="scannerConfiguration">
+		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.debug.1319857020;cdt.managedbuild.config.gnu.cross.exe.debug.1319857020.;cdt.managedbuild.tool.gnu.cross.cpp.compiler.411133180;cdt.managedbuild.tool.gnu.cpp.compiler.input.1649178953">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.82906048;cdt.managedbuild.config.gnu.exe.release.82906048.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1671708469;cdt.managedbuild.tool.gnu.cpp.compiler.input.1921164278">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.381634699;cdt.managedbuild.config.gnu.cross.exe.release.381634699.;cdt.managedbuild.tool.gnu.cross.cpp.compiler.425486738;cdt.managedbuild.tool.gnu.cpp.compiler.input.1810510997">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.294858900;cdt.managedbuild.config.gnu.exe.debug.294858900.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.636062781;cdt.managedbuild.tool.gnu.c.compiler.input.540848204">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.82906048;cdt.managedbuild.config.gnu.exe.release.82906048.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.280707483;cdt.managedbuild.tool.gnu.c.compiler.input.1276186659">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.294858900;cdt.managedbuild.config.gnu.exe.debug.294858900.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1253744786;cdt.managedbuild.tool.gnu.cpp.compiler.input.345025843">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.debug.1319857020;cdt.managedbuild.config.gnu.cross.exe.debug.1319857020.;cdt.managedbuild.tool.gnu.cross.c.compiler.1274562050;cdt.managedbuild.tool.gnu.c.compiler.input.1990532997">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.381634699;cdt.managedbuild.config.gnu.cross.exe.release.381634699.;cdt.managedbuild.tool.gnu.cross.c.compiler.1274373530;cdt.managedbuild.tool.gnu.c.compiler.input.1986827568">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+		</scannerConfigBuildInfo>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="ecbuild.null.1331004306" name="ecbuild"/>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+</cproject>
diff --git a/ecbuild/.gitignore b/ecbuild/.gitignore
new file mode 100644
index 0000000..d8ceade
--- /dev/null
+++ b/ecbuild/.gitignore
@@ -0,0 +1,2 @@
+CMakeLists.txt.user*
+*.swp
diff --git a/ecbuild/.project b/ecbuild/.project
new file mode 100644
index 0000000..0dc07fa
--- /dev/null
+++ b/ecbuild/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ecbuild</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/ecbuild/.settings/language.settings.xml b/ecbuild/.settings/language.settings.xml
new file mode 100644
index 0000000..1bf0c88
--- /dev/null
+++ b/ecbuild/.settings/language.settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+	<configuration id="cdt.managedbuild.config.gnu.cross.exe.debug.1319857020" name="Debug">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="37260238735818327" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.cross.exe.release.381634699" name="Release">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="37260238735818327" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+</project>
diff --git a/ecbuild/AUTHORS b/ecbuild/AUTHORS
new file mode 100644
index 0000000..6da9a73
--- /dev/null
+++ b/ecbuild/AUTHORS
@@ -0,0 +1,12 @@
+eckit Authors
+=============
+
+eckit is mainly developed at the "European Centre for Medium-Range Weather Forecasts" (ECMWF, http://www.ecmwf.int).
+See attached LICENSE file for copyright.
+
+Developers:
+===========
+
+Tiago Quintino
+Baudouin Raoult
+Willem Deconinck
diff --git a/ecbuild/CMakeLists.txt b/ecbuild/CMakeLists.txt
new file mode 100644
index 0000000..f610f16
--- /dev/null
+++ b/ecbuild/CMakeLists.txt
@@ -0,0 +1,48 @@
+############################################################################################
+# cmake options:
+#
+#       -DCMAKE_INSTALL_PREFIX=/path/to/install
+
+cmake_minimum_required( VERSION 2.8.4 FATAL_ERROR )
+
+project( ecbuild C )
+
+set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} )
+
+include( ecbuild_system )
+
+###############################################################################
+# local project
+
+ecbuild_declare_project()
+
+configure_file( cmake/ecbuild_version.h.in ${CMAKE_BINARY_DIR}/ecbuild_version.h  )
+
+ecbuild_add_option( FEATURE INSTALL
+					DEFAULT OFF
+					DESCRIPTION "Wether to install ecbuild files" )
+# contents
+
+ecbuild_add_resources(  TARGET ${PROJECT_NAME}_description_files
+                        SOURCES_PACK
+                            INSTALL
+                            AUTHORS
+                            NOTICE
+                            LICENSE
+                            COPYING
+)
+
+add_subdirectory( bin )
+add_subdirectory( share )
+add_subdirectory( cmake )
+
+if( ENABLE_INSTALL )
+	install( DIRECTORY cmake DESTINATION ${INSTALL_DATA_DIR} PATTERN "CMakeLists.txt" EXCLUDE )
+endif()
+
+############################################################################################
+# finalize
+
+ecbuild_install_project( NAME ${PROJECT_NAME} )
+
+ecbuild_print_summary()
diff --git a/ecbuild/COPYING b/ecbuild/COPYING
new file mode 100644
index 0000000..457b4a0
--- /dev/null
+++ b/ecbuild/COPYING
@@ -0,0 +1,201 @@
+                                Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2007-2013 European Centre for Medium-Range Weather Forecasts (ECMWF)
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/ecbuild/INSTALL b/ecbuild/INSTALL
new file mode 100644
index 0000000..7b9deb1
--- /dev/null
+++ b/ecbuild/INSTALL
@@ -0,0 +1,19 @@
+============================
+ecbuild - ECMWF build system
+============================
+
+Installation and usage instructions can be found at:
+
+https://software.ecmwf.int/wiki/display/ECbuild/ecBuild
+
+=============
+QUICK INSTALL
+=============
+
+1. Extract the source files
+
+ tar zxvf ecbuild-1.0.4-Source.tar.gz -C /path/to/install
+
+2. Use cmake and point the module path to the installed source.
+
+ cmake -DCMAKE_MODULE_PATH=/path/to/install [...]
diff --git a/ecbuild/LICENSE b/ecbuild/LICENSE
new file mode 100644
index 0000000..a82f8ec
--- /dev/null
+++ b/ecbuild/LICENSE
@@ -0,0 +1,190 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   Copyright 1996-2014 ECMWF
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/ecbuild/NOTICE b/ecbuild/NOTICE
new file mode 100644
index 0000000..414151a
--- /dev/null
+++ b/ecbuild/NOTICE
@@ -0,0 +1,10 @@
+Notice
+------
+
+1. The files FindLex and FindYacc are based on the FindBison and FindFlex macros from the original CMake code base.
+   As requested, the License text has been preserved. The modifications are governed by the Apache License as described in COPYING.
+
+2. GetGitRevisionDescription macros are based on the macro with smae name from Ryan Pavlik <rpavlik at iastate.edu> and  Iowa State
+University, and distributed under Booy, and distributed under Booy, and distributed under Booy, and distributed under Boost license.
+
+3. FindNetCDF4 macro is based on the macro FindNetCDF from project UCLALES from Max-Planck-Institut für Meteorologie. 
diff --git a/ecbuild/VERSION.cmake b/ecbuild/VERSION.cmake
new file mode 120000
index 0000000..ef90430
--- /dev/null
+++ b/ecbuild/VERSION.cmake
@@ -0,0 +1 @@
+cmake/VERSION.cmake
\ No newline at end of file
diff --git a/ecbuild/bamboo/flags.cmake b/ecbuild/bamboo/flags.cmake
new file mode 100644
index 0000000..e69de29
diff --git a/ecbuild/bin/CMakeLists.txt b/ecbuild/bin/CMakeLists.txt
new file mode 100644
index 0000000..680b5f7
--- /dev/null
+++ b/ecbuild/bin/CMakeLists.txt
@@ -0,0 +1,17 @@
+list( APPEND ecbuild_bin_files
+ecbuild
+git-meld
+git-mproj
+check_install.sh 
+apply_license.sh
+license.pl )
+
+add_custom_target( ecbuild_bin SOURCES ${ecbuild_bin_files} )
+
+if( ENABLE_INSTALL )
+
+	install( PROGRAMS ecbuild DESTINATION ${INSTALL_BIN_DIR} )
+
+#	install( PROGRAMS ${ecbuild_bin_files} DESTINATION ${INSTALL_BIN_DIR} )
+
+endif()
diff --git a/ecbuild/bin/apply_license.sh b/ecbuild/bin/apply_license.sh
new file mode 100755
index 0000000..5e36ca4
--- /dev/null
+++ b/ecbuild/bin/apply_license.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+if [ -z $1 ]
+then
+    echo "apply_license.sh"
+    echo "usage: $0 [dir] [dir] ... "
+    echo "dir - directory where to search"
+    exit 1
+fi
+
+for f in $( find $DIRS $* \(   \
+            -iname "*.java" \
+        -or -iname "*.xml" \
+        -or -iname "*.sh"  \
+        -or -iname "*.pl"  \
+        -or -iname "*.pm"  \
+        -or -iname "*.py"  \
+        -or -iname "*.js"  \
+        -or -iname "*.c"   \
+        -or -iname "*.cpp" \
+        -or -iname "*.cxx" \
+        -or -iname "*.cc"  \
+        -or -iname "*.h"   \
+        -or -iname "*.hh"  \
+        -or -iname "*.hpp" \
+        -or -iname "*.l"   \
+        -or -iname "*.y"   \
+        -or -iname "*.f"   \
+        -or -iname "*.F"   \
+        -or -iname "*.for" \
+        -or -iname "*.f77" \
+        -or -iname "*.f90" \
+        -or -iname "*.cmake" \
+        -or -iname "*.css"   \
+        -or -iname "*.sql"   \
+        -or -iname "*.properties"  \
+        -or -iname "*.def" \
+ \) -print -follow | grep -v "\.git/" | grep -v "\.svn/" )
+do
+#  echo $f
+  license.pl -u $f
+done
+
+#|  sed "s/ /\\\ /g" | \
+#xargs echo
+
+exit
diff --git a/ecbuild/bin/check_install.sh b/ecbuild/bin/check_install.sh
new file mode 100755
index 0000000..4e5369c
--- /dev/null
+++ b/ecbuild/bin/check_install.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+
+chksm="md5sum"
+manifest_file="manifest.txt"
+install_proc="echo_install"
+
+#------------------------------------------------------------------------------
+
+function abspath {
+    if [[ -d "$1" ]]
+    then
+        pushd "$1" >/dev/null
+        pwd
+        popd >/dev/null
+    elif [[ -e $1 ]]
+    then
+        pushd $(dirname $1) >/dev/null
+        echo $(pwd)/$(basename $1)
+        popd >/dev/null
+    else
+        echo "error: path $1 does not exist!" >&2
+        return 127
+    fi
+}
+
+function echo_install {
+  echo "$1 -> $2"
+}
+
+#------------------------------------------------------------------------------
+
+if [ -z $2 ]
+then
+    echo "usage: $0 <src_dir> <target_dir>"
+    exit 1
+fi
+
+[[ ! -z $3 ]] && install_proc="$3"
+
+SRC=$(abspath $1)
+TGT=$(abspath $2)
+
+manifest="$SRC/$manifest_file"
+
+#------------------------------------------------------------------------------
+
+[[ ! -f $manifest ]] && echo "error: cannot find manifest.txt in dir $SRC" && exit 1
+
+cd $SRC
+
+for f in $(cat $manifest )
+do
+
+  [[ ! -f "$SRC/$f" ]] && echo "error: $SRC/$f does not exist" && exit 1
+
+  install="no"
+
+  if [[ ! -f "$TGT/$f" ]]
+  then
+    install="yes"
+  else
+    srcsum=$( $chksm "$SRC/$f" | cut -d" " -f1 )
+    tgtsum=$( $chksm "$TGT/$f" | cut -d" " -f1 )
+
+    if [ $srcsum != "$tgtsum" ]
+    then
+      install="yes"
+    fi
+  fi
+
+   if [ $install == "yes" ]
+   then
+     $install_proc $SRC/$f $TGT/$f
+   fi
+
+done
diff --git a/ecbuild/bin/ecbuild b/ecbuild/bin/ecbuild
new file mode 100755
index 0000000..53817b5
--- /dev/null
+++ b/ecbuild/bin/ecbuild
@@ -0,0 +1,267 @@
+#!/bin/bash
+
+usage()
+{
+  echo "Usage: ecbuild [--help] [--version]"
+  exit $1
+}
+
+help()
+{
+    cat <<EOF
+USAGE:
+
+  ecbuild [--help] [--version] [--toolchains]
+  ecbuild [option...] [--] [cmake-argument...] <path-to-source>
+  ecbuild [option...] [--] [cmake-argument...] <path-to-existing-build>
+
+DESCRIPTION:
+
+  ecbuild is a build system based on CMake, but providing a lot of macro's
+  to make it easier to work with. Upon execution,
+  the equivalent cmake command is printed.
+
+  ecbuild/cmake must be called from an out-of-source build directory and
+  forbids in-source builds.
+
+SYNOPSIS:
+
+    --help         Display this help
+    --version      Display ecbuild version
+    --toolchains   Display list of pre-installed toolchains (see below)
+
+
+Available values for "option":
+
+    --prefix=<prefix>
+          Set the install path to <prefix>.
+          Equivalent to cmake argument "-D CMAKE_INSTALL_PREFIX=<prefix>"
+
+    --build=<build-type>
+          Set the build-type to <build-type>.
+          Equivalent to cmake argument "-D CMAKE_BUILD_TYPE=<build-type>"
+          <build-type> can be any of:
+             - debug : Lowest optimization level, useful for debugging
+             - release : Highest optimization level, for best performance
+             - bit : Highest optimization level while staying bit-reproducible
+             - ...others depending on project
+
+    --static
+          Build static libraries.
+          Equivalent to "-D BUILD_SHARED_LIBS=OFF"
+
+    --dynamic
+          Build dynamic libraries (usually the default).
+          Equivalent to "-D BUILD_SHARED_LIBS=ON"
+
+    --toolchain=<toolchain>
+          Use a platform specific toolchain, containing settings such
+          as compilation flags, locations of commonly used dependencies.
+          <toolchain> can be the path to a custom toolchain file, or a 
+          pre-installed toolchain provided with ecbuild. For a list of 
+          pre-installed toolchains, run "ecbuild --toolchains".
+          Equivalent to cmake argument "-D CMAKE_TOOLCHAIN_FILE=<toolchain-file>"
+
+    --cache=<ecbuild-cache-file>    (advanced)
+          A file called "ecbuild-cache.cmake" is generated during configuration.
+          This file can be moved to a safe location, and specified for future
+          builds to speed up checking of compiler/platform capabilities. Note that
+          this is only accelerating fresh builds, as cmake internally caches also.
+          Therefore this option is *not* recommended.
+
+
+Available values for "cmake-argument":
+
+    Any value that can be usually passed to cmake to (re)configure the build.
+    Typically these values start with "-D".
+        example:  -D ENABLE_TESTS=ON  -D ENABLE_MPI=OFF  -D ECKIT_PATH=...
+
+    They can be explicitly separated from [option...] with a "--", for the case
+    there is a conflicting option with the "cmake" executable, and the latter's
+    option is requested.
+
+------------------------------------------------------------------------
+
+NOTE: When reconfiguring a build, it is only necessary to change the relevant
+options, as everything stays cached. For example:
+  > ecbuild --prefix=PREFIX .
+  > ecbuild -D ENABLE_TESTS=ON .
+
+------------------------------------------------------------------------
+
+Compiling:
+
+  To compile the project with <N> threads:
+    > make -j<N>
+
+  To get verbose compilation/linking output:
+    > make VERBOSE=1
+
+Testing:
+
+  To run the project's tests
+    > ctest
+
+  Also check the ctest manual/help for more options on running tests
+
+Installing:
+
+  To install the project in location PREFIX with 
+       "--prefix=PREFIX" or
+       "-D CMAKE_INSTALL_PREFIX=PREFIX"
+    > make install
+
+------------------------------------------------------------------------
+ECMWF"
+
+EOF
+    exit $1
+}
+
+
+INSTALL_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+ECBUILD_MODULE_PATH=$INSTALL_DIR/../share/ecbuild/cmake
+ECBUILD_MODULE_PATH=$(cd $(dirname "$ECBUILD_MODULE_PATH") && pwd -P)/$(basename "$ECBUILD_MODULE_PATH")
+ADD_ECBUILD_OPTIONS="-D CMAKE_MODULE_PATH=$ECBUILD_MODULE_PATH"
+
+version()
+{
+  # todo: do some clever regex of the VERSION.cmake file
+  echo "ecbuild version 1.6.0"
+  command -v cmake >/dev/null 2>&1 || { exit 0; }  
+  cmake --version | head -1
+  exit 0
+}
+
+toolchains()
+{
+  toolchains_dir=$INSTALL_DIR/../share/ecbuild/toolchains/
+  cd $toolchains_dir
+  echo "Available toolchains:"
+  ls | while read fname 
+  do
+      echo "  - ${fname%%.*}"
+  done
+  exit 0
+}
+
+prefix()
+{
+  arg=$1
+  path=$(cd $(dirname "$arg") && pwd -P)/$(basename "$arg")
+  ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -D CMAKE_INSTALL_PREFIX=${path}"
+}
+
+toolchain()
+{
+  arg=$1
+  if [ -f $arg ]; then 
+    toolchain_file=$arg
+  else
+    if [ -f $INSTALL_DIR/../share/ecbuild/toolchains/$arg.cmake ]; then
+      toolchain_file=$INSTALL_DIR/../share/ecbuild/toolchains/$arg.cmake
+    fi
+  fi
+  if [ -z ${toolchain_file+x} ]; then
+    toolchains_dir=$INSTALL_DIR/../share/ecbuild/toolchains/
+    toolchains_dir=$(cd $(dirname "$toolchains_dir") && pwd -P)/$(basename "$toolchains_dir")
+    echo "Error:"
+    echo "   Toolchain [$arg] is not valid: [$arg.cmake] cannot be"
+    echo "   found in [$toolchains_dir]"
+    exit 1
+  else
+    toolchain_file=$(cd $(dirname "$toolchain_file") && pwd -P)/$(basename "$toolchain_file")
+    ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -D CMAKE_TOOLCHAIN_FILE=${toolchain_file}"
+  fi
+}
+
+cache()
+{
+  arg=$1
+  if [ -f $arg ]; then
+    cache_file=$(cd $(dirname "$arg") && pwd -P)/$(basename "$arg")
+  else
+    echo "Error:"
+    echo "   Cache file [$arg] is not found."
+    exit 1
+  fi
+  ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -D ECBUILD_CACHE=${cache_file}"
+}
+ 
+if test $# -eq 0; then
+    usage 1
+fi
+
+while test $# -gt 0; do
+    # Split --option=value in $opt="--option" and $val="value"
+    case "$1" in
+    --*=*) 
+      opt=`echo "$1" | sed 's/=.*//'`
+      val=`echo "$1" | sed 's/--[_a-zA-Z0-9]*=//'`
+      ;;
+    --*)
+      opt=$1
+      ;;
+    *)
+      break
+      ;;
+    esac
+    # Parse options
+    case "$opt" in
+      --help)
+        help 0
+  	    ;;
+      --version)
+        version
+        ;;
+      --toolchains)
+        toolchains
+        ;;
+      --prefix)
+        prefix $val
+        ;;
+      --build)
+        ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -D CMAKE_BUILD_TYPE=$val"
+        ;;
+      --static)
+        ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -D BUILD_SHARED_LIBS=OFF"
+        ;;
+      --dynamic)
+        ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -D BUILD_SHARED_LIBS=ON"
+        ;;        
+      --toolchain)
+        toolchain $val
+        ;;
+      --cache)
+        cache $val
+        ;;
+      --)
+        shift
+        break
+        ;;
+      *)
+        echo "unknown option: $opt"
+	      usage 1
+        ;;
+    esac
+    shift
+done
+
+# Check if cmake is available
+command -v cmake >/dev/null 2>&1 || { 
+  echo "cmake is required and cannot be found in the PATH." >&2
+  echo "  Try 'module load cmake'" >&2
+  echo "PATH=$PATH" >&2
+  exit 1; 
+}
+
+# If no arguments remain, set SOURCE to "."
+if [ $# -eq 0 ]; then
+  SOURCE="."
+fi
+
+COMMAND="cmake ${ADD_ECBUILD_OPTIONS} $@ $SOURCE"
+echo ""
+echo $COMMAND
+echo ""
+$COMMAND
diff --git a/ecbuild/bin/git-meld b/ecbuild/bin/git-meld
new file mode 100755
index 0000000..3f1e353
--- /dev/null
+++ b/ecbuild/bin/git-meld
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+meld $2 $5
diff --git a/ecbuild/bin/git-mproj b/ecbuild/bin/git-mproj
new file mode 100755
index 0000000..7ec0e4b
--- /dev/null
+++ b/ecbuild/bin/git-mproj
@@ -0,0 +1,54 @@
+#!/bin/bash
+#
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+#
+# git-proj: status, branch, checkout
+#
+
+txtbld=$(tput bold)             #  bold
+bldblu=${txtbld}$(tput setaf 6) #  bold cyan
+txtrst=$(tput sgr0)             #  reset
+
+dashless=$(basename "$0" | sed -e 's/-/ /')
+USAGE="$dashless <command> [options...]"
+
+SUBDIRECTORY_OK="yes"
+
+PATH=$(git --exec-path):$PATH
+. git-sh-setup
+
+require_work_tree_exists
+
+# go to top
+
+cd_to_toplevel
+cd ..
+
+# check option for number of levels
+nlevels=$(git config --global --int --get mproj.levels)
+if [ "$nlevels" != "" ]
+then
+    nlevels="-maxdepth $nlevels"
+fi
+
+# do it
+
+for d in $( find $PWD $nlevels -type d -iname ".git" )
+do
+    gdir=$(dirname $d)
+    proj=$(basename $gdir)
+    pushd $gdir > /dev/null
+    branch=$(git symbolic-ref --short HEAD)
+    echo -e "${bldblu}---> $proj ($branch)${txtrst}"
+    git "$@"
+    popd > /dev/null
+done
+
+
diff --git a/ecbuild/bin/license.pl b/ecbuild/bin/license.pl
new file mode 100755
index 0000000..020af24
--- /dev/null
+++ b/ecbuild/bin/license.pl
@@ -0,0 +1,150 @@
+#!/usr/bin/perl
+
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+use strict;
+
+my $LICENSE = <<"EOF";
+(C) Copyright 1996-2014 ECMWF.
+
+This software is licensed under the terms of the Apache Licence Version 2.0
+which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+In applying this licence, ECMWF does not waive the privileges and immunities 
+granted to it by virtue of its status as an intergovernmental organisation nor
+does it submit to any jurisdiction.
+EOF
+
+my %COMMENTS = (
+
+		java       => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		xml        => { start => "<!--\n", end => "-->\n\n" , after => "\<\?xml[^<]*\>" },
+#		xsd        => { start => "<!--\n", end => "-->\n\n" },
+#		jsp        => { start => "<!--\n", end => "-->\n\n" },
+		sh         => { comment => "# ", end => "\n", after => "^#!/.*\n" },
+		pl         => { comment => "# ", end => "\n", after => "^#!/.*\n" },
+		pm         => { comment => "# ", end => "\n", after => "^#!/.*\n" },
+		py         => { comment => "# ", end => "\n", after => "^#!/.*\n" },
+		js         => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		c          => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		cc         => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		cpp        => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		cxx        => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		h          => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		hh         => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		hpp        => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		l          => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		'y'        => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		'f'        => { comment => "C ", end => "C\n\n" }, # assume f77
+		'F'        => { comment => "C ", end => "C\n\n" }, # assume f77
+		'for'      => { comment => "C ", end => "C\n\n" }, # assume f77
+		'f77'      => { comment => "C ", end => "C\n\n" },
+		'f90'      => { comment => "! ", end => "!\n\n" },
+		cmake      => { end => "\n", comment => "# " },
+		css        => { start => "/*\n"  , end => " */\n\n"  , comment => " * " },
+		sql        => { comment => "-- ", end => "\n" },
+		properties => { comment => "# ", end => "\n" },
+		def        => { comment => "# ", end => "\n" },
+
+		);
+        
+my %cmdargs = map { $_ => 1 } @ARGV;
+
+foreach my $file ( @ARGV )
+{
+    next if( $file eq "-u" or $file eq "--update" );
+
+#   my $doit=0;
+    my $doit=1;
+
+	$file =~ /\.(\w+)$/;
+	my $ext = $1;
+
+	my $c = $COMMENTS{$ext};
+
+	unless($c)
+	{
+		print "$file: unsupported extension. File ignored\n";
+		next;
+	}
+
+	open(IN,"<$file") or die "$file: $!";
+	my @text = <IN>;
+	close(IN);
+
+	if(join("", at text) =~ /icensed under the/gs) 
+	{
+        if( exists( $cmdargs{"-u"} ) or exists( $cmdargs{"--update"} ) )
+        {
+            # lets update the year if needed
+            my $currentyear = (localtime)[5] + 1900;
+            if($doit)
+            {
+                print("$file: updating license year to $currentyear\n");
+                system("perl -pi -e 's/Copyright ([0-9]{4})-[0-9]{4} ECMWF/Copyright \$1-$currentyear ECMWF/' $file");
+            }
+        }
+        else
+        {    
+            print "$file: License already stated. File ignored\n";
+        }
+		next;
+	}
+
+	open(OUT,">$file.tmp") or die "$file.tmp: $!";
+
+	if($c->{after})
+	{
+		my @x;
+		my $re = $c->{after};
+		loop: while(@text)
+		{
+			if($text[0] =~ m/$re/)
+			{
+				print OUT @x, shift @text;
+				@x = ();
+				last loop;
+			}
+			push @x,shift @text;
+		}
+		@text = (@x, at text);
+	}
+
+	print OUT $c->{start};
+	foreach my $line ( split("\n",$LICENSE) )
+	{
+		print OUT $c->{comment}, $line,"\n";
+	}
+	print OUT $c->{end};
+
+	print OUT @text;
+	close(OUT) or die "$file: $!";
+
+    if($doit)
+    {
+        use File::Copy qw(cp);
+        use File::Compare qw(compare_text compare);
+
+        if(compare_text("$file.tmp",$file))
+        {
+            print "UPDATING file $file\n";
+            system("p4 edit $file") unless(-w $file);
+#s            cp($file,"$file.old") or die "cp($file,$file.old): $!";
+            cp("$file.tmp",$file) or die "cp($file.tmp,$file): $!";
+        }
+    }
+    else
+    {
+        print "IGNORING file $file\n";
+    }
+
+    unlink("$file.tmp");
+
+
+}
+
diff --git a/ecbuild/cmake/2.8/CMakePushCheckState.cmake b/ecbuild/cmake/2.8/CMakePushCheckState.cmake
new file mode 100644
index 0000000..0a42128
--- /dev/null
+++ b/ecbuild/cmake/2.8/CMakePushCheckState.cmake
@@ -0,0 +1,61 @@
+# This module defines two macros:
+# CMAKE_PUSH_CHECK_STATE()
+# and
+# CMAKE_POP_CHECK_STATE()
+# These two macros can be used to save and restore the state of the variables
+# CMAKE_REQUIRED_FLAGS, CMAKE_REQUIRED_DEFINITIONS, CMAKE_REQUIRED_LIBRARIES
+# and CMAKE_REQUIRED_INCLUDES used by the various Check-files coming with CMake,
+# like e.g. check_function_exists() etc.
+# The variable contents are pushed on a stack, pushing multiple times is supported.
+# This is useful e.g. when executing such tests in a Find-module, where they have to be set,
+# but after the Find-module has been executed they should have the same value
+# as they had before.
+#
+# Usage:
+#   cmake_push_check_state()
+#   set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DSOME_MORE_DEF)
+#   check_function_exists(...)
+#   cmake_pop_check_state()
+
+#=============================================================================
+# Copyright 2006-2011 Alexander Neundorf, <neundorf at kde.org>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+
+MACRO(CMAKE_PUSH_CHECK_STATE)
+
+   IF(NOT DEFINED _CMAKE_PUSH_CHECK_STATE_COUNTER)
+      SET(_CMAKE_PUSH_CHECK_STATE_COUNTER 0)
+   ENDIF()
+
+   MATH(EXPR _CMAKE_PUSH_CHECK_STATE_COUNTER "${_CMAKE_PUSH_CHECK_STATE_COUNTER}+1")
+
+   SET(_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}    ${CMAKE_REQUIRED_INCLUDES})
+   SET(_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_REQUIRED_DEFINITIONS})
+   SET(_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}   ${CMAKE_REQUIRED_LIBRARIES})
+   SET(_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}       ${CMAKE_REQUIRED_FLAGS})
+ENDMACRO(CMAKE_PUSH_CHECK_STATE)
+
+MACRO(CMAKE_POP_CHECK_STATE)
+
+# don't pop more than we pushed
+   IF("${_CMAKE_PUSH_CHECK_STATE_COUNTER}" GREATER "0")
+
+      SET(CMAKE_REQUIRED_INCLUDES    ${_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+      SET(CMAKE_REQUIRED_DEFINITIONS ${_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+      SET(CMAKE_REQUIRED_LIBRARIES   ${_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+      SET(CMAKE_REQUIRED_FLAGS       ${_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+
+      MATH(EXPR _CMAKE_PUSH_CHECK_STATE_COUNTER "${_CMAKE_PUSH_CHECK_STATE_COUNTER}-1")
+   ENDIF()
+
+ENDMACRO(CMAKE_POP_CHECK_STATE)
diff --git a/ecbuild/cmake/CMakeLists.txt b/ecbuild/cmake/CMakeLists.txt
new file mode 100644
index 0000000..d42a153
--- /dev/null
+++ b/ecbuild/cmake/CMakeLists.txt
@@ -0,0 +1,5 @@
+file( GLOB_RECURSE ecbuild_support_files  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" )
+
+ecbuild_add_resources(  TARGET ${PROJECT_NAME}_ecbuild_support_files
+						SOURCES_PACK
+							${ecbuild_support_files} )
diff --git a/ecbuild/cmake/CheckFortranCompilerFlag.cmake b/ecbuild/cmake/CheckFortranCompilerFlag.cmake
new file mode 100644
index 0000000..5408691
--- /dev/null
+++ b/ecbuild/cmake/CheckFortranCompilerFlag.cmake
@@ -0,0 +1,37 @@
+# - Check whether the CXX compiler supports a given flag.
+# CHECK_CXX_COMPILER_FLAG(FLAG VARIABLE)
+#
+#  FLAG - the compiler flag
+#  VARIABLE - variable to store the result
+
+# Copyright (c) 2006, Alexander Neundorf, <neundorf at kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+INCLUDE(CheckFortranSourceCompiles)
+
+MACRO (CHECK_FORTRAN_COMPILER_FLAG _FLAG _RESULT)
+   SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
+   SET(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
+   CHECK_FORTRAN_SOURCE_COMPILES("program main\nend program\n" ${_RESULT}
+     # Some compilers do not fail with a bad flag
+     FAIL_REGEX "command line option .* is valid for .* but not for C\\\\+\\\\+" # GNU
+     FAIL_REGEX "unrecognized .*option"                     # GNU
+     FAIL_REGEX "unknown .*option"                          # Clang
+     FAIL_REGEX "invalid value"                             # Clang
+     FAIL_REGEX "ignoring unknown option"                   # MSVC
+     FAIL_REGEX "warning D9002"                             # MSVC, any lang
+     FAIL_REGEX "option.*not supported"                     # Intel
+     FAIL_REGEX "invalid argument .*option"                 # Intel
+     FAIL_REGEX "ignoring option .*argument required"       # Intel
+     FAIL_REGEX "[Uu]nknown option"                         # HP
+     FAIL_REGEX "[Ww]arning: [Oo]ption"                     # SunPro
+     FAIL_REGEX "command option .* is not recognized"       # XL
+     FAIL_REGEX "not supported in this configuration; ignored"       # AIX
+     FAIL_REGEX "File with unknown suffix passed to linker" # PGI
+     FAIL_REGEX "WARNING: unknown flag:"                    # Open64
+     )
+   SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
+ENDMACRO (CHECK_FORTRAN_COMPILER_FLAG)
diff --git a/ecbuild/cmake/CheckFortranSourceCompiles.cmake b/ecbuild/cmake/CheckFortranSourceCompiles.cmake
new file mode 100644
index 0000000..ad4b91f
--- /dev/null
+++ b/ecbuild/cmake/CheckFortranSourceCompiles.cmake
@@ -0,0 +1,94 @@
+# - Check if given Fortran source compiles and links into an executable
+# CHECK_FORTRAN_SOURCE_COMPILES(<code> <var> [FAIL_REGEX <fail-regex>])
+#  <code>       - source code to try to compile, must define 'main'
+#  <var>        - variable to store whether the source code compiled
+#  <fail-regex> - fail if test output matches this regex
+# The following variables may be set before calling this macro to
+# modify the way the check is run:
+#
+#  CMAKE_REQUIRED_FLAGS = string of compile command line flags
+#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
+#  CMAKE_REQUIRED_INCLUDES = list of include directories
+#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Fortran version, 2013, James Tappin
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+
+
+macro(CHECK_FORTRAN_SOURCE_COMPILES SOURCE VAR)
+
+if("${VAR}" MATCHES "^${VAR}$")
+    set(_FAIL_REGEX)
+    set(_key)
+    foreach(arg ${ARGN})
+      if("${arg}" MATCHES "^(FAIL_REGEX)$")
+        set(_key "${arg}")
+      elseif(_key)
+        list(APPEND _${_key} "${arg}")
+      else()
+        message(FATAL_ERROR "Unknown argument:\n  ${arg}\n")
+      endif()
+    endforeach()
+    set(MACRO_CHECK_FUNCTION_DEFINITIONS
+      "-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
+    if(CMAKE_REQUIRED_LIBRARIES)
+      set(CHECK_FORTRAN_SOURCE_COMPILES_ADD_LIBRARIES
+        LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
+    else()
+      set(CHECK_FORTRAN_SOURCE_COMPILES_ADD_LIBRARIES)
+    endif()
+    if(CMAKE_REQUIRED_INCLUDES)
+      set(CHECK_FORTRAN_SOURCE_COMPILES_ADD_INCLUDES
+        "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
+    else()
+      set(CHECK_FORTRAN_SOURCE_COMPILES_ADD_INCLUDES)
+    endif()
+    file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.f90"
+      "${SOURCE}\n")
+
+    message(STATUS "Performing Test ${VAR}")
+    try_compile(${VAR}
+      ${CMAKE_BINARY_DIR}
+      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.f90
+      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+      ${CHECK_FORTRAN_SOURCE_COMPILES_ADD_LIBRARIES}
+      CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+      "${CHECK_FORTRAN_SOURCE_COMPILES_ADD_INCLUDES}"
+      OUTPUT_VARIABLE OUTPUT)
+
+    foreach(_regex ${_FAIL_REGEX})
+      if("${OUTPUT}" MATCHES "${_regex}")
+        set(${VAR} 0)
+      endif()
+    endforeach()
+
+    if(${VAR})
+      set(${VAR} 1 CACHE INTERNAL "Test ${VAR}")
+      message(STATUS "Performing Test ${VAR} - Success")
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+        "Performing Fortran SOURCE FILE Test ${VAR} succeded with the following output:\n"
+        "${OUTPUT}\n"
+        "Source file was:\n${SOURCE}\n")
+    else()
+      message(STATUS "Performing Test ${VAR} - Failed")
+      set(${VAR} "" CACHE INTERNAL "Test ${VAR}")
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+        "Performing Fortran SOURCE FILE Test ${VAR} failed with the following output:\n"
+        "${OUTPUT}\n"
+        "Source file was:\n${SOURCE}\n")
+    endif()
+  endif()
+endmacro()
+
diff --git a/ecbuild/cmake/FindADSM.cmake b/ecbuild/cmake/FindADSM.cmake
new file mode 100644
index 0000000..76140b6
--- /dev/null
+++ b/ecbuild/cmake/FindADSM.cmake
@@ -0,0 +1,43 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find ADSM
+# Once done this will define
+#  ADSM_FOUND - System has ADSM
+#  ADSM_INCLUDE_DIRS - The ADSM include directories
+#  ADSM_LIBRARIES - The libraries needed to use ADSM
+
+if( EC_OS_BITS EQUAL 32 )
+	set( ADSM_LIBNAME ApiDS )
+endif()
+if( EC_OS_BITS EQUAL 64 )
+	set( ADSM_LIBNAME ApiTSM64 )
+endif()
+if( NOT DEFINED ADSM_LIBNAME )
+	message( STATUS "MARS only supports ADSM with 32 or 64 bits" )
+endif()
+
+if( DEFINED ADSM_PATH )
+	find_path(ADSM_INCLUDE_DIR dsmapitd.h      PATHS ${ADSM_PATH} ${ADSM_PATH}/include ${ADSM_PATH}/sample NO_DEFAULT_PATH )
+	find_library(ADSM_LIBRARY  ${ADSM_LIBNAME} PATHS ${ADSM_PATH} ${ADSM_PATH}/lib     ${ADSM_PATH}/lib64  NO_DEFAULT_PATH )
+endif()
+
+find_path(ADSM_INCLUDE_DIR dsmapitd.h      PATH_SUFFIXES bin64 )
+find_library( ADSM_LIBRARY ${ADSM_LIBNAME} PATH_SUFFIXES bin64 )
+
+set( ADSM_LIBRARIES    ${ADSM_LIBRARY} )
+set( ADSM_INCLUDE_DIRS ${ADSM_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set ADSM_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(ADSM  DEFAULT_MSG
+								  ADSM_LIBRARY ADSM_INCLUDE_DIR)
+
+mark_as_advanced(ADSM_INCLUDE_DIR ADSM_LIBRARY )
diff --git a/ecbuild/cmake/FindAEC.cmake b/ecbuild/cmake/FindAEC.cmake
new file mode 100644
index 0000000..70a63b1
--- /dev/null
+++ b/ecbuild/cmake/FindAEC.cmake
@@ -0,0 +1,34 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find AEC (Adaptive Entropy Coding library)
+# See https://www.dkrz.de/redmine/projects/aec/wiki
+
+# Once done this will define
+#  AEC_FOUND - System has AEC
+#  AEC_INCLUDE_DIRS - The AEC include directories
+#  AEC_LIBRARIES - The libraries needed to use AEC
+
+ecbuild_add_extra_search_paths( aec )
+
+if( DEFINED AEC_PATH )
+    find_path( AEC_INCLUDE_DIR szlib.h    PATHS ${AEC_PATH}/include PATH_SUFFIXES aec NO_DEFAULT_PATH )
+    find_library( AEC_LIBRARY  NAMES aec  PATHS ${AEC_PATH}/lib     PATH_SUFFIXES aec NO_DEFAULT_PATH )
+endif()
+
+find_path( AEC_INCLUDE_DIR szlib.h PATH_SUFFIXES aec )
+find_library( AEC_LIBRARY NAMES aec PATH_SUFFIXES aec )
+
+set( AEC_LIBRARIES    ${AEC_LIBRARY} )
+set( AEC_INCLUDE_DIRS ${AEC_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(AEC  DEFAULT_MSG AEC_LIBRARY AEC_INCLUDE_DIR)
+
+mark_as_advanced(AEC_INCLUDE_DIR AEC_LIBRARY )
diff --git a/ecbuild/cmake/FindAIO.cmake b/ecbuild/cmake/FindAIO.cmake
new file mode 100644
index 0000000..61fdcc0
--- /dev/null
+++ b/ecbuild/cmake/FindAIO.cmake
@@ -0,0 +1,66 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# OUTPUT:
+# RT_LIB  = the library to link against
+
+if( CMAKE_SYSTEM_NAME MATCHES "Linux" )
+
+	find_package( Realtime )
+
+	if( REALTIME_FOUND ) # check that aio needs realtime
+		set( AIO_LIBRARIES ${RT_LIB} )
+	endif()
+
+endif()
+
+find_path( AIO_INCLUDE_DIRS NAMES aio.h HINTS ENV AIO_PATH ${AIO_PATH} )
+
+mark_as_advanced( AIO_INCLUDE_DIRS )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args( AIO  DEFAULT_MSG  AIO_INCLUDE_DIRS  )
+
+# checks for AIO64 vs AIO
+if( AIO_FOUND )
+
+	include( CheckCSourceCompiles )
+	include( CMakePushCheckState )
+    
+    cmake_push_check_state()
+    
+		set( CMAKE_REQUIRED_INCLUDES ${AIO_INCLUDE_DIRS} )
+
+		if( AIO_LIBRARIES )
+			set( CMAKE_REQUIRED_LIBRARIES ${AIO_LIBRARIES} )
+		endif()
+
+		check_c_source_compiles( "#include <aio.h>
+								  #include <fcntl.h>
+								  int main(){
+									  struct aiocb* aiocbp;
+									  int n = aio_write(aiocbp);
+									  n = aio_read(aiocbp);
+									  n = aio_fsync(O_SYNC,aiocbp);
+									  return 0; }"
+								EC_HAVE_AIOCB )
+
+		check_c_source_compiles( "#include <aio.h>
+								  #include <fcntl.h>
+								  int main(){
+									  struct aiocb64* aiocbp;
+									  int n = aio_write64(aiocbp);
+									  n = aio_read64(aiocbp);
+									  n = aio_fsync64(O_SYNC,aiocbp);
+									  return 0; }"
+								EC_HAVE_AIOCB64 )
+
+    cmake_pop_check_state()
+
+endif()
diff --git a/ecbuild/cmake/FindArmadillo.cmake b/ecbuild/cmake/FindArmadillo.cmake
new file mode 100644
index 0000000..ba14e2e
--- /dev/null
+++ b/ecbuild/cmake/FindArmadillo.cmake
@@ -0,0 +1,33 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+ecbuild_add_extra_search_paths( armadillo )
+
+IF( NOT DEFINED ARMADILLO_PATH AND NOT "$ENV{ARMADILLO_PATH}" STREQUAL "" )
+  SET( ARMADILLO_PATH "$ENV{ARMADILLO_PATH}" )
+ENDIF()
+
+if( DEFINED ARMADILLO_PATH )
+        find_path(ARMADILLO_INCLUDE_DIR ARMADILLO.h PATHS ${ARMADILLO_PATH}/include PATH_SUFFIXES ARMADILLO  NO_DEFAULT_PATH)
+        find_library(ARMADILLO_LIBRARY  ARMADILLO   PATHS ${ARMADILLO_PATH}/lib     PATH_SUFFIXES ARMADILLO  NO_DEFAULT_PATH)
+endif()
+
+find_path(ARMADILLO_INCLUDE_DIR  armadillo PATH_SUFFIXES include )
+find_library( ARMADILLO_LIBRARY  armadillo   PATH_SUFFIXES lib )
+
+set( ARMADILLO_LIBRARIES    ${ARMADILLO_LIBRARY} )
+set( ARMADILLO_INCLUDE_DIRS ${ARMADILLO_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set ARMADILLO_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(ARMADILLO  DEFAULT_MSG
+                                  ARMADILLO_LIBRARY ARMADILLO_INCLUDE_DIR)
+
+mark_as_advanced(ARMADILLO_INCLUDE_DIR ARMADILLO_LIBRARY )
diff --git a/ecbuild/cmake/FindCMath.cmake b/ecbuild/cmake/FindCMath.cmake
new file mode 100644
index 0000000..7cf6f58
--- /dev/null
+++ b/ecbuild/cmake/FindCMath.cmake
@@ -0,0 +1,23 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+#Sets:
+# CMATH_LIBRARIES      = the library to link against (RT etc)
+
+IF(UNIX)
+ if( DEFINED CMATH_PATH )
+    find_library(CMATH_LIBRARIES m PATHS ${CMATH_PATH}/lib NO_DEFAULT_PATH )
+ endif()
+
+ find_library(CMATH_LIBRARIES m )
+
+ include(FindPackageHandleStandardArgs)
+
+ find_package_handle_standard_args(CMATH  DEFAULT_MSG CMATH_LIBRARIES )
+
+ENDIF(UNIX)
diff --git a/ecbuild/cmake/FindCairo.cmake b/ecbuild/cmake/FindCairo.cmake
new file mode 100644
index 0000000..7b3d47e
--- /dev/null
+++ b/ecbuild/cmake/FindCairo.cmake
@@ -0,0 +1,58 @@
+# - Try to find the cairo library
+# Once done this will define
+#
+# CAIRO_FOUND - system has cairo
+# CAIRO_INCLUDE_DIRS - the cairo include directory
+# CAIRO_LIBRARIES - Link these to use cairo
+#
+# Define CAIRO_MIN_VERSION for which version desired.
+
+
+if( NOT DEFINED CAIRO_PATH AND NOT "$ENV{CAIRO_PATH}" STREQUAL "" )
+    set( APPEND CAIRO_PATH "$ENV{CAIRO_PATH}" )
+endif()
+
+if( NOT DEFINED CAIRO_PATH )
+
+    include(FindPkgConfig)
+
+    if(Cairo_FIND_REQUIRED)
+        set(_pkgconfig_REQUIRED "REQUIRED")
+    else()
+        set(_pkgconfig_REQUIRED "")
+    endif()
+
+    if(CAIRO_MIN_VERSION)
+        pkg_check_modules(PKCAIRO ${_pkgconfig_REQUIRED} cairo>=${CAIRO_MIN_VERSION})
+    else()
+        pkg_check_modules(PKCAIRO ${_pkgconfig_REQUIRED} cairo)
+    endif()
+
+    if( PKG_CONFIG_FOUND AND PKCAIRO_FOUND )
+
+        find_path(CAIRO_INCLUDE_DIR cairo.h HINTS ${PKCAIRO_INCLUDEDIR} ${PKCAIRO_INCLUDE_DIRS} PATH_SUFFIXES cairo NO_DEFAULT_PATH )
+        find_library(CAIRO_LIBRARY  cairo   HINTS ${PKCAIRO_LIBDIR}     ${PKCAIRO_LIBRARY_DIRS} PATH_SUFFIXES cairo NO_DEFAULT_PATH )
+
+    endif()
+
+else()
+
+    find_path(CAIRO_INCLUDE_DIR cairo.h PATHS ${CAIRO_PATH}/include PATH_SUFFIXES cairo NO_DEFAULT_PATH )
+    find_library(CAIRO_LIBRARY  cairo   PATHS ${CAIRO_PATH}/lib     PATH_SUFFIXES cairo NO_DEFAULT_PATH )
+
+endif()
+
+find_path(CAIRO_INCLUDE_DIR cairo.h PATH_SUFFIXES cairo )
+find_library( CAIRO_LIBRARY cairo   PATH_SUFFIXES cairo )
+
+set( CAIRO_LIBRARIES    ${CAIRO_LIBRARY} )
+set( CAIRO_INCLUDE_DIRS ${CAIRO_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set GRIBAPI_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(CAIRO  DEFAULT_MSG
+                                  CAIRO_LIBRARY CAIRO_INCLUDE_DIR)
+
+mark_as_advanced( CAIRO_INCLUDE_DIR CAIRO_LIBRARY )
diff --git a/ecbuild/cmake/FindDl.cmake b/ecbuild/cmake/FindDl.cmake
new file mode 100644
index 0000000..305fff0
--- /dev/null
+++ b/ecbuild/cmake/FindDl.cmake
@@ -0,0 +1,20 @@
+# © Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+#Sets:
+# DL_LIBRARIES      = the library to link against (RT etc)
+
+if( DEFINED DL_PATH )
+    find_library(DL_LIBRARIES dl PATHS ${DL_PATH}/lib NO_DEFAULT_PATH )
+endif()
+
+find_library(DL_LIBRARIES dl )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(DL  DEFAULT_MSG DL_LIBRARIES )
diff --git a/ecbuild/cmake/FindEMOS.cmake b/ecbuild/cmake/FindEMOS.cmake
new file mode 100644
index 0000000..8472b0a
--- /dev/null
+++ b/ecbuild/cmake/FindEMOS.cmake
@@ -0,0 +1,37 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find EMOS
+# Once done this will define
+#  EMOS_FOUND - System has EMOS
+#  EMOS_INCLUDE_DIRS - The EMOS include directories
+#  EMOS_LIBRARIES - The libraries needed to use EMOS
+
+ecbuild_add_extra_search_paths( libemos )
+
+if( NOT DEFINED EMOS_PATH AND DEFINED $ENV{EMOS_PATH} )
+	set( EMOS_PATH $ENV{EMOS_PATH} )
+endif()
+
+if( DEFINED EMOS_PATH )
+    find_library( EMOS_LIBRARY NAMES emos.R64.D64.I32 emos.R64 emosR64 emos PATHS ${EMOS_PATH} PATH_SUFFIXES lib lib/emos NO_DEFAULT_PATH)
+endif()
+
+find_library( EMOS_LIBRARY NAMES emos.R64.D64.I32 emos.R64 emosR64 emos)
+
+ecbuild_find_fortranlibs()
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args( EMOS  DEFAULT_MSG  EMOS_LIBRARY FORTRANLIBS_FOUND )
+
+mark_as_advanced(EMOS_LIBRARY)
+
+if( EMOS_FOUND )
+    set( EMOS_LIBRARIES  ${EMOS_LIBRARY} ${FORTRAN_LIBRARIES} )
+endif()
diff --git a/ecbuild/cmake/FindEcLib.cmake b/ecbuild/cmake/FindEcLib.cmake
new file mode 100644
index 0000000..5799c85
--- /dev/null
+++ b/ecbuild/cmake/FindEcLib.cmake
@@ -0,0 +1,49 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find EcLib
+# Once done this will define
+#  ECLIB_FOUND - System has ECLIB
+#  ECLIB_INCLUDE_DIRS - The ECLIB include directories
+#  ECLIB_LIBRARIES - The libraries needed to use ECLIB
+
+# skip if ECLIB is already found or if has is built inside
+
+if( NOT ECLIB_FOUND )
+
+    # find external eclib
+
+    set( _ENV_ECLIB_PATH "$ENV{ECLIB_PATH}" )
+    if( NOT DEFINED ECLIB_PATH AND _ENV_ECLIB_PATH )
+        set( ECLIB_PATH ${_ENV_ECLIB_PATH} )
+    endif()
+
+    if( DEFINED ECLIB_PATH )
+        find_path(ECLIB_INCLUDE_DIR NAMES eclib_version.h PATHS ${ECLIB_PATH} ${ECLIB_PATH}/include PATH_SUFFIXES eclib  NO_DEFAULT_PATH)
+        find_library(ECLIB_LIBRARY  NAMES Ec              PATHS ${ECLIB_PATH} ${ECLIB_PATH}/lib     PATH_SUFFIXES eclib  NO_DEFAULT_PATH)
+    endif()
+    
+    find_path(ECLIB_INCLUDE_DIR NAMES eclib_version.h PATH_SUFFIXES eclib )
+    find_library( ECLIB_LIBRARY NAMES Ec              PATH_SUFFIXES eclib )
+
+    include(FindPackageHandleStandardArgs)
+    
+    # handle the QUIETLY and REQUIRED arguments and set ECLIB_FOUND to TRUE
+    # if all listed variables are TRUE
+    find_package_handle_standard_args(ECLIB  DEFAULT_MSG
+                                      ECLIB_LIBRARY ECLIB_INCLUDE_DIR )
+    
+    mark_as_advanced(ECLIB_INCLUDE_DIR ECLIB_LIBRARY )
+
+    set( ECLIB_LIBRARIES    ${ECLIB_LIBRARY} )
+    set( ECLIB_INCLUDE_DIRS ${ECLIB_INCLUDE_DIR} )
+
+    debug_var( ECLIB_LIBRARIES )
+    debug_var( ECLIB_INCLUDE_DIRS )
+
+endif()
diff --git a/ecbuild/cmake/FindEcregrid.cmake b/ecbuild/cmake/FindEcregrid.cmake
new file mode 100644
index 0000000..3ddf732
--- /dev/null
+++ b/ecbuild/cmake/FindEcregrid.cmake
@@ -0,0 +1,48 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find ECREGRID
+# Once done this will define
+#  ECREGRID_FOUND - System has ECREGRID
+#  ECREGRID_INCLUDE_DIRS - The ECREGRID include directories
+#  ECREGRID_LIBRARIES - The libraries needed to use ECREGRID
+#  ECREGRID_DEFINITIONS - Compiler switches required for using ECREGRID
+
+option( WITH_ECREGRID "try to find scin installation" ON )
+
+# skip if ECREGRID is already found or if has is built inside
+
+if( NOT ECREGRID_FOUND AND WITH_ECREGRID )
+
+    if( NOT DEFINED ECREGRID_PATH AND NOT "$ENV{ECREGRID_PATH}" STREQUAL "" )
+        list( APPEND ECREGRID_PATH "$ENV{ECREGRID_PATH}" )
+    endif()
+
+    if( DEFINED ECREGRID_PATH )
+        find_path(ECREGRID_INCLUDE_DIR NAMES scin_api.h PATHS ${ECREGRID_PATH} ${ECREGRID_PATH}/include PATH_SUFFIXES scin_api  NO_DEFAULT_PATH )
+        find_library(ECREGRID_LIBRARY  NAMES scin       PATHS ${ECREGRID_PATH} ${ECREGRID_PATH}/lib     PATH_SUFFIXES scin      NO_DEFAULT_PATH )
+    endif()
+    
+    find_path(ECREGRID_INCLUDE_DIR NAMES scin_api.h PATH_SUFFIXES scin_api )
+    find_library( ECREGRID_LIBRARY NAMES scin       PATH_SUFFIXES scin     )
+    
+    include(FindPackageHandleStandardArgs)
+    
+    # handle the QUIETLY and REQUIRED arguments and set ECREGRID_FOUND to TRUE
+    # if all listed variables are TRUE
+    find_package_handle_standard_args(Scin  DEFAULT_MSG
+                                      ECREGRID_LIBRARY ECREGRID_INCLUDE_DIR)
+
+    if( ECREGRID_FOUND )
+        set( ECREGRID_LIBRARIES    ${ECREGRID_LIBRARY} )
+        set( ECREGRID_INCLUDE_DIRS ${ECREGRID_INCLUDE_DIR} )
+    endif()
+    
+    mark_as_advanced(ECREGRID_INCLUDE_DIR ECREGRID_LIBRARY )
+    
+endif()
diff --git a/ecbuild/cmake/FindFDB.cmake b/ecbuild/cmake/FindFDB.cmake
new file mode 100644
index 0000000..6624544
--- /dev/null
+++ b/ecbuild/cmake/FindFDB.cmake
@@ -0,0 +1,35 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find FDB
+# Once done this will define
+#  FDB_FOUND - System has FDB
+#  FDB_INCLUDE_DIRS - The FDB include directories
+#  FDB_LIBRARIES - The libraries needed to use FDB
+
+
+if( NOT FDB_FOUND )
+
+	if( DEFINED FDB_PATH )
+		find_library( FDB_LIBRARY NAMES fdb PATHS ${FDB_PATH} ${FDB_PATH}/lib NO_DEFAULT_PATH)
+	endif()
+	
+	find_library( FDB_LIBRARY NAMES fdb )
+	
+	set( FDB_LIBRARIES  ${FDB_LIBRARY} )
+	
+	include(FindPackageHandleStandardArgs)
+	
+	# handle the QUIETLY and REQUIRED arguments and set FDB_FOUND to TRUE
+	# if all listed variables are TRUE
+	find_package_handle_standard_args(FDB  DEFAULT_MSG
+									  FDB_LIBRARY )
+	
+	mark_as_advanced(FDB_LIBRARY)
+
+endif()
diff --git a/ecbuild/cmake/FindGeoTIFF.cmake b/ecbuild/cmake/FindGeoTIFF.cmake
new file mode 100644
index 0000000..f4f3b53
--- /dev/null
+++ b/ecbuild/cmake/FindGeoTIFF.cmake
@@ -0,0 +1,37 @@
+###############################################################################
+#
+# CMake module to search for GeoTIFF library
+#
+# On success, the macro sets the following variables:
+# GEOTIFF_FOUND       = if the library found
+# GEOTIFF_LIBRARIES   = full path to the library
+# GEOTIFF_INCLUDE_DIR = where to find the library headers 
+# also defined, but not for general use are
+# GEOTIFF_LIBRARY, where to find the PROJ.4 library.
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# Module source: http://github.com/mloskot/workshop/tree/master/cmake/
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+SET(GEOTIFF_NAMES geotiff)
+
+
+    FIND_PATH(GEOTIFF_INCLUDE_DIR geotiff.h PATH_PREFIXES geotiff 
+         PATHS /usr/local/include/libgeotiff /usr/include/libgeotiff)
+
+    FIND_LIBRARY(GEOTIFF_LIBRARY NAMES ${GEOTIFF_NAMES})
+
+
+IF(GEOTIFF_FOUND)
+  SET(GEOTIFF_LIBRARIES ${GEOTIFF_LIBRARY})
+ENDIF()
+
+# Handle the QUIETLY and REQUIRED arguments and set SPATIALINDEX_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GEOTIFF DEFAULT_MSG GEOTIFF_LIBRARY GEOTIFF_INCLUDE_DIR)
diff --git a/ecbuild/cmake/FindHPSS.cmake b/ecbuild/cmake/FindHPSS.cmake
new file mode 100644
index 0000000..50f95cc
--- /dev/null
+++ b/ecbuild/cmake/FindHPSS.cmake
@@ -0,0 +1,39 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find HPSS
+# Once done this will define
+#  HPSS_FOUND - System has HPSS
+#  HPSS_INCLUDE_DIRS - The HPSS include directories
+#  HPSS_LIBRARIES - The libraries needed to use HPSS
+#  HPSS_DEFINITIONS - Compiler switches required for using HPSS
+
+if( DEFINED HPSS_PATH )
+	find_path(HPSS_INCLUDE_DIR hpss_api.h PATHS ${HPSS_PATH}/include PATH_SUFFIXES hpss NO_DEFAULT_PATH)
+	find_library(HPSS_LIBRARY  hpss       PATHS ${HPSS_PATH}/lib     PATH_SUFFIXES hpss NO_DEFAULT_PATH)
+endif()
+
+find_path(HPSS_INCLUDE_DIR hpss_api.h PATH_SUFFIXES hpss )
+find_library( HPSS_LIBRARY hpss       PATH_SUFFIXES hpss )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set HPSS_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(HPSS  DEFAULT_MSG
+                                  HPSS_LIBRARY HPSS_INCLUDE_DIR)
+
+mark_as_advanced(HPSS_INCLUDE_DIR HPSS_LIBRARY )
+
+if( HPSS_FOUND )
+    set( HPSS_LIBRARIES    ${HPSS_LIBRARY} )
+    set( HPSS_INCLUDE_DIRS ${HPSS_INCLUDE_DIR} )
+else()
+    set( HPSS_LIBRARIES    "" )
+    set( HPSS_INCLUDE_DIRS "" )
+endif()
diff --git a/ecbuild/cmake/FindLEX.cmake b/ecbuild/cmake/FindLEX.cmake
new file mode 100644
index 0000000..34ea36c
--- /dev/null
+++ b/ecbuild/cmake/FindLEX.cmake
@@ -0,0 +1,129 @@
+# - Find lex executable and provides a macro to generate custom build rules
+#
+# The module defines the following variables:
+#  LEX_FOUND - true is lex executable is found
+#  LEX_EXECUTABLE - the path to the lex executable
+#  LEX_LIBRARIES - The lex libraries
+#  LEX_INCLUDE_DIRS - The path to the lex headers
+#
+#
+# If lex is found on the system, the module provides the macro:
+#  LEX_TARGET(Name LexInput LexOutput [COMPILE_FLAGS <string>])
+# which creates a custom command  to generate the <LexOutput> file from
+# the <LexInput> file.  If  COMPILE_FLAGS option is specified, the next
+# parameter is added to the lex  command line. Name is an alias used to
+# get  details of  this custom  command.  Indeed the  macro defines  the
+# following variables:
+#  LEX_${Name}_DEFINED - true is the macro ran successfully
+#  LEX_${Name}_OUTPUTS - the source file generated by the custom rule, an
+#  alias for LexOutput
+#  LEX_${Name}_INPUT - the lex source file, an alias for ${LexInput}
+#
+# Lex scanners oftenly use tokens  defined by Yacc: the code generated
+# by Lex  depends of the header  generated by Yacc.   This module also
+# defines a macro:
+#  ADD_LEX_YACC_DEPENDENCY(LexTarget YaccTarget)
+# which  adds the  required dependency  between a  scanner and  a parser
+# where  <LexTarget>  and <YaccTarget>  are  the  first parameters  of
+# respectively LEX_TARGET and YACC_TARGET macros.
+#
+#  ====================================================================
+
+#=============================================================================
+# Copyright 2009 Kitware, Inc.
+# Copyright 2006 Tristan Carel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+
+# This file is based on the FindFLEX CMake macro, and adapted by ECMWF
+
+#=============================================================================
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+FIND_PROGRAM(LEX_EXECUTABLE lex DOC "path to the lex executable")
+MARK_AS_ADVANCED(LEX_EXECUTABLE)
+
+FIND_LIBRARY(FL_LIBRARY NAMES fl
+  DOC "Path to the fl library")
+
+FIND_PATH(LEX_INCLUDE_DIR LexLexer.h
+  DOC "Path to the lex headers")
+
+MARK_AS_ADVANCED(FL_LIBRARY LEX_INCLUDE_DIR)
+
+SET(LEX_INCLUDE_DIRS ${LEX_INCLUDE_DIR})
+SET(LEX_LIBRARIES ${FL_LIBRARY})
+
+IF(LEX_EXECUTABLE)
+
+  #============================================================
+  # LEX_TARGET (public macro)
+  #============================================================
+  #
+  MACRO(LEX_TARGET Name Input Output)
+    SET(LEX_TARGET_usage "LEX_TARGET(<Name> <Input> <Output> [COMPILE_FLAGS <string>]")
+    IF(${ARGC} GREATER 3)
+      IF(${ARGC} EQUAL 5)
+        IF("${ARGV3}" STREQUAL "COMPILE_FLAGS")
+          SET(LEX_EXECUTABLE_opts  "${ARGV4}")
+          SEPARATE_ARGUMENTS(LEX_EXECUTABLE_opts)
+        ELSE()
+          MESSAGE(SEND_ERROR ${LEX_TARGET_usage})
+        ENDIF()
+      ELSE()
+        MESSAGE(SEND_ERROR ${LEX_TARGET_usage})
+      ENDIF()
+    ENDIF()
+
+    message( STATUS "${LEX_EXECUTABLE} ${LEX_EXECUTABLE_opts} -t ${Input} > ${Output}" )
+
+    ADD_CUSTOM_COMMAND(OUTPUT ${Output}
+      COMMAND ${LEX_EXECUTABLE} ${LEX_EXECUTABLE_opts} -t ${Input} > ${Output}
+      DEPENDS ${Input}
+      COMMENT "[LEX][${Name}] Building scanner with lex ${LEX_VERSION}"
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+
+    SET(LEX_${Name}_DEFINED TRUE)
+    SET(LEX_${Name}_OUTPUTS ${Output})
+    SET(LEX_${Name}_INPUT ${Input})
+    SET(LEX_${Name}_COMPILE_FLAGS ${LEX_EXECUTABLE_opts})
+  ENDMACRO(LEX_TARGET)
+  #============================================================
+
+
+  #============================================================
+  # ADD_LEX_YACC_DEPENDENCY (public macro)
+  #============================================================
+  #
+  MACRO(ADD_LEX_YACC_DEPENDENCY LexTarget YaccTarget)
+
+    IF(NOT LEX_${LexTarget}_OUTPUTS)
+      MESSAGE(SEND_ERROR "Lex target `${LexTarget}' does not exists.")
+    ENDIF()
+
+    IF(NOT YACC_${YaccTarget}_OUTPUT_HEADER)
+      MESSAGE(SEND_ERROR "Yacc target `${YaccTarget}' does not exists.")
+    ENDIF()
+
+    SET_SOURCE_FILES_PROPERTIES(${LEX_${LexTarget}_OUTPUTS}
+      PROPERTIES OBJECT_DEPENDS ${YACC_${YaccTarget}_OUTPUT_HEADER})
+  ENDMACRO(ADD_LEX_YACC_DEPENDENCY)
+  #============================================================
+
+ENDIF(LEX_EXECUTABLE)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(LEX REQUIRED_VARS LEX_EXECUTABLE)
+
+# FindLEX.cmake ends here
diff --git a/ecbuild/cmake/FindLegacyFDB.cmake b/ecbuild/cmake/FindLegacyFDB.cmake
new file mode 100644
index 0000000..0136299
--- /dev/null
+++ b/ecbuild/cmake/FindLegacyFDB.cmake
@@ -0,0 +1,35 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find FDB
+# Once done this will define
+#  LEGACY_FDB_FOUND - System has FDB
+#  LEGACY_FDB_INCLUDE_DIRS - The FDB include directories
+#  LEGACY_FDB_LIBRARIES - The libraries needed to use FDB
+
+
+if( NOT LEGACY_FDB_FOUND )
+
+	if( DEFINED LEGACY_FDB_PATH )
+		find_library( LEGACY_FDB_LIBRARY NAMES fdb_legacy PATHS ${LEGACY_FDB_PATH} ${LEGACY_FDB_PATH}/lib NO_DEFAULT_PATH)
+	endif()
+	
+	find_library( LEGACY_FDB_LIBRARY NAMES fdb_legacy )
+	
+	set( LEGACY_FDB_LIBRARIES  ${LEGACY_FDB_LIBRARY} )
+	
+	include(FindPackageHandleStandardArgs)
+	
+	# handle the QUIETLY and REQUIRED arguments and set LEGACY_FDB_FOUND to TRUE
+	# if all listed variables are TRUE
+	find_package_handle_standard_args(LEGACY_FDB  DEFAULT_MSG
+		LEGACY_FDB_LIBRARY )
+	
+	mark_as_advanced(LEGACY_FDB_LIBRARY)
+
+endif()
diff --git a/ecbuild/cmake/FindLibGFortran.cmake b/ecbuild/cmake/FindLibGFortran.cmake
new file mode 100644
index 0000000..bf9e168
--- /dev/null
+++ b/ecbuild/cmake/FindLibGFortran.cmake
@@ -0,0 +1,52 @@
+# © Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+###############################################################################
+# gfortran libs
+
+set( __libgfortran_names gfortran libgfortran.so.1 libgfortran.so.3 )
+
+# use gfortran to find the library
+
+find_program( GFORTRAN_EXECUTABLE gfortran )
+
+if( GFORTRAN_EXECUTABLE )
+
+	execute_process(COMMAND ${GFORTRAN_EXECUTABLE} "-print-search-dirs"
+		RESULT_VARIABLE _GFORTRAN_SEARCH_SUCCESS
+		OUTPUT_VARIABLE _GFORTRAN_VALUES_OUTPUT
+		ERROR_VARIABLE _GFORTRAN_ERROR_VALUE
+		OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+#	debug_var(_GFORTRAN_SEARCH_SUCCESS)
+#	debug_var(_GFORTRAN_VALUES_OUTPUT)
+#	debug_var(_GFORTRAN_ERROR_VALUE)
+
+	if(_GFORTRAN_SEARCH_SUCCESS MATCHES 0)
+		string(REGEX REPLACE ".*libraries: =(.*)" "\\1" _result  ${_GFORTRAN_VALUES_OUTPUT})
+		string(REGEX REPLACE ":" ";" _gfortran_hints ${_result} )
+	endif()
+
+	debug_var( _gfortran_hints )
+
+endif()
+
+find_library( GFORTRAN_LIB NAMES ${__libgfortran_names}  HINTS ${LIBGFORTRAN_PATH} ENV LIBGFORTRAN_PATH PATHS PATH_SUFFIXES lib64 lib NO_DEFAULT_PATH )
+find_library( GFORTRAN_LIB NAMES ${__libgfortran_names}  HINTS ${_gfortran_hints} PATHS PATH_SUFFIXES lib64 lib )
+
+mark_as_advanced( GFORTRAN_LIB )
+
+if( GFORTRAN_LIB )
+	set( GFORTRAN_LIBRARIES ${GFORTRAN_LIB} )
+endif()
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args( LIBGFORTRAN  DEFAULT_MSG GFORTRAN_LIBRARIES  )
+
+
diff --git a/ecbuild/cmake/FindNDBM.cmake b/ecbuild/cmake/FindNDBM.cmake
new file mode 100644
index 0000000..21cf1cf
--- /dev/null
+++ b/ecbuild/cmake/FindNDBM.cmake
@@ -0,0 +1,34 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find NetCDF
+# Once done this will define
+#  NDBM_FOUND - System has NetCDF
+#  NDBM_INCLUDE_DIRS - The NetCDF include directories
+#  NDBM_LIBRARIES - The libraries needed to use NetCDF
+#  NDBM_DEFINITIONS - Compiler switches required for using NetCDF
+
+if( DEFINED NDBM_PATH )
+	find_path(NDBM_INCLUDE_DIR NAMES ndbm.h   PATHS ${NDBM_PATH} ${NDBM_PATH}/include PATH_SUFFIXES ndbm NO_DEFAULT_PATH)
+	find_library(NDBM_LIBRARY  NAMES ndbm dbm PATHS ${NDBM_PATH} ${NDBM_PATH}/lib     PATH_SUFFIXES ndbm NO_DEFAULT_PATH)
+endif()
+
+find_path(NDBM_INCLUDE_DIR NAMES ndbm.h   PATH_SUFFIXES ndbm )
+find_library( NDBM_LIBRARY NAMES ndbm dbm PATH_SUFFIXES ndbm )
+
+set( NDBM_LIBRARIES    ${NDBM_LIBRARY} )
+set( NDBM_INCLUDE_DIRS ${NDBM_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set GRIBAPI_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(NDBM  DEFAULT_MSG
+								  NDBM_LIBRARY NDBM_INCLUDE_DIR)
+
+mark_as_advanced(NDBM_INCLUDE_DIR NDBM_LIBRARY )
diff --git a/ecbuild/cmake/FindNetCDF.cmake b/ecbuild/cmake/FindNetCDF.cmake
new file mode 100644
index 0000000..99ead8d
--- /dev/null
+++ b/ecbuild/cmake/FindNetCDF.cmake
@@ -0,0 +1,167 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# Try to find NetCDF3 or NetCDF4 -- default is 4
+#
+# find_package( NetCDF <version> COMPONENTS C CXX Fortran )
+#
+# Input:
+#  * NETCDF_PATH    - user defined path where to search for the library first
+#  * NETCDF_DIR     - user defined path where to search for the library first
+#  * NETCDF_ROOT    - user defined path where to search for the library first
+#
+# Output:
+#  NETCDF_FOUND - System has NetCDF
+#  NETCDF_DEFINITIONS
+#  NETCDF_INCLUDE_DIRS - The NetCDF include directories
+#  NETCDF_LIBRARIES - The libraries needed to use NetCDF
+
+# default is netcdf4
+if( NetCDF_FIND_VERSION STREQUAL "3" )
+    set( PREFER_NETCDF3 1 )
+endif()
+
+if( NOT PREFER_NETCDF3 )
+  set( PREFER_NETCDF4 1 )
+else()
+  set( PREFER_NETCDF4 0 )
+endif()
+mark_as_advanced( PREFER_NETCDF4 PREFER_NETCDF3 )
+
+set( NETCDF_FIND_REQUIRED   ${NetCDF_FIND_REQUIRED} )
+set( NETCDF_FIND_QUIETLY    ${NetCDF_FIND_QUIETLY} )
+set( NETCDF_FIND_COMPONENTS ${NetCDF_FIND_COMPONENTS} )
+
+list( APPEND NETCDF_FIND_COMPONENTS C )
+
+if( NETCDF_CXX )
+    list( APPEND NETCDF_FIND_COMPONENTS CXX )
+endif()
+
+if( NETCDF_Fortran OR NETCDF_FORTRAN OR NETCDF_F90 )
+    list( APPEND NETCDF_FIND_COMPONENTS FORTRAN F90 )
+endif()
+
+list(FIND NETCDF_FIND_COMPONENTS "FORTRAN" _index)
+if(${_index} GREATER -1)
+    list( APPEND NETCDF_FIND_COMPONENTS F90 )
+endif()
+
+list (FIND NETCDF_FIND_COMPONENTS "F90" _index)
+if(${_index} GREATER -1)
+    list( APPEND NETCDF_FIND_COMPONENTS FORTRAN )
+endif()
+
+list(FIND NETCDF_FIND_COMPONENTS "Fortran" _index)
+if(${_index} GREATER -1)
+    list( REMOVE_ITEM NETCDF_FIND_COMPONENTS Fortran )
+    list( APPEND NETCDF_FIND_COMPONENTS FORTRAN F90 )
+endif()
+
+list( REMOVE_DUPLICATES NETCDF_FIND_COMPONENTS )
+
+### NetCDF4
+
+if( PREFER_NETCDF4 )
+
+    ## hdf5
+
+    ecbuild_add_extra_search_paths( hdf5 )
+
+    # Note: Only the HDF5 C-library is required for NetCDF 
+    #       ( even for Fortan and CXX bindings)
+    find_package( HDF5 COMPONENTS C QUIET )
+
+    ## netcdf4
+
+    # CONFIGURE the NETCDF_FIND_COMPONENTS variable
+
+    # Find NetCDF4
+
+    ecbuild_add_extra_search_paths( netcdf4 )
+
+    # message( "NETCDF CMAKE_PREFIX_PATH = [${CMAKE_PREFIX_PATH}]")
+    # debug_var( NETCDF_ROOT )
+    # debug_var( NETCDF_FIND_COMPONENTS )
+    # debug_var( NETCDF_FIND_QUIETLY )
+    # debug_var( NETCDF_FIND_REQUIRED )
+    find_package( NetCDF4 )
+    # debug_var( NETCDF4_FOUND )
+    # debug_var( NETCDF_FOUND )
+    # debug_var( NETCDF_LIBRARIES )
+    # debug_var( NETCDF_INCLUDE_DIRS )
+
+    list( APPEND NETCDF_Fortran_LIBRARIES ${NETCDF_FORTRAN_LIBRARIES} ${NETCDF_F90_LIBRARIES} )
+    if( NETCDF_Fortran_LIBRARIES )
+      list( REMOVE_DUPLICATES NETCDF_Fortran_LIBRARIES )
+    endif()
+
+    # debug_var( NETCDF_Fortran_LIBRARIES )
+    # debug_var( NETCDF_C_LIBRARIES )
+    # debug_var( NETCDF_CXX_LIBRARIES )
+
+
+	set_package_properties( NetCDF4 PROPERTIES TYPE RECOMMENDED PURPOSE "support for NetCDF4 file format" )
+
+    if( NETCDF_FOUND AND HDF5_FOUND )
+        # list( APPEND NETCDF_DEFINITIONS  ${HDF5_DEFINITIONS} )
+        list( APPEND NETCDF_LIBRARIES    ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES}  )
+        list( APPEND NETCDF_INCLUDE_DIRS ${HDF5_INCLUDE_DIRS} )
+    endif()
+
+    #debug_var( NETCDF_FOUND )
+    #debug_var( NETCDF_LIBRARIES )
+    #debug_var( NETCDF_INCLUDE_DIRS )
+    #debug_var( HDF5_FOUND )
+    #debug_var( HDF5_INCLUDE_DIRS )
+    #debug_var( HDF5_HL_LIBRARIES )
+    #debug_var( HDF5_LIBRARIES )
+
+endif()
+
+### NetCDF3
+
+if( PREFER_NETCDF3 )
+
+    # message( "LOOKING FOR NETCDF3" )
+
+    # debug_var( NetCDF_FIND_COMPONENTS )
+    # debug_var( NetCDF_FIND_QUIETLY )
+    # debug_var( NetCDF_FIND_REQUIRED )
+
+	list(FIND NetCDF_FIND_COMPONENTS "CXX" _index)
+	if(${_index} GREATER -1)
+        set( NETCDF_CXX 1 )
+    endif()
+
+	list(FIND NetCDF_FIND_COMPONENTS "Fortran" _index)
+	if(${_index} GREATER -1)
+        set( NETCDF_Fortran 1 )
+    endif()
+
+	list(FIND NetCDF_FIND_COMPONENTS "FORTRAN" _index)
+	if(${_index} GREATER -1)
+        set( NETCDF_Fortran 1 )
+    endif()
+
+	list(FIND NetCDF_FIND_COMPONENTS "F90" _index)
+	if(${_index} GREATER -1)
+        set( NETCDF_Fortran 1 )
+    endif()
+
+    ecbuild_add_extra_search_paths( netcdf3 )
+
+	ecbuild_add_extra_search_paths( netcdf ) # fallback to netcdf search paths
+
+    message( "NETCDF CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}" )
+
+    find_package( NetCDF3 )
+
+	set_package_properties( NetCDF3 PROPERTIES TYPE RECOMMENDED PURPOSE "support for NetCDF3 file format" )
+
+endif()
diff --git a/ecbuild/cmake/FindNetCDF3.cmake b/ecbuild/cmake/FindNetCDF3.cmake
new file mode 100644
index 0000000..079e55e
--- /dev/null
+++ b/ecbuild/cmake/FindNetCDF3.cmake
@@ -0,0 +1,129 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# Try to find NetCDF
+#
+# Input:
+#  * NETCDF_PATH - user defined path where to search for the library first
+#  * NETCDF_DIR  - user defined path where to search for the library first
+#  * NETCDF_CXX  - if to search also for netcdf_c++ wrapper library
+#  * NETCDF_Fortran  - if to search also for netcdff wrapper library
+#
+# Output:
+#  NETCDF_FOUND - System has NetCDF
+#  NETCDF_INCLUDE_DIRS - The NetCDF include directories
+#  NETCDF_LIBRARIES - The libraries needed to use NetCDF
+
+### TODO: generalize this into a macro for all ecbuild
+
+if( DEFINED $ENV{NETCDF_PATH} )
+    list( APPEND CMAKE_PREFIX_PATH  $ENV{NETCDF_PATH} )
+endif()
+
+if( DEFINED $ENV{NETCDF_DIR} )
+    list( APPEND CMAKE_PREFIX_PATH  $ENV{NETCDF_DIR} )
+endif()
+
+if( DEFINED NETCDF_PATH )
+    list( APPEND _netcdf_incs ${NETCDF_PATH} ${NETCDF_PATH}/include )
+    list( APPEND _netcdf_libs ${NETCDF_PATH} ${NETCDF_PATH}/lib )
+endif()
+	
+if( DEFINED NETCDF_DIR )
+    list( APPEND _netcdf_incs ${NETCDF_DIR} ${NETCDF_DIR}/include )
+    list( APPEND _netcdf_libs ${NETCDF_DIR} ${NETCDF_DIR}/lib )
+endif()
+
+foreach( _h /usr/local/apps/netcdf )
+
+	if( EXISTS ${_h} )
+	
+        list( APPEND _netcdf_incs  ${_h}/include ${_h}/current/include ${_h}/new/include ${_h}/stable/include )
+        list( APPEND _netcdf_libs  ${_h}/lib ${_h}/current/lib ${_h}/new/lib ${_h}/stable/lib )
+
+		file(GLOB _hd ${_h}/*)
+        foreach( d ${_hd} )
+            if( IS_DIRECTORY ${d} )
+                list( APPEND _netcdf_incs ${d}/include ${d}/LP64/include )
+                list( APPEND _netcdf_libs ${d}/lib ${d}/LP64/lib )
+            endif()
+        endforeach()
+    endif()
+
+endforeach() 
+
+###
+
+set( _ncdf_sfx netcdf LP64 )
+
+find_path( NETCDF_INCLUDE_DIR  netcdf.h  PATHS ${_netcdf_incs} PATH_SUFFIXES ${_ncdf_sfx} NO_DEFAULT_PATH )
+find_path( NETCDF_INCLUDE_DIR  netcdf.h  PATHS ${_netcdf_incs} PATH_SUFFIXES ${_ncdf_sfx} )
+
+find_library( NETCDF_LIBRARY  netcdf  PATHS ${_netcdf_libs} PATH_SUFFIXES ${_ncdf_sfx}  NO_DEFAULT_PATH )
+find_library( NETCDF_LIBRARY  netcdf  PATHS ${_netcdf_libs} PATH_SUFFIXES ${_ncdf_sfx}  )
+
+set( NETCDF_LIBRARIES    ${NETCDF_LIBRARY} )
+set( NETCDF_INCLUDE_DIRS ${NETCDF_INCLUDE_DIR} )
+
+mark_as_advanced(NETCDF_INCLUDE_DIR NETCDF_LIBRARY )
+
+list( APPEND NETCDF_REQUIRED_VARS NETCDF_LIBRARY NETCDF_INCLUDE_DIR )
+
+if( NETCDF_CXX )
+
+    find_path( NETCDF_CXX_INCLUDE_DIR netcdfcpp.h PATHS ${_netcdf_incs} PATH_SUFFIXES ${_ncdf_sfx} NO_DEFAULT_PATH)
+    find_path( NETCDF_CXX_INCLUDE_DIR netcdfcpp.h PATHS ${_netcdf_incs} PATH_SUFFIXES ${_ncdf_sfx} )
+
+    set( _ncdf_cxx netcdf_c++ netcdf_c++ netcdf_c++4 )
+
+    find_library( NETCDF_CXX_LIBRARY NAMES ${_ncdf_cxx} PATHS ${_netcdf_libs} PATH_SUFFIXES ${_ncdf_sfx} NO_DEFAULT_PATH )
+    find_library( NETCDF_CXX_LIBRARY NAMES ${_ncdf_cxx} PATHS ${_netcdf_libs} PATH_SUFFIXES ${_ncdf_sfx} )
+
+    list( APPEND NETCDF_INCLUDE_DIRS ${NETCDF_CXX_INCLUDE_DIR} )
+    list( APPEND NETCDF_LIBRARIES    ${NETCDF_CXX_LIBRARY} )
+
+    list( APPEND NETCDF_REQUIRED_VARS NETCDF_CXX_INCLUDE_DIR NETCDF_CXX_LIBRARY )
+
+    mark_as_advanced(NETCDF_CXX_INCLUDE_DIR NETCDF_CXX_LIBRARY )
+
+endif()
+
+if( NETCDF_Fortran )
+
+    find_path( NETCDF_Fortran_INCLUDE_DIR netcdf.mod PATHS ${_netcdf_incs} PATH_SUFFIXES ${_ncdf_sfx} NO_DEFAULT_PATH)
+    find_path( NETCDF_Fortran_INCLUDE_DIR netcdf.mod PATHS ${_netcdf_incs} PATH_SUFFIXES ${_ncdf_sfx} )
+
+    set( _ncdf_fortran netcdff )
+
+    find_library( NETCDF_Fortran_LIBRARY NAMES ${_ncdf_fortran} PATHS ${_netcdf_libs} PATH_SUFFIXES ${_ncdf_sfx} NO_DEFAULT_PATH )
+    find_library( NETCDF_Fortran_LIBRARY NAMES ${_ncdf_fortran} PATHS ${_netcdf_libs} PATH_SUFFIXES ${_ncdf_sfx} )
+
+    list( APPEND NETCDF_INCLUDE_DIRS ${NETCDF_Fortran_INCLUDE_DIR} )
+    list( APPEND NETCDF_LIBRARIES    ${NETCDF_Fortran_LIBRARY} )
+
+    list( APPEND NETCDF_REQUIRED_VARS NETCDF_Fortran_INCLUDE_DIR NETCDF_Fortran_LIBRARY )
+
+    mark_as_advanced(NETCDF_Fortran_INCLUDE_DIR NETCDF_Fortran_LIBRARY )
+
+endif()
+
+list( REMOVE_DUPLICATES NETCDF_INCLUDE_DIRS )
+
+include(FindPackageHandleStandardArgs)
+
+if( NETCDF_FIND_QUIETLY )
+  set( NETCDF3_FIND_QUIETLY ${NETCDF_FIND_QUIETLY} )
+endif()
+if( NETCDF_FIND_REQUIRED )
+  set( NETCDF3_FIND_REQUIRED ${NETCDF_FIND_REQUIRED} )
+endif()
+
+find_package_handle_standard_args( NETCDF3  DEFAULT_MSG ${NETCDF_REQUIRED_VARS} )
+
+set( NETCDF_FOUND ${NETCDF3_FOUND} )
+
diff --git a/ecbuild/cmake/FindODB.cmake b/ecbuild/cmake/FindODB.cmake
new file mode 100644
index 0000000..bfa6905
--- /dev/null
+++ b/ecbuild/cmake/FindODB.cmake
@@ -0,0 +1,53 @@
+# © Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find ODB
+# Once done this will define
+#  ODB_FOUND - System has ODB
+#  ODB_INCLUDE_DIRS - The ODB include directories
+#  ODB_LIBRARIES - The libraries needed to use ODB
+
+# /usr/local/apps/odb/CY37R3.001/pgf90/LP64/include/odbdump.h
+# /usr/local/apps/odb/CY37R3.001/pgf90/LP64/module/odb.mod
+
+# -lodb -lodbec -lifsaux -lmpi_serial -lodbdummy
+
+find_package( Dl ) # find the dynamic linker
+
+list( APPEND _odb_search_libs odb odbec ifsaux mpi_serial odbdummy  )
+
+if( DEFINED ODB_PATH )
+    find_path(ODB_INCLUDE_DIR odbdump.h PATHS  ${ODB_ROOT} ${ODB_ROOT}/include ${ODB_PATH} ${ODB_PATH}/include PATH_SUFFIXES odb NO_DEFAULT_PATH)
+    find_path(ODB_MODULE_DIR odb.mod PATHS ${ODB_ROOT} ${ODB_ROOT}/module ${ODB_PATH} ${ODB_PATH}/module PATH_SUFFIXES odb NO_DEFAULT_PATH)
+    foreach( _lib ${_odb_search_libs} )
+      find_library(ODB_LIBRARY_${_lib}  ${_lib} PATHS ${ODB_ROOT} ${ODB_ROOT}/lib ${ODB_PATH} ${ODB_PATH}/lib     PATH_SUFFIXES odb NO_DEFAULT_PATH)
+    endforeach()
+endif()
+
+find_path(ODB_INCLUDE_DIR odbdump.h PATH_SUFFIXES odb )
+find_path(ODB_MODULE_DIR odb.mod PATH_SUFFIXES odb )
+foreach( _lib ${_odb_search_libs} )
+  find_library( ODB_LIBRARY_${_lib} ${_lib} PATH_SUFFIXES odb )
+endforeach()
+
+foreach( _lib ${_odb_search_libs} )
+  list( APPEND ODB_LIB_LIST   ODB_LIBRARY_${_lib} )
+  list( APPEND ODB_LIBRARIES  ${ODB_LIBRARY_${_lib}} )
+  mark_as_advanced(${ODB_LIBRARY_${_lib}})
+endforeach()
+
+set( ODB_INCLUDE_DIRS ${ODB_INCLUDE_DIR} ${ODB_MODULE_DIR})
+mark_as_advanced(ODB_INCLUDE_DIR )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set GRIBAPI_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(ODB  DEFAULT_MSG
+                                  ODB_INCLUDE_DIR ${ODB_LIB_LIST} )
+
diff --git a/ecbuild/cmake/FindOpenJPEG.cmake b/ecbuild/cmake/FindOpenJPEG.cmake
new file mode 100644
index 0000000..3e36954
--- /dev/null
+++ b/ecbuild/cmake/FindOpenJPEG.cmake
@@ -0,0 +1,43 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find the OpenJPEG includes and library
+# This module defines
+#  OPENJPEG_FOUND         - System has OpenJPEG
+#  OPENJPEG_INCLUDE_DIRS  - the OpenJPEG include directories
+#  OPENJPEG_LIBRARIES     - the libraries needed to use OpenJPEG
+#
+# also defined internally:
+#  OPENJPEG_LIBRARY, where to find the OpenJPEG library.
+#  OPENJPEG_INCLUDE_DIR, where to find the openjpeg.h header
+
+ecbuild_add_extra_search_paths( openjpg )
+
+IF( NOT DEFINED OPENJPEG_PATH AND NOT "$ENV{OPENJPEG_PATH}" STREQUAL "" )
+  SET( OPENJPEG_PATH "$ENV{OPENJPEG_PATH}" )
+ENDIF()
+
+if( DEFINED OPENJPEG_PATH )
+        find_path(OPENJPEG_INCLUDE_DIR openjpeg.h PATHS ${OPENJPEG_PATH}/include PATH_SUFFIXES openjpeg  NO_DEFAULT_PATH)
+        find_library(OPENJPEG_LIBRARY  openjpeg   PATHS ${OPENJPEG_PATH}/lib     PATH_SUFFIXES openjpeg  NO_DEFAULT_PATH)
+endif()
+
+find_path(OPENJPEG_INCLUDE_DIR  openjpeg.h PATH_SUFFIXES openjpeg )
+find_library( OPENJPEG_LIBRARY  openjpeg   PATH_SUFFIXES openjpeg )
+
+set( OPENJPEG_LIBRARIES    ${OPENJPEG_LIBRARY} )
+set( OPENJPEG_INCLUDE_DIRS ${OPENJPEG_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set OPENJPEG_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(OpenJPEG  DEFAULT_MSG
+                                  OPENJPEG_LIBRARY OPENJPEG_INCLUDE_DIR)
+
+mark_as_advanced(OPENJPEG_INCLUDE_DIR OPENJPEG_LIBRARY )
diff --git a/ecbuild/cmake/FindPGIFortran.cmake b/ecbuild/cmake/FindPGIFortran.cmake
new file mode 100644
index 0000000..ae2221b
--- /dev/null
+++ b/ecbuild/cmake/FindPGIFortran.cmake
@@ -0,0 +1,46 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+###############################################################################
+# FORTRAN support
+
+# set( PGIFORTRAN_SEARCH_LIBS pgmp pgbind numa pgf90 pgf90_rpm1 pgf902 pgf90rtl  pgftnrtl nspgc pgc rt pgsse1 pgsse2 ) # init
+# set( PGIFORTRAN_SEARCH_LIBS pgf90 pgf90_rpm1 pgf902 pgf90rtl pgftnrtl pghpf pgc pgf90 rt pgsse1 pgsse2 )             # mars client linux.2
+# set( PGIFORTRAN_SEARCH_LIBS pgftnrtl nspgc pgc rt pgsse1 pgsse2 )                                                    # mars client linux.3
+
+if( NOT DEFINED PGIFORTRAN_SEARCH_LIBS )
+	set( PGIFORTRAN_SEARCH_LIBS pgmp pgbind numa pgf90 pgf90_rpm1 pgf902 pgf90rtl pgftnrtl pghpf nspgc pgc pgf90 pgf902 pghpf_rpm1 pghpf2 pgsse1 pgsse2 ) # better ?                                                    #
+endif()
+
+set( pgi_fortran_all_libs_found 1 )
+
+foreach( pglib ${PGIFORTRAN_SEARCH_LIBS} )
+
+	find_library( ${pglib}_lib  ${pglib} PATHS ${PGI_PATH} PATH_SUFFIXES lib libso NO_DEFAULT_PATH )
+
+	find_library( ${pglib}_lib  ${pglib} HINTS /usr/local/apps/pgi/pgi-10.8/linux86-64/10.8 PATH PATH_SUFFIXES lib libso )
+
+    if( ${pglib}_lib )
+        list( APPEND PGIFORTRAN_LIBRARIES ${${pglib}_lib} )
+#	else()
+#		set( pgi_fortran_all_libs_found 0 )
+    endif()
+
+endforeach()
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args( LIBPGIFORTRAN DEFAULT_MSG pgi_fortran_all_libs_found PGIFORTRAN_LIBRARIES  )
+
+if( LIBPGIFORTRAN_FOUND )
+	find_package( Realtime )
+endif()
+
+if( REALTIME_FOUND )
+	set( LIBPGIFORTRAN_LIBRARIES ${PGIFORTRAN_LIBRARIES} ${RT_LIB} )
+endif()
diff --git a/ecbuild/cmake/FindPango.cmake b/ecbuild/cmake/FindPango.cmake
new file mode 100644
index 0000000..81b55c0
--- /dev/null
+++ b/ecbuild/cmake/FindPango.cmake
@@ -0,0 +1,33 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find Pango
+
+# Output:
+#   PANGO_FOUND
+#   PANGO_LIBRARIES
+#   PANGO_INCLUDE_DIRS
+
+ecbuild_add_extra_search_paths( pango )
+
+find_package(PkgConfig)
+
+pkg_check_modules(PC_LIBPANGO QUIET pango)
+
+debug_var( PC_LIBPANGO_FOUND )
+debug_var( PC_LIBPANGO_VERSION )
+debug_var( PC_LIBPANGO_LIBRARIES )
+debug_var( PC_LIBPANGO_INCLUDE_DIRS )
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args( pango DEFAULT_MSG PC_LIBPANGO_LIBRARIES PC_LIBPANGO_INCLUDE_DIRS )
+
+set( PANGO_VERSION ${PC_LIBPANGO_VERSION} )
+set( PANGO_LIBRARIES ${PC_LIBPANGO_LIBRARIES} )
+set( PANGO_INCLUDE_DIRS ${PC_LIBPANGO_INCLUDE_DIRS} )
+
diff --git a/ecbuild/cmake/FindPangoCairo.cmake b/ecbuild/cmake/FindPangoCairo.cmake
new file mode 100644
index 0000000..4fb1fd2
--- /dev/null
+++ b/ecbuild/cmake/FindPangoCairo.cmake
@@ -0,0 +1,91 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find PangoCairo
+
+# Output:
+#   PANGOCAIRO_FOUND
+#   PANGOCAIRO_LIBRARIES
+#   PANGOCAIRO_INCLUDE_DIRS
+
+
+find_package(PkgConfig)
+
+pkg_check_modules(PC_LIBPANGOCAIRO QUIET pangocairo)
+
+#debug_var( PC_LIBPANGOCAIRO_FOUND )
+#debug_var( PC_LIBPANGOCAIRO_VERSION )
+#debug_var( PC_LIBPANGOCAIRO_LIBRARIES )
+#debug_var( PC_LIBPANGOCAIRO_INCLUDE_DIRS )
+
+
+if(PC_LIBPANGOCAIRO_FOUND)
+    include(FindPackageHandleStandardArgs)
+    find_package_handle_standard_args( pangocairo DEFAULT_MSG PC_LIBPANGOCAIRO_LIBRARIES PC_LIBPANGOCAIRO_INCLUDE_DIRS )
+    set( PANGOCAIRO_VERSION ${PC_LIBPANGOCAIRO_VERSION} )
+    set( PANGOCAIRO_LIBRARIES ${PC_LIBPANGOCAIRO_LIBRARIES} )
+    set( PANGOCAIRO_INCLUDE_DIRS ${PC_LIBPANGOCAIRO_INCLUDE_DIRS} )
+else()
+
+    # this is to get magics compiling on mac with macbrew
+
+    include(FindPackageHandleStandardArgs)
+
+    set(PANGO_VERSION 1.0)
+    set(GLIB_VERSION 2.0)
+
+    find_path( _PANGOCAIRO_INCLUDE_DIRS
+        NAMES pango/pangocairo.h
+        HINTS /usr/local/include PATH_SUFFIXES pango-${PANGO_VERSION})
+
+    find_path( _CAIRO_INCLUDE_DIRS
+        NAMES cairo.h
+        HINTS /usr/local/include PATH_SUFFIXES cairo)
+
+    find_path( _GLIB_INCLUDE_DIRS_1
+        NAMES glib.h
+        HINTS /usr/local/include PATH_SUFFIXES glib-${GLIB_VERSION})
+
+    find_path( _GLIB_INCLUDE_DIRS_2
+        NAMES glibconfig.h
+        HINTS /usr/local/lib/glib-${GLIB_VERSION} PATH_SUFFIXES include)
+
+
+    find_package(X11)
+
+    set(PANGOCAIRO_INCLUDE_DIRS
+        ${_PANGOCAIRO_INCLUDE_DIRS}
+        ${_CAIRO_INCLUDE_DIRS}
+        ${_GLIB_INCLUDE_DIRS_1}
+        ${_GLIB_INCLUDE_DIRS_2}
+	${X11_INCLUDE_DIR}
+    )
+
+#message(WARNING "===> ${PANGOCAIRO_INCLUDE_DIRS}")
+
+    find_library( _PANGOCAIRO_LIBRARIES NAMES pangocairo pangocairo-${PANGO_VERSION})
+    find_library( _PANGO_LIBRARIES NAMES pango pango-${PANGO_VERSION})
+    find_library( _CAIRO_LIBRARIES NAMES cairo)
+    find_library( _GLIB_LIBRARIES NAMES glib-${GLIB_VERSION})
+
+    set(PANGOCAIRO_LIBRARIES
+        ${_PANGOCAIRO_LIBRARIES}
+        ${_PANGO_LIBRARIES}
+        ${_CAIRO_LIBRARIES}
+        ${_GLIB_LIBRARIES}
+	${X11_LIBRARIES}
+    )
+
+#message(WARNING "===> ${PANGOCAIRO_LIBRARIES}")
+
+    find_package_handle_standard_args( pangocairo  DEFAULT_MSG
+        PANGOCAIRO_LIBRARIES
+        PANGOCAIRO_INCLUDE_DIRS  )
+
+endif()
+
diff --git a/ecbuild/cmake/FindProj4.cmake b/ecbuild/cmake/FindProj4.cmake
new file mode 100644
index 0000000..6181ed0
--- /dev/null
+++ b/ecbuild/cmake/FindProj4.cmake
@@ -0,0 +1,67 @@
+# - Try to find the proj4 library
+# Once done this will define
+#
+# PROJ4_FOUND - system has proj4
+# PROJ4_INCLUDE_DIRS - the proj4 include directory
+# PROJ4_LIBRARIES - Link these to use proj4
+#
+# Define PROJ4_MIN_VERSION for which version desired.
+
+if( NOT PROJ4_PATH AND NOT "$ENV{PROJ4_PATH}" STREQUAL "" )
+    set( PROJ4_PATH "$ENV{PROJ4_PATH}" )
+endif()
+
+ecbuild_add_extra_search_paths( proj4 )
+
+if( NOT PROJ4_PATH )
+
+    include(FindPkgConfig)
+
+#    if(Proj4_FIND_REQUIRED)
+#        set(_pkgconfig_REQUIRED "REQUIRED")
+#    else()
+#        set(_pkgconfig_REQUIRED "")
+#    endif()
+
+    if(PROJ4_MIN_VERSION)
+        pkg_check_modules(PKPROJ4 ${_pkgconfig_REQUIRED} QUIET proj4>=${PROJ4_MIN_VERSION})
+    else()
+        pkg_check_modules(PKPROJ4 ${_pkgconfig_REQUIRED} QUIET proj4)
+    endif()
+
+    if( PKG_CONFIG_FOUND AND PKPROJ4_FOUND )
+
+        find_path(PROJ4_INCLUDE_DIR proj_api.h HINTS ${PKPROJ4_INCLUDEDIR} ${PKPROJ4_INCLUDE_DIRS} PATH_SUFFIXES proj4 NO_DEFAULT_PATH )
+        find_library(PROJ4_LIBRARY  proj       HINTS ${PKPROJ4_LIBDIR}     ${PKPROJ4_LIBRARY_DIRS} PATH_SUFFIXES proj4 NO_DEFAULT_PATH )
+
+    endif()
+
+#    debug_var( PKG_CONFIG_FOUND )
+#    debug_var( PKPROJ4_FOUND )
+#    debug_var( PROJ4_MIN_VERSION )
+
+endif()
+
+if( PROJ4_PATH )
+
+    find_path(PROJ4_INCLUDE_DIR NAMES proj_api.h PATHS ${PROJ4_PATH} ${PROJ4_PATH}/include PATH_SUFFIXES proj4 NO_DEFAULT_PATH )
+    find_library(PROJ4_LIBRARY  NAMES proj       PATHS ${PROJ4_PATH} ${PROJ4_PATH}/lib     PATH_SUFFIXES proj4 NO_DEFAULT_PATH )
+
+endif()
+
+find_path(PROJ4_INCLUDE_DIR NAMES proj_api.h PATHS PATH_SUFFIXES proj4 )
+find_library( PROJ4_LIBRARY NAMES proj       PATHS PATH_SUFFIXES proj4 )
+
+
+# debug_var( PROJ4_INCLUDE_DIR )
+# debug_var( PROJ4_LIBRARY )
+
+# handle the QUIETLY and REQUIRED arguments and set GRIBAPI_FOUND
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(PROJ4  DEFAULT_MSG
+                                  PROJ4_LIBRARY PROJ4_INCLUDE_DIR)
+
+set( PROJ4_LIBRARIES    ${PROJ4_LIBRARY} )
+set( PROJ4_INCLUDE_DIRS ${PROJ4_INCLUDE_DIR} )
+
+mark_as_advanced( PROJ4_INCLUDE_DIR PROJ4_LIBRARY )
diff --git a/ecbuild/cmake/FindREADLINE.cmake b/ecbuild/cmake/FindREADLINE.cmake
new file mode 100644
index 0000000..9477026
--- /dev/null
+++ b/ecbuild/cmake/FindREADLINE.cmake
@@ -0,0 +1,87 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find READLINE
+# Once done this will define
+#  READLINE_FOUND - System has READLINE
+#  READLINE_INCLUDE_DIRS - The READLINE include directories
+#  READLINE_LIBRARIES - The libraries needed to use READLINE
+#  READLINE_DEFINITIONS - Compiler switches required for using READLINE
+
+if( DEFINED READLINE_PATH )
+    find_path(READLINE_INCLUDE_DIR readline/readline.h PATHS ${READLINE_PATH}/include NO_DEFAULT_PATH)
+    find_library(READLINE_LIBRARY  readline            PATHS ${READLINE_PATH}/lib     PATH_SUFFIXES readline NO_DEFAULT_PATH)
+endif()
+
+find_path(READLINE_INCLUDE_DIR readline/readline.h )
+find_library( READLINE_LIBRARY readline            PATH_SUFFIXES readline )
+
+# check what version we got
+cmake_push_check_state()
+
+  set( CMAKE_REQUIRED_LIBRARIES ${READLINE_LIBRARY} )
+  set( CMAKE_REQUIRED_INCLUDES  ${READLINE_INCLUDE_DIR} )
+
+  # sometimes the link might fail missing -ltermcap or -l(n)curses
+  # if we searched before for Curses, then lets try to use it
+  if(CURSES_FOUND)
+      list( APPEND CMAKE_REQUIRED_LIBRARIES ${CURSES_LIBRARIES} )
+      list( APPEND CMAKE_REQUIRED_INCLUDES  ${CURSES_INCLUDE_DIR} )
+  endif()
+
+  ecbuild_check_cxx_source_return(
+     "#include <stdio.h>
+      #include <readline/readline.h>
+      #include <iostream>
+      int main() {
+          std::cout << rl_library_version << std::flush;
+          return 0;
+     }"
+     VAR readline_version
+     OUTPUT __readline_version_out )
+
+cmake_pop_check_state()
+
+# debug_var( readline_version )
+# debug_var( __readline_version_out )
+
+set( __readline_fail 0 )
+if( __readline_version_out )
+
+    if( "${__readline_version_out}" MATCHES "^EditLine" )
+      message( STATUS "Found EditLine instead of Readline at '${READLINE_INCLUDE_DIR}'" )
+      if( READLINE_WRAPPER_OK )
+        set( READLINE_WRAPPER      "EditLine" )
+        set( __readline_fail 0 )
+      else()
+        message( STATUS "Readline wrapper not accepted -- rejecting Readline at '${READLINE_INCLUDE_DIR}'" )
+        set( __readline_fail 1 )
+      endif()
+    endif()
+
+else()
+    message( STATUS "Readline test run failed -- rejecting Readline at '${READLINE_INCLUDE_DIR}'" )
+    set( __readline_fail 1 )
+endif()
+
+if( __readline_fail )
+    set( READLINE_LIBRARY      READLINE_LIBRARY-NOTFOUND )
+    set( READLINE_INCLUDE_DIR  READLINE_INCLUDE_DIR-NOTFOUND )
+endif()
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(READLINE  DEFAULT_MSG READLINE_LIBRARY READLINE_INCLUDE_DIR)
+
+if( READLINE_FOUND )
+    set( READLINE_VERSION      ${__readline_version_out} )
+    set( READLINE_LIBRARIES    ${READLINE_LIBRARY} )
+    set( READLINE_INCLUDE_DIRS ${READLINE_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(READLINE_INCLUDE_DIR READLINE_LIBRARY )
diff --git a/ecbuild/cmake/FindRPCGEN.cmake b/ecbuild/cmake/FindRPCGEN.cmake
new file mode 100644
index 0000000..98c4a98
--- /dev/null
+++ b/ecbuild/cmake/FindRPCGEN.cmake
@@ -0,0 +1,20 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+#Sets:
+# RPCGEN_FOUND           = prcgen was found
+# RPCGEN_EXECUTABLE      = the executable rpcgen
+
+if( DEFINED RPCGEN_PATH )
+    find_program( RPCGEN_EXECUTABLE NAMES rpcgen PATHS ${RPCGEN_PATH} PATH_SUFFIXES bin NO_DEFAULT_PATH )
+endif()
+find_program( RPCGEN_EXECUTABLE NAMES rpcgen )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args( RPCGEN  DEFAULT_MSG RPCGEN_EXECUTABLE )
diff --git a/ecbuild/cmake/FindRealtime.cmake b/ecbuild/cmake/FindRealtime.cmake
new file mode 100644
index 0000000..b46b9b7
--- /dev/null
+++ b/ecbuild/cmake/FindRealtime.cmake
@@ -0,0 +1,22 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+#Sets:
+# RT_LIB      = the library to link against
+
+if( DEFINED REALTIME_PATH )
+    find_library(RT_LIB rt PATHS ${REALTIME_PATH}/lib NO_DEFAULT_PATH )
+endif()
+
+find_library( RT_LIB rt )
+
+mark_as_advanced( RT_LIB )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(REALTIME  DEFAULT_MSG RT_LIB )
diff --git a/ecbuild/cmake/FindSZip.cmake b/ecbuild/cmake/FindSZip.cmake
new file mode 100644
index 0000000..533df50
--- /dev/null
+++ b/ecbuild/cmake/FindSZip.cmake
@@ -0,0 +1,32 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find SZip
+# Once done this will define
+#  SZIP_FOUND - System has SZip
+#  SZIP_INCLUDE_DIRS - The SZip include directories
+#  SZIP_LIBRARIES - The libraries needed to use SZip
+
+ecbuild_add_extra_search_paths( szip )
+
+if( DEFINED SZIP_PATH )
+    find_path( SZIP_INCLUDE_DIR szlib.h       PATHS ${SZIP_PATH}/include PATH_SUFFIXES szip NO_DEFAULT_PATH )
+    find_library( SZIP_LIBRARY  NAMES szip sz PATHS ${SZIP_PATH}/lib     PATH_SUFFIXES szip NO_DEFAULT_PATH )
+endif()
+
+find_path( SZIP_INCLUDE_DIR szlib.h PATH_SUFFIXES szip )
+find_library( SZIP_LIBRARY NAMES szip sz  PATH_SUFFIXES szip )
+
+set( SZIP_LIBRARIES    ${SZIP_LIBRARY} )
+set( SZIP_INCLUDE_DIRS ${SZIP_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(SZip  DEFAULT_MSG SZIP_LIBRARY SZIP_INCLUDE_DIR)
+
+mark_as_advanced(SZIP_INCLUDE_DIR SZIP_LIBRARY )
diff --git a/ecbuild/cmake/FindScin.cmake b/ecbuild/cmake/FindScin.cmake
new file mode 100644
index 0000000..3ddf732
--- /dev/null
+++ b/ecbuild/cmake/FindScin.cmake
@@ -0,0 +1,48 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find ECREGRID
+# Once done this will define
+#  ECREGRID_FOUND - System has ECREGRID
+#  ECREGRID_INCLUDE_DIRS - The ECREGRID include directories
+#  ECREGRID_LIBRARIES - The libraries needed to use ECREGRID
+#  ECREGRID_DEFINITIONS - Compiler switches required for using ECREGRID
+
+option( WITH_ECREGRID "try to find scin installation" ON )
+
+# skip if ECREGRID is already found or if has is built inside
+
+if( NOT ECREGRID_FOUND AND WITH_ECREGRID )
+
+    if( NOT DEFINED ECREGRID_PATH AND NOT "$ENV{ECREGRID_PATH}" STREQUAL "" )
+        list( APPEND ECREGRID_PATH "$ENV{ECREGRID_PATH}" )
+    endif()
+
+    if( DEFINED ECREGRID_PATH )
+        find_path(ECREGRID_INCLUDE_DIR NAMES scin_api.h PATHS ${ECREGRID_PATH} ${ECREGRID_PATH}/include PATH_SUFFIXES scin_api  NO_DEFAULT_PATH )
+        find_library(ECREGRID_LIBRARY  NAMES scin       PATHS ${ECREGRID_PATH} ${ECREGRID_PATH}/lib     PATH_SUFFIXES scin      NO_DEFAULT_PATH )
+    endif()
+    
+    find_path(ECREGRID_INCLUDE_DIR NAMES scin_api.h PATH_SUFFIXES scin_api )
+    find_library( ECREGRID_LIBRARY NAMES scin       PATH_SUFFIXES scin     )
+    
+    include(FindPackageHandleStandardArgs)
+    
+    # handle the QUIETLY and REQUIRED arguments and set ECREGRID_FOUND to TRUE
+    # if all listed variables are TRUE
+    find_package_handle_standard_args(Scin  DEFAULT_MSG
+                                      ECREGRID_LIBRARY ECREGRID_INCLUDE_DIR)
+
+    if( ECREGRID_FOUND )
+        set( ECREGRID_LIBRARIES    ${ECREGRID_LIBRARY} )
+        set( ECREGRID_INCLUDE_DIRS ${ECREGRID_INCLUDE_DIR} )
+    endif()
+    
+    mark_as_advanced(ECREGRID_INCLUDE_DIR ECREGRID_LIBRARY )
+    
+endif()
diff --git a/ecbuild/cmake/FindTrilinos.cmake b/ecbuild/cmake/FindTrilinos.cmake
new file mode 100644
index 0000000..717cca6
--- /dev/null
+++ b/ecbuild/cmake/FindTrilinos.cmake
@@ -0,0 +1,52 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# Try to find the Trilinos library
+#
+# Needs environmental variables
+#   TRILINOS_PATH
+# Sets
+#   TRILINOS_INCLUDE_DIRS
+#   TRILINOS_LIBRARIES
+#   TRILINOS_FOUND
+
+# Try to find Trilinos using Trilinos recommendations
+
+
+ecbuild_add_extra_search_paths( trilinos )
+
+if( DEFINED $ENV{TRILINOS_PATH} )
+    find_package(Trilinos PATHS $ENV{TRILINOS_PATH}/lib/cmake/Trilinos $ENV{TRILINOS_PATH}/include )
+endif()
+
+if( TRILINOS_PATH )
+    find_package(Trilinos PATHS ${TRILINOS_PATH}/lib/cmake/Trilinos ${TRILINOS_PATH}/include )
+endif()
+
+if( Trilinos_FOUND )
+
+        set( TRILINOS_INCLUDE_DIRS "" )
+
+        list( APPEND TRILINOS_INCLUDE_DIRS ${Trilinos_INCLUDE_DIRS} )
+        list( APPEND TRILINOS_INCLUDE_DIRS ${Trilinos_TPL_INCLUDE_DIRS} )
+
+        foreach( test_lib ${Trilinos_LIBRARIES} )
+          if(NOT ${test_lib} STREQUAL "pytrilinos")
+            find_library( ${test_lib}_lib ${test_lib} PATHS  ${Trilinos_LIBRARY_DIRS}  NO_DEFAULT_PATH)
+            find_library( ${test_lib}_lib ${test_lib})
+            mark_as_advanced( ${test_lib}_lib )
+            list( APPEND TRILINOS_LIBRARIES ${${test_lib}_lib} )
+          endif()
+        endforeach()
+
+        list( APPEND TRILINOS_LIBRARIES ${Trilinos_TPL_LIBRARIES} )
+
+    set( TRILINOS_FOUND TRUE )
+	set( TRILINOS_VERSION ${Trilinos_VERSION} )
+
+endif()
diff --git a/ecbuild/cmake/FindXLFortranLibs.cmake b/ecbuild/cmake/FindXLFortranLibs.cmake
new file mode 100644
index 0000000..7be0070
--- /dev/null
+++ b/ecbuild/cmake/FindXLFortranLibs.cmake
@@ -0,0 +1,49 @@
+# © Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+###############################################################################
+
+list( APPEND xl_libs xlf90 xlopt xlf xlsmp )
+
+set( xlf_all_libs_found 1 )
+
+foreach( lib ${xl_libs} )
+
+	find_library( ${lib}_lib  ${lib} PATHS ${XLF_PATH} PATH_SUFFIXES lib lib64 NO_DEFAULT_PATH )
+
+	find_library( ${lib}_lib  ${lib} )
+
+	if( ${lib}_lib )
+        list( APPEND XLFORTRAN_LIBRARIES ${${lib}_lib} )
+	else()
+		set( xlf_all_libs_found 0 )
+    endif()
+
+endforeach()
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args( LIBXLFORTRAN DEFAULT_MSG xlf_all_libs_found XLFORTRAN_LIBRARIES  )
+
+# HACK for support libraries
+
+if(  LIBXLFORTRAN_FOUND )
+	list( APPEND xl_extra_libs pthreads m essl )
+	foreach( lib ${xl_extra_libs} )
+
+		find_library( ${lib}_lib  ${lib} PATHS ${XLF_PATH} PATH_SUFFIXES lib lib64 NO_DEFAULT_PATH )
+
+		find_library( ${lib}_lib  ${lib} )
+
+		if( ${lib}_lib )
+			list( APPEND XLFORTRAN_LIBRARIES ${${lib}_lib} )
+		endif()
+
+	endforeach()
+endif()
+
diff --git a/ecbuild/cmake/FindYACC.cmake b/ecbuild/cmake/FindYACC.cmake
new file mode 100644
index 0000000..dbdb191
--- /dev/null
+++ b/ecbuild/cmake/FindYACC.cmake
@@ -0,0 +1,157 @@
+# - Find yacc executable and provides macros to generate custom build rules
+# The module defines the following variables:
+#
+#  YACC_EXECUTABLE - path to the yacc program
+#  YACC_FOUND - true if the program was found
+#
+# The minimum required version of yacc can be specified using the
+# standard CMake syntax, e.g. find_package(YACC 2.1.3)
+#
+# If yacc is found, the module defines the macros:
+#  YACC_TARGET(<Name> <YaccInput> <CodeOutput> [VERBOSE <file>]
+#              [COMPILE_FLAGS <string>])
+# which will create  a custom rule to generate  a parser. <YaccInput> is
+# the path to  a yacc file. <CodeOutput> is the name  of the source file
+# generated by yacc.  A header file is also  be generated, and contains
+# the  token  list.  If  COMPILE_FLAGS  option is  specified,  the  next
+# parameter is  added in the yacc  command line.  if  VERBOSE option is
+# specified, <file> is created  and contains verbose descriptions of the
+# grammar and parser. The macro defines a set of variables:
+#  YACC_${Name}_DEFINED - true is the macro ran successfully
+#  YACC_${Name}_INPUT - The input source file, an alias for <YaccInput>
+#  YACC_${Name}_OUTPUT_SOURCE - The source file generated by yacc
+#  YACC_${Name}_OUTPUT_HEADER - The header file generated by yacc
+#  YACC_${Name}_OUTPUTS - The sources files generated by yacc
+#  YACC_${Name}_COMPILE_FLAGS - Options used in the yacc command line
+#
+#  ====================================================================
+
+#=============================================================================
+# Copyright 2009 Kitware, Inc.
+# Copyright 2006 Tristan Carel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+
+# This file is based on the FindFLEX CMake macro, and adapted by ECMWF
+
+#=============================================================================
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+FIND_PROGRAM(YACC_EXECUTABLE yacc DOC "path to the yacc/yacc executable")
+MARK_AS_ADVANCED(YACC_EXECUTABLE)
+
+IF(YACC_EXECUTABLE)
+  # the yacc commands should be executed with the C locale, otherwise
+  # the message (which are parsed) may be translated
+  SET(_Yacc_SAVED_LC_ALL "$ENV{LC_ALL}")
+  SET(ENV{LC_ALL} C)
+
+  SET(ENV{LC_ALL} ${_Yacc_SAVED_LC_ALL})
+
+  # internal macro
+  MACRO(YACC_TARGET_option_verbose Name YaccOutput filename)
+    LIST(APPEND YACC_TARGET_cmdopt "--verbose")
+    GET_FILENAME_COMPONENT(YACC_TARGET_output_path "${YaccOutput}" PATH)
+    GET_FILENAME_COMPONENT(YACC_TARGET_output_name "${YaccOutput}" NAME_WE)
+    ADD_CUSTOM_COMMAND(OUTPUT ${filename}
+      COMMAND ${CMAKE_COMMAND}
+      ARGS -E copy
+      "${YACC_TARGET_output_path}/${YACC_TARGET_output_name}.output"
+      "${filename}"
+      DEPENDS
+      "${YACC_TARGET_output_path}/${YACC_TARGET_output_name}.output"
+      COMMENT "[YACC][${Name}] Copying yacc verbose table to ${filename}"
+      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
+    SET(YACC_${Name}_VERBOSE_FILE ${filename})
+    LIST(APPEND YACC_TARGET_extraoutputs
+      "${YACC_TARGET_output_path}/${YACC_TARGET_output_name}.output")
+  ENDMACRO(YACC_TARGET_option_verbose)
+
+  # internal macro
+  MACRO(YACC_TARGET_option_extraopts Options)
+    SET(YACC_TARGET_extraopts "${Options}")
+    SEPARATE_ARGUMENTS(YACC_TARGET_extraopts)
+    LIST(APPEND YACC_TARGET_cmdopt ${YACC_TARGET_extraopts})
+  ENDMACRO(YACC_TARGET_option_extraopts)
+
+  #============================================================
+  # YACC_TARGET (public macro)
+  #============================================================
+  #
+  MACRO(YACC_TARGET Name YaccInput YaccOutput)
+    SET(YACC_TARGET_output_header "")
+    SET(YACC_TARGET_cmdopt "")
+    SET(YACC_TARGET_outputs "${YaccOutput}")
+    IF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 5 AND NOT ${ARGC} EQUAL 7)
+      MESSAGE(SEND_ERROR "Usage")
+    ELSE()
+      # Parsing parameters
+      IF(${ARGC} GREATER 5 OR ${ARGC} EQUAL 5)
+        IF("${ARGV3}" STREQUAL "VERBOSE")
+          YACC_TARGET_option_verbose(${Name} ${YaccOutput} "${ARGV4}")
+        ENDIF()
+        IF("${ARGV3}" STREQUAL "COMPILE_FLAGS")
+          YACC_TARGET_option_extraopts("${ARGV4}")
+        ENDIF()
+      ENDIF()
+
+      IF(${ARGC} EQUAL 7)
+        IF("${ARGV5}" STREQUAL "VERBOSE")
+          YACC_TARGET_option_verbose(${Name} ${YaccOutput} "${ARGV6}")
+        ENDIF()
+
+        IF("${ARGV5}" STREQUAL "COMPILE_FLAGS")
+          YACC_TARGET_option_extraopts("${ARGV6}")
+        ENDIF()
+      ENDIF()
+
+      # Header's name generated by yacc (see option -d)
+      LIST(APPEND YACC_TARGET_cmdopt "-d")
+      STRING(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\2" _fileext "${ARGV2}")
+      STRING(REPLACE "c" "h" _fileext ${_fileext})
+      STRING(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\1${_fileext}"
+          YACC_${Name}_OUTPUT_HEADER "${ARGV2}")
+      LIST(APPEND YACC_TARGET_outputs "${YACC_${Name}_OUTPUT_HEADER}")
+
+#       message ( STATUS "${YACC_EXECUTABLE} ${YACC_TARGET_cmdopt} ${CMAKE_CURRENT_BINARY_DIR}/${ARGV1}" )
+#       message ( STATUS "${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.h ${YACC_${Name}_OUTPUT_HEADER}" )
+#       message ( STATUS "${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c ${ARGV2}" )
+
+      ADD_CUSTOM_COMMAND(OUTPUT ${YACC_TARGET_outputs} ${YACC_TARGET_extraoutputs}
+        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${ARGV1} ${CMAKE_CURRENT_BINARY_DIR}
+        COMMAND ${YACC_EXECUTABLE} ${YACC_TARGET_cmdopt} ${CMAKE_CURRENT_BINARY_DIR}/${ARGV1}
+        COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.h ${YACC_${Name}_OUTPUT_HEADER}
+        COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c ${ARGV2}
+        DEPENDS ${ARGV1}
+        COMMENT "[YACC][${Name}] Building parser with yacc"
+        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+
+      # define target variables
+      SET(YACC_${Name}_DEFINED TRUE)
+      SET(YACC_${Name}_INPUT ${ARGV1})
+      SET(YACC_${Name}_OUTPUTS ${YACC_TARGET_outputs})
+      SET(YACC_${Name}_COMPILE_FLAGS ${YACC_TARGET_cmdopt})
+      SET(YACC_${Name}_OUTPUT_SOURCE "${YaccOutput}")
+
+    ENDIF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 5 AND NOT ${ARGC} EQUAL 7)
+  ENDMACRO(YACC_TARGET)
+  #
+  #============================================================
+
+ENDIF(YACC_EXECUTABLE)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(YACC REQUIRED_VARS  YACC_EXECUTABLE )
+
+# FindYACC.cmake ends here
diff --git a/ecbuild/cmake/Findgrib_api.cmake b/ecbuild/cmake/Findgrib_api.cmake
new file mode 100644
index 0000000..55a7b19
--- /dev/null
+++ b/ecbuild/cmake/Findgrib_api.cmake
@@ -0,0 +1,135 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find GRIB_API
+# Once done this will define
+#  GRIB_API_FOUND - System has GRIB_API
+#  GRIB_API_INCLUDE_DIRS - The GRIB_API include directories
+#  GRIB_API_LIBRARIES - The libraries needed to use GRIB_API
+#  GRIB_API_DEFINITIONS - Compiler switches required for using GRIB_API
+
+option( NO_GRIB_API_BINARIES "skip trying to find grib_api installed binaries" OFF )
+option( GRIB_API_PNG "use png with grib_api" ON )
+option( GRIB_API_JPG "use jpg with grib_api" ON )
+
+if( NOT grib_api_FOUND AND NOT NO_GRIB_API_BINARIES )
+
+    ecbuild_add_extra_search_paths( grib_api )
+
+    if( GRIB_API_JPG ) # jpeg support
+        
+        find_package( JPEG     QUIET ) # grib_api might be a static .a library in which
+    
+        if( NOT "$ENV{JASPER_PATH}" STREQUAL "" )
+            list( APPEND CMAKE_PREFIX_PATH "$ENV{JASPER_PATH}" )
+        endif()
+        find_package( Jasper   QUIET ) # case we don't know if which jpeg library was used
+    
+        find_package( OpenJPEG QUIET ) # so we try to find all jpeg libs and link to them 
+        
+        if(JPEG_FOUND)
+            list( APPEND _grib_api_jpg_incs ${JPEG_INCLUDE_DIR} )
+            list( APPEND _grib_api_jpg_libs ${JPEG_LIBRARIES} )
+        endif()
+        if(JASPER_FOUND)
+            list( APPEND _grib_api_jpg_incs ${JASPER_INCLUDE_DIR} )
+            list( APPEND _grib_api_jpg_libs ${JASPER_LIBRARIES} )
+        endif()
+        if(OPENJPEG_FOUND)
+            list( APPEND _grib_api_jpg_incs ${OPENJPEG_INCLUDE_DIR} )
+            list( APPEND _grib_api_jpg_libs ${OPENJPEG_LIBRARIES} )
+        endif()
+
+    endif()
+    
+    if( GRIB_API_PNG ) # png support
+    
+        find_package(PNG)
+    
+        if( DEFINED PNG_PNG_INCLUDE_DIR AND NOT DEFINED PNG_INCLUDE_DIRS )
+          set( PNG_INCLUDE_DIRS ${PNG_PNG_INCLUDE_DIR}  CACHE INTERNAL "PNG include dirs" )
+        endif()
+        if( DEFINED PNG_LIBRARY AND NOT DEFINED PNG_LIBRARIES )
+          set( PNG_LIBRARIES ${PNG_LIBRARY} CACHE INTERNAL "PNG libraries" )
+        endif()
+        
+        if(PNG_FOUND)
+            list( APPEND _grib_api_png_defs ${PNG_DEFINITIONS} )
+            list( APPEND _grib_api_png_incs ${PNG_INCLUDE_DIRS} )
+            list( APPEND _grib_api_png_libs ${PNG_LIBRARIES} )
+        endif()
+
+    endif()
+
+	# The grib_api on macos that comes with 'port' is linked against ghostscript
+	if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+		find_library(GS_LIBRARIES NAMES gs)
+		if( GS_LIBRARIES )
+			list( APPEND GRIB_API_LIBRARIES ${GS_LIBRARIES} )
+		endif()
+	endif()
+
+    # find external grib_api
+
+    if( NOT DEFINED GRIB_API_PATH AND NOT "$ENV{GRIB_API_PATH}" STREQUAL "" )
+        list( APPEND GRIB_API_PATH "$ENV{GRIB_API_PATH}" )
+    endif()
+
+    if( DEFINED GRIB_API_PATH )
+        find_path(GRIB_API_INCLUDE_DIR NAMES grib_api.h PATHS ${GRIB_API_PATH} ${GRIB_API_PATH}/include PATH_SUFFIXES grib_api  NO_DEFAULT_PATH)
+        find_library(GRIB_API_LIBRARY  NAMES grib_api   PATHS ${GRIB_API_PATH} ${GRIB_API_PATH}/lib     PATH_SUFFIXES grib_api  NO_DEFAULT_PATH)
+        find_library(GRIB_API_LIB_F90  NAMES grib_api_f90 PATHS ${GRIB_API_PATH} ${GRIB_API_PATH}/lib     PATH_SUFFIXES grib_api  NO_DEFAULT_PATH)
+        find_library(GRIB_API_LIB_F77  NAMES grib_api_f77 PATHS ${GRIB_API_PATH} ${GRIB_API_PATH}/lib     PATH_SUFFIXES grib_api  NO_DEFAULT_PATH)
+        find_program(GRIB_API_INFO     NAMES grib_info  PATHS ${GRIB_API_PATH} ${GRIB_API_PATH}/bin     PATH_SUFFIXES grib_api  NO_DEFAULT_PATH)
+    endif()
+    
+    find_path(GRIB_API_INCLUDE_DIR NAMES grib_api.h PATHS PATH_SUFFIXES grib_api )
+    find_library( GRIB_API_LIBRARY NAMES grib_api   PATHS PATH_SUFFIXES grib_api )
+    find_library( GRIB_API_LIB_F90 NAMES grib_api_f90 PATHS PATH_SUFFIXES grib_api )
+    find_library( GRIB_API_LIB_F77 NAMES grib_api_f77 PATHS PATH_SUFFIXES grib_api )
+    find_program(GRIB_API_INFO     NAMES grib_info  PATHS PATH_SUFFIXES grib_api )
+    
+    list( APPEND GRIB_API_LIBRARIES    ${GRIB_API_LIBRARY} ${GRIB_API_LIB_F90} ${GRIB_API_LIB_F77} )
+    set( GRIB_API_INCLUDE_DIRS ${GRIB_API_INCLUDE_DIR} )
+
+    if( GRIB_API_INFO )
+        
+        execute_process( COMMAND ${GRIB_API_INFO} -v  OUTPUT_VARIABLE _grib_info_out ERROR_VARIABLE _grib_info_err OUTPUT_STRIP_TRAILING_WHITESPACE )
+        
+        # debug_var( _grib_info_out )
+    
+        string( REPLACE "." " " _version_list ${_grib_info_out} ) # dots to spaces
+        separate_arguments( _version_list )
+
+        list( GET _version_list 0 GRIB_API_MAJOR_VERSION )
+        list( GET _version_list 1 GRIB_API_MINOR_VERSION )
+        list( GET _version_list 2 GRIB_API_PATCH_VERSION )
+
+        set( GRIB_API_VERSION     "${GRIB_API_MAJOR_VERSION}.${GRIB_API_MINOR_VERSION}.${GRIB_API_PATCH_VERSION}" ) 
+        set( GRIB_API_VERSION_STR "${_grib_info_out}" )
+
+        set( grib_api_VERSION     "${GRIB_API_VERSION}" ) 
+        set( grib_api_VERSION_STR "${GRIB_API_VERSION_STR}" )
+
+    endif()
+    
+    include(FindPackageHandleStandardArgs)
+    
+    # handle the QUIETLY and REQUIRED arguments and set GRIB_API_FOUND to TRUE
+    find_package_handle_standard_args( grib_api DEFAULT_MSG
+                                       GRIB_API_LIBRARY GRIB_API_INCLUDE_DIR GRIB_API_INFO )
+    
+    mark_as_advanced( GRIB_API_INCLUDE_DIR GRIB_API_LIBRARY GRIB_API_INFO )
+    
+    list( APPEND GRIB_API_DEFINITIONS  ${_grib_api_jpg_defs} ${_grib_api_png_defs} )
+    list( APPEND GRIB_API_INCLUDE_DIRS ${_grib_api_jpg_incs} ${_grib_api_png_incs} )
+	list( APPEND GRIB_API_LIBRARIES    ${_grib_api_jpg_libs} ${_grib_api_png_libs} )
+
+    set( grib_api_FOUND ${GRIB_API_FOUND} )
+
+endif()
diff --git a/ecbuild/cmake/Findodb_api.cmake b/ecbuild/cmake/Findodb_api.cmake
new file mode 100644
index 0000000..c573d9b
--- /dev/null
+++ b/ecbuild/cmake/Findodb_api.cmake
@@ -0,0 +1,99 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find ODB_API
+# Once done this will define
+#  ODB_API_FOUND - System has ODB_API
+#  ODB_API_INCLUDE_DIRS - The ODB_API include directories
+#  ODB_API_LIBRARIES - The libraries needed to use ODB_API
+#  ODB_API_DEFINITIONS - Compiler switches required for using ODB_API
+
+if( NOT odb_api_FOUND )
+
+    ecbuild_add_extra_search_paths( odb_api )
+
+    # find external odb_api
+
+    if( NOT DEFINED ODB_API_PATH AND NOT "$ENV{ODB_API_PATH}" STREQUAL "" )
+        list( APPEND ODB_API_PATH "$ENV{ODB_API_PATH}" )
+    endif()
+
+    if( DEFINED ODB_API_PATH )
+
+        find_path( ODB_API_INCLUDE_DIR
+                   NAMES odb_api_config.h
+                   PATHS ${ODB_API_PATH} ${ODB_API_PATH}/include
+                   PATH_SUFFIXES odb_api
+                   NO_DEFAULT_PATH )
+
+        find_library( ODB_API_LIBRARY NAMES Odb
+                      PATHS ${ODB_API_PATH} ${ODB_API_PATH}/lib
+                      PATH_SUFFIXES odb_api
+                      NO_DEFAULT_PATH )
+
+        find_library( ODB_API_ECLIB_LIBRARY NAMES Ec
+                      PATHS ${ODB_API_PATH} ${ODB_API_PATH}/lib
+                      PATH_SUFFIXES odb_api
+                      NO_DEFAULT_PATH )
+    endif()
+    
+        find_path( ODB_API_INCLUDE_DIR
+                   NAMES odb_api_config.h
+                   PATHS
+                   PATH_SUFFIXES odb_api )
+
+        find_library( ODB_API_LIBRARY NAMES Odb
+                      PATHS
+                      PATH_SUFFIXES odb_api )
+
+        find_library( ODB_API_ECLIB_LIBRARY NAMES Ec
+                      PATHS
+                      PATH_SUFFIXES odb_api )
+
+
+    # get the version
+
+    if( ODB_API_INCLUDE_DIR )
+
+        set(_odb_api_VERSION_REGEX "([0-9]+)")
+
+        foreach( v MAJOR MINOR PATCH )
+
+          file(STRINGS "${ODB_API_INCLUDE_DIR}/odb_api_config.h" _odb_api_${v}_VERSION_CONTENTS REGEX "#define ODB_API_${v}_VERSION ")
+
+          if( "${_odb_api_${v}_VERSION_CONTENTS}" MATCHES ".*#define ODB_API_${v}_VERSION ${_odb_api_VERSION_REGEX}.*")
+
+              set( ODB_API_${v}_VERSION "${CMAKE_MATCH_1}" )
+
+          endif()
+
+        endforeach()
+
+    endif()
+
+    set( ODB_API_VERSION     "${ODB_API_MAJOR_VERSION}.${ODB_API_MINOR_VERSION}.${ODB_API_PATCH_VERSION}" )
+    set( ODB_API_VERSION_STR "${_odb_info_out}" )
+
+    set( odb_api_VERSION     "${ODB_API_VERSION}" )
+    set( odb_api_VERSION_STR "${ODB_API_VERSION_STR}" )
+
+    # handle the QUIETLY and REQUIRED arguments and set ODB_API_FOUND to TRUE
+
+    include(FindPackageHandleStandardArgs)
+
+    find_package_handle_standard_args( odb_api DEFAULT_MSG
+                                       ODB_API_LIBRARY ODB_API_ECLIB_LIBRARY ODB_API_INCLUDE_DIR )
+    
+    set( ODB_API_LIBRARIES    ${ODB_API_LIBRARY} ${ODB_API_ECLIB_LIBRARY} )
+    set( ODB_API_INCLUDE_DIRS ${ODB_API_INCLUDE_DIR} )
+
+    mark_as_advanced( ODB_API_INCLUDE_DIR ODB_API_LIBRARY ODB_API_ECLIB_LIBRARY )
+    
+    set( odb_api_FOUND ${ODB_API_FOUND} )
+
+endif()
diff --git a/ecbuild/cmake/Findspot.cmake b/ecbuild/cmake/Findspot.cmake
new file mode 100644
index 0000000..6396ef0
--- /dev/null
+++ b/ecbuild/cmake/Findspot.cmake
@@ -0,0 +1,67 @@
+# (C) Copyright 1996-2012 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# - Try to find ODB_API
+# Once done this will define
+#  ODB_API_FOUND - System has ODB_API
+#  ODB_API_INCLUDE_DIRS - The ODB_API include directories
+#  ODB_API_LIBRARIES - The libraries needed to use ODB_API
+#  ODB_API_DEFINITIONS - Compiler switches required for using ODB_API
+
+if( NOT spot_FOUND )
+
+    ecbuild_add_extra_search_paths( spot )
+
+    # find external odb_api
+
+    if( NOT DEFINED SPOT_PATH AND NOT "$ENV{SPOT_PATH}" STREQUAL "" )
+        list( APPEND SPOT_PATH "$ENV{SPOT_PATH}" )
+    endif()
+
+    if( DEFINED SPOT_PATH )
+
+        find_path( SPOT_INCLUDE_DIR
+                   NAMES spot_database.h
+                   PATHS ${SPOT_PATH} ${SPOT_PATH}/include
+                   NO_DEFAULT_PATH )
+
+        find_library( SPOT_LIBRARY NAMES spot_database
+                      PATHS ${SPOT_PATH} ${SPOT_PATH}/lib
+                      NO_DEFAULT_PATH )
+
+    endif()
+    
+        find_path( SPOT_INCLUDE_DIR
+                   NAMES spot_database.h
+                   PATHS
+                   PATH_SUFFIXES spot )
+
+        find_library( SPOT_LIBRARY NAMES spot_database
+                      PATHS
+                      PATH_SUFFIXES odb_api )
+
+        find_library( ODB_API_ECLIB_LIBRARY NAMES Ec
+                      PATHS
+                      PATH_SUFFIXES spot )
+
+
+    # get the version
+
+    include(FindPackageHandleStandardArgs)
+
+    find_package_handle_standard_args( spot DEFAULT_MSG
+                                       SPOT_LIBRARY SPOT_INCLUDE_DIR )
+    
+    set( SPOT_LIBRARIES    ${SPOT_LIBRARY} )
+    set( SPOT_INCLUDE_DIRS ${SPOT_INCLUDE_DIR} )
+
+    mark_as_advanced( SPOT_INCLUDE_DIR SPOT_LIBRARY )
+    
+    set( spot_FOUND ${SPOT_FOUND} )
+
+endif()
diff --git a/ecbuild/cmake/VERSION.cmake b/ecbuild/cmake/VERSION.cmake
new file mode 100644
index 0000000..40762d8
--- /dev/null
+++ b/ecbuild/cmake/VERSION.cmake
@@ -0,0 +1,7 @@
+set( ECBUILD_MAJOR_VERSION "1" )
+set( ECBUILD_MINOR_VERSION "7" )
+set( ECBUILD_PATCH_VERSION "0" )
+
+set( ECBUILD_VERSION_STR  "1.7.0" )
+
+set( ECBUILD_MACRO_VERSION "${ECBUILD_MAJOR_VERSION}.${ECBUILD_MINOR_VERSION}" )
diff --git a/ecbuild/cmake/contrib/CheckFortranCompilerFlag.cmake b/ecbuild/cmake/contrib/CheckFortranCompilerFlag.cmake
new file mode 100644
index 0000000..6a35c8e
--- /dev/null
+++ b/ecbuild/cmake/contrib/CheckFortranCompilerFlag.cmake
@@ -0,0 +1,25 @@
+# File taken from CMake Bug Report: http://public.kitware.com/Bug/print_bug_page.php?bug_id=12459
+
+# - Check whether the Fortan compiler supports a given flag.
+# CHECK_FORTRAN_COMPILER_FLAG(<flag> <var>)
+#  <flag> - the compiler flag
+#  <var>  - variable to store the result
+# This internally calls the check_fortran_source_compiles macro.  See help
+# for CheckFortranSourceCompiles for a listing of variables that can
+# modify the build.
+
+INCLUDE(CheckFortranSourceCompiles)
+
+MACRO (CHECK_FORTRAN_COMPILER_FLAG _FLAG _RESULT)
+   SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
+   SET(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
+   CHECK_FORTRAN_SOURCE_COMPILES("end" ${_RESULT}
+     # Some compilers do not fail with a bad flag
+     FAIL_REGEX "unrecognized .*option"                     # GNU
+     FAIL_REGEX "ignoring unknown option"                   # MSVC
+     FAIL_REGEX "[Uu]nknown option"                         # HP
+     FAIL_REGEX "[Ww]arning: [Oo]ption"                     # SunPro
+     FAIL_REGEX "command option .* is not recognized"       # XL
+     )
+   SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
+ENDMACRO (CHECK_FORTRAN_COMPILER_FLAG)
diff --git a/ecbuild/cmake/contrib/CheckFortranSourceCompiles.cmake b/ecbuild/cmake/contrib/CheckFortranSourceCompiles.cmake
new file mode 100644
index 0000000..500aee6
--- /dev/null
+++ b/ecbuild/cmake/contrib/CheckFortranSourceCompiles.cmake
@@ -0,0 +1,61 @@
+# File taken from CMake Bug Report: http://public.kitware.com/Bug/print_bug_page.php?bug_id=12459
+
+# - Check if the source code provided in the SOURCE argument compiles.
+# CHECK_FORTRAN_SOURCE_COMPILES(SOURCE VAR)
+# - macro which checks if the source code compiles
+#  SOURCE   - source code to try to compile
+#  VAR      - variable to store whether the source code compiled
+#
+# The following variables may be set before calling this macro to
+# modify the way the check is run:
+#
+#  CMAKE_REQUIRED_FLAGS = string of compile command line flags
+#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
+#  CMAKE_REQUIRED_INCLUDES = list of include directories
+#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link
+
+MACRO(CHECK_FORTRAN_SOURCE_COMPILES SOURCE VAR)
+  IF("${VAR}" MATCHES "^${VAR}$")
+    SET(MACRO_CHECK_FUNCTION_DEFINITIONS
+      "-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
+    IF(CMAKE_REQUIRED_LIBRARIES)
+      SET(CHECK_FORTRAN_SOURCE_COMPILES_ADD_LIBRARIES
+        "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
+    ELSE(CMAKE_REQUIRED_LIBRARIES)
+      SET(CHECK_FORTRAN_SOURCE_COMPILES_ADD_LIBRARIES)
+    ENDIF(CMAKE_REQUIRED_LIBRARIES)
+    IF(CMAKE_REQUIRED_INCLUDES)
+      SET(CHECK_FORTRAN_SOURCE_COMPILES_ADD_INCLUDES
+        "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
+    ELSE(CMAKE_REQUIRED_INCLUDES)
+      SET(CHECK_FORTRAN_SOURCE_COMPILES_ADD_INCLUDES)
+    ENDIF(CMAKE_REQUIRED_INCLUDES)
+    FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.f90"
+      "${SOURCE}\n")
+
+    MESSAGE(STATUS "Performing Test ${VAR}")
+    TRY_COMPILE(${VAR}
+      ${CMAKE_BINARY_DIR}
+      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.f90
+      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+      CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+      "${CHECK_FORTRAN_SOURCE_COMPILES_ADD_LIBRARIES}"
+      "${CHECK_FORTRAN_SOURCE_COMPILES_ADD_INCLUDES}"
+      OUTPUT_VARIABLE OUTPUT)
+    IF(${VAR})
+      SET(${VAR} 1 CACHE INTERNAL "Test ${VAR}")
+      MESSAGE(STATUS "Performing Test ${VAR} - Success")
+      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+        "Performing Fortran SOURCE FILE Test ${VAR} succeded with the following output:\n"
+        "${OUTPUT}\n"
+        "Source file was:\n${SOURCE}\n")
+    ELSE(${VAR})
+      MESSAGE(STATUS "Performing Test ${VAR} - Failed")
+      SET(${VAR} 0 CACHE INTERNAL "Test ${VAR}")
+      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+        "Performing Fortran SOURCE FILE Test ${VAR} failed with the following output:\n"
+        "${OUTPUT}\n"
+        "Source file was:\n${SOURCE}\n")
+    ENDIF(${VAR})
+  ENDIF("${VAR}" MATCHES "^${VAR}$")
+ENDMACRO(CHECK_FORTRAN_SOURCE_COMPILES)
diff --git a/ecbuild/cmake/contrib/FindEigen3.cmake b/ecbuild/cmake/contrib/FindEigen3.cmake
new file mode 100644
index 0000000..72d4a9d
--- /dev/null
+++ b/ecbuild/cmake/contrib/FindEigen3.cmake
@@ -0,0 +1,93 @@
+# - Try to find Eigen3 lib
+#
+# This module supports requiring a minimum version, e.g. you can do
+#   find_package(Eigen3 3.1.2)
+# to require version 3.1.2 or newer of Eigen3.
+#
+# Once done this will define
+#
+#  EIGEN3_FOUND - system has eigen lib with correct version
+#  EIGEN3_INCLUDE_DIR - the eigen include directory
+#  EIGEN3_VERSION - eigen version
+
+# Copyright (c) 2006, 2007 Montel Laurent, <montel at kde.org>
+# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael at free.fr>
+# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
+
+ecbuild_add_extra_search_paths( eigen )
+
+if(NOT Eigen3_FIND_VERSION)
+  if(NOT Eigen3_FIND_VERSION_MAJOR)
+    set(Eigen3_FIND_VERSION_MAJOR 2)
+  endif(NOT Eigen3_FIND_VERSION_MAJOR)
+  if(NOT Eigen3_FIND_VERSION_MINOR)
+    set(Eigen3_FIND_VERSION_MINOR 91)
+  endif(NOT Eigen3_FIND_VERSION_MINOR)
+  if(NOT Eigen3_FIND_VERSION_PATCH)
+    set(Eigen3_FIND_VERSION_PATCH 0)
+  endif(NOT Eigen3_FIND_VERSION_PATCH)
+
+  set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
+endif(NOT Eigen3_FIND_VERSION)
+
+macro(_eigen3_check_version)
+  file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
+
+  string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
+  set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
+
+  set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
+  if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK FALSE)
+  else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK TRUE)
+  endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+
+  if(NOT EIGEN3_VERSION_OK)
+
+    message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
+                   "but at least version ${Eigen3_FIND_VERSION} is required")
+  else()
+	set( EIGEN3_VERSION ${EIGEN3_VERSION} CACHE INTERNAL "Eigen3 version" )
+  endif()
+
+endmacro(_eigen3_check_version)
+
+if(EIGEN3_INCLUDE_DIR)
+
+  # in cache already
+  _eigen3_check_version()
+  set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
+
+else(EIGEN3_INCLUDE_DIR)
+
+  find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
+      PATHS
+      ${CMAKE_INSTALL_PREFIX}/include
+      ${KDE4_INCLUDE_DIR}
+      ${EIGEN3_PATH}/include
+      ${EIGEN3_DIR}/include
+      ${EIGEN3_ROOT}/include
+      ${EIGEN_PATH}/include
+      ${EIGEN_DIR}/include
+      ${EIGEN_ROOT}/include
+      PATH_SUFFIXES eigen3 eigen
+    )
+
+  if(EIGEN3_INCLUDE_DIR)
+    _eigen3_check_version()
+  endif(EIGEN3_INCLUDE_DIR)
+
+  include(FindPackageHandleStandardArgs)
+  find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
+
+  mark_as_advanced(EIGEN3_INCLUDE_DIR)
+
+endif(EIGEN3_INCLUDE_DIR)
+
+set( EIGEN3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR} )
diff --git a/ecbuild/cmake/contrib/FindFFTW.cmake b/ecbuild/cmake/contrib/FindFFTW.cmake
new file mode 100644
index 0000000..1ddaf4c
--- /dev/null
+++ b/ecbuild/cmake/contrib/FindFFTW.cmake
@@ -0,0 +1,124 @@
+# - Find the FFTW library
+#
+# Usage:
+#   find_package(FFTW [REQUIRED] [QUIET] )
+#     
+# It sets the following variables:
+#   FFTW_FOUND               ... true if fftw is found on the system
+#   FFTW_LIBRARIES           ... full path to fftw library
+#   FFTW_INCLUDES            ... fftw include directory
+#
+# The following variables will be checked by the function
+#   FFTW_USE_STATIC_LIBS    ... if true, only static libraries are found
+#   FFTW_ROOT               ... if set, the libraries are exclusively searched
+#                               under this path
+#   FFTW_LIBRARY            ... fftw library to use
+#   FFTW_INCLUDE_DIR        ... fftw include directory
+#
+
+#=======================#
+#
+#      From Eigen3
+#
+#========================
+
+#If environment variable FFTWDIR is specified, it has same effect as FFTW_ROOT
+if( NOT FFTW_ROOT AND ENV{FFTWDIR} )
+  set( FFTW_ROOT $ENV{FFTWDIR} )
+endif()
+
+# Check if we can use PkgConfig
+find_package(PkgConfig)
+
+#Determine from PKG
+if( PKG_CONFIG_FOUND AND NOT FFTW_ROOT )
+  pkg_check_modules( PKG_FFTW QUIET "fftw3" )
+endif()
+
+#Check whether to search static or dynamic libs
+set( CMAKE_FIND_LIBRARY_SUFFIXES_SAV ${CMAKE_FIND_LIBRARY_SUFFIXES} )
+
+if( ${FFTW_USE_STATIC_LIBS} )
+  set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX} )
+else()
+  set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX} )
+endif()
+
+if( FFTW_ROOT )
+
+  #find libs
+  find_library(
+    FFTW_LIB
+    NAMES "fftw3"
+    PATHS ${FFTW_ROOT}
+    PATH_SUFFIXES "lib" "lib64"
+    NO_DEFAULT_PATH
+  )
+
+  find_library(
+    FFTWF_LIB
+    NAMES "fftw3f"
+    PATHS ${FFTW_ROOT}
+    PATH_SUFFIXES "lib" "lib64"
+    NO_DEFAULT_PATH
+  )
+
+  find_library(
+    FFTWL_LIB
+    NAMES "fftw3l"
+    PATHS ${FFTW_ROOT}
+    PATH_SUFFIXES "lib" "lib64"
+    NO_DEFAULT_PATH
+  )
+
+  #find includes
+  find_path(
+    FFTW_INCLUDES
+    NAMES "fftw3.h"
+    PATHS ${FFTW_ROOT}
+    PATH_SUFFIXES "include"
+    NO_DEFAULT_PATH
+  )
+
+else()
+
+  find_library(
+    FFTW_LIB
+    NAMES "fftw3"
+    PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
+  )
+
+  find_library(
+    FFTWF_LIB
+    NAMES "fftw3f"
+    PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
+  )
+
+
+  find_library(
+    FFTWL_LIB
+    NAMES "fftw3l"
+    PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
+  )
+
+  find_path(
+    FFTW_INCLUDES
+    NAMES "fftw3.h"
+    PATHS ${PKG_FFTW_INCLUDE_DIRS} ${INCLUDE_INSTALL_DIR}
+  )
+
+endif( FFTW_ROOT )
+
+set(FFTW_LIBRARIES ${FFTW_LIB} ${FFTWF_LIB})
+
+if(FFTWL_LIB)
+  set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTWL_LIB})
+endif()
+
+set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV} )
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(FFTW DEFAULT_MSG
+                                  FFTW_INCLUDES FFTW_LIBRARIES)
+
+mark_as_advanced(FFTW_INCLUDES FFTW_LIBRARIES FFTW_LIB FFTWF_LIB FFTWL_LIB)
\ No newline at end of file
diff --git a/ecbuild/cmake/contrib/FindNetCDF4.cmake b/ecbuild/cmake/contrib/FindNetCDF4.cmake
new file mode 100644
index 0000000..33e7b36
--- /dev/null
+++ b/ecbuild/cmake/contrib/FindNetCDF4.cmake
@@ -0,0 +1,314 @@
+# Project uclales
+# http://gitorious.org/uclales
+# License: Academic Free License v3.0
+#
+# - Find NETCDF, a library for reading and writing self describing array data.
+#
+# This module invokes the NETCDF wrapper compiler that should be installed
+# alongside NETCDF.  Depending upon the NETCDF Configuration, the wrapper compiler
+# is called either h5cc or h5pcc.  If this succeeds, the module will then call
+# the compiler with the -show argument to see what flags are used when compiling
+# an NETCDF client application.
+#
+# The module will optionally accept the COMPONENTS argument.  If no COMPONENTS
+# are specified, then the find module will default to finding only the NETCDF C
+# library.  If one or more COMPONENTS are specified, the module will attempt to
+# find the language bindings for the specified components.  Currently, the only
+# valid components are C, CXX, FORTRAN and F90.
+#
+# On UNIX systems, this module will read the variable NETCDF_USE_STATIC_LIBRARIES
+# to determine whether or not to prefer a static link to a dynamic link for NETCDF
+# and all of it's dependencies.  To use this feature, make sure that the
+# NETCDF_USE_STATIC_LIBRARIES variable is set before the call to find_package.
+#
+# To provide the module with a hint about where to find your NETCDF installation,
+# you can set the environment variable NETCDF_ROOT.  The Find module will then
+# look in this path when searching for NETCDF executables, paths, and libraries.
+#
+# In addition to finding the includes and libraries required to compile an NETCDF
+# client application, this module also makes an effort to find tools that come
+# with the NETCDF distribution that may be useful for regression testing.
+#
+# This module will define the following variables:
+#  NETCDF_INCLUDE_DIRS - Location of the NETCDF includes
+#  NETCDF_INCLUDE_DIR - Location of the NETCDF includes (deprecated)
+#  NETCDF_DEFINITIONS - Required compiler definitions for NETCDF
+#  NETCDF_C_LIBRARIES - Required libraries for the NETCDF C bindings.
+#  NETCDF_CXX_LIBRARIES - Required libraries for the NETCDF C++ bindings
+#  NETCDF_FORTRAN_LIBRARIES - Required libraries for the NETCDF FORTRAN bindings
+#  NETCDF_F90_LIBRARIES - Required libraries for the NETCDF FORTRAN 90 bindings
+#  NETCDF_LIBRARIES - Required libraries for all requested bindings
+#  NETCDF_FOUND - true if NETCDF was found on the system
+#  NETCDF_LIBRARY_DIRS - the full set of library directories
+#  NETCDF_IS_PARALLEL - Whether or not NETCDF was found with parallel IO support
+#  NETCDF_CONFIG_EXECUTABLE - the path to the NC-CONFIG tool
+
+#=============================================================================
+# Copyright 2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+# This module is maintained by Thijs Heus <thijs.heus at zmaw.de>.
+
+include(SelectLibraryConfigurations)
+include(FindPackageHandleStandardArgs)
+
+# List of the valid NETCDF components
+set( NETCDF_VALID_COMPONENTS
+    FORTRAN
+    F90
+    CXX
+    C
+)
+
+# Invoke the NETCDF wrapper compiler.  The compiler return value is stored to the
+# return_value argument, the text output is stored to the output variable.
+macro( _NETCDF_CONFIG flag output return_value )
+    if( NETCDF_CONFIG_EXECUTABLE )
+        exec_program( ${NETCDF_CONFIG_EXECUTABLE}
+            ARGS ${flag}
+            OUTPUT_VARIABLE ${output}
+            RETURN_VALUE ${return_value}
+        )
+        if( ${${return_value}} EQUAL 0 )
+            # do nothing
+        else()
+            message( STATUS
+              "Unable to determine ${flag} from NC-CONFIG." )
+        endif()
+    endif()
+endmacro()
+#
+# try to find the NETCDF wrapper compilers
+find_program( NETCDF_CONFIG_EXECUTABLE
+    NAMES nc-config
+    HINTS ENV NETCDF_ROOT
+    PATHS
+    PATH_SUFFIXES bin Bin
+    DOC "NETCDF CONFIG PROGRAM.  Used only to detect NETCDF compile flags." )
+mark_as_advanced( NETCDF_CONFIG_EXECUTABLE )
+
+set(output "no")
+_NETCDF_CONFIG (--has-hdf5 output return)
+set(HAS_HDF5 FALSE)
+
+if(${output} STREQUAL yes)
+  set(HAS_HDF5 TRUE)
+  set(HDF5_FIND_QUIETLY ${NETCDF_FIND_QUIETLY})
+  set(HDF5_FIND_REQUIRED ${NETCDF_FIND_REQUIRED})
+  find_package(HDF5)
+#        list( APPEND NETCDF_LIBRARIES_DEBUG
+#            ${HDF5_LIBRARIES_DEBUG} )
+#        list( APPEND NETCDF_LIBRARIES_RELEASE
+#            ${HDF5_LIBRARIES_RELEASE} )
+  set (NETCDF_IS_PARALLEL ${HDF5_IS_PARALLEL})
+endif()
+_NETCDF_CONFIG (--has-pnetcdf output return)
+if(${output} STREQUAL yes)
+  set (NETCDF_IS_PARALLEL TRUE)
+else()
+#   set(NETCDF_IS_PARALLEL FALSE)
+endif()
+set( NETCDF_IS_PARALLEL TRUE CACHE BOOL
+    "NETCDF library compiled with parallel IO support" )
+
+
+if( NETCDF_INCLUDE_DIRS AND NETCDF_LIBRARIES )
+    # Do nothing: we already have NETCDF_INCLUDE_PATH and NETCDF_LIBRARIES in the
+    # cache, it would be a shame to override them
+else()
+    if( NOT NETCDF_FIND_COMPONENTS )
+        set( NETCDF_LANGUAGE_BINDINGS "C" )
+    else()
+        # add the extra specified components, ensuring that they are valid.
+        foreach( component ${NETCDF_FIND_COMPONENTS} )
+            list( FIND NETCDF_VALID_COMPONENTS ${component} component_location )
+            if( ${component_location} EQUAL -1 )
+                message( FATAL_ERROR
+                    "\"${component}\" is not a valid NETCDF component." )
+            else()
+                list( APPEND NETCDF_LANGUAGE_BINDINGS ${component} )
+            endif()
+        endforeach()
+    endif()
+
+    # seed the initial lists of libraries to find with items we know we need
+    set( NETCDF_C_INCLUDE_NAMES netcdf.h )
+    set( NETCDF_CXX_INCLUDE_NAMES netcdfcpp.h ${NETCDF_C_INCLUDE_NAMES} )
+    set( NETCDF_FORTRAN_INCLUDE_NAMES ${NETCDF_C_INCLUDE_NAMES} )
+    set( NETCDF_F90_INCLUDE_NAMES netcdf.mod typesizes.mod ${NETCDF_C_INCLUDE_NAMES} )
+
+    set( NETCDF_C_LIBRARY_NAMES netcdf)
+    set( NETCDF_CXX_LIBRARY_NAMES netcdf_c++ ${NETCDF_C_LIBRARY_NAMES} )
+    set( NETCDF_FORTRAN_LIBRARY_NAMES netcdff ${NETCDF_C_LIBRARY_NAMES})
+    set( NETCDF_F90_LIBRARY_NAMES ${NETCDF_FORTRAN_LIBRARY_NAMES} )
+
+    set( NETCDF_REQUIRED netcdf.h netcdfcpp.h netcdf.mod typesizes.mod netcdf netcdff netcdf_c++)
+
+    foreach( LANGUAGE ${NETCDF_LANGUAGE_BINDINGS} )
+      # debug_var(LANGUAGE)
+        set( NETCDF_${LANGUAGE}_FOUND 1 ) # disable this in following if necessary
+      
+        # find the NETCDF includes
+        foreach( INC ${NETCDF_${LANGUAGE}_INCLUDE_NAMES} )
+          find_path( NETCDF_${INC}_INCLUDE_DIR ${INC}
+              HINTS
+                  ${NETCDF_${LANGUAGE}_INCLUDE_FLAGS}
+                      ENV NETCDF_ROOT
+              PATHS
+              PATH_SUFFIXES
+                  include
+                  Include
+          )
+          mark_as_advanced( NETCDF_${INC}_INCLUDE_DIR )
+          # debug_var( NETCDF_${INC}_INCLUDE_DIR)
+          if (NETCDF_${INC}_INCLUDE_DIR)
+            list( APPEND NETCDF_INCLUDE_DIRS ${NETCDF_${INC}_INCLUDE_DIR} )
+          else()
+            list( FIND NETCDF_REQUIRED ${INC} location )
+            if( ${location} EQUAL -1 )
+              else()
+              if(NETCDF_FIND_REQUIRED)
+                message( SEND_ERROR "\"${INC}\" is not found for NetCDF component ${LANGUAGE}" )
+              elseif( NOT NETCDF_FIND_QUIETLY )
+                message( STATUS "\"${INC}\" is not found for NetCDF component ${LANGUAGE}" )
+              endif()
+              set( NETCDF_${LANGUAGE}_FOUND 0 )
+            else()
+            endif()
+          endif()
+        endforeach()
+        # find the NETCDF libraries
+        foreach( LIB ${NETCDF_${LANGUAGE}_LIBRARY_NAMES} )
+            if( UNIX AND NETCDF_USE_STATIC_LIBRARIES )
+                # According to bug 1643 on the CMake bug tracker, this is the
+                # preferred method for searching for a static library.
+                # See http://www.cmake.org/Bug/view.php?id=1643.  We search
+                # first for the full static library name, but fall back to a
+                # generic search on the name if the static search fails.
+                set( THIS_LIBRARY_SEARCH_DEBUG lib${LIB}d.a ${LIB}d )
+                set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a ${LIB} )
+            else()
+                set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d )
+                set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} )
+            endif()
+            find_library( NETCDF_${LIB}_LIBRARY_DEBUG
+                NAMES ${THIS_LIBRARY_SEARCH_DEBUG}
+                HINTS ${NETCDF_${LANGUAGE}_LIBRARY_DIRS}
+                ENV NETCDF_ROOT
+                PATHS
+                PATH_SUFFIXES lib64 Lib64 lib Lib)
+            find_library( NETCDF_${LIB}_LIBRARY_RELEASE
+                NAMES ${THIS_LIBRARY_SEARCH_RELEASE}
+                HINTS ${NETCDF_${LANGUAGE}_LIBRARY_DIRS}
+                ENV NETCDF_ROOT
+                PATHS
+                PATH_SUFFIXES lib64 Lib64 lib Lib )
+            select_library_configurations( NETCDF_${LIB} )
+            # even though we adjusted the individual library names in
+            # select_library_configurations, we still need to distinguish
+            # between debug and release variants because NETCDF_LIBRARIES will
+            # need to specify different lists for debug and optimized builds.
+            # We can't just use the NETCDF_${LIB}_LIBRARY variable (which was set
+            # up by the selection macro above) because it may specify debug and
+            # optimized variants for a particular library, but a list of
+            # libraries is allowed to specify debug and optimized only once.
+          if (NETCDF_${LIB}_LIBRARY_RELEASE)
+            list( APPEND NETCDF_LIBRARIES_RELEASE ${NETCDF_${LIB}_LIBRARY_RELEASE} )
+            list( APPEND NETCDF_${LANGUAGE}_LIBRARIES_RELEASE ${NETCDF_${LIB}_LIBRARY_RELEASE} )
+          endif()
+          if (NETCDF_${LIB}_LIBRARY_DEBUG)
+            list( APPEND NETCDF_LIBRARIES_DEBUG ${NETCDF_${LIB}_LIBRARY_DEBUG} )
+            list( APPEND NETCDF_${LANGUAGE}_LIBRARIES_DEBUG ${NETCDF_${LIB}_LIBRARY_DEBUG} )
+          endif()
+          if (NETCDF_${LIB}_LIBRARY_RELEASE OR NETCDF_${LIB}_LIBRARY_DEBUG )
+          else()
+            # message( STATUS "\"${LIB}\" is not found." )
+            list( FIND NETCDF_REQUIRED ${LIB} location )
+            if( ${location} EQUAL -1 )
+            else()
+              if(NETCDF_FIND_REQUIRED)
+                message( SEND_ERROR "\"${LIB}\" is not found for NetCDF component ${LANGUAGE}." )
+              elseif( NOT NETCDF_FIND_QUIETLY )
+                message( STATUS "\"${LIB}\" is not found for NetCDF component ${LANGUAGE}." )
+              else()
+                set( NETCDF_${LANGUAGE}_FOUND 0 )
+              endif()
+           endif()
+          endif()
+        endforeach()
+        list( APPEND NETCDF_LIBRARY_DIRS ${NETCDF_${LANGUAGE}_LIBRARY_DIRS} )
+
+        # Append the libraries for this language binding to the list of all
+        # required libraries.
+        
+        # debug_var( NETCDF_${LANGUAGE}_FOUND )
+        if( NETCDF_${LANGUAGE}_FOUND )
+            if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
+                list( APPEND NETCDF_${LANGUAGE}_LIBRARIES 
+                    debug ${NETCDF_${LANGUAGE}_LIBRARIES_DEBUG}
+                    optimized ${NETCDF_${LANGUAGE}_LIBRARIES_RELEASE} )
+            else()
+                list( APPEND NETCDF_${LANGUAGE}_LIBRARIES 
+                    ${NETCDF_${LANGUAGE}_LIBRARIES_RELEASE} )                  
+            endif()
+        endif()
+        # debug_var( NETCDF_${LANGUAGE}_LIBRARIES )
+        list( APPEND NETCDF_FOUND_REQUIRED_VARS NETCDF_${LANGUAGE}_FOUND )
+    endforeach()
+
+    # We may have picked up some duplicates in various lists during the above
+    # process for the language bindings (both the C and C++ bindings depend on
+    # libz for example).  Remove the duplicates.
+    if( NETCDF_INCLUDE_DIRS )
+        list( REMOVE_DUPLICATES NETCDF_INCLUDE_DIRS )
+    endif()
+    if( NETCDF_LIBRARIES_DEBUG )
+        list( REMOVE_DUPLICATES NETCDF_LIBRARIES_DEBUG )
+    endif()
+    if( NETCDF_LIBRARIES_RELEASE )
+        list( REMOVE_DUPLICATES NETCDF_LIBRARIES_RELEASE )
+    endif()
+    if( NETCDF_LIBRARY_DIRS )
+        list( REMOVE_DUPLICATES NETCDF_LIBRARY_DIRS )
+    endif()
+
+    # Construct the complete list of NETCDF libraries with debug and optimized
+    # variants when the generator supports them.
+    if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
+        set( NETCDF_LIBRARIES
+            debug ${NETCDF_LIBRARIES_DEBUG}
+            optimized ${NETCDF_LIBRARIES_RELEASE} )
+    else()
+        set( NETCDF_LIBRARIES ${NETCDF_LIBRARIES_RELEASE} )
+    endif()
+endif()
+
+set( NETCDF4_FIND_QUIETLY ${NETCDF_FIND_QUIETLY} )
+set( NETCDF4_FIND_REQUIRED ${NETCDF_FIND_REQUIRED} )
+find_package_handle_standard_args( NETCDF4 DEFAULT_MSG
+    ${NETCDF_FOUND_REQUIRED_VARS}
+    NETCDF_LIBRARIES
+    NETCDF_INCLUDE_DIRS
+)
+
+mark_as_advanced(
+    NETCDF_INCLUDE_DIRS
+    NETCDF_LIBRARIES
+    NETCDF_LIBRARY_DIRS
+)
+
+set( NETCDF_FOUND ${NETCDF4_FOUND} )
+
+# For backwards compatibility we set NETCDF_INCLUDE_DIR to the value of
+# NETCDF_INCLUDE_DIRS
+set( NETCDF_INCLUDE_DIR "${NETCDF_INCLUDE_DIRS}" )
+
diff --git a/ecbuild/cmake/contrib/FindNumPy.cmake b/ecbuild/cmake/contrib/FindNumPy.cmake
new file mode 100644
index 0000000..ba02cec
--- /dev/null
+++ b/ecbuild/cmake/contrib/FindNumPy.cmake
@@ -0,0 +1,101 @@
+# - Find the NumPy libraries
+# This module finds if NumPy is installed, and sets the following variables
+# indicating where it is.
+#
+# TODO: Update to provide the libraries and paths for linking npymath lib.
+#
+#  NUMPY_FOUND               - was NumPy found
+#  NUMPY_VERSION             - the version of NumPy found as a string
+#  NUMPY_VERSION_MAJOR       - the major version number of NumPy
+#  NUMPY_VERSION_MINOR       - the minor version number of NumPy
+#  NUMPY_VERSION_PATCH       - the patch version number of NumPy
+#  NUMPY_VERSION_DECIMAL     - e.g. version 1.6.1 is 10601
+#  NUMPY_INCLUDE_DIRS        - path to the NumPy include files
+
+#============================================================================
+# Copyright 2012 Continuum Analytics, Inc.
+#
+# MIT License
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+#============================================================================
+
+# Finding NumPy involves calling the Python interpreter
+if(NumPy_FIND_REQUIRED)
+    find_package(PythonInterp REQUIRED)
+else()
+    find_package(PythonInterp)
+endif()
+
+if(NOT PYTHONINTERP_FOUND)
+    set(NUMPY_FOUND FALSE)
+    return()
+endif()
+
+execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c"
+    "import numpy as n; print(n.__version__); print(n.get_include());"
+    RESULT_VARIABLE _NUMPY_SEARCH_SUCCESS
+    OUTPUT_VARIABLE _NUMPY_VALUES_OUTPUT
+    ERROR_VARIABLE _NUMPY_ERROR_VALUE
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if(NOT _NUMPY_SEARCH_SUCCESS MATCHES 0)
+    if(NumPy_FIND_REQUIRED)
+        message(FATAL_ERROR
+            "NumPy import failure:\n${_NUMPY_ERROR_VALUE}")
+    endif()
+    set(NUMPY_FOUND FALSE)
+    return()
+endif()
+
+# Convert the process output into a list
+string(REGEX REPLACE ";" "\\\\;" _NUMPY_VALUES ${_NUMPY_VALUES_OUTPUT})
+string(REGEX REPLACE "\n" ";" _NUMPY_VALUES ${_NUMPY_VALUES})
+# Just in case there is unexpected output from the Python command.
+list(GET _NUMPY_VALUES -2 NUMPY_VERSION)
+list(GET _NUMPY_VALUES -1 NUMPY_INCLUDE_DIRS)
+
+string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" _VER_CHECK "${NUMPY_VERSION}")
+if("${_VER_CHECK}" STREQUAL "")
+    # The output from Python was unexpected. Raise an error always
+    # here, because we found NumPy, but it appears to be corrupted somehow.
+    message(FATAL_ERROR
+        "Requested version and include path from NumPy, got instead:\n${_NUMPY_VALUES_OUTPUT}\n")
+    return()
+endif()
+
+# Make sure all directory separators are '/'
+string(REGEX REPLACE "\\\\" "/" NUMPY_INCLUDE_DIRS ${NUMPY_INCLUDE_DIRS})
+
+# Get the major and minor version numbers
+string(REGEX REPLACE "\\." ";" _NUMPY_VERSION_LIST ${NUMPY_VERSION})
+list(GET _NUMPY_VERSION_LIST 0 NUMPY_VERSION_MAJOR)
+list(GET _NUMPY_VERSION_LIST 1 NUMPY_VERSION_MINOR)
+list(GET _NUMPY_VERSION_LIST 2 NUMPY_VERSION_PATCH)
+string(REGEX MATCH "[0-9]*" NUMPY_VERSION_PATCH ${NUMPY_VERSION_PATCH})
+math(EXPR NUMPY_VERSION_DECIMAL
+    "(${NUMPY_VERSION_MAJOR} * 10000) + (${NUMPY_VERSION_MINOR} * 100) + ${NUMPY_VERSION_PATCH}")
+
+find_package_message(NUMPY
+    "Found NumPy: version \"${NUMPY_VERSION}\" ${NUMPY_INCLUDE_DIRS}"
+    "${NUMPY_INCLUDE_DIRS}${NUMPY_VERSION}")
+
+set(NUMPY_FOUND TRUE)
\ No newline at end of file
diff --git a/ecbuild/cmake/contrib/GetGitRevisionDescription.cmake b/ecbuild/cmake/contrib/GetGitRevisionDescription.cmake
new file mode 100644
index 0000000..ea1da07
--- /dev/null
+++ b/ecbuild/cmake/contrib/GetGitRevisionDescription.cmake
@@ -0,0 +1,123 @@
+# - Returns a version string from Git
+#
+# These functions force a re-configure on each git commit so that you can
+# trust the values of the variables in your build system.
+#
+#  get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
+#
+# Returns the refspec and sha hash of the current head revision
+#
+#  git_describe(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe on the source tree, and adjusting
+# the output so that it tests false if an error occurs.
+#
+#  git_get_exact_tag(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe --exact-match on the source tree,
+# and adjusting the output so that it tests false if there was no exact
+# matching tag.
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik at iastate.edu> <abiryan at ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+if(__get_git_revision_description)
+    return()
+endif()
+set(__get_git_revision_description YES)
+
+# We must run the following at "include" time, not at function call time,
+# to find the path to this module rather than the path to a calling list file
+get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
+
+function(get_git_head_revision _refspecvar _hashvar)
+    set(GIT_PARENT_DIR "${PROJECT_SOURCE_DIR}")
+    set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+    while(NOT EXISTS "${GIT_DIR}")  # .git dir not found, search parent directories
+        set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
+        get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
+        if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
+            # We have reached the root directory, we are not in git
+            set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
+            set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
+            return()
+        endif()
+        set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+    endwhile()
+    set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
+    if(NOT EXISTS "${GIT_DATA}")
+        file(MAKE_DIRECTORY "${GIT_DATA}")
+    endif()
+
+    if(NOT EXISTS "${GIT_DIR}/HEAD")
+        return()
+    endif()
+    set(HEAD_FILE "${GIT_DATA}/HEAD")
+    configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
+
+    configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
+        "${GIT_DATA}/grabRef.cmake"
+        @ONLY)
+    include("${GIT_DATA}/grabRef.cmake")
+
+    set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
+    set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
+endfunction()
+
+function(git_describe _var)
+    if(NOT GIT_FOUND)
+        find_package(Git QUIET)
+    endif()
+    get_git_head_revision(refspec hash)
+    if(NOT GIT_FOUND)
+        set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
+        return()
+    endif()
+    if(NOT hash)
+        set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
+        return()
+    endif()
+
+    # TODO sanitize
+    #if((${ARGN}" MATCHES "&&") OR
+    #   (ARGN MATCHES "||") OR
+    #   (ARGN MATCHES "\\;"))
+    #   message("Please report the following error to the project!")
+    #   message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
+    #endif()
+
+    #message(STATUS "Arguments to execute_process: ${ARGN}")
+
+    execute_process(COMMAND
+        "${GIT_EXECUTABLE}"
+        describe
+        ${hash}
+        ${ARGN}
+        WORKING_DIRECTORY
+        "${CMAKE_SOURCE_DIR}"
+        RESULT_VARIABLE
+        res
+        OUTPUT_VARIABLE
+        out
+        ERROR_QUIET
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    if(NOT res EQUAL 0)
+        set(out "${out}-${res}-NOTFOUND")
+    endif()
+
+    set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
+
+function(git_get_exact_tag _var)
+    git_describe(out --exact-match ${ARGN})
+    set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
diff --git a/ecbuild/cmake/contrib/GetGitRevisionDescription.cmake.in b/ecbuild/cmake/contrib/GetGitRevisionDescription.cmake.in
new file mode 100644
index 0000000..7a3e42f
--- /dev/null
+++ b/ecbuild/cmake/contrib/GetGitRevisionDescription.cmake.in
@@ -0,0 +1,38 @@
+#
+# Internal file for GetGitRevisionDescription.cmake
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik at iastate.edu> <abiryan at ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+set(HEAD_HASH)
+
+file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
+
+string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
+if(HEAD_CONTENTS MATCHES "ref")
+    # named branch
+    string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
+    if(EXISTS "@GIT_DIR@/${HEAD_REF}")
+        configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+    elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}")
+        configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+        set(HEAD_HASH "${HEAD_REF}")
+    endif()
+else()
+    # detached HEAD
+    configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
+endif()
+
+if(NOT HEAD_HASH)
+    file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
+    string(STRIP "${HEAD_HASH}" HEAD_HASH)
+endif()
\ No newline at end of file
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/.gitattributes b/ecbuild/cmake/contrib/GreatCMakeCookOff/.gitattributes
new file mode 100644
index 0000000..0b6acf1
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/.gitattributes
@@ -0,0 +1,22 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs     diff=csharp
+*.sln    merge=union
+*.csproj merge=union
+*.vbproj merge=union
+*.fsproj merge=union
+*.dbproj merge=union
+
+# Standard to msysgit
+*.doc  diff=astextplain
+*.DOC  diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot  diff=astextplain
+*.DOT  diff=astextplain
+*.pdf  diff=astextplain
+*.PDF  diff=astextplain
+*.rtf  diff=astextplain
+*.RTF  diff=astextplain
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/.gitignore b/ecbuild/cmake/contrib/GreatCMakeCookOff/.gitignore
new file mode 100644
index 0000000..8a94597
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/.gitignore
@@ -0,0 +1,6 @@
+build/
+.*.swp
+.*.swo
+*.pyc
+wiki
+*.*~
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake
new file mode 100644
index 0000000..2a11e04
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake
@@ -0,0 +1,56 @@
+include(CheckCXXCompilerFlag)
+
+#�On older cmake versions + newer compilers, 
+#�the given version of CheckCXXCompilerFlags does not quite work.
+if(CMAKE_VERSION VERSION_LESS 2.8.9)
+  macro (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT)
+     set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
+     set(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
+     CHECK_CXX_SOURCE_COMPILES("int main() { return 0;}" ${_RESULT}
+       # Some compilers do not fail with a bad flag
+       FAIL_REGEX "command line option .* is valid for .* but not for C\\\\+\\\\+" # GNU
+       FAIL_REGEX "unrecognized .*option"                     # GNU
+       FAIL_REGEX "unknown .*option"                          # Clang
+       FAIL_REGEX "ignoring unknown option"                   # MSVC
+       FAIL_REGEX "warning D9002"                             # MSVC, any lang
+       FAIL_REGEX "option.*not supported"                     # Intel
+       FAIL_REGEX "invalid argument .*option"                 # Intel
+       FAIL_REGEX "ignoring option .*argument required"       # Intel
+       FAIL_REGEX "[Uu]nknown option"                         # HP
+       FAIL_REGEX "[Ww]arning: [Oo]ption"                     # SunPro
+       FAIL_REGEX "command option .* is not recognized"       # XL
+       FAIL_REGEX "not supported in this configuration; ignored"       # AIX
+       FAIL_REGEX "File with unknown suffix passed to linker" # PGI
+       FAIL_REGEX "WARNING: unknown flag:"                    # Open64
+       )
+     set (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
+  endmacro ()
+endif(CMAKE_VERSION VERSION_LESS 2.8.9)
+
+check_cxx_compiler_flag(-std=c++11 has_std_cpp11)
+check_cxx_compiler_flag(-std=c++0x has_std_cpp0x)
+if(MINGW) 
+  check_cxx_compiler_flag(-std=gnu++11 has_std_gnupp11)
+  check_cxx_compiler_flag(-std=gnu++0x has_std_gnupp0x)
+endif(MINGW)
+if(has_std_gnupp11)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
+elseif(has_std_gnupp0x)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
+elseif(has_std_cpp11) 
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+elseif(has_std_cpp0x)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+endif(has_std_gnupp11)
+
+if(MSVC) 
+  set(MSWINDOBE TRUE)
+  add_definitions(/EHsc)
+  # Wd4251 stops MSCrapWare from issuing meaningless warnings. Seems Microsoft engineers don't grok
+  # dynamic libraries yet. Or templates. Or both acting alone or together. In any case, issuing
+  # warning sure is easier on them than fixing  their OS.
+  # Unfortunately, it does disable warnings that may be of interest. Possibly. 
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_VARIADIC_MAX=10 /wd4251")
+endif(MSVC)
+
+set(PROJECT_USES_CPP11 True CACHE INTERNAL "Uses c++11.")
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/AddGTest.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/AddGTest.cmake
new file mode 100644
index 0000000..7db9357
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/AddGTest.cmake
@@ -0,0 +1,72 @@
+# CMake arguments for gtest.
+set(GTEST_CMAKE_ARGS 
+      -DBUILD_SHARED_LIBS=OFF
+      -Dgtest_force_shared_crt=ON
+      -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+      -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
+      -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+      -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
+      -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
+      -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWIDTHDEBINFO}
+      -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
+      -DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL})
+if(MINGW)
+  list(APPEND GTEST_CMAKE_ARGS -Dgtest_disable_pthreads=ON)
+else(MINGW)
+  find_package(Threads)
+endif(MINGW)
+
+
+# Add gtest
+if(NOT EXTERNAL_ROOT)
+  set(EXTERNAL_ROOT ${PROJECT_BINARY_DIR}/external)
+endif(NOT EXTERNAL_ROOT)
+include(ExternalProject)
+ExternalProject_Add(
+    googletest
+    PREFIX ${EXTERNAL_ROOT}
+    SVN_REPOSITORY http://googletest.googlecode.com/svn/trunk/
+    TIMEOUT 10
+    # Force separate output paths for debug and release builds to allow easy
+    # identification of correct lib in subsequent TARGET_LINK_LIBRARIES commands
+    CMAKE_ARGS ${GTEST_CMAKE_ARGS}
+    # Disable install step
+    INSTALL_COMMAND ""
+    # Wrap download, configure and build steps in a script to log output
+    LOG_DOWNLOAD ON
+    LOG_CONFIGURE ON
+    LOG_BUILD ON)
+
+if(PROJECT_USES_CPP11)
+  add_definitions(-DGTEST_LANG_CXX11)
+endif(PROJECT_USES_CPP11)
+
+macro(add_gtest name source)
+
+  ExternalProject_Get_Property(googletest source_dir)
+  include_directories(${source_dir}/include)
+  # Better, but only works on CMake 2.8.6?
+  # get_target_property(THISTEST_INCLUDE test_${name} INCLUDE_DIRECTORIES)
+  # set_target_properties(test_${name} PROPERTIES INCLUDE_DIRECTORIES
+  #                       "${source_dir}/include;${THISTEST_INCLUDE}") 
+
+  add_executable(test_${name} ${source})
+  ExternalProject_Get_Property(googletest binary_dir)
+  if(MSVC)
+    target_link_libraries(test_${name} ${binary_dir}/${CMAKE_CFG_INTDIR}/gtest.lib)
+  else(MSVC)
+    target_link_libraries(test_${name} ${binary_dir}/libgtest.a)
+  endif(MSVC)
+  if(CMAKE_THREAD_LIBS_INIT)
+    target_link_libraries(test_${name} ${CMAKE_THREAD_LIBS_INIT})
+  endif(CMAKE_THREAD_LIBS_INIT)
+
+  add_dependencies(test_${name} googletest)
+  if(NOT "${ARGN}" STREQUAL "")
+    target_link_libraries(test_${name} ${ARGN})
+  endif(NOT "${ARGN}" STREQUAL "")
+
+  add_test(cxx_${name} ${EXECUTABLE_OUTPUT_PATH}/test_${name}
+              --gtest_output=xml:${CMAKE_BINARY_DIR}/test-results/test_${name}.xml)
+  set_tests_properties(cxx_${name} PROPERTIES LABELS "gtest")
+endmacro()
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake
new file mode 100644
index 0000000..71fa610
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake
@@ -0,0 +1,197 @@
+# Checks for C++11 features
+# 
+# USAGE: There are two functions
+#
+# cxx11_find_all_features(OUTPUT_VARIABLE) 
+# This function returns a variable with all possible features.
+#
+# cxx11_feature_check([feature feature] [REQUIRED [feature feature]])
+# If no arguments are provided, then checks all available features
+# Features appeacing before REQUIRED are optional.
+# If arguments are provided and those features are available, sets 
+# the variable HAS_CXX11_FEATURENAME, where FEATURENAME is the input in capital letters.
+# Fails if required feature are not available
+#
+# For possible features, please print out the result from the first function.
+#
+# Original script by Rolf Eike Beer
+# Modifications by Andreas Weis
+# Further Modifications by RSDT at UCL
+
+set(CPP11_FEATURE_CHECK_DIR ${CMAKE_CURRENT_LIST_DIR}/cpp11 CACHE INTERNAL "c++11 file directory")
+
+MACRO(cxx11_check_single_feature FEATURE_NAME FEATURE_NUMBER RESULT_VAR)
+	IF (NOT DEFINED ${RESULT_VAR})
+    SET(_bindir "${CMAKE_BINARY_DIR}/cxx11_feature_tests/cxx11_${FEATURE_NAME}")
+
+		IF (${FEATURE_NUMBER})
+      SET(_SRCFILE_BASE ${CPP11_FEATURE_CHECK_DIR}/${FEATURE_NAME}-N${FEATURE_NUMBER})
+			SET(_LOG_NAME "\"${FEATURE_NAME}\" (N${FEATURE_NUMBER})")
+		ELSE (${FEATURE_NUMBER})
+      SET(_SRCFILE_BASE ${CPP11_FEATURE_CHECK_DIR}/${FEATURE_NAME})
+			SET(_LOG_NAME "\"${FEATURE_NAME}\"")
+		ENDIF (${FEATURE_NUMBER})
+		MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME}")
+
+		SET(_SRCFILE "${_SRCFILE_BASE}.cpp")
+		SET(_SRCFILE_FAIL "${_SRCFILE_BASE}_fail.cpp")
+		SET(_SRCFILE_FAIL_COMPILE "${_SRCFILE_BASE}_fail_compile.cpp")
+
+		IF (CROSS_COMPILING)
+			try_compile(${RESULT_VAR} "${_bindir}" "${_SRCFILE}")
+			IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+				try_compile(${RESULT_VAR} "${_bindir}_fail" "${_SRCFILE_FAIL}")
+			ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+		ELSE (CROSS_COMPILING)
+			try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
+					"${_bindir}" "${_SRCFILE}")
+			IF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+				SET(${RESULT_VAR} TRUE)
+			ELSE (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+				SET(${RESULT_VAR} FALSE)
+			ENDIF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+			IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+				try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
+						"${_bindir}_fail" "${_SRCFILE_FAIL}")
+				IF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+					SET(${RESULT_VAR} TRUE)
+				ELSE (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+					SET(${RESULT_VAR} FALSE)
+				ENDIF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+			ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+		ENDIF (CROSS_COMPILING)
+		IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
+			try_compile(_TMP_RESULT "${_bindir}_fail_compile" "${_SRCFILE_FAIL_COMPILE}")
+			IF (_TMP_RESULT)
+				SET(${RESULT_VAR} FALSE)
+			ELSE (_TMP_RESULT)
+				SET(${RESULT_VAR} TRUE)
+			ENDIF (_TMP_RESULT)
+		ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
+
+		IF (${RESULT_VAR})
+			MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME} -- works")
+		ELSE (${RESULT_VAR})
+			MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME} -- not supported")
+		ENDIF (${RESULT_VAR})
+		SET(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++11 support for ${_LOG_NAME}")
+	ENDIF (NOT DEFINED ${RESULT_VAR})
+ENDMACRO(cxx11_check_single_feature)
+
+# Find list of all features
+function(cxx11_find_all_features outvar)
+  FILE(GLOB ALL_CPP11_FEATURE_FILES "${CPP11_FEATURE_CHECK_DIR}/*.cpp")
+  set(OUTPUT_VARIABLES)
+  foreach(filename ${ALL_CPP11_FEATURE_FILES})
+    get_filename_component(filename ${filename} NAME_WE)
+    string(REGEX REPLACE "_fail_compile" "" filename "${filename}")
+    string(REGEX REPLACE "_fail" "" filename "${filename}")
+    string(REGEX REPLACE "-N[0-9]*" "" filename "${filename}")
+    set(OUTPUT_VARIABLES ${OUTPUT_VARIABLES} ${filename})
+  endforeach()
+  list(REMOVE_DUPLICATES OUTPUT_VARIABLES)
+  set(${outvar} ${OUTPUT_VARIABLES} PARENT_SCOPE)
+endfunction()
+
+# Parses input and separates into arguments before REQUIRED and after REQUIRED.
+# Arguments before REQUIRED are OPTIONALS.
+# Arguments after REQUIRED are REQUIRED.
+# If no arguments, then sets output OPTIONALS to ALLFEATURES.
+function(parse_input_features ALLFEATURES OPTIONALS REQUIRED ERRORS)
+
+  if("${ARGN}" STREQUAL "")
+    set(${OPTIONALS} ${ALLFEATURES} PARENT_SCOPE)
+    set(${REQUIRED} "" PARENT_SCOPE)
+  else()
+    set(REQUIRED_FEATURES)
+    set(OPTIONAL_FEATURES)
+    set(UNKNOWN_FEATURES)
+    set(result_type OPTIONAL_FEATURES)
+    foreach(feature ${ARGN})
+      if(${feature} STREQUAL "REQUIRED")
+        set(result_type REQUIRED_FEATURES)
+      else()
+        list(FIND ALLFEATURES ${feature} feature_was_found)
+
+        if(feature_was_found EQUAL -1)
+          list(APPEND UNKNOWN_FEATURES ${feature})
+        else()
+          list(APPEND ${result_type} ${feature})
+        endif()
+
+      endif(${feature} STREQUAL "REQUIRED")
+    endforeach()
+
+    set(${OPTIONALS} ${OPTIONAL_FEATURES} PARENT_SCOPE)
+    set(${REQUIRED} ${REQUIRED_FEATURES} PARENT_SCOPE)
+    set(${ERRORS} ${UNKNOWN_FEATURES} PARENT_SCOPE)
+  endif("${ARGN}" STREQUAL "")
+endfunction(parse_input_features)
+
+# Figures out name and number of feature
+# then calls macro that does the work
+macro(_figure_out_cxx11_feature current_feature)
+  # Find set of files that match current_feature, excepting _fail and _fail_compile.
+  file(GLOB ALL_FEATURE_FILES "${CPP11_FEATURE_CHECK_DIR}/${current_feature}*.cpp")
+  foreach(filename ${ALL_FEATURE_FILES})
+    if(filename MATCHES "_fail")
+      list(REMOVE_ITEM ALL_FEATURE_FILES ${filename})
+    endif()
+  endforeach()
+  
+  list(LENGTH ALL_FEATURE_FILES NFILES)
+  if(NOT ${NFILES} EQUAL 1)
+    message(FATAL_ERROR "[c++11] Expected to find only one feature. Found ${NFILES} -- ${ALL_FEATURE_FILES}.")
+  endif(NOT ${NFILES} EQUAL 1)
+  
+  # Now we know which file corresponds to option.
+  get_filename_component(basename ${ALL_FEATURE_FILES} NAME_WE)
+  # If has feature number, extract it
+  set(number "")
+  if(basename MATCHES "-N[0-9]*$")
+    string(REGEX REPLACE "${current_feature}-N" "" number "${basename}")
+  endif()
+  # Then call macro
+  string(TOUPPER ${current_feature} UPPER_OPTIONAL)
+  set(VARNAME HAS_CXX11_${UPPER_OPTIONAL})
+  cxx11_check_single_feature(${current_feature} "${number}" ${VARNAME})
+endmacro(_figure_out_cxx11_feature)
+
+function(cxx11_feature_check)
+
+  # find all features
+  cxx11_find_all_features(ALL_CPP11_FEATURES)
+
+  # Parses input to this function.
+  parse_input_features("${ALL_CPP11_FEATURES}" OPTIONALS REQUIRED ERRORS ${ARGN})
+  if(NOT ${ERRORS} STREQUAL "")
+    message(STATUS "[c++11] The following features are unknown: ${ERRORS}.")
+  endif()
+
+  # MinGW has not implemented std::random_device fully yet. Unfortunately, this can only be detected
+  # by running a program which tries to call std::random_device. However that generates an error that
+  # is *not* caught by CMake's try_run. 
+  if(MSYS)
+    list(REMOVE_ITEM OPTIONALS "random_device")
+    list(FIND REQUIRED "random_device" feature_was_found)
+    if(NOT feature_was_found EQUAL "-1")
+      message(FATAL_ERROR "[c++1] MSYS does not implement Random devices fully.\n"
+                          "       It cannot be required on this system.")
+    endif()
+  endif()
+
+  # Check optional features
+  foreach(current_feature ${OPTIONALS})
+    _figure_out_cxx11_feature(${current_feature})
+  endforeach(current_feature ${ARGN})
+
+  # Check required features
+  foreach(current_feature ${REQUIRED})
+    _figure_out_cxx11_feature(${current_feature})
+    set(VARNAME HAS_CXX11_${UPPER_OPTIONAL})
+    if(NOT ${VARNAME})
+      message(FATAL_ERROR "[c++11] Required feature ${current_feature} is not available.")
+    endif(NOT ${VARNAME})
+  endforeach(current_feature ${REQUIRED})
+
+endfunction(cxx11_feature_check)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/CheckIsNaN.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/CheckIsNaN.cmake
new file mode 100644
index 0000000..bc74e08
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/CheckIsNaN.cmake
@@ -0,0 +1,53 @@
+# Tries and find which isnan to use
+# defines ISNAN_VARIATION, which should be included in a configuration files somewher as
+#   @ISNAN_VARIATION@
+if(ISNAN_VARIATION)
+  return()
+endif(ISNAN_VARIATION)
+
+include(CheckCXXSourceCompiles)
+CHECK_CXX_SOURCE_COMPILES(
+  "#include <cmath>\nint main() { bool a = std::isnan(0e0); return 0; }\n" 
+  CXX_HAS_STD_ISNAN)
+
+if(NOT CXX_HAS_STD_ISNAN)
+  CHECK_CXX_SOURCE_COMPILES(
+    "#include <math.h>\nint main() { bool a = isnan(0e0); return 0; }\n" 
+    CXX_HAS_ISNAN)
+endif(NOT CXX_HAS_STD_ISNAN)
+
+if(NOT CXX_HAS_STD_ISNAN AND NOT CXX_HAS_ISNAN)
+  CHECK_CXX_SOURCE_COMPILES(
+    "#include <math.h>\nint main() { bool a = _isnan(0e0); return 0; }\n" 
+    CXX_HAS___ISNAN)
+endif(NOT CXX_HAS_STD_ISNAN AND NOT CXX_HAS_ISNAN)
+
+if(NOT CXX_HAS_STD_ISNAN AND NOT CXX_HAS_ISNAN)
+  CHECK_CXX_SOURCE_COMPILES(
+    "# include <float.h>\nint main() { bool a = _isnan(0e0); return 0; }\n" 
+    CXX_HAS_FLOAT_H_ISNAN)
+endif(NOT CXX_HAS_STD_ISNAN AND NOT CXX_HAS_ISNAN)
+
+if(NOT CXX_HAS_STD_ISNAN AND NOT CXX_HAS_ISNAN AND NOT CXX_HAS___ISNAN AND NOT CXX_HAS_FLOAT_H_ISNAN)
+  message(FATAL_ERROR "[isnan] could not find standard function on this OS.")
+endif(NOT CXX_HAS_STD_ISNAN AND NOT CXX_HAS_ISNAN AND NOT CXX_HAS___ISNAN AND NOT CXX_HAS_FLOAT_H_ISNAN)
+
+if(CXX_HAS_STD_ISNAN)
+  set(ISNAN_HEADERS "#include <cmath>")
+  set(ISNAN_VARIATION "std::isnan")
+elseif(CXX_HAS_ISNAN)
+  set(ISNAN_HEADERS "#include <math.h>")
+  set(ISNAN_VARIATION "::isnan")
+elseif(CXX_HAS___ISNAN)
+  set(ISNAN_HEADERS "#include <math.h>")
+  set(ISNAN_VARIATION "__isnan")
+elseif(CXX_HAS_FLOAT_H_ISNAN)
+  set(ISNAN_HEADERS "#include <float.h>")
+  set(ISNAN_VARIATION "_isnan")
+else()
+  message(FATAL_ERROR "AM HERE")
+endif()
+if(ISNAN_VARIATION)
+  set(ISNAN_VARIATION ${ISNAN_VARIATION} CACHE INTERNAL "Definition for isnan\n")
+  set(ISNAN_HEADERS ${ISNAN_HEADERS} CACHE INTERNAL "Headers containing isnan definition\n")
+endif(ISNAN_VARIATION)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/FindEigen.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/FindEigen.cmake
new file mode 100644
index 0000000..646d5dd
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/FindEigen.cmake
@@ -0,0 +1,131 @@
+# - Try to find Eigen3 lib
+#
+# This module supports requiring a minimum version, e.g. you can do
+#   find_package(Eigen3 3.1.2)
+# to require version 3.1.2 or newer of Eigen3.
+#
+# Once done this will define
+#
+#  EIGEN3_FOUND - system has eigen lib with correct version
+#  EIGEN3_INCLUDE_DIR - the eigen include directory
+#  EIGEN3_VERSION - eigen version
+
+# Copyright (c) 2006, 2007 Montel Laurent, <montel at kde.org>
+# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael at free.fr>
+# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
+# Modified by RSDT at UCL 
+
+if(NOT Eigen3_FIND_VERSION)
+  if(NOT Eigen3_FIND_VERSION_MAJOR)
+    set(Eigen3_FIND_VERSION_MAJOR 2)
+  endif(NOT Eigen3_FIND_VERSION_MAJOR)
+  if(NOT Eigen3_FIND_VERSION_MINOR)
+    set(Eigen3_FIND_VERSION_MINOR 91)
+  endif(NOT Eigen3_FIND_VERSION_MINOR)
+  if(NOT Eigen3_FIND_VERSION_PATCH)
+    set(Eigen3_FIND_VERSION_PATCH 0)
+  endif(NOT Eigen3_FIND_VERSION_PATCH)
+
+  set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
+endif(NOT Eigen3_FIND_VERSION)
+
+macro(_eigen3_check_version)
+  file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
+
+  string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
+  set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
+
+  set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
+  if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK FALSE)
+  else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK TRUE)
+  endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+
+  if(NOT EIGEN3_VERSION_OK)
+
+    message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
+                   "but at least version ${Eigen3_FIND_VERSION} is required")
+  endif(NOT EIGEN3_VERSION_OK)
+endmacro(_eigen3_check_version)
+
+if(NOT EIGEN3_INCLUDE_DIR)
+  if(NOT "$ENV{EIGEN3_INCLUDE_DIR}" STREQUAL "")
+    set(EIGEN3_INCLUDE_DIR $ENV{EIGEN3_INCLUDE_DIR})
+  endif(NOT "$ENV{EIGEN3_INCLUDE_DIR}" STREQUAL "")
+endif(NOT EIGEN3_INCLUDE_DIR)
+if (EIGEN3_INCLUDE_DIR)
+
+  # in cache already
+  _eigen3_check_version()
+  set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
+
+else (EIGEN3_INCLUDE_DIR)
+
+  find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
+      PATHS
+      $ENV{HOME}/usr/include
+      ${CMAKE_INSTALL_PREFIX}/include
+      ${KDE4_INCLUDE_DIR}
+      /usr/include
+      /usr/local/include
+      ${EXTERNAL_ROOT}/include
+      PATH_SUFFIXES eigen3 eigen
+    )
+
+  if(EIGEN3_INCLUDE_DIR)
+    _eigen3_check_version()
+  endif(EIGEN3_INCLUDE_DIR)
+
+  include(FindPackageHandleStandardArgs)
+  find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
+
+  mark_as_advanced(EIGEN3_INCLUDE_DIR)
+
+endif(EIGEN3_INCLUDE_DIR)
+
+if(NOT EIGEN3_FOUND)
+  if(CMAKE_VERSION VERSION_LESS 2.8.10)
+    # Doesn't have Hg download prior to 2.8.10
+    message(FATAL_ERROR "Please install eigen.")
+  else(CMAKE_VERSION VERSION_LESS 2.8.10)
+    if(NOT EXTERNAL_ROOT)
+      set(EXTERNAL_ROOT ${CMAKE_BINARY_DIR}/external)
+    endif(NOT EXTERNAL_ROOT)
+    find_package(Hg)
+    if(HG_FOUND)
+    
+      message(STATUS "Eigen3 not found. Will attempt to download it.")
+      include(ExternalProject)
+      ExternalProject_Add(
+          eigen
+          PREFIX ${EXTERNAL_ROOT}
+          HG_REPOSITORY https://bitbucket.org/eigen/eigen/
+          HG_TAG 3.2.0
+          TIMEOUT 10
+          CMAKE_ARGS 
+            -DCMAKE_INSTALL_PREFIX=${EXTERNAL_ROOT}
+            -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+            -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
+            -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
+            -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWIDTHDEBINFO}
+            -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
+            -DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL}
+          # Wrap download, configure and build steps in a script to log output
+          LOG_DOWNLOAD ON
+          LOG_CONFIGURE ON
+          LOG_BUILD ON)
+      set(EIGEN3_INCLUDE_DIR ${EXTERNAL_ROOT}/include/eigen3)
+  
+    else(HG_FOUND)
+   
+      message(FATAL_ERROR "Hg not found, and eigen not found.\nNeed one or the other.")
+   
+    endif(HG_FOUND)
+  endif(CMAKE_VERSION VERSION_LESS 2.8.10)
+endif(NOT EIGEN3_FOUND)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/LICENSE b/ecbuild/cmake/contrib/GreatCMakeCookOff/LICENSE
new file mode 100644
index 0000000..8dbb759
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 University College London
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/README.md b/ecbuild/cmake/contrib/GreatCMakeCookOff/README.md
new file mode 100644
index 0000000..a0a6947
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/README.md
@@ -0,0 +1,176 @@
+The Great CMake CookOff
+=======================
+
+
+This is a repository of usefull and less than usefull cmake recipes.  It is distributed under the
+[MIT License](http://opensource.org/licenses/MIT)
+
+
+Adding [Eigen](http://eigen.tuxfamily.org/) to a project
+========================================================
+
+Looks for the Eigen installed on system. If not found, then uses external project to download it.
+Usage is as follows:
+
+```cmake
+# Tell cmake to look into GreatCMakeCookOff for recipes
+set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/GreatCMakeCookOff) 
+
+# Optionally, tell cmake where to download eigen, if needed.
+# Defaults to value below.
+set(EXTERNAL_ROOT ${PROJECT_BINARY_DIR}/external)
+
+# Now look for cmake.
+find_package(Eigen)
+```
+
+**NOTE:** After building the first time, run cmake again. It will find the eigen it downloaded
+previously, and it will stop checking for updates. 
+
+Adding [GTest](https://code.google.com/p/googletest/) to a project
+==================================================================
+
+For googly reasons, whether valid or 404, GTest prefers to be compiled for each an every project. 
+This script does two things:
+
+- it adds GTest as an external project
+- it provides a function to add gtests to ctest
+
+This implies that GTest is downloaded the first time that make runs. Furthermore, it will be
+checked each and every time that makes runs. So, make now requires a working internet connection.
+Unlike Eigen above, there is currently no option avoid checking for updates.
+
+The CMakeLists.txt file could look like this:
+
+```cmake
+option(tests          "Enable testing."                         on)
+
+if(tests) 
+  find_package(GTest)
+  enable_testing()
+endif(tests)
+```
+
+And adding a test comes down to
+
+```cmake
+if(tests)
+
+  add_gtest(testme testme.cc mylib)
+
+endif(tests)
+```
+
+- first argument: name of the test
+- second argument: list of source files
+- other arguments: additional libraries to add during linking
+
+The test do expect an explicit main function. See the test generated in ``tests/addgtest.cmake``.
+
+**NOTE:** When using c++11, it is recommended to first include the c++11 flag script
+``AddCPP11Flags.cmake`` (see below) so that the gtest can be compiled with ``GTEST_LANG_CXX11``. 
+
+C++11
+=====
+
+Checking for specific features
+------------------------------
+
+Look for some c++11 features. Uses a script modified from [here](http://pageant.ghulbus.eu/?p=664).
+Usage is given below.
+
+```cmake
+# First need to enable c++
+enable_language(CXX)
+
+# The following will print out all available features.
+cxx11_find_all_features(ALL_FEATURES)
+message(STATUS "[c++11] features we can check for: ${ALL_FEATURES}")
+
+# The following checks for all features
+cxx11_feature_check()
+
+# An internal value is set if a particular feature exists.
+if(HAS_CXX11_AUTO)
+  message(STATUS "[c++11] has auto.")
+endif()
+if(HAS_CXX11_LAMBDA)
+  message(STATUS "[c++11] has lambda.")
+endif()
+```
+
+Alternatively, only a subset of features can be checked for, and some can be required:
+```cmake
+cxx11_feature_check(auto lambda REQUIRED long_long share_ptr variadic_templates)
+```
+The previous statement will fail if ``long long``, ``std::shared_ptr<...>``, and variadic templates
+are not available. It will also check for the availability of ``auto`` and ``lambda``, but without
+failing.
+
+Figuring out flags for some compilers
+-------------------------------------
+
+The script checks the existence of a few flags to enable c++11 features on different compilers.
+The output is somewhat verbose, but it seems to do the job for gcc, darwin-gcc, and microsoft visual
+studio. In addition, the intel compilers have to be told to use an external c++11 standard library.
+This script cannot figure where this library would be (hint: g++ provides it), so that is left up to
+the user. The script can be activated with a one liner.
+
+```cmake
+include("path/to/cookoff/AddCPP11Flags.cmake")
+```
+
+**NOTE:** On windows + visual studio, disables warnings 4251 and ups fake variadic templates to 10.
+
+
+Figure out ``isnan``
+====================
+
+Each and every vendor provides a different ``isnan``. There is a script to help define a portable
+c++ macro. It is meant to be used within a configuration file as follows:
+
+```cmake
+include("path/to/cookoff/CheckIsNaN.cmake")
+if(NOT ISNAN_VARIATION)
+  message(STATUS "Could not find working isnan.")
+endif(NOT ISNAN_VARIATION)
+
+configure_file(/path/to/config.h.in /path/to/config.h)
+```
+
+Two cmake variables are defined:
+
+- ISNAN_HEADERS will the header(s) relevant to the local ``isnan`` definition
+- ISNAN_VARIATIOPN is the fully qualified name to the local ``isnan`` definition
+
+They can be used as follows in a the configuration file ``config.h.in``:
+
+``cpp
+ at ISNAN_HEADERS@
+
+#define not_a_number(X) @ISNAN_VARIATION@
+``
+
+One should then use the macro ``not_a_number`` in-place of any ``isnan`` flavour.
+
+In c++11, it is also possible to define a function that takes only arithmetic type, thus obviating
+the need for a macro:
+
+```cpp
+ at ISNAN_HEADERS@
+#include <type_traits>
+
+template<class T>
+  typename std::enable_if<std::is_arithmetic<T>::value, bool> :: type 
+    not_a_number(T const &_in) { return @ISNAN_VARIATION@(_in); }
+```
+
+Testing CMake scripts
+=====================
+
+The file ``TestCMake.cmake`` contains a function to test cmake scripts. It converts an input cmake
+file into a project which is then configured, built, and run using ``ctest``. Unless an optional
+"SOURCE" is provided as argument, the test program is an empty ``main`` function returning 0. If the
+keyword is provided, then a ``main.cc`` or ``main.c`` file should provided the cmake script.
+
+For examples, look at the tests in this package.
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/TestCMake.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/TestCMake.cmake
new file mode 100644
index 0000000..4fc877a
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/TestCMake.cmake
@@ -0,0 +1,58 @@
+function(_args_have_option outvar optionname arglist)
+  list(FIND ${arglist} "${optionname}" HASOPTION)
+  if(HASOPTION EQUAL -1)
+    set(${outvar} False PARENT_SCOPE)
+  else()
+    set(${outvar} True PARENT_SCOPE)
+    list(REMOVE_ITEM ${arglist} ${optionname})
+    set(${arglist} ${${arglist}} PARENT_SCOPE)
+  endif()
+endfunction(_args_have_option)
+
+function(cmake_test testname)
+
+  # Parse further arguments
+  # Let caller create a source file
+  set(ALL_OPTIONS ${ARGN})
+  _args_have_option(SOURCE "SOURCE" ALL_OPTIONS)
+  # Let caller create executable to run
+  # Should be used with test-command
+  _args_have_option(NOEXEC "NOEXEC" ALL_OPTIONS)
+
+  # set source and build dir.
+  set(FAKE_PROJECT_DIR ${CMAKE_CURRENT_BINARY_DIR}/${testname})
+  set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/fake_project_builds/${testname})
+
+  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${testname}.cmake 
+                 ${FAKE_PROJECT_DIR}/CMakeData.cmake @ONLY)
+  message(STATUS "[${testname}] project in ${FAKE_PROJECT_DIR}")
+
+  if(NOT SOURCE)
+    file(WRITE ${FAKE_PROJECT_DIR}/main.c "int main() { return 0; }" )
+  endif(NOT SOURCE)
+  file(WRITE ${FAKE_PROJECT_DIR}/CMakeLists.txt
+       "cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR)\n"
+       "project(allfeatures)\n"
+       "include(\"${FAKE_PROJECT_DIR}/CMakeData.cmake\")\n"
+       "enable_language(C)\n"
+       "if(NOT ${NOEXEC})\n"
+       "  file(GLOB ALLFILES \${PROJECT_SOURCE_DIR}/*.c \${PROJECT_SOURCE_DIR}/*.cc)\n"
+       "  add_executable(${testname} \${ALLFILES})\n"
+       "endif(NOT ${NOEXEC})\n")
+  
+  
+  if(EXISTS ${BUILD_DIR})
+    file(REMOVE_RECURSE ${BUILD_DIR})
+  endif(EXISTS ${BUILD_DIR})
+  
+  file(MAKE_DIRECTORY ${BUILD_DIR})
+  
+  add_test(cmake_test_${testname}
+             ${CMAKE_CTEST_COMMAND} --build-and-test ${FAKE_PROJECT_DIR} ${BUILD_DIR}
+                                    --build-generator ${CMAKE_GENERATOR}
+                                    --build-makeprogram ${CMAKE_MAKE_PROGRAM}
+                                    --build-project ${testname}
+                                    --build-options -Dcookoff_path=${CMAKE_SOURCE_DIR}/..
+                                    ${ALL_OPTIONS})
+
+endfunction(cmake_test)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/__func__-N2340.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/__func__-N2340.cpp
new file mode 100644
index 0000000..d961df8
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/__func__-N2340.cpp
@@ -0,0 +1,8 @@
+#include <cstring>
+
+int main()
+{
+	if (!__func__) { return 1; }
+	if(std::strlen(__func__) <= 0) { return 1; }
+	return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/auto-N2546.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/auto-N2546.cpp
new file mode 100644
index 0000000..948648e
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/auto-N2546.cpp
@@ -0,0 +1,12 @@
+
+int main()
+{
+	auto i = 5;
+	auto f = 3.14159f;
+	auto d = 3.14159;
+	bool ret = (
+		(sizeof(f) < sizeof(d)) &&
+		(sizeof(i) == sizeof(int))
+	);
+	return ret ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/begin_function.cc b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/begin_function.cc
new file mode 100644
index 0000000..870ba92
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/begin_function.cc
@@ -0,0 +1,12 @@
+#include <iterator>
+#include <vector>
+#include <exception>
+
+int main() {
+  std::vector<int> vector(2, 1);
+  auto i_first = std::begin(vector);
+  auto i_end = std::end(vector);
+  if(i_first + 2 != i_end) return 1;
+  if(*i_first != 1) return 2;
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/constexpr-N2235.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/constexpr-N2235.cpp
new file mode 100644
index 0000000..ed62451
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/constexpr-N2235.cpp
@@ -0,0 +1,19 @@
+constexpr int square(int x)
+{
+	return x*x;
+}
+
+constexpr int the_answer()
+{
+	return 42;
+}
+
+int main()
+{
+	int test_arr[square(3)];
+	bool ret = (
+		(square(the_answer()) == 1764) &&
+		(sizeof(test_arr)/sizeof(test_arr[0]) == 9)
+	);
+	return ret ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/constructor_delegate.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/constructor_delegate.cpp
new file mode 100644
index 0000000..4934d83
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/constructor_delegate.cpp
@@ -0,0 +1,32 @@
+#include <cmath>
+#include <assert.h>
+
+class A {
+  public:
+    int a;
+    double b;
+
+    A() : A(0, 0) {}
+    explicit A(int _a) : A(_a, 0) {}
+    explicit A(double _b) : A(0, _b) {}
+    A(int _a, double _b) : a(_a), b(_b) {}
+};
+
+int main() {
+  A instance(1, 1.5e0);
+  assert(instance.a == 1);
+  assert(std::abs(instance.b - 1.5) < 1e-8);
+
+  A instance1(1);
+  assert(instance1.a == 1);
+  assert(std::abs(instance1.b) < 1e-8);
+
+  A instance2(1.5);
+  assert(instance2.a == 0);
+  assert(std::abs(instance2.b - 1.5) < 1e-8);
+
+  A instance3;
+  assert(instance3.a == 0);
+  assert(std::abs(instance3.b) < 1e-8);
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/cstdint.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/cstdint.cpp
new file mode 100644
index 0000000..be2878f
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/cstdint.cpp
@@ -0,0 +1,10 @@
+#include <cstdint>
+int main()
+{
+	bool test = 
+		(sizeof(int8_t) == 1) &&
+		(sizeof(int16_t) == 2) &&
+		(sizeof(int32_t) == 4) &&
+		(sizeof(int64_t) == 8);
+	return test ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/decltype-N2343.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/decltype-N2343.cpp
new file mode 100644
index 0000000..843f83a
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/decltype-N2343.cpp
@@ -0,0 +1,11 @@
+
+bool check_size(int i)
+{
+	return sizeof(int) == sizeof(decltype(i));
+}
+
+int main()
+{
+	bool ret = check_size(42);
+	return ret ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/deleted_constructor.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/deleted_constructor.cpp
new file mode 100644
index 0000000..565da27
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/deleted_constructor.cpp
@@ -0,0 +1,10 @@
+struct A {
+  int b;
+  A(int _b) : b(_b) {};
+  A(A const &) = delete;
+};
+
+int main() {
+  A first(1);
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/deleted_constructor_fail_compile.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/deleted_constructor_fail_compile.cpp
new file mode 100644
index 0000000..a71d565
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/deleted_constructor_fail_compile.cpp
@@ -0,0 +1,11 @@
+struct A {
+  int b;
+  A(int _b) : b(_b) {};
+  A(A const &) = delete;
+};
+
+int main() {
+  A first(1);
+  A second(first);
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/enable_if.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/enable_if.cpp
new file mode 100644
index 0000000..4eed94b
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/enable_if.cpp
@@ -0,0 +1,8 @@
+#include <type_traits>
+
+template<int N>
+  typename std::enable_if<N==2, int>::type testme() { return 0; }
+
+int main() {
+  return testme<2>();
+};
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/explicit_cast.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/explicit_cast.cpp
new file mode 100644
index 0000000..37c97f9
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/explicit_cast.cpp
@@ -0,0 +1,13 @@
+class A {
+  public:
+   A(int a = 5) : a_(a) {};
+   explicit operator bool() const { return a_ == 2; }
+  protected:
+   int a_;
+};
+
+int main () {
+  A a(6);
+  A const b(2);
+  return (static_cast<bool>(a) == false and static_cast<bool>(b) == true) ? 0: 1;  
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/initialization.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/initialization.cpp
new file mode 100644
index 0000000..462575f
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/initialization.cpp
@@ -0,0 +1,7 @@
+#include <vector>
+
+int main() {
+  std::vector<double> a{0, 1, 2, 3};
+  std::vector< std::vector<double> > b{ {5, 6, 7}, {8, 9, 10, 11} };
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/lambda-N2927.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/lambda-N2927.cpp
new file mode 100644
index 0000000..4c33ed5
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/lambda-N2927.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+	int ret = 0;
+	return ([&ret]() -> int { return ret; })();
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/long_double.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/long_double.cpp
new file mode 100644
index 0000000..8f005ee
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/long_double.cpp
@@ -0,0 +1,4 @@
+int main(void)
+{
+	return sizeof(long double) > sizeof(double) ? 0: 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/long_long-N1811.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/long_long-N1811.cpp
new file mode 100644
index 0000000..0911127
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/long_long-N1811.cpp
@@ -0,0 +1,7 @@
+int main(void)
+{
+	long long l;
+	unsigned long long ul;
+
+	return ((sizeof(l) >= 8) && (sizeof(ul) >= 8)) ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/noexcept.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/noexcept.cpp
new file mode 100644
index 0000000..0ea69d4
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/noexcept.cpp
@@ -0,0 +1,9 @@
+class A {
+    public:
+    A() noexcept {};
+};
+int main()
+{
+   A a = A();
+   return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/nullptr-N2431.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/nullptr-N2431.cpp
new file mode 100644
index 0000000..c78fac4
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/nullptr-N2431.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+	int* test = nullptr;
+	return test ? 1 : 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/nullptr-N2431_fail_compile.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/nullptr-N2431_fail_compile.cpp
new file mode 100644
index 0000000..7ab77a2
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/nullptr-N2431_fail_compile.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+	int i = nullptr;
+	return 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/override.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/override.cpp
new file mode 100644
index 0000000..d8d4e0d
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/override.cpp
@@ -0,0 +1,22 @@
+class A {
+  public:
+    virtual void foo(int &_a) = 0;
+    virtual void bar(int &_a)  { _a += 1; }
+};
+
+class B : public A {
+  public:
+    void foo(int &_a) override { _a += 1; }
+    void bar(int &_a) override { _a += 2; }
+};
+
+int main() {
+  A * b = static_cast<A*>(new B);
+  int a = 0;
+  b->foo(a); 
+  if(a != 1) return 1;
+  b->bar(a); 
+  if(a != 3) return 1;
+  delete b;
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/override_fail_compile.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/override_fail_compile.cpp
new file mode 100644
index 0000000..19f43c9
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/override_fail_compile.cpp
@@ -0,0 +1,22 @@
+class A {
+  public:
+    virtual void foo(int &_a) = 0;
+    void bar(int &_a)  { _a += 1; }
+};
+
+class B : public A {
+  public:
+    void foo(int &_a) override { _a += 1; }
+    void bar(int &_a) override { _a += 2; }
+};
+
+int main() {
+  A * b = static_cast<A*>(new B);
+  int a = 0;
+  b->foo(a); 
+  if(a != 1) return 1;
+  b->bar(a); 
+  if(a != 3) return 1;
+  delete b;
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/random_device.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/random_device.cpp
new file mode 100644
index 0000000..a777421
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/random_device.cpp
@@ -0,0 +1,13 @@
+#include <random>
+#include <sstream>
+
+int main()
+{
+    std::random_device rd;
+    std::mt19937 gen(rd());
+    std::uniform_int_distribution<> dis(1, 6);
+    std::ostringstream sstr;
+    for(int n=0; n<10; ++n) sstr << dis(gen) << ' ';
+    return 0;
+}
+
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/rvalue_references-N2118.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/rvalue_references-N2118.cpp
new file mode 100644
index 0000000..75fb555
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/rvalue_references-N2118.cpp
@@ -0,0 +1,15 @@
+int foo(int& lvalue)
+{
+	return 123;
+}
+
+int foo(int&& rvalue)
+{
+	return 321;
+}
+
+int main()
+{
+	int i = 42;
+	return ((foo(i) == 123) && (foo(42) == 321)) ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/shared_ptr.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/shared_ptr.cpp
new file mode 100644
index 0000000..4a4ff82
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/shared_ptr.cpp
@@ -0,0 +1,6 @@
+#include<memory>
+
+int main() {
+  std::shared_ptr<int> a(new int(1));
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/sizeof_member-N2253.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/sizeof_member-N2253.cpp
new file mode 100644
index 0000000..a55fc09
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/sizeof_member-N2253.cpp
@@ -0,0 +1,14 @@
+struct foo {
+	char bar;
+	int baz;
+};
+
+int main(void)
+{
+	bool ret = (
+		(sizeof(foo::bar) == 1) &&
+		(sizeof(foo::baz) >= sizeof(foo::bar)) &&
+		(sizeof(foo) >= sizeof(foo::bar)+sizeof(foo::baz))
+	);
+	return ret ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/static_assert-N1720.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/static_assert-N1720.cpp
new file mode 100644
index 0000000..c3d74ca
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/static_assert-N1720.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+	static_assert(0 < 1, "your ordering of integers is screwed");
+	return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/static_assert-N1720_fail_compile.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/static_assert-N1720_fail_compile.cpp
new file mode 100644
index 0000000..4cb1183
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/static_assert-N1720_fail_compile.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+	static_assert(1 < 0, "this should fail");
+	return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/template_alias.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/template_alias.cpp
new file mode 100644
index 0000000..52881a9
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/template_alias.cpp
@@ -0,0 +1,8 @@
+template<class A, class B> struct AClass {
+  typedef A t_first;
+  typedef B t_second;
+};
+
+template<class B> using Specialized = AClass<int, B>;
+
+int main() { return 0; }
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/trivial_type_traits.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/trivial_type_traits.cpp
new file mode 100644
index 0000000..8cf8319
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/trivial_type_traits.cpp
@@ -0,0 +1,7 @@
+#include<type_traits>
+int main()
+{
+  bool const a = std::is_trivially_move_constructible<int>::value;
+  bool const b = std::is_trivially_move_assignable<int>::value;
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/type_traits.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/type_traits.cpp
new file mode 100644
index 0000000..4344f76
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/type_traits.cpp
@@ -0,0 +1,7 @@
+#include<type_traits>
+int main()
+{
+  bool const a = std::is_move_constructible<int>::value;
+  bool const b = std::is_move_assignable<int>::value;
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/unique_ptr.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/unique_ptr.cpp
new file mode 100644
index 0000000..159591d
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/unique_ptr.cpp
@@ -0,0 +1,6 @@
+#include<memory>
+
+int main() {
+  std::unique_ptr<int> a(new int(1));
+  return 0;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/variadic_templates-N2555.cpp b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/variadic_templates-N2555.cpp
new file mode 100644
index 0000000..4518e88
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/cpp11/variadic_templates-N2555.cpp
@@ -0,0 +1,23 @@
+int Accumulate()
+{
+	return 0;
+}
+
+template<typename T, typename... Ts>
+int Accumulate(T v, Ts... vs)
+{
+	return v + Accumulate(vs...);
+}
+
+template<int... Is>
+int CountElements()
+{
+	return sizeof...(Is);
+}
+
+int main()
+{
+	int acc = Accumulate(1, 2, 3, 4, -5);
+	int count = CountElements<1,2,3,4,5>();
+	return ((acc == 5) && (count == 5)) ? 0 : 1;
+}
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/CMakeLists.txt b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/CMakeLists.txt
new file mode 100644
index 0000000..f2eb4d0
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR)
+project(COOKOFF_TEST)
+
+enable_testing()
+
+include(${PROJECT_SOURCE_DIR}/../TestCMake.cmake)
+
+cmake_test(checkisnan SOURCE)
+cmake_test(checkcpp11flags)
+cmake_test(addgtest NOEXEC SOURCE --test-command ${CMAKE_MAKE_PROGRAM} test)
+
+add_subdirectory(cpp11)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/addgtest.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/addgtest.cmake
new file mode 100644
index 0000000..b1139d9
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/addgtest.cmake
@@ -0,0 +1,20 @@
+option(tests          "Enable testing."                         on)
+
+if(tests) 
+  include(${cookoff_path}/AddGTest.cmake)
+  enable_testing()
+endif(tests)
+
+file(WRITE ${CMAKE_SOURCE_DIR}/mytest.cc 
+     "#include <gtest/gtest.h>\n\n"
+     "class TestMe : public ::testing::Test {};\n\n"
+     "TEST_F(TestMe, TestThis) {\n"
+     "  EXPECT_TRUE(true); \n"
+     "}\n\n"
+     "int main(int argc, char **argv) {\n"
+     "  ::testing::InitGoogleTest(&argc, argv);\n"
+     "  return RUN_ALL_TESTS();\n"
+     "}\n")
+
+
+add_gtest(mytest mytest.cc)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/checkcpp11flags.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/checkcpp11flags.cmake
new file mode 100644
index 0000000..1f7e8a4
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/checkcpp11flags.cmake
@@ -0,0 +1 @@
+include(${cookoff_path}/AddCPP11Flags.cmake)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/checkisnan.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/checkisnan.cmake
new file mode 100644
index 0000000..e9cbdaa
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/checkisnan.cmake
@@ -0,0 +1,19 @@
+include(${cookoff_path}/CheckIsNaN.cmake)
+if(NOT ISNAN_VARIATION)
+  message(STATUS "Could not find working isnan.")
+endif(NOT ISNAN_VARIATION)
+
+enable_language(CXX)
+file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/isnan.cc.in
+     "\@ISNAN_HEADERS\@\n"
+     "#include <limits>\n"
+     "#include <exception>\n"
+     "#define not_a_number(X) \@ISNAN_VARIATION\@(X)\n"
+     "int main() {\n"
+     "  if(not_a_number(0.5e0)) throw std::exception(); \n"
+     "  if(not_a_number(2l)) throw std::exception(); \n"
+     "  if(not not_a_number(std::numeric_limits<double>::quiet_NaN())) throw std::exception(); \n"
+     "  return 0;\n"
+     "}\n")
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/isnan.cc.in ${CMAKE_CURRENT_SOURCE_DIR}/main.cc)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/CMakeLists.txt b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/CMakeLists.txt
new file mode 100644
index 0000000..45d20a5
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_test(allfeatures)
+cmake_test(parse_input_features)
+cmake_test(check_features)
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/allfeatures.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/allfeatures.cmake
new file mode 100644
index 0000000..f4dec87
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/allfeatures.cmake
@@ -0,0 +1,7 @@
+enable_language(CXX)
+include(${cookoff_path}/CheckCXX11Features.cmake)
+cxx11_find_all_features(ALL_CPP11_FEATURES)
+LIST(LENGTH ALL_CPP11_FEATURES LIST_LENGTH)
+if(${LIST_LENGTH} EQUAL 0)
+  message(FATAL_ERROR "No c++11 features found")
+endif()
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/check_features.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/check_features.cmake
new file mode 100644
index 0000000..1ea2fdb
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/check_features.cmake
@@ -0,0 +1,9 @@
+# This is a C++ feature
+enable_language(CXX)
+
+# Include check feature.
+include(${cookoff_path}/CheckCXX11Features.cmake)
+
+# Now call function to test.
+cxx11_feature_check("auto")
+cxx11_feature_check()
diff --git a/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/parse_input_features.cmake b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/parse_input_features.cmake
new file mode 100644
index 0000000..ca88de0
--- /dev/null
+++ b/ecbuild/cmake/contrib/GreatCMakeCookOff/tests/cpp11/parse_input_features.cmake
@@ -0,0 +1,68 @@
+# This is a C++ feature
+enable_language(CXX)
+
+# Include check feature.
+include(${cookoff_path}/CheckCXX11Features.cmake)
+
+# Now call function with fake input
+set(ALL_FEATURES "first;second;third")
+
+# No input OPTIONALS == ALL_FEATURES
+parse_input_features("${ALL_FEATURES}" OPTIONALS REQUIRED ERRORS "")
+if(NOT "${OPTIONALS}" STREQUAL "${ALL_FEATURES}")
+  message(FATAL_ERROR "OPTIONALS results should contain everything.") 
+endif(NOT "${OPTIONALS}" STREQUAL "${ALL_FEATURES}")
+if(NOT "${REQUIRED}" STREQUAL "")
+  message(FATAL_ERROR "REQUIRED should be empty.") 
+endif(NOT "${REQUIRED}" STREQUAL "")
+if(NOT "${ERRORS}" STREQUAL "")
+  message(FATAL_ERROR "ERRORS should be empty.") 
+endif(NOT "${ERRORS}" STREQUAL "")
+
+# Single input without REQUIRED
+parse_input_features("${ALL_FEATURES}" OPTIONALS REQUIRED ERRORS "second")
+if(NOT "${OPTIONALS}" STREQUAL "second")
+  message(FATAL_ERROR "OPTIONALS results should second.") 
+endif()
+if(NOT "${REQUIRED}" STREQUAL "")
+  message(FATAL_ERROR "REQUIRED should be empty.") 
+endif()
+if(NOT "${ERRORS}" STREQUAL "")
+  message(FATAL_ERROR "ERRORS should be empty.") 
+endif()
+
+# Single error input without REQUIRED
+parse_input_features("${ALL_FEATURES}" OPTIONALS REQUIRED ERRORS "none")
+if(NOT "${OPTIONALS}" STREQUAL "")
+  message(FATAL_ERROR "OPTIONALS results should be empty.") 
+endif()
+if(NOT "${REQUIRED}" STREQUAL "")
+  message(FATAL_ERROR "REQUIRED should be empty.") 
+endif()
+if(NOT "${ERRORS}" STREQUAL "none")
+  message(FATAL_ERROR "ERRORS should be none.") 
+endif()
+
+# Single valid input with REQUIRED
+parse_input_features("${ALL_FEATURES}" OPTIONALS REQUIRED ERRORS REQUIRED first)
+if(NOT "${OPTIONALS}" STREQUAL "")
+  message(FATAL_ERROR "OPTIONALS results should be empty.") 
+endif()
+if(NOT "${REQUIRED}" STREQUAL "first")
+  message(FATAL_ERROR "REQUIRED should be first.") 
+endif()
+if(NOT "${ERRORS}" STREQUAL "")
+  message(FATAL_ERROR "ERRORS should be empty.") 
+endif()
+
+# one of each
+parse_input_features("${ALL_FEATURES}" OPTIONALS REQUIRED ERRORS second third REQUIRED first none)
+if(NOT "${OPTIONALS}" STREQUAL "second;third")
+  message(FATAL_ERROR "OPTIONALS results should be second;optional.") 
+endif()
+if(NOT "${REQUIRED}" STREQUAL "first")
+  message(FATAL_ERROR "REQUIRED should be first.") 
+endif()
+if(NOT "${ERRORS}" STREQUAL "none")
+  message(FATAL_ERROR "ERRORS should be none.") 
+endif()
diff --git a/ecbuild/cmake/ecbuild_add_cxx11_flags.cmake b/ecbuild/cmake/ecbuild_add_cxx11_flags.cmake
new file mode 100644
index 0000000..414f39f
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_cxx11_flags.cmake
@@ -0,0 +1,25 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to add cxx11 flags to compilation
+# uses macros from the project github.com/UCL/GreatCMakeCookOff
+
+macro( ecbuild_add_cxx11_flags )
+
+	# if( CMAKE_COMPILER_IS_GNUCXX )
+	# 	if( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7 )
+	# 		cmake_add_cxx_flags("-std=c++0x")
+	# 	else()
+	# 		cmake_add_cxx_flags("-std=c++11")
+	# 	endif()
+	# endif()
+
+	include( ${ECBUILD_MACROS_DIR}/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake )
+
+endmacro( ecbuild_add_cxx11_flags )
diff --git a/ecbuild/cmake/ecbuild_add_executable.cmake b/ecbuild/cmake/ecbuild_add_executable.cmake
new file mode 100644
index 0000000..389505a
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_executable.cmake
@@ -0,0 +1,197 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding a test
+##############################################################################
+
+macro( ecbuild_add_executable )
+
+	set( options NOINSTALL AUTO_VERSION )
+	set( single_value_args TARGET COMPONENT LINKER_LANGUAGE VERSION OUTPUT_NAME )
+    set( multi_value_args  SOURCES TEMPLATES LIBS INCLUDES DEPENDS PERSISTENT DEFINITIONS CFLAGS CXXFLAGS FFLAGS GENERATED CONDITION )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_add_executable(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_TARGET  )
+      message(FATAL_ERROR "The call to ecbuild_add_executable() doesn't specify the TARGET.")
+    endif()
+
+    if( NOT _PAR_SOURCES )
+      message(FATAL_ERROR "The call to ecbuild_add_executable() doesn't specify the SOURCES.")
+    endif()
+
+    ### conditional build
+
+    if( DEFINED _PAR_CONDITION )
+        set(_target_condition_file "${CMAKE_CURRENT_BINARY_DIR}/set_${_PAR_TARGET}_condition.cmake")
+        file( WRITE  ${_target_condition_file} "  if( ")
+        foreach( term ${_PAR_CONDITION} )
+            file( APPEND ${_target_condition_file} " ${term}")
+        endforeach()
+        file( APPEND ${_target_condition_file} " )\n    set(_${_PAR_TARGET}_condition TRUE)\n  else()\n    set(_${_PAR_TARGET}_condition FALSE)\n  endif()\n")
+        include( ${_target_condition_file} )
+    else()
+        set( _${_PAR_TARGET}_condition TRUE )
+    endif()
+
+    if( _${_PAR_TARGET}_condition )
+
+        # add include dirs if defined
+        if( DEFINED _PAR_INCLUDES )
+          list(REMOVE_DUPLICATES _PAR_INCLUDES )
+          foreach( path ${_PAR_INCLUDES} ) # skip NOTFOUND
+            if( path )
+              include_directories( ${path} )
+    #        else()
+    #          message( WARNING "Path ${path} was skipped" )
+            endif()
+          endforeach()
+        endif()
+    
+        # add persistent layer files
+        if( DEFINED _PAR_PERSISTENT )
+			if( DEFINED PERSISTENT_NAMESPACE )
+	            ecbuild_add_persistent( SRC_LIST _PAR_SOURCES FILES ${_PAR_PERSISTENT} NAMESPACE ${PERSISTENT_NAMESPACE} )
+			else()
+	            ecbuild_add_persistent( SRC_LIST _PAR_SOURCES FILES ${_PAR_PERSISTENT} )
+			endif()
+     endif()
+    
+        # add templates to project files and remove from compilation sources
+        if( DEFINED _PAR_TEMPLATES )
+            list( REMOVE_ITEM _PAR_SOURCES ${_PAR_TEMPLATES} )
+            ecbuild_declare_project_files( ${_PAR_TEMPLATES} )
+            add_custom_target( ${_PAR_TARGET}_templates SOURCES ${_PAR_TEMPLATES} )
+        endif()
+    
+        # add the executable target
+        add_executable( ${_PAR_TARGET} ${_PAR_SOURCES} )
+    
+		# set OUTPUT_NAME
+
+		if( DEFINED _PAR_OUTPUT_NAME )
+			set_target_properties( ${_PAR_TARGET} PROPERTIES OUTPUT_NAME ${_PAR_OUTPUT_NAME} )
+		endif()
+
+		# add extra dependencies
+        if( DEFINED _PAR_DEPENDS)
+          add_dependencies( ${_PAR_TARGET} ${_PAR_DEPENDS} )
+        endif()
+    
+        # add the link libraries
+        if( DEFINED _PAR_LIBS )
+          list(REMOVE_DUPLICATES _PAR_LIBS )
+          list(REMOVE_ITEM _PAR_LIBS debug)
+          list(REMOVE_ITEM _PAR_LIBS optimized)
+          foreach( lib ${_PAR_LIBS} ) # skip NOTFOUND
+            if( lib )
+              target_link_libraries( ${_PAR_TARGET} ${lib} )
+            else()
+#              message( WARNING "Lib ${lib} was skipped" )
+            endif()
+          endforeach()
+        endif()
+    
+        # add local flags
+        if( DEFINED _PAR_CFLAGS )
+            set_source_files_properties( ${${_PAR_TARGET}_c_srcs}   PROPERTIES COMPILE_FLAGS "${_PAR_CFLAGS}" )
+        endif()
+        if( DEFINED _PAR_CXXFLAGS )
+            set_source_files_properties( ${${_PAR_TARGET}_cxx_srcs} PROPERTIES COMPILE_FLAGS "${_PAR_CXXFLAGS}" )
+        endif()
+        if( DEFINED _PAR_FFLAGS )
+            set_source_files_properties( ${${_PAR_TARGET}_f_srcs}   PROPERTIES COMPILE_FLAGS "${_PAR_FFLAGS}" )
+        endif()
+        if( DEFINED _PAR_GENERATED )
+            set_source_files_properties( ${_PAR_GENERATED} PROPERTIES GENERATED 1 )
+        endif()
+
+		# define VERSION if requested
+		if( DEFINED _PAR_VERSION )
+			set_target_properties( ${_PAR_TARGET} PROPERTIES VERSION "${_PAR_VERSION}" )
+		else()
+			if( _PAR_AUTO_VERSION )
+				set_target_properties( ${_PAR_TARGET} PROPERTIES VERSION "${${PNAME}_MAJOR_VERSION}.${${PNAME}_MINOR_VERSION}" )
+			endif()
+		endif()
+    
+        # filter sources        
+
+        ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
+
+#    debug_var( ${_PAR_TARGET}_h_srcs )
+#    debug_var( ${_PAR_TARGET}_c_srcs )
+#    debug_var( ${_PAR_TARGET}_cxx_srcs )
+#    debug_var( ${_PAR_TARGET}_f_srcs )
+
+        # installation
+
+        if( NOT _PAR_NOINSTALL )
+
+            # add installation paths and associate with defined component
+#            if( DEFINED _PAR_COMPONENT )
+#                set( COMPONENT_DIRECTIVE "${_PAR_COMPONENT}" )
+#            else()
+#                set( COMPONENT_DIRECTIVE "${PROJECT_NAME}" )
+#            endif()
+        
+            install( TARGETS ${_PAR_TARGET}
+              EXPORT  ${CMAKE_PROJECT_NAME}-targets
+              RUNTIME DESTINATION ${INSTALL_BIN_DIR}
+              LIBRARY DESTINATION ${INSTALL_LIB_DIR}
+              ARCHIVE DESTINATION ${INSTALL_LIB_DIR} )
+#              COMPONENT ${COMPONENT_DIRECTIVE} )
+
+            # set build location
+
+            set_property( TARGET ${_PAR_TARGET} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
+
+            # export location of target to other projects -- must be exactly after setting the build location (see previous command)
+
+            export( TARGETS ${_PAR_TARGET} APPEND FILE "${TOP_PROJECT_TARGETS_FILE}" )
+
+		else()
+				# NOINSTALL targets are always built the build_rpath, not the install_rpath
+				set_property( TARGET ${_PAR_TARGET} PROPERTY SKIP_BUILD_RPATH         FALSE )
+				set_property( TARGET ${_PAR_TARGET} PROPERTY BUILD_WITH_INSTALL_RPATH FALSE )
+		endif()
+    
+        # add definitions to compilation
+        if( DEFINED _PAR_DEFINITIONS )
+            get_property( _target_defs TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS )
+            list( APPEND _target_defs ${_PAR_DEFINITIONS} )
+            set_property( TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS ${_target_defs} )
+        endif()
+        
+        # set linker language
+        if( DEFINED _PAR_LINKER_LANGUAGE )
+            set_property( TARGET ${_PAR_TARGET} PROPERTY LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
+        endif()
+
+        # make sure target is removed before - some problems with AIX
+        add_custom_command( TARGET ${_PAR_TARGET} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E remove $<TARGET_FILE:${_PAR_TARGET}> )
+    
+        # for the links target
+        if( NOT _PAR_NOINSTALL )
+            ecbuild_link_exe( ${_PAR_TARGET} $<TARGET_FILE_NAME:${_PAR_TARGET}> $<TARGET_FILE:${_PAR_TARGET}>  )
+        endif()
+
+        # append to the list of this project targets
+        set( ${PROJECT_NAME}_ALL_EXES ${${PROJECT_NAME}_ALL_EXES} ${_PAR_TARGET} CACHE INTERNAL "" )    
+
+    endif()
+
+    # mark project files
+    ecbuild_declare_project_files( ${_PAR_SOURCES} )
+
+endmacro( ecbuild_add_executable  )
diff --git a/ecbuild/cmake/ecbuild_add_extra_search_paths.cmake b/ecbuild/cmake/ecbuild_add_extra_search_paths.cmake
new file mode 100644
index 0000000..8e28091
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_extra_search_paths.cmake
@@ -0,0 +1,34 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+#
+# macro for adding search paths to CMAKE_PREFIX_PATH
+# for example the ECMWF /usr/local/apps paths
+#
+# usage: ecbuild_add_extra_search_paths( netcdf4 )
+
+function( ecbuild_add_extra_search_paths pkg )
+
+# debug_var( pkg )
+
+	ecbuild_list_extra_search_paths( ${pkg} CMAKE_PREFIX_PATH )
+
+	set( CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE )
+
+	# fixes BOOST_ROOT taking precedence on the search for location
+	if( ${pkg} STREQUAL "boost" )
+		if( BOOST_ROOT OR BOOSTROOT OR DEFINED ENV{BOOST_ROOT} OR DEFINED ENV{BOOSTROOT} )
+			set( CMAKE_PREFIX_PATH ${BOOST_ROOT} ${BOOSTROOT} $ENV{BOOST_ROOT} $ENV{BOOSTROOT} ${CMAKE_PREFIX_PATH} )
+		endif()
+	endif()
+
+# debug_var( CMAKE_PREFIX_PATH )
+
+endfunction()
+
diff --git a/ecbuild/cmake/ecbuild_add_library.cmake b/ecbuild/cmake/ecbuild_add_library.cmake
new file mode 100644
index 0000000..a7e3dd2
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_library.cmake
@@ -0,0 +1,328 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# auxiliary macro for adding a library
+##############################################################################
+
+function( ecbuild_add_library_impl )
+
+	set( options NOINSTALL AUTO_VERSION )
+	set( single_value_args TARGET TYPE COMPONENT INSTALL_HEADERS LINKER_LANGUAGE HEADER_DESTINATION VERSION OUTPUT_NAME )
+	set( multi_value_args  SOURCES TEMPLATES LIBS INCLUDES DEPENDS PERSISTENT DEFINITIONS CFLAGS CXXFLAGS FFLAGS GENERATED CONDITION )
+
+	cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+	if(_PAR_UNPARSED_ARGUMENTS)
+	  message(FATAL_ERROR "Unknown keywords given to ecbuild_add_library(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+	endif()
+
+	if( NOT _PAR_TARGET  )
+	  message(FATAL_ERROR "The call to ecbuild_add_library() doesn't specify the TARGET.")
+	endif()
+
+	if( NOT _PAR_SOURCES )
+	  message(FATAL_ERROR "The call to ecbuild_add_library() doesn't specify the SOURCES.")
+	endif()
+
+	# get_filename_component( currdir ${CMAKE_CURRENT_SOURCE_DIR} NAME )
+
+	# file(RELATIVE_PATH reldir ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} )
+
+	# debug_var( currdir )
+	# debug_var( reldir )
+
+	### conditional build
+
+	if( DEFINED _PAR_CONDITION )
+		set(_target_condition_file "${CMAKE_CURRENT_BINARY_DIR}/set_${_PAR_TARGET}_condition.cmake")
+		file( WRITE  ${_target_condition_file} "  if( ")
+		foreach( term ${_PAR_CONDITION} )
+			file( APPEND ${_target_condition_file} " ${term}")
+		endforeach()
+		file( APPEND ${_target_condition_file} " )\n    set(_${_PAR_TARGET}_condition TRUE)\n  else()\n    set(_${_PAR_TARGET}_condition FALSE)\n  endif()\n")
+		include( ${_target_condition_file} )
+	else()
+		set( _${_PAR_TARGET}_condition TRUE )
+	endif()
+
+	if( _${_PAR_TARGET}_condition )
+
+		# defines the type of library
+		if( DEFINED _PAR_TYPE )
+			# checks that is either SHARED or STATIC or MODULE
+			if( NOT _PAR_TYPE MATCHES "STATIC" AND
+				NOT _PAR_TYPE MATCHES "SHARED" AND
+				NOT _PAR_TYPE MATCHES "MODULE" )
+				message( FATAL_ERROR "library type must be one of [ STATIC | SHARED | MODULE ]" )
+			endif()
+		endif()
+
+
+		# add persistent layer files
+		if( DEFINED _PAR_PERSISTENT )
+			if( DEFINED PERSISTENT_NAMESPACE )
+				ecbuild_add_persistent( SRC_LIST _PAR_SOURCES FILES ${_PAR_PERSISTENT} NAMESPACE ${PERSISTENT_NAMESPACE} )
+			else()
+				ecbuild_add_persistent( SRC_LIST _PAR_SOURCES FILES ${_PAR_PERSISTENT} )
+			endif()
+		endif()
+
+		# add templates to project files and remove from compilation sources
+		if( DEFINED _PAR_TEMPLATES )
+			list( REMOVE_ITEM _PAR_SOURCES ${_PAR_TEMPLATES} )
+			ecbuild_declare_project_files( ${_PAR_TEMPLATES} )
+			add_custom_target( ${_PAR_TARGET}_templates SOURCES ${_PAR_TEMPLATES} )
+		endif()
+
+		add_library( ${_PAR_TARGET} ${_PAR_TYPE} ${_PAR_SOURCES} )
+
+		# set OUTPUT_NAME
+
+		if( DEFINED _PAR_OUTPUT_NAME )
+			set_target_properties( ${_PAR_TARGET} PROPERTIES OUTPUT_NAME ${_PAR_OUTPUT_NAME} )
+		endif()
+
+		# add extra dependencies
+		if( DEFINED _PAR_DEPENDS)
+		  add_dependencies( ${_PAR_TARGET} ${_PAR_DEPENDS} )
+		endif()
+
+		# add the link libraries
+		if( DEFINED _PAR_LIBS )
+		  list(REMOVE_DUPLICATES _PAR_LIBS )
+		  list(REMOVE_ITEM _PAR_LIBS debug)
+		  list(REMOVE_ITEM _PAR_LIBS optimized)
+		  foreach( lib ${_PAR_LIBS} ) # skip NOTFOUND
+			if( lib )
+			  target_link_libraries( ${_PAR_TARGET} ${lib} )
+			else()
+#              message( WARNING "Lib ${lib} was skipped" )
+			endif()
+		  endforeach()
+		endif()
+
+		# add include dirs if defined
+		if( DEFINED _PAR_INCLUDES )
+		  list( REMOVE_DUPLICATES _PAR_INCLUDES )
+		  foreach( path ${_PAR_INCLUDES} ) # skip NOTFOUND
+			if( path )
+				if( "${CMAKE_VERSION}" VERSION_LESS "2.8.11" )
+					include_directories( ${path} )
+				else()
+			  		target_include_directories( ${_PAR_TARGET} PUBLIC ${path} )
+				endif()
+	#        else()
+	#          message( WARNING "Path ${path} was skipped" )
+			endif()
+		  endforeach()
+		endif()
+
+		# FIX: Cray compiler PIC option is not detected by CMake
+
+		get_property( _target_pic TARGET ${_PAR_TARGET} PROPERTY POSITION_INDEPENDENT_CODE )
+		if( _target_pic )
+			if( "${CMAKE_C_COMPILER_ID}" STREQUAL "Cray" )
+				set( _PAR_CFLAGS "-fPIC -h PIC ${_PAR_CFLAGS}" )
+			endif()
+			if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Cray" )
+				set( _PAR_CXXFLAGS "-fPIC -h PIC ${_PAR_CXXFLAGS}" )
+			endif()
+			if( "${CMAKE_Fortran_COMPILER_ID}" STREQUAL "Cray" )
+				set( _PAR_FFLAGS "-fPIC -h PIC ${_PAR_FFLAGS}" )
+			endif()
+		endif()
+
+		# define VERSION if requested
+		if( DEFINED _PAR_VERSION )
+			set_target_properties( ${_PAR_TARGET} PROPERTIES VERSION "${_PAR_VERSION}" )
+		else()
+			if( _PAR_AUTO_VERSION OR LIBS_VERSION MATCHES "[Aa][Uu][Tt][Oo]")
+				set_target_properties( ${_PAR_TARGET} PROPERTIES VERSION "${${PNAME}_MAJOR_VERSION}.${${PNAME}_MINOR_VERSION}" )
+			endif()
+			if( LIBS_VERSION AND NOT LIBS_VERSION MATCHES "[Aa][Uu][Tt][Oo]" )
+				set_target_properties( ${_PAR_TARGET} PROPERTIES VERSION "${LIBS_VERSION}" )
+			endif()
+		endif()
+
+		# filter sources
+
+		ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
+
+#		debug_var( ${_PAR_TARGET}_h_srcs )
+#		debug_var( ${_PAR_TARGET}_c_srcs )
+#		debug_var( ${_PAR_TARGET}_cxx_srcs )
+#		debug_var( ${_PAR_TARGET}_f_srcs )
+
+		# add local flags
+
+		if( DEFINED _PAR_CFLAGS )
+			set_source_files_properties( ${${_PAR_TARGET}_c_srcs}   PROPERTIES COMPILE_FLAGS "${_PAR_CFLAGS}" )
+		endif()
+		if( DEFINED _PAR_CXXFLAGS )
+			set_source_files_properties( ${${_PAR_TARGET}_cxx_srcs} PROPERTIES COMPILE_FLAGS "${_PAR_CXXFLAGS}" )
+		endif()
+		if( DEFINED _PAR_FFLAGS )
+			set_source_files_properties( ${${_PAR_TARGET}_f_srcs}   PROPERTIES COMPILE_FLAGS "${_PAR_FFLAGS}" )
+		endif()
+		if( DEFINED _PAR_GENERATED )
+			set_source_files_properties( ${_PAR_GENERATED} PROPERTIES GENERATED 1 )
+		endif()
+
+		# set linker language
+		if( DEFINED _PAR_LINKER_LANGUAGE )
+			set_property( TARGET ${_PAR_TARGET} PROPERTY LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
+		endif()
+
+		# installation
+
+		if( NOT _PAR_NOINSTALL )
+
+			# and associate with defined component
+#            if( DEFINED _PAR_COMPONENT )
+#                set( COMPONENT_DIRECTIVE "${_PAR_COMPONENT}" )
+#            else()
+#                set( COMPONENT_DIRECTIVE "${PROJECT_NAME}" )
+#            endif()
+
+			install( TARGETS ${_PAR_TARGET}
+			  EXPORT  ${CMAKE_PROJECT_NAME}-targets
+			  RUNTIME DESTINATION ${INSTALL_BIN_DIR}
+			  LIBRARY DESTINATION ${INSTALL_LIB_DIR}
+			  ARCHIVE DESTINATION ${INSTALL_LIB_DIR} )
+#              COMPONENT ${COMPONENT_DIRECTIVE} )
+
+			# install headers
+			if( _PAR_HEADER_DESTINATION )
+				set( _h_destination "${_PAR_HEADER_DESTINATION}" )
+			else()
+				set( _h_destination "${INSTALL_INCLUDE_DIR}" )
+			endif()
+
+			if( _PAR_INSTALL_HEADERS )
+				if( _PAR_INSTALL_HEADERS MATCHES "LISTED" )
+					foreach( file ${${_PAR_TARGET}_h_srcs} )
+						get_filename_component( _file_dir ${file} PATH )
+						install( FILES ${file} DESTINATION "${_h_destination}/${_file_dir}" )
+					endforeach()
+					if( DEFINED _PAR_TEMPLATES )
+						foreach( file ${_PAR_TEMPLATES} )
+							get_filename_component( _file_dir ${file} PATH )
+							install( FILES ${file} DESTINATION "${_h_destination}/${_file_dir}" )
+						endforeach()
+					endif()
+					if( DEFINED _PAR_PERSISTENT )
+						foreach( file ${_PAR_PERSISTENT} )
+							  get_filename_component( _file_dir ${file} PATH )
+							  get_filename_component( _file_we  ${file} NAME_WE )
+							  set( pfile "${CMAKE_CURRENT_BINARY_DIR}/${_file_dir}/${_file_we}.b" )
+							  install( FILES ${pfile} DESTINATION "${_h_destination}/${_file_dir}" )
+						endforeach()
+					endif()
+				endif()
+				if( _PAR_INSTALL_HEADERS MATCHES "ALL" ) # "(\\.h|\\.b|\\.hxx|\\.hh|\\.hpp|\\.H)" ????
+					install( DIRECTORY ./  DESTINATION ${_h_destination} FILES_MATCHING PATTERN "*.h" )
+					install( DIRECTORY ./  DESTINATION ${_h_destination} FILES_MATCHING PATTERN "*.hh" )
+					install( DIRECTORY ./  DESTINATION ${_h_destination} FILES_MATCHING PATTERN "*.hpp" )
+					install( DIRECTORY ./  DESTINATION ${_h_destination} FILES_MATCHING PATTERN "*.H" )
+				endif()
+			endif()
+
+			if( DEFINED _PAR_INSTALL_HEADERS_LIST )
+				install( FILES ${_PAR_INSTALL_HEADERS_LIST} DESTINATION ${_h_destination} )
+			endif()
+
+			if( DEFINED _PAR_INSTALL_HEADERS_REGEX )
+				install( DIRECTORY ./  DESTINATION ${_h_destination} FILES_MATCHING PATTERN "${_PAR_INSTALL_HEADERS_REGEX}")
+			endif()
+
+			# set build location
+
+			set_property( TARGET ${_PAR_TARGET} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
+			set_property( TARGET ${_PAR_TARGET} PROPERTY ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
+
+			# export location of target to other projects -- must be exactly after setting the build location (see previous 2 commands)
+
+			export( TARGETS ${_PAR_TARGET} APPEND FILE "${TOP_PROJECT_TARGETS_FILE}" )
+
+		endif()
+
+		# add definitions to compilation
+		if( DEFINED _PAR_DEFINITIONS )
+			get_property( _target_defs TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS )
+			list( APPEND _target_defs ${_PAR_DEFINITIONS} )
+			set_property( TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS ${_target_defs} )
+		endif()
+
+		# make sure target is removed before - some problems with AIX
+		add_custom_command( TARGET ${_PAR_TARGET} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E remove $<TARGET_FILE:${_PAR_TARGET}> )
+
+		# for the links target
+		if( NOT _PAR_NOINSTALL )
+			ecbuild_link_lib( ${_PAR_TARGET} $<TARGET_FILE_NAME:${_PAR_TARGET}> $<TARGET_FILE:${_PAR_TARGET}>  )
+		endif()
+
+		# append to the list of this project targets
+		set( ${PROJECT_NAME}_ALL_LIBS ${${PROJECT_NAME}_ALL_LIBS} ${_PAR_TARGET} CACHE INTERNAL "" )
+
+	endif()
+
+	# mark project files
+	ecbuild_declare_project_files( ${_PAR_SOURCES} )
+
+endfunction( ecbuild_add_library_impl  )
+
+##############################################################################
+# auxiliary macro for adding a library
+##############################################################################
+
+macro( ecbuild_add_library )
+
+	set( options  )
+	set( single_value_args TARGET TYPE )
+	set( multi_value_args )
+
+	cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+	if( DEFINED _p_TYPE ) # don't do anything if TYPE was specified
+
+			if( _p_TYPE MATCHES "[Bb][Oo][Tt][Hh]" ) # build both types
+
+				ecbuild_add_library_impl( TARGET ${_p_TARGET}        TYPE SHARED ${_p_UNPARSED_ARGUMENTS} )
+				ecbuild_add_library_impl( TARGET ${_p_TARGET}-static TYPE STATIC ${_p_UNPARSED_ARGUMENTS} OUTPUT_NAME ${_p_TARGET} DEPENDS ${_p_TARGET} )
+
+			else()
+
+				ecbuild_add_library_impl( ${ARGV} )
+
+			endif()
+
+	else()
+
+		if( NOT DEFINED _p_TARGET )
+			message(FATAL_ERROR "The call to ecbuild_add_library() doesn't specify the TARGET.")
+		else()
+
+			if( BUILD_SHARED_LIBS MATCHES "[Bb][Oo][Tt][Hh]" ) # build both types
+
+				ecbuild_add_library_impl( TARGET ${_p_TARGET}        TYPE SHARED ${_p_UNPARSED_ARGUMENTS} )
+				ecbuild_add_library_impl( TARGET ${_p_TARGET}-static TYPE STATIC ${_p_UNPARSED_ARGUMENTS} DEPENDS ${_p_TARGET} )
+
+				set_target_properties( ${_p_TARGET}-static PROPERTIES OUTPUT_NAME ${_p_TARGET} )
+
+			else()
+
+				ecbuild_add_library_impl( ${ARGV} )
+
+			endif()
+
+		endif()
+
+	endif()
+
+endmacro( ecbuild_add_library )
diff --git a/ecbuild/cmake/ecbuild_add_option.cmake b/ecbuild/cmake/ecbuild_add_option.cmake
new file mode 100644
index 0000000..85417fa
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_option.cmake
@@ -0,0 +1,194 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding a test
+##############################################################################
+
+macro( ecbuild_add_option )
+
+	set( options ADVANCED )
+  set( single_value_args FEATURE DEFAULT DESCRIPTION )
+  set( multi_value_args  REQUIRED_PACKAGES CONDITION )
+
+	cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+  if( _p_UNPARSED_ARGUMENTS )
+	  message(FATAL_ERROR "Unknown keywords given to ecbuild_add_option(): \"${_p_UNPARSED_ARGUMENTS}\"")
+  endif()
+
+	# check FEATURE parameter
+
+  if( NOT _p_FEATURE  )
+	  message(FATAL_ERROR "The call to ecbuild_add_option() doesn't specify the FEATURE.")
+  endif()
+
+	# check DEFAULT parameter
+
+  if( NOT DEFINED _p_DEFAULT )
+		set( _p_DEFAULT ON )
+  else()
+		if( NOT _p_DEFAULT MATCHES "[Oo][Nn]" AND NOT _p_DEFAULT MATCHES "[Oo][Ff][Ff]" )
+			message(FATAL_ERROR "In macro ecbuild_add_option(), DEFAULT is either ON or OFF: \"${_p_DEFAULT}\"")
+		endif()
+	endif()
+
+  # check CONDITION parameter
+  if( DEFINED _p_CONDITION )
+    set(_feature_condition_file "${CMAKE_CURRENT_BINARY_DIR}/set_${_p_FEATURE}_condition.cmake")
+    file( WRITE  ${_feature_condition_file} "  if( ")
+    foreach( term ${_p_CONDITION} )
+      file( APPEND ${_feature_condition_file} " ${term}")
+    endforeach()
+    file( APPEND ${_feature_condition_file} " )\n    set(_${_p_FEATURE}_condition TRUE)\n  else()\n    set(_${_p_FEATURE}_condition FALSE)\n  endif()\n")
+    include( ${_feature_condition_file} )
+  else()
+    set( _${_p_FEATURE}_condition TRUE )
+  endif()
+
+	# check if user provided value
+
+	get_property( _in_cache CACHE ENABLE_${_p_FEATURE} PROPERTY VALUE )
+
+	if( NOT "${ENABLE_${_p_FEATURE}}" STREQUAL "" AND _in_cache )
+		set( ${_p_FEATURE}_user_provided_input 1 CACHE BOOL "" )
+	else()
+		set( ${_p_FEATURE}_user_provided_input 0 CACHE BOOL "" )
+	endif()
+
+	mark_as_advanced( ${_p_FEATURE}_user_provided_input )
+
+
+	# define the option -- for cmake GUI
+
+	option( ENABLE_${_p_FEATURE} "${_p_DESCRIPTION}" ${_p_DEFAULT} )
+
+  set( _do_search ${ENABLE_${_p_FEATURE}} )
+  if( _p_FEATURE STREQUAL "OMP" )
+    set( _do_search TRUE )
+  endif()
+
+  if( _do_search  )
+
+    set( HAVE_${_p_FEATURE} 1 )
+
+    if( _${_p_FEATURE}_condition )
+
+      ### search for dependent packages
+
+      foreach( pkg ${_p_REQUIRED_PACKAGES} )
+
+        string(REPLACE " " ";" pkglist ${pkg}) # string to list
+
+        list( GET pkglist 0 pkgname )
+
+        if( pkgname STREQUAL "PROJECT" )  # if 1st entry is PROJECT, then we are looking for a ecbuild project
+          set( pkgproject 1 )
+          list( GET pkglist 1 pkgname )
+        else()                            # else 1st entry is package name
+          set( pkgproject 0 )
+        endif()
+
+        # debug_var( pkg )
+        # debug_var( pkglist )
+        # debug_var( pkgname )
+
+        string( TOUPPER ${pkgname} pkgUPPER )
+        string( TOLOWER ${pkgname} pkgLOWER )
+
+        if( ${pkgname}_FOUND OR ${pkgUPPER}_FOUND OR ${pkgLOWER}_FOUND )
+          set( ${pkgname}_already_found 1 )
+        else()
+
+          ecbuild_add_extra_search_paths( ${pkgLOWER} ) # adds search paths specific to ECMWF
+
+          if( pkgproject )
+            ecbuild_use_package( ${pkglist} )
+          else()
+            if( pkgname STREQUAL "MPI" )
+              set( _find_args ${pkglist} )
+              list( REMOVE_ITEM _find_args "MPI" )
+              ecbuild_find_mpi( ${_find_args} )
+            elseif( pkgname STREQUAL "OMP" )
+              set( _find_args ${pkglist} )
+              list( REMOVE_ITEM _find_args "OMP" )
+              if( NOT ENABLE_${_p_FEATURE} )
+                list( APPEND _find_args STUBS )
+              endif()
+              ecbuild_find_omp( ${_find_args} )
+            else()
+              find_package( ${pkglist} )
+            endif()
+          endif()
+
+          # append to list of third-party libraries (to be forward to other packages )
+          string( TOUPPER ${PROJECT_NAME} PNAME )
+          list( APPEND ${PNAME}_TPLS ${pkgname} )
+
+        endif()
+
+        # debug_var( ${pkgname}_FOUND  )
+        # debug_var( ${pkgLOWER}_FOUND )
+        # debug_var( ${pkgUPPER}_FOUND )
+
+        # we have feature if all required packages were FOUND
+
+        if( ${pkgname}_FOUND OR ${pkgUPPER}_FOUND OR ${pkgLOWER}_FOUND )
+          message( STATUS "Found package ${pkgname} required for feature ${_p_FEATURE}" )
+        else()
+          message( STATUS "Could not find package ${pkgname} required for feature ${_p_FEATURE} -- Provide ${pkgname} location with -D${pkgUPPER}_PATH=/..." )
+          set( HAVE_${_p_FEATURE} 0 )
+          list( APPEND _failed_to_find_packages ${pkgname} )
+        endif()
+
+      endforeach()
+    else()
+      set( HAVE_${_p_FEATURE} 0 )
+    endif()
+
+		# FINAL CHECK
+
+		if( HAVE_${_p_FEATURE} )
+
+			message( STATUS "Feature ${_p_FEATURE} enabled" )
+
+		else() # if user provided input and we cannot satisfy FAIL otherwise WARN
+
+			if( ${_p_FEATURE}_user_provided_input )
+        if( _${_p_FEATURE}_condition )
+          message( FATAL_ERROR "Feature ${_p_FEATURE} cannot be enabled -- following required packages weren't found: ${_failed_to_find_packages}" )
+        else()
+          message( FATAL_ERROR "Feature ${_p_FEATURE} cannot be enabled -- following condition was not met: ${_p_CONDITION}" )
+        endif()
+			else()
+				message( STATUS "Feature ${_p_FEATURE} was not enabled (also not requested) -- following required packages weren't found: ${_failed_to_find_packages}" )
+				set( ENABLE_${_p_FEATURE} OFF )
+			endif()
+
+		endif()
+
+  else( _do_search )
+
+		set( HAVE_${_p_FEATURE} 0 )
+
+  endif( _do_search )
+
+
+	if( ${_p_ADVANCED} )
+		mark_as_advanced( ENABLE_${_p_FEATURE} )
+	else()
+		add_feature_info( ${_p_FEATURE} ENABLE_${_p_FEATURE} "${_p_DESCRIPTION}")
+	endif()
+
+  if( HAVE_${_p_FEATURE} )
+    string( TOUPPER PNAME ${PROJECT_NAME} )
+    set( ${PNAME}_HAVE_${_p_FEATURE} 1 )
+    set( ${PNAME}_FEATURES "${${PNAME}_FEATURES};${PNAME}_HAVE_${_p_FEATURE}" CACHE INTERNAL "" )
+  endif()
+
+endmacro( ecbuild_add_option  )
diff --git a/ecbuild/cmake/ecbuild_add_persistent.cmake b/ecbuild/cmake/ecbuild_add_persistent.cmake
new file mode 100644
index 0000000..c8ef383
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_persistent.cmake
@@ -0,0 +1,61 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding persistent layer object classes
+##############################################################################
+	
+# define the script to build the persistent class information
+set( sg_perl "${CMAKE_CURRENT_LIST_DIR}/sg.pl" CACHE INTERNAL "perl script to generate persistent objects" )
+
+macro( ecbuild_add_persistent )
+
+	ecbuild_find_perl( REQUIRED )
+
+	set( options )
+    set( single_value_args SRC_LIST NAMESPACE )
+    set( multi_value_args  FILES ) 
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_add_persistent(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_SRC_LIST  )
+      message(FATAL_ERROR "The call to ecbuild_add_persistent() doesn't specify the SRC_LIST.")
+    endif()
+
+    if( NOT _PAR_FILES )
+      message(FATAL_ERROR "The call to ecbuild_add_persistent() doesn't specify the FILES.")
+    endif()
+
+    foreach( file ${_PAR_FILES} )
+
+      get_filename_component( _file_dir    ${file} PATH )
+      get_filename_component( _file_we     ${file} NAME_WE )
+
+      set( file ${_file_we} )
+      if( _file_dir )
+         file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_file_dir} )
+         set( file ${_file_dir}/${_file_we} )
+      endif()
+
+      # debug_var(file)
+
+      add_custom_command(
+        OUTPUT  ${file}.b
+		COMMAND ${PERL_EXECUTABLE} ${sg_perl} ${CMAKE_CURRENT_SOURCE_DIR}/${file}.h ${CMAKE_CURRENT_BINARY_DIR}/${_file_dir} ${_PAR_NAMESPACE}
+		DEPENDS ${sg_perl} ${file}.h
+        )
+      set_source_files_properties( ${file}.h PROPERTIES OBJECT_DEPENDS "${file}.b" )
+      list( APPEND ${_PAR_SRC_LIST} ${CMAKE_CURRENT_BINARY_DIR}/${file}.b )
+    
+    endforeach()
+
+endmacro( ecbuild_add_persistent  )
diff --git a/ecbuild/cmake/ecbuild_add_resources.cmake b/ecbuild/cmake/ecbuild_add_resources.cmake
new file mode 100644
index 0000000..12f47af
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_resources.cmake
@@ -0,0 +1,158 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding a resources
+##############################################################################
+
+macro( ecbuild_dont_pack )
+
+    set( options )
+    set( single_value_args REGEX )
+    set( multi_value_args  FILES DIRS )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_add_resources(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT DEFINED _PAR_REGEX AND NOT  DEFINED _PAR_FILES AND NOT  DEFINED _PAR_DIRS )
+      message(FATAL_ERROR "Call to ecbuild_dont_pack does not speficify any list to avoid packing.")
+    endif()
+
+    set( LOCAL_FILES_NOT_TO_PACK "" )
+
+    # all recursive files are not to pack
+    if( DEFINED _PAR_REGEX )
+        file( GLOB_RECURSE all_files_in_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${_PAR_REGEX} )
+        list( APPEND LOCAL_FILES_NOT_TO_PACK ${all_files_in_subdirs} )
+    endif()
+
+    # selected dirs not to pack
+    if( DEFINED _PAR_DIRS )
+        foreach( dir ${_PAR_DIRS} )
+            list( APPEND LOCAL_FILES_NOT_TO_PACK ${dir}/ )
+        endforeach()
+    endif()
+
+    # selected files not to pack
+    if( DEFINED _PAR_FILES )
+        list( APPEND LOCAL_FILES_NOT_TO_PACK ${_PAR_FILES} )
+    endif()
+
+    # transform the local files  to full absolute paths
+    # and place them in the global list of files not to pack
+    foreach( file ${LOCAL_FILES_NOT_TO_PACK} )
+        list( APPEND ECBUILD_DONT_PACK_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${file} )
+    endforeach()
+
+    # save cache if we added any files not to pack
+    if( LOCAL_FILES_NOT_TO_PACK )
+        set( ECBUILD_DONT_PACK_FILES ${ECBUILD_DONT_PACK_FILES} CACHE INTERNAL "" )
+    endif()
+
+endmacro()
+
+macro( ecbuild_add_resources )
+
+    set( options )
+    set( single_value_args TARGET )
+    set( multi_value_args  SOURCES SOURCES_PACK SOURCES_DONT_PACK PACK DONT_PACK DONT_PACK_DIRS DONT_PACK_REGEX )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_add_resources(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_TARGET  )
+      message(FATAL_ERROR "The call to ecbuild_add_resources() doesn't specify the TARGET.")
+    endif()
+
+    set( LOCAL_FILES_NOT_TO_PACK "" )
+
+    # all recursive files are not to pack
+    if( DEFINED _PAR_DONT_PACK_REGEX )
+        foreach( exp ${_PAR_DONT_PACK_REGEX} )
+            file( GLOB_RECURSE all_files_in_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${exp} )
+            list( APPEND LOCAL_FILES_NOT_TO_PACK ${all_files_in_subdirs} )
+        endforeach()
+    endif()
+
+    # selected dirs not to pack
+    if( DEFINED _PAR_DONT_PACK_DIRS )
+        foreach( dir ${_PAR_DONT_PACK_DIRS} )
+            list( APPEND LOCAL_FILES_NOT_TO_PACK ${dir}/ )
+        endforeach()
+    endif()
+
+    # selected files not to pack
+    if( DEFINED _PAR_DONT_PACK )
+        list( APPEND LOCAL_FILES_NOT_TO_PACK ${_PAR_DONT_PACK} )
+    endif()
+
+    # now lets remove files that we want to pack from the list
+    # note that these have priority over the files not to pack
+    # so we can GLOB_RECURSE * -> DONT_PACK and then select only the ones we pack
+
+    # files to pack but are not project files
+    if( DEFINED _PAR_PACK )
+        foreach( file ${_PAR_PACK} )
+            list( REMOVE_ITEM LOCAL_FILES_NOT_TO_PACK ${file} )
+        endforeach()
+    endif()
+
+    # define as project files, but dont pack them
+    if( DEFINED _PAR_SOURCES_DONT_PACK )
+        list( APPEND LOCAL_FILES_NOT_TO_PACK ${_PAR_SOURCES_DONT_PACK} )
+		foreach( sfile ${_PAR_SOURCES_DONT_PACK} )
+			set( _full_sfile "${CMAKE_CURRENT_SOURCE_DIR}/${sfile}" )
+	        if( EXISTS ${_full_sfile} )
+				list( APPEND ${_PAR_TARGET}_files ${_full_sfile} )
+			endif()
+		endforeach()
+    endif()
+
+    # define as project files and pack them
+    # SOURCES_PACK is alias to SOURCES
+    if( DEFINED _PAR_SOURCES_PACK )
+        list( APPEND _PAR_SOURCES ${_PAR_SOURCES_PACK} )
+    endif()
+    if( DEFINED _PAR_SOURCES )
+        list( APPEND ${_PAR_TARGET}_files ${_PAR_SOURCES} )
+        foreach( file ${_PAR_SOURCES} )
+            list( REMOVE_ITEM LOCAL_FILES_NOT_TO_PACK ${file} )
+        endforeach()
+    endif()
+
+    # there are project files, so lets create the target
+    if( DEFINED ${_PAR_TARGET}_files )
+        add_custom_target( ${_PAR_TARGET} SOURCES ${${_PAR_TARGET}_files} )
+    endif()
+
+    # remove CMakeLists.txt
+    foreach( file ${LOCAL_FILES_NOT_TO_PACK} )
+        if( ${file} MATCHES "CMakeLists.txt" )
+            list( REMOVE_ITEM LOCAL_FILES_NOT_TO_PACK ${file} )
+        endif()
+    endforeach()
+
+    # transform the local files  to full absolute paths
+    # and place them in the global list of files not to pack
+    foreach( file ${LOCAL_FILES_NOT_TO_PACK} )
+        list( APPEND ECBUILD_DONT_PACK_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${file} )
+    endforeach()
+
+    # save cache if we added any files not to pack
+    if( LOCAL_FILES_NOT_TO_PACK )
+        set( ECBUILD_DONT_PACK_FILES ${ECBUILD_DONT_PACK_FILES} CACHE INTERNAL "" )
+    endif()
+
+endmacro( ecbuild_add_resources  )
+
diff --git a/ecbuild/cmake/ecbuild_add_test.cmake b/ecbuild/cmake/ecbuild_add_test.cmake
new file mode 100644
index 0000000..44f850f
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_add_test.cmake
@@ -0,0 +1,315 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding a test
+##############################################################################
+
+# Arguments:
+#  TARGET : name of test
+#  ENABLED [optional]: (default ON)
+#  COMMAND [optional]: Run command instead of executable
+#  TYPE [optional]: EXE / SCRIPT / PYTHON  (default EXE)
+#  MPI [optional]: number of mpi-tasks to use. If greater than 1,
+#                  and MPI is not available, the test is disabled
+#  SOURCES: sources to be compiled
+#  LIBS: Libraries needed for linking
+#  INCLUDES: Extra include directories
+#  DEPENDS: Add explicit dependency to other targets (for building)
+#  TEST_DEPENDS: add explicity dependency on another test running before
+#  ARGS: Command-line arguments to COMMAND OR TARGET
+
+macro( ecbuild_add_test )
+
+    set( options           BOOST )
+    set( single_value_args TARGET ENABLED COMMAND TYPE LINKER_LANGUAGE MPI WORKING_DIRECTORY )
+    set( multi_value_args  SOURCES LIBS INCLUDES TEST_DEPENDS DEPENDS ARGS PERSISTENT DEFINITIONS RESOURCES TEST_DATA CFLAGS CXXFLAGS FFLAGS GENERATED CONDITION ENVIRONMENT )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_add_test(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    set( _TEST_DIR ${CMAKE_CURRENT_BINARY_DIR} )
+
+    # Check for MPI
+    if(_PAR_MPI)
+      if( (_PAR_MPI GREATER 1) AND ( (NOT HAVE_MPI) OR (NOT MPIEXEC) ) )
+        set( _PAR_ENABLED 0 )
+      endif()
+      if( (_PAR_MPI EQUAL 1) AND (NOT HAVE_MPI) )
+        set( _PAR_MPI 0 )
+      endif()
+    endif()
+
+    # default is enabled
+    if( NOT DEFINED _PAR_ENABLED )
+      set( _PAR_ENABLED 1 )
+    endif()
+
+
+    ### check test type
+
+    # command implies script
+    if( DEFINED _PAR_COMMAND )
+        set( _PAR_TYPE "SCRIPT" )
+    endif()
+
+    # default of TYPE
+    if( NOT _PAR_TYPE AND DEFINED _PAR_TARGET )
+        set( _PAR_TYPE "EXE" )
+        if( NOT _PAR_SOURCES )
+           message(FATAL_ERROR "The call to ecbuild_add_test() defines neither a TARGET without SOURCES.")
+        endif()
+    endif()
+
+    if( _PAR_TYPE MATCHES "PYTHON" )
+        if( PYTHONINTERP_FOUND )
+            set( _PAR_COMMAND ${PYTHON_EXECUTABLE} )
+        else()
+            message( FATAL_ERROR "Requested a python test but python interpreter not found - PYTHON_EXECUTABLE: [${PYTHON_EXECUTABLE}]" )
+        endif()
+    endif()
+
+    ### further checks
+
+    if( NOT _PAR_TARGET AND NOT _PAR_COMMAND )
+        message(FATAL_ERROR "The call to ecbuild_add_test() defines neither a TARGET nor a COMMAND.")
+    endif()
+
+    if( NOT _PAR_COMMAND AND NOT _PAR_SOURCES )
+      message(FATAL_ERROR "The call to ecbuild_add_test() defines neither a COMMAND nor SOURCES, so no test can be defined or built.")
+    endif()
+
+    if( _PAR_TYPE MATCHES "SCRIPT" AND NOT _PAR_COMMAND )
+        message(FATAL_ERROR "The call to ecbuild_add_test() defines a 'script' but doesn't specify the COMMAND.")
+    endif()
+
+    ### conditional build
+
+    if( DEFINED _PAR_CONDITION )
+        set(_target_condition_file "${CMAKE_CURRENT_BINARY_DIR}/set_${_PAR_TARGET}_condition.cmake")
+        file( WRITE  ${_target_condition_file} "  if( ")
+        foreach( term ${_PAR_CONDITION} )
+            file( APPEND ${_target_condition_file} " ${term}")
+        endforeach()
+        file( APPEND ${_target_condition_file} " )\n    set(_${_PAR_TARGET}_condition TRUE)\n  else()\n    set(_${_PAR_TARGET}_condition FALSE)\n  endif()\n")
+        include( ${_target_condition_file} )
+    else()
+        set( _${_PAR_TARGET}_condition TRUE )
+    endif()
+
+	# boost unit test linking to unit_test lib ?
+
+	if( _PAR_BOOST AND ENABLE_TESTS AND _${_PAR_TARGET}_condition )
+
+		if( HAVE_BOOST_UNIT_TEST )
+			if( BOOST_UNIT_TEST_FRAMEWORK_HEADER_ONLY )
+				include_directories( ${ECBUILD_BOOST_HEADER_DIRS} )
+			else()
+				include_directories( ${ECBUILD_BOOST_HEADER_DIRS} ${Boost_INCLUDE_DIRS} )
+			endif()
+		else()
+			set( _${_PAR_TARGET}_condition FALSE )
+		endif()
+
+	endif()
+
+	### enable the tests
+
+    if( ENABLE_TESTS AND _${_PAR_TARGET}_condition )
+
+      # add resources
+
+      if( DEFINED _PAR_RESOURCES )
+        foreach( rfile ${_PAR_RESOURCES} )
+          execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${rfile} ${CMAKE_CURRENT_BINARY_DIR} )
+        endforeach()
+      endif()
+
+      # build executable
+
+      if( DEFINED _PAR_SOURCES )
+
+                # add include dirs if defined
+                if( DEFINED _PAR_INCLUDES )
+                  list(REMOVE_DUPLICATES _PAR_INCLUDES )
+                  foreach( path ${_PAR_INCLUDES} ) # skip NOTFOUND
+                    if( path )
+                      include_directories( ${path} )
+                    endif()
+                  endforeach()
+                endif()
+
+                # add persistent layer files
+                if( DEFINED _PAR_PERSISTENT )
+		            if( DEFINED PERSISTENT_NAMESPACE )
+        		        ecbuild_add_persistent( SRC_LIST _PAR_SOURCES FILES ${_PAR_PERSISTENT} NAMESPACE ${PERSISTENT_NAMESPACE} )
+            		else()
+                		ecbuild_add_persistent( SRC_LIST _PAR_SOURCES FILES ${_PAR_PERSISTENT} )
+            		endif()
+                endif()
+
+                # add the test target
+
+                add_executable( ${_PAR_TARGET} ${_PAR_SOURCES} )
+
+                # add extra dependencies
+                if( DEFINED _PAR_DEPENDS)
+                  add_dependencies( ${_PAR_TARGET} ${_PAR_DEPENDS} )
+                endif()
+
+                # add the link libraries
+                if( DEFINED _PAR_LIBS )
+                  list(REMOVE_DUPLICATES _PAR_LIBS )
+                  list(REMOVE_ITEM _PAR_LIBS debug)
+                  list(REMOVE_ITEM _PAR_LIBS optimized)
+                  foreach( lib ${_PAR_LIBS} ) # skip NOTFOUND
+                    if( lib )
+                      target_link_libraries( ${_PAR_TARGET} ${lib} )
+                    else()
+                      message( WARNING "Lib ${lib} was skipped" )
+                    endif()
+                  endforeach()
+                endif()
+
+                # add test libraries
+				if( _PAR_BOOST AND BOOST_UNIT_TEST_FRAMEWORK_LINKED AND HAVE_BOOST_UNIT_TEST )
+                    target_link_libraries( ${_PAR_TARGET} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${Boost_TEST_EXEC_MONITOR_LIBRARY} )
+                endif()
+
+                # add local flags
+                if( DEFINED _PAR_CFLAGS )
+                    set_source_files_properties( ${${_PAR_TARGET}_c_srcs}   PROPERTIES COMPILE_FLAGS "${_PAR_CFLAGS}" )
+                endif()
+                if( DEFINED _PAR_CXXFLAGS )
+                    set_source_files_properties( ${${_PAR_TARGET}_cxx_srcs} PROPERTIES COMPILE_FLAGS "${_PAR_CXXFLAGS}" )
+                endif()
+                if( DEFINED _PAR_FFLAGS )
+                    set_source_files_properties( ${${_PAR_TARGET}_f_srcs}   PROPERTIES COMPILE_FLAGS "${_PAR_FFLAGS}" )
+                endif()
+                if( DEFINED _PAR_GENERATED )
+                    set_source_files_properties( ${_PAR_GENERATED} PROPERTIES GENERATED 1 )
+                endif()
+
+
+                # modify definitions to compilation ( -D... )
+                get_property( _target_defs TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS )
+
+                if( DEFINED _PAR_DEFINITIONS )
+                    list( APPEND _target_defs ${_PAR_DEFINITIONS} )
+                endif()
+
+				if( _PAR_BOOST AND BOOST_UNIT_TEST_FRAMEWORK_HEADER_ONLY )
+					list( APPEND _target_defs BOOST_UNIT_TEST_FRAMEWORK_HEADER_ONLY )
+				endif()
+
+			    set_property( TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS ${_target_defs} )
+
+                # set build location to local build dir
+                # not the project base as defined for libs and execs
+                set_property( TARGET ${_PAR_TARGET} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )
+
+				# whatever project settings are, we always build tests with the build_rpath, not the install_rpath
+				set_property( TARGET ${_PAR_TARGET} PROPERTY BUILD_WITH_INSTALL_RPATH FALSE )
+				set_property( TARGET ${_PAR_TARGET} PROPERTY SKIP_BUILD_RPATH         FALSE )
+
+                # set linker language
+                if( DEFINED _PAR_LINKER_LANGUAGE )
+                    set_property( TARGET ${_PAR_TARGET} PROPERTY LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
+                endif()
+
+                # make sure target is removed before - some problems with AIX
+                get_target_property(EXE_FILENAME ${_PAR_TARGET} OUTPUT_NAME)
+                add_custom_command(
+                      TARGET ${_PAR_TARGET}
+                      PRE_BUILD
+                      COMMAND ${CMAKE_COMMAND} -E remove ${EXE_FILENAME}
+                )
+
+				set_property( TARGET ${_PAR_TARGET} PROPERTY SKIP_BUILD_RPATH         FALSE )
+				set_property( TARGET ${_PAR_TARGET} PROPERTY BUILD_WITH_INSTALL_RPATH FALSE )
+
+      endif() # _PAR_SOURCES
+
+      if( DEFINED _PAR_COMMAND AND NOT _PAR_TARGET ) # in the absence of target, we use the command as a name
+          set( _PAR_TARGET ${_PAR_COMMAND} )
+      endif()
+
+      # scripts dont have actual build targets
+      # we build a phony target to trigger the dependencies
+      if( DEFINED _PAR_COMMAND AND DEFINED _PAR_DEPENDS )
+
+          add_custom_target( ${_PAR_TARGET}.x ALL COMMAND ${CMAKE_COMMAND} -E touch ${_PAR_TARGET}.x )
+
+          add_dependencies( ${_PAR_TARGET}.x ${_PAR_DEPENDS} )
+
+      endif()
+
+
+      # define the arguments
+      set( TEST_ARGS "" )
+      if( DEFINED _PAR_ARGS  )
+        list( APPEND TEST_ARGS ${_PAR_ARGS} )
+      endif()
+
+      # Wrap with MPIEXEC
+      if( _PAR_MPI )
+        if( DEFINED _PAR_COMMAND )
+          set( _PAR_COMMAND ${MPIEXEC} -n ${_PAR_MPI} ${_PAR_COMMAND} )
+        else()
+          set( _PAR_COMMAND ${MPIEXEC} -n ${_PAR_MPI} ${_PAR_TARGET} )
+        endif()
+      endif()
+
+      ### define the test
+
+      if( _PAR_ENABLED ) # we can disable and still build it but not run it with 'make tests'
+
+          if( DEFINED _PAR_COMMAND )
+              add_test( ${_PAR_TARGET} ${_PAR_COMMAND} ${TEST_ARGS} ${_working_dir} ) # run a command as test
+          else()
+              add_test( ${_PAR_TARGET} ${_PAR_TARGET}  ${TEST_ARGS} ${_working_dir} ) # run the test that was generated
+          endif()
+
+          # get test data
+
+          if( _PAR_TEST_DATA )
+
+             ecbuild_get_test_multidata( TARGET ${_PAR_TARGET}_data NAMES ${_PAR_TEST_DATA} )
+
+             list( APPEND _PAR_TEST_DEPENDS ${_PAR_TARGET}_data )
+
+          endif()
+
+          if( DEFINED _PAR_ENVIRONMENT )
+              set_property( TEST ${_PAR_TARGET} APPEND PROPERTY ENVIRONMENT "${_PAR_ENVIRONMENT}" )
+          endif()
+
+          if( DEFINED _PAR_WORKING_DIRECTORY )
+              set_tests_properties( ${_PAR_TARGET} PROPERTIES WORKING_DIRECTORY "${_PAR_WORKING_DIRECTORY}")
+          endif()
+
+          if( DEFINED _PAR_TEST_DEPENDS )
+              set_property( TEST ${_PAR_TARGET} APPEND PROPERTY DEPENDS "${_PAR_TEST_DEPENDS}" )
+          endif()
+
+      endif()
+
+      # add to the overall list of tests
+      list( APPEND ECBUILD_ALL_TESTS ${_PAR_TARGET} )
+      list( REMOVE_DUPLICATES ECBUILD_ALL_TESTS )
+      set( ECBUILD_ALL_TESTS ${ECBUILD_ALL_TESTS} CACHE INTERNAL "" )
+
+    endif() # _condition
+
+    # finally mark project files
+    ecbuild_declare_project_files( ${_PAR_SOURCES} )
+
+endmacro( ecbuild_add_test )
diff --git a/ecbuild/cmake/ecbuild_append_to_rpath.cmake b/ecbuild/cmake/ecbuild_append_to_rpath.cmake
new file mode 100644
index 0000000..6868e50
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_append_to_rpath.cmake
@@ -0,0 +1,82 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to append paths to rpath
+
+# if dir is absolute, it simply appends
+# if dir is relative,
+#    then it will try to make it relative to the executables
+#    else it will fallback to making it absolute by prepending the install path
+
+function( _path_append var path )
+	if( "${${var}}" STREQUAL "" )
+		set( ${var} "${path}" PARENT_SCOPE )
+	else()
+		set( ${var} "${${var}}:${path}" PARENT_SCOPE )
+	endif()
+endfunction()
+
+macro( ecbuild_append_to_rpath RPATH_DIRS )
+   
+   if( NOT ${ARGC} EQUAL 1 )
+	   message( SEND_ERROR "ecbuild_append_to_rpath takes 1 argument")
+   endif()
+
+   foreach( RPATH_DIR ${RPATH_DIRS} )
+     
+		if( NOT ${RPATH_DIR} STREQUAL "" )
+        
+			file( TO_CMAKE_PATH ${RPATH_DIR} RPATH_DIR ) # sanitize the path
+
+			if( IS_ABSOLUTE ${RPATH_DIR} )
+
+				_path_append( CMAKE_INSTALL_RPATH "${RPATH_DIR}" )
+
+			else()
+
+				set( _done 0 )
+
+				if( EC_OS_NAME STREQUAL "macosx" )
+
+					if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" VERSION_LESS 3.0) # cmake < 3.0
+						set( CMAKE_INSTALL_NAME_DIR "@loader_path/${RPATH_DIR}" )
+					endif()
+					_path_append( CMAKE_INSTALL_RPATH "@loader_path/${RPATH_DIR}" )
+					set( _done 1 )
+
+				endif()
+
+				if( EC_OS_NAME STREQUAL "linux" )
+					_path_append( CMAKE_INSTALL_RPATH "$ORIGIN/${RPATH_DIR}" )
+					set( _done 1 )
+				endif()
+
+				if( EC_OS_NAME STREQUAL "solaris" )
+					_path_append( CMAKE_INSTALL_RPATH "$ORIGIN/${RPATH_DIR}" )
+					set( _done 1 )
+				endif()
+
+				if( EC_OS_NAME STREQUAL "aix" ) # always relative to exectuable path
+					_path_append( CMAKE_INSTALL_RPATH "${RPATH_DIR}" ) 
+					set( _done 1 )
+				endif()
+
+				# fallback
+
+				if( NOT _done )
+					_path_append( CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${RPATH_DIR}" )
+				endif()
+
+			endif()
+
+     endif()
+
+   endforeach()
+
+endmacro( ecbuild_append_to_rpath )
diff --git a/ecbuild/cmake/ecbuild_bundle.cmake b/ecbuild/cmake/ecbuild_bundle.cmake
new file mode 100644
index 0000000..2a75e84
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_bundle.cmake
@@ -0,0 +1,284 @@
+# Manages an external git repository
+# Usage:
+# git(DIR <directory> URL <giturl> [BRANCH <gitbranch>] [TAG <gittag>] [UPDATE] )
+#
+# Arguments:
+#  - DIR: directory name where repo will be cloned to
+#  - URL: location of origin git repository
+#  - BRANCH (optional): Branch to clone
+#  - TAG (optional): Tag or commit-id to checkout
+#  - UPDATE (optional) : Option to try to update every cmake run
+#  - NOREMOTE (optional) : Option to avoid remote operations that require network
+#                          changes to tags that havent been fetched might fail
+
+macro( debug_here VAR )
+  message( STATUS " >>>>> ${VAR} [${${VAR}}]")
+endmacro()
+
+include(CMakeParseArguments)
+
+set( ECBUILD_GIT  ON  CACHE BOOL "Turn on/off ecbuild_git() function" )
+
+if( ECBUILD_GIT )
+
+  find_package(Git)
+
+  set( ECMWF_USER $ENV{USER} CACHE STRING "ECMWF git user" )
+  set( ECMWF_GIT  SSH        CACHE STRING "ECMWF git protocol" )
+
+  set( ECMWF_GIT_SSH   "ssh://git@software.ecmwf.int:7999"                  CACHE INTERNAL "ECMWF ssh address" )
+  set( ECMWF_GIT_HTTPS "https://${ECMWF_USER}@software.ecmwf.int/stash/scm" CACHE INTERNAL "ECMWF https address" )
+
+  if( ECMWF_GIT MATCHES "[Ss][Ss][Hh]" )
+    set( ECMWF_GIT_ADDRESS ${ECMWF_GIT_SSH} CACHE INTERNAL "" )
+  else()
+    set( ECMWF_GIT_ADDRESS ${ECMWF_GIT_HTTPS} CACHE INTERNAL "" )
+  endif()
+  
+endif()
+
+macro( ecbuild_git )
+
+  set( options UPDATE NOREMOTE )
+  set( single_value_args PROJECT DIR URL TAG BRANCH )
+  set( multi_value_args )
+  cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )
+
+  if( DEFINED _PAR_BRANCH AND DEFINED _PAR_TAG )
+    message( FATAL_ERROR "Cannot defined both BRANCH and TAG in macro ecbuild_git" )
+  endif()
+
+  if( _PAR_UPDATE AND _PAR_NOREMOTE )
+    message( FATAL_ERROR "Cannot pass both NOREMOTE and UPDATE in macro ecbuild_git" )
+  endif()
+
+  if(_PAR_UNPARSED_ARGUMENTS)
+    message(FATAL_ERROR "Unknown keywords given to ecbuild_git(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+  endif()
+
+  if( ECBUILD_GIT )
+
+    set( _needs_switch 0 )
+
+    get_filename_component( ABS_PAR_DIR "${_PAR_DIR}" ABSOLUTE )
+    get_filename_component( PARENT_DIR  "${_PAR_DIR}/.." ABSOLUTE )
+
+    ### clone if no directory
+
+    if( NOT EXISTS "${_PAR_DIR}" )
+
+      message( STATUS "Cloning ${_PAR_PROJECT} from ${_PAR_URL} into ${_PAR_DIR}...")
+      execute_process(
+        COMMAND ${GIT_EXECUTABLE} "clone" ${_PAR_URL} ${clone_args} ${_PAR_DIR} "-q"
+        RESULT_VARIABLE nok ERROR_VARIABLE error
+        WORKING_DIRECTORY "${PARENT_DIR}")
+      if(nok)
+        message(FATAL_ERROR "${_PAR_DIR} git clone failed: ${error}\n")
+      endif()
+      message( STATUS "${_PAR_DIR} retrieved.")
+      set( _needs_switch 1 )
+
+    endif()
+
+    ### check current tag and sha1
+
+    if( IS_DIRECTORY "${_PAR_DIR}/.git" )
+
+        execute_process(
+          COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
+          OUTPUT_VARIABLE _sha1 RESULT_VARIABLE nok ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE
+          WORKING_DIRECTORY "${ABS_PAR_DIR}" )
+        if(nok)
+          message(STATUS "git rev-parse HEAD on ${_PAR_DIR} failed:\n ${error}")
+        endif()
+
+        execute_process(
+          COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
+          OUTPUT_VARIABLE _current_branch RESULT_VARIABLE nok ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE
+          WORKING_DIRECTORY "${ABS_PAR_DIR}" )
+        if( nok OR _current_branch STREQUAL "" )
+          message(STATUS "git rev-parse --abbrev-ref HEAD on ${_PAR_DIR} failed:\n ${error}")
+        endif()
+
+        #message(STATUS "git describe --exact-match --abbrev=0 @ ${ABS_PAR_DIR}")
+        execute_process(
+          COMMAND ${GIT_EXECUTABLE} describe --exact-match --abbrev=0
+          OUTPUT_VARIABLE _current_tag RESULT_VARIABLE nok ERROR_VARIABLE error
+          OUTPUT_STRIP_TRAILING_WHITESPACE  ERROR_STRIP_TRAILING_WHITESPACE
+          WORKING_DIRECTORY "${ABS_PAR_DIR}" )
+
+        if( error MATCHES "no tag exactly matches" OR error MATCHES "No names found" )
+          unset( _current_tag )
+        else()
+          if( nok )
+            message(STATUS "git describe --exact-match --abbrev=0 on ${_PAR_DIR} failed:\n ${error}")
+          endif()
+        endif()
+
+        if( NOT _current_tag ) # try nother method
+          #message(STATUS "git name-rev --tags --name-only @ ${ABS_PAR_DIR}")
+          execute_process(
+            COMMAND ${GIT_EXECUTABLE} name-rev --tags --name-only ${_sha1}
+            OUTPUT_VARIABLE _current_tag RESULT_VARIABLE nok ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE
+            WORKING_DIRECTORY "${ABS_PAR_DIR}" )
+          if( nok OR _current_tag STREQUAL "" )
+            message(STATUS "git name-rev --tags --name-only on ${_PAR_DIR} failed:\n ${error}")
+          endif()
+        endif()
+
+    endif()
+
+    if( DEFINED _PAR_BRANCH AND NOT "${_current_branch}" STREQUAL "${_PAR_BRANCH}" )
+      set( _needs_switch 1 )
+    endif()
+
+    if( DEFINED _PAR_TAG AND NOT "${_current_tag}" STREQUAL "${_PAR_TAG}" )
+      set( _needs_switch 1 )
+    endif()
+
+    if( DEFINED _PAR_BRANCH AND _PAR_UPDATE AND NOT _PAR_NOREMOTE )
+
+      add_custom_target( git_update_${_PAR_PROJECT}
+                         COMMAND "${GIT_EXECUTABLE}" pull -q
+                         WORKING_DIRECTORY "${ABS_PAR_DIR}"
+                         COMMENT "git pull of branch ${_PAR_BRANCH} on ${_PAR_DIR}" )
+
+      set( git_update_targets "git_update_${_PAR_PROJECT};${git_update_targets}" )
+
+    endif()
+
+    ### updates
+
+    if( _needs_switch AND IS_DIRECTORY "${_PAR_DIR}/.git" )
+
+      # debug_here( ABS_PAR_DIR )
+      # debug_here( _sha1 )
+      # debug_here( _current_branch )
+      # debug_here( _current_tag )
+      # debug_here( _PAR_TAG )
+      # debug_here( _PAR_BRANCH )
+      # debug_here( _needs_switch )
+      # debug_here( _PAR_UPDATE )
+
+      if( DEFINED _PAR_BRANCH )
+        set ( _gitref ${_PAR_BRANCH} )
+        message(STATUS "Updating ${_PAR_PROJECT} to head of BRANCH ${_PAR_BRANCH}...")
+      else()
+        message(STATUS "Updating ${_PAR_PROJECT} to TAG ${_PAR_TAG}...")
+        set ( _gitref ${_PAR_TAG} )
+      endif()
+
+      # fetching latest tags and branches
+
+      if( NOT _PAR_NOREMOTE )
+
+          message(STATUS "git fetch --all @ ${ABS_PAR_DIR}")
+          execute_process(COMMAND "${GIT_EXECUTABLE}" fetch --all -q
+            RESULT_VARIABLE nok ERROR_VARIABLE error
+            WORKING_DIRECTORY "${ABS_PAR_DIR}")
+          if(nok)
+            message(STATUS "git fetch --all in ${_PAR_DIR} failed:\n ${error}")
+          endif()
+
+          message(STATUS "git fetch --all --tags @ ${ABS_PAR_DIR}")
+          execute_process(COMMAND "${GIT_EXECUTABLE}" fetch --all --tags -q
+            RESULT_VARIABLE nok ERROR_VARIABLE error
+            WORKING_DIRECTORY "${ABS_PAR_DIR}")
+          if(nok)
+            message(STATUS "git fetch --all --tags in ${_PAR_DIR} failed:\n ${error}")
+          endif()
+
+      else()
+          message(STATUS "${_PAR_DIR} marked NOREMOTE : Skipping git fetch")
+      endif()
+
+      # checking out gitref
+
+      message(STATUS "git checkout ${_gitref} @ ${ABS_PAR_DIR}")
+      execute_process(COMMAND "${GIT_EXECUTABLE}" checkout -q "${_gitref}"
+        RESULT_VARIABLE nok ERROR_VARIABLE error
+        WORKING_DIRECTORY "${ABS_PAR_DIR}")
+      if(nok)
+        message(FATAL_ERROR "git checkout ${_gitref} on ${_PAR_DIR} failed:\n ${error}")
+      endif()
+
+      if( DEFINED _PAR_BRANCH AND _PAR_UPDATE ) #############################################################################
+
+            execute_process(COMMAND "${GIT_EXECUTABLE}" pull -q
+              RESULT_VARIABLE nok ERROR_VARIABLE error
+              WORKING_DIRECTORY "${ABS_PAR_DIR}")
+            if(nok)
+              message(STATUS "git pull of branch ${_PAR_BRANCH} on ${_PAR_DIR} failed:\n ${error}")
+            endif()
+
+      endif() ####################################################################################
+
+    endif( _needs_switch AND IS_DIRECTORY "${_PAR_DIR}/.git" )
+
+  endif( ECBUILD_GIT )
+
+endmacro()
+
+########################################################################################################################
+
+macro( ecmwf_stash )
+
+  set( options )
+  set( single_value_args STASH )
+  set( multi_value_args )
+  cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )
+
+  ecbuild_git( URL "${ECMWF_GIT_ADDRESS}/${_PAR_STASH}.git" ${_PAR_UNPARSED_ARGUMENTS} )
+
+endmacro()
+
+########################################################################################################################
+
+macro( ecbuild_bundle_initialize )
+
+  include( local-config.cmake OPTIONAL )
+
+  # ecmwf_stash( PROJECT ecbuild DIR ${PROJECT_SOURCE_DIR}/ecbuild STASH "ecsdk/ecbuild" BRANCH develop )
+
+  # set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/ecbuild/cmake;${CMAKE_MODULE_PATH}" )
+
+  include( ecbuild_system )
+
+  ecbuild_requires_macro_version( 1.6 )
+
+  ecbuild_declare_project()
+
+  file( GLOB local_config_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *local-config.cmake )
+
+  ecbuild_add_resources( TARGET ecbuild_bundle_dont_pack DONT_PACK "${local_config_files}" )
+
+  if( EXISTS "${PROJECT_SOURCE_DIR}/README.md" )
+    add_custom_target( ${PROJECT_NAME}_readme SOURCES "${PROJECT_SOURCE_DIR}/README.md" )
+  endif()
+
+endmacro()
+
+########################################################################################################################
+
+macro( ecbuild_bundle )
+
+  set( options )
+  set( single_value_args PROJECT )
+  set( multi_value_args )
+  cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )
+
+  ecmwf_stash( PROJECT ${_PAR_PROJECT} DIR ${PROJECT_SOURCE_DIR}/${_PAR_PROJECT} ${_PAR_UNPARSED_ARGUMENTS} )
+
+  ecbuild_use_package( PROJECT ${_PAR_PROJECT} )
+
+endmacro()
+
+macro( ecbuild_bundle_finalize )
+
+  add_custom_target( update DEPENDS ${git_update_targets} )
+
+  ecbuild_install_project( NAME ${CMAKE_PROJECT_NAME} )
+
+  ecbuild_print_summary()
+
+endmacro()
diff --git a/ecbuild/cmake/ecbuild_cache.cmake b/ecbuild/cmake/ecbuild_cache.cmake
new file mode 100644
index 0000000..af12cf1
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_cache.cmake
@@ -0,0 +1,65 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+macro( ecbuild_prepare_cache )
+    include( CheckSymbolExists )
+    include( CheckIncludeFiles )
+    include( CheckCSourceCompiles )
+    include( CheckCXXSourceCompiles )
+    include( CheckTypeSize )
+    set( ecbuild_cache_file ${CMAKE_BINARY_DIR}/ecbuild-cache.cmake )
+    file(WRITE ${ecbuild_cache_file} "# ecbuild cache file\n\n")    
+endmacro()
+
+
+function( ecbuild_cache_var var )
+  if( NOT ${var} )
+    set( ${var} 0 )
+  endif()
+  set( ECBUILD_CACHE_BUFFER "${ECBUILD_CACHE_BUFFER}set( ${var} ${${var}} )\n" CACHE INTERNAL "Cache buffer" )
+endfunction()
+
+function( ecbuild_cache_check_symbol_exists symbol includes output )
+  if( NOT DEFINED ${output} )
+    check_symbol_exists( ${symbol} ${includes} ${output} )
+  endif()
+  ecbuild_cache_var( ${output} )
+endfunction()
+
+function( ecbuild_cache_check_include_files includes output )
+  if( NOT DEFINED ${output} )
+    check_include_files( ${includes} ${output} )
+  endif()
+  ecbuild_cache_var( ${output} )
+endfunction()
+
+function( ecbuild_cache_check_c_source_compiles source output )
+  if( NOT DEFINED ${output} )
+    check_c_source_compiles( "${source}" ${output} )
+  endif()
+  ecbuild_cache_var( ${output} )
+endfunction()
+
+function( ecbuild_cache_check_cxx_source_compiles source output )
+  if( NOT DEFINED ${output} )
+    check_cxx_source_compiles( "${source}" ${output} )
+  endif()
+  ecbuild_cache_var( ${output} )
+endfunction()
+
+function( ecbuild_cache_check_type_size type output )
+  if( NOT DEFINED ${output} )
+    check_type_size( "${type}" ${output} )
+  endif()
+  ecbuild_cache_var( ${output} )
+endfunction()
+
+function( ecbuild_flush_cache )
+  file( APPEND ${ecbuild_cache_file} "${ECBUILD_CACHE_BUFFER}" )
+  set( ECBUILD_CACHE_BUFFER "" CACHE INTERNAL "Cache buffer" )
+endfunction()
\ No newline at end of file
diff --git a/ecbuild/cmake/ecbuild_check_c_source.cmake b/ecbuild/cmake/ecbuild_check_c_source.cmake
new file mode 100644
index 0000000..12a26c1
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_check_c_source.cmake
@@ -0,0 +1,161 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro that runs the given C code and returns its output
+
+macro( ecbuild_check_c_source_return SOURCE )
+
+    set( options )
+    set( single_value_args VAR  OUTPUT )
+    set( multi_value_args  INCLUDES LIBS DEFINITIONS )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_check_c_source_return(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_VAR OR NOT _PAR_OUTPUT )
+      message(FATAL_ERROR "The call to ecbuild_check_c_source_return() doesn't specify either SOURCE, VAR or OUTPUT")
+    endif()
+
+
+    if( NOT DEFINED ${_PAR_VAR} )
+
+        set(MACRO_CHECK_FUNCTION_DEFINITIONS "-D${_PAR_VAR} ${CMAKE_REQUIRED_FLAGS}")
+
+        set(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES)
+        if( CMAKE_REQUIRED_LIBRARIES )
+            list( APPEND __add_libs ${CMAKE_REQUIRED_LIBRARIES} )
+        endif()
+        if( _PAR_LIBS )
+            list( APPEND __add_libs ${_PAR_LIBS} )
+        endif()
+        if( __add_libs )
+            set(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${__add_libs}")
+        endif()
+
+        set(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES)
+        if( CMAKE_REQUIRED_INCLUDES )
+            list( APPEND __add_incs ${CMAKE_REQUIRED_INCLUDES} )
+        endif()
+        if( _PAR_INCLUDES )
+            list( APPEND __add_incs ${_PAR_INCLUDES} )
+        endif()
+		if( __add_incs )
+            set(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${__add_incs}")
+        endif()
+    
+        # write the source file
+    
+        file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.c" "${SOURCE}\n" )
+
+        message( STATUS "Performing Test ${_PAR_VAR}" )
+        try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED
+          ${CMAKE_BINARY_DIR}
+          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.c
+          COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+          CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+          -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
+          "${CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}"
+          "${CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}"
+          COMPILE_OUTPUT_VARIABLE compile_OUTPUT 
+          RUN_OUTPUT_VARIABLE     run_OUTPUT )
+    
+        # if it did not compile make the return value fail code of 1
+        if( NOT ${_PAR_VAR}_COMPILED )
+          set( ${_PAR_VAR}_EXITCODE 1 )
+        endif()
+    
+        # if the return value was 0 then it worked
+        if("${${_PAR_VAR}_EXITCODE}" EQUAL 0)
+    
+          message(STATUS "Performing Test ${_PAR_VAR} - Success")
+          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 
+            "Performing C SOURCE FILE Test ${_PAR_VAR} succeded with the following compile output:\n"
+            "${compile_OUTPUT}\n" 
+            "Performing C SOURCE FILE Run ${_PAR_VAR} succeded with the following run output:\n"
+            "${run_OUTPUT}\n" 
+            "Return value: ${${_PAR_VAR}}\n"
+            "Source file was:\n${SOURCE}\n")
+
+          set( ${_PAR_VAR}     1              CACHE INTERNAL "Test ${_PAR_VAR}")
+          set( ${_PAR_OUTPUT} "${run_OUTPUT}" CACHE INTERNAL "Test ${_PAR_VAR} output")
+    
+        else()
+    
+          if(CMAKE_CROSSCOMPILING AND "${${_PAR_VAR}_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+            set(${_PAR_VAR} "${${_PAR_VAR}_EXITCODE}")
+            set(${OUTPUT} "")
+          else()
+            set(${_PAR_VAR} "" CACHE INTERNAL "Test ${_PAR_VAR}")
+            set(${_PAR_OUTPUT} "" CACHE INTERNAL "Test ${_PAR_VAR} output")
+          endif()
+    
+          message(STATUS "Performing Test ${_PAR_VAR} - Failed")
+          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 
+            "Performing C SOURCE FILE Test ${_PAR_VAR} failed with the following compile output:\n"
+            "${compile_OUTPUT}\n" 
+            "Performing C SOURCE FILE Run ${_PAR_VAR} failed with the following run output:\n"
+            "${run_OUTPUT}\n" 
+            "Return value: ${${_PAR_VAR}_EXITCODE}\n"
+            "Source file was:\n${SOURCE}\n")
+        endif()
+    
+    endif()
+
+endmacro()
+
+##############################################################################
+# macro that only adds a c flag if compiler supports it
+
+macro( cmake_add_c_flags m_c_flags )
+
+  set( _flags ${m_c_flags} )
+
+  if( _flags AND CMAKE_C_COMPILER_LOADED )
+    set( options )
+    set( single_value_args BUILD NAME )
+    set( multi_value_args )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if( NOT DEFINED N_CFLAG )
+      set( N_CFLAG 0 )
+    endif()
+
+    math( EXPR N_CFLAG '${N_CFLAG}+1' )
+
+    if( NOT ECBUILD_TRUST_FLAGS )
+      if( DEFINED _PAR_NAME )
+        check_c_compiler_flag( ${_flags} ${_PAR_NAME} )
+        set( _flag_ok ${${_PAR_NAME}} )
+      else()
+        check_c_compiler_flag( ${_flags} C_FLAG_TEST_${N_CFLAG} )
+        set( _flag_ok ${C_FLAG_TEST_${N_CFLAG}} )
+      endif()
+    else()
+      set( _flag_ok 1 )
+    endif()
+    
+    if( _flag_ok )
+      if( _PAR_BUILD )
+        set( CMAKE_C_FLAGS_${_PAR_BUILD} "${CMAKE_C_FLAGS_${_PAR_BUILD}} ${_flags}" )
+      else()
+        set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flags}" )
+        # message( STATUS "C FLAG [${_flags}] added" )
+      endif()
+    else()
+      message( WARNING "Unrecognised C flag [${_flags}] -- skipping" )
+    endif()
+  endif()
+  unset( _flags )
+  unset( _flag_ok )
+endmacro()
+
diff --git a/ecbuild/cmake/ecbuild_check_compiler.cmake b/ecbuild/cmake/ecbuild_check_compiler.cmake
new file mode 100644
index 0000000..406f1d2
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_check_compiler.cmake
@@ -0,0 +1,141 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+###################################################################################################
+# enable C to use in system introspection
+
+if( NOT CMAKE_C_COMPILER_LOADED AND ENABLE_OS_TESTS )
+	enable_language( C )
+endif()
+
+############################################################################################
+# try to get compiler version if cmake did not
+
+if( NOT CMAKE_C_COMPILER_VERSION )
+
+    set( EC_COMPILER_VERSION "?.?" )
+
+    if( CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Intel" )
+        exec_program( ${CMAKE_C_COMPILER}
+                      ARGS ${CMAKE_C_COMPILER_ARG1} -dumpversion
+                      OUTPUT_VARIABLE EC_COMPILER_VERSION )
+
+        string(REGEX REPLACE "([0-9])\\.([0-9])(\\.([0-9]))?" "\\1.\\2"  EC_COMPILER_VERSION ${EC_COMPILER_VERSION} )
+    endif()
+
+    if( CMAKE_C_COMPILER_ID MATCHES "Clang" )
+        exec_program( ${CMAKE_C_COMPILER}
+                      ARGS ${CMAKE_C_COMPILER_ARG1} --version
+                      OUTPUT_VARIABLE EC_COMPILER_VERSION )
+
+        string(REGEX REPLACE ".*clang version ([0-9])\\.([0-9])(\\.([0-9]))?.*" "\\1.\\2" EC_COMPILER_VERSION ${EC_COMPILER_VERSION} )
+    endif()
+
+    if( CMAKE_C_COMPILER_ID MATCHES "SunPro" )
+        exec_program( ${CMAKE_C_COMPILER}
+                      ARGS ${CMAKE_C_COMPILER_ARG1} -V
+                      OUTPUT_VARIABLE EC_COMPILER_VERSION )
+
+        string(REGEX REPLACE ".*([0-9]+)\\.([0-9]+).*" "\\1.\\2" EC_COMPILER_VERSION ${EC_COMPILER_VERSION} )
+    endif()
+
+    if( CMAKE_C_COMPILER_ID MATCHES "XL" )
+        exec_program( ${CMAKE_C_COMPILER}
+                      ARGS ${CMAKE_C_COMPILER_ARG1} -qversion
+                      OUTPUT_VARIABLE EC_COMPILER_VERSION )
+
+        string(REGEX REPLACE ".*V([0-9]+)\\.([0-9]+).*" "\\1.\\2" EC_COMPILER_VERSION ${EC_COMPILER_VERSION} )
+
+    endif()
+
+    if( NOT EC_COMPILER_VERSION STREQUAL "?.?" )
+        set(CMAKE_C_COMPILER_VERSION "${EC_COMPILER_VERSION}" )
+    endif()
+
+endif()
+
+############################################################################################
+# c compiler tests
+
+if( CMAKE_C_COMPILER_LOADED AND ENABLE_OS_TESTS )
+
+	ecbuild_cache_check_c_source_compiles(
+		  " typedef int foo_t;
+			static inline foo_t static_foo(){return 0;}
+			foo_t foo(){return 0;}
+			int main(int argc, char *argv[]){return 0;}
+		  " EC_HAVE_C_INLINE )
+
+endif()
+
+############################################################################################
+# c++ compiler tests
+
+if( CMAKE_CXX_COMPILER_LOADED AND ENABLE_OS_TESTS )
+
+    # check for __FUNCTION__
+    ecbuild_cache_check_cxx_source_compiles( "#include <iostream>\nint main(int argc, char* argv[]) { std::cout << __FUNCTION__ << std::endl; }"
+      EC_HAVE_FUNCTION_DEF )
+    
+
+    # check for c++ abi, usually present in GNU compilers
+    ecbuild_cache_check_cxx_source_compiles( "#include <cxxabi.h>\n int main() { char * type; int status; char * r = abi::__cxa_demangle(type, 0, 0, &status); }"
+    EC_HAVE_CXXABI_H )
+
+    # check for bool
+    ecbuild_cache_check_cxx_source_compiles( "int main() { bool aflag = true; }"
+	  EC_HAVE_CXX_BOOL )
+
+    # check for sstream
+    ecbuild_cache_check_cxx_source_compiles( "#include <sstream>\nint main() { std::stringstream s; }"
+	  EC_HAVE_CXX_SSTREAM )
+ 
+endif()
+
+############################################################################################
+# enable warnings
+
+if( CMAKE_COMPILER_IS_GNUCC )
+
+    cmake_add_c_flags("-pipe") # use pipe for faster compilation
+
+    if( ENABLE_WARNINGS )
+        cmake_add_c_flags("-Wall")
+        cmake_add_c_flags("-pedantic")
+        #    cmake_add_c_flags("-Wextra")
+    endif()
+
+endif()
+
+if( CMAKE_COMPILER_IS_GNUCXX )
+
+   cmake_add_cxx_flags("-pipe") # use pipe for faster compilation
+
+    if( ENABLE_WARNINGS )
+        cmake_add_cxx_flags("-Wall")
+        #    cmake_add_cxx_flags("-Wextra")
+    endif()
+
+endif()
+
+############################################################################################
+# compiler dependent fixes
+
+# For Cray compilers add "-Wl,-Bdynamic" at very end of linker commands, in order to produce dynamic executables by default
+
+if( "${CMAKE_C_COMPILER_ID}" STREQUAL "Cray" )
+  set( CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES> -Wl,-Bdynamic" )
+endif()
+
+if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Cray" )
+  set( CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES> -Wl,-Bdynamic" )
+endif()
+
+if( "${CMAKE_Fortran_COMPILER_ID}" STREQUAL "Cray" )
+  set(CMAKE_Fortran_LINK_EXECUTABLE "<CMAKE_Fortran_COMPILER> <CMAKE_Fortran_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES> -Wl,-Bdynamic" )
+endif()
diff --git a/ecbuild/cmake/ecbuild_check_cxx11.cmake b/ecbuild/cmake/ecbuild_check_cxx11.cmake
new file mode 100644
index 0000000..ef1b24e
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_check_cxx11.cmake
@@ -0,0 +1,67 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to check for cxx11 features
+# uses macros from the project github.com/UCL/GreatCMakeCookOff
+
+function( ecbuild_check_cxx11 )
+
+	# parse parameters
+
+	set( options PRINT )
+	set( single_value_args )
+	set( multi_value_args   FEATURES REQUIRED )
+
+	cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+	if(_PAR_UNPARSED_ARGUMENTS)
+		message(FATAL_ERROR "Unknown keywords given to ecbuild_check_cxx11(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+	endif()
+
+	include( ${ECBUILD_MACROS_DIR}/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake )
+
+	cxx11_find_all_features( ALL_FEATURES ) # list all available features to check
+
+	if( NOT _p_FEATURES AND NOT _p_REQUIRED ) # no input, then searhc for all features
+
+		cxx11_feature_check()
+
+	else()
+
+		foreach( _f ${_p_FEATURES} )
+			cxx11_feature_check( ${_f} )
+		endforeach()
+
+		foreach( _f ${_p_REQUIRED} )
+			cxx11_feature_check( REQUIRED ${_f} )
+		endforeach()
+
+	endif()
+
+	foreach( f ${ALL_FEATURES} )
+		# message( "HAS_CXX11_${FEAT}" )
+		string( TOUPPER ${f} FEAT )
+		if( HAS_CXX11_${FEAT} )
+		   list( APPEND CXX11_SUPPORTED_FEATURES ${f} )
+		else()
+		   list( APPEND CXX11_NOT_SUPPORTED_FEATURES ${f} )
+		endif()
+	endforeach()
+
+	set( CXX11_SUPPORTED_FEATURES     ${CXX11_SUPPORTED_FEATURES}     PARENT_SCOPE )
+	set( CXX11_NOT_SUPPORTED_FEATURES ${CXX11_NOT_SUPPORTED_FEATURES} PARENT_SCOPE )
+
+	if( _p_PRINT )
+		if( CXX11_SUPPORTED_FEATURES )
+			join( CXX11_SUPPORTED_FEATURES " " CXX11_SUPPORTED_FEATURES_STR )
+			message( STATUS "Found C++11 features: ${CXX11_SUPPORTED_FEATURES_STR}" )
+		endif()
+	endif()
+
+endfunction( ecbuild_check_cxx11 )
diff --git a/ecbuild/cmake/ecbuild_check_cxx_source.cmake b/ecbuild/cmake/ecbuild_check_cxx_source.cmake
new file mode 100644
index 0000000..a48ae5a
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_check_cxx_source.cmake
@@ -0,0 +1,160 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro that runs the given C++ code and returns its output
+
+macro( ecbuild_check_cxx_source_return SOURCE )
+
+    set( options )
+    set( single_value_args VAR  OUTPUT )
+    set( multi_value_args  INCLUDES LIBS DEFINITIONS )
+
+    cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_p_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_check_cxx_source_return(): \"${_p_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _p_VAR OR NOT _p_OUTPUT )
+      message(FATAL_ERROR "The call to ecbuild_check_cxx_source_return() doesn't specify either SOURCE, VAR or OUTPUT")
+    endif()
+
+    set( _msg "Testing ${_p_VAR}:" )
+
+    if( NOT DEFINED ${_p_VAR} )
+
+        set(MACRO_CHECK_FUNCTION_DEFINITIONS "-D${_p_VAR} ${CMAKE_REQUIRED_FLAGS}")
+
+        set(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES)
+        if(CMAKE_REQUIRED_LIBRARIES)
+            list( APPEND __add_libs ${CMAKE_REQUIRED_LIBRARIES} )
+        endif()
+        if( _p_LIBS )
+            list( APPEND __add_libs ${_p_LIBS} )
+        endif()
+        if( __add_libs )
+            set(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${__add_libs}")
+        endif()
+
+        set(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES)
+        if(CMAKE_REQUIRED_INCLUDES)
+            list( APPEND __add_incs ${CMAKE_REQUIRED_INCLUDES} )
+        endif()
+        if( _p_INCLUDES )
+            list( APPEND __add_incs ${_p_INCLUDES} )
+        endif()
+		if( __add_incs )
+            set(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${__add_incs}")
+        endif()
+    
+        # write the source file
+    
+        file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_p_VAR}.cxx" "${SOURCE}\n" )
+
+        message( STATUS "${_msg}" )
+        try_run( ${_p_VAR}_EXITCODE ${_p_VAR}_COMPILED
+          ${CMAKE_BINARY_DIR}
+          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_p_VAR}.cxx
+          COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+          CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+          -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
+          "${CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES}"
+          "${CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES}"
+          COMPILE_OUTPUT_VARIABLE compile_OUTPUT 
+          RUN_OUTPUT_VARIABLE     run_OUTPUT )
+   
+	  # debug_var( ${_p_VAR}_COMPILED )
+	  # debug_var( ${_p_VAR}_EXITCODE )
+
+        # if it did not compile make the return value fail code of 1
+
+        if( NOT ${_p_VAR}_COMPILED )
+          message( STATUS "${_msg} failed to compile" )
+        endif()
+
+        if( "${${_p_VAR}_EXITCODE}" MATCHES  "FAILED_TO_RUN" )
+          message( STATUS "${_msg} failed to run" )
+        endif()
+
+        # if the return value was 0 then it worked
+        if( ${_p_VAR}_COMPILED AND "${${_p_VAR}_EXITCODE}" EQUAL 0 )
+    
+          message(STATUS "${_msg} Success")
+          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 
+            "Performing C++ SOURCE FILE Test ${_p_VAR} succeded with the following compile output:\n"
+            "${compile_OUTPUT}\n" 
+            "Performing C++ SOURCE FILE Run ${_p_VAR} succeded with the following run output:\n"
+            "${run_OUTPUT}\n" 
+            "Return value: ${${_p_VAR}}\n"
+            "Source file was:\n${SOURCE}\n")
+
+          set( ${_p_VAR}     1              CACHE INTERNAL "Test ${_p_VAR}")
+          set( ${_p_OUTPUT} "${run_OUTPUT}" CACHE INTERNAL "Test ${_p_VAR} output")
+    
+        else()
+    
+          if(CMAKE_CROSSCOMPILING AND "${${_p_VAR}_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+            set(${_p_VAR} "${${_p_VAR}_EXITCODE}")
+            set(${OUTPUT} "")
+          else()
+            set(${_p_VAR} "" CACHE INTERNAL "Test ${_p_VAR}")
+            set(${_p_OUTPUT} "" CACHE INTERNAL "Test ${_p_VAR} output")
+          endif()
+    
+          message(STATUS "Test ${_p_VAR} - Failed")
+          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 
+            "Performing C++ SOURCE FILE Test ${_p_VAR} failed with the following compile output:\n"
+            "${compile_OUTPUT}\n" 
+            "Performing C++ SOURCE FILE Run ${_p_VAR} failed with the following run output:\n"
+            "${run_OUTPUT}\n" 
+            "Return value: ${${_p_VAR}_EXITCODE}\n"
+            "Source file was:\n${SOURCE}\n")
+        endif()
+    
+    endif()
+
+endmacro()
+
+##############################################################################
+# macro that only adds a cxx flag if compiler supports it
+
+macro( cmake_add_cxx_flags m_cxx_flags )
+
+  set( _flags ${m_cxx_flags} )
+  if( _flags AND CMAKE_CXX_COMPILER_LOADED )
+    set( options )
+    set( single_value_args BUILD )
+    set( multi_value_args )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if( NOT DEFINED N_CXXFLAG )
+      set( N_CXXFLAG 0 )
+    endif()
+
+    math( EXPR N_CXXFLAG '${N_CXXFLAG}+1' )
+
+    if( NOT ECBUILD_TRUST_FLAGS )
+      check_cxx_compiler_flag( ${_flags} CXX_FLAG_TEST_${N_CXXFLAG} )
+    endif()
+
+    if( CXX_FLAG_TEST_${N_CXXFLAG} OR ECBUILD_TRUST_FLAGS )
+      if( _PAR_BUILD )
+        set( CMAKE_CXX_FLAGS_${_PAR_BUILD} "${CMAKE_CXX_FLAGS_${_PAR_BUILD}} ${_flags}" )
+      else()
+        set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flags}" )
+        # message( STATUS "C++ FLAG [${_flags}] added" )
+      endif()
+    else()
+      message( STATUS "Unrecognised CXX flag [${_flags}] -- skipping" )
+    endif()
+  endif()
+  unset( _flags )
+
+endmacro()
diff --git a/ecbuild/cmake/ecbuild_check_fortran_source.cmake b/ecbuild/cmake/ecbuild_check_fortran_source.cmake
new file mode 100644
index 0000000..da04a70
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_check_fortran_source.cmake
@@ -0,0 +1,157 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro that runs the given Fortran code and returns its output
+
+macro( ecbuild_check_fortran_source_return SOURCE )
+
+    message( WARNING "This macro ecbuild_check_fortran_source has never been tested" )
+    set( options )
+    set( single_value_args VAR  OUTPUT )
+    set( multi_value_args  INCLUDES LIBS DEFINITIONS )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_check_fortran_source_return(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_VAR OR NOT _PAR_OUTPUT )
+      message(FATAL_ERROR "The call to ecbuild_check_fortran_source_return() doesn't specify either SOURCE, VAR or OUTPUT")
+    endif()
+
+
+    if( NOT DEFINED ${_PAR_VAR} )
+
+        set(MACRO_CHECK_FUNCTION_DEFINITIONS "-D${_PAR_VAR} ${CMAKE_REQUIRED_FLAGS}")
+
+        set(CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES)
+        if( CMAKE_REQUIRED_LIBRARIES )
+            list( APPEND __add_libs ${CMAKE_REQUIRED_LIBRARIES} )
+        endif()
+        if( _PAR_LIBS )
+            list( APPEND __add_libs ${_PAR_LIBS} )
+        endif()
+        if( __add_libs )
+            set(CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${__add_libs}")
+        endif()
+
+        set(CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES)
+        if( CMAKE_REQUIRED_INCLUDES )
+            list( APPEND __add_incs ${CMAKE_REQUIRED_INCLUDES} )
+        endif()
+        if( _PAR_INCLUDES )
+            list( APPEND __add_incs ${_PAR_INCLUDES} )
+        endif()
+        if( __add_libs )
+            set(CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${__add_incs}")
+        endif()
+    
+        # write the source file
+    
+        file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.f" "${SOURCE}\n" )
+
+        message( STATUS "Performing Test ${_PAR_VAR}" )
+        try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED
+          ${CMAKE_BINARY_DIR}
+          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.f
+          COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+          CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+          -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
+          "${CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES}"
+          "${CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES}"
+          COMPILE_OUTPUT_VARIABLE compile_OUTPUT 
+          RUN_OUTPUT_VARIABLE     run_OUTPUT )
+    
+        # if it did not compile make the return value fail code of 1
+        if( NOT ${_PAR_VAR}_COMPILED )
+          set( ${_PAR_VAR}_EXITCODE 1 )
+        endif()
+    
+        # if the return value was 0 then it worked
+        if("${${_PAR_VAR}_EXITCODE}" EQUAL 0)
+    
+          message(STATUS "Performing Test ${_PAR_VAR} - Success")
+          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 
+            "Performing Fortran SOURCE FILE Test ${_PAR_VAR} succeded with the following compile output:\n"
+            "${compile_OUTPUT}\n" 
+            "Performing Fortran SOURCE FILE Run ${_PAR_VAR} succeded with the following run output:\n"
+            "${run_OUTPUT}\n" 
+            "Return value: ${${_PAR_VAR}}\n"
+            "Source file was:\n${SOURCE}\n")
+
+          set( ${_PAR_VAR}     1              CACHE INTERNAL "Test ${_PAR_VAR}")
+          set( ${_PAR_OUTPUT} "${run_OUTPUT}" CACHE INTERNAL "Test ${_PAR_VAR} output")
+    
+        else()
+    
+          if(CMAKE_CROSSCOMPILING AND "${${_PAR_VAR}_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+            set(${_PAR_VAR} "${${_PAR_VAR}_EXITCODE}")
+            set(${OUTPUT} "")
+          else()
+            set(${_PAR_VAR} "" CACHE INTERNAL "Test ${_PAR_VAR}")
+            set(${_PAR_OUTPUT} "" CACHE INTERNAL "Test ${_PAR_VAR} output")
+          endif()
+    
+          message(STATUS "Performing Test ${_PAR_VAR} - Failed")
+          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 
+            "Performing C SOURCE FILE Test ${_PAR_VAR} failed with the following compile output:\n"
+            "${compile_OUTPUT}\n" 
+            "Performing C SOURCE FILE Run ${_PAR_VAR} failed with the following run output:\n"
+            "${run_OUTPUT}\n" 
+            "Return value: ${${_PAR_VAR}_EXITCODE}\n"
+            "Source file was:\n${SOURCE}\n")
+        endif()
+    
+    endif()
+
+endmacro()
+
+##############################################################################
+# macro that only adds a Fortran flag if compiler supports it
+
+include( CheckFortranCompilerFlag )
+macro( cmake_add_fortran_flags m_fortran_flags )
+
+  set( _flags ${m_fortran_flags} )
+
+  if( _flags AND CMAKE_Fortran_COMPILER_LOADED )
+
+    set( options )
+    set( single_value_args BUILD )
+    set( multi_value_args )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if( NOT DEFINED N_FortranFLAG )
+      set( N_FortranFLAG 0 )
+    endif()
+
+    math( EXPR N_FortranFLAG '${N_FortranFLAG}+1' )
+
+    if( NOT ECBUILD_TRUST_FLAGS )
+      check_fortran_compiler_flag( ${_flags} Fortran_FLAG_TEST_${N_FortranFLAG} )
+    endif()
+
+    if( Fortran_FLAG_TEST_${N_FortranFLAG} OR ECBUILD_TRUST_FLAGS )
+      if( _PAR_BUILD )
+        set( CMAKE_Fortran_FLAGS_${_PAR_BUILD} "${CMAKE_Fortran_FLAGS_${_PAR_BUILD}} ${_flags}" )
+      else()
+        set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${_flags}" )
+        # message( STATUS "Fortran FLAG [${_flags}] added" )
+      endif()
+    else()
+      message( STATUS "Unrecognised Fortran flag [${_flags}] -- skipping" )
+    endif()
+  endif()
+
+  unset( _flags )
+
+endmacro()
+
diff --git a/ecbuild/cmake/ecbuild_check_functions.cmake b/ecbuild/cmake/ecbuild_check_functions.cmake
new file mode 100644
index 0000000..e859432
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_check_functions.cmake
@@ -0,0 +1,125 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# os capability checks
+
+if( ENABLE_OS_FUNCTIONS_TEST )
+    
+    ### symbol checks ##################
+
+    ecbuild_cache_check_symbol_exists( fseek        "stdio.h"                         EC_HAVE_FSEEK  )
+    ecbuild_cache_check_symbol_exists( fseeko       "stdio.h"                         EC_HAVE_FSEEKO )
+    ecbuild_cache_check_symbol_exists( ftello       "stdio.h"                         EC_HAVE_FTELLO )
+    ecbuild_cache_check_symbol_exists( lseek        "sys/types.h;unistd.h"            EC_HAVE_LSEEK  )
+    ecbuild_cache_check_symbol_exists( ftruncate    "sys/types.h;unistd.h"            EC_HAVE_FTRUNCATE  )
+    ecbuild_cache_check_symbol_exists( open         "sys/types.h;sys/stat.h;fcntl.h"  EC_HAVE_OPEN   )
+    ecbuild_cache_check_symbol_exists( fopen        "stdio.h"                         EC_HAVE_FOPEN  )
+    ecbuild_cache_check_symbol_exists( flock        "sys/file.h"                      EC_HAVE_FLOCK  )
+    ecbuild_cache_check_symbol_exists( mmap         "sys/mman.h"                      EC_HAVE_MMAP   )
+    
+    ecbuild_cache_check_symbol_exists( posix_memalign "stdlib.h"                      EC_HAVE_POSIX_MEMALIGN )
+    
+    ecbuild_cache_check_symbol_exists( F_GETLK      "fcntl.h"                         EC_HAVE_F_GETLK  )
+    ecbuild_cache_check_symbol_exists( F_SETLK      "fcntl.h"                         EC_HAVE_F_SETLK  )
+    ecbuild_cache_check_symbol_exists( F_SETLKW     "fcntl.h"                         EC_HAVE_F_SETLKW  )
+     
+    ecbuild_cache_check_symbol_exists( F_GETLK64     "fcntl.h"                        EC_HAVE_F_GETLK64  )
+    ecbuild_cache_check_symbol_exists( F_SETLK64     "fcntl.h"                        EC_HAVE_F_SETLK64  )
+    ecbuild_cache_check_symbol_exists( F_SETLKW64    "fcntl.h"                        EC_HAVE_F_SETLKW64  )
+    
+    ecbuild_cache_check_symbol_exists( MAP_ANONYMOUS "sys/mman.h"                     EC_HAVE_MAP_ANONYMOUS )
+    ecbuild_cache_check_symbol_exists( MAP_ANON      "sys/mman.h"                     EC_HAVE_MAP_ANON )
+
+    ### include files checks ##################
+
+    ecbuild_cache_check_include_files( assert.h       EC_HAVE_ASSERT_H      )
+    ecbuild_cache_check_include_files( stdlib.h       EC_HAVE_STDLIB_H      )
+    ecbuild_cache_check_include_files( unistd.h       EC_HAVE_UNISTD_H      )
+    ecbuild_cache_check_include_files( string.h       EC_HAVE_STRING_H      )
+    ecbuild_cache_check_include_files( strings.h      EC_HAVE_STRINGS_H     )
+    ecbuild_cache_check_include_files( sys/stat.h     EC_HAVE_SYS_STAT_H    )
+    ecbuild_cache_check_include_files( sys/time.h     EC_HAVE_SYS_TIME_H    )
+    ecbuild_cache_check_include_files( sys/types.h    EC_HAVE_SYS_TYPES_H   )
+    ecbuild_cache_check_include_files( malloc.h       EC_HAVE_MALLOC_H      )
+    ecbuild_cache_check_include_files( sys/malloc.h   EC_HAVE_SYS_MALLOC_H  )
+    
+    ecbuild_cache_check_include_files( sys/param.h    EC_HAVE_SYS_PARAM_H   )
+    ecbuild_cache_check_include_files( sys/mount.h    EC_HAVE_SYS_MOUNT_H   )
+    ecbuild_cache_check_include_files( sys/vfs.h      EC_HAVE_SYS_VFS_H     )
+
+    ### capability checks ##################
+
+    # test off_t
+    ecbuild_cache_check_c_source_compiles( "#include <sys/types.h>\nint main(){ off_t l=0; return 0;}\n" EC_HAVE_OFFT )
+    # test off64_t
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <stdio.h>\n#include <sys/types.h>\nint main(){ off64_t l=0; return 0;}\n" EC_HAVE_OFF64T  )
+    # test struct stat
+    ecbuild_cache_check_c_source_compiles( "#include <sys/stat.h>\nint main(){ struct stat s; return 0; }"   EC_HAVE_STRUCT_STAT )
+    # test struct stat64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <sys/stat.h>\nint main(){ struct stat64 s; return 0; }" EC_HAVE_STRUCT_STAT64 )
+    # test stat
+    ecbuild_cache_check_c_source_compiles( "#include <sys/stat.h>\nint main(){ struct stat s;	stat(\"\",&s); return 0; }"    EC_HAVE_STAT )
+    # test stat64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <sys/stat.h>\nint main(){ struct stat64 s; stat64(\"\",&s); return 0; }"  EC_HAVE_STAT64 )
+    # test fstat
+    ecbuild_cache_check_c_source_compiles( "#include <sys/stat.h>\nint main(){ struct stat s; fstat(1,&s); return 0; }" EC_HAVE_FSTAT )
+    # test fstat64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <sys/stat.h>\nint main(){ struct stat64 s; fstat64(1,&s); return 0; }" EC_HAVE_FSTAT64 )
+    # test fseeko64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <stdio.h>\n#include <sys/types.h>\nint main(){FILE* file;off64_t l=0;fseeko64(file,l,SEEK_CUR);return 0;}\n" EC_HAVE_FSEEKO64 )
+   
+    # test for ftello64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <stdio.h>\n#include <sys/types.h>\nint main(){FILE* file;off64_t l = ftello64(file);return 0;}\n"  EC_HAVE_FTELLO64 )
+    
+    # test for lseek64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <sys/types.h>\n#include <unistd.h>\nint main(){off64_t h = lseek64(0,0,SEEK_SET);return 0;}\n"  EC_HAVE_LSEEK64 )
+    # test for open64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <fcntl.h>\nint main(){int fd = open64(\"name\",O_RDWR|O_CREAT,0777);return 0;}\n" EC_HAVE_OPEN64 )
+    # test for fopen64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <stdio.h>\nint main(){FILE* file = fopen64(\"name\",\"w\");return 0;}\n"  EC_HAVE_FOPEN64 )
+    # test for ftruncate64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <unistd.h>\n#include <sys/types.h>\nint main(){ftruncate64(0,(off64_t)0);return 0;}\n" EC_HAVE_FTRUNCATE64 )
+    # test for flock64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <fcntl.h>\nint main(){struct flock64 l;return 0;}\n" EC_HAVE_FLOCK64 )
+    # test for mmap64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <sys/mman.h>\nint main(){void* addr = mmap64(0,10,PROT_READ|PROT_WRITE,MAP_PRIVATE,10,0); return 0;}\n" EC_HAVE_MMAP64 )
+    # test for struct statvfs
+    ecbuild_cache_check_c_source_compiles( "#include <sys/statvfs.h>\nint main(){ struct statvfs v; }" EC_HAVE_STRUCT_STATVFS )
+    # test for struct statvfs64
+    ecbuild_cache_check_c_source_compiles( "#define _LARGEFILE64_SOURCE\n#include <sys/statvfs.h>\nint main(){ struct statvfs64 v; }" EC_HAVE_STRUCT_STATVFS64 )
+        
+    # test for fsync
+    ecbuild_cache_check_symbol_exists(fsync "unistd.h" EC_HAVE_FSYNC)
+    # test for fdatasync
+    ecbuild_cache_check_symbol_exists(fdatasync "unistd.h" EC_HAVE_FDATASYNC)
+    # test for dirfd
+    ecbuild_cache_check_c_source_compiles( "#include <sys/types.h>\n#include <dirent.h>\nint main(){ DIR *dirp; int i = dirfd(dirp); }\n" EC_HAVE_DIRFD )
+    # test for sys/proc.h
+    ecbuild_cache_check_c_source_compiles( "#include <sys/proc.h>\nint main(){ return 0; }\n" EC_HAVE_SYSPROC )
+    # test for procfs
+    ecbuild_cache_check_c_source_compiles( "#include <sys/procfs.h>\nint main(){ return 0; }\n" EC_HAVE_SYSPROCFS )
+    # test for backtrace
+    ecbuild_cache_check_c_source_compiles( "#include <unistd.h>\n#include <execinfo.h>\n int main(){ void ** buffer; int i = backtrace(buffer, 256); }\n" EC_HAVE_EXECINFO_BACKTRACE )
+           
+    #### reentrant funtions support  #############
+
+    # test for gmtime_r
+    ecbuild_cache_check_c_source_compiles( "#include <time.h>\nint main(){ time_t now; time(&now); struct tm t; gmtime_r(&now,&t); }\n" EC_HAVE_GMTIME_R )
+    # test for getpwuid_r
+    ecbuild_cache_check_c_source_compiles( "#include <unistd.h>\n#include <sys/types.h>\n#include <pwd.h>\nint main(){ char buf[4096]; struct passwd pwbuf; struct passwd *pwbufp = 0; getpwuid_r(getuid(), &pwbuf, buf, sizeof(buf), &pwbufp); }\n" EC_HAVE_GETPWUID_R )
+    # test for getpwnam_r
+    ecbuild_cache_check_c_source_compiles( "#include <sys/types.h>\n#include <pwd.h>\nint main(){ struct passwd p; char line[1024]; int n = getpwnam_r(\"user\",&p,line,sizeof(line),0); }\n" EC_HAVE_GETPWNAM_R )    
+    # test for readdir_r
+    ecbuild_cache_check_c_source_compiles( "#include <dirent.h>\nint main(){ DIR *dirp; struct dirent *entry; struct dirent **result; int i = readdir_r(dirp, entry, result); }\n" EC_HAVE_READDIR_R )
+    # test for gethostbyname_r
+    ecbuild_cache_check_c_source_compiles( "#include <netdb.h>\nint main(){ const char *name; struct hostent *ret; char *buf; struct hostent **result; size_t buflen; int *h_errnop; int i = gethostbyname_r(name,ret,buf,buflen,result,h_errnop); }\n" EC_HAVE_GETHOSTBYNAME_R )
+
+endif()
+
+
diff --git a/ecbuild/cmake/ecbuild_check_os.cmake b/ecbuild/cmake/ecbuild_check_os.cmake
new file mode 100644
index 0000000..8373c4a
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_check_os.cmake
@@ -0,0 +1,342 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# check size of pointer
+
+ecbuild_cache_check_type_size( "void*" CMAKE_SIZEOF_VOID_P  )
+
+math( EXPR EC_OS_BITS "${CMAKE_SIZEOF_VOID_P} * 8" )
+
+# we only support 32 and 64 bit operating systems
+if( NOT EC_OS_BITS EQUAL "32" AND NOT EC_OS_BITS EQUAL "64" )
+	message( FATAL_ERROR "operating system ${CMAKE_SYSTEM} ${EC_OS_BITS} bits -- ecbuild only supports 32 or 64 bit OS's" )
+endif()
+ecbuild_cache_var( EC_OS_BITS )
+
+############################################################################################
+# For 64 bit architectures enable PIC (position-independent code)
+
+if( ${EC_OS_BITS} EQUAL 64 )
+	set( CMAKE_POSITION_INDEPENDENT_CODE ON )
+endif()
+
+############################################################################################
+# check architecture
+
+if( ENABLE_OS_TYPES_TEST )
+
+	set( EC_SIZEOF_PTR ${CMAKE_SIZEOF_VOID_P} )
+	ecbuild_cache_var( EC_SIZEOF_PTR )
+    ecbuild_cache_check_type_size( char           EC_SIZEOF_CHAR        )
+    ecbuild_cache_check_type_size( short          EC_SIZEOF_SHORT       )
+	ecbuild_cache_check_type_size( int            EC_SIZEOF_INT         )
+	ecbuild_cache_check_type_size( long           EC_SIZEOF_LONG        )
+	ecbuild_cache_check_type_size( "long long"    EC_SIZEOF_LONG_LONG   )
+	ecbuild_cache_check_type_size( float          EC_SIZEOF_FLOAT       )
+	ecbuild_cache_check_type_size( double         EC_SIZEOF_DOUBLE      )
+	ecbuild_cache_check_type_size( "long double"  EC_SIZEOF_LONG_DOUBLE )
+	ecbuild_cache_check_type_size( size_t         EC_SIZEOF_SIZE_T      )
+	ecbuild_cache_check_type_size( ssize_t        EC_SIZEOF_SSIZE_T     )
+	ecbuild_cache_check_type_size( off_t          EC_SIZEOF_OFF_T       )
+
+#	message( STATUS "sizeof void*  [${EC_SIZEOF_PTR}]" )
+#	message( STATUS "sizeof off_t  [${EC_SIZEOF_OFF_T}]" )
+#	message( STATUS "sizeof int    [${EC_SIZEOF_INT}]" )
+#	message( STATUS "sizeof short  [${EC_SIZEOF_SHORT}]" )
+#	message( STATUS "sizeof long   [${EC_SIZEOF_LONG}]" )
+#	message( STATUS "sizeof size_t [${EC_SIZEOF_SIZE_T}]" )
+#	message( STATUS "sizeof float  [${EC_SIZEOF_FLOAT}]" )
+#	message( STATUS "sizeof double [${EC_SIZEOF_DOUBLE}]" )
+#	message( STATUS "sizeof long long   [${EC_SIZEOF_LONG_LONG}]" )
+#	message( STATUS "sizeof long double [${EC_SIZEOF_LONG_DOUBLE}]" )
+
+#	message( STATUS "system sizeof :" )
+#	message( STATUS "  void*  [${EC_SIZEOF_PTR}]  size_t [${EC_SIZEOF_SIZE_T}]  off_t  [${EC_SIZEOF_OFF_T}]   short  [${EC_SIZEOF_SHORT}]" )
+#	message( STATUS "  int    [${EC_SIZEOF_INT}]  long   [${EC_SIZEOF_LONG}]  long long   [${EC_SIZEOF_LONG_LONG}]" )
+#	message( STATUS "  float  [${EC_SIZEOF_FLOAT}]  double [${EC_SIZEOF_DOUBLE}]  long double [${EC_SIZEOF_LONG_DOUBLE}]" )
+
+endif()
+
+############################################################################################
+# check for large file support
+
+# ensure we use 64bit access to files even on 32bit os -- aka Large File Support
+# by making off_t 64bit and stat behave as stat64
+
+if( ENABLE_LARGE_FILE_SUPPORT )
+
+  ecbuild_cache_check_type_size( off_t EC_SIZEOF_OFF_T )
+
+	if( EC_SIZEOF_OFF_T LESS "8" )
+
+		if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
+			add_definitions( -D_FILE_OFFSET_BITS=64 )
+		endif()
+
+		if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
+			add_definitions( -D_LARGE_FILES=64 )
+		endif()
+
+		get_directory_property( __compile_defs COMPILE_DEFINITIONS )
+
+		if( __compile_defs )
+			foreach( def ${__compile_defs} )
+				list( APPEND CMAKE_REQUIRED_DEFINITIONS -D${def} )
+			endforeach()
+		endif()
+
+	endif()
+
+endif()
+
+############################################################################################
+# check endiness
+
+if( ENABLE_OS_ENDINESS_TEST )
+
+  if( NOT DEFINED EC_BIG_ENDIAN AND NOT DEFINED EC_LITTLE_ENDIAN )
+  	test_big_endian( _BIG_ENDIAN )
+
+  	if( _BIG_ENDIAN )
+  		set( EC_BIG_ENDIAN    1 )
+  	else()
+  		set( EC_LITTLE_ENDIAN 1 )
+  	endif()
+  endif()
+  ecbuild_cache_var( EC_BIG_ENDIAN )
+  ecbuild_cache_var( EC_LITTLE_ENDIAN )
+
+  if( NOT DEFINED IEEE_BE )
+  	check_c_source_runs(
+  		 "int compare(unsigned char* a,unsigned char* b) {
+  		   while(*a != 0) if (*(b++)!=*(a++)) return 1;
+  		   return 0;
+  		 }
+  		 int main(int argc,char** argv) {
+  		   unsigned char dc[]={0x30,0x61,0xDE,0x80,0x93,0x67,0xCC,0xD9,0};
+  		   double da=1.23456789e-75;
+  		   unsigned char* ca;
+
+  		   unsigned char fc[]={0x05,0x83,0x48,0x22,0};
+  		   float fa=1.23456789e-35;
+
+  		   if (sizeof(double)!=8) return 1;
+
+  		   ca=(unsigned char*)&da;
+  		   if (compare(dc,ca)) return 1;
+
+  		   if (sizeof(float)!=4) return 1;
+
+  		   ca=(unsigned char*)&fa;
+  		   if (compare(fc,ca)) return 1;
+
+  		   return 0;
+  		 }" IEEE_BE )
+
+  	if( "${IEEE_BE}" STREQUAL "" )
+  		set( IEEE_BE 0 CACHE INTERNAL "Test IEEE_BE")
+  	endif()
+  endif()
+  ecbuild_cache_var( IEEE_BE )
+
+    if( NOT DEFINED IEEE_LE )
+  	check_c_source_runs(
+  		 "int compare(unsigned char* a,unsigned char* b) {
+  		   while(*a != 0) if (*(b++)!=*(a++)) return 1;
+  		   return 0;
+  		 }
+  		 int main(int argc,char** argv) {
+  		   unsigned char dc[]={0xD9,0xCC,0x67,0x93,0x80,0xDE,0x61,0x30,0};
+  		   double da=1.23456789e-75;
+  		   unsigned char* ca;
+
+  		   unsigned char fc[]={0x22,0x48,0x83,0x05,0};
+  		   float fa=1.23456789e-35;
+
+  		   if (sizeof(double)!=8) return 1;
+
+  		   ca=(unsigned char*)&da;
+  		   if (compare(dc,ca)) return 1;
+
+  		   if (sizeof(float)!=4) return 1;
+
+  		   ca=(unsigned char*)&fa;
+  		   if (compare(fc,ca)) return 1;
+
+  		   return 0;
+  		 }" IEEE_LE )
+
+  	if( "${IEEE_BE}" STREQUAL "" )
+  		set( IEEE_LE 0 CACHE INTERNAL "Test IEEE_LE")
+  	endif()
+  endif()
+  ecbuild_cache_var( IEEE_LE )
+
+endif()
+
+############################################################################################
+# check operating system
+
+set( EC_OS_NAME "UNKNOWN" )
+
+### Unix's -- Proper operating systems
+
+if( UNIX )
+
+	### APPLE ###
+
+	if( APPLE AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
+		set( EC_OS_NAME "macosx" )
+	endif()
+
+	### Linux ###
+
+	if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" )
+
+		set( EC_OS_NAME "linux" )
+
+		# recent linkers default to --enable-new-dtags
+		# which then adds both RPATH and RUNPATH to executables
+		# thus invalidating RPATH setting, and making LD_LIBRARY_PATH take precedence
+		# to be sure, use tool 'readelf -a <exe> | grep PATH' to see what paths are built-in
+		# see:
+		#  * http://blog.qt.digia.com/blog/2011/10/28/rpath-and-runpath
+		#  * http://www.cmake.org/Wiki/CMake_RPATH_handling
+		#  * man ld
+		#  * http://blog.tremily.us/posts/rpath
+		#  * http://fwarmerdam.blogspot.co.uk/2010/12/rpath-runpath-and-ldlibrarypath.html
+		set(CMAKE_EXE_LINKER_FLAGS     "${CMAKE_EXE_LINKER_FLAGS}    -Wl,--disable-new-dtags")
+		set(CMAKE_SHARED_LINKER_FLAGS  "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--disable-new-dtags")
+		set(CMAKE_MODULE_LINKER_FLAGS  "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--disable-new-dtags")
+
+	endif()
+
+	### Solaris ###
+
+	if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
+		set( EC_OS_NAME "solaris" )
+	endif()
+
+	### AIX ###
+
+	if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
+
+		set( EC_OS_NAME "aix" )
+
+		set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -bbigtoc" )
+
+		if( CMAKE_C_COMPILER_ID MATCHES "GNU" )
+			set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker" )
+		endif()
+
+		if( CMAKE_COMPILER_IS_GNUCC )
+			if( EC_OS_BITS EQUAL "64" )
+				cmake_add_c_flags("-maix64")
+			endif()
+			if( EC_OS_BITS EQUAL "32" )
+				cmake_add_c_flags("-maix32")
+			endif()
+		endif()
+
+		if( CMAKE_COMPILER_IS_GNUCXX )
+			if( EC_OS_BITS EQUAL "64" )
+				cmake_add_cxx_flags("-maix64")
+			endif()
+			if( EC_OS_BITS EQUAL "32" )
+				cmake_add_cxx_flags("-maix32")
+			endif()
+		endif()
+
+		if( CMAKE_C_COMPILER_ID MATCHES "XL" )
+
+			cmake_add_c_flags("-qpic=large")
+#            cmake_add_c_flags("-qweaksymbol")
+
+			if(EC_OS_BITS EQUAL "32" )
+				cmake_add_c_flags("-q32")
+			endif()
+
+			if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
+					cmake_add_c_flags("-qstrict")
+					cmake_add_c_flags("-qinline")
+			endif()
+
+			if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
+					cmake_add_c_flags("-qfullpath")
+					cmake_add_c_flags("-qkeepparm")
+			endif()
+
+		endif()
+
+		if( CMAKE_CXX_COMPILER_ID MATCHES "XL" )
+
+			cmake_add_cxx_flags("-qpic=large")
+			cmake_add_cxx_flags("-bmaxdata:0x40000000")
+			cmake_add_cxx_flags("-qrtti")
+			cmake_add_cxx_flags("-qfuncsect")
+
+#           cmake_add_cxx_flags("-qweaksymbol")
+
+			if(EC_OS_BITS EQUAL "32" )
+				cmake_add_cxx_flags("-q32")
+			endif()
+
+			if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
+					cmake_add_cxx_flags("-qstrict")
+					cmake_add_cxx_flags("-qinline")
+			endif()
+
+			if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
+					cmake_add_cxx_flags("-qfullpath")
+					cmake_add_cxx_flags("-qkeepparm")
+			endif()
+
+		endif()
+
+		if( CMAKE_Fortran_COMPILER_ID MATCHES "XL" )
+
+			cmake_add_fortran_flags("-qxflag=dealloc_cfptr")
+			cmake_add_fortran_flags("-qextname")
+			cmake_add_fortran_flags("-qdpc=e")
+			cmake_add_fortran_flags("-bmaxdata:0x40000000")
+			cmake_add_fortran_flags("-bloadmap:loadmap -bmap:loadmap")
+
+			if(EC_OS_BITS EQUAL "32" )
+				cmake_add_fortran_flags("-q32")
+			endif()
+		endif()
+
+	endif()
+
+endif()
+
+### Cygwin
+
+if( ${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN" )
+
+	set( EC_OS_NAME "cygwin" )
+	message( WARNING "Building on Cygwin should work but is untested" )
+
+endif()
+
+### final warning / error
+
+if( ${EC_OS_NAME} MATCHES "UNKNOWN" )
+
+	if( DISABLE_OS_CHECK )
+		message( WARNING "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
+						 " -- DISABLE_OS_CHECK is ON so proceeding at your own risk ..." )
+	else()
+		message( FATAL_ERROR "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
+							 " -- refusing to continue. Disable this check with -DDISABLE_OS_CHECK=ON" )
+	endif()
+
+endif()
+
+
diff --git a/ecbuild/cmake/ecbuild_config.h.in b/ecbuild/cmake/ecbuild_config.h.in
new file mode 100644
index 0000000..8e68a8e
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_config.h.in
@@ -0,0 +1,167 @@
+/*
+ * (C) Copyright 1996-2014 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ * In applying this licence, ECMWF does not waive the privileges and immunities
+ * granted to it by virtue of its status as an intergovernmental organisation nor
+ * does it submit to any jurisdiction.
+ */
+
+#ifndef @PROJECT_NAME at _ecbuild_config_h
+#define @PROJECT_NAME at _ecbuild_config_h
+
+/* cpu arch info */
+
+#cmakedefine EC_BIG_ENDIAN       @EC_BIG_ENDIAN@
+#cmakedefine EC_LITTLE_ENDIAN    @EC_LITTLE_ENDIAN@
+
+/* compiler support */
+
+#cmakedefine EC_HAVE_FUNCTION_DEF
+
+/* os capability checks */
+
+/* --- symbols --- */
+
+#cmakedefine EC_HAVE_FSEEK
+#cmakedefine EC_HAVE_FSEEKO
+#cmakedefine EC_HAVE_FTELLO
+#cmakedefine EC_HAVE_LSEEK
+#cmakedefine EC_HAVE_FTRUNCATE
+#cmakedefine EC_HAVE_OPEN
+#cmakedefine EC_HAVE_FOPEN
+#cmakedefine EC_HAVE_FLOCK
+#cmakedefine EC_HAVE_MMAP
+
+#cmakedefine EC_HAVE_POSIX_MEMALIGN
+
+#cmakedefine EC_HAVE_F_GETLK
+#cmakedefine EC_HAVE_F_SETLKW
+#cmakedefine EC_HAVE_F_SETLK
+
+#cmakedefine EC_HAVE_F_GETLK64
+#cmakedefine EC_HAVE_F_SETLKW64
+#cmakedefine EC_HAVE_F_SETLK64
+
+#cmakedefine EC_HAVE_MAP_ANONYMOUS
+#cmakedefine EC_HAVE_MAP_ANON
+
+/* --- include files --- */
+
+#cmakedefine EC_HAVE_ASSERT_H
+#cmakedefine EC_HAVE_STDLIB_H
+#cmakedefine EC_HAVE_UNISTD_H
+#cmakedefine EC_HAVE_STRING_H
+#cmakedefine EC_HAVE_STRINGS_H
+#cmakedefine EC_HAVE_SYS_STAT_H
+#cmakedefine EC_HAVE_SYS_TIME_H
+#cmakedefine EC_HAVE_SYS_TYPES_H
+
+#cmakedefine EC_HAVE_MALLOC_H
+#cmakedefine EC_HAVE_SYS_MALLOC_H
+
+#cmakedefine EC_HAVE_SYS_PARAM_H
+#cmakedefine EC_HAVE_SYS_MOUNT_H
+#cmakedefine EC_HAVE_SYS_VFS_H
+
+/* --- capabilities --- */
+
+#cmakedefine EC_HAVE_OFFT
+#cmakedefine EC_HAVE_OFF64T
+
+#cmakedefine EC_HAVE_STRUCT_STAT
+#cmakedefine EC_HAVE_STRUCT_STAT64
+#cmakedefine EC_HAVE_STAT
+#cmakedefine EC_HAVE_STAT64
+#cmakedefine EC_HAVE_FSTAT
+#cmakedefine EC_HAVE_FSTAT64
+
+#cmakedefine EC_HAVE_FSEEKO64
+#cmakedefine EC_HAVE_FTELLO64
+#cmakedefine EC_HAVE_LSEEK64
+#cmakedefine EC_HAVE_OPEN64
+#cmakedefine EC_HAVE_FOPEN64
+#cmakedefine EC_HAVE_FTRUNCATE64
+#cmakedefine EC_HAVE_FLOCK64
+#cmakedefine EC_HAVE_MMAP64
+
+#cmakedefine EC_HAVE_STRUCT_STATVFS
+#cmakedefine EC_HAVE_STRUCT_STATVFS64
+#cmakedefine EC_HAVE_STATVFS
+#cmakedefine EC_HAVE_STATVFS64
+
+#cmakedefine EC_HAVE_FSYNC
+#cmakedefine EC_HAVE_FDATASYNC
+#cmakedefine EC_HAVE_DIRFD
+#cmakedefine EC_HAVE_SYSPROC
+#cmakedefine EC_HAVE_SYSPROCFS
+
+#cmakedefine EC_HAVE_EXECINFO_BACKTRACE
+
+/* --- asynchronous IO support --- */
+
+#cmakedefine EC_HAVE_AIOCB
+#cmakedefine EC_HAVE_AIO64CB
+
+/* --- reentrant funtions support --- */
+
+#cmakedefine EC_HAVE_GMTIME_R
+#cmakedefine EC_HAVE_GETPWUID_R
+#cmakedefine EC_HAVE_GETPWNAM_R
+#cmakedefine EC_HAVE_READDIR_R
+#cmakedefine EC_HAVE_GETHOSTBYNAME_R
+
+/* --- c compiler support --- */
+
+#cmakedefine EC_HAVE_C_INLINE
+
+/* --- c++ compiler support --- */
+
+#cmakedefine EC_HAVE_FUNCTION_DEF
+
+#cmakedefine EC_HAVE_CXXABI_H
+#cmakedefine EC_HAVE_CXX_BOOL
+
+#cmakedefine EC_HAVE_CXX_SSTREAM
+
+/* config info */
+
+#define @PNAME at _OS_NAME          "@CMAKE_SYSTEM@"
+#define @PNAME at _OS_BITS          @EC_OS_BITS@
+#define @PNAME at _OS_BITS_STR      "@EC_OS_BITS@"
+#define @PNAME at _OS_STR           "@EC_OS_NAME at .@EC_OS_BITS@"
+#define @PNAME at _OS_VERSION       "@CMAKE_SYSTEM_VERSION@"
+#define @PNAME at _SYS_PROCESSOR    "@CMAKE_SYSTEM_PROCESSOR@"
+
+#define @PNAME at _BUILD_TIMESTAMP  "@EC_BUILD_TIMESTAMP@"
+#define @PNAME at _BUILD_TYPE       "@CMAKE_BUILD_TYPE@"
+
+#define @PNAME at _C_COMPILER_ID      "@CMAKE_C_COMPILER_ID@"
+#define @PNAME at _C_COMPILER_VERSION "@CMAKE_C_COMPILER_VERSION@"
+
+#define @PNAME at _CXX_COMPILER_ID      "@CMAKE_CXX_COMPILER_ID@"
+#define @PNAME at _CXX_COMPILER_VERSION "@CMAKE_CXX_COMPILER_VERSION@"
+
+#define @PNAME at _C_COMPILER       "@CMAKE_C_COMPILER@"
+#define @PNAME at _C_FLAGS          "@EC_C_FLAGS@"
+
+#define @PNAME at _CXX_COMPILER     "@CMAKE_CXX_COMPILER@"
+#define @PNAME at _CXX_FLAGS        "@EC_CXX_FLAGS@"
+
+#cmakedefine EC_HAVE_FORTRAN
+
+#ifdef EC_HAVE_FORTRAN
+
+#define @PNAME at _Fortran_COMPILER_ID      "@CMAKE_Fortran_COMPILER_ID@"
+#define @PNAME at _Fortran_COMPILER_VERSION "@CMAKE_Fortran_COMPILER_VERSION@"
+
+#define @PNAME at _Fortran_COMPILER "@CMAKE_Fortran_COMPILER@"
+#define @PNAME at _Fortran_FLAGS    "@EC_Fortran_FLAGS@"
+
+#endif
+
+#cmakedefine BOOST_UNIT_TEST_FRAMEWORK_HEADER_ONLY
+#cmakedefine BOOST_UNIT_TEST_FRAMEWORK_LINKED
+
+#endif /* @PROJECT_NAME at _ecbuild_config_h */
diff --git a/ecbuild/cmake/ecbuild_debug_var.cmake b/ecbuild/cmake/ecbuild_debug_var.cmake
new file mode 100644
index 0000000..63a5104
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_debug_var.cmake
@@ -0,0 +1,35 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for exporting a variable to parent scope
+
+macro( set_parent_scope VAR )
+
+	set( ${VAR} ${${VAR}} PARENT_SCOPE )
+
+endmacro( set_parent_scope )
+
+##############################################################################
+# macro for debugging a cmake variable
+
+macro( debug_var VAR )
+
+    message( STATUS "${VAR} [${${VAR}}]" )
+
+endmacro( debug_var )
+
+##############################################################################
+# macro for debugging a environment variable within cmake
+
+macro( debug_env_var VAR )
+
+    message( STATUS "ENV ${VAR} [$ENV{${VAR}}]" )
+
+endmacro( debug_env_var )
+
diff --git a/ecbuild/cmake/ecbuild_declare_project.cmake b/ecbuild/cmake/ecbuild_declare_project.cmake
new file mode 100644
index 0000000..57dd1b0
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_declare_project.cmake
@@ -0,0 +1,151 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# macro to initialize a project
+
+macro( ecbuild_declare_project )
+
+	string( TOUPPER ${PROJECT_NAME} PNAME )
+
+	# reset the lists of targets (executables, libs, tests & resources)
+
+	set( ${PROJECT_NAME}_ALL_EXES "" CACHE INTERNAL "" )
+	set( ${PROJECT_NAME}_ALL_LIBS "" CACHE INTERNAL "" )
+
+	# if git project get its HEAD SHA1
+	# leave it here so we may use ${PNAME}_GIT_SHA1 on the version file
+
+	if( EXISTS ${PROJECT_SOURCE_DIR}/.git )
+		get_git_head_revision( GIT_REFSPEC ${PNAME}_GIT_SHA1 )
+		if( ${PNAME}_GIT_SHA1 )
+		  string( SUBSTRING "${${PNAME}_GIT_SHA1}" 0 7 ${PNAME}_GIT_SHA1_SHORT )
+#		  debug_var( ${PNAME}_GIT_SHA1 )
+#		  debug_var( ${PNAME}_GIT_SHA1_SHORT )
+        else()
+          message( STATUS "Could not get git-sha1 for project ${PNAME}")
+        endif()
+	endif()
+
+	# read and parse project version file
+	if( EXISTS ${PROJECT_SOURCE_DIR}/VERSION.cmake )
+		include( ${PROJECT_SOURCE_DIR}/VERSION.cmake )
+	else()
+		set( ${PROJECT_NAME}_VERSION_STR "0.0.0" )
+	endif()
+
+	string( REPLACE "." " " _version_list ${${PROJECT_NAME}_VERSION_STR} ) # dots to spaces
+
+	separate_arguments( _version_list )
+
+	list( GET _version_list 0 ${PNAME}_MAJOR_VERSION )
+	list( GET _version_list 1 ${PNAME}_MINOR_VERSION )
+	list( GET _version_list 2 ${PNAME}_PATCH_VERSION )
+
+	# cleanup patch version of any extra qualifiers ( -dev -rc1 ... )
+
+	string( REGEX REPLACE "^([0-9]+).*" "\\1" ${PNAME}_PATCH_VERSION "${${PNAME}_PATCH_VERSION}" )
+
+	set( ${PNAME}_VERSION "${${PNAME}_MAJOR_VERSION}.${${PNAME}_MINOR_VERSION}.${${PNAME}_PATCH_VERSION}" CACHE INTERNAL "package ${PNAME} version" )
+
+	set( ${PNAME}_VERSION_STR "${${PROJECT_NAME}_VERSION_STR}" CACHE INTERNAL "package ${PNAME} version string" ) # ignore caps
+
+#    debug_var( ${PNAME}_VERSION )
+#    debug_var( ${PNAME}_VERSION_STR )
+#    debug_var( ${PNAME}_MAJOR_VERSION )
+#    debug_var( ${PNAME}_MINOR_VERSION )
+#    debug_var( ${PNAME}_PATCH_VERSION )
+
+	# install dirs for this project
+
+	if( NOT DEFINED INSTALL_BIN_DIR )
+		set( INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
+	endif()
+
+	if( NOT DEFINED INSTALL_LIB_DIR )
+		set( INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
+	endif()
+
+	if( NOT DEFINED INSTALL_INCLUDE_DIR )
+		set( INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
+	endif()
+
+	if( NOT DEFINED INSTALL_DATA_DIR )
+		set( INSTALL_DATA_DIR share/${PROJECT_NAME} CACHE PATH "Installation directory for data files")
+	endif()
+
+	if( NOT DEFINED INSTALL_CMAKE_DIR )
+		set( INSTALL_CMAKE_DIR share/${PROJECT_NAME}/cmake CACHE PATH "Installation directory for CMake files")
+	endif()
+
+		mark_as_advanced( INSTALL_BIN_DIR )
+		mark_as_advanced( INSTALL_LIB_DIR )
+		mark_as_advanced( INSTALL_INCLUDE_DIR )
+		mark_as_advanced( INSTALL_DATA_DIR )
+		mark_as_advanced( INSTALL_CMAKE_DIR )
+
+	# warnings for non-relocatable projects
+
+	foreach( p LIB BIN INCLUDE DATA CMAKE )
+		if( IS_ABSOLUTE ${INSTALL_${p}_DIR} )
+			message( WARNING "Defining INSTALL_${p}_DIR as absolute path '${INSTALL_${p}_DIR}' makes this build non-relocatable, possibly breaking the installation of RPMS and DEB packages" )
+		endif()
+	endforeach()
+
+	# make relative paths absolute ( needed later on ) and cache them ...
+	foreach( p LIB BIN INCLUDE DATA CMAKE )
+
+		set( var INSTALL_${p}_DIR )
+
+		if( NOT IS_ABSOLUTE "${${var}}" )
+			set( ${PNAME}_FULL_INSTALL_${p}_DIR "${CMAKE_INSTALL_PREFIX}/${${var}}" CACHE INTERNAL "${PNAME} ${p} full install path" )
+		else()
+			message( WARNING "Setting an absolute path for ${VAR} in project ${PNAME}, breakes generation of relocatable binary packages (rpm,deb,...)" )
+			set( ${PNAME}_FULL_INSTALL_${p}_DIR "${${var}}" CACHE INTERNAL "${PNAME} ${p} full install path" )
+		endif()
+
+#        debug_var( ${PNAME}_FULL_INSTALL_${p}_DIR )
+
+	endforeach()
+
+	# correctly set CMAKE_INSTALL_RPATH
+
+	if( ENABLE_RPATHS )
+
+		if( ENABLE_RELATIVE_RPATHS )
+
+			file( RELATIVE_PATH relative_rpath ${${PNAME}_FULL_INSTALL_BIN_DIR} ${${PNAME}_FULL_INSTALL_LIB_DIR} )
+			# debug_var( relative_rpath )
+
+			ecbuild_append_to_rpath( ${relative_rpath} )
+
+		else() # make rpaths absolute
+
+		    if( IS_ABSOLUTE ${INSTALL_LIB_DIR} )
+		        ecbuild_append_to_rpath( "${INSTALL_LIB_DIR}" )
+		    else()
+		        ecbuild_append_to_rpath( "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}" ) 
+		    endif()
+
+		endif()
+    
+	endif()
+
+	# debug_var( CMAKE_INSTALL_RPATH )
+
+	# print project header
+
+	message( STATUS "---------------------------------------------------------" )
+
+	if( ${PNAME}_GIT_SHA1_SHORT )
+		message( STATUS "[${PROJECT_NAME}] (${${PNAME}_VERSION_STR}) [${${PNAME}_GIT_SHA1_SHORT}]" )
+	else()
+		message( STATUS "[${PROJECT_NAME}] (${${PNAME}_VERSION_STR})" )
+	endif()
+
+endmacro( ecbuild_declare_project )
+
diff --git a/ecbuild/cmake/ecbuild_define_build_types.cmake b/ecbuild/cmake/ecbuild_define_build_types.cmake
new file mode 100644
index 0000000..9ec2ef0
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_define_build_types.cmake
@@ -0,0 +1,110 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# define a Production build type
+
+# NOTE: gcc does not guarrante that -O3 performs better than -O2
+#       -- it can perform worse due to assembly code bloating.
+#   Moreover for gcc 4.1.2 we found that -O3 remove the parser code generated from Lex/Yacc
+#   and therefore in production mode we downgrade to -O2 if the compiler is GCC (for all versions).
+
+
+if(CMAKE_COMPILER_IS_GNUCXX)
+    set( CMAKE_CXX_FLAGS_PRODUCTION "-O2 -g" CACHE STRING "Flags used by the C++ compiler during Production builds." FORCE )
+else()
+    set( CMAKE_CXX_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Flags used by the C++ compiler during Production builds." FORCE )
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCC)
+    set( CMAKE_C_FLAGS_PRODUCTION "-O2 -g" CACHE STRING "Flags used by the C compiler during Production builds." FORCE )
+else()
+    set( CMAKE_C_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Flags used by the C compiler during Production builds." FORCE )
+endif()
+
+set( CMAKE_EXE_LINKER_FLAGS_PRODUCTION "" CACHE STRING "Flags used for linking binaries during Production builds." FORCE )
+set( CMAKE_SHARED_LINKER_FLAGS_PRODUCTION "" CACHE STRING "Flags used by the shared libraries linker during Production builds." FORCE )
+set( CMAKE_MODULE_LINKER_FLAGS_PRODUCTION "" CACHE STRING "Flags used by the static libraries linker during Production builds." FORCE )
+
+mark_as_advanced(
+    CMAKE_CXX_FLAGS_PRODUCTION
+    CMAKE_C_FLAGS_PRODUCTION
+    CMAKE_EXE_LINKER_FLAGS_PRODUCTION
+	CMAKE_SHARED_LINKER_FLAGS_PRODUCTION
+	CMAKE_MODULE_LINKER_FLAGS_PRODUCTION )
+
+############################################################################################
+# fixes for specific compilers
+
+### remove -Mipa=fast from PGI compilers in RELEASE mode
+
+if( CMAKE_C_COMPILER_ID STREQUAL "PGI" )
+  set(CMAKE_C_FLAGS_RELEASE "-fast -O3")
+endif()
+
+if( CMAKE_CXX_COMPILER_ID STREQUAL "PGI" )
+  set(CMAKE_CXX_FLAGS_RELEASE "-fast -O3")
+endif()
+
+if( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" )
+  set(CMAKE_Fortran_FLAGS_RELEASE "-fast -O3")
+endif()
+
+############################################################################################
+# define default build type
+
+set( _BUILD_TYPE_MSG "Build type options are: [ None | Debug | Bit | Production | Release | RelWithDebInfo ]" )
+
+if( NOT ECBUILD_DEFAULT_BUILD_TYPE )
+	set( ECBUILD_DEFAULT_BUILD_TYPE "RelWithDebInfo" )
+endif()
+
+if(NOT CMAKE_BUILD_TYPE)
+  set(CMAKE_BUILD_TYPE ${ECBUILD_DEFAULT_BUILD_TYPE} CACHE STRING  ${_BUILD_TYPE_MSG}  FORCE )
+endif()
+
+# capitalize the build type for easy use with conditionals
+string( TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_CAPS )
+
+# correct capitatlization of the build type
+
+if( CMAKE_BUILD_TYPE_CAPS STREQUAL "NONE" )
+  set(CMAKE_BUILD_TYPE None CACHE STRING ${_BUILD_TYPE_MSG} FORCE )
+endif()
+
+if( CMAKE_BUILD_TYPE_CAPS STREQUAL "DEBUG" )
+  set(CMAKE_BUILD_TYPE Debug CACHE STRING ${_BUILD_TYPE_MSG} FORCE )
+endif()
+
+if( CMAKE_BUILD_TYPE_CAPS STREQUAL "BIT" )
+  set(CMAKE_BUILD_TYPE Bit CACHE STRING ${_BUILD_TYPE_MSG} FORCE )
+endif()
+
+if( CMAKE_BUILD_TYPE_CAPS STREQUAL "PRODUCTION" )
+  set(CMAKE_BUILD_TYPE Production CACHE STRING ${_BUILD_TYPE_MSG} FORCE )
+endif()
+
+if( CMAKE_BUILD_TYPE_CAPS STREQUAL "RELEASE" )
+  set(CMAKE_BUILD_TYPE Release CACHE STRING ${_BUILD_TYPE_MSG} FORCE )
+endif()
+
+if( CMAKE_BUILD_TYPE_CAPS STREQUAL "RELWITHDEBINFO" )
+  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING ${_BUILD_TYPE_MSG} FORCE )
+endif()
+
+# fail if build type is not one of the defined ones
+if( NOT CMAKE_BUILD_TYPE MATCHES "None"  AND
+	NOT CMAKE_BUILD_TYPE MATCHES "Debug" AND
+	NOT CMAKE_BUILD_TYPE MATCHES "Bit" AND
+	NOT CMAKE_BUILD_TYPE MATCHES "Production" AND
+    NOT CMAKE_BUILD_TYPE MATCHES "Release"  AND
+    NOT CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo" )
+    message( FATAL_ERROR "CMAKE_BUILD_TYPE is not recognized. ${_BUILD_TYPE_MSG}" )
+endif()
+
+
diff --git a/ecbuild/cmake/ecbuild_define_options.cmake b/ecbuild/cmake/ecbuild_define_options.cmake
new file mode 100644
index 0000000..a79fcf3
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_define_options.cmake
@@ -0,0 +1,40 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# general options
+
+option( BUILD_SHARED_LIBS       "build shared libraries when possible"            ON  )
+
+option( ENABLE_RPATHS           "when installing insert RPATHS into binaries"     ON  )
+option( ENABLE_RELATIVE_RPATHS  "try to use relative RPATHS, including build dir" ON  )
+option( ENABLE_WARNINGS         "enable compiler warnings"                        OFF )
+
+option( ENABLE_LARGE_FILE_SUPPORT "build with large file support"   ON  )
+
+mark_as_advanced( ENABLE_LARGE_FILE_SUPPORT )
+
+option( ENABLE_OS_TESTS          "Run all OS tests" ON )
+
+mark_as_advanced( ENABLE_OS_TESTS )
+
+option( ENABLE_FORTRAN_C_INTERFACE "Enable Fortran/C Interface" OFF )
+mark_as_advanced( ENABLE_FORTRAN_C_INTERFACE )
+
+option( DEVELOPER_MODE           "activates developer mode"               OFF )
+option( CHECK_UNUSED_FILES       "check for unused project files"         ON )
+
+mark_as_advanced( DEVELOPER_MODE  )
+mark_as_advanced( CHECK_UNUSED_FILES  )
+
+include( CMakeDependentOption ) # make options depend on one another
+
+cmake_dependent_option( ENABLE_OS_TYPES_TEST     "Run sizeof tests on C types" ON "ENABLE_OS_TESTS" OFF)
+cmake_dependent_option( ENABLE_OS_ENDINESS_TEST  "Run OS endiness tests"       ON "ENABLE_OS_TESTS" OFF)
+cmake_dependent_option( ENABLE_OS_FUNCTIONS_TEST "Run OS functions tests"      ON "ENABLE_OS_TESTS" OFF)
+
+mark_as_advanced( ENABLE_OS_TYPES_TEST ENABLE_OS_ENDINESS_TEST ENABLE_OS_FUNCTIONS_TEST  )
diff --git a/ecbuild/cmake/ecbuild_define_paths.cmake b/ecbuild/cmake/ecbuild_define_paths.cmake
new file mode 100644
index 0000000..57a3f1a
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_define_paths.cmake
@@ -0,0 +1,41 @@
+# (C) Copyright 1996-2012 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# define project paths
+
+file( MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
+file( MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
+
+#######################################################################################################
+
+# setup library building rpaths (both in build dir and then when installed)
+
+set( CMAKE_INSTALL_RPATH_USE_LINK_PATH   TRUE  ) # add the automatic parts to RPATH which point to dirs outside build tree
+
+# use RPATHs for the build tree
+set( CMAKE_SKIP_BUILD_RPATH              FALSE  )
+
+if( ENABLE_RELATIVE_RPATHS )
+    # when building, use the install RPATH immedietly
+	set( CMAKE_BUILD_WITH_INSTALL_RPATH      TRUE  )
+else()
+    # when building, don't use the install RPATH yet, but later on when installing
+    set( CMAKE_BUILD_WITH_INSTALL_RPATH      FALSE  ) 
+endif()
+
+# Always include srcdir and builddir in include path
+# This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
+# in about every subdir
+
+set( CMAKE_INCLUDE_CURRENT_DIR OFF )
+
+# put the include dirs which are in the source or build tree
+# before all other include dirs, so the headers in the sources
+# are prefered over the already installed ones (since cmake 2.4.1)
+
+set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)
diff --git a/ecbuild/cmake/ecbuild_echo_targets.cmake b/ecbuild/cmake/ecbuild_echo_targets.cmake
new file mode 100644
index 0000000..015192b
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_echo_targets.cmake
@@ -0,0 +1,198 @@
+#
+#
+# FUNCTION ecbuild_echo_targets ( <list-of-targets> )
+#
+#   Writes all possible target properties of the specified list-of-targets.
+#   This is very useful for debugging
+# 
+
+
+function(echo_target_property tgt prop)
+ 
+  cmake_policy(PUSH)
+
+  if( POLICY CMP0026 )
+    cmake_policy( SET CMP0026 OLD)
+  endif()
+
+  # v for value, d for defined, s for set
+  get_property(v TARGET ${tgt} PROPERTY ${prop})
+  get_property(d TARGET ${tgt} PROPERTY ${prop} DEFINED)
+  get_property(s TARGET ${tgt} PROPERTY ${prop} SET)
+ 
+  # only produce output for values that are set
+  #if(s)
+    message("tgt='${tgt}' prop='${prop}'")
+    message("  value='${v}'")
+    message("  defined='${d}'")
+    message("  set='${s}'")
+    message("")
+  #endif()
+
+  cmake_policy(POP)
+
+endfunction()
+ 
+function(echo_target tgt)
+  if(NOT TARGET ${tgt})
+    message("There is no target named '${tgt}'")
+    return()
+  endif()
+ 
+  set(props
+DEBUG_OUTPUT_NAME
+DEBUG_POSTFIX
+RELEASE_OUTPUT_NAME
+RELEASE_POSTFIX
+ARCHIVE_OUTPUT_DIRECTORY
+ARCHIVE_OUTPUT_DIRECTORY_DEBUG
+ARCHIVE_OUTPUT_DIRECTORY_RELEASE
+ARCHIVE_OUTPUT_NAME
+ARCHIVE_OUTPUT_NAME_DEBUG
+ARCHIVE_OUTPUT_NAME_RELEASE
+AUTOMOC
+AUTOMOC_MOC_OPTIONS
+BUILD_WITH_INSTALL_RPATH
+BUNDLE
+BUNDLE_EXTENSION
+COMPILE_DEFINITIONS
+COMPILE_DEFINITIONS_DEBUG
+COMPILE_DEFINITIONS_RELEASE
+COMPILE_FLAGS
+DEBUG_POSTFIX
+RELEASE_POSTFIX
+DEFINE_SYMBOL
+ENABLE_EXPORTS
+EXCLUDE_FROM_ALL
+EchoString
+FOLDER
+FRAMEWORK
+Fortran_FORMAT
+Fortran_MODULE_DIRECTORY
+GENERATOR_FILE_NAME
+GNUtoMS
+HAS_CXX
+IMPLICIT_DEPENDS_INCLUDE_TRANSFORM
+IMPORTED
+IMPORTED_CONFIGURATIONS
+IMPORTED_IMPLIB
+IMPORTED_IMPLIB_DEBUG
+IMPORTED_IMPLIB_RELEASE
+IMPORTED_LINK_DEPENDENT_LIBRARIES
+IMPORTED_LINK_DEPENDENT_LIBRARIES_DEBUG
+IMPORTED_LINK_DEPENDENT_LIBRARIES_RELEASE
+IMPORTED_LINK_INTERFACE_LANGUAGES
+IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG
+IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE
+IMPORTED_LINK_INTERFACE_LIBRARIES
+IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG
+IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE
+IMPORTED_LINK_INTERFACE_MULTIPLICITY
+IMPORTED_LINK_INTERFACE_MULTIPLICITY_DEBUG
+IMPORTED_LINK_INTERFACE_MULTIPLICITY_RELEASE
+IMPORTED_LOCATION
+IMPORTED_LOCATION_DEBUG
+IMPORTED_LOCATION_RELEASE
+IMPORTED_NO_SONAME
+IMPORTED_NO_SONAME_DEBUG
+IMPORTED_NO_SONAME_RELEASE
+IMPORTED_SONAME
+IMPORTED_SONAME_DEBUG
+IMPORTED_SONAME_RELEASE
+IMPORT_PREFIX
+IMPORT_SUFFIX
+INCLUDE_DIRECTORIES
+INSTALL_NAME_DIR
+INSTALL_RPATH
+INSTALL_RPATH_USE_LINK_PATH
+INTERPROCEDURAL_OPTIMIZATION
+INTERPROCEDURAL_OPTIMIZATION_DEBUG
+INTERPROCEDURAL_OPTIMIZATION_RELEASE
+LABELS
+LIBRARY_OUTPUT_DIRECTORY
+LIBRARY_OUTPUT_DIRECTORY_DEBUG
+LIBRARY_OUTPUT_DIRECTORY_RELEASE
+LIBRARY_OUTPUT_NAME
+LIBRARY_OUTPUT_NAME_DEBUG
+LIBRARY_OUTPUT_NAME_RELEASE
+LINKER_LANGUAGE
+LINK_DEPENDS
+LINK_FLAGS
+LINK_FLAGS_DEBUG
+LINK_FLAGS_RELEASE
+LINK_INTERFACE_LIBRARIES
+LINK_INTERFACE_LIBRARIES_DEBUG
+LINK_INTERFACE_LIBRARIES_RELEASE
+LINK_INTERFACE_MULTIPLICITY
+LINK_INTERFACE_MULTIPLICITY_DEBUG
+LINK_INTERFACE_MULTIPLICITY_RELEASE
+LINK_SEARCH_END_STATIC
+LINK_SEARCH_START_STATIC
+LOCATION
+LOCATION_DEBUG
+LOCATION_RELEASE
+MACOSX_BUNDLE
+MACOSX_BUNDLE_INFO_PLIST
+MACOSX_FRAMEWORK_INFO_PLIST
+MAP_IMPORTED_CONFIG_DEBUG
+MAP_IMPORTED_CONFIG_RELEASE
+OSX_ARCHITECTURES
+OSX_ARCHITECTURES_DEBUG
+OSX_ARCHITECTURES_RELEASE
+OUTPUT_NAME
+OUTPUT_NAME_DEBUG
+OUTPUT_NAME_RELEASE
+POST_INSTALL_SCRIPT
+PREFIX
+PRE_INSTALL_SCRIPT
+PRIVATE_HEADER
+PROJECT_LABEL
+PUBLIC_HEADER
+RESOURCE
+RULE_LAUNCH_COMPILE
+RULE_LAUNCH_CUSTOM
+RULE_LAUNCH_LINK
+RUNTIME_OUTPUT_DIRECTORY
+RUNTIME_OUTPUT_DIRECTORY_DEBUG
+RUNTIME_OUTPUT_DIRECTORY_RELEASE
+RUNTIME_OUTPUT_NAME
+RUNTIME_OUTPUT_NAME_DEBUG
+RUNTIME_OUTPUT_NAME_RELEASE
+SKIP_BUILD_RPATH
+SOURCES
+SOVERSION
+STATIC_LIBRARY_FLAGS
+STATIC_LIBRARY_FLAGS_DEBUG
+STATIC_LIBRARY_FLAGS_RELEASE
+SUFFIX
+TYPE
+VERSION
+VS_DOTNET_REFERENCES
+VS_GLOBAL_WHATEVER
+VS_GLOBAL_KEYWORD
+VS_GLOBAL_PROJECT_TYPES
+VS_KEYWORD
+VS_SCC_AUXPATH
+VS_SCC_LOCALPATH
+VS_SCC_PROJECTNAME
+VS_SCC_PROVIDER
+VS_WINRT_EXTENSIONS
+VS_WINRT_REFERENCES
+WIN32_EXECUTABLE
+XCODE_ATTRIBUTE_WHATEVER
+)
+ 
+  message("======================== ${tgt} ========================")
+  foreach(p ${props})
+    echo_target_property("${t}" "${p}")
+  endforeach()
+  message("")
+endfunction()
+ 
+ 
+function(ecbuild_echo_targets)
+  set(tgts ${ARGV})
+  foreach(t ${tgts})
+    echo_target("${t}")
+  endforeach()
+endfunction()
\ No newline at end of file
diff --git a/ecbuild/cmake/ecbuild_enable_fortran.cmake b/ecbuild/cmake/ecbuild_enable_fortran.cmake
new file mode 100644
index 0000000..dfb28d4
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_enable_fortran.cmake
@@ -0,0 +1,56 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+
+# macro for enabling the fortan language
+
+macro( ecbuild_enable_fortran )
+
+    set( options REQUIRED  )
+    set( single_value_args MODULE_DIRECTORY )
+    set( multi_value_args  )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_enable_fortran(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    enable_language( Fortran )
+
+    if( DEFINED _PAR_REQUIRED )
+      if( CMAKE_Fortran_COMPILER_FORCED )
+        set( CMAKE_Fortran_COMPILER_WORKS 1 )
+      endif()
+      if( NOT CMAKE_Fortran_COMPILER OR NOT CMAKE_Fortran_COMPILER_WORKS )
+          message( FATAL_ERROR "Fortran compiler required by project ${PROJECT_NAME} but does not seem to work" )
+      endif()
+    endif()
+
+    if( CMAKE_Fortran_COMPILER_LOADED )
+        include(CheckFortranFunctionExists)
+		if( CMAKE_C_COMPILER_LOADED AND ENABLE_FORTRAN_C_INTERFACE )
+			include(FortranCInterface)
+		endif()
+		set( EC_HAVE_FORTRAN 1 )
+    endif()
+
+    if( DEFINED _PAR_MODULE_DIRECTORY )
+        set( CMAKE_Fortran_MODULE_DIRECTORY  ${_PAR_MODULE_DIRECTORY} )
+    else()
+        set( CMAKE_Fortran_MODULE_DIRECTORY  ${CMAKE_BINARY_DIR}/module CACHE PATH "directory for all fortran modules." )
+    endif()
+
+	file( MAKE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY} )
+
+    include_directories( ${CMAKE_Fortran_MODULE_DIRECTORY} )
+
+    install( CODE "EXECUTE_PROCESS (COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"${CMAKE_Fortran_MODULE_DIRECTORY}/\${BUILD_TYPE}\" \"${INSTALL_INCLUDE_DIR}\")" )
+
+endmacro( ecbuild_enable_fortran )
diff --git a/ecbuild/cmake/ecbuild_find_fortranlibs.cmake b/ecbuild/cmake/ecbuild_find_fortranlibs.cmake
new file mode 100644
index 0000000..b40a5eb
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_find_fortranlibs.cmake
@@ -0,0 +1,131 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to find fortran (static) link libraries
+
+
+macro( ecbuild_find_fortranlibs )
+
+    # parse parameters
+
+    set( options REQUIRED )
+	set( single_value_args COMPILER )
+    set( multi_value_args  )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_find_python(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+	if( NOT FORTRANLIBS_FOUND ) # don't repeat search
+
+		if( _PAR_COMPILER )
+			set( __known_fcomp 0 )
+		endif()
+
+		if( _PAR_COMPILER MATCHES "gfortran" )
+			set( WITH_LIBGFORTRAN 1 )
+			set( __known_fcomp 1 )
+		endif()
+
+		if( _PAR_COMPILER MATCHES "pgi" )
+			set( WITH_PGI_FORTRAN 1 )
+			set( __known_fcomp 1 )
+		endif()
+
+		if( _PAR_COMPILER MATCHES "xlf" )
+			set( WITH_XL_FORTRAN 1 )
+			set( __known_fcomp 1 )
+		endif()
+
+		if( _PAR_COMPILER MATCHES "intel" )
+			message( FATAL_ERROR "searching for intel libraries has not been implemented" )
+			set( __known_fcomp 1 )
+		endif()
+
+		if( _PAR_COMPILER AND NOT __known_fcomp )
+			message( FATAL_ERROR "unknown fortran compiler ${_PAR_COMPILER}" )
+		endif()
+
+		### set path from environment variables
+
+		foreach( _fortran_lib PGI XLF LIBGFORTRAN )
+			if( NOT ${_fortran_lib}_PATH AND NOT "$ENV{${_fortran_lib}_PATH}" STREQUAL "" )
+				set( ${_fortran_lib}_PATH "$ENV{${_fortran_lib}_PATH}" )
+			endif()
+		endforeach()
+
+		set( _flibs_found 0 )
+
+		### default is to search for gfortran
+
+		if( NOT WITH_PGI_FORTRAN AND NOT WITH_LIBGFORTRAN AND NOT WITH_XL_FORTRAN
+			AND NOT DEFINED PGI_PATH AND NOT DEFINED LIBGFORTRAN_PATH AND NOT DEFINED XLF_PATH )
+			message( WARNING "Finding fortran libs for unspecified Fortran compiler: default search [ gfortran ]" )
+			set( WITH_LIBGFORTRAN 1 )
+		endif()
+
+		### actual search ...
+
+		if( WITH_PGI_FORTRAN OR DEFINED PGI_PATH )
+
+			find_package(PGIFortran)
+
+			if( LIBPGIFORTRAN_FOUND )
+				set( FORTRAN_LIBRARIES ${PGIFORTRAN_LIBRARIES} )
+				set( _flibs_found 1 )
+				set( _flibs_txt "PGI" )
+			endif()
+
+		endif()
+
+		if( WITH_LIBGFORTRAN OR DEFINED LIBGFORTRAN_PATH )
+
+			find_package(LibGFortran)
+
+			if( LIBGFORTRAN_FOUND )
+				set( FORTRAN_LIBRARIES ${GFORTRAN_LIBRARIES} )
+				set( _flibs_found 1 )
+				set( _flibs_txt "gfortran" )
+			endif()
+
+		endif()
+
+		if( WITH_XL_FORTRAN OR DEFINED XLF_PATH )
+
+			find_package(XLFortranLibs)
+
+			if( LIBXLFORTRAN_FOUND )
+				set( FORTRAN_LIBRARIES ${XLFORTRAN_LIBRARIES} )
+				set( _flibs_found 1 )
+				set( _flibs_txt "XLF" )
+			endif()
+
+		endif()
+
+		### set found
+
+		if( _flibs_found )
+			set( FORTRANLIBS_FOUND 1 CACHE INTERNAL "Fortran libraries found" )
+			set( FORTRANLIBS_NAME ${_flibs_txt}  CACHE INTERNAL "Fortran library name" )
+			set( FORTRAN_LIBRARIES ${FORTRAN_LIBRARIES} CACHE INTERNAL "Fortran libraries" )
+			message( STATUS "Found Fortran libraries: ${_flibs_txt}" )
+		else()
+			set( FORTRANLIBS_FOUND 0 )
+			if( _PAR_REQUIRED )
+			   message( FATAL_ERROR "Failed to find Fortran libraries" )
+			else()
+			   message( STATUS "Failed to find Fortran libraries" )
+			endif()
+		endif()
+
+	endif( NOT FORTRANLIBS_FOUND )
+
+endmacro( ecbuild_find_fortranlibs )
diff --git a/ecbuild/cmake/ecbuild_find_lexyacc.cmake b/ecbuild/cmake/ecbuild_find_lexyacc.cmake
new file mode 100644
index 0000000..373b81c
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_find_lexyacc.cmake
@@ -0,0 +1,60 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to find python
+
+# OUTPUT:
+#
+# BISON_FOUND or YACC_FOUND
+# FLEX_FOUND or LEX_FOUND
+#
+# BISON_EXECUTABLE or YACC_EXECUTABLE
+# FLEX_EXECUTABLE or LEX_EXECUTABLE
+
+macro( ecbuild_find_lexyacc )
+
+	# find preferably bison or else yacc
+
+	if( NOT SKIP_BISON )
+
+		find_package( BISON 2.3 )
+		find_package( FLEX )
+
+	endif()
+
+	if( NOT BISON_FOUND AND NOT SKIP_YACC )
+
+		find_package( YACC )
+		find_package( LEX  )
+
+	endif()
+
+	if( NOT YACC_FOUND AND NOT BISON_FOUND ) # neither bison nor yacc were found
+		message( FATAL_ERROR "neither bison or yacc were found - at least one is required (together with its lexical analyser" )
+	endif()
+
+	if( NOT YACC_FOUND ) # check for both bison & flex together
+		if( BISON_FOUND AND NOT FLEX_FOUND )
+			message( FATAL_ERROR "both bison and flex are required - flex not found" )
+		endif()
+		if( FLEX_FOUND AND NOT BISON_FOUND )
+			message( FATAL_ERROR "both bison and flex are required - bison not found" )
+		endif()
+	endif()
+
+	if( NOT BISON_FOUND ) # check for both yacc & lex together
+		if( YACC_FOUND AND NOT LEX_FOUND )
+			message( FATAL_ERROR "both yacc and lex are required - lex not found" )
+		endif()
+		if( LEX_FOUND AND NOT YACC_FOUND )
+			message( FATAL_ERROR "both yacc and lex are required - yacc not found" )
+		endif()
+	endif()
+
+endmacro( ecbuild_find_lexyacc )
diff --git a/ecbuild/cmake/ecbuild_find_mpi.cmake b/ecbuild/cmake/ecbuild_find_mpi.cmake
new file mode 100644
index 0000000..9ed4b3c
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_find_mpi.cmake
@@ -0,0 +1,230 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to find MPI
+# uses the canonical find_package( MPI )
+# but does more checks
+
+macro( ecbuild_find_mpi )
+
+    # parse parameters
+
+    set( options REQUIRED )
+    set( single_value_args )
+    set( multi_value_args COMPONENTS )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_find_mpi(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    # if user defined compilers are MPI compliant, then we use them ...
+    if( NOT DEFINED ECBUILD_FIND_MPI )
+      set( ECBUILD_FIND_MPI TRUE )
+    endif()
+    if( ECBUILD_FIND_MPI )
+
+        # C compiler
+
+        if( CMAKE_C_COMPILER_LOADED AND NOT MPI_C_COMPILER )
+
+            include(CheckCSourceCompiles)
+
+            check_c_source_compiles("
+                #include <mpi.h>
+                int main(int argc, char* argv[])
+                {
+                int rank;
+                MPI_Init(&argc, &argv); 
+                MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
+                MPI_Finalize();
+                return 0;
+                }
+                "
+                C_COMPILER_SUPPORTS_MPI )
+
+            if( C_COMPILER_SUPPORTS_MPI )
+                message( STATUS "C compiler supports MPI -- ${CMAKE_C_COMPILER}" )
+                set( MPI_C_COMPILER ${CMAKE_C_COMPILER} )
+            endif()
+
+        endif()
+
+        # CXX compiler
+
+        if( CMAKE_CXX_COMPILER_LOADED AND NOT MPI_CXX_COMPILER )
+
+            include(CheckCXXSourceCompiles)
+
+            check_cxx_source_compiles("
+                #include <mpi.h>
+                 #include <iostream>
+                 int main(int argc, char* argv[])
+                 {
+                   MPI_Init(&argc, &argv); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Finalize();
+                   return 0;
+                 }
+                 "
+                 CXX_COMPILER_SUPPORTS_MPI )
+
+            if( CXX_COMPILER_SUPPORTS_MPI )
+                message( STATUS "C++ compiler supports MPI -- ${CMAKE_CXX_COMPILER}" )
+                set( MPI_CXX_COMPILER ${CMAKE_CXX_COMPILER} )
+            endif()
+
+        endif()
+
+        # Fortran compiler
+
+        if( CMAKE_Fortran_COMPILER_LOADED AND NOT MPI_Fortran_COMPILER )
+
+            include(CheckFortranSourceCompiles)
+
+            check_fortran_source_compiles("
+                program main
+                use MPI
+                integer ierr
+                call MPI_INIT( ierr )
+                call MPI_FINALIZE( ierr )
+                end
+                "
+            Fortran_COMPILER_SUPPORTS_MPI )
+
+            if( Fortran_COMPILER_SUPPORTS_MPI )
+                message( STATUS "Fortran compiler supports MPI (F90) -- ${CMAKE_Fortran_COMPILER}" )
+                set( MPI_Fortran_COMPILER ${CMAKE_Fortran_COMPILER} )
+                set( MPI_Fortran_FOUND TRUE )
+            endif()
+
+        endif()
+
+        if( NOT _PAR_REQUIRED )
+            find_package( MPI QUIET )
+        else()
+            find_package( MPI QUIET REQUIRED )
+        endif()
+
+        if( C_COMPILER_SUPPORTS_MPI )
+            set( MPI_C_FOUND TRUE )
+        endif()
+        if( CXX_COMPILER_SUPPORTS_MPI )
+            set( MPI_CXX_FOUND TRUE )
+        endif()
+        if( Fortran_COMPILER_SUPPORTS_MPI )
+            set( MPI_Fortran_FOUND TRUE )
+        endif()
+
+    else()
+
+        # find_package with Cray compiler did not send MPI_<lang>_FOUND
+        if( CMAKE_C_COMPILER_LOADED )
+            set( C_COMPILER_SUPPORTS_MPI TRUE )
+            set( MPI_C_FOUND TRUE )
+        endif()
+        if( CMAKE_CXX_COMPILER_LOADED )
+            set( CXX_COMPILER_SUPPORTS_MPI TRUE )
+            set( MPI_CXX_FOUND TRUE )
+        endif()
+        if( CMAKE_Fortran_COMPILER_LOADED )
+            set( Fortran_COMPILER_SUPPORTS_MPI TRUE )
+            set( MPI_Fortran_FOUND TRUE )
+        endif()
+
+    endif( ECBUILD_FIND_MPI )
+
+    # hide these variables from UI
+
+    mark_as_advanced( MPI_LIBRARY MPI_EXTRA_LIBRARY )
+
+    if( NOT _PAR_COMPONENTS )
+      set( _PAR_COMPONENTS C )
+    endif()
+
+    set( MPI_FOUND TRUE )
+    foreach( _lang ${_PAR_COMPONENTS} )
+      if( NOT MPI_${_lang}_FOUND )
+        set( MPI_FOUND FALSE )
+      endif()
+    endforeach()
+
+endmacro( ecbuild_find_mpi )
+
+
+macro( ecbuild_enable_mpi )
+
+    set( options REQUIRED )
+    set( single_value_args )
+    set( multi_value_args COMPONENTS )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+        message(FATAL_ERROR "Unknown keywords given to ecbuild_find_mpi(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_COMPONENTS )
+      set (_PAR_COMPONENTS C )
+    endif()
+
+    if( NOT _PAR_REQUIRED )
+       ecbuild_find_mpi( COMPONENTS ${_PAR_COMPONENTS} )
+    else()
+       ecbuild_find_mpi( COMPONENTS ${_PAR_COMPONENTS} REQUIRED )
+    endif()
+
+    if( MPI_C_FOUND AND NOT C_COMPILER_SUPPORTS_MPI )
+        cmake_add_c_flags("${MPI_C_COMPILE_FLAGS}")
+        include_directories(${MPI_C_INCLUDE_PATH})
+    endif()
+
+    if( MPI_CXX_FOUND AND NOT CXX_COMPILER_SUPPORTS_MPI )
+        cmake_add_cxx_flags("${MPI_CXX_COMPILE_FLAGS}")
+        include_directories(${MPI_CXX_INCLUDE_PATH})
+    endif()
+
+    if( MPI_Fortran_FOUND AND NOT Fortran_COMPILER_SUPPORTS_MPI )
+        include(ecbuild_check_fortran_source)
+        cmake_add_fortran_flags("${MPI_Fortran_COMPILE_FLAGS}")
+        include_directories(${MPI_Fortran_INCLUDE_PATH})
+    endif()
+
+endmacro( ecbuild_enable_mpi )
+
+macro( ecbuild_include_mpi )
+
+    set( options )
+    set( single_value_args )
+    set( multi_value_args )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+        message(FATAL_ERROR "Unknown keywords given to ecbuild_find_mpi(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( MPI_C_FOUND AND NOT C_COMPILER_SUPPORTS_MPI )
+        include( ecbuild_check_c_source )
+        cmake_add_c_flags("${MPI_C_COMPILE_FLAGS}")
+        include_directories(${MPI_C_INCLUDE_PATH})
+    endif()
+
+    if( MPI_CXX_FOUND AND NOT CXX_COMPILER_SUPPORTS_MPI )
+        include( ecbuild_check_cxx_source )
+        cmake_add_cxx_flags("${MPI_CXX_COMPILE_FLAGS}")
+        include_directories(${MPI_CXX_INCLUDE_PATH})
+    endif()
+
+    if( MPI_Fortran_FOUND AND NOT Fortran_COMPILER_SUPPORTS_MPI )
+        include( ecbuild_check_fortran_source )
+        cmake_add_fortran_flags("${MPI_Fortran_COMPILE_FLAGS}")
+        include_directories(${MPI_Fortran_INCLUDE_PATH})
+    endif()
+
+endmacro( ecbuild_include_mpi )
diff --git a/ecbuild/cmake/ecbuild_find_omp.cmake b/ecbuild/cmake/ecbuild_find_omp.cmake
new file mode 100644
index 0000000..86ab139
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_find_omp.cmake
@@ -0,0 +1,204 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding a test
+##############################################################################
+
+macro( lookup_omp_flags )
+  set(_OMP_FLAG_GNU        "-fopenmp")
+  set(_OMPSTUBS_FLAG_GNU   "-fno-openmp")
+
+  set(_OMP_FLAG_Cray       "-homp")
+  set(_OMPSTUBS_FLAG_Cray  "-hnoomp")
+
+  set(_OMP_FLAG_XL         "-qsmp=omp")
+  set(_OMPSTUBS_FLAG_XL    "-qsmp=noomp")
+
+  set(_OMP_FLAG_Intel      "-openmp")
+  set(_OMPSTUBS_FLAG_Intel "-openmp-stubs")
+
+  # sample C openmp source code to test
+  set(_OMP_C_TEST_SOURCE
+  "
+  #include <omp.h>
+  int main() {
+  #ifdef _OPENMP
+    #pragma omp parallel
+    {
+      int id = omp_get_thread_num();
+    }
+    return 0;
+  #else
+    breaks_on_purpose
+  #endif
+  }
+  ")
+  set( _OMP_CXX_TEST_SOURCE ${_OMP_C_TEST_SOURCE} )
+
+
+  # sample C openmp source code to test
+  set(_OMPSTUBS_C_TEST_SOURCE
+  "
+  // Include must be found
+  #include <omp.h>
+  int main() {
+  #ifdef _OPENMP
+    breaks_on_purpose
+  #else
+    #pragma omp parallel
+    {
+      // This pragma should have passed compilation
+      int id = 0;
+    }
+    return 0;
+  #endif
+  }
+  ")
+  set( _OMPSTUBS_CXX_TEST_SOURCE ${_OMPSTUBS_C_TEST_SOURCE} )
+
+
+  # sample Fortran openmp source code to test
+  set(_OMP_Fortran_TEST_SOURCE
+  "
+  program main
+    use omp_lib
+  end program
+  ")
+  set( _OMPSTUBS_Fortran_TEST_SOURCE ${_OMP_Fortran_TEST_SOURCE} )
+
+endmacro()
+
+
+# MACRO ecbuild_find_omp
+#
+# ecbuild_find_omp( COMPONENTS C CXX Fortran
+#                   STUBS )
+# Sets following variables
+#   - OMP_FOUND
+#   - OMP_<lang>_FOUND
+#   - OMP_<lang>_FLAGS
+#
+# If STUBS are available, above flags will still hold TRUE,
+# as OMP code will just work.
+#
+macro( ecbuild_find_omp )
+
+  set( options REQUIRED STUBS )
+  set( single_value_args )
+  set( multi_value_args COMPONENTS )
+
+  cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+  if( NOT _PAR_COMPONENTS )
+    message( FATAL_ERROR "No COMPONENTS were specified, looking for OMP.\n Please find with COMPONENTS C CXX Fortran " )
+  endif()
+
+  set( _STUBS "" )
+  if( _PAR_STUBS )
+    set( _STUBS "STUBS" )
+  endif()
+
+  lookup_omp_flags()
+
+  set( OMP${_STUBS}_FOUND TRUE )
+
+  foreach( _LANG ${_PAR_COMPONENTS} )
+
+    if( NOT OMP${_STUBS}_${_LANG}_FLAGS )
+
+      if( DEFINED _OMP${_STUBS}_FLAG_${CMAKE_${_LANG}_COMPILER_ID} )
+        set( _OMP${_STUBS}_${_LANG}_FLAG "${_OMP${_STUBS}_FLAG_${CMAKE_${_LANG}_COMPILER_ID}}" )
+      endif()
+      if( CMAKE_${_LANG}_COMPILER_LOADED AND _OMP${_STUBS}_${_LANG}_FLAG )
+        set(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+        set(CMAKE_REQUIRED_FLAGS "${_OMP${_STUBS}_${_LANG}_FLAG}")
+        include(Check${_LANG}SourceCompiles)
+        set( _SOURCE ${_OMP${_STUBS}_${_LANG}_TEST_SOURCE} )
+        set( _FLAG ${_LANG}_COMPILER_SUPPORTS_OMP${_STUBS})
+        if( _LANG STREQUAL "C" )
+          check_c_source_compiles("${_SOURCE}" ${_FLAG} )
+        endif()
+        if( _LANG STREQUAL "CXX" )
+          check_cxx_source_compiles("${_SOURCE}" ${_FLAG} )
+        endif()
+        if( _LANG STREQUAL "Fortran" )
+          check_fortran_source_compiles("${_SOURCE}" ${_FLAG} )
+        endif()
+        set(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}")
+      endif()
+
+      if( ${_LANG}_COMPILER_SUPPORTS_OMP${_STUBS} )
+        set( OMP${_STUBS}_${_LANG}_FLAGS ${_OMP${_STUBS}_${_LANG}_FLAG} )
+      endif()
+
+    else()
+      set( ${_LANG}_COMPILER_SUPPORTS_OMP${_STUBS} TRUE )
+    endif()
+
+
+    set( OMP${_STUBS}_${_LANG}_FIND_QUIETLY TRUE )
+    find_package_handle_standard_args( OMP${_STUBS}_${_LANG} REQUIRED_VARS ${_LANG}_COMPILER_SUPPORTS_OMP${_STUBS}  )
+
+    if( OMP${_STUBS}_FORTRAN_FOUND )
+      set( OMP${_STUBS}_Fortran_FOUND TRUE )
+    endif()
+
+    if( NOT OMP${_STUBS}_${_LANG}_FOUND )
+      set( OMP${_STUBS}_FOUND FALSE )
+    endif()
+
+    if( _PAR_STUBS )
+      set( OMP_${_LANG}_FOUND ${OMPSTUBS_${_LANG}_FOUND} )
+      set( OMP_${_LANG}_FLAGS ${OMPSTUBS_${_LANG}_FLAGS} )
+    endif()
+
+  endforeach()
+
+  if( _PAR_STUBS )
+    set( OMP_FOUND ${OMPSTUBS_FOUND} )
+  endif()
+
+endmacro( ecbuild_find_omp )
+
+
+macro( ecbuild_enable_omp )
+
+  ecbuild_find_omp( COMPONENTS C CXX Fortran )
+
+  if( OMP_C_FOUND )
+    set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OMP_C_FLAGS}" )
+  endif()
+
+  if( OMP_CXX_FOUND )
+    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OMP_CXX_FLAGS}" )
+  endif()
+
+  if( OMP_Fortran_FOUND )
+    set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OMP_Fortran_FLAGS}" )
+  endif()
+
+endmacro( ecbuild_enable_omp )
+
+macro( ecbuild_enable_ompstubs )
+
+  ecbuild_find_omp( COMPONENTS C CXX Fortran STUBS )
+
+  if( OMPSTUBS_C_FOUND )
+    set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OMPSTUBS_C_FLAGS}" )
+  endif()
+
+  if( OMPSTUBS_CXX_FOUND )
+    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OMPSTUBS_CXX_FLAGS}" )
+  endif()
+
+  if( OMPSTUBS_Fortran_FOUND )
+    set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OMPSTUBS_Fortran_FLAGS}" )
+  endif()
+
+endmacro( ecbuild_enable_ompstubs )
diff --git a/ecbuild/cmake/ecbuild_find_package.cmake b/ecbuild/cmake/ecbuild_find_package.cmake
new file mode 100644
index 0000000..e6cea19
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_find_package.cmake
@@ -0,0 +1,190 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding a subproject directory
+##############################################################################
+
+macro( ecbuild_find_package )
+
+    set( options REQUIRED QUIET EXACT )
+    set( single_value_args NAME VERSION )
+    set( multi_value_args )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_find_package(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_NAME  )
+      message(FATAL_ERROR "The call to ecbuild_find_package() doesn't specify the NAME.")
+    endif()
+
+    if( _PAR_EXACT AND NOT _PAR_VERSION )
+      message(FATAL_ERROR "Call to ecbuild_find_package() requests EXACT but doesn't specify VERSION.")
+    endif()
+
+	# debug_var( _PAR_NAME )
+
+    string( TOUPPER ${_PAR_NAME} PNAME )
+
+    set( _${PNAME}_version "" )
+    if( _PAR_VERSION )
+        set( _${PNAME}_version ${_PAR_VERSION} )
+        if( _PAR_EXACT )
+            set( _${PNAME}_version ${_PAR_VERSION} EXACT )
+        endif()
+    endif()
+
+	# check developer mode (search in cmake cache )
+
+	if( NOT ${DEVELOPER_MODE} )
+		set( NO_DEV_BUILD_DIRS NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_BUILDS_PATH )
+	endif()
+
+	# search user defined paths first
+
+	if( ${_PAR_NAME}_PATH OR ${PNAME}_PATH OR ${_PAR_NAME}_DIR OR ${PNAME}_DIR )
+
+		# debug_var( ${_PAR_NAME}_PATH )
+		# debug_var( ${PNAME}_PATH )
+
+		# 1) search using CONFIG mode -- try to locate a configuration file provided by the package (package-config.cmake)
+
+		if( NOT ${_PAR_NAME}_FOUND )
+			find_package( ${_PAR_NAME} ${_${PNAME}_version} NO_MODULE QUIET
+                HINTS ${${PNAME}_PATH} ${_PAR_NAME}_PATH ${${PNAME}_DIR} ${${_PAR_NAME}_DIR}
+                NO_DEFAULT_PATH )
+		endif()
+
+		# 2) search using a file Find<package>.cmake if it exists ( macro should itself take *_PATH into account )
+
+		if( NOT ${_PAR_NAME}_FOUND )
+			find_package( ${_PAR_NAME} ${_${PNAME}_version} MODULE QUIET )
+		endif()
+
+		# is <package>_PATH was given and we don't find anything then we FAIL
+
+		if( NOT ${_PAR_NAME}_FOUND )
+			if( ${_PAR_NAME}_PATH )
+				message( FATAL_ERROR "${_PAR_NAME}_PATH was provided by user but package ${_PAR_NAME} wasn't found" )
+			endif()
+			if( ${PNAME}_PATH )
+				message( FATAL_ERROR "${PNAME}_PATH was provided by user but package ${_PAR_NAME} wasn't found" )
+			endif()
+		endif()
+
+	endif()
+
+	# 3) search developer cache and recently configured packages in the CMake GUI
+
+	if( NOT ${_PAR_NAME}_FOUND )
+
+		find_package( ${_PAR_NAME} ${_${PNAME}_version} QUIET NO_MODULE HINTS ENV ${PNAME}_PATH
+				${NO_DEV_BUILD_DIRS}
+				NO_CMAKE_ENVIRONMENT_PATH
+				NO_SYSTEM_ENVIRONMENT_PATH
+				NO_CMAKE_SYSTEM_PATH
+				NO_CMAKE_SYSTEM_PACKAGE_REGISTRY )
+
+	endif()
+
+	# 4) search special ECMWF paths
+
+	if( NOT ${_PAR_NAME}_FOUND )
+
+		set( _ecmwf_paths ) # clear variable
+		ecbuild_list_extra_search_paths( ${_PAR_NAME} _ecmwf_paths )
+
+		if( _ecmwf_paths )
+			find_package( ${_PAR_NAME} ${_${PNAME}_version} QUIET NO_MODULE PATHS ${_ecmwf_paths} NO_DEFAULT_PATH )
+		endif()
+
+	endif()
+
+	# 5) search system paths, for <package>-config.cmake
+
+	if( NOT ${_PAR_NAME}_FOUND )
+
+		find_package( ${_PAR_NAME} ${_${PNAME}_version} QUIET NO_MODULE ${NO_DEV_BUILD_DIRS} )
+
+	endif()
+
+	# 6) search system paths, using Find<package>.cmake if it exists
+
+	if( NOT ${_PAR_NAME}_FOUND )
+
+		find_package( ${_PAR_NAME} ${_${PNAME}_version} QUIET MODULE )
+
+	endif()
+
+    # check version found is acceptable
+
+    if( ${_PAR_NAME}_FOUND )
+        set( _version_acceptable 1 )
+        if( _PAR_VERSION )
+            if( ${_PAR_NAME}_VERSION )
+                if( _PAR_EXACT )
+                    if( NOT ${_PAR_NAME}_VERSION VERSION_EQUAL _PAR_VERSION )
+                        message( WARNING "${PROJECT_NAME} requires (exactly) ${_PAR_NAME} = ${_PAR_VERSION} -- found ${${_PAR_NAME}_VERSION}" )
+                        set( _version_acceptable 0 )
+                    endif()
+                else()
+                    if( _PAR_VERSION VERSION_LESS ${_PAR_NAME}_VERSION OR _PAR_VERSION VERSION_EQUAL ${_PAR_NAME}_VERSION )
+                        set( _version_acceptable 1 )
+                    else()
+                        if( NOT _PAR_QUIET )
+                            message( WARNING "${PROJECT_NAME} requires ${_PAR_NAME} >= ${_PAR_VERSION} -- found ${${_PAR_NAME}_VERSION}" )
+                        endif()
+                        set( _version_acceptable 0 )
+                    endif()
+                endif()
+            else()
+                if( NOT _PAR_QUIET )
+                    message( WARNING "${PROJECT_NAME} found ${_PAR_NAME} but no version information, so cannot check if satisfies ${_PAR_VERSION}" )
+                endif()
+                set( _version_acceptable 0 )
+            endif()
+        endif()
+    endif()
+
+    if( ${_PAR_NAME}_FOUND )
+
+        if( _version_acceptable )
+            set( ${PNAME}_FOUND ${${_PAR_NAME}_FOUND} )
+        else()
+            if( NOT _PAR_QUIET )
+                message( WARNING "${PROJECT_NAME} found ${_PAR_NAME} but with unsuitable version" )
+            endif()
+            set( ${PNAME}_FOUND 0 )
+            set( ${_PAR_NAME}_FOUND 0 )
+        endif()
+
+    endif()
+
+	### final messages
+
+	if( NOT ${_PAR_NAME}_FOUND )
+		if( _PAR_REQUIRED )
+			message( FATAL_ERROR
+              "    ${PROJECT_NAME} FAILED to find REQUIRED package ${_PAR_NAME}"
+              "    Provide location with \"-D ${PNAME}_DIR=/...\"\n"
+              "    or export ${PNAME}_DIR in environment"
+            )
+		else()
+			if( NOT _PAR_QUIET )
+				message( STATUS
+                      "${PROJECT_NAME} couldn't find package ${_PAR_NAME}.\n"
+                      "      Provide location with \"-D ${PNAME}_DIR=/...\"\n"
+                      "      or export ${PNAME}_DIR in environment" )
+			endif()
+		endif()
+	endif()
+
+endmacro()
diff --git a/ecbuild/cmake/ecbuild_find_perl.cmake b/ecbuild/cmake/ecbuild_find_perl.cmake
new file mode 100644
index 0000000..2d0cd02
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_find_perl.cmake
@@ -0,0 +1,45 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# OUTPUT:
+
+macro( ecbuild_find_perl )
+
+    # parse parameters
+
+    set( options REQUIRED )
+    set( single_value_args )
+    set( multi_value_args  )
+
+    cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_p_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_find_perl(): \"${_p_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+	find_package( Perl )
+
+    if( NOT PERL_EXECUTABLE AND _p_REQUIRED )
+        message( FATAL_ERROR "Failed to find Perl (REQUIRED)" )
+    endif()
+
+    if( PERL_EXECUTABLE )
+
+		execute_process( COMMAND ${PERL_EXECUTABLE} -V:version OUTPUT_VARIABLE  perl_version_output_variable  RESULT_VARIABLE  perl_version_return )
+		if( NOT perl_version_return )
+			string(REGEX REPLACE "version='([^']+)'.*" "\\1" PERL_VERSION ${perl_version_output_variable})
+		endif()
+
+		# from cmake 2.8.8 onwards
+		if( NOT PERL_VERSION_STRING )
+			set( PERL_VERSION_STRING ${PERL_VERSION} )
+		endif()
+
+	endif()
+
+endmacro( ecbuild_find_perl )
\ No newline at end of file
diff --git a/ecbuild/cmake/ecbuild_find_python.cmake b/ecbuild/cmake/ecbuild_find_python.cmake
new file mode 100644
index 0000000..d207ee8
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_find_python.cmake
@@ -0,0 +1,131 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to find python
+
+# OUTPUT:
+#   PYTHONINTERP_FOUND
+#   PYTHONLIBS_FOUND
+#   PYTHON_INCLUDE_DIRS
+#   PYTHON_LIBRARIES
+#   PYTHON_SITE_PACKAGES
+
+macro( ecbuild_find_python )
+
+    # parse parameters
+
+    set( options REQUIRED )
+    set( single_value_args VERSION )
+    set( multi_value_args  )
+
+    cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_p_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_find_python(): \"${_p_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    # find python executable
+
+    find_package( PythonInterp )
+
+    if( NOT PYTHONINTERP_FOUND AND _p_REQUIRED )
+        message( FATAL_ERROR "Failed to find any Python interpreter (REQUIRED)" )
+    endif()
+
+    # find python version
+    # execute_process( COMMAND ${PYTHON_EXECUTABLE} -V ERROR_VARIABLE _version  RESULT_VARIABLE _return ERROR_STRIP_TRAILING_WHITESPACE)
+    # if( NOT _return )
+    #    string(REGEX REPLACE ".*([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1.\\2.\\3" PYTHON_VERSION ${_version} )
+    # endif()
+    # endif()
+
+    # message( STATUS "Python version ${PYTHON_VERSION_STRING}" )
+    # debug_var(PYTHON_VERSION_MAJOR)
+    # debug_var(PYTHON_VERSION_MINOR)
+    # debug_var(PYTHON_VERSION_PATCH)
+
+    if( PYTHONINTERP_FOUND AND DEFINED _p_VERSION )
+        if( _p_VERSION VERSION_GREATER "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}" )
+            set( PYTHONINTERP_FOUND 0 )
+            set( PYTHON_EXECUTABLE "PYTHON_EXECUTABLE-NOTFOUND" )
+            if( _p_REQUIRED )
+                message( FATAL_ERROR "Required python version at least ${_p_VERSION} but found only ${PYTHON_VERSION_STRING}" )
+            else()
+                message( WARNING "Looking for python version at least ${_p_VERSION} but found only ${PYTHON_VERSION_STRING}\nMarking Python as NOTFOUND" )
+            endif()
+        endif()
+    endif()
+
+    if( PYTHONINTERP_FOUND )
+
+        # find pythonn config
+
+        if( PYTHON_EXECUTABLE AND EXISTS ${PYTHON_EXECUTABLE}-config )
+            set(PYTHON_CONFIG ${PYTHON_EXECUTABLE}-config CACHE PATH "" FORCE)
+        else()
+            find_program( PYTHON_CONFIG NAMES python-config python-config${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} )
+        endif()
+
+        # find python libs
+
+        # The OpenBSD python packages have python-config's 
+        # that don't reliably report linking flags that will work.
+        
+        if( PYTHON_CONFIG AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" )
+            
+            execute_process(COMMAND "${PYTHON_CONFIG}" --ldflags
+                            OUTPUT_VARIABLE PYTHON_LIBRARIES
+                            OUTPUT_STRIP_TRAILING_WHITESPACE
+                            ERROR_QUIET)
+
+            execute_process(COMMAND "${PYTHON_CONFIG}" --includes
+                            OUTPUT_VARIABLE PYTHON_INCLUDE_DIR
+                            OUTPUT_STRIP_TRAILING_WHITESPACE
+                            ERROR_QUIET)
+
+#           debug_var(PYTHON_LIBRARIES)
+#           debug_var(PYTHON_INCLUDE_DIR)
+
+            string(REGEX REPLACE "^[-I]" "" PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}")
+            string(REGEX REPLACE "[ ]-I" " " PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}")
+            
+            separate_arguments(PYTHON_INCLUDE_DIR)
+
+        else() # revert to finding pythonlibs the standard way (cmake macro)
+            
+            find_package(PythonLibs)
+            if( PYTHON_INCLUDE_PATH AND NOT PYTHON_INCLUDE_DIR )
+                set(PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_PATH}")
+            endif()
+
+        endif()
+
+        # set output variables
+
+        find_package_handle_standard_args( PythonLibs DEFAULT_MSG PYTHON_INCLUDE_DIR PYTHON_LIBRARIES )
+
+        set( PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIR} )
+        set( PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE_DIR} )
+
+        list( REMOVE_DUPLICATES PYTHON_INCLUDE_DIRS )
+
+        # find where python site-packages are ...
+
+        execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    endif()
+
+#    debug_var( PYTHONINTERP_FOUND )
+#    debug_var( PYTHON_EXECUTABLE )
+#    debug_var( PYTHONLIBS_FOUND )
+#    debug_var( PYTHON_INCLUDE_DIRS )
+#    debug_var( PYTHON_LIBRARIES )
+#    debug_var( PYTHON_SITE_PACKAGES )
+
+endmacro( ecbuild_find_python )
diff --git a/ecbuild/cmake/ecbuild_generate_config_headers.cmake b/ecbuild/cmake/ecbuild_generate_config_headers.cmake
new file mode 100644
index 0000000..abf9aac
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_generate_config_headers.cmake
@@ -0,0 +1,47 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# generates the config header fot the project with the system introspection done by CMake
+
+function( ecbuild_generate_config_headers )
+
+    # parse parameters
+
+    set( options )
+	set( single_value_args DESTINATION )
+    set( multi_value_args  )
+
+	cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_generate_config_headers(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+	# generate list of compiler flags
+
+	string( TOUPPER ${PROJECT_NAME} PNAME )
+
+	get_property( langs GLOBAL PROPERTY ENABLED_LANGUAGES )
+
+	foreach( lang ${langs} )
+		set( EC_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} ${CMAKE_${lang}_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}" )
+	endforeach()
+
+	configure_file( ${ECBUILD_MACROS_DIR}/ecbuild_config.h.in  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_ecbuild_config.h   )
+
+	# install ecbuild configuration
+
+	set( _destination ${INSTALL_INCLUDE_DIR} )
+	if( _p_DESTINATION )
+		set( _destination ${_p_DESTINATION} )
+	endif()
+
+	install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_ecbuild_config.h DESTINATION ${_destination} )
+
+endfunction( ecbuild_generate_config_headers )
diff --git a/ecbuild/cmake/ecbuild_generate_rpc.cmake b/ecbuild/cmake/ecbuild_generate_rpc.cmake
new file mode 100644
index 0000000..5bd4f76
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_generate_rpc.cmake
@@ -0,0 +1,73 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to process rpcgen files
+
+macro( ecbuild_generate_rpc )
+
+    set( options )
+    set( single_value_args SOURCE TARGET_H TARGET_C )
+    set( multi_value_args DEPENDANT )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_generate_rpc(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_SOURCE  )
+      message(FATAL_ERROR "The call to ecbuild_generate_rpc() doesn't specify the SOURCE file.")
+    endif()
+
+# optional
+#    if( NOT _PAR_DEPENDANT )
+#      message(FATAL_ERROR "The call to ecbuild_generate_rpc() doesn't specify the DEPENDANT files.")
+#    endif()
+
+    if( NOT DEFINED _PAR_TARGET_H AND NOT DEFINED _PAR_TARGET_C )
+      message(FATAL_ERROR "The call to ecbuild_generate_rpc() doesn't specify the _PAR_TARGET_H or _PAR_TARGET_C files.")
+    endif()
+
+    find_package( RPCGEN REQUIRED )
+
+    if( DEFINED _PAR_TARGET_H )
+
+        add_custom_command(
+          OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_H}
+          COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${_PAR_SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_SOURCE}
+          COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_H}
+          COMMAND ${RPCGEN_EXECUTABLE} -h -o ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_H} ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_SOURCE}
+          DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_PAR_SOURCE} )
+
+      if( DEFINED _PAR_DEPENDANT )
+        foreach( file ${_PAR_DEPENDANT} )
+            set_source_files_properties( ${file} PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_H}" )
+        endforeach()
+      endif()
+
+    endif()
+
+    if( DEFINED _PAR_TARGET_C )
+
+        add_custom_command(
+          OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_C}
+          COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${_PAR_SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_SOURCE}
+          COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_C}
+          COMMAND ${RPCGEN_EXECUTABLE} -c -o ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_C} ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_SOURCE}
+          DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_PAR_SOURCE} )
+
+      if( DEFINED _PAR_DEPENDANT )
+        foreach( file ${_PAR_DEPENDANT} )
+            set_source_files_properties( ${file} PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_C}" )
+        endforeach()
+      endif()
+
+    endif()
+
+endmacro( ecbuild_generate_rpc )
diff --git a/ecbuild/cmake/ecbuild_generate_yy.cmake b/ecbuild/cmake/ecbuild_generate_yy.cmake
new file mode 100644
index 0000000..391bed1
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_generate_yy.cmake
@@ -0,0 +1,113 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro to process lex/yacc files
+
+macro( ecbuild_generate_yy )
+
+	ecbuild_find_lexyacc() # find [ yacc|byson ] and [ lex|flex ]
+
+	ecbuild_find_perl( REQUIRED )
+
+    set( options )
+	set( single_value_args YYPREFIX YACC LEX LEX_FLAGS YACC_FLAGS FLEX_FLAGS BISON_FLAGS )
+    set( multi_value_args  DEPENDANT )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_generate_yy(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_YYPREFIX  )
+      message(FATAL_ERROR "The call to ecbuild_generate_yy() doesn't specify the YYPREFIX.")
+    endif()
+
+    if( NOT _PAR_YACC  )
+      message(FATAL_ERROR "The call to ecbuild_generate_yy() doesn't specify the YACC file.")
+    endif()
+
+    if( NOT _PAR_LEX  )
+      message(FATAL_ERROR "The call to ecbuild_generate_yy() doesn't specify the LEX file.")
+    endif()
+
+    if( NOT _PAR_DEPENDANT )
+      message(FATAL_ERROR "The call to ecbuild_generate_yy() doesn't specify the DEPENDANT files.")
+    endif()
+
+    set( BASE ${_PAR_YYPREFIX}_${_PAR_YACC} )
+
+	## default flags
+
+	if( NOT _PAR_LEX_FLAGS )
+		set( _PAR_LEX_FLAGS "" )
+	endif()
+
+	if( NOT _PAR_FLEX_FLAGS )
+		set( _PAR_FLEX_FLAGS "-l" )
+	endif()
+
+	if( NOT _PAR_YACC_FLAGS )
+		set( _PAR_YACC_FLAGS "-t" )
+	endif()
+
+	if( NOT _PAR_BISON_FLAGS )
+		set( _PAR_BISON_FLAGS "-t" )
+	endif()
+
+#    debug_var( BASE )
+
+    set( ${BASE}yy_tmp_target ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_YACC}.tmp.c )
+    set( ${BASE}yl_tmp_target ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_LEX}.tmp.c )
+
+    set( ${BASE}yy_target ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_YACC}.c )
+    set( ${BASE}yl_target ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_LEX}.c )
+
+    add_custom_target( ${_PAR_YYPREFIX}_${DEPENDANT} SOURCES ${_PAR_YACC}.y ${_PAR_LEX}.l )
+
+    if( BISON_FOUND )
+		bison_target( ${BASE}_parser  ${_PAR_YACC}.y  ${${BASE}yy_tmp_target} COMPILE_FLAGS "${_PAR_BISON_FLAGS}" )
+	else()
+		yacc_target( ${BASE}_parser  ${_PAR_YACC}.y   ${${BASE}yy_tmp_target} COMPILE_FLAGS "${_PAR_YACC_FLAGS}" )
+    endif()
+
+    if( FLEX_FOUND )
+		flex_target(  ${BASE}_scanner ${_PAR_LEX}.l   ${${BASE}yl_tmp_target} COMPILE_FLAGS "${_PAR_FLEX_FLAGS}" )
+        add_flex_bison_dependency(${BASE}_scanner ${BASE}_parser)
+    else()
+		lex_target(  ${BASE}_scanner ${_PAR_LEX}.l   ${${BASE}yl_tmp_target} COMPILE_FLAGS "${_PAR_LEX_FLAGS}" )
+        add_lex_yacc_dependency(${BASE}_scanner ${BASE}_parser)
+    endif()
+
+    set_source_files_properties(${${BASE}yy_tmp_target} GENERATED)
+    set_source_files_properties(${${BASE}yl_tmp_target} GENERATED)
+
+    add_custom_command(OUTPUT  ${${BASE}yy_target}
+                       COMMAND ${CMAKE_COMMAND} -E copy ${${BASE}yy_tmp_target} ${${BASE}yy_target}
+                       COMMAND ${PERL_EXECUTABLE} -pi -e 's/yy/${_PAR_YYPREFIX}/g' ${${BASE}yy_target}
+                       COMMAND ${PERL_EXECUTABLE} -pi -e 's/\\.tmp\\.c/\\.c/g' ${${BASE}yy_target}
+                       DEPENDS ${${BASE}yy_tmp_target}
+    )
+
+    add_custom_command(OUTPUT  ${${BASE}yl_target}
+                       COMMAND ${CMAKE_COMMAND} -E copy ${${BASE}yl_tmp_target} ${${BASE}yl_target}
+                       COMMAND ${PERL_EXECUTABLE} -pi -e 's/yy/${_PAR_YYPREFIX}/g' ${${BASE}yl_target}
+                       COMMAND ${PERL_EXECUTABLE} -pi -e 's/\\.tmp\\.c/\\.c/g' ${${BASE}yl_target}
+                       DEPENDS ${${BASE}yl_tmp_target}
+    )
+
+    set_source_files_properties(${${BASE}yy_target} GENERATED)
+    set_source_files_properties(${${BASE}yl_target} GENERATED)
+
+    foreach( file ${_PAR_DEPENDANT} )
+        set_source_files_properties( ${file} PROPERTIES
+                                    OBJECT_DEPENDS "${${BASE}yy_target};${${BASE}yl_target}" )
+    endforeach()
+
+endmacro( ecbuild_generate_yy )
diff --git a/ecbuild/cmake/ecbuild_get_date.cmake b/ecbuild/cmake/ecbuild_get_date.cmake
new file mode 100644
index 0000000..afe3d09
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_get_date.cmake
@@ -0,0 +1,32 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# get date macro
+
+macro(ecbuild_get_date RESULT)
+    if(UNIX)
+        execute_process(COMMAND "date" "+%d/%m/%Y" OUTPUT_VARIABLE ${RESULT})
+        string(REGEX REPLACE "(..)/(..)/(....).*" "\\3.\\2.\\1" ${RESULT} ${${RESULT}})
+    else()
+        message(SEND_ERROR "date not implemented")
+    endif()
+endmacro(ecbuild_get_date)
+
+############################################################################################
+# get timestamp
+
+macro(ecbuild_get_timestamp RESULT)
+    if(UNIX)
+        execute_process(COMMAND "date" "+%Y/%m/%d/%H/%M/%S" OUTPUT_VARIABLE _timestamp)
+        string(REGEX REPLACE "(....)/(..)/(..)/(..)/(..)/(..).*" "\\1\\2\\3\\4\\5\\6" ${RESULT} ${_timestamp})
+    else()
+        message(WARNING "This is NOT UNIX - timestamp not implemented")
+    endif()
+endmacro(ecbuild_get_timestamp)
+
diff --git a/ecbuild/cmake/ecbuild_get_resources.cmake b/ecbuild/cmake/ecbuild_get_resources.cmake
new file mode 100644
index 0000000..bf48ecf
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_get_resources.cmake
@@ -0,0 +1,52 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for adding a test
+##############################################################################
+
+macro( ecbuild_get_resources )
+
+    set( options                )
+    set( single_value_args TO_DIR  )
+    set( multi_value_args  LIST )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+        message(FATAL_ERROR "Unknown keywords given to ecbuild_get_resources(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_LIST )
+        message( FATAL_ERROR "Missing parameter LIST of resources in macro ecbuild_get_resources()" )
+    endif()
+
+    if( NOT _PAR_TO_DIR )
+		set( _PAR_TO_DIR ${CMAKE_CURRENT_BINARY_DIR} )
+	endif()
+	
+    list( LENGTH _PAR_LIST _rsize )
+    math( EXPR _max "${_rsize}-1" )
+    foreach( i RANGE 0 ${_max} 2 )
+
+        math( EXPR in "${i}+1" )
+
+        list( GET _PAR_LIST ${i}  r  )
+        list( GET _PAR_LIST ${in} rh )
+
+#        debug_var( r  )
+#        debug_var( rh )
+
+        get_filename_component( rf ${r} NAME )
+
+        file( DOWNLOAD ${r} ${_PAR_TO_DIR}/${rf} EXPECTED_HASH SHA1=${rh} )
+
+    endforeach()
+		
+
+endmacro()
diff --git a/ecbuild/cmake/ecbuild_get_test_data.cmake b/ecbuild/cmake/ecbuild_get_test_data.cmake
new file mode 100644
index 0000000..b617a7d
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_get_test_data.cmake
@@ -0,0 +1,271 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# function for downloading test data
+
+function( _download_test_data _p_NAME _p_DIRNAME )
+
+    # TODO: make that 'at ecmwf'
+    #if(1)
+    #unset(ENV{no_proxy})
+    #unset(ENV{NO_PROXY})
+    #set(ENV{http_proxy} "http://proxy.ecmwf.int:3333")
+    #endif()
+
+    find_program( CURL_PROGRAM curl )
+
+    if( CURL_PROGRAM )
+
+		add_custom_command( OUTPUT ${_p_NAME}
+			COMMENT "(curl) downloading http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME}"
+			COMMAND ${CURL_PROGRAM} --silent --show-error --fail --output ${_p_NAME} http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME} )
+
+    else()
+
+        find_program( WGET_PROGRAM wget )
+
+        if( WGET_PROGRAM )
+
+				 add_custom_command( OUTPUT ${_p_NAME}
+						COMMENT "(wget) downloading http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME}"
+						COMMAND ${WGET_PROGRAM} -nv -O ${_p_NAME} http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME} )
+
+				else()
+
+					if( WARNING_CANNOT_DOWNLOAD_TEST_DATA )
+						message( WARNING "Couldn't find curl neither wget -- cannot download test data from server.\nPlease obtain the test data by other means and pleace it in the build directory." )
+						set( WARNING_CANNOT_DOWNLOAD_TEST_DATA 1 CACHE INTERNAL "Couldn't find curl neither wget -- cannot download test data from server" )
+						mark_as_advanced( WARNING_CANNOT_DOWNLOAD_TEST_DATA )
+					endif()
+
+        endif()
+
+    endif()
+
+endfunction()
+
+
+##############################################################################
+# function for getting test data
+#
+# examples:
+#
+## no check done
+#    ecbuild_get_test_data( NAME msl.grib NOCHECK )
+#
+## checksum agains remote md5 file
+#    ecbuild_get_test_data( NAME msl.grib )
+#
+## checksum agains local md5
+#    ecbuild_get_test_data( NAME msl.grib MD5 f69ca0929d1122c7878d19f32401abe9 )
+#
+## (DEPRECATED) checksum agains local sha1
+#    ecbuild_get_test_data( NAME msl.grib SHA1 5a8e8c57c510b64e31863ca47cfc3b65971089d9 )
+
+function( ecbuild_get_test_data )
+
+    set( options NOCHECK )
+    set( single_value_args TARGET URL NAME DIRNAME MD5 SHA1)
+    set( multi_value_args  )
+
+    cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_p_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_get_test_data(): \"${_p_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    file( RELATIVE_PATH currdir ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} )
+
+    ### check parameters
+
+    if( NOT _p_NAME )
+      message(FATAL_ERROR "ecbuild_get_test_data() expects a NAME")
+    endif()
+
+    if( NOT _p_TARGET )
+      string( REGEX REPLACE "[^A-Za-z0-9_]" "_" _p_TARGET "test_data_${_p_NAME}")
+#      string( REGEX REPLACE "[^A-Za-z0-9_]" "_" _p_TARGET "${_p_NAME}")
+#      set( _p_TARGET ${_p_NAME} )
+    endif()
+
+    if( NOT _p_DIRNAME )
+      set( _p_DIRNAME ${PROJECT_NAME}/${currdir} )
+    endif()
+
+#    debug_var( _p_TARGET )
+#    debug_var( _p_NAME )
+#    debug_var( _p_URL )
+#    debug_var( _p_DIRNAME )
+
+    # download the data
+
+    _download_test_data( ${_p_NAME} ${_p_DIRNAME} )
+
+    # perform the checksum if requested
+
+    set( _deps ${_p_NAME} )
+
+    if( NOT _p_NOCHECK )
+
+        find_program( MD5SUM md5sum )
+
+        if( MD5SUM AND NOT _p_MD5 AND NOT _p_SHA1) # use remote md5
+
+#            message( STATUS " ---  getting MD5 sum " )
+
+            add_custom_command( OUTPUT ${_p_NAME}.localmd5
+                                COMMAND ${MD5SUM} -t ${_p_NAME} > ${_p_NAME}.localmd5
+                                DEPENDS ${_p_NAME} )
+
+            _download_test_data( ${_p_NAME}.md5 ${_p_DIRNAME} )
+
+            add_custom_command(	OUTPUT ${_p_NAME}.ok
+                                COMMAND diff ${_p_NAME}.md5 ${_p_NAME}.localmd5 && touch ${_p_NAME}.ok
+                                DEPENDS ${_p_NAME}.localmd5 ${_p_NAME}.md5 )
+
+            list( APPEND _deps  ${_p_NAME}.localmd5 ${_p_NAME}.ok )
+
+        endif()
+
+        if( MD5SUM AND _p_MD5 )
+
+#            message( STATUS " ---  computing MD5 sum [${_p_MD5}]" )
+
+            add_custom_command( OUTPUT ${_p_NAME}.localmd5
+                                COMMAND ${MD5SUM} -t ${_p_NAME} > ${_p_NAME}.localmd5
+                                DEPENDS ${_p_NAME} )
+
+            configure_file( "${ECBUILD_MACROS_DIR}/md5.in" ${_p_NAME}.md5 @ONLY )
+
+            add_custom_command( OUTPUT ${_p_NAME}.ok
+                                COMMAND diff ${_p_NAME}.md5 ${_p_NAME}.localmd5 && touch ${_p_NAME}.ok
+                                DEPENDS ${_p_NAME}.localmd5 )
+
+            list( APPEND _deps ${_p_NAME}.localmd5 ${_p_NAME}.ok )
+
+        endif()
+
+#        if( _p_SHA1 )
+
+##            message( STATUS " ---  computing SHA1 sum [${_p_SHA1}]" )
+
+#            find_program( SHASUM NAMES sha1sum shasum )
+#            if( SHASUM )
+#                add_custom_command( OUTPUT ${_p_NAME}.localsha1
+#                                    COMMAND ${SHASUM} ${_p_NAME} > ${_p_NAME}.localsha1 )
+
+#                add_custom_command( OUTPUT ${_p_NAME}.ok
+#                                    COMMAND diff ${_p_NAME}.sha1 ${_p_NAME}.localsha1 && touch ${_p_NAME}.ok )
+
+#                configure_file( "${ECBUILD_MACROS_DIR}/sha1.in" ${_p_NAME}.sha1 @ONLY )
+
+#                list( APPEND _deps ${_p_NAME}.localsha1 ${_p_NAME}.ok )
+#            endif()
+
+#        endif()
+
+    endif()
+
+    add_custom_target( ${_p_TARGET} DEPENDS ${_deps} )
+
+endfunction(ecbuild_get_test_data)
+
+##############################################################################
+# function for getting test data
+#
+# examples:
+#
+## no check done
+#    ecbuild_get_test_multidata( TARGET get_foobar_data NAMES foo.grib bar.grib DIRNAME test/data/dir NOCHECK )
+#
+## check for remote md5
+#    ecbuild_get_test_multidata( TARGET get_foobar_data NAMES foo.grib bar.grib DIRNAME test/data/dir )
+#
+
+function( ecbuild_get_test_multidata )
+
+    set( options NOCHECK )
+    set( single_value_args TARGET DIRNAME )
+    set( multi_value_args  NAMES )
+
+    cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_p_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_get_test_data(): \"${_p_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    ### check parameters
+
+    if( NOT _p_NAMES )
+      message(FATAL_ERROR "ecbuild_get_test_data() expects a NAMES")
+    endif()
+
+    if( NOT _p_TARGET )
+      message(FATAL_ERROR "ecbuild_get_test_data() expects a TARGET")
+    endif()
+
+#    debug_var( _p_TARGET )
+#    debug_var( _p_NAME )
+#    debug_var( _p_DIRNAME )
+
+    if( _p_NOCHECK )
+        set( _nocheck NOCHECK )
+    endif()
+
+    ### prepare file
+
+    set( _script ${CMAKE_CURRENT_BINARY_DIR}/get_data_${_p_TARGET}.cmake )
+
+    file( WRITE ${_script} "
+function(EXEC_CHECK)
+     execute_process(COMMAND \${ARGV} RESULT_VARIABLE CMD_RESULT)
+     if(CMD_RESULT)
+           message(FATAL_ERROR \"Error running ${CMD}\")
+     endif()
+endfunction()\n\n" )
+
+    foreach( _d ${_p_NAMES} )
+
+        string( REGEX MATCH "[^:]+" _f "${_d}" )
+
+        get_filename_component( _file ${_f} NAME )
+        get_filename_component( _dir  ${_f} PATH )
+
+        list( APPEND _path_comps ${_p_DIRNAME} ${_dir} )
+
+        join( _path_comps "/" _dirname )
+
+        if( _dirname )
+            set( _dirname DIRNAME ${_dirname} )
+        endif()
+
+        string( REPLACE "." "_" _name "${_file}" )
+        string( REGEX MATCH ":.*"  _md5  "${_d}" )
+        string( REPLACE ":" "" _md5 "${_md5}" )
+
+        if( _md5 )
+            set( _md5 MD5 ${_md5} )
+        endif()
+
+        #debug_var(_f)
+        #debug_var(_file)
+        #debug_var(_dirname)
+        #debug_var(_name)
+        #debug_var(_md5)
+
+        ecbuild_get_test_data( TARGET __get_data_${_p_TARGET}_${_name} NAME ${_file} ${_dirname} ${_md5} ${_nocheck} )
+
+        file( APPEND ${_script} "exec_check( ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target __get_data_${_p_TARGET}_${_name} )\n" )
+
+    endforeach()
+
+    add_test(  NAME ${_p_TARGET} COMMAND ${CMAKE_COMMAND} -P ${_script} )
+
+endfunction(ecbuild_get_test_multidata)
+
diff --git a/ecbuild/cmake/ecbuild_install_package.cmake b/ecbuild/cmake/ecbuild_install_package.cmake
new file mode 100644
index 0000000..dec046f
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_install_package.cmake
@@ -0,0 +1,286 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+###############################################################################
+
+macro( ecbuild_install_project )
+
+
+    set( options )
+    set( single_value_args NAME DESCRIPTION )
+    set( multi_value_args  COMPONENTS )
+
+    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+    if(_PAR_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "Unknown keywords given to ecbuild_install_project(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+    if( NOT _PAR_NAME  )
+      message(FATAL_ERROR "The call to ecbuild_install_project() doesn't specify the NAME.")
+    endif()
+
+    ### PACKAGING ########################################################
+
+    string( TOUPPER ${PROJECT_NAME} PNAME )
+    string( TOLOWER ${PROJECT_NAME} LNAME )
+    
+    # components
+
+    #    if( DEFINED _PAR_COMPONENTS )
+    #        set(CPACK_COMPONENTS_ALL   "${_PAR_COMPONENTS}")
+    #    else()
+    #        set(CPACK_COMPONENTS_ALL   "${PROJECT_NAME}")
+    #    endif()
+    
+    # name, version, etc ...
+
+    set(CPACK_PACKAGE_NAME      "${_PAR_NAME}")
+    set(CPACK_PACKAGE_VERSION   "${${PNAME}_VERSION_STR}")
+
+    set(CPACK_PACKAGE_FILE_NAME   "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
+
+    set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ECMWF") # required for DEB
+
+    #    set(CPACK_ARCHIVE_COMPONENT_INSTALL "ON")
+    #    set(CPACK_RPM_COMPONENT_INSTALL "ON")
+
+    #    set(CPACK_GENERATOR        "TGZ;RPM;DEB")
+    set(CPACK_GENERATOR        "TGZ")
+    set(CPACK_SOURCE_GENERATOR "TGZ")
+    set(CPACK_PACKAGE_VENDOR   "ECMWF")
+
+    # short description
+
+    if( _PAR_DESCRIPTION )
+        set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_DESCRIPTION}" )
+    else()
+        set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_NAME} misses a description" )
+    endif()
+
+    # long description
+
+    if( EXISTS ${PROJECT_SOURCE_DIR}/INSTALL )
+        set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/INSTALL")
+    endif()
+	if( EXISTS ${PROJECT_SOURCE_DIR}/LICENSE )
+        set(CPACK_RESOURCE_FILE_LICENSE    "${PROJECT_SOURCE_DIR}/LICENSE")
+    endif()
+
+    # set(CPACK_PACKAGE_EXECUTABLES ${ECBUILD_ALL_EXES})
+
+	list( APPEND CPACK_SOURCE_INSTALLED_DIRECTORIES
+	   "${PROJECT_SOURCE_DIR}" "."
+	   "${ECBUILD_MACROS_DIR}" "cmake/" )
+
+	# what to pack and not
+
+    set(CPACK_SOURCE_IGNORE_FILES
+        /build/
+        /\\\\.git/
+        /\\\\.svn/
+        CMakeLists.txt.user
+        \\\\.swp$
+        p4config
+    )
+
+    # skip the files that were declared as DONT_PACK
+
+    list( APPEND CPACK_SOURCE_IGNORE_FILES ${ECBUILD_DONT_PACK_FILES} )
+
+    # cpack config file
+
+    # set(CPACK_INSTALL_CMAKE_PROJECTS "${${PROJECT_NAME}_BINARY_DIR}" "${PROJECT_NAME}" "${CPACK_COMPONENTS_ALL}" "*" )
+
+    include( CPack )
+
+    ### EXPORTS ########################################################
+ 
+
+    foreach( _tpl ${${PNAME}_TPLS} )
+        string( TOUPPER ${_tpl} _TPL )
+
+        if( ${_tpl}_INCLUDE_DIRS )
+            list( APPEND ${PNAME}_TPL_INCLUDE_DIRS ${${_tpl}_INCLUDE_DIRS} )
+        elseif( ${_tpl}_INCLUDE_DIR )
+            list( APPEND ${PNAME}_TPL_INCLUDE_DIRS ${${_tpl}_INCLUDE_DIR} )
+        elseif( ${_TPL}_INCLUDE_DIRS )
+            list( APPEND ${PNAME}_TPL_INCLUDE_DIRS ${${_TPL}_INCLUDE_DIRS} )
+        elseif( ${_TPL}_INCLUDE_DIR )
+            list( APPEND ${PNAME}_TPL_INCLUDE_DIRS ${${_TPL}_INCLUDE_DIR} )
+        endif()
+
+        if( ${_tpl}_LIBRARIES )
+            list( APPEND ${PNAME}_TPL_LIBRARIES   ${${_tpl}_LIBRARIES} )
+        elseif( ${_tpl}_LIBRARY )
+            list( APPEND ${PNAME}_TPL_LIBRARIES   ${${_tpl}_LIBRARY} )
+        elseif( ${_TPL}_LIBRARIES )
+            list( APPEND ${PNAME}_TPL_LIBRARIES   ${${_TPL}_LIBRARIES} )
+        elseif( ${_TPL}_LIBRARY )
+            list( APPEND ${PNAME}_TPL_LIBRARIES   ${${_TPL}_LIBRARY} )
+        endif()
+
+        if( ${_tpl}_DEFINITIONS )
+            list( APPEND ${PNAME}_TPL_DEFINITIONS ${${_tpl}_DEFINITIONS} )
+        elseif( ${_TPL}_DEFINITIONS )
+            list( APPEND ${PNAME}_TPL_DEFINITIONS ${${_TPL}_DEFINITIONS} )
+        endif()
+    endforeach()
+
+    # TOP-LEVEL PROJECT EXPORT
+
+    if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
+
+        # exports the package for use from the build-tree -- inserts <package> into the CMake user package registry
+    
+        export( PACKAGE ${PROJECT_NAME} )
+         
+        set( _template_config "${ECBUILD_MACROS_DIR}/project-config.cmake.in" )
+        if( EXISTS ${LNAME}-config.cmake.in )
+            set( _template_config "${LNAME}-config.cmake.in" )
+        endif()
+    
+        set( _template_config_version "${ECBUILD_MACROS_DIR}/project-config-version.cmake.in" )
+        if( EXISTS ${LNAME}-config-version.cmake.in )
+            set( _template_config_version "${LNAME}-config-version.cmake.in" )
+        endif()
+    
+        # project-config-version.cmake -- format ([0-9]+).([0-9]+).([0-9]+)
+    
+        set( PACKAGE_VERSION "${${PNAME}_VERSION}" ) 
+        
+        configure_file( "${_template_config_version}" "${PROJECT_BINARY_DIR}/${LNAME}-config-version.cmake" @ONLY )
+
+        install( FILES "${PROJECT_BINARY_DIR}/${LNAME}-config-version.cmake" DESTINATION "${INSTALL_CMAKE_DIR}" )
+
+        # prepare imutable variables (don't depend on install path)
+
+        set( CONF_FEATURES "" )
+        if( ${PNAME}_FEATURES )
+          set( CONF_FEATURES ${${PNAME}_FEATURES} )
+        endif()
+
+        set( CONF_LIBRARIES ${${PROJECT_NAME}_ALL_LIBS} )
+        if( ${PNAME}_LIBRARIES )
+            set( CONF_LIBRARIES ${${PNAME}_LIBRARIES} )
+        endif()
+                    
+        set( CONF_DEFINITIONS "" )
+        if( ${PNAME}_DEFINITIONS )
+           set( CONF_DEFINITIONS ${${PNAME}_DEFINITIONS} )
+        endif()
+
+        set( CONF_TPL_LIBRARIES   "" )
+        if( ${PNAME}_TPL_LIBRARIES )
+           set( CONF_TPL_LIBRARIES ${${PNAME}_TPL_LIBRARIES} )
+        endif()
+
+        # project-config.cmake @ build tree
+
+        set( CONF_TPLS ${${PNAME}_TPLS} )
+
+        set( CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" )
+        if( ${PNAME}_INCLUDE_DIRS )
+            set( CONF_INCLUDE_DIRS ${${PNAME}_INCLUDE_DIRS} )
+        endif()
+
+        set( CONF_TPL_INCLUDE_DIRS "" )
+        foreach( _tpl ${${PNAME}_TPLS} )
+            string( TOUPPER ${_tpl} TPL )
+            if( ${_tpl}_INCLUDE_DIRS )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${_tpl}_INCLUDE_DIRS} )
+            elseif( ${_tpl}_INCLUDE_DIR )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${_tpl}_INCLUDE_DIR} )
+            elseif( ${TPL}_INCLUDE_DIRS )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${TPL}_INCLUDE_DIRS} )
+            elseif( ${TPL}_INCLUDE_DIR )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${TPL}_INCLUDE_DIR} )
+            endif()
+        endforeach()
+
+        set( CONF_IMPORT_FILE "${LNAME}-import.cmake" )
+
+        if( EXISTS "${PROJECT_SOURCE_DIR}/${CONF_IMPORT_FILE}.in" )
+            configure_file( "${PROJECT_SOURCE_DIR}/${CONF_IMPORT_FILE}.in"
+                            "${PROJECT_BINARY_DIR}/${CONF_IMPORT_FILE}" @ONLY )
+            install( FILES "${PROJECT_BINARY_DIR}/${CONF_IMPORT_FILE}"
+                     DESTINATION "${INSTALL_CMAKE_DIR}" )
+        endif()
+
+        set( _lname_config "${PROJECT_BINARY_DIR}/${LNAME}-config.cmake")
+
+        set( _is_build_dir_export ON )
+        configure_file( "${_template_config}" "${_lname_config}" @ONLY )
+
+        file( REMOVE ${_lname_config}.tpls.in )
+
+        foreach( _tpl ${${PNAME}_TPLS} )
+            string( TOUPPER ${_tpl} TPL )
+            if( ${TPL}_IMPORT_FILE )
+                set( __import_file "${${TPL}_IMPORT_FILE}" )
+                file( APPEND "${_lname_config}.tpls.in" "if( NOT ${TPL}_IMPORT_FILE )\n" )
+                file( APPEND "${_lname_config}.tpls.in" "    include( \"${__import_file}\" OPTIONAL )\n" )
+                file( APPEND "${_lname_config}.tpls.in" "endif()\n" )
+            endif()
+        endforeach()
+
+        if( EXISTS "${_lname_config}.tpls.in" )
+            configure_file( "${_lname_config}.tpls.in" "${_lname_config}.tpls" @ONLY )
+            install( FILES "${_lname_config}.tpls" DESTINATION "${INSTALL_CMAKE_DIR}" )
+        endif()
+
+        # project-config.cmake @ install tree
+        
+        file( RELATIVE_PATH REL_INCLUDE_DIR "${${PNAME}_FULL_INSTALL_CMAKE_DIR}" "${${PNAME}_FULL_INSTALL_INCLUDE_DIR}" )
+        set( CONF_INCLUDE_DIRS "\${${PNAME}_CMAKE_DIR}/${REL_INCLUDE_DIR}" )
+
+        set( CONF_TPL_INCLUDE_DIRS "" )
+        foreach( _tpl ${${PNAME}_TPLS} )
+            string( TOUPPER ${_tpl} TPL )
+            if( ${TPL}_FULL_INSTALL_INCLUDE_DIR )
+                 list( APPEND CONF_TPL_INCLUDE_DIRS "\${${PNAME}_CMAKE_DIR}/${REL_INCLUDE_DIR}" )
+            endif()
+            if( ${_tpl}_INCLUDE_DIRS )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${_tpl}_INCLUDE_DIRS} )
+            elseif( ${_tpl}_INCLUDE_DIR )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${_tpl}_INCLUDE_DIR} )
+            elseif( ${TPL}_INCLUDE_DIRS )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${TPL}_INCLUDE_DIRS} )
+            elseif( ${TPL}_INCLUDE_DIR )
+                list( APPEND CONF_TPL_INCLUDE_DIRS ${${TPL}_INCLUDE_DIR} )
+            endif()
+        endforeach()
+        
+        set( _is_build_dir_export OFF )
+        configure_file( "${_template_config}" "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${LNAME}-config.cmake" @ONLY )
+        install( FILES "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${LNAME}-config.cmake" DESTINATION "${INSTALL_CMAKE_DIR}" )
+     
+        # install the export
+    
+        if( ${PROJECT_NAME}_ALL_EXES OR ${PROJECT_NAME}_ALL_LIBS )
+            install( EXPORT ${CMAKE_PROJECT_NAME}-targets DESTINATION "${INSTALL_CMAKE_DIR}" )
+        endif()
+    
+    else()
+
+        set( ${PNAME}_FOUND             TRUE                          PARENT_SCOPE )
+        set( ${PROJECT_NAME}_FOUND      TRUE                          PARENT_SCOPE )
+        set( ${PNAME}_VERSION           ${${PNAME}_VERSION}           PARENT_SCOPE )
+        set( ${PROJECT_NAME}_VERSION    ${${PNAME}_VERSION}           PARENT_SCOPE )
+        set( ${PNAME}_INCLUDE_DIRS      ${${PNAME}_INCLUDE_DIRS}      PARENT_SCOPE )
+        set( ${PNAME}_LIBRARIES         ${${PNAME}_LIBRARIES}         PARENT_SCOPE )
+        set( ${PNAME}_DEFINITIONS       ${${PNAME}_DEFINITIONS}       PARENT_SCOPE )
+        set( ${PNAME}_PACKAGES          ${${PNAME}_PACKAGES}          PARENT_SCOPE )
+        set( ${PNAME}_TPLS              ${${PNAME}_TPLS}              PARENT_SCOPE )
+        set( ${PNAME}_TPL_LIBRARIES     ${${PNAME}_TPL_LIBRARIES}     PARENT_SCOPE )
+        set( ${PNAME}_TPL_DEFINITIONS   ${${PNAME}_TPL_DEFINITIONS}   PARENT_SCOPE )
+        set( ${PNAME}_TPL_INCLUDE_DIRS  ${${PNAME}_TPL_INCLUDE_DIRS}  PARENT_SCOPE )
+
+    endif()
+
+endmacro( ecbuild_install_project )
diff --git a/ecbuild/cmake/ecbuild_links_target.cmake b/ecbuild/cmake/ecbuild_links_target.cmake
new file mode 100644
index 0000000..5dfacdc
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_links_target.cmake
@@ -0,0 +1,74 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# macro for adding a link to library on a development system
+
+set( EC_ALL_EXES "" CACHE INTERNAL "" )
+set( EC_ALL_LIBS "" CACHE INTERNAL "" )
+
+macro( ecbuild_link_exe TARGET  FILENAME FILEPATH )
+
+    if( DEFINED EC_LINK_DIR )
+       add_custom_target(${TARGET}_link
+          COMMAND ${CMAKE_COMMAND} -E make_directory ${EC_LINK_DIR}
+          COMMAND ${CMAKE_COMMAND} -E make_directory ${EC_LINK_DIR}/bin
+          COMMAND ${CMAKE_COMMAND} -E remove ${EC_LINK_DIR}/bin/${FILENAME}
+          COMMAND ${CMAKE_COMMAND} -E create_symlink ${FILEPATH} ${EC_LINK_DIR}/bin/${FILENAME}
+          DEPENDS ${TARGET}
+          COMMENT "link ${EC_LINK_DIR}/bin/${FILENAME}" )
+    endif()
+
+    set( EC_ALL_EXES ${EC_ALL_EXES} ${TARGET} CACHE INTERNAL "" )
+
+endmacro( ecbuild_link_exe  )
+
+###############################################################################
+# macro for adding a link to library on a development system
+
+macro( ecbuild_link_lib  TARGET FILENAME FILEPATH )
+
+    if( DEFINED EC_LINK_DIR )
+       add_custom_target(${TARGET}_link
+          COMMAND ${CMAKE_COMMAND} -E make_directory ${EC_LINK_DIR}
+          COMMAND ${CMAKE_COMMAND} -E make_directory ${EC_LINK_DIR}/lib
+          COMMAND ${CMAKE_COMMAND} -E remove ${EC_LINK_DIR}/lib/${FILENAME}
+          COMMAND ${CMAKE_COMMAND} -E create_symlink ${FILEPATH} ${EC_LINK_DIR}/lib/${FILENAME}
+          DEPENDS ${TARGET}
+          COMMENT "link ${EC_LINK_DIR}/lib/${FILENAME}" )
+    endif()
+
+    set( EC_ALL_LIBS ${EC_ALL_LIBS} ${TARGET} CACHE INTERNAL "" )
+
+endmacro( ecbuild_link_lib  )
+
+############################################################################################
+# define make links target
+
+macro( ecbuild_define_links_target )
+
+  if( DEFINED EC_LINK_DIR )
+
+    foreach( lib ${EC_ALL_LIBS} )
+      list( APPEND ec_link_libs ${lib}_link )
+    endforeach()
+    foreach( exe ${EC_ALL_EXES} )
+      list( APPEND ec_link_exes ${exe}_link )
+    endforeach()
+
+    add_custom_target( links DEPENDS ${ec_link_libs} ${ec_link_exes} )
+
+     #   debug_var( EC_ALL_EXES )
+     #   debug_var( ec_link_exes )
+
+     #  debug_var( EC_ALL_LIBS )
+     #   debug_var( ec_link_libs )
+
+  endif()
+
+endmacro(ecbuild_define_links_target)
diff --git a/ecbuild/cmake/ecbuild_list_extra_search_paths.cmake b/ecbuild/cmake/ecbuild_list_extra_search_paths.cmake
new file mode 100644
index 0000000..7373486
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_list_extra_search_paths.cmake
@@ -0,0 +1,108 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+#
+# macro for adding search paths to CMAKE_PREFIX_PATH
+# for example the ECMWF /usr/local/apps paths
+#
+# usage: ecbuild_list_extra_search_paths( netcdf4 VARIABLE )
+
+function( ecbuild_list_extra_search_paths pkg var )
+
+	# debug_var( pkg )
+	# debug_var( var )
+
+	string( TOUPPER ${pkg} _PKG )
+
+	# PKG_PATH (upper case)
+
+	if( DEFINED ${_PKG}_PATH AND EXISTS ${${_PKG}_PATH} )
+		message( "${_PKG}_PATH ${${_PKG}_PATH} exists " )
+		list( APPEND ${var} ${${_PKG}_PATH} )
+	endif()
+
+	# ENV PKG_PATH (upper case)
+
+	if( DEFINED ENV{${_PKG}_PATH} AND EXISTS $ENV{${_PKG}_PATH}  )
+		list( APPEND ${var} $ENV{${_PKG}_PATH} )
+	endif()
+
+	# pkg_PATH (lower case)
+
+	if( DEFINED ${pkg}_PATH AND EXISTS ${${pkg}_PATH} )
+		list( APPEND ${var} ${${pkg}_PATH} )
+	endif()
+
+	# ENV pkg_PATH (lower case)
+
+	if( DEFINED ${pkg}_PATH AND EXISTS ${${pkg}_PATH} )
+		list( APPEND ${var} ${${pkg}_PATH} )
+	endif()
+
+	# ENV PKG_DIR (upper case)
+
+	if( DEFINED ENV{${_PKG}_DIR} AND EXISTS $ENV{${_PKG}_DIR}  )
+		list( APPEND ${var} $ENV{${_PKG}_DIR} )
+	endif()
+
+	# ENV pkg_DIR (lower case)
+
+	if( DEFINED ENV{${pkg}_DIR} AND EXISTS $ENV{${pkg}_DIR} )
+		list( APPEND ${var} $ENV{${pkg}_DIR} )
+	endif()
+
+	# directories under /usr/local/apps/${pkg}
+
+	if( SEARCH_ECMWF_PATHS )
+
+		foreach( _apps /usr/local/apps/${pkg} /usr/local/lib/metaps/lib/${pkg} )
+
+			if( EXISTS ${_apps} )
+
+				 file( GLOB ps ${_apps}/[0-9]* )
+				 list( SORT ps )
+				 list( REVERSE ps ) # reversing will give us the newest versions first
+				 foreach( p ${ps} )
+					 if( IS_DIRECTORY ${p} )
+						  list( APPEND ${var}  ${p} )
+						  if( EXISTS ${p}/LP64 )
+							  list( APPEND ${var} ${p}/LP64 )
+						  endif()
+					 endif()
+				 endforeach()
+
+				 foreach( p ${_apps} ${_apps}/current ${_apps}/stable ${_apps}/new ${_apps}/next ${_apps}/prev )
+				   if( EXISTS ${p} )
+					   list( APPEND ${var} ${p} )
+				   endif()
+				   if( EXISTS ${p}/LP64 )
+					   list( APPEND ${var} ${p}/LP64 )
+				   endif()
+				 endforeach()
+
+			endif()
+
+		endforeach()
+
+	endif( SEARCH_ECMWF_PATHS )
+
+	# sanitize the list
+
+	if( ${var} )
+		list( REMOVE_DUPLICATES ${var} )
+	endif()
+
+	# define it out of the function
+
+	set( ${var} ${${var}} PARENT_SCOPE )
+
+# debug_var( ${var} )
+
+endfunction()
+
diff --git a/ecbuild/cmake/ecbuild_list_macros.cmake b/ecbuild/cmake/ecbuild_list_macros.cmake
new file mode 100644
index 0000000..5c10dd2
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_list_macros.cmake
@@ -0,0 +1,57 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# function for concatenating list into a string
+#
+# examples:
+#
+#   set( _paths "foo" "bar" )
+#   join( _paths "/" _mypath )
+#
+#   message( "${_mpath}" ) #  produces "foo/bar"
+
+function( JOIN _listname _glue _output )
+
+	set( _ret "" )
+
+	foreach( _v ${${_listname}} )
+		if( _ret )
+			set(_ret "${_ret}${_glue}${_v}") # append
+		else()
+			set(_ret "${_v}") # init
+		endif()
+	endforeach()
+
+	set(${_output} "${_ret}" PARENT_SCOPE)
+
+endfunction()
+
+##############################################################################
+# function for inserting a key / value into a map
+#
+# examples:
+#
+#   map_insert( "mymap" "foo" "bar" )
+#
+
+function( MAP_INSERT _map _key _value )
+	set( "_${_map}_${_key}" "${_value}" PARENT_SCOPE )
+endfunction(MAP_INSERT)
+
+##############################################################################
+# function for inserting a key / value into a map
+#
+# examples:
+#
+#   map_get( "mymap" "foo" VAR )
+#
+
+function( MAP_GET _map _key _var )
+	set( ${_var} "${_${_map}_${_key}}" PARENT_SCOPE )
+endfunction(MAP_GET)
diff --git a/ecbuild/cmake/ecbuild_pkgconfig.cmake b/ecbuild/cmake/ecbuild_pkgconfig.cmake
new file mode 100644
index 0000000..8549d46
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_pkgconfig.cmake
@@ -0,0 +1,365 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+#############################################################################################
+#
+# MACRO ecbuild_pkgconfig
+#
+# This macro creates a pkg-config file for the current project
+#
+# It takes following optional arguments:
+#
+#  - FILENAME <filename>
+#       The file that will be generated. Default value is the lowercase
+#       name of the project with suffix ".pc" is used
+#
+#  - NAME <name>
+#       The name to be given to the package. Default value is the lowercase
+#       name of the project
+#
+#  - TEMPLATE <template>
+#       The template configuration file to use. This is useful to create more
+#       custom pkg-config files. Default is ${ECBUILD_CMAKE_DIR}/pkg-config.pc.in
+#
+#  - URL <url>
+#       The url of the package. Default is ${UPPERCASE_PROJECT_NAME}_URL
+#
+#  - DESCRIPTION <description>
+#       The description of the package. Default is ${UPPERCASE_PROJECT_NAME}_DESCRIPTION
+#
+#  - LIBRARIES <libraries>
+#       The package libraries. Default is ${UPPERCASE_PROJECT_NAME}_LIBRARIES
+#       This is e.g. of the form "eckit;eckit_geometry"
+#
+#  - IGNORE_INCLUDE_DIRS <include_dirs>
+#       Ignore specified include directories
+#
+#  - IGNORE_LIBRARIES <libraries>
+#       Ignore specified libraries
+#
+#  - LANGUAGES <languages>
+#       List of languages used. If none given, all CMake_<lang>_COMPILER_LOAED languages
+#       are added. Accepted languages: C CXX Fortran
+#
+#  - NO_PRIVATE_INCLUDE_DIRS
+#       Don't add include dirs of dependencies to Cflags. This is mainly useful
+#       for Fortran only packages, when only the modules need to be added to Cflags
+#
+#############################################################################################
+
+function( ecbuild_library_dependencies dependencies libraries )
+
+  set( _libraries ${${libraries}} )
+
+  foreach( _lib ${_libraries})
+
+    unset( _location )
+
+    if( TARGET ${_lib} ) # check if this is an existing target
+
+      set( _imported 0 )
+      get_property( _imported TARGET ${_lib} PROPERTY IMPORTED )
+
+      unset( _deps )
+
+      if( _imported )
+
+        get_property( _location TARGET ${_lib} PROPERTY LOCATION )
+        get_property( _configs   TARGET ${_lib} PROPERTY IMPORTED_CONFIGURATIONS )
+        list( REVERSE _configs )
+        list( GET _configs 0 _config)
+        get_property( _deps     TARGET ${_lib} PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES_${_config} )
+        get_property( _locimp   TARGET ${_lib} PROPERTY IMPORTED_LOCATION_${_config} )
+
+      else()
+
+        list( APPEND _location ${_lib} )
+        get_property( _deps TARGET ${_lib} PROPERTY LINK_LIBRARIES )
+
+      endif()
+
+      ecbuild_library_dependencies( _deps_location _deps )
+      list( APPEND _location ${_deps_location} )
+
+    else()
+
+      set( _location ${_lib} )
+
+    endif()
+
+    list( APPEND _dependencies ${_location} )
+
+  endforeach()
+
+  if( _dependencies )
+    list( REVERSE           _dependencies )
+    list( REMOVE_DUPLICATES _dependencies )
+    list( REVERSE           _dependencies )
+    set( ${dependencies} ${_dependencies} PARENT_SCOPE )
+  endif()
+
+endfunction(ecbuild_library_dependencies)
+
+#############################################################################################
+
+function( ecbuild_include_dependencies dependencies libraries )
+
+  set( _libraries ${${libraries}} )
+
+  foreach( _lib ${_libraries})
+
+    if( TARGET ${_lib} ) # check if this is an existing target
+
+      get_property( _include_dirs TARGET ${_lib} PROPERTY INCLUDE_DIRECTORIES )
+      list( APPEND _dependencies ${_include_dirs} )
+
+    endif()
+
+  endforeach()
+
+  if( _dependencies )
+    list( REMOVE_DUPLICATES _dependencies )
+    set( ${dependencies} ${_dependencies} PARENT_SCOPE )
+  endif()
+
+endfunction(ecbuild_include_dependencies)
+
+#############################################################################################
+
+function( ecbuild_pkgconfig_libs pkgconfig_libs libraries ignore_libs )
+
+  set( _libraries ${${libraries}} )
+  set( _ignore_libs ${${ignore_libs}} )
+
+  foreach( _lib ${_libraries} )
+
+    unset( _name )
+    unset( _dir  )
+
+    if( ${_lib} MATCHES ".+/Frameworks/.+" )
+
+      get_filename_component( _name ${_lib} NAME_WE )
+      list( APPEND _pkgconfig_libs "-framework ${_name}" )
+
+    else()
+
+      if( ${_lib} MATCHES "-l.+" )
+
+        string( REGEX REPLACE "^-l" "" _name ${_lib} )
+
+      else()
+
+
+        get_filename_component( _name ${_lib} NAME_WE )
+        get_filename_component( _dir  ${_lib} PATH )
+
+        if( NOT _name )
+          set( _name ${_lib} )
+        endif()
+
+        string( REGEX REPLACE "^lib" "" _name ${_name} )
+
+        if( "${_dir}" STREQUAL "/usr/lib" )
+          unset( _dir )
+        endif()
+        if( "${_dir}" STREQUAL "/usr/lib64" )
+          unset( _dir )
+        endif()
+
+      endif()
+
+      set( _set_append TRUE )
+        foreach( _ignore ${_ignore_libs} )
+          if( "${_name}" STREQUAL "${_ignore}" )
+            set( _set_append FALSE )
+          endif()
+      endforeach()
+
+      if( _set_append )
+
+        if( _dir )
+          list( APPEND _pkgconfig_libs "-L${_dir}" "-l${_name}" )
+        else()
+          list( APPEND _pkgconfig_libs "-l${_name}" )
+        endif()
+
+      endif()
+
+    endif( ${_lib} MATCHES ".+/Frameworks/.+" )
+
+  endforeach( _lib ${_libraries} )
+
+  if( _pkgconfig_libs )
+    list( REMOVE_DUPLICATES _pkgconfig_libs )
+    string( REPLACE ";" " " _pkgconfig_libs "${_pkgconfig_libs}" )
+
+    set( ${pkgconfig_libs} ${_pkgconfig_libs} PARENT_SCOPE )
+  endif()
+
+endfunction(ecbuild_pkgconfig_libs)
+
+
+#############################################################################################
+
+
+function( ecbuild_pkgconfig_include INCLUDE INCLUDE_DIRS ignore_includes )
+
+  string( TOUPPER ${PROJECT_NAME} PNAME )
+
+  set( _ignore_includes ${${ignore_includes}} )
+
+  list( APPEND ignore_include_dirs
+    "/usr/include"
+     ${${PNAME}_INCLUDE_DIRS} # These are build-directory includes
+     ${_ignore_includes}
+  )
+
+  foreach( _incdir ${${INCLUDE_DIRS}} )
+
+    foreach( _ignore ${ignore_include_dirs} )
+      if( "${_incdir}" STREQUAL "${_ignore}" )
+        unset( _incdir )
+      endif()
+    endforeach()
+
+    if( _incdir )
+      list( APPEND _include "-I${_incdir}")
+    endif()
+
+  endforeach()
+
+  if( _include )
+    list( REMOVE_DUPLICATES _include)
+    string( REPLACE ";" " " _include "${_include}")
+    set( ${INCLUDE} ${_include} PARENT_SCOPE )
+  endif()
+
+endfunction(ecbuild_pkgconfig_include)
+
+
+#############################################################################################
+
+function( ecbuild_pkgconfig )
+
+  set( options REQUIRES NO_PRIVATE_INCLUDE_DIRS )
+  set( single_value_args FILEPATH NAME TEMPLATE URL DESCRIPTION )
+  set( multi_value_args LIBRARIES IGNORE_INCLUDE_DIRS IGNORE_LIBRARIES VARIABLES LANGUAGES )
+
+  cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+  string( TOUPPER ${PROJECT_NAME} PNAME )
+  string( TOLOWER ${PROJECT_NAME} LNAME )
+
+  if(_PAR_UNPARSED_ARGUMENTS)
+    message(FATAL_ERROR "Unknown keywords given to ecbuild_add_executable(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+  endif()
+
+  unset( PKGCONFIG_LANGUAGES )
+  if( NOT _PAR_LANGUAGES )
+    if( CMAKE_C_COMPILER_LOADED )
+      list( APPEND PKGCONFIG_LANGUAGES C )
+    endif()
+    if( CMAKE_CXX_COMPILER_LOADED )
+      list( APPEND PKGCONFIG_LANGUAGES CXX )
+    endif()
+    if( CMAKE_Fortran_COMPILER_LOADED )
+      list( APPEND PKGCONFIG_LANGUAGES Fortran )
+    endif()
+  else()
+    foreach( _lang ${_PAR_LANGUAGES} )
+      if( CMAKE_${_lang}_COMPILER_LOADED )
+        list( APPEND PKGCONFIG_LANGUAGES ${_lang} )
+      endif()
+    endforeach()
+  endif()
+
+  foreach( _lang ${PKGCONFIG_LANGUAGES} )
+    set( PKGCONFIG_HAVE_${_lang} 1 )
+  endforeach()
+
+  set( LIBRARIES ${${PNAME}_LIBRARIES} )
+  if( _PAR_LIBRARIES )
+    set( LIBRARIES ${_PAR_LIBRARIES} )
+  endif()
+
+  if( CMAKE_CXX_COMPILER_LOADED )
+   set( _linker_lang CXX )
+  elseif( CMAKE_C_COMPILER_LOADED )
+   set( _linker_lang C )
+  elseif( CMAKE_Fortran_COMPILER_LOADED )
+   set( _linker_lang Fortran )
+  endif()
+
+  set( RPATH_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_${_linker_lang}_FLAG} )
+
+  set( PKGCONFIG_MOD_FLAG ${CMAKE_Fortran_MODPATH_FLAG} )
+
+  if( NOT PKGCONFIG_MOD_FLAG )
+    set( PKGCONFIG_MOD_FLAG "-I" )
+  endif()
+
+  ecbuild_pkgconfig_libs( PKGCONFIG_LIBS LIBRARIES _PAR_IGNORE_LIBRARIES )
+
+  ecbuild_library_dependencies( _libraries LIBRARIES )
+  foreach( _lib ${LIBRARIES} )
+    list( REMOVE_ITEM _libraries ${_lib} )
+  endforeach()
+
+  ecbuild_pkgconfig_libs( PKGCONFIG_LIBS_PRIVATE _libraries _PAR_IGNORE_LIBRARIES )
+
+  if( NOT _PAR_NO_PRIVATE_INCLUDE_DIRS )
+    ecbuild_include_dependencies( _include_dirs LIBRARIES )
+    ecbuild_pkgconfig_include( PKGCONFIG_CFLAGS _include_dirs _PAR_IGNORE_INCLUDE_DIRS )
+  endif()
+
+  set( PKGCONFIG_INCLUDE "-I\${includedir}" )
+  if( PKGCONFIG_HAVE_Fortran )
+    set( PKGCONFIG_INCLUDE "${PKGCONFIG_INCLUDE} ${PKGCONFIG_MOD_FLAG}\${fmoddir}" )
+  endif()
+
+  if( NOT _PAR_TEMPLATE )
+    set( _PAR_TEMPLATE "${ECBUILD_MACROS_DIR}/pkg-config.pc.in" )
+  endif()
+
+  set( PKGCONFIG_NAME ${LNAME} )
+  if( _PAR_NAME )
+    set( PKGCONFIG_NAME ${_PAR_NAME} )
+  endif()
+
+  if( NOT _PAR_FILEPATH )
+    set( _PAR_FILEPATH "${PKGCONFIG_NAME}.pc" )
+  endif()
+
+  set( PKGCONFIG_DESCRIPTION ${${PNAME}_DESCRIPTION} )
+  if( _PAR_DESCRIPTION )
+    set( PKGCONFIG_DESCRIPTION ${_PAR_DESCRIPTION} )
+  endif()
+
+  set( PKGCONFIG_URL ${${PNAME}_URL} )
+  if( _PAR_URL )
+    set( PKGCONFIG_URL ${_PAR_URL} )
+  endif()
+
+  set( PKGCONFIG_VERSION ${${PNAME}_VERSION} )
+  set( PKGCONFIG_GIT_TAG ${${PNAME}_GIT_SHA1} )  # For now set it to a commit id
+
+  if( _PAR_VARIABLES )
+    set( PKGCONFIG_VARIABLES "\n### Features:\n\n")
+    foreach( _var ${_PAR_VARIABLES} )
+      set( PKGCONFIG_VARIABLES "${PKGCONFIG_VARIABLES}${_var}=${${_var}}\n" )
+    endforeach()
+  endif()
+
+  configure_file( ${_PAR_TEMPLATE} "${CMAKE_BINARY_DIR}/${_PAR_FILEPATH}" @ONLY )
+  message( STATUS "pkg-config file created: ${_PAR_FILEPATH}" )
+
+  install( FILES ${CMAKE_BINARY_DIR}/${_PAR_FILEPATH}
+           DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig/
+           COMPONENT utilities )
+
+endfunction(ecbuild_pkgconfig)
diff --git a/ecbuild/cmake/ecbuild_print_summary.cmake b/ecbuild/cmake/ecbuild_print_summary.cmake
new file mode 100644
index 0000000..193bf1f
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_print_summary.cmake
@@ -0,0 +1,115 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+macro( ecbuild_print_summary )
+
+    if( EXISTS ${PROJECT_SOURCE_DIR}/project_summary.cmake )
+
+		message( STATUS "---------------------------------------------------------" )
+		message( STATUS "Project ${PROJECT_NAME} summary" )
+		message( STATUS "---------------------------------------------------------" )
+
+		include( ${PROJECT_SOURCE_DIR}/project_summary.cmake )
+
+    endif()
+
+    if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
+	
+        ecbuild_define_links_target()
+
+        get_property( langs GLOBAL PROPERTY ENABLED_LANGUAGES )
+
+		message( STATUS "---------------------------------------------------------" )
+		if( NOT ${DEVELOPER_MODE} )
+			message( STATUS "Build summary" )
+		else()
+			message( STATUS "Build summary -- ( DEVELOPER_MODE )" )
+		endif()
+		message( STATUS "---------------------------------------------------------" )
+
+		message( STATUS "system : [${BUILD_SITE}] [${CMAKE_SYSTEM}] [${EC_OS_NAME}.${EC_OS_BITS}]" )
+		message( STATUS "processor        : [${CMAKE_SYSTEM_PROCESSOR}]" )
+		if( EC_BIG_ENDIAN )
+			message( STATUS "endiness         : Big Endian -- IEEE [${IEEE_BE}]" )
+		endif()
+		if( EC_LITTLE_ENDIAN )
+			message( STATUS "endiness         : Little Endian -- IEEE [${IEEE_LE}]" )
+		endif()
+		message( STATUS "build type       : [${CMAKE_BUILD_TYPE}]" )
+		message( STATUS "timestamp        : [${EC_BUILD_TIMESTAMP}]" )
+		message( STATUS "install prefix   : [${CMAKE_INSTALL_PREFIX}]" )
+		if( EC_LINK_DIR )
+			message( STATUS "links prefix     : [${EC_LINK_DIR}]" )
+		endif()
+        message( STATUS "---------------------------------------------------------" )
+
+        foreach( lang ${langs} )
+		  message( STATUS "${lang} -- ${CMAKE_${lang}_COMPILER_ID} ${CMAKE_${lang}_COMPILER_VERSION}"  )
+		  message( STATUS "    compiler   : ${CMAKE_${lang}_COMPILER} ${CMAKE_${lang}_FLAGS} ${CMAKE_${lang}_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}" )
+		  message( STATUS "    link flags : ${CMAKE_${lang}_LINK_FLAGS}" )
+		endforeach()
+
+	message( STATUS "linker : ${CMAKE_LINKER}")
+	message( STATUS "ar     : ${CMAKE_AR}")
+	message( STATUS "ranlib : ${CMAKE_RANLIB}")
+	message( STATUS "link flags" )
+	message( STATUS "    executable [${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXEC_LINKER_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}]" )
+	message( STATUS "    shared lib [${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}]" )
+	message( STATUS "    static lib [${CMAKE_MODULE_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}]" )
+	message( STATUS "install rpath  : ${CMAKE_INSTALL_RPATH}" )
+
+	get_directory_property( defs COMPILE_DEFINITIONS )
+
+	message( STATUS "common definitions: ${defs}" )
+
+	message( STATUS "---------------------------------------------------------" )
+
+	### FEATURE SUMMARY
+
+	  # debug_var( CMAKE_VERSION )
+	  if( ${CMAKE_VERSION} VERSION_LESS "2.8.6" )
+		feature_summary( WHAT ALL )
+	  else()
+		feature_summary( WHAT ALL INCLUDE_QUIET_PACKAGES )
+	  endif()
+
+	### WARNINGS
+
+    # issue warnings / errors in case there are unused project files
+    ecbuild_warn_unused_files()
+
+    # issue a warning that 'make install' mighty be broken for old cmakes
+    if( ${CMAKE_VERSION} VERSION_LESS "2.8.3" )
+
+        message( STATUS " +++ WARNING +++ WARNING +++ WARNING +++" )
+        message( STATUS " +++ " )
+		message( STATUS " +++ This CMake version [${CMAKE_VERSION}] is rather OLD !!" )
+        message( STATUS " +++ " )
+        message( STATUS " +++ We work hard to keep CMake backward compatibility (support >= 2.6.4)" )
+        message( STATUS " +++ but there are some limits inherent to older versions." )
+        message( STATUS " +++ " )
+        message( STATUS " +++ You will be able to build the software... " )
+        message( STATUS " +++ " )
+        message( STATUS " +++ But: " )
+        message( STATUS " +++     * the 'make install' target most likely will NOT WORK" )
+        message( STATUS " +++     * if you want to install these binaries you might need to copy them by yourself" )
+        message( STATUS " +++     * the binaries are in '${CMAKE_BINARY_DIR}' /lib and /bin" )
+        message( STATUS " +++     * copying headers will take substantially more work, and you might end up copying files that won't be needed" )
+        message( STATUS " +++ " )
+        message( STATUS " +++ Therefore, we recommend that you:  " )
+        message( STATUS " +++     * upgrade to a newer CMake with version at least >= 2.8.3" )
+        message( STATUS " +++     * remove this build directory '${CMAKE_BINARY_DIR}'" )
+        message( STATUS " +++     * rerun a newer cmake on an new empty build directory" )
+        message( STATUS " +++ " )
+        message( STATUS " +++ WARNING +++ WARNING +++ WARNING +++" )
+
+    endif()
+
+    endif( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
+
+endmacro( ecbuild_print_summary )
diff --git a/ecbuild/cmake/ecbuild_project_files.cmake b/ecbuild/cmake/ecbuild_project_files.cmake
new file mode 100644
index 0000000..f304772
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_project_files.cmake
@@ -0,0 +1,73 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+# resert the variable on each configure
+set( EC_UNUSED_FILES "" CACHE INTERNAL "unused files" )
+
+##############################################################################
+# finds project files and adds them to the passed variable
+
+macro( ecbuild_find_files_recursive aFileList )
+
+list( APPEND ecbuild_project_extensions c cc cpp cxx ) # for the moment skip ( h hh )
+
+# first find all the files in the directory
+foreach( aExt ${ecbuild_project_extensions} )
+
+    file( GLOB_RECURSE listFilesWithExt *.${aExt})
+
+    list( LENGTH  listFilesWithExt sizeFilesWithExt )
+    if( sizeFilesWithExt GREATER 0 )
+      set( ${aFileList} ${${aFileList}} ${listFilesWithExt} )
+    endif()
+
+endforeach()
+
+endmacro()
+
+##############################################################################
+# finds the unused files on all the project
+function( ecbuild_find_project_files )
+
+  ecbuild_find_files_recursive( cwdFiles )
+
+  # this list will be kept
+  set( EC_PROJECT_FILES ${EC_PROJECT_FILES} ${cwdFiles} CACHE INTERNAL "" )
+  # this list will be progressevely emptied
+  set( EC_UNUSED_FILES  ${EC_UNUSED_FILES}  ${cwdFiles} CACHE INTERNAL "" )
+
+endfunction()
+
+##############################################################################
+# removed used files from unused list
+macro( ecbuild_declare_project_files )
+
+  foreach( _afile ${ARGV} )
+
+    # debug_var( _afile )
+
+    get_property( _src_gen SOURCE ${_afile} PROPERTY GENERATED )
+
+    if( NOT _src_gen )
+
+    	get_filename_component( _abspath ${_afile} ABSOLUTE )
+
+    	# check for existance of all declared files
+	    if( EXISTS ${_abspath} )
+    	    list( REMOVE_ITEM EC_UNUSED_FILES ${_abspath} )
+	    else()
+			message( FATAL_ERROR "In directory ${CMAKE_CURRENT_SOURCE_DIR} file ${_afile} was declared in CMakeLists.txt but not found" )
+    	endif()
+    endif()
+
+  endforeach()
+
+  # rewrite the unused file list in cache
+  set( EC_UNUSED_FILES ${EC_UNUSED_FILES} CACHE INTERNAL "unused files" )
+
+endmacro()
diff --git a/ecbuild/cmake/ecbuild_requires_macro_version.cmake b/ecbuild/cmake/ecbuild_requires_macro_version.cmake
new file mode 100644
index 0000000..dbdcc05
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_requires_macro_version.cmake
@@ -0,0 +1,15 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+macro( ecbuild_requires_macro_version req_vrs )
+
+	if( ECBUILD_MACRO_VERSION VERSION_LESS ${req_vrs} )
+		message( FATAL_ERROR "${PROJECT_NAME} needs ecbuild macro version >= ${req_vrs}" )
+	endif()
+
+endmacro()
diff --git a/ecbuild/cmake/ecbuild_separate_sources.cmake b/ecbuild/cmake/ecbuild_separate_sources.cmake
new file mode 100644
index 0000000..71d56b3
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_separate_sources.cmake
@@ -0,0 +1,63 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# macro for separating sources sccording to language
+##############################################################################
+
+macro( ecbuild_separate_sources )
+
+	set( options )
+	set( single_value_args TARGET  )
+	set( multi_value_args  SOURCES )
+
+	cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+	if(_PAR_UNPARSED_ARGUMENTS)
+	  message(FATAL_ERROR "Unknown keywords given to ecbuild_separate_sources(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+	endif()
+
+	if( NOT _PAR_TARGET  )
+	  message(FATAL_ERROR "The call to ecbuild_separate_sources() doesn't specify the TARGET.")
+	endif()
+
+	if( NOT _PAR_SOURCES )
+	  message(FATAL_ERROR "The call to ecbuild_separate_sources() doesn't specify the SOURCES.")
+	endif()
+
+	foreach( src ${_PAR_SOURCES} )
+		if(${src} MATCHES "(\\.h|\\.hxx|\\.hh|\\.hpp|\\.H)")
+			list( APPEND ${_PAR_TARGET}_h_srcs ${src} )
+		endif()
+	endforeach()
+
+	foreach( src ${_PAR_SOURCES} )
+		if(${src} MATCHES "(\\.c)")
+			list( APPEND ${_PAR_TARGET}_c_srcs ${src} )
+		endif()
+	endforeach()
+
+	foreach( src ${_PAR_SOURCES} )
+		if(${src} MATCHES "(\\.cc|\\.cxx|\\.cpp|\\.C)")
+			list( APPEND ${_PAR_TARGET}_cxx_srcs ${src} )
+		endif()
+	endforeach()
+
+	foreach( src ${_PAR_SOURCES} )
+		if(${src} MATCHES "(\\.f|\\.F|\\.for|\\.f77|\\.f90|\\.f95)")
+			list( APPEND ${_PAR_TARGET}_f_srcs ${src} )
+		endif()
+	endforeach()
+
+#    debug_var( ${_PAR_TARGET}_h_srcs )
+#    debug_var( ${_PAR_TARGET}_c_srcs )
+#    debug_var( ${_PAR_TARGET}_cxx_srcs )
+#    debug_var( ${_PAR_TARGET}_f_srcs )
+
+endmacro( ecbuild_separate_sources  )
+
diff --git a/ecbuild/cmake/ecbuild_setup_test_framework.cmake b/ecbuild/cmake/ecbuild_setup_test_framework.cmake
new file mode 100644
index 0000000..86f026e
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_setup_test_framework.cmake
@@ -0,0 +1,42 @@
+ecbuild_add_option( FEATURE TESTS
+					DEFAULT ON
+					DESCRIPTION "Enable the unit tests" )
+
+if( ENABLE_TESTS )
+
+	# Try to find compiled boost
+
+	if( BOOST_ROOT OR BOOSTROOT OR DEFINED ENV{BOOST_ROOT} OR DEFINED ENV{BOOSTROOT} )
+		set( CMAKE_PREFIX_PATH ${BOOST_ROOT} ${BOOSTROOT} $ENV{BOOST_ROOT} $ENV{BOOSTROOT} ${CMAKE_PREFIX_PATH} )
+	endif()
+
+	ecbuild_add_extra_search_paths( boost ) # also respects BOOST_ROOT
+
+	set( Boost_USE_MULTITHREADED  ON )
+#   set( Boost_DEBUG              ON )
+
+	find_package( Boost 1.47.0 COMPONENTS unit_test_framework )
+
+	set( ECBUILD_BOOST_HEADER_DIRS "${CMAKE_CURRENT_LIST_DIR}/include" )
+
+	if( Boost_FOUND AND Boost_UNIT_TEST_FRAMEWORK_LIBRARY )
+
+		set( HAVE_BOOST_UNIT_TEST 1 )
+		set( BOOST_UNIT_TEST_FRAMEWORK_LINKED 1 )
+
+		# message( STATUS "Boost unit test framework -- FOUND [${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}]" )
+
+	else()
+
+		message( STATUS "Boost unit test framework -- NOT FOUND" )
+
+		set( HAVE_BOOST_UNIT_TEST 0 )
+
+		# set( BOOST_UNIT_TEST_FRAMEWORK_HEADER_ONLY 1 )
+		# comment out this when ecbuild packs boost unit test inside...
+		# list( APPEND ECBUILD_BOOST_HEADER_DIRS "${CMAKE_CURRENT_LIST_DIR}/contrib/boost-1.55/include" )
+		# set( HAVE_BOOST_UNIT_TEST 1 )
+
+	endif()
+
+endif()
diff --git a/ecbuild/cmake/ecbuild_system.cmake b/ecbuild/cmake/ecbuild_system.cmake
new file mode 100644
index 0000000..939d92e
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_system.cmake
@@ -0,0 +1,281 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+########################################################################################################
+# disallow in-source build
+
+if( EXISTS ${CMAKE_SOURCE_DIR}/CMakeCache.txt ) # check for failed attempts to build within the source tree
+   message( FATAL_ERROR "Project ${PROJECT_NAME} contains a CMakeCache.txt inside source tree [${CMAKE_SOURCE_DIR}/CMakeCache.txt].\n Please remove it and
+   make sure that source tree is prestine and clean of unintended files, before retrying." )
+endif()
+
+get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH)
+get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH)
+
+if(${srcdir} STREQUAL ${bindir})
+  message("######################################################")
+  message("You are attempting to build in your source directory (${srcdir}).")
+  message("You must run cmake from a different build directory.")
+  message("######################################################")
+  message( FATAL_ERROR "${PROJECT_NAME} requires an out of source build.\n Please create a separate build directory and run 'cmake path/to/project [options]' from there.")
+endif()
+
+########################################################################################################
+# ecbuild versioning support
+
+set( ECBUILD_CMAKE_MINIMUM "2.8.4" )
+if( ${CMAKE_VERSION} VERSION_LESS ${ECBUILD_CMAKE_MINIMUM} )
+  message(FATAL_ERROR "${PROJECT_NAME} requires at least CMake ${ECBUILD_CMAKE_MINIMUM} -- you are using ${CMAKE_COMMAND} [${CMAKE_VERSION}]\n Please, get a newer version of CMake @ www.cmake.org" )
+endif()
+
+set( ECBUILD_MACROS_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE INTERNAL "where ecbuild system is" )
+
+include( "${ECBUILD_MACROS_DIR}/VERSION.cmake" )
+
+set( ecbuild_VERSION_STR "${ECBUILD_VERSION_STR}" )
+
+########################################################################################################
+# define cmake policies
+
+# Included scripts don't automatic cmake_policy PUSH and POP
+
+if( POLICY CMP0011 )
+	cmake_policy( SET CMP0011 OLD )
+endif()
+
+# Allow use of the LOCATION target property.
+
+if( POLICY CMP0026 )
+	cmake_policy( SET CMP0026 OLD )
+endif()
+
+# for macosx use @rpath in a target’s install name
+
+if( POLICY CMP0042 )
+	cmake_policy( SET CMP0042 NEW )
+	set( CMAKE_MACOSX_RPATH ON )
+endif()
+
+# Error on non-existent target in get_target_property
+
+if( POLICY CMP0045 )
+	cmake_policy( SET CMP0045 NEW )
+endif()
+
+# Error on non-existent target in get_target_property
+
+if( POLICY CMP0046 )
+	cmake_policy( SET CMP0046 NEW )
+endif()
+
+# Error on non-existent dependency in add_dependencies
+
+if( POLICY CMP0046 )
+	cmake_policy( SET CMP0050 NEW )
+endif()
+
+# Reject source and build dirs in installed INTERFACE_INCLUDE_DIRECTORIES
+
+if( POLICY CMP0052 )
+	cmake_policy( SET CMP0052 NEW )
+endif()
+
+# inside if() don't dereference variables if they are quoted 
+# e.g. "VAR" is not dereferenced 
+#      "${VAR}" is dereference only once
+
+if( POLICY CMP0054 )
+	cmake_policy( SET CMP0054 NEW )
+endif()
+
+########################################################################################################
+# include our cmake macros, but only do so if this is the top project
+if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
+
+	# hostname of where we build
+
+	site_name( BUILD_SITE )
+	mark_as_advanced( BUILD_SITE )
+	mark_as_advanced( BUILD_TESTING )
+
+	set( ECBUILD_PROJECTS  "" CACHE INTERNAL "list of ecbuild (sub)projects that use ecbuild" )
+
+	message( STATUS "ecbuild   ${ecbuild_VERSION_STR}\t${ECBUILD_MACROS_DIR}" )
+	message( STATUS "cmake     ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}\t${CMAKE_COMMAND}" )
+
+	if( CMAKE_TOOLCHAIN_FILE )
+		message( STATUS "toolchain ${CMAKE_TOOLCHAIN_FILE}" )
+	endif()
+
+	if( ECBUILD_CACHE )
+		include( ${ECBUILD_CACHE} )
+      message( STATUS "cache     ${ECBUILD_CACHE}" )
+	endif()
+
+	message( STATUS "---------------------------------------------------------" )
+
+	# clear the build dir exported targets file (only on the top project)
+
+	set( TOP_PROJECT_TARGETS_FILE "${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-targets.cmake" CACHE INTERNAL "" )
+	file( REMOVE ${TOP_PROJECT_TARGETS_FILE} )
+
+	# add backport support for versions up too 2.8.4
+	if( ${CMAKE_VERSION} VERSION_LESS "2.8" )
+		set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/2.8" ${CMAKE_MODULE_PATH} )
+	endif()
+
+	# add extra macros from external contributions
+	set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/contrib" )
+
+	# would bring FindEigen in, so for the moment keep it out
+	# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/contrib/GreatCMakeCookOff" )
+
+	include(CTest)                 # add cmake testing support
+	enable_testing()
+
+	# keep this until we modify the meaning to 'check' if installation worked
+	add_custom_target( check COMMAND ${CMAKE_CTEST_COMMAND} -V )
+
+	############################################################################################
+	# define valid build types
+
+	include(ecbuild_define_build_types)
+
+	############################################################################################
+	# add cmake macros
+
+	include(AddFileDependencies)
+
+	include(CheckTypeSize)
+	include(CheckIncludeFile)
+	include(CheckIncludeFiles)
+
+	include(CheckFunctionExists)
+	include(CheckSymbolExists)
+
+	include(CheckCCompilerFlag)
+	include(CheckCSourceCompiles)
+	include(CheckCSourceRuns)
+
+	include(CMakeParseArguments)
+
+	# include(CMakePrintSystemInformation) # available in cmake 2.8.4
+
+	if( CMAKE_CXX_COMPILER_LOADED )
+		include(CheckIncludeFileCXX)
+		include(CheckCXXCompilerFlag)
+		include(CheckCXXSourceCompiles)
+		include(CheckCXXSourceRuns)
+	endif()
+
+	if( CMAKE_Fortran_COMPILER_LOADED )
+        set( CMAKE_Fortran_MODULE_DIRECTORY  ${CMAKE_BINARY_DIR}/module CACHE PATH "directory for all fortran modules." )
+		include(CheckFortranFunctionExists)
+		if( CMAKE_C_COMPILER_LOADED AND ENABLE_FORTRAN_C_INTERFACE )
+			include(FortranCInterface)
+		endif()
+		set( EC_HAVE_FORTRAN 1 )
+	endif()
+
+	include(FeatureSummary) # support features in cmake
+
+	include(TestBigEndian)
+
+	############################################################################################
+	# backport of cmake > 2.8.4 functions
+
+	if( "${CMAKE_VERSION}" VERSION_LESS "2.8.6" )
+		include( ${CMAKE_CURRENT_LIST_DIR}/2.8/CMakePushCheckState.cmake )
+	else()
+		include(CMakePushCheckState)
+	endif()
+
+	############################################################################################
+	# add our macros
+
+	include( ecbuild_debug_var )
+	include( ecbuild_list_macros )
+
+	include( ecbuild_check_c_source )
+
+	if( CMAKE_CXX_COMPILER_LOADED )
+		include( ecbuild_check_cxx_source )
+		include( ecbuild_check_cxx11 )
+	endif()
+
+	if( CMAKE_Fortran_COMPILER_LOADED )
+		include( ecbuild_check_fortran_source )
+	endif()
+
+	include( ecbuild_requires_macro_version )
+	include( ecbuild_get_date )
+	include( ecbuild_add_persistent )
+	include( ecbuild_generate_config_headers )
+	include( ecbuild_generate_rpc )
+	include( ecbuild_generate_yy )
+	include( ecbuild_echo_targets )
+	include( ecbuild_add_option )
+	include( ecbuild_add_library )
+	include( ecbuild_add_executable )
+	include( ecbuild_append_to_rpath )
+	include( ecbuild_get_test_data )
+	include( ecbuild_add_cxx11_flags )
+	include( ecbuild_add_test )
+	include( ecbuild_add_resources )
+	include( ecbuild_get_resources )
+	include( ecbuild_project_files )
+	include( ecbuild_declare_project )
+	include( ecbuild_install_package )
+	include( ecbuild_separate_sources )
+	include( ecbuild_find_package )
+	include( ecbuild_use_package )
+	include( ecbuild_list_extra_search_paths )
+	include( ecbuild_add_extra_search_paths )
+	include( ecbuild_print_summary )
+	include( ecbuild_warn_unused_files )
+	include( ecbuild_find_mpi )
+	include( ecbuild_find_omp )
+	include( ecbuild_find_perl )
+	include( ecbuild_find_python )
+	include( ecbuild_find_lexyacc )
+	include( ecbuild_find_fortranlibs )
+	include( ecbuild_enable_fortran )
+	include( ecbuild_check_c_source )
+	include( ecbuild_check_cxx_source )
+	include( ecbuild_check_fortran_source )
+	include( ecbuild_bundle )
+	include( ecbuild_pkgconfig )
+	include( ecbuild_cache )
+
+	include( ${CMAKE_CURRENT_LIST_DIR}/contrib/GetGitRevisionDescription.cmake )
+
+	############################################################################################
+	# kickstart the build system
+
+  	ecbuild_prepare_cache()
+	include( ecbuild_define_options )               # define build options
+	include( ecbuild_check_compiler )               # check for compiler characteristics
+	include( ecbuild_check_os )                     # check for os characteristics
+	include( ecbuild_check_functions )              # check for available functions
+	include( ecbuild_define_paths )                 # define installation paths
+	include( ecbuild_links_target )                 # define the links target
+	include( ecbuild_setup_test_framework )         # setup test framework
+ 	ecbuild_flush_cache()
+
+	############################################################################################
+	# define the build timestamp
+
+	if( NOT DEFINED EC_BUILD_TIMESTAMP )
+		ecbuild_get_timestamp( EC_BUILD_TIMESTAMP )
+		set( EC_BUILD_TIMESTAMP  "${EC_BUILD_TIMESTAMP}" CACHE INTERNAL "Build timestamp" )
+	endif()
+
+	message( STATUS "---------------------------------------------------------" )
+
+endif()
+
diff --git a/ecbuild/cmake/ecbuild_use_package.cmake b/ecbuild/cmake/ecbuild_use_package.cmake
new file mode 100644
index 0000000..3d77384
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_use_package.cmake
@@ -0,0 +1,206 @@
+# (C) Copyright 1996-2014 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+##############################################################################
+# function for adding a subproject directory
+##############################################################################
+
+macro( ecbuild_use_package )
+
+    set( options            REQUIRED QUIET EXACT )
+    set( single_value_args  PROJECT VERSION )
+    set( multi_value_args )
+
+	cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+	if(_p_UNPARSED_ARGUMENTS)
+	  message(FATAL_ERROR "Unknown keywords given to ecbuild_use_package(): \"${_p_UNPARSED_ARGUMENTS}\"")
+    endif()
+
+	if( NOT _p_PROJECT  )
+      message(FATAL_ERROR "The call to ecbuild_use_package() doesn't specify the PROJECT.")
+    endif()
+
+	if( _p_EXACT AND NOT _p_VERSION )
+      message(FATAL_ERROR "Call to ecbuild_use_package() requests EXACT but doesn't specify VERSION.")
+    endif()
+
+    # try to find the package as a subproject and build it
+
+	string( TOUPPER ${_p_PROJECT} PNAME )
+
+    # user defined dir with subprojects
+
+    if( NOT DEFINED ${PNAME}_SOURCE AND DEFINED SUBPROJECT_DIRS )
+        foreach( dir ${SUBPROJECT_DIRS} )
+			if( EXISTS ${dir}/${_p_PROJECT} AND EXISTS ${dir}/${_p_PROJECT}/CMakeLists.txt )
+				set( ${PNAME}_SOURCE "${dir}/${_p_PROJECT}" )
+            endif()
+        endforeach()
+    endif()
+
+    # user defined path to subproject
+
+    if( DEFINED ${PNAME}_SOURCE )
+
+        if( NOT EXISTS ${${PNAME}_SOURCE} OR NOT EXISTS ${${PNAME}_SOURCE}/CMakeLists.txt )
+			message( FATAL_ERROR "User defined source directory '${${PNAME}_SOURCE}' for project '${_p_PROJECT}' does not exist or does not contain a CMakeLists.txt file." )
+        endif()
+
+		set( ${PNAME}_subproj_dir_ "${${PNAME}_SOURCE}" )
+
+    else() # default is 'dropped in' subdirectory named as project
+
+		if( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_p_PROJECT} AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_p_PROJECT}/CMakeLists.txt )
+			set( ${PNAME}_subproj_dir_ "${CMAKE_CURRENT_SOURCE_DIR}/${_p_PROJECT}" )
+        endif()
+
+    endif()
+
+    # check if was already added as subproject ...
+
+    set( _just_added 0 )
+    set( _do_version_check 0 )
+    set( _source_description "" )
+
+	list( FIND ECBUILD_PROJECTS ${_p_PROJECT} _ecbuild_project_${PNAME} )
+
+    if( NOT _ecbuild_project_${PNAME} EQUAL "-1" )
+		set( ${PNAME}_previous_subproj_ 1 )
+    else()
+		set( ${PNAME}_previous_subproj_ 0 )
+    endif()
+
+    # solve capitalization issues
+    
+	if( ${_p_PROJECT}_FOUND AND NOT ${PNAME}_FOUND )
+        set( ${PNAME}_FOUND 1 ) 
+    endif()
+	if( ${PNAME}_FOUND AND NOT ${_p_PROJECT}_FOUND )
+		set( ${_p_PROJECT}_FOUND 1 )
+    endif()
+
+    # Case 1) project was NOT added as subproject and is NOT FOUND
+
+	if( NOT ${PNAME}_FOUND AND NOT ${PNAME}_previous_subproj_ )
+
+            # check if SUBPROJDIR is set
+
+			if( DEFINED ${PNAME}_subproj_dir_ )
+
+                # check version is acceptable
+                set( _just_added 1 )
+                set( _do_version_check 1 )
+				set( _source_description "sub-project ${_p_PROJECT} (sources)" )
+
+                # add as a subproject
+
+				set( ${PNAME}_subproj_dir_ ${${PNAME}_subproj_dir_} CACHE PATH "Path to ${_p_PROJECT} source directory" )
+
+				set( ECBUILD_PROJECTS ${ECBUILD_PROJECTS} ${_p_PROJECT} CACHE INTERNAL "" )
+
+				add_subdirectory( ${${PNAME}_subproj_dir_} ${_p_PROJECT} )
+
+                set( ${PNAME}_FOUND 1 )
+				set( ${_p_PROJECT}_VERSION ${${PNAME}_VERSION} )
+
+            endif()
+
+    endif()
+
+    # Case 2) project was already added as subproject, so is already FOUND -- BUT must check version acceptable
+
+	if( ${PNAME}_previous_subproj_ )
+
+        if( NOT ${PNAME}_FOUND )
+			message( FATAL_ERROR "${_p_PROJECT} was already included as sub-project but ${PNAME}_FOUND isn't set -- this is likely a BUG in ecbuild" )
+        endif()
+
+        # check version is acceptable
+        set( _do_version_check 1 )
+		set( _source_description "already existing sub-project ${_p_PROJECT} (sources)" )
+
+    endif()
+
+    # Case 3) project was NOT added as subproject, but is FOUND -- so it was previously found as a binary ( either build or install tree )
+
+	if( ${PNAME}_FOUND AND NOT ${PNAME}_previous_subproj_ AND NOT _just_added )
+
+        # check version is acceptable
+        set( _do_version_check 1 )
+		set( _source_description "previously found package ${_p_PROJECT} (binaries)" )
+
+    endif()
+
+    # test version for Cases 1,2,3
+
+# debug_var( _p_PROJECT )
+# debug_var( _p_VERSION )
+# debug_var( ${PNAME}_VERSION )
+# debug_var( ${_p_PROJECT}_VERSION )
+# debug_var( _just_added )
+# debug_var( _do_version_check )
+# debug_var( _source_description )
+# debug_var( ${PNAME}_FOUND )
+# debug_var( ${PNAME}_previous_subproj_ )
+
+	if( _p_VERSION AND _do_version_check )
+			if( _p_EXACT )
+				if( NOT ${_p_PROJECT}_VERSION VERSION_EQUAL _p_VERSION )
+					message( FATAL_ERROR "${PROJECT_NAME} requires (exactly) ${_p_PROJECT} = ${_p_VERSION} -- detected as ${_source_description} ${${_p_PROJECT}_VERSION}" )
+                endif()
+            else()
+				if( _p_VERSION VERSION_LESS ${_p_PROJECT}_VERSION OR _p_VERSION VERSION_EQUAL ${_p_PROJECT}_VERSION )
+					message( STATUS "${PROJECT_NAME} requires ${_p_PROJECT} >= ${_p_VERSION} -- detected as ${_source_description} ${${_p_PROJECT}_VERSION}" )
+				else()
+					message( FATAL_ERROR "${PROJECT_NAME} requires ${_p_PROJECT} >= ${_p_VERSION} -- detected only ${_source_description} ${${_p_PROJECT}_VERSION}" )
+                endif()
+            endif()
+    endif()
+
+    # Case 4) is NOT FOUND so far, NOT as sub-project (now or before), and NOT as binary neither 
+    #         so try to find precompiled binaries or a build tree
+
+    if( NOT ${PNAME}_FOUND )
+
+        set( _opts )
+		if( _p_VERSION )
+			list( APPEND _opts VERSION ${_p_VERSION} )
+        endif()
+		if( _p_EXACT )
+            list( APPEND _opts EXACT )
+        endif()
+		if( _p_REQUIRED )
+            list( APPEND _opts REQUIRED )
+        endif()
+    
+		ecbuild_find_package( NAME ${_p_PROJECT} ${_opts} )
+
+		if( ${_p_PROJECT}_FOUND )
+
+			set( ${PNAME}_FOUND ${${_p_PROJECT}_FOUND} )
+
+			message( STATUS "[${_p_PROJECT}] (${${_p_PROJECT}_VERSION})" )
+
+            message( STATUS "   ${PNAME}_INCLUDE_DIRS : [${${PNAME}_INCLUDE_DIRS}]" )
+            if( ${PNAME}_DEFINITIONS )
+                message( STATUS "   ${PNAME}_DEFINITIONS : [${${PNAME}_DEFINITIONS}]" )
+            endif()
+            message( STATUS "   ${PNAME}_LIBRARIES : [${${PNAME}_LIBRARIES}]" )
+
+        endif()
+
+    endif()
+
+### for when we change this macro to a function()
+#	set_parent_scope( ${PNAME}_FOUND )
+#	set_parent_scope( ${_p_PROJECT}_FOUND )
+#	set_parent_scope( ${PNAME}_VERSION )
+#	set_parent_scope( ${_p_PROJECT}_VERSION )
+
+endmacro()
diff --git a/ecbuild/cmake/ecbuild_version.h.in b/ecbuild/cmake/ecbuild_version.h.in
new file mode 100644
index 0000000..d274bf6
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_version.h.in
@@ -0,0 +1,20 @@
+/*
+ * (C) Copyright 1996-2014 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+ * In applying this licence, ECMWF does not waive the privileges and immunities 
+ * granted to it by virtue of its status as an intergovernmental organisation nor
+ * does it submit to any jurisdiction.
+ */
+
+#ifndef ecbuild_version_h
+#define ecbuild_version_h
+
+#define ECBUILD_VERSION "@ECBUILD_VERSION@"
+
+#define ECBUILD_MAJOR_VERSION @ECBUILD_MAJOR_VERSION@
+#define ECBUILD_MINOR_VERSION @ECBUILD_MINOR_VERSION@
+#define ECBUILD_PATCH_VERSION @ECBUILD_PATCH_VERSION@
+
+#endif // ecbuild_version_h
diff --git a/ecbuild/cmake/ecbuild_warn_unused_files.cmake b/ecbuild/cmake/ecbuild_warn_unused_files.cmake
new file mode 100644
index 0000000..c3aa7d5
--- /dev/null
+++ b/ecbuild/cmake/ecbuild_warn_unused_files.cmake
@@ -0,0 +1,58 @@
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+############################################################################################
+# print warnings about unused files
+
+macro( ecbuild_warn_unused_files )
+
+    if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME ) # only for top level project
+    
+      # if cache file with unused files exists remove it
+      set( UNUSED_FILE "${CMAKE_BINARY_DIR}/UnusedFiles.txt" )
+      if( EXISTS ${UNUSED_FILE} )
+              file( REMOVE ${UNUSED_FILE} )
+      endif()
+    
+      if( CHECK_UNUSED_FILES ) # to check or not to check...
+    
+          if( NOT DEFINED UNUSED_FILES_LEVEL ) # to err or not...
+              set( UNUSED_FILES_LEVEL "ERROR" )
+          endif()
+    
+          # if unused files where found, put the list on the file
+          list( LENGTH MARS_UNUSED_FILES MARS_LENGTH_UNUSED_FILES )
+          if( MARS_LENGTH_UNUSED_FILES )
+    
+            message( STATUS "")
+            message( STATUS " !!!--- ${UNUSED_FILES_LEVEL} ---!!! ")
+            message( STATUS " !!!--- ${UNUSED_FILES_LEVEL} ---!!! ")
+            message( STATUS "")
+            message( STATUS " Unused source files found:")
+            foreach( AFILE ${MARS_UNUSED_FILES} )
+              message( STATUS "     ${AFILE}")
+              file( APPEND ${UNUSED_FILE} "${AFILE}\n" )
+            endforeach()
+            message( STATUS "")
+            message( STATUS " List dumped to ${UNUSED_FILE}")
+            message( STATUS "")
+            message( STATUS " !!!--- ${UNUSED_FILES_LEVEL} ---!!! ")
+            message( STATUS " !!!--- ${UNUSED_FILES_LEVEL} ---!!! ")
+            message( STATUS "")
+    
+            if( UNUSED_FILES_LEVEL STREQUAL "ERROR" )
+                message( FATAL_ERROR "\n Aborted build system configuration. \n Add unused files to the build system or remove them." )
+            endif()
+    
+          endif()
+    
+      endif()
+    
+    endif()
+
+endmacro( ecbuild_warn_unused_files )
diff --git a/ecbuild/cmake/include/ecbuild/boost_test_framework.h b/ecbuild/cmake/include/ecbuild/boost_test_framework.h
new file mode 100644
index 0000000..09e61dd
--- /dev/null
+++ b/ecbuild/cmake/include/ecbuild/boost_test_framework.h
@@ -0,0 +1,17 @@
+/*
+ * (C) Copyright 1996-2014 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ * In applying this licence, ECMWF does not waive the privileges and immunities
+ * granted to it by virtue of its status as an intergovernmental organisation nor
+ * does it submit to any jurisdiction.
+ */
+
+#ifdef BOOST_UNIT_TEST_FRAMEWORK_HEADER_ONLY
+#include <boost/test/included/unit_test.hpp>
+#else
+#define BOOST_TEST_DYN_LINK
+#include <boost/test/unit_test.hpp>
+#endif
+
diff --git a/ecbuild/cmake/md5.in b/ecbuild/cmake/md5.in
new file mode 100644
index 0000000..bf8aeb0
--- /dev/null
+++ b/ecbuild/cmake/md5.in
@@ -0,0 +1 @@
+ at _p_MD5@  @_p_NAME@
diff --git a/ecbuild/cmake/pkg-config.pc.in b/ecbuild/cmake/pkg-config.pc.in
new file mode 100644
index 0000000..86031db
--- /dev/null
+++ b/ecbuild/cmake/pkg-config.pc.in
@@ -0,0 +1,35 @@
+# This pkg-config file is generated by ecbuild_pkgconfig()
+# with template ecbuild/cmake/pkg-config.pc.in
+
+git_tag=@PKGCONFIG_GIT_TAG@
+
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${prefix}/lib
+includedir=${prefix}/include
+bindir=${prefix}/bin
+fmoddir=${prefix}/include
+
+CC=@CMAKE_C_COMPILER@
+CXX=@CMAKE_CXX_COMPILER@
+FC=@CMAKE_Fortran_COMPILER@
+
+rpath=@RPATH_FLAG@${libdir}
+
+libs=-L${libdir} ${rpath} @PKGCONFIG_LIBS@
+
+libs_private=@PKGCONFIG_LIBS_PRIVATE@
+
+cflags=@PKGCONFIG_INCLUDE@ @PKGCONFIG_CFLAGS@
+ at PKGCONFIG_VARIABLES@
+#====================================================================
+Name: @PKGCONFIG_NAME@
+Description: @PKGCONFIG_DESCRIPTION@
+URL: @PKGCONFIG_URL@
+Version: @PKGCONFIG_VERSION@
+Libs: ${libs}
+Libs.private: ${libs_private}
+Requires: @PKGCONFIG_REQUIRES@
+Requires.private: @PKGCONFIG_REQUIRES_PRIVATE@
+Cflags: ${cflags}
+#====================================================================
diff --git a/ecbuild/cmake/project-config-version.cmake.in b/ecbuild/cmake/project-config-version.cmake.in
new file mode 100644
index 0000000..802a2fe
--- /dev/null
+++ b/ecbuild/cmake/project-config-version.cmake.in
@@ -0,0 +1,12 @@
+set(PACKAGE_VERSION "@PACKAGE_VERSION@")
+
+# check whether the requested PACKAGE_FIND_VERSION is compatible
+
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
+  set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+  set(PACKAGE_VERSION_COMPATIBLE TRUE)
+  if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
+    set(PACKAGE_VERSION_EXACT TRUE)
+  endif()
+endif()
\ No newline at end of file
diff --git a/ecbuild/cmake/project-config.cmake.in b/ecbuild/cmake/project-config.cmake.in
new file mode 100644
index 0000000..dbb936f
--- /dev/null
+++ b/ecbuild/cmake/project-config.cmake.in
@@ -0,0 +1,80 @@
+# Config file for the @PROJECT_NAME@ package
+# Defines the following variables:
+#
+#  @PNAME at _INCLUDE_DIRS - include directories
+#  @PNAME at _DEFINITIONS  - preprocessor definitions
+#  @PNAME at _LIBRARIES    - libraries to link against
+#  @PNAME at _FEATURES     - list of enabled features
+#  @PNAME at _VERSION      - version of the package
+#
+# Also defines @PROJECT_NAME@ third-party library dependencies:
+#  @PNAME at _TPLS             - package names of  third-party library dependencies
+#  @PNAME at _TPL_INCLUDE_DIRS - include directories
+#  @PNAME at _TPL_DEFINITIONS  - preprocessor definitions
+#  @PNAME at _TPL_LIBRARIES    - libraries to link against
+
+### compute paths
+
+get_filename_component(@PNAME at _CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
+
+set( @PNAME at _SELF_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@" )
+set( @PNAME at _SELF_DEFINITIONS  "@CONF_DEFINITIONS@" )
+set( @PNAME at _SELF_LIBRARIES    "@CONF_LIBRARIES@" )
+
+set( @PNAME at _TPLS              "@CONF_TPLS@" )
+set( @PNAME at _TPL_INCLUDE_DIRS  "@CONF_TPL_INCLUDE_DIRS@" )
+set( @PNAME at _TPL_DEFINITIONS   "@CONF_TPL_DEFINITIONS@" )
+set( @PNAME at _TPL_LIBRARIES     "@CONF_TPL_LIBRARIES@" )
+
+### export include paths as absolute paths
+
+set( @PNAME at _INCLUDE_DIRS "" )
+foreach( path ${@PNAME at _SELF_INCLUDE_DIRS} )
+	get_filename_component( abspath ${path} ABSOLUTE )
+	list( APPEND @PNAME at _INCLUDE_DIRS ${abspath} )
+endforeach()
+list( APPEND @PNAME at _INCLUDE_DIRS ${@PNAME at _TPL_INCLUDE_DIRS} )
+
+### export definitions
+
+set( @PNAME at _DEFINITIONS      ${@PNAME at _SELF_DEFINITIONS} ${@PNAME at _TPL_DEFINITIONS} )
+
+### export list of all libraries
+
+set( @PNAME at _LIBRARIES        ${@PNAME at _SELF_LIBRARIES}   ${@PNAME at _TPL_LIBRARIES}   )
+
+### export the features provided by the package
+
+set( @PNAME at _FEATURES    "@CONF_FEATURES@" )
+foreach( _f ${@PNAME at _FEATURES} )
+	set( ${_f} 1 )
+endforeach()
+
+if( EXISTS ${@PNAME at _CMAKE_DIR}/@CONF_IMPORT_FILE@ )
+  set( @PNAME at _IMPORT_FILE "${@PNAME at _CMAKE_DIR}/@CONF_IMPORT_FILE@" )
+  include( ${@PNAME at _IMPORT_FILE} )
+endif()
+
+# insert definitions for IMPORTED targets
+
+if( NOT @PROJECT_NAME at _BINARY_DIR )
+
+	set( IS_BUILD_DIR_EXPORT @_is_build_dir_export@ )
+
+	if( IS_BUILD_DIR_EXPORT )
+		include( "@TOP_PROJECT_TARGETS_FILE@" OPTIONAL )
+	else()
+		include( "${@PNAME at _CMAKE_DIR}/@CMAKE_PROJECT_NAME at -targets.cmake" )
+	endif()
+
+endif()
+
+# here goes the imports of the TPL's
+
+include( ${CMAKE_CURRENT_LIST_FILE}.tpls OPTIONAL )
+
+# publish this file as imported
+
+set( @PNAME at _IMPORT_FILE ${CMAKE_CURRENT_LIST_FILE} )
+mark_as_advanced( @PNAME at _IMPORT_FILE )
+
diff --git a/ecbuild/cmake/sg.pl b/ecbuild/cmake/sg.pl
new file mode 100755
index 0000000..455161b
--- /dev/null
+++ b/ecbuild/cmake/sg.pl
@@ -0,0 +1,573 @@
+#!/usr/bin/perl
+#!/usr/local/share/perl56
+
+# (C) Copyright 1996-2014 ECMWF.
+# 
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation nor
+# does it submit to any jurisdiction.
+
+use strict;
+
+#use Data::Dumper;
+use File::Basename;
+
+#$Data::Dumper::Indent = 1;
+# $ARGV[0] = "test.cc";
+# $ARGV[0] = "/usr/include/g++-3/stl_pair.h";
+# $ARGV[0] = "/usr/include/g++-3/stl_vector.h";
+# $ARGV[0] = "/usr/include/g++-3/stl_list.h";
+# $ARGV[0] = "/usr/include/g++-3/stl_map.h";
+# $ARGV[0] = "x.cc";
+# $ARGV[0] = "/usr/include/g++-3/std/bastring.h";
+
+# script takes 3 parameters:
+# (1) file to process
+my $file = $ARGV[0];
+# (2) [optional] directory to place the generated .b file
+my $base = $ARGV[1];
+# (3) [optional] c++ namespace 
+my $namespace = $ARGV[2];
+
+# no argv[1] passed, take basedir from file
+if( $base eq "" )
+{
+	$base = dirname($file);
+}
+
+# no argv[1] passed, take basedir from file
+if( $namespace eq "" )
+{
+    $namespace = "eclib"
+}
+
+my @c = parser::parse($file);
+#print Dumper(\@c);
+
+
+foreach my $c ( @c )
+{
+	my $n = $c->name;
+	open(STDOUT,">$base/$n.b") || die "$base/$n.b: $!";
+
+	my @init1;
+	push @init1, map { "$_(b)" } $c->super;
+	push @init1, map { "$_(b(\&$_))" } $c->members;
+
+	my $col1;
+	$col1=":\n" if(@init1);
+	my $init1 = join(",\n",map {"\t$_"} @init1);
+
+	my @init2;
+	push @init2, map { "$_(b(\"$n\"))" } $c->super;
+	push @init2, map { "$_(b(\"$n\",\"$_\"))" } $c->members;
+
+	my $col2;
+	$col2=":\n" if(@init2);
+	my $init2 = join(",\n",map {"\t$_"} @init2);
+
+
+	my @s = map { "${_}::describe(s,depth+1)"      } $c->super;
+	my @m = map { "${namespace}::_describe(s,depth+1,\"$_\",$_)" } $c->members;
+	my $d = join(";\n\t","${namespace}::_startClass(s,depth,specName())", at s, at m,"${namespace}::_endClass(s,depth,specName())");
+
+	my @s = map { "${_}::_export(h)"      } $c->super;
+	my @m = map { "${namespace}::_export(h,\"$_\",$_)" } $c->members;
+	my $D = join(";\n\t","${namespace}::_startClass(h,\"$n\")", at s, at m,"${namespace}::_endClass(h,\"$n\")");
+
+	my $spec = "\"$n\"";
+	my @tmpl = $c->template;
+
+	my $spec_type = "const char*";
+
+	if(@tmpl)
+	{
+		$spec_type = "std::string";
+		my $x = join("+ ',' + ",  map { "Traits<$_>::name()"; } @tmpl);
+		$spec = <<"EOS";
+        std::string("$n<\") + $x + ">"
+EOS
+		$spec =~ s/\n/ /g;
+	}
+
+	my $isa = "${namespace}::Isa::add(t,specName());";
+	foreach my $s ( $c->super )
+	{
+		$isa = "${s}::isa(t);$isa";
+	}
+
+	my $schema;
+	@s = map { "${_}::schema(s)"      } $c->super;
+	@m = map { $a=$_->[0]; $b=$_->[1]; "s.member(\"$a\",member_size($n,$a),member_offset($n,$a),\"$b\")" } $c->members_types;
+	$schema = join(";\n\t","s.start(specName(),sizeof($n))", at s, at m,"s.end(specName())");
+
+	print <<"EOF";
+
+${n}(${namespace}::Bless& b)$col1$init1
+{
+}
+
+${n}(${namespace}::Evolve b)$col2$init2
+{
+}
+
+static ${spec_type} specName()      { return ${spec}; }
+static void isa(TypeInfo* t)  { ${isa} }
+static ${namespace}::Isa* isa()             { return ${namespace}::Isa::get(specName());  }
+
+static void schema(${namespace}::Schema& s)
+{
+	$schema;
+}
+
+EOF
+
+if(!$c->has_method("describe"))
+{
+print <<"EOF";
+
+void describe(std::ostream& s,int depth = 0) const {
+	$d;
+}
+
+
+EOF
+}
+
+print <<"EOF";
+
+void _export(${namespace}::Exporter& h) const { 
+	$D;
+}
+
+
+EOF
+
+}
+if(0)
+{
+foreach my $c ( @c )
+{
+	my $n = $c->name;
+	open(OUT,">${n}.b");
+	select OUT;
+	print "static void schema(${namespace}::Schema& s) {\n";
+	foreach my $x ( $c->super )
+	{
+		print "${x}::schema(s);\n";
+		#print "s(\"$x\", 0,sizeof($x));\n";
+	}
+	foreach my $x ( $c->members )
+	{
+		print "s(\"${n}::$x\",offsetof($n,$x),sizeof(&(($n*)0)->$x));\n";
+	}
+	print "}\n";
+}
+}
+package parser;
+use Carp;
+my @TOKENS;
+sub parse {
+	my ($file) = @_;
+	local $/ = undef;
+	open(IN,"<$file") || croak "$file: $!";
+	my $x = <IN>;
+	close(IN);
+	$x =~ s/^#.*$//mg;
+	$x =~ s/\/\/.*$//mg;
+	@TOKENS =
+		grep { length($_);                }
+		map  { /\W/ ? split('',$_) :  $_; }
+		map  { s/\s//g; $_;               }
+		split(/\b/, $x );
+
+	my @c;
+	my $x;
+	while($x = consume_until("(typedef|template|class|struct)"))
+	{
+		if($x eq 'typedef')
+		{
+			consume_until(";");
+			next;
+		}
+
+		if($x eq 'template')
+		{
+			push @c, parse_template();
+		}
+		else
+		{
+			push @c, parse_class();
+		}
+	}
+	return grep { defined $_; } @c;
+}
+
+sub parse_template {
+	my @tmp = template_args();
+	return parse_class(@tmp) if(next_is("(class|struct)"));
+}
+sub template_args {
+	my @tmp;
+	expect_next("<");
+	for(;;)
+	{
+		expect_next("(class|bool|int)");
+		push @tmp, next_ident();
+		if(next_is("="))
+		{
+			my $x = consume_until('(,|\>|\<)');
+			unshift @TOKENS,$x;
+			while($x eq '<')
+			{
+				consume_block('<','>');
+				$x = consume_until('(,|\>|\<)');
+				unshift @TOKENS,$x;
+			}
+		}
+		last unless(next_is(","));
+	}
+	expect_next(">");
+	return @tmp;
+}
+sub parse_class {
+	my (@tmp) = @_;
+	my $self = {};
+	my $name = next_ident();
+	$self->{name}     = $name;
+	$self->{template} = \@tmp if(@tmp);
+	# Foreward declaration
+	return if(next_is(";"));
+	if(next_is(":"))
+	{
+		for(;;)
+		{
+			ignore_while("(public|private|protected|virtual)");
+			push @{$self->{super}}, next_ident();
+			last unless(next_is(","));
+		}
+	}
+	expect_next('{');
+	while(!peek_next('}'))
+	{
+		# print "... : $TOKENS[0], $TOKENS[1], ... \n";
+		if(next_is('\/'))
+		{
+			if(next_is('\*'))
+			{
+				while(!next_is('\/'))
+				{
+					consume_until('\*');
+				}
+				next;
+			}
+			else
+			{
+				unshift @TOKENS, "/";	
+			}
+
+		}
+
+		if(next_is("(public|private|protected)"))
+		{
+			expect_next(":");
+			next;
+		}
+
+		if(next_is("friend"))
+		{
+			my $x = consume_until("(;|{)");
+			if($x eq "{")
+			{
+				unshift @TOKENS, $x;
+				consume_block('{','}');
+			}
+			next;
+		}
+
+		# next_is("explicit");
+		if(next_is("(typedef|using|typename|enum)"))
+		{
+			consume_until(";");
+			next;
+		}
+		if(next_is("(class|struct)"))
+		{
+			push @{$self->{classes}}, parse_class();
+			next;
+		}
+		my %m;
+		while(next_is("template"))
+		{
+			push @{ $m{template} } , template_args();
+		}
+
+		my @x;
+#		push @x,"~" while(next_is('\~'));
+
+		$m{explicit} = 1 if(next_is("explicit"));
+		$m{static}   = 1 if(next_is("static"));
+		$m{virtual}  = 1 if(next_is("virtual"));
+		my $x;
+		while($x = next_is_ident())
+		{
+			# print "--- : $x\n";
+			push @x, $x;
+			push @x,'*' while(next_is('\*'));
+			push @x,'&' while(next_is('\&'));
+			$m{name} = $x;
+			# int a,b,*c; does not work
+			my $s;
+			if($s = next_is('(,|;|=)'))
+			{
+				pop @x;
+				$m{type} = make_type(@x);
+				if(exists $m{static})
+				{
+					push @{$self->{class_members}}, \%m;
+				}
+				else
+				{
+					push @{$self->{members}}, \%m;
+				}
+				consume_until(";") if($s eq '=');
+				last;
+			}
+			if(peek_next('\('))
+			{
+				pop @x;
+				$m{type} = make_type(@x);
+				my @args = consume_block('(',')');
+				shift @args;
+				pop @args;
+				my @a;
+				my $n = 0;
+				my @z;
+				foreach my $a ( @args )
+				{
+					if($a eq ',' && $n == 0)
+					{
+						push @a, make_type(@z);
+						@z = ();
+						next;
+					}
+					$n++ if($a eq '<');	
+					$n++ if($a eq '(');	
+					$n-- if($a eq ')');	
+					$n-- if($a eq '>');	
+					push @z,$a;
+				}
+				push @a, make_type(@z) if(@z);
+				$m{const} = 1 if(next_is("const"));
+				$m{args}  = \@a;
+				if(exists $m{static})
+				{
+					push @{$self->{class_methods}}, \%m;
+				}
+				else
+				{
+					push @{$self->{methods}}, \%m;
+				}
+				# print "f: $x\n";
+
+				if(next_is(':'))
+				{
+					# print "{: $TOKENS[0]\n";
+					consume_until('\{');
+					unshift @TOKENS, '{';
+					consume_block('{','}');
+					# print "}: $TOKENS[0]\n";
+				}
+				else
+				{
+					if(peek_next('\{'))
+					{
+						consume_block('{','}');
+					}
+					else
+					{
+						if(next_is("="))
+						{
+							expect_next("0");
+							$m{abstract} = 1;
+						}
+						expect_next(";");
+					}
+				}
+				last;
+			}
+		}
+
+	}
+	expect_next("}");
+	expect_next(";");
+	return bless($self,"class");
+}
+sub consume_until {
+	my ($r) = @_;
+	while(@TOKENS)
+	{
+		my $x = shift @TOKENS;
+		return $x if($x =~ /^$r$/);
+	}
+	return undef;
+}
+sub consume_block {
+	my ($bra,$ket) = @_;
+	my $n = 0;
+	my @x;
+	croak "@TOKENS" unless($bra eq $TOKENS[0]);
+	while(@TOKENS)
+	{
+		my $x = shift @TOKENS;
+		$n++ if($x eq $bra);
+		$n-- if($x eq $ket);
+		push @x,$x;
+		return @x if($n == 0);
+	}
+}
+sub ignore_while {
+	my ($r) = @_;
+	while(@TOKENS)
+	{
+		return unless($TOKENS[0] =~ /^$r$/);
+		shift @TOKENS;
+	}
+}
+sub expect_next {
+	my ($r) = @_;
+	my $ident = shift @TOKENS;
+	croak "$ident is not $r" unless($ident =~ /^$r$/);
+	return $ident;
+}
+sub next_ident {
+	my $x = next_is_ident();
+	croak "not an ident " unless($x);
+	return $x;
+}
+sub next_is {
+	my ($r) = @_;
+	if($TOKENS[0] =~ /^$r$/)
+	{
+		return shift @TOKENS;
+	}
+	return undef;
+}
+sub next_is_ident {
+	my $op = next_is("operator");
+	if($op)
+	{
+		my $x;
+		if($x = next_is("(new|delete)"))
+		{
+			$op .= " $x";
+			if(next_is('\['))
+			{
+				expect_next('\]');
+				$op .= "[]";
+			}
+			return $op;
+		}
+
+		if(next_is('\('))
+		{
+			expect_next('\)');
+			$op .= "()";
+		}
+		my $z;
+		while($z = next_is('[\-+/\*\[\]<>=!]'))
+		{
+			$op .= $z;
+		}
+		return $op;
+	}
+	my $y = next_is('\~');
+	my $x = next_is('\w+');
+	if($x)
+	{
+		$x = "$y$x";
+		if(peek_next("<"))
+		{
+			my @x = consume_block("<",">");
+			$x .= join("", at x);
+		}
+
+		if(next_is(":"))
+		{
+			if(next_is(":"))
+			{
+				my $z = next_is_ident();
+				return "${x}::${z}";
+			}
+			else
+			{
+				unshift @TOKENS, ":";
+			}
+		}
+	}
+	return $x;
+}
+sub peek_next {
+	my ($r) = @_;
+	if($TOKENS[0] =~ /^$r$/)
+	{
+		return 1;
+	}
+	return 0;
+}
+sub make_type {
+	my (@a) = @_;
+	my $p;
+	my @x;
+	foreach my $a ( @a )
+	{
+		push @x, " " if($p =~ /^(\w+|\&|\*)$/ && $a =~ /^\w+$/);
+		push @x, $a;
+		$p = $a;
+	}
+	my $s = join('', at x);
+	$s =~ s/>>/> >/g;
+	return $s;
+}
+package class;
+sub name {
+	my ($self) = @_;
+	return $self->{name};
+}
+sub super {
+	my ($self) = @_;
+	return $self->{super} ? @{$self->{super}} : ();
+}
+
+sub members {
+	my ($self) = @_;
+	my @x = $self->{members} ? @{$self->{members}} : ();
+	return map { $_->{name} } @x;
+}
+
+sub methods {
+	my ($self) = @_;
+	my @x = $self->{methods} ? @{$self->{methods}} : ();
+	return map { $_->{name} } @x;
+}
+
+sub has_method {
+	my ($self,$name) = @_;
+	return grep { $_ eq $name } $self->methods;
+}
+
+sub members_types {
+	my ($self) = @_;
+	my @x = $self->{members} ? @{$self->{members}} : ();
+	return map { [ $_->{name}, $_->{type} ]  } @x;
+}
+
+sub template {
+	my ($self) = @_;
+	return $self->{template} ? @{$self->{template}} : ();
+}
+1;
+
+
diff --git a/ecbuild/cmake/sha1.in b/ecbuild/cmake/sha1.in
new file mode 100644
index 0000000..8e744a7
--- /dev/null
+++ b/ecbuild/cmake/sha1.in
@@ -0,0 +1 @@
+ at _p_SHA1@  @_p_NAME@
diff --git a/ecbuild/examples/cpp/bar/CMakeLists.txt b/ecbuild/examples/cpp/bar/CMakeLists.txt
new file mode 100644
index 0000000..9c65fc3
--- /dev/null
+++ b/ecbuild/examples/cpp/bar/CMakeLists.txt
@@ -0,0 +1,60 @@
+###############################################################################
+# cmake
+#   options:
+#       -DCMAKE_BUILD_TYPE=Debug|RelWithDebInfo|Release|Production
+#       -DCMAKE_INSTALL_PREFIX=/path/to/install
+#
+#       -DCMAKE_C_COMPILER=gcc
+#       -DCMAKE_CXX_COMPILER=g++
+#
+#       -DCMAKE_MODULE_PATH=/path/to/ecbase/cmake
+#       -DCMAKE_PREFIX_PATH=/path/to/jasper:/path/to/any/package/out/of/place
+
+cmake_minimum_required( VERSION 2.6.4 FATAL_ERROR )
+
+project( bar )
+
+set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} )
+
+include( ecmwf_build_system )
+
+###############################################################################
+# local project
+
+ecmwf_declare_project()
+
+###############################################################################
+# some variables/options of this project
+
+###############################################################################
+# find extra packages
+
+###############################################################################
+# contents
+
+ecmwf_add_subproject( foo  ON  )
+
+ecmwf_add_library( TARGET       bar
+                   INCLUDES     ${FOO_INCLUDE_DIRS}
+                   LIBS         ${FOO_LIBRARIES}
+                   SOURCES      bar.h bar.c )
+
+ecmwf_add_executable( TARGET     master_bar
+                      SOURCES    main.cc
+                      LIBS       bar )
+
+ecmwf_add_test( TARGET   test_bar
+                SOURCES  test.cc
+                LIBS     bar )
+
+############################################################################################
+# installation 
+
+ecmwf_install_project( NAME Bar )
+
+###############################################################################
+# summary
+
+# print the summary of the configuration
+include( ecmwf_print_summary )
+
diff --git a/ecbuild/examples/cpp/bar/VERSION.cmake b/ecbuild/examples/cpp/bar/VERSION.cmake
new file mode 100644
index 0000000..e0959dc
--- /dev/null
+++ b/ecbuild/examples/cpp/bar/VERSION.cmake
@@ -0,0 +1 @@
+set( ${PROJECT_NAME}_VERSION_STR  "1.0.0" )
diff --git a/ecbuild/examples/cpp/bar/bar.c b/ecbuild/examples/cpp/bar/bar.c
new file mode 100644
index 0000000..8e617da
--- /dev/null
+++ b/ecbuild/examples/cpp/bar/bar.c
@@ -0,0 +1,6 @@
+#include "foo.h"
+
+int bar()
+{
+  return foo() * foo();
+}
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/bar/bar.h b/ecbuild/examples/cpp/bar/bar.h
new file mode 100644
index 0000000..bcffbba
--- /dev/null
+++ b/ecbuild/examples/cpp/bar/bar.h
@@ -0,0 +1,6 @@
+#ifndef bar_h
+#define bar_h
+
+int bar();
+
+#endif
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/bar/main.cc b/ecbuild/examples/cpp/bar/main.cc
new file mode 100644
index 0000000..5c22c41
--- /dev/null
+++ b/ecbuild/examples/cpp/bar/main.cc
@@ -0,0 +1,10 @@
+#include <iostream>
+
+extern "C" {
+#include "bar.h"
+}
+
+int main()
+{
+  std::cout << "bar is " << bar() << std::endl;
+}
diff --git a/ecbuild/examples/cpp/bar/test.cc b/ecbuild/examples/cpp/bar/test.cc
new file mode 100644
index 0000000..10cb14b
--- /dev/null
+++ b/ecbuild/examples/cpp/bar/test.cc
@@ -0,0 +1,13 @@
+#include <iostream>
+
+extern "C" {
+#include "bar.h"
+}
+
+int main()
+{
+  if( bar() == 42*42)
+    std::cout << "ok" << std::endl;
+  else
+    std::cout << "failed" << std::endl;
+}
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/boost-python-lib/CMakeLists.txt b/ecbuild/examples/cpp/boost-python-lib/CMakeLists.txt
new file mode 100644
index 0000000..95475bb
--- /dev/null
+++ b/ecbuild/examples/cpp/boost-python-lib/CMakeLists.txt
@@ -0,0 +1,60 @@
+
+cmake_minimum_required( VERSION 2.8.4 FATAL_ERROR )
+
+project( mypython CXX )
+
+set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} )
+
+include( ecbuild_system )
+
+ecbuild_declare_project()
+
+###############################################################################
+# find extra packages
+
+# Python
+# Can specify non-default distribution with CMake variable PYTHON_EXECUTABLE
+ecbuild_find_python()
+message( STATUS "PYTHON_EXECUTABLE    : ${PYTHON_EXECUTABLE}")
+message( STATUS "PYTHON_INCLUDE_DIRS  : ${PYTHON_INCLUDE_DIRS}")
+message( STATUS "PYTHON_LIBRARIES     : ${PYTHON_LIBRARIES}")
+
+# Boost
+# Can specify non-default distribution with CMake variable BOOST_ROOT
+ecbuild_add_extra_search_paths( boost )
+set( Boost_MINIMUM_VERSION "1.47" )
+find_package( Boost ${Boost_MINIMUM_VERSION} REQUIRED
+              COMPONENTS python )
+message( STATUS "Boost_LIBRARIES     : ${Boost_LIBRARIES}" )
+
+###############################################################################
+# Contents
+
+ecbuild_add_library( TARGET       mypython
+                     INCLUDES     ${Boost_INCLUDE_DIR} ${PYTHON_INCLUDE_DIRS}
+                     LIBS         ${Boost_LIBRARIES} ${PYTHON_LIBRARIES}
+                     SOURCES      pythonlib.hpp pythonlib.cpp )
+configure_file( mypython.py       ${CMAKE_BINARY_DIR}/lib COPYONLY )
+
+############################################################################################
+# Installation 
+
+ecbuild_install_project( NAME python_project )
+
+###############################################################################
+# Summary
+
+ecbuild_print_summary()
+
+
+
+message( STATUS "" )
+message( STATUS "To test the library:" )
+message( STATUS "--------------------" )
+message( STATUS "make" )
+message( STATUS "cd ${CMAKE_CURRENT_BINARY_DIR}/lib" )
+message( STATUS "python" )
+message( STATUS ">>> import libmypython" )
+message( STATUS ">>> help(libmypython)" )
+message( STATUS "" )
+message( STATUS "---------------------------------------------------------" )
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/boost-python-lib/mypython.py b/ecbuild/examples/cpp/boost-python-lib/mypython.py
new file mode 100644
index 0000000..d6f6a1b
--- /dev/null
+++ b/ecbuild/examples/cpp/boost-python-lib/mypython.py
@@ -0,0 +1,10 @@
+"""
+API for the C++ module using boost::python
+
+mypython.py:
+    This file can be used to do some python actions at import
+
+Module description:
+    ...
+"""
+from libmypython import *
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/boost-python-lib/pythonlib.cpp b/ecbuild/examples/cpp/boost-python-lib/pythonlib.cpp
new file mode 100644
index 0000000..ba32ffb
--- /dev/null
+++ b/ecbuild/examples/cpp/boost-python-lib/pythonlib.cpp
@@ -0,0 +1,6 @@
+#include "pythonlib.hpp"
+
+BOOST_PYTHON_MODULE(libmypython)
+{
+  boost::python::scope().attr("__doc__") = "Python API for my python project";
+}
diff --git a/ecbuild/examples/cpp/boost-python-lib/pythonlib.hpp b/ecbuild/examples/cpp/boost-python-lib/pythonlib.hpp
new file mode 100644
index 0000000..349d581
--- /dev/null
+++ b/ecbuild/examples/cpp/boost-python-lib/pythonlib.hpp
@@ -0,0 +1,6 @@
+#ifndef pythonlib_hpp
+#define pythonlib_hpp
+
+#include <boost/python.hpp>
+
+#endif
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/foo/CMakeLists.txt b/ecbuild/examples/cpp/foo/CMakeLists.txt
new file mode 100644
index 0000000..c4080d2
--- /dev/null
+++ b/ecbuild/examples/cpp/foo/CMakeLists.txt
@@ -0,0 +1,62 @@
+###############################################################################
+# cmake
+#   options:
+#       -DCMAKE_BUILD_TYPE=Debug|RelWithDebInfo|Release|Production
+#       -DCMAKE_INSTALL_PREFIX=/path/to/install
+#
+#       -DCMAKE_C_COMPILER=gcc
+#       -DCMAKE_CXX_COMPILER=g++
+#
+#       -DCMAKE_MODULE_PATH=/path/to/ecbase/cmake
+#       -DCMAKE_PREFIX_PATH=/path/to/jasper:/path/to/any/package/out/of/place
+
+cmake_minimum_required( VERSION 2.6.4 FATAL_ERROR )
+
+project( foo )
+
+set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} )
+
+include( ecmwf_build_system )
+
+###############################################################################
+# local project
+
+ecmwf_declare_project()
+
+###############################################################################
+# some variables/options of this project
+
+###############################################################################
+# find extra packages
+
+###############################################################################
+# contents
+
+ecmwf_add_library( TARGET       foo
+                   SOURCES      foo.h foo.c )
+
+ecmwf_add_executable( TARGET     master_foo
+                      SOURCES    main.cc
+                      LIBS       foo )
+
+ecmwf_add_test( TARGET   test_foo
+                SOURCES  test.cc
+                LIBS     foo )
+
+if( NOT PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
+  set( FOO_INCLUDE_DIRS   ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE )
+  set( FOO_LIBRARIES      foo  PARENT_SCOPE )
+  set( FOO_FOUND          TRUE PARENT_SCOPE )
+endif()
+
+############################################################################################
+# installation 
+
+ecmwf_install_project( NAME Foo )
+
+###############################################################################
+# summary
+
+# print the summary of the configuration
+include( ecmwf_print_summary )
+
diff --git a/ecbuild/examples/cpp/foo/VERSION.cmake b/ecbuild/examples/cpp/foo/VERSION.cmake
new file mode 100644
index 0000000..e0959dc
--- /dev/null
+++ b/ecbuild/examples/cpp/foo/VERSION.cmake
@@ -0,0 +1 @@
+set( ${PROJECT_NAME}_VERSION_STR  "1.0.0" )
diff --git a/ecbuild/examples/cpp/foo/foo.c b/ecbuild/examples/cpp/foo/foo.c
new file mode 100644
index 0000000..88adcb5
--- /dev/null
+++ b/ecbuild/examples/cpp/foo/foo.c
@@ -0,0 +1,4 @@
+int foo()
+{
+  return 42;
+}
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/foo/foo.h b/ecbuild/examples/cpp/foo/foo.h
new file mode 100644
index 0000000..6b68dbb
--- /dev/null
+++ b/ecbuild/examples/cpp/foo/foo.h
@@ -0,0 +1,6 @@
+#ifndef foo_h
+#define foo_h
+
+int foo();
+
+#endif
\ No newline at end of file
diff --git a/ecbuild/examples/cpp/foo/main.cc b/ecbuild/examples/cpp/foo/main.cc
new file mode 100644
index 0000000..aec42da
--- /dev/null
+++ b/ecbuild/examples/cpp/foo/main.cc
@@ -0,0 +1,10 @@
+#include <iostream>
+
+extern "C" {
+#include "foo.h"
+}
+
+int main()
+{
+  std::cout << "foo is " << foo() << std::endl;
+}
diff --git a/ecbuild/examples/cpp/foo/test.cc b/ecbuild/examples/cpp/foo/test.cc
new file mode 100644
index 0000000..946404d
--- /dev/null
+++ b/ecbuild/examples/cpp/foo/test.cc
@@ -0,0 +1,13 @@
+#include <iostream>
+
+extern "C" {
+#include "foo.h"
+}
+
+int main()
+{
+  if( foo() == 42)
+    std::cout << "ok" << std::endl;
+  else
+    std::cout << "failed" << std::endl;
+}
\ No newline at end of file
diff --git a/ecbuild/examples/fortran/CMakeLists.txt b/ecbuild/examples/fortran/CMakeLists.txt
new file mode 100644
index 0000000..91aeb75
--- /dev/null
+++ b/ecbuild/examples/fortran/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required( VERSION 2.6.4 FATAL_ERROR )
+
+project( compute_circle Fortran )
+
+############################################################
+
+add_library( const STATIC constants.f90 )
+
+############################################################
+
+# file( GLOB area_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*circle.f90" )
+
+add_library( area_circle SHARED ${area_srcs} )
+
+target_link_libraries( area_circle const )
+
+############################################################
+
+add_executable( compute_circle main.F90 )
+
+target_link_libraries( compute_circle area_circle )
\ No newline at end of file
diff --git a/ecbuild/examples/fortran/area_circle.f90 b/ecbuild/examples/fortran/area_circle.f90
new file mode 100644
index 0000000..744d6dc
--- /dev/null
+++ b/ecbuild/examples/fortran/area_circle.f90
@@ -0,0 +1,15 @@
+!-----Area_Circle----------------------------------------------------
+!
+!  Function to compute the area of a circle of given radius
+!
+!---------------------------------------------------------------------
+FUNCTION Area_Circle(r)
+USE Circle, ONLY : Pi
+
+IMPLICIT NONE
+REAL :: Area_Circle
+REAL, INTENT(IN) :: r
+
+Area_Circle = Pi * r * r
+
+END FUNCTION Area_Circle
\ No newline at end of file
diff --git a/ecbuild/examples/fortran/area_circle.h b/ecbuild/examples/fortran/area_circle.h
new file mode 100644
index 0000000..0c43fac
--- /dev/null
+++ b/ecbuild/examples/fortran/area_circle.h
@@ -0,0 +1,5 @@
+INTERFACE
+   FUNCTION Area_Circle (r)
+     REAL, INTENT(IN) :: r
+   END FUNCTION Area_Circle
+END INTERFACE
\ No newline at end of file
diff --git a/ecbuild/examples/fortran/circle.f90 b/ecbuild/examples/fortran/circle.f90
new file mode 100644
index 0000000..6069beb
--- /dev/null
+++ b/ecbuild/examples/fortran/circle.f90
@@ -0,0 +1,11 @@
+MODULE Circle
+USE Constants, ONLY : ZOOM
+!---------------------------------------------------------------------
+!
+!  Module containing definitions of variables needed to
+!  compute the area of a circle of radius r
+!
+!---------------------------------------------------------------------
+   REAL, PARAMETER :: Pi = 3.1415927 * ZOOM
+   REAL :: radius
+END MODULE Circle
\ No newline at end of file
diff --git a/ecbuild/examples/fortran/constants.f90 b/ecbuild/examples/fortran/constants.f90
new file mode 100644
index 0000000..857f752
--- /dev/null
+++ b/ecbuild/examples/fortran/constants.f90
@@ -0,0 +1,12 @@
+MODULE Constants
+!---------------------------------------------------------------------
+!
+!  Module containing definitions of variables needed to
+!  compute the area of a circle of radius r
+!
+!---------------------------------------------------------------------
+   REAL, PARAMETER :: ZOOM = 1
+END MODULE Constants
+
+
+
diff --git a/ecbuild/examples/fortran/lolo_circle.f90 b/ecbuild/examples/fortran/lolo_circle.f90
new file mode 100644
index 0000000..e69de29
diff --git a/ecbuild/examples/fortran/main.F90 b/ecbuild/examples/fortran/main.F90
new file mode 100644
index 0000000..b84ead6
--- /dev/null
+++ b/ecbuild/examples/fortran/main.F90
@@ -0,0 +1,25 @@
+PROGRAM Area
+!---------------------------------------------------------------------
+!
+!  This program computes the area of a circle given the input radius
+!
+!  Uses:  MODULE Circle
+!         FUNCTION Area_Circle (r)
+!
+!---------------------------------------------------------------------
+
+USE Circle, ONLY : radius
+IMPLICIT NONE
+
+#include "area_circle.h"
+
+!  Prompt user for radius of circle
+write(*, '(A)', ADVANCE = "NO") "Enter the radius of the circle:  "
+read(*,*) radius
+
+! Write out area of circle using function call
+write(*,100) "Area of circle with radius", radius, " is", &
+            Area_Circle(radius)
+100 format (A, 2x, F6.2, A, 2x, F11.2)
+
+END PROGRAM Area
\ No newline at end of file
diff --git a/ecbuild/project_summary.cmake b/ecbuild/project_summary.cmake
new file mode 100644
index 0000000..851ebf0
--- /dev/null
+++ b/ecbuild/project_summary.cmake
@@ -0,0 +1,21 @@
+message( STATUS "---------------------------------------------------------" )
+
+message( STATUS "[Generic]" )
+
+if( PERL_EXECUTABLE )
+	message( STATUS " Perl             : [${PERL_EXECUTABLE}] (${PERL_VERSION})" )
+endif()
+
+if(PYTHONINTERP_FOUND)
+    message( STATUS " Python           : [${PYTHON_EXECUTABLE}] (${PYTHON_VERSION})" )
+endif()
+
+if(PYTHONLIBS_FOUND)
+    message( STATUS " Python   include : [${PYTHON_INCLUDE_DIRS}]" )
+    message( STATUS "          libs    : [${PYTHON_LIBRARIES}]" )
+endif()
+
+if( DEFINED FORTRAN_LIBRARIES )
+  message( STATUS "Fortan libs       : [${FORTRAN_LIBRARIES}]" )
+endif()
+
diff --git a/ecbuild/share/CMakeLists.txt b/ecbuild/share/CMakeLists.txt
new file mode 100644
index 0000000..84590fc
--- /dev/null
+++ b/ecbuild/share/CMakeLists.txt
@@ -0,0 +1,3 @@
+# ecbuild_add_resources( TARGET ecbuild_share 
+#	SOURCE_PACK ecmwf_license_header.txt
+#	DONT_PACK_DIRS ecbuild )
diff --git a/ecbuild/share/ecbuild/cmake b/ecbuild/share/ecbuild/cmake
new file mode 120000
index 0000000..745c85c
--- /dev/null
+++ b/ecbuild/share/ecbuild/cmake
@@ -0,0 +1 @@
+../../cmake
\ No newline at end of file
diff --git a/ecbuild/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake b/ecbuild/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
new file mode 100644
index 0000000..a633d5d
--- /dev/null
+++ b/ecbuild/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
@@ -0,0 +1,63 @@
+####################################################################
+# COMPILER
+####################################################################
+
+include(CMakeForceCompiler)
+
+CMAKE_FORCE_C_COMPILER       ( cc  Cray )
+CMAKE_FORCE_CXX_COMPILER     ( CC  Cray )
+CMAKE_FORCE_Fortran_COMPILER ( ftn Cray )
+
+link_libraries("$ENV{CC_X86_64}/lib/x86-64/libcray-c++-rts.so")
+link_libraries("-lmpichf90_cray")
+link_libraries("-lmpichcxx_cray")
+
+set( ECBUILD_FIND_MPI OFF )
+set( ECBUILD_TRUST_FLAGS ON )
+
+####################################################################
+# FLAGS COMMON TO ALL BUILD TYPES
+####################################################################
+
+set( CMAKE_C_FLAGS_INIT       "-lhugetlbfs" )
+set( CMAKE_CXX_FLAGS_INIT     "-lhugetlbfs" )
+set( CMAKE_Fortran_FLAGS_INIT "-lhugetlbfs -emf -rmoid" )
+
+set( OMP_C_FLAGS             "-homp" )
+set( OMP_CXX_FLAGS           "-homp" )
+set( OMP_Fortran_FLAGS       "-homp" )
+set( OMPSTUBS_C_FLAGS        "-hnoomp" )
+set( OMPSTUBS_CXX_FLAGS      "-hnoomp" )
+set( OMPSTUBS_Fortran_FLAGS  "-hnoomp" )
+
+####################################################################
+# BIT REPRODUCIBLE FLAGS
+####################################################################
+
+set( CMAKE_C_FLAGS_BIT        "-O2 -hflex_mp=conservative -hadd_paren -hfp1" )
+set( CMAKE_CXX_FLAGS_BIT      "-O2 -hflex_mp=conservative -hadd_paren -hfp1" )
+set( CMAKE_Fortran_FLAGS_BIT  "-O2 -hflex_mp=conservative -hadd_paren -hfp1" )
+
+####################################################################
+# RELEASE FLAGS
+####################################################################
+
+set( CMAKE_C_FLAGS_RELEASE       "-O3 -hfp3 -hscalar3 -hvector3" )
+set( CMAKE_CXX_FLAGS_RELEASE     "-O3 -hfp3 -hscalar3 -hvector3" )
+set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -hfp3 -hscalar3 -hvector3" )
+
+####################################################################
+# DEBUG FLAGS
+####################################################################
+
+set( CMAKE_C_FLAGS_DEBUG        "-O0 -Gfast -Ktrap=fp" )
+set( CMAKE_CXX_FLAGS_DEBUG      "-O0 -Gfast -Ktrap=fp" )
+set( CMAKE_Fortran_FLAGS_DEBUG  "-O0 -Gfast -Ktrap=fp" )
+
+####################################################################
+# LINK FLAGS
+####################################################################
+
+set( CMAKE_C_LINK_FLAGS        "-Wl,-Map,loadmap -Wl,--as-needed" )
+set( CMAKE_CXX_LINK_FLAGS      "-Wl,-Map,loadmap -Wl,--as-needed" )
+set( CMAKE_Fortran_LINK_FLAGS  "-Wl,-Map,loadmap -Wl,--as-needed" )
diff --git a/ecbuild/share/ecmwf_license_header.txt b/ecbuild/share/ecmwf_license_header.txt
new file mode 100644
index 0000000..373e38a
--- /dev/null
+++ b/ecbuild/share/ecmwf_license_header.txt
@@ -0,0 +1,8 @@
+/*
+ * (C) Copyright 1996-2014 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. In applying
+ * this licence, ECMWF does not waive the privileges and immunities granted to it by virtue
+ * of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
diff --git a/ecflow_4_0_7/.gitignore b/ecflow_4_0_7/.gitignore
new file mode 100644
index 0000000..ad6fc56
--- /dev/null
+++ b/ecflow_4_0_7/.gitignore
@@ -0,0 +1,39 @@
+# eclipse
+.settings/
+.pydevproject
+
+# cmake
+ecbuild/
+
+# ecflow 
+bin/
+swap
+*.job0
+*.job1
+*.job2
+*.job3
+*.1
+*.dat
+*.def_log
+*.glog
+*.def.glog
+
+# hack to ignore naw.def.glog
+**/naw.def.glog
+ 
+*.lock
+*.log
+*.so
+*.pyc
+
+ECF_HOME_debug/
+ECF_HOME_release/
+
+gmon.out
+
+*.check
+*.b
+/eurydice.3141.ecf.check
+/eurydice.3141.ecf.log
+/eurydice.3141.ecf.check.b
+/gnuplot.script
diff --git a/ecflow_4_0_7/ACore/CMakeLists.txt b/ecflow_4_0_7/ACore/CMakeLists.txt
new file mode 100644
index 0000000..55c2d00
--- /dev/null
+++ b/ecflow_4_0_7/ACore/CMakeLists.txt
@@ -0,0 +1,34 @@
+# Note:
+# If new src or test is added make sure you touch this file
+#
+
+# We place generated file in /ACore/src/ so that we can still use boost build
+configure_file( ecflow_version.h.in ${CMAKE_SOURCE_DIR}/ACore/src/ecflow_version.h )
+
+# Use transitive nature: i.e if any lib/exe uses lib core, they
+# will also inherit the boost libs.
+#
+file( GLOB srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp" )
+ecbuild_add_library( TARGET core
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     INCLUDES src
+                              ${Boost_INCLUDE_DIRS} 
+                    )
+
+# This ensures that for debug config, we only link with debug boost libs, for other configs, we link with optimised boost libs
+target_link_libraries(core debug ${Boost_SERIALIZATION_LIBRARY_DEBUG}   ${Boost_SERIALIZATION_LIBRARY_RELEASE}
+                           debug ${Boost_SYSTEM_LIBRARY_DEBUG}          ${Boost_SYSTEM_LIBRARY_RELEASE}  
+                           debug ${Boost_FILESYSTEM_LIBRARY_DEBUG}      ${Boost_FILESYSTEM_LIBRARY_RELEASE}
+                           debug ${Boost_DATE_TIME_LIBRARY_DEBUG}       ${Boost_DATE_TIME_LIBRARY_RELEASE})                
+                   
+#
+# By use'ing BOOST tag we indicate this test should link with boost test libs
+#
+file( GLOB test_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "test/*.cpp" )
+ecbuild_add_test( TARGET   u_acore 
+                  BOOST
+                  SOURCES  ${test_srcs}
+                  LIBS     core                           
+                )
diff --git a/ecflow_4_0_7/ACore/Jamfile.jam b/ecflow_4_0_7/ACore/Jamfile.jam
new file mode 100755
index 0000000..b4df86f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/Jamfile.jam
@@ -0,0 +1,46 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Core project. define project so that this project can be referenced
+#               from other projects
+#
+project theCore ;
+
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib.
+#
+# <use> does not mean dependency, it simply used to control the link order
+# in our case, we want all the boost libraries to appears after the core library
+# on the link line.
+#
+lib core : [ glob src/*.cpp ]
+         : <link>static
+           <variant>debug:<define>DEBUG
+           <use>/site-config//boost_system
+           <use>/site-config//boost_filesystem
+           <use>/site-config//boost_test
+           <use>/site-config//boost_serialization
+           <use>/site-config//boost_datetime
+           <use>/site-config//boost_program_options
+          :
+          : <include>../ACore/src
+          ;
+
+#
+# boost_datetime is only required for formatting. i.e to call to_simple_string
+#  cerr <<  to_simple_string(calendar.suiteTime()) << "\n";
+#
+exe u_acore : [ glob test/*.cpp ]
+           core
+           /site-config//boost_system
+           /site-config//boost_filesystem
+           /site-config//boost_serialization
+           /site-config//boost_datetime
+           /site-config//boost_test
+         :  <variant>debug:<define>DEBUG
+	     ;
diff --git a/ecflow_4_0_7/ACore/doc/File_r.cpp_old b/ecflow_4_0_7/ACore/doc/File_r.cpp_old
new file mode 100644
index 0000000..ac2f1bb
--- /dev/null
+++ b/ecflow_4_0_7/ACore/doc/File_r.cpp_old
@@ -0,0 +1,48 @@
+
+
+File_r::File_r(const std::string& file_name) : file_name_(file_name),
+   fp_( fopen(file_name.c_str(),"r") ),
+   good_(true)
+{
+}
+
+File_r::~File_r()
+{
+   fclose(fp_);
+}
+
+bool File_r::ok() const
+{
+   if (fp_ == 0) return false;
+   return true;
+}
+
+bool File_r::good() const
+{
+   if (fp_ == 0) return false;
+   return good_;
+}
+
+void File_r::getline(std::string& line)
+{
+   line.erase();
+   char buffer[4096] =  { 0 } ;
+   int c = 0;
+   int i = 0;
+   while ( (c = fgetc(fp_)) != EOF) {
+      if (c == 10 /* new line */) {
+         buffer[i] = '\0';
+         break;
+      }
+      else {
+         buffer[i] = c;
+      }
+      i++;
+   }
+   if (c == EOF) {
+      good_ = false;
+   }
+   line = buffer;
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/doc/StackTrace.cpp_old b/ecflow_4_0_7/ACore/doc/StackTrace.cpp_old
new file mode 100644
index 0000000..fd2f79d
--- /dev/null
+++ b/ecflow_4_0_7/ACore/doc/StackTrace.cpp_old
@@ -0,0 +1,107 @@
+////============================================================================
+//// Name        :
+//// Author      : Avi
+//// Revision    : $Revision: #7 $ 
+////
+//// Copyright 2009-2012 ECMWF. 
+//// This software is licensed under the terms of the Apache Licence version 2.0 
+//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+//// In applying this licence, ECMWF does not waive the privileges and immunities 
+//// granted to it by virtue of its status as an intergovernmental organisation 
+//// nor does it submit to any jurisdiction. 
+////
+//// Description :
+////============================================================================
+//
+//#include "StackTrace.hpp"
+//#include <sstream>
+//#include <iostream>
+//
+//#if defined(__GNUC__)
+//#include <execinfo.h>
+//#include <cxxabi.h>
+//#endif
+//
+////#define DEBUG_ME 1
+//
+//using namespace std;
+//
+//namespace ecf {
+//
+//std::string DeMangleCXXName( const std::string &stackString )
+//{
+//#ifdef DEBUG_ME
+//	std::cout <<"DeMangleCXXName stackString " <<  stackString << "\n";
+//#endif
+//    size_t start = stackString.find( '(' );
+//    size_t end = stackString.find( '+' );
+//    if( std::string::npos == start || std::string::npos == end ) return stackString;
+//
+//    ++start; // puts us pass the '('
+//    size_t n = end - start;
+//    std::string mangled = stackString.substr( start, n );
+//
+//    const size_t kMaxNameLen = 4096;
+//    char function[kMaxNameLen];
+//    int status;
+//    size_t len;
+//    char *ret = abi::__cxa_demangle( mangled.c_str(), function, &len, &status );
+//    if (ret &&  ( 0 == status ))  {// de-mangling successful
+//    	// status is set to one of the following values:
+//    	// 0: The de mangling operation succeeded.
+//    	// -1: A memory allocation failure occurred.
+//    	// -2: mangled_name is not a valid name under the C++ ABI mangling rules.
+//    	// -3: One of the arguments is invalid.
+//
+//    	// Can return the variable string(ret) or std::string( function )
+//    	// std::cout << ret << "\n";
+//
+//        return std::string( function );
+//    }
+//
+//    // If de-mangling fails, returned mangled name with some parens
+//    return mangled + "()";
+//}
+//
+//std::string StackTrace::dump( const std::string &file, int line, int depth )
+//{
+//#if defined(__GNUC__)
+////	   This is not well-optimised, requires compilation with "-rdynamic" on linux
+////	    and doesn't do a great job of demangling the symbol names. It is sufficient
+////	    though to work out call trace.
+//
+//#ifdef DEBUG_ME
+//	std::cout <<"MyStackTrace \n";
+//#endif
+//
+//    std::stringstream result;
+//    result << "Call Stack from " << file << Str::COLON() << line << "\n";
+//
+//    // create a void* array to hold the function addresses. We will only go at most 50 deep
+//	const size_t kMaxDepth = depth;
+//    void *stackAddrs[kMaxDepth];
+//    size_t stackDepth = backtrace( stackAddrs, kMaxDepth );
+//
+//    // now get the function names associated with these symbols. This should work for elf
+//    // binaries, though additional linker options may need to have been called
+//    // (e.g. -rdynamic for GNU ld. See the glibc documentation for 'backtrace')
+//	char** stackStrings = backtrace_symbols( stackAddrs, stackDepth );
+//
+//#ifdef DEBUG_ME
+//	std::cout <<"   MyStackTrace 6  \n";
+//#endif
+//
+//    for( size_t i = 1; i < stackDepth; ++i ) {
+//        result << "   " << DeMangleCXXName( stackStrings[i] ) << "\n";
+//    }
+//
+//    // we now need to release the memory of the symbols array. Since it was allocated using
+//    // malloc, we must release it using 'free'
+//    std::free( stackStrings );
+//    return result.str();
+//#else
+//    return "Back trace no supported on this platform";
+//#endif
+//}
+//}
+//
diff --git a/ecflow_4_0_7/ACore/doc/StackTrace.hpp_old b/ecflow_4_0_7/ACore/doc/StackTrace.hpp_old
new file mode 100644
index 0000000..ed720a7
--- /dev/null
+++ b/ecflow_4_0_7/ACore/doc/StackTrace.hpp_old
@@ -0,0 +1,37 @@
+//#ifndef STACKTRACE_HPP_
+//#define STACKTRACE_HPP_
+//
+////============================================================================
+//// Name        :
+//// Author      : Avi
+//// Revision    : $Revision: #5 $ 
+////
+//// Copyright 2009-2012 ECMWF. 
+//// This software is licensed under the terms of the Apache Licence version 2.0 
+//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+//// In applying this licence, ECMWF does not waive the privileges and immunities 
+//// granted to it by virtue of its status as an intergovernmental organisation 
+//// nor does it submit to any jurisdiction. 
+////
+//// Description : This class is used dump the a stack trace at the point where its called
+////               At the moment only works on Linux
+////============================================================================
+//
+//#include <boost/noncopyable.hpp>
+//#include <string>
+//
+//namespace ecf {
+//
+//class StackTrace : private boost::noncopyable {
+//public:
+//
+//	/// This function will produce a stack trace from where its called
+//	static std::string dump( const std::string &file, int line, int depth = 50 );
+//
+//private:
+//	StackTrace(){}
+//};
+//
+//}
+//
+//#endif
diff --git a/ecflow_4_0_7/ACore/ecflow_version.h.in b/ecflow_4_0_7/ACore/ecflow_version.h.in
new file mode 100644
index 0000000..083f6a4
--- /dev/null
+++ b/ecflow_4_0_7/ACore/ecflow_version.h.in
@@ -0,0 +1,10 @@
+#ifndef ecflow_version_config_h
+#define ecflow_version_config_h
+ 
+#define ECFLOW_VERSION   "@ECFLOW_VERSION_STR@"
+
+#define ECFLOW_RELEASE   "@ECFLOW_RELEASE@"
+#define ECFLOW_MAJOR     "@ECFLOW_MAJOR@"
+#define ECFLOW_MINOR     "@ECFLOW_MINOR@"
+
+#endif 
diff --git a/ecflow_4_0_7/ACore/fred.o b/ecflow_4_0_7/ACore/fred.o
new file mode 100644
index 0000000..6ad2818
Binary files /dev/null and b/ecflow_4_0_7/ACore/fred.o differ
diff --git a/ecflow_4_0_7/ACore/src/Archive.hpp b/ecflow_4_0_7/ACore/src/Archive.hpp
new file mode 100644
index 0000000..7059823
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Archive.hpp
@@ -0,0 +1,57 @@
+#ifndef ARCHIVE_HPP_
+#define ARCHIVE_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+// This class allows multiple archives to be used
+// Since it will allow Archive::Type to be passed as a parameter, when multiple archives exist
+class Archive : private boost::noncopyable {
+public:
+
+   enum Type {
+      TEXT = 0,
+      PORTABLE_BINARY = 1,
+      BINARY = 2,
+      EOS_PORTABLE_BINARY = 3
+   };
+
+   static Type default_archive() {
+
+#if defined(BINARY_ARCHIVE)
+      return BINARY;
+#endif
+
+#if defined(PORTABLE_BINARY_ARCHIVE)
+      return PORTABLE_BINARY;
+#endif
+
+#if defined(EOS_PORTABLE_BINARY_ARCHIVE)
+      return EOS_PORTABLE_BINARY;
+#endif
+
+      return TEXT;
+   }
+
+private:
+   Archive();
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/ArgvCreator.cpp b/ecflow_4_0_7/ACore/src/ArgvCreator.cpp
new file mode 100644
index 0000000..e44bc73
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/ArgvCreator.cpp
@@ -0,0 +1,53 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ArgvCreator.hpp"
+#include <sstream>
+#include <assert.h>
+#include <cstdlib>   // for malloc/free and gcc 4.4.3, not required for gcc 4.2.1
+#include <cstring>   // for strcpy and gcc 4.4.3, not required for gcc 4.2.1
+using namespace std;
+
+ArgvCreator::ArgvCreator( const std::vector<std::string>& theArgs)
+{
+	// Create a Argv array
+	argc_ = theArgs.size();
+	argv_ = (char **) malloc ((argc_ + 1) * sizeof (char *));
+
+	assert(argv_ != NULL);
+
+	for(size_t i = 0; i < theArgs.size(); i++) {
+		argv_[i] = (char*) malloc (sizeof (char *) * (theArgs[i].size() + 1)); // allow +1 for \0
+	    strcpy (argv_[i], theArgs[i].c_str() );
+	}
+	argv_[argc_] = NULL;
+}
+
+// Destroys argv array
+ArgvCreator::~ArgvCreator()
+{
+	// remove argv array
+	for (char** scan = argv_; *scan != NULL; scan++) { free (*scan);}
+	free (argv_);
+}
+
+std::string ArgvCreator::toString() const
+{
+	std::stringstream ss;
+	for(int i=0; i < argc_; i++) { ss << " arg" << i << ":('" << argv_[i] << "')";}
+	return ss.str();
+}
+
diff --git a/ecflow_4_0_7/ACore/src/ArgvCreator.hpp b/ecflow_4_0_7/ACore/src/ArgvCreator.hpp
new file mode 100644
index 0000000..b5b5a83
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/ArgvCreator.hpp
@@ -0,0 +1,43 @@
+#ifndef ARGVCREATOR_HPP_
+#define ARGVCREATOR_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include <vector>
+#include <string>
+
+class ArgvCreator : private boost::noncopyable {
+public:
+	// Create argc/argv from a vector of strings
+	ArgvCreator(const std::vector<std::string> & );
+
+	// Destroys argv array
+	~ArgvCreator();
+
+	int argc() const     { return argc_;}
+	char** argv() const  { return argv_;}
+
+	// for debug
+	std::string toString() const;
+
+private:
+	int    argc_;
+	char** argv_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/AssertTimer.cpp b/ecflow_4_0_7/ACore/src/AssertTimer.cpp
new file mode 100644
index 0000000..4019c10
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/AssertTimer.cpp
@@ -0,0 +1,32 @@
+#
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple class the assert when time constraint not met
+//============================================================================
+#include "AssertTimer.hpp"
+#include "Log.hpp"
+#include <iostream>
+
+namespace ecf {
+
+AssertTimer::~AssertTimer()
+{
+	if (doAssert_ && timeConstraint_ > 0) {
+		int d = duration();
+		if (d >= timeConstraint_) {
+			std::cout << "AssertTimer::~AssertTimer() duration(" << d << ") >= timeConstraint(" << timeConstraint_ << ")\n";
+		}
+		LOG_ASSERT( d < timeConstraint_, "AssertTimer::~AssertTimer()");
+	}
+}
+}
diff --git a/ecflow_4_0_7/ACore/src/AssertTimer.hpp b/ecflow_4_0_7/ACore/src/AssertTimer.hpp
new file mode 100644
index 0000000..e777a65
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/AssertTimer.hpp
@@ -0,0 +1,43 @@
+#ifndef ASSERTTIMER_HPP_
+#define ASSERTTIMER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple class the assert when time constraint not met
+//============================================================================
+#include "Calendar.hpp"
+
+
+namespace ecf {
+
+// Local timer class used to ensure, job submission takes less than 60 seconds
+class AssertTimer {
+public:
+	AssertTimer(int t, bool doAssert = true)
+	: timeConstraint_(t), doAssert_(doAssert), start_time_(Calendar::second_clock_time()) {}
+	~AssertTimer();
+
+	int timeConstraint() const { return timeConstraint_;}
+
+	int duration() const {
+		boost::posix_time::time_duration duration = Calendar::second_clock_time() - start_time_;
+		return duration.total_seconds();
+	}
+private:
+	int timeConstraint_;
+	bool doAssert_;
+	boost::posix_time::ptime start_time_;
+};
+
+}
+#endif /* ASSERTTIMER_HPP_ */
diff --git a/ecflow_4_0_7/ACore/src/Calendar.cpp b/ecflow_4_0_7/ACore/src/Calendar.cpp
new file mode 100644
index 0000000..117de48
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Calendar.cpp
@@ -0,0 +1,383 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #65 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+//============================================================================
+
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib, for to_simple_string
+#include "Calendar.hpp"
+#include "CalendarUpdateParams.hpp"
+#include "Log.hpp"
+#include "Ecf.hpp"
+#include "Extract.hpp"
+
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+//#define DEBUG_CALENDAR 1;
+
+namespace ecf {
+
+Calendar::Calendar()
+: ctype_(Calendar::REAL),
+  dayChanged_(false),
+  startStopWithServer_(false),
+  day_of_week_(-1),
+  day_of_year_(-1),
+  day_of_month_(-1),
+  month_(-1),
+  year_(-1)
+{
+}
+
+Calendar::Calendar(const Calendar& rhs)
+{
+	assign(rhs);
+}
+
+Calendar& Calendar::operator=( const Calendar& rhs)
+{
+	assign(rhs);
+	return *this;
+}
+
+bool Calendar::operator==( const Calendar& rhs) const
+{
+	// Only used for testing the persistence of calendar
+   // Note: We specifically ignore initLocalTime_  and lastTime_ since they are initialised with the current time.
+   //       Otherwise For migration testing, it will fail
+
+	if (ctype_ != rhs.ctype_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality())  std::cout << "Calendar::operator== ctypes don't match\n";
+#endif
+	   return false;
+	}
+	if (initTime_ !=rhs.initTime_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality())  std::cout << "Calendar::operator== initTime_ don't match\n";
+#endif
+	   return false;
+	}
+	if (suiteTime_ !=rhs.suiteTime_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality())  std::cout << "Calendar::operator== suiteTime_  don't match\n";
+#endif
+	   return false;
+	}
+	if (duration_ !=rhs.duration_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality())  std::cout << "Calendar::operator== duration_  don't match\n";
+#endif
+	   return false;
+	}
+	if (dayChanged_ !=rhs.dayChanged_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality())  std::cout << "Calendar::operator== dayChanged_  don't match\n";
+#endif
+	   return false;
+	}
+	if (startStopWithServer_ != rhs.startStopWithServer_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality())  std::cout << "Calendar::operator== startStopWithServer_  don't match\n";
+#endif
+	   return false;
+	}
+	if (calendarIncrement_ !=rhs.calendarIncrement_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality())  std::cout << "Calendar::operator== calendarIncrement_  don't match\n";
+#endif
+	   return false;
+	}
+
+	return true;
+}
+
+void Calendar::assign( const Calendar& rhs)
+{
+	ctype_ = rhs.ctype_;
+ 	initTime_ = rhs.initTime_;
+ 	suiteTime_ = rhs.suiteTime_;
+	duration_ = rhs.duration_;
+ 	dayChanged_ = rhs.dayChanged_;
+ 	startStopWithServer_ =  rhs.startStopWithServer_;
+  	initLocalTime_ =  rhs.initLocalTime_;
+ 	lastTime_ =  rhs.lastTime_;
+	calendarIncrement_ = rhs.calendarIncrement_;
+
+	day_of_week_ = rhs.day_of_week_;   // Cache
+	day_of_year_ = rhs.day_of_year_;   // Cache
+	day_of_month_ = rhs.day_of_month_; // Cache
+	month_ = rhs.month_;               // Cache
+	year_ = rhs.year_;                 // Cache
+}
+
+void Calendar::init(Clock_t clock, bool startStopWithServer)
+{
+   ctype_ = clock;
+   startStopWithServer_ = startStopWithServer;
+}
+
+void Calendar::init(const boost::posix_time::ptime& time, Clock_t clock, bool startStopWithServer)
+{
+   init(clock,startStopWithServer);
+   begin(time);
+}
+
+/// Start the Calendar.  Parameter time can include gain.
+void Calendar::begin(const boost::posix_time::ptime& the_time)
+{
+   duration_ = time_duration(0,0,0,0);
+   calendarIncrement_ = time_duration(0,1,0,0); // This will get overwritten on update
+                                                // But allows some tests to run
+   suiteTime_ = the_time; // includes gain _IF_ it was specified
+   initTime_ = the_time;  // includes gain
+   dayChanged_ = false;
+   initLocalTime_ = second_clock_time();  // for real time clock
+   lastTime_ = initLocalTime_;            // for real time clock
+
+   // Cache the most common requests
+   update_cache();
+}
+
+void Calendar::update( const ecf::CalendarUpdateParams & calUpdateParams )
+{
+	assert(!suiteTime_.is_special()); // begin has not been called.
+
+	// Get the day of week before we update calendar, then same after to determine if the day changed
+	boost::gregorian::date currentdate = suiteTime_.date();
+ 	int theDayOfWeek = currentdate.day_of_week().as_number();
+
+ 	// However there are two ways of incremented/updating calendar.
+ 	if ( !startStopWithServer_ && !calUpdateParams.forTest() ) {
+
+ 	   if (calUpdateParams.serverPollPeriod().total_seconds() < 60) {
+ 	      // 0/ We are still testing. User wants to speed up calendar.
+ 	      //    i.e. if server poll period is 2 seconds, we increment calendar by 1 minute
+
+ 	      time_duration one_minute(0,1,0,0);
+ 	      duration_ += one_minute;
+ 	      suiteTime_ += one_minute;
+ 	      calendarIncrement_ = one_minute;
+
+#ifdef DEBUG_CALENDAR
+         std::cout << "Calendar::update:  if (calUpdateParams.serverPollPeriod().total_seconds() < 60) { \n";
+#endif
+ 	   }
+ 	   else {
+ 	      // 1. Always Maintain phase with system clock. The calUpdateParams.timeNow()
+ 	      //    time was constructed from a system call in the server.
+ 	      //
+ 	      // Take a difference, which means we can ignore dates
+ 	      const ptime& time_now =  calUpdateParams.timeNow();
+ 	      assert(!time_now.is_special()); // This should have been set
+ 	      duration_ = time_period( initLocalTime_, time_now ).length();
+ 	      calendarIncrement_ = time_now - lastTime_;
+ 	      suiteTime_ += calendarIncrement_;
+ 	      lastTime_ = time_now;
+#ifdef DEBUG_CALENDAR
+ 	      std::cout << "Calendar::update:  if ( !startStopWithServer_ && !calUpdateParams.forTest() ) { \n";
+#endif
+ 	   }
+	}
+	else {
+		// 2. Update calendar based on server poll period/ Job submission interval
+		// _OR_ For TESTING allow calendar to be speeded up.
+	   // Note: for simulation serverPollPeriod could be 1 hour
+		duration_ += calUpdateParams.serverPollPeriod();
+		suiteTime_ += calUpdateParams.serverPollPeriod();
+		calendarIncrement_ = calUpdateParams.serverPollPeriod();
+#ifdef DEBUG_CALENDAR
+      std::cout << "Calendar::update:  calUpdateParams.serverPollPeriod() = " << calUpdateParams.serverPollPeriod() << "\n";
+#endif
+	}
+
+ 	update_cache();
+
+	// *This relies on update_cache() being called first, since it needs day_of_week_
+	// Day change required for both REAL and HYBRID. See TimeDependencies.ddoc for reason
+  	if (theDayOfWeek != day_of_week_)  dayChanged_ = true;
+ 	else                               dayChanged_ = false;
+
+	// With the hybrid calendar the date does not change
+	if ( ctype_ == Calendar::HYBRID) {
+ 		if (suiteTime_.date() != initTime_.date()) {
+
+#ifdef DEBUG_CALENDAR
+			cout << "HYBRID: (suiteTime_.date() != initTime_.date()) suiteTime_ = " << to_simple_string(suiteTime_) << "\n";
+#endif
+
+			time_duration td = suiteTime_.time_of_day();
+
+ 			suiteTime_ = ptime( initTime_.date(), td);
+
+#ifdef DEBUG_CALENDAR
+			cout << "suiteTime_ = " << to_simple_string(suiteTime_) << "\n";
+#endif
+ 		}
+ 	}
+
+#ifdef DEBUG_CALENDAR
+	cout << "   Calendar::update serverPollPeriod = " << to_simple_string(calUpdateParams.serverPollPeriod()) << " " << toString() << endl;
+#endif
+}
+
+void Calendar::update_cache() const
+{
+   // begin() has not been called yet
+   if (suiteTime_.is_special()) return;
+
+   boost::gregorian::date newDate = suiteTime_.date();
+   day_of_week_  = newDate.day_of_week().as_number();
+   day_of_year_  = newDate.day_of_year();
+   day_of_month_ = newDate.day();
+   month_        = newDate.month();
+   year_         = newDate.year();
+}
+int Calendar::day_of_week() const   { if (day_of_week_ == -1) update_cache(); return day_of_week_;}
+int Calendar::day_of_year() const   { if (day_of_week_ == -1) update_cache(); return day_of_year_;}
+int Calendar::day_of_month() const  { if (day_of_week_ == -1) update_cache(); return day_of_month_;}
+int Calendar::month() const         { if (day_of_week_ == -1) update_cache(); return month_;}
+int Calendar::year() const          { if (day_of_week_ == -1) update_cache(); return year_;}
+
+
+void Calendar::update(const boost::posix_time::time_duration& serverPollPeriod)
+{
+	CalendarUpdateParams p(serverPollPeriod);
+	update( p );
+}
+
+void Calendar::update(const boost::posix_time::ptime& time_now)
+{
+	// Used for test even though for_test is false, as we want to test that path in UNIT tests
+   // Tests: path 1. shown above. Note: we pass minutes(1), to ensure path 1. is taken
+	CalendarUpdateParams p( time_now, minutes(1), true /* server running */, false/* for Test*/ );
+	update( p );
+}
+
+boost::gregorian::date Calendar::date() const
+{
+	return suiteTime_.date();
+}
+
+/// for debug
+void Calendar::dump(const std::string& title) const
+{
+	LOG(Log::LOG,title
+	                << " duration_("   << to_simple_string(duration_)
+	                << ") initTime_("  << to_simple_string(initTime_)
+	                << ") suiteTime_(" << to_simple_string(suiteTime_) << ")"
+	);
+}
+
+std::string Calendar::toString() const
+{
+	std::stringstream ss;
+	ss << "hybrid(" << hybrid()
+     << ") duration_("   << to_simple_string(duration_)
+     << ") initTime_("  << to_simple_string(initTime_)
+     << ") suiteTime_(" << to_simple_string(suiteTime_)
+     << ") dayChanged_(" << dayChanged_ << ")";
+     ss << " calendarIncrement_(" << to_simple_string(calendarIncrement_) << ")";
+
+   if (day_of_week_ == 0) ss << " SUNDAY";
+   else if (day_of_week_ == 1) ss << " MONDAY";
+   else if (day_of_week_ == 2) ss << " TUESDAY";
+   else if (day_of_week_ == 3) ss << " WEDNESDAY";
+   else if (day_of_week_ == 4) ss << " THURSDAY";
+   else if (day_of_week_ == 5) ss << " FRIDAY";
+   else if (day_of_week_ == 6) ss << " SATURDAY";
+
+ 	return ss.str();
+}
+
+
+std::string Calendar::write_state() const
+{
+   if ( initTime_.is_special() ) return string();
+
+   bool calendarIncrement__changed = (!calendarIncrement_.is_special() && calendarIncrement_.total_seconds() != 0);
+
+   // cType is obtained from the suite clock attribute, and not persisted
+   std::stringstream ss;
+   ss << " initTime:" << to_simple_string(initTime_);
+   ss << " suiteTime:" << to_simple_string(suiteTime_);
+   ss << " duration:" << to_simple_string(duration_);
+   ss << " initLocalTime:" << to_simple_string(initLocalTime_);
+   ss << " lastTime:" << to_simple_string(lastTime_);
+   if (calendarIncrement__changed) ss << " calendarIncrement:" << to_simple_string(calendarIncrement_);
+
+   if (dayChanged_) ss << " dayChanged:" << dayChanged_;
+   return ss.str();
+}
+
+void Calendar::read_state(const std::string& line,const std::vector<std::string>& lineTokens)
+{
+   // initTime:2012-Jul-16 16:19:35 suiteTime:2012-Jul-16 16:19:35 duration:00:00:00 dayChanged:0 initLocalTime:2012-Jul-16 16:19:35 lastTime:2012-Jul-16 16:19:35 calendarIncrement:00:00:00
+//   std::cout << "Calendar::read_state:"  << line << "\n";
+   std::string time;
+   for(size_t i = 0; i < lineTokens.size(); i++) {
+      time.clear();
+      if (lineTokens[i].find("initTime:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],time)) throw std::runtime_error( "Calendar::read_state failed: (initTime)");
+         if (i + 1 < lineTokens.size()) { time += " "; time += lineTokens[i+1]; }
+         else throw std::runtime_error( "Calendar::read_state failed: 1");
+         initTime_ = time_from_string(time);
+      }
+      else if (lineTokens[i].find("suiteTime:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],time)) throw std::runtime_error( "Calendar::read_state failed: (suiteTime)");
+         if (i + 1 < lineTokens.size()) { time += " "; time += lineTokens[i+1]; }
+         else throw std::runtime_error( "Calendar::read_state failed: 1");
+         suiteTime_ = time_from_string(time);
+      }
+      else if (lineTokens[i].find("initLocalTime:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],time)) throw std::runtime_error( "Calendar::read_state failed: (initLocalTime)");
+         if (i + 1 < lineTokens.size()) { time += " "; time += lineTokens[i+1]; }
+         else throw std::runtime_error( "Calendar::read_state failed: 1");
+         initLocalTime_ = time_from_string(time);
+      }
+      else if (lineTokens[i].find("lastTime:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],time)) throw std::runtime_error( "Calendar::read_state failed: (lastTime)");
+         if (i + 1 < lineTokens.size()) { time += " "; time += lineTokens[i+1]; }
+         else throw std::runtime_error( "Calendar::read_state failed: 1");
+         lastTime_ = time_from_string(time);
+      }
+      else if (lineTokens[i].find("duration:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],time)) throw std::runtime_error( "Calendar::read_state failed: (duration)");
+         duration_ =  duration_from_string(time);
+      }
+      else if (lineTokens[i].find("calendarIncrement:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],time)) throw std::runtime_error( "Calendar::read_state failed: (calendarIncrement)");
+         calendarIncrement_ = duration_from_string(time);
+      }
+      else if (lineTokens[i] == "dayChanged:1") dayChanged_ = true;
+   }
+}
+
+bool Calendar::checkInvariants(std::string& errorMsg) const
+{
+	if (!duration_.is_special()) {
+		if (duration_.is_negative()) {
+			errorMsg += "Calendar::checkInvariants duration is negative "+ toString() + "\n";
+			return false;
+		}
+	}
+	return true;
+}
+
+boost::posix_time::ptime Calendar::second_clock_time()
+{
+	/// Chose UTC since it s compatible with boost deadline timer
+ 	return second_clock::universal_time();  // UTC
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/Calendar.hpp b/ecflow_4_0_7/ACore/src/Calendar.hpp
new file mode 100644
index 0000000..20b7675
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Calendar.hpp
@@ -0,0 +1,255 @@
+#ifndef CALENDAR_HPP_
+#define CALENDAR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #48 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : The calendar object is initialised when the suite begins.
+//               The calendar encapsulates date and time. The date is derived from the time.
+//
+// After each update the calendar will store the time_duration between the init() function
+// call and the update() function call.
+// The calendar is to be used for all reference to time and date
+// This will stop different time functionality from getting out of step.
+//
+// Examples of Use of calendar are:
+//    o Generated time variables
+//    o Time dependent attributes: TimeAttr,TodaySeries,CronAttr,DateAttr,DayAttr
+//      ****************************************************************************
+//      ** A time attribute can have a +, which means time relative to suite start
+//      ** This is stored on the TimeSeries, as it isNode/Attribute specific.
+//      ** i.e repeated families will have its own relative start time.
+//      *****************************************************************************
+//
+// DESIGN CONSIDERATIONS:
+//   Real and Hybrid:
+//   Real
+//      calendar is like a normal calendar where time and date are related
+//      and day/date changes at midnight.
+//   Hybrid:
+//      There is currently confusion about how this is supposed to work.
+//      The date is not supposed to change. (According to John date updates at suite restart?)
+//      This has important implications, i.e does the day change ?
+//      If the day does not change, then many of suites will never complete.
+//      	i.e if we use repeat, with a single time series,  "time 10:00"
+//      *** This relies on a day change to reset time attribute at midnight. ****
+//   Conclusion: Will support day change for both REAL and HYBRID (date does not change)
+//
+// Calendar Updates:
+// 	 How and when should we update the calendar?
+//   In both the approaches below we need to make a distinction/separation
+//   between the server poll and calendar update. This is required for testing
+//
+//	o Poll/Job submission interval in server is used to update calendar .
+//     +: No time slots will be missed. even if server is suspended/restarted.
+//        since suspending the server, also suspends the calendar updates
+//     +: Suite relative times will continue to work even after server stopped/started
+//     +: Avoids additional system call.
+//     +: Lead's to more deterministic behaviour
+//     -: If server is suspended and restarted the calendar will NOT be in
+//        phase with system clock. (Its not clear to me why this should be an issue?)
+//     ?: If the server is run for several days is there a possibility for the poll
+//        update to get out of skew with real time. This is only possible if
+//        job dependencies take more the 60 seconds to resolve.
+//      *** THIS FUNCTIONALITY NEEDS TO BE ADVERTISED, SO THAT USERS ARE AWARE OF IT
+//      *** THIS FUNCTIONALITY IS AVAILABLE VIA -s flag on the clock attribute .i.e
+//      *** the -s stand's for stop start clock in line with the server
+// 	        clock real 20.1.2007 +01:00 -s
+// 			clock hybrid -s
+//
+//	o Poll/Job submission interval in server is used Initiate an update of calendar via a system call.
+//     +: calendar is always in phase with system clock.
+//        Many task job dependencies depend on ordering based on real time.
+//     -: Requires additional system call for each poll in the server
+//     -: Time slots can be missed. (i.e if server suspended/restarted).
+//        There is no catch up. (?? See TimeDependencies.ddoc)
+//     -: Relative times will not be adhered too, when server stopped/started.
+//     -: Will require more manual intervention ?
+//
+//  Conclusion:: The clock attribute will be changed to add both capabilities
+//
+//  Resolution: Will support 1 minute resolution:
+//============================================================================
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/date_time/posix_time/conversion.hpp>
+#include <boost/date_time/posix_time/time_serialize.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+namespace ecf {
+
+class CalendarUpdateParams; // forward declare
+
+class Calendar  {
+public:
+	enum Clock_t {
+		REAL,       // like a normal clock
+		HYBRID      // date does not change, but will support day change. See Above.
+	};
+
+	/// Defaults to the REAL clock
+	Calendar();
+	Calendar(const Calendar&);
+	Calendar& operator=( const Calendar&);
+	bool operator==( const Calendar&) const;
+
+	/// Initialise the Calendar.
+	/// The boolean startStopWithServer allows us to choose how we update the calendar:
+	//      False: Use system time to update the calendar:
+	//      True : Use the server poll, to update the calendar
+  	void init(Clock_t clock, bool startStopWithServer = false);
+
+   // for test init and begin calendar
+   void init(const boost::posix_time::ptime& time, Clock_t clock = Calendar::REAL, bool startStopWithServer = false);
+
+   /// Start the Calendar.  Parameter time can include gain.
+   void begin(const boost::posix_time::ptime& time);
+
+	/// Update the calendar using the input. Will Store internally the time duration
+	/// between the init() function call and the last update.
+ 	/// The for_test parameter is *ONLY* used if we are using real time calendar
+  	void update(const ecf::CalendarUpdateParams &);
+
+  	// Used for test only, will call the function above
+  	void update(const boost::posix_time::time_duration&);
+  	void update(const boost::posix_time::ptime& time_now);
+
+	// The following were added as a performance optimisation
+   // Represent a day within a week (range 0==Sun to 6==Sat)
+	int day_of_week() const;  // same as suiteTime().date().day_of_week().as_number()
+	int day_of_year() const;  // same as suiteTime().date().day_of_year()
+	int day_of_month() const; // same as suiteTime().date().day()
+	int month() const;        // same as suiteTime().date().month()
+	int year() const;         // same as suiteTime().date().year()
+
+	/// returns true if the day changed, this will update for REAL and HYBRID .
+  	bool dayChanged() const { return dayChanged_;}
+
+  	/// returns the last calendar increment
+	const boost::posix_time::time_duration& calendarIncrement() const { return calendarIncrement_;}
+
+ 	/// return the init() time + the accumulated duration from calls to update(...)
+  	/// This should only be used when this calendar is real.
+ 	const boost::posix_time::ptime& suiteTime() const { return suiteTime_;}
+
+ 	// duration since last call to init, essentially suite duration
+	const boost::posix_time::time_duration& duration() const { return duration_;}
+
+	/// return real time, when the calendar was begun/initialised.
+	/// This is used to update the duration_, which is recorded for each state change in the node
+	/// Hence to when we can compute when a state change occurred by using:
+	///   boost::posix_time::ptime time_of_state_change = begin_time() + node->get_state().second(duration)
+   const boost::posix_time::ptime& begin_time() const { return initLocalTime_;}
+
+ 	/// return the date, for real calendar this corresponds to the date on suiteTime_
+ 	/// for hybrid,  the date does not change, and hence we return date for initTime_
+	boost::gregorian::date date() const;
+
+ 	/// The calendar type. For hybrid clocks the date does not update.
+	bool hybrid() const { return (ctype_ == Calendar::HYBRID) ?  true : false; }
+
+	/// for debug,  must link with boost date and time library
+	void dump(const std::string& title) const;
+
+	/// for debug,  must link with boost date and time library
+	std::string toString() const;
+
+	std::string write_state() const;
+   void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
+
+	bool checkInvariants(std::string& errorMsg) const;
+
+	// allow Suite memento to update calendar type
+	void set_clock_type( Clock_t  ct) { ctype_ = ct;}
+
+	/// Will return either second_clock::universal_time()/UTC ( the other alternative is second_clock::local_time() )
+	/// This is because boost deadline timer is based on UTC clock
+	/// >>> The deadline_timer typedef is based on a UTC clock, and all operations (expires_at, expires_from_now) work in UTC time.
+	/// >>> If you want it to use a different clock (such as the local time clock), you can use basic_deadline_timer<> with your own traits class.
+	/// >>> Please see the "Timers" example.
+	/// Taken from boost date/time doc
+  	/// If you want exact agreement with wall-clock time, you must use either UTC or local time. If you compute a duration
+	//	by subtracting one UTC time from another and you want an answer accurate to the second, the two times must not be
+	//	too far in the future because leap seconds affect the count but are only determined about 6 months in advance. With
+	//	local times a future duration calculation could be off by an entire hour, since legislatures can and do change DST
+	//	rules at will.
+	//	If you want to handle wall-clock times in the future, you won't be able (in the general case) to calculate exact durations,
+	//	for the same reasons described above.
+	//	If you want accurate calculations with future times, you will have to use TAI or an equivalent, but the mapping from
+	//	TAI to UTC or local time depends on leap seconds, so you will not have exact agreement with wall-clock time.
+	static boost::posix_time::ptime second_clock_time();
+
+
+private:
+	void assign( const Calendar& rhs);
+
+	Clock_t                          ctype_;      // *NOT* persisted: can be derived from suite clock attribute
+ 	boost::posix_time::ptime         initTime_;   // When calendar was started, suite time(could be in the past OR real time)
+ 	boost::posix_time::ptime         suiteTime_;  // The suite time for hybrid DATE does not change.
+	boost::posix_time::time_duration duration_;   // duration since last call to init/begin, used on Node for late and autocancel
+ 	bool                             dayChanged_;
+ 	bool                             startStopWithServer_; //*NOT* persisted: false means real time calendar,  can be derived from suite clock attribute
+
+  	boost::posix_time::ptime         initLocalTime_;   // Real Time: When calendar was started, used to work out duration_
+ 	boost::posix_time::ptime         lastTime_;        // Real Time: Used to calculate calendarIncrement
+
+	boost::posix_time::time_duration calendarIncrement_;
+
+private:
+   void update_cache() const;
+	mutable int day_of_week_;  // Cache
+	mutable int day_of_year_;  // Cache
+	mutable int day_of_month_; // Cache
+	mutable int month_;        // Cache
+	mutable int year_;         // Cache
+
+private:
+	// Note: The *only* reason to serialise the calendar is so that we can support
+	// why() command on the client side. By default calendar is initialised in the *server*
+	// at begin time, from the clock attribute
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/)
+	{
+	   if (Archive::is_saving::value) {
+	      if ( initTime_.is_special() ) {
+	         // Initialise the ptimes to avoid serialisation exceptions
+	         // The serialisation of ptime makes use of exceptions, especially
+	         // when dealing with a date that has *not* been initialised.
+	         // To avoid this we take a small hit to initialise the calendar with
+	         // time now. This will get overriden with suite clock at begin
+	         begin(second_clock_time());
+	      }
+	   }
+
+	   ar & initTime_;
+	   ar & suiteTime_;
+	   ar & duration_;
+	   ar & dayChanged_;
+	   ar & initLocalTime_;
+	   ar & lastTime_;
+	   ar & calendarIncrement_;
+	}
+};
+}
+
+
+// eliminate serialization overhead at the cost of
+// never being able to increase the version.
+BOOST_CLASS_IMPLEMENTATION(ecf::Calendar, boost::serialization::object_serializable)
+
+// eliminate object tracking (even if serialized through a pointer)
+// at the risk of a programming error creating duplicate objects.
+BOOST_CLASS_TRACKING(ecf::Calendar,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/CalendarUpdateParams.hpp b/ecflow_4_0_7/ACore/src/CalendarUpdateParams.hpp
new file mode 100644
index 0000000..ab37454
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/CalendarUpdateParams.hpp
@@ -0,0 +1,71 @@
+#ifndef CALENDARUPDATEPARAMS_HPP_
+#define CALENDARUPDATEPARAMS_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Collate Argument list to update calendar
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+
+#include <boost/noncopyable.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+namespace ecf {
+
+class CalendarUpdateParams : private boost::noncopyable {
+public:
+
+	// For use in the server
+ 	CalendarUpdateParams(const boost::posix_time::ptime& time_now,
+	                     const boost::posix_time::time_duration& serverPollPeriod,
+	                     bool serverRunning)
+ 	: timeNow_(time_now),
+ 	  serverPollPeriod_(serverPollPeriod),
+ 	  serverRunning_( serverRunning ),
+ 	  forTest_( false )
+ 	  {}
+
+
+	// For use in the simulator/ unit tests
+ 	CalendarUpdateParams(const boost::posix_time::time_duration& serverPollPeriod)
+	: timeNow_( boost::date_time::not_a_date_time),
+ 	  serverPollPeriod_(serverPollPeriod),
+ 	  serverRunning_( true ),
+ 	  forTest_( true )
+ 	  {}
+
+ 	// For use in test
+ 	CalendarUpdateParams(const boost::posix_time::ptime& time_now,
+	                     const boost::posix_time::time_duration& serverPollPeriod,
+	                     bool serverRunning,
+	                     bool forTest)
+ 	: timeNow_(time_now),
+ 	  serverPollPeriod_(serverPollPeriod),
+ 	  serverRunning_( serverRunning ),
+ 	  forTest_( forTest )
+ 	  {}
+
+ 	const boost::posix_time::ptime& timeNow() const { return timeNow_;}
+ 	const boost::posix_time::time_duration& serverPollPeriod() const { return serverPollPeriod_;}
+ 	bool serverRunning() const { return serverRunning_; }
+ 	bool forTest()       const { return forTest_;}
+
+private:
+  	boost::posix_time::ptime         timeNow_;         // Current time and date, not used in simulator
+	boost::posix_time::time_duration serverPollPeriod_; // equivalent to calendar increment
+	bool                             serverRunning_;    // Is the server running or stopped
+	bool                             forTest_;         // Used with Simulator
+};
+}
+#endif /* CALENDARUPDATEPARAMS_HPP_ */
diff --git a/ecflow_4_0_7/ACore/src/CheckPt.hpp b/ecflow_4_0_7/ACore/src/CheckPt.hpp
new file mode 100644
index 0000000..b7881a7
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/CheckPt.hpp
@@ -0,0 +1,42 @@
+#ifndef CHECKPT_HPP_
+#define CHECKPT_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+// This class is used to ONLY serialise the edit history when check pointing
+// Also Provides enums for check pointing
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+class CheckPt : private boost::noncopyable {
+public:
+   /// NEVER   - the check pt file is never saved
+   /// ON_TIME - the check pt file is saved periodically. specified by checkPtInterval.
+   /// ALWAYS  - the check pt file is saved after any state change
+   /// UNDEFINED   - Internal use only
+   enum Mode { NEVER, ON_TIME, ALWAYS, UNDEFINED};
+
+   /// The interval between automatic saves of check point by server
+   static int default_interval() { return 120;}
+
+   /// If saving check point takes longer than the alarm time, raise late flag on the server
+   static int default_save_time_alarm() { return 30;}
+
+private:
+   CheckPt();
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Child.cpp b/ecflow_4_0_7/ACore/src/Child.cpp
new file mode 100644
index 0000000..15f3060
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Child.cpp
@@ -0,0 +1,167 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Specifies the different kinds of child commands
+//               These are specified in the job file, and communicate with the server
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <assert.h>
+
+#include "Child.hpp"
+#include "Str.hpp"
+
+namespace ecf {
+
+std::string Child::to_string(Child::ZombieType zt)
+{
+	switch (zt) {
+		case Child::USER: return "user"; break;
+		case Child::PATH: return "path"; break;
+		case Child::ECF: return "ecf"; break;
+		case Child::NOT_SET: return "not_set"; break;
+	}
+	return std::string();
+}
+
+Child::ZombieType Child::zombie_type(const std::string& s)
+{
+	if (s == "user") return Child::USER;
+	if (s == "ecf") return Child::ECF;
+	if (s == "path") return Child::PATH;
+	return Child::NOT_SET;
+}
+
+bool Child::valid_zombie_type( const std::string& s)
+{
+	if (s == "user") return true;
+	if (s == "ecf") return true;
+	if (s == "path") return true;
+	return false;
+}
+
+std::string Child::to_string(const std::vector<Child::CmdType>& vec)
+{
+	std::string ret;
+	for(size_t i =0; i < vec.size(); ++i) {
+		if (i == 0) ret += to_string(vec[i]);
+		else {
+			ret += ",";
+			ret += to_string(vec[i]);
+		}
+	}
+	return ret;
+}
+
+std::string Child::to_string( Child::CmdType ct)
+{
+	switch (ct) {
+		case Child::INIT: return "init"; break;
+		case Child::EVENT: return "event"; break;
+		case Child::METER: return "meter"; break;
+		case Child::LABEL: return "label"; break;
+		case Child::WAIT: return "wait"; break;
+		case Child::ABORT: return "abort"; break;
+		case Child::COMPLETE: return "complete"; break;
+	}
+	assert(false);
+	return "init";
+}
+
+std::vector<Child::CmdType> Child::child_cmds(const std::string& s)
+{
+	// expect single or , separated tokens
+	std::vector<std::string> tokens;
+	Str::split(s,tokens,",");
+	std::vector<Child::CmdType> ret; ret.reserve(tokens.size());
+	for(size_t i =0; i < tokens.size(); ++i) {
+		ret.push_back(child_cmd(tokens[i]));
+	}
+	return ret;
+}
+
+Child::CmdType Child::child_cmd( const std::string& s)
+{
+	if (s == "init") return Child::INIT;
+	if (s == "event") return Child::EVENT;
+	if (s == "meter") return Child::METER;
+	if (s == "label") return Child::LABEL;
+	if (s == "wait") return Child::WAIT;
+	if (s == "abort") return Child::ABORT;
+	if (s == "complete") return Child::COMPLETE;
+	assert(false);
+ 	return Child::INIT;
+}
+
+bool Child::valid_child_cmds( const std::string& s)
+{
+	// empty means all children
+	if (s.empty()) return true;
+
+	// expect single or , separated tokens
+	std::vector<std::string> tokens;
+	Str::split(s,tokens,",");
+	for(size_t i =0; i < tokens.size(); ++i) {
+		if (!valid_child_cmd(tokens[i])) return false;
+	}
+	return true;
+}
+
+bool Child::valid_child_cmd( const std::string& s)
+{
+	if (s == "init") return true;
+	if (s == "event") return true;
+	if (s == "meter") return true;
+	if (s == "label") return true;
+	if (s == "wait") return true;
+	if (s == "abort") return true;
+	if (s == "complete") return true;
+ 	return false;
+}
+
+//=====================================================================
+
+bool User::valid_user_action( const std::string& s)
+{
+	if (s == "fob") return true;
+	if (s == "fail") return true;
+	if (s == "adopt") return true;
+	if (s == "remove") return true;
+   if (s == "block") return true;
+   if (s == "kill") return true;
+ 	return false;
+}
+
+User::Action User::user_action( const std::string& s)
+{
+	if (s == "fob") return User::FOB;
+	if (s == "fail") return User::FAIL;
+	if (s == "adopt") return User::ADOPT;
+	if (s == "remove") return User::REMOVE;
+   if (s == "block") return User::BLOCK;
+   if (s == "kill") return User::KILL;
+ 	return User::BLOCK;
+}
+
+std::string User::to_string(User::Action uc)
+{
+	switch (uc) {
+ 		case User::FOB:  return "fob"; break;
+ 		case User::FAIL: return "fail"; break;
+ 		case User::ADOPT: return "adopt"; break;
+ 		case User::REMOVE: return "remove"; break;
+      case User::BLOCK: return "block"; break;
+      case User::KILL: return "kill"; break;
+  	}
+	assert(false);
+ 	return std::string();
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/Child.hpp b/ecflow_4_0_7/ACore/src/Child.hpp
new file mode 100644
index 0000000..0e27676
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Child.hpp
@@ -0,0 +1,61 @@
+#ifndef CHILD_HPP_
+#define CHILD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Specifies the different kinds of child commands
+//               These are specified in the job file, and communicate with the server
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <vector>
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+class Child : private boost::noncopyable {
+public:
+	enum CmdType    { INIT, EVENT, METER, LABEL, WAIT, ABORT, COMPLETE };
+
+	enum ZombieType { USER, ECF, PATH , NOT_SET };
+
+	static std::string to_string(ZombieType);
+	static bool valid_zombie_type( const std::string& );
+	static ZombieType zombie_type( const std::string&);
+
+	static std::string to_string(const std::vector<Child::CmdType>&);
+	static std::string to_string( Child::CmdType );
+	static std::vector<Child::CmdType> child_cmds(const std::string&);
+	static Child::CmdType child_cmd(const std::string&);
+
+	/// Expect a , separated string
+	static bool valid_child_cmds( const std::string& );
+	static bool valid_child_cmd( const std::string& );
+
+private:
+	Child();
+};
+
+
+class User : private boost::noncopyable {
+public:
+	enum Action   { FOB, FAIL, ADOPT, REMOVE, BLOCK, KILL };
+
+	static bool valid_user_action( const std::string& );
+	static Action user_action( const std::string& );
+	static std::string to_string(Action);
+
+private:
+	User();
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/DState.cpp b/ecflow_4_0_7/ACore/src/DState.cpp
new file mode 100644
index 0000000..d2e37d1
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/DState.cpp
@@ -0,0 +1,136 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+#include <iostream>
+#include "DState.hpp"
+#include "Ecf.hpp"
+
+void DState::setState( State s ) {
+	state_= s;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "DState::setState\n";
+#endif
+}
+
+NState::State DState::convert(DState::State display_state)
+{
+	switch (display_state) {
+		case DState::UNKNOWN:  return NState::UNKNOWN; break;
+		case DState::COMPLETE:  return NState::COMPLETE; break;
+		case DState::SUSPENDED: return NState::UNKNOWN; break;
+		case DState::QUEUED:    return NState::QUEUED; break;
+		case DState::ABORTED:   return NState::ABORTED; break;
+		case DState::SUBMITTED: return NState::SUBMITTED; break;
+		case DState::ACTIVE:    return NState::ACTIVE; break;
+	}
+	return NState::UNKNOWN;
+}
+
+const char* DState::toString( DState::State s ) {
+	switch ( s ) {
+		case DState::UNKNOWN:
+			return "unknown";
+			break;
+		case DState::COMPLETE:
+			return "complete";
+			break;
+		case DState::QUEUED:
+			return "queued";
+			break;
+		case DState::ABORTED:
+			return "aborted";
+			break;
+		case DState::SUBMITTED:
+			return "submitted";
+			break;
+		case DState::SUSPENDED:
+			return "suspended";
+			break;
+		case DState::ACTIVE:
+			return "active";
+			break;
+		default:
+			assert(false);break;
+	}
+	assert(false);
+	return NULL;
+}
+
+DState::State DState::toState( const std::string& str ) {
+	if ( str == "complete" )
+		return DState::COMPLETE;
+	if ( str == "unknown" )
+		return DState::UNKNOWN;
+	if ( str == "queued" )
+		return DState::QUEUED;
+	if ( str == "aborted" )
+		return DState::ABORTED;
+	if ( str == "submitted" )
+		return DState::SUBMITTED;
+	if ( str == "suspended" )
+		return DState::SUSPENDED;
+	if ( str == "active" )
+		return DState::ACTIVE;
+	assert(false);
+	return DState::UNKNOWN;
+}
+
+bool DState::isValid( const std::string& state ) {
+	if ( state == "complete" )
+		return true;
+	if ( state == "suspended" )
+		return true;
+	if ( state == "unknown" )
+		return true;
+	if ( state == "aborted" )
+		return true;
+	if ( state == "submitted" )
+		return true;
+	if ( state == "active" )
+		return true;
+	if ( state == "queued" )
+		return true;
+	return false;
+}
+
+std::vector< std::string > DState::allStates() {
+	std::vector< std::string > vec;
+	vec.reserve( 7 );
+	vec.push_back( "complete" );
+	vec.push_back( "unknown" );
+	vec.push_back( "queued" );
+	vec.push_back( "aborted" );
+	vec.push_back( "submitted" );
+	vec.push_back( "suspended" );
+	vec.push_back( "active" );
+	return vec;
+}
+
+std::vector<DState::State> DState::states()
+{
+	std::vector< DState::State > vec;
+	vec.reserve( 7 );
+	vec.push_back( DState::UNKNOWN    );
+	vec.push_back( DState::COMPLETE   );
+	vec.push_back( DState::QUEUED     );
+	vec.push_back( DState::ABORTED    );
+	vec.push_back( DState::SUBMITTED  );
+	vec.push_back( DState::ACTIVE     );
+	vec.push_back( DState::SUSPENDED  );
+	return vec;
+}
+
diff --git a/ecflow_4_0_7/ACore/src/DState.hpp b/ecflow_4_0_7/ACore/src/DState.hpp
new file mode 100644
index 0000000..2247b13
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/DState.hpp
@@ -0,0 +1,72 @@
+#ifndef DSTATE_HPP_
+#define DSTATE_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <vector>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include "NState.hpp"
+
+// DState: stores the state of a node.
+// *The class DState just used to define the enum, however we also
+// needed to know when the state changed. Hence the use of state_change_no
+// Uses default copy constructor and destructor, and equality
+class DState {
+public:
+   enum State { UNKNOWN =0, COMPLETE=1,  QUEUED=2, ABORTED=3, SUBMITTED=4, ACTIVE=5, SUSPENDED=6};
+	DState(State s): state_(s), state_change_no_(0) {}
+	DState(): state_(QUEUED),state_change_no_(0) {}
+
+	State state() const { return state_;}
+	void setState(State);
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+	bool operator==(const DState& rhs) const { return state_ == rhs.state_;}
+	bool operator!=(const DState& rhs) const { return state_ != rhs.state_;}
+	bool operator==(State s) const { return s == state_;}
+	bool operator!=(State s) const { return s != state_;}
+
+	static DState::State default_state() { return DState::QUEUED; }
+	static NState::State convert(DState::State);
+	static const char* toString(DState::State s);
+	static const char* toString(const DState& ns) { return toString(ns.state());}
+	static DState::State toState(const std::string& state);
+	static bool isValid(const std::string& state);
+	static std::vector<std::string> allStates();
+	static std::vector<DState::State> states();
+
+private:
+	State state_;
+	unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+    friend class boost::serialization::access;
+    template<class Archive>
+    void serialize(Archive & ar, const unsigned int /*version*/)
+    {
+        ar & state_;
+    }
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(DState, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(DState,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/DurationTimer.hpp b/ecflow_4_0_7/ACore/src/DurationTimer.hpp
new file mode 100644
index 0000000..1680fc1
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/DurationTimer.hpp
@@ -0,0 +1,39 @@
+#ifndef DURATIONTIMER_HPP_
+#define DURATIONTIMER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple class the reports wall clock time duration
+//============================================================================
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+namespace ecf {
+
+class DurationTimer {
+public:
+	DurationTimer() : start_time_(boost::posix_time::microsec_clock::universal_time()) {}
+	~DurationTimer() {}
+
+	int duration() const {
+		boost::posix_time::time_duration duration = boost::posix_time::microsec_clock::universal_time() - start_time_;
+		return duration.total_seconds();
+	}
+
+	boost::posix_time::time_duration elapsed() const { return boost::posix_time::microsec_clock::universal_time() - start_time_;}
+
+private:
+ 	boost::posix_time::ptime start_time_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Ecf.cpp b/ecflow_4_0_7/ACore/src/Ecf.cpp
new file mode 100644
index 0000000..be63d17
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Ecf.cpp
@@ -0,0 +1,66 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Provides globals used by server
+//============================================================================
+
+#include "Ecf.hpp"
+
+bool Ecf::server_ =  false;
+bool Ecf::debug_equality_ = false;
+unsigned int Ecf::debug_level_ = 0;
+unsigned int Ecf::state_change_no_ = 0;
+unsigned int Ecf::modify_change_no_ = 0;
+
+const char* Ecf::SERVER_NAME() { static const char* SERVER_NAME = "ecflow_server"; return SERVER_NAME;}
+const char* Ecf::CLIENT_NAME() { static const char* CLIENT_NAME = "ecflow_client"; return CLIENT_NAME;}
+
+const std::string& Ecf::LOG_FILE() { static const std::string LOG_FILE = "ecf.log"; return LOG_FILE;}
+const std::string& Ecf::CHECKPT() { static const std::string CHECKPT= "ecf.check"; return CHECKPT;}
+const std::string& Ecf::BACKUP_CHECKPT() { static const std::string BACKUP_CHECKPT= "ecf.check.b";return BACKUP_CHECKPT;}
+const std::string& Ecf::MICRO() { static const std::string MICRO= "%";return MICRO;}
+const std::string& Ecf::JOB_CMD() { static const std::string JOB_CMD= "%ECF_JOB% 1> %ECF_JOBOUT% 2>&1";return JOB_CMD;}
+const std::string& Ecf::KILL_CMD() { static const std::string KILL_CMD= "kill -15 %ECF_RID%";return KILL_CMD;}     // "${ECF_KILL:=/home/ma/emos/bin/ecfkill}   %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.kill 2>&1";
+const std::string& Ecf::STATUS_CMD() { static const std::string STATUS_CMD= "ps --sid %ECF_RID% -f";return STATUS_CMD;}// "${ECF_STAT:=/home/ma/emos/bin/ecfstatus} %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.stat 2>&1";
+const std::string& Ecf::URL_CMD() { static const std::string URL_CMD= "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'";return URL_CMD;}
+const std::string& Ecf::URL_BASE() { static const std::string URL_BASE= "https://software.ecmwf.int";return URL_BASE;}
+const std::string& Ecf::URL() { static const std::string URL = "wiki/display/ECFLOW/Home";return URL;}
+
+
+unsigned int Ecf::incr_state_change_no() {
+	if ( server_ ) {
+		return ++state_change_no_;
+	}
+	return state_change_no_;
+}
+
+unsigned int Ecf::incr_modify_change_no() {
+
+	if ( server_ ) {
+		return ++modify_change_no_;
+	}
+	return modify_change_no_;
+}
+
+// =======================================================
+
+EcfPreserveChangeNo::EcfPreserveChangeNo()
+: state_change_no_(Ecf::state_change_no()),
+  modify_change_no_(Ecf::modify_change_no())
+{}
+
+EcfPreserveChangeNo::~EcfPreserveChangeNo()
+{
+	Ecf::set_state_change_no(state_change_no_);
+	Ecf::set_modify_change_no(modify_change_no_);
+}
+
diff --git a/ecflow_4_0_7/ACore/src/Ecf.hpp b/ecflow_4_0_7/ACore/src/Ecf.hpp
new file mode 100644
index 0000000..1338140
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Ecf.hpp
@@ -0,0 +1,92 @@
+#ifndef ECF_HPP_
+#define ECF_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Provides globals used by server for determining change
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <string>
+
+// class Ecf: This class is used in the server to determine incremental changes
+//            to the data model. Each Node/attribute stores a state change no
+//            When ever there is a change, we increment local state change
+//            number with this global.
+// When making large scale changes, ie nodes added or deleted we use modify change no
+// Note: The client will need to at some point copy over the full defs
+//       at this point the state change no add modify number is also copied.
+//       The client passes these two number back to server, the server then
+//       uses these two numbers to determine what's changed.
+//
+class Ecf : private boost::noncopyable {
+public:
+	/// Increment and then return state change no
+	static unsigned int incr_state_change_no() ;
+	static unsigned int state_change_no() { return state_change_no_; }
+	static void set_state_change_no(unsigned int x) { state_change_no_ = x;}
+
+	/// The modify_change_no_ is used for node addition and deletion and re-ordering
+	static unsigned int incr_modify_change_no();
+ 	static unsigned int modify_change_no() { return modify_change_no_; }
+	static void set_modify_change_no(unsigned int x) { modify_change_no_ = x;}
+
+	/// Returns true if we are on the server side.
+	/// Only in server side do we increment state/modify numbers
+	/// Also used in debug/test: Allows print to add know if in server/client
+	static bool server() { return server_;}
+
+	/// Should only be set by the server, made public so that testing can also set it
+   /// Only in server side do we increment state/modify numbers
+	static void set_server(bool f) { server_ = f;}
+
+	static bool debug_equality() { return debug_equality_;}
+	static void set_debug_equality(bool f) { debug_equality_ = f;}
+
+	// ECFLOW-99
+   static unsigned int debug_level() { return debug_level_;}
+   static void set_debug_level(unsigned int level) { debug_level_ = level;}
+
+   static const char* SERVER_NAME();
+   static const char* CLIENT_NAME();
+
+   static const std::string& LOG_FILE();
+   static const std::string& CHECKPT();
+   static const std::string& BACKUP_CHECKPT();
+   static const std::string& MICRO();
+   static const std::string& JOB_CMD();
+   static const std::string& KILL_CMD();
+   static const std::string& STATUS_CMD();
+   static const std::string& URL_CMD();
+   static const std::string& URL_BASE();
+   static const std::string& URL();
+
+private:
+
+	Ecf(){}
+	static bool server_;
+	static bool debug_equality_;
+   static unsigned int debug_level_;
+   static unsigned int state_change_no_;
+	static unsigned int modify_change_no_;
+};
+
+/// Make sure the Ecf number don't change
+class EcfPreserveChangeNo {
+public:
+	EcfPreserveChangeNo();
+	~EcfPreserveChangeNo();
+private:
+	unsigned int state_change_no_;
+	unsigned int modify_change_no_;
+};
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Extract.cpp b/ecflow_4_0_7/ACore/src/Extract.cpp
new file mode 100644
index 0000000..26e2846
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Extract.cpp
@@ -0,0 +1,125 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/lexical_cast.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "Extract.hpp"
+#include "Stl.hpp"
+#include "Str.hpp"
+
+#include <sstream>
+#include <fstream>
+
+//#define DEBUG_PARSER 1
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+using namespace boost::gregorian;
+
+template<class T>
+ostream& operator<<(ostream& os, const vector<T>& v) {
+    copy(v.begin(), v.end(), ostream_iterator<T>(cout, ","));
+    return os;
+}
+
+bool Extract::pathAndName(const std::string& token, std::string& path, std::string& name)
+{
+//	cout << "Extract::pathAndName  token = " << token << "\n";
+	// can have:
+	//            /suite/family:obj      path = /suite/family   name = obj
+	//            /suite/family          path = /suite/family   name =
+	//            obj                    path =                 name = obj
+	if (token.empty()) return false;
+
+	size_t colonPos = token.find_first_of(':');
+	if (colonPos == string::npos) {
+		if (token[0] == '/') {
+			path = token;       // token of the form /a/b/c, ie no name
+		}
+		else {
+			name = token;
+		}
+	}
+	else {
+		path = token.substr(0,colonPos);
+		name = token.substr(colonPos+1);
+	}
+
+//	cout << "Extract::pathAndName token=" << token << " path= '" << path << "' name= '" << name << "'\n";
+    return true;
+}
+
+bool Extract::split_get_second(const std::string& str, std::string& ret,char separator)
+{
+   // HH:MM
+   // return MM;
+   size_t colonPos = str.find_first_of(separator);
+   if (colonPos == string::npos)  return false;
+   ret = str.substr(colonPos+1);
+   return true;
+}
+
+/// extract integer or throw an std::runtime exception on failure
+int Extract::theInt( const std::string& token, const std::string& errorMsg )
+{
+	int the_int = -1;
+	try {
+		the_int = boost::lexical_cast< int >( token );
+	}
+	catch ( boost::bad_lexical_cast& e ) {
+		throw std::runtime_error(errorMsg );
+	}
+	return the_int;
+}
+
+/// extract YMD, integer of the form yyyymmdd
+int Extract::ymd(const std::string& ymdToken,  std::string& errorMsg)
+{
+	if (ymdToken.size() != 8) throw std::runtime_error( errorMsg + " YMD must be 8 characters i.e yyyymmdd");
+
+	// Use date lib to check YMD
+	try { boost::gregorian::date(from_undelimited_string(ymdToken)); }
+	catch (std::exception& e) {
+		errorMsg += "\n";
+		errorMsg += e.what();
+		throw std::runtime_error( errorMsg + " YMD is not a valid date" );
+	}
+
+	return theInt(ymdToken,errorMsg);
+}
+
+int Extract::optionalInt(      const std::vector<std::string>& lineTokens,
+                               int pos,
+                               int defaultValue,
+                               const std::string& errorMsg )
+{
+	// token0 token1 token2 token3   size = 4
+	// pos0   pos1   pos2   pos3
+	//
+	// could have line of the form
+	// repeat integer variable 1 2 #a comment
+	// repeat integer variable 3 4 # a comment
+	// hence we must check the first character, and not the complete token
+
+	int the_int = defaultValue;
+	if (static_cast<int>(lineTokens.size()) >= pos+1 && lineTokens[pos][0] != '#' ) {
+
+		the_int = theInt(lineTokens[pos],errorMsg);
+	}
+	return the_int;
+}
diff --git a/ecflow_4_0_7/ACore/src/Extract.hpp b/ecflow_4_0_7/ACore/src/Extract.hpp
new file mode 100644
index 0000000..0ce395f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Extract.hpp
@@ -0,0 +1,57 @@
+#ifndef EXTRACT_HPP_
+#define EXTRACT_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <vector>
+#include <boost/noncopyable.hpp>
+
+class Extract : private boost::noncopyable {
+public:
+
+	// token if of the form:
+	//    /path/to/home:obj        OR    obj
+	//    path = /path/to/home           path = ""
+	//    name = obj                     name = obj
+	// return true for ok or false for error
+	static bool pathAndName(const std::string& token, std::string& path, std::string& name);
+
+   // Given str = HH:MM
+   // return MM;
+	static bool split_get_second(const std::string& str, std::string& ret,char separator = ':');
+
+	/// extract integer or throw an std::runtime_error on failure,
+	/// the error message passed in is used to configure the returned exception
+	static int theInt(const std::string& token,const std::string& errorContext) ;
+
+	/// extract YMD, integer of the form yyyymmdd, will throw std::runtime_error on failure
+	/// the error message passed in is used to configure the returned exception
+	static int ymd(const std::string& token, std::string& errorContext);
+
+	/// extract optional int, else return -1
+	/// the error message passed in is used to configure the returned exception
+	// could have line of the form
+	// repeat integer variable 1 2 #a comment
+	// repeat integer variable 3 4 # a comment
+	// hence we must check the first character, and not the complete token
+	static int optionalInt(const std::vector<std::string>& lineTokens,
+	                       int pos,int defaultvalue,const std::string& errorContext);
+private:
+	Extract();
+};
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/File.cpp b/ecflow_4_0_7/ACore/src/File.cpp
new file mode 100644
index 0000000..53bc3cf
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/File.cpp
@@ -0,0 +1,984 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #70 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class
+//============================================================================
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include "boost/filesystem.hpp"
+#include "boost/filesystem/operations.hpp"
+#include <boost/token_functions.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/foreach.hpp>
+#include <boost/tokenizer.hpp>
+
+
+#include "File.hpp"
+#include "File_r.hpp"
+#include "Log.hpp"
+#include "NodePath.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace boost;
+namespace fs = boost::filesystem;
+
+//#define DEBUG_SERVER_PATH 1
+//#define DEBUG_CLIENT_PATH 1
+
+static std::string workspace_dir()
+{
+   // We need the *SAME* location so that different process find the same file. Get to the workspace directory
+   boost::filesystem::path current_path = boost::filesystem::current_path();
+   std::string stem = current_path.stem().string();
+   int count = 0;
+   while( stem.find("ecflow") == std::string::npos) {
+      current_path = current_path.parent_path();
+      stem = current_path.stem().string();
+      count++;
+      if (count == 10000) throw std::runtime_error("File::workspace_dir() failed to find ecflow in a directory name, up the directory tree");
+   }
+   std::string the_workspace_dir = current_path.string();  // cos string is returned by reference
+   return the_workspace_dir;
+}
+
+
+namespace ecf {
+
+size_t File::MAX_LINES() { return 10000; }
+const std::string& File::JOB_EXTN() { static const std::string JOB_EXTN = ".job"; return JOB_EXTN; }
+const std::string& File::MAN_EXTN() { static const std::string MAN_EXTN = ".man"; return MAN_EXTN; }
+const std::string& File::USR_EXTN() { static const std::string USR_EXTN = ".usr"; return USR_EXTN; }
+const std::string& File::ECF_EXTN() { static const std::string ECF_EXTN = ".ecf"; return ECF_EXTN; }
+
+std::string File::getExt(const std::string& s)
+{
+	size_t i = s.rfind('.',s.length());
+	if (i != std::string::npos) {
+		return s.substr(i+1);
+	}
+	return string();
+}
+
+void File::replaceExt(std::string& file, const std::string& newExt)
+{
+	string::size_type i = file.rfind('.',file.length());
+	if (i != string::npos)  file.replace(i+1,newExt.length(), newExt);
+}
+
+bool File::splitFileIntoLines(const std::string& filename, std::vector<std::string>& lines,bool ignoreEmptyLine)
+{
+   std::ifstream the_file(filename.c_str(),std::ios_base::in);
+  	if ( !the_file )  return false;
+	lines.reserve(lines.size() + 100);
+
+	// Note if we use: while( getline( theEcfFile, line)), then we will miss the *last* *empty* line
+
+//	int i = 0;
+  	string line;
+	while ( std::getline(the_file,line) ) {
+//		i++;
+//		cout << i << ": " << line << "\n";
+		if (ignoreEmptyLine && line.empty()) continue;
+ 		lines.push_back(line);
+	}
+
+//	 METHOD1
+//	 Note Another way to split lines of a file was to use a tokenizer.
+//	 Much slower ~ 2.5 slower,
+//	ifstream ifs(filename.c_str());
+//	if (!ifs) return false;
+//
+//	// Note: ss.str() returns a temporary std::string.
+//	// boost::tokenizer stores a reference to the string.
+//	// The temporary string is destroyed and tokenizer is left with a dangling reference.
+//	// hence take a copy
+//	std::stringstream ss;  ss << ifs.rdbuf();  // Read the whole file into a string
+//	std::string theFileAsString = ss.str();    // take a copy as ss.str() returns a temporary
+//	//                                         // while tokenizer stores a reference
+//	if (ignoreEmptyLine) {
+//	   char_separator<char> sep("\n",0,boost::drop_empty_tokens);
+//	   typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+//	   tokenizer tokens(theFileAsString, sep);
+//	   std::copy(tokens.begin(), tokens.end(), back_inserter(lines));
+//	}
+//	else {
+//	   char_separator<char> sep("\n",0,boost::keep_empty_tokens);
+//	   typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+//	   tokenizer tokens(theFileAsString, sep);
+//	   std::copy(tokens.begin(), tokens.end(), back_inserter(lines));
+//	}
+
+	// METHOD 2:
+	// Note: The implementation below is 2.5 times slower
+	//	std::ifstream ifs(filename.c_str());
+	//	if (!ifs) return false;
+	//
+	//	std::istreambuf_iterator<char> file_iter(ifs);
+	//	std::istreambuf_iterator<char> end_of_stream;
+	//
+	//	typedef boost::tokenizer<boost::char_separator<char>,
+	//	std::istreambuf_iterator<char> > tokenizer;
+	//
+	//	boost::char_separator<char> sep("\n");
+	//	tokenizer tokens(file_iter,end_of_stream, sep);
+	// std::copy(tokens.begin(), tokens.end(), back_inserter(lines));
+
+	// The current implementation is 2.5 times faster then method 1, and ~4 times faster than method 2
+ 	return true;
+}
+
+
+std::string File::get_last_n_lines(const std::string& filename,int last_n_lines, std::string& error_msg)
+{
+   if ( last_n_lines <= 0  ) return string();
+
+   std::ifstream source( filename.c_str(), std::ios_base::in );
+   if (!source) {
+      error_msg = "File::get_last_n_lines: Could not open file " + filename;
+      return string();
+   }
+
+   size_t const granularity = 100 * last_n_lines;
+   source.seekg( 0, std::ios_base::end );
+   size_t size = static_cast<size_t>( source.tellg() );
+   std::vector<char> buffer;
+   int newlineCount = 0;
+   while ( source
+           && buffer.size() != size
+           && newlineCount < last_n_lines ) {
+       buffer.resize( std::min( buffer.size() + granularity, size ) );
+       source.seekg( -static_cast<std::streamoff>( buffer.size() ),
+                     std::ios_base::end );
+       source.read( buffer.data(), buffer.size() );
+       newlineCount = std::count( buffer.begin(), buffer.end(), '\n');
+   }
+
+   std::vector<char>::iterator start = buffer.begin();
+   while ( newlineCount > last_n_lines ) {
+       start = std::find( start, buffer.end(), '\n' ) + 1;
+       -- newlineCount;
+   }
+
+   //std::vector<char>::iterator end = remove( start, buffer.end(), '\r' ); // for windows
+   return std::string( start, buffer.end() );
+}
+
+
+std::string File::get_first_n_lines(const std::string& filename,int n_lines, std::string& error_msg)
+{
+   if ( n_lines <= 0  ) return string();
+
+   std::ifstream source( filename.c_str(), std::ios_base::in );
+   if (!source) {
+      error_msg = "File::get_first_n_lines: Could not open file " + filename;
+      return string();
+   }
+
+   std::string ret; ret.reserve(1024);
+   std::string line;
+
+   int count = 0;
+   while ( std::getline(source,line) && count < n_lines) {
+
+      ret += line;
+      ret += "\n";
+      count++;
+   }
+
+   return ret;
+}
+
+/// Opens the file and returns the contents
+bool File::open(const std::string& filePath, std::string& contents)
+{
+	std::ifstream  infile( filePath.c_str() , std::ios_base::in);
+ 	if ( ! infile)  return false;
+
+ 	std::ostringstream temp;
+ 	temp << infile.rdbuf();
+ 	contents = temp.str();
+	return true;
+}
+
+//std::string File::tmpFile(std::string& contents)
+//{
+//
+//}
+
+
+bool File::create(const std::string& filename,const std::vector<std::string>& lines, std::string& errorMsg)
+{
+	// For very large file. This is about 1 second quicker. Than using streams
+	// See Test: TestFile.cpp:test_file_create_perf
+	FILE * theFile = fopen (filename.c_str(),"w");
+	if (theFile==NULL) {
+		std::stringstream ss;
+		ss << "Could not create file '" << filename << "'\n";
+		errorMsg += ss.str();
+		return false;
+	}
+ 	size_t size = lines.size();
+	for (size_t i = 0; i < size; ++i) {
+		if (i != 0) {
+		   if (fputs("\n",theFile) == EOF) {
+		      std::stringstream ss;
+		      ss << "Could not write to file '" << filename << "'\n";
+		      errorMsg += ss.str();
+		      fclose (theFile);
+		      return false;
+		   }
+		}
+		if (fputs(lines[i].c_str(),theFile) == EOF) {
+         std::stringstream ss;
+         ss << "Could not write to file '" << filename << "'\n";
+         errorMsg += ss.str();
+         fclose (theFile);
+         return false;
+		}
+ 	}
+ 	fclose (theFile);
+
+//	std::ofstream theFile( filename.c_str() );
+//	if ( !theFile ) {
+//		/// Could be: [ no permissions | file system full | locked by another process ]
+// 		std::stringstream ss;
+//		ss << "Could not create file '" << filename << "'\n";
+//		errorMsg += ss.str();
+//		return false;
+//	}
+//	size_t size = lines.size();
+//	for (size_t i = 0; i < size; ++i) {
+//		if (i != 0) theFile << "\n";
+//		theFile << lines[i];
+//	}
+//	if (!theFile.good()) {
+//      std::stringstream ss;
+//      ss << "Could not write to file '" << filename << "'\n";
+//      errorMsg += ss.str();
+//      theFile.close();
+//      return false;
+//	}
+//	theFile.close();
+
+	return true;
+}
+
+bool File::create(const std::string& filename, const std::string& contents, std::string& errorMsg)
+{
+	std::ofstream theFile( filename.c_str() );
+	if ( !theFile ) {
+ 		std::stringstream ss;
+		ss << "Could not create file '" << filename << "'\n";
+		errorMsg += ss.str();
+		return false;
+	}
+
+	theFile << contents;
+	if (!theFile.good()) {
+	   std::stringstream ss;
+	   ss << "Could not write to file '" << filename << "'\n";
+	   errorMsg += ss.str();
+	   theFile.close();
+	   return false;
+	}
+	theFile.close();
+
+	// This is actually 12% slower for large file:
+//	FILE * theFile = fopen (filename.c_str(),"w");
+//	if (theFile==NULL) {
+//		std::stringstream ss;
+//		ss << "Could not create file '" << filename << "'\n";
+//		errorMsg += ss.str();
+//		return false;
+//	}
+//   if (fputs(contents.c_str(),theFile) == EOF) {
+//      std::stringstream ss;
+//      ss << "Could not write to file '" << filename << "'\n";
+//      errorMsg += ss.str();
+//      fclose (theFile);
+//      return false;
+//   }
+//  	fclose (theFile);
+	return true;
+}
+
+bool File::find(
+                 const boost::filesystem::path& dir_path,    // from this directory downwards,
+                 const std::string&             file_name,   // search for this name,
+                 boost::filesystem::path&       path_found   // placing path here if found
+			   )
+{
+//	std::cout << "Searching '" << dir_path << "' for  " << file_name  << "\n";
+	if ( !fs::exists( dir_path ) )
+		return false;
+
+	fs::directory_iterator end_itr; // default construction yields past-the-end
+	for (fs::directory_iterator itr( dir_path ); itr != end_itr; ++itr) {
+
+		if ( fs::is_directory( itr->status() ) ) {
+
+			if ( File::find( itr->path(), file_name, path_found ) )
+				return true;
+		}
+	   else if ( itr->path().filename() == file_name ) // see below
+		{
+			path_found = itr->path();
+			return true;
+		}
+	}
+	return false;
+}
+
+void File::findAll(
+                  const boost::filesystem::path& dir_path,    // from this directory downwards
+                  const std::string&             file_name,   // search for this name,
+                  std::vector<boost::filesystem::path>& paths_found   // placing path here if found
+			    )
+{
+	if ( !fs::exists( dir_path ) ) return;
+
+	fs::directory_iterator end_itr; // default construction yields past-the-end
+	for (fs::directory_iterator itr( dir_path ); itr != end_itr; ++itr) {
+
+		if ( fs::is_directory( itr->status() ) ) {
+
+			findAll( itr->path(), file_name, paths_found ) ;
+		}
+      else if ( itr->path().filename() == file_name ) // see below
+		{
+			paths_found.push_back( itr->path() );
+ 		}
+	}
+}
+
+std::string File::findPath(
+                  const boost::filesystem::path& dir_path,    // from this directory downwards
+                  const std::string&             file_name,   // search for this name,
+                  const std::string&             leafDir      // path must contain this string
+			    )
+{
+	std::vector< fs::path > paths;
+	File::findAll( dir_path, file_name, paths );
+	if ( !paths.empty() ) {
+
+		// find the path that has leafDir in it.
+ 		BOOST_FOREACH(fs::path path, paths) {
+			std::string thePath = path.string();
+			if (thePath.rfind(leafDir) != std::string::npos) return thePath;
+		}
+ 	}
+	return std::string();
+}
+
+
+std::string File::findPath(
+         const boost::filesystem::path&  dir_path,    // from this directory downwards
+         const std::string&              file_name,   // search for this name,
+         const std::vector<std::string>& tokens       // path must contain all these tokens
+)
+{
+   std::vector< fs::path > paths;
+   File::findAll( dir_path, file_name, paths );
+   if ( !paths.empty() ) {
+
+      // find the path that has all the tokens specified by the vector tokens
+      BOOST_FOREACH(fs::path path, paths) {
+         std::string thePath = path.string();
+         size_t matches = 0;
+         BOOST_FOREACH(const std::string& required_path_tokens, tokens) {
+            if (thePath.rfind(required_path_tokens) != std::string::npos) matches++;
+         }
+         if (matches == tokens.size()) return thePath;
+       }
+   }
+   return std::string();
+}
+
+//#define INTEL_DEBUG_ME 1
+bool File::createMissingDirectories(const std::string& pathToFileOrDir)
+{
+#ifdef INTEL_DEBUG_ME
+   std::cout << "File::createMissingDirectories  " << pathToFileOrDir << std::endl;
+#endif
+	if (pathToFileOrDir.empty()) return false;
+
+	// Avoid making unnecessary system calls, by checking to see if directory exists first
+   fs::path fs_path(pathToFileOrDir);
+   if (fs_path.extension().empty()) {
+
+#ifdef INTEL_DEBUG_ME
+      std::cout << "   pure directory no extension" << std::endl;
+#endif
+      // pure directory
+      if (fs::exists(pathToFileOrDir)) {
+
+#ifdef INTEL_DEBUG_ME
+         std::cout << "   " << pathToFileOrDir << " already exists " << std::endl;
+#endif
+
+         return true;
+      }
+   }
+   else {
+
+#ifdef INTEL_DEBUG_ME
+      std::cout << "   pure directory *has* extension" << std::endl;
+#endif
+      // could be /tmp/fred/sms.job, see if /tmp/fred exists
+      if (fs::exists(fs_path.parent_path())) {
+
+#ifdef INTEL_DEBUG_ME
+         std::cout << "   " << pathToFileOrDir << " already exists " << std::endl;
+#endif
+         return true;
+      }
+   }
+
+ 	std::vector<std::string> thePath;
+	NodePath::split(pathToFileOrDir, thePath);
+	try {
+		if ( !thePath.empty() ) {
+
+#ifdef INTEL_DEBUG_ME
+         std::cout << "   last file " << thePath.back() << std::endl;
+#endif
+
+			// pathToFileOrDir is of form: /tmp/fred/sms.job
+			//   we should only create directories for /tmp/fred
+			if ( thePath.back().find( "." ) != std::string::npos ) {
+				// assume the last token represents a file, hence dont create a directory
+#ifdef INTEL_DEBUG_ME
+	         std::cout << "   last file " << thePath.back() << " has a *dot* ignoring "<< std::endl;
+#endif
+				thePath.pop_back();
+			}
+
+			std::string pathToCreate;
+
+			// if original path had leading slash then add it here, to preserve path
+			if (pathToFileOrDir[0] == '/') pathToCreate += Str::PATH_SEPERATOR();
+
+			for (size_t i = 0; i < thePath.size(); i++) {
+				pathToCreate += thePath[i];
+				if ( !fs::exists( pathToCreate ) ) {
+#ifdef INTEL_DEBUG_ME
+	            std::cout << "   " << pathToCreate << " does not exist, creating directory " << std::endl;
+#endif
+					fs::create_directory( pathToCreate );
+				}
+				pathToCreate += Str::PATH_SEPERATOR();
+			}
+		}
+		else {
+#ifdef INTEL_DEBUG_ME
+         std::cout << "   NO path component in " << pathToFileOrDir <<  std::endl;
+#endif
+
+			if ( pathToFileOrDir.find( "." ) != std::string::npos ) {
+				// assume represents a file, hence don't create a directory fred.job1
+#ifdef INTEL_DEBUG_ME
+	         std::cout << "   assuming " << pathToFileOrDir << " is a file, found a dot, returning without creating dir " <<  std::endl;
+#endif
+				return true;
+			}
+
+			// assume is a dir
+#ifdef INTEL_DEBUG_ME
+         std::cout << "   about to create dir " <<  pathToFileOrDir << std::endl;
+#endif
+
+			fs::create_directory( pathToFileOrDir );
+		}
+	}
+	catch ( const std::exception & ex ) {
+#ifdef INTEL_DEBUG_ME
+	   std::cout << "   Exception " << ex.what() << " could not create dir " << pathToFileOrDir << std::endl;
+#endif
+		return false;
+	}
+	return true;
+}
+
+
+/// Create directories the boost way, with additional check to see if directories exist first
+bool File::createDirectories(const std::string& pathToDir)
+{
+	if (pathToDir.empty()) return false;
+	if (fs::exists(pathToDir)) return true;
+
+	try {
+		return fs::create_directories(pathToDir);
+	}
+	catch (std::exception&) {}
+	return false;
+}
+
+/// Returns the difference between 2 files.
+std::string File::diff(const std::string& file,
+                       const std::string& file2,
+                       const std::vector<std::string>& ignoreVec,
+                       std::string& errorMsg,
+                       bool ignoreBlanksLine)
+{
+	if (!fs::exists(file)) {
+		errorMsg += "First argument File " + file + " does not exist";
+		return std::string();
+	}
+	if (!fs::exists(file2)) {
+		errorMsg += "Second argument File " + file2 + " does not exist";
+		return std::string();
+	}
+
+	std::vector<std::string> fileLines;
+	std::vector<std::string> file2Lines;
+
+	if (!splitFileIntoLines(file, fileLines, ignoreBlanksLine)) {
+		errorMsg += "First argument File " + file + " could not be opened";
+		return std::string();
+	}
+	if (!splitFileIntoLines(file2, file2Lines, ignoreBlanksLine)) {
+		errorMsg += "Second argument File " + file2 + " could not be opened";
+		return std::string();
+	}
+
+	if ( fileLines  != file2Lines) {
+		std::stringstream ss;
+ 		if (fileLines.size() != file2Lines.size())  ss << "Expected size " << file2Lines.size() << " but found " << fileLines.size() <<"\n";
+
+		for(size_t i=0; i < fileLines.size() || i < file2Lines.size(); ++i) {
+
+			if (i < fileLines.size() && i < file2Lines.size()) {
+
+				if (fileLines[i] !=  file2Lines[i]) {
+					bool doIgnore = false;
+					BOOST_FOREACH(const std::string& ignore, ignoreVec) {
+						if ( fileLines[i].find(ignore) != std::string::npos || file2Lines[i].find(ignore) != std::string::npos  ) {
+							doIgnore = true; break;
+						}
+					}
+					if (doIgnore) continue;
+					ss << "Mismatch at " << i << "(" << fileLines[i] << ")   ---->   (" << file2Lines[i] << ")\n";
+				}
+//				else {
+//					ss << "            " << i << " (" << fileLines[i] << ")   ---->   (" << file2Lines[i] << ")\n";
+//				}
+			}
+			else {
+				ss << "Mismatch at " << i ;
+				if (i < fileLines.size() ) ss << " (" << fileLines[i] << ")   ";
+				else                       ss << " ( ---- )   ";
+
+				if (i < file2Lines.size()) ss << "(" << file2Lines[i] << ")\n";
+				else                       ss << "( --- )\n";
+			}
+		}
+		return ss.str();
+	}
+	return std::string();
+}
+
+std::string File::backwardSearch( const std::string& rootPath, const std::string& nodePath, const std::string& fileExtn )
+{
+	// Do a backward search of rootPath + nodePath
+	// If task path if of the form /suite/family/family2/task, then we keep
+	// on consuming the first path token this should leave:
+	//   	<root-path>/suite/family/family2/task.ecf
+	//   	<root-path>/family/family2/task.ecf
+	//  	<root-path>/family2/task.ecf
+	//   	<root-path>/task.ecf
+	// See page 21 of SMS user guide
+
+	vector<std::string> nodePathTokens;
+	NodePath::split(nodePath, nodePathTokens);
+	LOG_ASSERT(!nodePathTokens.empty(),"");
+
+	std::string leafName; // i.e. task in the example above
+	if ( !nodePathTokens.empty() )  leafName = nodePathTokens[ nodePathTokens.size() -1 ] ;
+
+#ifdef DEBUG_TASK_LOCATION
+	cout << "backwardSearch Node " << nodePath << " using root path " << rootPath << " nodePathTokens.size() = " << nodePathTokens.size() << "\n";
+#endif
+	while ( nodePathTokens.size() > 0 ) {
+
+		// Reconstitute the path
+	 	std::string path = NodePath::createPath( nodePathTokens ) ;
+		path += fileExtn; // .ecf, .man , etc
+
+		std::string combinedPath = rootPath;
+		combinedPath += path;
+
+		try {
+			if ( fs::exists( combinedPath )) {
+#ifdef DEBUG_TASK_LOCATION
+				cout << "backwardSearch Node " << nodePath << " the path " << combinedPath << " exists\n";
+#endif
+				return combinedPath;
+ 			}
+#ifdef DEBUG_TASK_LOCATION
+			else  cout << " backwardSearch Node " << nodePath << " the path " << combinedPath << " DOEST NOT EXIST\n";
+#endif
+		}
+		catch (fs::filesystem_error& e) {
+#ifdef DEBUG_TASK_LOCATION
+			std::cout << "Task::backwardSearch Caught exception for fs::exists('" << combinedPath <<"')\n" << e.what() << "\n";
+#endif
+		}
+
+		nodePathTokens.erase(nodePathTokens.begin()); // consume first path token
+	}
+
+	// Look for file in the root path
+ 	std::string ecf_file = leafName + fileExtn;
+	fs::path ecf_filePath = fs::path( fs::path(rootPath) / ecf_file );
+	if (fs::exists(ecf_filePath)) {
+#ifdef DEBUG_TASK_LOCATION
+		std::cout << "backwardSearch Node " << leafName << " Found " << ecf_file << " in root path '" << rootPath << "'\n";
+#endif
+		std::string result = ecf_filePath.string(); // is returned by reference hence must take a copy
+		return result ;
+	}
+
+	// failed to find file via backward search
+	return string();
+}
+
+// Remove a directory recursively ****
+bool File::removeDir( const boost::filesystem::path& p)
+{
+	try {
+		fs::directory_iterator end;
+		for(fs::directory_iterator it(p); it != end; ++it) {
+			if (fs::is_directory(*it)) {
+				if (!removeDir(*it)) {
+					return false;
+				}
+			}
+			else {
+				fs::remove(*it);
+			}
+		}
+	}
+	catch (fs::filesystem_error& e) {
+		return false;
+	}
+
+	// Finally remove dir itself
+	fs::remove(p);
+
+	return true;
+}
+
+
+static std::string find_bjam_ecf_server_path()
+{
+#ifdef DEBUG_SERVER_PATH
+   cout << " File::find_ecf_server_path() using bjam\n";
+#endif
+
+   // bjam uses in source tree, for build, which is in the workspace dir
+   std::string bin_dir = workspace_dir() + "/Server/bin/";
+
+#ifdef DEBUG_SERVER_PATH
+   cout << "  Searching under: " << bin_dir << "\n";
+#endif
+
+   // We need to take into account that on linux, we may have the GNU and CLANG executables
+   // Hence we need to distinguish between them.
+   std::vector<std::string> required_path_tokens;
+
+   // We have 3 variants debug,release,profile
+#ifdef DEBUG
+
+   required_path_tokens.push_back(std::string("debug"));
+#if defined(__clang__)
+   required_path_tokens.push_back(std::string("clang"));
+#endif
+
+   return File::findPath( bin_dir, Ecf::SERVER_NAME(), required_path_tokens );
+
+#else
+
+   required_path_tokens.push_back(std::string("release"));
+#if defined(__clang__)
+   required_path_tokens.push_back(std::string("clang"));
+#endif
+
+   std::string path = File::findPath( bin_dir, Ecf::SERVER_NAME(), required_path_tokens );
+   if (path.empty()) {
+
+      required_path_tokens.clear();
+      required_path_tokens.push_back(std::string("profile"));
+#if defined(__clang__)
+      required_path_tokens.push_back(std::string("clang"));
+#endif
+
+      path = File::findPath( bin_dir, Ecf::SERVER_NAME(), required_path_tokens );
+   }
+   return path;
+#endif
+}
+
+
+std::string File::find_ecf_server_path()
+{
+   if (File::cmake_build()) {
+
+      std::string path = File::root_build_dir();
+      path += "/bin/";
+      path += Ecf::SERVER_NAME();
+
+#ifdef DEBUG_SERVER_PATH
+      cout << " File::find_ecf_server_path() path = " << path << "\n";
+#endif
+      return path;
+   }
+
+   return find_bjam_ecf_server_path();
+}
+
+
+static std::string find_bjam_ecf_client_path()
+{
+#ifdef DEBUG_CLIENT_PATH
+   cout << " find_bjam_ecf_client_path \n";
+#endif
+
+   // Bjam uses, in source build
+   std::string binDir = workspace_dir() + "/Client/bin/";
+
+   // We need to take into account that on linux, we may have the GNU and CLANG executables
+   // Hence we need to distinguish between them.
+   std::vector<std::string> required_path_tokens;
+
+   // We have 3 variants debug,release,profile
+#ifdef DEBUG
+
+   required_path_tokens.push_back(std::string("debug"));
+#if defined(__clang__)
+   required_path_tokens.push_back(std::string("clang"));
+#endif
+
+   return File::findPath( binDir, Ecf::CLIENT_NAME(), required_path_tokens );
+
+#else
+
+   required_path_tokens.push_back(std::string("release"));
+#if defined(__clang__)
+   required_path_tokens.push_back(std::string("clang"));
+#endif
+
+   std::string path = File::findPath( binDir, Ecf::CLIENT_NAME(), required_path_tokens );
+   if (path.empty()) {
+
+      required_path_tokens.clear();
+      required_path_tokens.push_back(std::string("profile"));
+#if defined(__clang__)
+      required_path_tokens.push_back(std::string("clang"));
+#endif
+
+      path = File::findPath( binDir, Ecf::CLIENT_NAME(), required_path_tokens );
+   }
+   return path;
+#endif
+}
+
+std::string File::find_ecf_client_path()
+{
+   if (File::cmake_build()) {
+
+      std::string path = File::root_build_dir();
+      path += "/bin/";
+      path += Ecf::CLIENT_NAME();
+
+#ifdef DEBUG_CLIENT_PATH
+      cout << " File::find_ecf_client_path() returning path " << path << "\n";
+#endif
+      return path;
+   }
+
+#ifdef DEBUG_CLIENT_PATH
+   cout << " File::find_ecf_server_path() using bjam\n";
+#endif
+   return find_bjam_ecf_client_path();
+}
+
+
+std::string File::test_data(const std::string& rel_path, const std::string& dir)
+{
+   std::string test_file;
+   char* work_space = getenv("WK"); // for ecbuild
+   if (work_space != NULL ) {
+      test_file = std::string(work_space);
+      if (!rel_path.empty() && rel_path[0] != '/' ) test_file += "/";
+      test_file += rel_path;
+   }
+   else {
+      std::string work_space = root_source_dir();
+      if (!work_space.empty()) {
+         test_file = work_space;
+         if (!rel_path.empty() && rel_path[0] != '/' ) test_file += "/";
+         test_file += rel_path;
+      }
+      else {
+         fs::path current_path = fs::current_path();
+         if (current_path.stem() == dir ) {
+
+            // remove first path, expecting "dir/path/path1" remove dir
+            std::string::size_type pos = rel_path.find("/",1); // skip over any leading /
+            if (pos != std::string::npos) {
+               test_file += rel_path.substr(pos+1); // skip over '/' to be left with path/path1, making it relative
+            }
+            else {
+               test_file += rel_path;
+            }
+         }
+         else {
+            test_file += rel_path;
+         }
+      }
+   }
+   return test_file;
+}
+
+
+bool File::cmake_build()
+{
+   fs::path current_path = fs::current_path();
+   std::string the_current_path = current_path.string();
+   std::string cmakecache_txt = the_current_path + "/CTestTestfile.cmake";
+   if (fs::exists(cmakecache_txt)) {
+      return true;
+   }
+   return false;
+}
+
+std::string File::root_source_dir()
+{
+   // bjam
+   fs::path current_path = fs::current_path();
+   std::string the_current_path = current_path.string();
+   std::string version_cmake = the_current_path + "/VERSION.cmake";
+   if (fs::exists(version_cmake)) {
+      return the_current_path;
+   }
+
+   std::string stem = current_path.stem().string();
+   int count = 0;
+   while( stem.find("ecflow") == std::string::npos) {
+      current_path = current_path.parent_path();
+
+      // bjam
+      std::string version_cmake = std::string(current_path.string()) + "/VERSION.cmake";
+      if (fs::exists(version_cmake)) {
+         std::string the_root_source_dir = current_path.string();  // cos current_path.string() is returned by reference
+         return the_root_source_dir;
+      }
+
+      stem = current_path.stem().string();
+      count++;
+      if (count == 10000) break;
+   }
+
+
+
+   // cmake,  CTestTestfile.cmake exists in the sub-directories and root directories
+   // File CTestTestfile.cmake, lists the source directory.
+   std::string cmake_test_file = the_current_path + "/CTestTestfile.cmake";
+   if (!fs::exists(cmake_test_file))
+      throw std::runtime_error("File::root_source_dir(): could not find file CTestTestfile.cmake at path " + cmake_test_file);
+
+   std::vector<std::string> lines;
+   if (splitFileIntoLines(cmake_test_file,lines, true)) {
+      for(size_t i = 0; i < lines.size(); i++) {
+         if (lines[i].find("Source directory") != std::string::npos) {
+
+            std::vector< std::string > lineTokens;
+            Str::split( lines[i],lineTokens,":");
+            if (lineTokens.size() != 2) throw std::runtime_error("File::root_source_dir(): could not parse CTestTestfile.cmake for source directory");
+
+            // This may be of the form: # Source directory: /tmp/ma0/clientRoot/workspace/working-directory/ecflow/ACore
+            std::string source_directory = lineTokens[1];
+            boost::algorithm::trim(source_directory);
+
+            std::vector< std::string > pathTokens;
+            Str::split( source_directory,pathTokens,"/");
+            if (pathTokens.empty()) throw std::runtime_error("File::root_source_dir(): could not extract source directory from " + source_directory);
+
+            for(size_t i = pathTokens.size()-1; i > 0 ; i-- ) {
+               if (pathTokens[i] != "ecflow")  pathTokens.erase( pathTokens.begin() + i);
+               else break;
+            }
+
+            std::string path;
+            for(size_t i =0; i < pathTokens.size(); i++) {
+               path += "/";
+               path += pathTokens[i];
+            }
+            return path;
+         }
+      }
+      throw std::runtime_error("File::root_source_dir(): could not find text 'Source directory' in " + cmake_test_file );
+   }
+   else {
+      throw std::runtime_error("File::root_source_dir(): could not open file " + cmake_test_file );
+   }
+
+   return std::string();
+}
+
+std::string File::root_build_dir()
+{
+   fs::path current_path = fs::current_path();
+   std::string the_current_path = current_path.string();
+
+   // bjam
+   std::string version_cmake = the_current_path + "/VERSION.cmake";
+   if (fs::exists(version_cmake))  return the_current_path;
+
+   // cmake
+   std::string cmake_cache = the_current_path + "/CMakeCache.txt";
+   if (fs::exists(cmake_cache))  return the_current_path;
+
+
+   // bjam or cmake
+   std::string stem = current_path.stem().string();
+   int count = 0;
+   while( stem.find("ecflow") == std::string::npos) {
+      current_path = current_path.parent_path();
+
+      the_current_path = current_path.string(); // cos current_path.string() is returned by reference
+
+      // bjam
+      std::string version_cmake = the_current_path + "/VERSION.cmake";
+      if (fs::exists(version_cmake))  return the_current_path;
+
+      // cmake
+      std::string cmake_cache = the_current_path + "/CMakeCache.txt";
+      if (fs::exists(cmake_cache))  return the_current_path;
+
+      stem = current_path.stem().string();
+      count++;
+      if (count == 1000) throw std::runtime_error("File::root_build_dir() failed to find ecflow in a directory name, up the directory tree");
+   }
+
+   throw std::runtime_error("File::root_build_dir() failed to find root build directory");
+   return std::string();
+}
+
+
+}
diff --git a/ecflow_4_0_7/ACore/src/File.hpp b/ecflow_4_0_7/ACore/src/File.hpp
new file mode 100644
index 0000000..bf6d2e5
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/File.hpp
@@ -0,0 +1,152 @@
+#ifndef FILE_HPP_
+#define FILE_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #41 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class for file utilities
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <boost/filesystem/path.hpp>
+#include <string>
+#include <vector>
+
+
+namespace ecf {
+
+class File : private boost::noncopyable {
+public:
+
+	static size_t MAX_LINES();  //  max number of lines, default to 10000
+	static const std::string& JOB_EXTN();  // ".job"
+	static const std::string& MAN_EXTN();  // ".man"
+   static const std::string& USR_EXTN();  // ".usr"
+   static const std::string& ECF_EXTN();  // ".ecf"
+
+	/// expect string of the form ".ecf" or ".sms"
+   static void set_ecf_extn(const std::string&);
+   static const std::string& ecf_extn(); // return ".ecf" | ".sms" | ".py"
+
+	/// return the file extension
+	static std::string getExt(const std::string& file);
+
+	/// replace file extension with a new one
+	static void replaceExt(std::string& file, const std::string& newExt);
+
+	/// returns the input files, split into a vector of string, where each string
+	/// represent a line in the file. returns true if file open ok , false otherwise
+	/// The additional parameter ignoreEmptyLine  can be used to ignore empty lines
+	/// **Always reads _WHOLE_ file. Not suitable for very large files **
+ 	static bool splitFileIntoLines(const std::string& filename, std::vector<std::string>& lines, bool ignoreEmptyLine = false);
+
+ 	/// This is suitable for large files. > several gigabytes, since it does load the entire file
+ 	static std::string get_last_n_lines(const std::string& filename,int last_n_lines, std::string& error_msg);
+
+ 	/// returns the first n line of a file, does not read all the file, hence suitable for very large files
+   static std::string get_first_n_lines(const std::string& filename,int n_lines, std::string& error_msg);
+
+ 	/// Opens the file and returns the contents
+ 	static bool open(const std::string& filePath, std::string& contents);
+
+	/// Given a file spath, and a vector of lines, creates a file. returns true if success
+	/// else returns false and an error message
+	static bool create(const std::string& filename, const std::vector<std::string>& lines, std::string& errorMsg);
+	static bool create(const std::string& filename, const std::string& contents, std::string& errorMsg);
+
+	/// recursively look for a file, given a starting directory
+	/// Return the first file that matches
+	/// return true if file found false otherwise
+	static bool find(
+	                  const boost::filesystem::path& dir_path,    // from this directory downwards
+	                  const std::string&             file_name,   // search for this name,
+	                  boost::filesystem::path&       path_found   // placing path here if found
+				    );
+
+	/// recursively look for a file, given a starting directory
+	/// Returns _ALL_ files that match
+ 	static void findAll(
+	                  const boost::filesystem::path& dir_path,            // from this directory downwards
+	                  const std::string&             file_name,           // search for this name,
+	                  std::vector<boost::filesystem::path>& paths_found   // placing path here if found
+				    );
+
+
+	/// recursively look for a file, given a starting directory and path token
+	/// Returns the first match found
+	static std::string findPath(
+	                  const boost::filesystem::path& dir_path,    // from this directory downwards
+	                  const std::string&             file_name,   // search for this name,
+	                  const std::string&             leafDir      // path must contain this string
+				    );
+
+   static std::string findPath(
+                     const boost::filesystem::path&  dir_path,    // from this directory downwards
+                     const std::string&              file_name,   // search for this name,
+                     const std::vector<std::string>& tokens       // path must contain all these tokens
+                );
+
+	/// Create missing directories. This is *NOT* the same as boost::create_directories
+	/// as that only works with directories. This function assumes that if a "." exist
+	/// in the string it represents a file.
+	/// Hence this function handles:
+	///   /tmp/some/dir/fred.job       // i.e the directories  /tmp/some/dir/ will be created
+	///   /tmp/some/dir
+	///   fred                         // will create the directory fred
+	///   fred.job                     // just return true
+	static bool createMissingDirectories(const std::string& pathToFileOrDir);
+
+	/// Create directories the boost way, with additional check to see if directories exist first
+	static bool createDirectories(const std::string& pathToDir);
+
+	/// Returns the difference between 2 files.
+	/// Ignore lines that contain strings in the ignoreVec
+	static  std::string diff(const std::string& file,
+	                         const std::string& file2,
+	                         const std::vector<std::string>& ignoreVec,
+	                         std::string& errorMsg,
+	                         bool ignoreBlanksLine  = true);
+
+	/// Do a backward search of rootPath + nodePath + fileExtn
+	/// If task path if of the form /suite/family/family2/task, then we keep
+	/// on consuming the first path token this should leave:
+	///   	<root-path>/suite/family/family2/task.ecf
+	///   	<root-path>/family/family2/task.ecf
+	///  	<root-path>/family2/task.ecf
+	///   	<root-path>/task.ecf
+	/// See page 21 of SMS user guide
+	//
+	/// Returns an empty string if file not found
+	static std::string backwardSearch( const std::string& rootPath, const std::string& nodePath, const std::string& fileExtn );
+
+	// Remove a directory recursively ****
+	static bool removeDir( const boost::filesystem::path& p);
+
+
+	// Locate the path to the server exe
+	static std::string find_ecf_server_path();
+
+	// Locate the path to the client exe
+	static std::string find_ecf_client_path();
+
+	// Locate test data
+	static std::string test_data(const std::string& rel_path, const std::string& dir);
+
+   // return root source
+   static bool cmake_build();
+   static std::string root_source_dir();
+   static std::string root_build_dir();
+};
+
+}
+
+#endif /* FILE_HPP_ */
diff --git a/ecflow_4_0_7/ACore/src/File_r.cpp b/ecflow_4_0_7/ACore/src/File_r.cpp
new file mode 100644
index 0000000..c7a37c3
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/File_r.cpp
@@ -0,0 +1,24 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class
+//============================================================================
+
+#include <iostream>
+#include "File_r.hpp"
+
+using namespace std;
+using namespace ecf;
+
+File_r::File_r(const std::string& file_name) : file_name_(file_name), fp_(file_name.c_str(), std::ios_base::in) {}
+File_r::~File_r() { fp_.close(); }
+
diff --git a/ecflow_4_0_7/ACore/src/File_r.hpp b/ecflow_4_0_7/ACore/src/File_r.hpp
new file mode 100644
index 0000000..ea776f9
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/File_r.hpp
@@ -0,0 +1,42 @@
+#ifndef FILE_R_HPP_
+#define FILE_R_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class for file utilities
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <string>
+#include <fstream>
+
+namespace ecf {
+
+class File_r : private boost::noncopyable {
+public:
+   File_r(const std::string& file_name);
+   ~File_r();
+
+   bool ok() const { return (fp_) ? true : false; }
+   bool good() const { return fp_.good(); }
+   void getline(std::string& line) { std::getline(fp_,line); }
+   const std::string& file_name() const { return file_name_; }
+
+private:
+   std::string file_name_;
+   std::ifstream fp_;
+};
+
+}
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Host.cpp b/ecflow_4_0_7/ACore/src/Host.cpp
new file mode 100644
index 0000000..c0ed91f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Host.cpp
@@ -0,0 +1,82 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <unistd.h>  // for gethostname
+#include <stdexcept>
+#include "Host.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+Host::Host() {
+
+	char  hostNameArray[255];
+	if (gethostname(hostNameArray,255) != -1) {
+		the_host_name_ = string(hostNameArray);
+ 	}
+	else {
+		std::runtime_error("Host::Host() failed, could not get host name?\n");
+ 	}
+}
+
+std::string Host::name() const { return the_host_name_; }
+
+std::string Host::ecf_log_file(const std::string& port) const
+{
+	 return prefix_host_and_port(port,Ecf::LOG_FILE());
+}
+
+std::string Host::ecf_checkpt_file(const std::string& port) const
+{
+   return prefix_host_and_port(port,Ecf::CHECKPT());
+}
+
+std::string Host::ecf_backup_checkpt_file(const std::string& port) const
+{
+   return prefix_host_and_port(port,Ecf::BACKUP_CHECKPT());
+}
+
+std::string Host::ecf_lists_file(const std::string& port) const
+{
+   return prefix_host_and_port(port,Str::WHITE_LIST_FILE());
+}
+
+std::string Host::prefix_host_and_port( const std::string& port,const std::string& file_name ) const
+{
+   // The file name may include a path.  /user/avi/fred.log
+   //    fred.log             ->  <host>.<port>.fred.log
+   //    /user/avi/fred.log   ->  /user/avi/fred.log
+   if (!file_name.empty() && file_name.find("/") != std::string::npos ) {
+      return file_name;
+   }
+   std::string ret = host_port_prefix(port);
+   ret += ".";
+   ret += file_name;
+   return ret;
+}
+
+std::string Host::host_port_prefix(const std::string& port) const {
+	std::string ret = the_host_name_;
+	if (!port.empty()) {
+		ret += ".";
+		ret += port;
+	}
+	return ret;
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/Host.hpp b/ecflow_4_0_7/ACore/src/Host.hpp
new file mode 100644
index 0000000..593d522
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Host.hpp
@@ -0,0 +1,52 @@
+#ifndef HOST_HPP_
+#define HOST_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include <string>
+
+namespace ecf {
+
+class Host : private boost::noncopyable {
+public:
+	/// can throw std::runtime_error if the gethostname fails
+	Host();
+
+	/// return the host name
+	std::string name() const;
+
+	/// returns the log file name
+   std::string ecf_log_file(const std::string& port) const;
+
+	/// return checkPoint file
+   std::string ecf_checkpt_file(const std::string& port) const;
+
+	/// return backup checkPoint file
+   std::string ecf_backup_checkpt_file(const std::string& port) const;
+
+   /// return ecf.list file. White list file used for authentication
+   std::string ecf_lists_file(const std::string& port) const;
+
+   /// Given a port and file name, will return <host>.<port>.file_name
+   std::string prefix_host_and_port( const std::string& port,const std::string& list_file ) const;
+
+private:
+	std::string host_port_prefix(const std::string& port) const;
+	std::string the_host_name_;
+};
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Indentor.cpp b/ecflow_4_0_7/ACore/src/Indentor.cpp
new file mode 100644
index 0000000..f4f65f9
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Indentor.cpp
@@ -0,0 +1,31 @@
+//============================================================================
+// Name        : Indentor
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Indentor.hpp"
+
+namespace ecf {
+
+int Indentor::index_ = 0;
+
+
+std::ostream& Indentor::indent( std::ostream& os, int char_spaces)
+{
+	int spaces = index_ * char_spaces;
+	for (int i = 0; i != spaces; i++)
+		os << " ";
+	return os;
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/Indentor.hpp b/ecflow_4_0_7/ACore/src/Indentor.hpp
new file mode 100644
index 0000000..703fc5b
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Indentor.hpp
@@ -0,0 +1,37 @@
+#ifndef INDENTOR_HPP_
+#define INDENTOR_HPP_
+//============================================================================
+// Name        : Indentor
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class to provide indented output
+//============================================================================
+#include <ostream>
+
+namespace ecf {
+
+class Indentor {
+public:
+	Indentor() {
+		++index_;
+	}
+	~Indentor() {
+		--index_;
+	}
+
+	static std::ostream& indent( std::ostream& os , int char_spaces = 2);
+
+private:
+	static int index_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Log.cpp b/ecflow_4_0_7/ACore/src/Log.cpp
new file mode 100644
index 0000000..b2aa39d
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Log.cpp
@@ -0,0 +1,343 @@
+//============================================================================
+// Name        : Log
+// Author      : Avi
+// Revision    : $Revision: #57 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple singleton implementation of log
+//============================================================================
+#include <assert.h>
+#include <vector>
+#include <iostream>
+
+#include "boost/filesystem/path.hpp"
+#include "boost/filesystem/operations.hpp"
+
+#include "Log.hpp"
+#include "File.hpp"
+#include "Str.hpp"
+#include "Indentor.hpp"
+#include "TimeStamp.hpp"
+
+//#define DEBUG_BLOCKING_DISK_IO 1
+//#if DEBUG_BLOCKING_DISK_IO
+//#include "DurationTimer.hpp"
+//#endif
+
+using namespace std;
+namespace fs = boost::filesystem;
+
+namespace ecf {
+
+Log* Log::instance_ = NULL;
+bool LogToCout::flag_ = false;
+
+void Log::create(const std::string& filename)
+{
+	if ( instance_ == NULL) {
+		instance_ = new Log(filename);
+	}
+}
+
+void Log::destroy()
+{
+	if (instance_) instance_->flush();
+
+	delete instance_;
+	instance_ = NULL;
+}
+
+Log::Log(const std::string& fileName)
+: fileName_(fileName), logImpl_( new LogImpl(fileName) )
+{
+}
+
+Log::~Log()
+{
+	delete logImpl_;
+	logImpl_ = NULL;
+}
+
+
+void Log::log(Log::LogType lt,const std::string& message)
+{
+	if (!logImpl_) {
+		logImpl_ = new LogImpl(fileName_) ;
+	}
+	logImpl_->log(lt,message);
+}
+
+void Log::log_no_newline(Log::LogType lt,const std::string& message)
+{
+   if (!logImpl_) {
+      logImpl_ = new LogImpl(fileName_) ;
+   }
+   logImpl_->log_no_newline(lt,message);
+}
+
+void Log::append(const std::string& message)
+{
+   if (!logImpl_) {
+      logImpl_ = new LogImpl(fileName_) ;
+   }
+   logImpl_->append(message);
+}
+
+void Log::cache_time_stamp()
+{
+	if (!logImpl_) {
+		logImpl_ = new LogImpl(fileName_) ;
+	}
+	logImpl_->create_time_stamp();
+}
+
+const std::string& Log::get_cached_time_stamp() const
+{
+   if (!logImpl_)  {
+      return Str::EMPTY();
+   }
+   return logImpl_->get_cached_time_stamp();
+}
+
+void Log::flush()
+{
+ 	// will close ofstream and force data to be written to disk.
+	// Forcing writing to physical medium can't be guaranteed though!
+	delete logImpl_;
+	logImpl_ = NULL;
+}
+
+void Log::clear()
+{
+	flush();
+
+	// Open and truncate the file.
+ 	std::ofstream logfile(fileName_.c_str(), ios::out | ios::trunc);
+ 	if (logfile.is_open()) {
+ 		logfile.close(); // force buffers to flush
+ 	}
+}
+
+void Log::new_path(const std::string& the_new_path)
+{
+   check_new_path(the_new_path);
+
+	// flush and close log file
+	flush();
+
+	fileName_ = the_new_path;
+}
+
+void Log::check_new_path(const std::string& new_path)
+{
+   if (new_path.empty()) {
+      throw std::runtime_error("Log::check_new_path: No path name specified for the new log file");
+   }
+
+   fs::path the_new_path = new_path;
+
+   // Allow paths like "fred.log"
+   fs::path parent_path = the_new_path.parent_path();
+   //std::cout << "the_new_path.parent_path() = " << parent_path << "\n";
+   if (!parent_path.empty()) {
+
+      if (!fs::exists(parent_path)) {
+         std::stringstream ss;
+         ss << "Log::check_new_path: Can not create new log file, since the directory part " << parent_path << " does not exist\n";
+         throw std::runtime_error(ss.str());
+      }
+   }
+
+   // Now check that path does not correspond to a directory, can't use that as the new log file location
+   if (fs::is_directory(the_new_path)) {
+      std::stringstream ss;
+      ss << "LogCmd::LogCmd: Can not create new log file, since the path correspond to a directory " << the_new_path << "\n";
+      throw std::runtime_error(ss.str());
+   }
+}
+
+std::string Log::path() const
+{
+   if (!fileName_.empty() && fileName_[0] == '/') {
+      // Path is absolute return as is
+      return fileName_;
+   }
+   std::string the_path = fs::current_path().string();
+   the_path += "/";
+   the_path += fileName_;
+   return the_path;
+}
+
+std::string Log::contents(int get_last_n_lines)
+{
+   if ( get_last_n_lines == 0 ) {
+      return string();
+   }
+
+   // Close the file. Log file may be buffered, hence flush first
+   flush();
+
+   std::string error_msg;
+   if (get_last_n_lines > 0 ) {
+      return File::get_last_n_lines(fileName_,get_last_n_lines,error_msg);
+   }
+   return File::get_first_n_lines(fileName_,std::abs(get_last_n_lines),error_msg);
+}
+
+void log(Log::LogType lt,const std::string& message)
+{
+	if (Log::instance()) {
+ 		Log::instance()->log(lt,message);
+	}
+	else {
+		if (LogToCout::ok()) {
+			Indentor::indent(cout) << message << endl;
+		}
+	}
+}
+
+void log_no_newline(Log::LogType lt,const std::string& message)
+{
+   if (Log::instance()) {
+      Log::instance()->log_no_newline(lt,message);
+   }
+   else {
+      if (LogToCout::ok()) {
+         Indentor::indent(cout) << message << endl;
+      }
+   }
+}
+
+void log_append(const std::string& message)
+{
+   if (Log::instance()) {
+      Log::instance()->append(message);
+   }
+   else {
+      if (LogToCout::ok()) {
+         Indentor::indent(cout) << message << endl;
+      }
+   }
+}
+
+void log_assert(char const* expr,char const* file, long line, const std::string& message)
+{
+	std::stringstream ss;
+	ss << "ASSERT failure: " << expr << " at " << file << ":" << line << " " << message;
+	std::string assert_msg = ss.str();
+	cerr << assert_msg << "\n";
+	if (Log::instance()) {
+		Log::instance()->log(Log::ERR,assert_msg);
+ 		exit(1);
+  	}
+}
+
+// returns vec = MSG, LOG, ERR, WAR, DBG, OTH
+void Log::get_log_types(std::vector<std::string>& vec)
+{
+   vec.reserve(6);
+   vec.push_back("MSG");
+   vec.push_back("LOG");
+   vec.push_back("ERR");
+   vec.push_back("WAR");
+   vec.push_back("DBG");
+   vec.push_back("OTH");
+}
+
+//======================================================================================================
+LogImpl::LogImpl(const std::string& filename)
+: file_(filename.c_str(), ios::out | ios::app)
+{
+ 	if (!file_.is_open()) {
+		std::cerr << "LogImpl::LogImpl: Could not open log file '" << filename << "'\n";
+		std::runtime_error("LogImpl::LogImpl: Could not open log file " + filename);
+	}
+}
+
+LogImpl::~LogImpl() {}
+
+
+static void append_log_type(std::string& str, Log::LogType lt)
+{
+   switch (lt) {
+      case Log::MSG: str.append("MSG:"); break;
+      case Log::LOG: str.append("LOG:"); break;
+      case Log::ERR: str.append("ERR:"); break;
+      case Log::WAR: str.append("WAR:"); break;
+      case Log::DBG: str.append("DBG:"); break;
+      case Log::OTH: str.append("OTH:"); break;
+      default: assert(false); break;
+   }
+}
+
+void LogImpl::do_log(Log::LogType lt,const std::string& message, bool newline)
+{
+//#if DEBUG_BLOCKING_DISK_IO
+//   ecf::DurationTimer timer;
+//#endif
+
+   // XXX:[HH:MM:SS D.M.YYYY] chd:fullname [+additional information]
+   // XXX:[HH:MM:SS D.M.YYYY] --<user_cmd> [+additional information]
+   if (time_stamp_.empty() || lt == Log::ERR || lt == Log::WAR || lt == Log::DBG ) create_time_stamp();
+
+   // re-use memory allocated to log_type_and_time_stamp_
+   log_type_and_time_stamp_.clear();
+   append_log_type(log_type_and_time_stamp_,lt);
+   log_type_and_time_stamp_ += time_stamp_;
+
+   if (message.find("\n") == std::string::npos) {
+      file_ << log_type_and_time_stamp_ << message;
+      if (newline) file_ << endl;
+   }
+   else {
+      // If message has \n then split into multiple lines
+      std::vector< std::string > lines;
+      Str::split(message,lines,"\n");
+      size_t theSize = lines.size();
+      for(size_t i = 0; i < theSize; ++i) {
+         file_ << log_type_and_time_stamp_ << lines[i] << endl; // flush EACH line
+      }
+   }
+
+   // Check to see, if writing to file was ok.
+   check_file_write(message);
+
+//#if DEBUG_BLOCKING_DISK_IO
+//   long total_seconds = timer.elapsed().total_seconds();
+//   if (total_seconds >= 1) {
+//      std::stringstream ss;
+//      ss << " took " << total_seconds << " seconds **************************************************************";
+//      std::string time_taken = ss.str();
+//      file_ << log_type_and_time_stamp_ << message << time_taken << "\n";
+//      cout << log_type_and_time_stamp_ << message << time_taken << "\n";
+//   }
+//#endif
+}
+
+void LogImpl::append(const std::string& message)
+{
+   file_ << message << endl;
+   check_file_write(message);
+}
+
+void LogImpl::check_file_write(const std::string& message) const
+{
+   bool file_is_good = file_.good();
+   if (!file_is_good) cout << "LogImpl::append: Could not write to log file! File system full?" << endl;
+   if (LogToCout::ok() || !file_is_good) {
+      Indentor::indent(cout) << message << endl;
+   }
+}
+
+void LogImpl::create_time_stamp()
+{
+   TimeStamp::now(time_stamp_);
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/Log.hpp b/ecflow_4_0_7/ACore/src/Log.hpp
new file mode 100644
index 0000000..0cbcbbf
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Log.hpp
@@ -0,0 +1,166 @@
+#ifndef LOG_HPP_
+#define LOG_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Log
+// Author      : Avi
+// Revision    : $Revision: #31 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple singleton implementation of log
+//
+// Please note how do we guarantee that file is actually written to disk:
+// a/ Each log entry should call std::endl
+// b/ Call flush() on the ofstream
+// c/ The two methods will force ofstream buffer to be written to disk
+//    Well NOT REALLY dues to file caching by the OS.
+// The strongest hint we can give th OS to actually write to the physical medium
+// is to close the file. (This does not guarantee it, but is the closest we can achieve)
+//
+// Why is this an issue ? Testing on cross platform HPUX/linux, requires that
+// testing has access to the ECF log file. Initially the log file held an
+// ofstream of log file as a data member. However this meant that flushing
+// did not guarantee writing ECF log file to disk. Testing requires that we
+// are able to clear and copy the log file for comparison.
+// Hence we use another level of indirection, so that we able to close the
+// log file, and hence can ensure that it gets written to disk
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <vector>
+#include <string>
+#include <fstream>
+#include <sstream>
+#include <boost/noncopyable.hpp>
+#include <boost/lambda/lambda.hpp>
+
+namespace ecf {
+
+class LogImpl;
+
+class Log : private boost::noncopyable {
+public:
+   enum LogType { MSG, LOG, ERR, WAR, DBG, OTH };
+   static void create(const std::string& filename);
+   static void destroy();
+   static Log* instance() { return instance_;}
+
+   /// If file is closed will open it
+   /// Outputs t the file a message of type XXX:[HH:MM:SS D.M.YYYY] message
+   /// where XXX is one of the LogType
+   ///
+   /// If the message has multiple newlines these are split
+   /// LogType ERR,WAR,DBG will create a time stamp, otherwise the last cached
+   /// time stamp is used.
+   void log(LogType,const std::string& message);
+
+   /// Single line message is placed in log file without a newline
+   void log_no_newline(LogType,const std::string& message);
+
+   /// Append to log file file and add newline
+   void append(const std::string& message);
+
+   /// Set the time stamp once for each request.
+   void cache_time_stamp();
+
+   /// Return the last cached time stamp. Used for time stamping edit history
+   const std::string& get_cached_time_stamp() const;
+
+   /// returns the contents of the log file, or the last n lines
+   /// Will throw an std::runtime_error if the log file can not be opened
+   /// Will close the file.
+   static int get_last_n_lines_default() { return 100;}
+   std::string contents(int get_last_n_lines);
+
+   /// Will call flush and close the file. See notes above
+   void flush();
+
+   /// clear the log file. Required for testing
+   void clear();
+
+   /// Close the existing log file, and new start writing to the new location
+   void new_path(const std::string& the_path);
+
+   /// Returns the current log file path name
+   std::string path() const;
+
+   // returns vec = MSG, LOG, ERR, WAR, DBG, OTH
+   static void get_log_types(std::vector<std::string>&);
+
+private:
+
+   /// make sure path is not a directory & path has a parent directory.
+   /// Will throw std::runtime_error for errors
+   static void check_new_path(const std::string& the_new_path);
+
+private:
+   ~Log();
+   Log(const std::string& filename);
+   static Log* instance_;
+
+   std::string fileName_;
+   LogImpl* logImpl_;
+};
+
+/// The LogImpl allows the ofstream object to be closed, and so provide strongest
+/// hint to OS that we want file to be written to physical medium.
+/// This is required for testing purposes, as each test run needs to clear/copy
+/// the log file
+class LogImpl : private boost::noncopyable {
+public:
+   LogImpl(const std::string& filename);
+   ~LogImpl();
+
+   void log(Log::LogType lt,const std::string& message) { do_log(lt,message,true); }
+   void log_no_newline(Log::LogType lt,const std::string& message) { do_log(lt,message,false); }
+   void append(const std::string& message);
+
+   void create_time_stamp();
+   const std::string& get_cached_time_stamp() const { return time_stamp_;}
+
+private:
+   void do_log(Log::LogType,const std::string& message, bool newline);
+   void check_file_write(const std::string& message) const;
+
+private:
+   std::string time_stamp_;
+   mutable std::ofstream file_;
+
+   std::string log_type_and_time_stamp_; // re-use memory
+};
+
+/// Utility class used for debug. Enables log file messages to be written to standard out
+class LogToCout : private boost::noncopyable {
+public:
+   LogToCout()   { flag_ = true;}
+   ~LogToCout()  { flag_ = false;}
+   static bool ok() { return flag_;}
+private:
+   static bool flag_;
+};
+
+void log(Log::LogType,const std::string& message);
+void log_no_newline(Log::LogType,const std::string& message);
+void log_append(const std::string& message);
+void log_assert(char const* expr,char const* file, long line, const std::string& message);
+
+// allow user to do the following:
+// LOG(Log::WAR,"this is " << path << " ok ");
+//
+// helper, see STRINGIZE() macro
+template <typename Functor>
+std::string stringize_f(Functor const & f) {
+   std::ostringstream out;
+   f(out);
+   return out.str();
+}
+#define STRINGIZE(EXPRESSION)  (ecf::stringize_f(boost::lambda::_1 << EXPRESSION))
+#define LOG(level, EXPRESSION) ecf::log(level, STRINGIZE(EXPRESSION))
+#define LOG_ASSERT(expr,EXPRESSION) ((expr)? ((void)0): ecf::log_assert(#expr, __FILE__, __LINE__, STRINGIZE(EXPRESSION)))
+
+}
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/LogVerification.cpp b/ecflow_4_0_7/ACore/src/LogVerification.cpp
new file mode 100644
index 0000000..f411127
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/LogVerification.cpp
@@ -0,0 +1,138 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <sstream>
+
+#include "LogVerification.hpp"
+#include "File.hpp"
+#include "Str.hpp"
+#include "NState.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+bool LogVerification::extractNodePathAndState(	const std::string& logfile,
+									std::vector< std::pair< std::string, std::string > >& pathStateVec,
+									std::string& errorMsg )
+{
+	// The log file format we are interested is :
+	//       0          1               2                 3
+	// LOG:[14:37:00 20.5.2010]    submitted: /test_abort_cmd/family0/abort duration_(00:00:00) initTime_(2010-May-20 14:37:00) suiteTime_(2010-May-20 14:37:00)
+
+	// Open log file, and collate of the node paths and corresponding states
+	std::vector<std::string> lines;
+	if (!File::splitFileIntoLines(logfile,lines)) {
+		errorMsg = "Could not open log file " + logfile + " for test verification";
+		return false;
+	}
+
+  	int line_number = 0;
+	for(std::vector<std::string>::iterator i=lines.begin(); i!=lines.end(); ++i) {
+
+		line_number++;
+		if ((*i).find("LOG:") == std::string::npos) {
+			continue; // State changes have type Log::LOG
+		}
+
+		std::vector< std::string > lineTokens;
+	    Str::split(*i, lineTokens);
+	    if (lineTokens.size() < 3) {
+	    	continue;
+	    }
+
+		std::string theState = lineTokens[2];
+		theState.erase( theState.size() -1); // remove ':' at the end
+ 		if (!NState::isValid( theState )) {
+			continue;
+		}
+		// cout << line_number << Str::COLON() << *i << "\n";
+
+ 		pathStateVec.push_back( std::make_pair(lineTokens[3], theState ) );
+	}
+	return true;
+}
+
+static bool searchVec(
+                      const std::vector< std::pair< std::string, std::string > >& goldenLines,
+                      const std::pair< std::string, std::string >& line,
+                      size_t start_index)
+{
+	for(size_t i = start_index; i < goldenLines.size(); i++) {
+		if ( goldenLines[i] == line) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool LogVerification::compareNodeStates( const std::string& logfile, const std::string& goldenRefLogFile, std::string& errorMsg)
+{
+	// Open log files, and extract just the state changes
+	std::vector< std::pair< std::string, std::string > > lines,goldenLines;
+	if (!extractNodePathAndState(logfile,lines,errorMsg)) return false;
+	if (!extractNodePathAndState(goldenRefLogFile,goldenLines,errorMsg)) return false;
+
+	if ( lines  != goldenLines) {
+		std::stringstream ss;
+		ss << "Log file " << logfile << " does not match golden reference file " << goldenRefLogFile << "\n";
+		if (lines.size() != goldenLines.size())  ss << "Expected log file size " << goldenLines.size() << " but found " << lines.size() <<"\n";
+
+		bool errorFnd = false;
+		for(size_t i=0; i < lines.size() || i < goldenLines.size(); ++i) {
+
+			std::string theLine,theGoldenLine;
+			if (i < lines.size() )      theLine       =       lines[i].second + Str::COLON() + lines[i].first;
+			if (i < goldenLines.size()) theGoldenLine = goldenLines[i].second + Str::COLON() + goldenLines[i].first;
+
+			if (i < lines.size() && i < goldenLines.size()) {
+
+				if (lines[i] != goldenLines[i]) {
+					// Please note that we can't do an exact compare for certain state changes
+					// 	 	submitted -->active
+					//  	active    -->complete
+					// Since this can be OS/scheduler dependent and hence order dependent
+					// To compensate look search Golden file
+					if (lines[i].second == "submitted" || lines[i].second == "active" || lines[i].second == "complete") {
+						// search for line in golden file
+						if (searchVec(goldenLines,lines[i],0)) {
+							continue;
+						}
+					}
+
+					ss << "Mismatch at " << i << " log(" << theLine << ")   golden(" << theGoldenLine << ")\n";
+					errorFnd = true;
+				}
+				else {
+					ss << "            " << i << " log(" << theLine << ")   golden(" << theGoldenLine << ")\n";
+				}
+			}
+			else {
+				errorFnd = true;
+				ss << "Mismatch at " << i ;
+				if (i < lines.size() ) ss << " log(" << theLine << ")   ";
+				else                   ss << " log( ---- )   ";
+
+				if (i < goldenLines.size()) ss << "golden(" << theGoldenLine << ")\n";
+				else                        ss << "golden( --- )\n";
+			}
+		}
+		if (errorFnd) errorMsg = ss.str();
+	}
+
+	return errorMsg.empty();
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/LogVerification.hpp b/ecflow_4_0_7/ACore/src/LogVerification.hpp
new file mode 100644
index 0000000..041cbed
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/LogVerification.hpp
@@ -0,0 +1,41 @@
+#ifndef LOG_VERIFICATION_HPP_
+#define LOG_VERIFICATION_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <vector>
+#include <string>
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+class LogVerification : private boost::noncopyable {
+public:
+
+    /// Given a log file, extract in order. The node_path and the state
+    static bool extractNodePathAndState(const std::string& logfile,
+                                        std::vector< std::pair<std::string,std::string> >& pathStateVec,
+                                        std::string& errorMsg);
+
+	/// Will compare the input log file, with gold reference.
+ 	/// Will compare the node state changes only
+    /// Compensate for states that are scheduler dependent
+ 	static bool compareNodeStates( const std::string& logfile, const std::string& goldenRefLogFile, std::string& errormsg);
+
+private:
+	LogVerification() {}
+};
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/NOrder.cpp b/ecflow_4_0_7/ACore/src/NOrder.cpp
new file mode 100644
index 0000000..6dde47d
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/NOrder.cpp
@@ -0,0 +1,55 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "NOrder.hpp"
+#include <assert.h>
+
+std::string NOrder::toString(NOrder::Order s) {
+	switch (s) {
+		case NOrder::TOP:     return "top"; break;
+		case NOrder::BOTTOM:  return "bottom"; break;
+ 		case NOrder::ALPHA:   return "alpha"; break;
+		case NOrder::ORDER:   return "order"; break;
+		case NOrder::UP:      return "up"; break;
+		case NOrder::DOWN:    return "down"; break;
+		default: assert(false); break;
+	}
+	assert(false);
+	return std::string();
+}
+
+NOrder::Order NOrder::toOrder(const std::string& str)
+{
+	if (str == "top")     return NOrder::TOP;
+	if (str == "bottom")  return NOrder::BOTTOM;
+	if (str == "alpha")   return NOrder::ALPHA;
+	if (str == "order")   return NOrder::ORDER;
+	if (str == "up")      return NOrder::UP;
+	if (str == "down")    return NOrder::DOWN;
+ 	assert(false);
+	return NOrder::TOP;
+}
+
+bool NOrder::isValid(const std::string& state)
+{
+	if (state == "top")  return true;
+	if (state == "bottom")   return true;
+	if (state == "alpha")    return true;
+	if (state == "order")   return true;
+	if (state == "up") return true;
+	if (state == "down") return true;
+ 	return false;
+}
+
diff --git a/ecflow_4_0_7/ACore/src/NOrder.hpp b/ecflow_4_0_7/ACore/src/NOrder.hpp
new file mode 100644
index 0000000..c69f0b7
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/NOrder.hpp
@@ -0,0 +1,31 @@
+#ifndef NORDER_HPP_
+#define NORDER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+
+class NOrder {
+	NOrder() {}
+public:
+	enum Order { TOP, BOTTOM, ALPHA, ORDER, UP, DOWN };
+
+	static std::string toString(NOrder::Order);
+	static NOrder::Order toOrder(const std::string&);
+	static bool isValid(const std::string& order);
+};
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/NState.cpp b/ecflow_4_0_7/ACore/src/NState.cpp
new file mode 100644
index 0000000..fda5716
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/NState.cpp
@@ -0,0 +1,113 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #20 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <iostream>
+#include "NState.hpp"
+#include "Ecf.hpp"
+
+void NState::setState( State s ) {
+	state_= s;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "NState::setState\n";
+#endif
+}
+
+const char* NState::toString( NState::State s ) {
+	switch ( s ) {
+		case NState::UNKNOWN:
+			return "unknown";
+			break;
+		case NState::COMPLETE:
+			return "complete";
+			break;
+		case NState::QUEUED:
+			return "queued";
+			break;
+		case NState::ABORTED:
+			return "aborted";
+			break;
+		case NState::SUBMITTED:
+			return "submitted";
+			break;
+		case NState::ACTIVE:
+			return "active";
+			break;
+		default:
+			assert(false); break;
+	}
+	assert(false);
+	return NULL;
+}
+
+NState::State NState::toState( const std::string& str ) {
+	if ( str == "complete" )
+		return NState::COMPLETE;
+	if ( str == "unknown" )
+		return NState::UNKNOWN;
+	if ( str == "queued" )
+		return NState::QUEUED;
+	if ( str == "aborted" )
+		return NState::ABORTED;
+	if ( str == "submitted" )
+		return NState::SUBMITTED;
+	if ( str == "active" )
+		return NState::ACTIVE;
+	assert(false);
+	return NState::UNKNOWN;
+}
+
+bool NState::isValid( const std::string& state ) {
+	if ( state == "complete" )
+		return true;
+	if ( state == "unknown" )
+		return true;
+	if ( state == "queued" )
+		return true;
+	if ( state == "aborted" )
+		return true;
+	if ( state == "submitted" )
+		return true;
+	if ( state == "active" )
+		return true;
+	return false;
+}
+
+std::vector< std::string > NState::allStates() {
+	std::vector< std::string > vec;
+	vec.reserve( 6 );
+	vec.push_back( "complete" );
+	vec.push_back( "unknown" );
+	vec.push_back( "queued" );
+	vec.push_back( "aborted" );
+	vec.push_back( "submitted" );
+ 	vec.push_back( "active" );
+	return vec;
+}
+
+std::vector<NState::State> NState::states()
+{
+	std::vector< NState::State > vec;
+	vec.reserve( 6 );
+	vec.push_back( NState::UNKNOWN    );
+	vec.push_back( NState::COMPLETE   );
+	vec.push_back( NState::QUEUED     );
+	vec.push_back( NState::ABORTED    );
+	vec.push_back( NState::SUBMITTED  );
+	vec.push_back( NState::ACTIVE     );
+ 	return vec;
+}
diff --git a/ecflow_4_0_7/ACore/src/NState.hpp b/ecflow_4_0_7/ACore/src/NState.hpp
new file mode 100644
index 0000000..fe856e5
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/NState.hpp
@@ -0,0 +1,69 @@
+#ifndef NSTATE_HPP_
+#define NSTATE_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <vector>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+// NState: stores the state of a node.
+// *The class NState just used to define the enum, however we also
+// needed to know when the state changed. Hence the use of state_change_no
+// Uses default copy constructor and destructor, and equality
+class NState {
+public:
+	enum State { UNKNOWN =0, COMPLETE=1,  QUEUED=2, ABORTED=3, SUBMITTED=4, ACTIVE=5 };
+	NState(State s): state_(s), state_change_no_(0) {}
+	NState(): state_(UNKNOWN),state_change_no_(0) {}
+
+	State state() const { return state_;}
+	void setState(State);
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+	bool operator==(const NState& rhs) const { return state_ == rhs.state_;}
+	bool operator!=(const NState& rhs) const { return state_ != rhs.state_;}
+	bool operator==(State s) const { return s == state_;}
+	bool operator!=(State s) const { return s != state_;}
+
+ 	static const char* toString(NState::State s);
+	static const char* toString(const NState& ns) { return toString(ns.state());}
+	static NState::State toState(const std::string& state);
+	static bool isValid(const std::string& state);
+	static std::vector<std::string> allStates();
+	static std::vector<NState::State> states();
+
+private:
+	State state_;
+	unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/)
+	{
+	   ar & state_;
+	}
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(NState, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(NState,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/NodePath.cpp b/ecflow_4_0_7/ACore/src/NodePath.cpp
new file mode 100644
index 0000000..f2710ab
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/NodePath.cpp
@@ -0,0 +1,83 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include <boost/algorithm/string/trim.hpp>
+
+#include "NodePath.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+
+void NodePath::split( const std::string& path, std::vector<std::string>&  thePath)
+{
+	/// The path is of the form "/suite/family/task"
+	Str::split(path,thePath,Str::PATH_SEPERATOR());
+
+	//  This is the original implementation, found to be a lot slower
+	// See timing tests at the end of TestNodePathextractor.cpp
+	//    typedef boost::tokenizer<boost::char_separator<char> >  tokenizer;
+	//    boost::char_separator<char> sep("/");
+	//    tokenizer tokens(path_, sep);
+	//    copy(tokens.begin(), tokens.end(), back_inserter(thePath));
+}
+
+bool NodePath::extractHostPort(const std::string& path,std::string& host, std::string& port)
+{
+	if (path.empty()) return false;
+
+ 	std::vector<std::string>  thePath;
+	NodePath::split(path,thePath);
+
+ 	if (thePath.empty()) return false;
+
+	//<host>:<port>/suite/family/task
+	// first path should be of form <host>:<port>
+	size_t colonPos = thePath[0].find_first_of(':');
+	if (colonPos == std::string::npos) return false;
+
+	host = thePath[0].substr(0,colonPos);
+ 	port = thePath[0].substr(colonPos+1);
+
+ 	boost::algorithm::trim(host);
+ 	boost::algorithm::trim(port);
+ 	if (host.empty()) return false;
+ 	if (port.empty()) return false;
+
+ 	return true;
+}
+
+
+std::string NodePath::createPath(const std::vector<std::string>& vec)
+{
+	if (vec.empty()) return std::string();
+
+	std::string ret;
+	size_t size = vec.size();
+	for(size_t i = 0; i < size; i++) {
+		ret += Str::PATH_SEPERATOR();
+		ret += vec[i];
+	}
+	return ret;
+}
+
+std::string NodePath::removeHostPortFromPath(const std::string& path)
+{
+ 	std::vector<std::string> pathVec;
+	NodePath::split(path,pathVec);
+	pathVec.erase( pathVec.begin() );
+	return NodePath::createPath(pathVec);
+}
+
diff --git a/ecflow_4_0_7/ACore/src/NodePath.hpp b/ecflow_4_0_7/ACore/src/NodePath.hpp
new file mode 100644
index 0000000..3d497c2
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/NodePath.hpp
@@ -0,0 +1,46 @@
+#ifndef NODEPATH_HPP_
+#define NODEPATH_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include <string>
+#include <vector>
+
+class NodePath : private boost::noncopyable {
+public:
+	/// returns the path as a vector of strings, preserving the order
+	/// Note: multiple path separator '/' are treated as one separator.
+	/// Mimics unix path conventions. hence
+	/// '/suite//family///task' will be extracted as 'suite','family','task'
+	static void split(const std::string& path,std::vector<std::string>&);
+
+	/// If the path name if form:
+	///     //<host>:<port>/suite/family/task
+	/// The extract the host and port, return OK if successful
+	static bool extractHostPort(const std::string& path, std::string& host, std::string& port);
+
+	/// Given a vector of strings , create a path. "suite","family", returns /suite/family
+	static std::string createPath(const std::vector<std::string>&);
+
+	/// Given a path like:   //localhost:3141/suite/family/task
+	/// returns              /suite/family/task
+	static std::string removeHostPortFromPath(const std::string& path);
+
+private:
+ 	NodePath();
+
+};
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Passwd.cpp b/ecflow_4_0_7/ACore/src/Passwd.cpp
new file mode 100644
index 0000000..a135ceb
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Passwd.cpp
@@ -0,0 +1,84 @@
+//============================================================================
+// Name        : Passwd.hpp
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Passwd.hpp"
+#include <iostream>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+//extern char *crypt(const char *key, const char *salt);
+
+
+double ecf_drand48();
+
+
+std::string Passwd::generate()
+{
+ 	char pw[9];
+	for (int i = 0; i < 8; i++) { /* generate a random password */
+
+		pw[i] = 64.0 * ecf_drand48() + '.'; /* Just crack this one! */
+		if ( pw[i] > '9' ) pw[i] += 7;
+		if ( pw[i] > 'Z' ) pw[i] += 6;
+	}
+	pw[8] = '\0';
+	return std::string (pw);
+}
+
+//std::string Passwd::doCrypt( const std::string& passwd ) {
+//	/**************************************************************************
+//	 ?  Crypt the passwd.
+//	 =  Crypted password in static area.
+//	 ************************************o*************************************/
+//	char salt[3];
+//
+//	for (int i = 0; i < 2; i++) {
+//		salt[i] = 64.0 * ecf_drand48() + '.';
+//		if ( salt[i] > '9' ) salt[i] += 7;
+//		if ( salt[i] > 'Z' ) salt[i] += 6;
+//	}
+//	salt[2] = '\0';
+//
+//	return std::string( crypt( passwd.c_str(), salt ));
+//}
+
+
+double ecf_drand48()
+/**************************************************************************
+ ?  Random number with time dependent seed.
+ =  [0.0 - 1.0)
+ ~  drand48(3) srand48(3) rand(3)
+ ************************************o*************************************/
+{
+	//  extern double drand48();
+	//  extern void   srand48();
+	static int been_here;
+
+	if ( !been_here ) {
+#if defined(RAND_ONLY)
+		srand( (int) time(NULL) + getpid() );
+#else
+		srand48( (long) time( NULL ) + getpid() );
+#endif
+		been_here = 1;
+	}
+
+#if defined(RAND_ONLY)
+	return (rand()&0xffff) / 65535.0001;
+#else
+	return drand48();
+#endif
+}
diff --git a/ecflow_4_0_7/ACore/src/Passwd.hpp b/ecflow_4_0_7/ACore/src/Passwd.hpp
new file mode 100644
index 0000000..1f6400f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Passwd.hpp
@@ -0,0 +1,47 @@
+#ifndef PASSWD_HPP_
+#define PASSWD_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//    The tasks send by the ECF will have GENERATED PASSWORD that is not
+//    stored into the any file (except the job file). It only exist in the
+//    ECF_server-memory. If the ECF server fails and a new one is started, it must be
+//    told (by operator) to accept the messages from the unknown jobs.
+//
+//    The GENERATED PASSWORDs are stored into the CHECKPOINT file. So if the
+//    ECF fails and is RESTARTed from a valid CHECKPOINT file, the ECF gets
+//    to know about the tasks.
+//
+//    The user passwords are kept in a file. When ever an user logs into
+//    the ECF or changes the "level" of privileges while already in the
+//    file is consulted.
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <string>
+
+class Passwd : private boost::noncopyable {
+public:
+
+	/// generate a random password
+	static std::string generate();
+
+	/// encrypt the password
+//	static std::string doCrypt( const std::string& generated);
+
+private:
+	Passwd();
+};
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/PrintStyle.cpp b/ecflow_4_0_7/ACore/src/PrintStyle.cpp
new file mode 100644
index 0000000..3461f0a
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/PrintStyle.cpp
@@ -0,0 +1,53 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "PrintStyle.hpp"
+#include <iostream>
+
+static PrintStyle::Type_t style_ = PrintStyle::NOTHING;
+
+PrintStyle::Type_t PrintStyle::getStyle()
+{
+	return style_;
+}
+
+void PrintStyle::setStyle(PrintStyle::Type_t f)
+{
+	style_ = f;
+}
+
+bool PrintStyle::defsStyle() {
+	if (getStyle() == PrintStyle::DEFS || getStyle() == PrintStyle::NOTHING) {
+		return true;
+	}
+	return false;
+}
+
+std::string PrintStyle::to_string()
+{
+   return to_string(getStyle());
+}
+
+std::string PrintStyle::to_string(PrintStyle::Type_t t)
+{
+   switch ( t ) {
+       case PrintStyle::NOTHING: return "NOTHING";break;
+       case PrintStyle::DEFS: return "DEFS";break;
+       case PrintStyle::STATE: return "STATE";break;
+       case PrintStyle::MIGRATE: return "MIGRATE";break;
+    }
+    return std::string();
+}
+
diff --git a/ecflow_4_0_7/ACore/src/PrintStyle.hpp b/ecflow_4_0_7/ACore/src/PrintStyle.hpp
new file mode 100644
index 0000000..043877c
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/PrintStyle.hpp
@@ -0,0 +1,50 @@
+#ifndef PRINTSTYLE_HPP_
+#define PRINTSTYLE_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <string>
+
+class PrintStyle : private boost::noncopyable {
+public:
+	// Used by the show Cmd
+	enum Type_t {
+		NOTHING = 0,     // Does nothing
+		DEFS = 1,        // Output the definition that is fully parse-able
+      STATE = 2,       // Output definition that includes Node state, and AST,  fully parseable
+      MIGRATE = 3      // Output the definition that is fully parse-able & includes state
+	};
+
+	PrintStyle(Type_t t) : old_style_(getStyle()) { setStyle(t);}
+	~PrintStyle() { setStyle(old_style_); } // reset to old style on destruction
+
+
+	/// We want to control the output, so that we can dump in old style defs format
+	/// or choose to dump for debug.
+	static Type_t getStyle() ;
+	static void setStyle(Type_t) ;
+
+	static bool defsStyle();
+
+	// return current style as a string
+   static std::string to_string();
+   static std::string to_string(PrintStyle::Type_t);
+
+private:
+   Type_t old_style_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/SState.cpp b/ecflow_4_0_7/ACore/src/SState.cpp
new file mode 100644
index 0000000..8acbd04
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/SState.cpp
@@ -0,0 +1,58 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "SState.hpp"
+#include <assert.h>
+
+std::string SState::to_string(int status)
+{
+	if (status == 0)      return "HALTED";
+	else if (status == 1) return "SHUTDOWN";
+	else if (status == 2) return "RUNNING";
+	return "UNKNOWN??";
+}
+
+std::string SState::to_string(SState::State state)
+{
+	switch (state) {
+		case SState::HALTED: return "HALTED"; break;
+		case SState::SHUTDOWN: return "SHUTDOWN"; break;
+		case SState::RUNNING: return "RUNNING"; break;
+	}
+	return "UNKNOWN??";
+}
+
+SState::State SState::toState( const std::string& str ) {
+   if ( str == "HALTED" )
+      return SState::HALTED;
+   if ( str == "SHUTDOWN" )
+      return SState::SHUTDOWN;
+   if ( str == "RUNNING" )
+      return SState::RUNNING;
+   assert(false);
+   return SState::HALTED;
+}
+
+bool SState::isValid( const std::string& state ) {
+   if ( state == "HALTED" )
+      return true;
+   if ( state == "SHUTDOWN" )
+      return true;
+   if ( state == "queued" )
+      return true;
+   if ( state == "RUNNING" )
+      return true;
+   return false;
+}
diff --git a/ecflow_4_0_7/ACore/src/SState.hpp b/ecflow_4_0_7/ACore/src/SState.hpp
new file mode 100644
index 0000000..3ef9419
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/SState.hpp
@@ -0,0 +1,46 @@
+#ifndef S_STATE_HPP_
+#define S_STATE_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <boost/noncopyable.hpp>
+
+class SState : private boost::noncopyable {
+public:
+   /// The following table shows the effect of state, on server behaviour:
+   ///
+   ///           User Request    Task Request   Job Scheduling   Check-pointing
+   /// RUNNING      yes               yes              yes            yes
+   /// SHUTDOWN     yes               yes              no             yes
+   /// HALTED       yes               no               no             no
+	enum State {
+	   HALTED,
+ 		SHUTDOWN,
+ 		RUNNING
+ 	};
+
+	/// Given an integer return the server state as a string.
+	/// if int is not  0,1,2 return "UNKNOWN
+	static std::string to_string(int status);
+	static std::string to_string(SState::State);
+
+   static SState::State toState(const std::string& state);
+   static bool isValid(const std::string& state);
+
+private:
+	SState();
+};
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Serialization.hpp b/ecflow_4_0_7/ACore/src/Serialization.hpp
new file mode 100644
index 0000000..18a494c
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Serialization.hpp
@@ -0,0 +1,135 @@
+#ifndef SERIALIZATION_HPP_
+#define SERIALIZATION_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple class that defines the Archive types used for
+//               Serialisation
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "boost_archive.hpp"
+#include "Archive.hpp"
+
+namespace ecf {
+
+/// These function do *NOT* trap  boost::archive::archive_exception since we want it
+/// to propagate up.
+
+template< typename T >
+void save(const std::string& fileName, const T& ts, ecf::Archive::Type at = ecf::Archive::default_archive())
+{
+   // Argument added if in future we want to allow multiple archives, so we can choose
+#if defined(BINARY_ARCHIVE)
+	std::ofstream ofs( fileName.c_str(), std::ios::binary );
+	boost::archive::binary_oarchive oa( ofs );
+	oa << ts;
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+	std::ofstream ofs( fileName.c_str(), std::ios::binary );
+	portable_binary_oarchive oa(ofs);
+	oa << ts;
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   std::ofstream ofs( fileName.c_str(), std::ios::binary );
+   eos::portable_oarchive oa(ofs);
+   oa << ts;
+#else
+   std::ofstream ofs( fileName.c_str() );
+   boost::archive::text_oarchive oa( ofs );
+	oa << ts;
+#endif
+}
+
+template< typename T >
+void save_as_string(std::string& outbound_data, const T& t)
+{
+   std::ostringstream archive_stream;
+
+#if defined(BINARY_ARCHIVE)
+   boost::archive::binary_oarchive archive( archive_stream );
+   archive << t;
+   outbound_data = archive_stream.str();
+   //             std::cout << "save_as_string BINARY " << outbound_data_ << "\n";
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+   portable_binary_oarchive archive( archive_stream );
+   archive << t;
+   outbound_data = archive_stream.str();
+   //             std::cout << "save_as_string PORTABLE_BINARY " << outbound_data_ << "\n";
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   eos::portable_oarchive archive( archive_stream );
+   archive << t;
+   outbound_data = archive_stream.str();
+   //             std::cout << "save_as_string EOS_PORTABLE_BINARY " << outbound_data_ << "\n";
+#else
+   boost::archive::text_oarchive archive( archive_stream );
+   archive << t;
+   outbound_data = archive_stream.str();
+#endif
+}
+
+template< typename T >
+void restore_from_string(const std::string& archive_data, T& t)
+{
+   std::istringstream archive_stream(archive_data);
+
+#if defined(BINARY_ARCHIVE)
+   // std::cout << "restore_from_string Archive BINARY\n";
+   boost::archive::binary_iarchive archive( archive_stream );
+
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+   // std::cout << "restore_from_string Archive PORTABLE_BINARY\n";
+   portable_binary_iarchive archive( archive_stream );
+
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   // std::cout << "restore_from_string Archive EOS_PORTABLE_BINARY\n";
+   eos::portable_iarchive archive( archive_stream );
+
+#else
+   // std::cout << "restore_from_string Archive TEXT\n";
+   boost::archive::text_iarchive archive( archive_stream );
+
+#endif
+
+   archive >> t;
+}
+
+
+
+template< typename T >
+void restore(const std::string& fileName, T& restored, ecf::Archive::Type at = ecf::Archive::default_archive())
+{
+   // Argument added if in future we want to allow multiple archives, so we can choose
+
+#if defined(BINARY_ARCHIVE)
+	std::ifstream ifs( fileName.c_str(), std::ios::binary );
+	boost::archive::binary_iarchive ia( ifs );
+	ia >> restored;
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+	std::ifstream ifs( fileName.c_str(), std::ios::binary );
+	portable_binary_iarchive ia( ifs );
+	ia >> restored;
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   std::ifstream ifs( fileName.c_str(), std::ios::binary );
+   eos::portable_iarchive ia( ifs );
+   ia >> restored;
+#else
+	std::ifstream ifs( fileName.c_str() );
+	boost::archive::text_iarchive ia( ifs );
+	ia >> restored;
+#endif
+}
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/SerializationTest.hpp b/ecflow_4_0_7/ACore/src/SerializationTest.hpp
new file mode 100644
index 0000000..3bdf0cd
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/SerializationTest.hpp
@@ -0,0 +1,71 @@
+#ifndef SERIALIZATION_TEST_HPP_
+#define SERIALIZATION_TEST_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple class that defines the Archive types used for
+//               Serialisation
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "Serialization.hpp"
+
+namespace ecf {
+
+// The following template  functions are used test/debug only
+template < typename T >
+void do_restore(const std::string& fileName, const T& saved)
+{
+   T restored;
+   try { ecf::restore(fileName,restored); }
+   catch ( std::exception& e) { BOOST_CHECK_MESSAGE(false,"Restore failed because: " << e.what()); }
+   BOOST_CHECK_MESSAGE(saved == restored,"save and restored don't match for " << fileName << "\n");
+//   BOOST_CHECK_MESSAGE(saved == restored," save and restored don't match\n" << saved  << "\n" << restored );
+}
+
+template < typename T >
+void doRestore(const std::string& fileName, const T& saved)
+{
+   do_restore(fileName,saved);
+	std::remove(fileName.c_str());
+}
+
+template < typename T >
+void doSave(const std::string& fileName, const T& saved)
+{
+   try { ecf::save(fileName,saved); }
+   catch ( std::exception& e) { BOOST_CHECK_MESSAGE(false,"Save  failed because: " << e.what()); }
+}
+
+template < typename T >
+void doSave(const std::string& fileName)
+{
+   T saved;
+   doSave(fileName,saved);
+}
+
+template < typename T >
+void doSaveAndRestore(const std::string& fileName, const T& saved)
+{
+   doSave(fileName,saved);
+ 	doRestore(fileName,saved);
+}
+
+template < typename T >
+void doSaveAndRestore(const std::string& fileName)
+{
+	T saved;
+	doSaveAndRestore(fileName,saved);
+}
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Stl.hpp b/ecflow_4_0_7/ACore/src/Stl.hpp
new file mode 100644
index 0000000..86de2e7
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Stl.hpp
@@ -0,0 +1,71 @@
+#ifndef STL_HPP_
+#define STL_HPP_
+//============================================================================
+// Name        : stl
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+/*****************************************************************************
+ * Standard Library Include Files                                            *
+ *****************************************************************************/
+#include <algorithm> //for for_each()
+//#include <iostream>
+
+
+namespace ecf
+{
+	/// Helper struct that will aid the deletion of Pointer from a container
+	template <typename T> struct TSeqDeletor {
+		void operator () (T pointer) {
+			// std::cout << "Destroy of this pointer" << std::endl;
+			delete pointer;
+			pointer = 0;
+		}
+	};
+	/// This function can be used to delete the pointers in a container
+	/// i.e int main (int argc, char **argv) {
+	///        std::vector <std::string *> vect;
+	///        vect.push_back (new std::string ("Stephane"));
+	///        DeletePtrs (vect);
+	///     }
+	template <typename Container> void DeletePtrs (Container& pContainer) {
+		std::for_each( pContainer.begin (),
+					   pContainer.end (),
+					   TSeqDeletor<typename Container::value_type> ());
+		pContainer.clear();
+	}
+
+
+	/// Helper struct that will aid the deletion of Pointer from a Associative container
+	template <typename TPair> struct TAsoDeletor {
+    	void operator () (TPair& tElem)  {
+    		if(tElem.second) {
+        		delete tElem.second;
+    		}
+    	}
+	};
+	/// This function can be used to delete the pointers in a Assoc container
+	/// i.e int main (int argc, char **argv) {
+	///        std::map <int,std::string *> theMap;
+	///        theMap[0] =  new std::string ("Stephane");
+	///        AssoDeletePtrs(theMap);
+	///     }
+	template <typename Container> void AssoDeletePtrs (Container& pContainer) {
+		std::for_each( pContainer.begin (),
+					   pContainer.end (),
+					   TAsoDeletor<typename Container::value_type> ());
+		pContainer.clear();
+	}
+}
+
+#endif /* STL_HPP_ */
diff --git a/ecflow_4_0_7/ACore/src/Str.cpp b/ecflow_4_0_7/ACore/src/Str.cpp
new file mode 100644
index 0000000..690f5a8
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Str.cpp
@@ -0,0 +1,346 @@
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #49 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class
+//============================================================================
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "Str.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+const char* VALID_NODE_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.";
+
+const char* Str::CHILD_CMD() { static const char* CHILD_CMD = "chd:"; return CHILD_CMD; }
+const char* Str::USER_CMD() { static const char* USER_CMD = "--"; return USER_CMD; }
+const char* Str::SVR_CMD() { static const char* SVR_CMD = "svr:"; return SVR_CMD; } // Only for automatic check_pt
+
+const std::string& Str::EMPTY() { static std::string empty = std::string(); return empty;}
+const std::string& Str::ROOT_PATH() { static std::string root_path  = "/"; return root_path;}
+const std::string& Str::PATH_SEPERATOR() { static std::string  path_sep = "/"; return path_sep;}
+const std::string& Str::COLON() { static std::string colon = ":"; return colon;}
+
+
+const std::string& Str::STATE_CHANGE() { static std::string state_change = "   state change "; return state_change;}
+
+const std::string& Str::TASK()   { static std::string task = "TASK"; return task; }
+const std::string& Str::FAMILY() { static std::string family = "FAMILY"; return family;}
+const std::string& Str::SUITE()  { static std::string suite = "SUITE"; return suite;}
+const std::string& Str::ALIAS()  { static std::string alias = "ALIAS"; return alias; }
+
+const std::string& Str::DEFAULT_PORT_NUMBER() { static std::string port_number = "3141"; return port_number;}
+const std::string& Str::LOCALHOST()           { static std::string localhost = "localhost"; return localhost;}
+
+const std::string& Str::ECF_PORT()       { static std::string ECF_PORT = "ECF_PORT"; return ECF_PORT;}
+const std::string& Str::ECF_RID()        { static std::string ECF_RID = "ECF_RID"; return ECF_RID;}
+const std::string& Str::ECF_TRYNO()      { static std::string ECF_TRYNO = "ECF_TRYNO"; return ECF_TRYNO;}
+const std::string& Str::ECF_TRIES()      { static std::string ECF_TRIES = "ECF_TRIES"; return ECF_TRIES;}
+const std::string& Str::ECF_NAME()       { static std::string ECF_NAME = "ECF_NAME"; return ECF_NAME; }
+const std::string& Str::ECF_NODE()       { static std::string ECF_NODE = "ECF_NODE"; return ECF_NODE;}
+const std::string& Str::ECF_PASS()       { static std::string ECF_PASS = "ECF_PASS";return ECF_PASS;}
+const std::string& Str::ECF_JOB()        { static std::string ECF_JOB = "ECF_JOB"; return ECF_JOB;}
+const std::string& Str::ECF_JOBOUT()     { static std::string ECF_JOBOUT = "ECF_JOBOUT"; return ECF_JOBOUT;}
+const std::string& Str::ECF_SCRIPT()     { static std::string ECF_SCRIPT = "ECF_SCRIPT"; return ECF_SCRIPT;}
+const std::string& Str::ECF_DUMMY_TASK() { static std::string ECF_DUMMY_TASK = "ECF_DUMMY_TASK"; return ECF_DUMMY_TASK;}
+const std::string& Str::ECF_MICRO()      { static std::string ECF_MICRO = "ECF_MICRO"; return ECF_MICRO;}
+const std::string& Str::ECF_FILES()      { static std::string ECF_FILES = "ECF_FILES"; return ECF_FILES;}
+const std::string& Str::ECF_FETCH()      { static std::string ECF_FETCH = "ECF_FETCH"; return ECF_FETCH;}
+const std::string& Str::ECF_KILL_CMD()   { static std::string ECF_KILL_CMD = "ECF_KILL_CMD"; return ECF_KILL_CMD;}
+const std::string& Str::ECF_STATUS_CMD() { static std::string ECF_STATUS_CMD = "ECF_STATUS_CMD"; return ECF_STATUS_CMD;}
+
+const std::string& Str::ECF_HOME()    { static std::string ECF_HOME = "ECF_HOME"; return ECF_HOME;}
+const std::string& Str::ECF_INCLUDE() { static std::string ECF_INCLUDE = "ECF_INCLUDE"; return ECF_INCLUDE;}
+const std::string& Str::ECF_JOB_CMD() { static std::string ECF_JOB_CMD = "ECF_JOB_CMD"; return ECF_JOB_CMD;}
+const std::string& Str::ECF_OUT()     { static std::string ECF_OUT = "ECF_OUT"; return ECF_OUT;}
+const std::string& Str::ECF_EXTN()    { static std::string ECF_EXTN = "ECF_EXTN"; return ECF_EXTN;}
+const std::string& Str::ECF_LOG()     { static std::string ECF_LOG = "ECF_LOG"; return ECF_LOG;}
+
+
+const std::string& Str::WHITE_LIST_FILE() { static std::string WHITE_LIST_FILE = "ecf.lists"; return WHITE_LIST_FILE;}
+
+const std::string& Str::ALPHANUMERIC_UNDERSCORE()
+{
+   static string ALPHANUMERIC_UNDERSCORE = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
+   return ALPHANUMERIC_UNDERSCORE;
+}
+
+const std::string& Str::NUMERIC() { static string NUMERIC = "0123456789"; return NUMERIC; }
+
+void Str::removeQuotes(std::string& s)
+{
+	if (!s.empty()) {
+		if (s[0] == '"' && s[s.size()-1] == '"') {
+			s.erase(s.begin());
+			s.erase(s.begin() + s.size()-1);
+		}
+	}
+}
+// 047 is octal for '
+void Str::removeSingleQuotes(std::string& s)
+{
+	if (!s.empty()) {
+		if (s[0] == 047 && s[s.size()-1] == 047) {
+			s.erase(s.begin());
+			s.erase(s.begin() + s.size()-1);
+		}
+	}
+}
+
+bool Str::replace(std::string& jobLine, const std::string& stringToFind, const std::string& stringToRplace)
+{
+	size_t pos = jobLine.find(stringToFind);
+	if (pos != string::npos) {
+		jobLine.replace(pos,stringToFind.length(),stringToRplace);
+		return true;
+	}
+	return false;
+}
+
+bool Str::replace_all(std::string& subject, const std::string& search, const std::string& replace)
+{
+   bool replaced = false ;
+   size_t pos = 0;
+   while ((pos = subject.find(search, pos)) != std::string::npos) {
+      subject.replace(pos, search.length(), replace);
+      pos += replace.length();
+      replaced = true;
+   }
+   return replaced;
+}
+
+bool Str::extract_data_member_value(const std::string& str, const std::string& data_member_name, std::string& data_member_value)
+{
+   //        012345678901234567,
+   //    str=cmd 1 user:mao
+   //    data_member_name=user:
+   //    data_member_value=ma0
+   std::string::size_type start = str.find(data_member_name);
+   if (start != std::string::npos) {
+      start += data_member_name.size();
+      data_member_value.clear();
+      for(size_t i = start; i < str.size(); i++) {
+         if (str[i] == ' ') break;
+         data_member_value += str[i];
+      }
+      return true;
+   }
+   return false;
+}
+
+
+void Str::replaceall(std::string& subject, const std::string& search, const std::string& replace)
+{
+   boost::replace_all(subject, search, replace);
+}
+
+void Str::split(const std::string& line, std::vector< std::string >& tokens,const std::string& delimiters )
+{
+	// ***************************************************************************
+	//	Time for split 1000000 times = 5.81
+
+	// Skip delimiters at beginning.
+	string::size_type lastPos = line.find_first_not_of( delimiters, 0 );
+
+	// Find first "non-delimiter".
+	string::size_type pos = line.find_first_of( delimiters, lastPos );
+
+	while ( string::npos != pos || string::npos != lastPos ) {
+		tokens.push_back( line.substr( lastPos, pos - lastPos ) ); // Found a token, add it to the vector.
+		lastPos = line.find_first_not_of( delimiters, pos );       // Skip delimiters.  Note the "not_of"
+		pos = line.find_first_of( delimiters, lastPos );           // Find next "non-delimiter"
+	}
+
+//	// ***************************************************************************
+//	// Time for split 1000000 times = 11.66
+//
+//    // FAILS: with line = "\n", since I expect at least one token of "\n"
+//    int i = 0;
+//	char ch;
+//	string word;
+//	while ( (ch = line[i++]) ) {
+//		if ( isspace( ch ) ) {
+//			if ( !word.empty() )  tokens.push_back( word );
+//			word = "";
+//		}
+//		else  word += ch;
+//	}
+//	if ( !word.empty() )  tokens.push_back( word );
+
+// // ******************************************************************************
+// // Time for boost split > 20 seconds, this
+//		boost::algorithm::split(result, line, std::bind2nd(std::equal_to<char>(), ' '));
+//
+// 	// ***************************************************************************
+//	// Time for split 1000000 times = 30.38
+//
+//    // FAILS: with line = "\n", since I expect at least one token of "\n"
+//	char_separator< char > sep( " ",0, boost::drop_empty_tokens );
+//	typedef boost::tokenizer< boost::char_separator< char > > tokenizer;
+//	tokenizer theTokenizer( line, sep );
+//	// std::copy( theTokenizer.begin(), theTokenizer.end(), back_inserter( tokens ) );
+//
+//	for(tokenizer::iterator beg=theTokenizer.begin(); beg!=theTokenizer.end();++beg){
+//		string token = *beg;
+//		boost::algorithm::trim(token);
+//	    if (token.empty()) continue;
+//		tokens.push_back(token);
+//	 }
+}
+
+static bool caseInsCharCompare(char a, char b) { return  (toupper(a) == toupper(b)); }
+
+bool Str::caseInsCompare( const std::string& s1, const std::string& s2)
+{
+	return ( (s1.size() == s2.size()) && equal(s1.begin(),s1.end(), s2.begin(), caseInsCharCompare));
+}
+
+
+struct case_insensitive_less : public std::binary_function< char,char,bool >
+{
+    bool operator () (char x, char y) const {
+        if (toupper(x) == toupper(y)) {
+           return x > y;
+        }
+        return toupper( static_cast< unsigned char >(x)) <
+               toupper( static_cast< unsigned char >(y));
+    }
+};
+bool Str::caseInsLess( const std::string& a, const std::string& b)
+{
+   return std::lexicographical_compare( a.begin(),a.end(),
+           b.begin(),b.end(), case_insensitive_less() );
+}
+
+
+struct case_insensitive_greater : public std::binary_function< char,char,bool >
+{
+    bool operator () (char x, char y) const {
+        if (toupper(x) == toupper(y)) {
+           return x < y;
+        }
+        return toupper( static_cast< unsigned char >(x)) >
+               toupper( static_cast< unsigned char >(y));
+    }
+};
+bool Str::caseInsGreater( const std::string& a, const std::string& b)
+{
+   return std::lexicographical_compare( a.begin(),a.end(),
+           b.begin(),b.end(), case_insensitive_greater() );
+}
+
+
+bool Str::valid_name(const std::string& name, std::string &msg)
+{
+   // valid names are alphabetic (alphanumeric | underscore | .)
+   // however we can't have a leading '.' as that can interfere with trigger expressions
+
+   // verify that the string is not empty
+   if ( name.empty() ) {
+	   msg = "Invalid name. Empty string.";
+	   return false;
+   }
+
+   // verify that the first character is alphabetic or has underscore
+ 	bool result = Str::ALPHANUMERIC_UNDERSCORE().find( name[0], 0 ) != string::npos;
+	if ( !result ) {
+      msg = "Valid names can only consist of alphanumeric characters "
+            ",underscores and dots. The first character can not be a dot: ";
+      msg += name;
+		return false;
+	}
+
+   // verify that any other characters are alphanumeric or underscore
+   if (name.size() > 1) {
+      result = name.find_first_not_of(VALID_NODE_CHARS, 1) == string::npos;
+      if ( !result ) {
+         msg = "Valid names can only consist of alphanumeric characters "
+               ",underscores and dots. The first character can not be a dot: ";
+         msg += name;
+      }
+   }
+
+   return result;
+}
+
+bool Str::valid_name(const std::string& name)
+{
+   // valid names are alphabetic (alphanumeric | underscore | .)
+   // however we can't have a leading '.' as that can interfere with trigger expressions
+
+   // verify that the string is not empty
+   if ( name.empty() ) {
+      return false;
+   }
+
+   // verify that the first character is alphabetic or has underscore
+   bool result = Str::ALPHANUMERIC_UNDERSCORE().find( name[0], 0 ) != string::npos;
+   if ( !result ) {
+      return false;
+   }
+
+   // verify that any other characters are alphanumeric or underscore
+   if (name.size() > 1) {
+      result = name.find_first_not_of(VALID_NODE_CHARS, 1) == string::npos;
+   }
+
+   return result;
+}
+
+int Str::to_int( const std::string& the_str, int error_return)
+{
+	if ( the_str.find_first_of( Str::NUMERIC(), 0 ) != std::string::npos ) {
+		try {
+			return boost::lexical_cast< int >( the_str );
+		}
+		catch ( boost::bad_lexical_cast&) {}
+	}
+	return error_return;
+}
+
+bool Str::truncate_at_start(  std::string& fileContents, size_t max_lines)
+{
+	if (fileContents.empty()) return false;
+
+	/// Truncate from the front
+	size_t no_of_new_lines = 0;
+	for(size_t i =fileContents.size()-1; i >0; --i) {
+		if (fileContents[i] == '\n') no_of_new_lines++;
+		if ( no_of_new_lines >=  max_lines) {
+			fileContents.erase(fileContents.begin(),fileContents.begin() + i +1); //skip new line at start of file
+			return true;
+		}
+	}
+	return false;
+}
+
+bool Str::truncate_at_end(  std::string& fileContents, size_t max_lines)
+{
+   if (fileContents.empty()) return false;
+
+   /// Truncate from the back
+   size_t no_of_new_lines = 0;
+   size_t the_size = fileContents.size();
+   for(size_t i =0; i < the_size; ++i) {
+      if (fileContents[i] == '\n') no_of_new_lines++;
+      if ( no_of_new_lines >=  max_lines) {
+         fileContents.erase(fileContents.begin()+i+1,fileContents.end()); //skip new line at end of file
+         return true;
+      }
+   }
+   return false;
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/Str.hpp b/ecflow_4_0_7/ACore/src/Str.hpp
new file mode 100644
index 0000000..f78b98f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Str.hpp
@@ -0,0 +1,150 @@
+#ifndef STR_HPP_
+#define STR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #50 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class
+//============================================================================
+#include <string.h> //for strcmp
+#include <string>
+#include <vector>
+#include <limits>
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+class Str : private boost::noncopyable {
+public:
+	static int reserve_4()  { return 4; }
+	static int reserve_8()  { return 8; }
+	static int reserve_16() { return 17; }
+	static int reserve_32() { return 32; }
+	static int reserve_64() { return 64; }
+
+	// remove any quotes on the string, else does nothing
+	// "fred" -> fred
+	//  fred  -> fred
+	static void removeQuotes(std::string&);
+
+	// remove any single quotes on the string, else does nothing
+	// 'fred' -> fred
+	//  fred  -> fred
+	static void removeSingleQuotes(std::string&);
+
+	/// Find 'stringToFind' in 'jobLine' and replace with string 'stringToRplace'
+	/// return true if replace ok else returns false;
+   static bool replace(std::string& jobLine, const std::string& stringToFind, const std::string& stringToRplace);
+   static bool replace_all(std::string& jobLine, const std::string& stringToFind, const std::string& stringToRplace);
+   static void replaceall(std::string& jobLine, const std::string& stringToFind, const std::string& stringToRplace);
+
+   // extract data member value, ie given a string of the form:
+   //   str=cmd a b fred:value
+   //   data_member_name=fred:
+   //   extract value
+   static bool extract_data_member_value(const std::string& str, const std::string& data_member_name, std::string& data_member_value);
+
+	/// split string using default delimiters of space and tab as a separator;
+	/// The split is based on *ANY* of the characters in the delimiters.
+	/// **** Hence a delimiter of "==" will still split "a = complete"
+	/// **** sequential delimiter character are ignored ****
+	static void split(const std::string& str,
+	                  std::vector< std::string >& lineTokens,
+	                  const std::string& delimiters = " \t");
+
+	/// case in sensitive string comparison
+	static bool caseInsCompare( const std::string& str1, const std::string& str2);
+
+	/// case insenstive less
+   static bool caseInsLess( const std::string& str1, const std::string& str2);
+
+   /// case insenstive Greater
+   static bool caseInsGreater( const std::string& str1, const std::string& str2);
+
+	/// Used for checking node names
+   static bool valid_name(const std::string& name, std::string &msg);
+   static bool valid_name(const std::string& name);
+
+	/// Use this function when you are not sure if string is convertible to an integer.
+ 	/// This function will check if string has a numeric first & hence faster than
+	/// using boost::lexical_cast< int > alone. Will trap any exception
+	/// will return numeric_limits<int>::max() for invalid conversions
+	static int to_int( const std::string&, int error_return = std::numeric_limits<int>::max() );
+
+	/// Truncate the input string at the start/end if exceeds max_lines_ newlines
+	/// returns true if truncated false otherwise
+   static bool truncate_at_start(  std::string& fileContents, size_t max_lines_);
+   static bool truncate_at_end(  std::string& fileContents, size_t max_lines_);
+
+	/// Only use strcmp if the first characters are the same
+	static int local_strcmp(const char* s, const char* t)
+	{
+	   return (*s != *t ? *s - *t : strcmp(s, t));
+	}
+
+	// returns a static string of alpha numerics and underscore
+   static const std::string& ALPHANUMERIC_UNDERSCORE();
+
+   // returns a static string of numerics chars
+   static const std::string& NUMERIC();
+
+   static const char* CHILD_CMD();
+   static const char* USER_CMD();
+   static const char* SVR_CMD(); // Only for automatic check_pt
+
+	// Allows string to be returned by reference
+	static const std::string& EMPTY() ;
+	static const std::string& ROOT_PATH();      // "/"
+	static const std::string& PATH_SEPERATOR() ; // "/"
+	static const std::string& COLON() ;          // ":"
+
+	static const std::string& STATE_CHANGE();
+
+	static const std::string& TASK();
+	static const std::string& FAMILY();
+   static const std::string& SUITE();
+   static const std::string& ALIAS();
+
+   static const std::string& DEFAULT_PORT_NUMBER(); // "3141"
+	static const std::string& LOCALHOST();
+
+   static const std::string& ECF_PORT();
+   static const std::string& ECF_RID();
+   static const std::string& ECF_TRYNO();
+   static const std::string& ECF_TRIES();
+   static const std::string& ECF_NAME();
+   static const std::string& ECF_NODE();
+   static const std::string& ECF_PASS();
+   static const std::string& ECF_JOB();
+   static const std::string& ECF_JOBOUT();
+   static const std::string& ECF_SCRIPT();
+   static const std::string& ECF_DUMMY_TASK();
+   static const std::string& ECF_MICRO();
+   static const std::string& ECF_FILES();
+   static const std::string& ECF_FETCH();
+   static const std::string& ECF_KILL_CMD();
+   static const std::string& ECF_STATUS_CMD();
+
+   static const std::string& ECF_HOME();
+   static const std::string& ECF_INCLUDE();
+   static const std::string& ECF_JOB_CMD();
+   static const std::string& ECF_OUT();
+   static const std::string& ECF_EXTN();
+   static const std::string& ECF_LOG();
+
+	static const std::string& WHITE_LIST_FILE();
+private:
+	Str(){}
+};
+
+}
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/TimeSeries.cpp b/ecflow_4_0_7/ACore/src/TimeSeries.cpp
new file mode 100644
index 0000000..23ada0f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/TimeSeries.cpp
@@ -0,0 +1,836 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #78 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib
+#include "TimeSeries.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Extract.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+//#define DEBUG_TIME_SERIES 1
+//#define DEBUG_TIME_SERIES_IS_FREE 1
+
+static void testTimeSlot( const ecf::TimeSlot& ts)
+{
+  	if (ts.hour() < 0 || ts.hour() > 23) {
+ 		std::stringstream ss; ss << "TimeSeries:  time hour(" << ts.hour() << ") must be in range 0-23";
+     	throw std::out_of_range(ss.str());
+  	}
+  	if (ts.minute() < 0 || ts.minute() > 59) {
+ 		std::stringstream ss; ss << "TimeSeries:  time minute(" << ts.minute() << ") must be in range 0-59";
+     	throw std::out_of_range(ss.str());
+  	}
+}
+
+namespace ecf {
+
+TimeSeries::TimeSeries()
+: relativeToSuiteStart_(false),
+  isValid_(true),
+  relativeDuration_(0,0,0,0),
+  lastTimeSlot_(0,0,0,0) {}
+
+TimeSeries::TimeSeries(int hour, int minute, bool relative)
+: relativeToSuiteStart_(relative),
+  isValid_(true),
+  start_(hour,minute),
+  nextTimeSlot_(hour,minute),
+  relativeDuration_(0,0,0,0),
+  lastTimeSlot_(start_.duration())
+{
+	testTimeSlot(start_);
+}
+
+TimeSeries::TimeSeries(const TimeSlot& t,bool relative)
+: relativeToSuiteStart_(relative),
+  isValid_(true),
+  start_(t),
+  nextTimeSlot_(t),
+  relativeDuration_(0,0,0,0),
+  lastTimeSlot_(t.duration())
+{
+	testTimeSlot(start_);
+}
+
+TimeSeries::TimeSeries(const TimeSlot& start, const TimeSlot& finish, const TimeSlot& incr,bool relative)
+: relativeToSuiteStart_(relative),
+  isValid_(true),
+  start_( start ),
+  finish_( finish ),
+  incr_( incr ),
+  nextTimeSlot_( start ),
+  relativeDuration_(0,0,0,0)
+{
+	testTimeSlot(start);
+	testTimeSlot(finish);
+	testTimeSlot(incr);
+
+ 	if (!finish_.isNULL()) {
+ 		if (incr_.isNULL()) {
+ 	 		std::stringstream ss;
+ 			ss << "TimeSeries::TimeSeries: Invalid time series: Finish specified without an increment";
+ 			throw std::out_of_range( ss.str() );
+ 		}
+ 	}
+
+ 	if (start.duration() > finish.duration()) {
+ 		std::stringstream ss;
+ 		ss << "TimeSeries::TimeSeries: Invalid time series: Start time("
+ 		   << start.toString()  << ") is greater than end time(" <<  finish.toString() << ")";
+		throw std::out_of_range( ss.str() );
+	}
+ 	if ( incr.hour() == 0 && incr.minute() == 0 ) {
+ 		throw std::out_of_range( "TimeSeries::TimeSeries Invalid time series:  Increment must be greater than 0 minutes.");
+ 	}
+ 	boost::posix_time::time_duration diff = finish.duration() - start.duration();
+ 	if ( incr.duration() > diff) {
+ 		std::stringstream ss;
+ 		ss << "TimeSeries::TimeSeries: Invalid time series: Increment(" << incr.toString() <<  ") is greater than duration "
+			<< to_simple_string(diff)
+			<< " between start(" << start.toString() << ") and finish(" << finish.toString() << ")";
+ 		throw std::out_of_range(ss.str());
+  	}
+
+ 	compute_last_time_slot();
+
+#ifdef DEBUG_TIME_SERIES
+	cout << "TimeSeries::TimeSeries "  << dump() << "\n";
+#endif
+}
+
+bool TimeSeries::operator<(const TimeSeries& rhs) const
+{
+   return start_ < rhs.start_;
+}
+
+void TimeSeries::compute_last_time_slot()
+{
+   if (!finish_.isNULL()) {
+      lastTimeSlot_ = start_.duration();
+      while ( lastTimeSlot_ <= finish_.duration())  lastTimeSlot_ += incr_.duration();
+      lastTimeSlot_ -= incr_.duration();
+   }
+}
+
+bool TimeSeries::calendarChanged( const ecf::Calendar& c )
+{
+   if ( relativeToSuiteStart_ ) {
+      relativeDuration_ += c.calendarIncrement();
+      return true;
+   }
+	else if (c.dayChanged()) {
+
+	   // Clear expired flag and next slot. Needed since requue will expire flag when past time slot
+	   // Hence we need something to reset. Otherwise for next day isFree will always return false;
+      isValid_ = true;
+      nextTimeSlot_ = start_;
+      return true;
+	}
+   return false;
+}
+
+bool TimeSeries::resetRelativeDuration()
+{
+	if ( relativeToSuiteStart_ ) {
+	   relativeDuration_ = time_duration(0,0,0,0);
+	   return true;
+	}
+#ifdef DEBUG_TIME_SERIES
+	cout << "TimeSeries::resetRelativeDuration "  << dump() << "\n";
+#endif
+	return false;
+}
+
+void TimeSeries::reset(const ecf::Calendar& c)
+{
+ 	isValid_ = true;
+ 	nextTimeSlot_ = start_;
+
+	(void)resetRelativeDuration();
+
+	// Note: **difference between reset and re-queue,
+	//  Hence if at begin(), time slot same as current time, allow job to run.
+	//  reset  : while( current_time >  nextTimeSlot_.duration()) {  // need for why command
+	//              if (current_time >  start_.duration() ) {
+	//  requeue: while( current_time >= nextTimeSlot_.duration()) {
+	//              if (current_time >= start_.duration() ) {
+
+   // Update nextTimeSlot_ so that why command works out of the box, when nodes have been begun.
+   // *if* the current time is *AT* the start do *not* increment nextTimeSlot_, otherwise we will miss first time slot
+ 	time_duration current_time = duration(c);
+   if (hasIncrement()) {
+
+      // only used when we have a series
+      suiteTimeAtReque_ = TimeSlot(c.suiteTime().time_of_day());
+      //cout << "TimeSeries::reset  suiteTimeAtReque_: " << suiteTimeAtReque_ << " =====================================================\n";
+
+      while( current_time > nextTimeSlot_.duration()) {
+         time_duration value = nextTimeSlot_.duration();
+         value += incr_.duration();
+         nextTimeSlot_ = TimeSlot(value.hours(),value.minutes());
+      }
+      if (nextTimeSlot_ > finish_) {
+         isValid_ = false;  // time has expired
+      }
+   }
+   else {
+      if (current_time > start_.duration() ) {
+         isValid_ = false; // time has expired
+      }
+   }
+
+#ifdef DEBUG_TIME_SERIES
+	LogToCout toCoutAsWell;
+	LOG(Log::DBG,"      TimeSeries::reset   "  << dump());
+#endif
+}
+
+void TimeSeries::requeue(const ecf::Calendar& c,bool reset_next_time_slot)
+{
+   // cout << "TimeSeries::requeue " << c.toString()  << "\n";
+
+   // *RESET* to handle case where time slot has been advanced, but at requeue it must be reset
+   // This is important otherwise user can never reset and time slot that had been advanced
+   // by using miss_next_time_slot()
+   if (reset_next_time_slot) {
+      isValid_ = true;
+      nextTimeSlot_ = start_;
+   }
+
+	//   time 13:00 // nextTimeSlot_ is initialised to 13:00, on TimeSeries::requeue() invalidate time series
+	//              // to stop multiple job submissions on same time slot
+	//                       -------------------- nextTimeSlot_
+	//                       |     -------------- isValid = false
+	//                       V     V
+	//   10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00
+	//     |     |     |     |     |     |     |     |     |     |     |
+	//  ------time----------->
+	//
+	// TimeSeries::requeue(..) is called at the *re-queue* stage. *after*:
+	//   a/ task has completed
+	//   b/ checkForRequeue() has passed.
+	// hence if we get here for a single slot time, where calendar time >= start time
+	// then this time series is no longer valid. This will stop multiple job submission
+	// for the same time slot
+   time_duration current_time = duration(c);
+	if (!hasIncrement()) {
+		if (current_time >= start_.duration() ) {
+			isValid_ = false; // time has expired
+#ifdef DEBUG_TIME_SERIES
+	 	 	LOG(Log::DBG,"      TimeSeries::increment (duration(c) >= start_.duration() ) "  << toString() << " duration=" << to_simple_string(duration(c)));
+#endif
+		}
+		return;
+	}
+
+	// only used when we have a series
+   suiteTimeAtReque_ = TimeSlot(c.suiteTime().time_of_day());
+//   cout << "TimeSeries::requeue suiteTimeAtReque_: " << suiteTimeAtReque_ << " =====================================================\n";
+
+	// the nextTimeSlot_ needs to be set to a multiple of incr
+	// However the nextTimeSlot_ can not just be incremented by incr
+	// since we can't assume that a task completes within the given time slots
+	// *hence increments to NEXT TIME SLOT large than calendar time.
+	// time 10::00 20:00 01:00
+	//                       --------------------------------------------------------nextTimeSlot_ must greater than current time.
+	//                       |                                               --------isValid = false
+	//                       V                                               V
+	//   10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00
+	//     |     |     |     |     |     |     |     |     |     |     |     |
+	//  ------time---->
+	//
+ 	while( current_time >= nextTimeSlot_.duration()) {
+		time_duration value = nextTimeSlot_.duration();
+		value += incr_.duration();
+		nextTimeSlot_ = TimeSlot(value.hours(),value.minutes());
+#ifdef DEBUG_TIME_SERIES
+ 	 	LOG(Log::DBG,"      TimeSeries::increment "  << toString());
+#endif
+	}
+
+ 	if (nextTimeSlot_ > finish_) {
+		isValid_ = false;              // time has expired
+	   suiteTimeAtReque_ = TimeSlot(); // expire for new requeue
+#ifdef DEBUG_TIME_SERIES
+ 	 	LOG(Log::DBG,"      TimeSeries::increment "  << toString());
+#endif
+ 	}
+}
+
+TimeSlot TimeSeries::compute_next_time_slot(const ecf::Calendar& c) const
+{
+   // This functionality needs to mirror TimeSeries::requeue
+   time_duration current_time = duration(c);
+   if (!hasIncrement()) {
+      if (current_time >= start_.duration() ) {
+         return TimeSlot(); // time has expired
+      }
+      return start_;
+   }
+
+   TimeSlot nextTimeSlot = start_;
+   while( current_time >= nextTimeSlot.duration()) {
+      time_duration value = nextTimeSlot.duration();
+      value += incr_.duration();
+      nextTimeSlot = TimeSlot(value.hours(),value.minutes());
+   }
+
+   if (nextTimeSlot > finish_) {
+      return TimeSlot();  // time has expired
+   }
+   return nextTimeSlot;
+}
+
+bool TimeSeries::requeueable(const ecf::Calendar& c) const
+{
+   boost::posix_time::time_duration calendar_time = duration(c);
+   if (calendar_time < start().duration()) return true;
+   if (hasIncrement()) {
+      if (calendar_time < finish().duration()) {
+         return true;
+      }
+   }
+   return false;
+}
+
+bool TimeSeries::isFree(const ecf::Calendar& calendar) const
+{
+#ifdef DEBUG_TIME_SERIES_IS_FREE
+	LogToCout toCoutAsWell; Indentor indent;
+#endif
+
+	if (!isValid_) {
+	   // time has expired, hence time is not free
+#ifdef DEBUG_TIME_SERIES_IS_FREE
+   	 	LOG(Log::DBG,"TimeSeries::isFree (!isValid_) HOLDING "  << dump());
+#endif
+		return false;
+	}
+
+	// Matched calendar duration with the current value of the time series
+	// or match with one of time slots.
+
+	// Note:: the definition file has time series format of hh:mm this
+	//        means we have a minute resolution. The clock/calendar
+	//        duration has seconds based resolution. hence we must
+	//        compensate for this.
+ 	//
+ 	//   time 10:00 20:00 01:00
+ 	//   start
+ 	//     |                 ----- next time slot                      --- finish
+ 	//     |                 |                                         |
+ 	//     V                 V                                         V
+ 	//   10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00
+ 	//     |     |     |     |     |     |     |     |     |     |     |
+ 	//  ------time---->
+ 	//
+	bool ret = match_duration_with_time_series(duration(calendar));
+//	if (ret) {
+//	   std::cout << "TimeSeries::isFree " << dump() << " is free at calendar: " << calendar.toString() << "\n";
+//	}
+	return ret;
+}
+
+
+bool TimeSeries::match_duration_with_time_series(const boost::posix_time::time_duration& relative_or_real_td) const
+{
+#ifdef DEBUG_TIME_SERIES_IS_FREE
+	Indentor ident;
+#endif
+
+	if ( !hasIncrement() ) {
+		// We ignore seconds, hence +00:02  will match 2.58 (two minutes 58 seconds) relative duration
+		time_duration start_td = start_.duration();
+		if ( relative_or_real_td.hours() == start_td.hours() && relative_or_real_td.minutes() == start_td.minutes()) {
+#ifdef DEBUG_TIME_SERIES_IS_FREE
+			LOG(Log::DBG,"TimeSeries::match_duration_with_time_series " << dump() << " FREE at " << to_simple_string(relative_or_real_td));
+#endif
+			return true;
+		}
+
+#ifdef DEBUG_TIME_SERIES_IS_FREE
+		LOG(Log::DBG,"TimeSeries::match_duration_with_time_series " << dump() << " HOLDING at " << to_simple_string(relative_or_real_td));
+#endif
+ 		return false;
+	}
+
+	time_duration endDuration = finish_.duration();
+	time_duration incrDuration = incr_.duration();
+	time_duration nextTimeSlot_td = nextTimeSlot_.duration();
+	long hours = relative_or_real_td.hours();
+	long minutes = relative_or_real_td.minutes();
+ 	while ( nextTimeSlot_td <= endDuration ) {
+
+		if ( hours ==  nextTimeSlot_td.hours() && minutes == nextTimeSlot_td.minutes()) {
+#ifdef DEBUG_TIME_SERIES_IS_FREE
+			LOG(Log::DBG,"TimeSeries::match_duration_with_time_series (nextTimeSlot_td == duration)  " << dump()
+			    			    << " FREE at " << to_simple_string(relative_or_real_td));
+#endif
+ 			return true;
+		}
+		nextTimeSlot_td += incrDuration;
+	}
+
+#ifdef DEBUG_TIME_SERIES
+	LOG(Log::DBG,"TimeSeries::matches HOLDING (nextTimeSlot_td > endDuration)  " << dump() << " HOLDING at " << to_simple_string(relative_or_real_td));
+#endif
+ 	return false;
+}
+
+void TimeSeries::miss_next_time_slot()
+{
+   if ( !hasIncrement()) {
+      // single slot, does not have a next time slot, hence expire time
+      isValid_ = false;
+   }
+   else {
+      time_duration value = nextTimeSlot_.duration();
+      value += incr_.duration();
+      nextTimeSlot_ = TimeSlot(value.hours(),value.minutes());
+      if (nextTimeSlot_ > finish_) {
+         // time has expired,
+         isValid_ = false;
+      }
+   }
+}
+
+bool TimeSeries::checkForRequeue( const ecf::Calendar& calendar, const TimeSlot& the_min, const TimeSlot& the_max) const
+{
+   // ************************************************************************
+   // THIS IS CALLED IN THE CONTEXT WHERE NODE HAS COMPLETED. Hence ****asyncronous****
+   // RETURNING TRUE FROM HERE WILL FORCE NODE TO QUEUED STATE
+   // HENCE THIS FUNCTION MUST RETURN FALSE, WHEN END OF TIME SLOT HAS BEEN REACHED/expired
+   // The resolution is in minutes
+   // *************************************************************************
+   //cout << "TimeSeries::checkForRequeue " << calendar.toString() << "\n";
+
+   if (!isValid_) {
+      // time has expired, hence can no longer re-queues, i.e no future time dependency
+      return false;
+   }
+
+   if ( hasIncrement()) {
+      // Note if we are equal to the finish and were called as part of completeCmd
+      // then completeCmd will initiate a job submission immediately
+      //  start  00:01
+      //  finish 00:04   Node will be queued 4 times
+      //  incr   00:01
+
+      // If the current value is greater that finish, then returning true would increment
+      // value past the end, and force node state to be stuck in state queue.
+      if ( nextTimeSlot_ > finish_ ) {
+         return false;
+      }
+
+      // ECFLOW-130 jobs that start before midnight and finish after midnight should not requeue
+      if (!suiteTimeAtReque_.isNULL()){
+         TimeSlot suiteTimeNow(calendar.suiteTime().time_of_day());
+         //cout << "TimeSeries::checkForRequeue suiteTimeNow = " << suiteTimeNow << " =====================================================\n";
+         // we use >= specifically for unit test, to pass.
+         if ( suiteTimeNow >= suiteTimeAtReque_) {
+            // normal flow, i.e same day
+            suiteTimeAtReque_ = TimeSlot(); // make NULL, allow reque to reset.
+         }
+         else {
+            // The day changed between (requeue/reset):->queued->submitted->active->complete->(checkForRequeue)
+            //cout << "TimeSeries::checkForRequeue day changed =====================================================\n";
+            return false;
+         }
+      }
+
+      time_duration calendar_duration = duration(calendar);
+      if ( calendar_duration < lastTimeSlot_) {
+         return true;
+      }
+      return false;
+   }
+
+   // *** When we have a single time slots we can not make a decision, whether
+   // *** we should re-queue based on this attribute *alone*. (i.e when we have > 1 time/today attributes)
+   // *** Hence we pass min and max time slots, over all the time bases attributes of the same kind.
+   // *** In our case we only do this for Time and Today attributes.
+   // *** The the_min/the_max have been computed for all attribute (i.e single time slots and ranges)
+
+   // We have a single time slot, *OR* multiple with same time slot
+   if (the_min == the_max) {
+      return false;
+   }
+
+   // The the_min/the_max takes into account *all* start/finish Time and Today attributes
+   time_duration calendar_duration = duration(calendar);
+   if (calendar_duration < the_max.duration()) {
+      return true;
+   }
+
+   return false;
+}
+
+
+void TimeSeries::min_max_time_slots(TimeSlot& the_min, TimeSlot& the_max) const
+{
+   if (the_min.isNULL() || start_ < the_min) the_min = start_;
+   if (the_max.isNULL() || start_ > the_max) the_max = start_;
+   if (hasIncrement()) {
+      if (finish_ < the_min) the_min = finish_;
+      if (finish_ > the_max) the_max = finish_;
+   }
+}
+
+
+void TimeSeries::why(const ecf::Calendar& c, std::string& theReasonWhy) const
+{
+	std::stringstream ss;
+	ss << " ( next run time is ";
+	if (relativeToSuiteStart_) ss << "+";
+	ss << nextTimeSlot_.toString();
+
+
+	TimeSlot currentTime = TimeSlot(duration(c));
+	ss << ", current suite time is ";
+	if (relativeToSuiteStart_) ss << "+";
+	ss << currentTime.toString()  << " )";
+	theReasonWhy += ss.str();
+}
+
+boost::posix_time::time_duration TimeSeries::duration(const ecf::Calendar& c ) const
+{
+	// return with a minute resolution
+	if ( relativeToSuiteStart_ ) {
+
+ 		// relative to suite start only
+		return boost::posix_time::time_duration( relativeDuration_.hours(), relativeDuration_.minutes(), 0, 0 );
+	}
+
+	LOG_ASSERT(!c.suiteTime().is_special(),"init has not been called on calendar. TimeSeries::duration");
+	time_duration time_of_day = c.suiteTime().time_of_day();
+	return boost::posix_time::time_duration( time_of_day.hours(), time_of_day.minutes(), 0, 0 );
+}
+
+
+void TimeSeries::free_slots(std::vector<boost::posix_time::time_duration>& vec) const
+{
+   if (hasIncrement()) {
+
+      time_duration i = start_.duration();
+      time_duration endDuration = finish_.duration();
+      time_duration incrDuration = incr_.duration();
+      while ( i < endDuration ) {
+         vec.push_back(i);
+         i += incrDuration;
+      }
+      vec.push_back(finish_.duration());
+      return;
+   }
+
+   vec.push_back(start_.duration());
+}
+
+bool TimeSeries::structureEquals(const TimeSeries& rhs) const
+{
+   if (relativeToSuiteStart_ != rhs.relativeToSuiteStart_)    return false;
+   if ( start_ != rhs.start_)   return false;
+   if ( finish_ != rhs.finish_) return false;
+   if ( incr_ != rhs.incr_)     return false;
+   return true;
+}
+
+bool TimeSeries::operator==(const TimeSeries& rhs) const
+{
+	// additional state
+	if (isValid_ != rhs.isValid_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeSeries::operator==  ( isValid_ != rhs.isValid_) \n";
+      }
+#endif
+	   return false;
+	}
+	if (nextTimeSlot_ != rhs.nextTimeSlot_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeSeries::operator==  ( nextTimeSlot_ != rhs.nextTimeSlot_) \n";
+      }
+#endif
+	   return false;
+	}
+	if (relativeDuration_ != rhs.relativeDuration_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeSeries::operator==  ( relativeDuration_ != rhs.relativeDuration_) \n";
+      }
+#endif
+	   return false;
+	}
+	return structureEquals(rhs);
+}
+
+std::ostream& TimeSeries::print(std::ostream& os) const
+{
+	os << toString() << "\n";
+	return os;
+}
+
+std::string TimeSeries::toString() const
+{
+   std::string ret ;
+   if (relativeToSuiteStart_) ret += "+";
+   ret += start_.toString();
+   if (!finish_.isNULL()) {
+      ret += " ";
+      ret += finish_.toString();
+      ret += " ";
+      ret += incr_.toString();
+   }
+   return ret;
+}
+
+std::string TimeSeries::dump() const
+{
+	std::stringstream ss;
+	ss << toString();
+	ss << " isValid_(" << isValid_ << ")";
+	ss << " value(" << nextTimeSlot_.toString() << ")";
+	ss << " relativeDuration_(" <<  to_simple_string( relativeDuration_) << ")";
+ 	ss << " lastTimeSlot_(" <<  to_simple_string(lastTimeSlot_) << ")";
+ 	return ss.str();
+}
+
+bool TimeSeries::checkInvariants(std::string& errormsg) const
+{
+	if (!finish_.isNULL()) {
+		if (incr_.isNULL()) {
+			errormsg += "TimeSeries::checkInvariants increment cannot be NULL when we have a time series";
+			cout <<  errormsg << "  " << toString() << "\n";
+			return false;
+		}
+		if (incr_.hour() == 0 && incr_.minute() == 0) {
+			errormsg += "TimeSeries::checkInvariants increment must greater than zero";
+			cout <<  errormsg << "  " << toString() << "\n";
+ 			return false;
+		}
+
+		if (start_.duration() > finish_.duration() ) {
+			errormsg += "TimeSeries::checkInvariants Invalid time series start() > finish()";
+			cout <<  errormsg << "  " << toString() << "\n";
+ 			return false;
+		}
+
+		if (lastTimeSlot_ <= start_.duration() && lastTimeSlot_ > finish_.duration()) {
+			errormsg += "TimeSeries::checkInvariants Invalid last time slot";
+			cout <<  errormsg << "  " << toString() << "\n";
+			return false;
+		}
+	}
+	if ( relativeDuration_.is_special()) {
+		errormsg += "TimeSeries::checkInvariants relativeDuration_ should not be special";
+		cout <<  errormsg << "  " << toString() << "\n";
+		return false;
+	}
+	if (relativeToSuiteStart_  && relativeDuration_.hours() > 99) {
+		errormsg += "TimeSeries::checkInvariants. Max relative duration is 99 hours & 59 minutes";
+		cout <<  errormsg << "  " << toString() << "\n";
+		return false;
+	}
+
+
+	if (!relativeToSuiteStart_ && relativeDuration_.total_seconds() > 0) {
+		errormsg += "TimeSeries::checkInvariants Can only have RelativeDuration if relativeToSuiteStart_ flag is set";
+		cout <<  errormsg << "  " << toString() << "\n";
+		return false;
+	}
+
+	return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const TimeSeries* d) {
+	if (d) return d->print(os);
+	return os << "TimeSlot == NULL";
+}
+std::ostream& operator<<(std::ostream& os, const TimeSeries& d)  { return d.print(os); }
+
+
+ecf::TimeSeries TimeSeries::create(const std::string& str)
+{
+	std::vector<std::string> lineTokens;
+	Str::split(str,lineTokens);
+	size_t index = 0;
+	return TimeSeries::create(index,lineTokens );
+}
+
+std::string TimeSeries::state_to_string(bool isFree) const
+{
+   // *IMPORTANT* we *CANT* use ';' character, since is used in the parser, when we have
+   //             multiple statement on a single line i.e.
+   //                 task a; task b;
+   //             Hence use of '/' character
+   // time 10:30 # free isValid:false nextTimeSlot/10:30 relativeDuration/00:00:00
+   std::string ret;
+   bool next_time_slot_changed = ( nextTimeSlot_ != start_);
+   bool relative_duration_changed = (!relativeDuration_.is_special() && relativeDuration_.total_seconds() != 0);
+   if (isFree || !isValid_ || next_time_slot_changed || relative_duration_changed) {
+      ret += " #";
+      if (isFree) ret += " free";
+      if (!isValid_) ret += " isValid:false";
+      if (next_time_slot_changed) { ret += " nextTimeSlot/"; ret += nextTimeSlot_.toString(); }
+      if (relative_duration_changed) { ret += " relativeDuration/"; ret += to_simple_string(relativeDuration_); }
+   }
+   return ret;
+}
+
+void TimeSeries::parse_state(size_t index,const std::vector<std::string>& lineTokens, ecf::TimeSeries& ts)
+{
+   // *IMPORTANT* we *CANT* use ';' character, since is used in the parser, when we have
+   //             multiple statement on a single line i.e.
+   //                 task a; task b;
+   //             Hence use of '/' character
+   //
+   // Here free is attribute state & not time series state hence ignore
+   // time 10:30              # free isValid:false nextTimeSlot/10:30 relativeDuration/00:00:00
+   // cron 10:00 20:00 01:00  # free isValid:false nextTimeSlot/10:30 relativeDuration/00:00:00
+   bool comment_fnd = false;
+   for(size_t i = index; i < lineTokens.size(); i++) {
+      if (comment_fnd) {
+         if (lineTokens[i] == "isValid:false") { ts.isValid_ = false; continue;}
+         if (lineTokens[i].find("nextTimeSlot") != std::string::npos) {
+            std::string nextTimeSlot;
+            if (Extract::split_get_second(lineTokens[i],nextTimeSlot,'/')) {
+               // Note: we do *not* check for valid time since nextTimeSlot, can be incremented past 24 hours, ie
+               // cron 00:00 18:00 06:00 # isValid:false nextTimeSlot/24:00
+               int startHour = -1;
+               int startMin = -1;
+               getTime( nextTimeSlot, startHour, startMin, false/*check_time*/);
+               ts.nextTimeSlot_ = TimeSlot(startHour, startMin);
+            }
+            else throw std::runtime_error("TimeSeries::parse_state: could not extract state.");
+         }
+         if (lineTokens[i].find("relativeDuration") != std::string::npos) {
+             std::string relativeDuration;
+             if (Extract::split_get_second(lineTokens[i],relativeDuration,'/')) {
+                ts.relativeDuration_ = time_duration(duration_from_string(relativeDuration));
+             }
+             else throw std::runtime_error("TimeSeries::parse_state: could not extract state.");
+          }
+      }
+      if (lineTokens[i] == "#") comment_fnd = true;
+   }
+   ts.compute_last_time_slot();
+}
+
+ecf::TimeSeries TimeSeries::create( size_t& index,const std::vector<std::string>& lineTokens,bool read_state )
+{
+	assert( index < lineTokens.size() );
+	int startHour = -1;
+	int startMin = -1;
+
+	// cron 10:00 20:00 01:00
+	// index is on 10:00, ie index should have value of 1 in this case
+	string startStr = lineTokens[index];
+	bool relative = false;
+	if ( startStr[0] == '+' ) {
+		relative = true;
+		startStr.erase( startStr.begin() ); // remove leading +
+		// string must be of form 12:00
+	}
+	getTime( startStr, startHour, startMin );
+	TimeSlot start( startHour, startMin );
+
+	index++; // on 20:00
+	if ( index < lineTokens.size() && lineTokens[index][0] != '#' ) {
+
+		// if third token is not a comment the time must be of the form
+		// cron 10:00 20:00 01:00
+		if ( index+1 >= lineTokens.size() ) throw std::runtime_error( "TimeSeries::create: Invalid time series :");
+
+		int finishHour = -1;
+		int finishMin = -1;
+		getTime( lineTokens[index], finishHour, finishMin );
+		TimeSlot finish( finishHour, finishMin );
+
+		index++;
+
+	   int incrHour = -1;
+	   int incrMin = -1;
+		getTime( lineTokens[index], incrHour, incrMin );
+ 		TimeSlot incr( incrHour, incrMin );
+
+
+ 		if (read_state) {
+ 		   TimeSeries ts(start,finish,incr,relative);
+ 		   parse_state(index,lineTokens,ts);
+ 		   return ts;
+ 		}
+		return TimeSeries(start,finish,incr,relative);
+	}
+
+   if (read_state) {
+      TimeSeries ts(start,relative);
+      parse_state(index,lineTokens,ts);
+      return ts;
+   }
+	return TimeSeries(start,relative);
+}
+
+bool TimeSeries::getTime(const std::string& time, int& hour, int& min,bool check_time)
+{
+	// HH:MM
+	// +HH:MM  for other clients
+	size_t colonPos = time.find_first_of(':');
+	if (colonPos == string::npos)  throw std::runtime_error("TimeSeries::getTime: Invalid time :'" + time + "'");
+
+	std::string theHour ;
+	bool relative = false;
+	if ( time[0] == '+') {
+		relative = true;
+		theHour = time.substr(1,colonPos-1);
+ 	}
+	else theHour = time.substr(0,colonPos);
+
+ 	std::string theMin = time.substr(colonPos+1);
+
+	if (theHour.size() != 2) throw std::runtime_error("TimeSeries::getTime: Invalid hour :" + theHour);
+	if (theMin.size()  != 2) throw std::runtime_error("TimeSeries::getTime: Invalid minute :" + theMin);
+
+   hour = Extract::theInt(theHour,"TimeSeries::getTime: hour must be a integer : " + theHour);
+	min =  Extract::theInt(theMin,"TimeSeries::getTime: minute must be integer : " + theMin);
+
+	if (check_time) testTime(hour,min);
+	return relative;
+}
+
+void TimeSeries::testTime(int hour, int minute)
+{
+	if (hour == -1 || minute == -1) {
+     	throw std::runtime_error("TimeSeries::testTime: Failed to extract time");
+ 	}
+ 	if (hour < 0 || hour > 23) {
+ 		std::stringstream ss; ss << "TimeSeries::testTime: time hour(" << hour << ") must be in range 0-23";
+     	throw std::runtime_error(ss.str());
+  	}
+  	if (minute < 0 || minute > 59) {
+ 		std::stringstream ss; ss << "TimeSeries::testTime: time minute(" << minute << ") must be in range 0-59";
+     	throw std::runtime_error(ss.str());
+  	}
+}
+
+}
+
diff --git a/ecflow_4_0_7/ACore/src/TimeSeries.hpp b/ecflow_4_0_7/ACore/src/TimeSeries.hpp
new file mode 100644
index 0000000..7bac42d
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/TimeSeries.hpp
@@ -0,0 +1,215 @@
+#ifndef TIMESERIES_HPP_
+#define TIMESERIES_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #57 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : A single or set of times
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "TimeSlot.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/date_time/posix_time/time_serialize.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+namespace ecf { class Calendar;} // forward declare class
+
+namespace ecf {
+/// TimeSeries can have a single time slot or a series of time slots
+///
+///
+/// We need nextTimeSlot_ data member to record the next valid time slot, otherwise when
+/// we have a time series, all times within the time series would be valid for
+/// Job submission. We do not know how long a job will run, hence when incrementing
+/// the nextTimeSlot_, we need the *NEXT* available time slot *after* the current calendar time.
+///
+/// Usage pattern is :
+///           TimeSeries.calendarChanged()   // Called every minute. Calls isFree(). Once free we stay free, until requeue.
+///                                          // At midnight clear time expiration and reset next time slot
+///           TimeSeries.isFree(..)          // called when node is QUEUED:
+///                                          // during dependency evaluation, checks next time slot, against calendar time
+///                                          // Once free a node stays free, until requeue()
+///           TimeSeries.checkForRequeue();  // called when node is COMPLETE: Checks if next available time slot is valid
+///                                          // *Must* return false for last time slot
+///                                          // ECFLOW-130 jobs that start before midnight and finish after midnight should not requeue
+///           TimeSeries.requeue();          // called when node is re-queued.
+///                                          // Sets value to next valid time slot after calendar time.
+///                                          // Can *expire* the time, relies on TimeSeries.calendarChanged() to clear time expiration
+///                                          // after midnight
+/// ECFLOW-130 jobs that start before midnight and finish after midnight should not requeue
+
+// Use compiler, destructor, copy constructor and assignment operator
+class TimeSeries  {
+public:
+	TimeSeries();
+	TimeSeries(int hour, int minute, bool relativeToSuiteStart = false );
+	TimeSeries(const TimeSlot&, bool relativeToSuiteStart = false );
+	TimeSeries(const TimeSlot& start, const TimeSlot& finish, const TimeSlot& incr,bool relativeToSuiteStart = false);
+
+   bool operator<(const TimeSeries& rhs) const;
+
+	// returns true if a state change is made
+   // Will clear time expiration flag at midnight
+   bool calendarChanged( const ecf::Calendar& c);
+
+	// relative duration stored locally since it can be reset, when used with repeats
+	// returns true if relative duration is reset/ i.e state change has been made
+	bool resetRelativeDuration();
+	void reset(const ecf::Calendar& c);
+
+	// Increment time series. Will find the next time slot after current calendar
+	// record the current suite time, to check of jobs finish after midnight
+	void requeue(const ecf::Calendar& c,bool reset_next_time_slot = true);
+
+	// Since we can miss next time slot , allow its computation for the
+	// use with why command, returns a NULL timeslot if next time is invalid
+	// This functionality will mirror the requeue(..) function
+   TimeSlot compute_next_time_slot(const ecf::Calendar& c) const;
+
+   // Return true calendar is before or within scheduled time
+   bool requeueable(const ecf::Calendar& c) const;
+
+	/// if relativeToSuiteStart returns the relative duration, else returns calendar suite time of day.
+	/// The returned resolution is in minutes
+ 	boost::posix_time::time_duration duration(const ecf::Calendar& calendar ) const;
+
+ 	/// If time has expired, returns false
+	/// Note: relative means relative to suite start, or relative to the beginning of repeated node.
+ 	/// Is of the form hh:mm.   This means relative has a range 00:00->99.59
+	/// For a single slot time series, should not be re queued again, and hence
+	/// should fail checkForRequeue. Likewise when the the current value is
+	/// the finish, then node should also not be re queued, otherwise the
+	/// node will be stuck in queued state.
+	bool isFree(const ecf::Calendar& calendar) const;
+
+	/// For single slot time based attributes we need additional context (i.e the_min,the_max parameter)
+	/// in order to determine whether we should re-queue.
+	/// Additionally when we have a time range, what if the last jobs runs over midnight. In this case
+	/// we need to return false. i.e do not re-queue ECFLOW-130
+   bool checkForRequeue( const ecf::Calendar& calendar, const TimeSlot& the_min, const TimeSlot& the_max) const;
+
+   void min_max_time_slots(TimeSlot& the_min, TimeSlot& the_max) const;
+
+	// Called when explicitly Free holding time dependency. via FreeDepCmd
+	// We want to avoid the next time slot.
+   void miss_next_time_slot();
+
+ 	void why(const ecf::Calendar&, std::string& theReasonWhy) const;
+
+ 	bool hasIncrement() const { return !finish_.isNULL();}
+	const TimeSlot& start()  const  { return start_; }
+	const TimeSlot& finish() const  { return finish_;}
+	const TimeSlot& incr()   const  { return incr_;  }
+	const TimeSlot& value()  const  { return nextTimeSlot_; }
+	bool relative()  const  { return relativeToSuiteStart_; }
+	void free_slots(std::vector<boost::posix_time::time_duration>& ) const;
+
+	std::ostream& print(std::ostream&) const;
+ 	bool operator==(const TimeSeries& rhs) const;
+	bool operator!=(const TimeSeries& rhs) const { return !operator==(rhs);}
+   bool structureEquals(const TimeSeries& rhs) const;
+
+	/// returns true if no time specified
+	bool isNULL() const { return  start_.isNULL(); }
+
+   std::string state_to_string(bool isFree) const;
+   std::string toString() const;
+  	std::string dump() const;
+ 	bool checkInvariants(std::string& errormsg) const;
+
+	/// expects HH:MM or +HH:MM will throw std:runtime_error for errors,
+ 	/// *if* hour not in range(0-24), minutes(0-59), *and* check_time parameter is enabled
+	static bool getTime(const std::string& time, int& hour, int& min, bool check_time = true);
+
+	/// extract string like
+	///     time +00:00 20:00 00:10 # this is a comment which will be ignored. index = 1
+	///     time +20:00        // index = 1
+	///     today 20:00        // index = 1
+	///     +00:00 20:00 00:10 // index = 0
+	///     +20:00             // index = 0
+	/// will throw std:runtime_error for errors
+	/// will assert if index >= lineTokens.size()
+	static ecf::TimeSeries create(size_t& index, // where we should start
+	                              const std::vector<std::string>& lineTokens,
+	                              bool read_state = false);
+
+	// like above but string should not contain "time"
+	static ecf::TimeSeries create(const std::string& str);
+
+	// Parse state associated with the time series: Ignores attributes like free.
+	static void parse_state(size_t index,const std::vector<std::string>& lineTokens, ecf::TimeSeries& ts);
+	void set_isValid(bool b) { isValid_= b;} // for test only
+	void set_next_time_slot( const TimeSlot& ts) { nextTimeSlot_ = ts; } // needed for test only
+	const TimeSlot& get_next_time_slot() const { return nextTimeSlot_;}
+
+	// Is the time still valid, return false means time has expired.
+	bool is_valid() const { return isValid_;}
+private:
+
+	static void testTime(int hour, int minute);
+
+	// HANDLE CASE WHERE FINISH MINUTES IS NOT DIVISIBLE BY THE INCREMENT
+	// time 00:00 23:59 00:10  last valid time is 23:50
+	// time 00:30 23:59 04:00  last valid time is 20:30
+	// The last valid time here is 23:50/20:30 must return false, to stop node being
+	// stuck in queued mode In the case where the FINISH is NOT a multiple of the increment
+	// Need a different mechanism to determine the end.
+	void compute_last_time_slot(); // only call for series
+
+	bool match_duration_with_time_series(const boost::posix_time::time_duration& relative_or_real_td) const;
+	boost::posix_time::time_duration relativeDuration() const;
+
+private:
+	bool relativeToSuiteStart_;
+	bool isValid_;                                     // Needed for single slot to avoid multiple jobs submissions
+	TimeSlot start_;
+	TimeSlot finish_;
+	TimeSlot incr_;
+	TimeSlot nextTimeSlot_;                             // nextTimeSlot_ >= start && is incremented by incr
+	mutable TimeSlot suiteTimeAtReque_; // NOT persisted, check of day change, between requeue -> checkForRequeue, when we have series
+	boost::posix_time::time_duration relativeDuration_;
+	boost::posix_time::time_duration lastTimeSlot_;    // Only used when we have a series, can be generated
+
+private:
+	// Note: isValid_      is persisted for use by why() command on the client side.
+	// Note: nextTimeSlot_ is persisted for use by why() command on the client side.
+	// Note: relativeDuration_ is persisted for use by why() command on the client side.
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/)
+	{
+	   ar & relativeToSuiteStart_;
+	   ar & isValid_;
+	   ar & start_;
+	   ar & finish_;
+	   ar & incr_;
+	   ar & nextTimeSlot_;
+	   ar & relativeDuration_;
+
+	   if (Archive::is_loading::value) {
+	      if (!finish_.isNULL()) {
+	         compute_last_time_slot();
+	      }
+	   }
+	}
+};
+
+std::ostream& operator<<(std::ostream& os, const TimeSeries*);
+std::ostream& operator<<(std::ostream& os, const TimeSeries&);
+}
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ecf::TimeSeries, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(ecf::TimeSeries,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/TimeSlot.cpp b/ecflow_4_0_7/ACore/src/TimeSlot.cpp
new file mode 100644
index 0000000..9f75a6a
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/TimeSlot.cpp
@@ -0,0 +1,89 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "TimeSlot.hpp"
+#include "Calendar.hpp"
+#include "Str.hpp"
+
+using namespace boost::posix_time;
+
+namespace ecf {
+
+///////////////////////////////////////////////////////////////////////////////////////////
+
+bool TimeSlot::operator<(const TimeSlot& rhs) const
+{
+   if (hour_ <  rhs.hour()) return true;
+   if (hour_ == rhs.hour()) {
+      return minute_ < rhs.minute();
+   }
+   return false;
+}
+
+bool TimeSlot::operator>(const TimeSlot& rhs) const
+{
+   if (hour_ >  rhs.hour()) return true;
+   if (hour_ == rhs.hour()) {
+      return minute_ > rhs.minute();
+   }
+   return false;
+}
+
+bool TimeSlot::operator<=( const TimeSlot& rhs ) const
+{
+   if (operator<(rhs)) return true;
+   return operator==(rhs);
+}
+
+
+bool TimeSlot::operator>=( const TimeSlot& rhs ) const
+{
+   if (operator>(rhs)) return true;
+   return operator==(rhs);
+}
+
+
+std::ostream& TimeSlot::print(std::ostream& os) const
+{
+	os << toString();
+ 	return os;
+}
+
+std::string TimeSlot::toString() const
+{
+	std::stringstream ss;
+	if (hour_ < 10) ss << "0" << hour_;
+	else            ss << hour_;
+
+	ss << Str::COLON();
+	if (minute_ < 10) ss << "0" << minute_;
+	else              ss << minute_;
+	return ss.str();
+}
+
+boost::posix_time::time_duration TimeSlot::duration() const
+{
+	assert(!isNULL());
+	return boost::posix_time::time_duration( hours(hour_) + minutes(minute_) ) ;
+}
+
+
+std::ostream& operator<<(std::ostream& os, const TimeSlot* d) {
+	if (d) return d->print(os);
+	return os << "TimeSlot == NULL";
+}
+std::ostream& operator<<(std::ostream& os, const TimeSlot& d)  { return d.print(os); }
+
+}
diff --git a/ecflow_4_0_7/ACore/src/TimeSlot.hpp b/ecflow_4_0_7/ACore/src/TimeSlot.hpp
new file mode 100644
index 0000000..47e09ad
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/TimeSlot.hpp
@@ -0,0 +1,86 @@
+#ifndef TIMESLOT_HPP_
+#define TIMESLOT_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "boost/date_time/posix_time/posix_time_types.hpp"
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <ostream>
+
+namespace ecf {
+
+// Use compiler , generated destructor, assignment,  copy constructor
+// *relative* times can extend to a maximum of 99 hours and 59 seconds
+//
+// TimeSlot is used in many other attributes, i.e. like AutoCancelAttr
+// in this case user can specify days, which we convert to hours, hence it
+// is possible for a TimeSlot hour to have any integer value
+class TimeSlot {
+public:
+	TimeSlot()
+		: hour_(0), minute_(0),isNull_(true) {}
+	TimeSlot(int hour, int min)
+		: hour_(hour), minute_(min),isNull_(false)
+		{ assert(hour >= 0  && min >=0 ); }
+	TimeSlot(const boost::posix_time::time_duration& td)
+		: hour_(td.hours()), minute_(td.minutes()),isNull_(false)
+		{ assert( hour_ < 60 && minute_ < 60);}
+
+	bool operator==(const TimeSlot& rhs) const
+		{ return ((hour_ == rhs.hour_) && (minute_ == rhs.minute_) && (isNull_ == rhs.isNull_));}
+	bool operator!=(const TimeSlot& rhs) const
+		{ return !operator==(rhs);}
+
+   bool operator<(const TimeSlot& rhs) const;
+   bool operator>(const TimeSlot& rhs) const;
+   bool operator<=(const TimeSlot& rhs) const;
+   bool operator>=(const TimeSlot& rhs) const;
+
+	int hour() const { return hour_;}
+	int minute() const { return minute_;}
+	bool isNULL() const { return isNull_; }
+	std::ostream& print(std::ostream&) const;
+
+	/// returns the corresponding duration.
+ 	boost::posix_time::time_duration duration() const;
+
+ 	// returns  struct in the format hh:mm
+ 	std::string toString() const;
+
+private:
+ 	unsigned short hour_;
+ 	unsigned short minute_;
+ 	bool           isNull_;
+
+ 	friend class boost::serialization::access;
+ 	template<class Archive>
+ 	void serialize(Archive & ar, const unsigned int /*version*/) {
+ 	   ar & hour_;
+ 	   ar & minute_;
+ 	   ar & isNull_;
+ 	}
+};
+
+std::ostream& operator<<(std::ostream& os, const TimeSlot*);
+std::ostream& operator<<(std::ostream& os, const TimeSlot&);
+}
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ecf::TimeSlot, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(ecf::TimeSlot,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/TimeStamp.cpp b/ecflow_4_0_7/ACore/src/TimeStamp.cpp
new file mode 100644
index 0000000..0fb7de4
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/TimeStamp.cpp
@@ -0,0 +1,40 @@
+//============================================================================
+// Name        : Log
+// Author      : Avi
+// Revision    : $Revision: #57 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : Simple singleton implementation of log
+//============================================================================
+#include "TimeStamp.hpp"
+#include <cstdio>
+
+using namespace std;
+
+namespace ecf {
+
+std::string TimeStamp::now()
+{
+   std::string time_stamp;
+   now(time_stamp);
+   return time_stamp;
+}
+
+void TimeStamp::now(std::string& time_stamp)
+{
+   char t_fmt[255];
+   time_t stamp = time( NULL);
+   struct tm *tod = localtime(&stamp);
+   sprintf(t_fmt, "[%02d:%02d:%02d %d.%d.%d] ", tod->tm_hour, tod->tm_min, tod->tm_sec,
+           tod->tm_mday, tod->tm_mon + 1, tod->tm_year + 1900);
+
+   time_stamp = t_fmt;
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/TimeStamp.hpp b/ecflow_4_0_7/ACore/src/TimeStamp.hpp
new file mode 100644
index 0000000..fb9cb25
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/TimeStamp.hpp
@@ -0,0 +1,35 @@
+#ifndef TIMESTAMP_HPP_
+#define TIMESTAMP_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Log
+// Author      : Avi
+// Revision    : $Revision: #31 $
+//
+// Copyright 2009-2015 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+// returns a string of format : "[%02d:%02d:%02d %d.%d.%d] "
+//                              "[hour:min:sec day.month.year] "
+// i.e                          "[05:26:20 29.10.2014] "
+class TimeStamp : private boost::noncopyable {
+public:
+   static std::string now();
+   static void now(std::string&);
+private:
+   TimeStamp();
+};
+
+}
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/Version.cpp b/ecflow_4_0_7/ACore/src/Version.cpp
new file mode 100644
index 0000000..e71d037
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Version.cpp
@@ -0,0 +1,131 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #132 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <sstream>
+#include "Version.hpp"
+#include "ecflow_version.h"
+#include <boost/version.hpp>
+
+namespace ecf {
+
+// ********************************************************************
+// IMPORTANT:
+// The version number is extracted externally.
+//   see ACore/doc/extracting_version_number.ddoc
+//
+//   See ACore/src/ecflow_version.h"
+//   This file is generated from $WK/VERSION.cmake when cmake is run, i.e
+//   sh -x $WK/cmake.sh debug
+//
+// It is also extracted by python, from VERSION.CMAKE check build/nightly/build.py
+// This minimises the places where we have hard code the version number.
+//
+// When changing the version change remember to:
+//    - re-login into remote system to update ECFLOW_INSTALL_DIR & ECFLOW_PYTHON_INSTALL_DIR
+//      required for interactive install
+//
+// To Install a new version on all the different platforms:
+//  . build/nightly/quick_install_.sh
+// This is because the definition hold's the last version.
+// Hence we must rerun to update the version.
+//
+// ************************************************************************************
+// Use  <minor_number>rc<number> for release candidates, Once release we revert back:
+//      0rc1    -> 0
+//      10rc3   -> 10
+// ************************************************************************************
+//
+// **Please update file history.ddoc with the changed made for each release ***
+// ********************************************************************
+#ifdef DEBUG
+const std::string Version::TAG = " (debug)";  // Old tag: beta(debug)
+#else
+const std::string Version::TAG = ""; // Old tag: beta
+#endif
+
+
+// See: http://www.cmake.org/cmake/help/cmake_tutorial.html
+// For defining version numbers. This is done is a separate file
+// that is then included
+std::string Version::description()
+{
+   std::stringstream ss;
+   ss << "Ecflow" << Version::TAG << " version(" << ECFLOW_RELEASE << "." << ECFLOW_MAJOR << "." << ECFLOW_MINOR;
+
+   ss << ") boost(" << Version::boost() << ")";
+   std::string the_comp = compiler();
+   if (!the_comp.empty()) ss << " compiler(" << the_comp << ")";
+
+   ss << " protocol(";
+#if defined(BINARY_ARCHIVE)
+   ss << "BINARY_ARCHIVE)";
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+   ss << "PORTABLE_BINARY_ARCHIVE)";
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   ss << "EOS_PORTABLE_BINARY_ARCHIVE)";
+#else
+   ss << "TEXT_ARCHIVE)";
+#endif
+
+   ss << " Compiled on " << __DATE__ << " " << __TIME__;
+   return ss.str();
+}
+
+std::string Version::version()
+{
+   std::stringstream ss;
+   ss << "ecflow_" << ECFLOW_RELEASE << "_" << ECFLOW_MAJOR << "_" << ECFLOW_MINOR;
+   return ss.str();
+}
+
+std::string Version::raw()
+{
+   std::stringstream ss;
+   ss << ECFLOW_RELEASE << "." << ECFLOW_MAJOR << "." << ECFLOW_MINOR;
+   return ss.str();
+}
+
+std::string Version::boost()
+{
+   std::stringstream ss;
+   ss << BOOST_VERSION / 100000     << "."  // major version
+      << BOOST_VERSION / 100 % 1000 << "."  // minor version
+      << BOOST_VERSION % 100;               // patch level
+   return ss.str();
+}
+
+std::string Version::compiler()
+{
+   std::stringstream ss;
+#if defined(_AIX)
+   ss << "aix " << __IBMCPP__ ;
+#elif defined(HPUX)
+   ss << "aCC " << __HP_aCC ;   // type aCC +help, this will show compiler manual, search for Predefined Macros
+#else
+#if defined(__clang__)
+   //  To find the list of defines for clang use:
+   //  echo | /usr/local/apps/clang/current/bin/clang++ -dM -E -
+   ss << "clang " << __clang_major__ << "." <<  __clang_minor__ ;
+#elif defined(__INTEL_COMPILER)
+   ss << "intel " <<  __INTEL_COMPILER;
+#elif defined(_CRAYC)
+   ss << "cray " <<  _CRAYC;
+#else
+   ss << "gcc " << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__;
+#endif
+#endif
+   return ss.str();
+}
+
+}
diff --git a/ecflow_4_0_7/ACore/src/Version.hpp b/ecflow_4_0_7/ACore/src/Version.hpp
new file mode 100644
index 0000000..c70d2ba
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/Version.hpp
@@ -0,0 +1,56 @@
+#ifndef VERSION_HPP_
+#define VERSION_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Holds the version of ECFlow. Checked against definition file
+//               For each major release the major number should be
+//               incremented.
+// If the parsing comes across a construct it does not recognize, then
+// an exception is thrown. i.e if a construct added in release 2.0 of ECF
+// is read in by version 1.0 of ECF. The exception should indicate the
+// current release
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include <string>
+
+namespace ecf {
+
+class Version : private boost::noncopyable {
+public:
+	/// Outputs a string of the form:
+	/// ECF <tag> version release_.major_.minor_
+	static std::string description();
+
+	/// Outputs string of form: ecflow_<release>_<major>_<minor>
+	/// This could be used by install
+	static std::string version();
+
+   /// Outputs string of form: <release>.<major>.<minor>
+   static std::string raw();
+
+private:
+	Version();
+
+	static const std::string TAG; // alpha, beta, release
+
+private:
+   /// return version of the boost library
+   static std::string boost();
+
+   // Return the version of the compiler. Can return empty string
+   static std::string compiler();
+};
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/WhiteListFile.cpp b/ecflow_4_0_7/ACore/src/WhiteListFile.cpp
new file mode 100644
index 0000000..03b7066
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/WhiteListFile.cpp
@@ -0,0 +1,163 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Parser for white list file
+//============================================================================
+#include <pwd.h>       /* getpwuid */
+#include <vector>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#include "WhiteListFile.hpp"
+#include "File.hpp"
+#include "Str.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+bool WhiteListFile::parse( std::map<std::string,bool>& validUsers, std::string& errorMsg )
+{
+	std::vector<std::string> lines;
+ 	if (File::splitFileIntoLines(smsWhiteListFile_,lines,true /* ignore empty lines */)) {
+
+ 		bool foundVersionNumber = false; // can read from version 4.4.5 onwards
+ 		for(size_t i = 0; i < lines.size(); ++i) {
+
+ 			if (lines[i].empty())   continue;
+ 			if (lines[i][0] == '#') continue; // ignore comments
+
+ 			std::string theLine = lines[i];
+ 			boost::algorithm::trim(theLine); // don't know why we get leading/trailing spaces
+
+ 			std::vector< std::string > lineTokens;
+ 			Str::split( theLine, lineTokens );
+ 			if ( lineTokens.empty() ) continue;
+
+
+ 			// version should be at the start
+ 			if (!foundVersionNumber) {
+
+ 				if (!validateVersionNumber(lineTokens[0], errorMsg )) {
+ 					std::stringstream ss;
+ 					ss << " " << i + 1 << ": " << lines[i] << "\n";
+ 					ss << "for ECF_LISTS file " << smsWhiteListFile_ << "\n";
+ 					errorMsg += ss.str();
+ 					return false;
+ 				}
+ 				foundVersionNumber = true;
+ 				continue;
+ 			}
+ 			else  {
+
+ 				addUser(lineTokens[0], validUsers);
+ 			}
+ 		}
+
+ 		return true;
+ 	}
+
+ 	errorMsg += "Could not open file specified by ECF_LISTS ";
+ 	errorMsg += smsWhiteListFile_;
+ 	errorMsg += "\n";
+ 	return false;
+}
+
+
+bool WhiteListFile::validateVersionNumber(const std::string& line, std::string& errorMsg) const
+{
+	// Expect 4.4.14, Current syntax in force after 4.4.5
+	// If first character is NUMERIC and we have dots
+	bool firstCharIsNumeric = Str::NUMERIC().find( line[0], 0 ) != string::npos;
+	if ( firstCharIsNumeric && line.find( "." ) != string::npos) {
+
+		std::vector< std::string > versionNumberTokens;
+		Str::split( line, versionNumberTokens, "." );
+		if ( versionNumberTokens.size() != 3 ) {
+			std::stringstream ss;
+			ss << "Expected version of the form <int>.<int>.<int> i.e 4.4.14. but found invalid version number\n";
+			errorMsg += ss.str();
+			return false;
+		}
+
+		try {
+			int major = boost::lexical_cast< int >( versionNumberTokens[0] );
+			int minor = boost::lexical_cast< int >( versionNumberTokens[1] );
+			int part = boost::lexical_cast< int >( versionNumberTokens[2] );
+			if ( major < 4  ) {
+ 				errorMsg += "Only white list files with a version >= 4.4.5 is supported\n";
+				return false;
+			}
+			if ( major == 4 && minor < 4 ) {
+ 				errorMsg += "Only white list files with a version >= 4.4.5 is supported\n";
+				return false;
+			}
+			if ( major == 4 && minor == 4  && part < 5) {
+ 				errorMsg += "Only white list files with a version >= 4.4.5 is supported\n";
+				return false;
+			}
+		}
+		catch ( boost::bad_lexical_cast& ) {
+ 			errorMsg += "Invalid version number \n";
+			return false;
+		}
+
+		return true;
+	}
+
+	errorMsg +="The version number not found. The version number must appear before the users.\n";
+	return false;
+}
+
+
+void WhiteListFile::addUser(const std::string& line, std::map<std::string,bool>& validUsers) const
+{
+	LOG_ASSERT(!line.empty(), "");
+	if (line[0] == '-') {
+		std::string user = line;
+		user.erase(user.begin());
+		validUsers.insert(std::make_pair(user,false));  // Read access
+		return;
+	}
+
+	validUsers.insert(std::make_pair(line,true)); // write access
+}
+
+bool WhiteListFile::createWithReadAccess( const std::string& pathToFile,std::string& errorMsg)
+{
+	std::vector<std::string> lines; lines.reserve( 2 );
+
+	lines.push_back("4.4.14");
+
+	string user = "-";
+	struct passwd * thePassWord = getpwuid ( getuid() );
+	user += string( thePassWord->pw_name ) ;  // equivalent to the login name
+
+ 	lines.push_back(user);
+
+	return File::create(pathToFile,lines,errorMsg);
+}
+
+bool WhiteListFile::createWithWriteAccess( const std::string& pathToFile , std::string& errorMsg)
+{
+	std::vector<std::string> lines; lines.reserve( 2 );
+
+	lines.push_back("4.4.14");
+
+ 	struct passwd * thePassWord = getpwuid ( getuid() );
+	string user( thePassWord->pw_name ) ;  // equivalent to the login name
+
+ 	lines.push_back(user);
+
+	return File::create(pathToFile,lines,errorMsg);
+}
diff --git a/ecflow_4_0_7/ACore/src/WhiteListFile.hpp b/ecflow_4_0_7/ACore/src/WhiteListFile.hpp
new file mode 100644
index 0000000..708b1c0
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/WhiteListFile.hpp
@@ -0,0 +1,47 @@
+#ifndef WHITELISTFILE_CPP_
+#define WHITELISTFILE_CPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Parser for while list file
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <string>
+#include <map>
+
+
+class WhiteListFile : private boost::noncopyable {
+public:
+	WhiteListFile(const std::string& file) : smsWhiteListFile_(file) {}
+	~WhiteListFile() {}
+
+	// Parse the file if any errors found raise a warning
+	// The parser expects version number  4.4.5
+	// first user name, second true is write access, false read access
+	bool parse( std::map<std::string,bool>& validUsers, std::string& errorMsg );
+
+	// Function used in test:
+	// Will overwrite the existing file
+	static bool createWithReadAccess( const std::string& pathToFile, std::string& errorMsg);
+	static bool createWithWriteAccess( const std::string& pathToFile, std::string& errorMsg);
+
+private:
+
+	bool validateVersionNumber(const std::string& line, std::string& errorMsg) const;
+	void addUser(const std::string& token, std::map<std::string,bool>& validUsers) const;
+
+	std::string smsWhiteListFile_;
+};
+
+#endif
+
diff --git a/ecflow_4_0_7/ACore/src/boost_archive.cpp b/ecflow_4_0_7/ACore/src/boost_archive.cpp
new file mode 100644
index 0000000..19b6d8b
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/boost_archive.cpp
@@ -0,0 +1,60 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <stdio.h>
+#include <sstream>
+#include <boost/lexical_cast.hpp>
+
+#include "Str.hpp"
+#include "boost_archive.hpp"
+
+using namespace ecf;
+
+// return the current archive version
+int boost_archive::version()
+{
+   std::stringstream ss;
+
+#if defined(BINARY_ARCHIVE)
+   boost::archive::binary_oarchive oa( ss );
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+   portable_binary_oarchive oa(ss);
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   eos::portable_oarchive oa(ss);
+#else
+   boost::archive::text_oarchive oa( ss );
+#endif
+
+   return oa.get_library_version();
+}
+
+
+// extract the boost archive version
+int boost_archive::extract_version(const std::string& boost_serial_str)
+{
+   int version = 0;
+   sscanf(boost_serial_str.c_str(),"22 serialization::archive %d",&version);
+   return version;
+}
+
+bool boost_archive::replace_version(std::string& boost_serial_str, int the_new_version)
+{
+   int version = extract_version(boost_serial_str);
+   std::string old_version = boost::lexical_cast<std::string>(version);
+   std::string new_version = boost::lexical_cast<std::string>(the_new_version);
+   return Str::replace(boost_serial_str,old_version,new_version);
+}
+
+
diff --git a/ecflow_4_0_7/ACore/src/boost_archive.hpp b/ecflow_4_0_7/ACore/src/boost_archive.hpp
new file mode 100644
index 0000000..3c4dd59
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/boost_archive.hpp
@@ -0,0 +1,96 @@
+#ifndef BOOST_ARCHIVE_HPP_
+#define BOOST_ARCHIVE_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class has come about due to a bug with boost archive
+//               includes. i.e if the same set of includes are not defined
+//               in different compilations units. Then _NO_ errors/warnings are
+//               issued instead we get a crash at run time when serialising
+//               via base pointer.
+//
+//               To get round this code will use this include to collate the
+//               archives used in a single place.
+//============================================================================
+
+#if defined(TEXT_ARCHIVE) || !defined(BINARY_ARCHIVE) && !defined(PORTABLE_BINARY_ARCHIVE) && !defined(EOS_PORTABLE_BINARY_ARCHIVE)
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#endif
+
+#if defined(BINARY_ARCHIVE)
+#include <boost/archive/binary_oarchive.hpp>
+#include <boost/archive/binary_iarchive.hpp>
+#endif
+
+#if defined(PORTABLE_BINARY_ARCHIVE)
+#include "portable_binary_oarchive.hpp"
+#include "portable_binary_iarchive.hpp"
+#endif
+
+#if defined(EOS_PORTABLE_BINARY_ARCHIVE)
+#include "portable_oarchive.hpp"
+#include "portable_iarchive.hpp"
+#endif
+
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+/// Utility class for boost archive version
+///
+/// Boost archive version is specified in: $BOOST_ROOT/libs/serialization/src/basic_archive.cpp
+///
+/// boost 1.47 serialisation library archive version = 9
+/// boost 1.53 serialisation library archive version = 10
+/// boost 1.56 serialisation library archive version = 11 // however no change in library ?
+/// boost 1.57 serialisation library archive version = 11
+///
+/// boost supports old -> new only. In our case typically new_client needs to talk to old server
+/// Hence if new client archive version is newer we need to set to archive version used by server.
+/// *providing* there are compatible.
+///
+/// To enable this, user can export variable ECF_ALLOW_NEW_CLIENT_OLD_SERVER:
+///
+/// We expect following syntax:
+///    option 1/ export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=<int>
+///              This for use ecflow_client command line
+///
+///    option 2/ export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=<host>:<port>:<int>,<host>:<port>:<int>,<host>:<port>:<int>
+///              This for use with ui/viewer where we can have multiple clients, each could
+///              connect to different server version and hence archive.
+///
+/// export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=10, the number used, must be the archive version
+/// that the boost server was built with.
+///
+class boost_archive : private boost::noncopyable {
+public:
+
+   // return the current archive version
+   static int version();
+
+   // extract the boost archive version, assumes text archive *****
+   static int extract_version(const std::string&);
+
+   // replace archive version, return true if replace worked.
+   static bool replace_version(std::string&, int new_version);
+
+   // avoid hard coding
+   static int version_1_47() { return 9;}
+
+private:
+   boost_archive();
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ACore/src/ecflow_version.h b/ecflow_4_0_7/ACore/src/ecflow_version.h
new file mode 100644
index 0000000..57996b9
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/ecflow_version.h
@@ -0,0 +1,10 @@
+#ifndef ecflow_version_config_h
+#define ecflow_version_config_h
+ 
+#define ECFLOW_VERSION   "4.0.7"
+
+#define ECFLOW_RELEASE   "4"
+#define ECFLOW_MAJOR     "0"
+#define ECFLOW_MINOR     "7"
+
+#endif 
diff --git a/ecflow_4_0_7/ACore/src/polymorphic_portable_archive.hpp b/ecflow_4_0_7/ACore/src/polymorphic_portable_archive.hpp
new file mode 100644
index 0000000..07e3d24
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/polymorphic_portable_archive.hpp
@@ -0,0 +1,35 @@
+/*****************************************************************************/
+/**
+ * \file polymorphic_portable_archive.hpp
+ * \brief Needed for unit tests on portable archives.
+ * \author christian.pfligersdorffer at gmx.at
+ *
+ * Header for testing portable archives with all of the serialization tests.
+ * Before use copy all hpp files from this directory to your boost folder
+ * boost_.../libs/serialization/test and run from there a visual studio
+ * prompt with b2 oder bjam -sBOOST_ARCHIVE_LIST=portable_archive.hpp
+ *
+ * \note Since portable archives version 5.0 we depend on program_options!
+ * Edit libs/serialization/test/Jamfile.v2 and change the requirements to
+ * : requirements <source>/boost/filesystem <source>/boost/program_options
+ */
+/****************************************************************************/
+
+#pragma warning( disable:4217 4127 4310 4244 4800 4267 )
+
+// text_archive test header
+// include output archive header
+#include "portable_oarchive.hpp"
+// set name of test output archive
+typedef eos::polymorphic_portable_oarchive test_oarchive;
+// set name of test output stream
+typedef std::ofstream test_ostream;
+
+// repeat the above for input archive
+#include "portable_iarchive.hpp"
+typedef eos::polymorphic_portable_iarchive test_iarchive;
+typedef std::ifstream test_istream;
+
+// define open mode for streams
+//   binary archives should use std::ios_base::binary
+#define TEST_STREAM_FLAGS std::ios_base::binary
diff --git a/ecflow_4_0_7/ACore/src/portable_archive.hpp b/ecflow_4_0_7/ACore/src/portable_archive.hpp
new file mode 100644
index 0000000..0eaf4aa
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_archive.hpp
@@ -0,0 +1,35 @@
+/*****************************************************************************/
+/**
+ * \file portable_archive.hpp
+ * \brief Needed for unit tests on portable archives.
+ * \author christian.pfligersdorffer at gmx.at
+ *
+ * Header for testing portable archives with all of the serialization tests.
+ * Before use copy all hpp files from this directory to your boost folder
+ * boost_.../libs/serialization/test and run from there a visual studio
+ * prompt with b2 oder bjam -sBOOST_ARCHIVE_LIST=portable_archive.hpp
+ *
+ * \note Since portable archives version 5.0 we depend on program_options!
+ * Edit libs/serialization/test/Jamfile.v2 and change the requirements to
+ * : requirements <source>/boost/filesystem <source>/boost/program_options
+ */
+/****************************************************************************/
+
+#pragma warning( disable:4217 4127 4310 4244 4800 4267 )
+
+// text_archive test header
+// include output archive header
+#include "portable_oarchive.hpp"
+// set name of test output archive
+typedef eos::portable_oarchive test_oarchive;
+// set name of test output stream
+typedef std::ofstream test_ostream;
+
+// repeat the above for input archive
+#include "portable_iarchive.hpp"
+typedef eos::portable_iarchive test_iarchive;
+typedef std::ifstream test_istream;
+
+// define open mode for streams
+//   binary archives should use std::ios_base::binary
+#define TEST_STREAM_FLAGS std::ios_base::binary
diff --git a/ecflow_4_0_7/ACore/src/portable_archive_exception.hpp b/ecflow_4_0_7/ACore/src/portable_archive_exception.hpp
new file mode 100644
index 0000000..86dbb35
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_archive_exception.hpp
@@ -0,0 +1,93 @@
+/*****************************************************************************/
+/**
+ * \file portable_archive_exception.hpp
+ * \brief Provides error handling and constants.
+ * \author christian.pfligersdorffer at gmx.at
+ *
+ * Portable archive exceptions derive from the boost archive exceptions
+ * and add failure causes specific to the portable binary usecase.
+ *
+ * Additionally this header serves as common include for important
+ * constants or typedefs.
+ */
+/****************************************************************************/
+
+#pragma once
+
+#include <boost/lexical_cast.hpp>
+#include <boost/archive/basic_archive.hpp>
+#include <boost/archive/archive_exception.hpp>
+
+namespace eos {
+
+	// this value is written to the top of the stream
+	const signed char magic_byte = 'e' | 'o' | 's';
+
+	// flag for fp serialization
+	const unsigned no_infnan = 64;
+
+	// integral type for the archive version
+	#if BOOST_VERSION < 104400
+		typedef boost::archive::version_type archive_version_type;
+	#else
+		typedef boost::archive::library_version_type archive_version_type;
+	#endif
+
+	// version of the linked boost archive library
+	const archive_version_type archive_version(
+	#if BOOST_VERSION < 103700
+		boost::archive::ARCHIVE_VERSION()
+	#else
+		boost::archive::BOOST_ARCHIVE_VERSION()
+	#endif
+	);
+
+	/**
+	 * \brief Exception being thrown when serialization cannot proceed.
+	 *
+	 * There are several situations in which the portable archives may fail and
+	 * hence throw an exception: 
+	 * -# deserialization of an integer value that exceeds the range of the type 
+	 * -# (de)serialization of inf/nan through an archive with no_infnan flag set
+	 * -# deserialization of a denormalized value without the floating point type
+	 *    supporting denormalized numbers
+	 *
+	 * Note that this exception will also be thrown if you mixed up your stream
+	 * position and accidentially interpret some value for size data (in this case
+	 * the reported size will be totally amiss most of the time).
+	 */
+	class portable_archive_exception : public boost::archive::archive_exception
+	{
+		std::string msg;
+
+	public:
+		//! type size is not large enough for deserialized number
+		portable_archive_exception(signed char invalid_size) 
+			: boost::archive::archive_exception(other_exception) 
+			, msg("requested integer size exceeds type size: ")
+		{
+			msg += boost::lexical_cast<std::string, int>(invalid_size);
+		}
+
+		//! negative number in unsigned type
+		portable_archive_exception()
+			: boost::archive::archive_exception(other_exception)
+			, msg("cannot read a negative number into an unsigned type")
+		{
+		}
+
+		//! serialization of inf, nan and denormals
+		template <typename T> 
+		portable_archive_exception(const T& abnormal) 
+			: boost::archive::archive_exception(other_exception) 
+			, msg("serialization of illegal floating point value: ")
+		{
+			msg += boost::lexical_cast<std::string>(abnormal);
+		}
+
+		//! override the base class function with our message
+		const char* what() const throw() { return msg.c_str(); }
+		~portable_archive_exception() throw() {}
+	};
+
+} // namespace eos
diff --git a/ecflow_4_0_7/ACore/src/portable_binary_archive.hpp b/ecflow_4_0_7/ACore/src/portable_binary_archive.hpp
new file mode 100644
index 0000000..c4da5e4
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_binary_archive.hpp
@@ -0,0 +1,49 @@
+#if defined(PORTABLE_BINARY_ARCHIVE)
+#ifndef PORTABLE_BINARY_ARCHIVE_HPP
+#define PORTABLE_BINARY_ARCHIVE_HPP
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/serialization/pfto.hpp>
+#include <boost/static_assert.hpp>
+
+#include <climits>
+#if CHAR_BIT != 8
+#error This code assumes an eight-bit byte.
+#endif
+
+#include <boost/archive/basic_archive.hpp>
+#include <boost/detail/endian.hpp>
+
+enum portable_binary_archive_flags {
+    endian_big        = 0x4000,
+    endian_little     = 0x8000
+};
+
+//#if ( endian_big <= boost::archive::flags_last )
+//#error archive flags conflict
+//#endif
+
+inline void
+reverse_bytes(char size, char *address){
+    char * first = address;
+    char * last = first + size - 1;
+    for(;first < last;++first, --last){
+        char x = *last;
+        *last = *first;
+        *first = x;
+    }
+}
+
+#endif // PORTABLE_BINARY_ARCHIVE_HPP
+#endif // PORTABLE_BINARY_ARCHIVE
diff --git a/ecflow_4_0_7/ACore/src/portable_binary_iarchive.cpp b/ecflow_4_0_7/ACore/src/portable_binary_iarchive.cpp
new file mode 100644
index 0000000..48ffe49
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_binary_iarchive.cpp
@@ -0,0 +1,136 @@
+#if defined(PORTABLE_BINARY_ARCHIVE)
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// portable_binary_iarchive.cpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <istream>
+#include <string>
+
+#include <boost/detail/endian.hpp>
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/archive/archive_exception.hpp>
+
+#include "portable_binary_iarchive.hpp"
+
+void
+portable_binary_iarchive::load_impl(boost::intmax_t & l, char maxsize){
+    signed char size;
+    l = 0;
+    this->primitive_base_t::load(size);
+
+    if(0 == size){
+        return;
+    }
+
+    bool negative = (size < 0);
+    if(negative)
+        size = -size;
+
+    if(size > maxsize)
+        boost::serialization::throw_exception(
+            portable_binary_iarchive_exception()
+        );
+
+    char * cptr = reinterpret_cast<char *>(& l);
+    #ifdef BOOST_BIG_ENDIAN
+        cptr += (sizeof(boost::intmax_t) - size);
+    #endif
+    this->primitive_base_t::load_binary(cptr, size);
+
+    #ifdef BOOST_BIG_ENDIAN
+        if(m_flags & endian_little)
+    #else
+        if(m_flags & endian_big)
+    #endif
+            reverse_bytes(size, cptr);
+
+    if(negative)
+        l = -l;
+}
+
+void
+portable_binary_iarchive::load_override(
+    boost::archive::class_name_type & t, int
+){
+    std::string cn;
+    cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);
+    load_override(cn, 0);
+    if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))
+        boost::serialization::throw_exception(
+            boost::archive::archive_exception(
+                boost::archive::archive_exception::invalid_class_name)
+            );
+    std::memcpy(t, cn.data(), cn.size());
+    // borland tweak
+    t.t[cn.size()] = '\0';
+}
+
+void
+portable_binary_iarchive::init(unsigned int flags){
+    if(0 == (flags & boost::archive::no_header)){
+        // read signature in an archive version independent manner
+        std::string file_signature;
+        * this >> file_signature;
+        if(file_signature != boost::archive::BOOST_ARCHIVE_SIGNATURE())
+            boost::serialization::throw_exception(
+                boost::archive::archive_exception(
+                    boost::archive::archive_exception::invalid_signature
+                )
+            );
+        // make sure the version of the reading archive library can
+        // support the format of the archive being read
+        boost::archive::library_version_type input_library_version;
+        * this >> input_library_version;
+
+        // extra little .t is to get around borland quirk
+        if(boost::archive::BOOST_ARCHIVE_VERSION() < input_library_version)
+            boost::serialization::throw_exception(
+                boost::archive::archive_exception(
+                    boost::archive::archive_exception::unsupported_version
+                )
+            );
+
+        #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
+        this->set_library_version(input_library_version);
+        //#else
+        //#if ! BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+        //detail::
+        //#endif
+        boost::archive::detail::basic_iarchive::set_library_version(
+            input_library_version
+        );
+        #endif
+    }
+    unsigned char x;
+    load(x);
+    m_flags = x << CHAR_BIT;
+}
+
+#include <boost/archive/impl/archive_serializer_map.ipp>
+#include <boost/archive/impl/basic_binary_iprimitive.ipp>
+
+namespace boost {
+namespace archive {
+
+namespace detail {
+    template class archive_serializer_map<portable_binary_iarchive>;
+}
+
+template class basic_binary_iprimitive<
+    portable_binary_iarchive,
+    std::istream::char_type,
+    std::istream::traits_type
+> ;
+
+} // namespace archive
+} // namespace boost
+
+#endif // PORTABLE_BINARY_ARCHIVES
+
diff --git a/ecflow_4_0_7/ACore/src/portable_binary_iarchive.hpp b/ecflow_4_0_7/ACore/src/portable_binary_iarchive.hpp
new file mode 100644
index 0000000..a3bd53a
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_binary_iarchive.hpp
@@ -0,0 +1,216 @@
+#if defined(PORTABLE_BINARY_ARCHIVE)
+
+#ifndef PORTABLE_BINARY_IARCHIVE_HPP
+#define PORTABLE_BINARY_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4244 )
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// portable_binary_iarchive.hpp
+
+// (C) Copyright 2002-7 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <istream>
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/item_version_type.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/basic_binary_iprimitive.hpp>
+#include <boost/archive/detail/common_iarchive.hpp>
+#include <boost/archive/shared_ptr_helper.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include "portable_binary_archive.hpp"
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// exception to be thrown if integer read from archive doesn't fit
+// variable being loaded
+class portable_binary_iarchive_exception :
+    public virtual boost::archive::archive_exception
+{
+public:
+    typedef enum {
+        incompatible_integer_size
+    } exception_code;
+    portable_binary_iarchive_exception(exception_code c = incompatible_integer_size ) :
+        boost::archive::archive_exception(boost::archive::archive_exception::other_exception)
+    {}
+    virtual const char *what( ) const throw( )
+    {
+        const char *msg = "programmer error";
+        switch(code){
+        case incompatible_integer_size:
+            msg = "integer cannot be represented";
+            break;
+        default:
+            msg = boost::archive::archive_exception::what();
+            assert(false);
+            break;
+        }
+        return msg;
+    }
+};
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// "Portable" input binary archive.  It addresses integer size and endienness so
+// that binary archives can be passed across systems. Note:floating point types
+// not addressed here
+class portable_binary_iarchive :
+    public boost::archive::basic_binary_iprimitive<
+        portable_binary_iarchive,
+        std::istream::char_type,
+        std::istream::traits_type
+    >,
+    public boost::archive::detail::common_iarchive<
+        portable_binary_iarchive
+    >
+    ,
+    public boost::archive::detail::shared_ptr_helper
+    {
+    typedef boost::archive::basic_binary_iprimitive<
+        portable_binary_iarchive,
+        std::istream::char_type,
+        std::istream::traits_type
+    > primitive_base_t;
+    typedef boost::archive::detail::common_iarchive<
+        portable_binary_iarchive
+    > archive_base_t;
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend archive_base_t;
+    friend primitive_base_t; // since with override load below
+    friend class boost::archive::detail::interface_iarchive<
+        portable_binary_iarchive
+    >;
+    friend class boost::archive::load_access;
+protected:
+#endif
+    unsigned int m_flags;
+    void load_impl(boost::intmax_t & l, char maxsize);
+
+    // default fall through for any types not specified here
+    template<class T>
+    void load(T & t){
+        boost::intmax_t l;
+        load_impl(l, sizeof(T));
+        // use cast to avoid compile time warning
+        //t = static_cast< T >(l);
+        t = T(l);
+    }
+    void load(boost::serialization::item_version_type & t){
+        boost::intmax_t l;
+        load_impl(l, sizeof(boost::serialization::item_version_type));
+        // use cast to avoid compile time warning
+        t = boost::serialization::item_version_type(l);
+    }
+    void load(boost::archive::version_type & t){
+        boost::intmax_t l;
+        load_impl(l, sizeof(boost::archive::version_type));
+        // use cast to avoid compile time warning
+        t = boost::archive::version_type(l);
+    }
+    void load(boost::archive::class_id_type & t){
+        boost::intmax_t l;
+        load_impl(l, sizeof(boost::archive::class_id_type));
+        // use cast to avoid compile time warning
+        t = boost::archive::class_id_type(static_cast<int>(l));
+    }
+    void load(std::string & t){
+        this->primitive_base_t::load(t);
+    }
+    #ifndef BOOST_NO_STD_WSTRING
+    void load(std::wstring & t){
+        this->primitive_base_t::load(t);
+    }
+    #endif
+    void load(float & t){
+        this->primitive_base_t::load(t);
+        // floats not supported
+        //BOOST_STATIC_ASSERT(false);
+    }
+    void load(double & t){
+        this->primitive_base_t::load(t);
+        // doubles not supported
+        //BOOST_STATIC_ASSERT(false);
+    }
+    void load(signed char & t){
+        this->primitive_base_t::load(t);
+    }
+    void load(unsigned char & t){
+        this->primitive_base_t::load(t);
+    }
+    // intermediate level to support override of operators
+    // fot templates in the absence of partial function
+    // template ordering
+    typedef boost::archive::detail::common_iarchive<portable_binary_iarchive>
+        detail_common_iarchive;
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int){
+        this->detail_common_iarchive::load_override(t, 0);
+    }
+    void load_override(boost::archive::class_name_type & t, int);
+    // binary files don't include the optional information
+    void load_override(
+        boost::archive::class_id_optional_type & /* t */,
+        int
+    ){}
+
+    void init(unsigned int flags);
+public:
+    portable_binary_iarchive(std::istream & is, unsigned flags = 0) :
+        primitive_base_t(
+            * is.rdbuf(),
+            0 != (flags & boost::archive::no_codecvt)
+        ),
+        archive_base_t(flags),
+        m_flags(0)
+    {
+        init(flags);
+    }
+
+    portable_binary_iarchive(
+        std::basic_streambuf<
+            std::istream::char_type,
+            std::istream::traits_type
+        > & bsb,
+        unsigned int flags
+    ) :
+        primitive_base_t(
+            bsb,
+            0 != (flags & boost::archive::no_codecvt)
+        ),
+        archive_base_t(flags),
+        m_flags(0)
+    {
+        init(flags);
+    }
+};
+
+// required by export in boost version > 1.34
+#ifdef BOOST_SERIALIZATION_REGISTER_ARCHIVE
+    BOOST_SERIALIZATION_REGISTER_ARCHIVE(portable_binary_iarchive)
+#endif
+
+// required by export in boost <= 1.34
+#define BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES portable_binary_iarchive
+
+#if defined(_MSC_VER)
+#pragma warning( pop )
+#endif
+
+#endif // PORTABLE_BINARY_IARCHIVE_HPP
+#endif // PORTABLE_BINARY_ARCHIVES
+
diff --git a/ecflow_4_0_7/ACore/src/portable_binary_oarchive.cpp b/ecflow_4_0_7/ACore/src/portable_binary_oarchive.cpp
new file mode 100644
index 0000000..62cfc73
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_binary_oarchive.cpp
@@ -0,0 +1,102 @@
+#if defined(PORTABLE_BINARY_ARCHIVE)
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// portable_binary_oarchive.cpp
+
+// (C) Copyright 2002-7 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <ostream>
+#include <boost/detail/endian.hpp>
+#include "portable_binary_oarchive.hpp"
+
+void
+portable_binary_oarchive::save_impl(
+    const boost::intmax_t l,
+    const char maxsize
+){
+    signed char size = 0;
+
+    if(l == 0){
+        this->primitive_base_t::save(size);
+        return;
+    }
+
+    boost::intmax_t ll;
+    bool negative = (l < 0);
+    if(negative)
+        ll = -l;
+    else
+        ll = l;
+
+    do{
+        ll >>= CHAR_BIT;
+        ++size;
+    }while(ll != 0);
+
+    this->primitive_base_t::save(
+        static_cast<char>(negative ? -size : size)
+    );
+
+    if(negative)
+        ll = -l;
+    else
+        ll = l;
+    char * cptr = reinterpret_cast<char *>(& ll);
+    #ifdef BOOST_BIG_ENDIAN
+        cptr += (sizeof(boost::intmax_t) - size);
+        if(m_flags & endian_little)
+            reverse_bytes(size, cptr);
+    #else
+        if(m_flags & endian_big)
+            reverse_bytes(size, cptr);
+    #endif
+    this->primitive_base_t::save_binary(cptr, size);
+}
+
+void
+portable_binary_oarchive::init(unsigned int flags) {
+    if(m_flags == (endian_big | endian_little)){
+        boost::serialization::throw_exception(
+            portable_binary_oarchive_exception()
+        );
+    }
+    if(0 == (flags & boost::archive::no_header)){
+        // write signature in an archive version independent manner
+        const std::string file_signature(
+            boost::archive::BOOST_ARCHIVE_SIGNATURE()
+        );
+        * this << file_signature;
+        // write library version
+        const boost::archive::library_version_type v(
+            boost::archive::BOOST_ARCHIVE_VERSION()
+        );
+        * this << v;
+    }
+    save(static_cast<unsigned char>(m_flags >> CHAR_BIT));
+}
+
+#include <boost/archive/impl/archive_serializer_map.ipp>
+#include <boost/archive/impl/basic_binary_oprimitive.ipp>
+
+namespace boost {
+namespace archive {
+
+namespace detail {
+    template class archive_serializer_map<portable_binary_oarchive>;
+}
+
+template class basic_binary_oprimitive<
+    portable_binary_oarchive,
+    std::ostream::char_type,
+    std::ostream::traits_type
+> ;
+
+} // namespace archive
+} // namespace boost
+#endif // PORTABLE_BINARY_ARCHIVES
+
diff --git a/ecflow_4_0_7/ACore/src/portable_binary_oarchive.hpp b/ecflow_4_0_7/ACore/src/portable_binary_oarchive.hpp
new file mode 100644
index 0000000..4dcf9e5
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_binary_oarchive.hpp
@@ -0,0 +1,195 @@
+#if defined(PORTABLE_BINARY_ARCHIVE)
+
+#ifndef PORTABLE_BINARY_OARCHIVE_HPP
+#define PORTABLE_BINARY_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4244 )
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// portable_binary_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <ostream>
+#include <boost/serialization/string.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/basic_binary_oprimitive.hpp>
+#include <boost/archive/detail/common_oarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include "portable_binary_archive.hpp"
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// exception to be thrown if integer read from archive doesn't fit
+// variable being loaded
+class portable_binary_oarchive_exception :
+    public virtual boost::archive::archive_exception
+{
+public:
+    typedef enum {
+        invalid_flags
+    } exception_code;
+    portable_binary_oarchive_exception(exception_code c = invalid_flags )
+    {}
+    virtual const char *what( ) const throw( )
+    {
+        const char *msg = "programmer error";
+        switch(code){
+        case invalid_flags:
+            msg = "cannot be both big and little endian";
+        default:
+            boost::archive::archive_exception::what();
+        }
+        return msg;
+    }
+};
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// "Portable" output binary archive.  This is a variation of the native binary
+// archive. it addresses integer size and endienness so that binary archives can
+// be passed across systems. Note:floating point types not addressed here
+
+class portable_binary_oarchive :
+    public boost::archive::basic_binary_oprimitive<
+        portable_binary_oarchive,
+        std::ostream::char_type,
+        std::ostream::traits_type
+    >,
+    public boost::archive::detail::common_oarchive<
+        portable_binary_oarchive
+    >
+{
+    typedef boost::archive::basic_binary_oprimitive<
+        portable_binary_oarchive,
+        std::ostream::char_type,
+        std::ostream::traits_type
+    > primitive_base_t;
+    typedef boost::archive::detail::common_oarchive<
+        portable_binary_oarchive
+    > archive_base_t;
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend archive_base_t;
+    friend primitive_base_t; // since with override save below
+    friend class boost::archive::detail::interface_oarchive<
+        portable_binary_oarchive
+    >;
+    friend class boost::archive::save_access;
+protected:
+#endif
+    unsigned int m_flags;
+    void save_impl(const boost::intmax_t l, const char maxsize);
+    // add base class to the places considered when matching
+    // save function to a specific set of arguments.  Note, this didn't
+    // work on my MSVC 7.0 system so we use the sure-fire method below
+    // using archive_base_t::save;
+
+    // default fall through for any types not specified here
+    template<class T>
+    void save(const T & t){
+        save_impl(t, sizeof(T));
+    }
+    void save(const std::string & t){
+        this->primitive_base_t::save(t);
+    }
+    #ifndef BOOST_NO_STD_WSTRING
+    void save(const std::wstring & t){
+        this->primitive_base_t::save(t);
+    }
+    #endif
+    void save(const float & t){
+        this->primitive_base_t::save(t);
+        // floats not supported
+        //BOOST_STATIC_ASSERT(false);
+    }
+    void save(const double & t){
+        this->primitive_base_t::save(t);
+        // doubles not supported
+        //BOOST_STATIC_ASSERT(false);
+    }
+    void save(const signed char & t){
+        this->primitive_base_t::save(t);
+    }
+    void save(const unsigned char & t){
+        this->primitive_base_t::save(t);
+    }
+
+    // default processing - kick back to base class.  Note the
+    // extra stuff to get it passed borland compilers
+    typedef boost::archive::detail::common_oarchive<portable_binary_oarchive>
+        detail_common_oarchive;
+    template<class T>
+    void save_override(T & t, BOOST_PFTO int){
+        this->detail_common_oarchive::save_override(t, 0);
+    }
+    // explicitly convert to char * to avoid compile ambiguities
+    void save_override(const boost::archive::class_name_type & t, int){
+        const std::string s(t);
+        * this << s;
+    }
+    // binary files don't include the optional information
+    void save_override(
+        const boost::archive::class_id_optional_type & /* t */,
+        int
+    ){}
+
+    void init(unsigned int flags);
+public:
+    portable_binary_oarchive(std::ostream & os, unsigned flags = 0) :
+        primitive_base_t(
+            * os.rdbuf(),
+            0 != (flags & boost::archive::no_codecvt)
+        ),
+        archive_base_t(flags),
+        m_flags(flags & (endian_big | endian_little))
+    {
+        init(flags);
+    }
+
+    portable_binary_oarchive(
+        std::basic_streambuf<
+            std::ostream::char_type,
+            std::ostream::traits_type
+        > & bsb,
+        unsigned int flags
+    ) :
+        primitive_base_t(
+            bsb,
+            0 != (flags & boost::archive::no_codecvt)
+        ),
+        archive_base_t(flags),
+        m_flags(0)
+    {
+        init(flags);
+    }
+};
+
+
+// required by export in boost version > 1.34
+#ifdef BOOST_SERIALIZATION_REGISTER_ARCHIVE
+    BOOST_SERIALIZATION_REGISTER_ARCHIVE(portable_binary_oarchive)
+#endif
+
+// required by export in boost <= 1.34
+#define BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES portable_binary_oarchive
+
+#if defined(_MSC_VER)
+#pragma warning( pop )
+#endif
+
+#endif // PORTABLE_BINARY_OARCHIVE_HPP
+#endif // PORTABLE_BINARY_ARCHIVES
diff --git a/ecflow_4_0_7/ACore/src/portable_iarchive.hpp b/ecflow_4_0_7/ACore/src/portable_iarchive.hpp
new file mode 100644
index 0000000..28c33de
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_iarchive.hpp
@@ -0,0 +1,484 @@
+/*****************************************************************************/
+/**
+ * \file portable_iarchive.hpp
+ * \brief Provides an archive to read from portable binary files.
+ * \author christian.pfligersdorffer at gmx.at
+ * \version 5.0
+ *
+ * This pair of archives brings the advantages of binary streams to the cross
+ * platform boost::serialization user. While being almost as fast as the native
+ * binary archive it allows its files to be exchanged between cpu architectures
+ * using different byte order (endianness). Speaking of speed: in serializing
+ * numbers the (portable) binary approach is approximately ten times faster than
+ * the ascii implementation (that is inherently portable)!
+ *
+ * Based on the portable archive example by Robert Ramey this implementation
+ * uses Beman Dawes endian library and fp_utilities from Johan Rade, both being
+ * in boost since 1.36. Prior to that you need to add them both (header only)
+ * to your boost directory before you're able to use the archives provided. 
+ * Our archives have been tested successfully for boost versions 1.33 to 1.49!
+ *
+ * \note Correct behaviour has so far been confirmed using PowerPC-32, x86-32
+ *       and x86-64 platforms featuring different byte order. So there is a good
+ *       chance it will instantly work for your specific setup. If you encounter
+ *       problems or have suggestions please contact the author.
+ *
+ * \note Version 5.0 is now compatible with boost up to version 1.49 and enables
+ *       serialization of std::wstring by converting it to/from utf8 (thanks to
+ *       Arash Abghari for this suggestion). With that all unit tests from the
+ *       serialization library pass again with the notable exception of user
+ *       defined primitive types. Those are not supported and as a result any
+ *       user defined type to be used with the portable archives are required 
+ *       to be at least object_serializable.
+ *
+ * \note Version 4.2 maintains compatibility with the latest boost 1.45 and adds
+ *       serialization of special floating point values inf and NaN as proposed
+ *       by Francois Mauger.
+ *
+ * \note Version 4.1 makes the archives work together with boost 1.40 and 1.41.
+ *       Thanks to Francois Mauger for his suggestions.
+ *
+ * \note Version 4 removes one level of the inheritance hierarchy and directly
+ *       builds upon binary primitive and basic binary archive, thereby fixing
+ *       the last open issue regarding array serialization. Thanks to Robert
+ *       Ramey for the hint.
+ *
+ * \note A few fixes introduced in version 3.1 let the archives pass all of the
+ *       serialization tests. Thanks to Sergey Morozov for running the tests.
+ *       Wouter Bijlsma pointed out where to find the fp_utilities and endian
+ *       libraries headers inside the boost distribution. I would never have
+ *       found them so thank him it works out of the box since boost 1.36.
+ *
+ * \note With Version 3.0 the archives have been made portable across different
+ *       boost versions. For that purpose a header is added to the data that
+ *       supplies the underlying serialization library version. Backwards
+ *       compatibility is maintained by assuming library version boost 1.33 if
+ *       the iarchive is created using the no_header flag. Whether a header is
+ *       present or not can be guessed by peeking into the stream: the header's
+ *       first byte is the magic number 127 coinciding with 'e'|'o'|'s' :-)
+ *
+ * \note Version 2.1 removes several compiler warnings and enhances floating
+ *       point diagnostics to inform the user if some preconditions are violated
+ *		 on his platform. We do not strive for the universally portable solution
+ *       in binary floating point serialization as desired by some boost users.
+ *       Instead we support only the most widely used IEEE 754 format and try to
+ *       detect when requirements are not met and hence our approach must fail.
+ *       Contributions we made by Johan Rade and �kos Mar�y.
+ *
+ * \note Version 2.0 fixes a serious bug that effectively transformed most
+ *       of negative integral values into positive values! For example the two
+ *       numbers -12 and 234 were stored in the same 8-bit pattern and later
+ *       always restored to 234. This was fixed in this version in a way that
+ *       does not change the interpretation of existing archives that did work
+ *       because there were no negative numbers. The other way round archives
+ *       created by version 2.0 and containing negative numbers will raise an
+ *       integer type size exception when reading it with version 1.0. Thanks
+ *       to Markus Frohnmaier for testing the archives and finding the bug.
+ *
+ * \copyright The boost software license applies.
+ */
+/*****************************************************************************/
+
+#pragma once
+
+#include <istream>
+
+// basic headers
+#include <boost/version.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/archive/basic_binary_iprimitive.hpp>
+#include <boost/archive/basic_binary_iarchive.hpp>
+
+#if BOOST_VERSION >= 103500
+#include <boost/archive/shared_ptr_helper.hpp>
+#endif
+
+// funny polymorphics
+#if BOOST_VERSION < 103500
+#include <boost/archive/detail/polymorphic_iarchive_impl.hpp>
+#define POLYMORPHIC(T) boost::archive::detail::polymorphic_iarchive_impl<T>
+
+#elif BOOST_VERSION < 103600
+#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
+#define POLYMORPHIC(T) boost::archive::detail::polymorphic_iarchive_dispatch<T>
+
+#else
+#include <boost/archive/detail/polymorphic_iarchive_route.hpp>
+#define POLYMORPHIC(T) boost::archive::detail::polymorphic_iarchive_route<T>
+#endif
+
+// endian and fpclassify
+#if BOOST_VERSION < 103600
+#include <boost/integer/endian.hpp>
+#include <boost/math/fpclassify.hpp>
+#elif BOOST_VERSION < 104800
+#include <boost/spirit/home/support/detail/integer/endian.hpp>
+#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
+#else
+#include <boost/spirit/home/support/detail/endian/endian.hpp>
+#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
+#endif
+
+// namespace alias
+#if BOOST_VERSION < 103800
+namespace fp = boost::math;
+#else
+namespace fp = boost::spirit::math;
+#endif
+
+// namespace alias endian
+#if BOOST_VERSION < 104800
+namespace endian = boost::detail;
+#else
+namespace endian = boost::spirit::detail;
+#endif
+
+#ifndef BOOST_NO_STD_WSTRING
+// used for wstring to utf8 conversion
+#include <boost/program_options/config.hpp>
+#include <boost/program_options/detail/convert.hpp>
+#endif
+
+// generic type traits for numeric types
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include "portable_archive_exception.hpp"
+
+// hint from Johan Rade: on VMS there is still support for
+// the VAX floating point format and this macro detects it
+#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
+#error "VAX floating point format is not supported!"
+#endif
+
+namespace eos {
+
+	// forward declaration
+	class portable_iarchive;
+
+	typedef boost::archive::basic_binary_iprimitive<
+		portable_iarchive
+	#if BOOST_VERSION < 103400
+		, std::istream
+	#else
+		, std::istream::char_type 
+		, std::istream::traits_type
+	#endif
+	> portable_iprimitive;
+
+	/**
+	 * \brief Portable binary input archive using little endian format.
+	 *
+	 * This archive addresses integer size, endianness and floating point types so
+	 * that data can be transferred across different systems. There may still be
+	 * constraints as to what systems are compatible and the user will have to take
+	 * care that e.g. a very large int being saved on a 64 bit machine will result
+	 * in a portable_archive_exception if loaded into an int on a 32 bit system.
+	 * A possible workaround to this would be to use fixed types like
+	 * boost::uint64_t in your serialization structures.
+	 *
+	 * \note The class is based on the portable binary example by Robert Ramey and
+	 *	     uses Beman Dawes endian library plus fp_utilities by Johan Rade.
+	 */
+	class portable_iarchive : public portable_iprimitive
+
+		// the example derives from common_oarchive but that lacks the
+		// load_override functions so we chose to stay one level higher
+		, public boost::archive::basic_binary_iarchive<portable_iarchive>
+
+	#if BOOST_VERSION >= 103500
+		// mix-in helper class for serializing shared_ptr
+		, public boost::archive::detail::shared_ptr_helper
+	#endif
+	{
+		// only needed for Robert's hack in basic_binary_iarchive::init
+		friend class boost::archive::basic_binary_iarchive<portable_iarchive>;
+
+		// workaround for gcc: use a dummy struct
+		// as additional argument type for overloading
+		template <int> struct dummy { dummy(int) {}};
+
+		// loads directly from stream
+		inline signed char load_signed_char()
+		{ 
+			signed char c; 
+			portable_iprimitive::load(c); 
+			return c; 
+		}
+
+		// archive initialization
+		void init(unsigned flags)
+		{
+			using namespace boost::archive;
+			archive_version_type input_library_version(3);
+
+			// it is vital to have version information!
+			// if we don't have any we assume boost 1.33
+			if (flags & no_header)
+				set_library_version(input_library_version);
+
+			// extract and check the magic eos byte
+			else if (load_signed_char() != magic_byte)
+				throw archive_exception(archive_exception::invalid_signature);
+
+			else
+			{
+				// extract version information
+				operator>>(input_library_version);
+
+				// throw if file version is newer than we are
+				if (input_library_version > archive_version)
+					throw archive_exception(archive_exception::unsupported_version);
+
+				// else set the library version accordingly
+				else set_library_version(input_library_version);
+			}
+		}
+
+	public:
+		/**
+		 * \brief Constructor on a stream using ios::binary mode!
+		 *
+		 * We cannot call basic_binary_iprimitive::init which tries to detect
+		 * if the binary archive stems from a different platform by examining
+		 * type sizes.
+		 *
+		 * We could have called basic_binary_iarchive::init which would create
+		 * the boost::serialization standard archive header containing also the
+		 * library version. Due to efficiency we stick with our own.
+		 */
+		portable_iarchive(std::istream& is, unsigned flags = 0)
+		#if BOOST_VERSION < 103400
+			: portable_iprimitive(is, flags & boost::archive::no_codecvt)
+		#else
+			: portable_iprimitive(*is.rdbuf(), flags & boost::archive::no_codecvt)
+		#endif
+			, boost::archive::basic_binary_iarchive<portable_iarchive>(flags)
+		{
+			init(flags);
+		}
+
+	#if BOOST_VERSION >= 103400
+		portable_iarchive(std::streambuf& sb, unsigned flags = 0)
+			: portable_iprimitive(sb, flags & boost::archive::no_codecvt)
+			, boost::archive::basic_binary_iarchive<portable_iarchive>(flags)
+		{
+			init(flags);
+		}
+	#endif
+
+		//! Load narrow strings.
+		void load(std::string& s) 
+		{
+			portable_iprimitive::load(s);
+		}
+
+	#ifndef BOOST_NO_STD_WSTRING
+		/**
+		 * \brief Load wide strings.
+		 *
+		 * This is rather tricky to get right for true portability as there
+		 * are so many different character encodings around. However, wide
+		 * strings that are encoded in one of the Unicode schemes only need
+		 * to be _transcoded_ which is a lot easier actually.
+		 *
+		 * We generate the output string to be encoded in the system's native
+		 * format, ie. UTF-16 on Windows and UTF-32 on Linux machines. Don't
+		 * know about Mac here so I can't really say about that.
+		 */
+		void load(std::wstring& s)
+		{
+			std::string utf8;
+			load(utf8);
+			s = boost::from_utf8(utf8);
+		}
+	#endif
+
+        /**
+         * \brief Loading bool type.
+         *
+         * Byte pattern is same as with integer types, so this function
+         * is somewhat redundant but treating bool as integer generates
+		 * a lot of compiler warnings.
+         *
+         * \note If you cannot compile your application and it says something
+         * about load(bool) cannot convert your type A& into bool& then you
+         * should check your BOOST_CLASS_IMPLEMENTATION setting for A, as
+         * portable_archive is not able to handle custom primitive types in
+         * a general manner.
+         */
+		void load(bool& b) 
+		{ 
+			switch (signed char c = load_signed_char())
+			{
+			case 0: b = false; break;
+			case 1: b = load_signed_char(); break;
+			default: throw portable_archive_exception(c);
+			}
+		}
+
+		/**
+		 * \brief Load integer types.
+		 *
+		 * First we load the size information ie. the number of bytes that 
+		 * hold the actual data. Then we retrieve the data and transform it
+		 * to the original value by using load_little_endian.
+		 */
+		template <typename T>
+		typename boost::enable_if<boost::is_integral<T> >::type
+		load(T & t, dummy<2> = 0)
+		{
+			// get the number of bytes in the stream
+			if (signed char size = load_signed_char())
+			{
+				// check for negative value in unsigned type
+				if (size < 0 && boost::is_unsigned<T>::value)
+					throw portable_archive_exception();
+
+				// check that our type T is large enough
+				else if ((unsigned) abs(size) > sizeof(T)) 
+					throw portable_archive_exception(size);
+
+				// reconstruct the value
+				T temp = size < 0 ? -1 : 0;
+				load_binary(&temp, abs(size));
+
+				// load the value from little endian - is is then converted
+				// to the target type T and fits it because size <= sizeof(T)
+				t = endian::load_little_endian<T, sizeof(T)>(&temp);
+			}
+
+			else t = 0; // zero optimization
+		}
+
+		/** 
+		 * \brief Load floating point types.
+		 * 
+		 * We simply rely on fp_traits to set the bit pattern from the (unsigned)
+		 * integral type that was stored in the stream. Francois Mauger provided
+		 * standardized behaviour for special values like inf and NaN, that need to
+		 * be serialized in his application.
+		 *
+		 * \note by Johan Rade (author of the floating point utilities library):
+		 * Be warned that the math::detail::fp_traits<T>::type::get_bits() function 
+		 * is *not* guaranteed to give you all bits of the floating point number. It
+		 * will give you all bits if and only if there is an integer type that has
+		 * the same size as the floating point you are copying from. It will not
+		 * give you all bits for double if there is no uint64_t. It will not give
+		 * you all bits for long double if sizeof(long double) > 8 or there is no
+		 * uint64_t. 
+		 * 
+		 * The member fp_traits<T>::type::coverage will tell you whether all bits
+		 * are copied. This is a typedef for either math::detail::all_bits or
+		 * math::detail::not_all_bits. 
+		 * 
+		 * If the function does not copy all bits, then it will copy the most
+		 * significant bits. So if you serialize and deserialize the way you
+		 * describe, and fp_traits<T>::type::coverage is math::detail::not_all_bits,
+		 * then your floating point numbers will be truncated. This will introduce
+		 * small rounding off errors. 
+		 */
+		template <typename T>
+		typename boost::enable_if<boost::is_floating_point<T> >::type
+		load(T & t, dummy<3> = 0)
+		{
+			typedef typename fp::detail::fp_traits<T>::type traits;
+
+			// if you end here there are three possibilities:
+			// 1. you're serializing a long double which is not portable
+			// 2. you're serializing a double but have no 64 bit integer
+			// 3. your machine is using an unknown floating point format
+			// after reading the note above you still might decide to 
+			// deactivate this static assert and try if it works out.
+			typename traits::bits bits;
+			BOOST_STATIC_ASSERT(sizeof(bits) == sizeof(T));
+			BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_iec559);
+
+			load(bits);
+			traits::set_bits(t, bits);
+
+			// if the no_infnan flag is set we must throw here
+			if (get_flags() & no_infnan && !fp::isfinite(t))
+				throw portable_archive_exception(t);
+
+			// if you end here your floating point type does not support 
+			// denormalized numbers. this might be the case even though 
+			// your type conforms to IEC 559 (and thus to IEEE 754)
+			if (std::numeric_limits<T>::has_denorm == std::denorm_absent
+				&& fp::fpclassify(t) == (int) FP_SUBNORMAL) // GCC4
+				throw portable_archive_exception(t);
+		}
+
+		// in boost 1.44 version_type was splitted into library_version_type and
+		// item_version_type, plus a whole bunch of additional strong typedefs.
+		template <typename T>
+		typename boost::disable_if<boost::is_arithmetic<T> >::type
+		load(T& t, dummy<4> = 0)
+		{
+			// we provide a generic load routine for all types that feature
+			// conversion operators into an unsigned integer value like those
+			// created through BOOST_STRONG_TYPEDEF(X, some unsigned int) like
+			// library_version_type, collection_size_type, item_version_type,
+			// class_id_type, object_id_type, version_type and tracking_type
+			load((typename boost::uint_t<sizeof(T)*CHAR_BIT>::least&)(t));
+		}
+	};
+
+	// polymorphic portable binary iarchive typedef
+	typedef POLYMORPHIC(portable_iarchive) polymorphic_portable_iarchive;
+	#undef POLYMORPHIC
+
+} // namespace eos
+
+// this is required by export which registers all of your
+// classes with all the inbuilt archives plus our archive.
+#if BOOST_VERSION < 103500
+#define BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES eos::portable_iarchive
+#else
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::portable_iarchive)
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::polymorphic_portable_iarchive)
+#endif
+
+// if you include this header multiple times and your compiler is picky
+// about multiple template instantiations (eg. gcc is) then you need to
+// define NO_EXPLICIT_TEMPLATE_INSTANTIATION before every include but one
+// or you move the instantiation section into an implementation file
+#ifndef NO_EXPLICIT_TEMPLATE_INSTANTIATION
+
+#include <boost/archive/impl/basic_binary_iarchive.ipp>
+#include <boost/archive/impl/basic_binary_iprimitive.ipp>
+
+#if BOOST_VERSION < 104000
+#include <boost/archive/impl/archive_pointer_iserializer.ipp>
+#elif !defined BOOST_ARCHIVE_SERIALIZER_INCLUDED
+#include <boost/archive/impl/archive_serializer_map.ipp>
+#define BOOST_ARCHIVE_SERIALIZER_INCLUDED
+#endif
+
+namespace boost { namespace archive {
+
+	// explicitly instantiate for this type of binary stream
+	template class basic_binary_iarchive<eos::portable_iarchive>;
+
+	template class basic_binary_iprimitive<
+		eos::portable_iarchive
+	#if BOOST_VERSION < 103400
+		, std::istream
+	#else
+		, std::istream::char_type
+		, std::istream::traits_type
+	#endif
+	>;
+
+#if BOOST_VERSION < 104000
+	template class detail::archive_pointer_iserializer<eos::portable_iarchive>;
+#else
+	template class detail::archive_serializer_map<eos::portable_iarchive>;
+	//template class detail::archive_serializer_map<eos::polymorphic_portable_iarchive>;
+#endif
+
+} } // namespace boost::archive
+
+#endif
diff --git a/ecflow_4_0_7/ACore/src/portable_oarchive.hpp b/ecflow_4_0_7/ACore/src/portable_oarchive.hpp
new file mode 100644
index 0000000..e3403dd
--- /dev/null
+++ b/ecflow_4_0_7/ACore/src/portable_oarchive.hpp
@@ -0,0 +1,471 @@
+/*****************************************************************************/
+/**
+ * \file portable_oarchive.hpp
+ * \brief Provides an archive to create portable binary files.
+ * \author christian.pfligersdorffer at gmx.at
+ * \version 5.0
+ *
+ * This pair of archives brings the advantages of binary streams to the cross
+ * platform boost::serialization user. While being almost as fast as the native
+ * binary archive it allows its files to be exchanged between cpu architectures
+ * using different byte order (endianness). Speaking of speed: in serializing
+ * numbers the (portable) binary approach is approximately ten times faster than
+ * the ascii implementation (that is inherently portable)!
+ *
+ * Based on the portable archive example by Robert Ramey this implementation
+ * uses Beman Dawes endian library and fp_utilities from Johan Rade, both being
+ * in boost since 1.36. Prior to that you need to add them both (header only)
+ * to your boost directory before you're able to use the archives provided. 
+ * Our archives have been tested successfully for boost versions 1.33 to 1.49!
+ *
+ * \note Correct behaviour has so far been confirmed using PowerPC-32, x86-32
+ *       and x86-64 platforms featuring different byte order. So there is a good
+ *       chance it will instantly work for your specific setup. If you encounter
+ *       problems or have suggestions please contact the author.
+ *
+ * \note Version 5.0 is now compatible with boost up to version 1.49 and enables
+ *       serialization of std::wstring by converting it to/from utf8 (thanks to
+ *       Arash Abghari for this suggestion). With that all unit tests from the
+ *       serialization library pass again with the notable exception of user
+ *       defined primitive types. Those are not supported and as a result any
+ *       user defined type to be used with the portable archives are required 
+ *       to be at least object_serializable.
+ *
+ * \note Oliver Putz pointed out that -0.0 was not serialized correctly, so
+ *       version 4.3 provides a fix for that. Thanks Ollie!
+ *
+ * \note Version 4.2 maintains compatibility with the latest boost 1.45 and adds
+ *       serialization of special floating point values inf and NaN as proposed
+ *       by Francois Mauger.
+ *
+ * \note Version 4.1 makes the archives work together with boost 1.40 and 1.41.
+ *       Thanks to Francois Mauger for his suggestions.
+ *
+ * \note Version 4 removes one level of the inheritance hierarchy and directly
+ *       builds upon binary primitive and basic binary archive, thereby fixing
+ *       the last open issue regarding array serialization. Thanks to Robert
+ *       Ramey for the hint.
+ *
+ * \note A few fixes introduced in version 3.1 let the archives pass all of the
+ *       serialization tests. Thanks to Sergey Morozov for running the tests.
+ *       Wouter Bijlsma pointed out where to find the fp_utilities and endian
+ *       libraries headers inside the boost distribution. I would never have
+ *       found them so thank him it works out of the box since boost 1.36.
+ *
+ * \note With Version 3.0 the archives have been made portable across different
+ *       boost versions. For that purpose a header is added to the data that
+ *       supplies the underlying serialization library version. Backwards
+ *       compatibility is maintained by assuming library version boost 1.33 if
+ *       the iarchive is created using the no_header flag. Whether a header is
+ *       present or not can be guessed by peeking into the stream: the header's
+ *       first byte is the magic number 127 coinciding with 'e'|'o'|'s' :-)
+ *
+ * \note Version 2.1 removes several compiler warnings and enhances floating
+ *       point diagnostics to inform the user if some preconditions are violated
+ *		 on his platform. We do not strive for the universally portable solution
+ *       in binary floating point serialization as desired by some boost users.
+ *       Instead we support only the most widely used IEEE 754 format and try to
+ *       detect when requirements are not met and hence our approach must fail.
+ *       Contributions we made by Johan Rade and �kos Mar�y.
+ *
+ * \note Version 2.0 fixes a serious bug that effectively transformed most
+ *       of negative integral values into positive values! For example the two
+ *       numbers -12 and 234 were stored in the same 8-bit pattern and later
+ *       always restored to 234. This was fixed in this version in a way that
+ *       does not change the interpretation of existing archives that did work
+ *       because there were no negative numbers. The other way round archives
+ *       created by version 2.0 and containing negative numbers will raise an
+ *       integer type size exception when reading it with version 1.0. Thanks
+ *       to Markus Frohnmaier for testing the archives and finding the bug.
+ *
+ * \copyright The boost software license applies.
+ */
+/*****************************************************************************/
+
+#pragma once
+
+#include <ostream>
+
+// basic headers
+#include <boost/version.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/archive/basic_binary_oprimitive.hpp>
+#include <boost/archive/basic_binary_oarchive.hpp>
+
+#if BOOST_VERSION >= 103500
+#include <boost/archive/shared_ptr_helper.hpp>
+#endif
+
+#if BOOST_VERSION >= 104500
+#include <boost/program_options/config.hpp>
+#include <boost/program_options/detail/convert.hpp>
+#endif
+
+// funny polymorphics
+#if BOOST_VERSION < 103500
+#include <boost/archive/detail/polymorphic_oarchive_impl.hpp>
+#define POLYMORPHIC(T) boost::archive::detail::polymorphic_oarchive_impl<T>
+
+#elif BOOST_VERSION < 103600
+#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
+#define POLYMORPHIC(T) boost::archive::detail::polymorphic_oarchive_dispatch<T>
+
+#else
+#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
+#define POLYMORPHIC(T) boost::archive::detail::polymorphic_oarchive_route<T>
+#endif
+
+// endian and fpclassify
+#if BOOST_VERSION < 103600
+#include <boost/integer/endian.hpp>
+#include <boost/math/fpclassify.hpp>
+#elif BOOST_VERSION < 104800
+#include <boost/spirit/home/support/detail/integer/endian.hpp>
+#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
+#else
+#include <boost/spirit/home/support/detail/endian/endian.hpp>
+#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
+#endif
+
+// namespace alias fp_classify
+#if BOOST_VERSION < 103800
+namespace fp = boost::math;
+#else
+namespace fp = boost::spirit::math;
+#endif
+
+// namespace alias endian
+#if BOOST_VERSION < 104800
+namespace endian = boost::detail;
+#else
+namespace endian = boost::spirit::detail;
+#endif
+
+#ifndef BOOST_NO_STD_WSTRING
+// used for wstring to utf8 conversion
+#include <boost/program_options/config.hpp>
+#include <boost/program_options/detail/convert.hpp>
+#endif
+
+// generic type traits for numeric types
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include "portable_archive_exception.hpp"
+
+// hint from Johan Rade: on VMS there is still support for
+// the VAX floating point format and this macro detects it
+#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
+#error "VAX floating point format is not supported!"
+#endif
+
+namespace eos {
+
+	// forward declaration
+	class portable_oarchive;
+
+	typedef boost::archive::basic_binary_oprimitive<
+		portable_oarchive
+	#if BOOST_VERSION < 103400
+		, std::ostream
+	#else
+		, std::ostream::char_type 
+		, std::ostream::traits_type
+	#endif
+	> portable_oprimitive;
+
+	/**
+	 * \brief Portable binary output archive using little endian format.
+	 *
+	 * This archive addresses integer size, endianness and floating point types so
+	 * that data can be transferred across different systems. The archive consists
+	 * primarily of three different save implementations for integral types,
+	 * floating point types and string types. Those functions are templates and use
+	 * enable_if to be correctly selected for overloading.
+	 *
+	 * \note The class is based on the portable binary example by Robert Ramey and
+	 *       uses Beman Dawes endian library plus fp_utilities by Johan Rade.
+	 */
+	class portable_oarchive : public portable_oprimitive
+
+		// the example derives from common_oarchive but that lacks the
+		// save_override functions so we chose to stay one level higher
+		, public boost::archive::basic_binary_oarchive<portable_oarchive>
+
+	#if BOOST_VERSION >= 103500
+		// mix-in helper class for serializing shared_ptr
+		, public boost::archive::detail::shared_ptr_helper
+	#endif
+	{
+		// workaround for gcc: use a dummy struct
+		// as additional argument type for overloading
+		template<int> struct dummy { dummy(int) {}};
+
+		// stores a signed char directly to stream
+		inline void save_signed_char(const signed char& c) 
+		{ 
+			portable_oprimitive::save(c); 
+		}
+
+		// archive initialization
+		void init(unsigned flags)
+		{
+			// it is vital to have version information if the archive is
+			// to be parsed with a newer version of boost::serialization
+			// therefor we create a header, no header means boost 1.33
+			if (flags & boost::archive::no_header)
+				BOOST_ASSERT(archive_version == 3);
+			else
+			{
+				// write our minimalistic header (magic byte plus version)
+				// the boost archives write a string instead - by calling
+				// boost::archive::basic_binary_oarchive<derived_t>::init()
+				save_signed_char(magic_byte);
+
+				// write current version
+//				save<unsigned>(archive_version);
+				operator<<(archive_version);
+			}
+		}
+
+	public:
+		/**
+		 * \brief Constructor on a stream using ios::binary mode!
+		 *
+		 * We cannot call basic_binary_oprimitive::init which stores type
+		 * sizes to the archive in order to detect transfers to non-compatible
+		 * platforms.
+		 *
+		 * We could have called basic_binary_oarchive::init which would create
+		 * the boost::serialization standard archive header containing also the
+		 * library version. Due to efficiency we stick with our own.
+		 */
+		portable_oarchive(std::ostream& os, unsigned flags = 0)
+		#if BOOST_VERSION < 103400
+			: portable_oprimitive(os, flags & boost::archive::no_codecvt)
+		#else
+			: portable_oprimitive(*os.rdbuf(), flags & boost::archive::no_codecvt)
+		#endif
+			, boost::archive::basic_binary_oarchive<portable_oarchive>(flags)
+		{
+			init(flags);
+		}
+
+	#if BOOST_VERSION >= 103400
+		portable_oarchive(std::streambuf& sb, unsigned flags = 0)
+			: portable_oprimitive(sb, flags & boost::archive::no_codecvt)
+			, boost::archive::basic_binary_oarchive<portable_oarchive>(flags)
+		{
+			init(flags);
+		}
+	#endif
+
+		//! Save narrow strings.
+		void save(const std::string& s)
+		{
+			portable_oprimitive::save(s);
+		}
+
+	#ifndef BOOST_NO_STD_WSTRING
+		/**
+		 * \brief Save wide strings.
+		 *
+		 * This is rather tricky to get right for true portability as there
+		 * are so many different character encodings around. However, wide
+		 * strings that are encoded in one of the Unicode schemes only need
+		 * to be _transcoded_ which is a lot easier actually.
+		 *
+		 * We expect the input string to be encoded in the system's native
+		 * format, ie. UTF-16 on Windows and UTF-32 on Linux machines. Don't
+		 * know about Mac here so I can't really say about that.
+		 */
+		void save(const std::wstring& s)
+		{
+			save(boost::to_utf8(s));
+		}
+	#endif
+
+        /**
+         * \brief Saving bool type.
+         *
+         * Saving bool directly, not by const reference
+         * because of tracking_type's operator (bool).
+         *
+         * \note If you cannot compile your application and it says something
+         * about save(bool) cannot convert your type const A& into bool then
+         * you should check your BOOST_CLASS_IMPLEMENTATION setting for A, as
+         * portable_archive is not able to handle custom primitive types in
+         * a general manner.
+         */
+		void save(const bool& b)
+		{
+			save_signed_char(b);
+			if (b) save_signed_char('T');
+		}
+
+		/**
+		 * \brief Save integer types.
+		 *
+		 * First we save the size information ie. the number of bytes that hold the
+		 * actual data. We subsequently transform the data using store_little_endian
+		 * and store non-zero bytes to the stream.
+		 */
+		template <typename T>
+		typename boost::enable_if<boost::is_integral<T> >::type
+		save(const T & t, dummy<2> = 0)
+		{
+			if (T temp = t)
+			{
+				// examine the number of bytes
+				// needed to represent the number
+				signed char size = 0;
+				do { temp >>= CHAR_BIT; ++size; } 
+				while (temp != 0 && temp != (T) -1);
+
+				// encode the sign bit into the size
+				save_signed_char(t > 0 ? size : -size);
+				BOOST_ASSERT(t > 0 || boost::is_signed<T>::value);
+
+				// we choose to use little endian because this way we just
+				// save the first size bytes to the stream and skip the rest
+				endian::store_little_endian<T, sizeof(T)>(&temp, t);
+				save_binary(&temp, size);
+			}
+			// zero optimization
+			else save_signed_char(0);
+		}
+
+		/**
+		 * \brief Save floating point types.
+		 * 
+		 * We simply rely on fp_traits to extract the bit pattern into an (unsigned)
+		 * integral type and store that into the stream. Francois Mauger provided
+		 * standardized behaviour for special values like inf and NaN, that need to
+		 * be serialized in his application.
+		 *
+		 * \note by Johan Rade (author of the floating point utilities library):
+		 * Be warned that the math::detail::fp_traits<T>::type::get_bits() function 
+		 * is *not* guaranteed to give you all bits of the floating point number. It
+		 * will give you all bits if and only if there is an integer type that has
+		 * the same size as the floating point you are copying from. It will not
+		 * give you all bits for double if there is no uint64_t. It will not give
+		 * you all bits for long double if sizeof(long double) > 8 or there is no
+		 * uint64_t. 
+		 * 
+		 * The member fp_traits<T>::type::coverage will tell you whether all bits
+		 * are copied. This is a typedef for either math::detail::all_bits or
+		 * math::detail::not_all_bits. 
+		 * 
+		 * If the function does not copy all bits, then it will copy the most
+		 * significant bits. So if you serialize and deserialize the way you
+		 * describe, and fp_traits<T>::type::coverage is math::detail::not_all_bits,
+		 * then your floating point numbers will be truncated. This will introduce
+		 * small rounding off errors. 
+		 */
+		template <typename T>
+		typename boost::enable_if<boost::is_floating_point<T> >::type
+		save(const T & t, dummy<3> = 0)
+		{
+			typedef typename fp::detail::fp_traits<T>::type traits;
+
+			// if the no_infnan flag is set we must throw here
+			if (get_flags() & no_infnan && !fp::isfinite(t))
+				throw portable_archive_exception(t);
+
+			// if you end here there are three possibilities:
+			// 1. you're serializing a long double which is not portable
+			// 2. you're serializing a double but have no 64 bit integer
+			// 3. your machine is using an unknown floating point format
+			// after reading the note above you still might decide to 
+			// deactivate this static assert and try if it works out.
+			typename traits::bits bits;
+			BOOST_STATIC_ASSERT(sizeof(bits) == sizeof(T));
+			BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_iec559);
+
+			// examine value closely
+			switch (fp::fpclassify(t))
+			{
+			//case FP_ZERO: bits = 0; break; 
+			case FP_NAN: bits = traits::exponent | traits::mantissa; break;
+			case FP_INFINITE: bits = traits::exponent | (t<0) * traits::sign; break;
+			case FP_SUBNORMAL: assert(std::numeric_limits<T>::has_denorm); // pass
+			case FP_ZERO: // note that floats can be �0.0
+			case FP_NORMAL: traits::get_bits(t, bits); break;
+			default: throw portable_archive_exception(t);
+			}
+
+			save(bits);
+		}
+
+		// in boost 1.44 version_type was splitted into library_version_type and
+		// item_version_type, plus a whole bunch of additional strong typedefs.
+		template <typename T>
+		typename boost::disable_if<boost::is_arithmetic<T> >::type
+		save(const T& t, dummy<4> = 0)
+		{
+			// we provide a generic save routine for all types that feature
+			// conversion operators into an unsigned integer value like those
+			// created through BOOST_STRONG_TYPEDEF(X, some unsigned int) like
+			// library_version_type, collection_size_type, item_version_type,
+			// class_id_type, object_id_type, version_type and tracking_type
+			save((typename boost::uint_t<sizeof(T)*CHAR_BIT>::least)(t));
+		}
+	};
+
+	// polymorphic portable binary oarchive typedef
+	typedef POLYMORPHIC(portable_oarchive) polymorphic_portable_oarchive;
+	#undef POLYMORPHIC
+
+} // namespace eos
+
+// required by export
+#if BOOST_VERSION < 103500
+#define BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES eos::portable_oarchive
+#else
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::portable_oarchive)
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::polymorphic_portable_oarchive)
+#endif
+
+// if you include this header multiple times and your compiler is picky
+// about multiple template instantiations (eg. gcc is) then you need to
+// define NO_EXPLICIT_TEMPLATE_INSTANTIATION before every include but one
+// or you move the instantiation section into an implementation file
+#ifndef NO_EXPLICIT_TEMPLATE_INSTANTIATION
+
+#include <boost/archive/impl/basic_binary_oarchive.ipp>
+#include <boost/archive/impl/basic_binary_oprimitive.ipp>
+
+#if BOOST_VERSION < 104000
+#include <boost/archive/impl/archive_pointer_oserializer.ipp>
+#elif !defined BOOST_ARCHIVE_SERIALIZER_INCLUDED
+#include <boost/archive/impl/archive_serializer_map.ipp>
+#define BOOST_ARCHIVE_SERIALIZER_INCLUDED
+#endif
+
+namespace boost { namespace archive {
+
+	// explicitly instantiate for this type of binary stream
+	template class basic_binary_oarchive<eos::portable_oarchive>;
+
+	template class basic_binary_oprimitive<
+		eos::portable_oarchive
+	#if BOOST_VERSION < 103400
+		, std::ostream
+	#else
+		, std::ostream::char_type
+		, std::ostream::traits_type
+	#endif
+	>;
+
+#if BOOST_VERSION < 104000
+	template class detail::archive_pointer_oserializer<eos::portable_oarchive>;
+#else
+	template class detail::archive_serializer_map<eos::portable_oarchive>;
+	//template class detail::archive_serializer_map<eos::polymorphic_portable_oarchive>;
+#endif
+
+} } // namespace boost::archive
+
+#endif
diff --git a/ecflow_4_0_7/ACore/test/TestArgvCreator.cpp b/ecflow_4_0_7/ACore/test/TestArgvCreator.cpp
new file mode 100644
index 0000000..bf943d4
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestArgvCreator.cpp
@@ -0,0 +1,67 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <iostream>
+#include "ArgvCreator.hpp"
+
+using namespace boost;
+using namespace std;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+static void doCheck(const std::vector<std::string>& theArgs)
+{
+	ArgvCreator argvCr(theArgs);
+//	cout << argvCr.toSString() << "\n";
+	BOOST_CHECK_MESSAGE(argvCr.argc() == static_cast<int>(theArgs.size()), " argc incorrect");
+
+	char** argv = argvCr.argv();
+	for(int i=0; i < argvCr.argc(); i++) {
+		BOOST_CHECK_MESSAGE(string(argv[i]) == theArgs[i],"Mismatch in args expected " << theArgs[i] << " but found " << argv[i]);
+//		cout << i << ": " << argv[i] << "\n";
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_ArgvCreator )
+{
+	cout << "ACore:: ...test_ArgvCreator\n";
+
+	// O args
+	std::vector<std::string> theArgs;
+	doCheck(theArgs);
+
+	// 1 args
+	theArgs.push_back("arg1");
+	doCheck(theArgs);
+
+	// 2 args
+	theArgs.clear();
+	theArgs.push_back("arg1");
+	theArgs.push_back("arg2");
+	doCheck(theArgs);
+
+	// 10 args
+	theArgs.clear();
+	for(int i = 0; i < 10; i++) {
+		string theArg("arg");
+		theArg += lexical_cast<string>(i);
+		theArgs.push_back(theArg );
+	}
+	doCheck(theArgs);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestCalendar.cpp b/ecflow_4_0_7/ACore/test/TestCalendar.cpp
new file mode 100644
index 0000000..a65f347
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestCalendar.cpp
@@ -0,0 +1,454 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #20 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+#include "Calendar.hpp"
+#include "TimeSeries.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+
+//static boost::posix_time::time_duration diff_d(boost::posix_time::time_duration t1, boost::posix_time::time_duration t2)
+//{
+//   // t2 > t1 otherwise assume we have gone over midnight
+//   if (t2 > t1) return t2 - t1;
+//
+//   boost::posix_time::time_duration midnight(24,0,0);
+//   boost::posix_time::time_duration diff_from_midnight = midnight - t1;
+//   std::cout << to_simple_string(diff_from_midnight) << "\n";
+//
+//   return diff_from_midnight + t2;
+//}
+//
+//BOOST_AUTO_TEST_CASE( test_calendar_3 )
+//{
+//   cout << "ACore:: ...test_calendar_3\n";
+//
+//   Calendar calendar;
+//   BOOST_CHECK_MESSAGE(calendar.hybrid(),"Default calendar type should be hybrid");
+//
+//   // init the calendar to 2009, Feb, 10th,  15 minutes past midnight
+//
+//   boost::posix_time::time_duration t1(23,0,0);
+//   boost::posix_time::time_duration t2(1,0,0);
+//   boost::posix_time::time_duration expected(2,0,0);
+////    std::cout << to_simple_string(t1) << "\n";
+////    std::cout << to_simple_string(t2) << "\n";
+////    std::cout << to_simple_string(t1 - t2) << "\n";
+////    std::cout << to_simple_string(t2 - t1) << "\n";
+//
+//   BOOST_CHECK_MESSAGE(diff_d(t1,t2) == expected," Expected " << to_simple_string(expected) << " but found " << to_simple_string(diff_d(t1,t2)));
+//}
+
+
+
+BOOST_AUTO_TEST_CASE( test_calendar_state_parsing )
+{
+	cout << "ACore:: ...test_calendar_state_parsing\n";
+
+	Calendar calendar;
+	BOOST_CHECK_MESSAGE(!calendar.hybrid(),"Default calendar type should be real");
+
+	// init the calendar to 2009, Feb, 10th, then write out the state
+ 	boost::gregorian::date theDate(2009,2,10);
+ 	ptime time(theDate, hours(23) + minutes(59));
+	calendar.init(time, Calendar::REAL);
+	std::string calendar_state = calendar.write_state();
+
+	// read the state, into a different calendar & compare
+	std::vector<std::string> lineTokens;
+	Str::split(calendar_state,lineTokens);
+	Calendar calendar2;
+	calendar2.read_state(calendar_state,lineTokens);
+   BOOST_CHECK_MESSAGE(calendar == calendar2,"Calendar should be the same\n" << calendar.toString() << "\n" << calendar2.toString());
+
+   // Update calendar.
+ 	calendar.update(minutes(2));
+   BOOST_CHECK_MESSAGE(!(calendar == calendar2),"Calendar should be different");
+
+   // re-compare after reloading state
+   lineTokens.clear();
+   calendar_state = calendar.write_state();
+   Str::split(calendar_state,lineTokens);
+   calendar2.read_state(calendar_state,lineTokens);
+   BOOST_CHECK_MESSAGE(calendar == calendar2,"Calendar should be the same");
+}
+
+BOOST_AUTO_TEST_CASE( test_calendar_1 )
+{
+   cout << "ACore:: ...test_calendar_1\n";
+
+   Calendar calendar;
+   BOOST_CHECK_MESSAGE(!calendar.hybrid(),"Default calendar type should be real");
+
+   // init the calendar to 2009, Feb, 10th,  15 minutes past midnight
+   boost::gregorian::date theDate(2009,2,10);
+   ptime time(theDate, hours(23) + minutes(59));
+   calendar.init(time, Calendar::HYBRID);
+   BOOST_CHECK_MESSAGE(calendar.hybrid(),"init failed to reset calendar type");
+
+   calendar.update(minutes(2));
+}
+
+
+BOOST_AUTO_TEST_CASE( test_calendar )
+{
+	cout << "ACore:: ...test_calendar_basic\n";
+
+	Calendar calendar;
+	BOOST_CHECK_MESSAGE(!calendar.hybrid(),"Default calendar type should be real");
+
+	// init the calendar to 2009, Feb, 10th,  15 minutes past midnight
+ 	boost::gregorian::date theDate(2009,2,10);
+ 	ptime time(theDate, minutes(15));
+	calendar.init(time, Calendar::REAL);
+	BOOST_CHECK_MESSAGE(!calendar.hybrid(),"Calendar should now be REAL");
+
+	std::string expectedTime = "2009-Feb-10 00:15:00";
+	std::string actualTime = to_simple_string(calendar.suiteTime());
+	BOOST_CHECK_MESSAGE( actualTime == expectedTime,"Expected '" << expectedTime << "' but found " << actualTime);
+
+
+	time_duration td =  hours(1) + minutes(10);
+	calendar.update(td);
+	expectedTime = "2009-Feb-10 01:25:00";
+	actualTime = to_simple_string(calendar.suiteTime());
+	BOOST_CHECK_MESSAGE( actualTime == expectedTime,"Expected '" << expectedTime << "' but found " << actualTime);
+
+
+	// Increment by 24 hours
+ 	calendar.update(hours(24));
+	expectedTime = "2009-Feb-11 01:25:00";
+	actualTime = to_simple_string(calendar.suiteTime());
+	BOOST_CHECK_MESSAGE( actualTime == expectedTime,"Expected '" << expectedTime << "' but found " << actualTime);
+}
+
+BOOST_AUTO_TEST_CASE( test_calendar_time_series_relative )
+{
+	cout << "ACore:: ...test_calendar_time_series_relative\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::HYBRID);
+
+	std::string expectedTime = "2010-Feb-10 00:00:00";
+	std::string actualTime = to_simple_string(calendar.suiteTime());
+	BOOST_CHECK_MESSAGE( actualTime == expectedTime,"Expected '" << expectedTime << "' but found " << actualTime);
+
+	// Create a test when we can match a time series. Need to sync hour with suite time
+	// at hour 1, suite time should also be 01:00, for test to work
+	//
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr    1:00
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), true/*relative*/);
+
+	for(int hour=1; hour < 24; hour++) {
+		// Update calendar every hour, then see we can match time series, *RELATIVE* to suite start
+		calendar.update( time_duration( hours(1) ) );
+		timeSeries.calendarChanged( calendar );
+
+//		cerr << "hour = " << hour << " suiteTime " << to_simple_string(calendar.suiteTime()) << "\n";
+		if (hour >= timeSeries.start().hour() && hour <=timeSeries.finish().hour()) {
+			BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),"Calendar should match relative time series at hour " << hour );
+		}
+		else {
+			BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),"Calendar should NOT match relative time series at hour " << hour );
+		}
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_calendar_time_series_relative_complex )
+{
+	cout << "ACore:: ...test_calendar_time_series_relative_complex\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::HYBRID);
+
+	// Create a test when we can match a time series
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr   00:15
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(0,15),true/*relative*/);
+
+ 	for(int hour=0; hour < 24; hour++) {
+ 		for( int minute=0; minute<60; minute++) {
+
+			// Update calendar every hour, then see we can match time series, *RELATIVE* to suite start
+			calendar.update( minutes(1) );
+			timeSeries.calendarChanged( calendar );
+
+			tm suiteTm = to_tm(calendar.suiteTime());
+
+			bool matches = timeSeries.isFree(calendar);
+
+			bool intersects = ( suiteTm.tm_hour >= timeSeries.start().hour() &&
+						        suiteTm.tm_hour <= timeSeries.finish().hour() &&
+	  				           (suiteTm.tm_min == 0 || suiteTm.tm_min % timeSeries.incr().minute() == 0)
+					         );
+			// Ovoid overshooting past end of series
+			bool boundaryOk = true;
+			if ( suiteTm.tm_hour == timeSeries.finish().hour() ) {
+				boundaryOk = (suiteTm.tm_min <= timeSeries.finish().minute());
+			}
+
+ 			if ( intersects && boundaryOk )
+			{
+				BOOST_CHECK_MESSAGE(matches,
+				                    "Calendar should match relative time series at "
+				                    << suiteTm.tm_hour << Str::COLON() << suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+				if (!matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+			else {
+ 				BOOST_CHECK_MESSAGE(!matches,
+				                    "Calendar should NOT match relative time series at "
+				                    << suiteTm.tm_hour << Str::COLON() << suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+
+ 				if (matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+ 		}
+  	}
+}
+
+BOOST_AUTO_TEST_CASE( test_calendar_time_series_real )
+{
+	cout << "ACore:: ...test_calendar_time_series_real\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+	std::string expectedTime = "2010-Feb-10 00:00:00";
+	std::string actualTime = to_simple_string(calendar.suiteTime());
+	BOOST_CHECK_MESSAGE( actualTime == expectedTime,"Expected '" << expectedTime << "' but found " << actualTime);
+
+	// Create a test when we can match a time series
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr    1:00
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0));
+
+	for(int hour=1; hour < 24; hour++) {
+		// Update calendar every hour, then see we can match time series, in REAL
+		// Update will set the local time from the computers system clock, however
+		// for testing this will need to be overriden below.
+		calendar.update( time_duration( hours(1) ) );
+
+		// cerr << "hour = " << hour << " suiteTime " << to_simple_string(calendar.suiteTime())  << "\n";
+		if (hour >= timeSeries.start().hour() && hour <=timeSeries.finish().hour()) {
+			BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),"Calendar should match time series at hour " << hour );
+		}
+		else {
+			BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),"Calendar should NOT match time series at hour " << hour );
+		}
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_calendar_time_series_real_complex )
+{
+	cout << "ACore:: ...test_calendar_time_series_real_complex\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+	// Create a test when we can match a time series
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr   00:15
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(0,15));
+
+ 	for(int hour=0; hour < 24; hour++) {
+ 		for( int minute=0; minute<60; minute++) {
+
+			// Update calendar every minute, then see we can match time series, *RELATIVE* to suite start
+			calendar.update( minutes(1) );
+
+			tm suiteTm = to_tm(calendar.suiteTime());
+
+			bool matches = timeSeries.isFree(calendar);
+
+			bool intersects = ( suiteTm.tm_hour >= timeSeries.start().hour() &&
+						        suiteTm.tm_hour <= timeSeries.finish().hour() &&
+	  				           (suiteTm.tm_min == 0 || suiteTm.tm_min % timeSeries.incr().minute() == 0)
+					         );
+			// Ovoid overshooting past end of series
+			bool boundaryOk = true;
+			if ( suiteTm.tm_hour == timeSeries.finish().hour() ) {
+				boundaryOk = (suiteTm.tm_min <= timeSeries.finish().minute());
+			}
+
+ 			if ( intersects && boundaryOk )
+			{
+				BOOST_CHECK_MESSAGE(matches,
+				                    "Calendar should match relative time series at "
+				                    << suiteTm.tm_hour <<":"<< suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+				if (!matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+			else {
+ 				BOOST_CHECK_MESSAGE(!matches,
+				                    "Calendar should NOT match relative time series at "
+				                    << suiteTm.tm_hour <<":"<< suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+
+ 				if (matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+ 		}
+  	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_calendar_hybrid )
+{
+	cout << "ACore:: ...test_calendar_hybrid\n";
+
+	// The hybrid calendar should not change the suite date.
+	// Test by updateing calendar by more than 24 hours
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)),Calendar::HYBRID);
+	BOOST_CHECK_MESSAGE(calendar.hybrid(),"calendar type should be hybrid");
+
+
+	std::string expectedTime = "2010-Feb-10 00:00:00";
+	std::string actualTime = to_simple_string(calendar.suiteTime());
+	BOOST_CHECK_MESSAGE( actualTime == expectedTime,"Expected '" << expectedTime << "' but found " << actualTime);
+
+	std::string expectedDate = "2010-Feb-10";
+
+	for(int hour=1; hour < 60; hour++) {
+		// Update calendar every hour, for 60 hours
+		// the date should be the same, i.e 2009, Feb, 10th
+
+ 		ptime timeBeforeUpdate = calendar.suiteTime();
+
+		calendar.update( time_duration( hours(1) ) );
+
+		ptime timeAfterUpdate = calendar.suiteTime();
+
+//		cerr << "hour = " << hour << " timeBeforeUpdate " << to_simple_string(timeBeforeUpdate)
+//		    << "   timeAfterUpdate = " << to_simple_string(timeAfterUpdate) <<  "\n";
+
+		if (hour != 24 && hour != 48) {
+			time_period diff(timeBeforeUpdate,timeAfterUpdate);
+ 			time_duration gap = diff.length();
+			BOOST_CHECK_MESSAGE( gap.hours() == 1,"Expected one hour difference but found " << gap.hours() << " at hour " << hour);
+		}
+
+		std::string actualDate = to_simple_string(calendar.suiteTime().date());
+  		BOOST_CHECK_MESSAGE( actualDate == expectedDate,"Expected '" << expectedDate << "' but found " << actualDate << " at hour " << hour);
+ 	}
+}
+
+BOOST_AUTO_TEST_CASE( test_day_changed_for_real )
+{
+	cout << "ACore:: ...test_day_changed_for_real\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+ 	BOOST_CHECK_MESSAGE(!calendar.hybrid(),"calendar type should be real");
+
+	for(int hour=1; hour < 73; hour++) {
+		// Update calendar every hour, for 72 hours
+ 		calendar.update( time_duration( hours(1) ) );
+
+		if (hour == 24 || hour == 48 || hour == 72) {
+			BOOST_CHECK_MESSAGE( calendar.dayChanged(),"Expected day change at hour " << hour << " calendar " << calendar.toString());
+ 		}
+		else {
+			BOOST_CHECK_MESSAGE( !calendar.dayChanged(),"Un-Expected day change at hour " << hour << " calendar " << calendar.toString());
+		}
+ 	}
+}
+
+BOOST_AUTO_TEST_CASE( test_day_changed_for_hybrid )
+{
+	cout << "ACore:: ...test_day_changed_for_hybrid\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar; // default clock is real
+	calendar.init(ptime(date(2010,2,10), minutes(0)),Calendar::HYBRID);
+ 	BOOST_CHECK_MESSAGE(calendar.hybrid(),"calendar type should be hybrid");
+
+ 	// HYBRID calendars allow for day change but not date.
+ 	std::string expected_date = to_simple_string(calendar.date());
+
+	for(int hour=1; hour < 73; hour++) {
+  		// Update calendar every hour, for 72 hours
+ 	 	calendar.update( time_duration( hours(1) ) );
+
+		BOOST_CHECK_MESSAGE( expected_date == to_simple_string(calendar.date()) ,
+		                     "Unexpected date change for hybrid calendar at hour " << hour);
+
+ 		// Day should change even for hybrid calendar,
+ 		if (hour == 24 || hour == 48 || hour == 72) {
+ 			BOOST_CHECK_MESSAGE( calendar.dayChanged(),"Expected day change at hour " << hour << " calendar " << calendar.toString());
+ 	 	}
+ 		else {
+ 			BOOST_CHECK_MESSAGE( !calendar.dayChanged(),"Un-Expected day change at hour " << hour << " calendar " << calendar.toString());
+ 		}
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestExceptionSafety.cpp b/ecflow_4_0_7/ACore/test/TestExceptionSafety.cpp
new file mode 100644
index 0000000..9a6f76f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestExceptionSafety.cpp
@@ -0,0 +1,51 @@
+////============================================================================
+//// Name        :
+//// Author      : Avi
+//// Revision    : $Revision: #5 $
+////
+//// Copyright 2009-2012 ECMWF.
+//// This software is licensed under the terms of the Apache Licence version 2.0
+//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+//// In applying this licence, ECMWF does not waive the privileges and immunities
+//// granted to it by virtue of its status as an intergovernmental organisation
+//// nor does it submit to any jurisdiction.
+////
+//// Description :
+////============================================================================
+//#include <boost/test/unit_test.hpp>
+//#include <boost/bind.hpp>
+//
+//#include <boost/test/exception_safety.hpp>
+//#include <boost/test/mock_object.hpp>
+//#include <boost/make_shared.hpp>
+//#include <boost/shared_ptr.hpp>
+//
+//using namespace std;
+//using namespace boost::itest;
+//
+//BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+//
+//// Example of how to check for for exception safety
+//// COMMENTED OUT SINCE THIS CAUSES THOUSANDS OF VALGRIND ERRORS
+//
+//template<class T1, class T2>
+//void algo(
+//  boost::shared_ptr<T1> x,
+//  boost::shared_ptr<T2> y) {}
+//
+//typedef mock_object<> Mock;
+//typedef boost::shared_ptr<Mock> SharedMock;
+//
+//BOOST_TEST_EXCEPTION_SAFETY( fail_test )
+//{
+//	algo( SharedMock( new Mock() ),
+//	      SharedMock( new Mock() ));
+//}
+//
+//BOOST_TEST_EXCEPTION_SAFETY( success_test )
+//{
+//	algo( boost::make_shared<Mock>(),
+//	      boost::make_shared<Mock>());
+//}
+//
+//BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestFile.cpp b/ecflow_4_0_7/ACore/test/TestFile.cpp
new file mode 100644
index 0000000..216169c
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestFile.cpp
@@ -0,0 +1,312 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/timer.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <stdlib.h> // for getenv()
+
+#include "DurationTimer.hpp"
+#include "File.hpp"
+#include "NodePath.hpp"
+
+using namespace boost;
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+//#define FILE_PERF_CHECK_IMPLEMENTATIONS 1;
+
+BOOST_AUTO_TEST_CASE( test_splitFileIntoLines )
+{
+   // This is sanity test for splitFileIntoLines used extensively
+   cout << "ACore:: ...test_splitFileIntoLines\n";
+
+   std::string path = File::test_data("ACore/test/data/test_splitFileIntoLines.txt","ACore");
+
+   std::string theText = "This is a test string";
+   {
+      {
+         std::ofstream file_with_one_line( path.c_str() );
+         file_with_one_line << theText;
+      }
+
+      std::vector<std::string> lines;
+      BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+      BOOST_CHECK_MESSAGE( lines.size() == 1," Expected 1 line but found " << lines.size());
+
+      fs::remove(path); // Remove the file. Comment out for debugging
+   }
+
+   {
+      {
+         std::ofstream file_with_one_line( path.c_str() );
+         file_with_one_line << theText << "\n";  // addition of '/n' , should still be one line
+      }
+
+      std::vector<std::string> lines;
+      BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+      BOOST_CHECK_MESSAGE( lines.size() == 1," Expected 1 line but found " << lines.size());
+
+      fs::remove(path); // Remove the file. Comment out for debugging
+   }
+
+   {
+      {
+         std::ofstream file_with_two_line( path.c_str() );
+         file_with_two_line << theText << "\n";
+         file_with_two_line << theText;
+      }
+
+      std::vector<std::string> lines;
+      BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+      BOOST_CHECK_MESSAGE( lines.size() == 2," Expected 2 line but found " << lines.size());
+
+      fs::remove(path); // Remove the file. Comment out for debugging
+   }
+
+   {
+      {
+         std::ofstream file_with_three_line( path.c_str() );
+         file_with_three_line << theText << "\n";
+         file_with_three_line << theText << "\n";
+         file_with_three_line << theText;
+      }
+
+      std::vector<std::string> lines;
+      BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+      BOOST_CHECK_MESSAGE( lines.size() == 3," Expected 3 line but found " << lines.size());
+
+      fs::remove(path); // Remove the file. Comment out for debugging
+   }
+
+   {
+      {
+         std::ofstream file_with_three_line( path.c_str() );
+         file_with_three_line << theText << "\n";
+         file_with_three_line << theText << "\n";
+         file_with_three_line << theText << "\n";
+      }
+
+      std::vector<std::string> lines;
+      BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+      BOOST_CHECK_MESSAGE( lines.size() == 3," Expected 3 line but found " << lines.size());
+
+      fs::remove(path); // Remove the file. Comment out for debugging
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_file_tokenizer )
+{
+	cout << "ACore:: ...test_file_tokenizer\n";
+
+   std::string path = File::test_data("ACore/test/data/test_file_tokenizer.txt","ACore");
+
+	size_t linesWithText = 100;
+	size_t totalLines = 151;
+	std::string theText = "This is a test string";
+	{
+		std::ofstream file( path.c_str() );
+		for(size_t i =0; i < linesWithText; i++) {
+			if (i % 2 == 0) file << "\n";       // 51 empty lines
+			file << theText << "\n";            // 100  text lines
+		}
+	}
+	{
+		std::vector<std::string> lines;
+		BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines,true/*ignore empty lines*/)," Failed to open file " << path);
+		BOOST_CHECK_MESSAGE( lines.size() == linesWithText,"Expected " << linesWithText << " but found " <<  lines.size());
+		BOOST_CHECK_MESSAGE( lines[0] == theText,"Expected '" << theText << "' but found " <<  lines[0]);
+		BOOST_CHECK_MESSAGE( lines[linesWithText-1] == theText,"Expected '" << theText << "' but found " <<  lines[linesWithText-1]);
+
+		lines.clear();
+		BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+		BOOST_CHECK_MESSAGE( lines.size() == totalLines-1,"Expected " << totalLines-1 << " but found " <<  lines.size());
+		BOOST_CHECK_MESSAGE( lines[0] == "","Expected empty string  but found " <<  lines[0]);
+		BOOST_CHECK_MESSAGE( lines[1] == theText,"Expected '" << theText << "' but found " <<  lines[1]);
+		BOOST_CHECK_MESSAGE( lines[2] == theText,"Expected '" << theText << "' but found " <<  lines[2]);
+		BOOST_CHECK_MESSAGE( lines[3] == "","Expected empty string  but found " <<  lines[3]);
+   }
+
+#ifdef FILE_PERF_CHECK_IMPLEMENTATIONS
+	{
+		size_t openFileNTimes = 100000;
+	 	boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+ 		for (size_t i = 0; i < openFileNTimes; i++) {
+			std::vector<std::string> lines;
+			BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+  		}
+		cout << "Time for opening file " << openFileNTimes << " times = " << timer.elapsed() << "\n";
+	}
+#endif
+
+	// Remove the file. Comment out for debugging
+	fs::remove(path);
+}
+
+BOOST_AUTO_TEST_CASE( test_file_backwardSearch )
+{
+	cout << "ACore:: ...test_file_backwardSearch\n";
+
+	std::string nodePath = "dir0/dir1/dir2/dir3/dir4/dir5";
+   std::string rootPath = File::test_data("ACore/test/data","ACore");
+   std::string expected = File::test_data("ACore/test/data/","ACore") + nodePath;
+
+	std::string path = rootPath;
+	std::string dir = "dir";
+ 	for(int i = 0; i < 6; i++) {
+		path += "/" + dir + boost::lexical_cast<std::string>(i);
+  	}
+	// Should have test/data/dir0/dir1/dir3/dir3/dir4/dir5
+	//         or  ACore/test/data/dir0/dir1/dir3/dir3/dir4/dir5
+ 	BOOST_REQUIRE_MESSAGE(path == expected," Error expected " << expected << " but found " << path);
+
+	// Create the missing directories
+ 	BOOST_REQUIRE_MESSAGE(File::createDirectories(path),"Failed to create dirs");
+
+	// Create a file in each of the directories. See Page 21 SMS User Guide.
+	std::vector<std::string> fileContents; fileContents.push_back("something");
+	vector<std::string> nodePathTokens;
+ 	NodePath::split(nodePath,nodePathTokens);
+ 	while ( nodePathTokens.size() > 0 ) {
+
+		// Reconstitute the path
+	 	std::string path = NodePath::createPath(nodePathTokens);
+ 		std::string combinedPath = rootPath + path;
+
+		BOOST_REQUIRE_MESSAGE(File::createDirectories(combinedPath),"Failed to create dirs " << combinedPath);
+
+		combinedPath += File::ECF_EXTN(); // .ecf, .man , etc
+
+		//std::cout << "Creating file " << combinedPath << "\n";
+		std::string errorMsg;
+		BOOST_REQUIRE_MESSAGE(File::create(combinedPath,fileContents,errorMsg),"Failed to create " << combinedPath << " because " << errorMsg);
+
+		nodePathTokens.erase(nodePathTokens.begin()); // consume first path token
+	}
+
+	// Now do a backward search for them
+	int filesFound = 0;
+	for(int i = 0; i < 6; i++) {
+		std::string theFile = File::backwardSearch(rootPath,nodePath,File::ECF_EXTN() );
+		BOOST_CHECK_MESSAGE( !theFile.empty(), i << ": Failed to find dir5.ecf with rootPath " << rootPath << " and node path " << nodePath);
+		if (!theFile.empty()) {
+			filesFound++;
+//			std::cout << "About to remove file " << theFile << "\n";
+			fs::remove(theFile); // remove it so we don't find it again.
+		}
+	}
+	// Expect the following files to be found:
+	//	test/data/dir0/dir1/dir2/dir3/dir4/dir5.ecf
+	//	test/data/dir1/dir2/dir3/dir4/dir5.ecf
+	//	test/data/dir2/dir3/dir4/dir5.ecf
+	//	test/data/dir3/dir4/dir5.ecf
+	//	test/data/dir4/dir5.ecf
+	//	test/data/dir5.ecf
+	BOOST_CHECK_MESSAGE( filesFound == 6 ," expect to find 6 files but found " << filesFound );
+
+	// Remove the test dir. Comment out for debugging
+ 	for(int i = 0; i < 6; i++) {
+ 		path = rootPath + "/" + dir + boost::lexical_cast<std::string>(i);
+  		BOOST_CHECK_MESSAGE(File::removeDir( path ),"Failed to remove dir " << path);
+   	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_create_missing_directories )
+{
+   cout << "ACore:: ...test_create_missing_directories";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+   std::string nodePath = "dir0/dir1/dir2/dir3/dir4/dir5";
+   std::string rootPath = File::test_data("ACore/test/data","ACore");
+   std::string expected = File::test_data("ACore/test/data/","ACore") + nodePath;
+
+   std::string dir_remove = rootPath + "/dir0";
+   {
+      // Test basics first, expect "ACore/test/data/dir0/dir1/dir2/dir3/dir4/dir5" to be created
+      BOOST_CHECK_MESSAGE(File::createMissingDirectories(expected),expected << " expected directories to be created");
+      BOOST_CHECK_MESSAGE(fs::exists(expected),expected << " directory not created");
+
+      // remove the directory
+      BOOST_CHECK_MESSAGE(File::removeDir( dir_remove ),"Failed to remove dir " << dir_remove);
+
+//      fs::path fs_path(expected);
+//      std::cout << "parent path " << fs_path.parent_path() << "\n";
+//      std::cout << "root path " << fs_path.root_path()  << "\n";
+//      std::cout << "root name " << fs_path.root_name()  << "\n";
+//      std::cout << "root directory " << fs_path.root_directory()  << "\n";
+//      std::cout << "relative_path " << fs_path.relative_path()  << "\n";
+//      std::cout << "filename " << fs_path.filename()  << "\n";
+//      std::cout << "stem " << fs_path.stem()  << "\n";
+//      std::cout << "extension " << fs_path.extension()  << "\n";
+   }
+   {
+      // Test "ACore/test/data/dir0/dir1/dir2/dir3/dir4/dir5/fred.ecf" to be created
+      std::string dir_with_file = expected + "/fred.ecf";
+      BOOST_CHECK_MESSAGE(File::createMissingDirectories(dir_with_file),"Expected '" <<  dir_with_file << "' to be created");
+      BOOST_CHECK_MESSAGE(fs::exists(expected),expected << " directory not created");
+
+      // remove the directory
+      BOOST_CHECK_MESSAGE(File::removeDir( dir_remove ),"Failed to remove dir " << dir_remove);
+
+//      fs::path fs_path(dir_with_file);
+//      std::cout << "parent path " << fs_path.parent_path() << "\n";
+//      std::cout << "root path " << fs_path.root_path()  << "\n";
+//      std::cout << "root name " << fs_path.root_name()  << "\n";
+//      std::cout << "root directory " << fs_path.root_directory()  << "\n";
+//      std::cout << "relative_path " << fs_path.relative_path()  << "\n";
+//      std::cout << "filename " << fs_path.filename()  << "\n";
+//      std::cout << "stem " << fs_path.stem()  << "\n";
+//      std::cout << "extension " << fs_path.extension()  << "\n";
+   }
+
+   {
+      // Create directories twice. Need to minimise call to fstat
+      BOOST_CHECK_MESSAGE(File::createMissingDirectories(expected),"expected file to be created");
+      BOOST_CHECK_MESSAGE(File::createMissingDirectories(expected),"expected file to be created");
+      BOOST_CHECK_MESSAGE(fs::exists(expected),expected << " directory not created");
+
+      // remove the directory
+      BOOST_CHECK_MESSAGE(File::removeDir( dir_remove ),"Failed to remove dir " << dir_remove);
+   }
+
+   {
+      // Create directories twice. Need to minimise call to fstat
+      std::string dir_with_file = expected + "/fred.ecf";
+      BOOST_CHECK_MESSAGE(File::createMissingDirectories(dir_with_file),"expected file to be created");
+      BOOST_CHECK_MESSAGE(File::createMissingDirectories(dir_with_file),"expected file to be created");
+      BOOST_CHECK_MESSAGE(fs::exists(expected),expected << " directory not created");
+
+      // remove the directory
+      BOOST_CHECK_MESSAGE(File::removeDir( dir_remove ),"Failed to remove dir " << dir_remove);
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestGetUserDetails.cpp b/ecflow_4_0_7/ACore/test/TestGetUserDetails.cpp
new file mode 100644
index 0000000..7529d7a
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestGetUserDetails.cpp
@@ -0,0 +1,57 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+//#include <boost/test/unit_test.hpp>
+//#include <string>
+//#include <iostream>
+//
+//
+//#include <pwd.h> /* getpwdid */
+//#include <sys/types.h>
+//#include <unistd.h>
+//#include <stdio.h>
+//
+//using namespace std;
+//using namespace ecf;
+//
+//BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+//BOOST_AUTO_TEST_CASE( test_get_user_details )
+//{
+//	cout << "ACore:: ...test_get_user_details\n";
+//
+//
+//	struct passwd *passwd; /* man getpwuid */
+//
+//	passwd = getpwuid ( getuid()); /* Get the uid of the running processand use it to get a record from /etc/passwd */
+//
+//	printf("\n The Real User Name is %s ", passwd->pw_gecos);
+//
+//	printf("\n The Login Name is %s ", passwd->pw_name);
+//
+//	printf("\n The Home Directory is %s", passwd->pw_dir);
+//
+//	printf("\n The Login Shell is %s ", passwd->pw_shell);
+//
+//	printf("\n The Passwd is %s ", getpwuid(getuid())->pw_passwd);
+//
+//	printf("\n The uid is %lu ", (unsigned long) getpwuid(getuid())->pw_uid);
+//
+//	printf("\n The gid is %lu \n\n", (unsigned long) getpwuid(getuid())->pw_gid);
+//}
+
+//BOOST_AUTO_TEST_SUITE_END()
+
+
diff --git a/ecflow_4_0_7/ACore/test/TestLog.cpp b/ecflow_4_0_7/ACore/test/TestLog.cpp
new file mode 100644
index 0000000..82c32a4
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestLog.cpp
@@ -0,0 +1,365 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #21 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h> // for getenv()
+#include <string>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "Log.hpp"
+#include "File.hpp"
+#include "DurationTimer.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+static std::string getLogPath() {
+
+   return File::test_data("ACore/test/logfile.txt","ACore");
+}
+
+BOOST_AUTO_TEST_CASE( test_log )
+{
+	cout << "ACore:: ...test_log\n";
+
+	std::string path = getLogPath();
+
+	// delete the log file if it exists.
+	fs::remove(path);
+	BOOST_CHECK_MESSAGE(!fs::exists( path ), "log file not deleted " << path << " not created \n");
+
+	Log::create(path);
+	LOG(Log::MSG,"First Message");
+	LOG(Log::LOG,"LOG");
+	LOG(Log::ERR,"ERROR");
+	LOG(Log::WAR,"WARNING");
+	LOG(Log::DBG,"DEBUG");
+	LOG(Log::OTH,"OTHER");
+	log(Log::OTH,"test: void log(Log::LogType,const std::string& message)");
+
+	LOG(Log::OTH,"test: LOG(level,path << path) " << path << " " << path);
+
+ 	Log::instance()->log(Log::OTH,"OTHER2");
+
+	BOOST_CHECK_MESSAGE(fs::exists( path ), "log file " << path << " not created \n");
+}
+
+BOOST_AUTO_TEST_CASE( test_log_append )
+{
+	cout << "ACore:: ...test_log_append\n";
+
+	std::string path = getLogPath();
+
+ 	BOOST_CHECK_MESSAGE(fs::exists( path ), "log file " << path << " not created by previous test\n");
+
+ 	LOG(Log::MSG,"Last Message");
+
+	// Load the log file into a vector, of strings, and test content
+    std::vector<std::string> lines;
+ 	BOOST_REQUIRE_MESSAGE(File::splitFileIntoLines(path,lines,true/*IGNORE EMPTY LINE AT THE END*/),"Failed to open log file");
+ 	BOOST_REQUIRE(lines.size() != 0);
+	BOOST_CHECK_MESSAGE(lines.size() == 10," Expected 10 lines in log, but found " << lines.size() << "\n");
+	BOOST_CHECK_MESSAGE(lines[0].find("First Message") != string::npos,"Expected first line to contain 'First Message' but found " << lines[0] << "\n");
+	BOOST_CHECK_MESSAGE(lines.back().find("Last Message") != string::npos,"Expected last line to contain 'Last Message' but found " << lines.back() << "\n");
+
+	// Clear the log file. Comment out for debugging
+	Log::instance()->clear();
+	BOOST_CHECK_MESSAGE(fs::file_size( path ) == 0, "Clear of log file failed\n");
+
+	// Remove the log file. Comment out for debugging
+	fs::remove(path);
+
+	// Explicitly destroy log. To keep valgrind happy
+	Log::destroy();
+}
+
+
+BOOST_AUTO_TEST_CASE( test_log_path )
+{
+   cout << "ACore:: ...test_log_path\n";
+
+   Log::create("test_log_path.log");
+
+   // make sure path returned is absolute
+   std::string path = Log::instance()->path();
+   BOOST_REQUIRE_MESSAGE(path[0] == '/',"Expected absolute paths for log file but found " << path);
+
+   // Remove the log file. Comment out for debugging
+   fs::remove(path);
+
+   // Explicitly destroy log. To keep valgrind happy
+   Log::destroy();
+}
+
+BOOST_AUTO_TEST_CASE( test_log_new_path_errors )
+{
+   cout << "ACore:: ...test_log_new_path_errors\n";
+
+   // delete the log file if it exists.
+   fs::remove(getLogPath());
+
+   // create a now log file.
+   Log::create(getLogPath());
+   LOG(Log::MSG,"First Message");
+   LOG(Log::LOG,"LOG");
+
+   // Specify bad paths for new log file
+   // First test empty path throws
+   BOOST_REQUIRE_THROW(Log::instance()->new_path(""),std::runtime_error);
+
+   // If a path is specified make sure parent directory exists
+   fs::path current_path = fs::current_path();
+   std::string path2 = current_path.string();
+   path2 +=  "/a/made/up/path/fred.log";
+   //cout << path2<< "\n";
+   BOOST_REQUIRE_THROW(Log::instance()->new_path(path2),std::runtime_error);
+
+   // Make sure path does not correspond to a directory
+   // cout << "parent directory: " << current_path.parent_path() << "\n";
+   BOOST_REQUIRE_THROW(Log::instance()->new_path( current_path.parent_path().string() ),std::runtime_error);
+
+//   {
+//      fs::path valid_path = getLogPath();
+//      std::cout << "valid_path = " << valid_path << "\n";
+//      std::cout << "valid_path.root_path(): " << valid_path.root_path() << "\n";
+//      std::cout << "valid_path.root_name() : " << valid_path.root_name()  << "\n";
+//      std::cout << "valid_path.root_directory()  : " << valid_path.root_directory()   << "\n";
+//      std::cout << "valid_path.relative_path()  : " << valid_path.relative_path()   << "\n";
+//      std::cout << "valid_path.parent_path()  : " << valid_path.parent_path()   << "\n";
+//      std::cout << "valid_path.filename()  : " << valid_path.filename()   << "\n";
+//      std::cout << "valid_path.stem()  : " << valid_path.stem()   << "\n";
+//      std::cout << "valid_path.extension()  : " << valid_path.extension()   << "\n";
+//   }
+
+   // Remove the log file. Comment out for debugging
+   fs::remove(Log::instance()->path());
+
+   // Explicitly destroy log. To keep valgrind happy
+   Log::destroy();
+}
+
+
+BOOST_AUTO_TEST_CASE( test_log_new_path )
+{
+   cout << "ACore:: ...test_log_new_path\n";
+
+   // delete the log file if it exists.
+   fs::remove(getLogPath());
+
+   // create a new log file.
+   Log::create(getLogPath());
+   BOOST_CHECK_MESSAGE(fs::exists( Log::instance()->path() ), "Log file should be created after explicit call to Log::create()\n");
+   LOG(Log::LOG,"LOG");
+   fs::remove(Log::instance()->path());
+
+
+   // Specify a new log path. Path could be a relative path like "test/logfile.log"
+   std::string relative_path = File::test_data("ACore/test/logfile.log","ACore");
+
+   BOOST_REQUIRE_NO_THROW(Log::instance()->new_path( relative_path ));
+   BOOST_CHECK_MESSAGE(!fs::exists( Log::instance()->path() ), "Log file should *NOT* be created until first message is logged\n");
+   LOG(Log::LOG,"LOG");
+   BOOST_CHECK_MESSAGE(fs::exists( Log::instance()->path() ), "Log file should be created after first message is logged\n");
+   fs::remove(Log::instance()->path());
+
+
+   // Specify a new log path. This time we just specify a file name, without a path.
+   BOOST_REQUIRE_NO_THROW(Log::instance()->new_path( "testlog.log" ));
+   BOOST_CHECK_MESSAGE(!fs::exists( Log::instance()->path() ), "Log file should not be created until first message is logged\n");
+   // File not created until a message is logged
+   LOG(Log::LOG,"LOG");
+   BOOST_CHECK_MESSAGE(fs::exists( Log::instance()->path() ), "Log file should be created after first message is logged\n");
+   fs::remove(Log::instance()->path());
+
+   // Explicitly destroy log. To keep valgrind happy
+   Log::destroy();
+}
+
+BOOST_AUTO_TEST_CASE( test_get_last_n_lines_from_log )
+{
+   cout << "ACore:: ...test_get_last_n_lines_from_log\n";
+
+   // delete the log file if it exists.
+   std::string path = getLogPath();
+   fs::remove(path);
+   BOOST_CHECK_MESSAGE(!fs::exists( path ), "log file not deleted " << path << " not created \n");
+
+   // Create the log file;
+   Log::create(path);
+   BOOST_CHECK_MESSAGE(fs::exists( path ), "log file " << path << " not created \n");
+
+   // Log file should be empty
+   const int NO_OF_LINES_IN_LOG_FILE = 200;
+   {
+      for(int i =0; i < NO_OF_LINES_IN_LOG_FILE; i++) {
+         std::string line = Log::instance()->contents(i);
+         BOOST_CHECK_MESSAGE(line.empty(), "Expected empty string but found\n" << line);
+      }
+   }
+
+   // Populate the log file
+   std::string msg = "This is message ";
+   for(int i = 0; i < NO_OF_LINES_IN_LOG_FILE; ++i)  LOG(Log::MSG,msg << i);
+
+   // Now check, getting the lines
+   {
+      std::string line = Log::instance()->contents(0);
+      BOOST_CHECK_MESSAGE(line.empty(), "Expected empty string but found\n" << line);
+   }
+   {
+      // Check we get back the number of line requested
+      for(int i = 0; i< NO_OF_LINES_IN_LOG_FILE; i++) {
+         std::string lines = Log::instance()->contents(i);
+         int newlineCount = std::count( lines.begin(), lines.end(), '\n');
+         BOOST_CHECK_MESSAGE(i == newlineCount, "expected to  " << i << " newlines but found "  <<  newlineCount);
+      }
+   }
+   {
+      // Check we get back *ALL* lines requested
+      std::string lines = Log::instance()->contents(NO_OF_LINES_IN_LOG_FILE);
+      for(int i = 0; i< NO_OF_LINES_IN_LOG_FILE; i++) {
+         std::stringstream ss; ss << msg << i;
+         std::string str_to_find = ss.str();
+         BOOST_CHECK_MESSAGE(lines.find(str_to_find) != std::string::npos, "expected to find " << str_to_find << " in the log file");
+      }
+   }
+
+   {
+      // Request more than is available, should only get back whats there
+      std::string lines = Log::instance()->contents(NO_OF_LINES_IN_LOG_FILE*2);
+      int newlineCount = std::count( lines.begin(), lines.end(), '\n');
+      BOOST_CHECK_MESSAGE(NO_OF_LINES_IN_LOG_FILE == newlineCount, "expected " << NO_OF_LINES_IN_LOG_FILE << " newlines but found "  <<  newlineCount);
+   }
+
+   fs::remove(Log::instance()->path());
+
+   // Explicitly destroy log. To keep valgrind happy
+   Log::destroy();
+}
+
+BOOST_AUTO_TEST_CASE( test_get_first_n_lines_from_log )
+{
+   cout << "ACore:: ...test_get_first_n_lines_from_log\n";
+
+   // delete the log file if it exists.
+   std::string path = getLogPath();
+   fs::remove(path);
+   BOOST_CHECK_MESSAGE(!fs::exists( path ), "log file not deleted " << path << " not created \n");
+
+   // Create the log file;
+   Log::create(path);
+   BOOST_CHECK_MESSAGE(fs::exists( path ), "log file " << path << " not created \n");
+
+   // Populate the log file
+   const int NO_OF_LINES_IN_LOG_FILE = 200;
+   std::string msg = "This is message ";
+   for(int i = 0; i < NO_OF_LINES_IN_LOG_FILE; ++i)  LOG(Log::MSG,msg << i);
+
+   // Now check, getting the lines
+   {
+      // Get the first line
+      std::string line = Log::instance()->contents(-1);
+      std::string expected = msg + "0";
+      BOOST_CHECK_MESSAGE(line.find(expected) != std::string::npos, "Expected '" << expected << "' but found\n" << line);
+   }
+   {
+      // Get the first & second line
+      std::string line = Log::instance()->contents(-2);
+      std::string expected0 = msg + "0";
+      std::string expected1 = msg + "1";
+      BOOST_CHECK_MESSAGE(line.find(expected0) != std::string::npos, "Expected '" << expected0 << "' but found\n" << line);
+      BOOST_CHECK_MESSAGE(line.find(expected1) != std::string::npos, "Expected '" << expected1 << "' but found\n" << line);
+   }
+   {
+      // Check we get back the number of line requested
+      for(int i = 0; i< NO_OF_LINES_IN_LOG_FILE; i++) {
+         std::string lines = Log::instance()->contents(-i);
+         int newlineCount = std::count( lines.begin(), lines.end(), '\n');
+         BOOST_CHECK_MESSAGE(i == newlineCount, "expected to  " << i << " newlines but found "  <<  newlineCount);
+      }
+   }
+   {
+      std::string lines = Log::instance()->contents(-NO_OF_LINES_IN_LOG_FILE);
+      for(int i = 0; i < NO_OF_LINES_IN_LOG_FILE; i++){
+         std::stringstream ss; ss << msg << i;
+         std::string expected = ss.str();
+         BOOST_CHECK_MESSAGE(lines.find(expected) != std::string::npos, "Expected '" << expected << "' but found for i " << i);
+      }
+   }
+
+   {
+      // Request more than is available, should only get back whats there
+      std::string lines = Log::instance()->contents(-NO_OF_LINES_IN_LOG_FILE*2);
+      int newlineCount = std::count( lines.begin(), lines.end(), '\n');
+      BOOST_CHECK_MESSAGE(NO_OF_LINES_IN_LOG_FILE == newlineCount, "expected " << NO_OF_LINES_IN_LOG_FILE << " newlines but found "  <<  newlineCount);
+   }
+
+   fs::remove(Log::instance()->path());
+
+   // Explicitly destroy log. To keep valgrind happy
+   Log::destroy();
+}
+
+
+BOOST_AUTO_TEST_CASE( test_get_log_timing )
+{
+   cout << "ACore:: ...test_get_log_timing: " << flush;
+
+   // *************************************************************************************
+   // This test was used with *DIFFERENT* implementations for Log::instance()->contents(1)
+   // What is shows, is that for optimal performance we should *NOT* load the entire log file
+   // This can be several giga bytes.
+   // **************************************************************************************
+
+   // delete the log file if it exists.
+   std::string path = getLogPath();
+   fs::remove(getLogPath());
+   BOOST_CHECK_MESSAGE(!fs::exists( path ), "log file not deleted " << path << " not created \n");
+
+   // Create the log file;
+   Log::create(path);
+   BOOST_CHECK_MESSAGE(fs::exists( path ), "log file " << path << " not created \n");
+
+   // Populate the log file
+   const int NO_OF_LINES_IN_LOG_FILE = 20000;
+   std::string msg = "This is message ";
+   for(int i = 0; i < NO_OF_LINES_IN_LOG_FILE; ++i)  LOG(Log::MSG,msg << i);
+
+   DurationTimer timer;
+
+   {
+      const int LOOP = 100;
+      for(int i = 0; i< LOOP; i++) {
+         std::string lines = Log::instance()->contents(1);
+         BOOST_CHECK_MESSAGE(!lines.empty(), "expected entry");
+      }
+   }
+
+   fs::remove(Log::instance()->path());
+
+   // Explicitly destroy log. To keep valgrind happy
+   Log::destroy();
+
+   cout << timer.duration() << "s\n" << flush;
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestMigration.cpp b/ecflow_4_0_7/ACore/test/TestMigration.cpp
new file mode 100644
index 0000000..b801402
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestMigration.cpp
@@ -0,0 +1,73 @@
+#if defined(TEXT_ARCHIVE) || !defined(BINARY_ARCHIVE) && !defined(PORTABLE_BINARY_ARCHIVE) && !defined(EOS_PORTABLE_BINARY_ARCHIVE)
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <stdlib.h> // for getenv()
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "TimeSeries.hpp"
+#include "SerializationTest.hpp"
+#include "Calendar.hpp"
+#include "File.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+// If you are updating the tests, *MAKE SURE* to check out test/data/migration/* files
+//#define UPDATE_TESTS 1
+
+BOOST_AUTO_TEST_CASE( test_migration_restore_1_9 )
+{
+   cout << "ACore:: ...test_migration_restore_1_9\n";
+
+   std::string file_name = File::test_data("ACore/test/data/migration/","ACore");
+
+   // Note: default calendar constructor will init with current time: Hence set for comparison
+   Calendar calendar;
+   boost::gregorian::date theDate(2011,2,10);
+   ptime time(theDate, hours(23) + minutes(59));
+   calendar.init(time, Calendar::REAL);  // Calendar type is derived from the clock attribute & hence is not persisted
+   Ecf::set_debug_equality(true);
+
+#ifdef UPDATE_TESTS
+   doSave<TimeSlot>(file_name + "timeslot_default_constructor_v1.9");
+   doSave<TimeSeries>(file_name + "timeseries_default_constructor_v1.9");
+   doSave<Calendar>(file_name + "calendar_v1.9",calendar);
+   doSave(file_name + "timeslot_1_1_v1_9",TimeSlot(1,1));
+   doSave(file_name + "timeslot_99_59_v1_9",TimeSlot(99,59));
+   doSave(file_name + "timeseries_10_10_v1_9",TimeSeries(TimeSlot(10,10)));
+#else
+   do_restore<TimeSlot>(file_name + "timeslot_default_constructor_v1.9",TimeSlot());
+   do_restore<TimeSeries>(file_name + "timeseries_default_constructor_v1.9",TimeSeries());
+   do_restore<Calendar>(file_name + "calendar_v1.9",calendar);
+   do_restore<TimeSlot>(file_name + "timeslot_1_1_v1_9",TimeSlot(1,1));
+   do_restore<TimeSlot>(file_name + "timeslot_99_59_v1_9",TimeSlot(99,59));
+   do_restore<TimeSeries>(file_name + "timeseries_10_10_v1_9",TimeSeries(TimeSlot(10,10)));
+#endif
+   Ecf::set_debug_equality(false);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+#endif
diff --git a/ecflow_4_0_7/ACore/test/TestNodePath.cpp b/ecflow_4_0_7/ACore/test/TestNodePath.cpp
new file mode 100644
index 0000000..337fd3d
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestNodePath.cpp
@@ -0,0 +1,148 @@
+#define BOOST_TEST_MODULE TestCore
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <iostream>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/timer.hpp>
+
+#include "NodePath.hpp"
+
+using namespace std;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+static void checkPath( const std::vector<std::string>& expectedPath,  const std::string& path  )
+{
+ 	std::vector<std::string> thePath;
+	NodePath::split(path,thePath);
+  	if ( thePath != expectedPath ) {
+  		BOOST_CHECK_MESSAGE(false,"Failed for " << path );
+  		std::cout << "Expected '";
+ 		std::copy (expectedPath.begin(), expectedPath.end(), std::ostream_iterator <std::string> (std::cout, " "));
+		std::cout << "'\nbut found '";
+ 		std::copy (thePath.begin(), thePath.end(), std::ostream_iterator <std::string> (std::cout, " "));
+ 		std::cout << "'\n";
+ 	}
+}
+
+BOOST_AUTO_TEST_CASE( test_path_extractor_constructor )
+{
+	cout << "ACore:: ...test_path_extractor_constructor\n";
+	BOOST_CHECK(true); // stop boost test from complaining about no checks
+
+	std::vector<std::string> theExpectedPath;
+	checkPath(theExpectedPath,"");
+
+	theExpectedPath.push_back("suite");
+	checkPath(theExpectedPath,"/suite");
+ 	checkPath(theExpectedPath,"suite");
+}
+
+BOOST_AUTO_TEST_CASE( test_path_extractor )
+{
+	cout << "ACore:: ...test_path_extractor\n";
+	BOOST_CHECK(true); // stop boost test from complaining about no checks
+
+	std::vector<std::string> theExpectedPath;
+	theExpectedPath.push_back("suite");
+	theExpectedPath.push_back("family");
+	theExpectedPath.push_back("task");
+
+	checkPath(theExpectedPath,"/suite/family/task");
+	checkPath(theExpectedPath,"/suite/family/task/");
+}
+
+BOOST_AUTO_TEST_CASE( test_unix_path_extractor )
+{
+	cout << "ACore:: ...test_unix_path_extractor\n";
+	BOOST_CHECK(true); // stop boost test from complaining about no checks
+
+	// On Unix multiple '/' are treated as one.
+	std::vector<std::string> theExpectedPath;
+	theExpectedPath.push_back("suite");
+	theExpectedPath.push_back("family");
+	theExpectedPath.push_back("task");
+
+	checkPath(theExpectedPath,"/suite///family////task");
+	checkPath(theExpectedPath,"/suite///family////task//");
+	checkPath(theExpectedPath,"//suite///family////task//");
+	checkPath(theExpectedPath,"///suite///family////task//");
+	checkPath(theExpectedPath,"///suite///family////task///");
+}
+
+BOOST_AUTO_TEST_CASE( test_extractHostPort )
+{
+	cout << "ACore:: ...test_extractHostPort\n";
+
+	std::string path;
+	std::string host;
+	std::string port;
+	BOOST_CHECK_MESSAGE(!NodePath::extractHostPort(path,host,port), "expected failure");
+
+	path = "Apath";
+	BOOST_CHECK_MESSAGE(!NodePath::extractHostPort(path,host,port), "expected failure");
+
+	path = " : ";
+	BOOST_CHECK_MESSAGE(!NodePath::extractHostPort(path,host,port), "expected failure");
+
+	path = "host:";
+	BOOST_CHECK_MESSAGE(!NodePath::extractHostPort(path,host,port), "expected failure");
+
+	path = ":port";
+	BOOST_CHECK_MESSAGE(!NodePath::extractHostPort(path,host,port), "expected failure");
+
+	path = "host:port";
+	BOOST_CHECK_MESSAGE(NodePath::extractHostPort(path,host,port), "expected success " << host << ":" << port);
+	BOOST_CHECK_MESSAGE(host == "host" && port == "port", "expected 'host:port' found " << host << ":" << port);
+
+	path = "//host:port";
+	BOOST_CHECK_MESSAGE(NodePath::extractHostPort(path,host,port), "expected success " << host << ":" << port);
+	BOOST_CHECK_MESSAGE(host == "host" && port == "port", "expected 'host:port' found " << host << ":" << port);
+
+	path = "//host:port/";
+	BOOST_CHECK_MESSAGE(NodePath::extractHostPort(path,host,port), "expected success " << host << ":" << port);
+	BOOST_CHECK_MESSAGE(host == "host" && port == "port", "expected 'host:port' found " << host << ":" << port);
+
+	path = "//host:port/suite";
+	BOOST_CHECK_MESSAGE(NodePath::extractHostPort(path,host,port), "expected success " << host << ":" << port);
+	BOOST_CHECK_MESSAGE(host == "host" && port == "port", "expected 'host:port' found " << host << ":" << port);
+
+	path = "//host:port/suite/family/task";
+	BOOST_CHECK_MESSAGE(NodePath::extractHostPort(path,host,port), "expected success " << host << ":" << port);
+	BOOST_CHECK_MESSAGE(host == "host" && port == "port", "expected 'host:port' found " << host << ":" << port);
+}
+
+//BOOST_AUTO_TEST_CASE( test_NodePath_perf )
+//{
+//	cout << "ACore:: ...test_NodePath_perf \n";
+//
+//	// Using
+//	// boost tokenizer timing: 9.73
+//	// Str::split            : 5.15
+//	boost::timer timer;  // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//	int n= 1000000 ;
+//	for(int i = 0; i < n; i++) {
+//		std::vector<std::string> thePath;
+//		NodePath::split("/this/is/a/test/string/that/will/be/usedto/check/perf",thePath);
+//	}
+//
+//	cout << "Timing for " << n << " NodePath is  " << timer.elapsed() << endl;
+//}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestRealCalendar.cpp b/ecflow_4_0_7/ACore/test/TestRealCalendar.cpp
new file mode 100644
index 0000000..f5ccc75
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestRealCalendar.cpp
@@ -0,0 +1,355 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/test/unit_test.hpp>
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "Calendar.hpp"
+#include "TimeSeries.hpp"
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_REAL_calendar )
+{
+	cout << "ACore:: ...test_REAL_calendar\n";
+
+	// init the calendar to 2009, Feb, 10th,
+ 	boost::gregorian::date theDate(2009,2,10);
+ 	ptime time(theDate, hours(22) + minutes(10));
+
+	Calendar calendar;
+	calendar.init(time, Calendar::REAL);
+
+	// record the time for the test
+ 	boost::posix_time::ptime theSuiteTime =  calendar.suiteTime();
+ 	boost::posix_time::time_duration theDuration =  calendar.duration();
+
+    // Take time now and add 2 minutes, use this to update calendar by 2 minutes
+	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+	time_now += minutes(2);
+  	theSuiteTime += minutes(2);
+ 	theDuration += minutes(2);
+
+  	calendar.update(time_now);
+
+ 	BOOST_CHECK_MESSAGE( calendar.suiteTime() == theSuiteTime," Expected " << to_simple_string(theSuiteTime) << " but found " << to_simple_string(calendar.suiteTime()) );
+ 	BOOST_CHECK_MESSAGE( calendar.duration() == theDuration," Expected " << to_simple_string(theDuration) << " but found " << to_simple_string(calendar.duration()) );
+
+	time_now += hours(24);
+  	theSuiteTime += hours(24);
+ 	theDuration += hours(24);
+
+  	calendar.update(time_now);
+
+ 	BOOST_CHECK_MESSAGE( calendar.suiteTime() == theSuiteTime," Expected " << to_simple_string(theSuiteTime) << " but found " << to_simple_string(calendar.suiteTime()) );
+ 	BOOST_CHECK_MESSAGE( calendar.duration() == theDuration," Expected " << to_simple_string(theDuration) << " but found " << to_simple_string(calendar.duration()) );
+}
+
+
+BOOST_AUTO_TEST_CASE( test_REAL_calendar_time_series_relative_complex )
+{
+	cout << "ACore:: ...test_REAL_calendar_time_series_relative_complex\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::HYBRID);
+
+	// Create a test when we can match a time series
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr   00:15
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(0,15),true/*relative*/);
+
+ 	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+
+ 	for(int hour=0; hour < 24; hour++) {
+ 		for( int minute=0; minute<60; minute++) {
+
+			// Update calendar every hour, then see we can match time series, *RELATIVE* to suite start
+ 			time_now += minutes(1);
+
+  		 	calendar.update(time_now);
+
+ 			timeSeries.calendarChanged( calendar );
+
+			tm suiteTm = to_tm(calendar.suiteTime());
+
+			bool matches = timeSeries.isFree(calendar);
+
+			bool intersects = ( suiteTm.tm_hour >= timeSeries.start().hour() &&
+						        suiteTm.tm_hour <= timeSeries.finish().hour() &&
+	  				           (suiteTm.tm_min == 0 || suiteTm.tm_min % timeSeries.incr().minute() == 0)
+					         );
+			// Ovoid overshooting past end of series
+			bool boundaryOk = true;
+			if ( suiteTm.tm_hour == timeSeries.finish().hour() ) {
+				boundaryOk = (suiteTm.tm_min <= timeSeries.finish().minute());
+			}
+
+ 			if ( intersects && boundaryOk )
+			{
+				BOOST_CHECK_MESSAGE(matches,
+				                    "Calendar should match relative time series at "
+				                    << suiteTm.tm_hour <<":"<< suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+				if (!matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+			else {
+ 				BOOST_CHECK_MESSAGE(!matches,
+				                    "Calendar should NOT match relative time series at "
+				                    << suiteTm.tm_hour <<":"<< suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+
+ 				if (matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+ 		}
+  	}
+}
+
+BOOST_AUTO_TEST_CASE( test_REAL_calendar_time_series)
+{
+	cout << "ACore:: ...test_REAL_calendar_time_series\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+	// Create a test when we can match a time series
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr    1:00
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0));
+
+ 	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+
+	for(int hour=1; hour < 24; hour++) {
+		// Update calendar every hour, then see we can match time series, in REAL
+		// Update will set the local time from the computers system clock, however
+		// for testing this will need to be overriden below.
+
+		time_now += hours(1);
+
+ 		calendar.update(time_now);
+
+		// cerr << "hour = " << hour << " suiteTime " << to_simple_string(calendar.suiteTime())  << "\n";
+		if (hour >= timeSeries.start().hour() && hour <=timeSeries.finish().hour()) {
+			BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),"Calendar should match time series at hour " << hour );
+		}
+		else {
+			BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),"Calendar should NOT match time series at hour " << hour );
+		}
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_REAL_calendar_time_series_complex )
+{
+	cout << "ACore:: ...test_REAL_calendar_time_series_complex\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+	// Create a test when we can match a time series
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr   00:15
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(0,15));
+
+ 	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+
+ 	for(int hour=0; hour < 24; hour++) {
+ 		for( int minute=0; minute<60; minute++) {
+
+			// Update calendar every minute, then see we can match time series, *RELATIVE* to suite start
+ 			time_now += minutes(1);
+ 			calendar.update(time_now);
+
+			tm suiteTm = to_tm(calendar.suiteTime());
+
+			bool matches = timeSeries.isFree(calendar);
+
+			bool intersects = ( suiteTm.tm_hour >= timeSeries.start().hour() &&
+						        suiteTm.tm_hour <= timeSeries.finish().hour() &&
+	  				           (suiteTm.tm_min == 0 || suiteTm.tm_min % timeSeries.incr().minute() == 0)
+					         );
+			// Ovoid overshooting past end of series
+			bool boundaryOk = true;
+			if ( suiteTm.tm_hour == timeSeries.finish().hour() ) {
+				boundaryOk = (suiteTm.tm_min <= timeSeries.finish().minute());
+			}
+
+ 			if ( intersects && boundaryOk )
+			{
+				BOOST_CHECK_MESSAGE(matches,
+				                    "Calendar should match relative time series at "
+				                    << suiteTm.tm_hour <<":"<< suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+				if (!matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+			else {
+ 				BOOST_CHECK_MESSAGE(!matches,
+				                    "Calendar should NOT match relative time series at "
+				                    << suiteTm.tm_hour <<":"<< suiteTm.tm_min
+				                    << " suite time = " << to_simple_string(calendar.suiteTime()));
+
+ 				if (matches) {
+ 					cerr << "suiteTm.tm_hour =" << suiteTm.tm_hour << " suiteTm.tm_min = " << suiteTm.tm_min
+ 					    << " timeSeries.start().hour() " << timeSeries.start().hour()
+ 					    << " timeSeries.start().minute() " << timeSeries.start().minute()
+ 						<< " timeSeries.finish().hour() " << timeSeries.finish().hour()
+ 						<< " timeSeries.finish().minute() " << timeSeries.finish().minute()
+ 						<< " suiteTm.tm_min % 15 = " << suiteTm.tm_min % 15
+ 						<< "\n";
+ 				}
+			}
+ 		}
+  	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_REAL_calendar_hybrid_date )
+{
+	cout << "ACore:: ...test_REAL_calendar_hybrid_date\n";
+
+	// The hybrid calendar should not change the suite date.
+	// Test by updateing calendar by more than 24 hours
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::HYBRID);
+
+
+	std::string expectedDate = "2010-Feb-10";
+ 	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+
+	for(int hour=1; hour < 60; hour++) {
+		// Update calendar every hour, for 60 hours
+		// the date should be the same, i.e 2009, Feb, 10th
+
+ 		ptime timeBeforeUpdate = calendar.suiteTime();
+
+		time_now += hours(1);
+
+ 		calendar.update(time_now);
+
+		ptime timeAfterUpdate = calendar.suiteTime();
+
+//		cerr << "hour = " << hour << " timeBeforeUpdate " << to_simple_string(timeBeforeUpdate)
+//		    << "   timeAfterUpdate = " << to_simple_string(timeAfterUpdate) <<  "\n";
+
+		if (hour != 24 && hour != 48) {
+			time_period diff(timeBeforeUpdate,timeAfterUpdate);
+ 			time_duration gap = diff.length();
+			BOOST_CHECK_MESSAGE( gap.hours() == 1,"Expected one hour difference but found " << gap.hours() << " at hour " << hour);
+		}
+
+		std::string actualDate = to_simple_string(calendar.suiteTime().date());
+  		BOOST_CHECK_MESSAGE( actualDate == expectedDate,"Expected '" << expectedDate << "' but found " << actualDate << " at hour " << hour);
+ 	}
+}
+
+BOOST_AUTO_TEST_CASE( test_REAL_day_changed )
+{
+	cout << "ACore:: ...test_REAL_day_changed \n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+ 	BOOST_CHECK_MESSAGE(!calendar.hybrid(),"calendar type should be real");
+
+ 	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+
+	for(int hour=1; hour < 73; hour++) {
+		// Update calendar every hour, for 72 hours
+
+		time_now += hours(1);
+
+ 	 	calendar.update(time_now);
+
+		if (hour == 24 || hour == 48 || hour == 72) {
+			BOOST_CHECK_MESSAGE( calendar.dayChanged(),"Expected day change at hour " << hour << " calendar " << calendar.toString());
+ 		}
+		else {
+			BOOST_CHECK_MESSAGE( !calendar.dayChanged(),"Un-Expected day change at hour " << hour << " calendar " << calendar.toString());
+		}
+ 	}
+}
+
+BOOST_AUTO_TEST_CASE( test_REAL_day_changed_for_hybrid )
+{
+	cout << "ACore:: ...test_REAL_day_changed_for_hybrid\n";
+
+	// init the calendar to 2009, Feb, 10th,  0 minutes past midnight
+	Calendar calendar;
+	calendar.init(ptime(date(2010,2,10), minutes(0)),Calendar::HYBRID);
+ 	BOOST_CHECK_MESSAGE(calendar.hybrid(),"calendar type should be real");
+
+ 	// HYBRID calendars allow for day change but not date.
+ 	std::string expected_date = to_simple_string(calendar.date());
+
+ 	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+
+	for(int hour=1; hour < 73; hour++) {
+  		// Update calendar every hour, for 72 hours
+
+		time_now += hours(1);
+ 	 	calendar.update(time_now);
+
+		BOOST_CHECK_MESSAGE( expected_date == to_simple_string(calendar.date()) ,
+		                     "Unexpected date change for hybrid calendar at hour " << hour);
+
+ 		// Day should change even for hybrid calendar,
+ 		if (hour == 24 || hour == 48 || hour == 72) {
+ 			BOOST_CHECK_MESSAGE( calendar.dayChanged(),"Expected day change at hour " << hour << " calendar " << calendar.toString());
+ 	 	}
+ 		else {
+ 			BOOST_CHECK_MESSAGE( !calendar.dayChanged(),"Un-Expected day change at hour " << hour << " calendar " << calendar.toString());
+ 		}
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestSerialisation.cpp b/ecflow_4_0_7/ACore/test/TestSerialisation.cpp
new file mode 100644
index 0000000..e0abf95
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestSerialisation.cpp
@@ -0,0 +1,135 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/test/unit_test.hpp>
+#include "TimeSeries.hpp"
+#include "SerializationTest.hpp"
+#include "Calendar.hpp"
+#include "boost_archive.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+static std::string fileName = "test.txt";
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_archive_version )
+{
+   cout << "ACore:: ...test_archive_version:  ";
+   // Boost 1.47 archive version = 9
+   // Bosst 1.53 archive version = 10
+   BOOST_CHECK_MESSAGE(boost_archive::version() >= 9,"Expected boost archive version >= 9");
+   std::cout << boost_archive::version() << "\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_extract_archive_version )
+{
+   cout << "ACore:: ...test_extract_archive_version\n";
+
+   // get the archive version:
+   std::string boost_serial_str = "22 serialization::archive 9 0 0 0 0 1 1 0";
+   BOOST_CHECK_MESSAGE(boost_archive::extract_version(boost_serial_str) == 9,"Expected version to be 9 but found " << boost_archive::extract_version(boost_serial_str));
+
+   boost_serial_str = "22 serialization::archive 10 0 0 0 0 1 1 0";
+   BOOST_CHECK_MESSAGE(boost_archive::extract_version(boost_serial_str) == 10,"Expected version to be 10 but found " << boost_archive::extract_version(boost_serial_str));
+
+   boost_serial_str = "22 serialization::archive 999 0 0 0 0 1 1 0";
+   BOOST_CHECK_MESSAGE(boost_archive::extract_version(boost_serial_str) == 999,"Expected version to be 999 but found " << boost_archive::extract_version(boost_serial_str));
+
+   // error
+   boost_serial_str = "22 serialization::archive";
+   BOOST_CHECK_MESSAGE(boost_archive::extract_version(boost_serial_str) == 0,"Expected version to be 0 but found " << boost_archive::extract_version(boost_serial_str));
+}
+
+
+BOOST_AUTO_TEST_CASE( test_replace_archive_version )
+{
+   cout << "ACore:: ...test_replace_archive_version\n";
+
+   std::string boost_serial_str = "22 serialization::archive 9 0 0 0 0 1 1 0";
+   std::string expected = "22 serialization::archive 10 0 0 0 0 1 1 0";
+   BOOST_CHECK(boost_archive::replace_version(boost_serial_str,10));
+   BOOST_CHECK_MESSAGE(boost_serial_str == expected,"Expected '" << expected << "' but found '" << boost_serial_str << "'");
+
+   boost_serial_str = "22 serialization::archive 10 0 0 0 0 1 1 0";
+   expected         = "22 serialization::archive 9 0 0 0 0 1 1 0";
+   BOOST_CHECK(boost_archive::replace_version(boost_serial_str,9));
+   BOOST_CHECK_MESSAGE(boost_serial_str == expected,"Expected '" << expected << "' but found '" << boost_serial_str << "'");
+
+   boost_serial_str = "22 serialization::archive 10 10 10";
+   expected         = "22 serialization::archive 11 10 10";
+   BOOST_CHECK(boost_archive::replace_version(boost_serial_str,11));
+   BOOST_CHECK_MESSAGE(boost_serial_str == expected,"Expected '" << expected << "' but found '" << boost_serial_str << "'");
+
+   boost_serial_str = "22 serialization::archive 10 10 10";
+   expected         = "22 serialization::archive 44444 10 10";
+   BOOST_CHECK(boost_archive::replace_version(boost_serial_str,44444));
+   BOOST_CHECK_MESSAGE(boost_serial_str == expected,"Expected '" << expected << "' but found '" << boost_serial_str << "'");
+
+   // error
+   boost_serial_str = "22 serialization::archive ";
+   expected         = "22 serialization::archive ";
+   BOOST_CHECK(!boost_archive::replace_version(boost_serial_str,11));
+   BOOST_CHECK_MESSAGE(boost_serial_str == expected,"Expected '" << expected << "' but found '" << boost_serial_str << "'");
+}
+
+BOOST_AUTO_TEST_CASE( test_calendar_serialisation )
+{
+	cout << "ACore:: ...test_calendar_serialisation \n";
+
+ 	Calendar cal;
+	doSaveAndRestore(fileName,cal);
+}
+
+BOOST_AUTO_TEST_CASE( test_TimeSlot_serialisation )
+{
+	cout << "ACore:: ...test_TimeSlot_serialisation \n";
+
+	{
+		doSaveAndRestore<TimeSlot>(fileName);
+	}
+
+	{
+		TimeSlot saved(1,1);
+		doSaveAndRestore(fileName,saved);
+	}
+
+	{
+		TimeSlot saved(99,59);
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_TimeSeries_serialisation )
+{
+	cout << "ACore:: ...test_TimeSeries_serialisation \n";
+
+	{
+		doSaveAndRestore<TimeSeries>(fileName);
+	}
+	{
+		TimeSeries saved = TimeSeries(TimeSlot(10,10));
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		TimeSeries saved = TimeSeries(TimeSlot(0,0),TimeSlot(10,10),TimeSlot(0,10));
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestStackTrace.cpp b/ecflow_4_0_7/ACore/test/TestStackTrace.cpp
new file mode 100644
index 0000000..336ac36
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestStackTrace.cpp
@@ -0,0 +1,80 @@
+////============================================================================
+//// Name        :
+//// Author      : Avi
+//// Revision    : $Revision: #8 $ 
+////
+//// Copyright 2009-2012 ECMWF. 
+//// This software is licensed under the terms of the Apache Licence version 2.0 
+//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+//// In applying this licence, ECMWF does not waive the privileges and immunities 
+//// granted to it by virtue of its status as an intergovernmental organisation 
+//// nor does it submit to any jurisdiction. 
+////
+//// Description :
+////============================================================================
+//#include <boost/test/unit_test.hpp>
+//#include "boost/filesystem/operations.hpp"
+//#include "boost/filesystem/path.hpp"
+//#include <iostream>
+//#include <fstream>
+////#include "StackTrace.hpp"
+//
+//
+//using namespace boost;
+//using namespace std;
+//using namespace ecf;
+//namespace fs = boost::filesystem;
+//
+//BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+//
+//class MyClass {
+//public:
+//    std::string MemFunc( const std::string &someParam )
+//    {
+//    	int depth = 5;
+//        return StackTrace::dump( __FILE__, __LINE__, depth );
+//    }
+//};
+//
+//std::string func2( const char *something )
+//{
+//    MyClass a;
+//    return a.MemFunc( something );
+//}
+//
+//std::string func1( int param1, const std::string &param2 )
+//{
+//    return func2( param2.c_str() );
+//}
+//
+////BOOST_AUTO_TEST_CASE( test_stack_trace )
+////{
+////#if defined(__GNUC__)
+////	cout << "ACore:: ...test_stack_trace\n";
+////    std::string traceback = func1( 1, "TestString" );
+////
+////	std::string expected;
+////	fs::path current_path = fs::current_path();
+////	if (current_path.stem() == "ACore" ) {
+//////		cout << "current_path.stem() == ACore )\n";
+////		expected = "Call Stack from test/TestStackTrace.cpp:28\n"
+////		       "   CoreTestSuite::MyClass::MemFunc(std::string const&)\n"
+////		       "   CoreTestSuite::func2(char const*)\n"
+////		       "   CoreTestSuite::func1(int, std::string const&)\n"
+////		       "   CoreTestSuite::test_stack_trace::test_method()\n";
+////	}
+////	else {
+//////		cout << "current_path.stem() != ACore )\n";
+////		expected = "Call Stack from ACore/test/TestStackTrace.cpp:28\n"
+////		       "   CoreTestSuite::MyClass::MemFunc(std::string const&)\n"
+////		       "   CoreTestSuite::func2(char const*)\n"
+////		       "   CoreTestSuite::func1(int, std::string const&)\n"
+////		       "   CoreTestSuite::test_stack_trace::test_method()\n";
+////	}
+////    BOOST_CHECK_MESSAGE (traceback == expected,"Mismatch expected\n'" << expected << "'\n but found\n'" << traceback << "'");
+////#endif
+////}
+//
+//BOOST_AUTO_TEST_SUITE_END()
+//
+//
diff --git a/ecflow_4_0_7/ACore/test/TestStr.cpp b/ecflow_4_0_7/ACore/test/TestStr.cpp
new file mode 100644
index 0000000..d39df8b
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestStr.cpp
@@ -0,0 +1,694 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/timer.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/bind.hpp>
+#include <boost/algorithm/string/split.hpp>
+
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost;
+
+//#define STRING_SPLIT_IMPLEMENTATIONS_PERF_CHECK_ 1;
+
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_str )
+{
+	cout << "ACore:: ...test_str\n";
+
+	{
+		std::string str;
+		std::string expected;
+		Str::removeQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+
+		str = "\"\""; expected = "";
+		Str::removeQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+
+		str = "fred"; expected = "fred";
+		Str::removeQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+
+		str = "\"fred\""; expected = "fred";
+		Str::removeQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+	}
+	{
+		std::string str;
+		std::string expected;
+		Str::removeSingleQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+
+		str = "''"; expected = "";
+		Str::removeSingleQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+
+		str = "fred"; expected = "fred";
+		Str::removeSingleQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+
+		str = "'fred'"; expected = "fred";
+		Str::removeSingleQuotes(str);
+		BOOST_CHECK_MESSAGE(str == expected," Expected " << expected << " but found " << str);
+	}
+	{
+		string test;
+		BOOST_CHECK_MESSAGE(!Str::truncate_at_start(test,7),"Empty sring should return false");
+
+		test= "this\nis\na\nstring\nwith\nlots\nof\nnew\nline";
+		string expected = "line";
+		BOOST_CHECK_MESSAGE(Str::truncate_at_start(test,1) && test==expected,"Expected:\n" << expected << "\nbut found:\n" << test);
+
+		test= "this\nis\na\nstring\nwith\nlots\nof\nnew\nline";
+		expected = "a\nstring\nwith\nlots\nof\nnew\nline";
+		BOOST_CHECK_MESSAGE(Str::truncate_at_start(test,7) && test==expected,"Expected:\n" << expected << "\nbut found:\n" << test);
+
+		test= "this\nis\na\nstring\nwith\nlots\nof\nnew\nline";
+		expected = test;
+		BOOST_CHECK_MESSAGE(!Str::truncate_at_start(test,9) && test==expected,"Expected:\n" << expected << "\nbut found:\n" << test);
+	}
+   {
+      string test;
+      BOOST_CHECK_MESSAGE(!Str::truncate_at_end(test,7),"Empty string should return false");
+
+      test= "this\nis\na\nstring\nwith\nlots\nof\nnew\nline";
+      string expected = "this\n";
+      BOOST_CHECK_MESSAGE(Str::truncate_at_end(test,1) && test==expected,"Expected:\n" << expected << "\nbut found:\n" << test);
+
+      test= "this\nis\na\nstring\nwith\nlots\nof\nnew\nline";
+      expected = "this\nis\n";
+      BOOST_CHECK_MESSAGE(Str::truncate_at_end(test,2) && test==expected,"Expected:\n" << expected << "\nbut found:\n" << test);
+
+      test= "this\nis\na\nstring\nwith\nlots\nof\nnew\nline";
+      expected= "this\nis\na\nstring\nwith\nlots\nof\n";
+      BOOST_CHECK_MESSAGE(Str::truncate_at_end(test,7) && test==expected,"Expected:\n" << expected << "\nbut found:\n" << test);
+
+      test= "this\nis\na\nstring\nwith\nlots\nof\nnew\nline";
+      expected = test;
+      BOOST_CHECK_MESSAGE(!Str::truncate_at_end(test,9) && test==expected,"Expected:\n" << expected << "\nbut found:\n" << test);
+   }
+}
+
+static void check(const std::string& line,
+                  const std::vector<std::string>& result,
+                  const std::vector<std::string>& expected )
+{
+ 	BOOST_CHECK_MESSAGE(result.size() == expected.size(),"expected size " << expected.size() << " but found " << result.size() << " for '" << line << "'");
+	BOOST_CHECK_MESSAGE(result == expected,"Str::split failed for '" << line  << "'");
+	if (result != expected) {
+		cout << "Actual  :"; BOOST_FOREACH(const string& t, result)   { cout << "'" << t << "'"; } cout << "\n";
+		cout << "Expected:"; BOOST_FOREACH(const string& t, expected) { cout << "'" << t << "'"; } cout << "\n";
+ 	}
+}
+
+//BOOST_AUTO_TEST_CASE( test_boost_str_split )
+//{
+//	cout << "ACore:: ...test_boost_str_split\n";
+//
+//	std::string line = "This is a string  ";
+//	std::vector<std::string> expected;
+//	expected.push_back("This"); expected.push_back("is"); expected.push_back("a"); expected.push_back("string");
+//	expected.push_back(""); expected.push_back("");
+//
+//	std::vector<std::string> result;
+//	boost::algorithm::split(result, line, std::bind2nd(std::equal_to<char>(), ' ')); // default is compress off, preserve empty tokens
+//	check(line,result,expected);
+//
+//	expected.pop_back();
+//	result.clear();
+//	boost::algorithm::split(result, line, std::bind2nd(std::equal_to<char>(), ' '),boost::algorithm::token_compress_on);
+//	check(line,result,expected);
+//
+//	// boost::split(v, s, boost::lambda::_1 == ' ');
+//}
+
+
+BOOST_AUTO_TEST_CASE( test_str_split )
+{
+	cout << "ACore:: ...test_str_split\n";
+
+	std::string line = "This is a string";
+	std::vector<std::string> expected;
+	expected.push_back("This"); expected.push_back("is"); expected.push_back("a"); expected.push_back("string");
+	std::vector<std::string> result;
+	Str::split(line,result);
+	check(line,result,expected);
+
+
+	line.clear(); expected.clear(); result.clear();
+	line = "  ";
+ 	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = "a";
+	expected.push_back("a");
+ 	Str::split(line,result);
+	check(line,result,expected);
+
+	// Some implementation fail this test
+	line.clear(); expected.clear(); result.clear();
+	line = "\n";
+	expected.push_back("\n");
+  	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = "a ";
+	expected.push_back("a");
+ 	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = " a";
+	expected.push_back("a");
+ 	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = "	a"; // check tabs
+	expected.push_back("a");
+ 	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = "		a		"; // check sequential tabs
+	expected.push_back("a");
+ 	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = " a ";
+	expected.push_back("a");
+ 	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = "        a     b     c       d        ";
+	expected.push_back("a"); expected.push_back("b"); expected.push_back("c"); expected.push_back("d");
+  	Str::split(line,result);
+	check(line,result,expected);
+
+	line.clear(); expected.clear(); result.clear();
+	line = " - !   $ % ^ & * ( ) - + ?";
+	expected.push_back("-"); expected.push_back("!");  expected.push_back("$");
+	expected.push_back("%"); expected.push_back("^"); expected.push_back("&"); expected.push_back("*");
+	expected.push_back("("); expected.push_back(")"); expected.push_back("-"); expected.push_back("+");
+	expected.push_back("?");
+  	Str::split(line,result);
+	check(line,result,expected);
+
+	// Check tabs
+	line.clear(); expected.clear(); result.clear();
+	line = "		 verify complete:8		                # 4 sundays in october hence expect 8 task completions";
+	expected.push_back("verify");expected.push_back("complete:8");expected.push_back("#");expected.push_back("4");
+	expected.push_back("sundays");expected.push_back("in");expected.push_back("october");expected.push_back("hence");
+	expected.push_back("expect");expected.push_back("8");expected.push_back("task");expected.push_back("completions");
+   	Str::split(line,result);
+	check(line,result,expected);
+
+#ifdef STRING_SPLIT_IMPLEMENTATIONS_PERF_CHECK_
+ 	{
+ 		line = "This is a long string that is going to be used to test the performance of splitting with different Implementations   extra   empty tokens   ";
+		size_t times = 1000000;
+	 	boost::timer timer;  // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+ 		for (size_t i = 0; i < times; i++) {
+ 			result.clear();
+// 			boost::algorithm::split(result, line, std::bind2nd(std::equal_to<char>(), ' '),boost::algorithm::token_compress_on); //  3.2 times slower, but preserves empty tokens
+		  	Str::split(line,result);
+ 		}
+		cout << "Time for Str::split " << times << " times = " << timer.elapsed() << "\n";
+	}
+#endif
+}
+
+
+static void test_replace( std::string& testStr, const std::string& find, const std::string& replace, const std::string& expected)
+{
+ 	BOOST_CHECK_MESSAGE(Str::replace(testStr,find,replace), "Replace failed for " << testStr << " find(" << find << ") replace(" << replace << ")");
+	BOOST_CHECK_MESSAGE(testStr == expected,"Expected '" << expected << "' but found '" << testStr <<"'");
+}
+
+static void test_replace_all( std::string& testStr, const std::string& find, const std::string& replace, const std::string& expected)
+{
+   std::string testStrCopy = testStr;
+
+   BOOST_CHECK_MESSAGE(Str::replace_all(testStr,find,replace), "Replace failed for " << testStr << " find(" << find << ") replace(" << replace << ")");
+   BOOST_CHECK_MESSAGE(testStr == expected,"Expected '" << expected << "' but found '" << testStr <<"'");
+
+   Str::replaceall(testStrCopy,find,replace);
+   BOOST_CHECK_MESSAGE(testStr == testStrCopy,"Expected '" << testStrCopy << "' but found '" << testStr <<"'");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_str_replace )
+{
+	cout << "ACore:: ...test_str_replace\n";
+
+	std::string testStr = "This is a string";
+ 	test_replace(testStr,"This","That","That is a string");
+
+	testStr = "This is a string";
+ 	test_replace(testStr,"This is a string","","");
+
+	testStr = "This is a string";
+ 	test_replace(testStr,"is a","was a","This was a string");
+
+   testStr = "This\n is a string";
+   test_replace(testStr,"\n","\\n","This\\n is a string");
+
+   testStr = "This\n is\n a\n string\n";
+   test_replace_all(testStr,"\n","\\n","This\\n is\\n a\\n string\\n");
+
+ 	// Test case insenstive string comparison
+	BOOST_CHECK_MESSAGE(Str::caseInsCompare("","")," bug1");
+	BOOST_CHECK_MESSAGE(!Str::caseInsCompare("Str","Str1")," bug1");
+	BOOST_CHECK_MESSAGE(!Str::caseInsCompare("","Str1")," bug1");
+ 	BOOST_CHECK_MESSAGE(Str::caseInsCompare("Str","STR")," bug1");
+ 	BOOST_CHECK_MESSAGE(Str::caseInsCompare("Case","CaSE")," bug1");
+}
+
+BOOST_AUTO_TEST_CASE( test_str_replace_all )
+{
+   cout << "ACore:: ...test_str_replace_all\n";
+
+   std::string testStr = "This is a string";
+   test_replace_all(testStr,"This","That","That is a string");
+
+   testStr = "This is a string";
+   test_replace_all(testStr,"This is a string","","");
+
+   testStr = "This is a string";
+   test_replace_all(testStr,"is a","was a","This was a string");
+
+   testStr = "This\n is a string";
+   test_replace_all(testStr,"\n","\\n","This\\n is a string");
+
+   testStr = "This\n is\n a\n string\n";
+   test_replace_all(testStr,"\n","\\n","This\\n is\\n a\\n string\\n");
+
+   testStr = "This\n is\n a\n string\n";
+   test_replace_all(testStr,"\n","","This is a string");
+}
+
+BOOST_AUTO_TEST_CASE( test_str_to_int )
+{
+	cout << "ACore:: ...test_str(to_int)\n";
+	BOOST_CHECK_MESSAGE(Str::to_int("0") == 0,"Expected 0");
+	BOOST_CHECK_MESSAGE(Str::to_int("1") == 1,"Expected 1");
+	BOOST_CHECK_MESSAGE(Str::to_int("-0") == 0,"Expected 0");
+	BOOST_CHECK_MESSAGE(Str::to_int("-1") == -1,"Expected -1");
+	BOOST_CHECK_MESSAGE(Str::to_int("") == std::numeric_limits<int>::max(),"Expected max int");
+	BOOST_CHECK_MESSAGE(Str::to_int("-") == std::numeric_limits<int>::max(),"Expected max int");
+	BOOST_CHECK_MESSAGE(Str::to_int(" ") == std::numeric_limits<int>::max(),"Expected max int");
+	BOOST_CHECK_MESSAGE(Str::to_int("q") == std::numeric_limits<int>::max(),"Expected max int");
+	BOOST_CHECK_MESSAGE(Str::to_int("q22") == std::numeric_limits<int>::max(),"Expected max int");
+	BOOST_CHECK_MESSAGE(Str::to_int("q22",-1) == -1,"Expected -1 on failure");
+	BOOST_CHECK_MESSAGE(Str::to_int("99 99") == std::numeric_limits<int>::max(),"Expected max int");
+	BOOST_CHECK_MESSAGE(Str::to_int("99 99",0) == 0,"Expected 0 for failure");
+}
+
+BOOST_AUTO_TEST_CASE( test_extract_data_member_value )
+{
+   cout << "ACore:: ...test_extract_data_member_value\n";
+   std::string expected = "value";
+   std::string actual;
+   std::string str = "aa bb c fred:value";
+   BOOST_CHECK_MESSAGE(Str::extract_data_member_value(str,"fred:",actual)," failed");
+   BOOST_CHECK_MESSAGE(expected == actual,"expected '" << expected << "' but found '" << actual << "'");
+
+
+   str = "fred:x  bill:zzz jake:12345 1234:99  6677";
+   expected = "x";
+   BOOST_CHECK_MESSAGE(Str::extract_data_member_value(str,"fred:",actual)," failed");
+   BOOST_CHECK_MESSAGE(expected == actual,"expected '" << expected << "' but found '" << actual << "'");
+
+   expected = "zzz";
+   BOOST_CHECK_MESSAGE(Str::extract_data_member_value(str,"bill:",actual)," failed");
+   BOOST_CHECK_MESSAGE(expected == actual,"expected '" << expected << "' but found '" << actual << "'");
+
+   expected = "12345";
+   BOOST_CHECK_MESSAGE(Str::extract_data_member_value(str,"jake:",actual)," failed");
+   BOOST_CHECK_MESSAGE(expected == actual,"expected '" << expected << "' but found '" << actual << "'");
+
+   expected = "99";
+   BOOST_CHECK_MESSAGE(Str::extract_data_member_value(str,"1234:",actual)," failed");
+   BOOST_CHECK_MESSAGE(expected == actual,"expected '" << expected << "' but found '" << actual << "'");
+
+   expected = "77";
+   BOOST_CHECK_MESSAGE(Str::extract_data_member_value(str,"66",actual)," failed");
+   BOOST_CHECK_MESSAGE(expected == actual,"expected '" << expected << "' but found '" << actual << "'");
+}
+
+
+std::string toString(const std::vector<std::string>& c)
+{
+   std::stringstream ss;
+   std::copy (c.begin(), c.end(), std::ostream_iterator <std::string> (ss, ", "));
+   return ss.str();
+}
+
+BOOST_AUTO_TEST_CASE( test_str_less_greater)
+{
+   cout << "ACore:: ...test_str_less_greater\n";
+
+   std::vector<std::string> expected;
+   expected.push_back("a1");
+   expected.push_back("A2");
+   expected.push_back("b1");
+   expected.push_back("B2");
+   expected.push_back("c");
+
+   std::vector<std::string> expectedGreater;
+   expectedGreater.push_back("c");
+   expectedGreater.push_back("B2");
+   expectedGreater.push_back("b1");
+   expectedGreater.push_back("A2");
+   expectedGreater.push_back("a1");
+
+   std::vector<std::string> vec;
+   vec.push_back("c");
+   vec.push_back("A2");
+   vec.push_back("a1");
+   vec.push_back("b1");
+   vec.push_back("B2");
+
+   std::sort(vec.begin(),vec.end(),Str::caseInsLess);
+   BOOST_REQUIRE_MESSAGE( vec == expected,"expected " << toString(expected) << " but found " << toString(vec) );
+
+   std::sort(vec.begin(),vec.end(),Str::caseInsGreater);
+   BOOST_REQUIRE_MESSAGE( vec == expectedGreater,"expected " << toString(expectedGreater) << " but found " << toString(vec) );
+
+   // --------------------------------------------------------------------
+
+   expected.clear();
+   expected.push_back("a");
+   expected.push_back("A");
+   expected.push_back("b");
+   expected.push_back("B");
+   expected.push_back("c");
+
+   expectedGreater.clear();
+   expectedGreater.push_back("c");
+   expectedGreater.push_back("B");
+   expectedGreater.push_back("b");
+   expectedGreater.push_back("A");
+   expectedGreater.push_back("a");
+
+   vec.clear();
+   vec.push_back("c");
+   vec.push_back("B");
+   vec.push_back("A");
+   vec.push_back("b");
+   vec.push_back("a");
+
+   std::sort(vec.begin(),vec.end(),Str::caseInsLess);
+   BOOST_REQUIRE_MESSAGE( vec == expected,"expected " << toString(expected) << " but found " << toString(vec) );
+
+   std::sort(vec.begin(),vec.end(),Str::caseInsGreater);
+   BOOST_REQUIRE_MESSAGE( vec == expectedGreater,"expected " << toString(expectedGreater) << " but found " << toString(vec) );
+
+   // --------------------------------------------------------------------
+
+   expected.clear();
+   expected.push_back("1234");
+   expected.push_back("baSE");
+   expected.push_back("Base");
+   expected.push_back("case");
+   expected.push_back("CaSe");
+   expected.push_back("suite");
+   expected.push_back("SUITE");
+
+   expectedGreater.clear();
+   expectedGreater.push_back("SUITE");
+   expectedGreater.push_back("suite");
+   expectedGreater.push_back("CaSe");
+   expectedGreater.push_back("case");
+   expectedGreater.push_back("Base");
+   expectedGreater.push_back("baSE");
+   expectedGreater.push_back("1234");
+
+   vec.clear();
+   vec.push_back("suite");
+   vec.push_back("SUITE");
+   vec.push_back("baSE");
+   vec.push_back("Base");
+   vec.push_back("case");
+   vec.push_back("CaSe");
+   vec.push_back("1234");
+
+   std::sort(vec.begin(),vec.end(),Str::caseInsLess);
+   BOOST_REQUIRE_MESSAGE( vec == expected,"expected " << toString(expected) << " but found " << toString(vec) );
+
+   std::sort(vec.begin(),vec.end(),Str::caseInsGreater);
+   BOOST_REQUIRE_MESSAGE( vec == expectedGreater,"expected " << toString(expectedGreater) << " but found " << toString(vec) );
+}
+
+
+//// ==============================================================
+//// Timing to find the fastest looping
+//// ==============================================================
+//class Fred {
+//public:
+//   Fred(int i = 0) : i_(i)            { /*std::cout << "Fred constructor\n"*/;}
+//   Fred(const Fred& rhs) : i_(rhs.i_) { /*std::cout << "Fred copy constructor\n";*/ }
+//   Fred& operator=(const Fred& rhs)   { /*std::cout << "assignment operator\n";*/ i_ = rhs.i_; return *this;}
+//   ~Fred()                            { /*std::cout << "Fred destructor\n";*/}
+//
+//	void inc() { i_++;}
+//private:
+//	int i_;
+//};
+//
+//BOOST_AUTO_TEST_CASE( test_loop )
+//{
+//	// DEBUG release shows BOOST_FOREACH has worst perf, however in release mode its par with the fastest.
+//	size_t vecSize = 20000000;
+//	std::vector<Fred> vec;
+//	vec.reserve(vecSize);
+//	for (size_t i = 0; i < vecSize ; i++) { vec.push_back(Fred(i));}
+//
+// 	boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//	BOOST_FOREACH(Fred& fred, vec) { fred.inc(); }
+// 	cout << "Time: BOOST_FOREACH(Fred& fred, vec) { fred.inc(); }                                       " << timer.elapsed() << "\n";
+//
+// 	timer.restart();
+//	std::for_each(vec.begin(),vec.end(),boost::bind(&Fred::inc,_1) );
+// 	cout << "Time: std::for_each(vec.begin(),vec.end(),boost::bind(&Fred::inc,_1) );                    " << timer.elapsed() << "\n";
+//
+// 	timer.restart();
+//	std::vector<Fred>::iterator theEnd = vec.end();
+// 	for (std::vector<Fred>::iterator  i = vec.begin(); i < theEnd ; i++) { (*i).inc(); }
+// 	cout << "Time: for (std::vector<Fred>::iterator  i = vec.begin(); i < theEnd ; i++) { (*i).inc(); } " << timer.elapsed() << "\n";
+//
+// 	timer.restart();
+// 	std::for_each(vec.begin(),vec.end(),std::mem_fun_ref(&Fred::inc) );
+// 	cout << "Time: std::for_each(vec.begin();vec.end(),std::mem_fun_ref(&Fred::inc))                    " << timer.elapsed() << "\n";
+//
+// 	timer.restart();
+// 	size_t theSize = vec.size();
+//	for (size_t i = 0; i < theSize ; i++) { vec[i].inc(); }
+// 	cout << "Time: for (size_t i = 0; i < theSize ; i++) { vec[i].inc(); }                              " << timer.elapsed() << "\n";
+//}
+
+
+/// ==============================================================
+/// Timing to find the fastest conversion from string to int
+/// ==============================================================
+//static void methodX(  const std::string& str,
+//                      std::vector<std::string>& stringRes,
+//                      std::vector<int>& numberRes)
+//{
+//	// 0.81
+//	// for bad conversion istringstream seems to return 0, hence add guard
+//	if ( str.find_first_of( Str::NUMERIC(), 0 ) != std::string::npos ) {
+//		int number = 0;
+//		std::istringstream ( str ) >> number;
+//		numberRes.push_back( number );
+// 	}
+//	else {
+//		stringRes.push_back( str );
+//	}
+//}
+//
+//
+//static void method1(  const std::string& str,
+//                      std::vector<std::string>& stringRes,
+//                      std::vector<int>& numberRes)
+//{
+//	// 12.2
+//	try {
+//		int number = boost::lexical_cast< int >( str );
+//		numberRes.push_back( number );
+//	}
+//	catch ( boost::bad_lexical_cast& ) {
+//		stringRes.push_back( str );
+//	}
+//}
+//
+//static void method2(  const std::string& str,
+//                      std::vector<std::string>& stringRes,
+//                      std::vector<int>& numberRes)
+//{
+//	// 0.6
+//	if ( str.find_first_of( Str::NUMERIC(), 0 ) != std::string::npos ) {
+//		try {
+//			int number = boost::lexical_cast< int >( str );
+//			numberRes.push_back( number );
+//		}
+//		catch ( boost::bad_lexical_cast& ) {
+//			stringRes.push_back( str );
+//		}
+//	}
+//	else {
+//		stringRes.push_back( str );
+//	}
+//}
+//
+//static void method3(  const std::string& str,
+//                      std::vector<std::string>& stringRes,
+//                      std::vector<int>& numberRes)
+//{
+//	// 0.14
+//	// atoi return 0 for errors,
+//	int number = atoi(str.c_str()); //does not handle errors
+//	if (number == 0 && str.size() != 1) {
+//		stringRes.push_back( str );
+//	}
+//	else {
+//		numberRes.push_back( number );
+//	}
+//}
+//
+//
+//BOOST_AUTO_TEST_CASE( test_lexical_cast_perf )
+//{
+//	cout << "ACore:: ...test_string_to_int_conversion\n";
+//
+//	size_t the_size  = 1000000;
+//	std::vector<std::string> stringTokens;
+//	std::vector<std::string> numberTokens;
+// 	std::vector<int> expectedNumberRes;
+//	for(size_t i=0; i < the_size; i++) { stringTokens.push_back("astring");}
+//	for(size_t i=0; i < the_size; i++) {
+//		numberTokens.push_back(boost::lexical_cast<string>(i));
+//		expectedNumberRes.push_back(i);
+//   }
+//
+//	std::vector<std::string> stringRes; stringTokens.reserve(stringTokens.size());
+//	std::vector<int> numberRes; numberRes.reserve(expectedNumberRes.size());
+//
+//	{
+//		boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//		for(size_t i =0; i < stringTokens.size(); i++) {
+//			method1(stringTokens[i], stringRes, numberRes );
+//		}
+//		for(size_t i =0; i < numberTokens.size(); i++) {
+//			method1(numberTokens[i], stringRes, numberRes );
+//		}
+//		cout << "Time for method1  elapsed time = " << timer.elapsed() << "\n";
+//		BOOST_CHECK_MESSAGE(numberRes == expectedNumberRes," method 1 wrong");
+//		BOOST_CHECK_MESSAGE(stringTokens == stringRes,"method 1 wrong");
+//		numberRes.clear();
+//		stringRes.clear();
+//	}
+//
+//	{
+//		boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//		for(size_t i =0; i < stringTokens.size(); i++) {
+//			methodX(stringTokens[i], stringRes, numberRes );
+//		}
+//		for(size_t i =0; i < numberTokens.size(); i++) {
+//			methodX(numberTokens[i], stringRes, numberRes );
+//		}
+//		cout << "Time for methodX  elapsed time = " << timer.elapsed() << "\n";
+//		BOOST_CHECK_MESSAGE(numberRes == expectedNumberRes," method X wrong");
+//		BOOST_CHECK_MESSAGE(stringTokens == stringRes,"method X wrong");
+//		numberRes.clear();
+//		stringRes.clear();
+//	}
+//
+//	{
+//		boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//		for(size_t i =0; i < stringTokens.size(); i++) {
+//			method2(stringTokens[i], stringRes, numberRes );
+//		}
+//		for(size_t i =0; i < numberTokens.size(); i++) {
+//			method2(numberTokens[i], stringRes, numberRes );
+//		}
+//		cout << "Time for method2  elapsed time = " << timer.elapsed() << "\n";
+//		BOOST_CHECK_MESSAGE(numberRes == expectedNumberRes,"method 2 wrong");
+//		BOOST_CHECK_MESSAGE(stringTokens == stringRes,"method 2 wrong");
+//		numberRes.clear();
+//		stringRes.clear();
+//	}
+//
+//	{
+//		boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//		for(size_t i =0; i < stringTokens.size(); i++) {
+//			method3(stringTokens[i], stringRes, numberRes );
+//		}
+//		for(size_t i =0; i < numberTokens.size(); i++) {
+//			method3(numberTokens[i], stringRes, numberRes );
+//		}
+//		cout << "Time for method3  elapsed time = " << timer.elapsed() << "\n";
+//		BOOST_CHECK_MESSAGE(numberRes == expectedNumberRes," method3 wrong  numberRes.size()=" << numberRes.size() << " expected size = " << expectedNumberRes.size());
+//		BOOST_CHECK_MESSAGE(stringTokens == stringRes," method3 wrong  stringRes.size()=" << stringRes.size() << " expected size = " << stringTokens.size());
+//		numberRes.clear();
+//		stringRes.clear();
+//	}
+//}
+
+//BOOST_AUTO_TEST_CASE( test_int_to_str_perf )
+//{
+//   cout << "ACore:: ...test_int_to_str_perf\n";
+//
+//   // Lexical_cast is approx twice as fast as using streams
+//   // time for ostream = 0.97
+//   // time for lexical_cast = 0.45
+//
+//   const int the_size = 1000000;
+//   {
+//      boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//      for(size_t i =0; i < the_size; i++) {
+//         std::ostringstream st;
+//         st << i;
+//         std::string s = st.str();
+//      }
+//      cout << "Time for int to string using ostringstream  elapsed time = " << timer.elapsed() << "\n";
+//   }
+//
+//
+//   {
+//      boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+//      for(size_t i =0; i < the_size; i++) {
+//         std::string s = boost::lexical_cast<std::string>(i);
+//      }
+//      cout << "Time for int to string using boost::lexical_cast  elapsed time = " << timer.elapsed() << "\n";
+//   }
+//}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestTimeSeries.cpp b/ecflow_4_0_7/ACore/test/TestTimeSeries.cpp
new file mode 100644
index 0000000..9e3a61b
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestTimeSeries.cpp
@@ -0,0 +1,676 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include "TimeSeries.hpp"
+#include "Calendar.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+using namespace boost;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_time_series_min_max_time_slots )
+{
+   cout << "ACore:: ...test_time_series_min_max_time_slots\n";
+
+   TimeSlot the_min;
+   TimeSlot the_max;
+
+   TimeSeries a(9,0,true);
+   a.min_max_time_slots(the_min,the_max);
+   BOOST_CHECK_MESSAGE( the_min == TimeSlot(9,0),"Max min time slot failed");
+   BOOST_CHECK_MESSAGE( the_max == TimeSlot(9,0),"Max min time slot failed");
+
+   TimeSeries b(TimeSlot(10,12),false);
+   b.min_max_time_slots(the_min,the_max);
+   BOOST_CHECK_MESSAGE( the_min == TimeSlot(9,0),"Max min time slot failed");
+   BOOST_CHECK_MESSAGE( the_max == TimeSlot(10,12),"Max min time slot failed");
+
+   TimeSeries c(TimeSlot(0,10), TimeSlot(10,13), TimeSlot(0,1));
+   c.min_max_time_slots(the_min,the_max);
+   BOOST_CHECK_MESSAGE( the_min == TimeSlot(0,10),"Max min time slot failed");
+   BOOST_CHECK_MESSAGE( the_max == TimeSlot(10,13),"Max min time slot failed");
+
+   TimeSeries x;
+   x.min_max_time_slots(the_min,the_max);
+   BOOST_CHECK_MESSAGE( the_min == TimeSlot(),"Max min time slot failed");
+   BOOST_CHECK_MESSAGE( the_max == TimeSlot(10,13),"Max min time slot failed");
+
+}
+
+
+BOOST_AUTO_TEST_CASE( test_time_series_constrcution )
+{
+	cout << "ACore:: ...test_time_series_constrcution\n";
+
+	{
+		TimeSeries x;
+		TimeSeries y;
+		BOOST_CHECK_MESSAGE( x == y,"Equality operator expected to succeed");
+
+		TimeSeries a(10,12,true);
+		TimeSeries b(10,12,true);
+		BOOST_CHECK_MESSAGE( a == b,"Equality operator expected to succeed");
+
+		TimeSeries c(10,12,false);
+		TimeSeries d(10,12,false);
+		BOOST_CHECK_MESSAGE( c == d,"Equality operator expected to succeed");
+
+		TimeSeries e(TimeSlot(14,59),false);
+		TimeSeries f(TimeSlot(14,59),false);
+ 		BOOST_CHECK_MESSAGE( e == f,"Equality operator expected to succeed");
+
+ 		TimeSeries g(TimeSlot(0,10), TimeSlot(10,4), TimeSlot(0,1));
+ 		TimeSeries h(TimeSlot(0,10), TimeSlot(10,4), TimeSlot(0,1));
+ 		BOOST_CHECK_MESSAGE( g == h,"Equality operator expected to succeed");
+	}
+	{
+		TimeSeries a(10,12,false);
+		TimeSeries b(10,12,true);
+ 		BOOST_CHECK_MESSAGE( a != b,"Equality operator expected to fail");
+
+		TimeSeries c(10,13,false);
+		TimeSeries d(10,12,false);
+		BOOST_CHECK_MESSAGE( c != d,"Equality operator expected to fail");
+
+		TimeSeries e(TimeSlot(14,59),false);
+		TimeSeries f(TimeSlot(14,10),false);
+ 		BOOST_CHECK_MESSAGE( e != f,"Equality operator expected to fail");
+
+ 		TimeSeries g(TimeSlot(0,10), TimeSlot(10,4), TimeSlot(0,1), true);
+ 		TimeSeries h(TimeSlot(0,10), TimeSlot(10,4), TimeSlot(0,1), false);
+ 		BOOST_CHECK_MESSAGE( g != h,"Equality operator expected to fail");
+ 	}
+
+	/// Basic test for time series of getters and setters
+	TimeSeries timeSeries(TimeSlot(0,1), TimeSlot(0,4), TimeSlot(0,1));
+	BOOST_CHECK_MESSAGE(timeSeries.hasIncrement(),"expected increment");
+	std::string errMsg; BOOST_CHECK_MESSAGE(timeSeries.checkInvariants(errMsg),errMsg);
+
+	TimeSeries another = timeSeries;
+	BOOST_CHECK_MESSAGE(another == timeSeries,"copy constructor failed for TimeSeries ");
+	BOOST_CHECK_MESSAGE(another.checkInvariants(errMsg),errMsg);
+	BOOST_CHECK_MESSAGE(timeSeries.checkInvariants(errMsg),errMsg);
+
+	TimeSeries timeSeries2(TimeSlot(0,1), TimeSlot(0,4), TimeSlot(0,1));
+	BOOST_CHECK_MESSAGE(timeSeries2.checkInvariants(errMsg),errMsg);
+	another = timeSeries2;
+	BOOST_CHECK_MESSAGE(another ==  timeSeries2,"assignment operator failed for TimeSeries ");
+	BOOST_CHECK_MESSAGE(another.checkInvariants(errMsg),errMsg);
+
+	TimeSeries timeSeries3(TimeSlot(0,1));
+	BOOST_CHECK_MESSAGE(timeSeries3.checkInvariants(errMsg),errMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series )
+{
+	cout << "ACore:: ...test_time_series\n";
+
+	/// Basic test for time series of getters and setters
+	TimeSeries timeSeries(TimeSlot(0,1), TimeSlot(0,4), TimeSlot(0,1));
+	BOOST_CHECK_MESSAGE(timeSeries.hasIncrement(),"expected increment");
+
+	std::string expected = "00:01:00";
+	std::string actual = to_simple_string(timeSeries.start().duration());
+	BOOST_CHECK_MESSAGE(expected == actual," expected " << expected << " but found " << actual );
+
+	expected = "00:04:00";
+	actual = to_simple_string(timeSeries.finish().duration());
+	BOOST_CHECK_MESSAGE(expected == actual," expected " << expected << " but found " << actual );
+
+	expected = "00:01:00";
+	actual = to_simple_string(timeSeries.incr().duration());
+	BOOST_CHECK_MESSAGE(expected == actual," expected " << expected << " but found " << actual );
+
+
+	TimeSeries timeSeries2(TimeSlot(0,1));
+	BOOST_CHECK_MESSAGE(!timeSeries2.hasIncrement(),"Not expecting time series");
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series_increment_real )
+{
+	cout << "ACore:: ...test_time_series_increment_real\n";
+
+	// Test time series with  a calendar, we update calendar then
+	// test time series isFree(), and checkForRequeue
+	Calendar c;
+	c.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+
+	// Create a test when we can match a time series. Need to sync hour with suite time
+	// at hour 1, suite time should also be 01:00, for test to work
+	//
+	// Create the time series: start  10:00
+	//                         finish 20:00
+	//                         incr    1:00
+	TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), true/* relative */);
+	TimeSeries timeSeries2(TimeSlot(11,0), TimeSlot(15,0), TimeSlot(1,0), true/* relative */);
+	TimeSeries timeSeries3(TimeSlot(15,0),  true/* relative */);
+
+   TimeSlot t1_min, t1_max,t2_min,t2_max,t3_min,t3_max;
+   timeSeries.min_max_time_slots(t1_min, t1_max);
+   timeSeries2.min_max_time_slots(t2_min, t2_max);
+   timeSeries3.min_max_time_slots(t3_min, t3_max);
+   BOOST_CHECK_MESSAGE(t1_min == TimeSlot(10,0) && t1_max == TimeSlot(20,0),"Not as expected");
+   BOOST_CHECK_MESSAGE(t2_min == TimeSlot(11,0) && t2_max == TimeSlot(15,0),"Not as expected");
+   BOOST_CHECK_MESSAGE(t3_min == TimeSlot(15,0) && t3_max == TimeSlot(15,0),"Not as expected");
+
+   // Follow normal process
+   timeSeries.reset( c );
+   timeSeries2.reset( c );
+   timeSeries3.reset( c );
+
+	for(int hour=1; hour < 24; hour++) {
+		// Update calendar every hour, then see we can match time series, *RELATIVE* to suite start
+		c.update( time_duration( hours(1) ) );
+		timeSeries.calendarChanged( c );
+		timeSeries2.calendarChanged( c );
+		timeSeries3.calendarChanged( c );
+
+//		cerr << "hour = " << hour << " calendar_duration " << to_simple_string(timeSeries.duration(c))
+//		    << " timeSeries=" << timeSeries.toString() << " timeSeries2=" << timeSeries2.toString() << " timeSeries3=" << timeSeries3.toString() << "\n";
+		if (hour < timeSeries.start().hour()) {
+         BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(c,t1_min,t1_max)," Time series " << timeSeries.toString() << "checkForRequeue should pass at " << hour );
+         BOOST_CHECK_MESSAGE(!timeSeries.isFree(c),"Time series " << timeSeries.toString() << " should NOT be free at hour " << hour );
+		}
+		else if (hour >= timeSeries.start().hour() && hour <= timeSeries.finish().hour()) {
+			BOOST_CHECK_MESSAGE(timeSeries.isFree(c),"Time series " << timeSeries.toString() << " should be free at hour " << hour );
+
+			/// At the last hour checkForRequeue should return false; This ensures that value will
+			/// not get incremented and so, should leave node in the complete state.
+			if ( hour < timeSeries.finish().hour()) {
+				BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(c,t1_min,t1_max),"Time series " << timeSeries.toString() << " checkForRequeue should be free at hour " << hour );
+			}
+			else {
+				BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(c,t1_min,t1_max),"Time series " << timeSeries.toString() << "checkForRequeue should Not free at hour " << hour );
+			}
+		}
+		else {
+			BOOST_CHECK_MESSAGE(!timeSeries.isFree(c),"Time series " << timeSeries.toString() << " should NOT be free at hour " << hour );
+ 			BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(c,t1_min,t1_max)," Time series " << timeSeries.toString() << " should fail at " << hour );
+		}
+
+
+      if (hour < timeSeries2.start().hour()) {
+         BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(c,t1_min,t1_max)," Time series " << timeSeries2.toString() << "checkForRequeue should pass at " << hour );
+         BOOST_CHECK_MESSAGE(!timeSeries2.isFree(c),"Time series " << timeSeries2.toString() << " should NOT be free at hour " << hour );
+      }
+      else if (hour >= timeSeries2.start().hour() && hour <=timeSeries2.finish().hour()) {
+			BOOST_CHECK_MESSAGE(timeSeries2.isFree(c),"Time series " << timeSeries2.toString() << " should be free at hour " << hour );
+
+			/// At the last hour checkForRequeue should return false;
+			if ( hour < timeSeries2.finish().hour()) {
+				BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(c,t2_min,t2_max),"Time series " << timeSeries2.toString() << " checkForRequeue should be free at hour " << hour );
+			}
+			else {
+				BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(c,t2_min,t2_max),"Time series " << timeSeries2.toString() << "checkForRequeue should Not free at hour " << hour );
+			}
+  		}
+		else {
+			BOOST_CHECK_MESSAGE(!timeSeries2.isFree(c),"Time series " << timeSeries2.toString() << " not be free at hour " << hour );
+			BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(c,t2_min,t2_max)," Time series " << timeSeries2.toString() << " should fail at " << hour );
+ 		}
+
+
+		if (hour == timeSeries3.start().hour()  ) {
+			BOOST_CHECK_MESSAGE(timeSeries3.isFree(c),"Time series " << timeSeries3.toString() << " should be free at hour " << hour );
+ 		}
+		else if (hour < timeSeries3.start().hour()) {
+			BOOST_CHECK_MESSAGE(!timeSeries3.isFree(c),"Time series " << timeSeries3.toString() << " isFree should fail at hour " << hour );
+ 		}
+		else if (hour > timeSeries3.start().hour()) {
+			BOOST_CHECK_MESSAGE(!timeSeries3.isFree(c),"Time series " << timeSeries3.toString() << " is Free should fail at hour " << hour );
+	 	}
+		BOOST_CHECK_MESSAGE(!timeSeries3.checkForRequeue(c,t3_min,t3_max)," Time series " << timeSeries3.toString() << " checkForRequeue should fail at " << hour );
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series_requeueable_and_compute_next_time_slot )
+{
+   cout << "ACore:: ...test_time_series_requeueable_and_compute_next_time_slot\n";
+
+   // Test time series with  a calendar, we update calendar then
+   // test time series requeueable(), and compute_next_time_slot
+   // This are used with the WHY command
+   Calendar c;
+   c.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+
+   // Create a test when we can match a time series. Need to sync hour with suite time
+   // at hour 1, suite time should also be 01:00, for test to work
+   //
+   // Create the time series: start  10:00
+   //                         finish 20:00
+   //                         incr    1:00
+   TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), true/* relative */);
+   TimeSeries timeSeries2(TimeSlot(11,0), TimeSlot(15,0), TimeSlot(1,0), true/* relative */);
+   TimeSeries timeSeries3(TimeSlot(15,0),  true/* relative */);
+
+   for(int hour=1; hour < 24; hour++) {
+      // Update calendar every hour, then see we can match time series,
+      c.update( time_duration( hours(1) ) );
+      timeSeries.calendarChanged( c );
+      timeSeries2.calendarChanged( c );
+      timeSeries3.calendarChanged( c );
+
+//    cerr << "hour = " << hour << " calendar_duration " << to_simple_string(timeSeries.duration(c))
+//        << " timeSeries=" << timeSeries.toString() << " timeSeries2=" << timeSeries2.toString() << " timeSeries3=" << timeSeries3.toString() << "\n";
+      if (hour < timeSeries.start().hour()) {
+         TimeSlot next_time_slot = timeSeries.compute_next_time_slot(c);
+         TimeSlot expected(10,0);
+         BOOST_CHECK_MESSAGE(next_time_slot ==expected," Time series " << timeSeries.toString() << " at " << hour << " expected next time slot at " << expected.toString() << " but found " << next_time_slot.toString());
+         BOOST_CHECK_MESSAGE(timeSeries.requeueable(c),"Time series " << timeSeries.toString() << " should be requeueable at hour " << hour );
+      }
+      else if (hour == timeSeries.start().hour() ) {
+         TimeSlot next_time_slot = timeSeries.compute_next_time_slot(c);
+         TimeSlot expected(11,0);
+         BOOST_CHECK_MESSAGE(next_time_slot == expected," Time series " << timeSeries.toString() << " at " << hour << " expected next time slot at " << expected.toString() << " but found " << next_time_slot.toString());
+         BOOST_CHECK_MESSAGE(timeSeries.requeueable(c),"Time series " << timeSeries.toString() << " should be requeueable at hour " << hour );
+      }
+      else if (hour > timeSeries.start().hour() &&  hour < timeSeries.finish().hour()) {
+         TimeSlot next_time_slot = timeSeries.compute_next_time_slot(c);
+         TimeSlot expected(hour+1,0);
+         BOOST_CHECK_MESSAGE(next_time_slot == expected," Time series " << timeSeries.toString() << " at " << hour << " expected next time slot at " << expected.toString() << " but found " << next_time_slot.toString());
+         BOOST_CHECK_MESSAGE(timeSeries.requeueable(c),"Time series " << timeSeries.toString() << " should be requeueable at hour " << hour );
+      }
+      else if (hour == timeSeries.finish().hour()) {
+         TimeSlot next_time_slot = timeSeries.compute_next_time_slot(c);
+         BOOST_CHECK_MESSAGE(next_time_slot.isNULL()," Time series " << timeSeries.toString() << " at " << hour << " expected next time slot  to be NULL");
+         BOOST_CHECK_MESSAGE(!timeSeries.requeueable(c),"Time series " << timeSeries.toString() << " should NOT be requeueable at hour " << hour );
+      }
+      else if (hour > timeSeries.finish().hour()) {
+         TimeSlot next_time_slot = timeSeries.compute_next_time_slot(c);
+         BOOST_CHECK_MESSAGE(next_time_slot.isNULL()," Time series " << timeSeries.toString() << " at " << hour << " expected next time slot to be NULL");
+         BOOST_CHECK_MESSAGE(!timeSeries.requeueable(c),"Time series " << timeSeries.toString() << " should NOT be requeueable at hour " << hour );
+      }
+
+
+      if (hour < timeSeries2.start().hour()) {
+         TimeSlot next_time_slot = timeSeries2.compute_next_time_slot(c);
+         TimeSlot expected(11,0);
+         BOOST_CHECK_MESSAGE(next_time_slot ==expected," Time series " << timeSeries2.toString() << " at " << hour << " expected next time slot at " << expected.toString() << " but found " << next_time_slot.toString());
+         BOOST_CHECK_MESSAGE(timeSeries2.requeueable(c),"Time series " << timeSeries2.toString() << " should be requeueable at hour " << hour );
+      }
+      else if (hour == timeSeries2.start().hour() ) {
+         TimeSlot next_time_slot = timeSeries2.compute_next_time_slot(c);
+         TimeSlot expected(12,0);
+         BOOST_CHECK_MESSAGE(next_time_slot == expected," Time series " << timeSeries2.toString() << " at " << hour << " expected next time slot at " << expected.toString() << " but found " << next_time_slot.toString());
+         BOOST_CHECK_MESSAGE(timeSeries2.requeueable(c),"Time series " << timeSeries2.toString() << " should NOT be requeueable at hour " << hour );
+      }
+      else if (hour > timeSeries2.start().hour() &&  hour < timeSeries2.finish().hour()) {
+         TimeSlot next_time_slot = timeSeries2.compute_next_time_slot(c);
+         TimeSlot expected(hour+1,0);
+         BOOST_CHECK_MESSAGE(next_time_slot == expected," Time series " << timeSeries2.toString() << " at " << hour << " expected next time slot at " << expected.toString() << " but found " << next_time_slot.toString());
+         BOOST_CHECK_MESSAGE(timeSeries2.requeueable(c),"Time series " << timeSeries2.toString() << " should be requeueable at hour " << hour );
+      }
+      else if (hour == timeSeries2.finish().hour()) {
+         TimeSlot next_time_slot = timeSeries2.compute_next_time_slot(c);
+         BOOST_CHECK_MESSAGE(next_time_slot.isNULL()," Time series " << timeSeries2.toString() << " at " << hour << " expected next time slot  to be NULL");
+         BOOST_CHECK_MESSAGE(!timeSeries2.requeueable(c),"Time series " << timeSeries2.toString() << " should NOT be requeueable at hour " << hour );
+      }
+      else if (hour > timeSeries2.finish().hour()) {
+         TimeSlot next_time_slot = timeSeries2.compute_next_time_slot(c);
+         BOOST_CHECK_MESSAGE(next_time_slot.isNULL()," Time series " << timeSeries2.toString() << " at " << hour << " expected next time slot to be NULL");
+         BOOST_CHECK_MESSAGE(!timeSeries2.requeueable(c),"Time series " << timeSeries2.toString() << " should NOT be requeueable at hour " << hour );
+      }
+
+
+      if (hour < timeSeries3.start().hour()) {
+         TimeSlot next_time_slot = timeSeries3.compute_next_time_slot(c);
+         TimeSlot expected(15,0);
+         BOOST_CHECK_MESSAGE(next_time_slot ==expected," Time series " << timeSeries3.toString() << " at " << hour << " expected next time slot at " << expected.toString() << " but found " << next_time_slot.toString());
+         BOOST_CHECK_MESSAGE(timeSeries3.requeueable(c),"Time series " << timeSeries3.toString() << " should be requeueable at hour " << hour );
+      }
+      else if (hour == timeSeries3.start().hour() ) {
+         TimeSlot next_time_slot = timeSeries3.compute_next_time_slot(c);
+         BOOST_CHECK_MESSAGE(next_time_slot.isNULL()," Time series " << timeSeries3.toString() << " at " << hour << " expected next time slot to be NULL");
+         BOOST_CHECK_MESSAGE(!timeSeries3.requeueable(c),"Time series " << timeSeries3.toString() << " should NOT be requeueable at hour " << hour );
+      }
+      else if (hour > timeSeries3.start().hour()) {
+         TimeSlot next_time_slot = timeSeries3.compute_next_time_slot(c);
+         BOOST_CHECK_MESSAGE(next_time_slot.isNULL()," Time series " << timeSeries3.toString() << " at " << hour << " expected next time slot to be NULL");
+         BOOST_CHECK_MESSAGE(!timeSeries3.requeueable(c),"Time series " << timeSeries3.toString() << " should NOT be requeueable at hour " << hour );
+      }
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_time_series_finish_not_divisble_by_increment )
+{
+	cout << "ACore:: ...test_time_series_finish_not_divisble_by_increment\n";
+
+	// HANDLE CASE WHERE FINISH MINUTES IS NOT DIVISIBLE BY THE INCREMENT
+
+	// Test time series with  a calendar, we update calendar then
+	// test time series isFree(), and checkForRequeue
+	Calendar calendar;
+	calendar.init(ptime(date(2008,10,8), hours(0) ), Calendar::REAL);
+
+	// Create a test when we can match a time series.
+	// NOTE: Finish minute is not a multiple of INCREMENT hence last valid time slot is 23:50
+	//
+	// Create the time series: start  00:00
+	//                         finish 23:59
+	//                         incr   00:10
+	TimeSeries timeSeries(TimeSlot(0,0), TimeSlot(23,59), TimeSlot(0,10), false/* relative */);
+	TimeSeries timeSeries2(TimeSlot(0,30), TimeSlot(23,59), TimeSlot(4,0), false/* relative */);
+
+   TimeSlot t1_min, t1_max,t2_min,t2_max;
+   timeSeries.min_max_time_slots(t1_min, t1_max);
+   timeSeries2.min_max_time_slots(t2_min, t2_max);
+   BOOST_CHECK_MESSAGE(t1_min == TimeSlot(0,0) && t1_max == TimeSlot(23,59),"Not as expected");
+   BOOST_CHECK_MESSAGE(t2_min == TimeSlot(0,30) && t2_max == TimeSlot(23,59),"Not as expected");
+
+ 	time_duration last = hours(23) + minutes(50);  // last valid time is 23:50
+	time_duration last2 = hours(20) + minutes(30);  // last valid time is 20:30
+
+	// follow normal process
+   timeSeries.reset(calendar);
+   timeSeries2.reset(calendar);
+
+ 	for(int hour=0; hour < 24; hour++) {
+ 		for( int minute=0; minute<60; minute++) {
+
+ 			calendar.update( minutes(1) );
+         timeSeries.calendarChanged(calendar);
+         timeSeries2.calendarChanged(calendar);
+
+ 			//cout << to_simple_string(calendar.suiteTime()) << "\n";
+
+ 			if (calendar.dayChanged()) {
+            BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max)," expected " << timeSeries.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime()));
+ 			}
+ 			else if ( calendar.suiteTime().time_of_day() < timeSeries.start().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max)," expected " << timeSeries.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime()) );
+ 			}
+ 			else if ( calendar.suiteTime().time_of_day() >= timeSeries.start().duration() && calendar.suiteTime().time_of_day() < last	) {
+     			BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max)," expected " << timeSeries.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime())  );
+  			}
+  			else {
+     			BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max)," expected " << timeSeries.toString() << " checkForRequeue to fail at " << to_simple_string(calendar.suiteTime()) );
+  			}
+
+         if (calendar.dayChanged()) {
+            BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max)," expected " << timeSeries2.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime()));
+         }
+         else if ( calendar.suiteTime().time_of_day() < timeSeries2.start().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max)," expected " << timeSeries2.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime()) );
+         }
+         else if ( calendar.suiteTime().time_of_day() >= timeSeries2.start().duration() && calendar.suiteTime().time_of_day() < last2	) {
+     			BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max)," expected " << timeSeries2.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime()));
+  			}
+  			else {
+     			BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(calendar,t2_min,t2_max)," expected " << timeSeries2.toString() << " checkForRequeue to fail at " << to_simple_string(calendar.suiteTime()));
+  			}
+
+//         if (calendar.dayChanged()) {
+//            timeSeries.reset(calendar);
+//            timeSeries2.reset(calendar);
+//         }
+ 		}
+ 	}
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series_miss_time_slot )
+{
+   cout << "ACore:: ...test_time_series_miss_time_slot\n";
+
+   Calendar calendar;
+   calendar.init(ptime(date(2008,10,8), hours(10) ), Calendar::REAL);
+
+   // Create a test when we can match a time series.
+   // NOTE: Finish minute is not a multiple of INCREMENT hence last valid time slot is 23:50
+   //
+   // Create the time series: start  10:00
+   //                         finish 23:59
+   //                         incr   00:10
+   TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(23,59), TimeSlot(0,10), false/* relative */);
+   timeSeries.miss_next_time_slot(); // will increment next_time_slot
+   BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,10), "miss time slot not working ");
+
+   timeSeries.miss_next_time_slot(); // will increment next_time_slot
+   BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,20), "miss time slot not working ");
+
+   // requeue time series,
+   timeSeries.requeue(calendar); // calendar time is at midnight 10:00
+   BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,10),"Expected requeue to reset time series");
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series_miss_time_slot_1 )
+{
+   cout << "ACore:: ...test_time_series_miss_time_slot_1\n";
+
+   // Create calendar before time series
+   {
+      Calendar calendar;
+      calendar.init(ptime(date(2008,10,8), hours(9) ), Calendar::REAL);  // 09:00
+
+      TimeSeries timeSeries(10,0, false/* relative */);                 // 10:00
+
+      TimeSlot t1_min, t1_max;
+      timeSeries.min_max_time_slots(t1_min, t1_max);
+      BOOST_CHECK_MESSAGE(t1_min == TimeSlot(10,0) && t1_max == TimeSlot(10,0),"Not as expected");
+
+
+      BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar), "Expected time holding at 10:00 since calendar is 09:00");
+      BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max), "Expected checkForRequeue to return false always");
+
+      timeSeries.miss_next_time_slot();
+      BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar), "Expected time to hold");
+      BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max), "Expected checkForRequeue to return false");
+
+      timeSeries.requeue(calendar);
+      BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar), "Expected time holding at 10:00 since calendar is 09:00");
+      BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max), "Expected checkForRequeue to return false after Requeue");
+   }
+   {
+      // Create a time after the time series
+      Calendar calendar;
+      calendar.init(ptime(date(2008,10,8), hours(11) ), Calendar::REAL); // 11:00
+
+      TimeSeries timeSeries(10,0, false/* relative */);                 // 10:00
+
+      TimeSlot t1_min, t1_max;
+      timeSeries.min_max_time_slots(t1_min, t1_max);
+      BOOST_CHECK_MESSAGE(t1_min == TimeSlot(10,0) && t1_max == TimeSlot(10,0),"Not as expected");
+
+
+      BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar), "Expected time NOT to be free, since calendar time is after time slot");
+      BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max), "Expected checkForRequeue to return false, since calendar time > slot time");
+
+      timeSeries.miss_next_time_slot();
+      BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar), "Expected time to hold");
+      BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max), "Expected checkForRequeue to return false");
+
+      timeSeries.requeue(calendar);
+      BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar), "Expected time to hold, since calendar time is after time slot");
+      BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max), "Expected checkForRequeue to return false,since calendar time is after time slot");
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series_reset )
+{
+   cout << "ACore:: ...test_time_series_reset\n";
+
+
+   // Create a test when we can match a time series.
+   // NOTE: Finish minute is not a multiple of INCREMENT hence last valid time slot is 23:50
+   //
+   // Create the time series: start  10:00
+   //                         finish 23:59
+   //                         incr   00:10
+   TimeSeries timeSeries(TimeSlot(10,0), TimeSlot(23,59), TimeSlot(0,10), false/* relative */);
+   BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,0), "defaults not correct");
+
+   { // set calendar before time series start & then reset
+
+      Calendar calendar;
+      calendar.init(ptime(date(2008,10,8), hours(9) ), Calendar::REAL);
+      timeSeries.reset(calendar);
+      BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,0), "Reset should set value(next_valid_time_slot) to start." << timeSeries.dump());
+
+      timeSeries.miss_next_time_slot();
+
+      timeSeries.requeue(calendar);
+      BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,0), "requeue should set value(next_valid_time_slot) to start."<< timeSeries.dump());
+   }
+   { // set calendar at time series start & then reset
+
+      Calendar calendar;
+      calendar.init(ptime(date(2008,10,8), hours(10) ), Calendar::REAL);
+      timeSeries.reset(calendar);
+      BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,0), "Reset should set value(next_valid_time_slot) to start."<< timeSeries.dump());
+
+      timeSeries.miss_next_time_slot();
+
+      timeSeries.requeue(calendar);
+      BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(10,10), "requeue should set value(next_valid_time_slot) to start."<< timeSeries.dump());
+   }
+   { // set calendar after time series start & before time series end, then reset
+
+      Calendar calendar;
+      calendar.init(ptime(date(2008,10,8), hours(11) ), Calendar::REAL);
+      timeSeries.reset(calendar);
+      BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(11,0), "Reset should update free slot."<< timeSeries.dump());
+
+      timeSeries.miss_next_time_slot();
+
+      timeSeries.requeue(calendar);
+      BOOST_CHECK_MESSAGE(timeSeries.value() == TimeSlot(11,10), "requeue should update to first time slot."<< timeSeries.dump());
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_time_series_parsing )
+{
+   cout << "ACore:: ...test_time_series_parsing\n";
+
+   BOOST_CHECK_MESSAGE(TimeSeries::create("00:30") == ecf::TimeSeries(0,30), "Error ");
+   BOOST_CHECK_MESSAGE(TimeSeries::create("+00:30") == ecf::TimeSeries(0,30,true), "Error ");
+
+   ecf::TimeSlot start(0,30);
+   ecf::TimeSlot finish(21,03);
+   ecf::TimeSlot incr(1,30);
+   BOOST_CHECK_MESSAGE(TimeSeries::create("00:30 21:03 01:30") == ecf::TimeSeries(start,finish,incr), "Error");
+   BOOST_CHECK_MESSAGE(TimeSeries::create("+00:30 21:03 01:30") == ecf::TimeSeries(start,finish,incr,true), "Error");
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series_state_parsing )
+{
+   cout << "ACore:: ...test_time_series_state_parsing\n";
+
+   /// extract string like
+   ///     time +00:00 20:00 00:10 # this is a comment which will be ignored. index = 1
+   ///     time +20:00        // index = 1
+   ///     today 20:00        // index = 1
+   ///     +00:00 20:00 00:10 // index = 0
+   ///     +20:00             // index = 0
+   /// will throw std:runtime_error for errors
+   /// will assert if index >= lineTokens.size()
+   {
+      size_t index = 0;
+      std::string the_time = "+00:00 20:00 00:10";
+      std::vector<std::string> lineTokens;
+      Str::split(the_time,lineTokens);
+      BOOST_CHECK_MESSAGE(TimeSeries::create(index,lineTokens) == ecf::TimeSeries(TimeSlot(0,0),TimeSlot(20,0),TimeSlot(0,10),true), "Error");
+   }
+   {
+      size_t index = 0;
+      std::string the_time = "+10:10";
+      std::vector<std::string> lineTokens;
+      Str::split(the_time,lineTokens);
+      BOOST_CHECK_MESSAGE(TimeSeries::create(index,lineTokens) == ecf::TimeSeries(TimeSlot(10,10),true), "Error");
+   }
+   {
+      size_t index = 0;
+      std::string the_time = "+10:10 # free isValid:false";
+      ecf::TimeSeries expected(TimeSlot(10,10),true);
+      expected.set_isValid(false);
+
+      std::vector<std::string> lineTokens;
+      Str::split(the_time,lineTokens);
+      ecf::TimeSeries parsed_ts = TimeSeries::create(index,lineTokens,true);
+      BOOST_CHECK_MESSAGE(parsed_ts == expected,
+                          "Expected \n'" << expected.toString() << expected.state_to_string(false) << "'" <<
+                          " But found \n'" << parsed_ts.toString() << parsed_ts.state_to_string(false) << "'");
+   }
+   {
+      size_t index = 0;
+      std::string the_time = "+10:10 # free isValid:false nextTimeSlot/10:10 relativeDuration/00:00:00";
+      ecf::TimeSeries expected(TimeSlot(10,10),true);
+      expected.set_isValid(false);
+
+      std::vector<std::string> lineTokens;
+      Str::split(the_time,lineTokens);
+      ecf::TimeSeries parsed_ts = TimeSeries::create(index,lineTokens,true);
+      BOOST_CHECK_MESSAGE(parsed_ts == expected,
+                          "Expected \n'" << expected.toString() << expected.state_to_string(false) << "'" <<
+                          " But found\n'" << parsed_ts.toString() << parsed_ts.state_to_string(false) << "'");
+   }
+   {
+      // Update relative duration
+      size_t index = 0;
+      std::string the_time = "+10:10 # free isValid:false nextTimeSlot/10:10 relativeDuration/01:00:00";
+      ecf::TimeSeries expected(TimeSlot(10,10),true);
+      expected.set_isValid(false);
+
+      Calendar calendar;
+      calendar.init(ptime(date(2008,10,8), hours(0) ), Calendar::REAL);
+      calendar.update( time_duration( hours(1) ) );
+      expected.calendarChanged( calendar );
+
+      std::vector<std::string> lineTokens;
+      Str::split(the_time,lineTokens);
+      ecf::TimeSeries parsed_ts = TimeSeries::create(index,lineTokens,true);
+      BOOST_CHECK_MESSAGE(parsed_ts == expected,
+                          "Expected \n'" << expected.toString() << expected.state_to_string(false) << "'" <<
+                          " But found\n'" << parsed_ts.toString() << parsed_ts.state_to_string(false) << "'");
+   }
+
+   {
+      // Update nextTimeSlot, create calendar at 09:00 and increment time series.
+      std::string the_time = "09:00 12:00 01:00 # isValid:false nextTimeSlot/10:00 relativeDuration/00:00:00";
+      ecf::TimeSeries expected(TimeSlot(9,0),TimeSlot(12,0),TimeSlot(1,0),false);
+      expected.set_isValid(false);
+
+      Calendar calendar;
+      calendar.init(ptime(date(2008,10,8), hours(9) ), Calendar::REAL);
+      expected.requeue( calendar ); // this will reset isValid to true
+      expected.set_isValid(false);
+
+      std::vector<std::string> lineTokens;
+      Str::split(the_time,lineTokens);
+      size_t index = 0;
+      ecf::TimeSeries parsed_ts = TimeSeries::create(index,lineTokens,true);
+
+      BOOST_CHECK_MESSAGE(parsed_ts == expected,
+                          "Expected \n'" << expected.dump() << expected.state_to_string(false) << "'" <<
+                          " But found\n'" << parsed_ts.dump() << parsed_ts.state_to_string(false) << "'");
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestTimeSlot.cpp b/ecflow_4_0_7/ACore/test/TestTimeSlot.cpp
new file mode 100644
index 0000000..b155b76
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestTimeSlot.cpp
@@ -0,0 +1,109 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #29 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include "TimeSeries.hpp"
+#include "Calendar.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+using namespace boost;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_time_slot )
+{
+   cout << "ACore:: ...test_time_slot\n";
+
+   // test timeslot operator
+   {
+      TimeSlot x;
+      TimeSlot y;
+      BOOST_CHECK_MESSAGE( x.isNULL(),"Expected NULL");
+      BOOST_CHECK_MESSAGE( y.isNULL(),"Expected NULL");
+      BOOST_CHECK_MESSAGE( x == y,"Equality operator expected to succeed");
+      BOOST_CHECK_MESSAGE( !(x < y),"Less than operator expected to fail");
+      BOOST_CHECK_MESSAGE( !(x > y),"Greater than operator expected to fail");
+      BOOST_CHECK_MESSAGE( x <= y,"<= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( x >= y,">= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( y <= x,"<= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( y >= x,">= operator expected to succeed");
+
+      TimeSlot a(10,12);
+      TimeSlot b(10,12);
+      BOOST_CHECK_MESSAGE( !a.isNULL(),"Expected NOT NULL");
+      BOOST_CHECK_MESSAGE( !b.isNULL(),"Expected NOT NULL");
+      BOOST_CHECK_MESSAGE( a == b,"Equality operator expected to succeed");
+      BOOST_CHECK_MESSAGE( !(a < b),"Less than operator expected to fail");
+      BOOST_CHECK_MESSAGE( !(a > b),"Greater than operator expected to fail");
+      BOOST_CHECK_MESSAGE( a <= b,"<= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( a >= b,">= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( b <= a,"<= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( b >= a,">= operator expected to succeed");
+
+      TimeSlot c(0,0);
+      TimeSlot d(0,0);
+      BOOST_CHECK_MESSAGE( !c.isNULL(),"Expected NOT NULL");
+      BOOST_CHECK_MESSAGE( !d.isNULL(),"Expected NOT NULL");
+      BOOST_CHECK_MESSAGE( c == d,"Equality operator expected to succeed");
+      BOOST_CHECK_MESSAGE( !(c < d),"Less than operator expected to fail");
+      BOOST_CHECK_MESSAGE( !(c > d),"Greater than operator expected to fail");
+      BOOST_CHECK_MESSAGE( c <= d,"<= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( c >= d,">= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( d <= c,"<= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( d >= c,">= operator expected to succeed");
+
+      TimeSlot a1(10,1);
+      TimeSlot b1(10,12);
+      BOOST_CHECK_MESSAGE( !a1.isNULL(),"Expected NOT NULL");
+      BOOST_CHECK_MESSAGE( !b1.isNULL(),"Expected NOT NULL");
+      BOOST_CHECK_MESSAGE( a1 != b1,"Equality operator expected to fail");
+      BOOST_CHECK_MESSAGE( a1 < b1,"Less than operator expected to succeed");
+      BOOST_CHECK_MESSAGE( !(a1 > b1),"Greater than operator expected to fail");
+      BOOST_CHECK_MESSAGE( !(a1 >= b1),">= than operator expected to fail");
+      BOOST_CHECK_MESSAGE( b1 > a1,"Greater than operator expected to succeed");
+      BOOST_CHECK_MESSAGE( b1 >= a1,">= expected to succeed");
+
+      TimeSlot xx(10,1);
+      TimeSlot yy(23,12);
+      BOOST_CHECK_MESSAGE( xx != yy,"Equality operator expected to fail");
+      BOOST_CHECK_MESSAGE( xx < yy,"Less than operator expected to succeed");
+      BOOST_CHECK_MESSAGE( xx <= yy,"<= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( yy > xx,"Greater than operator expected to succeed");
+      BOOST_CHECK_MESSAGE( yy >= xx,">= operator expected to succeed");
+      BOOST_CHECK_MESSAGE( !(xx > yy),"Greater than operator expected to fail");
+      BOOST_CHECK_MESSAGE( !(xx >= yy),">= operator expected to fail");
+
+      TimeSlot x1(11,0);
+      TimeSlot y1(10,0);
+      BOOST_CHECK_MESSAGE( x1 != y1,"Equality operator expected to fail");
+      BOOST_CHECK_MESSAGE( !(x1 < y1),"Less than operator expected to fail");
+      BOOST_CHECK_MESSAGE( !(x1 <= y1),"<= operator expected to fail");
+      BOOST_CHECK_MESSAGE( x1 > y1,"Greater than operator expected to succced");
+      BOOST_CHECK_MESSAGE( x1 >= y1,">= operator expected to succced");
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestVersion.cpp b/ecflow_4_0_7/ACore/test/TestVersion.cpp
new file mode 100644
index 0000000..e412b4c
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestVersion.cpp
@@ -0,0 +1,85 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+#include "Version.hpp"
+#include "boost_archive.hpp"
+#include "File.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_version )
+{
+   std::string desc = Version::description();
+   BOOST_CHECK_MESSAGE(!desc.empty(),"Expected version");
+   cout << "ACore:: ...test_version:" << desc  << endl;
+}
+
+BOOST_AUTO_TEST_CASE( boost_serialisation_archive_version )
+{
+   cout << "ACore:: ...boost_serialisation_archive_version:  " << ecf::boost_archive::version()  << endl;
+   BOOST_REQUIRE_MESSAGE(ecf::boost_archive::version() != 0,"keep boost from complaining");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_version_against_VERSION_cmake )
+{
+   cout << "ACore:: ...test_version_against_VERSION_cmake" << endl;
+
+   // Open the file VERSION.cmake
+   std::string version_cmake_file = File::root_source_dir() + "/VERSION.cmake";
+   std::vector<std::string> lines;
+   BOOST_REQUIRE_MESSAGE(File::splitFileIntoLines(version_cmake_file,lines,true/* impore empty lines */),"Failed to open file " << version_cmake_file);
+   BOOST_REQUIRE_MESSAGE(!lines.empty(),"File " << version_cmake_file << " does not contain version info ??");
+
+   // Expecting lines like:
+   //   set( ECFLOW_RELEASE  "4" )
+   //   set( ECFLOW_MAJOR    "0" )
+   //   set( ECFLOW_MINOR    "4" )
+   //   set( ${PROJECT_NAME}_VERSION_STR  "${ECFLOW_RELEASE}.${ECFLOW_MAJOR}.${ECFLOW_MINOR}" )
+   // Compare against VERSION
+   std::string ecflow_release,ecflow_major,ecflow_minor;
+   for(size_t i =0; i < lines.size(); ++i) {
+      std::vector<std::string> tokens;
+      Str::split(lines[i],tokens);
+
+      // expecting third token to contain version data
+      if (lines[i].find("set( ECFLOW_RELEASE") != std::string::npos && tokens.size() >= 3) {
+         ecflow_release = tokens[2];
+         Str::removeQuotes(ecflow_release);
+      }
+      if (lines[i].find("set( ECFLOW_MAJOR") != std::string::npos && tokens.size() >= 3) {
+         ecflow_major = tokens[2];
+         Str::removeQuotes(ecflow_major);
+      }
+      if (lines[i].find("set( ECFLOW_MINOR") != std::string::npos && tokens.size() >= 3) {
+         ecflow_minor = tokens[2];
+         Str::removeQuotes(ecflow_minor);
+      }
+   }
+
+   std::string extracted_version = ecflow_release + "." + ecflow_major + "." + ecflow_minor;
+
+   // The if they don't match, we have failed to regenrate and check in ecflow_version.h
+   BOOST_REQUIRE_MESSAGE(Version::raw() == extracted_version,"\n  Expected " << extracted_version << " but found " << Version::raw() << ", Please regenerate file $WK/ACore/src/ecflow_version.h by calling 'sh -x $WK/cmake.sh debug'");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestVersioning.cpp b/ecflow_4_0_7/ACore/test/TestVersioning.cpp
new file mode 100644
index 0000000..e7ee912
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestVersioning.cpp
@@ -0,0 +1,68 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <fstream>
+#include <boost/test/unit_test.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/version.hpp>
+#include "boost/filesystem/operations.hpp"
+
+#include "TestVersioning.hpp"
+#include "Serialization.hpp"
+
+using namespace std;
+using namespace boost;
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+// This class will create a Class X. This is serialised.
+// This class is then reloaded, with different kinds of version changes, to base version 0;
+// Note: we simulate different release of class X, by using name spaces
+//       This is possible since the name space is not written.
+BOOST_AUTO_TEST_CASE( test_versioning )
+{
+   cout << "ACore:: ...test_versioning\n";
+   {
+      // write out version 0; This will be reloaded with different version of X
+      const version0::X t = version0::X(10);
+      ecf::save("version0",t);
+   }
+
+   {
+      // Version 1 adds a new data member: i.e min_
+      version_new_data_member::X t;
+      ecf::restore("version0",t);
+      BOOST_CHECK_MESSAGE(t == version_new_data_member::X(10,0),"Should be the same");
+   }
+
+   {
+      // Version 1 change data member name: from hour_ -> hours_:
+      // This required no change at all. Since serialisation relies on order.
+      version_change_dm_name::X t;
+      ecf::restore("version0",t);
+      BOOST_CHECK_MESSAGE(t == version_change_dm_name::X(10),"Should be the same");
+   }
+
+   {
+      // Version 1 change data member type: from int -> string :
+      version_change_dm_type::X t;
+      ecf::restore("version0",t);
+      BOOST_CHECK_MESSAGE(t == version_change_dm_type::X("10"),"Reading integer as string expected '10', but found string " << t.str());
+   }
+
+   // remove the generate file
+   boost::filesystem::remove("version0");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/TestVersioning.hpp b/ecflow_4_0_7/ACore/test/TestVersioning.hpp
new file mode 100644
index 0000000..182a4f9
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestVersioning.hpp
@@ -0,0 +1,97 @@
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/lexical_cast.hpp>
+#include <iostream>
+
+
+/// To simulate changing of data model over time, we will
+/// namespace's. The actual serialisation does not appears to
+/// persist the name space
+
+namespace version0 {
+class X {
+public:
+   X(int h = 0) : hour_(h) {}
+   bool operator==(const X& rhs) const { return hour_ == rhs.hour_; }
+private:
+   int hour_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int version) {
+      ar & hour_;
+   }
+};
+}
+
+namespace version_new_data_member {
+class X {
+public:
+   X(int h = 0, int m =0) : hour_(h),min_(m) {}
+   bool operator==(const X& rhs) const { return hour_ == rhs.hour_ && min_ == rhs.min_; }
+private:
+   int hour_;
+   int min_;
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int version) {
+      // When *loading* the version pertains to loaded version in the data
+      // When *saving* the version always pertains to the latest version
+      ar & hour_;
+      if (version > 0) ar & min_;
+   }
+};
+}
+BOOST_CLASS_VERSION(version_new_data_member::X, 1)
+
+namespace version_change_dm_name {
+class X {
+public:
+   X(int h = 0) : hours_(h) {}
+   bool operator==(const X& rhs) const { return hours_ == rhs.hours_; }
+private:
+   int hours_;
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int version) {
+      ar & hours_;
+   }
+};
+}
+BOOST_CLASS_VERSION(version_change_dm_name::X, 1)
+
+namespace version_change_dm_type {
+class X {
+public:
+   X(const std::string& h = "") : hour_(h) {}
+   bool operator==(const X& rhs) const { return hour_ == rhs.hour_; }
+   std::string str() const { return hour_; }
+private:
+   std::string hour_;
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int version) {
+      // When *loading* the version pertains to loaded version in the data
+      // When *saving* the version always pertains to the latest version
+      if (version == 0) {
+         // Change data member type: int(version0)--->string(version1)
+         int the_old_hour = 0;
+         ar & the_old_hour;
+         hour_ = boost::lexical_cast<std::string>(the_old_hour);
+      }
+      else {
+         ar & hour_;
+      }
+   }
+};
+}
+BOOST_CLASS_VERSION(version_change_dm_type::X, 1)
diff --git a/ecflow_4_0_7/ACore/test/TestWhiteListFile.cpp b/ecflow_4_0_7/ACore/test/TestWhiteListFile.cpp
new file mode 100644
index 0000000..ad7e5be
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/TestWhiteListFile.cpp
@@ -0,0 +1,148 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/archive/tmpdir.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/foreach.hpp>
+#include "boost/progress.hpp"
+
+#include <iostream>
+#include <fstream>
+
+#include "WhiteListFile.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+//#define DEBUG_ME 1
+
+BOOST_AUTO_TEST_SUITE( CoreTestSuite )
+
+void test_white_list_files(const std::string& directory, bool pass)
+{
+	fs::path full_path( fs::initial_path<fs::path>() );
+	full_path = fs::system_complete( fs::path( directory ) );
+
+	BOOST_CHECK(fs::exists( full_path ));
+	BOOST_CHECK(fs::is_directory( full_path ));
+
+	//std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
+	fs::directory_iterator end_iter;
+	for ( fs::directory_iterator dir_itr( full_path ); dir_itr != end_iter; ++dir_itr )
+	{
+		try
+		{
+         fs::path relPath(directory + "/" + dir_itr->path().filename().string());
+
+ 			// recurse down directories
+		    if ( fs::is_directory(dir_itr->status()) )  {
+		    	test_white_list_files(relPath.string(),pass);
+		    	continue;
+		    }
+
+#if DEBUG_ME
+			std::cout << "......Parsing file " << relPath.string() << "\n";
+#endif
+
+		    WhiteListFile theFile(relPath.string());
+
+		    std::map<std::string,bool> validUsers;
+			std::string errorMsg;
+
+			bool parsedOk = theFile.parse(validUsers, errorMsg);
+			if (pass) {
+				// Test expected to pass
+				BOOST_CHECK_MESSAGE(parsedOk,"Failed to parse file " << relPath << "\n" << errorMsg);
+ 			}
+			else {
+				// test expected to fail
+				BOOST_CHECK_MESSAGE(!parsedOk,"Parse expected to fail for " << relPath << "\n" << errorMsg);
+#if DEBUG_ME
+				cout << "\n" << errorMsg << "\n";
+#endif
+ 			}
+		}
+		catch ( const std::exception & ex )
+		{
+ 			std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
+		}
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_parsing_for_good_white_list_files )
+{
+	cout << "ACore:: ...test_parsing_for_good_white_list_files\n";
+
+   std::string path = File::test_data("ACore/test/data/goodWhiteListFiles","ACore");
+
+	// All the files in this directory are expected to pass
+	test_white_list_files(path, true);
+}
+
+BOOST_AUTO_TEST_CASE( test_parsing_for_bad_white_list_files )
+{
+	cout << "ACore:: ...test_parsing_for_bad_white_list_files\n";
+
+   std::string path = File::test_data("ACore/test/data/badWhiteListFiles","ACore");
+
+	// All the files in this directory are expected to fail
+	test_white_list_files(path, false);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_white_list )
+{
+	cout << "ACore:: ...test_white_list\n";
+
+   std::string path = File::test_data("ACore/test/data/goodWhiteListFiles/good1.lists","ACore");
+
+   WhiteListFile theFile(path);
+   std::map<std::string,bool> validUsers;
+	std::string errorMsg;
+ 	BOOST_CHECK_MESSAGE(theFile.parse(validUsers, errorMsg),"Failed to parse file " << path << "\n" << errorMsg);
+
+ 	// make sure we find all the users and the access right are correct
+// 	uid1    # a comment
+// 	uid2  # a comment
+// 	cog   # a comment
+//
+// 	#
+// 	# Read only uisers
+// 	#
+// 	-fred  # a comment
+// 	-bill # a comment
+// 	-jake # a comment
+	std::vector< std::pair<std::string,bool> > expected;
+	expected.push_back(std::make_pair(std::string("uid1"), true));
+	expected.push_back(std::make_pair(std::string("uid2"), true));
+	expected.push_back(std::make_pair(std::string("cog"),  true));
+	expected.push_back(std::make_pair(std::string("fred"), false));
+	expected.push_back(std::make_pair(std::string("bill"), false));
+	expected.push_back(std::make_pair(std::string("jake"), false));
+
+ 	BOOST_REQUIRE_MESSAGE(expected.size() == validUsers.size(), " expected " << expected.size() << " users but found " << validUsers.size() );
+ 	std::vector< std::pair<std::string,bool> >::const_iterator i;
+ 	for(i=expected.begin(); i!= expected.end(); ++i) {
+ 		std::map<std::string,bool>::const_iterator it = validUsers.find( (*i).first );
+	 	BOOST_REQUIRE_MESSAGE(it != validUsers.end(),"Failed to find user " << (*i).first);
+	 	BOOST_REQUIRE_MESSAGE((*it).second == (*i).second ,"For user " << (*i).first << " expected " <<  (*i).second << " but found " << (*it).second);
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad2.lists b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad2.lists
new file mode 100644
index 0000000..3eaf14a
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad2.lists
@@ -0,0 +1,9 @@
+#
+4.   #   version number is wrong
+
+#
+# These user have read and write access to the server
+#
+uid1    # a comment
+uid2  # a comment
+  
\ No newline at end of file
diff --git a/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad3.lists b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad3.lists
new file mode 100644
index 0000000..0964782
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad3.lists
@@ -0,0 +1,9 @@
+#
+2.10.14   #  valid version number should be greater than 4.4.5
+   
+#
+# These user have read and write access to the server
+#
+uid1    # a comment
+uid2  # a comment
+  
\ No newline at end of file
diff --git a/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad5.lists b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad5.lists
new file mode 100644
index 0000000..3268c01
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/bad5.lists
@@ -0,0 +1,9 @@
+# missing version number
+ 
+#
+# These user have read and write access to the server
+#
+uid1    # a comment
+uid2  # a comment
+cog   # a comment
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/badsms.lists b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/badsms.lists
new file mode 100644
index 0000000..06f1a5d
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/badWhiteListFiles/badsms.lists
@@ -0,0 +1,7 @@
+
+uid1
+uid2
+cog
+
+
+4.4.14   #  error version number should be at the start
\ No newline at end of file
diff --git a/ecflow_4_0_7/ACore/test/data/goodWhiteListFiles/good1.lists b/ecflow_4_0_7/ACore/test/data/goodWhiteListFiles/good1.lists
new file mode 100644
index 0000000..7451d5f
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/goodWhiteListFiles/good1.lists
@@ -0,0 +1,22 @@
+#
+4.4.14   #   comment
+ 
+#
+# These user have read and write access to the server
+#
+uid1    # a comment
+uid2  # a comment
+cog   # a comment
+
+#
+# Read only uisers
+# 
+-fred  # a comment
+-bill # a comment
+-jake # a comment
+
+
+# a comment
+# a comment
+# a comment
+# a comment
diff --git a/ecflow_4_0_7/ACore/test/data/goodWhiteListFiles/goodsms.lists b/ecflow_4_0_7/ACore/test/data/goodWhiteListFiles/goodsms.lists
new file mode 100644
index 0000000..c274d5b
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/goodWhiteListFiles/goodsms.lists
@@ -0,0 +1,7 @@
+
+4.4.14   # comment
+
+uid1
+uid2
+cog
+
diff --git a/ecflow_4_0_7/ACore/test/data/migration/calendar_v1.9 b/ecflow_4_0_7/ACore/test/data/migration/calendar_v1.9
new file mode 100644
index 0000000..7d322cc
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/migration/calendar_v1.9
@@ -0,0 +1 @@
+22 serialization::archive 10 0 0 0 0 8 20110210 0 0 0 23 59 0 0 8 20110210 0 23 59 0 0 0 0 0 0 0 0 8 20131128 0 17 49 43 0 8 20131128 0 17 49 43 0 0 0 1 0 0
diff --git a/ecflow_4_0_7/ACore/test/data/migration/timeseries_10_10_v1_9 b/ecflow_4_0_7/ACore/test/data/migration/timeseries_10_10_v1_9
new file mode 100644
index 0000000..19da4f8
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/migration/timeseries_10_10_v1_9
@@ -0,0 +1 @@
+22 serialization::archive 10 0 1 10 10 0 0 0 1 0 0 1 10 10 0 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ACore/test/data/migration/timeseries_default_constructor_v1.9 b/ecflow_4_0_7/ACore/test/data/migration/timeseries_default_constructor_v1.9
new file mode 100644
index 0000000..4d69f20
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/migration/timeseries_default_constructor_v1.9
@@ -0,0 +1 @@
+22 serialization::archive 10 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ACore/test/data/migration/timeslot_1_1_v1_9 b/ecflow_4_0_7/ACore/test/data/migration/timeslot_1_1_v1_9
new file mode 100644
index 0000000..f747a06
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/migration/timeslot_1_1_v1_9
@@ -0,0 +1 @@
+22 serialization::archive 10 1 1 0
diff --git a/ecflow_4_0_7/ACore/test/data/migration/timeslot_99_59_v1_9 b/ecflow_4_0_7/ACore/test/data/migration/timeslot_99_59_v1_9
new file mode 100644
index 0000000..d05b04d
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/migration/timeslot_99_59_v1_9
@@ -0,0 +1 @@
+22 serialization::archive 10 99 59 0
diff --git a/ecflow_4_0_7/ACore/test/data/migration/timeslot_default_constructor_v1.9 b/ecflow_4_0_7/ACore/test/data/migration/timeslot_default_constructor_v1.9
new file mode 100644
index 0000000..6d857dd
--- /dev/null
+++ b/ecflow_4_0_7/ACore/test/data/migration/timeslot_default_constructor_v1.9
@@ -0,0 +1 @@
+22 serialization::archive 10 0 0 1
diff --git a/ecflow_4_0_7/ANattr/CMakeLists.txt b/ecflow_4_0_7/ANattr/CMakeLists.txt
new file mode 100644
index 0000000..e439868
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Note:
+# If new src or test cpp files are added make sure you touch this file
+#
+file( GLOB srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp" )
+
+ecbuild_add_library( TARGET   nodeattr
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     LIBS     core  
+                     INCLUDES src
+                              ../ACore/src 
+                    )
+
+file( GLOB test_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "test/*.cpp" )
+
+ecbuild_add_test( TARGET       u_anattr
+                  BOOST
+                  SOURCES      ${test_srcs}
+                  LIBS         nodeattr
+                  TEST_DEPENDS u_acore
+                 )
diff --git a/ecflow_4_0_7/ANattr/jamfile.jam b/ecflow_4_0_7/ANattr/jamfile.jam
new file mode 100644
index 0000000..82d90bf
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/jamfile.jam
@@ -0,0 +1,44 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Node attribute project
+#
+project theNodeAttr ;
+
+use-project theCore : ../ACore ;
+
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+#
+lib nodeattr : [ glob src/*.cpp ]
+         : <link>static
+           <variant>debug:<define>DEBUG
+           <use>/theCore//core
+           <use>/site-config//boost_system
+           <use>/site-config//boost_serialization
+           <use>/site-config//boost_filesystem
+           <use>/site-config//boost_datetime
+           <use>/site-config//boost_test
+         :
+         : <include>../ANattr/src         
+         ;
+
+#
+# boost_datetime is only required for formatting. i.e to call to_simple_string
+#  cerr <<  to_simple_string(calendar.suiteTime()) << "\n";
+#
+exe u_anattr : [ glob test/*.cpp ]
+           /theCore//core
+           nodeattr
+           /site-config//boost_system
+           /site-config//boost_filesystem
+           /site-config//boost_serialization
+           /site-config//boost_datetime
+           /site-config//boost_test
+         :  <variant>debug:<define>DEBUG
+	     ;
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANattr/src/AutoCancelAttr.cpp b/ecflow_4_0_7/ANattr/src/AutoCancelAttr.cpp
new file mode 100644
index 0000000..b065dc6
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/AutoCancelAttr.cpp
@@ -0,0 +1,103 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <sstream>
+
+#include "AutoCancelAttr.hpp"
+#include "Calendar.hpp"
+#include "Indentor.hpp"
+#include "Log.hpp"
+
+#ifdef DEBUG
+#include <boost/date_time/posix_time/time_formatters.hpp>
+#endif
+
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace ecf {
+
+std::ostream& AutoCancelAttr::print(std::ostream& os) const
+{
+	Indentor in;
+	Indentor::indent(os) << "autocancel ";
+	if (days_) {
+		os << timeStruct_.hour()/24 << "\n";
+		return os;
+	}
+
+ 	if (relative_)  os << "+";
+	timeStruct_.print(os);
+	os << "\n";
+	return os;
+}
+
+std::string AutoCancelAttr::toString() const
+{
+	std::stringstream ss;
+	ss << "autocancel ";
+	if (days_) {
+		ss << timeStruct_.hour()/24;
+		return ss.str();
+	}
+
+ 	if (relative_)  ss << "+";
+ 	ss << timeStruct_.toString();
+ 	return ss.str();
+}
+
+
+bool AutoCancelAttr::operator==(const AutoCancelAttr& rhs) const
+{
+	if (relative_ != rhs.relative_) return false;
+	if (days_ != rhs.days_) return false;
+ 	return timeStruct_.operator==(rhs.timeStruct_);
+}
+
+bool AutoCancelAttr::isFree(const ecf::Calendar& calendar,const boost::posix_time::time_duration& suiteDurationAtComplete) const
+{
+	//                                                               suiteTime()
+	//  suiteDurationAtComplete        autocancel time               calendar duration
+	//        |                             |                             |
+	//        V                             V                             V
+	// ----------------------------------------------------------------------------------> time
+	//        ^                                                           ^
+	//        |--------elapsed time---------------------------------------|
+	//
+	//
+
+	if ( relative_ ) {
+		time_duration timeElapsedAfterComplete = calendar.duration() - suiteDurationAtComplete;
+		LOG_ASSERT(!timeElapsedAfterComplete.is_negative(),"should always be positive or some things gone wrong");
+		if (timeElapsedAfterComplete >= timeStruct_.duration()) {
+			return true;
+		}
+	}
+	else {
+		// real time
+//#ifdef DEBUG
+//		cout << "real time timeStruct_(" << to_simple_string(timeStruct_.duration())
+//		     << ") calendar.suiteTime().time_of_day(" << to_simple_string(calendar.suiteTime().time_of_day()) << ")\n";
+//#endif
+		if (calendar.suiteTime().time_of_day() >= timeStruct_.duration()) {
+			return true;
+		}
+	}
+
+	return false;
+}
+
+}
diff --git a/ecflow_4_0_7/ANattr/src/AutoCancelAttr.hpp b/ecflow_4_0_7/ANattr/src/AutoCancelAttr.hpp
new file mode 100644
index 0000000..2102e5d
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/AutoCancelAttr.hpp
@@ -0,0 +1,59 @@
+#ifndef AUTOCANCELATTR_HPP_
+#define AUTOCANCELATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "TimeSlot.hpp"
+
+namespace ecf { class Calendar;} // forward declare class
+
+namespace ecf {
+
+// Use compiler ,  destructor, assignment, copy constructor
+class AutoCancelAttr  {
+public:
+	AutoCancelAttr() : relative_(true),days_(false) {}
+	AutoCancelAttr(int hour, int minute, bool relative ) : timeStruct_(hour, minute), relative_(relative), days_(false) {}
+ 	AutoCancelAttr(const TimeSlot& ts,   bool relative ) : timeStruct_(ts),           relative_(relative), days_(false) {}
+ 	AutoCancelAttr(int days) : timeStruct_( TimeSlot(days*24,0) ), relative_(true), days_(true) {}
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const AutoCancelAttr& rhs) const;
+	bool isFree(const ecf::Calendar&, const boost::posix_time::time_duration& suiteDurationAtComplete) const;
+
+	std::string toString() const;
+
+	const TimeSlot& time() const { return timeStruct_;}
+	bool relative() const { return relative_; }
+	bool days() const { return days_; }
+
+private:
+ 	TimeSlot timeStruct_;
+ 	bool relative_;
+ 	bool days_;
+
+	friend class boost::serialization::access;
+    template<class Archive>
+    void serialize(Archive & ar, const unsigned int /*version*/)
+    {
+        ar & timeStruct_;
+        ar & relative_;
+        ar & days_;
+    }
+};
+
+}
+#endif
+
diff --git a/ecflow_4_0_7/ANattr/src/ClockAttr.cpp b/ecflow_4_0_7/ANattr/src/ClockAttr.cpp
new file mode 100644
index 0000000..47970ea
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/ClockAttr.cpp
@@ -0,0 +1,169 @@
+//============================================================================
+// Name        : NodeTree.cpp
+// Author      : Avi
+// Revision    : $Revision: #21 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "ClockAttr.hpp"
+#include "DateAttr.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "Ecf.hpp"
+
+#include <boost/foreach.hpp>
+#include <assert.h>
+#include <sstream>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+//==========================================================================================
+
+ClockAttr::ClockAttr(const boost::posix_time::ptime& time, bool hybrid,bool positiveGain)
+: hybrid_(hybrid), positiveGain_(positiveGain), startStopWithServer_(false),
+  gain_(0), day_(0),month_(0),year_(0),
+  state_change_no_(Ecf::incr_state_change_no())
+{
+	boost::gregorian::date theDate = time.date();
+	day_ = theDate.day();
+	month_ = theDate.month();
+	year_ = theDate.year();
+
+	tm t = to_tm(time);
+	gain_ = t.tm_hour *3600 + t.tm_min*60 + t.tm_sec;
+}
+
+ClockAttr::ClockAttr(int day, int month, int year, bool hybrid )
+: hybrid_(hybrid), positiveGain_(false), startStopWithServer_(false),
+  gain_(0), day_(day),month_(month),year_(year),
+  state_change_no_(Ecf::incr_state_change_no())
+{
+	// Will throw std::out_of_range exception
+	DateAttr::checkDate(day,month,year,false /* for calendars we don't allow wild carding */);
+}
+
+ClockAttr::ClockAttr(bool hybrid)
+: hybrid_(hybrid), positiveGain_(false), startStopWithServer_(false),
+  gain_(0), day_(0),month_(0),year_(0),
+  state_change_no_(Ecf::incr_state_change_no()) {}
+
+std::ostream& ClockAttr::print(std::ostream& os) const
+{
+	Indentor in;
+	Indentor::indent(os) << toString() << "\n";
+	return os;
+}
+
+std::string ClockAttr::toString() const
+{
+	std::stringstream ss;
+	ss << "clock ";
+	if (hybrid_) ss << "hybrid ";
+	else         ss << "real ";
+
+	if (day_ != 0) ss << day_ << "." << month_ << "." << year_ << " ";
+
+	if (gain_ != 0) {
+		if (positiveGain_) ss << "+";
+		ss << gain_;
+	}
+
+	if ( startStopWithServer_)  ss << " -s";
+
+ 	return ss.str();
+}
+
+bool ClockAttr::operator==(const ClockAttr& rhs) const
+{
+	if (hybrid_ != rhs.hybrid_)                            return false;
+	if (positiveGain_ != rhs.positiveGain_)                return false;
+	if (startStopWithServer_ != rhs.startStopWithServer_)  return false;
+
+	if (day_ != rhs.day_)     return false;
+	if (month_ != rhs.month_) return false;
+	if (year_ != rhs.year_)   return false;
+
+	if (gain_ != rhs.gain_) return false;
+
+	return true;
+}
+
+void ClockAttr::date(int day, int month, int year)
+{
+	// Will throw std::out_of_range exception
+	DateAttr::checkDate(day,month,year,false /* for calendars we don't allow wild carding */);
+	day_ = day;
+	month_ = month;
+	year_ = year;
+	state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void ClockAttr::set_gain(int hour,int min,bool positiveGain)
+{
+	positiveGain_ = positiveGain;
+	gain_ = (hour * 3600) + min *60;
+   state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void ClockAttr::set_gain_in_seconds(long theGain,bool positiveGain)
+{
+	positiveGain_ = positiveGain;
+	gain_ =  theGain;
+   state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void ClockAttr::startStopWithServer(bool f) {
+   startStopWithServer_ = f;
+   state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void ClockAttr::hybrid( bool f ) {
+   hybrid_ = f;
+   state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void ClockAttr::sync() {
+   // When begin_calendar() is called we will sync with computer clock.
+   gain_ = 0;
+   day_ = 0;
+   month_ = 0 ;
+   year_ = 0;
+   state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void ClockAttr::init_calendar(ecf::Calendar& calendar)
+{
+	Calendar::Clock_t clockType = (hybrid_) ? Calendar::HYBRID : Calendar::REAL;
+   calendar.init(clockType, startStopWithServer_);
+}
+
+void ClockAttr::begin_calendar(ecf::Calendar& calendar)
+{
+   using namespace boost::posix_time;
+   using namespace boost::gregorian;
+
+   if (day_ != 0) {
+      // Use the date given. ie we start from midnight on the given day + gain.
+      boost::gregorian::date theDate(year_,month_,day_);
+      ptime the_time(theDate, seconds(gain_));
+      calendar.begin(the_time);
+   }
+   else {
+      // Get the local time, second level resolution, based on the time zone settings of the computer.
+      ptime the_time(Calendar::second_clock_time());
+      the_time += seconds(gain_);
+      calendar.begin(the_time);
+   }
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/ClockAttr.hpp b/ecflow_4_0_7/ANattr/src/ClockAttr.hpp
new file mode 100644
index 0000000..0be3454
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/ClockAttr.hpp
@@ -0,0 +1,100 @@
+#ifndef CLOCKATTR_HPP_
+#define CLOCKATTR_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <ostream>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/serialization/serialization.hpp>
+
+namespace ecf { class Calendar;} // forward declare class that is in a namesapce
+
+/// The clock attribute is defined on the suite ONLY
+/// Use default copy constructor and assignment operator, destructor
+/// The clock attribute is used to initialise the calendar object
+/// **********************************************************************
+/// In the OLD sms the date is actually used as a gain factor(well at least
+/// according to the user/reference manual), in the ec-flow
+/// a date, is a date. i.e. it allows us to start a suite in the past.
+///
+/// The Constructor will update the State change number, since it can be added
+/// by the AlterCmd. in the Client Context, state change number is not incremented
+/// ************************************************************************
+///
+class ClockAttr {
+public:
+	/// The following constructor is used for test only. It allows us to
+	/// create a clock attribute initialised with given date and time
+	ClockAttr(const boost::posix_time::ptime&, bool hybrid = false, bool positiveGain = true);
+	ClockAttr(int day, int month, int year, bool hybrid = false );
+	ClockAttr(bool hybrid = false);
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const ClockAttr& rhs) const;
+
+	void date(int day, int month, int year);
+	void set_gain(int hour,int min,bool positiveGain = true);
+	void set_gain_in_seconds(long theGain,bool positiveGain = true);
+
+	void startStopWithServer(bool f);
+	bool startStopWithServer() const { return startStopWithServer_; }
+ 	void hybrid( bool f );
+
+ 	// clear local attributes so, than when we re-queue suite, we sync with computer clock
+ 	void sync();
+
+   void init_calendar(ecf::Calendar&);
+   void begin_calendar(ecf::Calendar&);
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+	// access
+	int day() const { return day_; }
+	int month() const { return month_; }
+	int year() const { return year_; }
+ 	long gain() const { return gain_;}
+ 	bool positive_gain() const { return positiveGain_;}
+ 	bool hybrid() const { return hybrid_;}
+ 	bool is_virtual() const { return startStopWithServer_;}
+	std::string toString() const;
+
+private:
+	bool hybrid_;
+	bool positiveGain_;
+	bool startStopWithServer_;  // see Calendar.hpp for more details
+	long gain_;                 // in seconds
+	int day_;
+	int month_;
+	int year_;
+
+	unsigned int   state_change_no_;  // *not* persisted, only used on server side
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/)
+	{
+	   ar & hybrid_;
+	   ar & positiveGain_;
+	   ar & startStopWithServer_;
+	   ar & gain_;
+	   ar & day_;
+	   ar & month_;
+	   ar & year_;
+	}
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/CronAttr.cpp b/ecflow_4_0_7/ANattr/src/CronAttr.cpp
new file mode 100644
index 0000000..e520d38
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/CronAttr.cpp
@@ -0,0 +1,724 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #59 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <sstream>
+
+#include <boost/foreach.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/tokenizer.hpp>
+#include <boost/token_functions.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "CronAttr.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "PrintStyle.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Log.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+//#define DEBUG_CRON_ATTR 1
+//#define DEBUG_CRON_PARSING 1
+
+namespace ecf {
+
+CronAttr::CronAttr() :  makeFree_(false),state_change_no_(0) {}
+
+void CronAttr::addWeekDays( const std::vector<int>& w)
+{
+	weekDays_ = w;
+	BOOST_FOREACH(int day,weekDays_) {
+		if (day < 0 || day > 6) {
+			std::stringstream ss; ss << "Invalid range for day(" << day << ") of the week expected range is 0==Sun to 6==Sat";
+ 			throw std::out_of_range(ss.str());
+ 		}
+ 	}
+}
+void CronAttr::addDaysOfMonth( const std::vector<int>& d)
+{
+	daysOfMonth_ = d;
+	BOOST_FOREACH(int day_of_month,daysOfMonth_) {
+		if (day_of_month < 1 || day_of_month > 31) {
+			std::stringstream ss; ss << "Invalid range for day of month(" << day_of_month << ") expected range is  1-31";
+ 			throw std::out_of_range(ss.str());
+ 		}
+ 	}
+}
+
+void CronAttr::addMonths( const std::vector<int>& m)
+{
+	months_ = m;
+	BOOST_FOREACH(int month,months_) {
+		if (month < 1 || month > 12) {
+			std::stringstream ss; ss << "Invalid range for month(" << month << ")  expected range is 1==Jan to 12==Dec";
+ 			throw std::out_of_range(ss.str());
+  		}
+ 	}
+}
+
+std::ostream& CronAttr::print(std::ostream& os) const
+{
+	Indentor in;
+	Indentor::indent(os) << toString();
+	if (!PrintStyle::defsStyle()) {
+      os << timeSeries_.state_to_string(makeFree_);
+	}
+	os << "\n";
+	return os;
+}
+
+std::string CronAttr::toString() const
+{
+	std::stringstream ss;
+	ss << "cron ";
+	if (!weekDays_.empty()) {
+		ss << "-w ";
+		for(size_t i=0; i<weekDays_.size();++i) {
+			ss << weekDays_[i];
+			if (i !=weekDays_.size()-1) ss << ",";
+		}
+		ss << " ";
+	}
+	if (!daysOfMonth_.empty()) {
+		ss << "-d ";
+		for(size_t i=0; i<daysOfMonth_.size();++i) {
+			ss << daysOfMonth_[i];
+			if (i !=daysOfMonth_.size()-1) ss << ",";
+		}
+		ss << " ";
+	}
+	if (!months_.empty()) {
+		ss << "-m ";
+		for(size_t i=0; i<months_.size();++i) {
+			ss << months_[i];
+			if (i !=months_.size()-1) ss << ",";
+		}
+		ss << " ";
+	}
+
+	ss << timeSeries_.toString(); // no new line added, up to caller
+ 	return ss.str();
+}
+
+std::string CronAttr::dump() const
+{
+	std::stringstream ss; ss << toString();
+ 	if (makeFree_) ss << " (free)";
+	else           ss << " (holding)";
+ 	return ss.str();
+}
+
+bool CronAttr::operator==(const CronAttr& rhs) const
+{
+	if (makeFree_ != rhs.makeFree_) {
+		return false;
+	}
+
+	if (weekDays_ != rhs.weekDays_) return false;
+	if (daysOfMonth_ != rhs.daysOfMonth_) return false;
+	if (months_ != rhs.months_) return false;
+	return timeSeries_.operator==(rhs.timeSeries_);
+}
+bool CronAttr::structureEquals(const CronAttr& rhs) const
+{
+	if (weekDays_ != rhs.weekDays_) return false;
+	if (daysOfMonth_ != rhs.daysOfMonth_) return false;
+	if (months_ != rhs.months_) return false;
+   return timeSeries_.structureEquals(rhs.timeSeries_);
+}
+
+void CronAttr::calendarChanged( const ecf::Calendar& c )
+{
+   if ( makeFree_ ) {
+      return;
+   }
+
+   // This assumes that calendarChanged will set TimeSeries::isValid = true, at day change
+   if (timeSeries_.calendarChanged(c)) {
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+
+   // Once a cron is free, it stays free until re-queue
+   if (isFree(c)) {
+      setFree();
+   }
+   // A cron is always re-queable, hence we use isFree to control when it can actually run.
+}
+
+void CronAttr::resetRelativeDuration()
+{
+   if (timeSeries_.resetRelativeDuration()) {
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+}
+
+void CronAttr::setFree() {
+	makeFree_ = true;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "CronAttr::setFree()\n";
+#endif
+}
+
+void CronAttr::clearFree() {
+	makeFree_ = false;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "CronAttr::clearFree()\n";
+#endif
+}
+
+void CronAttr::miss_next_time_slot()
+{
+   // A cron attribute with a single time slot is repeated indefinitely hence always re-queues
+   timeSeries_.miss_next_time_slot();
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+// **************************************************************************************
+// FOR DEBUG THIS IS THE MAIN FUNCTION, AS THIS DECIDES WHETHER WE CONTINE OR STOP
+// **************************************************************************************
+bool CronAttr::checkForRequeue( const ecf::Calendar& calendar) const
+{
+	// checkForRequeue is called when a task/family has reach the complete state
+	// This simple checks if node should be put in re-queued state
+   // A cron is always re-queable
+
+   // Hence: In order to use this it should be used in conjunction with a
+   // with a parent node that has complete  expression, (& maybe a dummy task)
+   // This will allow its use with a parent repeat somewhere in the hierarchy
+   return true;
+}
+
+bool CronAttr::validForHybrid(const ecf::Calendar& calendar) const
+{
+	if (timeSeries_.hasIncrement()) {
+		if (!months_.empty() )         return false; // relies on day change
+		if (!daysOfMonth_.empty() )    return false; // relies on day change
+		if (!weekDays_.empty()  )  {
+			if ( weekDays_.size() != 1)  return false; // relies on day change
+
+   	 	  	return ( weekDays_[0] == calendar.day_of_week() );
+		}
+
+		// cron 10:00 20:00 01:00  // valid for hybrid ?
+		return true;
+	}
+
+	// A time series that does not have an increment runs indefinitely and hence relies on day change
+	// cron 23:00
+	return false;
+}
+
+bool CronAttr::why(const ecf::Calendar& c, std::string& theReasonWhy) const
+{
+   // This will logically AND all the times
+	if (isFree(c)) return false;
+
+	// We are here because:
+	//  1/ Not on a valid time slot in the time series
+	//  *OR*
+	//  2/ Logical *AND* of day of week, day of month, or month returned false
+	theReasonWhy += "is cron dependent";
+
+	// Lets say that the time series was NOT free.
+	// First check if week day, day of month, month, matches
+ 	if ( is_day_of_week_day_of_month_and_month_free(c)) {
+
+ 	   if (timeSeries_.is_valid()) {
+
+ 	      // This can apply to single and series
+ 	      boost::posix_time::time_duration calendar_time = timeSeries_.duration(c);
+ 	      if (calendar_time < timeSeries_.start().duration()) {
+ 	         timeSeries_.why(c, theReasonWhy);
+ 	         return true;
+ 	      }
+
+ 	      // calendar_time >= timeSeries_.start().duration()
+ 	      if (timeSeries_.hasIncrement()) {
+ 	         if (calendar_time < timeSeries_.finish().duration()) {
+ 	            timeSeries_.why(c, theReasonWhy);
+ 	            return true;
+ 	         }
+ 	      }
+ 	   }
+ 	   // calendar_time >= timeSeries_.start().duration() && calendar_time >= timeSeries_.finish().duration()
+  		// past the end of time slot, find next valid date
+  	}
+
+   // take into account, user can use run/force complete to miss time slots
+   bool do_a_requeue = timeSeries_.requeueable(c);
+   if (do_a_requeue && weekDays_.empty() && daysOfMonth_.empty() && months_.empty()) {
+      TimeSlot the_next_time_slot = timeSeries_.compute_next_time_slot(c);
+      if (the_next_time_slot.isNULL() ) {
+         theReasonWhy += " ( *re-queue* to run at this time ";
+      }
+      else {
+         theReasonWhy += " ( *re-queue* to run at ";
+         theReasonWhy += the_next_time_slot.toString() ;
+      }
+
+      theReasonWhy += ", otherwise next run is at ";
+   }
+   else {
+      theReasonWhy += " ( next run is at ";
+   }
+
+  	// Find the *NEXT* date that matches, and use the first time slot
+ 	boost::gregorian::date the_next_date = next_date(c);
+ 	theReasonWhy += timeSeries_.start().toString();
+ 	theReasonWhy += " ";
+ 	theReasonWhy += to_simple_string( the_next_date );
+
+ 	std::stringstream ss;
+   TimeSlot currentTime = TimeSlot(timeSeries_.duration(c));
+   ss << ", current time ";
+   if (timeSeries_.relative()) ss << "+";
+   ss << currentTime.toString() << " " << to_simple_string(c.date()) << " )";
+   theReasonWhy += ss.str();
+	return true;
+}
+
+void CronAttr::reset(const ecf::Calendar& c)
+{
+	clearFree();
+ 	timeSeries_.reset(c);
+}
+
+void CronAttr::requeue(const ecf::Calendar& c, bool reset_next_time_slot)
+{
+   clearFree();
+   timeSeries_.requeue(c,reset_next_time_slot);
+}
+
+bool CronAttr::isFree(const ecf::Calendar& c) const
+{
+	// The FreeDepCmd can be used to free the crons,
+	if (makeFree_) {
+		return true;
+	}
+
+	if (!timeSeries_.isFree(c))  return false;
+
+	// Ok time series is Free
+
+	// ********************************************************************
+	// IMPORTANT: when we have multiple week days, days of month and months
+	// Then we are *ONLY* free, if *ALL* are free, i.e we need AND behaviour
+	// ********************************************************************
+	return is_day_of_week_day_of_month_and_month_free(c);
+}
+
+
+bool CronAttr::is_day_of_week_day_of_month_and_month_free( const ecf::Calendar& c) const
+{
+   bool the_week_day_matches = weekDays_.empty();         // week day matches if no week days
+   bool the_day_of_month_matches = daysOfMonth_.empty();  // day of month if no days of month
+   bool the_month_matches = months_.empty();              // month matches if no months
+
+   if ( !weekDays_.empty())    the_week_day_matches     = week_day_matches(c.day_of_week());
+   if ( !daysOfMonth_.empty()) the_day_of_month_matches = day_of_month_matches(c.day_of_month());
+   if ( !months_.empty()  )    the_month_matches        = month_matches(c.month());
+
+   return ( the_week_day_matches && the_day_of_month_matches && the_month_matches) ;
+}
+
+bool CronAttr::week_day_matches( int theDayOfWeek ) const
+{
+ 	BOOST_FOREACH(int theWeekDay, weekDays_) {
+ 		if ( theDayOfWeek == theWeekDay)  return true;
+ 	}
+ 	return false;
+}
+
+bool CronAttr::day_of_month_matches(int theDayOfMonth) const
+{
+	BOOST_FOREACH(int dayOfMonth, daysOfMonth_) {
+	 	if ( theDayOfMonth == dayOfMonth)  return true;
+	}
+	return false;
+}
+
+bool CronAttr::month_matches(int theMonth) const
+{
+ 	 BOOST_FOREACH(int month, months_) {
+	 	if ( theMonth == month) return true;
+	 }
+ 	 return false;
+}
+
+//------------------------------------------------------------------
+//int CronAttr::max_month() const {
+//	int max = -1;
+//	BOOST_FOREACH(int month, months_) {
+//		max = std::max(month,max);
+//	}
+//	return max;
+//}
+
+//int CronAttr::max_day_of_month() const
+//{
+//	int max = -1;
+//	BOOST_FOREACH(int dayOfMonth, daysOfMonth_) {
+//		max = std::max(dayOfMonth,max);
+//	}
+//	return max;
+//}
+
+//int CronAttr::max_day_of_week() const
+//{
+//	int max = -1;
+// 	BOOST_FOREACH(int theWeekDay, weekDays_) {
+//		max = std::max(theWeekDay,max);
+//  	}
+//	return max;
+//}
+
+//-------------------------------------------------------------------------------
+//int CronAttr::min_month() const{
+//	int min = std::numeric_limits<int>::max();
+//	BOOST_FOREACH(int month, months_) {
+//		min = std::min(month,min);
+//	}
+//	return min;
+//}
+
+//int CronAttr::min_day_of_month() const
+//{
+//	int min = std::numeric_limits<int>::max();
+// 	BOOST_FOREACH(int dayOfMonth, daysOfMonth_) {
+// 		min = std::min(dayOfMonth,min);
+//	}
+//	return min;
+//}
+//
+//int CronAttr::min_day_of_week() const
+//{
+//	int min = std::numeric_limits<int>::max();
+//  	BOOST_FOREACH(int theWeekDay, weekDays_) {
+// 		min = std::min(theWeekDay,min);
+//  	}
+//	return min;
+//}
+//------------------------------------------------------------
+
+
+bool CronAttr::checkInvariants(std::string& errormsg) const
+{
+	return  timeSeries_.checkInvariants(errormsg);
+}
+
+
+//--------------------------------------------------------------
+
+boost::gregorian::date CronAttr::last_day_of_month(const ecf::Calendar& calendar) const
+{
+	boost::gregorian::date todays_date = calendar.date();
+	boost::gregorian::date lastdayOfMonth = todays_date.end_of_month();
+	boost::gregorian::date_duration one_day(1);
+
+//	cout << "CronAttr::last_day_of_month  " << calendar.toString() << " \n";
+
+	boost::gregorian::date max_date(neg_infin);
+ 	while ( todays_date <= lastdayOfMonth ) {
+
+		// deal with case where we have:
+		//  	cron -w 0,1 -m 5,6,7,8
+		// Find the last Sunday/Monday for *THIS* month
+		for (size_t i = 0; i < weekDays_.size(); ++i) {
+			if ( todays_date.day_of_week().as_number() == weekDays_[i] ) {
+//				cout << "CronAttr::last_day_of_month  ( todays_date.day_of_week().as_number() == weekDays_[i] ) " << weekDays_[i] << "\n";
+				if ( todays_date > max_date ) {
+					max_date = todays_date;
+//					cout << "CronAttr::last_day_of_month  max_date =  " << to_simple_string(max_date) << "\n";
+				}
+
+				// The day of week MAY NOT MATCH the day of month
+				// deal with case where we have:
+				//  	cron -w 0,1 -d 14,15,16
+				// Find the last date for *THIS* month
+				for (size_t d = 0; d < daysOfMonth_.size(); ++d) {
+					if ( todays_date.day() == daysOfMonth_[d] ) {
+//						cout << "CronAttr::last_day_of_month **( todays_date.day() == daysOfMonth_[d] ) " << daysOfMonth_[d] << "\n";
+						if ( todays_date > max_date ) {
+							max_date = todays_date;
+//							cout << "CronAttr::last_day_of_month  max_date =  " << to_simple_string(max_date) << "\n";
+						}
+					}
+				}
+			}
+		}
+
+		// deal with case where we have:
+		//  	cron -d 14,15,16 -m 5,6,7,8
+		// Find the last date for *THIS* month
+		for (size_t d = 0; d < daysOfMonth_.size(); ++d) {
+			if ( todays_date.day() == daysOfMonth_[d] ) {
+//				cout << "CronAttr::last_day_of_month ( todays_date.day() == daysOfMonth_[d] ) " << daysOfMonth_[d] << "\n";
+				if ( todays_date > max_date ) {
+					max_date = todays_date;
+//					cout << "CronAttr::last_day_of_month  max_date =  " << to_simple_string(max_date) << "\n";
+				}
+			}
+		}
+
+		todays_date += one_day;
+	}
+	return max_date;
+}
+
+boost::gregorian::date CronAttr::next_date(const ecf::Calendar& calendar) const
+{
+	// Find the next date that matches, day of week, day of year, and month
+	// that is greater than todays date. This *ASSUMES* day of week, day of month,
+	// and month is *ANDED* together
+
+ 	boost::gregorian::date_duration one_day(1);
+	boost::gregorian::date future_date = calendar.date();  // todays date
+	future_date += one_day;                                // add one day, so its in the future
+
+ 	while ( 1 ) {
+
+ 		bool week_day_matches = weekDays_.empty();         // week day matches if no week days
+ 		bool day_of_month_matches = daysOfMonth_.empty();  // day of month if no days of month
+ 		bool month_matches = months_.empty();              // month matches if no months
+
+		// deal with case where we have: cron -w 0,1
+ 		for (size_t i = 0; i < weekDays_.size(); ++i) {
+			if ( future_date.day_of_week().as_number() == weekDays_[i] ) {
+				week_day_matches = true;
+				break;
+			}
+		}
+
+ 		// deal with case where we have: cron -w 0,1 -d 14,15,16
+ 		for (size_t d = 0; d < daysOfMonth_.size(); ++d) {
+			if ( future_date.day() == daysOfMonth_[d] ) {
+				day_of_month_matches = true;
+				break;
+ 			}
+		}
+
+ 		// deal with case where we have: cron -w 0,1 -d 14,15,16 -m 8, 9
+ 		for (size_t m = 0; m < months_.size(); ++m) {
+			if ( future_date.month() == months_[m] ) {
+				month_matches = true;
+				break;
+  			}
+		}
+
+ 		// if it all matches, then return the future day
+ 		if ( week_day_matches && day_of_month_matches && month_matches) {
+ 			break; // return future_date, replaced with break to  keep HPUX compiler happy
+ 			       // otherwise it complains that return at the end of the function is
+ 			       // unreachable
+ 		}
+
+		future_date += one_day;
+	}
+ 	return future_date; // should never happen, i.e we can find future date that matches
+}
+
+
+//=========================================================================================================
+// code for parsing a cron:
+
+static bool isComment(const std::string& token)
+{
+	if (token.find("#") == std::string::npos) return false;
+	return true;
+}
+
+static bool isTimeSpec(const std::string& token)
+{
+	if (token.find(Str::COLON()) == std::string::npos) return false;
+	return true;
+}
+
+static bool isOption(const std::string& token)
+{
+	if (token.find("-w") != std::string::npos) return true;
+	if (token.find("-d") != std::string::npos) return true;
+	if (token.find("-m") != std::string::npos) return true;
+	return false;
+}
+
+static std::string nextToken( size_t& index, const std::vector<std::string >& lineTokens)
+{
+	assert(index < lineTokens.size());
+	index++;
+	if (index < lineTokens.size()) {
+#ifdef DEBUG_CRON_PARSING
+	 	cerr << "nextToken lineTokens[" << index << "] = " << lineTokens[index] << "\n";
+#endif
+		return lineTokens[index];
+	}
+#ifdef DEBUG_CRON_PARSING
+ 	cerr << "nextToken empty \n";
+#endif
+	return string();
+}
+
+std::vector<int> extractOption(
+                               size_t& index,
+                               const std::vector<std::string >& lineTokens,
+                               const std::string& option)
+{
+	// cron -w 0 -m 5,6,7,8 10:00 20:00 01:00
+	assert(index < lineTokens.size());
+
+	// Collate the list of integers, these may have been separated by spaces
+	// since we stop on option or time spec, the top level code should decrement index
+	std::string theIntList;
+	while ( index < lineTokens.size() && ( !isOption(lineTokens[index]) || !isTimeSpec(lineTokens[index]) )) {
+		string theNextToken = nextToken(index,lineTokens);
+		if (theNextToken.empty()) break;
+		if (isOption( theNextToken )) break;
+		if (isTimeSpec( theNextToken )) break;
+		theIntList +=  theNextToken;
+  	}
+#ifdef DEBUG_CRON_PARSING
+	cerr << "theIntList = " << theIntList << "\n";
+#endif
+
+	// should have 0,1,2,3
+	std::vector< int > theIntVec;
+	char_separator< char > sep( ",", 0, boost::drop_empty_tokens );
+	typedef boost::tokenizer< boost::char_separator< char > > tokenizer;
+	tokenizer theTokenizer( theIntList, sep );
+
+	for (tokenizer::iterator beg = theTokenizer.begin(); beg != theTokenizer.end(); ++beg) {
+		string theIntToken = *beg;
+		boost::algorithm::trim( theIntToken );
+		if ( theIntToken.empty() ) continue;
+
+		try {
+			int theInt = boost::lexical_cast< int >( theIntToken );
+ 			theIntVec.push_back( theInt );
+		}
+		catch ( boost::bad_lexical_cast& ) {
+			std::stringstream ss; ss << "Invalid cron option: " << option  ;
+			throw std::runtime_error( ss.str() );
+		}
+	}
+	return theIntVec;
+}
+
+void extractOption(CronAttr& cronAttr, size_t& index, const std::vector<std::string >& lineTokens)
+{
+	assert(index < lineTokens.size());
+	if (lineTokens[index] == "-w") {
+ 		cronAttr.addWeekDays( extractOption(index, lineTokens, "week days" ) );
+ 	}
+	else if (lineTokens[index] == "-d") {
+ 		cronAttr.addDaysOfMonth( extractOption(index, lineTokens, "Days of the month" ) );
+  	}
+	else if (lineTokens[index] == "-m") {
+ 		cronAttr.addMonths( extractOption(index, lineTokens,"Months" ) );
+  	}
+	else throw std::runtime_error( "extractOption: Invalid cron option :" + lineTokens[index] );
+}
+
+void CronAttr::parse( CronAttr& cronAttr, const std::vector<std::string>& lineTokens, size_t index, bool parse_state )
+{
+	// cron 23:00                 # run every day at 23:00
+	// cron 10:00 20:00 01:00     # run every hour between 10am and 8pm
+	// cron -w 0,1 10:00          # run every sunday and monday at 10am
+	// cron -d 10,11,12 12:00     # run 10th, 11th and 12th of each month at noon
+	// cron -m 1,2,3 12:00        # run on Jan,Feb and March every day at noon.
+	// cron -w 0 -m 5,6,7,8 10:00 20:00 01:00 # run every sunday, between May-Aug, every hour between 10am and 8pm
+
+   // make *sure* a time spec is specified
+   bool time_spec_specified = false;
+ 	while (index < lineTokens.size() ) {
+
+		std::string token = lineTokens[index];
+#ifdef DEBUG_CRON_PARSING
+		cerr << "CronAttr::doParse " << token << "\n";
+#endif
+		if (isOption(token)) {
+#ifdef DEBUG_CRON_PARSING
+			cerr << "CronAttr::doParse isOption \n";
+#endif
+ 			extractOption(cronAttr,index,lineTokens);
+			index--; // since we did a look ahead
+		}
+		else if (!time_spec_specified && isTimeSpec(token)) {
+#ifdef DEBUG_CRON_PARSING
+			cerr << "CronAttr::doParse isTimeSpec \n";
+#endif
+			// index is passed by *reference*, and used skip over time series
+			cronAttr.addTimeSeries(  TimeSeries::create(index,lineTokens, parse_state) );
+			time_spec_specified = true;
+			if (parse_state) {
+			   //  if index is on the comment, back track, so that we can add cron state( free)
+			   if (index < lineTokens.size() && lineTokens[index] == "#") {
+			      index--;
+			   }
+			}
+			else break; // need to read state after comment
+ 		}
+		else if (isComment(token)) {
+		   // cron -m 1,2,3 12:00        # free
+		   if (parse_state && index+1 < lineTokens.size()) {
+		      if ( lineTokens[index+1] == "free") {
+		         cronAttr.setFree();
+		      }
+		   }
+			break;
+		}
+		index++;
+	}
+
+ 	if (!time_spec_specified) {
+ 	   throw std::runtime_error( "Invalid cron, no time specified");
+ 	}
+
+#ifdef DEBUG_CRON_PARSING
+	cronAttr.print(cerr); cerr <<"\n";
+#endif
+}
+
+CronAttr CronAttr::create(const std::string& cronString)
+{
+	std::vector<std::string> lineTokens;
+	Str::split(cronString,lineTokens);
+
+	CronAttr theCronAttr;
+   if ( lineTokens.empty() ) {
+      return theCronAttr;
+   }
+
+   // adjust the index
+	size_t index = 0;
+	if ( lineTokens[0] == "cron") {
+		index = 1;
+	}
+
+	parse(theCronAttr,lineTokens,index);
+	return theCronAttr;
+}
+
+
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/CronAttr.hpp b/ecflow_4_0_7/ANattr/src/CronAttr.hpp
new file mode 100644
index 0000000..882b3af
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/CronAttr.hpp
@@ -0,0 +1,140 @@
+#ifndef CRONATTR_HPP_
+#define CRONATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "TimeSeries.hpp"
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+namespace ecf { class Calendar;} // forward declare class
+
+namespace ecf {
+
+// *****************************************************************
+// A cron attribute with a single time slot is repeated indefinitely
+// ******************************************************************
+// Use compiler ,  destructor, assignment, copy constructor,
+class CronAttr  {
+public:
+	CronAttr();
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const CronAttr& rhs) const;
+   bool operator<(const CronAttr& rhs) const { return timeSeries_ < rhs.timeSeries_; }
+	bool structureEquals(const CronAttr& rhs) const;
+
+	void addWeekDays( const std::vector<int>& w);
+	void addDaysOfMonth( const std::vector<int>& d);
+	void addMonths( const std::vector<int>& m);
+
+	void addTimeSeries( const TimeSlot& s, const TimeSlot& f, const TimeSlot& i) { timeSeries_ = TimeSeries(s,f,i);}
+	void addTimeSeries( const TimeSeries& ts ) { timeSeries_ = ts;}
+	void add_time_series( int h, int m, bool relative = false ) { timeSeries_ = TimeSeries(h,m,relative);}
+
+	// Once a cron is free its stays free, until re-queue is called
+	void calendarChanged( const ecf::Calendar& c ); // can set attribute free
+	void resetRelativeDuration();
+
+	void reset(const ecf::Calendar& c);
+	void requeue(const ecf::Calendar& c,bool reset_next_time_slot = true);
+
+   void miss_next_time_slot();
+	void setFree();   // ensures that isFree() always returns true
+	bool isSetFree() const { return makeFree_; }
+  	bool isFree( const ecf::Calendar&) const;
+	bool checkForRequeue( const ecf::Calendar&) const;
+	bool validForHybrid(const ecf::Calendar&) const;
+ 	bool why(const ecf::Calendar&, std::string& theReasonWhy) const;
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+   // Note: changes in state of timeSeries_, i.e affect the equality operator (used in test)
+   //       must be captured. i.e things like relative duration & next_time_slot are
+   //       reported by the Why command, & hence need to be synced.
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+ 	bool checkInvariants(std::string& errormsg) const;
+
+ 	//Query:
+   const TimeSeries& time() const { return timeSeries_;}
+   const TimeSeries& time_series() const { return timeSeries_;}
+	std::vector<int>::const_iterator week_days_begin() const { return weekDays_.begin();}
+	std::vector<int>::const_iterator week_days_end()   const { return weekDays_.end();  }
+	std::vector<int>::const_iterator days_of_month_begin() const { return daysOfMonth_.begin();}
+	std::vector<int>::const_iterator days_of_month_end()   const { return daysOfMonth_.end();  }
+	std::vector<int>::const_iterator months_begin() const { return months_.begin();}
+	std::vector<int>::const_iterator months_end()   const { return months_.end();  }
+
+	std::string name() const { return toString(); } /* ABO */
+	std::string toString() const;
+	std::string dump() const;
+
+	/// parse the line tokens an create a cron attribute. Can throw std::runtime_error
+	/// The index parameter allows us to parse:
+	/// cron -w 0,1 10:00      // index = 1
+	/// -w 0,1 10:00           // index = 0
+	/// Expect to parse:
+	/// 	cron 23:00                 # run every day at 23:00
+	/// 	cron 10:00 20:00 01:00     # run every hour between 10am and 8pm
+	/// 	cron -w 0,1 10:00          # run every sunday and monday at 10am
+	/// 	cron -d 10,11,12 12:00     # run 10th, 11th and 12th of each month at noon
+	/// 	cron -m 1,2,3 12:00        # run on Jan,Feb and March every day at noon.
+	/// 	cron -w 0 -m 5,6,7,8 10:00 20:00 01:00 # run every sunday, between May-Aug, every hour between 10am and 8pm
+	static void parse( CronAttr&, const std::vector<std::string >& lineTokens, size_t index, bool parse_state = false );
+ 	static CronAttr create(const std::string& cronString);
+
+private:
+	void clearFree(); // resets the free flag
+   bool is_day_of_week_day_of_month_and_month_free( const ecf::Calendar&) const;
+
+	bool week_day_matches(int) const;
+	bool day_of_month_matches(int) const;
+	bool month_matches(int) const;
+
+//	int max_month() const;
+//	int max_day_of_month() const;
+//	int max_day_of_week() const;
+//	int min_month() const;
+//	int min_day_of_month() const;
+//	int min_day_of_week() const;
+
+	boost::gregorian::date  last_day_of_month(const ecf::Calendar& calendar) const;
+	boost::gregorian::date  next_date(const ecf::Calendar& calendar) const;
+
+	TimeSeries       timeSeries_;
+	std::vector<int> weekDays_;
+	std::vector<int> daysOfMonth_;
+	std::vector<int> months_;
+ 	bool             makeFree_;         // persisted for use by why() on client side
+	unsigned int    state_change_no_;  // *not* persisted, only used on server side
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/) {
+	   ar & timeSeries_;
+	   ar & weekDays_;
+	   ar & daysOfMonth_;
+	   ar & months_;
+	   ar & makeFree_;
+	}
+};
+}
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ecf::CronAttr, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(ecf::CronAttr,boost::serialization::track_never);
+
+#endif /* CRONATTR_HPP_ */
diff --git a/ecflow_4_0_7/ANattr/src/DateAttr.cpp b/ecflow_4_0_7/ANattr/src/DateAttr.cpp
new file mode 100644
index 0000000..5eb7679
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/DateAttr.cpp
@@ -0,0 +1,293 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #31 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "DateAttr.hpp"
+#include "Extract.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "PrintStyle.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+//==========================================================================================
+
+DateAttr::DateAttr( int day, int month, int year )
+: day_( day ), month_( month ), year_( year ), makeFree_( false ), state_change_no_(0)
+{
+	checkDate(day_,month_,year_,true /* allow wild cards */);
+}
+
+bool DateAttr::operator<(const DateAttr& rhs) const {
+   if (year_ < rhs.year_) return true;
+   if (year_ == rhs.year_) {
+      if (month_ < rhs.month_ ) return true;
+      if (month_ == rhs.month_) {
+         return day_ < rhs.day_;
+      }
+   }
+   return false;
+}
+
+void DateAttr::checkDate(int day, int month, int year, bool allow_wild_cards)
+{
+	if (allow_wild_cards) {
+		if (day != 0 &&  (day < 1 || day > 31 )) {
+			throw std::out_of_range( "Invalid Date(day,month,year) : the day >= 0 and day < 31, where 0 means wild card ");
+		}
+		if (month !=0 && ( month < 1 || month > 12 )) {
+			throw std::out_of_range( "Invalid Date(day,month,year): the month >=0 and month <= 12, where 0 means wild card");
+		}
+		if (year < 0) {
+			throw std::out_of_range( "Invalid Date(day,month,year): the year >=0, where 0 means wild card");
+		}
+	}
+	else {
+		if (day < 1 || day > 31 ) {
+			throw std::out_of_range( "Invalid date attribute : the day >= 1 and day < 31");
+		}
+		if (month < 1 || month > 12 ) {
+			throw std::out_of_range( "Invalid date attribute: the month >=1 and month <= 12");
+		}
+		if (year <= 0) {
+			throw std::out_of_range( "Invalid date attribute: the year >0");
+		}
+	}
+
+	if ( day != 0 && month != 0 && year != 0 ) {
+
+		// let boost validate the date
+		boost::gregorian::date theDate( year, month, day );
+	}
+}
+
+void DateAttr::calendarChanged( const ecf::Calendar& c )
+{
+   if (makeFree_) {
+      return;
+   }
+   else if (isFree(c)) {
+      setFree();
+   }
+}
+
+void DateAttr::setFree() {
+	makeFree_ = true;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "DateAttr::setFree()\n";
+#endif
+}
+
+void DateAttr::clearFree() {
+	makeFree_ = false;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "DateAttr::clearFree()\n";
+#endif
+}
+
+bool DateAttr::isFree(const ecf::Calendar& calendar) const
+{
+	// The FreeDepCmd can be used to free the dates,
+ 	if (makeFree_) {
+		return true;
+	}
+ 	return is_free(calendar);
+}
+
+bool DateAttr::is_free(const ecf::Calendar& calendar) const
+{
+   bool dayMatches = true;
+   bool monthMatches = true;
+   bool yearMatches = true;
+   if (day_ != 0)   dayMatches   = calendar.day_of_month() == day_;
+   if (month_ != 0) monthMatches = calendar.month()        == month_;
+   if (year_ != 0)  yearMatches  = calendar.year()         == year_;
+
+   return ( dayMatches && monthMatches && yearMatches);
+}
+
+bool DateAttr::checkForRequeue( const ecf::Calendar& calendar) const
+{
+	// if calendar is hybrid, we can't re-queue
+	if (calendar.hybrid()) {
+ 		return false;
+	}
+
+	// checkForRequeue is called when we are deciding whether to re-queue the node.
+	// If this date is in the future, they we should re-queue
+	if ( day_ != 0 && month_ != 0 && year_ != 0) {
+		date theDate(year_,month_,day_);
+		if (theDate >  calendar.date()) {
+//#ifdef DEBUG
+//			cout << toString() << "   > " << " calendar date " << to_simple_string( calendar.date()) << "\n";
+//#endif
+			return true;
+		}
+		return false;
+	}
+
+ 	bool futureDayMatches = true;
+ 	bool futureMonthMatches = true;
+ 	bool futureYearMatches = true;
+ 	if (day_ != 0)   futureDayMatches   = day_ >   calendar.day_of_month() ;
+ 	if (month_ != 0) futureMonthMatches = month_ > calendar.month() ;
+ 	if (year_ != 0)  futureYearMatches  = year_ >  calendar.year() ;
+
+//#ifdef DEBUG
+//  	if ( futureDayMatches ) {
+// 		cout << "futureDayMatches " << toString() << " > " << calendar.day_of_month() << "\n";
+// 	}
+//	if ( futureMonthMatches ) {
+// 		cout << "futureMonthMatches " << toString() << " > " << calendar.month() << "\n";
+// 	}
+//	if ( futureYearMatches ) {
+// 		cout << "futureYearMatches " << toString() << " > " << calendar.year() << "\n";
+// 	}
+//#endif
+
+ 	return ( futureDayMatches || futureMonthMatches || futureYearMatches);
+}
+
+bool DateAttr::validForHybrid(const ecf::Calendar& calendar) const
+{
+ 	if (day_ == 0)    return false; // relies on day change i.e. date *.10.2009
+ 	if (month_ == 0)  return false; // relies on day change i.e. date 12.*.2009
+ 	if (year_ == 0)   return false; // relies on day change i.e. date 12.10.*
+
+ 	// if the date matches exactly for today
+   	return (day_ == calendar.day_of_month() && month_ == calendar.month() && year_ == calendar.year() );
+}
+
+bool DateAttr::why(const ecf::Calendar& c, std::string& theReasonWhy) const
+{
+	if (isFree(c)) return false;
+
+	std::stringstream ss;
+	ss << " is date dependent ( next run on " << toString() << " the current date is ";
+	ss << c.day_of_month() << "/" << c.month() << "/" << c.year() << " )";
+	theReasonWhy += ss.str();
+	return true;
+}
+
+std::ostream& DateAttr::print(std::ostream& os) const
+{
+	Indentor in;
+	Indentor::indent(os) << toString();
+   if (!PrintStyle::defsStyle()) {
+      if (makeFree_) os << " # free";
+   }
+	os << "\n";
+	return os;
+}
+
+std::string DateAttr::toString() const
+{
+	std::stringstream ss;
+	ss << "date ";
+	if (day_ == 0) ss << "*.";
+	else           ss << day_ << ".";
+
+	if (month_ == 0) ss << "*.";
+	else             ss << month_ << ".";
+
+	if (year_ == 0) ss << "*";
+	else            ss << year_;
+
+	return ss.str();
+}
+
+std::string DateAttr::dump() const
+{
+	std::stringstream ss; ss << toString();
+ 	if (makeFree_) ss << " (free)";
+	else           ss << " (holding)";
+	return ss.str();
+}
+
+
+bool DateAttr::operator==(const DateAttr& rhs) const
+{
+	if (makeFree_ != rhs.makeFree_) {
+		return false;
+	}
+	return structureEquals(rhs);
+}
+bool DateAttr::structureEquals(const DateAttr& rhs) const
+{
+	if (day_ != rhs.day_) return false;
+	if (month_ != rhs.month_) return false;
+	if (year_ != rhs.year_) return false;
+	return true;
+}
+
+DateAttr DateAttr::create(const std::string& dateString)
+{
+	int day = -1,month = -1,year = -1;
+	getDate(dateString,day,month,year);
+	return DateAttr(day,month,year);
+}
+
+void DateAttr::getDate(const std::string& date,int& day,int& month,int& year)
+{
+	size_t firstDotPos = date.find_first_of('.');
+	size_t lastDotPos = date.find_first_of('.',firstDotPos+1);
+	if (firstDotPos == std::string::npos)  throw std::runtime_error( "DateAttr::getDate Invalid date missing first dot :" + date );
+	if (lastDotPos == std::string::npos)  throw std::runtime_error( "DateAttr::getDate: Invalid date missing second dot :" + date );
+	if (firstDotPos ==  lastDotPos) throw std::runtime_error( "DateAttr::getDate: Invalid date :" + date );
+
+
+	std::string theDay = date.substr(0,firstDotPos);
+	std::string theMonth = date.substr(firstDotPos+1, (lastDotPos-firstDotPos)-1);
+	std::string theYear = date.substr(lastDotPos+1);
+
+	if (theDay == "*") day = 0;
+	else  {
+		day = Extract::theInt(theDay,"DateAttr::getDate: Invalid day :" + date);
+		if (day < 1 || day > 31)  throw std::runtime_error("DateAttr::getDate: Invalid clock date: " + date );
+	}
+
+
+	if (theMonth == "*") month = 0;
+	else  {
+		month = Extract::theInt(theMonth,"DateAttr::getDate: Invalid month :" + date);
+		if (month < 1 || month > 12)  throw std::runtime_error("DateAttr::getDate Invalid clock date: " + date );
+	}
+
+	if (theYear == "*") year = 0;
+	else                year = Extract::theInt(theYear,"DateAttr::getDate: Invalid year :" + date);
+
+
+	if (day == -1 || month == -1 || year == -1)  throw std::runtime_error("DateAttr::getDate: Invalid clock date:" + date );
+
+	// let boost validate the date
+	if ( day != 0 && month != 0 && year != 0) {
+
+		boost::gregorian::date theDate(year,month,day);
+	}
+
+//	cerr << " DateParser::getDate date=" << date << " day=" << day << " month=" << month << " year=" << year << "\n";
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/DateAttr.hpp b/ecflow_4_0_7/ANattr/src/DateAttr.hpp
new file mode 100644
index 0000000..db61e05
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/DateAttr.hpp
@@ -0,0 +1,102 @@
+#ifndef DATEATTR_HPP_
+#define DATEATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Note: calendarChanged() once a Date is free, it stays free
+//               It relies on parent cron/repeat to re-queue
+//============================================================================
+
+#include <ostream>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+namespace ecf { class Calendar;} // forward declare class that is in a name space
+
+// Use default copy constructor, assignment operator, destructor
+// Value of 0 for day,month,year means *, i.e. means any value
+class DateAttr {
+public:
+   DateAttr(int day, int month, int year); // will throw std::out_of_range for if invalid date
+   DateAttr()
+   : day_(0), month_(0), year_(0), makeFree_(false),
+     state_change_no_(0) {} // for serialisation
+   DateAttr(const boost::gregorian::date& date)
+   : day_(date.day()), month_(date.month()), year_(date.year()), makeFree_(false),
+     state_change_no_(0) {} // for test
+
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const DateAttr& rhs) const;
+   bool operator<(const DateAttr& rhs) const;
+   bool structureEquals(const DateAttr& rhs) const;
+
+   void setFree();   // ensures that isFree() always returns true
+   void clearFree(); // resets the free flag
+   bool isSetFree() const { return makeFree_; }
+   void calendarChanged( const ecf::Calendar& c ); // can set attribute free
+   bool isFree(const ecf::Calendar&) const;
+   bool checkForRequeue( const ecf::Calendar&) const;
+   bool validForHybrid(const ecf::Calendar&) const;
+   bool why(const ecf::Calendar&, std::string& theReasonWhy) const;
+
+   // The state_change_no is never reset. Must be incremented if it can affect equality
+   unsigned int state_change_no() const { return state_change_no_; }
+
+   std::string name() const { return toString(); } /* ABO */
+   std::string toString() const;
+   std::string dump() const;
+
+   /// Check the date, will throw std::out_of_range or derivative if invalid
+   static void checkDate(int day, int month, int year, bool allow_wild_cards);
+
+   /// Extract the date, if return integer is zero, date was of the *, i.e. any day,month,year
+   /// will throw std::runtime_error for parse errors
+   /// expect:
+   ///    15.11.2009
+   ///    15.*.*
+   ///    *.1.*
+   static void getDate(const std::string& date,int& day,int& month,int& year);
+   static DateAttr create(const std::string& dateString);
+
+   // access
+   int day() const { return day_; }
+   int month() const { return month_; }
+   int year() const { return year_; }
+
+private:
+   bool is_free(const ecf::Calendar&) const; // ignores makeFree_
+
+private:
+   int          day_;
+   int          month_;
+   int          year_;
+   bool         makeFree_; // persisted for use by why() on client side
+   unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & day_;
+      ar & month_;
+      ar & year_;
+      ar & makeFree_;
+   }
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(DateAttr, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(DateAttr,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/DayAttr.cpp b/ecflow_4_0_7/ANattr/src/DayAttr.cpp
new file mode 100644
index 0000000..ce0192c
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/DayAttr.cpp
@@ -0,0 +1,192 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+#include <sstream>
+
+#include "DayAttr.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "PrintStyle.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+
+//===============================================================================
+
+static std::string theDay(DayAttr::Day_t day)
+{
+   switch (day) {
+      case DayAttr::SUNDAY:    return "sunday"; break;
+      case DayAttr::MONDAY:    return "monday"; break;
+      case DayAttr::TUESDAY:   return "tuesday"; break;
+      case DayAttr::WEDNESDAY: return "wednesday"; break;
+      case DayAttr::THURSDAY:  return "thursday"; break;
+      case DayAttr::FRIDAY:    return "friday"; break;
+      case DayAttr::SATURDAY:  return "saturday"; break;
+      default: assert(false);break;
+   }
+   return std::string();
+}
+
+//===============================================================================
+
+void DayAttr::calendarChanged( const ecf::Calendar& c )
+{
+   if (makeFree_) {
+      return;
+   }
+   else if (isFree(c)) {
+      setFree();
+   }
+}
+
+bool DayAttr::isFree(const ecf::Calendar& calendar) const
+{
+	// The FreeDepCmd can be used to free the dates,
+ 	if (makeFree_) {
+		return true;
+	}
+ 	return is_free(calendar);
+}
+
+bool DayAttr::is_free(const ecf::Calendar& calendar) const
+{
+   return (calendar.day_of_week() == day_);
+}
+
+void DayAttr::setFree() {
+	makeFree_ = true;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "DayAttr::setFree()\n";
+#endif
+}
+
+void DayAttr::clearFree() {
+	makeFree_ = false;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "DayAttr::clearFree()\n";
+#endif
+}
+
+bool DayAttr::checkForRequeue( const ecf::Calendar& calendar) const
+{
+ 	// if calendar is hybrid, we can't requeue
+	if (calendar.hybrid()) {
+		return false;
+	}
+
+	// checkForRequeue is called when we are deciding whether to re-queue the node.
+	// If this date is in the future, they we should re-queue
+	return (day_ > calendar.day_of_week() );
+}
+
+bool DayAttr::validForHybrid(const ecf::Calendar& calendar) const
+{
+ 	return isFree(calendar);
+}
+
+bool DayAttr::why(const ecf::Calendar& c, std::string& theReasonWhy) const
+{
+	if (isFree(c))  return false;
+
+	theReasonWhy += " is day  dependent ( next run on ";
+	theReasonWhy += theDay(day_);
+	theReasonWhy += " the current day is ";
+	theReasonWhy += theDay(static_cast<DayAttr::Day_t>(c.day_of_week()));
+	theReasonWhy += " )";
+ 	return true;
+}
+
+std::ostream& DayAttr::print(std::ostream& os) const
+{
+	Indentor in;
+	Indentor::indent(os) << toString();
+   if (!PrintStyle::defsStyle()) {
+      if (makeFree_) os << " # free";
+   }
+	os << "\n";
+	return os;
+}
+
+std::string DayAttr::toString() const
+{
+   std::string ret = "day ";
+   ret += theDay(day_);
+   return ret;
+}
+
+std::string DayAttr::dump() const
+{
+	std::stringstream ss;
+	ss << toString();
+ 	if (makeFree_) ss << " (free)";
+	else           ss << " (holding)";
+  	return ss.str();
+}
+
+bool DayAttr::operator==(const DayAttr& rhs) const
+{
+	if (makeFree_ != rhs.makeFree_) {
+		return false;
+	}
+	return structureEquals(rhs);
+}
+
+bool DayAttr::structureEquals(const DayAttr& rhs) const
+{
+	return (day_ == rhs.day_);
+}
+
+
+DayAttr DayAttr::create(const std::string& dayStr)
+{
+	return DayAttr( getDay(dayStr) );
+}
+
+DayAttr::Day_t DayAttr::getDay(const std::string& day)
+{
+	if (day == "monday")         return DayAttr::MONDAY;
+	if (day == "tuesday")   return DayAttr::TUESDAY;
+	if (day == "wednesday") return DayAttr::WEDNESDAY;
+	if (day == "thursday")  return DayAttr::THURSDAY;
+	if (day == "friday")    return DayAttr::FRIDAY;
+	if (day == "saturday")  return DayAttr::SATURDAY;
+	if (day == "sunday")    return DayAttr::SUNDAY;
+
+	std::stringstream ss;
+	ss << "Invalid day(" << day << ") specification expected one of [monday,tuesday,wednesday,thursday,friday,saturday,sunday]: ";
+	throw std::runtime_error(ss.str());
+
+	return DayAttr::SUNDAY;
+}
+
+std::vector< std::string > DayAttr::allDays() {
+	std::vector< std::string > vec;
+	vec.reserve( 7 );
+	vec.push_back("monday");
+	vec.push_back("tuesday");
+	vec.push_back("wednesday");
+	vec.push_back("thursday");
+	vec.push_back("friday");
+	vec.push_back("saturday");
+	vec.push_back("sunday");
+	return vec;
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/DayAttr.hpp b/ecflow_4_0_7/ANattr/src/DayAttr.hpp
new file mode 100644
index 0000000..38dc408
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/DayAttr.hpp
@@ -0,0 +1,90 @@
+#ifndef DAYATTR_HPP_
+#define DAYATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #27 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Note: calendarChanged() once a day is free, it stays free
+//               It relies on parent cron/repeat to re-queue
+//============================================================================
+
+#include <ostream>
+#include <vector>
+#include <string>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+namespace ecf { class Calendar;} // forward declare class that is in a name space
+
+// Use default copy constructor, assignment operator, destructor
+class DayAttr {
+public:
+	enum Day_t { SUNDAY=0, MONDAY=1, TUESDAY=2, WEDNESDAY=3, THURSDAY=4, FRIDAY=5, SATURDAY=6 };
+	DayAttr() : day_(DayAttr::SUNDAY), makeFree_(false),state_change_no_(0) {}
+	DayAttr(Day_t day) : day_(day), makeFree_(false),state_change_no_(0) {}
+	DayAttr(const boost::gregorian::date& date)
+	: day_(static_cast<DayAttr::Day_t>(date.day_of_week().as_number())), makeFree_(false),state_change_no_(0) {}
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const DayAttr& rhs) const;
+   bool operator<(const DayAttr& rhs) const { return day_ < rhs.day_; }
+	bool structureEquals(const DayAttr& rhs) const;
+
+	void setFree();   // ensures that isFree() always returns true
+	void clearFree(); // resets the free flag
+	bool isSetFree() const { return makeFree_; }
+	void calendarChanged( const ecf::Calendar& c ) ; // can set attribute free
+	bool isFree(const ecf::Calendar&) const;
+	bool checkForRequeue( const ecf::Calendar&) const;
+	bool validForHybrid(const ecf::Calendar&) const;
+ 	bool why(const ecf::Calendar&, std::string& theReasonWhy) const;
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+        std::string name() const { return toString(); } /* ABO */
+	std::string toString() const;
+	std::string dump() const;
+
+	// return the days, if input is not valid will throw a runtime_error
+	static DayAttr create(const std::string& dayStr);
+	static DayAttr::Day_t getDay(const std::string&);
+
+	static std::vector<std::string> allDays();
+
+	// access
+	DayAttr::Day_t day() const { return day_;}
+
+private:
+   bool is_free(const ecf::Calendar&) const; // ignores makeFree_
+
+private:
+   DayAttr::Day_t day_;
+   bool           makeFree_;         // persisted for use by why() on client side
+   unsigned int  state_change_no_;  // *not* persisted, only used on server side
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & day_;
+      ar & makeFree_;
+   }
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(DayAttr, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(DayAttr,boost::serialization::track_never);
+
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/LateAttr.cpp b/ecflow_4_0_7/ANattr/src/LateAttr.cpp
new file mode 100644
index 0000000..0c97d48
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/LateAttr.cpp
@@ -0,0 +1,126 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <sstream>
+#include <boost/foreach.hpp>
+
+#include "LateAttr.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "Ecf.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace ecf {
+
+LateAttr::LateAttr() :  completeIsRelative_(false),isLate_(false),state_change_no_(0) {}
+
+std::ostream& LateAttr::print(std::ostream& os) const
+{
+	Indentor in;
+	Indentor::indent(os) << toString();
+   if (!PrintStyle::defsStyle()) {
+      if (isLate_) os << " # late";
+   }
+   os << "\n";
+   return os;
+}
+
+std::string LateAttr::toString() const
+{
+   std::string ret = "late";
+   if (!submitted_.isNULL()) {
+      ret += " -s +";
+      ret += submitted_.toString();
+   }
+   if (!active_.isNULL()) {
+      ret += " -a ";
+      ret += active_.toString();
+   }
+   if (!complete_.isNULL()) {
+      ret += " -c ";
+      if (completeIsRelative_) ret += "+";
+      ret += complete_.toString();
+   }
+   return ret;
+}
+
+bool LateAttr::operator==(const LateAttr& rhs) const
+{
+ 	if ( completeIsRelative_ != rhs.completeIsRelative_) return false;
+	if ( submitted_ != rhs.submitted_) return false;
+	if ( active_ != rhs.active_) return false;
+   if ( complete_ != rhs.complete_) return false;
+   if ( isLate_ != rhs.isLate_) return false;
+	return true;
+}
+
+bool LateAttr::isNull() const
+{
+	return ( submitted_.isNULL() && active_.isNULL() && complete_.isNULL());
+}
+
+void LateAttr::checkForLateness( const std::pair<NState,boost::posix_time::time_duration>&  state,
+                                 const ecf::Calendar& calendar )
+{
+	if (isLate_ || isNull()) {
+		return;
+	}
+
+	if (state.first == NState::SUBMITTED || state.first == NState::QUEUED) {
+		// Submitted is always relative, ASSUME this means relative to suite start
+		if (state.first == NState::SUBMITTED && !submitted_.isNULL()) {
+			if ( calendar.duration() >= submitted_.duration()  ) {
+	 			setLate(true);
+ 				return;
+			}
+		}
+
+		// In Submitted or queued state, check for active, in REAL time
+ 		if (!active_.isNULL() && calendar.suiteTime().time_of_day() >= active_.duration()) {
+ 			setLate(true);
+		}
+ 	}
+	else if ( state.first == NState::ACTIVE && !complete_.isNULL()) {
+		if ( completeIsRelative_) {
+			// to check for complete, we need the duration when state went into active state
+			// state.second is when state went ACTIVE, relative to suite start
+ 			boost::posix_time::time_duration runtime = calendar.duration() - state.second ;
+			if ( runtime >= complete_.duration()) {
+				setLate(true);
+ 			}
+		}
+		else {
+			// Real time
+ 			if (calendar.suiteTime().time_of_day() >= complete_.duration()) {
+ 				setLate(true);
+			}
+		}
+	}
+}
+
+void LateAttr::setLate(bool f)
+{
+	isLate_ = f;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "LateAttr::setLate\n";
+#endif
+}
+
+}
diff --git a/ecflow_4_0_7/ANattr/src/LateAttr.hpp b/ecflow_4_0_7/ANattr/src/LateAttr.hpp
new file mode 100644
index 0000000..e9255b0
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/LateAttr.hpp
@@ -0,0 +1,105 @@
+#ifndef LATEATTR_HPP_
+#define LATEATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "TimeSlot.hpp"
+#include "NState.hpp"
+
+namespace ecf { class Calendar;} // forward declare class
+
+namespace ecf {
+/// ========================================================================
+/// Use compiler ,  destructor, assignment, copy constructor,
+///
+/// The late late attribute will not work correctly when the suites clock
+/// start and stops with the server. Since the late relies on real time
+/// for some of its functionality.
+/// -s submitted: The time node can stay submitted (format [+]hh:mm). submitted is always
+///               relative, so + is simple ignored, if present. If the node stays submitted
+///               longer than the time specified, the late flag is set
+/// -a Active   : The time of day the node must have become active (format hh:mm). If the node
+///               is still queued or submitted, the late flag is set
+/// -a Complete : The time node must become complete (format {+}hh:mm). If relative, time is
+///               taken form the time the node became actice, otherwise node must be complete by
+///               the time given.
+/// ===========================================================================
+class LateAttr  {
+public:
+	LateAttr();
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const LateAttr& rhs) const;
+
+	void addSubmitted( const TimeSlot& s)    { submitted_  = s; }
+	void add_submitted(int hour, int minute) { submitted_  = TimeSlot(hour,minute); }
+	void addActive( const TimeSlot& s )      { active_  = s; }
+	void add_active(int hour, int minute)    { active_  = TimeSlot(hour,minute); }
+	void addComplete( const TimeSlot& s,  bool relative)   { complete_  = s;                     completeIsRelative_ = relative;}
+	void add_complete(int hour, int minute,bool relative)  { complete_  = TimeSlot(hour,minute); completeIsRelative_ = relative; }
+
+	const TimeSlot& submitted() const { return submitted_; }
+	const TimeSlot& active() const { return active_; }
+	const TimeSlot& complete() const { return complete_; }
+	bool complete_is_relative() const { return completeIsRelative_; }
+
+	/// i.e no time structs specified
+	bool isNull() const;
+
+	/// Given the state and time of state change, and calendar work out if we are late
+	/// if we are sets the late flag
+	void checkForLateness( const std::pair<NState,boost::posix_time::time_duration>&  state, const ecf::Calendar& c );
+
+	///  To be used by GUI to inform used that a node is late
+	bool isLate() const { return isLate_;}
+
+	/// To be called at begin and re-queue time
+	void reset() { setLate(false); }
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+ 	/// set flag to be late
+	void setLate(bool f);
+
+	std::string toString() const;
+        std::string name() const { return toString(); }
+  
+private:
+
+	TimeSlot submitted_;  // relative by default
+	TimeSlot active_;
+	TimeSlot complete_;
+
+	bool completeIsRelative_;
+	bool isLate_;
+
+	unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+    friend class boost::serialization::access;
+    template<class Archive>
+    void serialize(Archive & ar, const unsigned int /*version*/) {
+    	 ar & submitted_;
+         ar & active_;
+         ar & complete_;
+         ar & completeIsRelative_;
+         ar & isLate_;
+    }
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/NodeAttr.cpp b/ecflow_4_0_7/ANattr/src/NodeAttr.cpp
new file mode 100644
index 0000000..606d1b5
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/NodeAttr.cpp
@@ -0,0 +1,366 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #67 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "NodeAttr.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "PrintStyle.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+
+const std::string& Event::SET() { static const std::string SET = "set"; return SET; }
+const std::string& Event::CLEAR() { static const std::string CLEAR = "clear"; return CLEAR; }
+const Event& Event::EMPTY() { static const Event EVENT = Event(); return EVENT ; }
+const Meter& Meter::EMPTY() { static const Meter METER = Meter(); return METER ; }
+const Label& Label::EMPTY() { static const Label LABEL = Label(); return LABEL ; }
+
+////////////////////////////////////////////////////////////////////////////////////////////
+
+Event::Event( int number, const std::string& eventName )
+: value_( false ), number_( number ), name_( eventName ), used_( false ), state_change_no_( 0 )
+{
+   if ( !eventName.empty() ) {
+      string msg;
+      if ( !Str::valid_name( eventName, msg ) ) {
+         throw std::runtime_error( "Event::Event: Invalid event name : " + msg );
+      }
+   }
+}
+
+Event::Event(  const std::string& eventName )
+: value_( false ), number_( std::numeric_limits<int>::max() ), name_( eventName ), used_( false ), state_change_no_( 0 )
+{
+   if ( eventName.empty() ) {
+      throw std::runtime_error( "Event::Event: Invalid event name : name must be specified if no number supplied");
+   }
+
+   // If the eventName is a integer, then treat it as such, by setting number_ and clearing name_
+   // This was added after migration failed, since *python* api allowed:
+   //       ta.add_event(1);
+   //       ta.add_event("1");
+   // and when we called ecflow_client --migrate/--get it generated
+   //       event 1
+   //       event 1
+   // which then did *not* load.
+   //
+   // Test for numeric, and then casting, is ****faster***** than relying on exception alone
+   if ( eventName.find_first_of( Str::NUMERIC() ) != std::string::npos ) {
+      try {
+         number_ = boost::lexical_cast< int >( eventName );
+         name_.clear();
+         return;
+      }
+      catch ( boost::bad_lexical_cast&  ) {
+         // cast failed, a real string, carry on
+      }
+   }
+
+   string msg;
+   if ( !Str::valid_name( eventName, msg ) ) {
+      throw std::runtime_error( "Event::Event: Invalid event name : " + msg );
+   }
+}
+
+void Event::set_value( bool b ) {
+   value_ = b;
+   state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Event::set_value\n";
+#endif
+}
+
+std::string Event::name_or_number() const {
+   if ( name_.empty() ) {
+      std::stringstream ss;
+      ss << number_;
+      return ss.str();
+   }
+   return name_;
+}
+
+bool Event::operator==( const Event& rhs ) const {
+   if ( value_ != rhs.value_ ) {
+      return false;
+   }
+   if ( number_ != rhs.number_ ) {
+      return false;
+   }
+   if ( name_ != rhs.name_ ) {
+      return false;
+   }
+   return true;
+}
+
+std::ostream& Event::print( std::ostream& os ) const {
+   Indentor in;
+   Indentor::indent( os ) << toString();
+   if ( !PrintStyle::defsStyle() ) {
+      if (value_)  os << " # " << Event::SET();
+   }
+   os << "\n";
+   return os;
+}
+
+std::string Event::toString() const {
+   std::stringstream ss;
+   if ( number_ == std::numeric_limits< int >::max() )
+      ss << "event " << name_;
+   else ss << "event " << number_ << " " << name_;
+   return ss.str();
+}
+
+std::string Event::dump() const {
+   std::stringstream ss;
+   ss << toString() << " value(" << value_ << ")  used(" << used_ << ")";
+   return ss.str();
+}
+
+bool Event::isValidState( const std::string& state ) {
+   if ( state == Event::SET() )
+      return true;
+   if ( state == Event::CLEAR() )
+      return true;
+   return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+
+Meter::Meter( const std::string& name, int min, int max, int colorChange ) :
+	         min_( min ), max_( max ), value_( min ), colorChange_( colorChange ),
+	         name_( name ), used_( false ), state_change_no_( 0 )
+{
+   if ( !Str::valid_name( name ) ) {
+      throw std::runtime_error("Meter::Meter: Invalid Meter name: " + name);
+   }
+
+   if ( min > max )
+      throw std::out_of_range( "Meter::Meter: Invalid Meter(name,min,max,color_change) : min must be less than max" );
+
+   if (colorChange == std::numeric_limits<int>::max()) {
+      colorChange_ =  max_;
+   }
+
+   if ( colorChange_ < min || colorChange_ > max ) {
+      std::stringstream ss;
+      ss << "Meter::Meter: Invalid Meter(name,min,max,color_change) color_change(" << colorChange_ << ") must be between min(" << min_ << ") and max(" << max_ << ")";
+      throw std::out_of_range( ss.str() );
+   }
+}
+
+void Meter::set_value( int v ) {
+
+   if (!isValidValue( v )) {
+      std::stringstream ss;
+      ss << "Meter::set_value(int): The meter(" << name_ << ") value must be in the range[" << min() << "-" << max() << "] but found '" << v << "'";
+      throw std::runtime_error( ss.str() );
+   }
+
+   value_ = v;
+   state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Meter::set_value\n";
+#endif
+}
+
+bool Meter::operator==( const Meter& rhs ) const {
+   if ( value_ != rhs.value_ ) {
+      return false;
+   }
+   if ( min_ != rhs.min_ ) {
+      return false;
+   }
+   if ( max_ != rhs.max_ ) {
+      return false;
+   }
+   if ( colorChange_ != rhs.colorChange_ ) {
+      return false;
+   }
+   if ( name_ != rhs.name_ ) {
+      return false;
+   }
+   return true;
+}
+
+std::ostream& Meter::print( std::ostream& os ) const {
+   Indentor in;
+   Indentor::indent( os ) <<  toString();
+   if ( !PrintStyle::defsStyle() ) {
+      if (value_ != min_) os << " # " << value_;
+   }
+   os << "\n";
+   return os;
+}
+
+std::string Meter::toString() const {
+   std::stringstream ss;
+   ss << "meter " << name_ << " " << min_ << " " << max_ << " " << colorChange_;
+   return ss.str();
+}
+
+std::string Meter::dump() const {
+   std::stringstream ss;
+   ss << "meter " << name_ << " min(" << min_ << ") max (" << max_
+            << ") colorChange(" << colorChange_ << ") value(" << value_
+            << ") used(" << used_ << ")";
+   return ss.str();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+Label::Label(const std::string& name, const std::string& l)
+: name_(name),value_(l),state_change_no_(0)
+{
+   if ( !Str::valid_name( name ) ) {
+      throw std::runtime_error("Label::Label: Invalid Label name :" + name);
+   }
+}
+
+
+std::ostream& Label::print( std::ostream& os ) const {
+
+   Indentor in;
+   Indentor::indent( os ) << toString();
+   if (!PrintStyle::defsStyle()) {
+      if (!new_value_.empty()) {
+         if (new_value_.find("\n") == std::string::npos) {
+            os << " # \"" << new_value_ << "\"";
+         }
+         else {
+            std::string value = new_value_;
+            Str::replaceall(value,"\n","\\n");
+            os << " # \"" << value << "\"";
+         }
+      }
+   }
+   os << "\n";
+   return os;
+}
+
+std::string Label::toString() const {
+   // parsing always STRIPS the quotes, hence add them back
+   std::string ret; ret.reserve(name_.size() + value_.size() + 10);
+   ret += "label ";
+   ret += name_;
+   ret += " \"";
+   if (value_.find("\n") == std::string::npos) ret += value_;
+   else  {
+      // replace \n, otherwise re-parse will fail
+      std::string value = value_;
+      Str::replaceall(value,"\n","\\n");
+      ret += value;
+   }
+   ret += "\"";
+   return ret;
+}
+
+std::string Label::dump() const {
+   std::stringstream ss;
+   ss << toString() << " : \"" << new_value_  << "\"";
+   return ss.str();
+}
+
+void Label::set_new_value( const std::string& l ) {
+   new_value_ = l;
+   state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Label::set_new_value\n";
+#endif
+}
+
+void Label::reset() {
+   new_value_.clear();
+   state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Label::reset()\n";
+#endif
+}
+
+
+void Label::parse(const std::string& line, std::vector<std::string >& lineTokens, bool parse_state)
+{
+   if ( lineTokens.size() < 3 )
+      throw std::runtime_error( "Label::parse: Invalid label :" + line );
+
+   name_ = lineTokens[1];
+
+   // parsing will always STRIP single or double quotes, print will add double quotes
+   // label simple_label 'ecgems'
+   if ( lineTokens.size() == 3 ) {
+      Str::removeQuotes(lineTokens[2]);
+      Str::removeSingleQuotes(lineTokens[2]);
+      value_ = lineTokens[2];
+      if (value_.find("\\n") != std::string::npos) {
+         Str::replaceall(value_,"\\n","\n");
+      }
+   }
+   else {
+
+      // label complex_label "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"  # fred
+      // label simple_label "fred" #  "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"
+      std::string value; value.reserve(line.size());
+      size_t line_token_size = lineTokens.size();
+      for (size_t i = 2; i < line_token_size; ++i) {
+         if ( lineTokens[i].at( 0 ) == '#' ) break;
+         if ( i != 2 ) value += " ";
+         value += lineTokens[i];
+      }
+
+      Str::removeQuotes(value);
+      Str::removeSingleQuotes(value);
+      value_ = value;
+      if (value_.find("\\n") != std::string::npos) {
+         Str::replaceall(value_,"\\n","\n");
+      }
+
+
+      // state
+      if (parse_state) {
+         // label name "value" # "new  value"
+         bool comment_fnd = false;
+         size_t first_quote_after_comment = 0;
+         size_t last_quote_after_comment = 0;
+         for(size_t i = line.size()-1; i > 0; i--) {
+            if (line[i] == '#') { comment_fnd = true; break; }
+            if (line[i] == '"') {
+               if (last_quote_after_comment == 0) last_quote_after_comment = i;
+               first_quote_after_comment = i;
+            }
+         }
+         if (comment_fnd && first_quote_after_comment != last_quote_after_comment) {
+            std::string new_value = line.substr(first_quote_after_comment+1,last_quote_after_comment-first_quote_after_comment-1);
+            //std::cout << "new label = '" << new_value << "'\n";
+            new_value_ = new_value;
+
+            if (new_value_.find("\\n") != std::string::npos) {
+               Str::replaceall(new_value_,"\\n","\n");
+            }
+         }
+      }
+   }
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/NodeAttr.hpp b/ecflow_4_0_7/ANattr/src/NodeAttr.hpp
new file mode 100644
index 0000000..f2fe7bf
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/NodeAttr.hpp
@@ -0,0 +1,211 @@
+#ifndef NODEATTR_HPP_
+#define NODEATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #61 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <ostream>
+#include <vector>
+#include <limits> // for std::numeric_limits<int>::max()
+
+#include <boost/operators.hpp>
+#include <boost/utility.hpp>
+
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/set.hpp>            // no need to include <set>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Class Label:
+// Use compiler , generated destructor, assignment,  copy constructor
+class Label : public boost::equality_comparable<Label> {
+public:
+   Label(const std::string& name, const std::string& l);
+   Label() : state_change_no_(0) {}
+
+   std::ostream& print(std::ostream&) const;
+   const std::string& name() const      { return name_;}
+   const std::string& value() const     { return value_;}
+   const std::string& new_value() const { return new_value_;}
+   void set_new_value(const std::string& new_label);
+   void reset();
+   bool empty() const { return name_.empty(); }
+
+   // The state_change_no is never reset. Must be incremented if it can affect equality
+   unsigned int state_change_no() const { return state_change_no_; }
+
+   // 2 kinds of equality, structure and state
+   friend bool operator==(const Label& lhs,const Label& rhs) {
+      if (lhs.name_ != rhs.name_ )  {
+         //std::cout << "lhs.name_ '" << lhs.name_ << "' != rhs.name_ '" << rhs.name_ << "'\n";
+         return false;
+      }
+      if (lhs.new_value_ != rhs.new_value_) {
+         //std::cout << "lhs.new_value_ '" << lhs.new_value_ << "' != rhs.new_value_ '" << rhs.new_value_ << "'\n";
+         return false;
+      }
+      if ( lhs.value_ != rhs.value_ ) {
+         //std::cout << "lhs.value_ '" << lhs.value_ << "' != rhs.value_ '" << rhs.value_ << "'\n";
+         return false;
+      }
+      return true;
+   }
+
+   std::string toString() const;
+   std::string dump() const;
+
+   void parse(const std::string& line, std::vector<std::string >& lineTokens, bool parse_state);
+   static const Label& EMPTY(); // Added to support return by reference
+
+private:
+   std::string name_;
+   std::string value_;
+   std::string new_value_;
+   unsigned int state_change_no_;        // *not* persisted, only used on server side
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & name_;
+      ar & value_;
+      ar & new_value_;
+   }
+};
+
+
+// Class Event:
+// events with the number 007 are the same as 7.
+// Use compiler , generated destructor, assignment, copy constructor
+//
+// Don't use -1, to represent that no number was specified, as on
+// AIX portable binary archive can't cope with this
+// use std::numeric_limits<int>::max()
+class Event {
+public:
+   Event(int number, const std::string& eventName = "");
+   Event(const std::string& eventName);
+   Event()
+   : value_(false),
+     number_(std::numeric_limits<int>::max()),
+     used_(false),
+     state_change_no_(0){}
+
+   std::string name_or_number() const; // if name present return, else return number
+   const std::string& name() const { return  name_;}
+   std::ostream& print(std::ostream&) const;
+   bool value() const { return value_;}
+   void reset() { set_value(false);}
+   bool empty() const { return (name_.empty() && number_ == std::numeric_limits<int>::max()); }
+
+   int number() const { return number_;}
+   bool operator==(const Event& rhs) const;
+   void set_value(bool b);  // updates state_change_no_
+   bool usedInTrigger() const { return used_;}
+   void usedInTrigger(bool b) { used_ = b;}
+
+   unsigned int state_change_no() const { return state_change_no_;}
+
+   std::string toString() const;
+   std::string dump() const;
+
+   static bool isValidState(const std::string&); // return true for "set" | "clear"
+   static const std::string& SET();
+   static const std::string& CLEAR();
+   static const Event& EMPTY(); // Added to support return by reference
+
+private:
+   bool         value_;
+   int          number_;
+   std::string  name_;
+   bool         used_;             // used by the simulator not persisted
+   unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & value_;
+      ar & number_;
+      ar & name_;
+   }
+};
+
+// Class Meter:
+// Use compiler , generated destructor, assignment, copy constructor
+// For this class we don't check the value member for the equality functionality
+// Can have negative min/max however max >= min, and color change should be in the
+// range min-max
+class Meter {
+public:
+   Meter(const std::string& name,int min, int max, int colorChange = std::numeric_limits<int>::max());
+   Meter() : min_(0),max_(0), value_(0),colorChange_(0),used_(false), state_change_no_(0){}
+
+   std::ostream& print(std::ostream&) const;
+   void reset() { set_value(min_);}
+   void set_value(int v); // can throw throw std::runtime_error if out of range
+   bool empty() const { return name_.empty(); }
+
+   const std::string& name() const { return  name_;}
+   int value() const { return value_;}
+   int min() const { return min_;}
+   int max() const { return max_;}
+   int colorChange() const { return colorChange_;}
+
+   // The state_change_no is never reset. Must be incremented if it can affect equality
+   unsigned int state_change_no() const { return state_change_no_; }
+
+   bool operator==(const Meter& rhs) const;
+
+   bool usedInTrigger() const { return used_;}
+   void usedInTrigger(bool b) { used_ = b;}
+   std::string toString() const;
+   std::string dump() const;
+
+   static const Meter& EMPTY(); // Added to support return by reference
+
+private:
+
+   bool isValidValue(int v) const { return (v >= min_ && v <= max_); }
+
+   int          min_;
+   int          max_;
+   int          value_;
+   int          colorChange_;
+   std::string  name_;
+   bool         used_;        // used by the simulator not persisted
+   unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & min_;
+      ar & max_;
+      ar & value_;
+      ar & colorChange_;
+      ar & name_;
+   }
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(Meter, boost::serialization::object_serializable);
+BOOST_CLASS_IMPLEMENTATION(Event, boost::serialization::object_serializable);
+BOOST_CLASS_IMPLEMENTATION(Label, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(Meter,boost::serialization::track_never);
+BOOST_CLASS_TRACKING(Event,boost::serialization::track_never);
+BOOST_CLASS_TRACKING(Label,boost::serialization::track_never);
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/RepeatAttr.cpp b/ecflow_4_0_7/ANattr/src/RepeatAttr.cpp
new file mode 100644
index 0000000..0fdc5d6
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/RepeatAttr.cpp
@@ -0,0 +1,957 @@
+//============================================================================
+// Name        : NodeTree.cpp
+// Author      : Avi
+// Revision    : $Revision: #57 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "RepeatAttr.hpp"
+#include "Indentor.hpp"
+#include "Ecf.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+const Repeat& Repeat::EMPTY() { static const Repeat REPEAT = Repeat(); return REPEAT; }
+
+//=========================================================================
+
+Repeat::Repeat() : repeatType_(NULL) {}
+Repeat::Repeat( const RepeatDate& r) : repeatType_(new RepeatDate(r)) {}
+Repeat::Repeat( const RepeatInteger& r) : repeatType_(new RepeatInteger(r)) {}
+Repeat::Repeat( const RepeatEnumerated& r) : repeatType_(new RepeatEnumerated(r)) {}
+Repeat::Repeat( const RepeatString& r) : repeatType_(new RepeatString(r)) {}
+Repeat::Repeat( const RepeatDay& r) : repeatType_(new RepeatDay(r)) {}
+
+Repeat::~Repeat() { delete repeatType_;}
+
+Repeat::Repeat( const Repeat& rhs) : repeatType_(NULL)
+{
+	// Do stuff that could throw exception first
+	RepeatBase* clone = NULL;
+	if ( rhs.repeatType_) {
+		clone = rhs.repeatType_->clone();
+	}
+
+	// Change state
+ 	repeatType_ = clone;
+}
+
+Repeat& Repeat::operator=(const Repeat& rhs)
+{
+	// Do stuff that could throw exception first
+	RepeatBase* clone = NULL;
+	if ( rhs.repeatType_) {
+		clone = rhs.repeatType_->clone();
+	}
+
+	// Change state
+	delete repeatType_; repeatType_ = NULL;
+	repeatType_ = clone;
+
+	return *this;
+}
+
+bool Repeat::operator==(const Repeat& rhs) const
+{
+	if (!repeatType_ && rhs.repeatType_) return false;
+	if (repeatType_ && !rhs.repeatType_) return false;
+	if (!repeatType_ && !rhs.repeatType_) return true	;
+	return repeatType_->compare(rhs.repeatType_);
+}
+
+const std::string& Repeat::name() const {
+   return (repeatType_) ? repeatType_->name() : Str::EMPTY();
+}
+
+const Variable& Repeat::gen_variable() const
+{
+   return (repeatType_) ? repeatType_->gen_variable() : Variable::EMPTY();
+}
+
+void Repeat::update_repeat_genvar() const
+{
+   if (repeatType_) {
+      // **** reset name since generated variables are not persisted
+      repeatType_->set_gen_variable().set_name( repeatType_->name() );
+
+      // valueAsString() use the last_valid_value() which should always be in range.
+      // Note repeat::value() can be on e past the last valid value, at expiration of Repeat loop
+      //      However Repeat::last_valid_value() will just return the last valid value.
+      repeatType_->set_gen_variable().set_value( repeatType_->valueAsString() );
+   }
+}
+
+
+std::ostream& Repeat::print( std::ostream& os ) const {
+	if (repeatType_) {
+		Indentor in;
+		Indentor::indent(os) << toString() << "\n";
+	}
+	return os;
+}
+
+// =========================================================================
+RepeatBase::~RepeatBase() {}
+
+void RepeatBase::incr_state_change_no()
+{
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "RepeatBase::incr_state_change_no()\n";
+#endif
+}
+
+// =========================================================================
+
+long sms_repeat_julian_to_date(long jdate)
+{
+   long x,y,d,m,e;
+   long day,month,year;
+
+   x = 4 * jdate - 6884477;
+   y = (x / 146097) * 100;
+   e = x % 146097;
+   d = e / 4;
+
+   x = 4 * d + 3;
+   y = (x / 1461) + y;
+   e = x % 1461;
+   d = e / 4 + 1;
+
+   x = 5 * d - 3;
+   m = x / 153 + 1;
+   e = x % 153;
+   d = e / 5 + 1;
+
+   if( m < 11 )
+      month = m + 2;
+   else
+      month = m - 10;
+
+
+   day = d;
+   year = y + m / 11;
+
+   return year * 10000 + month * 100 + day;
+}
+
+long sms_repeat_date_to_julian(long ddate)
+{
+   long  m1,y1,a,b,c,d,j1;
+   long month,day,year;
+
+   year = ddate / 10000;
+   ddate %= 10000;
+   month  = ddate / 100;
+   ddate %= 100;
+   day = ddate;
+
+   if (month > 2)
+   {
+      m1 = month - 3;
+      y1 = year;
+   }
+   else
+   {
+      m1 = month + 9;
+      y1 = year - 1;
+   }
+   a = 146097*(y1/100)/4;
+   d = y1 % 100;
+   b = 1461*d/4;
+   c = (153*m1+2)/5+day+1721119;
+   j1 = a+b+c;
+
+   return(j1);
+}
+
+RepeatDate::RepeatDate( const std::string& variable,
+                        int start,
+                        int end,
+                        int delta /* always in days*/
+) : RepeatBase(variable), start_(start), end_(end), delta_(delta), value_(start)
+{
+   if ( !Str::valid_name( variable ) ) {
+      throw std::runtime_error("RepeatDate::RepeatDate: Invalid name: " + variable);
+   }
+	if (start > end) {
+	   std::stringstream ss; ss << "repeat " << variable << " " << start << " " << end << " " << delta;
+		throw std::runtime_error("Invalid Repeat date: The end must be greater than the start date" + ss.str());
+	}
+	std::string theStart = boost::lexical_cast< std::string >(start);
+	if (theStart.size() != 8) {
+	   std::stringstream ss; ss << "repeat " << variable << " " << start << " " << end << " " << delta;
+		throw std::runtime_error("Invalid Repeat date: The start is not a valid date. Please use yyyymmdd format." + ss.str());
+ 	}
+	std::string theEnd = boost::lexical_cast< std::string >(end);
+	if (theEnd.size() != 8) {
+      std::stringstream ss; ss << "repeat " << variable << " " << start << " " << end << " " << delta;
+		throw std::runtime_error("Invalid Repeat date: The end is not a valid date. Please use yyyymmdd format." + ss.str());
+ 	}
+
+	// Use date lib to check YMD
+	try {
+		boost::gregorian::date(from_undelimited_string(theStart));
+		boost::gregorian::date(from_undelimited_string(theEnd));
+	}
+	catch (std::exception& e) {
+      std::stringstream ss; ss << "repeat " << variable << " " << start << " " << end << " " << delta;
+		throw std::runtime_error("Invalid Repeat date: The start/end is not a valid date." + ss.str());
+	}
+}
+
+bool RepeatDate::compare(RepeatBase* rb) const
+{
+	RepeatDate* rhs = dynamic_cast<RepeatDate*>(rb);
+	if(!rhs) return false;
+	return operator==(*rhs);
+}
+
+void RepeatDate::setToLastValue()
+{
+   value_ = end_;
+	incr_state_change_no();
+}
+
+long RepeatDate::last_valid_value() const
+{
+   if (delta_ > 0) {
+      if (value_ < start_) return start_;
+      if (value_ > end_)   return end_;
+      return value_;
+   }
+   if (value_ > start_) return start_;
+   if (value_ < end_)   return end_;
+   return value_;
+}
+
+long RepeatDate::last_valid_value_minus(int val) const
+{
+   long last_value = last_valid_value();
+   long julian = sms_repeat_date_to_julian(last_value - val);
+   return sms_repeat_julian_to_date(julian);
+}
+
+long RepeatDate::last_valid_value_plus(int val) const
+{
+   long last_value = last_valid_value();
+   long julian = sms_repeat_date_to_julian(last_value + val);
+   return sms_repeat_julian_to_date(julian);
+}
+
+void RepeatDate::reset() {
+	value_ = start_;
+	incr_state_change_no();
+}
+
+std::string RepeatDate::toString() const
+{
+	std::stringstream ss;
+	ss << "repeat date " << name_ << " " << start_ << " " << end_ << " " << delta_;
+	if (!PrintStyle::defsStyle() && (value_ != start_)) {
+	   ss << " # " << value_;
+	}
+	return ss.str();
+}
+std::string RepeatDate::dump() const
+{
+	std::stringstream ss;
+	ss << toString() << " value(" << value_ << ")";
+	return ss.str();
+}
+
+bool RepeatDate::operator==(const RepeatDate& rhs) const
+{
+	if (name_ != rhs.name_) {
+		return false;
+	}
+	if (start_ != rhs.start_) {
+		return false;
+	}
+	if (end_ != rhs.end_) {
+		return false;
+	}
+	if (delta_ != rhs.delta_) {
+		return false;
+	}
+   if (value_ != rhs.value_) {
+      return false;
+   }
+	return true;
+}
+
+std::string RepeatDate::valueAsString() const
+{
+	/// will throw a boost::bad_lexical_cast& if value is not convertible to a string
+ 	try {
+		return boost::lexical_cast< std::string >( last_valid_value() );
+	}
+	catch ( boost::bad_lexical_cast& ) {
+		LOG_ASSERT(false,"RepeatDate::valueAsString(): could not convert value " << value_ << " to a string");
+	}
+	return string();
+}
+
+std::string RepeatDate::value_as_string(int index) const
+{
+   /// will throw a boost::bad_lexical_cast& if value is not convertible to a string
+   try {
+      return boost::lexical_cast< std::string >( index );
+   }
+   catch ( boost::bad_lexical_cast& ) {}
+   return string();
+}
+
+void RepeatDate::increment()
+{
+   long julian = sms_repeat_date_to_julian(value_ + delta_);
+   value_ = sms_repeat_julian_to_date(julian);
+   incr_state_change_no();
+}
+
+void RepeatDate::change( const std::string& newdate)
+{
+ 	if (newdate.size() != 8) {
+      std::stringstream ss;
+      ss << "RepeatDate::change: " << toString() << " The new date is not valid, expected 8 characters in yyyymmdd format but found " << newdate;
+		throw std::runtime_error(ss.str());
+ 	}
+
+	long the_new_date = 0;
+ 	try {
+ 		the_new_date = boost::lexical_cast< long >( newdate );
+	}
+	catch ( boost::bad_lexical_cast& ) {
+      std::stringstream ss;
+      ss << "RepeatDate::change: " << toString() << " The new date(" << newdate << ") is not convertible to an long";
+ 		throw std::runtime_error(ss.str());
+	}
+
+	// Use date lib to check YMD
+	try { boost::gregorian::date(from_undelimited_string(newdate));}
+	catch (std::exception& e) {
+      std::stringstream ss;
+      ss << "RepeatDate::change: " << toString() << " The new date(" << newdate << ") is not valid";
+ 		throw std::runtime_error(ss.str());
+	}
+
+	changeValue(the_new_date);
+}
+
+void RepeatDate::changeValue(long the_new_date)
+{
+	if (the_new_date < start_ || the_new_date > end_) {
+		std::stringstream ss;
+		ss << "RepeatDate::changeValue: " << toString() << "\nThe new date should be in the range[" << start_ << " : " << end_ << "] but found " << the_new_date;
+		throw std::runtime_error(ss.str());
+	}
+	set_value(the_new_date);
+}
+
+void RepeatDate::set_value(long the_new_date)
+{
+   // Note: the node is incremented one past, the last value
+   // In Node we increment() then check for validity
+   // hence the_new_value may be outside of the valid range.
+   // This can be seen when do a incremental sync,
+   // *hence* allow memento to copy the value as is.
+   value_ = the_new_date;
+   incr_state_change_no();
+}
+
+//int RepeatDate::length() const
+//{
+//	std::string start = boost::lexical_cast<std::string>(start_);
+//	std::string end = boost::lexical_cast<std::string>(end_);
+//	date startDate(from_undelimited_string(start));
+//	date endDate(from_undelimited_string(end));
+//	date_period period(startDate,endDate);
+// 	return  ( period.length().days() / delta_);
+//}
+
+//void RepeatDate::truncate(int theLength)
+//{
+//	LOG_ASSERT(theLength < length(),"RepeatDate::truncate");
+////	cout << "   RepeatDate::truncate by " <<  theLength << " BEFORE " << toString();
+//
+//	long julian = 0;
+//	if (delta_ > 0) julian = sms_repeat_date_to_julian(start_ + theLength);
+//	else            julian = sms_repeat_date_to_julian(start_ - theLength);
+//
+//	end_ = sms_repeat_julian_to_date(julian);
+//
+////	cout << " AFTER " << toString() << "\n";
+//}
+
+
+//======================================================================================
+
+RepeatInteger::RepeatInteger( const std::string& variable, int start, int end, int delta ) :
+	RepeatBase( variable ), start_( start ), end_( end ), delta_( delta ), value_( start )
+{
+//	cout << toString() << "\n";
+   if ( !Str::valid_name( variable ) ) {
+      throw std::runtime_error("RepeatInteger: Invalid name: " + variable);
+   }
+}
+RepeatInteger::RepeatInteger() : start_( 0 ), end_( 0 ), delta_( 0 ), value_( 0 ) {}
+
+bool RepeatInteger::compare(RepeatBase* rb) const
+{
+	RepeatInteger* rhs = dynamic_cast<RepeatInteger*>(rb);
+	if(!rhs) return false;
+	return operator==(*rhs);
+}
+
+void RepeatInteger::reset() {
+	value_ = start_;
+	incr_state_change_no();
+}
+
+long RepeatInteger::last_valid_value() const
+{
+   if (delta_ > 0) {
+      if (value_ < start_) return start_;
+      if (value_ > end_)   return end_;
+      return value_;
+   }
+   if (value_ > start_) return start_;
+   if (value_ < end_)   return end_;
+   return value_;
+}
+
+void RepeatInteger::increment() {
+	value_ += delta_;
+	incr_state_change_no();
+}
+
+void RepeatInteger::change( const std::string& newValue)
+{
+ 	long the_new_value = 0;
+ 	try {
+ 		the_new_value = boost::lexical_cast< long >( newValue );
+	}
+	catch ( boost::bad_lexical_cast& ) {
+      std::stringstream ss;
+      ss << "RepeatInteger::change:" << toString() << " The new value(" << newValue << ") is not convertible to an long";
+ 		throw std::runtime_error( ss.str() );
+	}
+	changeValue(the_new_value);
+}
+
+void RepeatInteger::changeValue(long the_new_value)
+{
+	if (delta_ > 0) {
+		if (the_new_value < start_ || the_new_value > end_ ) {
+			std::stringstream ss;
+			ss << "RepeatInteger::changeValue:" << toString() << ". The new value should be in the range[" << start_ << "-" << end_ << "] but found " << the_new_value;
+			throw std::runtime_error(ss.str());
+		}
+	}
+	else {
+      if (the_new_value > start_ || the_new_value < end_ ) {
+         std::stringstream ss;
+         ss << "RepeatInteger::changeValue:" << toString() << ". The new value should be in the range[" << start_ << "-" << end_ << "] but found " << the_new_value;
+         throw std::runtime_error(ss.str());
+      }
+	}
+	set_value(the_new_value);
+}
+
+void RepeatInteger::set_value(long the_new_value)
+{
+   // To be used by Memento only. as it does no checking
+   // Note: the node is incremented one past, the last value
+   // In Node we increment() then check for validity
+   // hence the_new_value may be outside of the valid range.
+   // This can be seen when do a incremental sync,
+   // *hence* allow memento to copy the value as is.
+   value_ = the_new_value;
+   incr_state_change_no();
+}
+
+void RepeatInteger::setToLastValue()
+{
+   value_ = end_;
+	incr_state_change_no();
+}
+
+std::string RepeatInteger::toString() const
+{
+	std::stringstream ss;
+	ss << "repeat integer " << name_ << " " << start_ << " " << end_;
+ 	if (delta_ != 1) ss << " " << delta_;
+   if (!PrintStyle::defsStyle() && (value_ != start_)) {
+      ss << " # " << value_;
+   }
+	return ss.str();
+}
+std::string RepeatInteger::dump() const
+{
+	std::stringstream ss;
+	ss << toString() << " value(" << value_ << ")";
+	return ss.str();
+}
+
+bool RepeatInteger::operator==(const RepeatInteger& rhs) const
+{
+	if (name_ != rhs.name_) {
+		return false;
+	}
+	if (start_ != rhs.start_) {
+		return false;
+	}
+	if (end_ != rhs.end_) {
+		return false;
+	}
+	if (delta_ != rhs.delta_) {
+		return false;
+	}
+   if (value_ != rhs.value_) {
+      return false;
+   }
+	return true;
+}
+
+std::string RepeatInteger::valueAsString() const
+{
+	/// will throw a boost::bad_lexical_cast& if value is not convertible to a string
+ 	try {
+		return boost::lexical_cast< std::string >( last_valid_value() );
+	}
+	catch ( boost::bad_lexical_cast& ) { LOG_ASSERT(false,"");}
+	return string();
+}
+
+std::string RepeatInteger::value_as_string(int index) const
+{
+   /// will throw a boost::bad_lexical_cast& if value is not convertible to a string
+   try {
+      return boost::lexical_cast< std::string >( index );
+   }
+   catch ( boost::bad_lexical_cast& ) {}
+   return string();
+}
+
+//void RepeatInteger::truncate(int theLength)
+//{
+////	 cout << "   RepeatInteger::truncate by " <<  theLength << " BEFORE " << toString();
+//
+//	LOG_ASSERT(theLength < length(),"");
+//	 end_ = start_ + (theLength * delta_);
+//
+////	 cout << " AFTER " << toString() << "\n";
+//}
+
+//======================================================================================
+
+RepeatEnumerated::RepeatEnumerated( const std::string& variable, const std::vector<std::string>& theEnums)
+: RepeatBase(variable), theEnums_(theEnums), currentIndex_(0)
+{
+   if ( !Str::valid_name( variable ) ) {
+      throw std::runtime_error("RepeatEnumerated: Invalid name: " + variable);
+   }
+}
+
+int RepeatEnumerated::end() const   {
+	if ( theEnums_.empty() ) return 0;
+	return static_cast<int>(theEnums_.size()-1);
+}
+
+bool RepeatEnumerated::compare(RepeatBase* rb) const
+{
+	RepeatEnumerated* rhs = dynamic_cast<RepeatEnumerated*>(rb);
+	if(!rhs) return false;
+	return operator==(*rhs);
+}
+
+std::string RepeatEnumerated::toString() const
+{
+	std::stringstream ss;
+ 	ss << "repeat enumerated " << name_;
+ 	BOOST_FOREACH(const string& s, theEnums_) { ss << " \"" << s << "\""; }
+ 	if (!PrintStyle::defsStyle() && (currentIndex_ != 0)) {
+ 	   ss << " # " << currentIndex_;
+ 	}
+  	return ss.str();
+}
+std::string RepeatEnumerated::dump() const
+{
+	std::stringstream ss;
+	ss << toString() << " ordinal-value(" << value() << ")   value-as-string(" << valueAsString() << ")";
+ 	return ss.str();
+}
+
+void RepeatEnumerated::reset() {
+	currentIndex_ = 0;
+	incr_state_change_no();
+}
+
+void RepeatEnumerated::increment() {
+	currentIndex_++;
+	incr_state_change_no();
+}
+
+long RepeatEnumerated::value() const
+{
+   if (currentIndex_ >= 0 && currentIndex_ < static_cast<int>(theEnums_.size()) ) {
+      try {
+         return boost::lexical_cast<int>( theEnums_[currentIndex_] );
+      }
+      catch ( boost::bad_lexical_cast& ) {
+         // Ignore and return currentIndex_
+      }
+   }
+   return currentIndex_;
+}
+
+long RepeatEnumerated::last_valid_value() const
+{
+   if (!theEnums_.empty()) {
+      if (currentIndex_ < 0) {
+         try { return boost::lexical_cast<int>( theEnums_[0] ); }
+         catch ( boost::bad_lexical_cast& ) { /* Ignore and return first index */ }
+         return 0;
+      }
+      if (currentIndex_ >= static_cast<int>(theEnums_.size())) {
+
+         try { return boost::lexical_cast<int>( theEnums_[theEnums_.size()-1] ); }
+         catch ( boost::bad_lexical_cast& ) { /* Ignore and return last index */ }
+         return static_cast<long>(theEnums_.size()-1);
+      }
+
+      // return current value as integer or as index
+      return value();
+   }
+   return 0;
+}
+
+void RepeatEnumerated::setToLastValue()
+{
+	currentIndex_ = static_cast< int > ( theEnums_.size()  - 1);
+	if (currentIndex_ < 0) currentIndex_ = 0;
+	incr_state_change_no();
+}
+
+std::string RepeatEnumerated::valueAsString() const
+{
+   // This must always return a valid value
+   if (!theEnums_.empty()) {
+
+      // Returns the last valid value
+      if (currentIndex_ < 0)
+         return theEnums_[0]; // return first
+
+      if (currentIndex_ >= static_cast<int>(theEnums_.size())) {
+         return theEnums_[theEnums_.size()-1]; // return last
+      }
+
+      return theEnums_[currentIndex_];
+   }
+   return std::string();
+}
+
+std::string RepeatEnumerated::value_as_string(int index) const
+{
+   if (index >= 0 && index < static_cast<int>(theEnums_.size())) {
+      return theEnums_[index];
+   }
+   return std::string();
+}
+
+void RepeatEnumerated::change( const std::string& newValue)
+{
+	// See if if matches one of the enums
+	for(size_t i = 0; i < theEnums_.size(); i++) {
+		if ( theEnums_[i] == newValue) {
+			currentIndex_ = i;
+			incr_state_change_no();
+			return;
+		}
+	}
+
+	// If the value is convertible to an integer, treat as an index
+  	try {
+ 		long the_new_value = boost::lexical_cast< long >( newValue );
+ 		changeValue(the_new_value); // can throw if out of range
+ 		return;
+	}
+	catch ( boost::bad_lexical_cast& ) {}
+
+
+	std::stringstream ss;
+	ss << "RepeatEnumerated::change:" << toString() << "\nThe new value " << newValue << " is not a valid index or a member of the enumerated list\n";
+	throw std::runtime_error(ss.str());
+}
+
+void RepeatEnumerated::changeValue( long the_new_value)
+{
+ 	if ( the_new_value < 0 || the_new_value >= static_cast<int>(theEnums_.size())) {
+		std::stringstream ss;
+		ss << "RepeatEnumerated::changeValue:" << toString() << "\nThe new value '" << the_new_value << "' is not a valid index ";
+		ss << "expected range[0-" << theEnums_.size()-1 << "] but found '" << the_new_value << "'";
+		throw std::runtime_error( ss.str() );
+	}
+ 	set_value(the_new_value);
+}
+
+void RepeatEnumerated::set_value(long the_new_value)
+{
+   // Note: the node is incremented one past, the last value
+   // In Node we increment() then check for validity
+   // hence the_new_value may be outside of the valid range.
+   // This can be seen when do a incremental sync,
+   // *hence* allow memento to copy the value as is.
+   currentIndex_ = the_new_value;
+   incr_state_change_no();
+}
+
+bool RepeatEnumerated::operator==(const RepeatEnumerated& rhs) const
+{
+	if (name_ != rhs.name_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatEnumerated::operator==( name_(" << name_ << ") != rhs.name_(" << rhs.name_ << "))\n";
+      }
+#endif
+		return false;
+	}
+	if (theEnums_ != rhs.theEnums_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatEnumerated::operator==( theEnums_ != rhs.theEnums_ )\n";
+      }
+#endif
+		return false;
+	}
+   if (currentIndex_ != rhs.currentIndex_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatEnumerated::operator==( currentIndex_(" << currentIndex_ << ") != rhs.currentIndex_(" << rhs.currentIndex_ << "))\n";
+      }
+#endif
+      return false;
+   }
+	return true;
+}
+
+//void RepeatEnumerated::truncate(int theLength)
+//{
+////	 cout << "   RepeatEnumerated::truncate by " <<  theLength << " BEFORE " << toString();
+//
+//	 LOG_ASSERT(theLength < length(),"");
+//	 while ( static_cast<int>(theEnums_.size()) > theLength) {
+//		 theEnums_.pop_back();
+//	 }
+//
+////	 cout << " AFTER " << toString() << "\n";
+//}
+
+//======================================================================================
+
+RepeatString::RepeatString( const std::string& variable, const std::vector<std::string>& theEnums)
+: RepeatBase(variable), theStrings_(theEnums), currentIndex_(0)
+{
+   if ( !Str::valid_name( variable ) ) {
+      throw std::runtime_error("RepeatString:: Invalid name: " + variable);
+   }
+}
+
+int RepeatString::end() const   {
+	if ( theStrings_.empty() ) return 0;
+	return static_cast<int>(theStrings_.size()-1);
+}
+
+bool RepeatString::compare(RepeatBase* rb) const
+{
+	RepeatString* rhs = dynamic_cast<RepeatString*>(rb);
+	if(!rhs) return false;
+	return operator==(*rhs);
+}
+
+std::string RepeatString::toString() const
+{
+	std::stringstream ss;
+	ss << "repeat string " << name_;
+ 	BOOST_FOREACH(const string& s, theStrings_) { ss << " \"" << s << "\""; }
+   if (!PrintStyle::defsStyle() && (currentIndex_ != 0)) {
+      ss << " # " << value();
+   }
+ 	return ss.str();
+}
+std::string RepeatString::dump() const
+{
+	std::stringstream ss;
+	ss << toString() << " ordinal-value(" << value() << ")   value-as-string(" << valueAsString() << ")";
+ 	return ss.str();
+}
+
+void RepeatString::reset() {
+	currentIndex_ = 0;
+	incr_state_change_no();
+}
+
+long RepeatString::last_valid_value() const
+{
+   if (!theStrings_.empty()) {
+      if (currentIndex_ < 0)  return 0;
+      if (currentIndex_ >= static_cast<int>(theStrings_.size())) return static_cast<long>(theStrings_.size()-1);
+      return currentIndex_;
+   }
+   return 0;
+}
+
+void RepeatString::increment() {
+	currentIndex_++;
+	incr_state_change_no();
+}
+
+void RepeatString::setToLastValue() {
+	currentIndex_ = static_cast<int>(theStrings_.size()-1);
+   if (currentIndex_ < 0) currentIndex_ = 0;
+	incr_state_change_no();
+}
+
+std::string RepeatString::valueAsString() const
+{
+   if (!theStrings_.empty()) return theStrings_[last_valid_value()];
+   return std::string();
+}
+
+std::string RepeatString::value_as_string(int index) const
+{
+   if (index >= 0 && index < static_cast<int>(theStrings_.size())) {
+      return theStrings_[index];
+   }
+   return std::string();
+}
+
+void RepeatString::change( const std::string& newValue)
+{
+	// See if if matches one of the strings
+	for(size_t i = 0; i < theStrings_.size(); i++) {
+		if ( theStrings_[i] == newValue) {
+			currentIndex_ = i;
+			incr_state_change_no();
+			return;
+		}
+	}
+
+	// If the value is convertible to an integer, treat as an index
+  	try {
+ 		long the_new_value = boost::lexical_cast< int >( newValue );
+ 		changeValue(the_new_value);
+ 		return;
+	}
+	catch ( boost::bad_lexical_cast& ) {}
+
+	std::stringstream ss;
+	ss << "RepeatString::change: " << toString() << "\nThe new value " << newValue << " is not a valid index or member of the string list";
+	throw std::runtime_error(ss.str());
+}
+
+void RepeatString::changeValue( long the_new_value)
+{
+	if ( the_new_value < 0 || the_new_value >= static_cast<int>(theStrings_.size())) {
+		std::stringstream ss;
+		ss << "RepeatString::change: " << toString() << " The new the integer " << the_new_value << " is not a valid index ";
+		ss << "expected range[0-" << theStrings_.size()-1 << "]'";
+		throw std::runtime_error( ss.str() );
+	}
+	set_value(the_new_value);
+}
+
+void RepeatString::set_value(long the_new_value)
+{
+   // Note: the node is incremented one past, the last value
+   // In Node we increment() then check for validity
+   // hence the_new_value may be outside of the valid range.
+   // This can be seen when do a incremental sync,
+   // *hence* allow memento to copy the value as is.
+   currentIndex_ = the_new_value;
+   incr_state_change_no();
+}
+
+bool RepeatString::operator==(const RepeatString& rhs) const
+{
+	if (name_ != rhs.name_) {
+		return false;
+	}
+	if (theStrings_ != rhs.theStrings_) {
+		return false;
+	}
+   if (currentIndex_ != rhs.currentIndex_) {
+      return false;
+   }
+	return true;
+}
+
+//void RepeatString::truncate(int theLength)
+//{
+////	 cout << "   RepeatString::truncate by " <<  theLength << " BEFORE " << toString();
+//
+//	 LOG_ASSERT(theLength < length(),"");
+//	 while ( static_cast<int>(theStrings_.size()) > theLength) {
+//		 theStrings_.pop_back();
+//	 }
+//
+////	 cout << " AFTER " << toString() << "\n";
+//}
+
+//=======================================================================================
+
+bool RepeatDay::compare(RepeatBase* rb) const
+{
+	RepeatDay* rhs = dynamic_cast<RepeatDay*>(rb);
+	if(!rhs) return false;
+	return operator==(*rhs);
+}
+
+std::string RepeatDay::toString() const
+{
+	std::stringstream ss;
+	ss << "repeat day " << step_;
+ 	return ss.str();
+}
+
+std::string RepeatDay::dump() const
+{
+	return toString();
+}
+
+bool RepeatDay::operator==(const RepeatDay& rhs) const
+{
+	if (step_ != rhs.step_) {
+		return false;
+	}
+	return true;
+}
+
+BOOST_CLASS_EXPORT_IMPLEMENT(RepeatDate);
+BOOST_CLASS_EXPORT_IMPLEMENT(RepeatInteger);
+BOOST_CLASS_EXPORT_IMPLEMENT(RepeatEnumerated);
+BOOST_CLASS_EXPORT_IMPLEMENT(RepeatString);
+BOOST_CLASS_EXPORT_IMPLEMENT(RepeatDay);
diff --git a/ecflow_4_0_7/ANattr/src/RepeatAttr.hpp b/ecflow_4_0_7/ANattr/src/RepeatAttr.hpp
new file mode 100644
index 0000000..811f85c
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/RepeatAttr.hpp
@@ -0,0 +1,479 @@
+#ifndef REPEATATTR_HPP_
+#define REPEATATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #51 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Repeat Attribute. Please note that for repeat string, enumeration
+//               the positional index is used for evaluation.
+//
+// Simulation: Simulation must not affect the real job submission in the server.
+//  o Infinite repeats cause problems with simulation, hence we have
+//    a mechanism to stop this, when reset is called, via server this is disabled
+//  o The other problem is long repeats. The current solution truncates the
+//    repeats. However this is not acceptable and has been commented out,
+//    until we can find a better way. (i.e need a simulation mode, where
+//    we can truncate a length, this would be ignored in the server)
+//============================================================================
+
+#include <ostream>
+#include "boost_archive.hpp" // collates boost archive includes
+
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+#include <boost/serialization/assume_abstract.hpp>
+#include <boost/serialization/export.hpp>   // explicit code for exports (place last) , needed for BOOST_CLASS_EXPORT
+
+#include <boost/utility.hpp>
+
+#include "Variable.hpp"
+
+/////////////////////////////////////////////////////////////////////////
+// Node can only have one repeat.
+//
+class RepeatBase {
+public:
+   RepeatBase(const std::string& name) : state_change_no_(0), name_(name) {}
+   RepeatBase() : state_change_no_(0) {}
+   virtual ~RepeatBase();
+
+   /// make non virtual so that it can be in-lined. Called millions of times
+   const std::string& name() const { return name_; }
+   const Variable& gen_variable() const { return var_; }
+   Variable& set_gen_variable() const { return var_; }
+
+   virtual int start() const = 0;
+   virtual int end() const = 0;
+   virtual int step() const = 0;
+
+   // After Repeat expiration the last call to increment() can cause
+   // value to be beyond the last valid value
+   // Depending on the kind of repeat the returned can be value or the current index
+   // RepeatDate       -> value
+   // RepeatString     -> index into array of strings
+   // RepeatInteger    -> value
+   // RepeatEnumerated -> index | value return value at index if cast-able to integer, otherwise return index ******
+   // RepeatDay        -> value
+   virtual long value() const = 0;
+
+   // Depending on the kind of repeat the returned can be value or *current* index
+   // RepeatDate       -> value
+   // RepeatString     -> index  ( will always return a index)
+   // RepeatInteger    -> value
+   // RepeatEnumerated -> index  ( will always return a index)
+   // RepeatDay        -> value
+   virtual long index_or_value() const = 0;
+   virtual void increment() = 0;
+
+   // returns a value with in the range start/end
+   // Hence at Repeat expiration will return value associated with end()
+   virtual long last_valid_value() const  = 0;
+   virtual long last_valid_value_minus(int val) const { return last_valid_value() - val;}
+   virtual long last_valid_value_plus(int val)  const { return last_valid_value() + val;}
+
+   virtual RepeatBase* clone() const = 0;
+   virtual bool compare(RepeatBase*) const = 0;
+   virtual bool valid() const = 0;
+   virtual void setToLastValue()  = 0;
+   virtual std::string valueAsString() const = 0;            // uses last_valid_value
+   virtual std::string value_as_string(int index) const = 0;// used in test only
+   virtual void reset()  = 0;
+   virtual void change(const std::string& newValue) = 0; // can throw std::runtime_error
+   virtual void changeValue(long newValue) = 0;          // can throw std::runtime_error
+   virtual void set_value(long new_value_or_index) = 0;  // will NOT throw, allows any value
+   virtual std::string toString() const = 0;
+   virtual std::string dump() const = 0;
+
+   unsigned int state_change_no() const { return state_change_no_;}
+
+   /// Simulator functions:
+   virtual bool isInfinite() const  = 0;
+   virtual bool makeInfiniteInValid() { return false;}
+   //	virtual int length() const  = 0;
+   //	virtual void truncate(int length) = 0;
+
+protected:
+   void incr_state_change_no();
+
+   unsigned int state_change_no_;  // *not* persisted, only used on server side
+   std::string name_;
+   mutable Variable var_;          // *not* persisted
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive& ar, const unsigned int /*version*/)
+   {
+      ar & name_;
+   }
+};
+
+///
+/// The date has no meaning in a physical sense, only used as a for loop over dates
+class RepeatDate : public RepeatBase {
+public:
+   RepeatDate( const std::string& variable, int start, int end, int delta = 1/* always in days*/);
+   RepeatDate() :  start_(0), end_(0), delta_(0), value_(0)  {}
+
+   virtual int start() const  { return start_; }
+   virtual int end() const    { return end_;   }
+   virtual int step() const   { return delta_; }
+   virtual long value() const { return value_; }
+   virtual long index_or_value() const { return value_;}
+   virtual long last_valid_value() const;
+   virtual long last_valid_value_minus(int value) const;
+   virtual long last_valid_value_plus(int value) const;
+
+   void delta(int d) { delta_ = d;}
+   bool operator==(const RepeatDate& rhs) const;
+
+   virtual RepeatDate* clone() const { return new RepeatDate(name_, start_, end_, delta_, value_) ; }
+   virtual bool compare(RepeatBase*) const;
+   virtual bool valid() const { return (delta_ > 0) ? ( value_ <= end_) : (value_ >= end_); }
+   virtual std::string valueAsString() const;
+   virtual std::string value_as_string(int index) const;
+   virtual void setToLastValue();
+   virtual void reset();
+   virtual void increment();
+   virtual void change(const std::string& newValue); // can throw std::runtime_error
+   virtual void changeValue(long newValue);          // can throw std::runtime_error
+   virtual void set_value(long newValue);            // will NOT throw, allows any value
+
+   virtual std::string toString() const;
+   virtual std::string dump() const;
+
+   /// Simulator functions:
+   virtual bool isInfinite() const { return false;}
+   //	virtual int length() const; // for use by simulator
+   //	virtual void truncate(int); // for use by simulator
+
+private:
+   RepeatDate( const std::string& name, int start, int end, int delta, long value)
+   : RepeatBase(name),start_(start),end_(end),delta_(delta),value_(value) {}
+
+private:
+   int  start_;
+   int  end_;
+   int  delta_;
+   long value_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<RepeatBase>(*this);
+      ar & start_;
+      ar & end_;
+      ar & delta_;
+      ar & value_;
+   }
+};
+
+class RepeatInteger : public RepeatBase {
+public:
+   RepeatInteger( const std::string& variable, int start, int end, int delta = 1);
+   RepeatInteger();
+
+   bool operator==(const RepeatInteger& rhs) const;
+
+   virtual int start() const { return start_; }
+   virtual int end() const   { return end_; }
+   virtual int step() const  { return delta_;}
+   virtual long value() const { return value_;}
+   virtual long index_or_value() const { return value_;}
+   virtual long last_valid_value() const;
+
+   virtual RepeatInteger* clone() const { return new RepeatInteger(name_, start_, end_, delta_, value_); }
+   virtual bool compare(RepeatBase*) const;
+   virtual bool valid() const { return (delta_ > 0) ? ( value_ <= end_) : (value_ >= end_); }
+   virtual std::string valueAsString() const;
+   virtual std::string value_as_string(int index) const;
+   virtual void setToLastValue();
+   virtual void reset();
+   virtual void increment();
+   virtual void change(const std::string& newValue); // can throw std::runtime_error
+   virtual void changeValue(long newValue);          // can throw std::runtime_error
+   virtual void set_value(long newValue);            // will NOT throw, allows any value
+   virtual std::string toString() const;
+   virtual std::string dump() const;
+
+   /// Simulator functions:
+   virtual bool isInfinite() const { return false;}
+   //	virtual int length() const { return std::abs( (end_-start_)+1/delta_ ) ;}
+   //	virtual void truncate(int);
+
+private:
+   RepeatInteger( const std::string& name, int start, int end, int delta, long value)
+   : RepeatBase(name), start_(start), end_(end), delta_(delta), value_(value) {}
+
+private:
+   int  start_;
+   int  end_;
+   int  delta_;
+   long  value_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<RepeatBase>(*this);
+      ar & start_;
+      ar & end_;
+      ar & delta_;
+      ar & value_;
+   }
+};
+
+
+class RepeatEnumerated : public RepeatBase {
+public:
+   RepeatEnumerated( const std::string& variable, const std::vector<std::string>& theEnums);
+   RepeatEnumerated() : currentIndex_(0) {}
+
+   bool operator==(const RepeatEnumerated& rhs) const;
+
+   virtual int start() const { return 0; }
+   virtual int end() const;
+   virtual int step() const { return 1 ;}
+   virtual long value() const; // return value at index if cast-able to integer, otherwise return index
+   virtual long index_or_value() const { return currentIndex_;}
+   virtual long last_valid_value() const;
+
+   virtual RepeatBase* clone() const { return new RepeatEnumerated(name_,theEnums_,currentIndex_); }
+   virtual bool compare(RepeatBase*) const;
+   virtual bool valid() const { return  (currentIndex_ >=0 && currentIndex_ < static_cast<int>(theEnums_.size())); }
+   virtual std::string valueAsString() const;
+   virtual std::string value_as_string(int index) const;
+   virtual void setToLastValue();
+   virtual void reset();
+   virtual void increment();
+   virtual void change(const std::string& newValue); // can throw std::runtime_error
+   virtual void changeValue(long newValue);          // can throw std::runtime_error
+   virtual void set_value(long newValue);            // will NOT throw, allows any value
+   virtual std::string toString() const;
+   virtual std::string dump() const;
+
+   /// Simulator functions:
+   virtual bool isInfinite() const { return false;}
+   //	virtual int length() const { return static_cast<int>(theEnums_.size());}  // for use by simulator
+   //	virtual void truncate(int);     // for use by simulator
+
+private:
+   RepeatEnumerated( const std::string& variable, const std::vector<std::string>& theEnums, int index)
+   : RepeatBase(variable), theEnums_(theEnums), currentIndex_(index) {}
+
+private:
+   std::vector<std::string> theEnums_;
+   int currentIndex_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<RepeatBase>(*this);
+      ar & theEnums_;
+      ar & currentIndex_;
+   }
+};
+
+class RepeatString : public RepeatBase {
+public:
+   RepeatString( const std::string& variable, const std::vector<std::string>& theEnums);
+   RepeatString() : currentIndex_(0) {}
+
+   bool operator==(const RepeatString& rhs) const;
+
+   virtual int start() const { return 0; }
+   virtual int end() const;
+   virtual int step() const { return 1;}
+   virtual long value() const { return currentIndex_;}
+   virtual long index_or_value() const { return currentIndex_;}
+   virtual long last_valid_value() const; // returns the index
+
+   virtual RepeatBase* clone() const { return new RepeatString(name_,theStrings_,currentIndex_); }
+   virtual bool compare(RepeatBase*) const;
+   virtual bool valid() const { return  (currentIndex_ >=0 && currentIndex_ < static_cast<int>(theStrings_.size())); }
+   virtual std::string valueAsString() const;
+   virtual std::string value_as_string(int index) const;
+   virtual void setToLastValue();
+   virtual void reset();
+   virtual void increment();
+   virtual void change(const std::string& newValue); // can throw std::runtime_error
+   virtual void changeValue(long newValue);          // can throw std::runtime_error
+   virtual void set_value(long newValue);            // will NOT throw, allows any value
+   virtual std::string toString() const;
+   virtual std::string dump() const;
+
+   /// Simulator functions:
+   virtual bool isInfinite() const { return false;}
+   //	virtual int length() const { return static_cast<int>(theStrings_.size());}
+   //	virtual void truncate(int);
+
+private:
+   RepeatString( const std::string& variable, const std::vector<std::string>& theEnums, int index)
+   : RepeatBase(variable), theStrings_(theEnums), currentIndex_(index) {}
+
+private:
+   std::vector<std::string> theStrings_;
+   int currentIndex_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<RepeatBase>(*this);
+      ar & theStrings_;
+      ar & currentIndex_;
+   }
+};
+
+/// The current repeat day is not that well defined or deterministic.
+///  **** Currently I have not come across any suites that use an end-date ****
+///   o If the suite has defined a real clock
+///     then number of repeats is deterministic
+///     However if the end-date is less than suite clock this should be reported as error
+///   o Currently under the hybrid clock the date is not updated, this raises
+///     a whole lot of issues. (We don't wont a separate calendar, just for this).
+///   o If there is _no_ suite clock, then we must use the current day
+///     now the number of repeats  varies, and if end-date is less than the current
+///     day we need to report an error
+///  Its not clear what behaviour is required here, hence I will not implement
+///  the end-date functionality. Until there is clear requirement is this area.
+///  end-date will be treated as a parser error.
+///  The minimum deterministic functionality here is to implement the infinite
+///  repeat that has no end date
+///
+/// RepeatDay do not really have a name: However we need maintain invariant that all NON-empty repeats
+/// have a name. Hence the name will be as day
+/// Note: this applies to the clone as well
+class RepeatDay : public RepeatBase {
+public:
+   RepeatDay( int step ) : RepeatBase("day"), step_(step),valid_(true)  {}
+   RepeatDay() : step_(1),valid_(true)  {}
+
+   bool operator==(const RepeatDay& rhs) const;
+
+   virtual int start() const { return 0; }
+   virtual int end() const   { return 0; }
+   virtual int step() const  { return step_;}
+   virtual void increment() { /* do nothing */ }
+   virtual long value() const { return step_;}
+   virtual long index_or_value() const { return step_;}
+   virtual long last_valid_value() const { return step_;}
+
+   virtual RepeatBase* clone() const { return new RepeatDay(step_,valid_); }
+   virtual bool compare(RepeatBase*) const;
+   virtual bool valid() const { return valid_;}
+   virtual std::string valueAsString() const { return std::string(); } ;
+   virtual std::string value_as_string(int index) const { return std::string(); }
+   virtual void setToLastValue() { /* do nothing  ?? */ }
+   virtual void reset() {  valid_ = true;  }
+   virtual void change(const std::string& /*newValue*/) { /* do nothing */ }
+   virtual void changeValue( long /*newValue*/)         { /* do nothing */ }
+   virtual void set_value(long /*newValue*/)            { /* do nothing */ }
+   virtual std::string toString() const;
+   virtual std::string dump() const;
+
+   /// Simulator functions:
+   virtual bool isInfinite() const { return true;}
+   virtual bool makeInfiniteInValid() { valid_ = false; return true;}
+   //	virtual int length() const { return 0;}    // because its infinite for use by simulator
+   //	virtual void truncate(int) {}
+
+private:
+   RepeatDay( int step, bool valid) : RepeatBase("day"), step_(step),valid_(valid)  {}
+
+private:
+   int step_;
+   bool valid_;  // not persisted since only used in simulator
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<RepeatBase>(*this);
+      ar & step_;
+   }
+};
+
+class Repeat {
+public:
+   Repeat(); // for serialisation
+   Repeat( const RepeatDate& );
+   Repeat( const RepeatInteger& );
+   Repeat( const RepeatEnumerated& );
+   Repeat( const RepeatString& );
+   Repeat( const RepeatDay& );
+   Repeat( const Repeat& );
+   ~Repeat();
+   Repeat& operator=(const Repeat& rhs);
+   bool operator==(const Repeat& rhs) const;
+
+   bool empty() const { return (repeatType_) ? false : true; }
+   void clear() { delete repeatType_; repeatType_ = 0;}
+
+   const std::string& name() const;
+   const Variable& gen_variable() const;
+   void update_repeat_genvar() const;
+
+   int start() const  { return (repeatType_) ? repeatType_->start() : 0;}
+   int end() const    { return (repeatType_) ? repeatType_->end()   : 0;}
+   int step() const   { return (repeatType_) ? repeatType_->step()  : 0;}
+   long value() const { return (repeatType_) ? repeatType_->value() : 0;}
+   long index_or_value() const { return (repeatType_) ? repeatType_->index_or_value() : 0;}
+   long last_valid_value() const { return (repeatType_) ? repeatType_->last_valid_value() : 0;}
+   long last_valid_value_minus(int val) const { return (repeatType_) ? repeatType_->last_valid_value_minus(val) : -val;}
+   long last_valid_value_plus(int val)  const { return (repeatType_) ? repeatType_->last_valid_value_plus(val)  : val;}
+
+   std::ostream& print(std::ostream& os) const;
+   bool valid() const                           { return (repeatType_) ? repeatType_->valid() : false;}
+   void setToLastValue()                        { if (repeatType_) repeatType_->setToLastValue() ; }
+   std::string valueAsString() const            { return (repeatType_) ? repeatType_->valueAsString() : std::string(); }
+   std::string value_as_string(int index) const { return (repeatType_) ? repeatType_->value_as_string(index) : std::string(); }
+   void reset()                                 { if (repeatType_) repeatType_->reset();}
+   void increment()                             { if (repeatType_) repeatType_->increment();}
+   void change( const std::string& newValue )   { if (repeatType_) repeatType_->change(newValue); }
+   void changeValue( long newValue )            { if (repeatType_) repeatType_->changeValue(newValue); }
+   void set_value( long newValue )              { if (repeatType_) repeatType_->set_value(newValue); }
+   std::string toString() const                 { return (repeatType_) ? repeatType_->toString() : std::string();}
+   std::string dump() const                     { return (repeatType_) ? repeatType_->dump() : std::string();} // additional state
+   unsigned int state_change_no() const         { return (repeatType_) ? repeatType_->state_change_no() : 0; }
+
+   /// simulator functions: Note: any flags set by makeInfiniteInValid() are reset by reset()
+   bool isInfinite() const                      { return (repeatType_) ? repeatType_->isInfinite() : false;}
+   bool makeInfiniteInValid()                   { return (repeatType_) ? repeatType_->makeInfiniteInValid() : false; } // for simulator only
+   //	int length() const                           { return (repeatType_) ? repeatType_->length() : 0;}   // for simulator only
+   //	void truncate(int length)                    { if (repeatType_) repeatType_->truncate(length);}     // for simulator only
+
+   // Allows Repeat's to be returned by reference
+   static const Repeat& EMPTY();
+
+   /// Expose base for the GUI only, use with caution
+   RepeatBase* repeatBase() const { return repeatType_;}
+
+private:
+   RepeatBase* repeatType_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & repeatType_;
+   }
+};
+
+BOOST_CLASS_EXPORT_KEY(RepeatDate)
+BOOST_CLASS_EXPORT_KEY(RepeatInteger)
+BOOST_CLASS_EXPORT_KEY(RepeatEnumerated)
+BOOST_CLASS_EXPORT_KEY(RepeatString)
+BOOST_CLASS_EXPORT_KEY(RepeatDay)
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(Repeat, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(Repeat,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/TimeAttr.cpp b/ecflow_4_0_7/ANattr/src/TimeAttr.cpp
new file mode 100644
index 0000000..65ffac8
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/TimeAttr.cpp
@@ -0,0 +1,188 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #40 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <sstream>
+
+#include "TimeAttr.hpp"
+#include "Indentor.hpp"
+#include "Calendar.hpp"
+#include "PrintStyle.hpp"
+#include "Ecf.hpp"
+
+namespace ecf {
+
+void TimeAttr::calendarChanged( const ecf::Calendar& c )
+{
+   if ( makeFree_ ) {
+      return;
+   }
+
+   if (timeSeries_.calendarChanged(c)) {
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+
+   // For a time series, we rely on the re queue to reset makeFree
+   if (isFree(c)) {
+      setFree();
+   }
+}
+
+void TimeAttr::resetRelativeDuration()
+{
+   if (timeSeries_.resetRelativeDuration()) {
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+}
+
+std::ostream& TimeAttr::print(std::ostream& os) const
+{
+   Indentor in;
+   Indentor::indent(os) << toString();
+   if (!PrintStyle::defsStyle()) {
+      os << timeSeries_.state_to_string(makeFree_);
+   }
+   os << "\n";
+   return os;
+}
+
+std::string TimeAttr::toString() const
+{
+   std::string ret = "time ";
+   ret += timeSeries_.toString();
+   return ret;
+}
+
+std::string TimeAttr::dump() const
+{
+	std::stringstream ss;
+	ss << "time ";
+
+    if (makeFree_) ss << "(free) ";
+    else           ss << "(holding) ";
+
+ 	ss << timeSeries_.dump();
+
+ 	return ss.str();
+}
+
+bool TimeAttr::operator==(const TimeAttr& rhs) const
+{
+	if (makeFree_ != rhs.makeFree_) {
+		return false;
+	}
+ 	return timeSeries_.operator==(rhs.timeSeries_);
+}
+
+bool TimeAttr::structureEquals(const TimeAttr& rhs) const
+{
+   return timeSeries_.structureEquals(rhs.timeSeries_);
+}
+
+bool TimeAttr::isFree(const ecf::Calendar& calendar) const
+{
+	// The FreeDepCmd can be used to free the time,
+ 	if (makeFree_) {
+		return true;
+	}
+ 	return is_free(calendar);
+}
+
+bool TimeAttr::is_free(const ecf::Calendar& calendar) const
+{
+	return timeSeries_.isFree(calendar);
+}
+
+void TimeAttr::setFree() {
+	makeFree_ = true;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "TimeAttr::setFree()\n";
+#endif
+}
+
+void TimeAttr::clearFree() {
+	makeFree_ = false;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "TimeAttr::clearFree()\n";
+#endif
+}
+
+void TimeAttr::miss_next_time_slot()
+{
+   timeSeries_.miss_next_time_slot();
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+
+bool TimeAttr::why(const ecf::Calendar& c, std::string& theReasonWhy) const
+{
+	if (isFree(c)) return false;
+	theReasonWhy += "is time dependent";
+
+	// Check to see if time has expired, if has not, then report why
+	if (timeSeries_.is_valid()) {
+	   // This can apply to single and series
+	   boost::posix_time::time_duration calendar_time = timeSeries_.duration(c);
+	   if (calendar_time < timeSeries_.start().duration()) {
+	      timeSeries_.why(c, theReasonWhy);
+	      return true;
+	   }
+
+	   // calendar_time >= timeSeries_.start().duration()
+	   if (timeSeries_.hasIncrement()) {
+	      if (calendar_time < timeSeries_.finish().duration()) {
+	         timeSeries_.why(c, theReasonWhy);
+	         return true;
+	      }
+	   }
+      // calendar_time >= timeSeries_.start().duration() && calendar_time >= timeSeries_.finish().duration()
+      // past the end of time slot, hence this should not hold job generation,
+	}
+
+	// the time has expired
+   theReasonWhy += " ( '";
+   theReasonWhy += toString();
+   theReasonWhy += "' has expired,";
+
+   // take into account, user can use run/force complete to miss time slots
+   bool do_a_requeue = timeSeries_.requeueable(c);
+   if (do_a_requeue) {
+      TimeSlot the_next_time_slot = timeSeries_.compute_next_time_slot(c);
+      if (the_next_time_slot.isNULL() || !timeSeries_.hasIncrement() ) {
+         theReasonWhy += " *re-queue* to run at this time";
+      }
+      else {
+         theReasonWhy += " *re-queue* to run at ";
+         theReasonWhy += the_next_time_slot.toString() ;
+      }
+   }
+   else {
+      boost::gregorian::date_duration one_day(1);
+      boost::gregorian::date the_next_date = c.date();  // todays date
+      the_next_date += one_day;                         // add one day, so its in the future
+
+      theReasonWhy += " next run tomorrow at ";
+      theReasonWhy += timeSeries_.start().toString();
+      theReasonWhy += " ";
+      theReasonWhy += to_simple_string( the_next_date );
+   }
+   theReasonWhy += " )";
+
+ 	return true;
+}
+}
diff --git a/ecflow_4_0_7/ANattr/src/TimeAttr.hpp b/ecflow_4_0_7/ANattr/src/TimeAttr.hpp
new file mode 100644
index 0000000..165a740
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/TimeAttr.hpp
@@ -0,0 +1,134 @@
+#ifndef TIMEATTR_HPP_
+#define TIMEATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/// isFree is called when a node is queued.If it returns true, Task can be submitted
+/// checkForReque: is called when a node has completed, and need to determine if it should run again.
+/// These are different/orthogonal concerns.
+/// There is a *separate* issue of whether nodes should be queued when a node is *manually*
+///    a/ Set complete
+///    b/ Runs and then completes
+///
+/// For a *single* time slot we can't requeue.
+/// Hence we checkForReque that takes as parameters max/min time slots, so we **treat**
+/// Multiple single slot as a series.
+///
+///                                               isFree:hhhhhhhhhhhhhhhhh
+///                                               Begin:
+///                                               V
+///checkForReque:rrrrrrrrrrrrrrrrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh   10:00
+///checkForReque:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrhhhhhhhhhhhhhhhhhhhhhhh   11:00
+///checkForReque:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrhhhhhhhhhhhhhhhhhhhhhhh   for both 10:00 and 11:000 together
+///       isFree:hhhhhhhhhhhhhhhhffffffffffffffffffffffffffffffffffff   *once* free we stay free (single slot *only*)
+///       begin :                |                           |
+///        V                     |                           |
+/// Time   ======================0============0==============0=============
+///                            10:00        11:00              Midnight
+//
+///                                                     isFree:hhhhhhhhhhhhhhhhhh
+///                                                      V
+///   CheckForReque:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+///          isFree:hhhhhhhFhhhhFhhhhFhhhhFhhhhFhhhhFhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+///            V           |    |    |    |    |    |        |
+/// Time   ================o====|====|====|====|====0========0====================
+///                      10:00  1    2    3    4  15:00    Midnight
+///
+/// If the job starts at 10:00 but takes more than 1 hour, then it will miss the 11:00 slot
+/// and will have to start at 12:00
+//============================================================================
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/level.hpp>
+#include "TimeSeries.hpp"
+
+namespace ecf { class Calendar;} // forward declare class
+
+namespace ecf {
+
+// Use compiler ,  destructor, assignment, copy constructor,
+class TimeAttr  {
+public:
+	TimeAttr() : makeFree_(false), state_change_no_(0) {}
+	TimeAttr(int hour, int minute, bool relative = false )
+		: timeSeries_(hour, minute,relative), makeFree_(false),state_change_no_(0) {}
+	TimeAttr(const TimeSlot& t,    bool relative = false )
+		: timeSeries_(t,relative), makeFree_(false),state_change_no_(0) {}
+	TimeAttr(const TimeSeries& ts)
+		: timeSeries_(ts), makeFree_(false),state_change_no_(0) {}
+	TimeAttr(const TimeSlot& start, const TimeSlot& finish, const TimeSlot& incr, bool relative = false)
+		: timeSeries_(start,finish,incr,relative), makeFree_(false),state_change_no_(0) {}
+
+	std::ostream& print(std::ostream&) const;
+   bool operator==(const TimeAttr& rhs) const;
+   bool operator<(const TimeAttr& rhs) const { return timeSeries_ < rhs.timeSeries_; }
+	bool structureEquals(const TimeAttr& rhs) const;
+
+	/// This can set attribute as free, once free its stays free, until re-queue/reset
+	void calendarChanged( const ecf::Calendar& c ); // can set attribute free
+	void resetRelativeDuration();
+
+	void reset(const ecf::Calendar& c)
+	      { clearFree(); timeSeries_.reset(c); }       // updates state_change_no_
+ 	void requeue(const ecf::Calendar& c,bool reset_next_time_slot = true)
+ 	      { clearFree(); timeSeries_.requeue(c,reset_next_time_slot);} // updates state_change_no_
+
+	void miss_next_time_slot(); // updates state_change_no_
+	void setFree();   // ensures that isFree() always returns true, updates state_change_no_
+	bool isSetFree() const { return makeFree_; }
+ 	bool isFree(const ecf::Calendar&) const;
+   bool checkForRequeue( const ecf::Calendar& c,const TimeSlot& the_min,const TimeSlot& the_max) const
+   { return timeSeries_.checkForRequeue(c,the_min,the_max);}
+	void min_max_time_slots(TimeSlot& the_min, TimeSlot& the_max) const {timeSeries_.min_max_time_slots(the_min,the_max);}
+ 	bool why(const ecf::Calendar&, std::string& theReasonWhy) const;
+
+ 	bool checkInvariants(std::string& errormsg) const { return timeSeries_.checkInvariants(errormsg);}
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+   // Note: changes in state of timeSeries_, i.e affect the equality operator (used in test)
+   //       must be captured. i.e things like relative duration & next_time_slot are
+   //       reported by the Why command, & hence need to be synced.
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+   std::string name() const { return toString(); } /* ABO */
+	std::string toString() const;
+	std::string dump() const;
+
+	// access
+	const TimeSeries& time_series() const { return timeSeries_; }
+
+private:
+	void clearFree(); // resets the free flag, updates state_change_no_
+   bool is_free(const ecf::Calendar&) const; // ignores makeFree_
+
+private:
+ 	TimeSeries   timeSeries_;
+	bool         makeFree_;
+	unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+    friend class boost::serialization::access;
+    template<class Archive>
+    void serialize(Archive & ar, const unsigned int /*version*/)
+    {
+     	ar & timeSeries_;
+     	ar & makeFree_;      // Only persisted for testing, see usage of isSetFree()
+    }
+};
+
+}
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ecf::TimeAttr, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(ecf::TimeAttr,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/TodayAttr.cpp b/ecflow_4_0_7/ANattr/src/TodayAttr.cpp
new file mode 100644
index 0000000..e75a26b
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/TodayAttr.cpp
@@ -0,0 +1,193 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #38 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <sstream>
+
+#include "TodayAttr.hpp"
+#include "Calendar.hpp"
+#include "Indentor.hpp"
+#include "Log.hpp"
+#include "PrintStyle.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+std::ostream& TodayAttr::print(std::ostream& os) const
+{
+   Indentor in;
+   Indentor::indent(os) << toString();
+   if (!PrintStyle::defsStyle()) {
+      os << timeSeries_.state_to_string(makeFree_);
+   }
+   os << "\n";
+   return os;
+}
+
+std::string TodayAttr::toString() const
+{
+   std::string ret = "today ";
+   ret += timeSeries_.toString();
+   return ret;
+}
+
+std::string TodayAttr::dump() const
+{
+	std::stringstream ss;
+	ss << "today ";
+
+    if (PrintStyle::getStyle() == PrintStyle::STATE) {
+    	if (makeFree_) ss << "(free) ";
+    	else           ss << "(holding) ";
+    }
+
+ 	ss << timeSeries_.toString();
+
+ 	return ss.str();
+}
+
+bool TodayAttr::operator==(const TodayAttr& rhs) const
+{
+	if (makeFree_ != rhs.makeFree_) {
+		return false;
+	}
+	return timeSeries_.operator==(rhs.timeSeries_);
+}
+
+bool TodayAttr::structureEquals(const TodayAttr& rhs) const
+{
+   return timeSeries_.structureEquals(rhs.timeSeries_);
+}
+
+void TodayAttr::miss_next_time_slot()
+{
+   timeSeries_.miss_next_time_slot();
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void TodayAttr::setFree()
+{
+	makeFree_ = true;
+	state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void TodayAttr::clearFree() {
+	makeFree_ = false;
+	state_change_no_ =  Ecf::incr_state_change_no();
+}
+
+void TodayAttr::calendarChanged( const ecf::Calendar& c )
+{
+   if ( makeFree_ ) {
+      return;
+   }
+
+   if (timeSeries_.calendarChanged(c)) {
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+
+   // For a time series, we rely on the re queue to reset makeFree
+   if (isFree(c)) {
+      setFree();
+   }
+}
+
+void TodayAttr::resetRelativeDuration() {
+   if (timeSeries_.resetRelativeDuration()) {
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+}
+
+bool TodayAttr::isFree(const ecf::Calendar& calendar) const
+{
+	// The FreeDepCmd can be used to free the today,
+ 	if (makeFree_) {
+//		LOG(Log::DBG,"   TodayAttr::isFree makeFree_");
+		return true;
+	}
+ 	return is_free(calendar);
+}
+
+bool TodayAttr::is_free(const ecf::Calendar& calendar) const
+{
+   if (!timeSeries_.hasIncrement()) {
+      if (timeSeries_.duration(calendar) > timeSeries_.start().duration() ) {
+         return true;
+      }
+   }
+
+   // For time series(/range), this  is already handle by timeSeries_
+   // If timer expired return false. otherwise must match one time slot in the range/series
+   return timeSeries_.isFree(calendar);
+}
+
+bool TodayAttr::why(const ecf::Calendar& c, std::string& theReasonWhy) const
+{
+   if (isFree(c)) return false;
+   theReasonWhy += "is today dependent";
+
+   // Check to see if time has expired, if has not, then report why
+   if (timeSeries_.is_valid()) {
+      // This can apply to single and series
+      boost::posix_time::time_duration calendar_time = timeSeries_.duration(c);
+      if (calendar_time < timeSeries_.start().duration()) {
+         timeSeries_.why(c, theReasonWhy);
+         return true;
+      }
+
+      // calendar_time >= timeSeries_.start().duration()
+      if (timeSeries_.hasIncrement()) {
+         if (calendar_time < timeSeries_.finish().duration()) {
+            timeSeries_.why(c, theReasonWhy);
+            return true;
+         }
+      }
+      // calendar_time >= timeSeries_.start().duration() && calendar_time >= timeSeries_.finish().duration()
+      // past the end of time slot, hence this should not hold job generation,
+   }
+
+   // the today has expired,
+   theReasonWhy += " ( '";
+   theReasonWhy += toString();
+   theReasonWhy += "' has expired,";
+
+   // take into account, user can use run/force complete to miss time slots
+   bool do_a_requeue = timeSeries_.requeueable(c);
+   if (do_a_requeue) {
+      TimeSlot the_next_time_slot = timeSeries_.compute_next_time_slot(c);
+      if (the_next_time_slot.isNULL() || !timeSeries_.hasIncrement() ) {
+         theReasonWhy += " *re-queue* to run at this time";
+      }
+      else {
+         theReasonWhy += " *re-queue* to run at";
+         theReasonWhy += the_next_time_slot.toString() ;
+      }
+   }
+   else {
+      boost::gregorian::date_duration one_day(1);
+      boost::gregorian::date the_next_date = c.date();  // todays date
+      the_next_date += one_day;                         // add one day, so its in the future
+
+      theReasonWhy += " next run tomorrow at ";
+      theReasonWhy += timeSeries_.start().toString();
+      theReasonWhy += " ";
+      theReasonWhy += to_simple_string( the_next_date );
+   }
+   theReasonWhy += " )";
+
+   return true;
+}
+
+}
diff --git a/ecflow_4_0_7/ANattr/src/TodayAttr.hpp b/ecflow_4_0_7/ANattr/src/TodayAttr.hpp
new file mode 100644
index 0000000..7866880
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/TodayAttr.hpp
@@ -0,0 +1,185 @@
+#ifndef TODAYATTR_HPP_
+#define TODAYATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #30 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : The Today attribute is heavily tied to the begin command
+//               Real Clock:
+//               1/ Suite Begin time > Today time
+//                  If the suite 'begin' time is past the time given for today
+//                  the node is free to run.
+//               2/ Suite Begin time < Today Time
+//                  The node will 'hold' until current time > today time
+//               3/ Suite time, has passed midnight(next day)
+//                  then today command will permanently hold the node
+//               4/ Under Real/hybrid clocks today will hold node after
+//                  current is past last today time.
+//
+// take following example when we have a single time slot:
+//  	today 10:00
+//                                                isFree:-----free-----
+//                                                 begin:
+//                                                 V
+// checkForReque:rrrrrrrrrrrrrrrrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+//         isFree:hhhhhhhhhhhhhhhh|fffffffffffffffffffffffffffffffffffffff  *once* free we stay free (single slot *only*)
+//         begin:
+//          V
+//   Today  ======================0=====================0=================
+//                               10:00              Midnight
+//
+//   Difference between time and today. If begin is started after the time slot
+//   then the node is free to re-run
+//
+// When we have a today time series:
+//  	today 10:00 20:00 01:00
+//
+//  *** If the begin time is past 10:00  in the case above then the
+//  *** node should is free to run once. However for a range its different
+//  *** if suite begin time is past 20:00 then the node is held.
+//.
+//  At 10am the Node is free, when node completes, it is re-queued
+//  At 11am the Node is free, when node completes, it is re-queued
+//  ....
+//  At 20pm the Node is free, when node completes, it is *NOT* re-queued.
+//--------------------------------------------------------------------------------
+/// isFree is called when a node is queued. if it returns true, Task can be submitted
+/// checkForReque: is called when a node has completed, and need to determine if it should run again.
+/// These are different/orthogonal concerns.
+/// There is a *separate* issue of whether nodes should be queued when a node is *manually*
+///    a/ Set complete
+///    b/ Runs and then completes
+///
+/// For a *single* time slot we can't requeue.
+/// ****However we could have a set of time slots *****
+///
+///                                               isFree:ffffffffffffffff
+///                                               Begin:
+///                                               V
+///checkForReque:hhhhhhhhhhhhhhhhhrrrrrrrrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+///       isFree:hhhhhhhhhhhhhhhh|fffffffffffffffffffffffffffffffffffffff
+///       begin :
+///        V
+/// Today  ======================0========0===========0====================
+///                            10:00    11:00      Midnight
+///                                                     isFree:hhhhhhhhhhhhhhhhhh
+///                                                      V
+///   CheckForReque:hhhhhhhrrrrrrrrrrrrrrrrrrrrrrrrrhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+///          isFree:hhhhhhhFhhhhFhhhhFhhhhFhhhhFhhhhFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+///            V           |    |    |    |    |    |        |
+/// Today  ================o====|====|====|====|====0========0====================
+///                      10:00  1    2    3    4  15:00    Midnight
+///
+/// If the job starts at 10:00 but takes more than 1 hour, then it will miss the 11:00 slot
+/// and will have to start at 12:00
+//============================================================================
+
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+#include "TimeSeries.hpp"
+
+
+namespace ecf { class Calendar;} // forward declare class
+
+namespace ecf {
+
+// Use compiler ,  destructor, assignment, copy constructor
+class TodayAttr  {
+public:
+	TodayAttr() : makeFree_(false), state_change_no_(0) {}
+	TodayAttr(int hour, int minute, bool relative = false )
+		: timeSeries_(hour, minute,relative), makeFree_(false),state_change_no_(0) {}
+ 	TodayAttr(const TimeSlot& t,    bool relative = false )
+		: timeSeries_(t,relative), makeFree_(false),state_change_no_(0) {}
+	TodayAttr(const TimeSeries& ts)
+		: timeSeries_(ts), makeFree_(false),state_change_no_(0) {}
+	TodayAttr(const TimeSlot& start, const TimeSlot& finish, const TimeSlot& incr,bool relative =  false)
+		: timeSeries_(start,finish,incr,relative), makeFree_(false),state_change_no_(0) {}
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const TodayAttr& rhs) const;
+   bool operator<(const TodayAttr& rhs) const { return timeSeries_ < rhs.timeSeries_; }
+	bool structureEquals(const TodayAttr& rhs) const;
+
+   /// This can set attribute as free, once free its stays free, until re-queue/reset
+	void calendarChanged( const ecf::Calendar& c );
+	void resetRelativeDuration();
+
+	void reset(const ecf::Calendar& c) { clearFree(); timeSeries_.reset(c);}       // updates state_change_no_
+	void requeue(const ecf::Calendar& c,bool reset_next_time_slot = true)
+	   { clearFree(); timeSeries_.requeue(c,reset_next_time_slot);} // updates state_change_no_
+
+	void miss_next_time_slot(); // updates state_change_no_
+	void setFree();               // ensures that isFree() always returns true, updates state_change_no_
+	bool isSetFree() const { return makeFree_; }
+
+	// This is used when we have a *single* today attribute
+   //  single-slot   is free, if calendar time >= today_time
+   //  (range)       is free, if calendar time == (one of the time ranges)
+   bool isFree(const ecf::Calendar&) const;
+
+   // This is used when we have a *multiple* today attribute
+   // (single | range) is free, if calendar time == (one of the time ranges)
+   // if timer *expired* returns false
+   //     task t1
+   //        today 09:00
+   //        today 10:00
+   // If current times is 11:00, then we will return false.
+   // since both 09:00 and 10:00 have expired
+   // Multiple single today, should behave like a today with a range.
+   bool isFreeMultipleContext(const ecf::Calendar& c) const { return timeSeries_.isFree(c); }
+
+
+   bool checkForRequeue( const ecf::Calendar& c,const TimeSlot& the_min,const TimeSlot& the_max) const
+	{ return timeSeries_.checkForRequeue(c,the_min,the_max);}
+	void min_max_time_slots(TimeSlot& the_min, TimeSlot& the_max) const {timeSeries_.min_max_time_slots(the_min,the_max);}
+ 	bool why(const ecf::Calendar&, std::string& theReasonWhy) const;
+ 	bool checkInvariants(std::string& errormsg) const { return timeSeries_.checkInvariants(errormsg);}
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+ 	// Note: changes in state of timeSeries_, i.e affect the equality operator (used in test)
+ 	//       must be captured. i.e things like relative duration & next_time_slot are
+ 	//       reported by the Why command, & hence need to be synced.
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+ 	std::string name() const { return toString(); } /* ABO */
+ 	std::string toString() const;
+ 	std::string dump() const;
+
+	// access
+	const TimeSeries& time_series() const { return timeSeries_; }
+
+private:
+	void clearFree();             // resets the free flag, updates state_change_no_
+	bool is_free(const ecf::Calendar&) const; // ignores makeFree_
+
+private:
+	TimeSeries    timeSeries_;
+	bool          makeFree_;         // persisted for use by why() on client side && for state changes
+	unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/)
+	{
+	   ar & timeSeries_;
+	   ar & makeFree_;
+	}
+};
+
+}
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ecf::TodayAttr, boost::serialization::object_serializable);
+BOOST_CLASS_TRACKING(ecf::TodayAttr,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/Variable.cpp b/ecflow_4_0_7/ANattr/src/Variable.cpp
new file mode 100644
index 0000000..e5f9654
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/Variable.cpp
@@ -0,0 +1,87 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #56 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <sstream>
+#include <stdexcept>
+
+#include "Variable.hpp"
+#include "Indentor.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+
+// init static's
+const Variable& Variable::EMPTY() { static const Variable VARIABLE = Variable(); return VARIABLE; }
+
+////////////////////////////////////////////////////////////////////////////////////////////
+
+Variable::Variable(const std::string& name, const std::string& value)
+: name_(name), value_(value)
+{
+   std::string msg;
+   if ( !Str::valid_name( name,msg ) ) {
+      throw std::runtime_error("Variable::Variable: Invalid Variable name: " + msg);
+   }
+}
+
+int Variable::value() const
+{
+   // see if the value is convertible to a integer
+   return Str::to_int( value_, 0/* value to return if conversion fails*/);
+}
+
+bool Variable::operator==( const Variable& rhs ) const {
+   if ( value_ != rhs.value_ )
+      return false;
+   if ( name_ != rhs.name_ )
+      return false;
+   return true;
+}
+
+std::ostream& Variable::print( std::ostream& os ) const {
+   // see notes in VariableParser.h
+   //               Hence we do the following:
+   //                  a/ On parsing always remove quotes ie single or double
+   //                  b/ On serialising always add single quotes
+   Indentor in;
+   return Indentor::indent( os ) << toString() << "\n";
+}
+
+std::string Variable::toString() const
+{
+   std::string ret; ret.reserve(name_.size() + value_.size() + 8);
+   ret += "edit ";
+   ret += name_;
+   ret += " '";
+   if (value_.find("\n") == std::string::npos) ret += value_;
+   else {
+      // replace \n, otherwise re-parse will fail
+      std::string value = value_;
+      Str::replaceall(value,"\n","\\n");
+      ret += value;
+   }
+   ret += "'";
+   return ret;
+}
+
+
+std::string Variable::dump() const
+{
+   std::stringstream ss;
+   ss << toString() << " value(" << value() << ")";
+   return ss.str();
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/Variable.hpp b/ecflow_4_0_7/ANattr/src/Variable.hpp
new file mode 100644
index 0000000..d92f4d0
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/Variable.hpp
@@ -0,0 +1,74 @@
+#ifndef VARIABLE_HPP_
+#define VARIABLE_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #56 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <ostream>
+
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/level.hpp>
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Class Variable:
+// Use compiler , generated destructor, assignment,  copy constructor
+class Variable {
+public:
+   // This constructor added as an optimisation to avoid, checking variable names.
+   // i.e the generated variables, and created by the default constructors of Suite/Family/Task etc
+   // These are called during serialisation, hence to avoid checking generated names, we know are valid
+   // use this constructor. The bool is used as a dummy argument, so that we call the right constructor
+   Variable(const std::string& name, const std::string& value, bool /*check_names_dummy*/)
+   : name_(name), value_(value) {}
+   Variable(const std::string& name, const std::string& value);
+   Variable() {}
+
+   const std::string& name() const   { return  name_;}
+   std::ostream& print(std::ostream&) const;
+   bool empty() const { return name_.empty(); }
+
+   void set_value(const std::string& v) { value_ = v; }
+   const std::string& theValue() const  { return  value_;}
+   int value() const;
+
+   void set_name(const std::string& v) { name_ = v; }
+   std::string& value_by_ref() { return value_;}
+
+   bool operator==(const Variable& rhs) const;
+   std::string toString() const;
+   std::string dump() const;
+
+   // Added to support return by reference
+   static const Variable& EMPTY();
+
+private:
+   std::string  name_;
+   std::string  value_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & name_;
+      ar & value_;
+   }
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(Variable, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(Variable,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/VerifyAttr.cpp b/ecflow_4_0_7/ANattr/src/VerifyAttr.cpp
new file mode 100644
index 0000000..589cd9d
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/VerifyAttr.cpp
@@ -0,0 +1,77 @@
+//============================================================================
+// Name        : NodeTree.cpp
+// Author      : Avi
+// Revision    : $Revision: #19 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <sstream>
+#include <iostream>
+
+#include "VerifyAttr.hpp"
+#include "PrintStyle.hpp"
+#include "Indentor.hpp"
+#include "NState.hpp"
+#include "Ecf.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+
+bool VerifyAttr::operator==(const VerifyAttr& rhs) const
+{
+   	if (state_ != rhs.state_) return false;
+ 	if (expected_ != rhs.expected_) return false;
+ 	return true;
+}
+
+std::ostream& VerifyAttr::print(std::ostream& os) const
+{
+   Indentor in;
+   Indentor::indent(os) << toString();
+   if (!PrintStyle::defsStyle()) {
+      os << " # " << actual_;
+   }
+   os << "\n";
+   return os;
+}
+
+void VerifyAttr::incrementActual() {
+	actual_++;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "VerifyAttr::incrementActual()\n";
+#endif
+}
+
+void VerifyAttr::reset() {
+	actual_ = 0;
+	state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "VerifyAttr::reset()\n";
+#endif
+}
+
+std::string VerifyAttr::toString() const
+{
+	std::stringstream ss;
+	ss << "verify " << NState::toString(state_) << Str::COLON() << expected_;
+  	return ss.str();
+}
+
+std::string VerifyAttr::dump() const
+{
+	std::stringstream ss;
+	ss << "verify " << NState::toString(state_) << Str::COLON() << expected_;
+    ss << " actual(" << actual_ << ")";
+ 	return ss.str();
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/VerifyAttr.hpp b/ecflow_4_0_7/ANattr/src/VerifyAttr.hpp
new file mode 100644
index 0000000..0acdc5c
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/VerifyAttr.hpp
@@ -0,0 +1,73 @@
+#ifndef VERIFYATTR_HPP_
+#define VERIFYATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <ostream>
+
+#include <boost/operators.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+#include "NState.hpp"
+
+
+// Class VerifyAttr:
+// This class is only used for testing/verification purposes. It allows us to
+// embed expected number of states, within the definition file and so
+// reduce the need for golden log files.
+// Use compiler , generated destructor, assignment, copy constructor
+class VerifyAttr {
+public:
+	VerifyAttr(NState::State state,int expected)
+		: state_(state), expected_(expected), actual_(0), state_change_no_(0) {}
+	VerifyAttr()
+		: state_(NState::UNKNOWN), expected_(0), actual_(0),state_change_no_(0) {}
+
+ 	bool operator==(const VerifyAttr& rhs) const;
+	std::ostream& print(std::ostream&) const;
+
+	NState::State state() const { return  state_;}
+	int expected() const { return  expected_;}
+	int actual() const { return actual_;}
+	void incrementActual();
+ 	void reset();
+
+	// The state_change_no is never reset. Must be incremented if it can affect equality
+ 	unsigned int state_change_no() const { return state_change_no_; }
+
+	std::string toString() const;
+	std::string dump() const;
+
+private:
+	NState::State state_;
+	int           expected_;
+	int           actual_;
+	unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+    friend class boost::serialization::access;
+    template<class Archive>
+    void serialize(Archive & ar, const unsigned int /*version*/) {
+        ar & state_;
+        ar & expected_;
+        ar & actual_;
+    }
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(VerifyAttr, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(VerifyAttr,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/Zombie.cpp b/ecflow_4_0_7/ANattr/src/Zombie.cpp
new file mode 100644
index 0000000..4c89306
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/Zombie.cpp
@@ -0,0 +1,216 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Holds the zombie structure
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/foreach.hpp>
+
+#include "Zombie.hpp"
+#include "Calendar.hpp"
+
+using namespace ecf;
+using namespace std;
+
+// support return by reference
+const Zombie& Zombie::EMPTY() { static const Zombie ZOMBIE = Zombie(); return ZOMBIE; }
+Zombie& Zombie::EMPTY_() { static Zombie ZOMBIE = Zombie(); return ZOMBIE; }
+
+Zombie::Zombie( ecf::Child::ZombieType zombie_type,
+                ecf::Child::CmdType cmd,
+                const ZombieAttr& attr,
+                const std::string& pathToTask,
+                const std::string& jobsPassword,
+                const std::string& process_or_remote_id,
+                int try_no
+)
+: user_action_(User::BLOCK),
+  try_no_(try_no),
+  duration_(0),
+  calls_(1),
+  zombie_type_(zombie_type),
+  last_child_cmd_(cmd),
+  path_to_task_(pathToTask),
+  jobs_password_(jobsPassword),
+  process_or_remote_id_(process_or_remote_id),
+  user_action_set_(false),
+  attr_(attr),
+  creation_time_( Calendar::second_clock_time() )
+{}
+
+Zombie::Zombie()
+: user_action_(User::BLOCK),
+  try_no_(0),
+  duration_(0),
+  calls_(1),
+  zombie_type_(Child::USER),
+  last_child_cmd_(Child::INIT),
+  user_action_set_(false)
+{}
+
+std::string Zombie::type_str() const
+{
+	return Child::to_string(zombie_type_);
+}
+
+ecf::User::Action Zombie::user_action() const
+{
+   // User action needs to take into account, last child command and setting on attr_
+   if (fob()) return User::FOB;
+   else if (block()) return User::BLOCK;
+   else if (fail()) return User::FAIL;
+   else if (remove()) return User::REMOVE;
+   else if (kill()) return User::KILL;
+   else if (adopt()) return User::ADOPT;
+
+   return User::BLOCK; // the default action
+}
+
+std::string Zombie::user_action_str() const {
+   std::string ret;
+   if (manual_user_action()) ret = "manual-";
+   else                      ret = "auto-";
+   ret += User::to_string(user_action());
+   return ret;
+}
+
+/// accessors
+bool Zombie::fob() const {
+	if (user_action_set_) return user_action_ == User::FOB;
+	return attr_.fob(last_child_cmd_);
+}
+bool Zombie::fail() const   {
+	if (user_action_set_) return user_action_ == User::FAIL;
+	return attr_.fail(last_child_cmd_);
+}
+bool Zombie::adopt() const  {
+	if (user_action_set_) return user_action_ == User::ADOPT;
+	return attr_.adopt(last_child_cmd_);
+}
+bool Zombie::block() const  {
+	if (user_action_set_) return user_action_ == User::BLOCK;
+	return attr_.block(last_child_cmd_);
+}
+bool Zombie::remove() const {
+	if (user_action_set_) return user_action_ == User::REMOVE;
+	return attr_.remove(last_child_cmd_);
+}
+bool Zombie::kill() const {
+   if (user_action_set_) return user_action_ == User::KILL;
+   return attr_.kill(last_child_cmd_);
+}
+
+int Zombie::allowed_age() const
+{
+	return attr_.zombie_lifetime();
+}
+
+void Zombie::set_fob()   { user_action_ = User::FOB;   user_action_set_ = true;}
+void Zombie::set_fail()  { user_action_ = User::FAIL;  user_action_set_ = true;}
+void Zombie::set_adopt() { user_action_ = User::ADOPT; user_action_set_ = true;}
+void Zombie::set_block() { user_action_ = User::BLOCK; user_action_set_ = true;}
+void Zombie::set_kill()  { user_action_ = User::KILL;  user_action_set_ = true;}
+
+
+std::ostream& operator<<(std::ostream& os, const Zombie& z)
+{
+	os << z.path_to_task() << " ";
+	os << z.type_str() << " ";
+ 	os << z.duration() << " ";
+	os << z.jobs_password() << " ";
+	os << z.process_or_remote_id() << "<pid> ";
+ 	os << z.try_no() << " ";
+ 	os << "calls(" << z.calls() << ") ";
+ 	os << z.user_action_str();
+	os << " ";
+	os << Child::to_string(z.last_child_cmd());
+	return os;
+}
+
+
+std::string Zombie::pretty_print(const std::vector<Zombie>& zombies,int indent)
+{
+  std::stringstream ss;
+  std::vector<std::string> list;
+  pretty_print(zombies, list, indent);
+  for (size_t i=0; i<list.size(); ++i) {
+    ss << list[i] << "\n";
+  }
+  return ss.str();
+}
+
+void Zombie::pretty_print(const std::vector<Zombie>& zombies,
+			  std::vector<std::string>& list,
+			  int indent)
+{
+   string path("task-path");
+   string type("type");
+   string password("password");
+   string rid("process-id");
+   string duration("duration");
+   string calls("calls");
+   string try_no("try_no");
+   string user_action("action");
+   string child_type("child");
+
+   size_t path_width = path.size();
+   size_t type_width = type.size();
+   size_t duration_width = duration.size();
+   size_t password_width = password.size();
+   size_t tryno_width = try_no.size();
+   size_t rid_width = rid.size();
+   size_t user_action_width = 13;  // max of FOB,FAIL,ADOPT,BLOCK,REMOVE + (manual- | auto- )
+   size_t child_type_width = 8;    // max of INIT,COMPLETE,EVENT,METER,LABEL,WAIT,ABORT
+   size_t calls_width = calls.size();
+
+   BOOST_FOREACH(const Zombie& z, zombies) {
+      path_width = std::max(path_width,z.path_to_task().size());
+      type_width = std::max(type_width,z.type_str().size());
+      password_width = std::max(password_width,z.jobs_password().size());
+      rid_width = std::max(rid_width,z.process_or_remote_id().size());
+      std::string no_of_calls = boost::lexical_cast<std::string>(z.calls());
+      calls_width = std::max(calls_width,no_of_calls.size());
+
+      std::string try_no_int = boost::lexical_cast<std::string>(z.try_no());
+      tryno_width = std::max(tryno_width,try_no_int.size());
+   }
+
+   std::stringstream ss;
+   if (indent != 0) for(int i = 0; i < indent; i++) ss << " ";
+   ss << left << setw(path_width) << path << " "
+            << setw(type_width) << type << " "
+            << setw(duration_width) << duration << " "
+            << setw(password_width) << password << " "
+            << setw(rid_width) << rid << " "
+            << setw(tryno_width) << try_no << " "
+            << setw(user_action_width) << user_action << " "
+            << setw(child_type_width) << child_type << " "
+            << setw(calls_width) << calls
+     ;
+
+   list.push_back(ss.str());
+
+   BOOST_FOREACH(const Zombie& z, zombies) {
+     std::stringstream ss;
+     if (indent != 0) for(int i = 0; i < indent; i++) ss << " ";
+      ss << left << setw(path_width)         << z.path_to_task() << " "
+                << setw(type_width)          << z.type_str() << " "
+                << setw(duration_width)      << z.duration() << " "
+                << setw(password_width)      << z.jobs_password() << " "
+                << setw(rid_width)           << z.process_or_remote_id() << " "
+                << setw(tryno_width)         << z.try_no() << " "
+                << setw(user_action_width)   << z.user_action_str() << " "
+                << setw(child_type_width)    << Child::to_string(z.last_child_cmd())  << " "
+  	        << setw(calls_width)         << z.calls()
+	;
+      list.push_back(ss.str());
+   }
+}
diff --git a/ecflow_4_0_7/ANattr/src/Zombie.hpp b/ecflow_4_0_7/ANattr/src/Zombie.hpp
new file mode 100644
index 0000000..7518200
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/Zombie.hpp
@@ -0,0 +1,166 @@
+#ifndef ZOMBIE_HPP_
+#define ZOMBIE_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Holds the zombie structure
+// WE have 3 structures:
+//      Jobs(path,password,process_id)
+//      Complications ONLY init command provides process_id.
+//      Task(path,password,process_id)
+//      Zombie(path,password,process_id)
+// Issues:
+//   At the extreme we can have *2* Jobs running at one go. Typically user commands
+//   that have a force parameter, will create 'user' zombies.
+//   ** the command can be invoked at any time, i.e we could invoke
+//   ** the user command, whilst the task is in SUBMITTED state
+//   ** This will go through and create user zombie. However at this stage we have *NO* process_id
+//   ** since the job has not started. Zombie(path,password)
+//   When the Task init command is called, we get given a process_id.
+//   ** HOWEVER ** need to determine if this is from the real child cmd or from the zombie
+//   ** We search zombie list, and compare zombies, by path and password
+//   ** if a match is found, we update the zombie id.
+//
+//   IMPORTANT:: Automated test:
+//               If a child command provides just path and password, this is *NOT*
+//               enough information to disambiguate a zombie from a real job.
+//               To work around this the job file has been updated to add ECF_RID=$$
+//
+//   IMPORTANT:: For command line interface we just have the task path.
+//               i,e we don't want to expose password, and user will not easily
+//               know the process or remote id. Hence we will make do with the
+//               task path. We just find the first zombie, and act up on it
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include "Child.hpp"
+#include "ZombieAttr.hpp"
+
+/// Use default copy constructor ,assignment operator and destructor
+class Zombie  {
+public:
+ 	Zombie( ecf::Child::ZombieType zombie_type,     // The kind of zombie
+ 	        ecf::Child::CmdType child_cmd,          // The Child command, that lead to this zombie
+ 	        const ZombieAttr& attr,                 // will hold Action if set on node tree
+	        const std::string& pathToTask,          // from child ipc
+	        const std::string& jobsPassword,        // from child ipc
+	        const std::string& process_or_remote_id,// from child ipc
+	        int try_no
+     );
+	Zombie();
+
+/// accessors
+   // distinguish between manual and automatic user action. manual take precedence
+	bool manual_user_action() const { return user_action_set_;}
+	bool fob() const;
+	bool fail() const ;
+	bool adopt() const;
+	bool block() const;
+   bool remove() const;
+   bool kill() const;
+
+	ecf::Child::ZombieType type() const { return zombie_type_;}
+	ecf::Child::CmdType last_child_cmd() const { return last_child_cmd_; }
+	const ZombieAttr& attr() const { return attr_;}
+	int calls() const { return calls_;}
+
+	std::string type_str() const;
+	const std::string& jobs_password() const { return jobs_password_; }
+	const std::string& path_to_task() const { return path_to_task_; }
+	const std::string& process_or_remote_id() const { return process_or_remote_id_; }
+ 	int try_no() const { return try_no_; }
+	int duration() const { return duration_; }
+	ecf::User::Action user_action() const;
+	std::string user_action_str() const;
+
+
+	const boost::posix_time::ptime&  creation_time() const { return creation_time_; }
+
+	bool empty() const { return path_to_task_.empty(); }
+
+	/// returns in seconds the age the zombie is allowed to live
+	int allowed_age() const;
+
+/// mutators
+	void set_attr( const ZombieAttr& attr) { attr_ = attr;}
+ 	void set_process_or_remote_id( const std::string&  s) { process_or_remote_id_ =  s;}
+	void set_last_child_cmd( ecf::Child::CmdType c) { last_child_cmd_ =  c;}
+	void set_type(ecf::Child::ZombieType zt) { zombie_type_ = zt; }
+
+	/// User action must take precedence over Zombie attribute settings on node tree
+	///
+	/// Note: user_action to remove zombie is immediate hence no need to for set_remove()
+	///       Whereas for the other we want to store the action so that when next child
+	///       command communicate with the server, the action is applied.
+	void set_duration(int d) { duration_ = d;}
+	void set_fob();
+	void set_fail();
+	void set_adopt();
+   void set_block();
+   void set_kill();
+
+	void increment_calls() { calls_++;}
+
+	// write to standard out a title and list of zombies
+	static std::string pretty_print(const std::vector<Zombie>& zombies, int indent = 0);
+	static void pretty_print(const std::vector<Zombie>& zombies, 
+				 std::vector<std::string>& list, 
+				 int indent = 0);
+
+// MISC:
+	// Added to support return by reference
+	static const Zombie& EMPTY() ;
+	static Zombie& EMPTY_();
+
+private:
+
+	ecf::User::Action user_action_;        // [ fob, fail, remove, adopt, block ]
+ 	int try_no_;                           // task try number, set on construction
+	int duration_;                         // How long zombie been alive
+	int calls_;                            // Number of times we have communicated with server.
+	ecf::Child::ZombieType zombie_type_;   // [ ecf, path, user ]
+	ecf::Child::CmdType last_child_cmd_;   // [ init | event | meter | label | wait | abort | complete ]
+  	std::string path_to_task_;             // set on construction
+	std::string jobs_password_;            // set on construction
+	std::string process_or_remote_id_;     // set on construction
+
+ 	bool user_action_set_;                   // Differentiate manual from automated, response, manual take precedence
+	ZombieAttr attr_;                        // Default or attribute obtained from node tree.
+ 	boost::posix_time::ptime  creation_time_;// When zombie was created. Needed to control lifetime
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+
+		ar & user_action_;
+ 		ar & try_no_;
+		ar & duration_;
+		ar & calls_;
+		ar & zombie_type_;
+		ar & last_child_cmd_;
+ 		ar & path_to_task_;
+		ar & jobs_password_;
+		ar & process_or_remote_id_;
+		ar & user_action_set_;
+		ar & attr_;
+   	}
+};
+
+std::ostream& operator<<(std::ostream& os, const Zombie&);
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(Zombie, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(Zombie,boost::serialization::track_never);
+#endif
diff --git a/ecflow_4_0_7/ANattr/src/ZombieAttr.cpp b/ecflow_4_0_7/ANattr/src/ZombieAttr.cpp
new file mode 100644
index 0000000..b340bff
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/ZombieAttr.cpp
@@ -0,0 +1,240 @@
+//============================================================================
+// Name        : NodeTree.cpp
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <sstream>
+#include <iostream>
+#include <assert.h>
+#include <boost/tokenizer.hpp>
+#include <boost/token_functions.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "ZombieAttr.hpp"
+#include "Indentor.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace boost;
+using namespace std;
+
+/// int statics
+static int ecf_zombie_life_time = 3600;
+static int user_zombie_life_time = 300;
+static int path_zombie_life_time = 900;
+
+const ZombieAttr& ZombieAttr::EMPTY() { static const ZombieAttr ZOMBIEATTR = ZombieAttr(); return ZOMBIEATTR; }
+
+// Constructor ==============================================================================
+ZombieAttr::ZombieAttr(ecf::Child::ZombieType t, const std::vector<ecf::Child::CmdType>& c, ecf::User::Action a, int zombie_lifetime)
+	: zombie_type_(t), action_(a), zombie_lifetime_(zombie_lifetime), child_cmds_(c)
+{
+	if ( zombie_lifetime_ == -1) {
+ 		switch (zombie_type_) {
+			case Child::USER: zombie_lifetime_ = user_zombie_life_time; break;
+			case Child::PATH: zombie_lifetime_ = path_zombie_life_time; break;
+			case Child::ECF:  zombie_lifetime_ = ecf_zombie_life_time; break;
+			case Child::NOT_SET: assert(false); break;
+		}
+	}
+}
+
+bool ZombieAttr::operator==(const ZombieAttr& rhs) const
+{
+   if (zombie_type_ != rhs.zombie_type_) return false;
+   if (action_ != rhs.action_) return false;
+   if (zombie_lifetime_ != rhs.zombie_lifetime_) return false;
+   if (child_cmds_ != rhs.child_cmds_) return false;
+   return true;
+}
+
+std::ostream& ZombieAttr::print(std::ostream& os) const
+{
+   Indentor in;
+   Indentor::indent(os) << toString();
+   os << "\n";
+   return os;
+}
+
+std::string ZombieAttr::toString() const
+{
+	/// format is  zombie_type : child_cmds(optional) : action : zombie_lifetime_(optional)
+	std::stringstream ss;
+	ss << "zombie " << Child::to_string(zombie_type_)
+	   << Str::COLON()
+	   << User::to_string(action_)
+	   << Str::COLON()
+	   << Child::to_string(child_cmds_)
+	   << Str::COLON()
+       << zombie_lifetime_
+    ;
+
+  	return ss.str();
+}
+
+bool ZombieAttr::fob( ecf::Child::CmdType child_cmd) const
+{
+	if ( action_ != User::FOB) return false;
+	if ( child_cmds_.empty()) return true;
+
+	// If we have child commands specified, then the action is only applicable for that child cmd
+	// for all other child cmds we block
+ 	for(size_t i = 0; i < child_cmds_.size(); i++) {
+		if (child_cmds_[i] == child_cmd ) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool ZombieAttr::fail( ecf::Child::CmdType child_cmd) const
+{
+	if ( action_ != User::FAIL) return false;
+	if ( child_cmds_.empty()) return true;
+
+	// If we have child commands specified, then the action is only applicable for that child cmd
+	// for all other child cmds we block
+ 	for(size_t i = 0; i < child_cmds_.size(); i++) {
+		if (child_cmds_[i] == child_cmd ) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool ZombieAttr::adopt( ecf::Child::CmdType child_cmd) const
+{
+	if ( action_ != User::ADOPT) return false;
+	if ( child_cmds_.empty()) return true;
+
+	// If we have child commands specified, then the action is only applicable for that child cmd
+	// for all other child cmds we block
+ 	for(size_t i = 0; i < child_cmds_.size(); i++) {
+		if (child_cmds_[i] == child_cmd ) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool ZombieAttr::remove( ecf::Child::CmdType child_cmd) const
+{
+	if ( action_ != User::REMOVE) return false;
+	if ( child_cmds_.empty()) return true;
+
+	// If we have child commands specified, then the action is only applicable for that child cmd
+	// for all other child cmds we block
+ 	for(size_t i = 0; i < child_cmds_.size(); i++) {
+		if (child_cmds_[i] == child_cmd ) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool ZombieAttr::block( ecf::Child::CmdType child_cmd) const
+{
+	if ( action_ != User::BLOCK) return false;
+	if ( child_cmds_.empty()) return true;
+
+	// If we have child commands specified, then the action is only applicable for that child cmd
+	// for all other child cmds we block
+ 	for(size_t i = 0; i < child_cmds_.size(); i++) {
+		if (child_cmds_[i] == child_cmd ) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool ZombieAttr::kill( ecf::Child::CmdType child_cmd) const
+{
+   if ( action_ != User::KILL) return false;
+   if ( child_cmds_.empty()) return true;
+
+   // If we have child commands specified, then the action is only applicable for that child cmd
+   // for all other child cmds we block
+   for(size_t i = 0; i < child_cmds_.size(); i++) {
+      if (child_cmds_[i] == child_cmd ) {
+         return true;
+      }
+   }
+   return false;
+}
+
+ZombieAttr ZombieAttr::create(const std::string& string_to_parse)
+{
+	/// Use boost tokenizer instead of Str::split, as it allows preservation of empty tokens
+	char_separator<char> sep(":","",boost::keep_empty_tokens);
+	typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+	tokenizer tokenise(string_to_parse, sep);
+	std::vector<std::string> tokens;
+	std::copy(tokenise.begin(), tokenise.end(), back_inserter(tokens));
+	if (tokens.size() < 2) throw std::runtime_error("ZombieAttr::create failed: Invalid zombie type " + string_to_parse);
+
+	/// expects <zombie_type>:<user_action>:child_cmds:zombie_lifetime
+	string str_zombie_type;
+	string action_str;
+	string child_cmds;
+	string lifetime;
+	size_t tokens_size = tokens.size() ;
+	for(size_t i =0; i < tokens_size ; i++) {
+		// cout << "   token " << i << ": '" << tokens[i] << "'\n";
+		if (i == 0) { str_zombie_type = tokens[i]; continue;}
+		if (i == 1) { action_str = tokens[i]; continue;}
+		if (i == 2) { child_cmds = tokens[i]; continue;}
+		if (i == 3) { lifetime = tokens[i]; continue;}
+		throw std::runtime_error("ZombieAttr::create failed: Invalid zombie tokens " + string_to_parse);
+	}
+	//std::cout << "   zombie_type = " << str_zombie_type << "   user_action = " << action_str <<  "   child_cmds = " << child_cmds<< "   zombie_lifetime = " << lifetime << "\n";
+
+	if (!Child::valid_zombie_type(str_zombie_type))
+		throw std::runtime_error("ZombieAttr::create failed: Invalid zombie type, expected one of [ user | ecf | path ] but found " + str_zombie_type + string(":") + string_to_parse);
+
+	if ( !action_str.empty() && !User::valid_user_action(action_str)) {
+		throw std::runtime_error("ZombieAttr::create failed: Invalid user action, expected one of [ fob | fail | remove | block | adopt | kill ] but found " + action_str + string(":") + string_to_parse);
+	}
+
+	if ( !child_cmds.empty() && !Child::valid_child_cmds(child_cmds)) {
+		throw std::runtime_error("ZombieAttr::create failed: Invalid child type, expected one or more of [ init,event,meter,label,wait,abort,complete] but found " + tokens[2] + string(":") + string_to_parse);
+	}
+
+	int zombie_lifetime = -1;
+	if ( !lifetime.empty() ) {
+		try { zombie_lifetime = boost::lexical_cast<int>(lifetime);}
+		catch ( boost::bad_lexical_cast& ) {
+			throw std::runtime_error("ZombieAttr::create failed: Zombie life time must be convertible to an integer " + lifetime + string(":") + string_to_parse);
+		}
+	}
+
+	if (action_str.empty() && zombie_lifetime == -1)
+		throw std::runtime_error("ZombieAttr::create failed: User Action(fob,fail,remove,adopt,block) or lifetime must be specified: " + string_to_parse);
+
+	Child::ZombieType zombie_type = Child::zombie_type(str_zombie_type);
+	User::Action action =  User::user_action(action_str);
+	vector<Child::CmdType> childVec = Child::child_cmds(child_cmds);
+
+	/// If zombie_lifetime is still -1 constructor will reset to standard defaults
+  	return ZombieAttr(zombie_type,childVec,action,zombie_lifetime) ;
+}
+
+ZombieAttr ZombieAttr::get_default_attr(ecf::Child::ZombieType zt)
+{
+	switch (zt) {
+		case Child::USER: return ZombieAttr(Child::USER,std::vector<ecf::Child::CmdType>(), User::BLOCK, user_zombie_life_time); break;
+		case Child::PATH: return ZombieAttr(Child::PATH,std::vector<ecf::Child::CmdType>(), User::BLOCK, path_zombie_life_time); break;
+		case Child::ECF:  return ZombieAttr(Child::ECF, std::vector<ecf::Child::CmdType>(), User::BLOCK, ecf_zombie_life_time); break;
+		case Child::NOT_SET: break;
+	}
+	return ZombieAttr(Child::ECF, std::vector<ecf::Child::CmdType>(), User::BLOCK, ecf_zombie_life_time);
+}
+
diff --git a/ecflow_4_0_7/ANattr/src/ZombieAttr.hpp b/ecflow_4_0_7/ANattr/src/ZombieAttr.hpp
new file mode 100644
index 0000000..8a53a26
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/src/ZombieAttr.hpp
@@ -0,0 +1,82 @@
+#ifndef ZOMBIE_ATTR_HPP_
+#define ZOMBIE_ATTR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <ostream>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include "Child.hpp"
+
+// Class ZombieAttr:
+// Use compiler , generated destructor, assignment, copy constructor
+// ZombieAttr does *not* have any changeable state
+class ZombieAttr {
+public:
+	ZombieAttr(ecf::Child::ZombieType t, const std::vector<ecf::Child::CmdType>& c, ecf::User::Action a, int zombie_lifetime);
+	ZombieAttr() : zombie_type_(ecf::Child::NOT_SET), action_(ecf::User::BLOCK), zombie_lifetime_(0)  {}
+
+ 	bool operator==(const ZombieAttr& rhs) const;
+	std::ostream& print(std::ostream&) const;
+	bool empty() const { return zombie_type_ == ecf::Child::NOT_SET; }
+
+	ecf::Child::ZombieType zombie_type() const { return zombie_type_;}
+	ecf::User::Action      action() const { return action_; }
+	int                    zombie_lifetime() const { return zombie_lifetime_; }
+	const std::vector<ecf::Child::CmdType>& child_cmds() const { return child_cmds_; }
+
+	std::vector<ecf::Child::CmdType>::const_iterator child_begin() const { return child_cmds_.begin();} // for python
+	std::vector<ecf::Child::CmdType>::const_iterator child_end()   const { return child_cmds_.end();  } // for python
+
+	std::string toString() const;
+
+	bool fob( ecf::Child::CmdType ) const;
+	bool fail( ecf::Child::CmdType ) const;
+	bool adopt( ecf::Child::CmdType ) const;
+	bool block( ecf::Child::CmdType ) const;
+   bool remove( ecf::Child::CmdType ) const;
+   bool kill( ecf::Child::CmdType ) const;
+
+	/// Create from a string. Will throw std::runtime_error of parse errors
+	/// expects <zombie_type>:<user_action>:child_cmds:zombie_lifetime
+	static ZombieAttr create(const std::string& str);
+
+	// Added to support return by reference
+	static const ZombieAttr& EMPTY();
+
+	// Provide the default behaviour
+	static ZombieAttr get_default_attr(ecf::Child::ZombieType);
+
+private:
+	ecf::Child::ZombieType           zombie_type_;      // User,path or ecf
+	ecf::User::Action                action_;           // fob, fail,remove, adopt, block, kill
+	int                              zombie_lifetime_;  // How long zombie lives in server
+	std::vector<ecf::Child::CmdType> child_cmds_;       // init, event, meter,label, complete
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/) {
+	   ar & zombie_type_;
+	   ar & action_;
+	   ar & zombie_lifetime_;
+	   ar & child_cmds_;
+	}
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ZombieAttr, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(ZombieAttr,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/test/TestAttrSerialization.cpp b/ecflow_4_0_7/ANattr/test/TestAttrSerialization.cpp
new file mode 100644
index 0000000..521c1dc
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestAttrSerialization.cpp
@@ -0,0 +1,297 @@
+#define BOOST_TEST_MODULE TestANattr
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/test/unit_test.hpp>
+#include <boost/make_shared.hpp>
+
+#include "TodayAttr.hpp"
+#include "TimeAttr.hpp"
+#include "VerifyAttr.hpp"
+#include "RepeatAttr.hpp"
+#include "LateAttr.hpp"
+#include "DayAttr.hpp"
+#include "DateAttr.hpp"
+#include "CronAttr.hpp"
+#include "ClockAttr.hpp"
+#include "AutoCancelAttr.hpp"
+#include "NodeAttr.hpp"
+#include "Variable.hpp"
+#include "ZombieAttr.hpp"
+#include "Calendar.hpp"
+#include "SerializationTest.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+// Globals used throughout the test
+static std::string fileName = "test.txt";
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_AttrDefaultConstructor_serialisation )
+{
+	cout << "ANattr:: ...test_AttrDefaultConstructor_serialisation \n";
+
+	doSaveAndRestore<VerifyAttr>(fileName);
+	doSaveAndRestore<TodayAttr>(fileName);
+	doSaveAndRestore<TimeAttr>(fileName);
+	doSaveAndRestore<RepeatDate>(fileName);
+	doSaveAndRestore<RepeatInteger>(fileName);
+	doSaveAndRestore<RepeatEnumerated>(fileName);
+	doSaveAndRestore<RepeatString>(fileName);
+	doSaveAndRestore<LateAttr>(fileName);
+	doSaveAndRestore<DayAttr>(fileName);
+	doSaveAndRestore<DateAttr>(fileName);
+	doSaveAndRestore<CronAttr>(fileName);
+	doSaveAndRestore<ClockAttr>(fileName);
+	doSaveAndRestore<AutoCancelAttr>(fileName);
+	doSaveAndRestore<Label>(fileName);
+	doSaveAndRestore<Variable>(fileName);
+	doSaveAndRestore<Event>(fileName);
+   doSaveAndRestore<Meter>(fileName);
+   doSaveAndRestore<ZombieAttr>(fileName);
+}
+
+BOOST_AUTO_TEST_CASE( test_VerifyAttr_serialisation )
+{
+	cout << "ANattr:: ...test_VerifyAttr_serialisation \n";
+ 	VerifyAttr saved(NState::COMPLETE,10);
+	doSaveAndRestore(fileName,saved);
+}
+
+BOOST_AUTO_TEST_CASE( test_TodayAttr_serialisation )
+{
+	cout << "ANattr:: ...test_TodayAttr_serialisation \n";
+  	{
+		TodayAttr saved(TimeSlot(10,12));
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		TodayAttr saved(TimeSlot(0,0),TimeSlot(10,12),TimeSlot(1,0));
+ 		doSaveAndRestore(fileName,saved);
+	}
+	{
+		TodayAttr saved(TimeSeries(TimeSlot(10,12)));
+ 		doSaveAndRestore(fileName,saved);
+	}
+	{
+		TodayAttr saved(TimeSeries(TimeSlot(10,12)));
+ 		doSaveAndRestore(fileName,saved);
+	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_TimeAttr_serialisation )
+{
+	cout << "ANattr:: ...test_TimeAttr_serialisation \n";
+  	{
+		TimeAttr saved(TimeSlot(10,12));
+ 		doSaveAndRestore(fileName,saved);
+	}
+	{
+		TimeAttr saved(TimeSlot(0,0),TimeSlot(10,12),TimeSlot(1,0));
+ 		doSaveAndRestore(fileName,saved);
+	}
+	{
+		TimeAttr saved(TimeSeries(TimeSlot(10,12)));
+ 		doSaveAndRestore(fileName,saved);
+	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_RepeatAttr_serialisation )
+{
+	cout << "ANattr:: ...test_RepeatAttr_serialisation \n";
+	{
+		RepeatDate saved("varname",20101210,20101230,3);
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		RepeatInteger saved("varname",0,10,1);
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		std::vector<std::string> theVec; theVec.push_back("a");  theVec.push_back("b");
+		RepeatEnumerated saved = RepeatEnumerated("varname",theVec);
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		std::vector<std::string> theVec; theVec.push_back("a");
+		RepeatString saved = RepeatString("varname",theVec);
+		doSaveAndRestore(fileName,saved);
+	}
+
+
+	{
+		Repeat saved(RepeatDate("varname",20101210,20101230,3));
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		Repeat saved(RepeatInteger("varname",0,10,1));
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		std::vector<std::string> theVec; theVec.push_back("a");  theVec.push_back("b");
+		Repeat saved(RepeatEnumerated("varname",theVec));
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		std::vector<std::string> theVec; theVec.push_back("a");
+		Repeat saved(RepeatString("varname",theVec));
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_LateAttr_serialisation )
+{
+	cout << "ANattr:: ...test_LateAttr_serialisation \n";
+	LateAttr saved;
+	saved.addSubmitted(TimeSlot(10,12));
+	saved.addActive(TimeSlot(10,12));
+	saved.addComplete(TimeSlot(10,12),true);
+	doSaveAndRestore(fileName,saved);
+
+}
+
+BOOST_AUTO_TEST_CASE( test_DayAttr_serialisation )
+{
+ 	cout << "ANattr:: ...test_DayAttr_serialisation\n";
+ 	std::vector< DayAttr::Day_t > dvec;
+	dvec.push_back(DayAttr::SUNDAY);
+	dvec.push_back(DayAttr::MONDAY);
+	dvec.push_back(DayAttr::TUESDAY);
+	dvec.push_back(DayAttr::WEDNESDAY);
+	dvec.push_back(DayAttr::THURSDAY);
+	dvec.push_back(DayAttr::FRIDAY);
+	dvec.push_back(DayAttr::SATURDAY);
+	for(size_t d = 0; d < dvec.size(); d++) {
+		DayAttr saved(dvec[d]);
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_DateAttr_serialisation )
+{
+ 	cout << "ANattr:: ...test_DateAttr_serialisation\n";
+ 	DateAttr saved(1,1,2010);
+	doSaveAndRestore(fileName,saved);
+}
+
+BOOST_AUTO_TEST_CASE( test_CronAttr_serialisation )
+{
+ 	cout << "ANattr:: ...test_CronAttr_serialisation\n";
+ 	CronAttr saved;
+ 	std::vector<int> weekDays; weekDays.push_back(1); weekDays.push_back(2);
+ 	std::vector<int> daysOfMonth; daysOfMonth.push_back(1); daysOfMonth.push_back(2);
+ 	std::vector<int> months; months.push_back(1); months.push_back(2);
+ 	saved.addWeekDays(weekDays);
+ 	saved.addDaysOfMonth(daysOfMonth);
+ 	saved.addMonths(months);
+ 	saved.addTimeSeries(TimeSlot(0,0),TimeSlot(20,0),TimeSlot(0,1));
+
+ 	doSaveAndRestore(fileName,saved);
+}
+
+BOOST_AUTO_TEST_CASE( test_ClockAttr_serialisation )
+{
+ 	cout << "ANattr:: ...test_ClockAttr_serialisation\n";
+ 	{
+		ClockAttr saved(false);
+		saved.date(1,1,2009);
+		saved.set_gain_in_seconds(3600);
+		saved.startStopWithServer(true);
+
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		ClockAttr saved(Calendar::second_clock_time());
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_AutoCancelAttr_serialisation )
+{
+ 	cout << "ANattr:: ...test_AutoCancelAttr_serialisation\n";
+ 	{
+		AutoCancelAttr saved(100);
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		AutoCancelAttr saved( TimeSlot(12,10), true) ;
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_Label_serialisation )
+{
+ 	cout << "ANattr:: ...test_Label_serialisation\n";
+ 	{
+		Label saved("labelName","some text");
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_Variable_serialisation )
+{
+ 	cout << "ANattr:: ...test_Variable_serialisation\n";
+ 	Variable saved("varname","var value 123 12 =");
+	doSaveAndRestore(fileName,saved);
+}
+
+BOOST_AUTO_TEST_CASE( test_Event_serialisation )
+{
+ 	cout << "ANattr:: ...test_Event_serialisation\n";
+ 	{
+		Event saved(3);
+		doSaveAndRestore(fileName,saved);
+	}
+	{
+		Event saved(10+1,"event_name");
+		doSaveAndRestore(fileName,saved);
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_Meter_serialisation )
+{
+ 	cout << "ANattr:: ...test_Meter_serialisation\n";
+	Meter saved("meter",0,20,20);
+	doSaveAndRestore(fileName,saved);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_zombie_attr_serialisation )
+{
+   cout << "ANattr:: ...test_zombie_attr_serialisation\n";
+
+   std::vector<ecf::Child::CmdType> child_cmds;
+   child_cmds.push_back(ecf::Child::INIT);
+   child_cmds.push_back(ecf::Child::EVENT);
+   child_cmds.push_back(ecf::Child::METER);
+   child_cmds.push_back(ecf::Child::LABEL);
+   child_cmds.push_back(ecf::Child::WAIT);
+   child_cmds.push_back(ecf::Child::ABORT);
+   child_cmds.push_back(ecf::Child::COMPLETE);
+
+   doSaveAndRestore(fileName,ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10));
+   doSaveAndRestore(fileName,ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::FAIL,10));
+   doSaveAndRestore(fileName,ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::BLOCK,10));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANattr/test/TestCron.cpp b/ecflow_4_0_7/ANattr/test/TestCron.cpp
new file mode 100644
index 0000000..0d3fb2f
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestCron.cpp
@@ -0,0 +1,439 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+#include "CronAttr.hpp"
+#include "TimeSeries.hpp"
+#include "Calendar.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_cron_parsing )
+{
+   cout << "ANattr:: ...test_cron_parsing\n";
+   TimeSlot start(10,10);
+   TimeSlot finish(23,10);
+   TimeSlot incr(0,1);
+
+   {
+      CronAttr cron;
+      CronAttr parsedCron;
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+   {
+      CronAttr cron; cron.add_time_series(10,10,false);
+      CronAttr parsedCron = CronAttr::create("cron 10:10");
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+   {
+      CronAttr cron; cron.add_time_series(10,10,true);
+      CronAttr parsedCron = CronAttr::create("cron +10:10");
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+   {
+      CronAttr cron; cron.addTimeSeries(start,finish,incr);
+      CronAttr parsedCron = CronAttr::create("cron 10:10 23:10 00:01");
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+
+   std::vector<int> week_days;
+   week_days.push_back(0);
+   week_days.push_back(1);
+   week_days.push_back(2);
+   week_days.push_back(3);
+   week_days.push_back(4);
+   week_days.push_back(5);
+   week_days.push_back(6);
+   {
+      CronAttr cron;
+      cron.addWeekDays(week_days);
+      cron.add_time_series(10,10,true);
+      CronAttr parsedCron = CronAttr::create("cron -w 0,1,2,3,4,5,6 +10:10");
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+
+   std::vector<int> days_of_month;
+   days_of_month.push_back(1);
+   days_of_month.push_back(3);
+   days_of_month.push_back(4);
+   days_of_month.push_back(5);
+   days_of_month.push_back(6);
+   days_of_month.push_back(24);
+   days_of_month.push_back(25);
+   {
+      CronAttr cron;
+      cron.addDaysOfMonth(days_of_month);
+      cron.add_time_series(10,10,true);
+      CronAttr parsedCron = CronAttr::create("cron -d 1,3,4,5,6,24,25 +10:10");
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+
+   std::vector<int> months;
+   months.push_back(1);
+   months.push_back(2);
+   months.push_back(3);
+   months.push_back(4);
+   months.push_back(5);
+   months.push_back(6);
+   months.push_back(7);
+   months.push_back(8);
+   months.push_back(9);
+   months.push_back(10);
+   months.push_back(11);
+   months.push_back(12);
+   {
+      CronAttr cron;
+      cron.addMonths(months);
+      cron.add_time_series(10,10,true);
+      CronAttr parsedCron = CronAttr::create("cron -m 1,2,3,4,5,6,7,8,9,10,11,12 +10:10");
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+
+   {
+      CronAttr cron;
+      cron.addWeekDays(week_days);
+      cron.addDaysOfMonth(days_of_month);
+      cron.addMonths(months);
+      cron.addTimeSeries(start,finish,incr);
+      CronAttr parsedCron = CronAttr::create("cron -w 0,1,2,3,4,5,6 -d 1,3,4,5,6,24,25 -m 1,2,3,4,5,6,7,8,9,10,11,12 10:10 23:10 00:01");
+      BOOST_CHECK_MESSAGE(parsedCron.structureEquals(cron),"Expected " << cron.toString() << " but found " << parsedCron.toString());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_cron_state_parsing )
+{
+   cout << "ANattr:: ...test_cron_state_parsing\n";
+
+   size_t index = 1; // to get over the cron
+   {
+      std::string line = "cron 04:30 # isValid:false";
+      std::vector<std::string> lineTokens;
+      Str::split(line,lineTokens);
+      bool parse_state = true;
+      CronAttr parsed_cronAttr;
+      CronAttr::parse( parsed_cronAttr,lineTokens, index, parse_state);
+
+      CronAttr expected;
+      TimeSeries series(4,30);
+      series.set_isValid(false); // to match isValid:false
+      expected.addTimeSeries(series);
+      BOOST_CHECK_MESSAGE(parsed_cronAttr == expected,"Expected " << expected.dump() << " : " << expected.time().dump()
+                          << " but found " << parsed_cronAttr.dump() << " : " << parsed_cronAttr.time().dump());
+   }
+
+   {
+      std::string line = "cron 04:30 # free isValid:false";
+      std::vector<std::string> lineTokens;
+      Str::split(line,lineTokens);
+      bool parse_state = true;
+      CronAttr parsed_cronAttr;
+      CronAttr::parse( parsed_cronAttr,lineTokens, index, parse_state);
+
+      CronAttr expected;
+      TimeSeries series(4,30);
+      series.set_isValid(false); // to match isValid:false
+      expected.addTimeSeries(series);
+      expected.setFree();
+      BOOST_CHECK_MESSAGE(parsed_cronAttr == expected,"Expected " << expected.dump() << " : " << expected.time().dump()
+                          << " but found " << parsed_cronAttr.dump() << " : " << parsed_cronAttr.time().dump());
+   }
+
+   {
+       std::string line = "cron 00:01 23:59 01:00 # nextTimeSlot/12:01";
+       std::vector<std::string> lineTokens;
+       Str::split(line,lineTokens);
+       bool parse_state = true;
+       CronAttr parsed_cronAttr;
+       CronAttr::parse( parsed_cronAttr,lineTokens, index, parse_state);
+
+       CronAttr expected;
+       TimeSlot start(0,1);
+       TimeSlot finish(23,59);
+       TimeSlot incr(1,0);
+       TimeSeries series(start, finish,incr);
+       series.set_next_time_slot(TimeSlot(12,1));
+       expected.addTimeSeries(series);
+       BOOST_CHECK_MESSAGE(parsed_cronAttr == expected,"Expected " << expected.dump() << " : " << expected.time().dump()
+                           << " but found " << parsed_cronAttr.dump() << " : " << parsed_cronAttr.time().dump());
+    }
+
+   {
+       std::string line = "cron 00:01 23:59 01:00 # free nextTimeSlot/12:01";
+       std::vector<std::string> lineTokens;
+       Str::split(line,lineTokens);
+       bool parse_state = true;
+       CronAttr parsed_cronAttr;
+       CronAttr::parse( parsed_cronAttr,lineTokens, index, parse_state);
+
+       CronAttr expected;
+       TimeSlot start(0,1);
+       TimeSlot finish(23,59);
+       TimeSlot incr(1,0);
+       TimeSeries series(start, finish,incr);
+       series.set_next_time_slot(TimeSlot(12,1));
+       expected.addTimeSeries(series);
+       expected.setFree();
+       BOOST_CHECK_MESSAGE(parsed_cronAttr == expected,"Expected " << expected.dump() << " : " << expected.time().dump()
+                           << " but found " << parsed_cronAttr.dump() << " : " << parsed_cronAttr.time().dump());
+   }
+   {
+      std::string line = "cron 00:00 18:00 06:00 # isValid:false nextTimeSlot/24:00";
+      std::vector<std::string> lineTokens;
+      Str::split(line,lineTokens);
+      bool parse_state = true;
+      CronAttr parsed_cronAttr;
+      CronAttr::parse( parsed_cronAttr,lineTokens, index, parse_state);
+
+      CronAttr expected;
+      TimeSlot start(0,0);
+      TimeSlot finish(18,0);
+      TimeSlot incr(6,0);
+      TimeSeries series(start, finish,incr);
+      series.set_next_time_slot(TimeSlot(24,0));
+      series.set_isValid(false); // to match isValid:false
+      expected.addTimeSeries(series);
+      BOOST_CHECK_MESSAGE(parsed_cronAttr == expected,"Expected " << expected.dump() << " : " << expected.time().dump()
+                          << " but found " << parsed_cronAttr.dump() << " : " << parsed_cronAttr.time().dump());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_cron_once_free_stays_free)
+{
+   cout << "ANattr:: ...test_cron_once_free_stays_free\n";
+
+   Calendar calendar;
+   calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+   TimeSeries timeSeriesX(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries2X(TimeSlot(11,0), TimeSlot(15,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries3X(TimeSlot(15,0),  false/* relative */);
+   TimeSeries timeSeries4X(TimeSlot(0,0),  false/* relative */);
+
+   CronAttr timeSeries;  timeSeries.addTimeSeries(timeSeriesX );
+   CronAttr timeSeries2; timeSeries2.addTimeSeries(timeSeries2X );
+   CronAttr timeSeries3; timeSeries3.addTimeSeries(timeSeries3X );
+   CronAttr timeSeries4; timeSeries4.addTimeSeries(timeSeries4X );
+
+   std::vector<boost::posix_time::time_duration> timeSeries_free_slots;
+   std::vector<boost::posix_time::time_duration> timeSeries2_free_slots;
+   timeSeries.time_series().free_slots(timeSeries_free_slots);
+   timeSeries2.time_series().free_slots(timeSeries2_free_slots);
+   BOOST_CHECK_MESSAGE(timeSeries_free_slots.size() == 11,"Expected 11 free slots for " << timeSeries.toString() << " but found "  << timeSeries_free_slots.size());
+   BOOST_CHECK_MESSAGE(timeSeries2_free_slots.size() == 5,"Expected 5 free slots for " << timeSeries2.toString() << " but found "  << timeSeries_free_slots.size());
+
+   bool day_changed = false; // after midnight make sure we keep day_changed
+   for(int m=1; m < 96; m++) {
+      calendar.update( time_duration( minutes(30) ) );
+      if (!day_changed) {
+         day_changed = calendar.dayChanged();
+      }
+      boost::posix_time::time_duration time = calendar.suiteTime().time_of_day();
+      // cout << time << " day_changed(" << day_changed << ")\n";
+
+      timeSeries.calendarChanged( calendar );
+      timeSeries2.calendarChanged( calendar );
+      timeSeries3.calendarChanged( calendar );
+      timeSeries4.calendarChanged( calendar );
+
+      // cron should always reque regardless of time series
+      BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar),timeSeries.toString() << " checkForRequeue should be true at time " << time );
+      BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar),timeSeries2.toString() << " checkForRequeue should be true at time " << time );
+      BOOST_CHECK_MESSAGE(timeSeries3.checkForRequeue(calendar),timeSeries3.toString() << " checkForRequeue should be true at time " << time );
+      BOOST_CHECK_MESSAGE(timeSeries4.checkForRequeue(calendar),timeSeries4.toString() << " checkForRequeue should be true at time " << time );
+
+      // **********************************************************************************
+      // When a cron (regardless of whether its single slot or time series) is free, it stays free,
+      // until explicitly re-queued,
+      // ***********************************************************************************
+
+      if (time < timeSeries.time_series().start().duration()) {
+         if (!day_changed) BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should NOT be free at time " << time );
+         else BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+      }
+      else if (time >= timeSeries.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+      }
+
+
+      if (time < timeSeries2.time_series().start().duration()) {
+         if (!day_changed) BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should NOT be free at time " << time );
+         else BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+      }
+      else if (time >= timeSeries2.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " should be free at time " << time );
+      }
+
+      if (!day_changed) {
+         if (time == timeSeries3.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time " << time );
+         }
+         else if (time > timeSeries3.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " isFree, once free should stay free at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time after day change " << time );
+      }
+
+
+      // single slot at midnight, Once a single slot if Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+      if (!day_changed) {
+         if (time == timeSeries4.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " should be free at time " << time );
+         }
+         else {
+            BOOST_CHECK_MESSAGE(!timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should fail at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should pass at time " << time );
+      }
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_cron_time_series)
+{
+   cout << "ANattr:: ...test_cron_time_series\n";
+
+   // See TimeAttr.hpp for rules concerning isFree() and checkForReque()
+   // test time attr isFree(), and checkForRequeue
+   Calendar calendar;
+   calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+   TimeSeries timeSeriesX(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries2X(TimeSlot(11,0), TimeSlot(15,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries3X(TimeSlot(15,0),  false/* relative */);
+   TimeSeries timeSeries4X(TimeSlot(0,0),  false/* relative */);
+
+   CronAttr timeSeries;  timeSeries.addTimeSeries(timeSeriesX );
+   CronAttr timeSeries2; timeSeries2.addTimeSeries(timeSeries2X );
+   CronAttr timeSeries3; timeSeries3.addTimeSeries(timeSeries3X );
+   CronAttr timeSeries4; timeSeries4.addTimeSeries(timeSeries4X );
+
+   std::vector<boost::posix_time::time_duration> timeSeries_free_slots;
+   std::vector<boost::posix_time::time_duration> timeSeries2_free_slots;
+   timeSeries.time_series().free_slots(timeSeries_free_slots);
+   timeSeries2.time_series().free_slots(timeSeries2_free_slots);
+   BOOST_CHECK_MESSAGE(timeSeries_free_slots.size() == 11,"Expected 11 free slots for " << timeSeries.toString() << " but found "  << timeSeries_free_slots.size());
+   BOOST_CHECK_MESSAGE(timeSeries2_free_slots.size() == 5,"Expected 5 free slots for " << timeSeries2.toString() << " but found "  << timeSeries_free_slots.size());
+
+   bool day_changed = false; // after midnight make sure we keep day_changed
+   for(int m=1; m < 96; m++) {
+      calendar.update( time_duration( minutes(30) ) );
+      if (!day_changed) {
+         day_changed = calendar.dayChanged();
+      }
+      boost::posix_time::time_duration time = calendar.suiteTime().time_of_day();
+//      cout << time << " day_changed(" << day_changed << ")\n";
+
+      timeSeries.calendarChanged( calendar );
+      timeSeries2.calendarChanged( calendar );
+      timeSeries3.calendarChanged( calendar );
+      timeSeries4.calendarChanged( calendar );
+
+      // cron should always reque regardless of time series
+      BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar),timeSeries.toString() << " checkForRequeue should be true at time " << time );
+      BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar),timeSeries2.toString() << " checkForRequeue should be true at time " << time );
+      BOOST_CHECK_MESSAGE(timeSeries3.checkForRequeue(calendar),timeSeries3.toString() << " checkForRequeue should be true at time " << time );
+      BOOST_CHECK_MESSAGE(timeSeries4.checkForRequeue(calendar),timeSeries4.toString() << " checkForRequeue should be true at time " << time );
+
+      // **********************************************************************************
+      // When a cron (regardless of whether its single slot or time series) is free, it stays free
+      // However in order to test crons with time series, we will re-queue ate the end of this loop
+      // ***********************************************************************************
+
+      if (time < timeSeries.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should NOT be free at time " << time );
+      }
+      else if (time >= timeSeries.time_series().start().duration() && time <=timeSeries.time_series().finish().duration()) {
+
+         bool matches_free_slot = false;
+         for(size_t i = 0; i < timeSeries_free_slots.size(); i++) {
+            if (time == timeSeries_free_slots[i]) { matches_free_slot = true; break; }
+         }
+         if (matches_free_slot) BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+         else                   BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should be fail at time " << time );
+      }
+      else {
+         BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should be holding at time " << time );
+      }
+
+
+      if (time < timeSeries2.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should NOT be free at time " << time );
+      }
+      else if (time >= timeSeries2.time_series().start().duration() && time <=timeSeries2.time_series().finish().duration()) {
+
+         bool matches_free_slot = false;
+         for(size_t i = 0; i < timeSeries2_free_slots.size(); i++) {
+            if (time == timeSeries2_free_slots[i]) { matches_free_slot = true; break;}
+         }
+         if (matches_free_slot) BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " should be free at time " << time );
+         else                   BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should be fail at time " << time );
+      }
+      else {
+         BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should be holding at time " << time );
+      }
+
+
+      // Single slot, Once a single slot if Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+      if (!day_changed) {
+         if (time == timeSeries3.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time " << time );
+         }
+         else if (time > timeSeries3.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " isFree, once free should stay free at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time after day change " << time );
+      }
+
+
+      // single slot at midnight, Once a single slot if Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+      if (!day_changed) {
+         if (time == timeSeries4.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " should be free at time " << time );
+         }
+         else {
+            BOOST_CHECK_MESSAGE(!timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should fail at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should pass at time " << time );
+      }
+
+      // Typically when a cron is free, it stays free, until it is re-queued
+      // However in order to test isFree for cron with time inetrvals, we need to re-queue
+      timeSeries.requeue( calendar );
+      timeSeries2.requeue( calendar );
+
+      // Do not requeue cron 00, and cron 15, so that we can check for free
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANattr/test/TestDayAttr.cpp b/ecflow_4_0_7/ANattr/test/TestDayAttr.cpp
new file mode 100644
index 0000000..0f00de3
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestDayAttr.cpp
@@ -0,0 +1,78 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+#include "DayAttr.hpp"
+#include "Calendar.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_day_attr)
+{
+   cout << "ANattr:: ...test_day_attr\n";
+
+   // See TimeAttr.hpp for rules concerning isFree() and checkForReque()
+   // test time attr isFree(), and checkForRequeue
+   Calendar calendar;
+   calendar.init(ptime(date(2013,7,9), minutes(0)), Calendar::REAL); // tuesday
+
+   // Represent a day within a week (range 0==Sun to 6==Sat)
+   BOOST_CHECK_MESSAGE(calendar.day_of_week() == 2 ," Expected tuesday(2) but found " <<  calendar.day_of_week() );
+
+   DayAttr day(DayAttr::WEDNESDAY);
+
+   int day_changed = 0; // after midnight make sure we keep day_changed
+   // day_changed = 0;  tuesday
+   // day_changed = 1;  wednesday
+   // day_changed = 3;  thursday
+   for(int m=1; m < 96; m++) {
+      calendar.update( time_duration( hours(1) ) );
+      if (calendar.dayChanged()) day_changed++;
+
+      // cout << " day_changed(" << day_changed << ") calendar.day_of_week() = " <<  calendar.day_of_week() << "\n";
+
+      day.calendarChanged( calendar );
+
+      if ( calendar.day_of_week() < day.day() ) {
+         BOOST_CHECK_MESSAGE(!day.isFree(calendar),day.toString() << " is free should fail at day " << calendar.day_of_week() );
+         BOOST_CHECK_MESSAGE(day.checkForRequeue(calendar),day.toString() << " checkForRequeue should pass at " << calendar.day_of_week() );
+      }
+      else if (calendar.day_of_week() == day.day()  ) {
+         BOOST_CHECK_MESSAGE(day.isFree(calendar),day.toString() << " is free should pass at day " << calendar.day_of_week() );
+         BOOST_CHECK_MESSAGE(!day.checkForRequeue(calendar),day.toString() << " checkForRequeue should fail at " << calendar.day_of_week() );
+      }
+      else {
+         BOOST_CHECK_MESSAGE(calendar.day_of_week() > day.day(),"");
+         // *** once free , should *stay* free, until explicitly re-queued
+         BOOST_CHECK_MESSAGE(day.isFree(calendar),day.toString() << " is free should pass at day " << calendar.day_of_week() );
+         BOOST_CHECK_MESSAGE(!day.checkForRequeue(calendar),day.toString() << " checkForRequeue should fail at " << calendar.day_of_week() );
+      }
+   }
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANattr/test/TestLabel.cpp b/ecflow_4_0_7/ANattr/test/TestLabel.cpp
new file mode 100644
index 0000000..8c69de1
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestLabel.cpp
@@ -0,0 +1,83 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <boost/test/unit_test.hpp>
+
+#include "NodeAttr.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_label_parsing )
+{
+   cout << "ANattr:: ...test_label_parsing\n";
+   {
+      std::string line = "label name \"value\"";
+      std::vector<string> linetokens;
+      Str::split(line,linetokens);
+
+      Label label;
+      label.parse(line,linetokens, false);
+
+      Label expected("name","value");
+      BOOST_CHECK_MESSAGE(label == expected,"Expected " << expected.toString() << " but found " << label.toString());
+      BOOST_CHECK_MESSAGE(label.dump() == expected.dump(),"Expected " << expected.dump() << " but found " << label.dump());
+   }
+   {
+      std::string line = "label name \"value\\nvalue\"";
+      std::vector<string> linetokens;
+      Str::split(line,linetokens);
+
+      Label label;
+      label.parse(line,linetokens, false);
+
+      Label expected("name","value\nvalue");
+      BOOST_CHECK_MESSAGE(label == expected,"Expected " << expected.toString() << " but found " << label.toString());
+      BOOST_CHECK_MESSAGE(label.dump() == expected.dump(),"Expected " << expected.dump() << " but found " << label.dump());
+   }
+   {
+      std::string line = "label name \"value that is multiple token !!!! 23445 !^ & * ( )\"";
+      std::vector<string> linetokens;
+      Str::split(line,linetokens);
+
+      Label label;
+      label.parse(line,linetokens, false);
+
+      Label expected("name","value that is multiple token !!!! 23445 !^ & * ( )");
+      BOOST_CHECK_MESSAGE(label == expected,"Expected " << expected.toString() << " but found " << label.toString());
+      BOOST_CHECK_MESSAGE(label.dump() == expected.dump(),"Expected " << expected.dump() << " but found " << label.dump());
+   }
+   {
+      std::string line = "label name \"value\\n that\\n is\\n multiple\\n token\\n and\\n new\\n \\nlines\"";
+      std::vector<string> linetokens;
+      Str::split(line,linetokens);
+
+      Label label;
+      label.parse(line,linetokens, false);
+
+      Label expected("name","value\n that\n is\n multiple\n token\n and\n new\n \nlines");
+      BOOST_CHECK_MESSAGE(label == expected,"Expected " << expected.toString() << " but found " << label.toString());
+      BOOST_CHECK_MESSAGE(label.dump() == expected.dump(),"Expected " << expected.dump() << " but found " << label.dump());
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANattr/test/TestMigration.cpp b/ecflow_4_0_7/ANattr/test/TestMigration.cpp
new file mode 100644
index 0000000..6c6e14e
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestMigration.cpp
@@ -0,0 +1,185 @@
+#if defined(TEXT_ARCHIVE) || !defined(BINARY_ARCHIVE) && !defined(PORTABLE_BINARY_ARCHIVE) && !defined(EOS_PORTABLE_BINARY_ARCHIVE)
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/test/unit_test.hpp>
+
+#include "TodayAttr.hpp"
+#include "TimeAttr.hpp"
+#include "VerifyAttr.hpp"
+#include "RepeatAttr.hpp"
+#include "LateAttr.hpp"
+#include "DayAttr.hpp"
+#include "DateAttr.hpp"
+#include "CronAttr.hpp"
+#include "ClockAttr.hpp"
+#include "AutoCancelAttr.hpp"
+#include "NodeAttr.hpp"
+#include "Variable.hpp"
+#include "ZombieAttr.hpp"
+#include "Calendar.hpp"
+#include "SerializationTest.hpp"
+#include "TimeSeries.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+namespace fs = boost::filesystem;
+
+//#define UPDATE_TESTS 1
+
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+// These test are used for future release. They help to ensure that we have
+// backward compatibility.i.e future release can open file, created by an earlier release
+//
+BOOST_AUTO_TEST_CASE( test_migration_restore_def_con )
+{
+   cout << "ANattr:: ...test_migration_restore_def_con\n";
+
+   std::string file_name = File::test_data("ANattr/test/data/migration/default_constructor_v1_9/","ANattr");
+
+   // Create migration data
+#ifdef UPDATE_TESTS
+   doSave(file_name + "VerifyAttr",VerifyAttr());
+   doSave(file_name + "TodayAttr",TodayAttr());
+   doSave(file_name + "TimeAttr",TimeAttr());
+   doSave(file_name + "RepeatDate",RepeatDate());
+   doSave(file_name + "RepeatInteger",RepeatInteger());
+   doSave(file_name + "RepeatEnumerated",RepeatEnumerated());
+   doSave(file_name + "RepeatString",RepeatString());
+   doSave(file_name + "LateAttr",LateAttr());
+   doSave(file_name + "DayAttr",DayAttr());
+   doSave(file_name + "DateAttr",DateAttr());
+   doSave(file_name + "CronAttr",CronAttr());
+   doSave(file_name + "ClockAttr",ClockAttr());
+   doSave(file_name + "AutoCancelAttr",AutoCancelAttr());
+   doSave(file_name + "Label",Label());
+   doSave(file_name + "Variable",Variable());
+   doSave(file_name + "Event",Event());
+   doSave(file_name + "Meter",Meter());
+   doSave(file_name + "ZombieAttr",ZombieAttr());
+#endif
+
+   do_restore<VerifyAttr>(file_name + "VerifyAttr",VerifyAttr());
+   do_restore<TodayAttr>(file_name + "TodayAttr",TodayAttr());
+   do_restore<TimeAttr>(file_name + "TimeAttr",TimeAttr());
+   do_restore<RepeatDate>(file_name + "RepeatDate",RepeatDate());
+   do_restore<RepeatInteger>(file_name + "RepeatInteger",RepeatInteger());
+   do_restore<RepeatEnumerated>(file_name + "RepeatEnumerated",RepeatEnumerated());
+   do_restore<RepeatString>(file_name + "RepeatString",RepeatString());
+   do_restore<LateAttr>(file_name + "LateAttr",LateAttr());
+   do_restore<DayAttr>(file_name + "DayAttr",DayAttr());
+   do_restore<DateAttr>(file_name + "DateAttr",DateAttr());
+   do_restore<CronAttr>(file_name + "CronAttr",CronAttr());
+   do_restore<AutoCancelAttr>(file_name + "AutoCancelAttr",AutoCancelAttr());
+   do_restore<Label>(file_name + "Label",Label());
+   do_restore<Variable>(file_name + "Variable",Variable());
+   do_restore<Event>(file_name + "Event",Event());
+   do_restore<Meter>(file_name + "Meter",Meter());
+   do_restore<ZombieAttr>(file_name + "ZombieAttr",ZombieAttr());
+}
+
+BOOST_AUTO_TEST_CASE( test_migration_restore )
+{
+   cout << "ANattr:: ...test_migration_restore\n";
+
+   std::string file_name = File::test_data("ANattr/test/data/migration/v1_9/","ANattr");
+
+   std::vector<std::string> theVec; theVec.push_back("a");  theVec.push_back("b");
+   LateAttr lateattr;
+   lateattr.addSubmitted(TimeSlot(10,12));
+   lateattr.addActive(TimeSlot(10,12));
+   lateattr.addComplete(TimeSlot(10,12),true);
+
+   CronAttr cron_attr;
+   std::vector<int> weekDays; weekDays.push_back(1); weekDays.push_back(2);
+   std::vector<int> daysOfMonth; daysOfMonth.push_back(1); daysOfMonth.push_back(2);
+   std::vector<int> months; months.push_back(1); months.push_back(2);
+   cron_attr.addWeekDays(weekDays);
+   cron_attr.addDaysOfMonth(daysOfMonth);
+   cron_attr.addMonths(months);
+   cron_attr.addTimeSeries(TimeSlot(0,0),TimeSlot(20,0),TimeSlot(0,1));
+
+   ClockAttr clock_attr(false);
+   clock_attr.date(1,1,2009);
+   clock_attr.set_gain_in_seconds(3600);
+   clock_attr.startStopWithServer(true);
+
+   std::vector<ecf::Child::CmdType> child_cmds;
+   child_cmds.push_back(ecf::Child::INIT);
+   child_cmds.push_back(ecf::Child::EVENT);
+   child_cmds.push_back(ecf::Child::METER);
+   child_cmds.push_back(ecf::Child::LABEL);
+   child_cmds.push_back(ecf::Child::WAIT);
+   child_cmds.push_back(ecf::Child::ABORT);
+   child_cmds.push_back(ecf::Child::COMPLETE);
+
+   Label label("name","value");
+   label.set_new_value("new_value");
+
+#ifdef UPDATE_TESTS
+   // Create migration data
+   doSave(file_name + "VerifyAttr",VerifyAttr(NState::COMPLETE,3));
+   doSave(file_name + "TodayAttr",TodayAttr(10,12));
+   doSave(file_name + "TimeAttr",TimeAttr(10,12));
+   doSave(file_name + "RepeatDate",RepeatDate("date",20110112,20110115));
+   doSave(file_name + "RepeatInteger",RepeatInteger("integer",0,100,2));
+   doSave(file_name + "RepeatEnumerated",RepeatEnumerated("enum",theVec));
+   doSave(file_name + "RepeatString",RepeatString("string",theVec));
+   doSave(file_name + "LateAttr",lateattr);
+   doSave(file_name + "DayAttr",DayAttr(DayAttr::MONDAY));
+   doSave(file_name + "DateAttr",DateAttr(12,12,2012));
+   doSave(file_name + "CronAttr",cron_attr);
+   doSave(file_name + "ClockAttr",clock_attr);
+   doSave(file_name + "AutoCancelAttr",AutoCancelAttr(100));
+   doSave(file_name + "AutoCancelAttr_1",AutoCancelAttr(TimeSlot(10,12),true));
+   doSave(file_name + "Label",label);
+//   doSave(file_name + "Limit",limit);
+   doSave(file_name + "Variable",Variable("var_name","var_value"));
+   doSave(file_name + "Event_1",Event(1));
+   doSave(file_name + "Event_2",Event("event"));
+   doSave(file_name + "Meter",Meter("meter",10,100,100));
+   doSave(file_name + "ZombieAttr",ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10));
+#endif
+
+   do_restore<VerifyAttr>(file_name + "VerifyAttr",VerifyAttr(NState::COMPLETE,3));
+   do_restore<TodayAttr>(file_name + "TodayAttr",TodayAttr(10,12));
+   do_restore<TimeAttr>(file_name + "TimeAttr",TimeAttr(10,12));
+   do_restore<RepeatDate>(file_name + "RepeatDate",RepeatDate("date",20110112,20110115));
+   do_restore<RepeatInteger>(file_name + "RepeatInteger",RepeatInteger("integer",0,100,2));
+   do_restore<RepeatEnumerated>(file_name + "RepeatEnumerated",RepeatEnumerated("enum",theVec));
+   do_restore<RepeatString>(file_name + "RepeatString",RepeatString("string",theVec));
+   do_restore<LateAttr>(file_name + "LateAttr",lateattr);
+   do_restore<DayAttr>(file_name + "DayAttr",DayAttr(DayAttr::MONDAY));
+   do_restore<DateAttr>(file_name + "DateAttr",DateAttr(12,12,2012));
+   do_restore<CronAttr>(file_name + "CronAttr",cron_attr);
+   do_restore<ClockAttr>(file_name + "ClockAttr",clock_attr);
+   do_restore<AutoCancelAttr>(file_name + "AutoCancelAttr",AutoCancelAttr(100));
+   do_restore<AutoCancelAttr>(file_name + "AutoCancelAttr_1",AutoCancelAttr(TimeSlot(10,12),true));
+   do_restore<Label>(file_name + "Label",label);
+   do_restore<Variable>(file_name + "Variable",Variable("var_name","var_value"));
+   do_restore<Event>(file_name + "Event_1",Event(1));
+   do_restore<Event>(file_name + "Event_2",Event("event"));
+   do_restore<Meter>(file_name + "Meter",Meter("meter",10,100,100));
+   do_restore<ZombieAttr>(file_name + "ZombieAttr",ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+#endif
diff --git a/ecflow_4_0_7/ANattr/test/TestRepeat.cpp b/ecflow_4_0_7/ANattr/test/TestRepeat.cpp
new file mode 100644
index 0000000..3018fb0
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestRepeat.cpp
@@ -0,0 +1,425 @@
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/test/unit_test.hpp>
+
+#include "RepeatAttr.hpp"
+
+using namespace std;
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_repeat_invariants )
+{
+   cout << "ANattr:: ...test_repeat_invariants\n";
+
+   std::vector<std::string> stringList; stringList.reserve(3);
+   stringList.push_back("a");
+   stringList.push_back("b");
+   stringList.push_back("c");
+
+   // Test the invariant that Non empty repeat must have a name
+   {
+      Repeat empty;
+      Repeat empty2;
+      BOOST_CHECK_MESSAGE(empty.empty(),"Construction");
+      BOOST_CHECK_MESSAGE(empty.name().empty(),"Construction");
+      BOOST_CHECK_MESSAGE(empty == empty2,"Equality failed");
+   }
+   {
+      Repeat rep(RepeatDate("YMD",20090916,20090930,1));
+      BOOST_CHECK_MESSAGE(!rep.empty()," Repeat should not be empty");
+      BOOST_CHECK_MESSAGE(!rep.name().empty(),"name should not be empty");
+      BOOST_CHECK_MESSAGE(rep.name() == "YMD","name not as expected");
+      BOOST_CHECK_MESSAGE(rep.start() == 20090916,"Start should be 20090916");
+      BOOST_CHECK_MESSAGE(rep.end() == 20090930,"end should be 20090930");
+      BOOST_CHECK_MESSAGE(rep.step() == 1,"step should be 1");
+      BOOST_CHECK_MESSAGE(rep.value() == 20090916,"value should be 20090916");
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20090916,"last_valid_value should be 20090916");
+
+      Repeat cloned = Repeat(rep);
+      BOOST_CHECK_MESSAGE(cloned == rep,"Equality failed");
+      BOOST_CHECK_MESSAGE(cloned.name() == "YMD","not as expected");
+      BOOST_CHECK_MESSAGE(cloned.start() == 20090916,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.end() == 20090930,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.step() == 1,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.value() == 20090916,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.valueAsString() == "20090916","not as expected");
+      BOOST_CHECK_MESSAGE(cloned.last_valid_value() == 20090916,"last_valid_value should be 20090916");
+
+      RepeatDate empty;
+      BOOST_CHECK_MESSAGE(empty.start() == 0,"Start should be 0");
+      BOOST_CHECK_MESSAGE(empty.end() == 0,"end should be 0");
+      BOOST_CHECK_MESSAGE(empty.step() == 0,"step should be 0");
+      BOOST_CHECK_MESSAGE(empty.value() == 0,"delta should be 0");
+      BOOST_CHECK_MESSAGE(empty.name().empty(),"name should be empty");
+      BOOST_CHECK_MESSAGE(empty.name() == "","name not as expected");
+   }
+   {
+      Repeat rep(RepeatDate("YMD",20090916,20090916,1));
+      BOOST_CHECK_MESSAGE(rep.start() == 20090916,"Start should be 20090916");
+      BOOST_CHECK_MESSAGE(rep.end() == 20090916,"end should be 20090916");
+      BOOST_CHECK_MESSAGE(rep.step() == 1,"step should be 1");
+      BOOST_CHECK_MESSAGE(rep.value() == 20090916,"value should be 20090916");
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20090916,"delta should be 20090916");
+      rep.increment();
+      BOOST_CHECK_MESSAGE(!rep.valid(),"RepeatDate should not be valid");
+      BOOST_CHECK_MESSAGE(rep.value() == 20090917,"value should be 20090916");
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20090916,"last_valid_value should be 20090916");
+   }
+
+
+   {
+      Repeat rep(RepeatEnumerated("AEnum",stringList));
+      BOOST_CHECK_MESSAGE(!rep.empty()," Repeat should not be empty");
+      BOOST_CHECK_MESSAGE(!rep.name().empty(),"name should not be empty");
+      BOOST_CHECK_MESSAGE(rep.name() == "AEnum","name not as expected");
+
+      Repeat cloned = Repeat(rep);
+      BOOST_CHECK_MESSAGE(cloned == rep,"Equality failed");
+      BOOST_CHECK_MESSAGE(cloned.name() == "AEnum","not as expected");
+      BOOST_CHECK_MESSAGE(cloned.start() == 0,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.step() == 1,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.value() == 0,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.valueAsString() == "a","not as expected");
+
+      RepeatEnumerated empty;
+      BOOST_CHECK_MESSAGE(empty.start() == 0,"Start should be 0");
+      BOOST_CHECK_MESSAGE(empty.end() == 0,"end should be 0");
+      BOOST_CHECK_MESSAGE(empty.step() == 1,"default step should be 1");
+      BOOST_CHECK_MESSAGE(empty.value() == 0,"delta should be 0");
+      BOOST_CHECK_MESSAGE(empty.name().empty(),"name should be empty");
+      BOOST_CHECK_MESSAGE(empty.name() == "","name not as expected");
+   }
+   {
+      Repeat rep(RepeatInteger("rep",0,100,1));
+      BOOST_CHECK_MESSAGE(!rep.empty()," Repeat should not be empty");
+      BOOST_CHECK_MESSAGE(!rep.name().empty(),"name should not be empty");
+      BOOST_CHECK_MESSAGE(rep.name() == "rep","name not as expected");
+
+      Repeat cloned = Repeat(rep);
+      BOOST_CHECK_MESSAGE(cloned == rep,"Equality failed");
+      BOOST_CHECK_MESSAGE(cloned.name() == "rep","not as expected");
+      BOOST_CHECK_MESSAGE(cloned.start() == 0,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.end() == 100,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.step() == 1,"not as expected");
+      BOOST_CHECK_MESSAGE(cloned.value() == 0,"not as expected");
+
+      RepeatInteger empty;
+      BOOST_CHECK_MESSAGE(empty.start() == 0,"Start should be 0");
+      BOOST_CHECK_MESSAGE(empty.end() == 0,"end should be 0");
+      BOOST_CHECK_MESSAGE(empty.step() == 0,"default step should be 0 but found" <<  empty.step());
+      BOOST_CHECK_MESSAGE(empty.value() == 0,"delta should be 0");
+      BOOST_CHECK_MESSAGE(empty.name().empty(),"name should be empty");
+      BOOST_CHECK_MESSAGE(empty.name() == "","name not as expected");
+   }
+   {
+      Repeat rep(RepeatDay(2));
+      BOOST_CHECK_MESSAGE(!rep.empty()," Repeat should not be empty");
+      BOOST_CHECK_MESSAGE(!rep.name().empty(),"name should not be empty");
+      BOOST_CHECK_MESSAGE(rep.name() == "day","name not as expected");
+
+      Repeat cloned = Repeat(rep);
+      BOOST_CHECK_MESSAGE(cloned == rep,"Equality failed");
+      BOOST_CHECK_MESSAGE(cloned.name() == "day","name not as expected");
+      BOOST_CHECK_MESSAGE(cloned.step() == 2,"step not as expected");
+
+      RepeatDay empty;
+      BOOST_CHECK_MESSAGE(empty.start() == 0,"Start should be 0");
+      BOOST_CHECK_MESSAGE(empty.end() == 0,"end should be 0");
+      BOOST_CHECK_MESSAGE(empty.step() == 1,"default step should be 0 but found " <<  empty.step());
+      BOOST_CHECK_MESSAGE(empty.value() == 1,"value should be 0 but found " << empty.value());
+      BOOST_CHECK_MESSAGE(empty.name().empty(),"name should be empty");
+      BOOST_CHECK_MESSAGE(empty.name() == "","name not as expected");
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat )
+{
+	cout << "ANattr:: ...test_repeat \n";
+
+	std::vector<std::string> stringList; stringList.reserve(3);
+	stringList.push_back("a");
+	stringList.push_back("b");
+	stringList.push_back("c");
+
+	Repeat empty;
+	Repeat empty2;
+
+	{
+ 		Repeat l1(RepeatDate("YMD",20090916,20090930,1));
+		Repeat l2(RepeatDate("YMD",20090916,20090930,1));
+ 		BOOST_CHECK_MESSAGE(!l1.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(!l2.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(l1 == l2,"Equality failed");
+ 		BOOST_CHECK_MESSAGE(!(l1 == empty),"Equality failed");
+
+ 		Repeat la(RepeatEnumerated("AEnum",stringList));
+		Repeat lb(RepeatEnumerated("AEnum",stringList));
+		BOOST_CHECK_MESSAGE(!la.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(!lb.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(la == lb,"Equality failed");
+ 		BOOST_CHECK_MESSAGE(!(la == empty),"Equality failed");
+
+ 		Repeat lc(RepeatString("RepeatString",stringList));
+		Repeat ld(RepeatString("RepeatString",stringList));
+		BOOST_CHECK_MESSAGE(!lc.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(!ld.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(lc == lc,"Equality failed");
+ 		BOOST_CHECK_MESSAGE(!(lc == empty),"Equality failed");
+
+ 		Repeat le(RepeatInteger("rep",0,100,1));
+		Repeat lf(RepeatInteger("rep",0,100,1));
+		BOOST_CHECK_MESSAGE(!le.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(!lf.empty(),"Construction failed");
+ 		BOOST_CHECK_MESSAGE(le == lf,"Equality failed");
+ 		BOOST_CHECK_MESSAGE(!(le == empty),"Equality failed");
+
+		l1.clear();
+ 		l2.clear();
+ 		la.clear();
+ 		lb.clear();
+ 		lc.clear();
+ 		ld.clear();
+ 		le.clear();
+ 		lf.clear();
+ 		BOOST_CHECK_MESSAGE(l1 == empty,"Clear failed");
+ 		BOOST_CHECK_MESSAGE(l2 == empty,"Clear failed");
+ 		BOOST_CHECK_MESSAGE(la == empty,"Clear failed");
+ 		BOOST_CHECK_MESSAGE(lb == empty,"Clear failed");
+ 		BOOST_CHECK_MESSAGE(lc == empty,"Clear failed");
+ 		BOOST_CHECK_MESSAGE(ld == empty,"Clear failed");
+ 		BOOST_CHECK_MESSAGE(le == empty,"Clear failed");
+ 		BOOST_CHECK_MESSAGE(lf == empty,"Clear failed");
+	}
+
+	{
+ 		Repeat l1(RepeatDate("YMD",20090916,20090930,1));
+		Repeat l2;
+		l2 = l1;
+ 		BOOST_CHECK_MESSAGE(l1 == l2,"Assignment failed");
+
+ 		l2 = empty;
+ 		BOOST_CHECK_MESSAGE(l2 == empty,"Assignment failed");
+
+ 		Repeat la(RepeatEnumerated("AEnum",stringList));
+ 		Repeat lb;
+ 		lb = la;
+ 		BOOST_CHECK_MESSAGE(la == lb,"Assignment failed");
+
+ 		Repeat lc(RepeatString("RepeatString",stringList));
+ 		Repeat ld;
+ 		ld = lc;
+ 		BOOST_CHECK_MESSAGE(lc == ld,"Assignment failed");
+
+ 		Repeat le(RepeatInteger("rep",0,100,1));
+		Repeat lf;
+		lf = le;
+ 		BOOST_CHECK_MESSAGE(le == lf,"Assignment failed");
+ 	}
+
+	{
+		Repeat l1(RepeatDate("YMD",20090916,20090930,1));
+
+		Repeat l2 = l1;
+  		BOOST_CHECK_MESSAGE(l1 == l2,"Copy construction failed");
+
+ 		Repeat la(RepeatEnumerated("AEnum",stringList));
+ 		Repeat lb = la;
+ 		BOOST_CHECK_MESSAGE(la == lb,"Copy construction failed");
+
+ 		Repeat lc(RepeatString("RepeatString",stringList));
+ 		Repeat ld = lc;
+ 		BOOST_CHECK_MESSAGE(lc == ld,"Copy construction failed");
+
+ 		Repeat le(RepeatInteger("rep",0,100,1));
+		Repeat lf = le;
+ 		BOOST_CHECK_MESSAGE(le == lf,"Copy construction failed");
+
+		Repeat empty_1( empty );
+ 		BOOST_CHECK_MESSAGE(empty_1 == empty,"Copy construction failed");
+ 	}
+
+	{
+ 		BOOST_CHECK_MESSAGE(empty.name() == string()," empty  failed");
+ 		BOOST_CHECK_MESSAGE(empty.valid() == false," empty  failed");
+ 		BOOST_CHECK_MESSAGE(empty.value() == 0," empty  failed");
+ 		empty.setToLastValue();
+ 		BOOST_CHECK_MESSAGE(empty.valueAsString() == string()," empty  failed");
+ 		empty.reset();
+ 		empty.increment();
+ 		empty.change("fred");
+ 		BOOST_CHECK_MESSAGE(empty.valueAsString() == string()," empty  failed");
+ 		empty.changeValue(10);
+ 		BOOST_CHECK_MESSAGE(empty.valueAsString() == string()," empty  failed");
+ 		BOOST_CHECK_MESSAGE(empty.isInfinite() == false," empty  failed");
+ 		BOOST_CHECK_MESSAGE(empty.toString() == string()," empty  failed");
+ 		BOOST_CHECK_MESSAGE(empty.state_change_no() ==0," empty  failed");
+	}
+
+	{
+ 		Repeat day(RepeatDay(2));
+ 		Repeat day2 = day;
+      BOOST_CHECK_MESSAGE(day == day2,"Copy construction failed");
+
+ 		BOOST_CHECK_MESSAGE(day.makeInfiniteInValid(),"Should return true");
+ 		BOOST_CHECK_MESSAGE(!day.valid(),"Should return false after makeInfiniteInValid");
+		day.reset();
+ 		BOOST_CHECK_MESSAGE(day.valid(),"Should return true after reset");
+	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_last_value )
+{
+   cout << "ANattr:: ...test_repeat_last_value \n";
+
+   {
+      Repeat rep(RepeatDate("YMD",20090916,20090930,1));
+      rep.setToLastValue();
+      BOOST_CHECK_MESSAGE(rep.value() == 20090930,"Set to last value did not work, expected 20090930 but found " << rep.value());
+   }
+
+
+   std::vector<std::string> stringList; stringList.reserve(3);
+   stringList.push_back("a");
+   stringList.push_back("b");
+   stringList.push_back("c");
+   {
+      Repeat rep(RepeatEnumerated("AEnum",stringList));
+      rep.setToLastValue();
+      BOOST_CHECK_MESSAGE(rep.value() == 2,"Set to last value did not work, expected 2 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.valueAsString() == "c","Set to last value did not work, expected 'c' but found " << rep.valueAsString());
+      BOOST_CHECK_MESSAGE(rep.value_as_string(0) == "a"," Expected 'a' but found " << rep.value_as_string(0));
+      BOOST_CHECK_MESSAGE(rep.value_as_string(1) == "b"," Expected 'b' but found " << rep.value_as_string(1));
+      BOOST_CHECK_MESSAGE(rep.value_as_string(2) == "c"," Expected 'c' but found " << rep.value_as_string(2));
+   }
+   {
+      Repeat rep(RepeatString("Str",stringList));
+      rep.setToLastValue();
+      BOOST_CHECK_MESSAGE(rep.value() == 2,"Set to last value did not work, expected 2 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.valueAsString() == "c","Set to last value did not work, expected 'c' but found " << rep.valueAsString());
+      BOOST_CHECK_MESSAGE(rep.value_as_string(0) == "a"," Expected 'a' but found " << rep.value_as_string(0));
+      BOOST_CHECK_MESSAGE(rep.value_as_string(1) == "b"," Expected 'b' but found " << rep.value_as_string(1));
+      BOOST_CHECK_MESSAGE(rep.value_as_string(2) == "c"," Expected 'c' but found " << rep.value_as_string(2));
+   }
+
+   {
+       Repeat rep(RepeatInteger("integer",0,10,1));
+       rep.setToLastValue();
+       BOOST_CHECK_MESSAGE(rep.value() == 10,"Set to last value did not work, expected 10 but found " << rep.value());
+       BOOST_CHECK_MESSAGE(rep.value_as_string(0) == "0"," Expected '0' but found " << rep.value_as_string(0));
+       BOOST_CHECK_MESSAGE(rep.value_as_string(1) == "1"," Expected '1' but found " << rep.value_as_string(1));
+       BOOST_CHECK_MESSAGE(rep.value_as_string(2) == "2"," Expected '2' but found " << rep.value_as_string(2));
+    }
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_enumerated_as_string_integers )
+{
+   cout << "ANattr:: ...test_repeat_enumerated_as_string_integers\n";
+
+   std::vector<std::string> stringList; stringList.reserve(3);
+   stringList.push_back("20130101");
+   stringList.push_back("20130102");
+   stringList.push_back("20130103");
+   {
+      Repeat rep(RepeatEnumerated("AEnum",stringList));
+      // Note: valueAsString should return string at the last valid index
+
+      BOOST_CHECK_MESSAGE(rep.valid(),"Expected rep to be valid");
+      BOOST_CHECK_MESSAGE(rep.value() == 20130101," Expected 20130101 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20130101," Expected 20130101 but found " << rep.last_valid_value());
+      BOOST_CHECK_MESSAGE(rep.valueAsString() == "20130101"," Expected '20130101' but found " << rep.valueAsString());
+      BOOST_CHECK_MESSAGE(rep.value_as_string(0) == "20130101"," Expected '20130101' but found " << rep.value_as_string(0));
+
+      rep.increment();
+      BOOST_CHECK_MESSAGE(rep.valid(),"Expected rep to be valid");
+      BOOST_CHECK_MESSAGE(rep.value() == 20130102," Expected 20130102 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20130102," Expected 20130102 but found " << rep.last_valid_value());
+      BOOST_CHECK_MESSAGE(rep.valueAsString() == "20130102"," Expected '20130102' but found " << rep.valueAsString());
+      BOOST_CHECK_MESSAGE(rep.value_as_string(1) == "20130102"," Expected '20130102' but found " << rep.value_as_string(1));
+
+      rep.increment();
+      BOOST_CHECK_MESSAGE(rep.value() == 20130103," Expected 20130103 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20130103," Expected 20130103 but found " << rep.last_valid_value());
+      BOOST_CHECK_MESSAGE(rep.valueAsString() == "20130103"," Expected '20130103' but found " << rep.valueAsString());
+      BOOST_CHECK_MESSAGE(rep.value_as_string(2) == "20130103"," Expected '20130103' but found " << rep.value_as_string(2));
+
+      rep.increment();
+      BOOST_CHECK_MESSAGE(!rep.valid(),"Expected rep to be in-valid");
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20130103," Expected 20130103 but found " << rep.last_valid_value());
+      BOOST_CHECK_MESSAGE(rep.valueAsString() == "20130103"," Expected '20130103' but found " << rep.valueAsString());
+
+      rep.increment();
+      BOOST_CHECK_MESSAGE(!rep.valid(),"Expected rep to be in-valid");
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20130103," Expected 20130103 but found " << rep.last_valid_value());
+      BOOST_CHECK_MESSAGE(rep.valueAsString() == "20130103"," Expected '20130103' but found " << rep.valueAsString());
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_increment )
+{
+   cout << "ANattr:: ...test_repeat_increment \n";
+
+   {
+      Repeat rep(RepeatDate("YMD",20090916,20090920,1));
+      while( rep.valid()) { rep.increment(); }
+      BOOST_CHECK_MESSAGE(rep.value() == 20090921,"expected 20090921 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 20090920,"expected 20090920 but found " << rep.last_valid_value());
+   }
+
+
+   std::vector<std::string> stringList; stringList.reserve(3);
+   stringList.push_back("a");
+   stringList.push_back("b");
+   stringList.push_back("c");
+   {
+      Repeat rep(RepeatEnumerated("AEnum",stringList));
+      while( rep.valid()) { rep.increment(); }
+      BOOST_CHECK_MESSAGE(rep.value() == 3," Expected 3 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 2," Expected 2 but found " << rep.last_valid_value());
+   }
+   {
+      Repeat rep(RepeatString("Str",stringList));
+      while( rep.valid()) { rep.increment(); }
+      BOOST_CHECK_MESSAGE(rep.value() == 3," Expected 3 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 2," Expected 2 but found " << rep.last_valid_value());
+   }
+   {
+      Repeat rep(RepeatInteger("integer",0,10,1));
+      while( rep.valid()) { rep.increment(); }
+      BOOST_CHECK_MESSAGE(rep.value() == 11," Expected 11 but found " << rep.value());
+      BOOST_CHECK_MESSAGE(rep.last_valid_value() == 10," Expected 10 but found " << rep.last_valid_value());
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_date_errors )
+{
+   cout << "ANattr:: ...test_repeat_date_errors \n";
+
+   BOOST_REQUIRE_THROW( RepeatDate("",20090916,20090920,1),std::runtime_error);
+   BOOST_REQUIRE_THROW( RepeatDate("YMD",200909161,20090920,1),std::runtime_error); // start > 8
+   BOOST_REQUIRE_THROW( RepeatDate("YMD",20090916,200909201,1),std::runtime_error); // end > 8
+   BOOST_REQUIRE_THROW( RepeatDate("YMD",20090016,200909201,1),std::runtime_error); // invalid start month
+   BOOST_REQUIRE_THROW( RepeatDate("YMD",20090900,20090920,1),std::runtime_error);  // invalid start day
+   BOOST_REQUIRE_THROW( RepeatDate("YMD",20090916,20090020,1),std::runtime_error);  // invalid end month
+   BOOST_REQUIRE_THROW( RepeatDate("YMD",20090916,20090900,1),std::runtime_error);  // invalid end day
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANattr/test/TestTimeAttr.cpp b/ecflow_4_0_7/ANattr/test/TestTimeAttr.cpp
new file mode 100644
index 0000000..5fa2e30
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestTimeAttr.cpp
@@ -0,0 +1,345 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+#include "TimeAttr.hpp"
+#include "TimeSeries.hpp"
+#include "Calendar.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_time_attr)
+{
+   cout << "ANattr:: ...test_time_attr\n";
+
+   // See TimeAttr.hpp for rules concerning isFree() and checkForReque()
+   // test time attr isFree(), and checkForRequeue
+   Calendar calendar;
+   calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+   // Create a test when we can match a time series. Need to sync hour with suite time
+   // at hour 1, suite time should also be 01:00, for test to work
+   //
+   // Create the time series: start  10:00
+   //                         finish 20:00
+   //                         incr    1:00
+   TimeSeries timeSeriesX(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries2X(TimeSlot(11,0), TimeSlot(15,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries3X(TimeSlot(15,0),  false/* relative */);
+   TimeSeries timeSeries4X(TimeSlot(0,0),  false/* relative */);
+
+   TimeSlot t1_min, t1_max,t2_min,t2_max,t3_min,t3_max,t4_min,t4_max;
+   timeSeriesX.min_max_time_slots(t1_min, t1_max);
+   timeSeries2X.min_max_time_slots(t2_min, t2_max);
+   timeSeries3X.min_max_time_slots(t3_min, t3_max);
+   timeSeries4X.min_max_time_slots(t4_min, t4_max);
+   BOOST_CHECK_MESSAGE(t1_min == TimeSlot(10,0) && t1_max == TimeSlot(20,0),"Not as expected");
+   BOOST_CHECK_MESSAGE(t2_min == TimeSlot(11,0) && t2_max == TimeSlot(15,0),"Not as expected");
+   BOOST_CHECK_MESSAGE(t3_min == TimeSlot(15,0) && t3_max == TimeSlot(15,0),"Not as expected");
+   BOOST_CHECK_MESSAGE(t4_min == TimeSlot(0,0)  && t4_max == TimeSlot(0,0),"Not as expected");
+
+   TimeAttr timeSeries(timeSeriesX);
+   TimeAttr timeSeries2(timeSeries2X);
+   TimeAttr timeSeries3(timeSeries3X);
+   TimeAttr timeSeries4(timeSeries4X);
+
+   std::vector<boost::posix_time::time_duration> timeSeries_free_slots;
+   std::vector<boost::posix_time::time_duration> timeSeries2_free_slots;
+   timeSeries.time_series().free_slots(timeSeries_free_slots);
+   timeSeries2.time_series().free_slots(timeSeries2_free_slots);
+   BOOST_CHECK_MESSAGE(timeSeries_free_slots.size() == 11,"Expected 11 free slots for " << timeSeries.toString() << " but found "  << timeSeries_free_slots.size());
+   BOOST_CHECK_MESSAGE(timeSeries2_free_slots.size() == 5,"Expected 5 free slots for " << timeSeries2.toString() << " but found "  << timeSeries_free_slots.size());
+//   cout << "time " << timeSeries.toString() << " free slots:";
+//   for(size_t i = 0; i < timeSeries_free_slots.size(); i++)  cout << timeSeries_free_slots[i] << " ";
+//   cout << "\n";
+
+   // follow normal process
+   timeSeries.reset( calendar );
+   timeSeries2.reset( calendar );
+   timeSeries3.reset( calendar );
+   timeSeries4.reset( calendar );
+
+   bool day_changed = false; // after midnight make sure we keep day_changed
+   for(int m=1; m < 96; m++) {
+      calendar.update( time_duration( minutes(30) ) );
+      if (!day_changed) day_changed = calendar.dayChanged();
+
+      boost::posix_time::time_duration time = calendar.suiteTime().time_of_day();
+      //cout << time << " day_changed(" << day_changed << ")\n";
+
+      timeSeries.calendarChanged( calendar );
+      timeSeries2.calendarChanged( calendar );
+      timeSeries3.calendarChanged( calendar );
+      timeSeries4.calendarChanged( calendar );
+
+      //cout << to_simple_string(calendar.suiteTime()) << "\n";
+
+      if (calendar.dayChanged()) {
+         BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max)," expected " << timeSeries.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime()));
+      }
+      else if (time < timeSeries.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should NOT be free at time " << time );
+         BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " checkForRequeue should pass at " << time );
+      }
+      else if (time >= timeSeries.time_series().start().duration() && time <=timeSeries.time_series().finish().duration()) {
+
+         bool matches_free_slot = false;
+         for(size_t i = 0; i < timeSeries_free_slots.size(); i++) {
+            if (time == timeSeries_free_slots[i]) { matches_free_slot = true; break; }
+         }
+         if (matches_free_slot) BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+         else                   BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should be fail at time " << time );
+
+         /// At the last hour checkForRequeue should return false; This ensures that value will
+         /// not get incremented and so, should leave node in the complete state.
+         if ( time < timeSeries.time_series().finish().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " checkForRequeue should be free at time " << time );
+         }
+         else {
+            BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << "checkForRequeue should Not free at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should be holding at time " << time );
+         BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " should fail at " << time );
+      }
+
+
+      if (calendar.dayChanged()) {
+         BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max)," expected " << timeSeries2.toString() << " checkForRequeue to pass at " << to_simple_string(calendar.suiteTime()));
+      }
+      else if (time < timeSeries2.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should NOT be free at time " << time );
+         BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << " checkForRequeue should pass at " << time );
+      }
+      else if (time >= timeSeries2.time_series().start().duration() && time <=timeSeries2.time_series().finish().duration()) {
+
+         bool matches_free_slot = false;
+         for(size_t i = 0; i < timeSeries2_free_slots.size(); i++) {
+            if (time == timeSeries2_free_slots[i]) { matches_free_slot = true; break;}
+         }
+         if (matches_free_slot) BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " should be free at time " << time );
+         else                   BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should be fail at time " << time );
+
+
+         /// At the last time checkForRequeue should return false; This ensures that value will
+         /// not get incremented and so, should leave node in the complete state.
+         if ( time < timeSeries2.time_series().finish().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << " checkForRequeue should be free at time " << time );
+         }
+         else {
+            BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << "checkForRequeue should Not free at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should be holding at time " << time );
+         BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << " should fail at " << time );
+      }
+
+
+      // Single slot, Once a single slot is Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+      if (!day_changed) {
+         if (time < timeSeries3.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(!timeSeries3.isFree(calendar),timeSeries3.toString() << " should be fail at time " << time );
+         }
+         else if (time == timeSeries3.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time " << time );
+         }
+         else if (time > timeSeries3.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " isFree should pass at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time after day change" << time );
+      }
+      BOOST_CHECK_MESSAGE(!timeSeries3.checkForRequeue(calendar,t3_min,t3_max),timeSeries3.toString() << " checkForRequeue should fail at " << time );
+
+
+      // single slot at midnight, Once a single slot if Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+      if (!day_changed) {
+         if (time == timeSeries4.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " should be free at time " << time );
+         }
+         else {
+            BOOST_CHECK_MESSAGE(!timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should fail at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should pass at time " << time );
+      }
+      BOOST_CHECK_MESSAGE(!timeSeries4.checkForRequeue(calendar,t4_min,t4_max),timeSeries4.toString() << " checkForRequeue should fail at " << time );
+
+
+       // Typically when a time is free, it stays free, until it is re-queued
+       // However in order to test isFree for time with time intervals, we need to re-queue
+       timeSeries.requeue( calendar );
+       timeSeries2.requeue( calendar );
+
+       // Do not requeue time 00, and time 15, so that we can check for free
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_time_once_free_stays_free)
+{
+   cout << "ANattr:: ...test_time_once_free_stays_free\n";
+
+   Calendar calendar;
+   calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+   TimeSeries timeSeriesX(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries2X(TimeSlot(11,0), TimeSlot(15,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries3X(TimeSlot(15,0),  false/* relative */);
+   TimeSeries timeSeries4X(TimeSlot(0,0),  false/* relative */);
+
+   TimeAttr timeSeries(timeSeriesX );
+   TimeAttr timeSeries2(timeSeries2X );
+   TimeAttr timeSeries3(timeSeries3X );
+   TimeAttr timeSeries4(timeSeries4X );
+
+   bool day_changed = false; // after midnight make sure we keep day_changed
+   for(int m=1; m < 96; m++) {
+      calendar.update( time_duration( minutes(30) ) );
+      if (!day_changed) {
+         day_changed = calendar.dayChanged();
+      }
+      boost::posix_time::time_duration time = calendar.suiteTime().time_of_day();
+      // cout << time << " day_changed(" << day_changed << ")\n";
+
+      timeSeries.calendarChanged( calendar );
+      timeSeries2.calendarChanged( calendar );
+      timeSeries3.calendarChanged( calendar );
+      timeSeries4.calendarChanged( calendar );
+
+      // **********************************************************************************
+      // When a time (regardless of whether its single slot or time series) is free, it stays free,
+      // until explicitly re-queued,
+      // ***********************************************************************************
+
+      if (time < timeSeries.time_series().start().duration()) {
+         if (!day_changed) BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should NOT be free at time " << time );
+         else BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+      }
+      else if (time >= timeSeries.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+      }
+
+
+      if (time < timeSeries2.time_series().start().duration()) {
+         if (!day_changed) BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should NOT be free at time " << time );
+         else BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+      }
+      else if (time >= timeSeries2.time_series().start().duration()) {
+         BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " should be free at time " << time );
+      }
+
+      if (!day_changed) {
+         if (time == timeSeries3.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time " << time );
+         }
+         else if (time > timeSeries3.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " isFree, once free should stay free at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time after day change " << time );
+      }
+
+
+      // single slot at midnight, Once a single slot if Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+      if (!day_changed) {
+         if (time == timeSeries4.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " should be free at time " << time );
+         }
+         else {
+            BOOST_CHECK_MESSAGE(!timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should fail at time " << time );
+         }
+      }
+      else {
+         BOOST_CHECK_MESSAGE(timeSeries4.isFree(calendar),timeSeries4.toString() << " day_changed(" << day_changed << ")  isFree should pass at time " << time );
+      }
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_time_attr_multiples )
+{
+   cout << "ANattr:: ...test_time_attr_multiples\n";
+
+   // See TimeAttr.hpp for rules concerning isFree() and checkForReque()
+   // test time attr isFree(), and checkForRequeue
+   Calendar calendar;
+   calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+   TimeSeries timeSeries1530(TimeSlot(15,30),  false/* relative */);
+   TimeSeries timeSeries1630(TimeSlot(16,30),  false/* relative */);
+   TimeSeries timeSeries2030(TimeSlot(20,30),  false/* relative */);
+
+   TimeSlot t1_min, t1_max;
+   timeSeries1530.min_max_time_slots(t1_min, t1_max);
+   timeSeries1630.min_max_time_slots(t1_min, t1_max);
+   timeSeries2030.min_max_time_slots(t1_min, t1_max);
+   BOOST_CHECK_MESSAGE(t1_min == TimeSlot(15,30) && t1_max == TimeSlot(20,30),"Not as expected");
+
+   TimeAttr timeSeries(timeSeries1530);
+   TimeAttr timeSeries2(timeSeries1630);
+   TimeAttr timeSeries3(timeSeries2030);
+
+   bool day_changed = false; // after midnight make sure we keep day_changed
+    for(int m=1; m < 96; m++) {
+       calendar.update( time_duration( minutes(30) ) );
+       if (!day_changed) {
+          day_changed = calendar.dayChanged();
+       }
+       boost::posix_time::time_duration time = calendar.suiteTime().time_of_day();
+ //      cout << time << " day_changed(" << day_changed << ")\n";
+
+      timeSeries.calendarChanged( calendar );
+      timeSeries2.calendarChanged( calendar );
+      timeSeries3.calendarChanged( calendar );
+
+      if (!day_changed) {
+         if ( time < t1_max.duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " checkForRequeue should pass at " << time );
+            BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t1_min,t1_max),timeSeries2.toString() << " checkForRequeue should pass at " << time );
+            BOOST_CHECK_MESSAGE(timeSeries3.checkForRequeue(calendar,t1_min,t1_max),timeSeries3.toString() << " checkForRequeue should pass at " << time );
+         }
+         else {
+            BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " checkForRequeue should fail at " << time );
+            BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(calendar,t1_min,t1_max),timeSeries2.toString() << " checkForRequeue should fail at " << time );
+            BOOST_CHECK_MESSAGE(!timeSeries3.checkForRequeue(calendar,t1_min,t1_max),timeSeries3.toString() << " checkForRequeue should fail at " << time );
+         }
+      }
+      else {
+         // Once a single slot if Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+         BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " day_changed(" << day_changed << ")  isFree should pass at time " << time );
+         BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " day_changed(" << day_changed << ")  isFree should pass at time " << time );
+         BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries2.toString() << " day_changed(" << day_changed << ")  isFree should pass at time " << time );
+      }
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANattr/test/TestTodayAttr.cpp b/ecflow_4_0_7/ANattr/test/TestTodayAttr.cpp
new file mode 100644
index 0000000..39c4e19
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestTodayAttr.cpp
@@ -0,0 +1,181 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>
+
+#include "TodayAttr.hpp"
+#include "TimeSeries.hpp"
+#include "Calendar.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_today_attr)
+{
+   cout << "ANattr:: ...test_today_attr\n";
+
+   // See TodayAttr.hpp for rules concerning isFree() and checkForReque()
+   // test today attr isFree(), and checkForRequeue
+   Calendar calendar;
+   calendar.init(ptime(date(2010,2,10), minutes(0)), Calendar::REAL);
+
+   // Create a test when we can match a time series. Need to sync hour with suite time
+   // at hour 1, suite time should also be 01:00, for test to work
+   //
+   // Create the time series: start  10:00
+   //                         finish 20:00
+   //                         incr    1:00
+   TimeSeries timeSeriesX(TimeSlot(10,0), TimeSlot(20,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries2X(TimeSlot(11,0), TimeSlot(15,0), TimeSlot(1,0), false/* relative */);
+   TimeSeries timeSeries3X(TimeSlot(15,0),  false/* relative */);
+
+   TimeSlot t1_min, t1_max,t2_min,t2_max,t3_min,t3_max;
+   timeSeriesX.min_max_time_slots(t1_min, t1_max);
+   timeSeries2X.min_max_time_slots(t2_min, t2_max);
+   timeSeries3X.min_max_time_slots(t3_min, t3_max);
+   BOOST_CHECK_MESSAGE(t1_min == TimeSlot(10,0) && t1_max == TimeSlot(20,0),"Not as expected");
+   BOOST_CHECK_MESSAGE(t2_min == TimeSlot(11,0) && t2_max == TimeSlot(15,0),"Not as expected");
+   BOOST_CHECK_MESSAGE(t3_min == TimeSlot(15,0) && t3_max == TimeSlot(15,0),"Not as expected");
+
+
+   TodayAttr timeSeries(timeSeriesX);
+   TodayAttr timeSeries2(timeSeries2X);
+   TodayAttr timeSeries3(timeSeries3X);
+
+   std::vector<boost::posix_time::time_duration> timeSeries_free_slots;
+   std::vector<boost::posix_time::time_duration> timeSeries2_free_slots;
+   timeSeries.time_series().free_slots(timeSeries_free_slots);
+   timeSeries2.time_series().free_slots(timeSeries2_free_slots);
+   BOOST_CHECK_MESSAGE(timeSeries_free_slots.size() == 11,"Expected 11 free slots for " << timeSeries.toString() << " but found "  << timeSeries_free_slots.size());
+   BOOST_CHECK_MESSAGE(timeSeries2_free_slots.size() == 5,"Expected 5 free slots for " << timeSeries2.toString() << " but found "  << timeSeries_free_slots.size());
+
+   // follow normal process
+   timeSeries.reset( calendar );
+   timeSeries2.reset( calendar );
+   timeSeries3.reset( calendar );
+
+   bool day_changed = false; // after midnight make sure we keep day_changed
+   for(int m=1; m < 96; m++) {
+      calendar.update( time_duration( minutes(30) ) );
+      if (!day_changed) {
+         day_changed = calendar.dayChanged();
+      }
+      boost::posix_time::time_duration time = calendar.suiteTime().time_of_day();
+//      cout << time << " day_changed(" << day_changed << ")\n";
+
+      timeSeries.calendarChanged( calendar );
+      timeSeries2.calendarChanged( calendar );
+      timeSeries3.calendarChanged( calendar );
+
+      if (!day_changed) {
+
+         if (time < timeSeries.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(!timeSeries.isFree(calendar),timeSeries.toString() << " should NOT be free at time " << time );
+            BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " should pass at " << time );
+         }
+         else if (time >= timeSeries.time_series().start().duration() && time <=timeSeries.time_series().finish().duration()) {
+
+            bool matches_free_slot = false;
+            for(size_t i = 0; i < timeSeries_free_slots.size(); i++) {
+               if (time == timeSeries_free_slots[i]) { matches_free_slot = true; break; }
+            }
+            // no else branch since once today is free it stays free, unti re-queue
+            if (matches_free_slot) BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+
+            /// At the last time checkForRequeue should return false; This ensures that value will
+            /// not get incremented and so, should leave node in the complete state.
+            if ( time < timeSeries.time_series().finish().duration()) {
+               BOOST_CHECK_MESSAGE(timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " checkForRequeue should be free at time " << time );
+            }
+            else {
+               BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << "checkForRequeue should Not free at time " << time );
+            }
+         }
+         else {
+            // After end time, a Today Attr should be free to run.
+            BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+            BOOST_CHECK_MESSAGE(!timeSeries.checkForRequeue(calendar,t1_min,t1_max),timeSeries.toString() << " should fail at " << time );
+         }
+      }
+      else {
+         // Once a today time series is free, it stays free
+         BOOST_CHECK_MESSAGE(timeSeries.isFree(calendar),timeSeries.toString() << " should be free at time " << time );
+      }
+
+
+      if (!day_changed) {
+         if (time < timeSeries2.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(!timeSeries2.isFree(calendar),timeSeries2.toString() << " should NOT be free at time " << time );
+            BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << " should pass at " << time );
+         }
+         else if (time >= timeSeries2.time_series().start().duration() && time <=timeSeries2.time_series().finish().duration()) {
+
+            bool matches_free_slot = false;
+            for(size_t i = 0; i < timeSeries2_free_slots.size(); i++) {
+               if (time == timeSeries2_free_slots[i]) { matches_free_slot = true; break; }
+            }
+            if (matches_free_slot) BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " should be free at time " << time );
+
+            /// At the last time checkForRequeue should return false; This ensures that value will
+            /// not get incremented and so, should leave node in the complete state.
+            if ( time < timeSeries2.time_series().finish().duration()) {
+               BOOST_CHECK_MESSAGE(timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << " checkForRequeue should be free at time " << time );
+            }
+            else {
+               BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << "checkForRequeue should Not free at time " << time );
+            }
+         }
+         else {
+            // After end time, a Today Attr should be free to run.
+            BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " should be holding at time " << time );
+            BOOST_CHECK_MESSAGE(!timeSeries2.checkForRequeue(calendar,t2_min,t2_max),timeSeries2.toString() << " should fail at " << time );
+         }
+      }
+      else {
+         // Once a today time series is free, it stays free
+         BOOST_CHECK_MESSAGE(timeSeries2.isFree(calendar),timeSeries2.toString() << " should be holding at time " << time );
+      }
+
+      // Single slot
+      if (!day_changed) {
+         if (time == timeSeries3.time_series().start().duration()  ) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " should be free at time " << time );
+         }
+         else if (time < timeSeries3.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(!timeSeries3.isFree(calendar),timeSeries3.toString() << " isFree should fail at time " << time );
+         }
+         else if (time > timeSeries3.time_series().start().duration()) {
+            BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " isFree should fail at time " << time );
+         }
+      }
+      else {
+         // Once a single slot if Free it *stays* free until explicitly requeued, (i.e by parent repeat/cron)
+         BOOST_CHECK_MESSAGE(timeSeries3.isFree(calendar),timeSeries3.toString() << " isFree should fail at time " << time );
+      }
+      BOOST_CHECK_MESSAGE(!timeSeries3.checkForRequeue(calendar,t3_min,t3_max),timeSeries3.toString() << " checkForRequeue should fail at " << time );
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANattr/test/TestVariable.cpp b/ecflow_4_0_7/ANattr/test/TestVariable.cpp
new file mode 100644
index 0000000..204e7aa
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/TestVariable.cpp
@@ -0,0 +1,57 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+
+#include "Variable.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ANattrTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_multi_line_variable_values )
+{
+   cout << "ANattr:: ...test_multi_line_variable_values\n";
+
+   {
+      Variable var("name","value");
+      BOOST_CHECK_MESSAGE(var.name() == "name","name not as expected");
+      BOOST_CHECK_MESSAGE(var.theValue() == "value","value not as expected");
+
+      std::string expected = "edit name 'value'";
+      BOOST_CHECK_MESSAGE(var.toString() == expected,"expected " << expected << " but found " << var.toString());
+   }
+   {
+      Variable var("name","");
+      std::string expected = "edit name ''";
+      BOOST_CHECK_MESSAGE(var.toString() == expected,"expected " << expected << " but found " << var.toString());
+   }
+   {
+      Variable var("name","value\n");
+      std::string expected = "edit name 'value\\n'";
+      BOOST_CHECK_MESSAGE(var.toString() == expected,"expected " << expected << " but found " << var.toString());
+   }
+   {
+      Variable var("name","val1\nxxx\nval2");
+      std::string expected = "edit name 'val1\\nxxx\\nval2'";
+      BOOST_CHECK_MESSAGE(var.toString() == expected,"expected " << expected << " but found " << var.toString());
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/AutoCancelAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/AutoCancelAttr
new file mode 100644
index 0000000..159345c
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/AutoCancelAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 0 0 1 1 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/ClockAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/ClockAttr
new file mode 100644
index 0000000..5f6d2e6
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/ClockAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 1 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/CronAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/CronAttr
new file mode 100644
index 0000000..70d4f43
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/CronAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/DateAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/DateAttr
new file mode 100644
index 0000000..f348efa
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/DateAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/DayAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/DayAttr
new file mode 100644
index 0000000..32cd68a
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/DayAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Event b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Event
new file mode 100644
index 0000000..e3d77ae
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Event
@@ -0,0 +1 @@
+22 serialization::archive 9 0 2147483647 0 
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Label b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Label
new file mode 100644
index 0000000..cbe25fe
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Label
@@ -0,0 +1 @@
+22 serialization::archive 9 0  0  0 
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/LateAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/LateAttr
new file mode 100644
index 0000000..73d36ac
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/LateAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 0 0 1 0 0 1 0 0 1 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Meter b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Meter
new file mode 100644
index 0000000..3530ae0
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Meter
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 0 0 0 
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatDate b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatDate
new file mode 100644
index 0000000..72eecb7
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatDate
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 0  0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatEnumerated b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatEnumerated
new file mode 100644
index 0000000..ccb3eaf
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatEnumerated
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 0  0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatInteger b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatInteger
new file mode 100644
index 0000000..72eecb7
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatInteger
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 0  0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatString b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatString
new file mode 100644
index 0000000..ccb3eaf
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/RepeatString
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 0  0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/TimeAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/TimeAttr
new file mode 100644
index 0000000..149bb73
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/TimeAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/TodayAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/TodayAttr
new file mode 100644
index 0000000..149bb73
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/TodayAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Variable b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Variable
new file mode 100644
index 0000000..4437947
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/Variable
@@ -0,0 +1 @@
+22 serialization::archive 9 0  0 
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/VerifyAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/VerifyAttr
new file mode 100644
index 0000000..2b4d9d5
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/VerifyAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/ZombieAttr b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/ZombieAttr
new file mode 100644
index 0000000..3f57891
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/default_constructor_v1_9/ZombieAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 3 4 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/AutoCancelAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/AutoCancelAttr
new file mode 100644
index 0000000..0dd98c9
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/AutoCancelAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 2400 0 0 1 1
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/AutoCancelAttr_1 b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/AutoCancelAttr_1
new file mode 100644
index 0000000..de65b95
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/AutoCancelAttr_1
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 10 12 0 1 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/ClockAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/ClockAttr
new file mode 100644
index 0000000..b278964
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/ClockAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 0 1 1 3600 1 1 2009
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/CronAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/CronAttr
new file mode 100644
index 0000000..2014d93
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/CronAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 1 0 0 0 20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 1 2 2 0 1 2 2 0 1 2 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/DateAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/DateAttr
new file mode 100644
index 0000000..4e95053
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/DateAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 12 12 2012 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/DayAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/DayAttr
new file mode 100644
index 0000000..fdfa265
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/DayAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 1 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Event_1 b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Event_1
new file mode 100644
index 0000000..ebf94db
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Event_1
@@ -0,0 +1 @@
+22 serialization::archive 9 0 1 0 
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Event_2 b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Event_2
new file mode 100644
index 0000000..8ca0e9e
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Event_2
@@ -0,0 +1 @@
+22 serialization::archive 9 0 2147483647 5 event
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Label b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Label
new file mode 100644
index 0000000..3b62664
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Label
@@ -0,0 +1 @@
+22 serialization::archive 9 4 name 5 value 9 new_value
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/LateAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/LateAttr
new file mode 100644
index 0000000..5187f0e
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/LateAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 10 12 0 10 12 0 10 12 0 1 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Meter b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Meter
new file mode 100644
index 0000000..910c844
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Meter
@@ -0,0 +1 @@
+22 serialization::archive 9 10 100 10 100 5 meter
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatDate b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatDate
new file mode 100644
index 0000000..256d8b8
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatDate
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 4 date 20110112 20110115 1 20110112
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatEnumerated b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatEnumerated
new file mode 100644
index 0000000..407f353
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatEnumerated
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 4 enum 0 0 2 0 1 a 1 b 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatInteger b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatInteger
new file mode 100644
index 0000000..121d4b6
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatInteger
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 7 integer 0 100 2 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatString b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatString
new file mode 100644
index 0000000..295abe6
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/RepeatString
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 6 string 0 0 2 0 1 a 1 b 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/TimeAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/TimeAttr
new file mode 100644
index 0000000..8715b1c
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/TimeAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 1 10 12 0 0 0 1 0 0 1 10 12 0 0 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/TodayAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/TodayAttr
new file mode 100644
index 0000000..8715b1c
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/TodayAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 1 10 12 0 0 0 1 0 0 1 10 12 0 0 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Variable b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Variable
new file mode 100644
index 0000000..21e055c
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/Variable
@@ -0,0 +1 @@
+22 serialization::archive 9 8 var_name 9 var_value
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/VerifyAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/VerifyAttr
new file mode 100644
index 0000000..dcf1ef0
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/VerifyAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 1 3 0
diff --git a/ecflow_4_0_7/ANattr/test/data/migration/v1_9/ZombieAttr b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/ZombieAttr
new file mode 100644
index 0000000..ad2b73b
--- /dev/null
+++ b/ecflow_4_0_7/ANattr/test/data/migration/v1_9/ZombieAttr
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 10 0 0 7 0 0 1 2 3 4 5 6
diff --git a/ecflow_4_0_7/ANode/CMakeLists.txt b/ecflow_4_0_7/ANode/CMakeLists.txt
new file mode 100644
index 0000000..618ff5e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/CMakeLists.txt
@@ -0,0 +1,72 @@
+# Note:
+# If new src or test cpp files are added make sure you touch this file
+#
+
+file( GLOB srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp" )
+
+ecbuild_add_library( TARGET   node
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     LIBS     nodeattr core
+                     INCLUDES src
+                              ../ACore/src 
+                              ../ANattr/src
+                    )
+
+# Use following to populate list: 
+#  cd $WK/ANode                      
+#  find test -name \*.cpp | sort      
+
+# no way to exclude file ?
+#file( GLOB test_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "test/*.cpp" )
+ 
+list( APPEND test_srcs
+ test/Test_ECFLOW-195.cpp
+ test/TestAdd.cpp
+ test/TestAlias.cpp
+ test/TestDefs.cpp
+ test/TestDefStatus.cpp
+ test/TestEcfFile.cpp
+ test/TestEnviromentSubstitution.cpp
+ test/TestExprParser.cpp
+ test/TestExprRepeatDateArithmetic.cpp
+ test/TestFindAbsNodePath.cpp
+ test/TestFlag.cpp
+ test/TestHistoryParser.cpp
+ test/TestInLimit.cpp
+ test/TestJobCreator.cpp
+ test/TestJobProfiler.cpp
+ test/TestLimit.cpp
+ test/TestMigration.cpp
+ test/TestMissNextTimeSlot.cpp
+ test/TestOrder.cpp
+ test/TestPersistence.cpp
+ test/TestPreProcessing.cpp
+ test/TestReplace.cpp
+ test/TestSetState.cpp
+ test/TestSmsLocator.cpp
+ test/TestTaskScriptGenerator.cpp
+ test/TestVariableGeneration.cpp
+ test/TestVariableInheritance.cpp
+ test/TestVariableSubstitution.cpp
+ test/TestVariableSubstitutionDefs.cpp
+ test/TestZombies.cpp
+)
+
+ecbuild_add_test(TARGET  u_anode
+                 BOOST
+                 SOURCES      ${test_srcs}
+                 LIBS         node  
+                 TEST_DEPENDS u_anattr
+                 )
+
+
+list( APPEND stest_srcs   test/TestSingleExprParse.cpp )                    
+ecbuild_add_test( TARGET       u_anode_stest
+                  BOOST
+                  SOURCES      ${stest_srcs}
+                  LIBS         node 
+                  TEST_DEPENDS u_anattr
+                 )
+
diff --git a/ecflow_4_0_7/ANode/jamfile.jam b/ecflow_4_0_7/ANode/jamfile.jam
new file mode 100644
index 0000000..64cdb76
--- /dev/null
+++ b/ecflow_4_0_7/ANode/jamfile.jam
@@ -0,0 +1,64 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Node project
+#
+project theNode ;
+
+use-project theCore     : ../ACore ;
+use-project theNodeAttr : ../ANattr ;
+
+
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+#
+lib node : [ glob src/*.cpp ]
+         : <link>static
+           <variant>debug:<define>DEBUG
+           <use>/theCore//core
+           <use>/theNodeAttr//nodeattr
+           <use>/site-config//boost_system
+           <use>/site-config//boost_serialization
+           <use>/site-config//boost_filesystem
+           <use>/site-config//boost_datetime
+           <use>/site-config//boost_test
+         :
+         : <include>../ANode/src         
+         ;
+
+
+#
+# This is *ONLY* required when the define ECFLOW_MT is used, (used by Signal.cpp)
+lib pthread ;
+
+exe u_anode : [ glob test/*.cpp : test/TestSingleExprParse.cpp ]
+           pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           node
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <variant>debug:<define>DEBUG
+	      ;
+	     
+	     
+exe u_anode_stest : test/TestSingleExprParse.cpp
+           pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           node
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <variant>debug:<define>DEBUG
+ 	     ;
diff --git a/ecflow_4_0_7/ANode/src/AbstractObserver.hpp b/ecflow_4_0_7/ANode/src/AbstractObserver.hpp
new file mode 100644
index 0000000..c4edb4a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/AbstractObserver.hpp
@@ -0,0 +1,35 @@
+#ifndef ABSTRACT_OBSERVER_HPP_
+#define ABSTRACT_OBSERVER_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <vector>
+#include "Aspect.hpp"
+class Node;
+class Defs;
+
+class AbstractObserver {
+public:
+	virtual ~AbstractObserver() {}
+
+	virtual void update(const Node*, const std::vector<ecf::Aspect::Type>&) = 0;
+	virtual void update(const Defs*, const std::vector<ecf::Aspect::Type>&) = 0;
+
+	/// After this call, the node will be deleted, hence observers must *NOT* use the pointers
+   virtual void update_delete(const Node*) {}
+   virtual void update_delete(const Defs*) {}
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Alias.cpp b/ecflow_4_0_7/ANode/src/Alias.cpp
new file mode 100644
index 0000000..6d060b1
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Alias.cpp
@@ -0,0 +1,168 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #19 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/filesystem/exception.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/make_shared.hpp>
+
+#include "Alias.hpp"
+#include "Defs.hpp"
+#include "Ecf.hpp"
+#include "Log.hpp"
+#include "Stl.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+#include "Indentor.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "PrintStyle.hpp"
+
+namespace fs = boost::filesystem;
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+//==================================================================================
+Alias::Alias( const std::string& name )
+: Submittable(name)
+{
+   set_state_only(NState::QUEUED);
+}
+
+Alias::Alias()
+{
+   set_state_only(NState::QUEUED);
+}
+
+Alias::~Alias()
+{
+   // Don't create the ChangeMgrSingleton during destruct sequence. (i.e in unit cases)
+   // Since that will cause a memory leak
+   if (!Ecf::server() && ChangeMgrSingleton::exists()) {
+      ChangeMgrSingleton::instance()->notify_delete( this );
+   }
+}
+
+alias_ptr Alias::create(const std::string& name)
+{
+   return boost::make_shared<Alias>( name );
+}
+
+bool Alias::operator==(const Alias& rhs) const
+{
+   return Submittable::operator==(rhs);
+}
+
+std::ostream& Alias::print(std::ostream& os) const
+{
+   Indentor in;
+   Indentor::indent(os) << "alias " << name();
+   if (!PrintStyle::defsStyle()) {
+      std::string st = write_state();
+      if (!st.empty()) os << " #" << st;
+   }
+   os << "\n";
+
+   Node::print(os);
+
+   // Generated variable are not persisted since they are created on demand
+   // There *NO* point in printing them they will always be empty
+   return os;
+}
+std::ostream& operator<<(std::ostream& os, const Alias& d)  { return d.print(os); }
+
+void Alias::begin()
+{
+   Submittable::begin();
+}
+
+void Alias::requeue(bool resetRepeats, int clear_suspended_in_child_nodes,bool reset_next_time_slot)
+{
+   Submittable::requeue(resetRepeats,clear_suspended_in_child_nodes,reset_next_time_slot);
+}
+
+const std::string& Alias::debugType() const { return ecf::Str::ALIAS();}
+
+node_ptr Alias::removeChild(Node*)
+{
+   LOG_ASSERT(false,"");
+   return node_ptr();
+}
+
+bool Alias::addChild( node_ptr , size_t )
+{
+   LOG_ASSERT(false,"");
+   return false;
+}
+
+size_t Alias::child_position(const Node*) const
+{
+   return std::numeric_limits<std::size_t>::max();
+}
+
+bool Alias::isAddChildOk( Node* alias, std::string& errorMsg) const
+{
+   errorMsg += "Can not add children to a Alias";
+   return false;
+}
+
+void Alias::handleStateChange()
+{
+   /// Increment/decrement limits based on the current state
+   update_limits();
+
+   // Aliases are stand alone, they do no requeue or bubble up/down state changes
+   // i.e no requeue since they have no time dependencies, or repeat
+}
+
+const std::string& Alias::script_extension() const
+{
+   return File::USR_EXTN();
+}
+
+void Alias::collateChanges(DefsDelta& changes) const
+{
+   /// All changes to Alias should be on ONE compound_memento_ptr
+   compound_memento_ptr comp;
+   Submittable::incremental_changes(changes, comp);
+}
+
+void Alias::get_all_nodes(std::vector<node_ptr>& nodes) const
+{
+   nodes.push_back(non_const_this());
+}
+
+// Functions unique to aliases
+void Alias::add_alias_variable(const std::string& name, const std::string& value)
+{
+   if (name.empty()) {
+      throw std::runtime_error("Alias::add_alias_variable: Variable with empty name");
+   }
+
+   // The bool argument to variable, allows addition of Variable without name checking
+   addVariable( Variable(name,value,false));
+}
+
+node_ptr Alias::find_node_up_the_tree(const std::string& name) const
+{
+   Node* the_parent = parent();
+   if (the_parent) return the_parent->find_node_up_the_tree(name);
+   return node_ptr();
+}
+
diff --git a/ecflow_4_0_7/ANode/src/Alias.hpp b/ecflow_4_0_7/ANode/src/Alias.hpp
new file mode 100644
index 0000000..0b83d4a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Alias.hpp
@@ -0,0 +1,94 @@
+#ifndef ALIAS_HPP_
+#define ALIAS_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "Submittable.hpp"
+
+class Alias : public Submittable {
+public:
+   Alias(const std::string& name);
+   Alias();
+   virtual ~Alias();
+
+   static alias_ptr create(const std::string& name);
+
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const Alias& rhs) const;
+
+   /// Overridden to reset the try number
+   /// The tasks job can be invoked multiple times. For each invocation we want to preserve
+   /// the output. The try number is used in SMSJOB/SMSJOBOUT to preserve the output when
+   /// there are multiple runs.  re-queue/begin() resets the try Number
+   virtual void begin();
+   virtual void requeue(bool resetRepeats, int clear_suspended_in_child_nodes, bool reset_next_time_slot);
+
+   virtual Suite* suite() const { return parent()->suite(); }
+   virtual Defs* defs() const { return (parent()) ? parent()->defs() : NULL;} // exposed to python hence check for NULL first
+   virtual Alias* isAlias() const   { return const_cast<Alias*>(this);}
+   virtual Submittable* isSubmittable() const { return const_cast<Alias*>(this); }
+
+   virtual const std::string& debugType() const;
+
+   virtual node_ptr removeChild( Node* child);
+   virtual bool addChild( node_ptr child, size_t position = std::numeric_limits<std::size_t>::max());
+   virtual bool isAddChildOk( Node* child, std::string& errorMsg) const;
+
+   virtual const std::string& script_extension() const;
+
+   virtual void collateChanges(DefsDelta&) const;
+   void set_memento(const SubmittableMemento* m) { Submittable::set_memento(m); }
+
+   virtual node_ptr find_node_up_the_tree(const std::string& name) const;
+
+   // Pure node Functions that are not implemented for aliases
+   virtual node_ptr find_relative_node(const std::vector<std::string>&) {return node_ptr();}
+
+   virtual void get_all_nodes(std::vector<node_ptr>& nodes) const;
+
+// Functions unique to aliases
+   // Alias variable names by pass checking of valid names, allowing anything
+   void add_alias_variable(const std::string& name, const std::string& value);
+
+private:
+   virtual size_t child_position(const Node*) const;
+
+   /// Job creation checking is typically called from python API
+   /// This has been disabled for Aliases
+   virtual void check_job_creation( job_creation_ctrl_ptr) {}
+
+   // Overridden from Node to increment/decrement limits only
+   // i.e we do not update parent computed states for aliases
+   virtual void handleStateChange();
+
+   // Pure node Functions that are not implemented for aliases
+   virtual void accept(ecf::NodeTreeVisitor&){}
+   virtual void acceptVisitTraversor(ecf::NodeTreeVisitor&){}
+   virtual void get_all_tasks(std::vector<task_ptr>&) const {}
+   virtual void get_all_aliases(std::vector<alias_ptr>&) const {}
+   virtual void getAllNodes(std::vector<Node*>&) const {}
+   virtual void getAllTasks(std::vector<Task*>&) const {}
+   virtual void getAllSubmittables(std::vector<Submittable*>&) const {}
+   virtual void get_all_active_submittables(std::vector<Submittable*>&) const {}
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<Submittable>(*this); // Serialise base class information
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const Alias&);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Aspect.hpp b/ecflow_4_0_7/ANode/src/Aspect.hpp
new file mode 100644
index 0000000..e7569da
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Aspect.hpp
@@ -0,0 +1,42 @@
+#ifndef ASPECT_HPP_
+#define ASPECT_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+// This class is used to provide observers with more info regarding
+// whats changed. used as a part of the observer pattern
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+class Aspect : private boost::noncopyable {
+public:
+   enum Type { NOT_DEFINED, ORDER, ADD_REMOVE_NODE, ADD_REMOVE_ATTR,
+                METER, EVENT, LABEL, LIMIT, STATE, DEFSTATUS, SUSPENDED,
+                SERVER_STATE, SERVER_VARIABLE, EXPR_TRIGGER, EXPR_COMPLETE, REPEAT,
+                NODE_VARIABLE, LATE, TODAY, TIME,DAY, CRON, DATE,
+                FLAG, SUBMITTABLE, SUITE_CLOCK, SUITE_BEGIN, SUITE_CALENDAR,
+                ALIAS_NUMBER
+              };
+
+private:
+   Aspect();
+};
+
+}
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ChangeMgrSingleton.cpp b/ecflow_4_0_7/ANode/src/ChangeMgrSingleton.cpp
new file mode 100644
index 0000000..9a58449
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ChangeMgrSingleton.cpp
@@ -0,0 +1,253 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include "ChangeMgrSingleton.hpp"
+#include "AbstractObserver.hpp"
+#include "Node.hpp"
+#include "Defs.hpp"
+
+using namespace std;
+//#define DEBUG_DEFS 1
+//#define DEBUG_NODE 1
+
+ChangeMgrSingleton* ChangeMgrSingleton::instance_ =  NULL;
+
+ChangeMgrSingleton* ChangeMgrSingleton::instance()
+{
+   if (instance_ == NULL) instance_ =  new ChangeMgrSingleton();
+   return instance_;
+}
+
+ChangeMgrSingleton* ChangeMgrSingleton::exists() { return instance_; }
+
+
+void ChangeMgrSingleton::attach(Node* n,AbstractObserver* a)
+{
+   assert( n != NULL);
+   assert( a != NULL);
+   map_.insert( std::make_pair(n,a) );
+   
+#ifdef DEBUG_NODE
+	cout << "ChangeMgrSingleton::attach(Node*,AbstractObserver*) " << n->absNodePath() << "  obs " << a << " map_.size() " << map_.size() << "\n";
+#endif
+}
+
+void ChangeMgrSingleton::attach(Defs* n,AbstractObserver* a)
+{
+   assert( n != NULL);
+   assert( a != NULL);
+   defs_map_.insert( std::make_pair(n,a) );
+   
+#ifdef DEBUG_DEFS
+   cout << "ChangeMgrSingleton::attach(Defs*,AbstractObserver*) obs " << a << " defs_map_.size() " << defs_map_.size() << "\n";
+#endif
+}
+
+void ChangeMgrSingleton::detach(Node* n,AbstractObserver* a)
+{
+ assert( n != NULL);
+#ifdef DEBUG_NODE
+   cout << "ChangeMgrSingleton::detach(Node*) observer=" << a;
+   if (n) cout << " node " << n->absNodePath() << "\n";
+   else   cout << " **NULL** node\n";
+#endif
+
+  
+   NodeObserverMap_t::iterator i = map_.find(n);
+   if (i != map_.end()) {
+      map_.erase(i);
+      return;
+   }
+   
+#ifdef DEBUG_NODE
+	if (!map_.empty()) {
+		if (n) std::cout << "ChangeMgrSingleton::detach could not detach node " << n->debugNodePath() << "\n";
+		else   std::cout << "ChangeMgrSingleton::detach given a NULL Node\n";
+	}
+#endif
+}
+
+void ChangeMgrSingleton::detach(Defs* n,AbstractObserver* a)
+{
+#ifdef DEBUG_DEFS
+   cout << "ChangeMgrSingleton::detach(Defs*,AbstractObserver*)  obs " << a << "\n";
+#endif
+
+   assert( n != NULL);
+   DefsObserverMap_t::iterator i = defs_map_.find(n);
+   if (i != defs_map_.end()) {
+      defs_map_.erase(i);
+
+#ifdef DEBUG_DEFS
+      cout << "ChangeMgrSingleton::detach(Defs*,AbstractObserver*) defs_map_.size()= " << defs_map_.size() << "\n";
+#endif
+      return;
+   }
+}
+
+//static void dump_aspect_vec(std::vector<ecf::Aspect::Type>& aspects_vec, const std::string& desc)
+//{
+//   cout << desc;
+//   for(size_t i = 0; i <  aspects_vec.size(); i++) {
+//      switch (aspects_vec[i]) {
+//         case ecf::Aspect::NOT_DEFINED: cout << "NOT_DEFINED "; break;
+//         case ecf::Aspect::ORDER: cout << "ORDER "; break;
+//         case ecf::Aspect::ADD_REMOVE_NODE: cout << "ADD_REMOVE_NODE "; break;
+//         case ecf::Aspect::ADD_REMOVE_ATTR:cout << "ADD_REMOVE_ATTR "; break;
+//         case ecf::Aspect::METER:cout << "METER "; break;
+//         case ecf::Aspect::EVENT:cout << "EVENT "; break;
+//         case ecf::Aspect::LABEL:cout << "LABEL "; break;
+//         case ecf::Aspect::LIMIT:cout << "LIMIT "; break;
+//         case ecf::Aspect::STATE:cout << "STATE "; break;
+//         case ecf::Aspect::DEFSTATUS:cout << "DEFSTATUS "; break;
+//         case ecf::Aspect::SUSPENDED:cout << "SUSPENDED "; break;
+//         case ecf::Aspect::SERVER_STATE:cout << "SERVER_STATE "; break;
+//         case ecf::Aspect::SERVER_VARIABLE:cout << "SERVER_VARIABLE "; break;
+//         case ecf::Aspect::EXPR_TRIGGER:cout << "EXPR_TRIGGER "; break;
+//         case ecf::Aspect::EXPR_COMPLETE:cout << "EXPR_COMPLETE "; break;
+//         case ecf::Aspect::REPEAT:cout << "REPEAT "; break;
+//         case ecf::Aspect::NODE_VARIABLE:cout << "NODE_VARIABLE "; break;
+//         case ecf::Aspect::LATE:cout << "LATE "; break;
+//         case ecf::Aspect::TODAY:cout << "TODAY "; break;
+//         case ecf::Aspect::TIME:cout << "TIME "; break;
+//         case ecf::Aspect::DAY:cout << "DAY "; break;
+//         case ecf::Aspect::CRON:cout << "CRON "; break;
+//         case ecf::Aspect::DATE:cout << "DATE "; break;
+//         case ecf::Aspect::FLAG:cout << "FLAG "; break;
+//         case ecf::Aspect::SUBMITTABLE:cout << "SUBMITTABLE "; break;
+//         case ecf::Aspect::SUITE_CLOCK:cout << "SUITE_CLOCK "; break;
+//         case ecf::Aspect::SUITE_BEGIN:cout << "SUITE_BEGIN "; break;
+//         case ecf::Aspect::SUITE_CALENDAR:cout << "SUITE_CALENDAR "; break;
+//         case ecf::Aspect::ALIAS_NUMBER:cout << "ALIAS_NUMBER "; break;
+//         default: cout << "OOPS-unknown!! "; break;
+//      }
+//   }
+//   cout << "\n";
+//}
+
+void ChangeMgrSingleton::notify(node_ptr n)
+{
+   NodeObserverMap_t::iterator i = map_.find(n.get());
+   if (i != map_.end()) {
+//#ifdef DEBUG
+//      dump_aspect_vec(aspects_vec_,"ChangeMgrSingleton::notify(node_ptr n)******************************\n");
+//#endif
+
+      (*i).second->update(n.get(),aspects_vec_);
+      return;
+   }
+   // ************************************************************************
+   // The GUI only attach's to nodes that are displayed. WE may well get
+   // notification to nodes that are not attached. Hence this is not an error
+   // ************************************************************************
+
+#ifdef DEBUG_NODE
+   if (!map_.empty()) {
+      /// Note: we don't deference the pointer, it may be corrupted ???
+      if (n.get()) std::cout << "ChangeMgrSingleton::notify : received notification for node " << n->debugNodePath() << " thats not being observed\n";
+      else         std::cout << "ChangeMgrSingleton::notify : Error: given a NULL Node\n";
+   }
+#endif
+}
+
+void ChangeMgrSingleton::notify(defs_ptr defs)
+{
+   DefsObserverMap_t::iterator i = defs_map_.find(defs.get());
+   if (i != defs_map_.end()) {
+//#ifdef DEBUG
+//      dump_aspect_vec(aspects_vec_,"ChangeMgrSingleton::notify(defs_ptr defs)******************************\n");
+//#endif
+
+      (*i).second->update(defs.get(),aspects_vec_);
+      return;
+   }
+
+#ifdef DEBUG_ME
+   if (!defs_map_.empty()) {
+      if (defs.get()) std::cout << "ChangeMgrSingleton::notify could not notify Defs that is not being observed\n";
+      else            std::cout << "ChangeMgrSingleton::notify given a NULL defs\n";
+   }
+#endif
+}
+
+void ChangeMgrSingleton::notify_delete(Node* n)
+{
+#ifdef DEBUG_NODE
+   cout << "ChangeMgrSingleton::notify_delete(Node*)  node " << n->absNodePath() << "\n";
+#endif
+
+   NodeObserverMap_t::iterator i = map_.find(n);
+   if (i != map_.end()) {
+
+      /// This must call detach(Node*)
+      (*i).second->update_delete(n);
+
+      /// Check to make sure that the Observer called detach
+      /// We can not call detach ourselves, since the the client needs to
+      /// call detach in the case where the graphical tree is destroyed by user
+      /// In this case the Subject/Node is being deleted.
+      assert(map_.find(n) == map_.end());
+
+      return;
+   }
+
+#ifdef DEBUG_NODE
+   if (!map_.empty()) {
+      /// Its not safe to call debugNodePath()/absNodePath() since that will traverse the parent
+      /// This may not be safe during a delete.
+      if (n) std::cout << "ChangeMgrSingleton::notify_delete : Node is not observed : " << n->name() << "\n";
+      else   std::cout << "ChangeMgrSingleton::notify_delete : Error: given a NULL Node\n";
+   }
+#endif
+}
+
+void ChangeMgrSingleton::notify_delete(Defs* defs)
+{
+#ifdef DEBUG_DEFS
+   cout << "ChangeMgrSingleton::notify_delete(Defs*)\n";
+#endif
+   assert(defs);
+   
+   DefsObserverMap_t::iterator i = defs_map_.find(defs);
+   if (i != defs_map_.end()) {
+
+      /// This must call detach(Defs*)
+      (*i).second->update_delete(defs);
+
+      /// Check to make sure that the Observer called detach
+      /// We can not call detach ourselves, since the the client needs to
+      /// call detach in the case where the graphical tree is destroyed by user
+      /// In this case the Subject/Node is being deleted.
+      assert(defs_map_.find(defs) == defs_map_.end());
+
+      return;
+   }
+
+#ifdef DEBUG_DEFS
+   if (!defs_map_.empty()) {
+      if (defs) std::cout << "ChangeMgrSingleton::notify_delete: Defs is not being observed:\n";
+      else      std::cout << "ChangeMgrSingleton::notify_delete given a NULL defs\n";
+   }
+#endif
+}
+
+void ChangeMgrSingleton::destroy()
+{
+   delete instance_;
+   instance_ = NULL;
+}
+
+ChangeMgrSingleton::ChangeMgrSingleton() : in_notification_(false) {}
+ChangeMgrSingleton::~ChangeMgrSingleton() {}
diff --git a/ecflow_4_0_7/ANode/src/ChangeMgrSingleton.hpp b/ecflow_4_0_7/ANode/src/ChangeMgrSingleton.hpp
new file mode 100644
index 0000000..0ecc440
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ChangeMgrSingleton.hpp
@@ -0,0 +1,107 @@
+#ifndef CHANGE_MGR_SINGLETON_HPP_
+#define CHANGE_MGR_SINGLETON_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//               Used on the client side, to notify any registered observers of
+//               *incremental* changes to the node tree.
+// This is a variation of the observer pattern. In that we have avoided added
+// the observers directly to the Node. This was done because the observer
+// mechanism is only required by the client side, plus it avoids bloating the
+// Node with data members that are only used on the client side.
+// The disadvantage of this approach is it requires a look up for the Node:
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <map>
+#include <boost/noncopyable.hpp>
+#include "NodeFwd.hpp"
+#include "Aspect.hpp"
+
+class ChangeMgrSingleton : private boost::noncopyable {
+public:
+   static ChangeMgrSingleton* instance();
+
+   // Returns the ChangeMgr singleton without creating it
+   static ChangeMgrSingleton* exists();
+
+   /// Attach/detach interest in incremental change to the node
+   void attach(Node*,AbstractObserver*);
+   void attach(Defs*,AbstractObserver*);
+	void detach(Node*,AbstractObserver*);
+	void detach(Defs*,AbstractObserver*);
+
+   /// Used in debug:
+   size_t no_of_node_observers() const { return map_.size(); }
+   size_t no_of_def_observers() const { return defs_map_.size(); }
+
+   /// Detach interest in incremental changes to the node
+   void detach(Node*);
+   void detach(Defs*);
+
+   /// returns true if we are in a notification. Help client code to avoid infinite cycles
+   bool in_notification() const { return in_notification_;}
+
+   /// The cumulated aspect are sent, when we do a the real notification
+   void add_aspect(ecf::Aspect::Type aspect) { aspects_vec_.push_back(aspect) ;}
+   void clear_aspects() { aspects_vec_.clear(); }
+
+   /// Notify observer of a incremental change to Node
+   /// Will return true for in_notification()
+   void notify(node_ptr);
+
+   /// Notify observer of a incremental change to Defs,
+   /// Currently state or suspended attribute changes
+   /// Will return true for in_notification()
+   void notify(defs_ptr);
+
+   /// Inform observers when the subject is about to be deleted
+   /// The Observers *MUST* remember to call detach
+   void notify_delete(Node*);
+   void notify_delete(Defs*);
+
+   static void destroy();
+
+private:
+
+   ChangeMgrSingleton();
+   ~ChangeMgrSingleton();
+
+   /// Start of notifications:
+   ///   Aspect sent upon  notify(node_ptr); notify(defs_ptr);
+   void notify_start() { in_notification_ = true; }
+   void notify_end() { in_notification_ = false; }
+
+private:
+   std::map<Node*,AbstractObserver*> map_;
+   typedef std::map<Node*,AbstractObserver*>  NodeObserverMap_t;
+
+   std::map<Defs*,AbstractObserver*> defs_map_;
+   typedef std::map<Defs*,AbstractObserver*>  DefsObserverMap_t;
+
+   std::vector<ecf::Aspect::Type> aspects_vec_;
+   static ChangeMgrSingleton* instance_;
+
+   bool in_notification_;
+   friend class ChangeMgrStartNotification;
+};
+
+// Start notification. End notification automatically signalled, Even if exception raised.
+// Note: notify_end() is also called in notify(node_ptr), notify(defs_ptr)
+class ChangeMgrStartNotification : private boost::noncopyable {
+public:
+   ChangeMgrStartNotification() { ChangeMgrSingleton::instance()->notify_start();}
+   ~ChangeMgrStartNotification() { ChangeMgrSingleton::instance()->notify_end();}
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ChildAttrs.cpp b/ecflow_4_0_7/ANode/src/ChildAttrs.cpp
new file mode 100644
index 0000000..aaf3712
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ChildAttrs.cpp
@@ -0,0 +1,545 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #285 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <assert.h>
+
+#include "ChildAttrs.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Memento.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+using namespace ecf;
+using namespace std;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+void ChildAttrs::begin()
+{
+   for(size_t i = 0; i < meters_.size(); i++)     {   meters_[i].reset(); }
+   for(size_t i = 0; i < events_.size(); i++)     {   events_[i].reset(); }
+   for(size_t i = 0; i < labels_.size(); i++)     {   labels_[i].reset(); }
+}
+
+void ChildAttrs::requeue()
+{
+   for(size_t i = 0; i < meters_.size(); i++)     {   meters_[i].reset(); }
+   for(size_t i = 0; i < events_.size(); i++)     {   events_[i].reset(); }
+
+   // ECFLOW-195, only clear labels, if they are on Suites/Family not tasks(typically only specified on tasks)
+   if (node_ && node_->isNodeContainer()) {
+      for(size_t i = 0; i < labels_.size(); i++)  {   labels_[i].reset(); }
+   }
+}
+
+void ChildAttrs::requeue_labels()
+{
+   // ECFLOW-195, clear labels before a task is run.
+   for(size_t i = 0; i < labels_.size(); i++)  {   labels_[i].reset(); }
+}
+
+void ChildAttrs::clear()
+{
+   meters_.clear();
+   events_.clear();
+   labels_.clear();
+}
+
+bool ChildAttrs::set_event_used_in_trigger(const std::string& event_name_or_number)
+{
+   if (events_.empty()) {
+      return false;
+   }
+
+   // find by name first
+   size_t theSize = events_.size();
+   for(size_t i = 0; i < theSize; i++)   {
+      if (events_[i].name() == event_name_or_number) {
+         events_[i].usedInTrigger( true );
+         return true;
+      }
+   }
+
+   // Test for numeric, and then casting, is ****faster***** than relying on exception alone
+   if ( event_name_or_number.find_first_of( Str::NUMERIC(), 0 ) != std::string::npos ) {
+      try {
+         int eventNumber = boost::lexical_cast< int >( event_name_or_number );
+         for(size_t i = 0; i < theSize; i++)   {
+            if (events_[i].number() == eventNumber) {
+               events_[i].usedInTrigger( true );
+               return true;;
+            }
+         }
+      }
+      catch ( boost::bad_lexical_cast&) {}
+   }
+   return false;
+}
+
+bool ChildAttrs::set_meter_used_in_trigger(const std::string& meter_name)
+{
+   size_t the_meter_size = meters_.size();
+   for(size_t i = 0; i < the_meter_size ; ++i) {
+      if (meters_[i].name() == meter_name ) {
+         meters_[i].usedInTrigger( true );
+         return true;
+      }
+   }
+   return false;
+}
+
+bool ChildAttrs::set_event( const std::string& event_name_or_number)  {
+   BOOST_FOREACH(Event& e, events_) {
+      if (e.name_or_number() == event_name_or_number) {
+         e.set_value( true );
+         return true;
+      }
+   }
+   return false;
+}
+bool ChildAttrs::set_event(const std::string& event_name_or_number ,bool value)
+{
+   if (events_.empty()) {
+      return false;
+   }
+
+   // find by name first
+   size_t theSize = events_.size();
+   for(size_t i = 0; i < theSize; i++)   {
+      if (events_[i].name() == event_name_or_number) {
+         events_[i].set_value( value );
+         return true;
+      }
+   }
+
+   // Test for numeric, and then casting, is ****faster***** than relying on exception alone
+   if ( event_name_or_number.find_first_of( Str::NUMERIC(), 0 ) != std::string::npos ) {
+      try {
+         int eventNumber = boost::lexical_cast< int >( event_name_or_number );
+         for(size_t i = 0; i < theSize; i++)   {
+            if (events_[i].number() == eventNumber) {
+               events_[i].set_value( value );
+               return true;;
+            }
+         }
+      }
+      catch ( boost::bad_lexical_cast&) {}
+   }
+   return false;
+}
+
+bool ChildAttrs::set_meter(const std::string& meter_name,int value)
+{
+   size_t the_meter_size = meters_.size();
+   for(size_t i = 0; i < the_meter_size ; ++i) {
+      if (meters_[i].name() == meter_name) {
+         meters_[i].set_value( value);
+         return true;
+      }
+   }
+   return false;
+}
+
+bool ChildAttrs::clear_event(const std::string& event_name_or_number ){
+   BOOST_FOREACH(Event& e, events_) {
+      if (e.name_or_number() == event_name_or_number) {
+         e.set_value( false );
+         return true;
+      }
+   }
+   return false;
+}
+
+void ChildAttrs::changeLabel(const std::string& name,const std::string& value)
+{
+   size_t theSize = labels_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (labels_[i].name() == name) {
+         labels_[i].set_new_value( value );
+         return;
+      }
+   }
+   throw std::runtime_error("ChildAttrs::changeLabel: Could not find label " + name);
+}
+
+void ChildAttrs::changeEvent(const std::string& event_name_or_number,const std::string& setOrClear)
+{
+   bool value;
+   if (!setOrClear.empty()) {
+      if (setOrClear != Event::SET() && setOrClear != Event::CLEAR() ) {
+         throw std::runtime_error("ChildAttrs::changeEvent: Expected empty string, 'set' or 'clear' but found " + setOrClear + " for event " + event_name_or_number);
+      }
+      value = (setOrClear == Event::SET());
+   }
+   else  value = true;
+
+   changeEvent(event_name_or_number,value);
+}
+void ChildAttrs::changeEvent(const std::string& event_name_or_number,bool value)
+{
+   if (set_event(event_name_or_number,value))  return;
+   throw std::runtime_error("ChildAttrs::changeEvent: Could not find event " + event_name_or_number);
+}
+
+void ChildAttrs::changeMeter(const std::string& meter_name,const std::string& value)
+{
+   int theValue = 0;
+   try {
+      theValue = boost::lexical_cast< int >( value );
+   }
+   catch ( boost::bad_lexical_cast& ) {
+      throw std::runtime_error( "ChildAttrs::changeMeter expected integer value but found " + value);
+   }
+   changeMeter(meter_name,theValue);
+}
+void ChildAttrs::changeMeter(const std::string& meter_name,int value)
+{
+   if (set_meter(meter_name,value)) return;
+   throw std::runtime_error("ChildAttrs::changeMeter: Could not find meter " + meter_name);
+}
+
+std::ostream& ChildAttrs::print(std::ostream& os) const
+{
+   BOOST_FOREACH(const Label& la, labels_ )  { la.print(os); }
+   BOOST_FOREACH(const Meter& m, meters_ )   { m.print(os); }
+   BOOST_FOREACH(const Event& e, events_ )   { e.print(os); }
+   return os;
+}
+
+bool ChildAttrs::operator==(const ChildAttrs& rhs) const
+{
+   if (labels_.size() != rhs.labels_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ChildAttrs::operator==  (labels_.size() != rhs.labels_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < labels_.size(); ++i) {
+      if (labels_[i] != rhs.labels_[i]) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "ChildAttrs::operator==  (labels_[i] != rhs.labels_[i]) " << node_->debugNodePath() << "\n";
+            std::cout << "   lhs = " << labels_[i].dump() << "\n";
+            std::cout << "   rhs = " << rhs.labels_[i].dump() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   if (meters_.size() != rhs.meters_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ChildAttrs::operator==  (meters_.size() != rhs.meters_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(size_t i = 0; i < meters_.size(); ++i) {
+      if (!(meters_[i] == rhs.meters_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "ChildAttrs::operator==   (!(meters_[i] == rhs.meters_[i] )) " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+   if (events_.size() != rhs.events_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ChildAttrs::operator==   (events_.size() != rhs.events_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(size_t i = 0; i < events_.size(); ++i) {
+      if (!(events_[i] == rhs.events_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "ChildAttrs::operator==   (!(events_[i] == rhs.events_[i] )) " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+   return true;
+}
+
+bool ChildAttrs::getLabelValue(const std::string& labelName, std::string& value) const
+{
+   size_t theSize = labels_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (labels_[i].name() == labelName) {
+         if (!(labels_[i].new_value().empty())) value = labels_[i].new_value();
+         else                                   value = labels_[i].value();
+         return true;
+      }
+   }
+   return false;
+}
+
+void ChildAttrs::addLabel( const Label& l)
+{
+   if (findLabel(l.name())) {
+      std::stringstream ss;
+      ss << "Add Label failed: Duplicate label of name '" << l.name() << "' already exist for node " << node_->debugNodePath();
+      throw std::runtime_error( ss.str() );
+   }
+   labels_.push_back( l );
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void ChildAttrs::addMeter( const Meter& m)
+{
+   const Meter& meter = findMeter(m.name());
+   if (!meter.empty()) {
+      std::stringstream ss;
+      ss << "Add Meter failed: Duplicate Meter of name '" << m.name() << "' already exist for node " << node_->debugNodePath();
+      throw std::runtime_error( ss.str() );
+   }
+   meters_.push_back( m );
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void ChildAttrs::addEvent( const Event& e)
+{
+   const Event& event = findEvent(e);
+   if (!event.empty()) {
+      std::stringstream ss;
+      ss << "Add Event failed: Duplicate Event of name '" << e.name_or_number() << "' already exist for node " << node_->debugNodePath();
+      throw std::runtime_error( ss.str() );
+   }
+   events_.push_back( e );
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+
+void ChildAttrs::deleteEvent(const std::string& name)
+{
+   if (name.empty()) {
+      events_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "ChildAttrs::deleteEvent\n";
+#endif
+      return;
+   }
+
+   size_t theSize = events_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (events_[i].name_or_number() == name) {
+         events_.erase( events_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "ChildAttrs::deleteEvent\n";
+#endif
+         return;
+      }
+   }
+   throw std::runtime_error("ChildAttrs::deleteEvent: Can not find event: " + name);
+}
+
+void ChildAttrs::deleteMeter(const std::string& name)
+{
+   if (name.empty()) {
+      meters_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "Expression::clearFree()\n";
+#endif
+      return;
+   }
+
+   size_t theSize = meters_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (meters_[i].name() == name) {
+         meters_.erase( meters_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "Expression::clearFree()\n";
+#endif
+         return;
+      }
+   }
+   throw std::runtime_error("ChildAttrs::deleteMeter: Can not find meter: " + name);
+}
+
+void ChildAttrs::deleteLabel(const std::string& name)
+{
+   if (name.empty()) {
+      labels_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "ChildAttrs::deleteLabel\n";
+#endif
+      return;
+   }
+
+   size_t theSize = labels_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (labels_[i].name() == name) {
+         labels_.erase( labels_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "ChildAttrs::deleteLabel\n";
+#endif
+         return;
+      }
+   }
+   throw std::runtime_error("ChildAttrs::deleteLabel: Can not find label: " + name);
+}
+
+
+const Event& ChildAttrs::findEvent(const Event& theEvent) const
+{
+   size_t theSize = events_.size();
+   for(size_t i = 0; i < theSize; i++)   {
+      if (events_[i] == theEvent) {
+         return events_[i];
+      }
+   }
+   return Event::EMPTY();
+}
+
+const Event& ChildAttrs::findEventByNumber(int number) const
+{
+   size_t theSize = events_.size();
+   for(size_t i = 0; i < theSize; i++)   {
+      if (events_[i].number() == number) {
+         return events_[i];
+      }
+   }
+   return Event::EMPTY();
+}
+
+const Event& ChildAttrs::findEventByName( const std::string& event_name) const
+{
+   size_t theSize = events_.size();
+   for(size_t i = 0; i < theSize; i++)   {
+      if (events_[i].name() == event_name) {
+         return events_[i];
+      }
+   }
+   return Event::EMPTY();
+}
+
+const Event& ChildAttrs::findEventByNameOrNumber( const std::string& theName) const
+{
+   const Event& event = findEventByName(theName);
+   if (!event.empty()) {
+      return event;
+   }
+
+   // Test for numeric, and then casting, is ****faster***** than relying on exception alone
+   if ( theName.find_first_of( Str::NUMERIC(), 0 ) != std::string::npos ) {
+      try {
+         int eventNumber = boost::lexical_cast< int >( theName );
+         return findEventByNumber(eventNumber);
+      }
+      catch ( boost::bad_lexical_cast&) {}
+   }
+   return Event::EMPTY();
+}
+
+
+
+const Meter& ChildAttrs::findMeter(const std::string& name) const
+{
+   size_t theSize = meters_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (meters_[i].name() == name) {
+         return meters_[i];
+      }
+   }
+   return Meter::EMPTY();
+}
+
+Meter& ChildAttrs::find_meter(const std::string& name)
+{
+   size_t theSize = meters_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (meters_[i].name() == name) {
+         return meters_[i];
+      }
+   }
+   return const_cast<Meter&>(Meter::EMPTY());
+}
+
+bool ChildAttrs::findLabel(const std::string& name) const
+{
+   size_t theSize = labels_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (labels_[i].name() == name) {
+         return true;
+      }
+   }
+   return false;
+}
+
+const Label& ChildAttrs::find_label(const std::string& name) const
+{
+   size_t theSize = labels_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (labels_[i].name() == name) {
+          return labels_[i];
+      }
+   }
+   return Label::EMPTY();
+}
+
+
+void ChildAttrs::set_memento( const NodeEventMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "ChildAttrs::set_memento(const NodeEventMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   if (set_event(memento->event_.name_or_number(),  memento->event_.value())) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::EVENT);
+      return;
+   }
+   addEvent( memento->event_);
+}
+
+void ChildAttrs::set_memento( const NodeMeterMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "ChildAttrs::set_memento(const NodeMeterMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   if (set_meter(memento->meter_.name(), memento->meter_.value())) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::METER);
+      return;
+   }
+   addMeter(memento->meter_);
+}
+
+void ChildAttrs::set_memento( const NodeLabelMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "ChildAttrs::set_memento(const NodeLabelMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   size_t theSize = labels_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (labels_[i].name() == memento->label_.name()) {
+         labels_[i] = memento->label_;
+         ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::LABEL);
+         return;
+      }
+   }
+   addLabel(memento->label_);
+}
diff --git a/ecflow_4_0_7/ANode/src/ChildAttrs.hpp b/ecflow_4_0_7/ANode/src/ChildAttrs.hpp
new file mode 100644
index 0000000..1c15d52
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ChildAttrs.hpp
@@ -0,0 +1,132 @@
+#ifndef CHILD_ATTRS_HPP_
+#define CHILD_ATTRS_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #234 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <ostream>
+
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/utility.hpp>
+
+#include "NodeAttr.hpp"
+#include "NodeFwd.hpp"
+
+class ChildAttrs :  private boost::noncopyable {
+public:
+   ChildAttrs(Node* node) : node_(node) {}
+   ChildAttrs() : node_(NULL) {}
+   ~ChildAttrs() {}
+
+   // needed by node serialisation
+   void set_node(Node* n) { node_ = n; }
+
+   void begin();
+   void requeue();
+   void requeue_labels();
+
+   // standard functions: ==============================================
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const ChildAttrs& rhs) const;
+
+// state related functions: ========================================
+
+   // Access functions: ======================================================
+   const std::vector<Meter>&           meters()    const { return meters_;}
+   const std::vector<Event>&           events()    const { return events_;}
+   const std::vector<Label>&           labels()   const { return labels_;}
+
+   // Add functions: ===============================================================
+   void addEvent( const Event& );       // will throw std::runtime_error if duplicate
+   void addMeter( const Meter& );       // will throw std::runtime_error if duplicate
+   void addLabel( const Label& );       // will throw std::runtime_error if duplicate
+
+   // Delete functions: can throw std::runtime_error ===================================
+   // if name argument is empty, delete all attributes of that type
+   // Can throw std::runtime_error of the attribute can not be found
+   void deleteEvent(const std::string& name);
+   void deleteMeter(const std::string& name);
+   void deleteLabel(const std::string& name);
+
+   // Change functions: ================================================================
+   /// returns true the change was made else false, Can throw std::runtime_error for parse errors
+   void changeEvent(const std::string& name,const std::string& setOrClear = "");
+   void changeEvent(const std::string& name,bool value);
+   void changeMeter(const std::string& name,const std::string& value);
+   void changeMeter(const std::string& name,int value);
+   void changeLabel(const std::string& name,const std::string& value);
+
+   bool set_meter(const std::string& name,int value); // does not throw if meter not found
+   bool set_event(const std::string& name,bool value);  // does not throw if event not found
+
+   // Used in the force cmd
+   bool set_event( const std::string& event_name_or_number);
+   bool clear_event( const std::string& event_name_or_number);
+
+   // mementos functions:
+   void set_memento(const NodeEventMemento* );
+   void set_memento(const NodeMeterMemento* );
+   void set_memento(const NodeLabelMemento* );
+
+   // Find functions: ============================================================
+   bool findLabel(const std::string& name) const;
+   const Label& find_label(const std::string& name) const;
+   const Meter& findMeter(const std::string& name) const;
+   Meter& find_meter(const std::string& name);
+   const Event& findEvent(const Event&) const;
+   const Event& findEventByNameOrNumber( const std::string& name) const;
+   bool getLabelValue(const std::string& labelName, std::string& value) const;
+
+private:
+
+   const Event& findEventByNumber(int number) const;
+   const Event& findEventByName( const std::string& name) const;
+   bool set_meter_used_in_trigger(const std::string& name);
+   bool set_event_used_in_trigger(const std::string& name);
+
+private: // allow simulator access
+   std::vector<Meter>&  ref_meters() { return meters_;} // allow simulator set meter value
+   std::vector<Event>&  ref_events() { return events_;} // allow simulator set event value
+
+private: // All mementos access
+   void clear(); /// Clear *ALL* internal attributes
+
+private: /// For use by python interface,
+   friend class Node;
+   std::vector<Meter>::const_iterator meter_begin() const { return meters_.begin();}
+   std::vector<Meter>::const_iterator meter_end() const { return meters_.end();}
+   std::vector<Event>::const_iterator event_begin() const { return events_.begin();}
+   std::vector<Event>::const_iterator event_end() const { return events_.end();}
+   std::vector<Label>::const_iterator label_begin() const { return labels_.begin();}
+   std::vector<Label>::const_iterator label_end() const { return labels_.end();}
+
+private:
+   std::vector<Meter>          meters_;
+   std::vector<Event>          events_;
+   std::vector<Label>          labels_;
+
+private:
+   Node*        node_; // *NOT* persisted must be set by the parent class
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & meters_;
+      ar & events_;
+      ar & labels_;
+   }
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ClientSuiteMgr.cpp b/ecflow_4_0_7/ANode/src/ClientSuiteMgr.cpp
new file mode 100644
index 0000000..afc208e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ClientSuiteMgr.cpp
@@ -0,0 +1,280 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/bind.hpp>
+
+#include "ClientSuiteMgr.hpp"
+#include "Defs.hpp"
+#include "DefsDelta.hpp"
+#include "Ecf.hpp"
+
+using namespace ecf;
+using namespace std;
+
+//#define DEBUG_HANDLE 1
+
+ClientSuiteMgr::ClientSuiteMgr(Defs* defs) : defs_(defs) {}
+
+unsigned int ClientSuiteMgr::create_client_suite(bool auto_add_new_suites, const std::vector<std::string>& suites, const std::string& the_user)
+{
+	// The handle must be unique. If there are holes, re-use them, i.e
+	//     1,2,3,4,5     user deletes handle 3 ===>  1,2,4,5
+	// Hence re-use handle 3
+	bool found_hole = false;
+	unsigned int new_handle = 1;
+  	for(size_t i = 0; i < clientSuites_.size(); i++) {
+ 		if (clientSuites_[i].handle() == new_handle) {
+ 			new_handle++;
+ 		}
+ 		else {
+ 			found_hole = true;
+ 			break;
+ 		}
+	}
+  	if (!found_hole) new_handle = clientSuites_.size() + 1;
+
+	clientSuites_.push_back( ClientSuites(defs_,new_handle,auto_add_new_suites,suites,the_user)  );
+
+	// aesthetics only
+	std::sort(clientSuites_.begin(),clientSuites_.end(),
+	            boost::bind(std::less<unsigned int>(),
+	                          boost::bind(&ClientSuites::handle,_1),
+	                          boost::bind(&ClientSuites::handle,_2)));
+
+	// make sure all suites in ClientSuites are in same order as  Defs suites
+   update_suite_order();
+
+#ifdef DEBUG_HANDLE
+	std::cout << "ClientSuiteMgr::create_client_suite: " << dump() << "\n";
+#endif
+	return new_handle;
+}
+
+void ClientSuiteMgr::remove_client_suite(unsigned int client_handle)
+{
+   size_t client_suites_size = clientSuites_.size();
+	for(size_t i = 0; i < client_suites_size; i++) {
+		if (clientSuites_[i].handle() == client_handle) {
+			clientSuites_.erase( clientSuites_.begin() + i);
+#ifdef DEBUG_HANDLE
+			std::cout << "ClientSuiteMgr::remove_client_suite: handle(" << client_handle << ") " << dump() << "\n";
+#endif
+			return;
+		}
+	}
+	std::stringstream ss; ss << "ClientSuiteMgr::remove_registered_suite: handle(" << client_handle << ") does not exist";
+	throw std::runtime_error(ss.str());
+}
+
+void ClientSuiteMgr::remove_client_suites(const std::string& user_to_drop)
+{
+   bool did_drop = false;
+   for(std::vector<ecf::ClientSuites>::iterator i = clientSuites_.begin(); i!= clientSuites_.end(); ++i) {
+      if ((*i).user() == user_to_drop) {
+         did_drop = true;
+         clientSuites_.erase(i--);
+      }
+   }
+
+   if (!did_drop) {
+      std::stringstream ss; ss << "ClientSuiteMgr::remove_registered_suites: user(" << user_to_drop << ") has no registered handles";
+      throw std::runtime_error(ss.str());
+   }
+
+#ifdef DEBUG_HANDLE
+   std::cout << "ClientSuiteMgr::remove_client_suites: user_to_drop(" << user_to_drop << ") " << dump() << "\n";
+#endif
+}
+
+void ClientSuiteMgr::add_suites(unsigned int client_handle, const std::vector<std::string>& suites)
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+		if (clientSuites_[i].handle() == client_handle) {
+			for(size_t s = 0; s < suites.size(); s++) {
+				clientSuites_[i].add_suite(suites[s]);
+			}
+#ifdef DEBUG_HANDLE
+			std::cout << "ClientSuiteMgr::add_suites: client_handle(" << client_handle << ") " << dump() << "\n";
+#endif
+		   update_suite_order();
+ 			return;
+		}
+	}
+	std::stringstream ss; ss << "ClientSuiteMgr::add_suites: handle(" << client_handle << ") does not exist";
+	throw std::runtime_error(ss.str());
+}
+
+
+void ClientSuiteMgr::remove_suites(unsigned int client_handle, const std::vector<std::string>& suites)
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+		if (clientSuites_[i].handle() == client_handle) {
+			for(size_t s = 0; s < suites.size(); s++) {
+				clientSuites_[i].remove_suite(suites[s]);
+			}
+#ifdef DEBUG_HANDLE
+         std::cout << "ClientSuiteMgr::remove_suites: client_handle(" << client_handle << ") " << dump() << "\n";
+#endif
+ 			return;
+		}
+	}
+	std::stringstream ss; ss << "ClientSuiteMgr::remove_suites: handle(" << client_handle << ") does not exist";
+	throw std::runtime_error(ss.str());
+}
+
+
+void ClientSuiteMgr::auto_add_new_suites(unsigned int client_handle, bool auto_add_new_suites)
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+		if (clientSuites_[i].handle() == client_handle) {
+ 			clientSuites_[i].add_new_suite(auto_add_new_suites);
+
+#ifdef DEBUG_HANDLE
+         std::cout << "ClientSuiteMgr::auto_add_new_suites: client_handle(" << client_handle << ") auto_add_new_suites(" << auto_add_new_suites << ") " << dump() << "\n";
+#endif
+ 			return;
+		}
+	}
+	std::stringstream ss; ss << "ClientSuiteMgr::auto_add_new_suites: handle(" << client_handle << ") does not exist";
+	throw std::runtime_error(ss.str());
+}
+
+bool ClientSuiteMgr::valid_handle(unsigned int client_handle) const
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+      if (clientSuites_[i].handle() == client_handle) {
+         return true;
+      }
+   }
+   return false;
+}
+
+/// returns true if the handle was created, or suites added or removed from it
+bool ClientSuiteMgr::handle_changed( unsigned int client_handle )
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+      if (clientSuites_[i].handle() == client_handle) {
+         return clientSuites_[i].handle_changed();
+      }
+   }
+   return false;
+}
+
+void ClientSuiteMgr::collateChanges(unsigned int client_handle, DefsDelta& changes) const
+{
+	// collate changes over the suites that match the client handle
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+		if ( clientSuites_[i].handle() == client_handle) {
+			clientSuites_[i].collateChanges(changes);
+			return;
+		}
+	}
+}
+
+void ClientSuiteMgr::suites(unsigned int client_handle, std::vector<std::string>& names) const
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+      if ( clientSuites_[i].handle() == client_handle) {
+         clientSuites_[i].suites(names);
+         return;
+      }
+   }
+}
+
+defs_ptr ClientSuiteMgr::create_defs(unsigned int client_handle, defs_ptr server_defs) const
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+		if (clientSuites_[i].handle() == client_handle) {
+			return clientSuites_[i].create_defs(server_defs);
+ 		}
+	}
+	return defs_ptr();
+}
+
+void ClientSuiteMgr::max_change_no(
+         unsigned int client_handle,
+         unsigned int& max_state_change_no ,
+         unsigned int& max_modify_change_no)
+{
+    size_t client_suites_size = clientSuites_.size();
+    for(size_t i = 0; i < client_suites_size; i++) {
+       if (clientSuites_[i].handle() == client_handle) {
+          clientSuites_[i].max_change_no(max_state_change_no,max_modify_change_no);
+          return;
+       }
+    }
+    std::stringstream ss; ss << "ClientSuiteMgr::max_change_no: handle(" << client_handle << ") does not exist in server. Server may have died? Please re-register suites";
+    throw std::runtime_error(ss.str());
+}
+
+
+void ClientSuiteMgr::suite_added_in_defs(suite_ptr suite)
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+      clientSuites_[i].suite_added_in_defs(suite);
+      clientSuites_[i].update_suite_order();
+	}
+}
+
+void ClientSuiteMgr::suite_deleted_in_defs(suite_ptr suite)
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+		clientSuites_[i].suite_deleted_in_defs(suite);
+	}
+}
+
+void ClientSuiteMgr::update_suite_order()
+{
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+      clientSuites_[i].update_suite_order();
+   }
+}
+
+
+std::string ClientSuiteMgr::dump_max_change_no() const
+{
+   std::stringstream ss;
+   ss << "ClientSuiteMgr::dump_max_change_no: ECF:(" << Ecf::state_change_no() << "," << Ecf::modify_change_no() << ")\n";
+   size_t client_suites_size = clientSuites_.size();
+   for(size_t i = 0; i < client_suites_size; i++) {
+      unsigned int max_state_change_no = 0;
+      unsigned int max_modify_change_no = 0;
+      clientSuites_[i].max_change_no(max_state_change_no,max_modify_change_no);
+      ss << "handle: " << clientSuites_[i].handle() << " max(" << max_state_change_no << "," << max_modify_change_no << ")\n";
+   }
+   return ss.str();
+}
+
+/// For debug dumps
+std::string ClientSuiteMgr::dump() const
+{
+    size_t client_suites_size = clientSuites_.size();
+    std::stringstream ss;
+    ss << "ECF:(" << Ecf::state_change_no() << "," << Ecf::modify_change_no() << ") clientSuites_.size(" << client_suites_size << ")\n";
+    for(size_t i = 0; i < client_suites_size; i++) {
+       ss << clientSuites_[i].dump() << "\n";
+    }
+    return ss.str();
+}
diff --git a/ecflow_4_0_7/ANode/src/ClientSuiteMgr.hpp b/ecflow_4_0_7/ANode/src/ClientSuiteMgr.hpp
new file mode 100644
index 0000000..a2f9255
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ClientSuiteMgr.hpp
@@ -0,0 +1,118 @@
+#ifndef CLIENT_SUITES_MGR_HPP_
+#define CLIENT_SUITES_MGR_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+// The client may only want to view a small subset of the suites available
+// in a defs file. This class manages the client handles
+//
+// Users are allowed to register interest in suite that have not yet been added
+// This will only work provided we have a definition
+//
+// Only handle with value > 0 are valid. This is because sync() and news() command
+// take a client_handle. By reserving a client handle of zero, we can sync with the
+// full defs.
+//
+// ***************************************************************************
+// Note: Change of suite order is handled by OrderMemento
+//       and *NOT* by the ClientSuiteMgr, however whenever suites are
+//       registered and added/deleted:
+//       then:
+//           defs_ptr create_defs(unsigned int client_handle) const;
+//
+//       Will return the suites in the same order as the defs
+// ****************************************************************************
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include "ClientSuites.hpp"
+class DefsDelta;
+
+class ClientSuiteMgr : private boost::noncopyable {
+public:
+ 	ClientSuiteMgr(Defs*);
+
+ 	/// Create a client suite, and return the handle associated with the created object
+ 	unsigned int create_client_suite(bool auto_add_new_suites, const std::vector<std::string>& suites, const std::string& user);
+
+
+ 	/// These function can throw std::runtime_error if the handle can not be found
+   void remove_client_suite(unsigned int client_handle);
+   void remove_client_suites(const std::string& user_to_drop);
+ 	void add_suites(unsigned int client_handle, const std::vector<std::string>& suites);
+ 	void remove_suites(unsigned int client_handle, const std::vector<std::string>& suites);
+ 	void auto_add_new_suites(unsigned int client_handle, bool auto_add_new_suites);
+
+ 	/// Return true if the input handle is valid
+ 	bool valid_handle(unsigned int client_handle) const;
+
+ 	/// returns true if the handle was created, or suites added or removed from it
+ 	/// The handle change flag is reset when create_defs is called
+   bool handle_changed( unsigned int client_handle );
+
+
+ 	/// Collect all the state changes, so that only small subset is returned to client
+  	/// When nodes are added/deleted we use the modify_change_no_, in this case
+  	/// the whole defs is returned. Both integers are returned back to the client
+  	/// so that, the client then sends the integers back to server, so we can determine
+  	/// what's changed.
+ 	void collateChanges(unsigned int client_handle,DefsDelta&) const;
+
+
+   // Only return the defs state and suites that the client has registered in the client handle
+   // *HOWEVER* if the client has registered all the suites, just return the server defs
+   //           *with* the updated change numbers
+ 	// *OTHERWISE*
+	/// This will also compute the **maximum** state and modify change numbers over
+	/// the suites managed by the client handle.
+	/// and then set it on the newly created defs.
+	/// It also takes special precaution *NOT* to change Ecf::state_change_no() and Ecf::modify_change_no()
+ 	/// This will clear the handle_changed flag
+ 	defs_ptr create_defs(unsigned int client_handle, defs_ptr server_defs) const;
+
+ 	/// Used to determine the change, will throw if handle not found
+ 	void max_change_no(unsigned int client_handle,unsigned int& max_state_change_no , unsigned int& max_modify_change_no);
+
+ 	/// Accessor
+ 	const std::vector<ecf::ClientSuites>& clientSuites() const { return clientSuites_;}
+
+   /// returns the list of suites associated with a handle, Used by ecFlowview
+   void suites(unsigned int client_handle, std::vector<std::string>& names) const;
+
+   /// A suite is being added in the definition.
+   /// If the suite was previously registered *UPDATE* its suite_ptr
+ 	/// Otherwise if any ClientSuites registered for automatic inclusion of new suite, add them in
+	void suite_added_in_defs(suite_ptr);
+
+	/// The suite is being deleted in the definition, reset the suite_ptr
+	/// Deleted suites STAY registered, until explicitly dropped.
+	void suite_deleted_in_defs(suite_ptr);
+
+   /// Update suites to be in same order as Defs.
+	void update_suite_order();
+
+	/// remove all client Suites
+	void clear() { clientSuites_.clear(); }
+
+	/// Returns a string which has the max state change and modify numbers for each handle
+	std::string dump_max_change_no() const;
+
+	/// For debug dumps
+	std::string dump() const;
+
+private:
+	std::vector<ecf::ClientSuites> clientSuites_;
+	Defs* defs_;
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ClientSuites.cpp b/ecflow_4_0_7/ANode/src/ClientSuites.cpp
new file mode 100644
index 0000000..cb10c51
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ClientSuites.cpp
@@ -0,0 +1,332 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #35 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/bind.hpp>
+
+#include "ClientSuites.hpp"
+#include "Suite.hpp"
+#include "Defs.hpp"
+#include "DefsDelta.hpp"
+#include "Ecf.hpp"
+
+//#define DEBUG_ME 1
+
+namespace ecf {
+
+ClientSuites::ClientSuites(Defs* defs,unsigned int handle, bool auto_add_new_suites, const std::vector<std::string>& suites,const std::string& user)
+: defs_(defs),
+  handle_(handle),
+  state_change_no_(0),
+  modify_change_no_(0),
+  auto_add_new_suites_(auto_add_new_suites),
+  handle_changed_(false),
+  user_(user)
+{
+   BOOST_FOREACH(const std::string& s, suites) {
+      add_suite(s);
+   }
+}
+
+void ClientSuites::add_suite(const std::string& s)
+{
+   suite_ptr suite = defs_->findSuite(s);
+   if (suite.get()) {
+      add_suite(suite);
+   }
+   else  {
+      std::vector<HSuite>::iterator i = find_suite(s);
+      if (i != suites_.end()) {
+         (*i).weak_suite_ptr_ = weak_suite_ptr();
+      }
+      else {
+         suites_.push_back( HSuite(s) );
+      }
+   }
+}
+
+void ClientSuites::add_suite(suite_ptr suite)
+{
+   if (suite.get()) {
+
+      // *IMPORTANT* update weak_suite_ptr_
+      std::vector<HSuite>::iterator i = find_suite(suite->name());
+      if (i != suites_.end()) {
+         (*i).weak_suite_ptr_ = weak_suite_ptr(suite);
+      }
+      else {
+         suites_.push_back( HSuite(suite->name(),weak_suite_ptr(suite)) );
+      }
+      handle_changed_ = true;
+
+#ifdef DEBUG_ME
+      i = suites_.find_suite(suite->name());
+      assert(i != suites_.end());
+      assert((*i).weak_suite_ptr_.lock().get());
+#endif
+   }
+}
+
+void ClientSuites::remove_suite(const std::string& s)
+{
+   std::vector<HSuite>::iterator i = find_suite(s);
+   if (i != suites_.end()) {
+      if ( (*i).weak_suite_ptr_.lock().get() ) {
+         handle_changed_ = true;
+      }
+      suites_.erase(i);
+   }
+}
+
+bool ClientSuites::remove_suite(suite_ptr suite)
+{
+   if (suite.get()) {
+      std::vector<HSuite>::iterator i = find_suite(suite->name());
+      if (i != suites_.end()) {
+         handle_changed_ = true;
+         suites_.erase(i);
+         return true;
+      }
+   }
+   return false;
+}
+
+
+void ClientSuites::suite_added_in_defs(suite_ptr suite)
+{
+   if (auto_add_new_suites_)  add_suite(suite);
+   else {
+      // *IF* and *ONLY IF* the suite was previously registered added, *UPDATE* its suite_ptr
+      std::vector<HSuite>::iterator i = find_suite(suite->name());
+      if (i != suites_.end()) {
+         // previously registered suite, update
+         add_suite(suite);
+      }
+   }
+}
+
+void ClientSuites::suite_deleted_in_defs(suite_ptr suite)
+{
+   // Deleted suites are *NOT* automatically removed
+   // They have to be moved explicitly by the user. Reset to weak ptr
+   if (suite.get()) {
+      std::vector<HSuite>::iterator i = find_suite(suite->name());
+      if (i != suites_.end()) {
+         handle_changed_ = true;
+         modify_change_no_ = Ecf::modify_change_no();  // need to pass back to client
+         (*i).weak_suite_ptr_ = weak_suite_ptr();      // reset suite ptr, not strictly necessary
+       }
+   }
+}
+
+void ClientSuites::collateChanges(DefsDelta& changes) const
+{
+   BOOST_FOREACH(const HSuite& s, suites_) {
+      suite_ptr suite = s.weak_suite_ptr_.lock();
+      if (suite.get()) {
+         if (suite->state_change_no() > changes.client_state_change_no()) {
+            suite->collateChanges( changes );
+         }
+      }
+   }
+}
+
+defs_ptr ClientSuites::create_defs(defs_ptr server_defs) const
+{
+   /// Clear handle changed, so we can detect suites added or removed for this handle
+   handle_changed_ = false;
+
+   // If the user has registered *ALL* the suites just return the server defs
+   std::vector<HSuite>::const_iterator suites_end = suites_.end();
+   if (suites_.size() == server_defs->suiteVec().size()) {
+      size_t real_suite_count = 0;
+      for(std::vector<HSuite>::const_iterator i = suites_.begin(); i != suites_end; ++i) {
+         suite_ptr suite = (*i).weak_suite_ptr_.lock();
+         if (suite.get()) real_suite_count++;
+      }
+      if ( real_suite_count == server_defs->suiteVec().size()) {
+
+         server_defs->set_state_change_no( Ecf::state_change_no() );
+         server_defs->set_modify_change_no( Ecf::modify_change_no() );
+
+         // Update local modify_change_no_ *AND* state_change_no_
+         // ***** Note: Otherwise NewsCmd which computes change numbers over
+         // ***** registered suites will not be correct. causing unnecessary sync's
+         modify_change_no_ = Ecf::modify_change_no();
+         state_change_no_ = Ecf::state_change_no();
+         return server_defs;
+      }
+   }
+
+
+   // CREATE NEW DEFS, using the registered suites
+   //
+   // *** We do not use local state_change_no_. That is used ONLY when all suites ***
+   // *** are registered.                                                         ***
+   //
+   // add_suite() below will incremented the modify_change_no.
+   // We don't want to do this, as change for suites *not in* the our handle will get skewed
+   // This class ensure that any changes made are reset to their original values
+   EcfPreserveChangeNo preserveChangeNo;
+
+   // Create defs to be sent to the client, with the registered suites.
+   defs_ptr newly_created_defs = Defs::create();
+   {
+      // Initialise the defs state. We need to reflect the real state.
+      newly_created_defs->set_state( server_defs->state() );
+
+      // Initialise the server state
+      newly_created_defs->set_server().set_state(     server_defs->server().get_state() );
+      newly_created_defs->set_server().set_user_variables( server_defs->server().user_variables() );
+      newly_created_defs->set_server().set_server_variables( server_defs->server().server_variables() );
+   }
+
+
+   // Store the state/modify change number to the newly created defs *over* the objects that have changed
+   unsigned int the_max_state_change_no = server_defs->defs_only_max_state_change_no();
+   unsigned int the_max_modify_change_no = 0;
+
+   // Handle suites that get deleted. Need a full sync
+   the_max_modify_change_no = std::max( the_max_modify_change_no,  modify_change_no_  );
+
+   // Suites should already be in order
+   for(std::vector<HSuite>::const_iterator i = suites_.begin(); i != suites_end; ++i) {
+      suite_ptr suite = (*i).weak_suite_ptr_.lock();
+      if (suite.get()) {
+
+         // Preserve the change/modify numbers, as these will updated on the suite, by addSuite() below
+         unsigned int suite_state_change_no = suite->state_change_no();
+         unsigned int suite_modify_change_no = suite->modify_change_no();
+
+         the_max_state_change_no = std::max( the_max_state_change_no, suite_state_change_no );
+         the_max_modify_change_no = std::max( the_max_modify_change_no, suite_modify_change_no );
+
+         // To avoid copying the suites, we will just add the suites, to the newly created defs
+         // However this presents a problem with the suites defs pointer. To avoid corrupting
+         // the server, we must reset the defs pointer.
+         // The newly_created_defs/Defs serialisation will re-adjust the suites defs pointer
+         Defs* old_defs = suite->defs();
+
+         // This will end up setting the suite's defs pointer to 'newly_created_defs'.
+         // This is wrong, since we only have a single suite
+         suite->set_defs(NULL); // otherwise addSuite, will complain
+         newly_created_defs->addSuite(suite); // will update modify_change_no, see comment at top
+
+         suite->set_defs(old_defs);                            // reset the defs, since addSuite() changed defs ptr
+         suite->set_state_change_no(suite_state_change_no);    // reset in case addSuite() changed this
+         suite->set_modify_change_no(suite_modify_change_no);  // reset in case addSuite() changed this
+      }
+   }
+
+   // Store the max in the defs, for transmission to client. The client uses this for syncing
+   newly_created_defs->set_state_change_no(the_max_state_change_no);
+   newly_created_defs->set_modify_change_no(the_max_modify_change_no);
+   return newly_created_defs;
+}
+
+
+void ClientSuites::max_change_no(unsigned int& the_max_state_change_no,unsigned int& the_max_modify_change_no ) const
+{
+   /// get the max state change_no due to:
+   ///   o Defs state changed
+   ///   o Suite order changed
+   ///   o Defs flag changed
+   ///   o Defs server state changed.
+   ///   o Defs server variables changed
+   the_max_state_change_no = defs_->defs_only_max_state_change_no();
+
+   // Take into account case where all suites are registered
+   the_max_state_change_no = std::max( the_max_state_change_no,  state_change_no_  );
+
+   // Take into account registered suites that get deleted, and where all suites registered
+   the_max_modify_change_no = 0;
+   the_max_modify_change_no = std::max( the_max_modify_change_no,  modify_change_no_  );
+
+   BOOST_FOREACH(const HSuite& p, suites_) {
+      suite_ptr suite = p.weak_suite_ptr_.lock();
+      if (suite.get()) {
+         the_max_modify_change_no = std::max( the_max_modify_change_no, suite->modify_change_no() );
+         the_max_state_change_no  = std::max( the_max_state_change_no,  suite->state_change_no() );
+      }
+   }
+}
+
+void ClientSuites::suites(std::vector<std::string>& names) const
+{
+   names.reserve(suites_.size());
+   std::vector<HSuite>::const_iterator suites_end = suites_.end();
+   for(std::vector<HSuite>::const_iterator i = suites_.begin(); i != suites_end; ++i) {
+       names.push_back( (*i).name_ );
+   }
+}
+
+std::string ClientSuites::dump() const
+{
+   unsigned int maxstatechangeno = 0;
+   unsigned int maxmodifychangeno = 0;
+   max_change_no(maxstatechangeno,maxmodifychangeno);
+
+   std::stringstream ss;
+   ss << "  handle(" << handle() << ") user(" << user_ << ") auto_add_new_suites(" << auto_add_new_suites_
+      << ") suites_.size(" << suites_.size() << ") suites(";
+
+   std::vector<HSuite>::const_iterator suites_end = suites_.end();
+   for(std::vector<HSuite>::const_iterator i = suites_.begin(); i != suites_end; ++i) {
+      suite_ptr suite = (*i).weak_suite_ptr_.lock();
+      if (suite.get()) {
+         ss << " " << suite->name();
+      }
+      else {
+         ss << " " << (*i).name_ << ":NULL";
+      }
+   }
+   ss << ") max(" << maxstatechangeno << "," << maxmodifychangeno << ")";
+   return ss.str();
+}
+
+
+void ClientSuites::update_suite_order()
+{
+   const std::vector<suite_ptr>& server_suite_vec = defs_->suiteVec();
+   size_t server_suite_vec_size = server_suite_vec.size();
+
+   std::vector<HSuite>::iterator suites_end = suites_.end();
+   for(std::vector<HSuite>::iterator i = suites_.begin(); i != suites_end; ++i) {
+      for(size_t s = 0;  s < server_suite_vec_size; s++) {
+         if ((*i).name_ == server_suite_vec[s]->name()) {
+            (*i).index_ = static_cast<int>(s);
+            break;
+         }
+      }
+   }
+
+   std::sort(suites_.begin(),suites_.end(),
+            boost::bind(std::less<int>(),
+                          boost::bind(&HSuite::index_,_1),
+                          boost::bind(&HSuite::index_,_2)));
+
+}
+
+std::vector<HSuite>::iterator ClientSuites::find_suite(const std::string& name)
+{
+   std::vector<HSuite>::iterator suites_end = suites_.end();
+   for(std::vector<HSuite>::iterator i = suites_.begin(); i != suites_end; ++i) {
+      if ((*i).name_ == name) {
+         return i;
+      }
+   }
+   return suites_end;
+}
+
+}
diff --git a/ecflow_4_0_7/ANode/src/ClientSuites.hpp b/ecflow_4_0_7/ANode/src/ClientSuites.hpp
new file mode 100644
index 0000000..15ba795
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ClientSuites.hpp
@@ -0,0 +1,145 @@
+#ifndef CLIENT_SUITES_HPP_
+#define CLIENT_SUITES_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #26 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+// The definition file could hold hundreds of suites, however the client
+// may only be interested in a small subset. By allowing the client to register
+// the suites they are interested in, we can reduce the network traffic
+// when they ask for updates.(ie via sync or news)
+// When the Client registers an interest in suites it is returned a handle,
+// this handle must is passed back to the server as a reference, with the sync'ing commands
+//
+// Users are allowed to register interest in suite that have not yet been added
+// This will only work provided we have a definition
+//
+// ***************************************************************************
+// Note: Change of suite order is handled by OrderMemento
+//       and *NOT* by the ClientSuites, however whenever suites are:
+//       registered and added/deleted:
+//       then:
+//           defs_ptr create_defs(Defs* server_defs) const;
+//
+//       Will return the suites in the same order as the defs
+// ****************************************************************************
+//
+// Uses compiler generated copy constructor and destructor
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <vector>
+#include <limits>
+#include "NodeFwd.hpp"
+
+namespace ecf {
+
+struct HSuite {
+   HSuite(const std::string& name, weak_suite_ptr p, int index = std::numeric_limits<int>::max())
+   : name_(name), weak_suite_ptr_(p),index_(index) {}
+
+   HSuite(const std::string& name )
+   : name_(name),index_(std::numeric_limits<int>::max()) {}
+
+   std::string    name_;           // suite name
+   weak_suite_ptr weak_suite_ptr_; // does suite exist in defs, need to lock, to find out
+   int            index_;          // suites in handles must be in same order as defs
+};
+
+class ClientSuites {
+public:
+	/// Will automatically create a unique handle
+	ClientSuites(Defs*,unsigned int handle, bool auto_add_new_suites, const std::vector<std::string>& suites , const std::string& user);
+
+	/// Return the handle, returned to the client, and required for all correspondence
+	/// between client server. This value is always > 0
+	unsigned int handle() const { return handle_;}
+
+	/// return the user who requested this handle
+	const std::string& user()  const { return user_; }
+
+	/// The handle changed flag is set to true whenever a ClinetSuites is created
+	/// or when suites are added/removed from it. The alternative way would have
+	/// been to update the modify change number, but this would have affected all handles
+	bool handle_changed() const { return handle_changed_; }
+
+	/// Add an interest to this suite
+   void add_suite(const std::string&);
+   void add_suite(suite_ptr);
+
+	/// no longer interested in this suite. Explicit remove
+   void remove_suite(const std::string&);
+   bool remove_suite(suite_ptr);
+
+   /// A new suite is being added in the definition.
+   /// If it was already registered update the suite ptr
+   /// If auto add new suite enabled,register it
+   void suite_added_in_defs(suite_ptr);
+
+   /// The suite is being deleted, update modify_change_no. So we do a full sync
+   /// RESETs suite ptr. Deleted suites are *NOT* automatically removed
+   void suite_deleted_in_defs(suite_ptr);
+
+	/// Collate the incremental changes, made to my suites
+	void collateChanges(DefsDelta& changes) const;
+
+   // Only return the defs state and suites that the client has registered in this suite
+   // *HOWEVER* if the client has registered all the suites, just return the server defs
+   //           *with* the updated change numbers
+   // *OTHERWISE*
+	/// Creates a new defs, by adding the suites to the defs
+	/// The defs is to be transferred to the client
+	/// Suites are returned in the same order as the defs
+	/// We avoid copying, but need to adjust suites defs pointer
+	/// This will clear the handle_changed_  flag
+	defs_ptr create_defs(defs_ptr server_defs) const;
+
+	// iterates overs its suites and return max state and modify change numbers
+	void max_change_no(unsigned int& state_change_no,unsigned int& modify_change_no ) const;
+
+	/// Enable/disable interest in new suites.
+	/// if the flag is true, when ever new suites are added to the defs
+	/// The internal list is updated.
+	void add_new_suite( bool flag ) { auto_add_new_suites_ = flag;}
+	bool auto_add_new_suites() const { return auto_add_new_suites_;}
+
+	/// returns the list of suites
+	void suites(std::vector<std::string>& names) const;
+
+	/// Update suites to be in same order as Defs.
+	/// This should be done externally to avoid update after individual add
+	void update_suite_order();
+
+	/// For debug dumps
+	std::string dump() const;
+
+private:
+	std::vector<HSuite>::iterator find_suite(const std::string& name);
+
+private:
+   Defs* defs_;
+   unsigned int handle_;                   // This must be unique
+
+   // The modify_change_no_ is required specifically when a registered suite is deleted
+   // Both modify_change_no_ & state_change_no_ are required when user has registered
+   // with *ALL* the suites. In this case we need to ensure that after a SYNC/create_defs
+   // the NewsCmd call to max_change_no() is in sync with global change numbers.
+   mutable unsigned int state_change_no_;
+   mutable unsigned int modify_change_no_;
+
+	bool auto_add_new_suites_;
+	mutable bool handle_changed_;           // set when handle created, or when suites added/removed
+	std::string user_;                        // user who create this handle
+	std::vector<HSuite> suites_;
+};
+}
+#endif
diff --git a/ecflow_4_0_7/ANode/src/CmdContext.cpp b/ecflow_4_0_7/ANode/src/CmdContext.cpp
new file mode 100644
index 0000000..4e32b61
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/CmdContext.cpp
@@ -0,0 +1,29 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include "CmdContext.hpp"
+
+namespace ecf {
+bool CmdContext::in_command_ =  false;
+
+CmdContext::CmdContext()
+{
+   in_command_ = true;
+}
+
+CmdContext::~CmdContext()
+{
+   in_command_ = false;
+}
+
+}
diff --git a/ecflow_4_0_7/ANode/src/CmdContext.hpp b/ecflow_4_0_7/ANode/src/CmdContext.hpp
new file mode 100644
index 0000000..877f8fd
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/CmdContext.hpp
@@ -0,0 +1,36 @@
+#ifndef CMD_CONTEXT_HPP_
+#define CMD_CONTEXT_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+// This class allow client to determine whether they are in a middle
+// of a command.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+
+namespace  ecf {
+
+class CmdContext : private boost::noncopyable {
+public:
+   CmdContext();
+   ~CmdContext();
+
+   static bool in_command() { return in_command_; }
+
+private:
+   static bool in_command_;
+};
+}
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Defs.cpp b/ecflow_4_0_7/ANode/src/Defs.cpp
new file mode 100644
index 0000000..bd42768
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Defs.cpp
@@ -0,0 +1,1468 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #270 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+#include <sstream>
+#include <fstream>
+#include <boost/bind.hpp>
+#include <boost/make_shared.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Log.hpp"
+#include "PrintStyle.hpp"
+#include "NodeTreeVisitor.hpp"
+#include "Str.hpp"
+#include "Extract.hpp"
+#include "NodePath.hpp"
+#include "Stl.hpp"
+#include "Ecf.hpp"
+#include "NodeState.hpp"
+#include "ExprAst.hpp"       // required for persistence
+#include "Serialization.hpp" // collates boost archive includes
+#include "JobCreationCtrl.hpp"
+#include "ResolveExternsVisitor.hpp"
+#include "DefsDelta.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "ExprDuplicate.hpp"
+#include "Version.hpp"
+#include "Indentor.hpp"
+
+using namespace ecf;
+using namespace std;
+
+//#define DEBUG_JOB_SUBMISSION 1
+//#define DEBUG_MEMENTO 1
+
+Defs::Defs() :
+   state_change_no_(0),
+   modify_change_no_( 0 ),
+   updateCalendarCount_(0),
+   order_state_change_no_(0),
+   save_edit_history_(false),
+   client_suite_mgr_(this)
+{
+}
+
+defs_ptr Defs::create()
+{
+	return boost::make_shared<Defs>();
+}
+
+Defs::~Defs()
+{
+//    cout << "   Deleting defs "\n";
+   // Don't create the ChangeMgrSingleton during destruct sequence. (i.e in unit cases)
+   // Since that will cause a memory leak
+   if (!Ecf::server() && ChangeMgrSingleton::exists()) {
+      ChangeMgrSingleton::instance()->notify_delete( this );
+   }
+
+   // Duplicate AST are held in a static map. Delete them, to avoid valgrind complaining
+   ExprDuplicate reclaim_cloned_ast_memory;
+}
+
+///// State relation functions: ==================================================
+NState::State Defs::state() const
+{
+	return state_.state();
+}
+
+void Defs::set_state_only(NState::State the_new_state)
+{
+   state_.setState( the_new_state ); // this will update state_change_no
+}
+
+void Defs::set_state(NState::State the_new_state)
+{
+   set_state_only( the_new_state ); // this will update state_change_no
+
+  	// Log the state change
+   //           " " +  submitted(max) + ": /"
+   // reserve : 1   +  9              + 3      = 13
+   std::string log_state_change; log_state_change.reserve(13);
+   log_state_change += " ";
+   log_state_change += NState::toString(the_new_state);
+   log_state_change += ": /";
+   ecf::log(Log::LOG,log_state_change);
+}
+
+void Defs::set_most_significant_state()
+{
+   NState::State computedStateOfImmediateChildren = ecf::theComputedNodeState(suiteVec_, true /* immediate children only */ );
+   if (computedStateOfImmediateChildren != state_.state() )
+      set_state(  computedStateOfImmediateChildren );
+}
+
+/// Others ======================================================================
+void Defs::check_job_creation(  job_creation_ctrl_ptr jobCtrl )
+{
+   /// Job generation checking. is done via the python API
+   /// As such it done directly on the Defs.
+   /// However Job generation checking will end up changing the states of the DEFS
+   /// If this defs is loaded into the server the state of each node may be surprising. (i.e submitted)
+   /// Hence we need to reset the state.
+
+   if (!jobCtrl.get()) {
+      throw std::runtime_error("Defs::check_job_creation: NULL JobCreationCtrl passed");
+   }
+
+   // This function should NOT really change the data model
+   // The changed state is reset, hence we need to preserve change and modify numbers
+   EcfPreserveChangeNo preserveChangeNo;
+
+   // Do *not* modify suspended state of child nodes
+   int clear_suspended_in_child_nodes = -1;
+
+ 	if (jobCtrl->node_path().empty()) {
+
+ 		size_t theSize = suiteVec_.size();
+ 		for(size_t s = 0; s < theSize; s++) {
+ 		   /// begin will cause creation of generated variables. The generated variables
+ 		   /// are use in client scripts and used to locate the ecf files
+ 			suiteVec_[s]->begin();
+ 			suiteVec_[s]->check_job_creation( jobCtrl ) ;
+
+ 			/// reset the state
+         suiteVec_[s]->requeue(true,clear_suspended_in_child_nodes,true);
+         suiteVec_[s]->reset_begin();
+         suiteVec_[s]->setStateOnlyHierarchically( NState::UNKNOWN );
+ 		}
+	}
+	else {
+
+		node_ptr node =  findAbsNode( jobCtrl->node_path() );
+		if (node.get()) {
+		   /// begin will cause creation of generated variables. The generated variables
+		   /// are use in client scripts and used to locate the ecf files
+		   node->suite()->begin();
+			node->check_job_creation( jobCtrl );
+
+			/// reset the state
+         node->requeue(true,clear_suspended_in_child_nodes,true);
+         node->suite()->reset_begin();
+         node->setStateOnlyHierarchically( NState::UNKNOWN );
+		}
+		else {
+ 		    std::stringstream ss;
+		    ss << "Defs::check_job_creation: failed as node path '"  << jobCtrl->node_path() << "' does not exist.\n";
+ 		    jobCtrl->error_msg() =  ss.str();
+ 		}
+	}
+}
+
+void Defs::do_generate_scripts( const std::map<std::string,std::string>& override) const
+{
+   size_t theSize = suiteVec_.size();
+   for(size_t s = 0; s < theSize; s++) {
+      suiteVec_[s]->generate_scripts(override);
+   }
+}
+void Defs::generate_scripts() const
+{
+   std::map<std::string,std::string> override;
+   do_generate_scripts(override);
+}
+
+
+void Defs::updateCalendar( const ecf::CalendarUpdateParams & calUpdateParams)
+{
+	/// Collate any auto cancelled nodes as a result of calendar update
+	std::vector<node_ptr> auto_cancelled_nodes;
+
+	// updateCalendarCount_ is only used in *test*
+	updateCalendarCount_++;
+
+	size_t theSize = suiteVec_.size();
+	for(size_t s = 0; s < theSize; s++) {
+		suiteVec_[s]->updateCalendar( calUpdateParams, auto_cancelled_nodes);
+	}
+
+	// Permanently remove any auto-cancelled nodes.
+ 	if ( !auto_cancelled_nodes.empty() ) {
+ 		std::vector<node_ptr>::iterator theNodeEnd = auto_cancelled_nodes.end();
+ 		string msg;
+ 		for(std::vector<node_ptr>::iterator n = auto_cancelled_nodes.begin(); n != theNodeEnd; ++n) {
+ 		   msg.clear(); msg = "autocancel "; msg += (*n)->debugNodePath();
+ 			ecf::log(Log::MSG,msg);
+ 			(*n)->remove();
+  		}
+ 	}
+}
+
+
+void Defs::absorb(Defs* input_defs, bool force)
+{
+	// Dont absorb myself.
+	if (input_defs == this) {
+		return;
+	}
+
+	// updateCalendarCount_ is *only* used in test, reset whenever a new defs is loaded
+	updateCalendarCount_ = 0;
+
+	// We must make a copy, otherwise we are iterating over a vector that is being deleted
+	std::vector<suite_ptr> suiteVecCopy = input_defs->suiteVec();
+	size_t theSize = suiteVecCopy.size();
+	for(size_t s = 0; s < theSize; s++) {
+
+		/// regardless remove the suite from the input defs
+		suite_ptr the_input_suite = input_defs->removeSuite(suiteVecCopy[s]);
+
+		if (force) {
+			/// The suite of the same name exists. remove it from *existing* defs
+		   suite_ptr existing_suite = findSuite( the_input_suite->name() );
+		   if (existing_suite.get()) {
+ 				removeSuite( existing_suite );
+ 			}
+		}
+
+		/// Add the suite. Will throw if suite of same name already exists.
+		/// This stops accidental overwrite
+		addSuite( the_input_suite  );
+	}
+  	LOG_ASSERT( input_defs->suiteVec().empty(),"Defs::absorb");
+
+  	// Copy over server user variables
+   set_server().add_or_update_user_variables( input_defs->server().user_variables() );
+
+  	// This only works on the client side. since server does not store externs
+  	const set<string>& ex = input_defs->externs();
+  	for(set<string>::const_iterator i = ex.begin(); i != ex.end(); ++i) {
+  	   add_extern(*i);
+  	}
+}
+
+void Defs::accept(ecf::NodeTreeVisitor& v)
+{
+	v.visitDefs(this);
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t i = 0; i < theSuiteVecSize; i++) { suiteVec_[i]->accept(v); }
+}
+
+void Defs::acceptVisitTraversor(ecf::NodeTreeVisitor& v)
+{
+	LOG_ASSERT(v.traverseObjectStructureViaVisitors(),"");
+	v.visitDefs(this);
+}
+
+bool Defs::verification(std::string& errorMsg) const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t i = 0; i < theSuiteVecSize; i++) { suiteVec_[i]->verification(errorMsg); }
+	return errorMsg.empty();
+}
+
+suite_ptr Defs::add_suite(const std::string& name)
+{
+   if (findSuite(name).get()) {
+      std::stringstream ss;
+      ss << "Add Suite failed: A Suite of name '" << name << "' already exist";
+      throw std::runtime_error( ss.str() );
+   }
+   suite_ptr the_suite = Suite::create(name);
+   add_suite_only( the_suite , std::numeric_limits<std::size_t>::max());
+   return the_suite;
+}
+
+void Defs::addSuite(suite_ptr s, size_t position)
+{
+	if (findSuite(s->name()).get()) {
+ 		std::stringstream ss;
+		ss << "Add Suite failed: A Suite of name '" << s->name() << "' already exist";
+		throw std::runtime_error( ss.str() );
+	}
+	add_suite_only( s , position);
+}
+
+void Defs::add_suite_only(suite_ptr s, size_t position)
+{
+   if (s->defs()) {
+      std::stringstream ss;
+      ss << "Add Suite failed: The suite of name '" << s->name() << "' already owned by another Defs ";
+      throw std::runtime_error( ss.str() );
+   }
+
+   s->set_defs(this);
+   if (position >= suiteVec_.size()) {
+      suiteVec_.push_back(s);
+   }
+   else {
+      suiteVec_.insert( suiteVec_.begin() + position, s);
+   }
+   Ecf::incr_modify_change_no();
+   client_suite_mgr_.suite_added_in_defs(s);
+}
+
+suite_ptr Defs::removeSuite(suite_ptr s)
+{
+	std::vector<suite_ptr>::iterator i = std::find(suiteVec_.begin(), suiteVec_.end(),s);
+ 	if ( i != suiteVec_.end()) {
+ 	   s->set_defs(NULL);              // allows suite to added to different defs
+		suiteVec_.erase(i);             // iterator invalidated
+	 	Ecf::incr_modify_change_no();
+	 	client_suite_mgr_.suite_deleted_in_defs(s); // must be after Ecf::incr_modify_change_no();
+		return s; // transfer ownership of suite
+	}
+
+ 	// Something serious has gone wrong. Can not find the suite
+ 	cout << "Defs::removeSuite: assert failure:  suite '" << s->name() << "' suiteVec_.size() = " << suiteVec_.size() << "\n";
+	for(unsigned i = 0; i < suiteVec_.size(); ++i) { cout << i << " " << suiteVec_[i]->name() << "\n";}
+ 	LOG_ASSERT(false,"Defs::removeSuite the suite not found");
+	return suite_ptr();
+}
+
+size_t Defs::child_position(const Node* child) const
+{
+   size_t vecSize = suiteVec_.size();
+   for(size_t t = 0; t < vecSize; t++)     {
+      if (suiteVec_[t].get() == child) {
+         return t;
+      }
+   }
+   return std::numeric_limits<std::size_t>::max();
+}
+
+node_ptr Defs::removeChild(Node* child)
+{
+  	size_t vecSize = suiteVec_.size();
+ 	for(size_t t = 0; t < vecSize; t++)     {
+ 		if (suiteVec_[t].get() == child) {
+ 		 	Ecf::incr_modify_change_no();
+ 		   suiteVec_[t]->set_defs(NULL); // Must be set to NULL, allows suite to be added to different defs
+ 		 	client_suite_mgr_.suite_deleted_in_defs(suiteVec_[t]); // must be after Ecf::incr_modify_change_no();
+ 			node_ptr node = boost::dynamic_pointer_cast<Node>(suiteVec_[t]);
+ 			suiteVec_.erase( suiteVec_.begin() + t);
+ 			return node ;
+ 		}
+  	}
+
+ 	// Something has gone wrong.
+	cout << "Defs::removeChild: assert failed:  suite '" << child->name() << "' suiteVec_.size() = " << suiteVec_.size() << "\n";
+	for(unsigned i = 0; i < suiteVec_.size(); ++i) { cout << i << " " << suiteVec_[i]->name() << "\n";}
+ 	LOG_ASSERT(false,"Defs::removeChild,the suite not found");
+	return node_ptr();
+}
+
+bool Defs::addChild( node_ptr child, size_t position)
+{
+	LOG_ASSERT(child.get(),"");
+	LOG_ASSERT(child->isSuite(),"");
+
+	// *** CANT construct shared_ptr from a raw pointer, must use dynamic_pointer_cast,
+	// *** otherwise the reference counts will get messed up.
+	// If the suite of the same exists, it is deleted first
+	addSuite( boost::dynamic_pointer_cast<Suite>( child ), position );
+	return true;
+}
+
+void Defs::add_extern(const std::string& ex )
+{
+   if (ex.empty()) {
+      throw std::runtime_error("Defs::add_extern: Can not add empty extern");
+   }
+   externs_.insert(ex);
+}
+
+void Defs::auto_add_externs(bool remove_existing_externs_first)
+{
+	if (remove_existing_externs_first) {
+		externs_.clear();
+	}
+	/// Automatically add externs
+	ResolveExternsVisitor visitor(this);
+	acceptVisitTraversor(visitor);
+}
+
+void Defs::beginSuite(suite_ptr suite)
+{
+   if (!suite.get()) throw std::runtime_error( "Defs::beginSuite: Begin failed as suite is not loaded" );
+
+   if (!suite->begun()) {
+      // Hierarchical set the state. Handle case where we have children that are all defstatus complete
+      // and hence needs parent set to complete. See Simulator/good_defs/operations/naw.def
+      //	  family naw
+      //	    family general
+      //	      time 06:00
+      //	      task metgrams
+      //	        defstatus complete
+      //	      task equipot
+      //	        defstatus complete
+      //	    endfamily
+      suite->begin();
+
+      set_most_significant_state();
+   }
+   else {
+      LOG(Log::WAR,"Suite " << suite->name() << " has already begun");
+   }
+}
+
+void Defs::beginAll()
+{
+   bool at_least_one_suite_begun = false;
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) {
+	   if ( !suiteVec_[s]->begun() ) {
+	      suiteVec_[s]->begin();
+	      at_least_one_suite_begun = true;
+	   }
+	}
+
+	if ( at_least_one_suite_begun ) {
+	   set_most_significant_state();
+	}
+}
+
+void Defs::reset_begin()
+{
+   std::for_each(suiteVec_.begin(),suiteVec_.end(),boost::bind(&Suite::reset_begin,_1));
+}
+
+void Defs::requeue()
+{
+   bool edit_history_set = flag().is_set(ecf::Flag::MESSAGE);
+   flag_.reset();
+   if (edit_history_set) flag().set(ecf::Flag::MESSAGE);
+
+   int clear_suspended_in_child_nodes = 0;
+   size_t theSuiteVecSize = suiteVec_.size();
+   for(size_t s = 0; s < theSuiteVecSize; s++) {
+      suiteVec_[s]->requeue( true /* reset repeats */,
+                             clear_suspended_in_child_nodes,
+                             true /* reset_next_time_slot */);
+   }
+
+   set_most_significant_state();
+}
+
+
+void Defs::check_suite_can_begin(suite_ptr suite) const
+{
+   NState::State suiteState = suite->state();
+   if (!suite->begun() && suiteState != NState::UNKNOWN && suiteState != NState::COMPLETE) {
+      int count = 0;
+      std::vector<Task*> tasks;
+      getAllTasks(tasks);
+      std::stringstream ts;
+      for(size_t i =0; i < tasks.size(); i++) {
+         if (tasks[i]->state() == NState::ACTIVE || tasks[i]->state() == NState::SUBMITTED) {
+            ts << "   " << tasks[i]->absNodePath() << "\n";
+            count++;
+         }
+      }
+      /// allow suite to begin even its aborted provide no tasks in active or submitted states
+      if (count > 0) {
+         std::stringstream ss;
+         ss << "Begin failed as suite "
+                  << suite->name() << "(computed state=" << NState::toString(suiteState)
+         << ") can only begin if its in UNKNOWN or COMPLETE state\n";
+         ss << "Found " << count << " tasks with state 'active' or 'submitted'\n";
+         ss << ts.str();
+         ss << "Use the force argument to bypass this check, at the risk of creating zombies\n";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+}
+
+bool Defs::hasTimeDependencies() const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) {
+		if ( suiteVec_[s]->hasTimeDependencies() ) return true;
+	}
+	return false;
+}
+
+std::ostream& Defs::print(std::ostream& os) const
+{
+   os << "# " << ecf::Version::raw() << "\n";
+	if (!PrintStyle::defsStyle()) {
+	   os << write_state();
+	}
+
+	set<string>::const_iterator extern_end = externs_.end();
+	for(set<string>::const_iterator i = externs_.begin(); i != extern_end; ++i) {
+      os << "extern " << *i << "\n";
+	}
+	size_t the_size = suiteVec_.size();
+	for(size_t s = 0; s < the_size; s++) {
+	   os << *suiteVec_[s];
+	}
+	return os;
+}
+
+std::string Defs::write_state() const
+{
+   // *IMPORTANT* we *CANT* use ';' character, since is used in the parser, when we have
+   //             multiple statement on a single line i.e.
+   //                 task a; task b;
+   // *IMPORTANT* make sure name are unique, i.e can't have state: and server_state:
+   // Otherwise read_state() will mess up
+   std::stringstream os;
+   os << "defs_state";
+   os << " " << PrintStyle::to_string();
+   if (state_ != NState::UNKNOWN) os << " state>:" << NState::toString(state_); // make <state> is unique
+   if (flag_.flag() != 0) os << " flag:" << flag_.to_string();
+   if (state_change_no_ != 0) os << " state_change:" << state_change_no_;
+   if (modify_change_no_ != 0) os << " modify_change:" << modify_change_no_;
+   if (server().get_state() != ServerState::default_state()) os << " server_state:" << SState::to_string(server().get_state());
+   os << "\n";
+
+   // This read by the DefsStateParser
+   const std::vector<Variable>& theServerEnv = server().user_variables();
+   for(size_t i = 0; i < theServerEnv.size(); ++i) {
+      theServerEnv[i].print(os);
+   }
+
+   // READ by Defs::read_history()
+   // We need to define a separator for the message, will to allow it to be re-read
+   // This separator can not be :
+   // ' ' space, used in the messages
+   // %  Used in job submission
+   // :  Used in time, and name (:ma0)
+   // [] Used in time
+   // integers used in the time.
+   // -  Used in commands
+   if (PrintStyle::getStyle() == PrintStyle::MIGRATE || save_edit_history_) {
+	   Indentor in;
+	   std::map<std::string, std::deque<std::string> >::const_iterator i;
+	   for(i=edit_history_.begin(); i != edit_history_.end(); ++i) {
+		   Indentor::indent( os ) << "history " << (*i).first << " ";// node path
+		   const std::deque<std::string>& vec = (*i).second;   // list of requests
+		   for(std::deque<std::string>::const_iterator c = vec.begin(); c != vec.end(); ++c) {
+
+		      // We expect to output a single newline, hence if there are additional new lines
+		      // It can mess  up, re-parse. i.e during alter change label/value, user could have added newlines
+	         if ((*c).find("\n") == std::string::npos)  os << "\b" << *c;
+	         else {
+	            std::string h = *c;
+	            Str::replaceall(h,"\n","\\n");
+	            os << "\b" << h;
+	         }
+		   }
+		   os << "\n";
+	   }
+	   save_edit_history_ = false;
+   }
+   return os.str();
+}
+
+void Defs::read_state(const std::string& line,const std::vector<std::string>& lineTokens)
+{
+//   cout << "line = " << line << "\n";
+   std::string token;
+   for(size_t i = 2; i < lineTokens.size(); i++) {
+      token.clear();
+      if (lineTokens[i].find("state>:") != std::string::npos) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Defs::read_state: state extraction failed : " + lineTokens[i] );
+         if (!NState::isValid(token)) throw std::runtime_error( "Defs::read_state: invalid state specified : " + token );
+         set_state_only(NState::toState(token));
+      }
+      else if (lineTokens[i].find("flag:") != std::string::npos) {
+         if (!Extract::split_get_second(lineTokens[i],token))throw std::runtime_error( "Defs::read_state: Invalid flag specified : " + line );
+         flag().set_flag(token); // this can throw
+      }
+      else if (lineTokens[i].find("state_change:") != std::string::npos) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Defs::read_state: Invalid state_change specified : " + line );
+         int sc = Extract::theInt(token,"Defs::read_state: invalid state_change specified : " + line);
+         set_state_change_no(sc);
+      }
+      else if (lineTokens[i].find("modify_change:") != std::string::npos) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Defs::read_state: Invalid modify_change specified : " + line );
+         int mc = Extract::theInt(token,"Defs::read_state: invalid state_change specified : " + line);
+         set_modify_change_no(mc);
+      }
+      else if (lineTokens[i].find("server_state:") != std::string::npos) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Defs::read_state: Invalid server_state specified : " + line );
+         if (!SState::isValid(token)) throw std::runtime_error( "Defs::read_state: Invalid server_state specified : " + line );
+         set_server().set_state(SState::toState(token));
+      }
+   }
+}
+
+void Defs::read_history(const std::string& line,const std::vector<std::string>& lineTokens)
+{
+   // expect:
+   // history <node_path> \bmsg1\bmsg2
+   // The message can contain spaces,
+   // Multiple spaces will be lost !!
+   if ( lineTokens.size() < 2 ) throw std::runtime_error( "Defs::read_history: Invalid history " + line );
+
+   DefsHistoryParser parser;
+   parser.parse(line);
+
+   const std::vector<std::string>& parsed_messages =  parser.parsed_messages();
+   for(size_t i = 0; i < parsed_messages.size(); i++) {
+      add_edit_history(lineTokens[1],parsed_messages[i]);
+   }
+}
+
+bool Defs::compare_edit_history(const Defs& rhs) const
+{
+   if (edit_history_ != rhs.edit_history_) return false;
+   return true;
+}
+
+
+bool Defs::operator==(const Defs& rhs) const
+{
+	if ( state() != rhs.state()) {
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "Defs::operator==  state(" << NState::toString(state()) << ") != rhs.state(" << NState::toString(rhs.state()) << ")) \n";
+		}
+#endif
+ 		return false;
+	}
+
+	if ( server_ != rhs.server() ) {
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "Defs::operator== server_ != rhs.server())\n";
+		}
+#endif
+ 		return false;
+	}
+
+   if ( flag_ != rhs.flag_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Defs::operator== ( flag_ != rhs.flag_) : '" << flag_.to_string() << "' != '" << rhs.flag_.to_string() << "'\n";
+      }
+#endif
+      return false;
+   }
+
+	/// Note:: WE specifically exclude testing of externs.
+	/// Externs are not persisted, hence can not take part in comparison
+	/// Externs only live on the client side.
+
+	if ( suiteVec_.size() != rhs.suiteVec_.size()) {
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "Defs::operator==    suiteVec_.size(" << suiteVec_.size() << ") != rhs.suiteVec_.size( " << rhs.suiteVec_.size() << ") \n";
+		}
+#endif
+ 		return false;
+	}
+	for(unsigned i =0; i < suiteVec_.size(); ++i) {
+		if ( !( *(suiteVec_[i]) == *(rhs.suiteVec_[i]) )) {
+#ifdef DEBUG
+			if (Ecf::debug_equality()) {
+				std::cout << "Defs::operator==    !( *(suiteVec_[i]) == *(rhs.suiteVec_[i]) )\n";
+			}
+#endif
+			return false;
+		}
+	}
+ 	return true;
+}
+
+node_ptr Defs::findAbsNode(const std::string& pathToNode) const
+{
+//	std::cout << "Defs::findAbsNode " << pathToNode << "\n";
+ 	// The pathToNode is of the form:
+	//     /suite
+ 	//     /suite/family
+ 	//     /suite/family/task
+ 	//     /suite/family/family/family/task
+
+ 	std::vector<std::string> theNodeNames; theNodeNames.reserve(4);
+ 	NodePath::split(pathToNode,theNodeNames);
+	if ( theNodeNames.empty() ) {
+		return node_ptr();
+	}
+
+
+	size_t child_pos = 0 ; // unused
+   size_t pathSize = theNodeNames.size();
+   size_t theSuiteVecSize = suiteVec_.size();
+   for(size_t s = 0; s < theSuiteVecSize; s++)  {
+
+      size_t index = 0;
+      if (theNodeNames[index] == suiteVec_[s]->name()) {
+
+         node_ptr the_node = suiteVec_[s];
+         if (pathSize == 1) return the_node;
+         index++; // skip over suite,
+
+         while (index < pathSize) {
+            the_node = the_node->findImmediateChild(theNodeNames[index],child_pos);
+            if (the_node) {
+               if (index == pathSize - 1) return the_node;
+               index++;
+            }
+            else {
+               return node_ptr();
+            }
+         }
+         return node_ptr();
+      }
+	}
+
+ 	return node_ptr();
+}
+
+node_ptr Defs::find_closest_matching_node(const std::string& pathToNode) const
+{
+	std::vector<std::string> theNodeNames;
+ 	NodePath::split(pathToNode,theNodeNames);
+	if ( theNodeNames.empty() )  return node_ptr();
+
+	node_ptr closest_matching_node;
+	int index = 0;
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++)  {
+		suiteVec_[s]->find_closest_matching_node(theNodeNames,index,closest_matching_node);
+		if (closest_matching_node.get()) return closest_matching_node;
+	}
+ 	return node_ptr();
+}
+
+
+bool Defs::find_extern( const std::string& pathToNode , const std::string& node_attr_name ) const
+{
+   if (externs_.empty()) {
+      return false;
+   }
+
+   if (node_attr_name.empty()) {
+      if (externs_.find(pathToNode) != externs_.end()) {
+         return true;
+      }
+      return false;
+   }
+
+   std::string extern_path = pathToNode;
+   extern_path += Str::COLON();
+   extern_path += node_attr_name;
+
+   if (externs_.find(extern_path) != externs_.end()) {
+      return true;
+   }
+   return false;
+}
+
+
+suite_ptr Defs::findSuite(const std::string& name) const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) {
+		if (suiteVec_[s]->name() == name) {
+			return suiteVec_[s];
+		}
+ 	}
+	return suite_ptr();
+}
+
+bool Defs::check(std::string& errorMsg,std::string& warningMsg) const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->check(errorMsg,warningMsg); }
+	return errorMsg.empty();
+}
+
+void Defs::getAllTasks(std::vector<Task*>& tasks) const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->getAllTasks(tasks);}
+}
+
+void Defs::getAllSubmittables(std::vector<Submittable*>& tasks) const
+{
+   size_t theSuiteVecSize = suiteVec_.size();
+   for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->getAllSubmittables(tasks);}
+}
+
+void Defs::get_all_active_submittables(std::vector<Submittable*>& tasks) const
+{
+   size_t theSuiteVecSize = suiteVec_.size();
+   for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->get_all_active_submittables(tasks);}
+}
+
+void Defs::get_all_tasks(std::vector<task_ptr>& tasks) const
+{
+   size_t theSuiteVecSize = suiteVec_.size();
+   for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->get_all_tasks(tasks);}
+}
+
+void Defs::get_all_nodes(std::vector<node_ptr>& nodes) const
+{
+   size_t theSuiteVecSize = suiteVec_.size();
+   for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->get_all_nodes(nodes);}
+}
+
+void Defs::get_all_aliases(std::vector<alias_ptr>& aliases) const
+{
+   size_t theSuiteVecSize = suiteVec_.size();
+   for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->get_all_aliases(aliases);}
+}
+
+void Defs::getAllFamilies(std::vector<Family*>& vec) const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->getAllFamilies(vec);}
+}
+
+void Defs::getAllNodes(std::vector<Node*>& vec) const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+   vec.reserve(vec.size() + theSuiteVecSize);
+	for(size_t s = 0; s < theSuiteVecSize; s++) {
+	   vec.push_back(suiteVec_[s].get());
+	   suiteVec_[s]->getAllNodes(vec);
+	}
+}
+
+void Defs::getAllAstNodes(std::set<Node*>& theSet) const
+{
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->getAllAstNodes(theSet);}
+}
+
+bool Defs::deleteChild(Node* nodeToBeDeleted)
+{
+  	Node* parent = nodeToBeDeleted->parent();
+  	if (parent)  return parent->doDeleteChild(nodeToBeDeleted);
+ 	return doDeleteChild(nodeToBeDeleted);
+}
+
+bool Defs::doDeleteChild(Node* nodeToBeDeleted)
+{
+//	std::cout << "Defs::doDeleteChild nodeToBeDeleted   = " << nodeToBeDeleted->debugNodePath() << "\n";
+
+	std::vector<suite_ptr>::iterator theSuiteEnd = suiteVec_.end();
+ 	for(std::vector<suite_ptr>::iterator s = suiteVec_.begin(); s!=theSuiteEnd; ++s) {
+ 		if ( (*s).get() == nodeToBeDeleted) {
+  		 	Ecf::incr_modify_change_no();
+  		 	client_suite_mgr_.suite_deleted_in_defs(*s); // must be after Ecf::incr_modify_change_no();
+  		 	(*s)->set_defs(NULL); // Must be set to NULL, allows re-added to a different defs
+  			suiteVec_.erase(s);
+  			set_most_significant_state(); // must be after suiteVec_.erase(s);
+  			return true;
+ 		}
+ 	}
+
+ 	// recurse down only if we did not remove the suite
+ 	for(std::vector<suite_ptr>::iterator s = suiteVec_.begin(); s!=theSuiteEnd; ++s) {
+ 		// SuiteChanged is called within doDeleteChild
+ 		if ((*s)->doDeleteChild(nodeToBeDeleted)) {
+ 			return true;
+ 		}
+ 	}
+	return false;
+}
+
+bool Defs::replaceChild(const std::string& path,
+	               const defs_ptr& clientDefs,
+	               bool createNodesAsNeeded,
+	               bool force,
+	               std::string& errorMsg)
+{
+	node_ptr clientNode =  clientDefs->findAbsNode( path );
+	if (! clientNode.get() ) {
+		errorMsg = "Can not replace node since path "; errorMsg += path;
+		errorMsg += " does not exist on the client definition";
+		return false;
+	}
+
+	node_ptr serverNode = findAbsNode( path ) ;
+	if (!force && serverNode.get()) {
+		// Check if serverNode has child tasks in submitted or active states
+		vector<Task*> taskVec;
+		serverNode->getAllTasks(taskVec); // taskVec will be empty if serverNode is a task
+ 		int count = 0;
+		BOOST_FOREACH(Task* t, taskVec) { if (t->state() == NState::ACTIVE || t->state() == NState::SUBMITTED)  count++;}
+		if (count != 0) {
+			std::stringstream ss;
+			ss << "Can not replace node " << serverNode->debugNodePath() << " because it has " << count << " tasks which are active or submitted\n";
+			ss << "Please use the 'force' option to bypass this check, at the expense of creating zombies\n";
+			errorMsg += ss.str();
+			return false;
+ 		}
+	}
+
+	/// REPLACE ===========================================================
+ 	if (!createNodesAsNeeded || serverNode.get()) {
+		// Then the child must exist in the server defs (i.e. this)
+		if (! serverNode.get() ) {
+			errorMsg = "Can not replace child since path "; errorMsg += path;
+			errorMsg += " does not exist on the server definition. Please use <parent> option";
+			return false;
+		}
+		// HAVE a FULL match in the server
+
+		// Copy over begun and suspended states
+ 		if (serverNode->suite()->begun())  clientNode->begin();
+ 		if (serverNode->isSuspended())     clientNode->suspend();
+
+ 		// Find the position of the server node relative to its peers
+ 		// We use this to re-add client node at the same position
+ 		size_t child_pos = serverNode->position();
+
+ 		// Delete node on the server, Must recurse down
+		Node* parentNodeOnServer = serverNode->parent();
+		deleteChild(serverNode.get());
+
+		// Remove reference in the client defs to clientNode and detach from its parent
+		// transfer ownership to the server
+		bool addOk = false;
+		node_ptr client_node_to_add = clientNode->remove();
+	 	if ( parentNodeOnServer ) addOk = parentNodeOnServer->addChild( client_node_to_add , child_pos);
+		else                      addOk = addChild( client_node_to_add , child_pos);
+	 	LOG_ASSERT(addOk,"");
+
+	 	client_node_to_add->set_most_significant_state_up_node_tree();
+
+	 	// The changes have been made, do a sanity test, check trigger expressions
+	 	std::string warning_msg;
+	 	return client_node_to_add->suite()->check(errorMsg,warning_msg);
+ 	}
+
+
+ 	// ADD ======================================================================
+	// Create/Add nodes as needed for a *PARTIAL* match
+	// If the path is /a/b/c/d/e/f it may be that path /a/b already exists
+	// hence we need only create the missing nodes   c, d, e, f
+	LOG_ASSERT( serverNode == NULL, "" );
+	node_ptr server_parent;
+	Node* last_client_child = clientNode.get(); // remember the last child
+ 	Node* client_parent = clientNode->parent();
+	while (client_parent) {
+	   server_parent = findAbsNode( client_parent->absNodePath() );
+      if (server_parent ) {
+         break;
+      }
+      last_client_child = client_parent;
+      client_parent = client_parent->parent();
+	}
+	if (server_parent.get() == NULL) {
+		// NOT EVEN A PARTIAL path match, hence move over WHOLE suite, detach from client and add to server
+      node_ptr client_suite_to_add = clientNode->suite()->remove();
+ 		bool addOk = addChild( client_suite_to_add  );
+ 		LOG_ASSERT( addOk ,"");
+ 		client_suite_to_add->set_most_significant_state_up_node_tree();
+
+      // The changes have been made, do a sanity test, check trigger expressions
+ 	   std::string warning_msg;
+ 	   return client_suite_to_add->suite()->check(errorMsg,warning_msg);
+	}
+
+
+	// PARTIAL PATH MATCH,
+   LOG_ASSERT( last_client_child ,"");
+   LOG_ASSERT( client_parent ,"");
+   LOG_ASSERT( last_client_child->parent() == client_parent ,"");
+	LOG_ASSERT( client_parent->absNodePath() == server_parent->absNodePath() ,"");
+
+	/// If the child of same name exist we *replace* at the same position otherwise we *add* it to the end
+	size_t client_child_pos = last_client_child->position();
+
+	size_t server_child_pos; // will be set to  std::numeric_limits<std::size_t>::max(), if child not found
+	node_ptr server_child = server_parent->findImmediateChild(last_client_child->name(),server_child_pos);
+	if (server_child.get()) {
+
+	   // Copy over suspended state
+	   if (server_child->isSuspended()) {
+	      last_client_child->suspend();
+	   }
+
+	   // Child of same name exist on the server, hence remove it
+	   deleteChild(server_child.get());
+	}
+
+	/// copy over begin/queued status
+	if (server_parent->suite()->begun())  {
+	   last_client_child->begin();
+	}
+
+	node_ptr client_node_to_add = last_client_child->remove();
+	bool addOk = server_parent->addChild( client_node_to_add , client_child_pos);
+	LOG_ASSERT( addOk,"" );
+	client_node_to_add->set_most_significant_state_up_node_tree();
+
+   // The changes have been made, do a sanity test, check trigger expressions
+	std::string warning_msg;
+	return client_node_to_add->suite()->check(errorMsg,warning_msg);
+}
+
+void Defs::save_as_checkpt(const std::string& the_fileName,ecf::Archive::Type at) const
+{
+   // only_save_edit_history_when_check_pointing or if explicitly requested
+   save_edit_history_ = true;   // this is reset after edit_history is saved
+
+	/// Can throw archive exception
+ 	ecf::save(the_fileName,*this,at);
+}
+
+void Defs::save_checkpt_as_string(std::string& output) const
+{
+   // only_save_edit_history_when_check_pointing or if explicitly requested
+   save_edit_history_ = true;   // this is reset after edit_history is saved
+
+   ecf::save_as_string(output,*this);
+}
+
+void Defs::restore_from_checkpt(const std::string& the_fileName,ecf::Archive::Type at)
+{
+//	cout << "Defs::restore_from_checkpt " << the_fileName << "\n";
+
+	if (the_fileName.empty())  return;
+
+	// deleting existing content first. *** Note: Server environment left as is ****
+	clear();
+
+	ecf::restore(the_fileName, (*this), at);
+
+	// Reset the state and modify numbers, **After the restore**
+   state_change_no_ = Ecf::state_change_no();
+   modify_change_no_ = Ecf::modify_change_no();
+
+//	cout << "Restored: " << suiteVec_.size() << " suites\n";
+}
+
+void Defs::clear()
+{
+   // Duplicate AST are held in a static map.
+   ExprDuplicate reclaim_cloned_ast_memory;
+
+   // *** Note: Server environment left as is ****
+   suiteVec_.clear();
+   externs_.clear();
+   client_suite_mgr_.clear();
+   state_.setState(NState::UNKNOWN);
+   edit_history_.clear();
+   save_edit_history_ = false;
+   Ecf::incr_modify_change_no();
+}
+
+bool Defs::checkInvariants(std::string& errorMsg) const
+{
+	size_t vecSize = suiteVec_.size();
+	for(size_t s = 0; s < vecSize; s++) {
+		if (suiteVec_[s]->defs() != this) {
+		   std::stringstream ss;
+		   ss << "Defs::checkInvariants suite->defs() function not correct. Child suite parent ptr not correct\n";
+		   ss << "For suite " << suiteVec_[s]->name();
+			errorMsg += ss.str();
+			return false;
+		}
+		if (!suiteVec_[s]->checkInvariants(errorMsg)) {
+			return false;
+		}
+ 	}
+
+   if (Ecf::server()) {
+      /// The change no should NOT be greater than Ecf::state_change_no()
+
+      if (state_change_no_ > Ecf::state_change_no() ) {
+         std::stringstream ss;
+         ss << "Defs::checkInvariants: state_change_no(" << state_.state_change_no() << ") > Ecf::state_change_no(" << Ecf::state_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+      if (modify_change_no_ > Ecf::modify_change_no() ) {
+         std::stringstream ss;
+         ss << "Defs::checkInvariants: modify_change_no_(" << modify_change_no_ << ") > Ecf::modify_change_no(" << Ecf::modify_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+
+      if (flag_.state_change_no() > Ecf::state_change_no() ) {
+         std::stringstream ss;
+         ss << "Defs::checkInvariants: flag.state_change_no()(" << flag_.state_change_no() << ") > Ecf::state_change_no(" << Ecf::state_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+
+
+      if (state_.state_change_no() > Ecf::state_change_no() ) {
+         std::stringstream ss;
+         ss << "Defs::checkInvariants: state_.state_change_no()(" << state_.state_change_no() << ") > Ecf::state_change_no(" << Ecf::state_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+
+      if (server_.state_change_no() > Ecf::state_change_no() ) {
+         std::stringstream ss;
+         ss << "Defs::checkInvariants: server_.state_change_no()(" << server_.state_change_no() << ") > Ecf::state_change_no(" << Ecf::state_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+   }
+	return true;
+}
+
+void Defs::order(Node* immediateChild, NOrder::Order ord)
+{
+	switch (ord) {
+		case NOrder::TOP:  {
+			for(std::vector<suite_ptr>::iterator i = suiteVec_.begin(); i != suiteVec_.end(); ++i) {
+				suite_ptr s = (*i);
+				if (s.get() == immediateChild) {
+					suiteVec_.erase(i);
+					suiteVec_.insert(suiteVec_.begin(),s);
+					client_suite_mgr_.update_suite_order();
+					order_state_change_no_ = Ecf::incr_state_change_no();
+					return;
+ 				}
+			}
+         throw std::runtime_error("Defs::order: TOP, immediate child suite not found");
+		}
+		case NOrder::BOTTOM:  {
+			for(std::vector<suite_ptr>::iterator i = suiteVec_.begin(); i != suiteVec_.end(); ++i) {
+				suite_ptr s = (*i);
+				if (s.get() == immediateChild) {
+					suiteVec_.erase(i);
+					suiteVec_.push_back(s);
+               order_state_change_no_ = Ecf::incr_state_change_no();
+               client_suite_mgr_.update_suite_order();
+					return;
+ 				}
+			}
+         throw std::runtime_error("Defs::order: BOTTOM, immediate child suite not found");
+		}
+		case NOrder::ALPHA:  {
+ 			std::sort(suiteVec_.begin(),suiteVec_.end(),
+			            boost::bind(Str::caseInsLess,
+			                          boost::bind(&Node::name,_1),
+			                          boost::bind(&Node::name,_2)));
+         order_state_change_no_ = Ecf::incr_state_change_no();
+         client_suite_mgr_.update_suite_order();
+			break;
+		}
+		case NOrder::ORDER:  {
+			std::sort(suiteVec_.begin(),suiteVec_.end(),
+			            boost::bind(Str::caseInsGreater,
+			                          boost::bind(&Node::name,_1),
+			                          boost::bind(&Node::name,_2)));
+         order_state_change_no_ = Ecf::incr_state_change_no();
+         client_suite_mgr_.update_suite_order();
+			break;
+		}
+		case NOrder::UP:  {
+		   for(size_t t = 0; t  < suiteVec_.size();t++) {
+		      if ( suiteVec_[t].get() == immediateChild) {
+		         if (t != 0) {
+		            suite_ptr s =  suiteVec_[t];
+		            suiteVec_.erase(suiteVec_.begin()+t);
+		            t--;
+		            suiteVec_.insert(suiteVec_.begin()+t,s);
+		            order_state_change_no_ = Ecf::incr_state_change_no();
+		         }
+		         client_suite_mgr_.update_suite_order();
+		         return;
+		      }
+		   }
+		   throw std::runtime_error("Defs::order: UP, immediate child suite not found");
+		}
+		case NOrder::DOWN: {
+		   for(size_t t = 0; t  < suiteVec_.size();t++) {
+		      if ( suiteVec_[t].get() == immediateChild) {
+		         if (t != suiteVec_.size()-1) {
+		            suite_ptr s =  suiteVec_[t];
+		            suiteVec_.erase(suiteVec_.begin()+t);
+		            t++;
+		            suiteVec_.insert(suiteVec_.begin()+t,s);
+		            order_state_change_no_ = Ecf::incr_state_change_no();
+		         }
+               client_suite_mgr_.update_suite_order();
+		         return;
+		      }
+		   }
+         throw std::runtime_error("Defs::order: DOWN, immediate child suite not found");
+		}
+	}
+}
+
+void Defs::top_down_why(std::vector<std::string>& theReasonWhy) const
+{
+   why(theReasonWhy);
+	size_t theSuiteVecSize = suiteVec_.size();
+	for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->top_down_why(theReasonWhy);}
+}
+
+void Defs::why(std::vector<std::string>& theReasonWhy) const
+{
+   if (isSuspended()) {
+      std::string the_reason = "The server is *not* RUNNING.";
+      theReasonWhy.push_back(the_reason);
+   }
+   else if (state() != NState::QUEUED && state() != NState::ABORTED) {
+      std::stringstream ss;
+      ss << "The definition state(" << NState::toString(state()) << ") is not queued or aborted.";
+      theReasonWhy.push_back(ss.str());
+   }
+   server_.why(theReasonWhy);
+}
+
+std::string Defs::toString() const
+{
+   // Let the Client control the print style
+	std::stringstream ss;
+	ss << this;
+	return ss.str();
+}
+
+// Memento functions
+void Defs::collateChanges(unsigned int client_handle, DefsDelta& incremental_changes) const
+{
+   // Collate any small scale changes to the defs
+   collate_defs_changes_only(incremental_changes);
+
+   if (0 == client_handle) {
+      // small scale changes. Collate changes over all suites.
+      // Suite stores the maximum state change, over *all* its children, this is used by client handle mechanism
+      // and here to avoid traversing down the hierarchy.
+      // ******** We must trap all child changes under the suite. See class SuiteChanged
+      // ******** otherwise some attribute sync's will be missed
+      size_t theSuiteVecSize = suiteVec_.size();
+      for(size_t s = 0; s <  theSuiteVecSize; s++) {
+         if (suiteVec_[s]->state_change_no() > incremental_changes.client_state_change_no()  ) {
+            //   *IF* node/attribute change no > client_state_change_no
+            //   *THEN*
+            //       Create a memento, and store in incremental_changes_
+            suiteVec_[s]->collateChanges(incremental_changes);
+         }
+      }
+   }
+   else {
+
+      // small scale changes over the suites in our handle, determine what's changed,
+      // relative to each node and attributes client_state_change_no.
+      //   *IF* node/attribute change no > client_state_change_no
+      //   *THEN*
+      //       Create a memento, and store in incremental_changes_
+      client_suite_mgr_.collateChanges(client_handle,incremental_changes);
+   }
+}
+
+void Defs::collate_defs_changes_only(DefsDelta& incremental_changes) const
+{
+   // ************************************************************************************************
+   // determine if defs state changed. make sure this is in sync with defs_only_max_state_change_no()
+   // ************************************************************************************************
+   compound_memento_ptr comp;
+   if (state_.state_change_no() > incremental_changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(Str::ROOT_PATH());
+      comp->add( boost::make_shared<StateMemento>( state_.state()) );
+   }
+   if (order_state_change_no_ > incremental_changes.client_state_change_no()) {
+       if (!comp.get()) comp = boost::make_shared<CompoundMemento>(Str::ROOT_PATH());
+       std::vector<std::string> order; order.reserve(suiteVec_.size());
+       for(size_t i =0; i < suiteVec_.size(); i++)  order.push_back( suiteVec_[i]->name());
+       comp->add( boost::make_shared<OrderMemento>( order ) );
+   }
+
+   // Determine if the flag changed
+   if (flag_.state_change_no() > incremental_changes.client_state_change_no()) {
+      if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(Str::ROOT_PATH());
+      comp->add( boost::make_shared<FlagMemento>( flag_ ) );
+   }
+
+   // determine if defs server state, currently only watch server state. i.e HALTED, SHUTDOWN, RUNNING
+   if (server_.state_change_no()  > incremental_changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(Str::ROOT_PATH());
+      comp->add( boost::make_shared<ServerStateMemento>( server_.get_state() ) );
+   }
+   if (server_.variable_state_change_no()  > incremental_changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(Str::ROOT_PATH());
+      comp->add( boost::make_shared<ServerVariableMemento>( server_.user_variables() ) );
+   }
+
+   if (comp.get() ) {
+      incremental_changes.add( comp );
+   }
+}
+
+unsigned int Defs::defs_only_max_state_change_no() const
+{
+   // ************************************************************************************************
+   // make sure this is in sync with collate_defs_changes_only()
+   // ************************************************************************************************
+   unsigned int max_change_no = 0;
+   max_change_no = std::max( max_change_no, state_.state_change_no());
+   max_change_no = std::max( max_change_no, order_state_change_no_);
+   max_change_no = std::max( max_change_no, flag_.state_change_no());
+   max_change_no = std::max( max_change_no, server_.state_change_no());
+   max_change_no = std::max( max_change_no, server_.variable_state_change_no());
+   return max_change_no;
+}
+
+void Defs::set_memento(const StateMemento* memento) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Defs::set_memento(const StateMemento* memento)\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::STATE);
+	set_state( memento->state_ );
+}
+
+void Defs::set_memento( const ServerStateMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+	std::cout << "Defs::set_memento(const ServerStateMemento* memento)\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::SERVER_STATE);
+	server_.set_state( memento->state_ );
+}
+
+void Defs::set_memento( const ServerVariableMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+   std::cout << "Defs::set_memento(const ServerVariableMemento* memento)\n";
+#endif
+
+   if (server_.user_variables().size() != memento->serverEnv_.size()) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ADD_REMOVE_ATTR);
+   }
+
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::SERVER_VARIABLE);
+
+   server_.set_user_variables( memento->serverEnv_);
+}
+
+void Defs::set_memento( const OrderMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+   std::cout << "Defs::set_memento(const OrderMemento* memento)\n";
+#endif
+   // Order the suites
+
+   // Order nodeVec_ according to memento ordering
+   const std::vector<std::string>& order = memento->order_;
+
+   // NOTE: When we have handles only a small subset of the suites, are returned
+   //       Whereas order will always contain all the suites.
+   //       Hence we need to handle the case where: order.size() != suiteVec_.size()
+
+   std::vector<suite_ptr> vec; vec.reserve(suiteVec_.size());
+   size_t node_vec_size = suiteVec_.size();
+   for(size_t i = 0; i < order.size(); i++) {
+      for(size_t t = 0; t < node_vec_size; t++) {
+          if (order[i] == suiteVec_[t]->name()) {
+             vec.push_back(suiteVec_[t]);
+             break;
+          }
+       }
+   }
+   if (vec.size() !=  suiteVec_.size()) {
+       std::cout << "Defs::set_memento could not find all the names\n";
+       return;
+   }
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ORDER);
+   suiteVec_ = vec;
+}
+
+
+void Defs::set_memento( const FlagMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "Defs::set_memento(const FlagMemento* memento)\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::FLAG);
+   flag_.set_flag( memento->flag_.flag() );
+}
+
+// =====================================================================
+
+void Defs::add_edit_history(const std::string& path, const std::string& request)
+{
+   std::map<std::string, std::deque<std::string> >::iterator i = edit_history_.find(path);
+   if (i == edit_history_.end()) {
+      std::deque<std::string> vec; vec.push_back(request);
+      edit_history_.insert( std::make_pair(path,vec) );
+   }
+   else {
+      (*i).second.push_back(request);
+      if ((*i).second.size() > 20) {
+         (*i).second.pop_front();
+      }
+   }
+}
+
+const std::deque<std::string>& Defs::get_edit_history(const std::string& path) const
+{
+   std::map<std::string, std::deque<std::string> >::const_iterator i = edit_history_.find(path);
+   if (i != edit_history_.end()) {
+      return (*i).second;
+   }
+   return empty_edit_history();
+}
+
+const std::deque<std::string>& Defs::empty_edit_history()
+{
+   static std::deque<std::string> static_edit_history;
+   return static_edit_history;
+}
+
+// =====================================================================================
+
+std::ostream& operator<<(std::ostream& os, const Defs* d)
+{
+   if (d) return d->print(os);
+   return os << "DEFS == NULL\n";
+}
+std::ostream& operator<<(std::ostream& os, const Defs& d)  { return d.print(os); }
+
+// =========================================================================
+
+DefsHistoryParser::DefsHistoryParser() {
+   Log::get_log_types(log_types_);
+}
+
+void DefsHistoryParser::parse(const std::string& line)
+{
+   size_t pos = line.find("\b");
+   if (pos != std::string::npos) {
+      // keep compatibility with current way of writing history
+      std::string requests = line.substr(pos);
+      Str::split(requests,parsed_messages_,"\b");
+      return;
+   }
+
+   // fallback, split line based on looking for logType like 'MSG:[' | 'LOG:['
+   string::size_type first = find_log(line,0);
+   if (first == std::string::npos) return;
+
+   string::size_type next = find_log(line,first + 4);
+   if (next == std::string::npos ) {
+      parsed_messages_.push_back( line.substr( first ) );
+      return;
+   }
+
+   while (next != std::string::npos) {
+      parsed_messages_.push_back( line.substr( first, next - first ) );
+      first = next;
+      next = find_log(line,first + 4);
+
+      if (next == std::string::npos ) {
+         parsed_messages_.push_back( line.substr( first ) );
+         return;
+      }
+   }
+}
+
+string::size_type DefsHistoryParser::find_log(const std::string& line, string::size_type pos) const
+{
+   for(size_t i = 0; i < log_types_.size(); i++) {
+      std::string log_type = log_types_[i];
+      log_type += ":[";
+      string::size_type log_type_pos = line.find( log_type, pos );
+      if (log_type_pos != std::string::npos) {
+         return log_type_pos;
+      }
+   }
+   return std::string::npos;
+}
diff --git a/ecflow_4_0_7/ANode/src/Defs.hpp b/ecflow_4_0_7/ANode/src/Defs.hpp
new file mode 100644
index 0000000..0ab9c19
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Defs.hpp
@@ -0,0 +1,399 @@
+#ifndef DEFS_HPP_
+#define DEFS_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #165 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+// class defs: The root of the node tree. Holds all the suites:
+// Externs are not persisted, why ?:
+//   o Externs are un-resolved references to node paths in trigger expressions and inlimits
+//     These references can be dynamically generated.
+//   o Saves on network bandwidth and checkpoint file size
+//
+// Hence externs are *ONLY* used on the client side.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <ostream>
+#include <set>
+
+#include <boost/noncopyable.hpp>
+#include "boost/date_time/posix_time/posix_time_types.hpp"
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+#include <boost/serialization/deque.hpp>          // no need to include <deque>
+#include <boost/serialization/map.hpp>            // no need to include <map>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+#include <boost/serialization/shared_ptr.hpp>     // no need to include shared_ptr
+#include <boost/foreach.hpp> // used so often just placed here for convenience
+
+#include "ServerState.hpp"
+#include "ClientSuiteMgr.hpp"
+#include "NState.hpp"
+#include "NOrder.hpp"
+#include "NodeFwd.hpp"
+#include "JobCreationCtrl.hpp"
+#include "Suite.hpp"
+#include "CheckPt.hpp"
+#include "Archive.hpp"
+
+class Limit;
+namespace ecf { class NodeTreeVisitor; class CalendarUpdateParams; } // forward declare
+
+class Defs : private boost::noncopyable {
+public:
+   static defs_ptr create();
+   Defs();
+   ~Defs();
+
+   bool operator==(const Defs& rhs) const;
+   std::ostream& print(std::ostream&) const ;
+
+   /// State related functions:
+   /// Defs acts like the root node.
+   void set_state(NState::State);
+   void set_state_only(NState::State);
+   NState::State state() const;
+   void set_most_significant_state();
+
+   // The defs does not need suspend()/resume() as this is controlled by the server states
+   // The defs can not schedule jobs when HALTED or SHUTDOWN, i.e. not RUNNING, this is same as suspended
+   bool isSuspended() const { return (server().get_state() != SState::RUNNING); }
+
+   /// Python based checking
+   /// Will create a temporary variable ECF_JOB so the job generation is done to a temporary directory
+   /// For TEST ONLY. Will generated jobs from the given node path
+   /// if the no path defined will generate jobs for all tasks
+   /// Job generation here is INDEPENDENT of the dependencies
+   /// Will call begin(). this updated generated variables which are used
+   /// **during variable substitution in job generation.
+   /// Note: All Tasks that fail to create jobs are returned in jobCtrl
+   /// This is because some Tasks are dummy, they have no associated ecf.
+   /// since they will never be run. This can be determined if they have
+   /// trigger expression like "1 == 0"
+   void check_job_creation( job_creation_ctrl_ptr jobCtrl);
+
+    /// Automatically generated '.ecf' scripts for this definition
+    /// It uses the contents of the definition to parameterise what gets
+    /// generated, and the location of the files. Will throw std::runtime_error for errors
+    /// Assumes: ECF_HOME specified and accessible for all Tasks, otherwise std::runtime_error is raised
+    /// If ECF_FILES is specified, then scripts are generated under this directory
+    /// otherwise ECF_HOME is used. The missing directories are automatically added.
+    /// IF ECF_INCLUDE must be specified.The head.h and tail.h includes will
+    /// use angle brackets, i.e %include <head.h>.
+    /// If ECF_CLIENT_EXE_PATH variable is added, child command will use this, otherwise
+    /// will use ecflow_client, and assume this accessible on the path.
+    /// Will not generated scripts for tasks with ECF_DUMMY_TASK specified.
+   void generate_scripts() const;
+
+   /// Update calendar and time dependent variables. This must be called by the polling mechanism,
+   /// This will *ONLY* have an effect after begin() command has been called
+   ///
+   /// Some suites can elect to ignore calendar updates when the server is not running
+   /// This allows normal and relative time dependencies to be honoured, even if the
+   /// server is started/stopped many times.
+   /// Updating the calendar can lead to state changes in the server. i.e when time related
+   /// dependencies are free'd
+   void updateCalendar( const ecf::CalendarUpdateParams &);
+
+   /// returns the number of times the calendar has been updated. For DEBUG
+   unsigned int updateCalendarCount() const { return updateCalendarCount_;}
+
+   // Implements visitor pattern
+   void accept(ecf::NodeTreeVisitor&); // Node Tree structure does the traversal
+   void acceptVisitTraversor(ecf::NodeTreeVisitor& v); // visitor does traversal
+
+   /// Moves all the data from input defs into this definition. By default
+   /// suite of the same name, are left alone, unless the force option is used.
+   /// i.e with force any suites of the same name will overwrite the suite of
+   /// the same name in this definition.
+   /// externs and server user variables are appended to.
+   /// The input defs will be left with NO suites
+   void absorb(Defs*, bool force);
+
+   std::string name() const { return "/";} /* ABO */
+
+   /// Add a suite to the definition, will throw std::runtime_error if duplicate
+   suite_ptr add_suite(const std::string& name);
+   void addSuite(suite_ptr,size_t position = std::numeric_limits<std::size_t>::max());
+   size_t child_position(const Node*) const;
+
+   /// Externs refer to Nodes or, variable, events, meter, repeat, or generated variable
+   /// not currently defined. If the object(variable, event,meter, repeat, or generate variable name)
+   /// is empty the path can refer to a Task, Family of Suite
+   /// extern can have absolute and relative paths
+   /// Typically used in a trigger or complete expression
+   /// Path can be off the form:
+   ///  extern /suite/family
+   ///  extern /suite/family:repeat_name
+   ///  extern ../family:repeat_name
+   void add_extern(const std::string& nodePath );
+
+   /// Scan the trigger and complete expressions, and automatically add extern's
+   /// i.e where the node paths, and references, to event, meters, edit and repeat variables,
+   /// don't exist, in this defs.
+   void auto_add_externs(bool remove_existing_externs_first = true);
+
+
+   /// Flag the chosen suite, so that it can resolve dependencies. This also
+   /// changes the state of all children to QUEUED/defstatus and initialise the node attributes
+   /// Once a suite is begun, it stays in that state
+   void beginSuite(suite_ptr);
+
+   /// Enables all suites to resolve dependencies
+   /// Once a suite is begun, it stays in that state
+   void beginAll();
+
+   /// Reset the begin state. **** ONLY to be used for test ********
+   void reset_begin();
+
+   /// throws runtime_error if suite cant begin
+   void check_suite_can_begin(suite_ptr) const;
+
+   /// Will requeue all suites. Current used in test only
+   void requeue();
+
+   /// returns true if defs has cron,time,day,date or today time dependencies
+   bool hasTimeDependencies() const;
+
+   /// This function is called when ALL definition has been parsed successfully
+   /// Client Side:: The client side has externs, hence any references to node paths
+   ///               in the triggers expression, that are un-resolved and not in
+   ///               the extern;s are reported as errors/warnings
+   ///               Likewise for inlimit references to Limits
+   /// Server Side:: There are no externs hence, check will report all unresolved
+   ///               references as errors.
+   /// Note the AST will be demand loaded in the server. Since they are not persisted.
+   /// we will also resolve inLimit references to Limits. Note inlimit may also
+   /// reference paths, which are externs::
+   // ****** Spirit based AST construction is very expensive  ********
+   // ****** Need to replace at some point in future          ********
+   bool check(std::string& errorMsg,std::string& warningMsg) const;
+
+   /// Assumes input argument is of the form /suite/family/task, /suite/family/family/task
+   node_ptr findAbsNode(const std::string& pathToNode) const;
+   bool find_extern( const std::string& pathToNode,const std::string& node_attr_name) const;
+   suite_ptr findSuite(const std::string& name) const;
+   const std::vector<suite_ptr>& suiteVec() const { return suiteVec_;}
+
+   /// Given a path, /suite/family/task, find node which is the closest
+   node_ptr find_closest_matching_node(const std::string& pathToNode) const;
+
+   void getAllFamilies(std::vector<Family*>&) const;
+   void getAllNodes(std::vector<Node*>&) const;
+   void getAllTasks(std::vector<Task*>&) const;
+   void getAllSubmittables(std::vector<Submittable*>&) const;
+   void get_all_active_submittables(std::vector<Submittable*>&) const;
+   void get_all_nodes(std::vector<node_ptr>&) const;
+   void get_all_tasks(std::vector<task_ptr>&) const;
+   void get_all_aliases(std::vector<alias_ptr>&) const;
+   void getAllAstNodes(std::set<Node*>&) const;
+   const std::set<std::string>& externs() const { return externs_; }
+
+   /// Get/set for server state.
+   const ServerState& server() const { return server_;}
+   ServerState& set_server() { return server_;}
+
+   /// find all %VAR% and replaces with variable values, returns false on the
+   /// first variable that can't be found, cmd will be left half processed.
+   /// Will search for ECF_MICRO, if not found assumes % as the micro char
+   bool variableSubsitution(std::string& cmd) const { return server_.variableSubsitution(cmd);}
+
+   /// returns true if definition file passes its verification
+   /// If the definition file contains verify attribute, this function will check
+   /// expected number of state changes corresponds to the actual number of state changes
+   bool verification(std::string& errorMsg) const;
+
+   /// generic way of deleting a Node.
+   /// This should always succeed else something is seriously wrong
+   bool deleteChild(Node*);
+
+   /// Adopt the child specified by 'path' from the clientDef.
+   /// If node at path already exists in this instance, it is replaced.
+   /// if  createNodesAsNeeded = false,  then the path must exist on this defs
+   /// otherwise an error message is issued.
+   /// if  createNodesAsNeeded = true, and the path does not exist on this defs
+   /// then the missing path nodes are created.
+   /// In both the client and this defs the trigger references and cleared first.
+   bool replaceChild(const std::string& path,
+            const defs_ptr& clientDef,
+            bool createNodesAsNeeded,
+            bool force,
+            std::string& errormsg);
+
+   // Order the suite
+   void order(Node* immediateChild, NOrder::Order);
+
+   /// determines why the node is not running.
+   void top_down_why(std::vector<std::string>& theReasonWhy) const;
+   void why(std::vector<std::string>& theReasonWhy) const;
+
+   /// Function to save the defs as a checkpoint file. File saved to the file name
+   /// Can throw exception
+   void save_as_checkpt(const std::string& fileName,ecf::Archive::Type = ecf::Archive::default_archive()) const;
+   void save_checkpt_as_string(std::string& check_pt) const;
+
+   /// Function to restore the defs from a check point file.
+   /// If the Defs file has content, this is deleted first, i.e. suites, externs,
+   /// Can throw an exception
+   void restore_from_checkpt(const std::string& fileName,ecf::Archive::Type = ecf::Archive::default_archive());
+
+   /// Delete suites, externs, client handles, reset suspended, and locate state
+   /// etc but Server environment left as is:
+   void clear();
+
+   ecf::Flag&       flag()           { return flag_;}
+   const ecf::Flag& get_flag() const { return flag_;}
+
+   void add_edit_history(const std::string& path, const std::string& request);
+   const std::deque<std::string>& get_edit_history(const std::string& path) const;
+   void save_edit_history(bool f) const { save_edit_history_ = f ;}
+   static const std::deque<std::string>& empty_edit_history();
+
+   /// Memento functions:
+   void collateChanges(unsigned int client_handle,DefsDelta&) const;
+   void set_memento(const StateMemento* );
+   void set_memento(const ServerStateMemento* );
+   void set_memento(const ServerVariableMemento* );
+   void set_memento(const OrderMemento* );
+   void set_memento(const FlagMemento* );
+
+   /// Find the max state change number for defs only. This includes:
+   ///   o the Defs state.
+   ///   o the Defs suspend state
+   ///   o the Defs server state.
+   unsigned int defs_only_max_state_change_no() const;
+
+   /// Change functions, used for *transferring* change number, from server to client
+   void set_state_change_no( unsigned int x )  { state_change_no_ = x;}
+   unsigned int state_change_no() const        { return state_change_no_; }
+   void set_modify_change_no( unsigned int x ) { modify_change_no_ = x;}
+   unsigned int modify_change_no() const       { return modify_change_no_; }
+
+   ClientSuiteMgr& client_suite_mgr() { return client_suite_mgr_;}
+
+   // Provided for python interface
+   std::string toString() const;
+
+   // Will recurse down.
+   bool doDeleteChild(Node* nodeToBeDeleted);
+
+   bool checkInvariants(std::string& errorMsg) const;
+
+   void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
+   void read_history(const std::string& line,const std::vector<std::string>& lineTokens);
+   bool compare_edit_history(const Defs&) const;
+private:
+   void do_generate_scripts( const std::map<std::string,std::string>& override) const;
+   std::string write_state() const;
+   void collate_defs_changes_only(DefsDelta&) const;
+   void setupDefaultEnv();
+   void add_suite_only(suite_ptr, size_t position);
+
+   /// Removes the suite, from defs returned as auto_ptr, asserts if suite does not exist
+   suite_ptr removeSuite(suite_ptr);
+   node_ptr removeChild(Node*);
+   bool addChild( node_ptr, size_t position = std::numeric_limits<std::size_t>::max());
+   friend class Node;
+
+   /// For use by python interface,
+   std::vector<suite_ptr>::const_iterator suite_begin() const { return suiteVec_.begin();}
+   std::vector<suite_ptr>::const_iterator suite_end() const { return suiteVec_.end();}
+   std::set<std::string>::const_iterator extern_begin() const { return externs_.begin();}
+   std::set<std::string>::const_iterator extern_end() const { return externs_.end();}
+   std::vector<Variable>::const_iterator user_variables_begin() const { return server_.user_variables().begin();}
+   std::vector<Variable>::const_iterator user_variables_end() const   { return server_.user_variables().end();}
+   std::vector<Variable>::const_iterator server_variables_begin() const { return server_.server_variables().begin();}
+   std::vector<Variable>::const_iterator server_variables_end() const   { return server_.server_variables().end();}
+
+   friend void export_Defs();
+
+private:
+   /// Note: restoring form a check point file will reset, defs state and modify numbers
+   unsigned int    state_change_no_;            // persisted since passed to client, however side effect, is it will be in checkpoint file
+   unsigned int    modify_change_no_;           // persisted since passed to client, however side effect, is it will be in checkpoint file
+   unsigned int    updateCalendarCount_;
+   unsigned int    order_state_change_no_;      // *NOT* persisted
+   NState          state_;                      // state & change_no, i,e attribute changed
+   ServerState     server_;
+   std::vector<suite_ptr> suiteVec_;
+   std::map<std::string, std::deque<std::string> > edit_history_;      // path,request
+   mutable bool                                    save_edit_history_; // NOT persisted
+   ecf::Flag                    flag_;
+
+   ClientSuiteMgr client_suite_mgr_;                    // NOT persisted
+
+   /// Externs are *NEVER* loaded in the server, since they can be computed and
+   /// save on network band with, and check point file size.
+   std::set<std::string> externs_;                      // NOT persisted
+
+   friend class SaveEditHistoryWhenCheckPointing;
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & state_change_no_;
+      ar & modify_change_no_;
+      ar & updateCalendarCount_;
+      ar & state_;
+      ar & server_;
+      ar & suiteVec_;
+      ar & flag_;
+
+      // only save the edit history when check pointing.
+      if (Archive::is_saving::value) {
+         if (save_edit_history_) {
+            ar & edit_history_;
+            save_edit_history_ = false; // reset
+         }
+         else {
+            std::map<std::string, std::deque<std::string> > empty_edit_history;
+            ar & empty_edit_history;
+         }
+      }
+      else {
+         ar & edit_history_;
+      }
+
+      if (Archive::is_loading::value) {
+         size_t vec_size = suiteVec_.size();
+         for(size_t i = 0; i < vec_size; i++) {
+            suiteVec_[i]->set_defs(this);
+         }
+      }
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const Defs*);
+std::ostream& operator<<(std::ostream& os, const Defs&);
+
+// =====================================================================
+// This class is used to read the History
+class DefsHistoryParser : private boost::noncopyable {
+public:
+   DefsHistoryParser();
+
+   void parse(const std::string& line);
+   const std::vector<std::string>& parsed_messages() const { return parsed_messages_;}
+
+private:
+
+   std::string::size_type find_log(const std::string& line, std::string::size_type pos) const;
+
+private:
+   std::vector<std::string> log_types_;
+   std::vector<std::string> parsed_messages_;
+};
+
+
+#endif /* DEFS_HPP_ */
diff --git a/ecflow_4_0_7/ANode/src/DefsDelta.cpp b/ecflow_4_0_7/ANode/src/DefsDelta.cpp
new file mode 100644
index 0000000..a68474e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/DefsDelta.cpp
@@ -0,0 +1,80 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/bind.hpp>
+#include "DefsDelta.hpp"
+#include "ChangeMgrSingleton.hpp"
+using namespace std;
+
+//#define DEBUG_MEMENTO 1
+
+//===============================================================
+// DefsDelta
+
+/// Defs delta can be re-used. reset all data members
+void DefsDelta::init(unsigned int client_state_change_no)
+{
+	client_state_change_no_ = client_state_change_no;
+
+	server_state_change_no_ = 0;
+	server_modify_change_no_ = 0;
+	compound_mementos_.clear();
+}
+
+
+bool DefsDelta::incremental_sync(defs_ptr client_def, std::vector<std::string>& changed_nodes) const
+{
+	if (!client_def.get()) return false;
+
+   if (ChangeMgrSingleton::exists() && ChangeMgrSingleton::instance()->in_notification()) {
+      // For debug: place a break point here: It appear as Change manager observers, has called another client to server command
+      std::cout << "ecflow:ClientInvoker::incremental_sync() called in the middle of ChangeMgrSingleton::notification.\n";
+      std::cout << "It appears that change observer have called *ANOTHER* client->server command in the middle syncronising client definition\n";
+   }
+
+   /// - Sets notification flag, so that observers can also query if they are in
+   ///   the middle of notification.
+   ChangeMgrStartNotification start_notification;
+
+	// Update the client defs with latest server *handle* based state change/modify number
+	// to keep pace with the state changes. Passed back later on, to get further changes
+	client_def->set_state_change_no( server_state_change_no_);
+	client_def->set_modify_change_no( server_modify_change_no_ );
+
+	try {
+#ifdef DEBUG_MEMENTO
+		std::cout << "DefsDelta::incremental_sync compound_mementos_.size() = " << compound_mementos_.size() << "\n";
+#endif
+		std::for_each(compound_mementos_.begin(),compound_mementos_.end(),
+		              boost::bind(&CompoundMemento::incremental_sync,_1,client_def,boost::ref(changed_nodes)));
+	}
+	catch ( std::exception& e) {
+		throw std::runtime_error("Could not apply incremental server changes to client defs, because: " + string(e.what()));
+	}
+
+	// For each compound memento, we should have change node.
+	//if ( compound_mementos_.size() != changed_nodes.size()) {
+	//   std::cout << "**** compound_mementos_.size() " << compound_mementos_.size() << "  changed_nodes.size(): " << changed_nodes.size() << "\n";
+	//}
+	// assert( compound_mementos_.size() == changed_nodes.size()); // FIXME restore for long term GUI test
+ 
+	// return true if there were any changes made
+	return !compound_mementos_.empty();
+}
+
+void DefsDelta::add(compound_memento_ptr memento)
+{
+	compound_mementos_.push_back(memento);
+}
+
diff --git a/ecflow_4_0_7/ANode/src/DefsDelta.hpp b/ecflow_4_0_7/ANode/src/DefsDelta.hpp
new file mode 100644
index 0000000..de58bd7
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/DefsDelta.hpp
@@ -0,0 +1,88 @@
+#ifndef DEFS_DELTA_HPP_
+#define DEFS_DELTA_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+// class DefsDelta: holds a list of incremental changes made in the server.
+//                  This class is created in the server, and transferred to the client
+//                  The client use it to syncronize with the server, without the need
+//                  for asking for the full defs.
+//
+// When the client request the incremental changes, it also passes its client_state_change_no.
+// The client_state_change number is used in the server side to determine what's changed.
+// These changes are collated with add()  and transferred to the client.
+// The client then calls  incremental_sync() which will apply the changes to the client defs
+// so bringing it in sync with the server defs.
+//
+// Note:: updating state_change_no() on the *client side*  a no-op() it has no effect
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include "Memento.hpp"
+
+class DefsDelta : private boost::noncopyable {
+public:
+   ///=========================================================================
+	/// *Server side*
+	DefsDelta(unsigned int client_state_change_no)
+	: client_state_change_no_(client_state_change_no),
+	  server_state_change_no_(0),
+	  server_modify_change_no_(0) {}
+
+	/// This class can be re-used hence init() should reset all data members
+ 	void init(unsigned int client_state_change_no);
+
+	/// Add the compound memento, ie. store all memento's for a *given* node.
+ 	void add(compound_memento_ptr);
+
+   void set_server_state_change_no( unsigned int s) { server_state_change_no_ =  s ; }
+   void set_server_modify_change_no( unsigned int s) { server_modify_change_no_ =  s ; }
+   unsigned int get_server_state_change_no() const  { return server_state_change_no_;  }
+   unsigned int get_server_modify_change_no() const { return server_modify_change_no_; }
+
+ 	///=========================================================================
+ 	/// *Client side*
+	/// Applies the mementos to the client defs and record all changed nodes.
+   /// Can raise std::runtime_error.
+ 	/// Note:: updating state_change_no() on the *client side*  has *no effect*
+	bool incremental_sync(defs_ptr client_def, std::vector<std::string>& changed_nodes) const;
+
+
+	/// =========================================================================
+	// The client state change number. Used to determine what's changed
+	unsigned int client_state_change_no() const { return  client_state_change_no_;}
+
+	/// return the number of compound mementos
+	size_t size() const { return compound_mementos_.size(); }
+
+private:
+	unsigned int client_state_change_no_;  // *no* need to persist since only used on server side
+
+   unsigned int server_state_change_no_;
+   unsigned int server_modify_change_no_;
+	std::vector<compound_memento_ptr> compound_mementos_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & server_state_change_no_;
+      ar & server_modify_change_no_;
+   	ar & compound_mementos_;
+  	}
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(DefsDelta, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(DefsDelta,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/EcfFile.cpp b/ecflow_4_0_7/ANode/src/EcfFile.cpp
new file mode 100644
index 0000000..9c342e1
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/EcfFile.cpp
@@ -0,0 +1,1348 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #66 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <set>
+#include <sstream>
+#include <sys/stat.h>
+
+#include "boost/foreach.hpp"
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/algorithm/string/trim.hpp>
+
+#include "EcfFile.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "File.hpp"
+#include "Task.hpp"
+#include "JobsParam.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+using namespace boost;
+
+//#define DEBUG_ECF_ 1
+//#define DEBUG_PRE_PROCESS 1
+//#define DEBUG_PRE_PROCESS_INCLUDES 1    // be careful with this as it will skew  the diffs in test code
+//#define DEBUG_MIGRATE 1                 // for TEST ONLY
+
+//#define DEBUG_PRE_PROCESS_OUTPUT 1
+//#define DEBUG_VAR_SUB_OUTPUT 1
+//#define DEBUG_MAN_FILE 1
+
+static const char* T_NOOP        = "nopp";
+static const char* T_COMMENT     = "comment";
+static const char* T_MANUAL      = "manual";
+static const char* T_END         = "end";
+static const char* T_ECFMICRO    = "ecfmicro";
+static const char* T_INCLUDE     = "include";
+static const char* T_INCLUDENOPP = "includenopp";
+
+static void vector_to_string(const std::vector<std::string>& vec, std::string& str)
+{
+   // Determine size of string, to avoid reallocation
+   size_t the_string_size = 0;
+   size_t theSize = vec.size();
+   for(size_t i = 0; i < theSize; i++) { the_string_size += vec[i].size() + 1; } // +1 is for "\n";
+   str.reserve( str.size() + the_string_size);
+
+   // populate string using the vector
+   for(size_t i = 0; i < theSize; i++) {
+      str += vec[i];
+      str += "\n";
+   }
+}
+
+// ==================================================================================
+// Avoid making any data model/defs state changes. Changes like:
+//       node_->flag().set(ecf::Flag::NO_SCRIPT);
+// Which will cause a state change.
+// If the script fails then it is up to the calling Task to set this flag
+// This class is also used to extract the scripts/manual, etc form
+// a read only command. hence this class can not make state changes
+// ===================================================================================
+EcfFile::EcfFile( Node* t,
+                  const std::string& pathToEcfFileOrCommand,
+                  bool  fetchCommand
+)
+: node_( t ),
+  script_path_or_cmd_( pathToEcfFileOrCommand )
+  /*,fetchCommand_( fetchCommand ) */
+{
+   node_->findParentUserVariableValue(Str::ECF_MICRO(),ecfMicroCache_);
+   if ( ecfMicroCache_.empty() || ecfMicroCache_.size() != 1) {
+      std::stringstream ss;
+      ss << "EcfFile::EcfFile: Node " << t->absNodePath() << " is referencing a invalid ECF_MICRO variable(' " << ecfMicroCache_ << "). ECF_MICRO when overridden, must be a single character.";
+      throw std::runtime_error(ss.str());
+   }
+
+#ifdef DEBUG_ECF_
+   cout << "   EcfFile::EcfFile pathToEcfFileOrCommand = " << script_path_or_cmd_ << " fetchCommand = " << fetchCommand << "\n";
+#endif
+}
+
+void EcfFile::manual(std::string& theManual)
+{
+   /// Pre-process the file accessible from the server
+   std::vector<std::string> lines;
+   std::string error_msg;
+   EcfFile::Type file_type = (node_->isSubmittable()) ? EcfFile::SCRIPT : EcfFile::MANUAL ;
+   if (!open_script_file(script_path_or_cmd_, file_type, lines,  error_msg)) {
+      std::stringstream ss; ss << "EcfFile::manual: For node " << node_->debugNodePath() << ", failed to open file " << script_path_or_cmd_ << " : " << error_msg;
+      throw std::runtime_error(ss.str());
+   }
+
+   // expand all %includes this will expand %includenopp by enclosing in %nopp %end, will populate jobLines_
+   if (!preProcess(lines,error_msg)) {
+      std::stringstream ss; ss << "EcfFile::manual: For node " << node_->debugNodePath() << ", failed to pre-process file " << script_path_or_cmd_ << " : " << error_msg;
+      throw std::runtime_error(ss.str());
+   }
+
+   // perform variable sub's but don't error if failure
+   try {
+      JobsParam dummy; // create jobs = false, spawn jobs =  false
+      variableSubstituition(dummy);
+   }
+   catch (...) {}
+
+   vector<string> theManualLines;
+   if (!extractManual(jobLines_,theManualLines,error_msg)) {
+      std::stringstream ss;
+      ss << "EcfFile::manual: extraction failed for task " << node_->absNodePath() << " " << error_msg;
+      throw std::runtime_error(ss.str());
+   }
+
+   if (theManualLines.empty()) {
+      // There is no %manual -> %end in the file. However this may be .man file for Suites/Family
+      // For this case just include the pre-processed contents as is, ie since the whole file
+      // is the manual
+      if (node_->isNodeContainer()) {
+         vector_to_string(jobLines_,theManual);
+         return;
+      }
+   }
+
+   vector_to_string(theManualLines,theManual);
+}
+
+void EcfFile::script(std::string& theScript) const
+{
+   if (!File::open(script_path_or_cmd_,theScript)) {
+      std::stringstream ss;
+      ss << "EcfFile::script: Could not open script for task/alias " << node_->absNodePath() << " at path " << script_path_or_cmd_;
+      throw std::runtime_error(ss.str());
+   }
+}
+
+void EcfFile::pre_process(std::vector<std::string>& user_edit_file, std::string& pre_processed_file)
+{
+   // expand all %includes this will expand %includenopp by enclosing in %nopp %end, will populate jobLines_
+   std::string errormsg;
+   if (!preProcess(user_edit_file,errormsg)) {
+      throw std::runtime_error("EcfFile::pre_process: Failed to pre_process user edit file " + errormsg);
+   }
+
+   vector_to_string(jobLines_,pre_processed_file);
+}
+
+void EcfFile::pre_process(std::string& pre_processed_file)
+{
+   /// Pre-process the ECF file accessible from the server
+   std::vector<std::string> lines;
+   std::string error_msg;
+   if (!open_script_file(script_path_or_cmd_, EcfFile::SCRIPT, lines,  error_msg)) {
+      std::stringstream ss;
+      ss << "EcfFile::pre_process: Failed to open file " << script_path_or_cmd_ << " : " << error_msg;
+      throw std::runtime_error(ss.str());
+   }
+
+   // expand all %includes this will expand %includenopp by enclosing in %nopp %end, will populate jobLines_
+   if (!preProcess(lines,error_msg)) {
+      throw std::runtime_error("EcfFile::pre_process: Failed to pre_process: " + error_msg);
+   }
+
+   /// Find Used variables, *after* all %includes expanded, can throw std::runtime_error
+   get_used_variables(pre_processed_file);
+
+   /// Add pre-processed content
+   vector_to_string(jobLines_,pre_processed_file);
+}
+
+void EcfFile::edit_used_variables(std::string& return_script_with_used_variables)
+{
+   std::string errorMsg;
+   std::vector<std::string> lines;
+   if (!open_script_file(script_path_or_cmd_, EcfFile::SCRIPT, lines,  errorMsg)) {
+      throw std::runtime_error( "EcfFile::edit_used_variables: Open script failed : " + errorMsg ) ;
+   }
+
+   // Copy the script file, *BEFORE* expanding the includes
+   std::string script;
+   vector_to_string(lines,script);
+
+   // expand all %includes
+   if (!preProcess(lines, errorMsg)) {
+      throw std::runtime_error( "EcfFile::edit_used_variables: PreProcess script failed : " + errorMsg ) ;
+   }
+
+   /// Find Used variables, *after* all %includes expanded, Can throw std::runtime_error
+   get_used_variables(return_script_with_used_variables);
+
+   /// Return Used variables and SCRIPT before pre-processing
+   return_script_with_used_variables += script;
+}
+
+
+const std::string& EcfFile::create_job( JobsParam& jobsParam)
+{
+#ifdef DEBUG_ECF_
+   cout << "EcfFile::createJob task " << node_->absNodePath() << " script_path_or_cmd_ = " << script_path_or_cmd_ << "\n";
+#endif
+
+   // NOTE: When editing pure python jobs, we may have *NO* variable specified, but only user_edit_file
+   //       hence whenever we have user_edit_file, we should follow the else part below
+   std::string error_msg;
+   std::vector<std::string> lines;
+   if (jobsParam.user_edit_variables().empty() && jobsParam.user_edit_file().empty()) {
+      /// The typical *NORMAL* path
+      if (!open_script_file(script_path_or_cmd_, EcfFile::SCRIPT, lines,  error_msg)) {
+         throw std::runtime_error("EcfFile::create_job: failed " + error_msg );
+      }
+   }
+   else {
+      // *USER* edit, two kinds
+      if (jobsParam.user_edit_file().empty()) {
+         // *USE* user variables, but ECF file accessible from the server
+         if (!open_script_file(script_path_or_cmd_, EcfFile::SCRIPT, lines,  jobsParam.errorMsg())) {
+            throw std::runtime_error("EcfFile::create_job: User variables, Could not open script: " + error_msg );
+         }
+      }
+      else {
+         // *USE* the user supplied ECF file *AND* user variables
+         lines = jobsParam.user_edit_file();
+      }
+   }
+
+   // expand all %includes this will expand %includenopp by enclosing in %nopp %end
+   if (!preProcess(lines,error_msg)) {
+      throw std::runtime_error("EcfFile::create_job: pre process failed " + error_msg );
+   }
+
+#ifdef DEBUG_PRE_PROCESS_OUTPUT
+   std::string err;
+   File::create("preProcess" + get_extn(),jobLines_,err);
+#endif
+
+   // _IF_ ECF_CLIENT is specified provide Special support for migration.
+   // The variable ECF_CLIENT is used to specify the path to client exe.
+   // This is then used to replace smsinit,smscomplete, smsevent,smsmeter.smslabel,smsabort
+   std::string clientPath;
+   if (node_->findParentUserVariableValue("ECF_CLIENT", clientPath)) {
+      if (!replaceSmsChildCmdsWithEcf(clientPath,error_msg) ) {
+         throw std::runtime_error("EcfFile::create_job: ECF_CLIENT replacement failed " + error_msg );
+      }
+#ifdef DEBUG_MIGRATE
+      std::string err;
+      File::create("migrate" + get_extn(),jobLines_,err);
+#endif
+   }
+
+   /// Will use *USER* supplied edit variables in preference to node tree variable *IF* supplied
+   /// expand %VAR% or %VAR:sub% & replace %% with %
+   // Allow variable substitution in comment and manual blocks. But if it fails, don't report as an error
+   variableSubstituition(jobsParam);
+
+#ifdef DEBUG_VAR_SUB_OUTPUT
+   std::string err1;
+   File::create("variableSub" + get_extn(),jobLines_,err1);
+#endif
+
+#ifdef DEBUG_MAN_FILE
+   if (!doCreateManFile(error_msg))  {
+      throw std::runtime_error("EcfFile::create_job: manual file creation failed " + error_msg );
+   }
+#endif
+
+   /// Create the user file for tasks, when submitting without aliases,  before removing comments
+   if (node_->isTask() && !jobsParam.user_edit_variables().empty()) {
+      doCreateUsrFile();
+   }
+
+   removeCommentAndManual();
+   remove_nopp_end_tokens();
+
+   return doCreateJobFile(jobsParam/* this is only past in for profiling */); // create job on disk
+}
+
+void EcfFile::extract_used_variables(NameValueMap& used_variables_as_map,const std::vector<std::string> &script_lines)
+{
+   // we only process the contents of the FIRST %comment  %end
+   bool comment = false;
+   size_t theSize = script_lines.size();
+   for(size_t i=0; i < theSize; ++i) {
+
+      // std::cout << "EcfFile::extract_used_variables found:'" << script_lines[i] << "\n";
+      if (script_lines[i].empty()) continue;
+
+      // take into account micro char during variable substitution
+      string::size_type ecfmicro_pos = script_lines[i].find(Ecf::MICRO());
+      if ( ecfmicro_pos == 0) {
+
+         // We can not do variable substitution between %nopp/%end
+         if (script_lines[i].find(T_COMMENT) == 1)  { comment = true; continue;}
+         if (script_lines[i].find(T_NOOP)    == 1)  { return;}
+         if (script_lines[i].find(T_MANUAL)  == 1)  { return;}
+         if (script_lines[i].find(T_END)     == 1)  { return; }
+      }
+
+      if (comment) {
+
+         // expect  name =  value
+         string::size_type equal_pos = script_lines[i].find("=");
+         if ( equal_pos == string::npos) continue;
+         string name = script_lines[i].substr(0,equal_pos);
+         string value = script_lines[i].substr(equal_pos+1);
+         boost::algorithm::trim(name);
+         boost::algorithm::trim(value);
+
+         //std::cout << "   extracted as '" << name << "' = '" << value << "'\n";
+         used_variables_as_map.insert( std::make_pair(name, value) );
+      }
+   }
+}
+
+bool EcfFile::preProcess(std::vector<std::string>& script_lines, std::string& errormsg)
+{
+   /// Clear existing jobLines
+   jobLines_.clear();
+   jobLines_.reserve(512); // estimate for includes
+
+   // get the cached ECF_MICRO variable, typically its one char.
+   string ecfMicro = ecfMicroCache_;
+
+#ifdef DEBUG_PRE_PROCESS
+   cout << "   EcfFile::preProcess task:" << node_->absNodePath() << "   script_path_or_cmd_=" << script_path_or_cmd_ << " ecfMicro = " << ecfMicro << "\n";
+   for(size_t i=0; i < script_lines.size(); ++i) { cerr << "   script_lines[i] = " << i << "  " << script_lines[i] << "\n"; }
+#endif
+
+   // include pre-processing on the included file.
+   // Note: include directives _in_ manual/comment should he handled.
+   //       only include directives in %nopp/%end are ignored
+   std::set<std::string> globalIncludedFileSet; // test for recursive includes
+   int recursive_count = 0;
+   std::vector<std::string> tokens;       // re-use to save memory
+   std::vector<std::string> includeLines; // re-use to save memory
+
+   // constant until ecfmicro changes, then reset
+   string pp_nopp = ecfMicro;    pp_nopp    += T_NOOP;
+   string pp_comment = ecfMicro; pp_comment += T_COMMENT;
+   string pp_manual = ecfMicro;  pp_manual  += T_MANUAL;
+   string pp_end = ecfMicro;     pp_end     += T_END;
+
+   while (1) {
+
+      std::set<std::string> localIncludedFileSet;
+      bool filesToInclude = false;
+      bool nopp =  false; bool comment = false; bool manual = false;
+      for(size_t i=0; i < script_lines.size(); ++i) {
+         jobLines_.push_back(script_lines[i]);    // copy line
+
+         // For variable substitution % can occur anywhere on the line, for pre -processing of
+         // %ecfmicro,%manual,%comment,%end,%include,%includenopp it must be the very *first* character
+         string::size_type ecfmicro_pos = script_lines[i].find(ecfMicro);
+         if (ecfmicro_pos == string::npos) continue;
+
+         if (!nopp && !comment && !manual) {
+            // For variable substitution '%' can occur anywhere on the line.
+            // Check for Mismatched micro i.e %FRED or %FRED%%
+            if (ecfmicro_pos != 0) {
+               int ecfMicroCount = countEcfMicro( script_lines[i], ecfMicro );
+               if (ecfMicroCount % 2 != 0 ) {
+                  std::stringstream ss;
+                  ss << "Mismatched ecfmicro(" << ecfMicro << ") count(" << ecfMicroCount << ")  '" << script_lines[i] << "' in " << path();
+                  errormsg += ss.str();
+                  dump_expanded_script_file(i,script_lines);
+                  return false;
+               }
+            }
+         }
+
+         // %ecfmicro,%manual,%comment,%end,%include,%includenopp it must be the very *first* character
+         if (ecfmicro_pos != 0) continue; //handle 'garbage%include'
+
+#ifdef DEBUG_PRE_PROCESS
+         std::cout << i << ": " << script_lines[i] << "\n";
+#endif
+         if (script_lines[i].find(pp_manual) == 0) {
+            if (comment || manual) {
+               std::stringstream ss; ss << "Embedded comments/manuals not supported '" << script_lines[i] << "' at " << path();
+               errormsg += ss.str();
+               dump_expanded_script_file(i,script_lines);
+               return false;
+            }
+            manual = true ; continue;
+         }
+         if (script_lines[i].find(pp_comment) == 0) {
+            if (comment || manual) {
+               std::stringstream ss; ss << "Embedded comments/manuals not supported '" << script_lines[i] << "' at " << path();
+               errormsg += ss.str();
+               dump_expanded_script_file(i,script_lines);
+               return false;
+            }
+            comment = true ; continue;
+         }
+         if (script_lines[i].find(pp_nopp) == 0) {
+            if (nopp) {
+               std::stringstream ss; ss << "Embedded nopp not supported '" << script_lines[i] << "' in " << path();
+               errormsg += ss.str();
+               dump_expanded_script_file(i,script_lines);
+               return false;
+            }
+            nopp = true ; continue;
+         }
+         if (script_lines[i].find(pp_end) == 0) {
+            if (comment) { comment = false; continue;}
+            if (manual)  { manual = false; continue;}
+            if (nopp)    { nopp = false; continue;}
+            std::stringstream ss;
+            ss << pp_end << " found with no matching %comment | %manual | %nopp at '" << script_lines[i]<< "' at path " << path();
+            errormsg += ss.str();
+            dump_expanded_script_file(i,script_lines);
+            return false;
+         }
+         if (nopp) continue;
+
+         tokens.clear();
+         Str::split( script_lines[i], tokens );
+
+         // Handle ecfmicro replacement ================================================================================
+         if (script_lines[i].find(T_ECFMICRO) == 1) {    // %ecfmicro #
+            // keep %ecfmicro in jobs file later processing, i.e for comments/manuals
+
+            if (tokens.size() < 2) {
+               std::stringstream ss;
+               ss << "ecfmicro does not have a replacement character, in " << script_path_or_cmd_;
+               errormsg += ss.str();
+               return false;
+            }
+
+            // This is typically a single character, however $/£ will be multi-character i.e size 2
+            ecfMicro = tokens[1];
+            if (ecfMicro.size() > 2) {
+               std::stringstream ss;
+               ss << "Expected ecfmicro replacement to be a single character, but found '" << ecfMicro << "' " <<  ecfMicro.size() << " in file : " << script_path_or_cmd_;
+               errormsg += ss.str();
+               return false;
+            }
+
+            pp_nopp = ecfMicro;    pp_nopp    += T_NOOP;
+            pp_comment = ecfMicro; pp_comment += T_COMMENT;
+            pp_manual = ecfMicro;  pp_manual  += T_MANUAL;
+            pp_end = ecfMicro;     pp_end     += T_END;
+
+            continue;
+         }
+
+         // Handle the includes ===================================================================================
+         if (tokens.size() < 2) continue;
+
+         bool includenopp = (script_lines[i].find(T_INCLUDENOPP) == 1);
+         if (!includenopp) {
+            // Notice we only do recursive includes for %include
+            filesToInclude = (script_lines[i].find(T_INCLUDE) != string::npos);
+         }
+         if (!filesToInclude && !includenopp) continue;
+
+         // remove %include since were going to expand it.
+         jobLines_.pop_back();
+
+#ifdef DEBUG_PRE_PROCESS_INCLUDES
+         // Output the includes for debug purposes. Will appear in preProcess.ecf
+         // Note: Will interfere with diff
+         jobLines_.push_back("========== include of " + tokens[1] + " ===========================");
+#endif
+
+         std::string includedFile = getIncludedFilePath(tokens[1], script_lines[i], errormsg);
+         if (!errormsg.empty())  return false;
+         localIncludedFileSet.insert(includedFile);
+#ifdef DEBUG_PRE_PROCESS
+         cout << "EcfFile::preProcess processing " << includedFile  << "\n";
+#endif
+
+         includeLines.clear();
+         if (!open_script_file(includedFile, EcfFile::INCLUDE, includeLines,  errormsg)) {
+            return false;
+         }
+
+         // append included script_lines to jobsLines
+         if (includenopp) jobLines_.push_back(ecfMicro + T_NOOP);
+         std::copy( includeLines.begin(), includeLines.end(), std::back_inserter( jobLines_ ) );
+         if (includenopp) jobLines_.push_back(ecfMicro + T_END);
+      }
+
+
+      if (nopp) {
+         std::stringstream ss;
+         ss << "Unterminated nopp, matching 'end' is missing for " << path();
+         errormsg +=  ss.str();
+         dump_expanded_script_file(1,script_lines);
+         return false;
+      }
+
+      // Check for recursive includes. some includes like %include <endt.h>
+      // are included many times, but the include is not recursive.
+      // To get round this will use a simple count.
+      BOOST_FOREACH(const string& theInclude, localIncludedFileSet) {
+
+         if (globalIncludedFileSet.find(theInclude) != globalIncludedFileSet.end()) {
+
+            if ( recursive_count > 10) {
+               std::stringstream ss;
+               ss << "Recursive include of file " << theInclude << " for " << path();
+               errormsg += ss.str();
+               return false;
+            }
+            recursive_count++;
+         }
+         else globalIncludedFileSet.insert(theInclude);
+      }
+
+      if (!filesToInclude)  break;
+      else {
+         // repeat until no %include left
+         script_lines = jobLines_;
+         jobLines_.clear();
+      }
+   }
+   return true;
+}
+
+bool EcfFile::open_script_file(
+         const std::string& file,
+         EcfFile::Type type,
+         std::vector<std::string>& lines,
+         std::string& errormsg) const
+{
+#ifdef DEBUG_ECF_
+   std::cout << "EcfFile::open_script_file file(" << file << ") type(" << fileType(type) << ")\n";
+#endif
+   if (file.empty()) {
+      std::stringstream ss;
+      ss << "EcfFile::open_script_file: Could not open ecf " << fileType(type) << " file. Input File/cmd string is empty.";
+      errormsg += ss.str();
+      return false;
+   }
+
+   //	if (fetchCommand_) {
+   //		// SMSFETCH is not used in operation or research. I think this is how it should work
+   //		// But not tested. Commented out until demand for it.
+   //		string theFile = file;
+   //		string theCommand = script_path_or_cmd_; // variables have already been substituted
+   //		switch (type) {
+   //			case EcfFile::SCRIPT:  { theCommand += " -s "; theFile = node_->name() + get_extn(); break;}
+   //			case EcfFile::INCLUDE: theCommand += " -i "; break;
+   //			case EcfFile::MANUAL:  { theCommand += " -m "; theFile = node_->name() + get_extn(); break;}
+   //			case EcfFile::COMMENT: { theCommand += " -c "; theFile = node_->name() + get_extn(); break;}
+   //		}
+   //		theCommand += theFile;
+   //		FILE *fp = popen(theCommand.c_str(),"r");
+   //		//cout << " " << theCommand << "\n";
+   //		if (!fp) {
+   // 			std::stringstream ss;
+   //			ss  << "Could not open " <<  fileType(type) << " via cmd " << theCommand << " for task " << node_->absNodePath() << " ";
+   //			errormsg += ss.str();
+   //			return false;
+   //		}
+   // 		char  line[LINE_MAX];
+   //		while( fgets(line,LINE_MAX,fp) ) {
+   // 			lines.push_back(line);
+   // 		}
+   //		pclose(fp);
+   // 	}
+   //	else {
+   if ( ! File::splitFileIntoLines(file, lines) ) {
+      std::stringstream ss;
+      ss  << "Could not open " <<  fileType(type) << " file:" << file;
+      errormsg += ss.str();
+      return false;
+   }
+   //	}
+
+   return true;
+}
+
+std::string EcfFile::fileType(EcfFile::Type t)
+{
+   switch (t) {
+      case EcfFile::SCRIPT:  return "script";  break;
+      case EcfFile::INCLUDE: return "include"; break;
+      case EcfFile::MANUAL:  return "manual";  break;
+      case EcfFile::COMMENT: return "comment"; break;
+   }
+   assert(false);
+   return string();
+}
+
+
+static void replace(  string::size_type commentPos,
+         std::string& jobLine,
+         const std::string& smsChildCmd,
+         const std::string& ecfEquiv,
+         const std::string& clientPath)
+{
+   string::size_type childPos = jobLine.find(smsChildCmd);
+   if ( childPos != std::string::npos ) {
+      if ( commentPos == std::string::npos) {
+         std::string replace = clientPath;
+         replace +=  ecfEquiv;
+         Str::replace(jobLine,smsChildCmd,replace);
+      }
+      else if ( childPos < commentPos) {
+         std::string replace = clientPath;
+         replace +=  ecfEquiv;
+         Str::replace(jobLine,smsChildCmd,replace);
+      }
+   }
+}
+
+bool EcfFile::replaceSmsChildCmdsWithEcf(const std::string& clientPath, std::string& errormsg)
+{
+   //   smsinit $$          	   ---> ECF_CLIENT(value) --init $$
+   //   smscomplete         	   ---> ECF_CLIENT(value)
+   //   smsevent eventname       ---> ECF_CLIENT(value) --event eventname
+   //   smsmeter metername value ---> ECF_CLIENT(value) --meter metername value
+   //   smslabel value           ---> ECF_CLIENT(value) --label value
+   //   smswait expr             ---> ECF_CLIENT(value) --wait expr
+   //   smsabort                 ---> ECF_CLIENT(value) --abort
+   size_t jobLines_size = jobLines_.size();
+   for(size_t i=0; i < jobLines_size; ++i) {
+
+      // ONLY do the replacement if there is no leading comment
+      string::size_type commentPos = jobLines_[i].find("#");
+      replace(commentPos, jobLines_[i], "smsinit",    " --init ",     clientPath);
+      replace(commentPos, jobLines_[i], "smscomplete"," --complete ", clientPath);
+      replace(commentPos, jobLines_[i], "smsabort",   " --abort ",    clientPath);
+      replace(commentPos, jobLines_[i], "smsevent",   " --event ",    clientPath);
+      replace(commentPos, jobLines_[i], "smsmeter",   " --meter ",    clientPath);
+      replace(commentPos, jobLines_[i], "smslabel",   " --label ",    clientPath);
+      replace(commentPos, jobLines_[i], "smswait",    " --wait ",     clientPath);
+   }
+   return true;
+}
+
+void EcfFile::variableSubstituition(JobsParam& jobsParam)
+{
+   // Allow variable substitution in comment and manual blocks.
+   // But if it fails, don't report as an error
+
+   // get the cached ECF_MICRO variable, typically its one char.
+   string ecfMicro = ecfMicroCache_;
+   char microChar = ecfMicro[0];
+
+   // We need a stack to properly implement nopp. This is required since we need to pair
+   // the %end, with nopp. i.e need to handle
+   // %nopp
+   // %comment
+   // %end      // this is paired with comment
+   // %end      // This is paired with nopp
+   const int NOPP = 0;
+   const int COMMENT = 1;
+   const int MANUAL = 2;
+   std::vector<int> pp_stack;
+   std::vector<std::string> tokens;
+
+   bool nopp =  false;
+   size_t jobLines_size = jobLines_.size();
+   for(size_t i=0; i < jobLines_size; ++i) {
+
+      if (jobLines_[i].empty()) continue;
+
+      // take into account micro char during variable substitution
+      string::size_type ecfmicro_pos = jobLines_[i].find(ecfMicro);
+      if (ecfmicro_pos == 0) {
+
+         // We can not do variable substitution between %nopp/%end
+         if (jobLines_[i].find(T_MANUAL)  == 1) { pp_stack.push_back(MANUAL); continue;  }
+         if (jobLines_[i].find(T_COMMENT) == 1) { pp_stack.push_back(COMMENT); continue; }
+         if (jobLines_[i].find(T_NOOP)    == 1) { pp_stack.push_back(NOPP); nopp = true; continue; }
+         if (jobLines_[i].find(T_END) == 1) {
+            if (pp_stack.empty()) throw std::runtime_error("EcfFile::variableSubstituition: failed unpaired %end");
+            int last_directive = pp_stack.back(); pp_stack.pop_back();
+            if (last_directive == NOPP) nopp = false;
+            continue;
+         }
+
+         if (jobLines_[i].find(T_ECFMICRO) == 1) {   // %ecfmicro #
+
+            tokens.clear();
+            Str::split( jobLines_[i], tokens );
+            if (tokens.size() < 2) {
+               std::stringstream ss; ss << "ecfmicro does not have a replacement character, in " << script_path_or_cmd_;
+               throw std::runtime_error("EcfFile::variableSubstituition: failed : " + ss.str());
+            }
+            ecfMicro = tokens[1];
+            microChar = ecfMicro[0];
+            continue; // no point in doing variable subs on %ecfmicro ^
+         }
+      }
+      if ( nopp ) continue;
+
+
+      /// For variable substitution % can occur anywhere on the line
+      if (ecfmicro_pos != string::npos) {
+
+         /// In the *NORMAL* flow jobsParam.user_edit_variables() will be EMPTY
+         if ( !node_->variable_substitution( jobLines_[i], jobsParam.user_edit_variables(), microChar ) ) {
+
+            // Allow variable substitution in comment and manual blocks.
+            // But if it fails, don't report as an error
+            int last_directive = -1;
+            if (!pp_stack.empty()) last_directive = pp_stack.back();
+            if ( last_directive == COMMENT || last_directive == MANUAL) continue;
+
+            std::stringstream ss;  ss << "EcfFile::variableSubstituition: failed : '" << jobLines_[i] << "'";
+            dump_expanded_script_file( i, jobLines_ );
+            throw std::runtime_error(ss.str());
+         }
+      }
+   }
+}
+
+
+void EcfFile::get_used_variables(std::string& used_variables) const
+{
+   /// Find Used variables, *after* all %includes expanded
+   NameValueMap used_variables_map;
+   std::string errorMsg;
+   if (!get_used_variables(used_variables_map, errorMsg) ) {
+      throw std::runtime_error( "EcfFile::get_used_variables: Extract used variables failed : " + errorMsg ) ;
+   }
+
+   if (!used_variables_map.empty()) {
+
+      // add %comment - edit user variable, %end - ecf user variable
+      used_variables = ecfMicroCache_;
+      used_variables += "comment - ecf user variables\n";
+
+      // ***************************************************************************************
+      // Custom handling of dynamic variables, i.e ECF_TRYNO, ECF_PASS and
+      // any variable that embeds a try number, i.e. ECF_JOB, ECF_JOBOUT
+      // This is required since the try number is *always* incremented *before* job submission,
+      // hence the value extracted from the job file will *not* be accurate, hence we exclude it.
+      // This way at job submission we use the latest/correct value, which is in-sync with JOB OUTPUT
+      // Note: Otherwise the job output will not be in sync
+      //
+      // Custom handling of ECF_PORT,ECF_NODE,ECF_NAME do not show these variables, these variables
+      // including ECF_PASS appear in the script. If the user accidentally edits them,
+      // Child communication with the server will be broken. Hence not shown
+      //
+      // All the above are examples of generated variables, which should not really be edited
+      // The used variables are typically *user* variable *in* the scripts, that user may need
+      // to modify. Hence we have also excluded generated variables SUITE, FAMILY, TASK
+      // ****************************************************************************************
+      std::pair<std::string, std::string> item;
+      BOOST_FOREACH(item, used_variables_map) {
+         if ( item.first.find(Str::ECF_TRYNO())   != std::string::npos) continue;
+         if ( item.first.find(Str::ECF_JOB())     != std::string::npos) continue;
+         if ( item.first.find(Str::ECF_JOBOUT())  != std::string::npos) continue;
+         if ( item.first.find(Str::ECF_PASS())    != std::string::npos) continue;
+         if ( item.first.find(Str::ECF_PORT())    != std::string::npos) continue;
+         if ( item.first.find(Str::ECF_NODE())    != std::string::npos) continue;
+         if ( item.first.find(Str::ECF_NAME())    != std::string::npos) continue;
+
+         // We must use exact match, to avoid user variables like ESUITE,EFAMILY,ETASK
+         if ( item.first == Str::TASK())  continue;
+         if ( item.first == Str::FAMILY()) continue;
+         if ( item.first == "FAMILY1")     continue;
+         if ( item.first == Str::SUITE())  continue;
+         used_variables += item.first;
+         used_variables += " = ";
+         used_variables += item.second;
+         used_variables += "\n";
+      }
+
+      used_variables += ecfMicroCache_;
+      used_variables += "end - ecf user variables\n";
+   }
+}
+
+bool EcfFile::get_used_variables(NameValueMap& used_variables, std::string& errormsg) const
+{
+   // get the cached ECF_MICRO variable, typically its one char.
+   string ecfMicro = ecfMicroCache_;
+
+   char microChar = ecfMicro[0];
+
+   // We need a stack to properly implement nopp. This is required since we need to pair
+   // the %end, with nopp. i.e need to handle
+   // %nopp
+   // %comment
+   // %end      // this is paired with comment
+   // %end      // This is paired with nopp
+   const int NOPP = 0;
+   const int COMMENT = 1;
+   const int MANUAL = 2;
+   std::vector<int> pp_stack;
+
+   bool nopp =  false;
+   std::stringstream ss;
+   std::vector<std::string> tokens;
+
+   size_t job_lines_size = jobLines_.size();
+   for(size_t i=0; i < job_lines_size; ++i) {
+
+      if (jobLines_[i].empty()) continue;
+
+      // take into account micro char during variable substitution
+      string::size_type ecfmicro_pos = jobLines_[i].find(ecfMicro);
+      if (ecfmicro_pos == 0) {
+
+         // We can not do variable substitution between %nopp/%end
+         if (jobLines_[i].find(T_MANUAL)  == 1) { pp_stack.push_back(MANUAL); continue;  }
+         if (jobLines_[i].find(T_COMMENT) == 1) { pp_stack.push_back(COMMENT); continue; }
+         if (jobLines_[i].find(T_NOOP)    == 1) { pp_stack.push_back(NOPP); nopp = true; continue; }
+         if (jobLines_[i].find(T_END) == 1) {
+            if (pp_stack.empty()) throw std::runtime_error("EcfFile::get_used_variables: failed  unpaired %end");
+            int last_directive = pp_stack.back(); pp_stack.pop_back();
+            if (last_directive == NOPP) nopp = false;
+            continue;
+         }
+
+         if (!nopp && jobLines_[i].find(T_ECFMICRO) == 1) {  // %ecfmicro #
+
+            tokens.clear();
+            Str::split( jobLines_[i], tokens );
+            if (tokens.size() < 2) {
+               std::stringstream ss; ss << "ecfmicro does not have a replacement character, in " << script_path_or_cmd_;
+               throw std::runtime_error("EcfFile::get_used_variables: failed : " + ss.str());
+            }
+            ecfMicro = tokens[1];
+            microChar = ecfMicro[0];
+            continue;
+         }
+      }
+      if ( nopp ) continue;
+
+
+      if (ecfmicro_pos != string::npos) {
+
+         /// *Note:* currently this modifies jobLines_[i]
+         std::string line_copy = jobLines_[i];  // avoid modifying the jobs Lines, end up doing  variable substitution
+         if ( !node_->find_all_used_variables( line_copy, used_variables, microChar ) ) {
+
+            // Allow variable substitution in comment and manual blocks.
+            // But if it fails, dont report as an error
+            int last_directive = -1;
+            if (!pp_stack.empty()) last_directive = pp_stack.back();
+            if ( last_directive == COMMENT || last_directive == MANUAL) continue;
+
+            ss << "Variable find failed for '" << jobLines_[i] << "'  microChar='" << microChar << "' ";
+            dump_expanded_script_file( i, jobLines_ );
+         }
+      }
+   }
+
+   // Append to error message if any
+   errormsg += ss.str();
+
+   return errormsg.empty();
+}
+
+
+const std::string& EcfFile::doCreateJobFile(JobsParam& jobsParam) const
+{
+   if ( jobLines_.size() > 1 ) {
+      // Guard against ecf file that exist's but is empty,
+      // no point in creating empty job files for them
+
+      // ECF_JOB is used with ECF_JOB_CMD when submitting a job.
+      // First look for a user variable of name ECF_JOB, otherwise look for
+      // the generated variable, hence this should never fail.
+      // *This* assumes that:
+      //   a/ if the user has overiden ECF_JOB then it has been specified at the task level
+      //      Otherwise findParentVariableValue will find the generated ECF_JOB on the task
+      //   b/ The value of the user variable has a valid directory paths and job file name
+      //   c/ The user will lose the try number.
+      std::string ecf_job;
+      if (!node_->findParentVariableValue(Str::ECF_JOB(), ecf_job)) {
+         LOG_ASSERT( !ecf_job.empty() ,"ECF_JOB should have been generated, program error");
+      }
+
+      // *** The location of the ECF_ file may not always be the same as the location
+      // *** of the job file. Job file location is specified by ECF_JOB
+      // Locate the directory where we found the ecf file.
+      fs::path script_file_path( script_path_or_cmd_ );
+      fs::path parent_path = script_file_path.parent_path();
+      if ( fs::is_directory( parent_path ) ) {
+
+         // cout << "EcfFile::createJob ecf " << path() << " ECF_JOB(" << ecf_job << ")\n";
+         if (!File::createMissingDirectories(ecf_job)) {
+            std::stringstream ss;
+            ss << "EcfFile::doCreateJobFile: Could not create missing directories for ECF_JOB " << ecf_job << " File system full?";
+            throw std::runtime_error(ss.str());
+         }
+
+         // Create the jobs file.
+         std::string error_msg;
+         if (!File::create(ecf_job, jobLines_,error_msg)) {
+            std::stringstream ss;
+            ss << "EcfFile::doCreateJobFile: Could not create job file " << ecf_job << " " << error_msg << " File system full?";
+            throw std::runtime_error(ss.str());
+         }
+
+         // make the job file executable
+         if ( chmod( ecf_job.c_str(), 0755 ) != 0 ) {
+            std::stringstream ss;
+            ss << "EcfFile::doCreateJobFile: Could not make job file " << ecf_job << "  executable by using chmod";
+            throw std::runtime_error(ss.str());
+         }
+
+         // record job size, for placement into log files
+         size_t job_output_size = 0;
+         size_t jobLines_size = jobLines_.size();
+         for(size_t i = 0; i < jobLines_size; ++i)  job_output_size += jobLines_[i].size();
+         job_output_size += jobLines_size; // take into account new lines for each line of output
+         job_size_ = "job_size:";
+         job_size_ += boost::lexical_cast<std::string>(job_output_size);
+         return job_size_;
+      }
+      else {
+         std::stringstream ss;
+         ss << "EcfFile::doCreateJobFile: The path '" << script_file_path.parent_path() << "' is not a directory";
+         throw std::runtime_error(ss.str());
+      }
+   }
+
+   std::stringstream ss;
+   ss << "EcfFile::doCreateJobFile: The ecf file '" << path() << "' that is associated with task '" << node_->absNodePath() << "' is empty";
+   throw std::runtime_error(ss.str());
+}
+
+bool EcfFile::doCreateManFile( std::string& errormsg)
+{
+   vector<string> manFile;
+   if (!extractManual(jobLines_,manFile,errormsg)) {
+      return false;
+   }
+   if ( !manFile.empty() ) {
+
+      // find the directory associated with ecf file and place Man file there.
+      fs::path script_file_path( script_path_or_cmd_ );
+      fs::path parent_path = script_file_path.parent_path();
+      if ( fs::is_directory( parent_path ) ) {
+
+         fs::path theManFilePath( parent_path.string() + '/' + node_->name() + File::MAN_EXTN() );
+
+         // cout << "EcfFile::doCreateManFile job " << manFile.string() << "\n";
+         if (!File::create(theManFilePath.string(),manFile,errormsg)) return false;
+      }
+      else {
+         std::stringstream ss;
+         ss << "man file creation failed. The path '" << script_file_path.parent_path() << "' is not a directory";
+         errormsg += ss.str();
+         return false;
+      }
+   }
+   return true;
+}
+
+
+void EcfFile::doCreateUsrFile() const
+{
+   // find the directory associated with ecf file and place .usr file there.
+   fs::path script_file_path( script_path_or_cmd_ );
+   fs::path parent_path = script_file_path.parent_path();
+   if ( fs::is_directory( parent_path ) ) {
+
+      fs::path theUsrFilePath( parent_path.string() + '/' + node_->name() + File::USR_EXTN() );
+
+      // cout << "EcfFile::doCreateUsrFile job " << theUsrFilePath.string() << "\n";
+      std::string error_msg;
+      if (!File::create(theUsrFilePath.string(),jobLines_,error_msg)) {
+         throw std::runtime_error("EcfFile::doCreateUsrFile: file creation failed : " + error_msg);
+      }
+   }
+   else {
+      std::stringstream ss;
+      ss << "EcfFile::doCreateUsrFile: file creation failed. The path '" << script_file_path.parent_path() << "' is not a directory";
+      throw std::runtime_error(ss.str());
+   }
+}
+
+
+bool EcfFile::extractManual(const std::vector< std::string >& lines,
+         std::vector< std::string >& theManualLines,
+         std::string& errormsg) const
+{
+   // Note: we have already done pre-processing, ie since the manual is obtained after
+   // all the includes have been pre-procssed, hence most errors should have been caught
+   // get the cached ECF_MICRO variable, typically its one char.
+   string ecfMicro = ecfMicroCache_;
+   std::vector<std::string> tokens;
+
+   bool add = false;
+   for (std::vector< std::string >::const_iterator i = lines.begin(); i!= lines.end(); ++i){
+      if ( (*i).find(ecfMicro) == 0) {
+         if ( (*i).find( T_MANUAL ) == 1 )     { add = true;  continue; }
+         if ( add && (*i).find( T_END ) == 1 ) { add = false; continue; }
+
+         if ((*i).find(T_ECFMICRO) == 1) {  // %ecfmicro #
+            tokens.clear();
+            Str::split( (*i), tokens );
+            if (tokens.size() < 2) {
+               std::stringstream ss; ss << "ecfmicro does not have a replacement character, in " << script_path_or_cmd_;
+               errormsg += ss.str();
+               return false;
+            }
+            ecfMicro = tokens[1];
+            if (ecfMicro.size() > 2) {
+               std::stringstream ss; ss << "Expected ecfmicro replacement to be a single character, but found '" << ecfMicro << "' " <<  ecfMicro.size() << " in file : " << script_path_or_cmd_;
+               errormsg += ss.str();
+               return false;
+            }
+            continue;
+         }
+      }
+      if (add) { theManualLines.push_back(*i); }
+   }
+   if (add) {
+      std::stringstream ss; ss << "Unterminated manual. Matching 'end' is missing, for file " << script_path_or_cmd_;
+      errormsg += ss.str();
+      dump_expanded_script_file(1,lines);
+      return false;
+   }
+   return true;
+}
+
+std::string EcfFile::getIncludedFilePath( const std::string& includedFile,
+         const std::string& line,
+         std::string& errormsg)
+{
+   // Include can have following format:
+   //   %include /tmp/file.name   -> /tmp/filename
+   //   %include file.name        -> filename
+   //   %include "../file.name"   -> script_file_path/../file.name
+   //   %include "file.name"      -> %ECF_HOME%/%SUITE%/%FAMILY%/filename
+   //   %include <file.name>      -> %ECF_INCLUDE%/filename
+   //   %include <file.name>      -> ECF_HOME/filename
+
+
+   if ( includedFile.size() >=2 && includedFile[1] == '/') {
+      // filename starts with /, no interpretation return as in
+      // %include </home/sms/fred.ecf>
+      // %include "/home/sms/fred.ecf"
+      return includedFile.substr( 1, includedFile.size() - 2 );
+   }
+
+   std::stringstream ss;
+   if ( includedFile[0] == '<' ) {
+      // include <filename>
+      //    include contents of %ECF_INCLUDE%/filename
+      //    include contents of ECF_HOME/filename
+      std::string ecf_include;
+      if (node_->findParentUserVariableValue( Str::ECF_INCLUDE() , ecf_include ) && !ecf_include.empty() ) {
+
+         ecf_include += '/';
+         ecf_include += includedFile.substr( 1, includedFile.size() - 2 );
+
+         // Don't rely on hard coded paths. Added for testing, but could be generally useful
+         // since in test scenario ECF_INCLUDE is defined relative to $ECF_HOME
+         node_->enviromentSubsitution(ecf_include);
+
+         if (fs::exists(ecf_include)) return ecf_include;
+
+         // ECF_INCLUDE is specified *BUT* the file does *NOT* exist, Look in ECF_HOME
+      }
+
+      // WE get HERE *if* ECF_INCLUDE not specified, or if specified but file *not found*
+      ecf_include.clear();
+      node_->findParentVariableValue( Str::ECF_HOME() , ecf_include );
+      if (ecf_include.empty()) {
+         ss << "ECF_INCLUDE/ECF_HOME not specified, for task " << node_->absNodePath() << " at " << line;
+         errormsg += ss.str();
+         return string();
+      }
+
+      ecf_include += '/';
+      ecf_include += includedFile.substr( 1, includedFile.size() - 2 );
+
+      return ecf_include;
+   }
+   else if ( includedFile[0] == '"' ) {
+
+      // we have two forms: "head.h" & "../head.h"
+
+      std::string path;
+      if ( includedFile.find("../") == 1) {
+         // Find the include file relative to the ecf file.  "../head.h"
+         // remove the leading and trailing '"'
+         std::string the_included_file = includedFile;
+         Str::removeQuotes(the_included_file);
+
+         // Get the root path, i.e. script_path_or_cmd_ is of the form "/user/home/ma/mao/course/t1.ecf"
+         // we need "/user/home/ma/mao/course/"
+         std::string::size_type last_slash = script_path_or_cmd_.rfind("/");
+         if (last_slash != std::string::npos) {
+            path = script_path_or_cmd_.substr( 0, last_slash + 1 );
+            path += the_included_file;
+            // std::cout << "path == " << path << "\n";
+            return path;
+         }
+      }
+
+      // include contents of %ECF_HOME%/%SUITE%/%FAMILY%/filename
+      node_->findParentUserVariableValue( Str::ECF_HOME() , path);
+      if ( path.empty() ) {
+         ss << "ECF_HOME not specified, for include " << line;
+         errormsg += ss.str();
+         return string();
+      }
+      path += '/';
+      std::string suite;
+      node_->findParentVariableValue( "SUITE" , suite);   // SUITE is a generated variable
+      if ( suite.empty() ) {
+         ss << "SUITE not specified, for include " << line;
+         errormsg += ss.str();
+         return string();
+      }
+      path += suite;
+      path += '/';
+      std::string family;
+      node_->findParentVariableValue( "FAMILY" , family); // FAMILY is a generated variable
+      if ( family.empty() ) {
+         ss << "FAMILY not specified, for include " << line;
+         errormsg += ss.str();
+         return string();
+      }
+      path += family;
+      path += '/';
+      path += includedFile.substr( 1, includedFile.size() - 2 ); // "filename"
+      return path;
+   }
+
+   // File either has an absolute pathname or is in the current working dir.
+   // include file name as is, from current working directory
+   return includedFile;
+}
+
+void EcfFile::removeCommentAndManual()
+{
+   // get the cached ECF_MICRO variable, typically its one char.
+   string ecfMicro = ecfMicroCache_;
+
+   // We need a stack to properly implement nopp. This is required since we need to pair
+   // the %end, with nopp. i.e need to handle
+   // %nopp
+   // %comment
+   // %end      // this is paired with comment
+   // %end      // This is paired with nopp
+   const int NOPP = 0;
+   const int COMMENT = 1;
+   const int MANUAL = 2;
+   bool nopp = false;
+   bool erase = false;
+   std::vector<int> pp_stack;
+   std::vector<std::string> tokens;
+
+   for(std::vector<std::string>::iterator i=jobLines_.begin(); i!=jobLines_.end(); ++i) {
+
+       // take into account micro char during  removal of comment/manual
+       string::size_type ecfmicro_pos = (*i).find(ecfMicro);
+       if (ecfmicro_pos == 0) {
+
+          // We can not remove comments/manuals between %nopp/%end
+          if ((*i).find(T_MANUAL)  == 1) {
+             pp_stack.push_back(MANUAL);
+             if (nopp) continue;
+
+             // cerr << "EcfFile::removeCommentAndManual erase = " << erase << " " << *i << "\n";
+             jobLines_.erase( i-- );  // remove  %manual
+             if (erase) {
+                std::stringstream ss; ss << "EcfFile::removeCommentAndManual: Embedded manuals are not allowed in " << script_path_or_cmd_;
+                throw std::runtime_error( ss.str() );
+             }
+             erase = true;
+             continue;
+          }
+
+          if ((*i).find(T_COMMENT) == 1) {
+             pp_stack.push_back(COMMENT);
+             if (nopp) continue;
+
+             // cerr << "EcfFile::removeCommentAndManual erase = " << erase << " " << *i << "\n";
+             jobLines_.erase( i-- ); // remove %comment
+             if (erase) {
+                std::stringstream ss; ss << "EcfFile::removeCommentAndManual: Embedded comments are not allowed in " << script_path_or_cmd_;
+                throw std::runtime_error( ss.str() );
+             }
+             erase = true;
+             continue;
+          }
+
+          if ((*i).find(T_NOOP) == 1) { pp_stack.push_back(NOPP); nopp = true; continue; }
+
+          if ((*i).find(T_END) == 1) {
+             if (pp_stack.empty()) throw std::runtime_error("EcfFile::removeCommentAndManual: failed  unpaired %end");
+             int last_directive = pp_stack.back(); pp_stack.pop_back();
+             if (last_directive == NOPP) nopp = false;
+             else {
+//                cerr << "EcfFile::removeCommentAndManual erase = " << erase << " " << *i << "\n";
+                if (erase) {
+                   jobLines_.erase( i-- ); // remove %end associated with %comment and %manual
+                   erase = false;
+                }
+             }
+             continue;
+          }
+
+          if (!nopp && (*i).find(T_ECFMICRO) == 1) {
+
+             tokens.clear();
+             Str::split( (*i), tokens );
+             if (tokens.size() < 2) {
+                std::stringstream ss; ss << "ecfmicro does not have a replacement character, in " << script_path_or_cmd_;
+                throw std::runtime_error("EcfFile::removeCommentAndManual: failed " + ss.str());
+             }
+             ecfMicro = tokens[1];
+          }
+       }
+       if ( nopp ) continue;
+
+       //  remove all line between %comment and %end | %manual and %end
+       if (erase) {
+          jobLines_.erase( i-- );
+       }
+   }
+
+   if (erase) {
+      std::stringstream ss;
+      ss << "Unterminated comment/manual. Matching 'end' is missing, in " << script_path_or_cmd_;
+      throw std::runtime_error("EcfFile::removeCommentAndManual: failed " + ss.str());
+   }
+}
+
+void EcfFile::remove_nopp_end_tokens()
+{
+   // get the cached ECF_MICRO variable, typically its one char.
+   string ecfMicro = ecfMicroCache_;
+
+   // We need a stack to properly implement nopp. This is required since we need to pair
+   // the %end, with nopp. i.e need to handle
+   // %nopp
+   // %comment
+   // %end      // this is paired with comment **** this should stay ****
+   // %end      // This is paired with nopp    **** this should be deleted ****
+   const int NOPP = 0;
+   const int COMMENT = 1;
+   const int MANUAL = 2;
+   std::vector<int> pp_stack;
+   std::vector< std::string > tokens;
+   bool nopp = false;
+   bool erase = false;
+
+   for(std::vector<std::string>::iterator i=jobLines_.begin(); i!=jobLines_.end(); ++i) {
+
+      string::size_type ecfmicro_pos = (*i).find(ecfMicro);
+      if ( ecfmicro_pos == 0) {
+
+          if ((*i).find(T_MANUAL)  == 1) { pp_stack.push_back(MANUAL); continue;  }
+          if ((*i).find(T_COMMENT) == 1) { pp_stack.push_back(COMMENT); continue; }
+          if ((*i).find(T_END) == 1) {
+             if (pp_stack.empty()) throw std::runtime_error("EcfFile::remove_nopp_end_tokens: failed  unpaired %end");
+             int last_directive = pp_stack.back(); pp_stack.pop_back();
+             if (last_directive == NOPP) {
+                nopp = false;
+                jobLines_.erase( i-- );        // remove %end associated with %nopp
+                erase = false;
+             }
+             continue;
+          }
+          if ((*i).find(T_NOOP) == 1) {
+             pp_stack.push_back(NOPP); nopp = true;
+             jobLines_.erase( i-- );      // remove %nopp
+              if (erase) {
+                 std::stringstream ss; ss << "Embedded nopp are not allowed " << script_path_or_cmd_;
+                 throw std::runtime_error("EcfFile::remove_nopp_end_tokens: failed " + ss.str());
+              }
+              erase = true;
+              continue;
+          }
+          if (!nopp && (*i).find(T_ECFMICRO) == 1) {  // %ecfmicro #
+
+             tokens.clear();
+             Str::split( *i, tokens );
+             if (tokens.size() < 2) {
+                std::stringstream ss;
+                ss << "ecfmicro does not have a replacement character, in " << script_path_or_cmd_;
+                throw std::runtime_error("EcfFile::remove_nopp_end_tokens: failed " + ss.str());
+             }
+
+             ecfMicro = tokens[1];         // override ecfMicro char
+             jobLines_.erase( i-- );       // remove %ecfmicro &
+             continue;
+          }
+      }
+   }
+
+   if (erase) {
+      std::stringstream ss;
+      ss << "Unterminated nopp. Matching 'end' is missing, in " << script_path_or_cmd_;
+      throw std::runtime_error("EcfFile::remove_nopp_end_tokens: failed " + ss.str());
+   }
+}
+
+int EcfFile::countEcfMicro(const std::string& line, const std::string& ecfMicro)
+{
+   if (line.find("#") != string::npos) {
+      // ignore ecfmicro character in comments
+      return 0;
+   }
+
+   /// Pound char could be more than one char ?
+   int count = 0;
+   if ( !ecfMicro.empty()) {
+      const char theChar = ecfMicro[0];
+      size_t end = line.size();
+      for(size_t i = 0; i < end; ++i) {
+         if (line[i] == theChar) {
+            count++;
+         }
+      }
+   }
+   //	cerr << "line " << line << " count = " << count << "\n";
+   return count;
+}
+
+void EcfFile::dump_expanded_script_file(size_t i, const std::vector<std::string>& lines)
+{
+#ifdef DEBUG_PRE_PROCESS
+   if (i != 0) std::cout << "\nSee file tmp.ecf around line number " << i-1 << "\n";
+   std::string err;
+   if (!File::create("tmp" + get_extn(),lines,err))  std::cout << "Could not create file tmp.ecf\n";
+#endif
+}
+
+/// returns the extension, i.e for task->.ecf for alias->.usr
+const std::string& EcfFile::get_extn() const
+{
+   Submittable* task_or_alias = node_->isSubmittable();
+   if (task_or_alias) return task_or_alias->script_extension();
+   else {
+      std::stringstream ss; ss << "EcfFile::get_extn(): Can only return extension for task/alias but found " << node_->debugNodePath();
+      throw std::runtime_error(ss.str());
+   }
+   return Str::EMPTY();
+}
diff --git a/ecflow_4_0_7/ANode/src/EcfFile.hpp b/ecflow_4_0_7/ANode/src/EcfFile.hpp
new file mode 100644
index 0000000..2f3b002
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/EcfFile.hpp
@@ -0,0 +1,107 @@
+#ifndef ECF_FILE_HPP_
+#define ECF_FILE_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "NodeFwd.hpp"
+
+/// This class is used in the pre-processing of files( .ecf or .usr or .man typically)
+/// It is used to to create the job file.
+///
+/// Please note the %manual is only created on request from the file cmd.
+/// Even then it is extracted as a string. i.e. no .man file is
+/// created. This is left to the client.
+/// When returning the manual we pre-process the files first
+///
+/// However for testing purpose this capability may be retained.
+class EcfFile {
+public:
+	/// use default copy constructor, assignment, destructor
+	/// ECF_FETCH/SMSFETCH is mainly used by research. i.e to obtain scripts and includes
+	/// from the version control system. This has not been implemented yet.
+	EcfFile(Node*, const std::string& path_to_script_or_fetch_cmd, bool fetchCommand =  false);
+
+	// The path to the ecf file, empty path means that ecf file could not be located
+	const std::string& path() const { return script_path_or_cmd_;}
+
+	/// This function will return the contents of %manual -> %end for the input file
+	/// It will pre-process the file, then extract the manual form all the pre-processed files
+ 	/// Will throw std::runtime_error for errors
+	void manual(std::string& theManual);
+
+	/// returns the script
+	/// Will throw std::runtime_error for errors
+	void script(std::string& theScript) const;
+
+	/// Create the job file from with script of a task or alias.
+	/// Note: the location of the ecf file may not be the same as the job file
+	///       For creating the job we must use ECF_JOB
+	///
+	/// _IF_ ECF_CLIENT is specified provide Special support for migration. TEST ONLY
+ 	/// The variable ECF_CLIENT is used to specify the path to client exe.
+	/// This is then used to replace smsinit,smscomplete, smsevent,smsmeter.smslabel,smsabort
+	/// This function will start the pre processing
+	/// Will throw std::runtime_error for errors
+	const std::string& create_job( JobsParam&);
+
+	/// Process the script file, to add all the used variables, add the start of the file
+	/// between %comment %end, The augmented script is returned in file_with_used_variables
+	/// Will throw std::runtime_error for errors
+	void edit_used_variables(std::string& file_with_used_variables);
+
+	/// Pre-processing involves include expansion and variable substitution
+	/// Will throw std::runtime_error if pre processing fails
+	void pre_process(std::string& pre_processed_file);
+	void pre_process(std::vector<std::string> & user_edit_file, std::string& pre_processed_file);
+
+	/// Searches for the first %comment, then extracts all variables of the form
+	///   <name>  =  <value>
+	/// and places into map
+	static void extract_used_variables(NameValueMap& used_variables_as_map,const std::vector<std::string> &script_lines);
+
+private:
+	enum Type { SCRIPT, INCLUDE, MANUAL, COMMENT };
+	static std::string fileType(Type);
+
+	bool open_script_file(const std::string& file, Type, std::vector<std::string>& lines, std::string& errormsg) const;
+	bool preProcess(std::vector<std::string>& script_lines, std::string& errormsg);
+	bool replaceSmsChildCmdsWithEcf(const std::string& clientPath, std::string& errormsg);
+	std::string getIncludedFilePath( const std::string& include, const std::string& line, std::string& errormsg);
+ 	void variableSubstituition(JobsParam&);
+ 	const std::string&  doCreateJobFile(JobsParam&) const;
+ 	bool doCreateManFile(std::string& errormsg);
+ 	bool extractManual(const std::vector< std::string >& lines, std::vector< std::string >& theManualLines, std::string& errormsg) const;
+ 	void removeCommentAndManual();
+ 	void remove_nopp_end_tokens();
+
+ 	static int countEcfMicro(const std::string& line, const std::string& ecfMicro);
+ 	static void dump_expanded_script_file(size_t i, const std::vector<std::string>& lines); // for DEBUG
+
+ 	/// returns the extension, i.e for task->.ecf for alias->.usr, will throw if node_ is not task or alias
+ 	const std::string& get_extn() const;
+
+/// User edit functions:
+ 	void get_used_variables(std::string& used_variables) const;
+ 	bool get_used_variables(NameValueMap& used_variables, std::string& errorMsg) const;
+ 	void doCreateUsrFile() const;
+
+	Node* node_;                         // Task or Alias or Container when pre-processing the man files
+	std::string  ecfMicroCache_;         // cache value of ECF_MICRO
+	std::string  script_path_or_cmd_;    // path to .ecf, .usr file or command
+	mutable std::string  job_size_;     // to be placed in log file during job submission
+	//bool         fetchCommand_;        // script is to be extracted form version management repository. Not used !!!
+	std::vector<std::string> jobLines_;  // Lines that will form the job file.
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ExprAst.cpp b/ecflow_4_0_7/ANode/src/ExprAst.cpp
new file mode 100644
index 0000000..387e8fa
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprAst.cpp
@@ -0,0 +1,1238 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #57 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <vector>
+#include <boost/foreach.hpp>
+
+#include "ExprAst.hpp"
+#include "Indentor.hpp"
+#include "ExprAstVisitor.hpp"
+#include "Node.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+
+////////////////////////////////////////////////////////////////////////////////////
+
+Ast::~Ast() {}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+AstTop::~AstTop() { delete root_;}
+
+void AstTop::accept(ExprAstVisitor& v)
+{
+	v.visitTop(this);
+	root_->accept(v);
+}
+
+AstTop* AstTop::clone() const
+{
+   AstTop* top = new AstTop();
+   top->addChild( root_->clone() );
+   return top;
+}
+
+bool AstTop::evaluate() const
+{
+	if (root_) {
+		return root_->evaluate();
+	}
+
+	LOG_ASSERT(false,"AstTop::evaluate(): assert failed, AST top has no root/children");
+	return false;
+}
+
+bool AstTop::check(std::string& error_msg) const
+{
+   if (root_) {
+      return root_->check(error_msg);
+   }
+   return true;
+}
+
+std::ostream& AstTop::print(std::ostream& os) const
+{
+	Indentor in;
+	Indentor::indent(os) << "# AST\n";
+ 	if (root_) {
+		Indentor in;
+		return root_->print(os);
+	}
+	return os;
+}
+
+void AstTop::print_flat(std::ostream& os,bool add_bracket) const
+{
+   if (root_) {
+      root_->print_flat(os,add_bracket);
+   }
+}
+
+//#define DEBUG_WHY 1
+bool AstTop::why(std::string& theReasonWhy) const
+{
+	if (evaluate()) {
+#ifdef DEBUG_WHY
+ 		std::cout << "   AstTop::why evaluate returning\n";
+#endif
+		return false;
+	}
+	return root_->why(theReasonWhy);
+}
+
+std::string AstTop::expression(bool why) const
+{
+	std::string ret =  exprType_;
+	if (root_) {
+		ret += " ";
+		ret += root_->expression(why);
+	}
+	return ret;
+}
+
+void AstTop::setParentNode(Node* p)
+{
+	if (root_) root_->setParentNode(p);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+
+AstRoot::~AstRoot() {
+	delete left_;
+	delete right_;
+	left_ = 0;
+	right_ = 0;
+}
+
+void AstRoot::accept(ExprAstVisitor& v)
+{
+	v.visitRoot(this);
+	left_->accept(v);
+	if (right_) right_->accept(v); // right_ is empty for Not
+}
+
+bool AstRoot::check(std::string& error_msg) const
+{
+   if (left_ && !left_->check(error_msg)) return false;
+   if (right_ && !right_->check(error_msg)) return false;
+   return true;
+}
+
+void AstRoot::addChild( Ast* n )
+{
+	LOG_ASSERT(n,"");
+
+	if ( !left_ ) {
+		left_ = n;
+		return;
+	}
+	if ( !right_ ) {
+		right_ = n;
+		return;
+	}
+
+	LOG_ASSERT(false,"AstRoot::addChild: assert failed: root already has left and right children\n");
+}
+
+std::ostream& AstRoot::print( std::ostream& os ) const {
+	if (left_->isRoot()) {
+		Indentor in;
+ 		left_->print( os );
+	}
+	else left_->print( os );
+
+	if (right_) { // right_ is empty for Not
+		if (right_->isRoot()) {
+			Indentor in;
+			right_->print( os );
+		}
+		else right_->print( os ); ;
+	}
+	return os;
+}
+
+bool AstRoot::why(std::string& theReasonWhy) const
+{
+	if (evaluate()) {
+#ifdef DEBUG_WHY
+ 		std::cout << "   AstRoot::why evaluates returning\n";
+#endif
+		return false;
+	}
+
+	theReasonWhy = "expression ";
+	theReasonWhy += expression(true); // provide additional state
+	theReasonWhy += " does not evaluate";
+#ifdef DEBUG_WHY
+ 	std::cout << "    AstRoot::why  reason = " << theReasonWhy << "\n";
+#endif
+	return true;
+}
+
+void AstRoot::setParentNode(Node* p)
+{
+	if (left_) left_->setParentNode(p);
+	if (right_) right_->setParentNode(p);
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstNot::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitNot(this);
+}
+
+AstNot* AstNot::clone() const
+{
+   AstNot* ast = new AstNot();
+   if (left_) ast->addChild( left_->clone() );
+   return ast;
+}
+
+std::ostream& AstNot::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# NOT evaluate(" << evaluate() << ")";
+	if (right_) os << " # ERROR has right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstNot::print_flat( std::ostream& os,bool add_bracket) const {
+   os << "! ";
+   if (left_) {
+      if (add_bracket) os << "(";
+      left_->print_flat(os,add_bracket);
+      if (add_bracket) os << ")";
+   }
+}
+
+std::string AstNot::expression(bool why) const
+{
+ 	std::string ret =  "NOT ";
+ 	ret += left_->expression(why);
+	return ret;
+}
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstPlus::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitPlus(this);
+}
+
+AstPlus* AstPlus::clone() const
+{
+   AstPlus* ast = new AstPlus();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstPlus::print( std::ostream& os ) const {
+ 	Indentor::indent( os ) << "# PLUS  value(" << value() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstPlus::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " + ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstPlus::expression(bool why) const
+{
+ 	std::string ret;
+	if (left_) ret += left_->expression(why);
+	ret  += " + ";
+	if (right_) ret += right_->expression(why);
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstMinus::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitMinus(this);
+}
+
+AstMinus* AstMinus::clone() const
+{
+   AstMinus* ast = new AstMinus();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstMinus::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# MINUS value(" << value() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstMinus::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " - ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstMinus::expression(bool why) const
+{
+ 	std::string ret;
+	if (left_) ret += left_->expression(why);
+	ret  += " - ";
+	if (right_) ret += right_->expression(why);
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstDivide::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitDivide(this);
+}
+
+AstDivide* AstDivide::clone() const
+{
+   AstDivide* ast = new AstDivide();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+bool AstDivide::check(std::string& error_msg) const
+{
+   if (right_ && right_->value() == 0) {
+      error_msg = "Divide by zero in trigger expression";
+      return false;
+   }
+   return true;
+}
+
+int AstDivide::value() const {
+   if (right_->value() == 0) {
+      log(Log::ERR,"Divide by zero in trigger/complete expression");
+      return 0;
+   }
+   return (left_->value() / right_->value()) ;
+}
+
+std::ostream& AstDivide::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# DIVIDE value(" << value() << ")";
+	if (!left_)  os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstDivide::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " / ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstDivide::expression(bool why) const
+{
+ 	std::string ret;
+	if (left_) ret += left_->expression(why);
+	ret  += " / ";
+	if (right_) ret += right_->expression(why);
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstMultiply::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitMultiply(this);
+}
+
+AstMultiply* AstMultiply::clone() const
+{
+   AstMultiply* ast = new AstMultiply();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstMultiply::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# MULTIPLY value(" << value() << ")";
+	if (!left_)  os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstMultiply::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " * ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstMultiply::expression(bool why) const
+{
+ 	std::string ret;
+	if (left_) ret += left_->expression(why);
+	ret  += " * ";
+	if (right_) ret += right_->expression(why);
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstModulo::accept(ExprAstVisitor& v)
+{
+   AstRoot::accept(v);
+   v.visitModulo(this);
+}
+
+AstModulo* AstModulo::clone() const
+{
+   AstModulo* ast = new AstModulo();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+bool AstModulo::check(std::string& error_msg) const
+{
+   if (right_ && right_->value() == 0) {
+      error_msg = "Modulo by zero in trigger expression";
+      return false;
+   }
+   return true;
+}
+
+int AstModulo::value() const
+{
+   if (right_->value() == 0) {
+      log(Log::ERR,"Modulo by zero in trigger/complete expression");
+      return 0;
+   }
+   return (left_->value() % right_->value());
+}
+
+std::ostream& AstModulo::print( std::ostream& os ) const {
+   Indentor::indent( os ) << "# Modulo value(" << value() << ")";
+   if (!left_) os << " # ERROR has no left_";
+   if (!right_) os << " # ERROR has no right_";
+   os << "\n";
+   return AstRoot::print( os );
+}
+
+void AstModulo::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " % ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstModulo::expression(bool why) const
+{
+   std::string ret;
+   if (left_) ret += left_->expression(why);
+   ret  += " % ";
+   if (right_) ret += right_->expression(why);
+   return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstAnd::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitAnd(this);
+}
+
+AstAnd* AstAnd::clone() const
+{
+   AstAnd* ast = new AstAnd();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstAnd::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# AND evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstAnd::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " and ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstAnd::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " AND ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstOr::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitOr(this);
+}
+
+AstOr* AstOr::clone() const
+{
+   AstOr* ast = new AstOr();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstOr::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# OR evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstOr::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " or ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstOr::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " OR ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstEqual::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitEqual(this);
+}
+
+AstEqual* AstEqual::clone() const
+{
+   AstEqual* ast = new AstEqual();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstEqual::print( std::ostream& os ) const {
+ 	Indentor::indent( os ) << "# EQUAL   evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstEqual::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " == ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstEqual::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " == ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstNotEqual::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitNotEqual(this);
+}
+AstNotEqual* AstNotEqual::clone() const
+{
+   AstNotEqual* ast = new AstNotEqual();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstNotEqual::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# NOT_EQUAL   evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+
+void AstNotEqual::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " != ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstNotEqual::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " != ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstLessEqual::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitLessEqual(this);
+}
+AstLessEqual* AstLessEqual::clone() const
+{
+   AstLessEqual* ast = new AstLessEqual();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstLessEqual::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# LESS_EQUAL   evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+void AstLessEqual::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " <= ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+std::string AstLessEqual::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " <= ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstGreaterEqual::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitGreaterEqual(this);
+}
+AstGreaterEqual* AstGreaterEqual::clone() const
+{
+   AstGreaterEqual* ast = new AstGreaterEqual();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstGreaterEqual::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# GREATER_EQUAL   evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+void AstGreaterEqual::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " >= ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstGreaterEqual::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " >= ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstGreaterThan::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitGreaterThan(this);
+}
+AstGreaterThan* AstGreaterThan::clone() const
+{
+   AstGreaterThan* ast = new AstGreaterThan();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstGreaterThan::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# GREATER_THAN   evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+void AstGreaterThan::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " > ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+
+std::string AstGreaterThan::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " > ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstLessThan::accept(ExprAstVisitor& v)
+{
+	AstRoot::accept(v);
+	v.visitLessThan(this);
+}
+
+AstLessThan* AstLessThan::clone() const
+{
+   AstLessThan* ast = new AstLessThan();
+   if (left_) ast->addChild( left_->clone() );
+   if (right_) ast->addChild( right_->clone() );
+   return ast;
+}
+
+std::ostream& AstLessThan::print( std::ostream& os ) const {
+	Indentor::indent( os ) << "# LESS_THAN   evaluate(" << evaluate() << ")";
+	if (!left_) os << " # ERROR has no left_";
+	if (!right_) os << " # ERROR has no right_";
+	os << "\n";
+	return AstRoot::print( os );
+}
+void AstLessThan::print_flat(std::ostream& os,bool add_bracket) const {
+   if (add_bracket) os << "(";
+   if (left_) left_->print_flat(os,add_bracket);
+   os << " < ";
+   if (right_) right_->print_flat(os,add_bracket);
+   if (add_bracket) os << ")";
+}
+std::string AstLessThan::expression(bool why) const
+{
+ 	std::string ret("(");
+	if (left_) ret += left_->expression(why);
+	ret  += " < ";
+	if (right_) ret += right_->expression(why);
+	ret += ")";
+ 	return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstLeaf::accept(ExprAstVisitor& v)
+{
+	v.visitLeaf(this);
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+void AstInteger::accept(ExprAstVisitor& v)
+{
+	v.visitInteger(this); // Not calling base
+}
+
+AstInteger* AstInteger::clone() const
+{
+   AstInteger* ast = new AstInteger(value_);
+   return ast;
+}
+
+std::ostream& AstInteger::print( std::ostream& os ) const {
+ 	Indentor in;
+	return Indentor::indent( os ) << "# LEAF_INTEGER " << value() << "\n";
+}
+
+void AstInteger::print_flat(std::ostream& os,bool /*add_bracket*/) const {
+   os << value_;
+}
+
+std::string AstInteger::expression(bool /*why*/) const
+{
+	std::stringstream ss;
+	ss << value();
+	return ss.str();
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+
+void AstString::accept(ExprAstVisitor& v)
+{
+	v.visitString(this); // Not calling base
+}
+
+AstString* AstString::clone() const
+{
+   return new AstString(value_);
+}
+
+std::ostream& AstString::print( std::ostream& os ) const {
+	Indentor in;
+	return Indentor::indent( os ) << "# LEAF_STRING " << value_ << " value() = " << value() << "\n";
+}
+void AstString::print_flat(std::ostream& os,bool /*add_bracket*/) const {
+   os << value_;
+}
+
+std::string AstString::expression(bool /*why*/) const
+{
+	return value_;
+}
+
+int AstString::value() const
+{
+	if (value_ == Event::SET()) {    // allow us to compare with a event and a string
+		return 1;
+	}
+	if (value_ == Event::CLEAR()) {  // allow us to compare with a event and a string
+		return 0;
+	}
+	// see if the value is convertible to a integer
+	return Str::to_int( value_, 0/* value to return if conversion fails*/);
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstNodeState::accept(ExprAstVisitor& v)
+{
+	v.visitNodeState(this);  // Not calling base
+}
+
+AstNodeState* AstNodeState::clone() const
+{
+   return new AstNodeState(state_);
+}
+
+std::ostream& AstNodeState::print( std::ostream& os ) const {
+	Indentor in;
+	return Indentor::indent( os ) << "# LEAF_NODE_STATE "
+			<< DState::toString( state_ ) << "(" << value() << ")\n";
+}
+
+void AstNodeState::print_flat(std::ostream& os,bool /*add_bracket*/) const {
+   os <<  DState::toString( state_ ) ;
+}
+
+std::string AstNodeState::expression(bool why) const
+{
+	return DState::toString(state_);
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstEventState::accept(ExprAstVisitor& v)
+{
+	v.visitEventState(this);  // Not calling base
+}
+
+AstEventState* AstEventState::clone() const
+{
+   return new AstEventState(state_);
+}
+
+std::ostream& AstEventState::print( std::ostream& os ) const {
+	Indentor in;
+	return Indentor::indent( os ) << "# LEAF_EVENT_STATE " << state_ << "\n";
+}
+
+void AstEventState::print_flat(std::ostream& os,bool /*add_bracket*/) const {
+   if (state_) os << Event::SET();
+   else        os << Event::CLEAR();
+}
+
+std::string AstEventState::expression(bool /*why*/) const
+{
+	if (state_)  return Event::SET();
+	return Event::CLEAR();
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstNode::accept(ExprAstVisitor& v)
+{
+	v.visitNode(this);  // Not calling base
+}
+
+AstNode* AstNode::clone() const
+{
+   return new AstNode(nodePath_);
+}
+
+DState::State AstNode::state() const
+{
+   // This function is called hundreds of millions of times
+   Node* refNode = referencedNode(); // call once, could be expensive
+   if (refNode) return  refNode->dstate();
+   return DState::UNKNOWN;
+}
+
+Node* AstNode::referencedNode() const
+{
+   // This function is called hundreds of millions of times
+   // One of the server CPU **bottleneck's** is weak ptr locking
+   // Note: gprof does not report on in-lined functions ?
+   Node* ref =  get_ref_node();
+   if ( ref )  {
+      return ref;
+   }
+	if ( parentNode_ ) {
+		std::string errorMsg;
+      ref_node_ = parentNode_->findReferencedNode( nodePath_, errorMsg );
+      return get_ref_node(); // can be NULL
+	}
+	return NULL;
+}
+
+Node* AstNode::referencedNode(std::string& errorMsg) const
+{
+   Node* ref =  get_ref_node();
+   if ( ref )  {
+      return ref;
+   }
+	if ( parentNode_ ) {
+		ref_node_ = parentNode_->findReferencedNode( nodePath_, errorMsg );
+		return get_ref_node(); // can be NULL
+	}
+	return NULL;
+}
+
+std::ostream& AstNode::print( std::ostream& os ) const {
+
+ 	Node* refNode = referencedNode(); // Only call once
+	Indentor in;
+
+	if ( refNode ) {
+		Indentor::indent( os ) << "# LEAF_NODE node_(Found) nodePath_('" << nodePath_ << "') ";
+		os << DState::toString(  refNode->dstate()  ) << "(" << static_cast<int>( refNode->dstate()) << ")\n";
+	}
+	else {
+		Indentor::indent( os ) << "# LEAF_NODE node_(NULL) nodePath_('" << nodePath_ << "') ";
+ 		os << DState::toString( DState::UNKNOWN  ) << "(" << static_cast<int>(DState::UNKNOWN) << ")\n";
+	}
+	return os;
+}
+
+void AstNode::print_flat(std::ostream& os,bool /*add_bracket*/) const {
+   os << nodePath_;
+}
+
+std::string AstNode::expression(bool why) const
+{
+	if (why) {
+		Node* refNode = referencedNode(); // Only call once
+		std::string ret = nodePath_;
+		if ( refNode ) {
+			ret += "(";
+			ret += DState::toString(  refNode->dstate()  );
+			ret += ")";
+			return ret;
+ 		}
+		else {
+			ret += "(?";
+			ret += DState::toString( DState::UNKNOWN  );
+			ret += ")";
+ 		}
+		return ret;
+	}
+	return  nodePath_;
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////////
+
+void AstVariable::accept(ExprAstVisitor& v)
+{
+	v.visitVariable(this);  // Not calling base
+}
+
+AstVariable* AstVariable::clone() const
+{
+   return new AstVariable(nodePath_,name_);
+}
+
+int AstVariable::value() const
+{
+	VariableHelper varHelper(this);
+	return varHelper.value();
+}
+
+int AstVariable::minus(Ast* right) const
+{
+   VariableHelper varHelper(this);
+   return varHelper.minus(right->value());
+}
+
+int AstVariable::plus(Ast* right) const
+{
+   VariableHelper varHelper(this);
+   return varHelper.plus(right->value());
+}
+
+std::ostream& AstVariable::print( std::ostream& os ) const
+{
+	VariableHelper varHelper(this);
+	return varHelper.print(os);
+}
+
+void AstVariable::print_flat(std::ostream& os,bool /*add_bracket*/) const
+{
+   os << nodePath_ << Str::COLON() << name_;
+}
+
+std::string AstVariable::expression(bool why) const
+{
+	if (why) {
+		VariableHelper varHelper(this);
+		std::string ret = nodePath_;
+		if ( !varHelper.theReferenceNode() )  ret += "(?)";
+		ret += Str::COLON();
+		ret += name_;
+		ret += "(";
+
+		std::string varType;
+		int theValue;
+		varHelper.varTypeAndValue(varType,theValue);
+
+		std::stringstream ss; ss << "<type=" << varType << "> <value=" << theValue << ">";
+		ret += ss.str();
+
+		ret += ")";
+		return ret;
+	}
+	return nodePath_ + Str::COLON() + name_;
+}
+
+Node* AstVariable::referencedNode() const
+{
+   Node* ref =  get_ref_node();
+   if ( ref )  {
+      return ref;
+   }
+   if ( parentNode_ ) {
+		std::string ignoredErrorMsg;
+      ref_node_ = parentNode_->findReferencedNode( nodePath_, name_, ignoredErrorMsg );
+      return get_ref_node(); // can be NULL
+   }
+	return NULL;
+}
+
+Node* AstVariable::referencedNode(std::string& errorMsg) const
+{
+   Node* ref =  get_ref_node();
+   if ( ref )  {
+      return ref;
+   }
+	if ( parentNode_ ) {
+		ref_node_ = parentNode_->findReferencedNode( nodePath_, name_, errorMsg );
+		return get_ref_node(); // can be NULL
+	}
+	return NULL;
+}
+
+
+// ===============================================================================
+// class VariableHelper:
+// ===============================================================================
+VariableHelper::VariableHelper(const AstVariable* astVariable)
+: astVariable_(astVariable), theReferenceNode_(NULL)
+{
+	// For *this* constructor we don't care about errors'
+	std::string errorMsg;
+	theReferenceNode_ = astVariable_->referencedNode( errorMsg );
+	if ( !theReferenceNode_ ) {
+		// A node can be NULL  if :
+		// 1/ parentNode is NOT set
+		// 2/ when its a extern path. i.e corresponding suite not loaded yet
+		return;
+	}
+	LOG_ASSERT(errorMsg.empty(),""); // when a reference node is found, the error msg should be empty
+}
+
+// ***NOTE*** This constructor is called during AST construction***. i.e AstResolveVisitor
+// ********** It is used to report errors and to Flag whether meter or event is used
+// ********** in a trigger expression for the simulator
+VariableHelper::VariableHelper(const AstVariable* astVariable, std::string& errorMsg)
+: astVariable_(astVariable), theReferenceNode_(NULL)
+{
+	// for *this* constructor we want to report errors
+	theReferenceNode_ = astVariable_->referencedNode( errorMsg );
+	if ( !theReferenceNode_ ) {
+		// A node can be NULL  if :
+		// 1/ parentNode is NOT set
+		// 2/ when its a extern path. i.e corresponding suite not loaded yet
+		return;
+	}
+	LOG_ASSERT(errorMsg.empty(),""); // when a reference node is found, the error msg should be empty
+
+	// Find in order, event, meter, user variable, repeat, generated variable
+	// ALSO: if meter or event mark as used in trigger, for simulator
+ 	if (theReferenceNode_->findExprVariable( astVariable_->name() ) ) {
+		return;
+	}
+
+	std::stringstream ss;
+	ss << "From expression Variable " << astVariable_->nodePath() << Str::COLON() << astVariable_->name() ;
+	ss << " the referenced node is " << theReferenceNode_->debugNodePath() << "\n";
+	errorMsg += ss.str();
+	errorMsg += "Could not find event, meter, variable, repeat, or generated variable of name('";
+	errorMsg += astVariable_->name();
+	errorMsg += "') on node ";
+	errorMsg += theReferenceNode_->debugNodePath();
+	errorMsg += "\n";
+
+	// FAILED to find astVar->name(), for node theReferenceNode on event, meter,
+	// user variable, repeat, generated variable
+	// SET theReferenceNode_ to NULL, since it does nor reference the Expression variable
+	theReferenceNode_ = NULL;
+}
+
+int VariableHelper::value() const
+{
+	if ( theReferenceNode_ ) {
+		return theReferenceNode_->findExprVariableValue(astVariable_->name());
+	}
+	return 0;
+}
+
+int VariableHelper::plus(int val) const
+{
+   if ( theReferenceNode_ ) {
+      return theReferenceNode_->findExprVariableValueAndPlus(astVariable_->name(),val);
+   }
+   return val;
+}
+
+ int VariableHelper::minus(int val) const
+ {
+    if ( theReferenceNode_ ) {
+       return theReferenceNode_->findExprVariableValueAndMinus(astVariable_->name(),val);
+    }
+    return -val;
+ }
+
+void VariableHelper::varTypeAndValue(std::string& varType, int & theValue) const
+{
+	if ( theReferenceNode_ ) {
+		theValue = theReferenceNode_->findExprVariableValueAndType( astVariable_->name(), varType  );
+		return;
+	}
+	varType = "variable-not-found";
+ 	theValue = 0;
+}
+
+std::ostream& VariableHelper::print( 	std::ostream& os ) const
+{
+	Indentor in;
+	Indentor::indent( os ) << "# " << astVariable_->nodePath() << Str::COLON() << astVariable_->name();
+
+	if ( theReferenceNode_ ) {
+		os << " (";
+		theReferenceNode_->findExprVariableAndPrint(astVariable_->name(), os);
+		os << ")";
+	}
+	else {
+	   os << " referencedNode(NULL) nodePath_('" << astVariable_->nodePath() << "') value(0)";
+	}
+	os << "\n";
+ 	return os;
+}
+
+std::ostream& operator<<( std::ostream& os, const Ast& d){return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstTop& d){return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstRoot& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstNot& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstPlus& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstMinus& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstDivide& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstMultiply& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstModulo& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstAnd& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstOr& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstEqual& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstNotEqual& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstLessEqual& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstGreaterEqual& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstGreaterThan& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstLessThan& d )    {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstLeaf& d )      {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstInteger& d)    {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstString& d)    {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstNodeState& d)  {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstEventState& d) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstNode& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstVariable& d ) {return d.print( os );}
diff --git a/ecflow_4_0_7/ANode/src/ExprAst.hpp b/ecflow_4_0_7/ANode/src/ExprAst.hpp
new file mode 100644
index 0000000..fd5fbbf
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprAst.hpp
@@ -0,0 +1,516 @@
+#ifndef EXPRAST_HPP_
+#define EXPRAST_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #42 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+// The AST is now demand created, and hence we no longer need to persist it
+
+#include <vector>
+#include <assert.h>
+#include <iostream>
+#include <boost/noncopyable.hpp>
+
+#include "DState.hpp"
+#include "NodeFwd.hpp"
+namespace ecf { class ExprAstVisitor;} // forward declare class
+
+//////////////////////////////////////////////////////////////////////////////////
+class Ast {
+public:
+	Ast() {}
+	virtual ~Ast();
+
+	virtual void accept(ecf::ExprAstVisitor&) = 0;
+   virtual Ast* clone() const = 0;
+
+	virtual void addChild(Ast*) {}
+	virtual Ast* left() const { return NULL;}
+	virtual Ast* right() const { return NULL;}
+	virtual bool evaluate() const { assert(false); return false;}
+	virtual bool isleaf() const { return false; }
+	virtual bool isRoot() const { return false; }
+	virtual AstTop* isTop() const { return NULL; }
+	virtual bool empty() const { return true; }
+   virtual int value() const { assert(false); return 0;} // only valid for leaf or operators
+   virtual bool check(std::string& error_msg) const { return true; } // check divide or modulo by zero
+
+   virtual std::ostream& print(std::ostream&) const = 0;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const = 0;    // used for test
+	virtual bool why(std::string& /*theReasonWhy*/) const { return false;}
+	virtual std::string type() const = 0;
+	virtual void exprType(const std::string&) {}
+	std::string name() { return expression(false); } /* ABO */
+	virtual std::string expression(bool why = false) const = 0; // recreate expression from AST, if why show additional state
+
+	// Use for data arithmetic for REPEAT Date, Use default implementation for others
+	// Currently *ONLY* works if repeat variable in on LHS
+   virtual int minus(Ast* right) const { return (value() - right->value());}
+   virtual int plus(Ast* right) const { return (value() + right->value());}
+
+	virtual void setParentNode(Node*){} // traverse and set for interested nodes
+};
+
+class AstTop : public Ast {
+public:
+	AstTop() : root_(NULL) {}
+	virtual ~AstTop();
+
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstTop* clone() const;
+
+ 	virtual Ast* left() const { return root_;}
+ 	virtual void addChild(Ast* r) { root_ = r;}
+	virtual AstTop* isTop() const { return const_cast<AstTop*>(this); }
+ 	virtual bool evaluate() const;
+   virtual bool check(std::string& error_msg) const;
+
+	virtual bool empty() const { return (root_) ? false : true ; }
+	virtual std::ostream& print(std::ostream&) const ;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual bool why(std::string& theReasonWhy) const;
+	virtual std::string type() const { return stype();}
+	virtual void exprType(const std::string& s) { exprType_ = s;}
+	static std::string stype() { return "top";}
+	virtual std::string expression(bool why = false) const;
+	virtual void setParentNode(Node*);
+
+private:
+	Ast*        root_;
+	std::string exprType_; // trigger or complete
+};
+
+// This if one of AND, OR, == != <= >=
+class AstRoot : public Ast {
+public:
+   AstRoot() :left_(NULL), right_(NULL) {}
+	virtual ~AstRoot();
+
+   virtual bool check(std::string& error_msg) const;
+	virtual void accept(ecf::ExprAstVisitor&);
+	virtual void addChild(Ast* n);
+ 	virtual Ast* left() const { return left_;}
+ 	virtual Ast* right() const { return right_;}
+	virtual std::ostream& print(std::ostream& os) const;
+	virtual bool why(std::string& theReasonWhy) const;
+ 	virtual bool isRoot() const { return true;}
+	virtual bool empty() const { return (left_ && right_) ? false : true ; }
+	virtual void setParentNode(Node*);
+
+protected:
+	Ast* left_;
+	Ast* right_;
+};
+
+class AstNot : public AstRoot {
+public:
+	AstNot() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstNot* clone() const;
+
+	virtual bool evaluate() const { assert(!right_);  return ! left_->evaluate();}
+	virtual int value() const {  assert(!right_);     return ! left_->value();}
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+ 	static std::string stype() { return "not";}
+};
+
+
+class AstPlus : public AstRoot {
+public:
+	AstPlus() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstPlus* clone() const;
+
+	virtual bool evaluate() const { return true;}
+	virtual int value() const { return left_->plus(right_);}
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+ 	static std::string stype() { return "plus";}
+};
+
+class AstMinus : public AstRoot {
+public:
+	AstMinus() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstMinus* clone() const;
+
+	virtual bool evaluate() const { return true;}
+	virtual int value() const { return left_->minus(right_); }
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+ 	static std::string stype() { return "minus";}
+};
+
+class AstDivide : public AstRoot {
+public:
+	AstDivide() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstDivide* clone() const;
+	virtual bool evaluate() const { return true;}
+   virtual bool check(std::string& error_msg) const;
+	virtual int value() const; // Log error if right hand side has value of zero
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+ 	static std::string stype() { return "divide";}
+};
+
+class AstMultiply : public AstRoot {
+public:
+	AstMultiply() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstMultiply* clone() const;
+	virtual bool evaluate() const { return true;}
+	virtual int value() const { return  (left_->value() * right_->value());}
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "multiply";}
+};
+
+class AstModulo : public AstRoot {
+public:
+   AstModulo(){}
+   virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstModulo* clone() const;
+   virtual bool check(std::string& error_msg) const;
+   virtual bool evaluate() const { return true;}
+   virtual int value() const; // Log error if right hand side has value of zero
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+   virtual std::string type() const { return stype();}
+   virtual std::string expression(bool why = false) const;
+   static std::string stype() { return "modulo";}
+};
+
+
+class AstAnd : public AstRoot {
+public:
+	AstAnd() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstAnd* clone() const;
+	virtual bool evaluate() const { return (left_->evaluate() && right_->evaluate());}
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "and";}
+};
+
+class AstOr : public AstRoot {
+public:
+	AstOr() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstOr* clone() const;
+	virtual bool evaluate() const { return (left_->evaluate() || right_->evaluate());}
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "or";}
+};
+
+class AstEqual : public AstRoot {
+public:
+	AstEqual() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstEqual* clone() const;
+	virtual bool evaluate() const { return (left_->value() == right_->value()); }
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "equal";}
+};
+
+class AstNotEqual : public AstRoot {
+public:
+	AstNotEqual() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstNotEqual* clone() const;
+	virtual bool evaluate() const { return (left_->value() != right_->value()); }
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "not-equal";}
+};
+
+class AstLessEqual : public AstRoot {
+public:
+	AstLessEqual() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstLessEqual* clone() const;
+	virtual bool evaluate() const { return (left_->value() <= right_->value()); }
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "less-equal";}
+};
+
+class AstGreaterEqual : public AstRoot {
+public:
+	AstGreaterEqual() {}
+	virtual bool evaluate() const { return (left_->value() >= right_->value()); }
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstGreaterEqual* clone() const;
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "greater-equal";}
+};
+
+
+class AstGreaterThan : public AstRoot {
+public:
+	AstGreaterThan() {}
+
+	virtual bool evaluate() const { return (left_->value() > right_->value()); }
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstGreaterThan* clone() const;
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "greater-than";}
+};
+
+
+class AstLessThan : public AstRoot {
+public:
+	AstLessThan() {}
+
+	virtual bool evaluate() const { return (left_->value() < right_->value()); }
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstLessThan* clone() const;
+	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "less-than";}
+};
+
+//=============================================================================================
+/// class AstLeaf
+/// represents Integer, String, Node State, event State, Node, variable
+/// These always represent the right side of the tree
+class AstLeaf : public Ast {
+public:
+  	AstLeaf() {}
+	virtual void accept(ecf::ExprAstVisitor&);
+	virtual bool isleaf() const { return true; }
+};
+
+class AstInteger : public AstLeaf {
+public:
+	AstInteger(int value) : value_(value) {}
+
+	virtual bool evaluate() const {  return value_; } // -1 -2 1 2 3 evaluates to true, 0 returns false
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstInteger* clone() const;
+ 	virtual int value() const {  return value_;}
+ 	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "integer";}
+private:
+	int value_;
+};
+
+class AstString : public AstLeaf {
+public:
+	AstString(const std::string& s) : value_(s) {}
+
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstString* clone() const;
+ 	virtual int value() const;
+ 	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "string";}
+private:
+	std::string value_;
+};
+
+
+class AstNodeState : public AstLeaf {
+public:
+	AstNodeState(DState::State s) : state_(s) {}
+
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstNodeState* clone() const;
+ 	virtual int value() const {  return static_cast<int>(state_);}
+ 	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "node-state";}
+private:
+	DState::State state_;
+};
+
+class AstEventState : public AstLeaf {
+public:
+	AstEventState(bool b) : state_(b) {}
+
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstEventState* clone() const;
+ 	virtual int value() const {  return state_;}
+ 	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+	static std::string stype() { return "event-state";}
+private:
+	bool state_;
+};
+
+
+/// This class will need to determine the corresponding node pointer
+/// This is required so that during evaluation we don't need to search for the Node.
+/// represent nodeName(a), dotPath(./a), dot dot path(../a/b)
+///
+/// A Node without a corresponding Node* will return the integer value of
+/// DState::UNKNOWN for the value() function. This will allow for trigger
+/// of the form:  trigger a == complete or a == unknown
+/// to be evaluated.
+
+class AstNode : public AstLeaf {
+public:
+	AstNode(const std::string& n) : parentNode_(NULL), nodePath_(n) {}
+
+	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstNode* clone() const;
+ 	virtual int value() const { return static_cast<int>(state());}
+  	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+ 	virtual void setParentNode(Node* n) { parentNode_ = n; }
+	static std::string stype() { return "node";}
+
+	const std::string& nodePath() const { return nodePath_;}
+	Node* referencedNode() const;
+	Node* referencedNode(std::string& errorMsg) const;
+	Node* parentNode() const { return parentNode_; }
+	DState::State state() const;
+
+private:
+	Node* get_ref_node() const { return ref_node_.lock().get(); }
+ 	Node* parentNode_;                 // should always be non null, before evaluate.
+   std::string nodePath_;
+ 	mutable weak_node_ptr ref_node_;
+};
+
+/// A variable: This can reference in the CURRENT order:
+///     event,
+///     meter,
+///     user variable,
+///     repeat  variable, for enumerated/string we use the positional value
+///     generated variable
+class AstVariable : public AstLeaf {
+public:
+	AstVariable(const std::string& nodePath, const std::string& variablename)
+	: parentNode_(NULL), nodePath_(nodePath), name_(variablename)  {}
+
+ 	virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstVariable* clone() const;
+	virtual int value() const;
+ 	virtual std::ostream& print(std::ostream& os) const;
+   virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+	virtual std::string type() const { return stype();}
+	virtual std::string expression(bool why = false) const;
+ 	virtual void setParentNode(Node* n) { parentNode_ = n; }
+
+   virtual int minus(Ast* right) const;
+   virtual int plus(Ast* right) const;
+
+	Node* parentNode() const { return parentNode_; }
+	Node* referencedNode() const;
+	Node* referencedNode(std::string& errorMsg) const;
+
+	static std::string stype() { return "variable";}
+	const std::string& nodePath() const { return nodePath_;}
+	const std::string& name() const { return name_;}
+
+private:
+	Node* get_ref_node() const { return ref_node_.lock().get(); }
+
+	Node* parentNode_;
+	std::string nodePath_;
+	std::string name_;
+	mutable weak_node_ptr ref_node_;
+};
+
+// Helper class
+class VariableHelper : private boost::noncopyable {
+public:
+	VariableHelper(const AstVariable* astVariable);
+	VariableHelper(const AstVariable* astVariable, std::string& errorMsg);
+
+	int value() const;
+   int plus(int)const;
+   int minus(int)const;
+
+ 	std::ostream& print(std::ostream& os) const;
+ 	Node* theReferenceNode() const { return theReferenceNode_;}
+
+ 	void varTypeAndValue(std::string& varType, int & value) const;
+
+private:
+	const AstVariable* astVariable_;
+ 	Node* theReferenceNode_;
+};
+
+
+//17
+std::ostream& operator<<(std::ostream& os, const Ast&);
+std::ostream& operator<<(std::ostream& os, const AstTop&);
+std::ostream& operator<<(std::ostream& os, const AstRoot&);
+std::ostream& operator<<(std::ostream& os, const AstNot&);
+std::ostream& operator<<(std::ostream& os, const AstPlus&);
+std::ostream& operator<<(std::ostream& os, const AstMinus&);
+std::ostream& operator<<(std::ostream& os, const AstMultiply&);
+std::ostream& operator<<(std::ostream& os, const AstDivide&);
+std::ostream& operator<<(std::ostream& os, const AstModulo&);
+std::ostream& operator<<(std::ostream& os, const AstAnd&);
+std::ostream& operator<<(std::ostream& os, const AstOr&);
+std::ostream& operator<<(std::ostream& os, const AstEqual&);
+std::ostream& operator<<(std::ostream& os, const AstNotEqual&);
+std::ostream& operator<<(std::ostream& os, const AstLessEqual&);
+std::ostream& operator<<(std::ostream& os, const AstGreaterEqual&);
+std::ostream& operator<<(std::ostream& os, const AstGreaterThan&);
+std::ostream& operator<<(std::ostream& os, const AstLessThan&);
+std::ostream& operator<<(std::ostream& os, const AstLeaf&);
+std::ostream& operator<<(std::ostream& os, const AstInteger&);
+std::ostream& operator<<(std::ostream& os, const AstString&);
+std::ostream& operator<<(std::ostream& os, const AstNodeState&);
+std::ostream& operator<<(std::ostream& os, const AstEventState&);
+std::ostream& operator<<(std::ostream& os, const AstNode&);
+std::ostream& operator<<(std::ostream& os, const AstVariable&);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ExprAstVisitor.cpp b/ecflow_4_0_7/ANode/src/ExprAstVisitor.cpp
new file mode 100644
index 0000000..83939e7
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprAstVisitor.cpp
@@ -0,0 +1,74 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ExprAstVisitor.hpp"
+#include "ExprAst.hpp"
+#include "Node.hpp"
+#include "Log.hpp"
+
+namespace ecf {
+
+//======================================================================================
+
+ExprAstVisitor::~ExprAstVisitor(){}
+
+//======================================================================================
+AstResolveVisitor::AstResolveVisitor(const Node* node) : triggerNode_(node) {}
+AstResolveVisitor::~AstResolveVisitor() {}
+
+void AstResolveVisitor::visitNode(AstNode* astNode)
+{
+	//std::cout << "AstResolveVisitor::visitNode errorMsg = " << errorMsg_ << "\n";
+	if (  errorMsg_.empty()) {
+
+		astNode->setParentNode(const_cast<Node*>(triggerNode_));
+ 		Node* node = astNode->referencedNode( errorMsg_ );
+		if ( !node ) {
+			// A node can be NULL when its a extern path. In this case errorMsg should be empty
+ 			return ;
+		}
+		LOG_ASSERT(errorMsg_.empty(),""); // found Node, make sure errorMsg is empty
+  	}
+}
+
+void AstResolveVisitor::visitVariable(AstVariable* astVar)
+{
+	if ( errorMsg_.empty() ) {
+
+		astVar->setParentNode(const_cast<Node*>(triggerNode_));
+
+		/// Use VariableHelper to populate errorMsg_
+		VariableHelper varHelper(astVar,errorMsg_);
+ 	}
+}
+
+//===========================================================================================================
+
+AstCollateNodesVisitor::AstCollateNodesVisitor( std::set<Node*>& s) : theSet_(s) {}
+AstCollateNodesVisitor::~AstCollateNodesVisitor() {}
+
+void AstCollateNodesVisitor::visitNode(AstNode* astNode)
+{
+	Node* referencedNode = astNode->referencedNode(); // could be expensive, hence don't call twice
+	if ( referencedNode ) theSet_.insert(referencedNode);
+}
+
+void AstCollateNodesVisitor::visitVariable(AstVariable* astVar)
+{
+	Node* referencedNode = astVar->referencedNode(); // could be expensive, hence don't call twice
+	if ( referencedNode ) theSet_.insert(referencedNode);
+}
+
+}
diff --git a/ecflow_4_0_7/ANode/src/ExprAstVisitor.hpp b/ecflow_4_0_7/ANode/src/ExprAstVisitor.hpp
new file mode 100644
index 0000000..dcfc6ed
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprAstVisitor.hpp
@@ -0,0 +1,148 @@
+#ifndef EXPRASTVISITOR_HPP_
+#define EXPRASTVISITOR_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <set>
+#include <string>
+class Node;
+
+class Ast;
+class AstTop;
+class AstRoot;
+class AstAnd;
+class AstNot;
+class AstPlus;
+class AstMinus;
+class AstDivide;
+class AstMultiply;
+class AstModulo;
+class AstOr;
+class AstEqual;
+class AstNotEqual;
+class AstLessEqual;
+class AstGreaterEqual;
+class AstLessThan;
+class AstGreaterThan;
+class AstLeaf;
+class AstInteger;
+class AstString;
+class AstNodeState;
+class AstEventState;
+class AstNode;
+class AstVariable;
+
+namespace ecf {
+
+class ExprAstVisitor {
+public:
+	virtual ~ExprAstVisitor();
+
+  	virtual void visitTop(AstTop*) = 0;
+ 	virtual void visitRoot(AstRoot*) = 0;
+ 	virtual void visitAnd(AstAnd*) = 0;
+ 	virtual void visitNot(AstNot*) = 0;
+ 	virtual void visitPlus(AstPlus*) = 0;
+ 	virtual void visitMinus(AstMinus*) = 0;
+ 	virtual void visitDivide(AstDivide*) = 0;
+   virtual void visitMultiply(AstMultiply*) = 0;
+   virtual void visitModulo(AstModulo*) = 0;
+ 	virtual void visitOr(AstOr*) = 0;
+ 	virtual void visitEqual(AstEqual*) = 0;
+ 	virtual void visitNotEqual(AstNotEqual*) = 0;
+ 	virtual void visitLessEqual(AstLessEqual*) = 0;
+ 	virtual void visitGreaterEqual(AstGreaterEqual*) = 0;
+ 	virtual void visitGreaterThan(AstGreaterThan*) = 0;
+ 	virtual void visitLessThan(AstLessThan*) = 0;
+ 	virtual void visitLeaf(AstLeaf*) = 0;
+ 	virtual void visitInteger(AstInteger*) = 0;
+ 	virtual void visitString(AstString*) = 0;
+ 	virtual void visitNodeState(AstNodeState*) = 0;
+ 	virtual void visitEventState(AstEventState*) = 0;
+ 	virtual void visitNode(AstNode*) = 0;
+ 	virtual void visitVariable(AstVariable*) = 0;
+};
+
+class AstResolveVisitor : public ExprAstVisitor {
+public:
+	AstResolveVisitor(const Node* );
+	virtual ~AstResolveVisitor();
+
+	const std::string& errorMsg() const { return errorMsg_;}
+
+  	virtual void visitTop(AstTop*){}
+ 	virtual void visitRoot(AstRoot*){}
+ 	virtual void visitAnd(AstAnd*){}
+ 	virtual void visitNot(AstNot*){}
+ 	virtual void visitPlus(AstPlus*){}
+ 	virtual void visitMinus(AstMinus*){}
+ 	virtual void visitDivide(AstDivide*){}
+   virtual void visitMultiply(AstMultiply*){}
+   virtual void visitModulo(AstModulo*){}
+ 	virtual void visitOr(AstOr*){}
+ 	virtual void visitEqual(AstEqual*){}
+ 	virtual void visitNotEqual(AstNotEqual*){}
+ 	virtual void visitLessEqual(AstLessEqual*){}
+ 	virtual void visitGreaterEqual(AstGreaterEqual*){}
+ 	virtual void visitGreaterThan(AstGreaterThan*){}
+ 	virtual void visitLessThan(AstLessThan*){}
+ 	virtual void visitLeaf(AstLeaf*){}
+ 	virtual void visitInteger(AstInteger*){}
+ 	virtual void visitString(AstString*){}
+ 	virtual void visitNodeState(AstNodeState*){}
+ 	virtual void visitEventState(AstEventState*){}
+ 	virtual void visitNode(AstNode*);
+  	virtual void visitVariable(AstVariable*);
+
+private:
+	const Node* triggerNode_;
+ 	std::string errorMsg_;
+};
+
+class AstCollateNodesVisitor : public ExprAstVisitor {
+public:
+	AstCollateNodesVisitor( std::set<Node*>& );
+	virtual ~AstCollateNodesVisitor();
+
+  	virtual void visitTop(AstTop*){}
+ 	virtual void visitRoot(AstRoot*){}
+ 	virtual void visitAnd(AstAnd*){}
+ 	virtual void visitNot(AstNot*){}
+ 	virtual void visitPlus(AstPlus*){}
+ 	virtual void visitMinus(AstMinus*){}
+ 	virtual void visitDivide(AstDivide*){}
+   virtual void visitMultiply(AstMultiply*){}
+   virtual void visitModulo(AstModulo*){}
+ 	virtual void visitOr(AstOr*){}
+ 	virtual void visitEqual(AstEqual*){}
+ 	virtual void visitNotEqual(AstNotEqual*){}
+ 	virtual void visitLessEqual(AstLessEqual*){}
+ 	virtual void visitGreaterEqual(AstGreaterEqual*){}
+ 	virtual void visitGreaterThan(AstGreaterThan*){}
+ 	virtual void visitLessThan(AstLessThan*){}
+ 	virtual void visitLeaf(AstLeaf*){}
+ 	virtual void visitInteger(AstInteger*){}
+ 	virtual void visitString(AstString*){}
+ 	virtual void visitNodeState(AstNodeState*){}
+ 	virtual void visitEventState(AstEventState*){}
+ 	virtual void visitNode(AstNode*);
+  	virtual void visitVariable(AstVariable*);
+
+private:
+ 	std::set<Node*>& theSet_;
+};
+}
+#endif /* EXPRASTVISITOR_HPP_ */
diff --git a/ecflow_4_0_7/ANode/src/ExprDuplicate.cpp b/ecflow_4_0_7/ANode/src/ExprDuplicate.cpp
new file mode 100644
index 0000000..02127a5
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprDuplicate.cpp
@@ -0,0 +1,61 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#if defined(HPUX)
+#include <map>
+#else
+#include <boost/unordered_map.hpp>
+#endif
+#include <boost/foreach.hpp>
+
+#include "ExprDuplicate.hpp"
+#include "ExprAst.hpp"
+
+////////////////////////////////////////////////////////////////////////////
+using namespace std;
+
+#if defined(HPUX)
+// boost 1.51 HPUX has problems with boost::unordered_map
+static std::map< std::string, AstTop* > duplicate_expr;
+typedef std::map< std::string, AstTop* > my_map;
+#else
+static boost::unordered_map< std::string, AstTop* > duplicate_expr;
+typedef boost::unordered_map< std::string, AstTop* > my_map;
+#endif
+
+
+ExprDuplicate::~ExprDuplicate()
+{
+//   cout << "ExprDuplicate::~ExprDuplicate()\n";
+   BOOST_FOREACH(my_map::value_type i, duplicate_expr) {
+      AstTop* top = i.second;
+      delete top;
+   }
+   duplicate_expr.clear();
+}
+
+std::auto_ptr<AstTop> ExprDuplicate::find(const std::string& expr)
+{
+   my_map::const_iterator it = duplicate_expr.find(expr);
+   if (it != duplicate_expr.end()) {
+      return std::auto_ptr<AstTop>((*it).second->clone());
+   }
+   return std::auto_ptr<AstTop>();
+}
+
+void ExprDuplicate::add(const std::string& expr,AstTop* ast)
+{
+   assert(!expr.empty() && ast);
+   duplicate_expr.insert( std::make_pair(expr,ast->clone()));
+}
diff --git a/ecflow_4_0_7/ANode/src/ExprDuplicate.hpp b/ecflow_4_0_7/ANode/src/ExprDuplicate.hpp
new file mode 100644
index 0000000..b54565b
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprDuplicate.hpp
@@ -0,0 +1,44 @@
+#ifndef EXPR_DUPLICATE_
+#define EXPR_DUPLICATE_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+// =========================================================================
+// For large designs > 90% of triggers are identical.
+// We take advantage of this by using a map to store a *CLONED* ast
+// This saves a huge amount on re-parsing using spirit classic.
+//
+// This cloned  AST is maintained in a static map, hence we need to
+// manage the lifetime, to avoid valgrind complaining.
+// =========================================================================
+
+#include <string>
+#include <memory> // for auto_ptr
+#include <boost/noncopyable.hpp>
+class AstTop;
+
+// reclaim memory allocated in map, Avoid valgrind errors
+class ExprDuplicate : private boost::noncopyable {
+public:
+   ExprDuplicate() {}
+   ~ExprDuplicate();
+
+   // Find the expr in the map, if found returns a CLONED ast, else NULL
+   static std::auto_ptr<AstTop> find(const std::string& expr);
+
+   // Add the expr to the map, the ast is cloned.
+   static void add(const std::string& expr,AstTop*);
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ExprParser.cpp b/ecflow_4_0_7/ANode/src/ExprParser.cpp
new file mode 100644
index 0000000..68fcb29
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprParser.cpp
@@ -0,0 +1,933 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #30 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+// Un-comment these for selective for debugging. At the moment because we have added
+//            ast generation BOOST_SPIRIT_DEBUG is to verbose, making debugging a pain.
+// Tpyically I will comment out ONLY BOOST_SPIRIT_DEBUG and enable all the others
+//#define BOOST_SPIRIT_DEBUG
+//#define BOOST_SPIRIT_DUMP_PARSETREE_AS_XML
+//#define PRINT_TREE
+//#define PRINT_AST_TRAVERSAL
+//#define PRINT_AST
+
+#include <boost/spirit/include/classic.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_actor.hpp>
+#include <boost/spirit/include/classic_attribute.hpp>
+#include <boost/spirit/include/classic_confix.hpp>
+#include <boost/spirit/include/phoenix1_binders.hpp>
+#include <boost/spirit/include/classic_ast.hpp>
+#include <boost/spirit/include/classic_tree_to_xml.hpp>
+
+#include "boost/lambda/lambda.hpp"
+#include "boost/lambda/bind.hpp"
+#include "boost/cast.hpp"
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#include <iostream>
+#include <string>
+#include <utility>
+#include <stack>
+#include <sstream>
+#include <map>
+
+#include "ExprParser.hpp"
+#include "ExprAst.hpp"
+#include "ExprDuplicate.hpp"
+#include "Indentor.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+
+// Reference
+//‘*’   Zero or more
+//‘!’   Zero or one
+//‘+’   One or more
+//‘>>’  Sequence/concatenation
+//‘|’   alternate
+//‘-‘   not
+
+////////////////////////////////////////////////////////////////////////////
+using namespace ecf;
+using namespace std;
+using namespace boost::spirit;
+using namespace phoenix;
+using namespace BOOST_SPIRIT_CLASSIC_NS;
+
+/////////////////////////////////////////////////////////////////////////////
+typedef tree_match<const char*>    treematch_t;
+typedef treematch_t::tree_iterator tree_iter_t;
+
+//////////////////////////////////////////////////////////////////////////////
+
+struct ExpressionGrammer : public grammar<ExpressionGrammer>
+{
+	// The parser object is copied a lot, so only use reference/pointer variables as data members
+	ExpressionGrammer(){}
+	~ExpressionGrammer(){}
+
+	static const int integer_ID  = 1;
+	static const int dot_path_ID = 2;
+	static const int equal_1_ID  = 3;
+	static const int equal_2_ID  = 4;
+	static const int not_equal_1_ID = 5;
+	static const int not_equal_2_ID = 6;
+	static const int node_name_ID   = 7;
+	static const int greater_equals_1_ID = 8;
+	static const int greater_equals_2_ID = 9;
+	static const int less_equals_1_ID   = 10;
+	static const int less_equals_2_ID   = 11;
+	static const int less_than_1_ID     = 12;
+	static const int less_than_2_ID     = 13;
+	static const int greater_than_1_ID  = 14;
+	static const int greater_than_2_ID  = 15;
+	static const int node_state_unknown_ID    = 16;
+
+ 	static const int node_state_complete_ID   = 18;
+	static const int node_state_queued_ID     = 19;
+	static const int node_state_submitted_ID  = 20;
+	static const int node_state_active_ID     = 21;
+	static const int node_state_aborted_ID    = 22;
+	static const int not1_ID           = 23;
+	static const int not2_ID          = 24;
+	static const int and_ID           = 25;
+	static const int or_ID            = 26;
+	static const int event_ID         = 27;
+ 	static const int dot_dot_path_ID     = 28;
+	static const int event_name_ID       = 29;
+ 	static const int base_trigger_ID     = 30;
+	static const int sub_expression_ID   = 31;
+	static const int grouping_ID         = 32;
+	static const int node_path_state_ID  = 33;
+	static const int absolute_path_ID    = 34;
+	static const int some_string_ID      = 35;
+	static const int variable_ID         = 36;
+	static const int variable_path_ID    = 37;
+	static const int normal_variable_path_ID   = 38;
+	static const int grouped_variable_path_ID  = 39;
+	static const int variable_expression_ID    = 40;
+	static const int plus_ID      = 41;
+	static const int minus_ID     = 42;
+	static const int multiply_ID  = 43;
+   static const int divide_ID    = 44;
+   static const int modulo_ID    = 45;
+
+    template <typename ScannerT>
+    struct definition {
+        rule<ScannerT,parser_tag<integer_ID> > integer;
+        rule<ScannerT,parser_tag<plus_ID> > plus;
+        rule<ScannerT,parser_tag<minus_ID> > minus;
+        rule<ScannerT,parser_tag<multiply_ID> > multiply;
+        rule<ScannerT,parser_tag<divide_ID> > divide;
+        rule<ScannerT,parser_tag<modulo_ID> > modulo;
+
+        rule<ScannerT,parser_tag<equal_1_ID> > equal_1;
+        rule<ScannerT,parser_tag<equal_2_ID> > equal_2;
+        rule<ScannerT,parser_tag<not_equal_1_ID> > not_equal_1;
+        rule<ScannerT,parser_tag<not_equal_2_ID> > not_equal_2;
+        rule<ScannerT,parser_tag<node_name_ID> > nodename;
+
+        rule<ScannerT,parser_tag<greater_equals_1_ID> > greater_equals_1;
+        rule<ScannerT,parser_tag<greater_equals_2_ID> > greater_equals_2;
+        rule<ScannerT,parser_tag<less_equals_1_ID> > less_equals_1;
+        rule<ScannerT,parser_tag<less_equals_2_ID> > less_equals_2;
+
+        rule<ScannerT,parser_tag<less_than_1_ID> > less_than_1;
+        rule<ScannerT,parser_tag<less_than_2_ID> > less_than_2;
+        rule<ScannerT,parser_tag<greater_than_1_ID> > greater_than_1;
+        rule<ScannerT,parser_tag<greater_than_2_ID> > greater_than_2;
+
+        rule<ScannerT,parser_tag<node_state_unknown_ID> >    node_state_unknown;
+        rule<ScannerT,parser_tag<node_state_complete_ID> >   node_state_complete;
+        rule<ScannerT,parser_tag<node_state_queued_ID> >     node_state_queued;
+        rule<ScannerT,parser_tag<node_state_submitted_ID> >  node_state_submitted;
+        rule<ScannerT,parser_tag<node_state_active_ID> >     node_state_active;
+        rule<ScannerT,parser_tag<node_state_aborted_ID> >    node_state_aborted;
+
+        rule<ScannerT,parser_tag<not1_ID> >   not1_r;
+        rule<ScannerT,parser_tag<not2_ID> >   not2_r;
+        rule<ScannerT,parser_tag<not2_ID> >   not3_r;
+        rule<ScannerT,parser_tag<and_ID> >   and_r;
+        rule<ScannerT,parser_tag<or_ID> >    or_r;
+        rule<ScannerT,parser_tag<event_ID> > event;
+
+        rule<ScannerT,parser_tag<dot_path_ID> >      dotpath;
+        rule<ScannerT,parser_tag<dot_dot_path_ID> >  dotdotpath;
+        rule<ScannerT,parser_tag<absolute_path_ID> > absolutepath;
+        rule<ScannerT,parser_tag<event_name_ID> >    eventname;
+
+        rule<ScannerT,parser_tag<base_trigger_ID> >     baseTrigger;
+        rule<ScannerT,parser_tag<sub_expression_ID> >   subexpression;
+        rule<ScannerT,parser_tag<grouping_ID> >         grouping;
+        rule<ScannerT,parser_tag<node_path_state_ID> >  nodepathstate;
+
+        rule<ScannerT,parser_tag<some_string_ID> >   some_string;
+        rule<ScannerT,parser_tag<variable_ID> >      variable;
+        rule<ScannerT,parser_tag<variable_path_ID> > variable_path;
+        rule<ScannerT,parser_tag<normal_variable_path_ID> >  normal_variable_path;
+        rule<ScannerT,parser_tag<grouped_variable_path_ID> > grouped_variable_path;
+        rule<ScannerT,parser_tag<variable_expression_ID> >   variable_expression;
+
+        rule<ScannerT> not_r,less_than_comparable,expression,andExpr,orExpr,operators;
+        rule<ScannerT> nodestate, equality_comparible, and_or, nodepath ;
+        rule<ScannerT> andsubexpression, orsubexpression,integerComparison,notGrouping ;
+
+        //        ‘*’   Zero or more
+        //        ‘!’   Zero or one
+        //        ‘+’   One or more
+        //        ‘>>’  Sequence/concatenation
+        //        ‘|’   alternate
+        //        ‘-‘   not
+        definition(ExpressionGrammer const& /*self*/)
+        {
+        	 nodename
+                = leaf_node_d[
+								  lexeme_d [ (alnum_p || ch_p('_')) >> *(alnum_p || ch_p('_'))  ]
+                             ]
+                ;
+
+        	 // Can be /suite/family/task
+        	 //        family/task
+        	 //        family
+        	 absolutepath
+				 = 	leaf_node_d[
+								!(str_p("/")) >> nodename
+        									  >> *(
+        											+ str_p("/")  >> nodename
+        										  )
+        				   	  ]
+        		;
+        	 dotdotpath  // a kind of relative path
+				 = 	leaf_node_d[
+									str_p("..")
+									>> *(
+											+ str_p("/") >> str_p("..")
+										)
+									>> +(
+											+ str_p("/")  >> nodename
+										)
+				   	           ]
+				  ;
+        	 dotpath = leaf_node_d[ str_p(".") >> +( str_p("/") >> nodename) ];
+        	 nodepath =  absolutepath | dotdotpath | dotpath  ;
+
+        	 // Integer is distinct from task/family names that are integers, since nodes with integer
+        	 // names that occur in trigger/complete expression must have path ./0 ./1
+        	 integer  =   leaf_node_d[  uint_p  ];
+        	 plus = root_node_d [ str_p("+") ];
+        	 minus = root_node_d [ str_p("-") ];
+        	 divide = root_node_d [ str_p("/") ];
+          multiply = root_node_d [ str_p("*") ];
+          modulo = root_node_d [ str_p("%") ];
+        	 operators = plus | minus | divide | multiply | modulo ;
+
+        	 equal_1 = root_node_d [ str_p("==") ];
+        	 equal_2 = root_node_d [ str_p("eq") ];
+        	 not_equal_1 = root_node_d [ str_p("!=") ];
+        	 not_equal_2 = root_node_d [ str_p("ne") ];
+        	 equality_comparible  = equal_1 | equal_2 | not_equal_2  | not_equal_1;
+
+        	 greater_equals_1 = root_node_d [ str_p(">=") ];
+        	 greater_equals_2 = root_node_d [ str_p("ge") ];
+        	 less_equals_1 = root_node_d [ str_p("<=") ];
+        	 less_equals_2 = root_node_d [ str_p("le") ];
+        	 less_than_1 = root_node_d [ str_p("<") ];
+        	 less_than_2 = root_node_d [ str_p("lt") ];
+          greater_than_1 = root_node_d [ str_p(">") ];
+          greater_than_2 = root_node_d [ str_p("gt") ];
+          // Prioritise to most common first, to speed up parsing
+        	 less_than_comparable
+				 =  greater_equals_2
+				    | less_equals_2
+				    | greater_than_2
+				    | less_than_2
+				    | greater_equals_1
+				    | less_equals_1
+				    | less_than_1
+				    | greater_than_1
+				  ;
+
+        	 not1_r = root_node_d [ str_p("not") ];
+          not2_r = root_node_d [ str_p("~") ];
+          not3_r = root_node_d [ str_p("!") ];
+        	 not_r = not1_r | not3_r | not2_r;
+
+        	 and_r = root_node_d [ str_p("and") ] || root_node_d [ str_p("&&") ] ;
+        	 or_r = root_node_d [ str_p("or") ]   || root_node_d [ str_p("||") ] ;
+        	 and_or =  and_r |  or_r;
+
+
+          eventname = leaf_node_d [ nodename ];
+        	 event
+				 =  nodepath
+				    >>  discard_node_d[ ch_p(':') ]
+				    >>  eventname
+ 				  ;
+
+        	 some_string = leaf_node_d[ str_p("set") ] || leaf_node_d[ str_p("clear")] ;
+
+        	 variable = leaf_node_d [ nodename ];
+        	 normal_variable_path
+				 = nodepath
+				   >> discard_node_d[ ch_p(':') ]
+				   >> variable
+			      >> !(operators >> (integer | normal_variable_path))
+			     ;
+        	 grouped_variable_path
+				 =  discard_node_d[ ch_p('(') ]
+				    >> normal_variable_path
+				    >> discard_node_d[ ch_p(')') ]
+				 ;
+        	 variable_path = grouped_variable_path | normal_variable_path ;
+
+        	 variable_expression
+				  =   variable_path
+ 					  >> ( less_than_comparable | equality_comparible  )
+					  >> !not_r
+					  >> ( variable_path | integer | some_string  )
+				  ;
+
+
+        	 node_state_unknown = root_node_d [ str_p("unknown") ];
+          node_state_complete = root_node_d [ str_p("complete") ];
+        	 node_state_queued = root_node_d [ str_p("queued") ];
+        	 node_state_submitted = root_node_d [ str_p("submitted") ];
+        	 node_state_active = root_node_d [ str_p("active") ];
+        	 node_state_aborted = root_node_d [ str_p("aborted") ];
+        	 nodestate
+				  =  node_state_complete
+				    | node_state_aborted
+				    | node_state_active
+				    | node_state_queued
+				    | node_state_submitted
+ 				    | node_state_unknown
+				    ;
+        	  nodepathstate = nodepath >> equality_comparible >> nodestate;
+
+        	  integerComparison = integer >> ( less_than_comparable | equality_comparible) >> ( integer | variable_path );
+
+         	  baseTrigger
+				  =  !not_r
+				     >> (
+				    		nodepathstate
+				    		| variable_expression
+				    		| event                 // event if of the form  'a:name'
+				    		| integerComparison     // 1 eq 1
+				    	)
+				  ;
+        	  andExpr = baseTrigger >> and_r >> baseTrigger;
+        	  orExpr = baseTrigger >> or_r >> baseTrigger;
+
+        	  // We need to take special care so that 'and' has a higher priority then 'or'
+        	  andsubexpression = andExpr >> *(and_or >> subexpression);
+
+        	  orsubexpression =  baseTrigger >> +(or_r >> subexpression);
+
+        	  subexpression =  (andsubexpression |  orsubexpression | baseTrigger | notGrouping | integer)
+        	                   >> *(and_or >> subexpression );
+
+        	  grouping
+				  =  discard_node_d[ ch_p('(') ]
+				     >> subexpression
+				     >> discard_node_d[ ch_p(')') ]
+			      ;
+
+        	  notGrouping =  !not_r >> grouping >> *(and_or >> subexpression);
+        	  expression = ( notGrouping  | subexpression  ) >> end_p;
+
+              BOOST_SPIRIT_DEBUG_NODE(notGrouping);
+              BOOST_SPIRIT_DEBUG_NODE(expression);
+              BOOST_SPIRIT_DEBUG_NODE(andExpr);
+              BOOST_SPIRIT_DEBUG_NODE(not_r);
+              BOOST_SPIRIT_DEBUG_NODE(not1_r);
+              BOOST_SPIRIT_DEBUG_NODE(not2_r);
+              BOOST_SPIRIT_DEBUG_NODE(orExpr);
+              BOOST_SPIRIT_DEBUG_NODE(expression);
+              BOOST_SPIRIT_DEBUG_NODE(nodename);
+              BOOST_SPIRIT_DEBUG_NODE(nodepath);
+              BOOST_SPIRIT_DEBUG_NODE(dotdotpath);
+              BOOST_SPIRIT_DEBUG_NODE(dotpath);
+              BOOST_SPIRIT_DEBUG_NODE(absolutepath);
+              BOOST_SPIRIT_DEBUG_NODE(event);
+              BOOST_SPIRIT_DEBUG_NODE(less_than_comparable);
+              BOOST_SPIRIT_DEBUG_NODE(nodestate);
+              BOOST_SPIRIT_DEBUG_NODE(equality_comparible);
+              BOOST_SPIRIT_DEBUG_NODE(equal_1);
+              BOOST_SPIRIT_DEBUG_NODE(equal_2);
+              BOOST_SPIRIT_DEBUG_NODE(not_equal_1);
+              BOOST_SPIRIT_DEBUG_NODE(not_equal_2);
+              BOOST_SPIRIT_DEBUG_NODE(and_or);
+              BOOST_SPIRIT_DEBUG_NODE(operators);
+              BOOST_SPIRIT_DEBUG_NODE(baseTrigger);
+              BOOST_SPIRIT_DEBUG_NODE(subexpression);
+              BOOST_SPIRIT_DEBUG_NODE(andsubexpression);
+              BOOST_SPIRIT_DEBUG_NODE(orsubexpression);
+              BOOST_SPIRIT_DEBUG_NODE(grouping);
+              BOOST_SPIRIT_DEBUG_NODE(nodepathstate);
+              BOOST_SPIRIT_DEBUG_NODE(integer);
+              BOOST_SPIRIT_DEBUG_NODE(some_string);
+              BOOST_SPIRIT_DEBUG_NODE(variable);
+              BOOST_SPIRIT_DEBUG_NODE(variable_path);
+              BOOST_SPIRIT_DEBUG_NODE(variable_expression);
+              BOOST_SPIRIT_DEBUG_NODE(integerComparison);
+         };
+
+        rule<ScannerT> const& start() const { return expression; }
+    };
+};
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+void print(tree_parse_info<> info,
+           const std::string& expr,
+           const std::map< parser_id, std::string >& rule_names);
+
+AstTop* createAst( 	tree_parse_info< > info,
+					const std::string& expr,
+					const std::map< parser_id, std::string >& rule_names );
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+ExprParser::ExprParser(  const std::string& expression ): expr_(expression) {}
+
+static std::map< parser_id, std::string > rule_names;
+static void populate_rule_names()
+{
+   if (rule_names.empty()) {
+      rule_names[ExpressionGrammer::equal_1_ID] = "EQUALS";
+      rule_names[ExpressionGrammer::equal_2_ID] = "EQUALS";
+      rule_names[ExpressionGrammer::not_equal_1_ID] = "NOT_EQUAL";
+      rule_names[ExpressionGrammer::not_equal_2_ID] = "NOT_EQUAL";
+      rule_names[ExpressionGrammer::greater_equals_1_ID] = "GREATER_THAN_OR_EQUALS";
+      rule_names[ExpressionGrammer::greater_equals_2_ID] = "GREATER_THAN_OR_EQUALS";
+      rule_names[ExpressionGrammer::less_equals_1_ID] = "LESS_THAN_OR_EQUALS";
+      rule_names[ExpressionGrammer::less_equals_2_ID] = "LESS_THAN_OR_EQUALS";
+      rule_names[ExpressionGrammer::less_than_1_ID] = "LESS_THAN";
+      rule_names[ExpressionGrammer::less_than_2_ID] = "LESS_THAN";
+      rule_names[ExpressionGrammer::greater_than_1_ID] = "GREATER_THAN";
+      rule_names[ExpressionGrammer::greater_than_2_ID] = "GREATER_THAN";
+      rule_names[ExpressionGrammer::not1_ID ]  = "NOT";
+      rule_names[ExpressionGrammer::not2_ID ] = "NOT";
+      rule_names[ExpressionGrammer::and_ID ] = "AND";
+      rule_names[ExpressionGrammer::or_ID ] = "OR";
+      rule_names[ExpressionGrammer::node_name_ID] = "NODE_NAME";
+      rule_names[ExpressionGrammer::node_state_unknown_ID ] = "UNKNOWN";
+      rule_names[ExpressionGrammer::node_state_complete_ID ] = "COMPLETE";
+      rule_names[ExpressionGrammer::node_state_queued_ID ] = "QUEUED";
+      rule_names[ExpressionGrammer::node_state_submitted_ID ] = "SUBMITTED";
+      rule_names[ExpressionGrammer::node_state_active_ID ] = "ACTIVE";
+      rule_names[ExpressionGrammer::node_state_aborted_ID ] = "ABORTED";
+      rule_names[ExpressionGrammer::integer_ID] = "INTEGER";
+      rule_names[ExpressionGrammer::event_ID ] = "EVENT";
+      rule_names[ExpressionGrammer::dot_path_ID ] = "DOT_PATH";
+      rule_names[ExpressionGrammer::dot_dot_path_ID ] = "DOT_DOT_PATH";
+      rule_names[ExpressionGrammer::absolute_path_ID ] = "ABSOLUTE_PATH";
+      rule_names[ExpressionGrammer::event_name_ID ] = "EVENT_NAME";
+
+      rule_names[ExpressionGrammer::base_trigger_ID  ] = "BASE_TRIGGER";
+      rule_names[ExpressionGrammer::sub_expression_ID  ] = "SUB_EXPRESSION";
+      rule_names[ExpressionGrammer::grouping_ID  ] = "GROUPING";
+      rule_names[ExpressionGrammer::node_path_state_ID  ] = "NODE_PATH_STATE";
+
+      rule_names[ExpressionGrammer::some_string_ID  ]   = "STRING";
+      rule_names[ExpressionGrammer::variable_ID  ]      = "VARIABLE";
+      rule_names[ExpressionGrammer::variable_path_ID  ] = "VARIABLE_PATH";
+      rule_names[ExpressionGrammer::grouped_variable_path_ID  ] = "GROUPED_VARIABLE_PATH";
+      rule_names[ExpressionGrammer::normal_variable_path_ID  ] = "NORMAL_VARIABLE_PATH";
+      rule_names[ExpressionGrammer::variable_expression_ID  ] = "VARIABLE_EXPRESSION";
+   }
+}
+
+bool ExprParser::doParse(std::string& errorMsg)
+{
+	if (expr_.empty()) {
+		errorMsg = "Expression is empty";
+		return false;
+	}
+
+	// =========================================================================
+	// For large designs > 90% of triggers are identical.
+	// We take advantage of this by only parsing the expression once
+	// and storing then Abstract Syntax tree( via cloning ) using a map
+	// This saves a huge amount of CPU time in re-parsing using spirit classic.
+	// =========================================================================
+	ast_ = ExprDuplicate::find(expr_);
+	if (ast_.get()) {
+		return true;
+	}
+
+	SimpleExprParser simpleParser(expr_);
+	if (simpleParser.doParse()) {
+	   ast_ = simpleParser.ast();
+	   ExprDuplicate::add(expr_,ast_.get());  // bypass spirit if same expression used
+	   return true;
+	}
+
+	// SPIRIT CLASSIC parsing: very slooooow....
+	ExpressionGrammer grammer;
+   BOOST_SPIRIT_DEBUG_NODE(grammer);
+
+   // Use parser that generates a abstract syntax tree
+   tree_parse_info<> info = ast_parse( expr_.c_str(), grammer, space_p);
+   if (info.full) {
+
+	   populate_rule_names();
+
+#if defined(BOOST_SPIRIT_DUMP_PARSETREE_AS_XML)
+		tree_to_xml( cout, info.trees, expr_.c_str(), rule_names );
+#endif
+#if defined(PRINT_TREE)
+		print(info,expr_,rule_names);
+#endif
+		// Spirit has created a AST for us. However it is not use able as is
+		// we will traverse the AST and create our OWN  persist-able AST.
+ 		ast_.reset( createAst(info,expr_,rule_names) );
+ 		if (ast_->empty())  errorMsg = "Abstract syntax tree creation failed";
+ 		else {
+ 		  ExprDuplicate::add(expr_,ast_.get());
+ 		}
+		return errorMsg.empty();
+ 	}
+	else {
+	   std::stringstream ss;
+ 		ss << "Parsing failed\n";
+		ss << "length = " << std::dec << info.length << "\n";
+		ss << "stopped at: \": " << info.stop << "\"\n";
+		errorMsg = ss.str();
+ 	}
+	return false;
+}
+
+
+// The evaluation function for the AST
+void do_print(const tree_iter_t& i,  const std::map< parser_id, std::string >& rule_names)
+{
+	Indentor in;
+	std::map< parser_id, std::string >::const_iterator iter = rule_names.find(i->value.id());
+	if (iter != rule_names.end()) {
+		Indentor::indent(cout) << "Rule " << (*iter).second
+			<< "  " << string( i->value.begin(), i->value.end() ) << endl;
+	}
+	else {
+		Indentor::indent(cout) << "Unknown rule "
+			<< "  " << string( i->value.begin(), i->value.end() ) <<  endl;
+	}
+
+	Indentor in2;
+ 	for (tree_iter_t t = i->children.begin(); t != i->children.end(); ++t) {
+		do_print( t, rule_names );
+	}
+}
+
+void print(tree_parse_info<> info,
+           const std::string& expr,
+           const std::map< parser_id, std::string >& rule_names)
+{
+	std::cout << "\nPRINT_TREE  " << expr << "\n";
+	do_print(info.trees.begin(),rule_names);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+
+AstRoot* createRootNode(const tree_iter_t& i,  const std::map< parser_id, std::string >& rule_names)
+{
+#if defined(PRINT_AST_TRAVERSAL)
+ 	Indentor in;
+	std::map< parser_id, std::string >::const_iterator iter = rule_names.find(i->value.id());
+	if (iter != rule_names.end()) {
+		Indentor::indent(cout) << "Root Rule " << (*iter).second
+			<< "  " << string( i->value.begin(), i->value.end() ) << endl;
+	}
+	else {
+		Indentor::indent(cout) << "Unknown root rule "
+			<< "  " << string( i->value.begin(), i->value.end() ) <<  endl;
+	}
+#endif
+
+	if ( i->value.id() == ExpressionGrammer::equal_1_ID ) return new AstEqual();
+	if ( i->value.id() == ExpressionGrammer::equal_2_ID ) return new AstEqual();
+	if ( i->value.id() == ExpressionGrammer::and_ID ) return new AstAnd();
+	if ( i->value.id() == ExpressionGrammer::or_ID ) return new AstOr();
+	if ( i->value.id() == ExpressionGrammer::not1_ID ) return new AstNot();
+	if ( i->value.id() == ExpressionGrammer::not2_ID ) return new AstNot();
+	if ( i->value.id() == ExpressionGrammer::plus_ID ) return new AstPlus();
+
+	if ( i->value.id() == ExpressionGrammer::not_equal_1_ID ) return new AstNotEqual();
+	if ( i->value.id() == ExpressionGrammer::not_equal_2_ID ) return new AstNotEqual();
+	if ( i->value.id() == ExpressionGrammer::greater_equals_1_ID ) return new AstGreaterEqual();
+	if ( i->value.id() == ExpressionGrammer::greater_equals_2_ID ) return new AstGreaterEqual();
+	if ( i->value.id() == ExpressionGrammer::less_equals_1_ID ) return new AstLessEqual();
+	if ( i->value.id() == ExpressionGrammer::less_equals_2_ID ) return new AstLessEqual();
+	if ( i->value.id() == ExpressionGrammer::less_than_1_ID ) return new AstLessThan();
+	if ( i->value.id() == ExpressionGrammer::less_than_2_ID ) return new AstLessThan();
+	if ( i->value.id() == ExpressionGrammer::greater_than_1_ID ) return new AstGreaterThan();
+	if ( i->value.id() == ExpressionGrammer::greater_than_2_ID ) return new AstGreaterThan();
+
+	if ( i->value.id() == ExpressionGrammer::minus_ID ) return new AstMinus();
+	if ( i->value.id() == ExpressionGrammer::multiply_ID ) return new AstMultiply();
+   if ( i->value.id() == ExpressionGrammer::divide_ID ) return new AstDivide();
+   if ( i->value.id() == ExpressionGrammer::modulo_ID ) return new AstModulo();
+	LOG_ASSERT(false,"");
+	return NULL;
+}
+
+Ast* createAst( const tree_iter_t& i, const std::map< parser_id, std::string >& rule_names ) {
+#if defined(PRINT_AST_TRAVERSAL)
+	Indentor in;
+	std::map< parser_id, std::string >::const_iterator iter = rule_names.find(i->value.id());
+	if (iter != rule_names.end()) {
+		Indentor::indent(cout) << "Create AST Rule " << (*iter).second
+			<< "  '" << string( i->value.begin(), i->value.end() ) << "'\n";
+	}
+	else {
+		Indentor::indent(cout) << "Create AST Unknown rule "
+			<< "  '" << string( i->value.begin(), i->value.end() ) <<  "'\n";
+	}
+#endif
+
+
+	if ( i->value.id() == ExpressionGrammer::node_name_ID) {
+
+	   string thevalue( i->value.begin(), i->value.end() );
+	   boost::algorithm::trim(thevalue); // don't know why we get leading/trailing spaces
+		LOG_ASSERT( !thevalue.empty(), "" );
+	 	return new AstNode( thevalue );
+	}
+   else if ( i->value.id() == ExpressionGrammer::node_state_complete_ID) {
+
+      return new AstNodeState( DState::COMPLETE );
+   }
+	else if ( i->value.id() == ExpressionGrammer::normal_variable_path_ID) {
+
+		LOG_ASSERT((i->children.size() == 2 || i->children.size() == 4), "");
+ 		tree_iter_t theNodePathIter = i->children.begin();
+		tree_iter_t theNameIter = i->children.begin()+1;
+
+		string nodePath( theNodePathIter->value.begin(), theNodePathIter->value.end() );
+		string name( theNameIter->value.begin(), theNameIter->value.end() );
+		boost::algorithm::trim(nodePath); // don't know why we get leading/trailing spaces
+		boost::algorithm::trim(name);     // don't know why we get leading/trailing spaces
+
+		if (  i->children.size() == 4) {
+ 			AstRoot* operatorRoot = createRootNode(  i->children.begin()+2, rule_names  );
+			Ast* astInteger = createAst(i->children.begin()+3,  rule_names);
+
+			operatorRoot->addChild( new AstVariable( nodePath, name ));
+			operatorRoot->addChild(astInteger);
+			return operatorRoot;
+		}
+
+ 		return new AstVariable( nodePath, name );
+	}
+	else if ( i->value.id() == ExpressionGrammer::dot_dot_path_ID) {
+
+	   string thevalue( i->value.begin(), i->value.end() );
+	   boost::algorithm::trim(thevalue); // don't know why we get leading/trailing spaces
+		LOG_ASSERT( !thevalue.empty() , "");
+	 	return new AstNode( thevalue );
+	}
+   if ( i->value.id() == ExpressionGrammer::absolute_path_ID) {
+
+      string thevalue( i->value.begin(), i->value.end() );
+      boost::algorithm::trim(thevalue); // don't know why we get leading/trailing spaces
+      LOG_ASSERT( !thevalue.empty() ,"");
+      return new AstNode( thevalue );
+   }
+	else if ( i->value.id() == ExpressionGrammer::dot_path_ID) {
+
+	   string thevalue( i->value.begin(), i->value.end() );
+	   boost::algorithm::trim(thevalue); // don't know why we get leading/trailing spaces
+		LOG_ASSERT( !thevalue.empty() , "");
+	 	return new AstNode( thevalue );
+	}
+   else if ( i->value.id() == ExpressionGrammer::event_ID) {
+
+      LOG_ASSERT(i->children.size() >= 2, "");
+      tree_iter_t theNodePathIter = i->children.begin();
+      tree_iter_t theEventNameIter = i->children.begin()+1;
+
+      string nodePath( theNodePathIter->value.begin(), theNodePathIter->value.end() );
+      string eventName( theEventNameIter->value.begin(), theEventNameIter->value.end() );
+      boost::algorithm::trim(nodePath);  // don't know why we get leading/trailing spaces
+      boost::algorithm::trim(eventName); // don't know why we get leading/trailing spaces
+
+      return new AstVariable( nodePath, eventName );
+   }
+	else if ( i->value.id() == ExpressionGrammer::some_string_ID) {
+
+	   string thevalue( i->value.begin(), i->value.end() );
+	   boost::algorithm::trim(thevalue); // don't know why we get leading/trailing spaces
+ 		return new AstString(thevalue);
+	}
+   else if ( i->value.id() == ExpressionGrammer::integer_ID) {
+
+      string thevalue( i->value.begin(), i->value.end() );
+      boost::algorithm::trim(thevalue); // don't know why we get leading/trailing spaces
+      int theInt = boost::lexical_cast<int>(thevalue);
+      return new AstInteger(theInt);
+   }
+	else if ( i->value.id() == ExpressionGrammer::node_state_aborted_ID) {
+
+ 	 	return new AstNodeState( DState::ABORTED );
+	}
+	else if ( i->value.id() == ExpressionGrammer::node_state_active_ID) {
+
+ 	 	return new AstNodeState( DState::ACTIVE );
+	}
+	else if ( i->value.id() == ExpressionGrammer::node_state_queued_ID) {
+
+ 	 	return new AstNodeState( DState::QUEUED );
+	}
+	else if ( i->value.id() == ExpressionGrammer::node_state_submitted_ID) {
+
+ 	 	return new AstNodeState( DState::SUBMITTED );
+	}
+	else if ( i->value.id() == ExpressionGrammer::node_state_unknown_ID) {
+
+ 	 	return new AstNodeState( DState::UNKNOWN );
+	}
+
+ 	return NULL;
+}
+
+
+
+// The evaluation function for the AST
+Ast* doCreateAst(  const tree_iter_t& i,
+                   const std::map< parser_id, std::string >& rule_names,
+                   Ast* top)
+{
+#if defined(PRINT_AST_TRAVERSAL)
+	Indentor in;
+	std::map< parser_id, std::string >::const_iterator iter = rule_names.find(i->value.id());
+	if (iter != rule_names.end()) {
+		Indentor::indent(cout) << "Rule " << (*iter).second
+			<< "  " << string( i->value.begin(), i->value.end() ) << endl;
+	}
+	else {
+		Indentor::indent(cout) << "Unknown rule "
+			<< "  " << string( i->value.begin(), i->value.end() ) <<  endl;
+	}
+#endif
+
+	Indentor in2;
+	if ( i->value.id() == ExpressionGrammer::event_ID ) {
+		// Event need to handled in a custom way
+		LOG_ASSERT(i->children.size() == 2,"");
+		if (i->children.size() == 2) {
+		   // a:eventname ||  ../a/b:eventname
+		   // child 1: path                     a || ../a/b
+		   // child 2: event name
+		   // WE add an event state so that when the event is evaluated it is compared to true
+		   Ast* someRoot =  new AstEqual();
+		   Ast* leftEvent = createAst(i, rule_names);
+		   Ast* rightEvent = new AstEventState( true );
+		   someRoot->addChild(leftEvent);
+		   someRoot->addChild(rightEvent);
+		   top->addChild(someRoot);
+		}
+ 	}
+	else if (i->children.size() == 4 &&
+			 (i->children.begin()->value.id() == ExpressionGrammer::not1_ID ||
+			  i->children.begin()->value.id() == ExpressionGrammer::not2_ID)
+			 ) {
+		// child 0: notRoot                 0
+		// child 1: notChild               +1
+		// child 2: someRoot(i.e ==,!=)    +2
+		// child 3: right                  +3
+		// Create as:         someRoot
+		//              notRoot          right
+		//      notChild
+		LOG_ASSERT((i->children.begin()->value.id() == ExpressionGrammer::not1_ID || i->children.begin()->value.id() == ExpressionGrammer::not2_ID),"");
+		AstRoot* notRoot = createRootNode(  i->children.begin(), rule_names  );
+		Ast* notChild = doCreateAst(  i->children.begin() + 1, rule_names, notRoot/*top*/ );
+		if (notChild) notRoot->addChild(notChild);
+
+		AstRoot* someRoot = createRootNode(  i->children.begin() + 2, rule_names  );
+		someRoot->addChild(notRoot); //left
+
+		Ast* right = doCreateAst(  i->children.begin() + 3, rule_names,  someRoot/* top*/ );
+ 		if (right) someRoot->addChild(right);
+		top->addChild(someRoot);
+	}
+	else if (i->children.size() == 4 && i->value.id() == ExpressionGrammer::variable_expression_ID  ) {
+		LOG_ASSERT((i->children.begin()->value.id() == ExpressionGrammer::normal_variable_path_ID), "");
+		// child 0: NORMAL_VARIABLE_PATH    0
+		// child 1: someRoot(i.e ==,!=)    +1
+		// child 2: NOT                    +2
+		// child 3: integer | variable     +3
+		//
+		// Create as:         someRoot
+		//              varPath          notRoot
+		//                                    notChild
+  		AstRoot* someRoot = createRootNode(  i->children.begin()+1, rule_names  );
+		Ast* varPath = doCreateAst(  i->children.begin(), rule_names, someRoot/*top*/ );
+
+ 		AstRoot* notRoot = createRootNode(  i->children.begin()+2, rule_names  );
+		Ast* notChild = doCreateAst(  i->children.begin() + 3, rule_names, notRoot/*top*/ );
+
+		notRoot->addChild(notChild);
+
+ 		someRoot->addChild(varPath); //left
+ 		someRoot->addChild(notRoot); //right
+		top->addChild(someRoot);
+	}
+	else if (i->children.size() == 3) {
+		// child 1: left                0
+		// child 2: root(i.e ==,!=)    +1
+		// child 3: right              +2
+		AstRoot* someRoot = createRootNode(  i->children.begin() + 1, rule_names  );
+		Ast* left  = doCreateAst(  i->children.begin(), rule_names, someRoot );
+		Ast* right = doCreateAst(  i->children.begin() + 2, rule_names,  someRoot );
+		if (left) someRoot->addChild(left);
+		if (right) someRoot->addChild(right);
+		top->addChild(someRoot);
+	}
+	else if (i->children.size() == 2 &&
+			 (i->children.begin()->value.id() == ExpressionGrammer::not1_ID ||
+			  i->children.begin()->value.id() == ExpressionGrammer::not2_ID)
+			 ) {
+ 		// child 1: not     0
+		// child 2: left   +1
+ 		AstRoot* someRoot = createRootNode(  i->children.begin(), rule_names  );
+		Ast* left  = doCreateAst(  i->children.begin() + 1, rule_names, someRoot );
+  		if (left) someRoot->addChild(left);
+ 		top->addChild(someRoot);
+	}
+	else {
+		return createAst(i,rule_names);
+	}
+	return NULL;
+}
+
+AstTop* createAst( 	tree_parse_info< > info,
+					const std::string& expr,
+					const std::map< parser_id, std::string >& rule_names
+)
+{
+#if defined(PRINT_AST_TRAVERSAL)
+	std::cout << "\nPRINT_AST_TRAVERSAL  " << expr << "\n";
+#endif
+
+	std::auto_ptr<AstTop> ast(new AstTop);
+	(void)doCreateAst(info.trees.begin(),rule_names,ast.get());
+
+#if defined(PRINT_AST)
+ 	if (ast.get())  {
+ 		std::cout << "\nPRINT_AST  " << expr << "\n";
+ 		std::cout << *ast.get();
+ 	}
+#endif
+	return ast.release();
+}
+
+///////////////////////////////////////////////////////////////////////////
+// SimpleExprParser
+//////////////////////////////////////////////////////////////////////////
+
+bool has_complex_expressions(const std::string& expr)
+{
+   // we allow . and /
+   if (expr.find('(') != string::npos) return true;
+   if (expr.find(':') != string::npos) return true;
+   if (expr.find('.') != string::npos) return true;
+   if (expr.find('/') != string::npos) return true;
+   if (expr.find(" not ") != string::npos) return true;
+   if (expr.find(" and ") != string::npos) return true;
+   if (expr.find(" or ") != string::npos) return true;
+   if (expr.find('!') != string::npos) return true;
+   if (expr.find("&&") != string::npos) return true;
+   if (expr.find("||") != string::npos) return true;
+   if (expr.find('<') != string::npos) return true;
+   if (expr.find('>') != string::npos) return true;
+   if (expr.find('+') != string::npos) return true;
+   if (expr.find('-') != string::npos) return true;
+   if (expr.find('*') != string::npos) return true;
+   if (expr.find('~') != string::npos) return true;
+   if (expr.find(" ne ") != string::npos) return true;
+   if (expr.find(" ge ") != string::npos) return true;
+   if (expr.find("<=") != string::npos) return true;
+   if (expr.find(">=") != string::npos) return true;
+   if (expr.find(" le ") != string::npos) return true;
+   if (expr.find(" gt ") != string::npos) return true;
+   if (expr.find(" lt ") != string::npos) return true;
+   return false;
+}
+
+bool SimpleExprParser::doParse()
+{
+   // 3199.def 57Mg
+   // a == b, || a eq b i.e simple  76940
+   // complex                       39240
+   if (has_complex_expressions(expr_)) {
+      return false;
+   }
+
+   // look for path == <state> || path eq state
+   // This gets round issue with Str::split:
+   //   "a = complete" will be split
+   // since will split on *ANY* of character, and hence this would not be reported as an error
+   std::vector<std::string> tokens;
+   if (expr_.find("==") != string::npos) {
+      Str::split(expr_, tokens, "==");
+   }
+   else if (expr_.find(" eq ") != string::npos) {
+      Str::split(expr_, tokens, " eq ");
+   }
+   else {
+      return false;
+   }
+
+   if (tokens.size() == 2) {
+
+      boost::algorithm::trim(tokens[0]);
+      boost::algorithm::trim(tokens[1]);
+
+      if (tokens[0].find(' ') != string::npos) {
+//         cout << "Found space " << expr_ << "\n";
+         return false;
+      }
+
+      if (DState::isValid(tokens[1])) {
+
+         ast_.reset(new AstTop);
+         Ast* someRoot = new AstEqual();
+         someRoot->addChild(new AstNode(tokens[0]));
+         someRoot->addChild(new AstNodeState(DState::toState(tokens[1])));
+         ast_->addChild(someRoot);
+//       cout << "simple expr : " << expr_ << " `" << tokens[0] << "' = '" << tokens[1] << "'\n";
+         return true;
+      }
+      else {
+         try {
+            int left = boost::lexical_cast<int>(tokens[0]);
+            int right = boost::lexical_cast<int>(tokens[1]);
+            ast_.reset(new AstTop);
+            Ast* someRoot = new AstEqual();
+            someRoot->addChild(new AstInteger(left));
+            someRoot->addChild(new AstInteger(right));
+            ast_->addChild(someRoot);
+//               cout << "simple INT expr : " << expr_ << " `" << tokens[0] << "' = '" << tokens[1] << "'\n";
+            return true;
+         }
+         catch ( boost::bad_lexical_cast& e ) {
+//            cout << "simple INT FAILED expr : " << expr_ << " `" << tokens[0] << "' = '"
+//                     << tokens[1] << "'\n";
+         }
+      }
+   }
+   return false;
+}
diff --git a/ecflow_4_0_7/ANode/src/ExprParser.hpp b/ecflow_4_0_7/ANode/src/ExprParser.hpp
new file mode 100644
index 0000000..a8e0f92
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ExprParser.hpp
@@ -0,0 +1,64 @@
+#ifndef EXPRPARSER_HPP_
+#define EXPRPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <memory> // for auto_ptr
+#include <boost/noncopyable.hpp>
+#include "ExprAst.hpp"
+
+
+/// This class will parse a expression and create the abstract syntax tree
+/// It will own the AST unless specifically released calling ast();
+class ExprParser : private boost::noncopyable {
+public:
+	ExprParser(const std::string& expression);
+
+	/// Parse the expression, return true if parse OK false otherwise
+	/// if false is returned, and error message is returned
+	bool doParse(std::string& errorMsg);
+
+	/// return the Abstract syntax tree, and release memory
+	std::auto_ptr<AstTop> ast() { return ast_;}
+
+	/// return the Abstract syntax tree, without release memory
+	AstTop* getAst() const { return ast_.get();}
+
+private:
+	std::auto_ptr<AstTop> ast_;
+	std::string           expr_;
+};
+
+// This class was added to mitigate the slowness of the boost classic spirit parser
+// we will recognise very simple expression, and bypass spirit. Very limited
+// But the simple expression do form a very large subset
+class SimpleExprParser : private boost::noncopyable {
+public:
+   SimpleExprParser(const std::string& expression) : expr_(expression) {}
+
+   /// Parse the expression, return true if parse OK false otherwise
+   bool doParse();
+
+   /// return the Abstract syntax tree, and release memory
+   std::auto_ptr<AstTop> ast() { return ast_;}
+
+private:
+   const std::string& expr_;
+   std::auto_ptr<AstTop> ast_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Expression.cpp b/ecflow_4_0_7/ANode/src/Expression.cpp
new file mode 100644
index 0000000..8d8c5b0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Expression.cpp
@@ -0,0 +1,237 @@
+//============================================================================
+// Name        : NodeTree.cpp
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+
+#include "Expression.hpp"
+#include "Indentor.hpp"
+#include "ExprParser.hpp"
+#include "Ecf.hpp"
+#include "ExprAstVisitor.hpp"
+#include "Node.hpp"
+#include "Log.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace ecf;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+
+std::string PartExpression::toString(const std::string& exprType) const
+{
+   std::stringstream ss;
+   ss << exprType; // trigger or complete
+   switch (exp_type_) {
+      case PartExpression::FIRST: ss << " ";break;
+      case PartExpression::AND: ss << " -a ";break;
+      case PartExpression::OR: ss << " -o ";break;
+      default: assert(false); break;
+   }
+   ss << exp_ <<  "\n";
+   return ss.str();
+}
+
+std::ostream& PartExpression::print(std::ostream& os,const std::string& exprType, bool isFree) const
+{
+   Indentor in;
+   Indentor::indent(os) << exprType;
+   switch (exp_type_) {
+      case PartExpression::FIRST: os << " ";break;
+      case PartExpression::AND: os << " -a ";break;
+      case PartExpression::OR: os << " -o ";break;
+      default: assert(false); break;
+   }
+   os << exp_;
+
+   if ( !PrintStyle::defsStyle()) {
+      if (exp_type_ == PartExpression::FIRST) {
+         if (isFree) os << " # free";
+      }
+   }
+   os << "\n";
+   return os;
+}
+
+std::auto_ptr<AstTop> PartExpression::parseExpressions(std::string& errorMsg) const
+{
+   //#ifdef DEBUG
+   //	cout << "PartExpression::parseExpressions '" << exp_ << "'\n";
+   //#endif
+   if (!exp_.empty()) {
+      ExprParser expressionParser(exp_);
+      if (expressionParser.doParse( errorMsg)) {
+
+         // returns new allocated memory, if no errors
+         std::auto_ptr<AstTop> ast =  expressionParser.ast();
+
+         if (errorMsg.empty()) LOG_ASSERT(ast.get(),"");
+         else                  LOG_ASSERT(!ast.get(), "");
+
+         return ast;
+      }
+   }
+   return std::auto_ptr<AstTop>();
+}
+
+//===========================================================================
+
+Expression::Expression(const std::string& expression)
+:  makeFree_(false), state_change_no_(0), theCombinedAst_(0)
+{
+   add(PartExpression(expression));
+}
+
+Expression::Expression(const PartExpression& exp)
+: makeFree_(false), state_change_no_(0),theCombinedAst_(0)
+{
+   add(exp);
+}
+
+Expression::Expression()
+: makeFree_(false), state_change_no_(0), theCombinedAst_(0) {}
+
+Expression::Expression(const Expression& rhs)
+: vec_(rhs.vec_), makeFree_(rhs.makeFree_), state_change_no_(0),theCombinedAst_(0) {}
+
+std::ostream& Expression::print(std::ostream& os, const std::string& exprType) const
+{
+   BOOST_FOREACH(const PartExpression& expr, vec_ ) {
+      expr.print(os,exprType,makeFree_);
+   }
+   return os;
+}
+
+std::string Expression::expression() const
+{
+   string ret;
+   std::vector<PartExpression>::const_iterator theEnd = vec_.end();
+   for(std::vector<PartExpression>::const_iterator expr = vec_.begin(); expr!= theEnd; ++expr) {
+      if ( (*expr).andExpr() )       ret += " AND ";
+      else  if ( (*expr).orExpr() )  ret += " OR ";
+      ret  += (*expr).expression();
+   }
+   return ret;
+}
+
+void Expression::add(const PartExpression& t)
+{
+   if (vec_.empty()) {
+      // The first expression should not have AND or OR
+      if (t.andExpr() || t.orExpr()) {
+         std::stringstream ss;
+         ss << "Expression::add: expression " << t.expression() << " failed: The first expression should not have AND or OR set";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+   else {
+      // Subsequent expression must be AND or OR expressions
+      if (!t.andExpr() && !t.orExpr()) {
+         std::stringstream ss;
+         ss << "Expression::add: expression " << t.expression() << " failed: Subsequent expression must have AND or OR set";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+   vec_.push_back(t);
+   //	cout << "Expression::add " << expression() << "\n";
+}
+
+// ============================================================================
+// CREATE AST tree for each expression, and COMBINE AST for each expression into a single AST.
+// ============================================================================
+void Expression::createAST( Node* node, const std::string& exprType, std::string& errorMsg ) const
+{
+   size_t theSize = vec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      std::string localErrorMsg;
+      std::auto_ptr<AstTop> ast = vec_[i].parseExpressions( localErrorMsg );
+      if ( ast.get() ) {
+
+         // We can have multiple trigger/complete expression, combine to a single AST tree
+         if (theCombinedAst_.get()) {
+            // Must be trigger with -a(and) or -o(or) option's
+            LOG_ASSERT(theCombinedAst_->isTop(),"");
+            LOG_ASSERT(ast->isTop(),"");
+            /* Combine AST tree
+				      top     top2 (this top needs to be deleted)       top            top2
+				       |        |                                ===>    |              |
+				      root1    root2                                   newRoot         NULL;
+				                                                        / \
+				                                                    root1  root2
+             */
+            Ast* newRoot = NULL;
+            if ( vec_[i].andExpr() )       newRoot = new AstAnd();
+            else  if ( vec_[i].orExpr() )  newRoot = new AstOr();
+            else LOG_ASSERT(false,""); // what else can it be.
+
+            if ( newRoot ) {
+               newRoot->addChild(theCombinedAst_->left());
+               newRoot->addChild(ast->left());
+               theCombinedAst_->addChild(newRoot); // will overwrite
+
+               // Since we have transferred over root2 it must be set to NULL for top2,
+               // to avoid its child destruction
+               ast->addChild(NULL); // since its an auto_ptr, no need for explicit delete
+            }
+         }
+         else {
+            // The very first expression should _NOT_ be AND/OR trigger. (i.e no -o | -a)
+            LOG_ASSERT((!vec_[i].andExpr()) && (!vec_[i].orExpr()), "");
+            theCombinedAst_ = ast; // transfer ownership
+            theCombinedAst_->exprType(exprType);
+         }
+         //			cout << "****************************************************************\n";
+         //			cout << theCombinedAst->expression() << "\n";
+         //			cout << *theCombinedAst << "\n";
+      }
+      else {
+         std::stringstream ss;
+         ss << "Failed to parse " << vec_[i].toString(exprType) << " at " << node->debugNodePath()
+			            << " because " << localErrorMsg << "\n\n";
+         errorMsg += ss.str();
+      }
+   }
+
+   if ( theCombinedAst_.get() ) {
+      theCombinedAst_->setParentNode(node);
+   }
+}
+
+void Expression::setFree()
+{
+   // Only update for a real change
+   if (!makeFree_) {
+      state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "Expression::setFree()\n";
+#endif
+   }
+   makeFree_ = true;
+}
+
+void Expression::clearFree()
+{
+   // Only update for a real change
+   if (makeFree_) {
+      state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "Expression::clearFree()\n";
+#endif
+   }
+   makeFree_ = false;
+}
+
diff --git a/ecflow_4_0_7/ANode/src/Expression.hpp b/ecflow_4_0_7/ANode/src/Expression.hpp
new file mode 100644
index 0000000..4bb1f77
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Expression.hpp
@@ -0,0 +1,153 @@
+#ifndef EXPRESSION_HPP_
+#define EXPRESSION_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #20 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <ostream>
+#include <memory> // for auto_ptr
+
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+
+#include "ExprAst.hpp"
+class Node;
+
+/// class PartExpression:
+///  Hold a single expression, optional can specify whether it is to be And' or
+///  'Ored' when used as a part of a larger expression.
+///  Uses compiler , generated destructor, assignment,  copy constructor
+class PartExpression  {
+public:
+   enum ExprType { FIRST, AND, OR };
+
+   PartExpression(const std::string& expression)
+   : exp_(expression), exp_type_(FIRST) {}
+
+   PartExpression(const std::string& expression, bool and_type)
+   : exp_(expression), exp_type_( (and_type) ? AND : OR) {}
+
+   PartExpression()
+   : exp_type_(FIRST) {}
+
+   const std::string& expression() const  { return exp_;}
+   bool andExpr() const { return (exp_type_ == AND) ? true : false ;}
+   bool orExpr() const  { return (exp_type_ == OR)  ? true : false ;}
+
+   std::string toString(const std::string& exprType) const;
+   std::ostream& print(std::ostream&,const std::string& exprType,bool isFree) const;
+
+   bool operator==(const PartExpression& rhs) const {
+      return exp_type_ == rhs.exp_type_ && exp_ == rhs.exp_;
+   }
+   bool operator!=(const PartExpression& rhs) const { return !operator==(rhs); }
+
+   /// Parse the expression and create the abstract syntax tree
+   std::auto_ptr<AstTop> parseExpressions(std::string& errorMsg) const;
+
+private:
+   std::string exp_;
+   ExprType    exp_type_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & exp_;
+      ar & exp_type_;
+   }
+};
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Class Expression:
+//       A Expression occur in a Trigger or Complete statement
+//       This class hold a number of part expression.
+//       It can also create a  single AST from the part expressions
+// NOTE: Distinguish between parser errors, and node path resolution
+//       Here we are only concerned with parser errors.
+// Use compiler , generated destructor, assignment,  copy constructor
+class Expression  {
+public:
+   Expression(const std::string& expression);
+   Expression(const PartExpression& );
+   Expression();
+   Expression(const Expression& rhs);
+
+   bool operator==( const Expression& rhs) const{
+      if (makeFree_ != rhs.makeFree_) return false;
+      return vec_ == rhs.vec_;
+   }
+   bool operator!=( const Expression& rhs) const {
+      return !operator==(rhs);
+   }
+
+   /// User should add "trigger" or "complete" at the start.
+   /// The part expression's are combined and returned as a single string
+   std::string expression() const;
+
+   /// Need to pass in trigger tag, since expression may be split over multiple lines
+   /// trigger    "a == complete"
+   /// trigger -a "b == complete"
+   std::ostream& print(std::ostream&,const std::string& exprType) const;
+
+   /// Use when we want to add compose a large expression form a set of smaller ones
+   void add( const PartExpression& t );
+
+   // ==============================================================================================
+   // CREATE AST tree for each expression and COMBINE AST for each expression into a single AST.
+   // ==============================================================================================
+   void createAST( Node* parent_node, const std::string& exprType, std::string& errorMsg ) const;
+   AstTop* get_ast() const { return theCombinedAst_.get(); } // can return NULL
+
+   /// Placed here rather than the expression tree. Since the expression
+   /// tree is created on demand, and is not persisted
+   void setFree();  // hence must be used before evaluate
+   void clearFree(); // resets the free flag
+   bool isFree() const { return makeFree_;}
+
+   // The state_change_no is never reset. Must be incremented if it can affect equality
+   unsigned int state_change_no() const { return state_change_no_; }
+
+private:  /// For use by python interface,
+   friend void export_Node();
+   std::vector<PartExpression>::const_iterator part_begin() const { return vec_.begin();}
+   std::vector<PartExpression>::const_iterator part_end() const   { return vec_.end();}
+
+private:
+   std::vector<PartExpression> vec_;
+   bool                        makeFree_;
+
+   unsigned int state_change_no_;                    // *not* persisted, only used on server side
+
+   // They are created on demand. reasons:
+   // 1/ Help with AIX serialisation
+   // 2/ Help to reduce network traffic
+   mutable std::auto_ptr< AstTop >  theCombinedAst_; // *not* persisted, demand created
+
+private:
+   // prevent assignment since we have an auto_ptr
+   Expression& operator=(Expression const& f);
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & vec_;
+      ar & makeFree_;
+   }
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Family.cpp b/ecflow_4_0_7/ANode/src/Family.cpp
new file mode 100644
index 0000000..800bd30
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Family.cpp
@@ -0,0 +1,202 @@
+//============================================================================
+// Name        : NodeTree.cpp
+// Author      : Avi
+// Revision    : $Revision: #64 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+#include <boost/make_shared.hpp>
+
+#include "Family.hpp"
+#include "Log.hpp"
+#include "PrintStyle.hpp"
+#include "NodeTreeVisitor.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "Ecf.hpp"
+
+#include "Stl.hpp"
+#include "Str.hpp"
+#include "Indentor.hpp"
+#include "DefsDelta.hpp"
+#include "JobProfiler.hpp"
+#include "JobsParam.hpp"
+
+using namespace ecf;
+using namespace std;
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// The false below is used as a dummy argument to call the Variable constructor that does not
+// Check the variable names. i.e we know they are valid
+Family::~Family()
+{
+   // Don't create the ChangeMgrSingleton during destruct sequence. (i.e in unit cases)
+   // Since that will cause a memory leak
+   if (!Ecf::server() && ChangeMgrSingleton::exists()) {
+      ChangeMgrSingleton::instance()->notify_delete( this );
+   }
+
+   delete fam_gen_variables_;
+}
+
+family_ptr Family::create(const std::string& name)
+{
+	return boost::make_shared<Family>( name );
+}
+
+void Family::accept(ecf::NodeTreeVisitor& v)
+{
+	v.visitFamily(this);
+	NodeContainer::accept(v);
+}
+
+void Family::acceptVisitTraversor(ecf::NodeTreeVisitor& v)
+{
+	v.visitFamily(this);
+}
+
+void Family::begin()
+{
+   NodeContainer::begin();
+   update_generated_variables();
+}
+
+bool Family::resolveDependencies(JobsParam& jobsParam)
+{
+   if (jobsParam.timed_out_of_job_generation()) return false;
+   JobProfiler profile_me(jobsParam);
+   if (jobsParam.timed_out_of_job_generation()) return false;
+
+   return NodeContainer::resolveDependencies(jobsParam);
+}
+
+void Family::requeue(bool resetRepeats, int clear_suspended_in_child_nodes, bool reset_next_time_slot)
+{
+   NodeContainer::requeue(resetRepeats,clear_suspended_in_child_nodes,reset_next_time_slot);
+   update_generated_variables();
+}
+
+bool Family::operator==(const Family& rhs) const
+{
+	return NodeContainer::operator==(rhs);
+}
+
+std::ostream& Family::print(std::ostream& os) const
+{
+	// Generated variable are not persisted since they are created on demand
+	// There *NO* point in printing them they will always be empty
+
+	Indentor in;
+	Indentor::indent(os) << "family " << name();
+   if (!PrintStyle::defsStyle()) {
+      std::string st = write_state();
+      if (!st.empty()) os << " #" << st;
+   }
+   os << "\n";
+
+	Node::print(os);
+	NodeContainer::print(os);
+	Indentor::indent(os) << "endfamily\n";
+	return os;
+}
+
+std::string Family::write_state() const
+{
+   return NodeContainer::write_state();
+}
+void Family::read_state(const std::string& line,const std::vector<std::string>& lineTokens)
+{
+   NodeContainer::read_state(line,lineTokens);
+}
+
+const std::string& Family::debugType() const { return ecf::Str::FAMILY();}
+
+std::ostream& operator<<(std::ostream& os, const Family& d) { return d.print(os); }
+
+void Family::collateChanges(DefsDelta& changes) const
+{
+   /// All changes to family should be on ONE compound_memento_ptr
+	compound_memento_ptr compound;
+	NodeContainer::incremental_changes(changes, compound);
+
+	// Traversal
+	NodeContainer::collateChanges(changes);
+}
+
+// generated variables --------------------------------------------------------------------------
+
+void Family::update_generated_variables() const
+{
+   if (!fam_gen_variables_) fam_gen_variables_ = new FamGenVariables(this);
+   fam_gen_variables_->update_generated_variables();
+   update_repeat_genvar();
+}
+
+const Variable& Family::findGenVariable(const std::string& name) const
+{
+   // Generally it should be never the case that the values are empty
+   // Since the user is assumed to have called begin(), which force
+   // the generation of generated variables
+
+   // AST can reference generated variables. Currently integer based values
+   // The family names can be integers
+
+   if (!fam_gen_variables_) update_generated_variables();
+   const Variable& gen_var = fam_gen_variables_->findGenVariable(name);
+   if (!gen_var.empty()) return gen_var;
+
+   return NodeContainer::findGenVariable(name);
+}
+
+void Family::gen_variables(std::vector<Variable>& vec) const
+{
+   if (!fam_gen_variables_) update_generated_variables();
+
+   vec.reserve(vec.size() + 3);
+   fam_gen_variables_->gen_variables(vec);
+   NodeContainer::gen_variables(vec);
+}
+
+// ================================================================
+
+FamGenVariables::FamGenVariables(const Family* f)
+ : family_(f),
+   genvar_family_("FAMILY", "", false),
+   genvar_family1_("FAMILY1", "", false)  {}
+
+void FamGenVariables::update_generated_variables() const
+{
+   // This function is called during:
+    //   o begin()
+    //   o requeue()
+    // Since family generated not persisted, allow for demand creation by client
+    genvar_family1_.set_value(family_->name());
+
+    // FAMILY is the full path excluding the suite, there is *NO* leading slash
+    std::string path = family_->absNodePath();
+    string::size_type secondSlash = path.find('/',1);
+    path.erase(0,secondSlash+1);
+    genvar_family_.set_value(path);
+}
+
+const Variable& FamGenVariables::findGenVariable(const std::string& name) const
+{
+   if (genvar_family_.name() == name)  return genvar_family_;
+   if (genvar_family1_.name() == name)  return genvar_family1_;
+   return Variable::EMPTY();
+}
+
+void FamGenVariables::gen_variables(std::vector<Variable>& vec) const
+{
+   vec.push_back(genvar_family_);
+   vec.push_back(genvar_family1_);
+}
diff --git a/ecflow_4_0_7/ANode/src/Family.hpp b/ecflow_4_0_7/ANode/src/Family.hpp
new file mode 100644
index 0000000..ee389ce
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Family.hpp
@@ -0,0 +1,86 @@
+#ifndef FAMILY_HPP_
+#define FAMILY_HPP_
+
+//============================================================================
+// Name        : NodeTree.hpp
+// Author      : Avi
+// Revision    : $Revision: #37 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "NodeContainer.hpp"
+class FamGenVariables;
+
+class Family : public NodeContainer {
+public:
+   Family( const std::string& name ) : NodeContainer(name),fam_gen_variables_(NULL) {}
+   Family() : fam_gen_variables_(NULL)  {}
+	virtual ~Family();
+
+	static family_ptr create(const std::string& name);
+
+	virtual Suite* suite() const { return parent()->suite(); }
+	virtual Defs* defs() const { return (parent()) ? parent()->defs() : NULL;}     // exposed to python hence check for NULL first
+ 	virtual Family* isFamily() const { return const_cast<Family*>(this);}
+   virtual NodeContainer* isNodeContainer() const { return const_cast<Family*>(this); }
+
+   virtual void begin();
+   virtual bool resolveDependencies(JobsParam& ); // overriden to speicy family for job profiler
+   virtual void requeue(bool resetRepeats, int clear_suspended_in_child_nodes, bool reset_next_time_slot);
+	virtual void accept(ecf::NodeTreeVisitor&);
+	virtual void acceptVisitTraversor(ecf::NodeTreeVisitor& v);
+	virtual void update_generated_variables() const;
+	virtual const Variable& findGenVariable(const std::string& name) const;
+	virtual void gen_variables(std::vector<Variable>&) const;
+
+	virtual const std::string& debugType() const;
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const Family& rhs) const;
+
+	virtual void collateChanges(DefsDelta&) const;
+   void set_memento(const OrderMemento* m) { NodeContainer::set_memento(m); }
+   void set_memento(const ChildrenMemento* m) { NodeContainer::set_memento(m); }
+
+   virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
+private:
+   virtual std::string write_state() const;
+
+   mutable FamGenVariables* fam_gen_variables_;
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<NodeContainer>(*this);
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const Family&);
+
+
+// We can have several thousands Families. This class helps in avoiding
+// the creation of generated variables until required.
+// This improves client->server down load times by avoiding thousands of string constructions
+class FamGenVariables : private boost::noncopyable {
+public:
+   FamGenVariables(const Family*);
+
+   void update_generated_variables() const;
+   const Variable& findGenVariable(const std::string& name) const;
+   void gen_variables(std::vector<Variable>& vec) const;
+
+private:
+   const Family* family_;
+   mutable Variable genvar_family_;
+   mutable Variable genvar_family1_;
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Flag.cpp b/ecflow_4_0_7/ANode/src/Flag.cpp
new file mode 100644
index 0000000..b40d1d7
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Flag.cpp
@@ -0,0 +1,164 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <stdexcept>
+#include <iostream>
+#include "Flag.hpp"
+#include "Ecf.hpp"
+#include "Str.hpp"
+
+namespace  ecf {
+
+void Flag::set(Flag::Type flag)
+{
+   if (!is_set(flag)) {
+      // minimize changes to state_change_no_
+      flag_ |= (1<<flag);
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+}
+
+void Flag::clear(Flag::Type flag )
+{
+   if (is_set(flag)) {
+      // minimize changes to state_change_no_
+      flag_ &= ~(1<<flag);
+      state_change_no_ = Ecf::incr_state_change_no();
+   }
+}
+
+void Flag::reset() {
+   flag_ = 0;
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+std::vector<Flag::Type> Flag::list()
+{
+   std::vector<Flag::Type> ret; ret.reserve(15);
+   ret.push_back(Flag::FORCE_ABORT);
+   ret.push_back(Flag::USER_EDIT);
+   ret.push_back(Flag::TASK_ABORTED);
+   ret.push_back(Flag::JOBCMD_FAILED);
+   ret.push_back(Flag::NO_SCRIPT);
+   ret.push_back(Flag::KILLED);
+   ret.push_back(Flag::MIGRATED);
+   ret.push_back(Flag::LATE);
+   ret.push_back(Flag::MESSAGE);
+   ret.push_back(Flag::BYRULE);
+   ret.push_back(Flag::QUEUELIMIT);
+   ret.push_back(Flag::WAIT);
+   ret.push_back(Flag::LOCKED);
+   ret.push_back(Flag::ZOMBIE);
+   ret.push_back(Flag::NO_REQUE_IF_SINGLE_TIME_DEP);
+   return ret;
+}
+
+std::string Flag::enum_to_string(Flag::Type flag) {
+
+   switch ( flag ) {
+      case Flag::FORCE_ABORT:  return "force_aborted"; break;
+      case Flag::USER_EDIT :   return "user_edit"; break;
+      case Flag::TASK_ABORTED: return "task_aborted"; break;
+      case Flag::EDIT_FAILED:  return "edit_failed"; break;
+      case Flag::JOBCMD_FAILED:return "ecfcmd_failed"; break;
+      case Flag::NO_SCRIPT:    return "no_script"; break;
+      case Flag::KILLED:       return "killed"; break;
+      case Flag::MIGRATED:     return "migrated"; break;
+      case Flag::LATE:         return "late"; break;
+      case Flag::MESSAGE:      return "message"; break;
+      case Flag::BYRULE:       return "by_rule"; break;
+      case Flag::QUEUELIMIT:   return "queue_limit"; break;
+      case Flag::WAIT:         return "task_waiting"; break;
+      case Flag::LOCKED:       return "locked"; break;
+      case Flag::ZOMBIE:       return "zombie"; break;
+      case Flag::NO_REQUE_IF_SINGLE_TIME_DEP: return "no_reque"; break;
+      case Flag::NOT_SET:      return "not_set"; break;
+      default: break;
+   };
+   return std::string();
+}
+
+
+Flag::Type Flag::string_to_flag_type(const std::string& s)
+{
+   if (s == "force_aborted") return Flag::FORCE_ABORT;
+   if (s == "user_edit") return Flag::USER_EDIT;
+   if (s == "task_aborted") return Flag::TASK_ABORTED;
+   if (s == "edit_failed") return Flag::EDIT_FAILED;
+   if (s == "ecfcmd_failed") return Flag::JOBCMD_FAILED;
+   if (s == "no_script") return Flag::NO_SCRIPT;
+   if (s == "killed") return Flag::KILLED;
+   if (s == "migrated") return Flag::MIGRATED;
+   if (s == "late") return Flag::LATE;
+   if (s == "message") return Flag::MESSAGE;
+   if (s == "by_rule") return Flag::BYRULE;
+   if (s == "queue_limit") return Flag::QUEUELIMIT;
+   if (s == "task_waiting") return Flag::WAIT;
+   if (s == "locked") return Flag::LOCKED;
+   if (s == "zombie") return Flag::ZOMBIE;
+   if (s == "no_reque") return Flag::NO_REQUE_IF_SINGLE_TIME_DEP;
+   return Flag::NOT_SET;
+}
+
+void Flag::valid_flag_type(std::vector<std::string>& vec)
+{
+   vec.reserve(15);
+   vec.push_back("force_aborted");
+   vec.push_back("user_edit");
+   vec.push_back("task_aborted");
+   vec.push_back("edit_failed");
+   vec.push_back("ecfcmd_failed");
+   vec.push_back("no_script");
+   vec.push_back("killed");
+   vec.push_back("migrated");
+   vec.push_back("late");
+   vec.push_back("message");
+   vec.push_back("by_rule");
+   vec.push_back("queue_limit");
+   vec.push_back("task_waiting");
+   vec.push_back("locked");
+   vec.push_back("zombie");
+   vec.push_back("no_reque");
+}
+
+std::string Flag::to_string() const
+{
+   std::string ret;
+   std::vector<Flag::Type> flag_list =  Flag::list();
+   for (size_t i = 0; i < flag_list.size(); ++i) {
+      if ( is_set( flag_list[i] ) ) {
+         if (!ret.empty()) ret += ',';
+         ret += enum_to_string( flag_list[i]);
+      }
+   }
+   return ret;
+}
+
+void Flag::set_flag(const std::string& flags)
+{
+   std::vector< std::string > the_flags_vec;
+   Str::split(flags,the_flags_vec,",");
+
+   for(size_t i =0; i < the_flags_vec.size(); i++) {
+      Flag::Type ft = string_to_flag_type(the_flags_vec[i]);
+      if (ft == Flag::NOT_SET) {
+         throw std::runtime_error("Flag::set_flag: Unknown flag types found: " + the_flags_vec[i]);
+      }
+      set(ft);
+   }
+}
+
+
+}
diff --git a/ecflow_4_0_7/ANode/src/Flag.hpp b/ecflow_4_0_7/ANode/src/Flag.hpp
new file mode 100644
index 0000000..d1e5bfc
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Flag.hpp
@@ -0,0 +1,119 @@
+#ifndef FLAG_HPP_
+#define FLAG_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <vector>
+#include <string>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+namespace  ecf {
+
+/// Flag are used store what has happened to a node. These are shown as icon in ecFlowview
+/// Uses compiler generated copy constructor, assignment operator and destructor
+
+/// During interactive use. A Node can be *forced to complete*, or forced to *run*
+/// Typically the user may want to force a node to complete, if they are trying
+/// to update the repeat variable.
+///
+/// In either case  we need to miss a time slot, this is done by setting the
+/// NO_REQUE_IF_SINGLE_TIME_DEP, then at REQUE time we query the flag, if it was set
+/// we avoid resetting the time slots. effectively missing the next time slot.
+///
+/// This functionality is only required during interactive force or run
+/// However if the job aborted, we need to clear NO_REQUE_IF_SINGLE_TIME_DEP, i.e
+///     time 10:00
+///     time 11:00
+/// If at 9.00am use the run command, we want to miss the 10:00 time slot.
+/// However if the run at 9.00 fails, and we run again, we also miss 11:00 time slot
+/// to avoid this if the job aborts, we clear NO_REQUE_IF_SINGLE_TIME_DEP flag.
+
+class Flag {
+public:
+   Flag() : flag_(0),state_change_no_(0) {}
+
+   /// The BYRULE is used to distinguish between tasks that have RUN and completed
+   /// and those that have completed by complete expression.
+   enum Type {
+      FORCE_ABORT   =  0,  // Node*
+      USER_EDIT     =  1,  // task
+      TASK_ABORTED  =  2,  // task*
+      EDIT_FAILED   =  3,  // task*
+      JOBCMD_FAILED =  4,  // task*
+      NO_SCRIPT     =  5,  // task*
+      KILLED        =  6,  // task*
+      MIGRATED      =  7,  // Node  ( NOT USED currently)
+      LATE          =  8,  // Node attribute, Task is late, or Defs checkpt takes to long
+      MESSAGE       =  9,  // Node
+      BYRULE        = 10,  // Node*, set if node is set to complete by complete trigger expression
+      QUEUELIMIT    = 11,  // Node attribute, ????   change this to propagate to node
+      WAIT          = 12,  // task*
+      LOCKED        = 13,  // Server
+      ZOMBIE        = 14,  // task*
+      NO_REQUE_IF_SINGLE_TIME_DEP = 15,  //
+      NOT_SET       = 16
+   };
+
+   bool operator==(const Flag& rhs) const { return flag_ == rhs.flag_; }
+   bool operator!=(const Flag& rhs) const { return !operator==(rhs); }
+
+
+   // Flag functions:
+   void set(Type flag);
+   void clear(Type flag );
+   bool is_set(Type flag) const { return ( flag_ & (1 << flag)); }
+
+   void reset();
+   int flag() const { return flag_;}
+   void set_flag(int f) { flag_ = f; }
+   void set_flag(const std::string& flags); // these are comma seperated
+
+   /// returns a comma separated list of all flags set
+   std::string to_string() const;
+
+   /// returns the string equivalent
+   static std::string enum_to_string(Flag::Type flag);
+
+   /// Used to determine change in state relative to client
+   unsigned int state_change_no() const { return state_change_no_; }
+
+   /// returns the list of all flag types
+   static std::vector<Flag::Type> list();
+
+   /// Converts from string to flag types.
+   static Flag::Type string_to_flag_type(const std::string& s);
+
+   /// valid flag types, than can be used in AlterCmd
+   static void valid_flag_type(std::vector<std::string>& vec);
+
+private:
+   int          flag_;
+   unsigned int state_change_no_;  // *not* persisted, only used on server side
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & flag_;
+   }
+};
+}
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ecf::Flag, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(ecf::Flag,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/InLimit.cpp b/ecflow_4_0_7/ANode/src/InLimit.cpp
new file mode 100644
index 0000000..e09065b
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/InLimit.cpp
@@ -0,0 +1,83 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #64 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+#include <stdexcept>
+
+#include "InLimit.hpp"
+#include "Limit.hpp"
+#include "Indentor.hpp"
+#include "PrintStyle.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+InLimit::InLimit(const std::string& name, const std::string& pathToNode, int tokens)
+: name_(name),pathToNode_(pathToNode),tokens_(tokens)
+{
+   if ( !Str::valid_name( name ) ) {
+      throw std::runtime_error("InLimit::InLimit: Invalid InLimit name: " + name);
+   }
+}
+
+bool InLimit::operator==( const InLimit& rhs ) const
+{
+   if ( pathToNode_ != rhs.pathToNode_ ) {
+      //#ifdef DEBUG
+      //    std::cout << "InLimit::operator==   pathToNode_ != rhs.pathToNode_\n";
+      //#endif
+      return false;
+   }
+   if ( name_ != rhs.name_ ) {
+      //#ifdef DEBUG
+      //    std::cout << "InLimit::operator==     name_ != rhs.name_\n";
+      //#endif
+      return false;
+   }
+   if ( tokens_ != rhs.tokens_ ) {
+      //#ifdef DEBUG
+      //    std::cout << "InLimit::operator==    tokens_(" << tokens_  << ") != rhs.tokens_(" << rhs.tokens_ << ") \n";
+      //#endif
+      return false;
+   }
+
+   // Note: comparison does not look at Limit pointers
+   return true;
+}
+
+std::ostream& InLimit::print( std::ostream& os ) const {
+   Indentor in;
+   Indentor::indent( os ) << toString();
+   if ( PrintStyle::getStyle() == PrintStyle::STATE) {
+      if ( limit() )
+         os << " # referenced limit(value) " << limit()->theLimit() << "(" << limit()->value() << ")";
+   }
+   os << "\n";
+   return os;
+}
+
+std::string InLimit::toString() const {
+   std::stringstream ss;
+   if ( pathToNode_.empty() )  ss << "inlimit " << name_;
+   else                        ss << "inlimit " << pathToNode_ << Str::COLON() << name_;
+   if ( tokens_ != 1 )         ss << " " << tokens_;
+   return ss.str();
+}
+
diff --git a/ecflow_4_0_7/ANode/src/InLimit.hpp b/ecflow_4_0_7/ANode/src/InLimit.hpp
new file mode 100644
index 0000000..761240c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/InLimit.hpp
@@ -0,0 +1,72 @@
+#ifndef INLIMIT_HPP_
+#define INLIMIT_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #61 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <ostream>
+
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+#include <boost/serialization/weak_ptr.hpp>
+
+#include "LimitFwd.hpp"
+
+
+// Inlimit. Multiple inlimits on same Node are logically ANDED
+//    inlimit    limitName     // This will consume one token in the limit <limitName>
+//    inlimit    limitName 10  // This will consume 10 tokens in the limit <limitName>
+//    inlimit -n limitName     // Only applicable to a family, does not matter how many tasks
+//                             // the family has, will only consume one token in the family
+//                             // This is like showing that family is active/ has at least
+//                             // one task that is submitted <<<<NOT SUPPORTED YET>>>>>>
+//
+// Inlimit of the same name specified on a task take priority over the family
+class InLimit {
+public:
+   InLimit(const std::string& name,
+           const std::string& pathToNode = std::string(),
+           int tokens = 1);
+   InLimit() : tokens_(1)    {}
+
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const InLimit& rhs) const;
+
+   const std::string& name() const { return  name_;}             // must be defined
+   const std::string& pathToNode() const { return  pathToNode_;} // can be empty,the node referenced by the In-Limit, this should hold the Limit.
+   int tokens() const { return tokens_;}
+
+   std::string toString() const;
+
+private:
+   void limit( limit_ptr l) { limit_ = boost::weak_ptr<Limit>(l);}
+   Limit* limit() const { return limit_.lock().get();}  // can return NULL
+   friend class InLimitMgr;
+
+private:
+   std::string          name_;
+   std::string          pathToNode_;
+   int                  tokens_;
+   boost::weak_ptr<Limit>  limit_;     // NOT persisted since computed on the fly
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & name_;
+      ar & pathToNode_; // can be empty
+      ar & tokens_;
+   }
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/InLimitMgr.cpp b/ecflow_4_0_7/ANode/src/InLimitMgr.cpp
new file mode 100644
index 0000000..c759153
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/InLimitMgr.cpp
@@ -0,0 +1,436 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #28 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <assert.h>
+#include <boost/foreach.hpp>
+#include <boost/make_shared.hpp>
+
+#include "InLimitMgr.hpp"
+#include "Limit.hpp"
+#include "Node.hpp"
+#include "Memento.hpp"
+#include "Ecf.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+
+std::ostream& InLimitMgr::print(std::ostream& os) const
+{
+	BOOST_FOREACH(const InLimit& i, inLimitVec_)     { i.print(os); }
+ 	return os;
+}
+
+bool InLimitMgr::operator==(const InLimitMgr& rhs) const
+{
+	if (inLimitVec_.size() != rhs.inLimitVec_.size()) {
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "InLimitMgr::operator==  inLimitVec_.size() != rhs.inLimitVec_.size() " << node_->debugNodePath() << "\n";
+		}
+#endif
+		return false;
+	}
+	for(size_t i = 0; i < inLimitVec_.size(); ++i) {
+ 		if (!(inLimitVec_[i] == rhs.inLimitVec_[i] )) {
+#ifdef DEBUG
+			if (Ecf::debug_equality()) {
+				std::cout << "InLimitMgr::operator==  (!(inLimitVec_[i] == rhs.inLimitVec_[i] )) " << node_->debugNodePath() << "\n";
+			}
+#endif
+			return false;
+		}
+	}
+	return true;
+}
+
+void InLimitMgr::addInLimit(const InLimit& l )
+{
+	if (!findInLimitByNameAndPath(l)) {
+		inLimitVec_.push_back( l );
+		return;
+	}
+ 	throw std::runtime_error( "Add InLimit failed: Duplicate InLimit see node " + node_->debugNodePath() );
+}
+
+bool InLimitMgr::deleteInlimit(const std::string& name)
+{
+	if (name.empty()) {
+ 	  	inLimitVec_.clear();
+  		return true;
+	}
+
+	for(size_t i = 0; i < inLimitVec_.size(); i++) {
+		if (inLimitVec_[i].name() == name) {
+ 			inLimitVec_.erase( inLimitVec_.begin() + i );
+  			return true;
+		}
+	}
+	throw std::runtime_error("InLimitMgr::deleteInlimit: Can not find inlimit: " + name);
+}
+
+Limit* InLimitMgr::findLimitViaInLimit(const InLimit& theInLimit) const
+{
+   // Use in *test* only
+	size_t theSize = inLimitVec_.size();
+	for(size_t i = 0; i < theSize; i++) {
+ 		if (inLimitVec_[i].name() == theInLimit.name() && inLimitVec_[i].pathToNode() == theInLimit.pathToNode()) {
+ 			resolveInLimit(inLimitVec_[i]);
+ 			return inLimitVec_[i].limit() ;
+		}
+ 	}
+	return NULL;
+}
+
+bool InLimitMgr::findInLimitByNameAndPath(const InLimit& theInLimit) const
+{
+	size_t theSize = inLimitVec_.size();
+	for(size_t i = 0; i < theSize; i++) {
+ 		if (inLimitVec_[i].name() == theInLimit.name() && inLimitVec_[i].pathToNode() == theInLimit.pathToNode()) {
+ 			return true;
+		}
+ 	}
+	return false;
+}
+
+void InLimitMgr::get_memento( compound_memento_ptr& comp) const
+{
+#ifdef DEBUG_MEMENTO
+	std::cout << "InLimitMgr::get_memento " << node_->debugNodePath() << "\n";
+#endif
+
+ 	BOOST_FOREACH(const InLimit& l, inLimitVec_ )  { comp->add( boost::make_shared<NodeInLimitMemento>(  l) ); }
+}
+
+
+bool InLimitMgr::inLimit() const
+{
+	// Check in we are in limit.
+	// ** WE need to do a lookahead. hence we pass down inlimit tokens **
+	// In the case we have multiple inlimits
+	// then we are only in limit if _ALL_ are in limit. This is like
+	// a logical AND.
+ 	if (!inLimitVec_.empty()) {
+
+ 		resolveInLimitReferences();
+
+ 		int inlimitsWithLimits = 0;
+		int inlimitCount = 0;
+		size_t theSize = inLimitVec_.size();
+		for(size_t i = 0; i < theSize; i++ ) {
+ 			Limit* limit = inLimitVec_[i].limit();
+			if (limit) {
+				inlimitsWithLimits++;
+				if (limit->inLimit( inLimitVec_[i].tokens() )) {
+					inlimitCount++;
+ 				}
+			}
+		}
+
+		return  (inlimitsWithLimits == inlimitCount ) ;
+	}
+
+ 	return true;
+}
+
+void InLimitMgr::incrementInLimit( std::set<Limit*>& limitSet,const std::string& task_path) const
+{
+//	cout << "InLimitMgr::incrementInLimit " << node_->absNodePath() << endl;
+
+	// *NOTE* each limit is incremented if within LIMIT, and that
+	//        has not previously been updated.
+	//  we could have the same in limit at the task and family level.
+	//  in this case the task takes priority.
+	//  suite suite
+	//    family family
+	//       inlimit limitname 12
+	//       task t1
+ 	//          inlimit limitname 4
+	//    endfamily
+	//  endsuite
+	//
+	// In this case the limit <limitname> is incremented by 4 _only_
+	//
+	// Note: It is illegal for a node to have the same inlimit but with
+	//       different tokens:
+	//
+	//       task t1
+ 	//          inlimit limitname 4
+ 	//          inlimit limitname 2    // illegal and trapped by parser
+
+	resolveInLimitReferences();
+
+	BOOST_FOREACH(const InLimit& inlimit, inLimitVec_) {
+		Limit* limit = inlimit.limit();
+		if (limit && limitSet.find(limit) == limitSet.end()) {
+			limitSet.insert(limit);
+ 			// cout << "InLimitMgr::incrementInLimit " << node_->absNodePath() << " LIMIT incremented " << endl;
+			limit->increment( inlimit.tokens(), task_path);
+		}
+	}
+}
+
+void InLimitMgr::decrementInLimit( std::set<Limit*>& limitSet,const std::string& task_path) const
+{
+	// *NOTE* each limit is incremented if within LIMIT, and that
+	//        has not previously been updated.
+	//  we could have the same in limit at the task and family level.
+	//  in this case the task takes priority.
+	//  suite suite
+	//    family family
+	//       inlimit limitname 12
+	//       task t1
+ 	//          inlimit limitname 4
+	//    endfamily
+	//  endsuite
+	//
+	// In this case the limit <limitname> is incremented by 4 _only_
+	//
+	// Note: It is illegal for a node to have the same inlimit but with
+	//       different tokens:
+	//
+	//       task t1
+ 	//          inlimit limitname 4
+ 	//          inlimit limitname 2    // illegal and trapped by parser
+	resolveInLimitReferences();
+
+	BOOST_FOREACH(const InLimit& inlimit, inLimitVec_) {
+		Limit* limit = inlimit.limit();
+		if (limit && limitSet.find(limit) == limitSet.end()) {
+			limitSet.insert(limit);
+ 			// cout << "InLimitMgr::incrementInLimit " << node_->absNodePath() << " LIMIT incremented " << endl;
+			limit->decrement( inlimit.tokens(), task_path);
+		}
+	}
+}
+
+
+//#define DEBUG_WHY 1
+
+static void add_consumed_paths(Limit* limit, std::stringstream& ss)
+{
+   ss << "(";
+   const std::set<std::string>& consumed_paths = limit->paths();
+   int count = 0;
+   for (std::set<std::string>::const_iterator i = consumed_paths.begin(); i!=consumed_paths.end(); ++i) {
+      if ( 4 == count) { ss << "..."; break; }
+      ss << (*i) << ",";
+      count++;
+   }
+   ss << ")";
+}
+
+void InLimitMgr::why(std::vector<std::string>& vec) const
+{
+#ifdef DEBUG_WHY
+	std::cout << "InLimitMgr::why " << node_->debugNodePath() << "\n";
+#endif
+
+ 	// Note: if this correspond to a leaf node, like a task. Then it may not be
+ 	// sufficient to just check in limits at this level. Will need to look up hierarchy.
+ 	if (inLimit()) {
+#ifdef DEBUG_WHY
+ 		std::cout << "   Node   " << node_->debugNodePath() << " is *in limit*, checking parent\n";
+#endif
+ 		Node* theParent = node_->parent();
+ 		while( theParent ) {
+
+ 			if (theParent->check_in_limit())  {
+// 		  		std::cout << "   Parent " << theParent->debugNodePath() << " is *in limit* \n";
+   				theParent = theParent->parent();
+ 			}
+ 			else {
+// 		  		std::cout << "   Parent " << theParent->debugNodePath() << " Not in limit \n";
+ 		 		for(size_t i = 0; i < theParent->inlimits().size(); i++ ) {
+ 			 		Limit* limit = theParent->inlimits()[i].limit();
+ 					if (limit &&  !limit->inLimit( theParent->inlimits()[i].tokens() )) {
+ 						std::stringstream ss;
+ 						if ( theParent->inlimits()[i].pathToNode().empty())
+ 							ss << "limit " << limit->name() << " is full";
+ 						else
+ 							ss << "limit " << theParent->inlimits()[i].pathToNode() << Str::COLON() << limit->name() << " is full";
+
+ 						// show node paths that have consumed a limit, Only show first 5, Otherwise string may be too long
+ 						add_consumed_paths(limit,ss);
+
+ 						vec.push_back(ss.str());
+ 					}
+ 				}
+ 		 		break;
+ 			}
+ 		}
+ 	}
+ 	else {
+#ifdef DEBUG_WHY
+ 		std::cout << "   InLimitMgr::why " << node_->debugNodePath() << " NOT in limit\n";
+#endif
+  		for(size_t i = 0; i < inLimitVec_.size(); i++ ) {
+	 		Limit* limit = inLimitVec_[i].limit();
+			if (limit &&  !limit->inLimit(inLimitVec_[i].tokens())) {
+				std::stringstream ss;
+				if (  inLimitVec_[i].pathToNode().empty())
+					ss << "limit " << limit->name() << " is full";
+				else
+					ss << "limit " <<  inLimitVec_[i].pathToNode() << Str::COLON() << limit->name() << " is full";
+
+            // show node paths that have consumed a limit, Only show first 5, Otherwise string may be too long
+            add_consumed_paths(limit,ss);
+
+				vec.push_back(ss.str());
+			}
+		}
+	}
+}
+
+void InLimitMgr::check(std::string& errorMsg, std::string& warningMsg,bool reportErrors, bool reportWarnings) const
+{
+   size_t theSize = inLimitVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      (void)find_limit(inLimitVec_[i], errorMsg, warningMsg,  reportErrors,   reportWarnings) ;
+   }
+}
+
+void InLimitMgr::resolveInLimit(InLimit& inLimit,std::string& errorMsg, std::string& warningMsg,bool reportErrors, bool reportWarnings) const
+{
+//		cout << "Inlimit " << inLimit.toString() << "\n";
+
+	/// if limit pointer already setup use them. These are shared ptr backed, Hence if deleted beneath use should return 0;
+	if (inLimit.limit()) {
+//		cout << "InLimitMgr::resolveInLimit " << inLimit.toString() << " Reusing limit ptr \n";
+		return;
+	}
+
+	/// Find the limit referenced by the InLimit. i.e. Link inLimit to its LIMIT
+	/// The return value can be NULL
+	limit_ptr referencedLimit = find_limit(inLimit,errorMsg,warningMsg,reportErrors,reportWarnings);
+	inLimit.limit(  referencedLimit );
+}
+
+void InLimitMgr::auto_add_inlimit_externs(Defs* defs) const
+{
+   std::string errorMsg;
+   std::string warningMsg;
+   size_t theSize = inLimitVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      limit_ptr referencedLimit = find_limit(inLimitVec_[i],errorMsg,warningMsg,false,false);
+      if (!referencedLimit.get()) {
+         if (inLimitVec_[i].pathToNode().empty()) defs->add_extern( inLimitVec_[i].name() );
+         else                                     defs->add_extern( inLimitVec_[i].pathToNode() + ":" + inLimitVec_[i].name());
+      }
+   }
+}
+
+limit_ptr InLimitMgr::find_limit(const InLimit& inLimit, std::string& errorMsg, std::string& warningMsg,bool reportErrors, bool reportWarnings) const
+{
+   if (inLimit.pathToNode().empty()) {
+
+      // cout << "inLimit.pathToNode().empty() search " << debugType() << " " << node_->absNodePath() << "\n";
+      limit_ptr referencedLimit = node_->findLimitUpNodeTree( inLimit.name() );
+      if ( referencedLimit.get() )  return referencedLimit;
+
+      if (reportWarnings) {
+
+         // See if the name is defined, as an extern, in which case *DONT* warn:
+         // This is client side specific, since server does not have externs.
+         if (node_->defs()->find_extern(inLimit.name(),Str::EMPTY())) {
+            return referencedLimit; // this is empty/NULL
+         }
+
+         std::stringstream ss;
+         ss << "Warning: ";
+         ss << node_->debugType() << " " << node_->absNodePath() << " has a " << inLimit.toString() << ", which can not be found on the parent nodes\n";
+         warningMsg += ss.str();
+      }
+      return referencedLimit; // this is empty/NULL
+   }
+
+   // *FIND* the node referenced by the In-Limit, this should hold the Limit.
+   // cout << "Inlimit path not empty \n";
+   string warning_message;
+   node_ptr referenceNode = node_->findReferencedNode( inLimit.pathToNode(), inLimit.name(), warning_message);
+   if (!referenceNode.get()) {
+       /// Could not find the node which *HOLDS* the limit
+       if (reportWarnings) {
+
+          // OK a little bit of duplication, since findReferencedNode, will also look for externs
+          // See if the Path:name is defined as an extern, in which case *DONT* warn:
+          // This is client side specific, since server does not have externs.
+          if (node_->defs()->find_extern(inLimit.pathToNode(),inLimit.name())) {
+             return limit_ptr();
+          }
+
+          std::stringstream ss;
+          ss << "Warning: " << node_->debugType() << " " << node_->absNodePath() << " has a " << inLimit.toString() << ", which can not be found\n";
+          warningMsg += ss.str();
+       }
+       return limit_ptr();
+   }
+
+   // *FOUND* the node which should hold the Limit.
+   limit_ptr referencedLimit = referenceNode->find_limit( inLimit.name() );
+   if (!referencedLimit.get()) {
+
+      // See if the name is defined, as an extern, in which case *DONT* warn:
+      // This is client side specific, since server does not have externs.
+      if (node_->defs()->find_extern(inLimit.pathToNode(),inLimit.name())) {
+         return limit_ptr();
+      }
+
+      if (reportWarnings) {
+         std::stringstream ss;
+         ss << node_->debugType() << " " << node_->absNodePath() << " has a " << inLimit.toString() << " :";
+         ss << "The referenced " << referenceNode->debugType() << " '" << referenceNode->absNodePath() << "' does not define the limit " << inLimit.name() << "\n";
+         warning_message += ss.str();
+         warningMsg += "Warning: ";
+         warningMsg +=  warning_message;
+         warningMsg += "\n";
+      }
+      return referencedLimit; // this is empty/NULL
+   }
+
+   // *FOUND* the referenced LIMIT. inlimit tokens must be less than limit.
+   if ( inLimit.tokens() > referencedLimit->theLimit() ) {
+      if (reportErrors) {
+         // in limit exceeds the LIMIT value
+         std::stringstream ss;
+         ss << node_->debugType() << " " << node_->absNodePath() << " has a " << inLimit.toString() << " reference\n";
+         ss << " with value '" << inLimit.tokens() << "' which exceeds '" << referencedLimit->theLimit() << "' defined on the Limit\n";
+         errorMsg += ss.str();
+      }
+   }
+   return referencedLimit;
+}
+
+void InLimitMgr::resolveInLimit(InLimit& inLimit) const
+{
+   // Used in *test* only
+	std::string errorMsg;
+	std::string warningMsg;
+	resolveInLimit(inLimit, errorMsg, warningMsg, false, false );
+}
+
+void InLimitMgr::resolveInLimitReferences() const
+{
+   size_t theSize = inLimitVec_.size();
+   if (theSize > 0) {
+      std::string warningMsg;
+      std::string errorMsg;
+      for(size_t i = 0; i < theSize; i++) {
+         resolveInLimit(inLimitVec_[i], errorMsg, warningMsg,  false,   false) ;
+      }
+   }
+}
+
diff --git a/ecflow_4_0_7/ANode/src/InLimitMgr.hpp b/ecflow_4_0_7/ANode/src/InLimitMgr.hpp
new file mode 100644
index 0000000..89eec05
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/InLimitMgr.hpp
@@ -0,0 +1,131 @@
+#ifndef IN_LIMIT_MGR_HPP_
+#define IN_LIMIT_MGR_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <ostream>
+#include <set>
+
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+
+#include "InLimit.hpp"
+#include "LimitFwd.hpp"
+#include "NodeFwd.hpp"
+
+// class InLimitMgr:
+// Design notes:
+// Please note: when ever we want access the inlimits, limit ptrs we
+// must resolve(/compute them first). This save on client code which
+// modifies the node tree from having handle it.
+// If this proves to be a bottle next. We could add a caching mechanism
+// base on the Ecf class,so that we need only update the pointers
+// when a structural modification is made.
+//
+class InLimitMgr : private boost::noncopyable {
+public:
+	InLimitMgr(Node* n) : node_(n) {}
+	InLimitMgr() : node_(NULL) {}
+
+// standard functions: ==============================================
+ 	std::ostream& print(std::ostream&) const;
+ 	bool operator==(const InLimitMgr& rhs) const;
+ 	void clear() { inLimitVec_.clear(); }
+
+// Access functions: ======================================================
+	const std::vector<InLimit>&  inlimits()  const { return inLimitVec_; }
+
+// Add functions: ===============================================================
+	void addInLimit(const InLimit& );    // will throw std::runtime_error if duplicate
+
+// Delete functions: can throw std::runtime_error ===================================
+	// if name argument is empty, delete all attributes of that type
+	// if delete was successful return true, else return false.
+	// Can throw std::runtime_error if the attribute can not be found
+	bool deleteInlimit(const std::string& name);
+
+// mementos functions:
+  	void get_memento(compound_memento_ptr& comp) const;
+
+// Find functions: ============================================================
+ 	/// *** This will resolve the in limits first ***
+  	/// Used in *test* only
+   Limit* findLimitViaInLimit(const InLimit& ) const;
+
+ 	bool findInLimitByNameAndPath(const InLimit& ) const;  // use name,path,token,
+
+// Why:
+ 	void why(std::vector<std::string>& vec) const;
+
+// Limit functions:
+
+	/// Are the in limits pointers to the Limits in limit.
+ 	/// This is a very heavily used function. *******
+ 	/// *** This will resolve the in limits first ***
+ 	bool inLimit() const;
+
+	/// After job submission we need to increment the in limit, to indicate that a
+	/// resource is consumed.
+ 	/// *** This will resolve the in limits first ***
+ 	void incrementInLimit(
+ 	         std::set<Limit*>& limitSet,   // The set ensure we only update once
+ 	         const std::string& task_path  // The task that was submitted, and hence caused Limit to increment
+ 	) const;
+
+	/// After job aborts or completes we need to decrement the in limit, to indicate that
+	/// additional resource is available.
+ 	/// *** This will resolve the in limits first ***
+ 	void decrementInLimit(
+ 	         std::set<Limit*>& limitSet,  // The set ensure we only update once
+ 	         const std::string& task_path // The task that completed or aborted. Gives up the token
+ 	) const;
+
+ 	/// Check to see if inlimit's can reference their Limits
+ 	void check(std::string& errorMsg, std::string& warningMsg,bool reportErrors, bool reportWarnings) const;
+
+ 	/// Add externs where the inlimit reference to limits can not be resolved
+   void auto_add_inlimit_externs(Defs*) const;
+
+ 	/// Needed by python interface
+	std::vector<InLimit>::const_iterator inlimit_begin() const { return inLimitVec_.begin();}
+	std::vector<InLimit>::const_iterator inlimit_end() const { return inLimitVec_.end();}
+
+private:
+	/// Setup in-limits, to point to their limits,
+ 	void resolveInLimitReferences() const;
+ 	void resolveInLimit(InLimit&,std::string& errorMsg, std::string& warningMsg,bool reportErrors, bool reportWarnings) const;
+ 	void resolveInLimit(InLimit&) const;
+
+ 	limit_ptr find_limit(const InLimit&, std::string& errorMsg, std::string& warningMsg,bool reportErrors, bool reportWarnings) const;
+
+private:
+	Node* node_; // Not persisted, constructor will always set this up.
+
+ 	mutable std::vector<InLimit>        inLimitVec_;
+
+    friend class boost::serialization::access;
+    template<class Archive>
+    void serialize(Archive & ar, const unsigned int /*version*/) {
+         ar & inLimitVec_;
+    }
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(InLimitMgr, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(InLimitMgr,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/JobCreationCtrl.cpp b/ecflow_4_0_7/ANode/src/JobCreationCtrl.cpp
new file mode 100644
index 0000000..e14ba0c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/JobCreationCtrl.cpp
@@ -0,0 +1,32 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <iostream>
+#include <stdlib.h> // for getenv()
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "JobCreationCtrl.hpp"
+
+namespace fs = boost::filesystem;
+
+void JobCreationCtrl::generate_temp_dir()
+{
+   if (!getenv("TMPDIR")) throw std::runtime_error("JobCreationCtrl::generate_temp_dir(), The environment variable TMPDIR is not defined");
+	tempDirForJobGeneration_ = getenv("TMPDIR");
+	tempDirForJobGeneration_ += "/ecf_check_job_creation";
+	if (fs::exists(tempDirForJobGeneration_))  fs::remove_all(tempDirForJobGeneration_);
+	std::cout << "JobCreationCtrl::generate_temp_dir()  " << tempDirForJobGeneration_ << "\n";
+}
diff --git a/ecflow_4_0_7/ANode/src/JobCreationCtrl.hpp b/ecflow_4_0_7/ANode/src/JobCreationCtrl.hpp
new file mode 100644
index 0000000..b634b5e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/JobCreationCtrl.hpp
@@ -0,0 +1,52 @@
+#ifndef JOBS_GEN_CTRL_HPP_
+#define JOBS_GEN_CTRL_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <vector>
+
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/noncopyable.hpp>
+
+#include "NodeFwd.hpp"
+
+// Used as a utility class for testing Job creation
+// Collates data during the node tree traversal
+// Note: For testing purposes we do not always want to create jobs
+class JobCreationCtrl : public boost::enable_shared_from_this<JobCreationCtrl>, private boost::noncopyable {
+public:
+	JobCreationCtrl() {}
+
+	void set_node_path( const std::string& absNodePath ) { absNodePath_ = absNodePath;}
+	const std::string& node_path() const { return absNodePath_;}
+
+	void generate_temp_dir();
+	void set_dir_for_job_creation( const std::string& tempDirForJobGeneration ) { tempDirForJobGeneration_ = tempDirForJobGeneration; }
+	const std::string& dir_for_job_creation() { return tempDirForJobGeneration_;}
+
+	std::string& error_msg() { return errorMsg_;}
+	const std::string& get_error_msg() const { return errorMsg_;}
+
+	void push_back_failing_submittable(submittable_ptr t) { fail_submittables_.push_back(t); }
+	const std::vector<weak_submittable_ptr>& fail_submittables() const { return fail_submittables_;}
+
+private:
+	std::string absNodePath_;
+   std::string tempDirForJobGeneration_;
+ 	std::string errorMsg_;
+ 	std::vector<weak_submittable_ptr> fail_submittables_;
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/JobProfiler.cpp b/ecflow_4_0_7/ANode/src/JobProfiler.cpp
new file mode 100644
index 0000000..961b79e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/JobProfiler.cpp
@@ -0,0 +1,81 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <boost/lexical_cast.hpp>
+#include "JobProfiler.hpp"
+#include "JobsParam.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+
+// Connection and client timeout issues can be replicated  by adding
+//   - sleep(1) in EcfFile , i.e when creating the job output
+//
+
+static size_t task_threshold_ = 4000;
+
+namespace ecf {
+
+int JobProfiler::task_threshold_default() { return 4000;}
+
+// =================================================================================
+JobProfiler::JobProfiler(Task* node,JobsParam& jobsParam, size_t threshold)
+: node_(node),
+  jobsParam_(jobsParam),
+  start_time_(boost::posix_time::microsec_clock::universal_time()),
+  threshold_(threshold)
+{
+	if (!jobsParam_.next_poll_time().is_special() && start_time_ >= jobsParam_.next_poll_time()) {
+		jobsParam_.set_timed_out_of_job_generation(start_time_);
+	}
+}
+
+JobProfiler::JobProfiler( JobsParam& jobsParam)
+: node_(0),
+  jobsParam_(jobsParam),
+  start_time_(boost::posix_time::microsec_clock::universal_time()),
+  threshold_(0)
+{
+	if (!jobsParam_.next_poll_time().is_special() && start_time_ >= jobsParam_.next_poll_time()) {
+		jobsParam_.set_timed_out_of_job_generation(start_time_);
+	}
+}
+
+JobProfiler::~JobProfiler()
+{
+   if (node_) {
+      boost::posix_time::time_duration duration = boost::posix_time::microsec_clock::universal_time() - start_time_;
+      size_t time_taken = duration.total_milliseconds();
+
+      // When testing we set submitJobsInterval to < 0
+      if (jobsParam_.submitJobsInterval() < 0 ) {
+         time_taken = threshold_ + 1;
+      }
+
+      if ( time_taken > threshold_)  {
+         std::stringstream ss;
+         ss << "Job generation for task " << node_->absNodePath() << " took " << time_taken << "ms, Exceeds ECF_TASK_THRESHOLD(" << threshold_ << "ms)";
+         log(Log::WAR,ss.str());
+      }
+   }
+}
+
+void JobProfiler::set_task_threshold(size_t threshold){task_threshold_ = threshold;}
+size_t JobProfiler::task_threshold() { return task_threshold_; }
+
+}
diff --git a/ecflow_4_0_7/ANode/src/JobProfiler.hpp b/ecflow_4_0_7/ANode/src/JobProfiler.hpp
new file mode 100644
index 0000000..cfce85c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/JobProfiler.hpp
@@ -0,0 +1,53 @@
+#ifndef JOB_PROFILER_HPP_
+#define JOB_PROFILER_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//  This class is used to aid profiling of the job generation step.
+//  This will be used to identify those suite/familiy/tasks that take the most
+//  amount of time, *when* we exceed the jobs generation interval.
+//  In particular if we have output that is many megabtyes, it can affect
+//  the performance of the server, especially when the server is running
+//  on virtual machines
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "NodeFwd.hpp"
+class JobsParam;
+
+namespace ecf {
+
+class JobProfiler  : private boost::noncopyable  {
+public:
+   // Note: 1000 milliseconds = 1 second
+   JobProfiler(Task*,JobsParam&,size_t threshold /* expected to be milli seconds */);
+   JobProfiler( JobsParam&);
+   ~JobProfiler();
+
+   static void set_task_threshold(size_t threshold);
+   static size_t task_threshold();
+
+   static int task_threshold_default();
+
+private:
+   Task* node_;
+   JobsParam& jobsParam_;
+   boost::posix_time::ptime start_time_;
+   size_t threshold_;
+};
+
+}
+
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Jobs.cpp b/ecflow_4_0_7/ANode/src/Jobs.cpp
new file mode 100644
index 0000000..9de994f
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Jobs.cpp
@@ -0,0 +1,126 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+
+#include "Jobs.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Log.hpp"
+#include "DurationTimer.hpp"
+#include "JobsParam.hpp"
+#include "Signal.hpp"
+#include "System.hpp"
+#include "SuiteChanged.hpp"
+#include "JobProfiler.hpp"
+
+using namespace ecf;
+using namespace std;
+
+//#define DEBUG_JOB_SUBMISSION 1
+
+bool Jobs::generate( JobsParam& jobsParam) const
+{
+#ifdef DEBUG_JOB_SUBMISSION
+   cout << "\n" << "Jobs::generate (" << jobsParam.logDebugMessage() << ") create jobs(" << jobsParam.createJobs() << ")";
+   if (defs_) cout << " server_state(" << SState::to_string(defs_->server().get_state()) << ")\n";
+#endif
+
+   // dependency resolving and job submission must be less than submitJobsInterval seconds
+   // Note: Duration timer makes a system call
+   DurationTimer durationTimer;
+
+#ifdef DEBUG_JOB_SUBMISSION
+   LogToCout toCoutAsWell;
+   LOG(Log::DBG,"-->Job submission start " << jobsParam.logDebugMessage());
+#endif
+   {
+      // Constructor does nothing, destructor will un-block SIGCHLD
+      // This will allow child process termination to handled by the signal handler in System
+      // The desctructor will then re-block SIGCHLD
+    	Signal unblock_on_desctruction_then_reblock;
+
+    	// *******************************************************************
+    	// **** JOB submission *MUST* be done sequentially, as each task could
+    	// **** be affected by a resource/limit, and hence affect subsequent
+    	// **** job submission
+    	// *******************************************************************
+
+    	if (defs_) {
+    		if (defs_->server().get_state() == SState::RUNNING) {
+    			const std::vector<suite_ptr>& suiteVec = defs_->suiteVec();
+    			size_t theSize = suiteVec.size();
+    			for(size_t i = 0; i < theSize; i++) {
+    				// SuiteChanged moved internal to Suite::resolveDependencies. i.e on fast path
+    			   // and when suites not begun we save a constructor/destructor calls
+    				(void)suiteVec[i]->resolveDependencies(jobsParam);
+    			}
+    		}
+    	}
+    	else {
+    		if (!node_->isParentSuspended()) {
+    			// suite, family, task
+    		   SuiteChanged1 changed(node_->suite());
+    			(void)node_->resolveDependencies( jobsParam );
+    		}
+    	}
+
+		// *****************************************************************
+		// Should end up calling signal handler here for any pending SIGCHLD
+		// *****************************************************************
+    }
+
+	// Process children that have terminated
+   System::instance()->processTerminatedChildren();
+
+#ifdef DEBUG_JOB_SUBMISSION
+   LOG(Log::DBG,"-->Job submission finish interval = "
+       << jobsParam.submitJobsInterval()
+       <<  " time taken = " << durationTimer.duration()
+       << " Tasks/Aliases submitted " << jobsParam.submitted().size()
+       << " " << jobsParam.getErrorMsg()
+   );
+#endif
+
+   if (durationTimer.duration() > jobsParam.submitJobsInterval()) {
+      LOG(Log::ERR,"Jobs::generate: job generation time(" << durationTimer.duration() << " seconds) is greater than job submission interval of " << jobsParam.submitJobsInterval() << " seconds!!");
+   }
+   return jobsParam.getErrorMsg().empty();
+}
+
+bool Jobs::generate() const
+{
+	Defs* defs = NULL;
+	if (defs_) {
+		defs = defs_;
+		LOG_ASSERT( defs != NULL ,"defs_ == NULL");
+	}
+	else {
+		defs = node_->defs();
+		LOG_ASSERT( defs != NULL ,"node_->defs() == NULL");
+	}
+
+	if (defs->server().get_state() == SState::RUNNING) {
+	   LOG_ASSERT( defs->server().jobSubmissionInterval() != 0 ,"");
+	   JobsParam jobsParam( defs->server().jobSubmissionInterval(), defs->server().jobGeneration() );
+#ifdef DEBUG_JOB_SUBMISSION
+	   jobsParam.logDebugMessage(" from Jobs::generate()/Server");
+#endif
+
+	   return generate( jobsParam );
+	}
+	return false;
+}
diff --git a/ecflow_4_0_7/ANode/src/Jobs.hpp b/ecflow_4_0_7/ANode/src/Jobs.hpp
new file mode 100644
index 0000000..2f87a34
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Jobs.hpp
@@ -0,0 +1,69 @@
+#ifndef JOBS_HPP_
+#define JOBS_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+#include "NodeFwd.hpp"
+
+/// Job generation involves:
+///  1/ resolving dependencies. This means we look at day,date,time and triggers,
+///     and check to to see if a node is free or still holding.
+///     When a node is free of its dependencies, a job can be created.
+///     Note: for a node that is suspended, job generation is disabled.
+///           In this case the time dependencies are still checked.
+///           and if free are marked as such. later on if the node is resumed
+///           we check dependencies and create the jobs
+///  2/ Creating jobs. Pre processing and variable substitution
+///  3/ Changing state of task to submitted.
+///  4/ Increment the inlimit references, for successful job submission
+///  5/ Error/Complete must decrement limits
+///  6/ Set up signal handlers to monitor child job, so that on failure
+//      Change state to ABORTED and decrement limit references
+///
+///  Job submission *MUST* be done sequentially,as each job submission could
+///  consume a resource(i.e like a limit), which can affect subsequent jobs.
+///
+/// The process of resolving dependencies and submitting all the tasks, must take
+/// less than 60 seconds. As this is resolution of the clock.
+/// For testing purposes this can be changed and also we do not always want
+/// to create jobs.
+///
+/// Return true, if job submission ok, else false and error message in JobsParam
+///
+/// The jobs file are shell scripts, which have IPC(child commands) which talk to
+/// to the server. Since the scripts are user created, they can include, errors:
+///   o multiple call to complete
+///     To guard against this, we should *not* clear reset password in the complete
+///     Otherwise we will registered as a zombie.
+///   o Failure to call complete (maybe due to early exit in the job file)
+///     There is not much we can do here, the job will stay active.
+///   o Path do not match, since the node tree, in the server has been deleted
+///     Typically the job will hold on the child commands.
+///
+/// Note: in real life test 99% of job generation is done after child command
+class Jobs  : private boost::noncopyable  {
+public:
+	Jobs(const defs_ptr& d) : defs_(d.get()), node_(NULL) {}
+	Jobs(Defs* d) : defs_(d), node_(NULL) {}
+	Jobs(Node* d) : defs_(NULL), node_(d) {}
+
+ 	bool generate( JobsParam& ) const;
+ 	bool generate() const;
+
+private:
+	Defs* defs_;
+	Node* node_;
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/JobsParam.hpp b/ecflow_4_0_7/ANode/src/JobsParam.hpp
new file mode 100644
index 0000000..55df9c4
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/JobsParam.hpp
@@ -0,0 +1,81 @@
+#ifndef JOBSPARAM_HPP_
+#define JOBSPARAM_HPP_
+//============================================================================
+// Name        : time
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/noncopyable.hpp>
+#include "NodeFwd.hpp"
+
+// Used as a utility class for controlling job creation.
+// Collates data during the node tree traversal
+// Note: For testing purposes we do not always want to create jobs or spawn jobs
+class JobsParam : private boost::noncopyable {
+public:
+   // This constructor is used in test
+	JobsParam(bool createJobs = false)
+      : timed_out_of_job_generation_(false),
+        createJobs_(createJobs), spawnJobs_(false), submitJobsInterval_(60){}
+
+	JobsParam(int submitJobsInterval, bool createJobs, bool spawn_jobs = true)
+	   : timed_out_of_job_generation_(false),
+	     createJobs_(createJobs),spawnJobs_(spawn_jobs), submitJobsInterval_(submitJobsInterval)
+	   { if (!createJobs_) spawnJobs_ = false;}
+
+	std::string& errorMsg() { return errorMsg_;}
+	const std::string& getErrorMsg() const { return errorMsg_;}
+
+	void push_back_submittable(Submittable* t) { submitted_.push_back(t); }
+	const std::vector<Submittable*>& submitted() const { return submitted_;}
+
+	bool createJobs() const { return createJobs_;}
+	bool spawnJobs() const { return spawnJobs_;}
+
+	/// returns the number of seconds at which we should check time dependencies
+	/// this includes evaluating trigger dependencies and submit the corresponding jobs.
+	/// This is set at 60 seconds. But will vary for debug purposes only.
+	int submitJobsInterval() const { return submitJobsInterval_;}
+
+	/// Allow user to set the debug message that appears in log file when job submission starts
+	void logDebugMessage(const std::string& s) { debugMsg_ = s;}
+	const std::string& logDebugMessage() const { return debugMsg_;}
+
+	void set_user_edit_variables(const NameValueMap& v) { user_edit_variables_ = v;}
+	const NameValueMap& user_edit_variables() const { return user_edit_variables_;}
+
+	void set_user_edit_file(const std::vector<std::string>& file) { user_edit_file_ = file;}
+	const std::vector<std::string>& user_edit_file() const { return user_edit_file_; }
+
+	// Functions to aid timing of job generation
+   void set_next_poll_time(const boost::posix_time::ptime& next_poll_time) { next_poll_time_ = next_poll_time;}
+   const boost::posix_time::ptime&  next_poll_time() const { return next_poll_time_;}
+   const boost::posix_time::ptime&  time_out_time() const { return time_out_time_;}
+   void set_timed_out_of_job_generation(const boost::posix_time::ptime& t) { time_out_time_ = t; timed_out_of_job_generation_ = true;}
+   bool timed_out_of_job_generation() const { return timed_out_of_job_generation_; }
+
+private:
+   bool timed_out_of_job_generation_;
+	bool createJobs_;
+	bool spawnJobs_;
+	int  submitJobsInterval_;
+	std::string errorMsg_;
+	std::string debugMsg_;
+	std::vector<Submittable*> submitted_;
+	std::vector<std::string> user_edit_file_;
+	NameValueMap user_edit_variables_;          // Used for User edit
+	boost::posix_time::ptime next_poll_time_;   // Aid early exit from job generation, if it takes to long
+	boost::posix_time::ptime time_out_time_;    // When we actually timed out must >= next_poll_time_
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Limit.cpp b/ecflow_4_0_7/ANode/src/Limit.cpp
new file mode 100644
index 0000000..8dad850
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Limit.cpp
@@ -0,0 +1,209 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #64 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+
+#include "Limit.hpp"
+#include "Indentor.hpp"
+#include "PrintStyle.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Suite.hpp"
+
+using namespace std;
+using namespace ecf;
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+Limit::Limit(const std::string& name,int limit)
+: state_change_no_(0),name_(name),theLimit_(limit),value_(0),node_(0)
+{
+   if ( !Str::valid_name( name ) ) {
+      throw std::runtime_error("Limit::Limit: Invalid Limit name: " + name);
+   }
+}
+
+Limit::Limit(const std::string& name,int limit, int value, const std::set<std::string>& paths)
+: state_change_no_(0),name_(name),theLimit_(limit),value_(value),paths_(paths),node_(0)
+{
+   if ( !Str::valid_name( name ) ) {
+      throw std::runtime_error("Limit::Limit: Invalid Limit name: " + name);
+   }
+}
+
+Limit::Limit(const Limit& rhs)
+: state_change_no_(0), name_(rhs.name_),theLimit_(rhs.theLimit_),value_(rhs.value_),paths_(rhs.paths_),node_(0)
+{
+}
+
+bool Limit::operator==( const Limit& rhs ) const {
+   if ( value_ != rhs.value_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Limit::operator==value_(" << value_ << ") != rhs.value_(" << rhs.value_ << ") " << toString() << "   rhs(" << rhs.toString() << ")\n";
+      }
+#endif
+      return false;
+   }
+   if ( theLimit_ != rhs.theLimit_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Limit::operator==( theLimit_ != rhs.theLimit_) " << toString() << "   rhs(" << rhs.toString() << ")\n";
+      }
+#endif
+      return false;
+   }
+   if ( name_ != rhs.name_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Limit::operator==( name_ != rhs.name_ ) " << toString() << "   rhs(" << rhs.toString() << ")\n";
+      }
+#endif
+      return false;
+   }
+   if ( paths_ != rhs.paths_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Limit::operator==( paths_ != rhs.paths_ ) " << toString() << "   rhs(" << rhs.toString() << ")\n";
+      }
+#endif
+      return false;
+   }
+   return true;
+}
+
+std::ostream& Limit::print( std::ostream& os ) const {
+   Indentor in;
+   Indentor::indent( os ) << toString();
+   if (!PrintStyle::defsStyle()) {
+      if (value_ != 0) {
+         os << " # " << value_;
+         for(std::set<std::string>::const_iterator i = paths_.begin(); i != paths_.end(); ++i) {
+            os << " " << (*i);
+         }
+      }
+   }
+   os << "\n";
+   return os;
+}
+
+std::string Limit::toString() const {
+   std::stringstream ss;
+   ss << "limit " << name_ << " " << theLimit_;
+   return ss.str();
+}
+
+void Limit::decrement( int tokens ,  const std::string& abs_node_path) {
+
+   // cout << "Limit::decrement name = " << name_ << " current value_ = " << value_ << " limit = " <<  theLimit_ << " consume tokens = " << tokens << "\n";
+   // Note: we previously had 'if (value_ > 0) {
+   //       However if the user had manually changed the value_, then we could be left with paths_,  that would never have been cleared
+   if (delete_path(abs_node_path)) {
+      // delete_path() will increment state_change_no
+      value_ -= tokens;
+      if ( value_ < 0 ) {
+         value_ = 0;
+         paths_.clear();
+      }
+   }
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Limit::decrement\n";
+#endif
+   // cout << "Limit::decrement name = " << name_ << " current value_ = " << value_ << "\n";
+}
+
+void Limit::increment( int tokens , const std::string& abs_node_path) {
+   // cout << "Limit::increment name = " << name_ << " current value_ = " << value_ << " limit = " <<  theLimit_ << " consume tokens = " << tokens << "\n";
+
+   if ( value_ < theLimit_ ) {
+
+      std::set<std::string>::iterator i = paths_.find(abs_node_path);
+      if (i == paths_.end()) {
+
+         paths_.insert( abs_node_path );
+         value_ += tokens;
+         update_change_no();
+      }
+
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "Limit::increment\n";
+#endif
+   }
+   // cout << "Limit::increment name = " << name_ << " current value_ = " << value_ << "\n";
+}
+
+void Limit::setValue( int v )
+{
+   value_ = v;
+   update_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "   Limit::setValue() value_ = " << value_ << "\n";
+#endif
+}
+
+void Limit::setLimit(int v)
+{
+   theLimit_ = v;
+   update_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "   Limit::setLimit() theLimit_ = " << value_ << "\n";
+#endif
+}
+
+void Limit::set_paths(const std::set<std::string>& paths)
+{
+   paths_ = paths;
+   update_change_no();
+}
+
+void Limit::set_state(int limit, int value, const std::set<std::string>& paths)
+{
+   value_ = value;
+   theLimit_ = limit;
+   paths_ = paths;
+   update_change_no();
+}
+
+bool Limit::delete_path( const std::string& abs_node_path)
+{
+   std::set<std::string>::iterator i = paths_.find(abs_node_path);
+   if (i != paths_.end()) {
+      paths_.erase(i);
+      update_change_no();
+      return true;
+   }
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Limit::delete_path() \n";
+#endif
+   return false;
+}
+
+void Limit::reset() {
+   paths_.clear();
+   setValue(0); // will increment state_change_no_
+}
+
+void Limit::update_change_no()
+{
+   state_change_no_ = Ecf::incr_state_change_no();
+   if (node_) {
+      Suite* suite = node_->suite();
+      if (suite) suite->set_state_change_no(state_change_no_);
+   }
+}
diff --git a/ecflow_4_0_7/ANode/src/Limit.hpp b/ecflow_4_0_7/ANode/src/Limit.hpp
new file mode 100644
index 0000000..84c9450
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Limit.hpp
@@ -0,0 +1,89 @@
+#ifndef LIMIT_HPP_
+#define LIMIT_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #61 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : Limit was placed in the ANode category because inlimit
+//               can reference Limit on *ANOTHER* suite. This presents
+//               A problem with incremental sync, since that requires
+//               access to a parent/suite, to mark the suite as changed.
+//               To get round this issue the Node will set the
+//               parent pointer on the Limit this then makes it easy
+//               for incremental sync, since we directly access the parent suite
+//============================================================================
+
+#include <ostream>
+
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/set.hpp>            // no need to include <set>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+class Node;
+
+// Class Limit: The limit is zero based, hence if limit is 10, increment must use < 10
+class Limit {
+public:
+   Limit(const std::string& name,int limit);
+   Limit(const std::string& name,int limit, int value, const std::set<std::string>& paths);
+   Limit() : state_change_no_(0), theLimit_(0), value_(0),node_(0)  {}
+   Limit(const Limit& rhs);
+
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const Limit& rhs) const;
+   const std::string& name() const { return  name_;}
+
+   void set_node(Node* n) { node_ = n; }
+
+   void setValue(int v);
+   void setLimit(int v);
+   void set_state(int limit, int value,const std::set<std::string>& p); // for use by memento
+   void set_paths(const std::set<std::string>& p);
+
+   bool delete_path( const std::string& abs_node_path); // for use by AlterCmd
+   const std::set<std::string>& paths() const { return paths_;}
+
+   int value() const { return value_;}
+   bool inLimit(int inlimit_tokens) const { return ((value_ + inlimit_tokens) <= theLimit_);}
+   int theLimit() const { return theLimit_;}
+   void increment(int tokens, const std::string& abs_node_path);
+   void decrement(int tokens, const std::string& abs_node_path);
+   void reset();
+
+   // The state_change_no is never reset. Must be incremented if it can affect equality
+   unsigned int state_change_no() const { return state_change_no_; }
+
+   // for python interface
+   std::string toString() const;
+   std::set<std::string>::const_iterator paths_begin() const { return paths_.begin();}
+   std::set<std::string>::const_iterator paths_end() const { return paths_.end();}
+
+private:
+   void update_change_no();
+
+private:
+   unsigned int             state_change_no_;  // *not* persisted, only used on server side
+   std::string              name_;
+   int                      theLimit_;
+   int                      value_;
+   std::set<std::string>    paths_;           // Updated via increment()/decrement()/reset(). Typically task paths
+   Node*                    node_ ;           // The parent NOT persisted
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & name_;
+      ar & theLimit_;
+      ar & value_;
+      ar & paths_;
+   }
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/LimitFwd.hpp b/ecflow_4_0_7/ANode/src/LimitFwd.hpp
new file mode 100644
index 0000000..d2d6af3
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/LimitFwd.hpp
@@ -0,0 +1,22 @@
+#ifndef LIMIT_FWD_HPP_
+#define LIMIT_FWD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/shared_ptr.hpp>
+
+class Limit;
+typedef boost::shared_ptr<Limit> limit_ptr;
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Memento.cpp b/ecflow_4_0_7/ANode/src/Memento.cpp
new file mode 100644
index 0000000..d54bd7c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Memento.cpp
@@ -0,0 +1,113 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "Memento.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+
+//#define DEBUG_MEMENTO 1
+
+// ===============================================================
+Memento::~Memento() {}
+
+// ===============================================================
+void CompoundMemento::incremental_sync(defs_ptr client_def,std::vector<std::string>& changed_nodes) const
+{
+   /// Clear out aspects, for this Memento.
+   ///   Aspects are added to ChangeMgrSingleton, via do_incremental_* functions
+   ///   AND in *this* function when node attributes have been added or deleted.
+   ChangeMgrSingleton::instance()->clear_aspects();
+
+   // Record changes nodes for the python interface
+   changed_nodes.push_back(absNodePath_);
+
+	node_ptr node = client_def->findAbsNode(absNodePath_);
+ 	if (!node.get()) {
+ 		if ( absNodePath_ != Str::ROOT_PATH()) throw std::runtime_error("CompoundMemento::incremental_sync: could not find path " + absNodePath_ );
+
+#ifdef DEBUG_MEMENTO
+ 		cout << "CompoundMemento::incremental_sync: ROOT_PATH   changed_nodes.size()=" << changed_nodes.size() << "\n";
+#endif
+ 		BOOST_FOREACH(memento_ptr m, vec_) {
+  			m->do_incremental_defs_sync( client_def.get() );
+ 		}
+
+ 		/// Notify any interested parties incremental changes
+ 		ChangeMgrSingleton::instance()->notify(client_def);
+	}
+ 	else {
+
+#ifdef DEBUG_MEMENTO
+ 		cout << "CompoundMemento::incremental_sync: " << node->debugNodePath() << "  changed_nodes.size()=" << changed_nodes.size() << "\n";
+#endif
+
+ 		if (clear_attributes_) {
+ 		   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ADD_REMOVE_ATTR);
+ 			node->clear();
+ 		}
+
+      Task* task = node->isTask();
+      Alias* alias = node->isAlias();
+      Suite* suite = node->isSuite();
+      Family* family = node->isFamily();
+
+ 		BOOST_FOREACH(memento_ptr m, vec_) {
+// 		std::cout << "memento = " << typeid(*m.get()).name() << "\n";
+ 			if (task)        m->do_incremental_task_sync( task );
+         else if (alias)  m->do_incremental_alias_sync( alias );
+         else if (suite)  m->do_incremental_suite_sync( suite );
+ 			else if (family) m->do_incremental_family_sync( family );
+ 			m->do_incremental_node_sync( node.get() );
+ 		}
+
+ 		/// Notify any interested parties that Node has made incremental changes
+ 		ChangeMgrSingleton::instance()->notify(node);
+ 	}
+}
+
+BOOST_CLASS_EXPORT_IMPLEMENT(StateMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeDefStatusDeltaMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(SuspendedMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(ServerStateMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(ServerVariableMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeEventMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeMeterMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeLabelMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeTriggerMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeCompleteMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeRepeatMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeLimitMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeInLimitMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeVariableMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeLateMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeTodayMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeTimeMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeDayMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeCronMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeDateMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeZombieMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(NodeVerifyMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(FlagMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(SubmittableMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(SuiteClockMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(SuiteBeginDeltaMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(SuiteCalendarMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(OrderMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(ChildrenMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(AliasChildrenMemento);
+BOOST_CLASS_EXPORT_IMPLEMENT(AliasNumberMemento);
diff --git a/ecflow_4_0_7/ANode/src/Memento.hpp b/ecflow_4_0_7/ANode/src/Memento.hpp
new file mode 100644
index 0000000..9c88800
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Memento.hpp
@@ -0,0 +1,742 @@
+#ifndef MEMENTO_HPP_
+#define MEMENTO_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #41 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : class Memento
+//               Class's derived from Memento are stored on DefsDelta.
+//               DefsDelta is transferred from Server to Client during a sync
+//               See SSyncCmd.hpp
+//
+// Are created in the server, but used by the client to sync.
+//
+// Used to capture incremental change of state, to node, and node attributes
+// Serve as a base class of all memento's
+// Later on the client side, the changes can be applied. via incremental_sync()
+// The are several kind of changes that we can capture:
+// 	a/ simple state changes,
+// 	b/ Change in attribute structure
+// 	c/ Deletion of attribute
+// 	d/ Addition of an attribute
+// 	e/ Add/delete of a Family/task
+//    f/ Add/Delete of suite
+//
+// The main emphasis here is to capture a,b,c,d,e. This is easily handled by state_change_no.
+// option f/ is handled via a full update and hence does not use mementos
+//
+// ISSUES: AIX has issues with TOC(table of contents) overflow. This is heavily
+// influenced by the number of global symbols. Unfortunately each boost serializiable
+// type, greatly increases the number of globals.
+// Hence we need to ensure we use the minimum number of serializable types.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+
+#include "boost_archive.hpp" // collates boost archive includes
+#include <boost/serialization/export.hpp>
+#include <boost/serialization/deque.hpp>          // no need to include <deque>
+
+//#define DEBUG_MEMENTO 1
+
+class Memento : private boost::noncopyable {
+public:
+   virtual ~Memento();
+private:
+   /// Applies the mementos to the client side defs. Can raise std::runtime_error
+   virtual void do_incremental_node_sync(Node*) const {}
+   virtual void do_incremental_task_sync(Task*) const {}
+   virtual void do_incremental_alias_sync(Alias*) const {}
+   virtual void do_incremental_suite_sync(Suite*) const {}
+   virtual void do_incremental_family_sync(Family*) const {}
+   virtual void do_incremental_defs_sync(Defs*) const {}
+   friend class CompoundMemento;
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {}
+};
+BOOST_SERIALIZATION_ASSUME_ABSTRACT(Memento)
+
+
+// Used for storing all the memento's associated with a single node
+// This allow us to make only *ONE* call to find the node.
+// The mementos are then applied to this single node.
+class CompoundMemento  {
+public:
+   CompoundMemento(const std::string& absNodePath)
+   : clear_attributes_(false),absNodePath_(absNodePath) {}
+
+   CompoundMemento() : clear_attributes_(false) {} // for serialization
+
+   void incremental_sync(defs_ptr client_def, std::vector<std::string>& changed_nodes) const;
+   void add(memento_ptr m) { vec_.push_back(m); }
+   void clear_attributes() { clear_attributes_ = true;}
+
+private:
+
+   bool clear_attributes_;
+   std::string absNodePath_;
+   std::vector<memento_ptr> vec_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & clear_attributes_;
+      ar & absNodePath_;
+      ar & vec_;
+   }
+};
+
+
+class StateMemento : public Memento {
+public:
+   StateMemento(NState::State state) : state_(state) {}
+   StateMemento() : state_(NState::UNKNOWN) {}
+private:
+   virtual void do_incremental_node_sync(Node* n)    const { n->set_memento(this);}
+   virtual void do_incremental_defs_sync(Defs* defs) const { defs->set_memento(this);}
+
+   NState::State state_;
+   friend class Node;
+   friend class Defs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & state_;
+   }
+};
+
+class OrderMemento : public Memento {
+public:
+   OrderMemento(const std::vector<std::string>& order) : order_(order) {}
+   OrderMemento() {}
+private:
+   virtual void do_incremental_defs_sync(Defs* defs) const { defs->set_memento(this);}
+   virtual void do_incremental_suite_sync(Suite* s) const { s->set_memento(this);}
+   virtual void do_incremental_family_sync(Family* f) const { f->set_memento(this);}
+   virtual void do_incremental_task_sync(Task* t) const { t->set_memento(this);}
+
+   std::vector<std::string> order_;
+   friend class NodeContainer;
+   friend class Task;
+   friend class Defs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & order_;
+   }
+};
+
+class ChildrenMemento : public Memento {
+public:
+   ChildrenMemento(const std::vector<node_ptr>& children) : children_(children) {}
+   ChildrenMemento() {}
+private:
+   virtual void do_incremental_suite_sync(Suite* s) const { s->set_memento(this);}
+   virtual void do_incremental_family_sync(Family* f) const { f->set_memento(this);}
+
+   std::vector<node_ptr> children_;
+   friend class NodeContainer;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+
+      ar.register_type(static_cast<Task *>(NULL));
+      ar.register_type(static_cast<Family *>(NULL));
+
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & children_;
+   }
+};
+
+class AliasChildrenMemento : public Memento {
+public:
+   AliasChildrenMemento(const std::vector<alias_ptr>& children) : children_(children) {}
+   AliasChildrenMemento() {}
+private:
+   virtual void do_incremental_task_sync(Task* t) const { t->set_memento(this);}
+
+   std::vector<alias_ptr> children_;
+   friend class Task;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+
+      ar.register_type(static_cast<Alias *>(NULL));
+
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & children_;
+   }
+};
+
+class AliasNumberMemento : public Memento {
+public:
+   AliasNumberMemento(unsigned int alias_no ) : alias_no_(alias_no) {}
+   AliasNumberMemento() : alias_no_(0) {}
+private:
+   virtual void do_incremental_task_sync(Task* t) const { t->set_memento(this);}
+
+   unsigned int alias_no_;
+   friend class Task;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & alias_no_;
+   }
+};
+
+
+class SuspendedMemento : public Memento {
+public:
+   SuspendedMemento(bool suspended) : suspended_(suspended) {}
+   SuspendedMemento() : suspended_(false) {}
+private:
+   virtual void do_incremental_node_sync(Node* n)    const { n->set_memento(this);}
+
+   bool suspended_;
+   friend class Node;
+   friend class Defs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & suspended_;
+   }
+};
+
+class ServerStateMemento : public Memento {
+public:
+   ServerStateMemento(SState::State s) : state_(s) {}
+   ServerStateMemento() : state_(SState::HALTED) {}
+private:
+   virtual void do_incremental_defs_sync(Defs* defs) const { defs->set_memento(this);}
+
+   SState::State state_;
+   friend class Defs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & state_;
+   }
+};
+
+class ServerVariableMemento : public Memento {
+public:
+   ServerVariableMemento(const std::vector<Variable>& vec) : serverEnv_(vec) {}
+   ServerVariableMemento() {}
+private:
+   virtual void do_incremental_defs_sync(Defs* defs) const { defs->set_memento(this);}
+
+   std::vector<Variable>  serverEnv_;
+   friend class Defs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & serverEnv_;
+   }
+};
+
+class NodeDefStatusDeltaMemento : public Memento {
+public:
+   NodeDefStatusDeltaMemento(DState::State state) : state_(state) {}
+   NodeDefStatusDeltaMemento() : state_(DState::UNKNOWN) {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   DState::State state_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & state_;
+   }
+};
+
+class NodeEventMemento : public Memento {
+public:
+   NodeEventMemento( const Event& e) : event_(e) {}
+   NodeEventMemento(){}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Event event_;
+   friend class Node;
+   friend class ChildAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & event_;
+   }
+};
+
+class NodeMeterMemento : public Memento {
+public:
+   NodeMeterMemento(const Meter& e) : meter_(e) {}
+   NodeMeterMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Meter meter_;
+   friend class Node;
+   friend class ChildAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & meter_;
+   }
+};
+
+class NodeLabelMemento : public Memento {
+public:
+   NodeLabelMemento( const Label& e) : label_(e) {}
+   NodeLabelMemento(){}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Label label_;
+   friend class Node;
+   friend class ChildAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & label_;
+   }
+};
+
+
+class NodeTriggerMemento : public Memento {
+public:
+   NodeTriggerMemento(const Expression& e) : exp_(e) {}
+   NodeTriggerMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Expression exp_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & exp_;
+   }
+};
+
+class NodeCompleteMemento : public Memento {
+public:
+   NodeCompleteMemento(const Expression& e) : exp_(e) {}
+   NodeCompleteMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Expression exp_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & exp_;
+   }
+};
+
+class NodeRepeatMemento : public Memento {
+public:
+   NodeRepeatMemento( const Repeat& e ) : repeat_(e) {}
+   NodeRepeatMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Repeat repeat_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & repeat_;
+   }
+};
+
+class NodeLimitMemento : public Memento {
+public:
+   NodeLimitMemento( const Limit& e) : limit_( e ) {}
+   NodeLimitMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Limit limit_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & limit_;
+   }
+};
+
+class NodeInLimitMemento : public Memento {
+public:
+   NodeInLimitMemento( const InLimit& e) : inlimit_( e ) {}
+   NodeInLimitMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   InLimit inlimit_;
+   friend class Node;
+   friend class InLimitMgr;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & inlimit_;
+   }
+};
+
+class NodeVariableMemento : public Memento {
+public:
+   NodeVariableMemento( const Variable& e) : var_(e) {}
+   NodeVariableMemento(){}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   Variable var_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & var_;
+   }
+};
+
+class NodeLateMemento : public Memento {
+public:
+   NodeLateMemento( const ecf::LateAttr& e) : late_(e) {}
+   NodeLateMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   ecf::LateAttr late_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & late_;
+   }
+};
+
+class FlagMemento : public Memento {
+public:
+   FlagMemento( const ecf::Flag& e) : flag_(e) {}
+   FlagMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+   virtual void do_incremental_defs_sync(Defs* defs) const { defs->set_memento(this);}
+
+   ecf::Flag flag_;
+   friend class Node;
+   friend class Defs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & flag_;
+   }
+};
+
+class NodeTodayMemento : public Memento {
+public:
+   NodeTodayMemento( const ecf::TodayAttr& attr) : attr_(attr) {}
+   NodeTodayMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   ecf::TodayAttr attr_;
+   friend class Node;
+   friend class TimeDepAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & attr_;
+   }
+};
+
+class NodeTimeMemento : public Memento {
+public:
+   NodeTimeMemento( const ecf::TimeAttr& attr) : attr_(attr) {}
+   NodeTimeMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   ecf::TimeAttr attr_;
+   friend class Node;
+   friend class TimeDepAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & attr_;
+   }
+};
+
+class NodeDayMemento : public Memento {
+public:
+   NodeDayMemento( const DayAttr& attr) : attr_(attr) {}
+   NodeDayMemento(){}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   DayAttr attr_;
+   friend class Node;
+   friend class TimeDepAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & attr_;
+   }
+};
+
+class NodeCronMemento : public Memento {
+public:
+   NodeCronMemento( const ecf::CronAttr& attr) : attr_(attr) {}
+   NodeCronMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   ecf::CronAttr attr_;
+   friend class Node;
+   friend class TimeDepAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & attr_;
+   }
+};
+
+class NodeDateMemento : public Memento {
+public:
+   NodeDateMemento( const DateAttr& attr) : attr_(attr) {}
+   NodeDateMemento()  {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   DateAttr attr_;
+   friend class Node;
+   friend class TimeDepAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & attr_;
+   }
+};
+
+class NodeZombieMemento : public Memento {
+public:
+   NodeZombieMemento(const ZombieAttr& attr) : attr_(attr) {}
+   NodeZombieMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   ZombieAttr attr_;
+   friend class Node;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & attr_;
+   }
+};
+
+
+class NodeVerifyMemento : public Memento {
+public:
+   NodeVerifyMemento(const std::vector<VerifyAttr>& attr) : verifys_(attr) {}
+   NodeVerifyMemento() {}
+private:
+   virtual void do_incremental_node_sync(Node* n) const { n->set_memento(this);}
+
+   std::vector<VerifyAttr> verifys_;
+   friend class Node;
+   friend class MiscAttrs;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & verifys_;
+   }
+};
+
+class SubmittableMemento : public Memento {
+public:
+   SubmittableMemento(	const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            const std::string& abortedReason,
+            int tryNo
+   ) :
+      jobsPassword_( jobsPassword ),
+      process_or_remote_id_( process_or_remote_id ),
+      abortedReason_( abortedReason ),
+      tryNo_( tryNo ) {}
+   SubmittableMemento() : tryNo_(0) {}
+private:
+   virtual void do_incremental_task_sync(Task* n)   const { n->set_memento(this);}
+   virtual void do_incremental_alias_sync(Alias* n) const { n->set_memento(this);}
+
+   std::string  jobsPassword_;
+   std::string  process_or_remote_id_;
+   std::string  abortedReason_;
+   int          tryNo_;
+   friend class Submittable;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & jobsPassword_;
+      ar & process_or_remote_id_;
+      ar & abortedReason_;
+      ar & tryNo_;
+   }
+};
+
+class SuiteClockMemento : public Memento {
+public:
+   SuiteClockMemento( const ClockAttr& c ) :   clockAttr_(c) {}
+   SuiteClockMemento() {}
+private:
+   virtual void do_incremental_suite_sync(Suite* n) const { n->set_memento(this);}
+
+   ClockAttr  clockAttr_;
+   friend class Suite;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & clockAttr_;
+   }
+};
+
+class SuiteBeginDeltaMemento : public Memento {
+public:
+   SuiteBeginDeltaMemento(bool begun) : begun_(begun) {}
+   SuiteBeginDeltaMemento() : begun_(false) {}
+private:
+   virtual void do_incremental_suite_sync(Suite* n) const { n->set_memento(this);}
+
+   bool begun_;
+   friend class Suite;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & begun_;
+   }
+};
+
+class SuiteCalendarMemento : public Memento {
+public:
+   SuiteCalendarMemento(const ecf::Calendar& cal) : calendar_(cal) {}
+   SuiteCalendarMemento() {}
+private:
+   virtual void do_incremental_suite_sync(Suite* n) const { n->set_memento(this);}
+
+   ecf::Calendar  calendar_;          // *Only* persisted since used by the why() on client side
+   friend class Suite;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object<Memento>(*this);
+      ar & calendar_;
+   }
+};
+
+
+BOOST_CLASS_EXPORT_KEY(StateMemento);
+BOOST_CLASS_EXPORT_KEY(NodeDefStatusDeltaMemento);
+BOOST_CLASS_EXPORT_KEY(SuspendedMemento);
+BOOST_CLASS_EXPORT_KEY(ServerStateMemento);
+BOOST_CLASS_EXPORT_KEY(ServerVariableMemento);
+BOOST_CLASS_EXPORT_KEY(NodeEventMemento);
+BOOST_CLASS_EXPORT_KEY(NodeMeterMemento);
+BOOST_CLASS_EXPORT_KEY(NodeLabelMemento);
+BOOST_CLASS_EXPORT_KEY(NodeTriggerMemento);
+BOOST_CLASS_EXPORT_KEY(NodeCompleteMemento);
+BOOST_CLASS_EXPORT_KEY(NodeRepeatMemento);
+BOOST_CLASS_EXPORT_KEY(NodeLimitMemento);
+BOOST_CLASS_EXPORT_KEY(NodeInLimitMemento);
+BOOST_CLASS_EXPORT_KEY(NodeVariableMemento);
+BOOST_CLASS_EXPORT_KEY(NodeLateMemento);
+BOOST_CLASS_EXPORT_KEY(NodeTodayMemento);
+BOOST_CLASS_EXPORT_KEY(NodeTimeMemento);
+BOOST_CLASS_EXPORT_KEY(NodeDayMemento);
+BOOST_CLASS_EXPORT_KEY(NodeCronMemento);
+BOOST_CLASS_EXPORT_KEY(NodeDateMemento);
+BOOST_CLASS_EXPORT_KEY(NodeZombieMemento);
+BOOST_CLASS_EXPORT_KEY(FlagMemento);
+BOOST_CLASS_EXPORT_KEY(NodeVerifyMemento);
+BOOST_CLASS_EXPORT_KEY(SubmittableMemento);
+BOOST_CLASS_EXPORT_KEY(SuiteClockMemento);
+BOOST_CLASS_EXPORT_KEY(SuiteBeginDeltaMemento);
+BOOST_CLASS_EXPORT_KEY(SuiteCalendarMemento);
+BOOST_CLASS_EXPORT_KEY(OrderMemento);
+BOOST_CLASS_EXPORT_KEY(ChildrenMemento);
+BOOST_CLASS_EXPORT_KEY(AliasChildrenMemento);
+BOOST_CLASS_EXPORT_KEY(AliasNumberMemento);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/MiscAttrs.cpp b/ecflow_4_0_7/ANode/src/MiscAttrs.cpp
new file mode 100644
index 0000000..d86b586
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/MiscAttrs.cpp
@@ -0,0 +1,178 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #286 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <assert.h>
+#include "Defs.hpp"
+#include "Suite.hpp"
+
+#include "MiscAttrs.hpp"
+#include "Str.hpp"
+#include "Log.hpp"
+#include "Ecf.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+
+void MiscAttrs::begin()
+{
+   // reset verification
+   for(size_t i = 0; i < verifys_.size(); i++)   { verifys_[i].reset(); }
+}
+
+std::ostream& MiscAttrs::print(std::ostream& os) const
+{
+   BOOST_FOREACH(const ZombieAttr& z, zombies_)     { z.print(os); }
+   BOOST_FOREACH(const VerifyAttr& v, verifys_ )    { v.print(os);  }
+   return os;
+}
+
+bool MiscAttrs::operator==(const MiscAttrs& rhs) const
+{
+   if (zombies_.size() != rhs.zombies_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "MiscAttrs::operator==   (zombies_.size() != rhs.zombies_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < zombies_.size(); ++i) {
+      if (!(zombies_[i] == rhs.zombies_[i]) ) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "MiscAttrs::operator==   (!(zombies_[i] == rhs.zombies_[i]) " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   if (verifys_.size() != rhs.verifys_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "MiscAttrs::operator==  (verifys_.size() != rhs.verifys_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < verifys_.size(); ++i) {
+      if (!(verifys_[i] == rhs.verifys_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "MiscAttrs::operator==  (!(verifys_[i] == rhs.verifys_[i] ))  " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+   return true;
+}
+
+
+void MiscAttrs::verification(std::string& errorMsg) const
+{
+   BOOST_FOREACH(const VerifyAttr& v, verifys_) {
+      if (v.expected() != v.actual()) {
+         std::stringstream ss;
+         ss << node_->debugNodePath() << " expected " << v.expected() << " " << NState::toString(v.state()) << " but found " << v.actual() << "\n";
+         errorMsg += ss.str();
+      }
+   }
+}
+
+void MiscAttrs::addZombie( const ZombieAttr& z)
+{
+   const ZombieAttr& theFndOne = findZombie( z.zombie_type() );
+   if (!theFndOne.empty()) {
+      std::stringstream ss;
+      ss << "MiscAttrs::addZombie: Node " << node_->absNodePath() << " already has a zombie attribute of type " << Child::to_string(theFndOne.zombie_type()) << "\n";
+      throw std::runtime_error(ss.str());
+   }
+   zombies_.push_back( z );
+   node_->state_change_no_ = Ecf::incr_state_change_no(); // Only add where used in AlterCmd
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "MiscAttrs::addZombie()\n";
+#endif
+}
+
+
+void MiscAttrs::deleteZombie(const std::string& zombie_type)
+{
+   if (zombie_type.empty()) {
+      zombies_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+      return;
+   }
+
+   if (!Child::valid_zombie_type(zombie_type)) {
+      throw std::runtime_error("MiscAttrs::deleteZombie failed: Expected one of [ ecf | path | user ] or empty string but found " + zombie_type);
+   }
+   delete_zombie( Child::zombie_type(zombie_type) );
+}
+
+void MiscAttrs::delete_zombie(Child::ZombieType zt)
+{
+   for(size_t i = 0; i < zombies_.size(); ++i) {
+      if (zombies_[i].zombie_type() == zt) {
+         zombies_.erase( zombies_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+         return;
+      }
+   }
+}
+
+
+const ZombieAttr& MiscAttrs::findZombie( ecf::Child::ZombieType zombie_type) const
+{
+   /// There should only be one of each type
+   for(size_t i = 0; i < zombies_.size(); i++) {
+      if ( zombies_[i].zombie_type() == zombie_type ) {
+         return zombies_[i];
+      }
+   }
+   return ZombieAttr::EMPTY();
+}
+
+void MiscAttrs::addVerify( const VerifyAttr& v )
+{
+   if (findVerify(v)) {
+      std::stringstream ss;
+      ss << "Add Verify failed: Duplicate '" << v.toString() << "' already exist for node " << node_->debugNodePath();
+      throw std::runtime_error( ss.str() );
+   }
+   verifys_.push_back(v);
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+bool MiscAttrs::findVerify(const VerifyAttr& v) const
+{
+   size_t theSize = verifys_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (verifys_[i].state() == v.state() ) {
+         return true;
+      }
+   }
+   return false;
+}
+
+void MiscAttrs::clear()
+{
+   zombies_.clear();   // can be added/removed via AlterCmd
+   verifys_.clear();
+}
diff --git a/ecflow_4_0_7/ANode/src/MiscAttrs.hpp b/ecflow_4_0_7/ANode/src/MiscAttrs.hpp
new file mode 100644
index 0000000..ac27d2d
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/MiscAttrs.hpp
@@ -0,0 +1,89 @@
+#ifndef MISC_ATTRS_HPP_
+#define MISC_ATTRS_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #235 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <ostream>
+
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+
+#include "ZombieAttr.hpp"
+#include "VerifyAttr.hpp"
+#include "NodeFwd.hpp"
+
+class MiscAttrs : private boost::noncopyable {
+public:
+   MiscAttrs(Node* node) : node_(node) {}
+   MiscAttrs() : node_(NULL) {}
+
+   // needed by node serialisation
+   void set_node(Node* n) { node_ = n; }
+
+   void begin();
+
+   // standard functions: ==============================================
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const MiscAttrs& ) const;
+
+   // Access functions: ======================================================
+   const std::vector<VerifyAttr>&      verifys()  const { return verifys_;}
+   const std::vector<ZombieAttr>&      zombies()  const { return zombies_; }
+
+   // Add functions: ===============================================================
+   void addVerify( const VerifyAttr& );  // for testing and verification Can throw std::runtime_error
+   void addZombie( const ZombieAttr& );  // will throw std::runtime_error if duplicate
+
+   // Delete functions: can throw std::runtime_error ===================================
+   // if name argument is empty, delete all attributes of that type
+   // Can throw std::runtime_error of the attribute can not be found
+   void delete_zombie(const ecf::Child::ZombieType);
+   void deleteZombie(const std::string& type); // string must be one of [ user | ecf | path ]
+
+   // Change functions: ================================================================
+   /// returns true the change was made else false, Can throw std::runtime_error for parse errors
+
+   // Find functions: ============================================================
+   bool findVerify(const VerifyAttr& ) const;
+   const ZombieAttr& findZombie( ecf::Child::ZombieType ) const;
+
+   void verification(std::string& errorMsg) const;
+
+private:
+   void clear(); /// Clear *ALL* internal attributes
+
+   std::vector<ZombieAttr>::const_iterator zombie_begin() const { return zombies_.begin();}
+   std::vector<ZombieAttr>::const_iterator zombie_end() const { return zombies_.end();}
+   std::vector<VerifyAttr>::const_iterator verify_begin() const { return verifys_.begin();}
+   std::vector<VerifyAttr>::const_iterator verify_end() const { return verifys_.end();}
+
+private:
+   Node*        node_; // *NOT* persisted must be set by the parent class
+   friend class Node;
+
+private:
+   std::vector<ZombieAttr> zombies_;
+   std::vector<VerifyAttr> verifys_;     // used for statistics and test verification
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & zombies_;
+      ar & verifys_;
+   }
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Node.cpp b/ecflow_4_0_7/ANode/src/Node.cpp
new file mode 100644
index 0000000..60c32c1
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Node.cpp
@@ -0,0 +1,1870 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #305 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <assert.h>
+#include <deque>
+
+#include <boost/bind.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Extract.hpp"
+
+#include "NodeState.hpp"
+#include "NodePath.hpp"
+#include "Stl.hpp"
+#include "Str.hpp"
+#include "Indentor.hpp"
+#include "ExprAst.hpp"
+#include "Log.hpp"
+#include "PrintStyle.hpp"
+#include "JobsParam.hpp"
+#include "ExprAstVisitor.hpp"
+#include "Ecf.hpp"
+#include "SuiteChanged.hpp"
+#include "CmdContext.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+//#define DEBUG_DEPENDENCIES 1
+//#define DEBUG_REQUEUE 1
+//#define DEBUG_FIND_REFERENCED_NODE 1
+
+Node::Node(const std::string& n)
+: parent_(NULL),name_(n),
+  suspended_(false),
+  state_( std::make_pair(NState(),time_duration(0,0,0,0)) ),
+  completeExpr_(NULL),
+  triggerExpr_(NULL),
+  lateAttr_(NULL),
+  autoCancel_(NULL),
+  time_dep_attrs_(NULL),
+  child_attrs_(NULL),
+  misc_attrs_(NULL),
+  inLimitMgr_(this),
+  state_change_no_(0),variable_change_no_(0),suspended_change_no_(0),
+  graphic_ptr_(0)
+{
+   string msg;
+   if (!Str::valid_name(n, msg)) {
+      throw std::runtime_error("Invalid node name : " + msg);
+   }
+}
+
+Node::Node()
+: parent_(NULL),
+  suspended_(false),
+  state_( std::make_pair(NState(),time_duration(0,0,0,0)) ),
+  completeExpr_(NULL),
+  triggerExpr_(NULL),
+  lateAttr_(NULL),
+  autoCancel_(NULL),
+  time_dep_attrs_(NULL),
+  child_attrs_(NULL),
+  misc_attrs_(NULL),
+  inLimitMgr_(this),
+  state_change_no_(0),variable_change_no_(0),suspended_change_no_(0),
+  graphic_ptr_(0)
+{}
+
+Node::~Node() {
+   delete completeExpr_;
+   delete triggerExpr_;
+   delete lateAttr_;
+   delete autoCancel_;
+   delete time_dep_attrs_;
+   delete child_attrs_;
+   delete misc_attrs_;
+}
+
+bool Node::isParentSuspended() const
+{
+   Node* theParent = parent();
+   if (theParent) {
+      if (theParent->isSuspended()) return true;
+      return theParent->isParentSuspended();
+   }
+   return defs()->isSuspended(); // obtained from the server states
+}
+
+void Node::resume()
+{
+   if ( suspended_) {
+      clearSuspended();
+   }
+}
+
+void Node::clearSuspended()
+{
+   /// Guard against unnecessary creation of memento's
+   if (suspended_) {
+      suspended_ = false;
+      suspended_change_no_ = Ecf::incr_state_change_no();
+   }
+}
+
+void Node::suspend()
+{
+   // Typically called via user action or via defstatus
+   suspended_ = true;
+   suspended_change_no_ = Ecf::incr_state_change_no();
+}
+
+void Node::begin()
+{
+   // Set the state without causing any side effects
+   initState(0);
+
+   clearTrigger();
+   clearComplete();
+
+   flag_.reset();
+   repeat_.reset();         // if repeat is empty reset() does nothing
+
+   if (lateAttr_) lateAttr_->reset();
+   if (child_attrs_) child_attrs_->begin();
+   if (misc_attrs_) misc_attrs_->begin();
+   for(size_t i = 0; i < limitVec_.size(); i++)   { limitVec_[i]->reset(); }
+
+   // Let time base attributes use, relative duration if applicable
+   if (time_dep_attrs_) {
+      time_dep_attrs_->begin();
+      time_dep_attrs_->markHybridTimeDependentsAsComplete();
+   }
+
+   // DO *NOT* call update_generated_variables(). Called on a type specific bases, for begin
+   // Typically we need only call update_generated_variables() for a task, at job creation time.
+   // so that ECF_OUT, ECF_TRYNO, ECF_JOBOUT, ECF_PASS(jobsPassword_) can be updated.
+   // However the generated variables are used when within job generation and can be referenced by AST
+   // Hence to avoid excessive memory consumption, they are created on demand
+}
+
+void Node::requeue(
+         bool resetRepeats,
+         int clear_suspended_in_child_nodes,
+         bool do_reset_next_time_slot)
+{
+#ifdef DEBUG_REQUEUE
+   LOG(Log::DBG,"      Node::requeue() " << absNodePath() << " resetRepeats = " << resetRepeats);
+#endif
+   /// Note: we don't reset verify attributes as they record state stat's
+
+   // Set the state without causing any side effects
+   initState(clear_suspended_in_child_nodes);
+
+   clearTrigger();
+   clearComplete();
+
+   if (resetRepeats) repeat_.reset(); // if repeat is empty reset() does nothing
+
+
+   /// If a job takes longer than it slots, then that slot is missed, and next slot is used
+   /// Note we do *NOT* reset for requeue as we want to advance the valid time slots.
+   /// *NOTE* Update calendar will *free* time dependencies *even* time series. They rely
+   /// on this function to clear the time dependencies so they *HOLD* the task.
+   if ( time_dep_attrs_ ) {
+
+      /// Requeue has several contexts:
+      ///   1/ manual requeue
+      ///   2/ automated requeue due to repeats
+      ///   3/ automated requeue due to time dependencies
+      /// For manual and automated reueue due to repeat's we always clear Flag::NO_REQUE_IF_SINGLE_TIME_DEP
+      /// since in those context we do NOT want miss any time slots
+      bool reset_next_time_slot = true;
+      if (do_reset_next_time_slot) {
+         reset_next_time_slot = true;
+      }
+      else {
+         if (flag().is_set(Flag::NO_REQUE_IF_SINGLE_TIME_DEP)) {
+            /// If we have done an interactive run or complete, *dont* increment next_time_slot_
+            /// allow next time on time based attributes to be incremented and *not* reset,
+            /// when force and run commands used
+            reset_next_time_slot = false;
+         }
+      }
+
+      time_dep_attrs_->requeue(reset_next_time_slot);
+      time_dep_attrs_->markHybridTimeDependentsAsComplete();
+   }
+
+
+   // reset the flags, however remember if edit were made
+   bool edit_history_set = flag().is_set(ecf::Flag::MESSAGE);
+   flag_.reset();   // will CLEAR NO_REQUE_IF_SINGLE_TIME_DEP
+   if (edit_history_set) flag().set(ecf::Flag::MESSAGE);
+
+
+   if (lateAttr_) lateAttr_->reset();
+   if (child_attrs_) child_attrs_->requeue();
+
+   for(size_t i = 0; i < limitVec_.size(); i++) { limitVec_[i]->reset(); }
+
+   // ECFLOW-196, ensure the re-queue release tokens held by Limits higher up the tree.
+   // Note: Its safe to call decrementInLimit, even when no limit consumed
+   std::set<Limit*> limitSet;     // ensure local limit have preference over parent
+   decrementInLimit(limitSet);    // will recurse up, expensive but needed
+}
+
+
+void Node::requeue_time_attrs()
+{
+   // Note: we *dont* mark hybrid time dependencies as complete.
+   //       i.e. since this is called during alter command, it could be that
+   //        the task is in a submitted or active state.
+   if (time_dep_attrs_) time_dep_attrs_->requeue(true);
+}
+
+void Node::requeue_labels()
+{
+   if (child_attrs_) child_attrs_->requeue_labels();
+}
+
+void Node::miss_next_time_slot()
+{
+   // Why do we need to set NO_REQUE_IF_SINGLE_TIME_DEP flag ?
+   // This is required when we have time based attributes, which we want to miss.
+   //    time 10:00
+   //    time 12:00
+   // Essentially this avoids an automated job run, *IF* the job was run manually for a given time slot.
+   // If we call this function before 10:00, we want to miss the next time slot (i.e. 10:00)
+   // and want to *requeue*, for 12:00 time slot. However at re-queue, we need to ensure
+   // we do *not* reset the 10:00 time slot. hence by setting NO_REQUE_IF_SINGLE_TIME_DEP
+   // we allow requeue to query this flag, and hence avoid resetting the time based attribute
+   // Note: requeue will *always* clear NO_REQUE_IF_SINGLE_TIME_DEP afterwards.
+   //
+   // In the case above when we reach the last time slot, there is *NO* automatic requeue, and
+   // hence, *no* clearing of NO_REQUE_IF_SINGLE_TIME_DEP flag.
+   // This will then be up to any top level parent that has a Repeat/cron to force a requeue
+   // when all the children are complete. *or* user does a manual re-queue
+   //
+   // Additionally if the job *aborts*, we clear NO_REQUE_IF_SINGLE_TIME_DEP if it was set.
+   // Otherwise if manually run again, we will miss further time slots.
+   if ( time_dep_attrs_) {
+
+      /// Handle abort
+      /// The flag: NO_REQUE_IF_SINGLE_TIME_DEP is *only* set when doing an interactive force complete or run command.
+      /// What happens if the job aborts during the run command ?
+      ///     time 10:00
+      ///     time 11:00
+      /// If at 9.00am we used the run command, we want to miss the 10:00 time slot.
+      /// However if the run at 9.00 fails, and we run again, we also miss 11:00 time slot.
+      /// During the run the flag is still set.
+      /// Hence *ONLY* miss the next time slot *IF* Flag::NO_REQUE_IF_SINGLE_TIME_DEP is NOT set
+      if (!flag().is_set(Flag::NO_REQUE_IF_SINGLE_TIME_DEP)) {
+
+         SuiteChanged0 changed(shared_from_this());
+         flag().set(Flag::NO_REQUE_IF_SINGLE_TIME_DEP);
+
+         time_dep_attrs_->miss_next_time_slot();
+      }
+   }
+}
+
+void Node::calendarChanged(
+         const ecf::Calendar& c,
+         std::vector<node_ptr>& auto_cancelled_nodes)
+{
+   if (time_dep_attrs_) {
+      time_dep_attrs_->calendarChanged(c);
+   }
+
+   checkForLateness(c);
+
+   if (checkForAutoCancel(c)) {
+      auto_cancelled_nodes.push_back(shared_from_this());
+   }
+}
+
+void Node::checkForLateness(const ecf::Calendar& c)
+{
+   if (lateAttr_) {
+      lateAttr_->checkForLateness(state_, c);
+      if (lateAttr_->isLate()) {
+         flag().set(ecf::Flag::LATE);
+      }
+   }
+}
+
+void Node::initState(int clear_suspended_in_child_nodes)
+{
+   if (defStatus_ == DState::SUSPENDED) {
+      /// Note: DState::SUSPENDED is not a real state, its really a user interaction
+      /// Replace with suspend, and set underlying state as queued
+      suspend();
+      setStateOnly( NState::QUEUED );
+   }
+   else {
+
+      if (clear_suspended_in_child_nodes > 0) {
+         clearSuspended();
+      }
+
+      // convert DState --> NState.
+      // NOTE::  NState does *NOT* have SUSPENDED
+      setStateOnly( DState::convert( defStatus_.state())  );
+   }
+}
+
+void Node::requeueOrSetMostSignificantStateUpNodeTree()
+{
+   // Get the computed state of my immediate children
+   // *** A family can be marked as complete, via complete trigger when not all its children
+   // *** are complete, hence computedState() *MUST* first check the immediate state  ,
+   // *** before considering its immediate children
+   NState::State computedStateOfImmediateChildren = computedState(Node::IMMEDIATE_CHILDREN);
+
+#ifdef DEBUG_REQUEUE
+   LogToCout toCoutAsWell; cout << "\n";
+   Indentor indent;
+   LOG(Log::DBG,"requeueOrSetMostSignificantStateUpNodeTree() " << debugNodePath() << "(" << NState::toString(state()) << ") computed(" << NState::toString(computedStateOfImmediateChildren) << ")");
+#endif
+
+   if (computedStateOfImmediateChildren == NState::COMPLETE ) {
+
+       // set most significant state of my immediate children
+       // Record: That Suite/Family completed.
+       if ( computedStateOfImmediateChildren !=  state() )  {
+          setStateOnly( computedStateOfImmediateChildren );
+       }
+
+      // For automated re-queue do *not* clear suspended state in *child* nodes
+      int clear_suspended_in_child_nodes = -1;
+
+      if (!repeat_.empty()) {
+
+         repeat_.increment();
+
+         // If the repeat is still valid, re-queue the node
+#ifdef DEBUG_REQUEUE
+         LOG(Log::DBG,"requeueOrSetMostSignificantStateUpNodeTree " << debugNodePath() << " for repeat " << repeat_.toString());
+#endif
+         if ( repeat_.valid() ) {
+#ifdef DEBUG_REQUEUE
+            LOG(Log::DBG,"requeueOrSetMostSignificantStateUpNodeTree() VALID for requeue " << debugNodePath() << " for repeat at " << repeat_.toString());
+#endif
+
+            /// reset relative duration down the hierarchy from this point. Only valid when we have repeats
+            /// Note: Going down hierarchy is wasted if there are no relative time attributes
+            resetRelativeDuration();
+
+            // Remove effects of RUN and Force complete interactive commands
+            // For automated re-queue *DUE* to Repeats, *CLEAR* any user interaction that would miss the next time slots. *Down* the hierarchy
+            // This handles the case where a user, has manually intervened (i.e via run or complete) and we had a time attribute
+            // That time attribute will have expired, typically we show next day. In the case where we have a parent repeat
+            // we need to clear the flag, otherwise the task/family with time based attribute would wait for next day.
+            requeue( false /* don't reset repeats */,
+                     clear_suspended_in_child_nodes,
+                     true /* reset_next_time_slot */ );
+            set_most_significant_state_up_node_tree();
+            return;
+         }
+      }
+
+      /// If user has *INTERACTIVLY* forced changed in state to complete *OR* run the job.
+      /// This would cause Node to miss the next time slot. i.e expire the time slot
+      /// In which case testTimeDependenciesForRequeue should return false for a single time/today dependency
+      /// and not requeue the node.
+      if (time_dep_attrs_ && time_dep_attrs_->testTimeDependenciesForRequeue()) {
+
+         // This is the only place we do not explicitly reset_next_time_slot
+         bool reset_next_time_slot = false;
+
+         // Remove effects of RUN and Force complete interactive commands, *BUT* only if *not* applied to this cron
+         if (!time_dep_attrs_->crons().empty()) {
+            if (!flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP)) {
+                reset_next_time_slot = true ;
+            }
+         }
+
+         requeue( false /* don't reset repeats */,
+                  clear_suspended_in_child_nodes,
+                  reset_next_time_slot  );
+         set_most_significant_state_up_node_tree();
+         return;
+      }
+   }
+
+   // In case compute state is other that COMPLETE, update. i,e for Family/Suite
+   if ( computedStateOfImmediateChildren !=  state() )  {
+      setStateOnly( computedStateOfImmediateChildren );
+   }
+
+
+   // recurse up the node tree
+   Node* theParentNode = parent();
+   if (theParentNode) {
+      theParentNode->requeueOrSetMostSignificantStateUpNodeTree();
+   }
+   else {
+      // No parent, hence next level is the root, ie the Defs
+      // Reflect the status of all the suite's
+      // **** This should not recurse down, just reflect status of suites
+      defs()->set_most_significant_state();
+   }
+}
+
+void Node::set_most_significant_state_up_node_tree()
+{
+   if (isTask()) {
+      parent()->set_most_significant_state_up_node_tree();
+      return;
+   }
+
+   // set most significant state  of my immediate children
+   NState::State computedStateOfImmediateChildren = computedState(Node::IMMEDIATE_CHILDREN);
+   if ( computedStateOfImmediateChildren !=  state() )  {
+      setStateOnly( computedStateOfImmediateChildren );
+   }
+
+   // recurse up the node tree
+   Node* theParentNode = parent();
+   if (theParentNode) {
+      theParentNode->set_most_significant_state_up_node_tree();
+   }
+   else {
+      // No parent, hence next level is the root, ie the Defs
+      // Reflect the status of all the suite's
+      // **** This should not recurse down, just reflect status of suites
+      defs()->set_most_significant_state();
+   }
+}
+void Node::resetRelativeDuration()
+{
+   if (time_dep_attrs_) time_dep_attrs_->resetRelativeDuration();
+}
+
+
+// Returning false, *STOPS* further traversal *DOWN* the node tree
+bool Node::resolveDependencies(JobsParam& jobsParam)
+{
+   // This function is called:
+   //    a/ Periodically by the server, i.e every minute
+   //    b/ Asyncrousnly, after child command, via job submission
+#ifdef DEBUG_DEPENDENCIES
+   LogToCout toCoutAsWell; cout << "\n";
+   LOG(Log::DBG,"   " << debugNodePath() << "::resolveDependencies " << NState::toString(state()) << " AT " << suite()->calendar().toString());
+#endif
+
+   // Improve the granularity for the check for lateness (during job submission). See SUP-873 "late" functionality
+   if (lateAttr_) {
+      // since the suite() traverse up the tree, only call when have a late attribute
+      checkForLateness(suite()->calendar());
+   }
+
+   if (isSuspended()) {
+#ifdef DEBUG_DEPENDENCIES
+      LOG(Log::DBG,"   Node::resolveDependencies() " << absNodePath() << " HOLDING as node state " << NState::toString(state()) << " is SUSPENDED " );
+#endif
+      return false;
+   }
+
+   if (state() == NState::COMPLETE) {
+#ifdef DEBUG_DEPENDENCIES
+      LOG(Log::DBG,"   Node::resolveDependencies() " << absNodePath() << " HOLDING as node state " << NState::toString(state()) << " is not valid for job submission" );
+#endif
+      return false;
+   }
+
+   if (time_dep_attrs_ && !time_dep_attrs_->timeDependenciesFree()) {
+#ifdef DEBUG_DEPENDENCIES
+      const Calendar& calendar = suite()->calendar();
+      LOG(Log::DBG,"   Node::resolveDependencies() " << absNodePath() << " HOLDING due to time dependencies at " << calendar.toString());
+#endif
+      return false;
+   }
+
+   // Complete *MUST* be evaluated before trigger. As it can affect the other
+   // i.e A state change to COMPLETE, in which case no need to submit tasks
+   // However if the complete does *not* evaluate it should *NOT* hold the node.
+   if ( evaluateComplete() ) {
+      if (completeAst()) {
+
+         flag().set(ecf::Flag::BYRULE);
+
+         // If we are a parent sets the state first. then set state on all the children
+         set_state_hierarchically( NState::COMPLETE,false); // reset try no and decrement inlimit resources & update repeats
+
+#ifdef DEBUG_DEPENDENCIES
+         LOG(Log::DBG,"   Node::resolveDependencies() " << absNodePath() << " HOLDING since evaluation of COMPLETE");
+#endif
+         // We have a complete By returning false here, we stop dependency evaluation for any children
+         return false;
+      }
+   }
+   // No complete, or we have a complete  that does not evaluate.(this should not hold the node)
+
+
+   if ( evaluateTrigger() ) {
+      // WE only get here **IF** :
+      // 1/ There is no trigger
+      // 2/ WE have a trigger and it evaluates to true
+#ifdef DEBUG_DEPENDENCIES
+      LOG(Log::DBG,"   Node::resolveDependencies() " << absNodePath() << " FREE of TRIGGER");
+#endif
+      return true;
+   }
+
+   // We *have* a trigger and it does not evaluate, hold the node
+#ifdef DEBUG_DEPENDENCIES
+   LOG(Log::DBG,"   Node::resolveDependencies() " << absNodePath() << " HOLDING due to TRIGGER");
+#endif
+   return false;
+}
+
+void Node::freeTrigger() const
+{
+   if (triggerExpr_) triggerExpr_->setFree();
+}
+
+void Node::clearTrigger() const
+{
+   if (triggerExpr_) triggerExpr_->clearFree();
+}
+
+void Node::freeComplete() const
+{
+   if (completeExpr_) completeExpr_->setFree();
+}
+
+void Node::clearComplete() const
+{
+   if (completeExpr_) completeExpr_->clearFree();
+}
+
+void Node::freeHoldingDateDependencies()
+{
+   if (time_dep_attrs_) time_dep_attrs_->freeHoldingDateDependencies();
+}
+
+void Node::freeHoldingTimeDependencies()
+{
+   if (time_dep_attrs_) time_dep_attrs_->freeHoldingTimeDependencies();
+}
+
+bool Node::checkForAutoCancel(const ecf::Calendar& calendar) const
+{
+   if ( autoCancel_ && state() == NState::COMPLETE) {
+      if (autoCancel_->isFree(calendar,state_.second)) {
+
+         /// *Only* delete this node if we don't create zombies
+         /// anywhere for our children
+         vector<Task*> taskVec;
+         getAllTasks(taskVec);
+         BOOST_FOREACH(Task* t, taskVec) {
+            if (t->state() == NState::ACTIVE || t->state() == NState::SUBMITTED) {
+               return false;
+            }
+         }
+         return true;
+      }
+   }
+   return false;
+}
+
+bool Node::evaluateComplete() const
+{
+   // Complete *MUST* be evaluate before trigger. As it can affect the other
+   AstTop* theCompeteAst = completeAst();
+   if (theCompeteAst) {
+      // *NOTE* if we have a non NULL complete ast, we must have complete expression
+      // The freed state is stored on the expression ( i.e not on the ast)
+      // ISSUE: Complete expression can not be by-passed in the GUI
+      if (completeExpr_->isFree() || theCompeteAst->evaluate()) {
+
+         // Note: if a task has been set complete, the use may decide to place into queued state( via GUI)
+         //       In which case, we *want* this complete expression to be re-evaluated.
+         //       Hence the old code below has been commented out.
+         // >>old: Set the complete as free, until begin()/requeue, // Only update state change no, if state has changed.
+         // >>old:if (!completeExpr_->isFree()) freeComplete();
+
+         // If we have **any** children that are in STATE ACTIVE or SUMBMITTED the don't bother
+         // changing state to complete. Otherwise zombies will be created.
+         NState::State theComputedState = computedState(Node::HIERARCHICAL);
+         if ( theComputedState == NState::ACTIVE ||  theComputedState ==  NState::SUBMITTED) {
+#ifdef DEBUG_DEPENDENCIES
+            LOG(Log::DBG,"   Node::evaluateComplete() " << absNodePath() << " AST evaluation succeeded *BUT* " << debugType() << " has children in ACTIVE or SUBMITTED States" );
+#endif
+            return false;
+         }
+
+#ifdef DEBUG_DEPENDENCIES
+         LOG(Log::DBG,"   Node::evaluateComplete() " << debugNodePath() << " FREE, COMPLETE AST evaluation succeeded " );
+#endif
+         return true;
+      }
+      else {
+         /// *IMPORTANT* When a complete does not evaluate, it should *NOT* stop further tree walking
+#ifdef DEBUG_DEPENDENCIES
+         LOG(Log::DBG,"   Node::evaluateComplete() " << debugNodePath() << " HOLDING, COMPLETE AST evaluation failed" );
+#endif
+         return false;
+      }
+   }
+   return true;
+}
+
+bool Node::evaluateTrigger() const
+{
+   AstTop* theTriggerAst = triggerAst();
+   if (theTriggerAst) {
+
+      // Note 1: A trigger can be freed by the ForceCmd
+      // Note 2: if we have a non NULL trigger ast, we must have trigger expression
+      // Note 3: The freed state is stored on the expression ( i.e *NOT* on the ast (abstract syntax tree) )
+      if (triggerExpr_->isFree() || theTriggerAst->evaluate()) {
+
+         // *ALWAYS* evaluate trigger expression unless user has forcibly removed trigger dependencies
+         // ******** This allows force queued functionality, to work as expected, since trigger's will be honoured
+         // The old code below has been commented out.
+         // >> old: Set the trigger as free, until begin()/requeue.  Only update state change no, when required
+         // >> old: if (!triggerExpr_->isFree()) freeTrigger();
+
+#ifdef DEBUG_DEPENDENCIES
+         LOG(Log::DBG,"   Node::evaluateTrigger() " << debugNodePath() << " FREE, TRIGGER AST evaluation succeeded" );
+#endif
+         return true;
+      }
+
+#ifdef DEBUG_DEPENDENCIES
+      LOG(Log::DBG,"   Node::evaluateTrigger() " << debugNodePath() << " HOLDING  TRIGGER AST evaluation failed" );
+#endif
+      return false; // evaluation failed. this Node holds
+   }
+
+#ifdef DEBUG_DEPENDENCIES
+   LOG(Log::DBG,"   Node::evaluateTrigger() " << debugNodePath() << " FREE NO TRIGGER defined" );
+#endif
+   return true;
+}
+
+const std::string& Node::abortedReason() const { return Str::EMPTY(); }
+
+void Node::set_state(NState::State s, bool force, const std::string& additional_info_to_log)
+{
+   setStateOnly(s,false,additional_info_to_log);
+
+   // Handle any state change specific functionality. This will update any repeats
+   // This is a virtual function, since we want different behaviour during state change
+   handleStateChange();
+}
+
+void Node::setStateOnly(NState::State newState, bool force, const std::string& additional_info_to_log)
+{
+   Suite* theSuite =  suite();
+   const Calendar& calendar = theSuite->calendar();
+
+#ifdef DEBUG_JOB_SUBMISSION_INTERVAL
+   // check sub submission interval/calendar increment for tasks only
+   // The job submission interval is set/obtained from the server environment and
+   // is configurable for testing.
+   // **** This is only used when jobSubmissionInterval is less than 60 ****
+   // We are attempting to refine job submission interval such that it is just
+   // greater than time taken for state change from submit->active->complete
+   // There by speeding up the test where we generate .ecf
+
+   // Ignore this during simulation, ie defs()->server().jobSubmissionInterval() = 0; for simulation
+   int jobSubmissionInterval = theSuite->defs()->server().jobSubmissionInterval();
+   if (isSubmittable() && jobSubmissionInterval != 0 && jobSubmissionInterval < 60) {
+
+      if (newState == NState::SUBMITTED)  submit_to_complete_duration_ = Calendar::second_clock_time();
+      else if (newState == NState::COMPLETE && !submit_to_complete_duration_.is_special())  {
+
+         // Under HYBRID we can go from UNKNOWN->COMPLETE, missing out SUBMITTED
+         // hence: submit_to_complete_duration_ is never initialised
+         // ie when we have a,date,cron dependency that relies on a day change
+
+         time_duration td = (Calendar::second_clock_time() - submit_to_complete_duration_);
+         // cout << debugNodePath() << " submit->active->complete time = " << td.total_seconds()  << " seconds.\n";
+
+         // Avoid this check if we have meters. as we wait a second between each meter update
+         if ( td.total_seconds() >= jobSubmissionInterval && ((!child_attrs_)  || child_attrs_->meters().empty())) {
+
+            const Variable& do_check = theSuite->findVariable("CHECK_TASK_DURATION_LESS_THAN_SERVER_POLL");
+            if (!do_check.empty()) {
+               // 				cout << "Calendar::second_clock_time() = " << to_simple_string(Calendar::second_clock_time()) << "\n";
+               // 				cout << "submit_to_complete_duration_ = " << to_simple_string(submit_to_complete_duration_) << "\n";
+               // 				cout << "(Calendar::second_clock_time() - submit_to_complete_duration_) = " << to_simple_string(td) << "\n";
+               cout << "Testing::" << debugNodePath() << " For each job submission interval of " << jobSubmissionInterval
+                        << " seconds, the calendar is increment by 60 seconds.\n"
+                        << " The job submission interval is too small as it takes " << td.total_seconds()
+                        << " seconds for state change of submit->active->complete, for an empty job.\n"
+                        << " Please increase the job submission interval to at least " << (td.total_seconds() + 1) << " seconds.\n";
+            }
+         }
+      }
+   }
+#endif
+
+   // Change format is significant it is used in verification of log files
+   // Please change/update LogVerification::extractNodePathAndState() all verification relies on this one function
+   //           " " +  submitted(max) + ": " + path(estimate)  + " try-no: " + try_no(estimate)  + " reason: " + reason(estimate)
+   // reserve : 1   +  9              + 2    + 100             + 9           + 3                 + 9           + 12   = 145
+   std::string log_state_change; log_state_change.reserve(145 + additional_info_to_log.size());
+   log_state_change += " ";
+   log_state_change += NState::toString(newState);
+   log_state_change += ": ";
+   log_state_change += absNodePath();
+   if (!additional_info_to_log.empty()) {
+      log_state_change += " ";
+      log_state_change += additional_info_to_log;
+   }
+
+   if ( newState == NState::ABORTED) {
+      if (force) flag().set(ecf::Flag::FORCE_ABORT);
+      Submittable* submittable = isSubmittable();
+      if ( submittable ) {
+         flag().set(ecf::Flag::TASK_ABORTED);
+         log_state_change += " try-no: ";
+         log_state_change += submittable->tryNo();
+         log_state_change += " reason: ";
+         log_state_change += abortedReason();
+      }
+   }
+   else {
+      flag().clear(ecf::Flag::TASK_ABORTED);
+      flag().clear(ecf::Flag::FORCE_ABORT);
+   }
+
+   // SUP-408 what does submitted mean in log?
+   // We want to mimimize calls to create a new time stamp in the log file.
+   // A time stamp is automatically created, whenever a *new* client request is received, & then cached
+   // However we can get a change in state, during tree traversal, when a node is free of its dependencies
+   // If we were to just log the message it would use the last cached time stamp. Giving misleading info:
+   // Since state changes are bubbled up, we need only update the time stamp for tasks, when not in a command
+   if (!CmdContext::in_command() && isTask() && Log::instance()) {
+       //std::cout << "!!!!! NOT in cmd context updating time stamp before logging\n";
+       Log::instance()->cache_time_stamp();
+   }
+
+   ecf::log(Log::LOG,log_state_change);  // Note: log type, must be same for debug & release for test, i.e for log file verification
+
+   state_.first.setState(newState);      // this will update state_change_no
+   state_.second = calendar.duration();  // record state change duration for late, autocancel,etc
+
+   // Record state changes for verification
+   if (misc_attrs_) {
+      size_t theSize = misc_attrs_->verifys_.size();
+      for(size_t i = 0; i < theSize; i++ ) {
+         if (misc_attrs_->verifys_[i].state() == newState)  misc_attrs_->verifys_[i].incrementActual();
+      }
+   }
+}
+
+boost::posix_time::ptime Node::state_change_time() const
+{
+   const Calendar& calendar = suite()->calendar();
+   boost::posix_time::ptime the_state_change_time = calendar.begin_time();
+   the_state_change_time += state_.second; // state_.second is calendar duration relative to calendar begin_time
+   return the_state_change_time;
+}
+
+
+DState::State Node::dstate() const {
+
+   // ECFLOW-139, check for suspended must be done first
+   if (isSuspended()) return DState::SUSPENDED;
+
+   switch ( state() ) {
+      case NState::COMPLETE:  return DState::COMPLETE; break;
+      case NState::ABORTED:   return DState::ABORTED; break;
+      case NState::ACTIVE:    return DState::ACTIVE; break;
+      case NState::SUBMITTED: return DState::SUBMITTED; break;
+      case NState::QUEUED:    return DState::QUEUED; break;
+      case NState::UNKNOWN:   return DState::UNKNOWN; break;
+   }
+   return DState::UNKNOWN;
+}
+
+bool Node::set_event( const std::string& event_name_or_number)  {
+   if (child_attrs_) return child_attrs_->set_event(event_name_or_number);
+   return false;
+}
+bool Node::clear_event(const std::string& event_name_or_number ){
+   if (child_attrs_) return child_attrs_->clear_event(event_name_or_number);
+   return false;
+}
+
+void Node::setRepeatToLastValue()
+{
+   repeat_.setToLastValue(); // no op for empty repeat
+   repeat_.increment();      // make repeat invalid
+}
+
+bool Node::check_in_limit_up_node_tree() const
+{
+   if (!inLimitMgr_.inLimit()) return false;
+
+   Node* theParent = parent();
+   while (theParent) {
+      if (!theParent->inLimitMgr_.inLimit())  return false;
+      theParent = theParent->parent();
+   }
+   return true;
+}
+
+void Node::incrementInLimit(std::set<Limit*>& limitSet) const
+{
+   //	cout << "Node::incrementInLimit " << absNodePath() << endl;
+   std::string the_abs_node_path = absNodePath();
+   inLimitMgr_.incrementInLimit(limitSet,the_abs_node_path);
+
+   Node* theParent = parent();
+   while (theParent) {
+      theParent->inLimitMgr_.incrementInLimit(limitSet,the_abs_node_path);
+      theParent = theParent->parent();
+   }
+}
+
+void Node::decrementInLimit(std::set<Limit*>& limitSet) const
+{
+   //	cout << "Node::decrementInLimit " << absNodePath() << endl;
+   std::string the_abs_node_path = absNodePath();
+   inLimitMgr_.decrementInLimit(limitSet,the_abs_node_path);
+
+   Node* theParent = parent();
+   while (theParent) {
+      theParent->inLimitMgr_.decrementInLimit(limitSet,the_abs_node_path);
+      theParent = theParent->parent();
+   }
+}
+
+static bool search_user_edit_variables( const std::string& name, std::string& value, const NameValueMap& user_edit_variables )
+{
+   NameValueMap::const_iterator i = user_edit_variables.find(name);
+   if (i != user_edit_variables.end()) {
+      if (((*i).second).empty()) {
+         // when we call --edit_script submit file, before a job is submitted the values
+         // of generated variables like  ECF_RID, ECF_TRYNO, ECF_NAME, ECF_PASS, ECF_JOB, ECF_JOBOUT, ECF_SCRIPT
+         // will be empty. In this case return false, so that we pick up the values from the node.
+         return false;
+      }
+      value = (*i).second;
+      return true;
+   }
+   return false;
+}
+
+//#define DEBUG_S 1
+bool Node::variableSubsitution(std::string& cmd) const
+{
+   char micro = '%';
+   std::string micro_char;
+   findParentUserVariableValue(Str::ECF_MICRO(),micro_char);
+   if (!micro_char.empty() && micro_char.size() == 1) {
+      micro = micro_char[0];
+   }
+
+   NameValueMap user_edit_variables;
+   return variable_substitution(cmd,user_edit_variables,micro);
+}
+
+bool Node::variable_substitution(std::string& cmd, const NameValueMap& user_edit_variables, char micro) const
+{
+   // scan the command for variables, and substitute
+   // edit ECF_FETCH "/home/ma/map/sms/smsfectch -F %ECF_FILES% -I %ECF_INCLUDE%"
+   // We can also have
+   //
+   // "%<VAR>:<substitute>% i.e if VAR exist use it, else use substitute
+   //
+   // ************************************************************************************************************
+   // Special case handling for user variables, and generated variables, which take precedence over node variables
+   // ************************************************************************************************************
+   //
+   // i.e VAR is defined as BILL
+   //  %VAR:fred --f%  will either be "BILL" or if VAR is not defined "fred --f"
+   //
+   // Infinite recursion. Its possible to end up with infinite recursion:
+   //   	edit hello '%hello%'  # string like %hello% will cause infinite recursion
+   //   	edit fred '%bill%'
+   //	 	edit bill '%fred%'   # should be 10
+   // To prevent this we will use a simple count
+#ifdef DEBUG_S
+   cout << "cmd  = " << cmd << "\n";
+#endif
+   bool double_micro_found = false;
+   std::string::size_type pos = 0;
+   int count = 0;
+   while ( 1 ) {
+      // A while loop here is used to:
+      //		a/ Allow for multiple substitution on a single line. i.e %ECF_FILES% -I %ECF_INCLUDE%"
+      //    b/ Allow for recursive substitution. %fred% -> %bill%--> 10
+
+      size_t firstPercentPos = cmd.find( micro, pos );
+      if ( firstPercentPos == string::npos ) break;
+
+      size_t secondPercentPos = cmd.find( micro, firstPercentPos + 1 );
+      if ( secondPercentPos == string::npos ) break;
+
+      if ( secondPercentPos - firstPercentPos <= 1 ) {
+         // handle %% with no characters in between, skip over
+         // i.e to handle "printf %%02d %HOUR:00%" --> "printf %02d 00"   i.e if HOUR not defined
+         pos = secondPercentPos + 1;
+         double_micro_found = true;
+         continue;
+      }
+      else pos = 0;
+
+      string percentVar( cmd.begin() + firstPercentPos+1, cmd.begin() + secondPercentPos );
+#ifdef DEBUG_S
+      cout << "   Found percentVar " << percentVar << "\n";
+#endif
+
+
+      // ****************************************************************************************
+      // Look for generated variables first:
+      // Variable like ECF_PASS can be overridden, i.e. with FREE_JOBS_PASSWORD
+      // However for job file generation we should use use the generated variables first.
+      // if the user removes ECF_PASS then we are stuck with the wrong value in the script file
+      // FREE_JOBS_PASSWORD is left for the server to deal with
+      bool generated_variable = false;
+      if ( percentVar.find("ECF_") != std::string::npos) {
+         if ( percentVar.find(Str::ECF_PASS())         != std::string::npos) generated_variable = true;
+         else if ( percentVar.find(Str::ECF_TRYNO())   != std::string::npos) generated_variable = true;
+         else if ( percentVar.find(Str::ECF_JOB())     != std::string::npos) generated_variable = true;
+         else if ( percentVar.find(Str::ECF_JOBOUT())  != std::string::npos) generated_variable = true;
+         else if ( percentVar.find(Str::ECF_PORT())    != std::string::npos) generated_variable = true;
+         else if ( percentVar.find(Str::ECF_NODE())    != std::string::npos) generated_variable = true;
+         else if ( percentVar.find(Str::ECF_NAME())    != std::string::npos) generated_variable = true;
+      }
+
+      // First search user variable (*ONLY* set when doing user edit's the script)
+      // Handle case: cmd = "%fred:bill% and where we have user variable "fred:bill"
+      // Handle case: cmd = "%fred%      and where we have user variable "fred"
+      // If we fail to find the variable we return false.
+      // Note: When a variable is found, it can have an empty value  which is still valid
+      std::string varValue;
+      if (search_user_edit_variables(percentVar,varValue,user_edit_variables)) {
+         cmd.replace( firstPercentPos, secondPercentPos - firstPercentPos + 1, varValue );
+      }
+      else if (generated_variable && find_parent_gen_variable_value(percentVar,varValue)) {
+
+         cmd.replace( firstPercentPos, secondPercentPos - firstPercentPos + 1, varValue );
+      }
+      else if (findParentVariableValue( percentVar ,varValue)) {
+         // For alias we could have added variables with %A:0%, %A:1%. Aliases allow variables with ':' in the name
+         cmd.replace( firstPercentPos, secondPercentPos - firstPercentPos + 1, varValue );
+      }
+      else {
+
+         size_t firstColon = percentVar.find( ':' );
+         if (firstColon != string::npos) {
+
+            string var(percentVar.begin(), percentVar.begin() + firstColon);
+#ifdef DEBUG_S
+            cout << "   var " << var << "\n";
+#endif
+
+            if (search_user_edit_variables(var,varValue,user_edit_variables)) {
+#ifdef DEBUG_S
+               cout << "   user var value = " << varValue << "\n";
+#endif
+               cmd.replace(firstPercentPos,secondPercentPos-firstPercentPos+1,varValue);
+            }
+            else if (generated_variable && find_parent_gen_variable_value(var,varValue)) {
+#ifdef DEBUG_S
+               cout << "   generated var value = " << varValue << "\n";
+#endif
+                cmd.replace( firstPercentPos, secondPercentPos - firstPercentPos + 1, varValue );
+            }
+            else if (findParentVariableValue( var, varValue ))  {
+               // Note: variable can exist, but have an empty value
+#ifdef DEBUG_S
+               cout << "   var value = " << varValue << "\n";
+#endif
+               // replace the "%VAR:fred --f%" with var
+               cmd.replace(firstPercentPos,secondPercentPos-firstPercentPos+1,varValue);
+            }
+            else {
+               string substitute (percentVar.begin()+ firstColon+1, percentVar.end());
+#ifdef DEBUG_S
+               cout << "  substitute value = " << substitute << "\n";
+#endif
+               cmd.replace(firstPercentPos,secondPercentPos-firstPercentPos+1,substitute);
+            }
+#ifdef DEBUG_S
+            cout << "   cmd = " << cmd << "\n";
+#endif
+         }
+         else {
+            // No Colon, Can't find in user variables, or node variable, hence can't go any further
+            return false;
+         }
+      }
+
+      // Simple Check for infinite recursion
+      if (count > 100)  return false;
+      count++;
+   }
+
+   if (double_micro_found) {
+      // replace all double micro with a single micro, this must be a single parse
+      // date +%%Y%%m%%d" ==> date +%Y%m%d
+      // %%%%             ==> %%            // i.e single parse
+      std::string doubleEcfMicro;
+      doubleEcfMicro += micro;
+      doubleEcfMicro += micro;
+      size_t last_pos = 0;
+      while ( 1 ) {
+          string::size_type ecf_double_micro_pos = cmd.find( doubleEcfMicro , last_pos);
+          if ( ecf_double_micro_pos != std::string::npos ) {
+             cmd.erase( cmd.begin() + ecf_double_micro_pos );
+             last_pos = ecf_double_micro_pos + 1;
+          }
+          else break;
+       }
+   }
+
+   return true;
+}
+
+bool Node::find_all_used_variables(std::string& cmd, NameValueMap& used_variables, char micro) const
+{
+#ifdef DEBUG_S
+   cout << "cmd  = " << cmd << "\n";
+#endif
+   int count = 0;
+   while ( 1 ) {
+      // A while loop here is used to:
+      //		a/ Allow for multiple substitution on a single line. i.e %ECF_FILES% -I %ECF_INCLUDE%"
+      //    b/ Allow for recursive substitution. %fred% -> %bill%--> 10
+
+      size_t firstPercentPos = cmd.find( micro );
+      if ( firstPercentPos == string::npos ) break;
+      size_t secondPercentPos = cmd.find( micro, firstPercentPos + 1 );
+      if ( secondPercentPos == string::npos ) break;
+      if ( secondPercentPos - firstPercentPos <= 1 ) break; // handle %% with no characters in between
+
+
+      string percentVar( cmd.begin() + firstPercentPos+1, cmd.begin() + secondPercentPos );
+#ifdef DEBUG_S
+      cout << "   Found percentVar " << percentVar << "\n";
+#endif
+
+      size_t firstColon = percentVar.find( ':' );
+      if (firstColon != string::npos) {
+
+         string var (percentVar.begin(), percentVar.begin() + firstColon);
+#ifdef DEBUG_S
+         cout << "   var " << var << "\n";
+#endif
+
+         std::string varValue;
+         if (findParentVariableValue( var, varValue ))  {
+            // Note: variable can exist, but have an empty value
+#ifdef DEBUG_S
+            cout << "   var value = " << theFoundVariable.value() << "\n";
+#endif
+            // %VAR:fred% --->  name("VAR:fred") value(theFoundVariable.value())
+            used_variables.insert( std::make_pair(percentVar,varValue) );
+
+            // replace the "%VAR:fred --f%" with variable value, so that we dont process it again
+            cmd.replace(firstPercentPos,secondPercentPos-firstPercentPos+1,varValue);
+         }
+         else {
+            string substitute (percentVar.begin()+ firstColon+1, percentVar.end());
+#ifdef DEBUG_S
+            cout << "  substitute value = " << substitute << "\n";
+#endif
+
+            // %VAR:fred% --->  name("VAR:fred") value(fred)
+            used_variables.insert( std::make_pair(percentVar,substitute));
+
+            cmd.replace(firstPercentPos,secondPercentPos-firstPercentPos+1,substitute);
+         }
+#ifdef DEBUG_S
+         cout << "   cmd = " << cmd << "\n";
+#endif
+      }
+      else {
+
+         // If we fail to find the variable we return false.
+         // Note: When a variable is found, it can have an empty value
+         //       which is still valid
+         std::string varValue;
+         if (!findParentVariableValue( percentVar ,varValue)) return false;
+
+         used_variables.insert( std::make_pair(percentVar,varValue) );
+         cmd.replace( firstPercentPos, secondPercentPos - firstPercentPos + 1, varValue );
+      }
+
+      // Simple Check for infinite recursion
+      if (count > 100)  return false;
+      count++;
+   }
+   return true;
+}
+
+
+bool Node::enviromentSubsitution(std::string& cmd)
+{
+   // scan command for environment variables, and substitute
+   // edit ECF_INCLUDE $ECF_HOME/include
+
+   while ( 1 ) {
+      size_t firstPos = cmd.find( '$' );
+      if ( firstPos == string::npos ) break;
+
+      size_t secondPos = cmd.find_first_not_of( Str::ALPHANUMERIC_UNDERSCORE(), firstPos + 1 );
+      if ( secondPos == string::npos )  secondPos = cmd.size();
+      if ( secondPos - firstPos <= 1 ) break; // handle $/ with no characters in between
+
+      string env( cmd.begin() + firstPos+1, cmd.begin() + secondPos );
+      //cout << "find env " << env << "\n";
+
+      std::string envValue;
+      if (! findParentVariableValue( env,envValue )) {
+         //cout << " could not find " << env << "\n";
+         return false;
+      }
+
+      cmd.replace( firstPos, secondPos - firstPos , envValue );
+   }
+   return true;
+}
+
+
+std::string Node::completeExpression() const
+{
+   if (completeExpr_) {
+      string ret = "complete ";
+      ret += completeExpr_->expression();
+      return ret;
+   }
+   return string();
+}
+
+std::string Node::triggerExpression() const
+{
+   if (triggerExpr_) {
+      string ret = "trigger ";
+      ret += triggerExpr_->expression();
+      return ret;
+   }
+   return string();
+}
+
+
+static void check_expressions(const Node* node, bool trigger, std::string& errorMsg)
+{
+   Ast* ast = NULL;
+   if (trigger) ast = node->triggerAst();
+   else         ast = node->completeAst();
+   if ( ast ) {
+      // The expression have been parsed and we have created the abstract syntax tree
+      // Try to resolve the path/node references in the expressions
+      // Also resolve references to events,meter,repeats variables.
+      AstResolveVisitor astVisitor(node);
+      ast->accept(astVisitor);
+
+      if ( !astVisitor.errorMsg().empty() ) {
+         errorMsg += "Expression node tree references failed for ";
+         if ( trigger ) errorMsg += node->triggerExpression();
+         else           errorMsg += node->completeExpression();
+         errorMsg += "' at ";
+         errorMsg += node->absNodePath();
+         errorMsg += "\n ";
+         errorMsg += astVisitor.errorMsg();
+      }
+   }
+}
+
+bool Node::check(std::string& errorMsg, std::string& warningMsg) const
+{
+   //#ifdef DEBUG
+   // 	cout << "Node::check " << debugNodePath() << " complete and trigger\n";
+   //#endif
+
+   /// ************************************************************************************
+   /// *IMPORTANT side effec: *
+   /// The simulator relies AstResolveVisitor to set usedInTriggger() for events and meters
+   /// *************************************************************************************
+
+   /// Make Sure: To sure capture parser errors:
+   /// defs which fail parse errors should not be allowed to be loaded into the server
+   /// Even if the code parses, check the expression for divide by zero, for divide and modulo operators
+   AstTop* ctop = completeAst(errorMsg);
+   if (ctop && !ctop->check(errorMsg)) {
+      errorMsg += " ";
+      if (completeExpr_) errorMsg += completeExpr_->expression();
+      errorMsg += " on ";
+      errorMsg += debugNodePath();
+   }
+   AstTop* ttop = triggerAst(errorMsg);
+   if (ttop && !ttop->check(errorMsg)) {
+      errorMsg += " ";
+      if (triggerExpr_) errorMsg += triggerExpr_->expression();
+      errorMsg += " on ";
+      errorMsg += debugNodePath();
+   }
+
+
+   // capture node path resolve errors
+   check_expressions(this, true,errorMsg);
+   check_expressions(this, false,errorMsg);
+
+   // check inLimit references to limits.
+   // Client: Unresolved references, which are not in the externs reported as errors/warnings
+   // Server: There are no exerns, all unresolved references reported as errors
+   bool reportErrors = true;
+   bool reportWarnings = true;
+   inLimitMgr_.check(errorMsg,warningMsg,reportErrors, reportWarnings);
+
+   return errorMsg.empty();
+}
+
+std::string Node::write_state() const
+{
+   // *IMPORTANT* we *CANT* use ';' character, since is used in the parser, when we have
+   //             multiple statement on a single line i.e.
+   //                 task a; task b;
+   // If attribute correspond to the defaults don't write then out
+   std::string ret;
+   if (state() != NState::UNKNOWN) {
+      ret += " state:";
+      ret += NState::toString(state());
+   }
+   if (state_.second.total_seconds() != 0) {
+      ret += " dur:";
+      ret += to_simple_string(state_.second);
+   }
+   if (flag_.flag() != 0) {
+      ret += " flag:";
+      ret += flag_.to_string();
+   }
+   if (suspended_) {
+      ret += " suspended:1";
+   }
+   return ret;
+}
+
+void Node::read_state(const std::string& line,const std::vector<std::string>& lineTokens)
+{
+   std::string token;
+   for(size_t i = 0; i < lineTokens.size(); i++) {
+      token.clear();
+      if (lineTokens[i].find("state:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Node::read_state Invalid state specified for suite " + name());
+         if (!NState::isValid(token)) throw std::runtime_error( "Node::read_state Invalid state specified for node : " + name() );
+         set_state_only(NState::toState(token));
+      }
+      else if (lineTokens[i].find("flag:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Node::read_state invalid flags for node "  + name());
+         flag().set_flag(token); // this can throw
+      }
+      else if (lineTokens[i].find("dur:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Node::read_state invalid duration for node: " + name());
+         state_.second = duration_from_string(token);
+      }
+      else if (lineTokens[i] == "suspended:1") suspend();
+   }
+}
+
+std::ostream& Node::print(std::ostream& os) const
+{
+   if ( defStatus_ != DState::default_state() ) {
+      Indentor in;
+      Indentor::indent(os) << "defstatus " << DState::toString(defStatus_) << "\n";
+   }
+
+   if (lateAttr_) lateAttr_->print(os);
+
+   if (completeExpr_) {
+      completeExpr_-> print(os,"complete");
+      if ( PrintStyle::getStyle() == PrintStyle::STATE  ) {
+         Indentor in;
+         if (completeExpr_->isFree()) Indentor::indent(os) << "# (free)\n";
+         else                         Indentor::indent(os) << "# (holding)\n";
+         if ( completeAst() ) {
+            if (!defs()) {
+               // Full defs is required for extern checking, and finding absolute node paths
+               // Hence print will with no defs can give in-accurate information
+               Indentor in;
+               Indentor::indent(os) << "# Warning: Full/correct AST evaluation requires the definition\n";
+            }
+            completeAst()->print(os);
+         }
+      }
+   }
+   if (triggerExpr_)  {
+      triggerExpr_->print(os,"trigger");
+      if ( PrintStyle::getStyle() == PrintStyle::STATE  ) {
+         Indentor in;
+         if (triggerExpr_->isFree()) Indentor::indent(os) << "# (free)\n";
+         else                        Indentor::indent(os) << "# (holding)\n";
+         if ( triggerAst() ) {
+            if (!defs()) {
+               Indentor in;
+               Indentor::indent(os) << "# Warning: Full/correct AST evaluation requires the definition\n";
+            }
+            triggerAst()->print(os);
+         }
+      }
+   }
+   repeat_.print(os);
+
+   BOOST_FOREACH(const Variable& v, varVec_ )       { v.print(os); }
+   BOOST_FOREACH(limit_ptr l, limitVec_)            { l->print(os); }
+   inLimitMgr_.print(os);
+   if (child_attrs_) child_attrs_->print(os);
+   if (time_dep_attrs_) time_dep_attrs_->print(os);
+   if (misc_attrs_) misc_attrs_->print(os);
+   if (autoCancel_) autoCancel_->print(os);
+
+   return os;
+}
+
+std::string Node::to_string() const
+{
+   std::stringstream ss;
+   print(ss);
+   return ss.str();
+}
+
+bool Node::operator==(const Node& rhs) const
+{
+   if ( name_ != rhs.name_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==( name_(" << name_ << ") != rhs.name_(" << rhs.name_ << ")) for: " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( state() != rhs.state()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  state(" << NState::toString(state()) << ") != rhs.state(" << NState::toString(rhs.state()) << ")) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( defStatus_ != rhs.defStatus_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  ( defStatus_ != rhs.defStatus_) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( suspended_ != rhs.suspended_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== suspended_ != rhs.suspended_ " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if ( flag_ != rhs.flag_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== ( flag_ != rhs.flag_) : '" << flag_.to_string() << "' != '" << rhs.flag_.to_string() << "' : " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if ( (triggerExpr_ && !rhs.triggerExpr_) || (!triggerExpr_ && rhs.triggerExpr_) ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  (triggerExpr_ && !rhs.triggerExpr_) || (!triggerExpr_&& rhs.triggerExpr_)  " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( triggerExpr_ && rhs.triggerExpr_ && (*triggerExpr_ != *rhs.triggerExpr_) ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  triggerExpr_ && rhs.triggerExpr_ && (*triggerExpr_ != *rhs.triggerExpr_) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if ( (completeExpr_ && !rhs.completeExpr_) || (!completeExpr_ && rhs.completeExpr_) ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  (completeExpr_ && !rhs.completeExpr_) || (!completeExpr_&& rhs.completeExpr_)  " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( completeExpr_ && rhs.completeExpr_ && (*completeExpr_ != *rhs.completeExpr_) ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  completeExpr_ && rhs.completeExpr_ && (*completeExpr_ != *rhs.completeExpr_) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+
+   if (varVec_.size() != rhs.varVec_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  (varVec_.size() != rhs.varVec_.size()) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < varVec_.size(); ++i) {
+      if (!(varVec_[i] == rhs.varVec_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "Node::operator==  (!(varVec_[i] == rhs.varVec_[i] )) " << debugNodePath() << "\n";
+            std::cout << "     varVec_[i] name = '" << varVec_[i].name() << "' value = '" << varVec_[i].theValue() << "'\n";
+            std::cout << " rhs.varVec_[i] name = '" << rhs.varVec_[i].name() << "' value = '" << rhs.varVec_[i].theValue() << "'\n";
+         }
+#endif
+         return false;
+      }
+   }
+   // We dont compare genvar as this is only used in server environment
+
+   if (!(inLimitMgr_ == rhs.inLimitMgr_)) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  (!(inLimitMgr == rhs.inLimitMgr)) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if (limitVec_.size() != rhs.limitVec_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  (limitVec_.size() != rhs.limitVec_.size()) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < limitVec_.size(); ++i) {
+      if (!(*limitVec_[i] == *rhs.limitVec_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "Node::operator==  (!(*limitVec_[i] == *rhs.limitVec_[i] )) " << debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   if (( time_dep_attrs_ && !rhs.time_dep_attrs_) || ( !time_dep_attrs_ && rhs.time_dep_attrs_)){
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== (( time_dep_attrs_ && !rhs.time_dep_attrs_) || ( !time_dep_attrs_ && rhs.time_dep_attrs_)) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( time_dep_attrs_ &&  rhs.time_dep_attrs_ && !(*time_dep_attrs_ == *rhs.time_dep_attrs_)) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== ( time_dep_attrs_ &&   rhs.time_dep_attrs_ && !(*time_dep_attrs_ == *(rhs.time_dep_attrs_))) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if (( child_attrs_ && !rhs.child_attrs_) || ( !child_attrs_ && rhs.child_attrs_)){
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== (( child_attrs_ && !rhs.child_attrs_) || ( !child_attrs_ && rhs.child_attrs_)) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( child_attrs_ &&  rhs.child_attrs_ && !(*child_attrs_ == *rhs.child_attrs_)) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== ( child_attrs_ && rhs.child_attrs_ && !(*child_attrs_ == *(rhs.child_attrs_))) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if (( misc_attrs_ && !rhs.misc_attrs_) || ( !misc_attrs_ && rhs.misc_attrs_)){
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== (( misc_attrs_ && !rhs.misc_attrs_) || ( !misc_attrs_ && rhs.misc_attrs_)) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( misc_attrs_ &&  rhs.misc_attrs_ && !(*misc_attrs_ == *rhs.misc_attrs_)) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== ( misc_attrs_ && rhs.misc_attrs_ && !(*misc_attrs_ == *(rhs.misc_attrs_))) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if (autoCancel_ && !rhs.autoCancel_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  if (autoCancel_ && !rhs.autoCancel_)  " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if (!autoCancel_ && rhs.autoCancel_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  if (!autoCancel_ && rhs.autoCancel_)  " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if (autoCancel_ && rhs.autoCancel_ && !(*autoCancel_ == *rhs.autoCancel_)) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==  (autoCancel_ && rhs.autoCancel_ && !(*autoCancel_ == *rhs.autoCancel_)) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+
+   if (!(repeat_ == rhs.repeat_)) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator==   if (!(repeat_ == rhs.repeat_)) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+
+   if (( lateAttr_ && !rhs.lateAttr_) || ( !lateAttr_ && rhs.lateAttr_)){
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== (( lateAttr_ && !rhs.lateAttr_) || ( !lateAttr_ && rhs.lateAttr_)) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   if ( lateAttr_ &&  rhs.lateAttr_ && !(*lateAttr_ == *rhs.lateAttr_)) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Node::operator== ( lateAttr_ &&   rhs.lateAttr_ && !(*lateAttr_ == *(rhs.lateAttr_))) " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   return true;
+}
+
+
+//#define DEBUG_WHY 1
+
+void Node::top_down_why(std::vector<std::string>& theReasonWhy) const
+{
+   why(theReasonWhy);
+}
+
+void Node::bottom_up_why(std::vector<std::string>& theReasonWhy) const
+{
+   defs()->why(theReasonWhy);
+
+   std::vector<Node*> vec;
+   vec.push_back(const_cast<Node*>(this));
+   Node* theParent = parent();
+   while (theParent) {
+      vec.push_back(theParent);
+      theParent = theParent->parent();
+   }
+   vector<Node*>::reverse_iterator r_end = vec.rend();
+   for(vector<Node*>::reverse_iterator r = vec.rbegin(); r!=r_end; ++r) {
+      (*r)->why(theReasonWhy);
+   }
+}
+
+void Node::why(std::vector<std::string>& vec) const
+{
+#ifdef DEBUG_WHY
+   std::cout << "Node::why " << debugNodePath() << " (" << NState::toString(state()) << ")\n";
+#endif
+   if (isSuspended()) {
+      std::string theReasonWhy = "The node '";
+      theReasonWhy += debugNodePath();
+      theReasonWhy += "' is suspended.";
+      vec.push_back(theReasonWhy);
+   }
+   else if (state() != NState::QUEUED && state() != NState::ABORTED) {
+      std::stringstream ss;
+      ss << "The node '" << debugNodePath() << "' (" << NState::toString(state()) << ") is not queued or aborted.";
+      vec.push_back(ss.str());
+
+      // When task is active/submitted no point, going any further.
+      // However for FAMILY/SUITE we still need to proceed
+      if (isTask()) return;
+   }
+
+   // Check  limits using in limit manager
+   inLimitMgr_.why(vec);
+
+   // Prefix <node-type> <path> <state>
+   std::string prefix = debugType();
+   prefix += " ";
+   prefix += absNodePath();
+   prefix += " (";
+   prefix += NState::toString(state());
+   prefix += ") ";
+
+   if (time_dep_attrs_) {
+#ifdef DEBUG_WHY
+      std::cout << "   Node::why " << debugNodePath() << " checking time dependencies\n";
+#endif
+      // postfix  = <attr-type dependent> <next run time > < optional current state>
+      time_dep_attrs_->why(vec,prefix);
+   }
+
+   // **************************************************************************************
+   // If we have a complete expression that does not evaluate then it should *NOT* hold the node.
+   // The complete expression is used to set node to complete, when it evaluates and hence
+   // should not prevent further tree walking. evaluate each leaf branch
+   // **************************************************************************************
+   AstTop* theTriggerAst = triggerAst();
+   if (theTriggerAst) {
+      // Note 1: A trigger can be freed by the ForceCmd
+      // Note 2: if we have a non NULL trigger ast, we must have trigger expression
+      // Note 3: The freed state is stored on the expression ( i.e *NOT* on the ast (abstract syntax tree) )
+      if (!triggerExpr_->isFree() ) {
+
+#ifdef DEBUG_WHY
+         std::cout << "   Node::why " << debugNodePath() << " checking trigger dependencies\n";
+#endif
+         std::string postFix;
+         if (theTriggerAst->why(postFix)) { vec.push_back(prefix + postFix); }
+      }
+   }
+}
+
+bool Node::checkInvariants(std::string& errorMsg) const
+{
+   if (time_dep_attrs_) {
+      if (!time_dep_attrs_->checkInvariants(errorMsg)) {
+         return false;
+      }
+   }
+   if (!repeat_.empty()) {
+      if (repeat_.name().empty()) {
+         errorMsg += "Repeat name empty ???";
+         return false;
+      }
+   }
+   return true;
+}
+
+std::string Node::absNodePath() const
+{
+   std::vector<std::string> vec; vec.reserve(Str::reserve_16());
+   vec.push_back(name());
+   Node* theParent = parent();
+   while (theParent) {
+      vec.push_back(theParent->name());
+      theParent = theParent->parent();
+   }
+   std::string ret; ret.reserve(Str::reserve_64());
+   vector<string>::reverse_iterator r_end = vec.rend();
+   for(vector<string>::reverse_iterator r = vec.rbegin(); r!=r_end; ++r) {
+      ret += '/';
+      ret += *r;
+   }
+
+   //	// Another algorithm broadly similar results
+   //	std::string ret; ret.reserve(Str::reserve_64());
+   // 	ret += '/';
+   //	ret += name();
+   // 	Node* theParent = parent();
+   //	while (theParent) {
+   //		ret.insert(0,"/");
+   //		ret.insert(1,theParent->name());
+   // 		theParent = theParent->parent();
+   //	}
+
+   return ret;
+}
+
+std::string Node::debugNodePath() const
+{
+   std::string ret = debugType();
+   ret += Str::COLON();
+   ret += absNodePath();
+   return ret;
+}
+
+void Node::verification(std::string& errorMsg) const
+{
+   if (misc_attrs_) misc_attrs_->verification(errorMsg);
+}
+
+void Node::getAllAstNodes(std::set<Node*>& theSet) const
+{
+   if ( completeAst() ) {
+      AstCollateNodesVisitor astVisitor(theSet);
+      completeAst()->accept(astVisitor);
+   }
+   if ( triggerAst()  ) {
+      AstCollateNodesVisitor astVisitor(theSet);
+      triggerAst()->accept(astVisitor);
+   }
+}
+
+AstTop* Node::completeAst() const
+{
+   if (completeExpr_) {
+      std::string ignoredErrorMsg;
+      (void) completeAst(ignoredErrorMsg);
+      return completeExpr_->get_ast();
+   }
+   return NULL;
+}
+
+AstTop* Node::triggerAst() const
+{
+   if (triggerExpr_) {
+      std::string ignoredErrorMsg;
+      (void) triggerAst(ignoredErrorMsg);
+      return triggerExpr_->get_ast();
+   }
+   return NULL;
+}
+
+AstTop* Node::completeAst(std::string& errorMsg) const
+{
+   if (completeExpr_ && completeExpr_->get_ast() == NULL) {
+      completeExpr_->createAST(const_cast<Node*>(this),"complete",errorMsg);
+#ifdef DEBUG
+      if (errorMsg.empty()) LOG_ASSERT(completeExpr_->get_ast(),"");
+#endif
+      return completeExpr_->get_ast();
+   }
+   return NULL;
+}
+
+AstTop* Node::triggerAst(std::string& errorMsg) const
+{
+   if (triggerExpr_ && triggerExpr_->get_ast() == NULL) {
+      triggerExpr_->createAST(const_cast<Node*>(this),"trigger",errorMsg);
+#ifdef DEBUG
+      if (errorMsg.empty()) LOG_ASSERT(triggerExpr_->get_ast(),"");
+#endif
+      return triggerExpr_->get_ast();
+   }
+   return NULL;
+}
+
+node_ptr Node::remove()
+{
+   SuiteChanged0 changed(shared_from_this());
+
+   Node* theParent = parent();
+   if ( theParent ) return theParent->removeChild( this );
+   return defs()->removeChild( this );
+}
+
+bool Node::getLabelValue(const std::string& labelName, std::string& value) const
+{
+   if (child_attrs_) return child_attrs_->getLabelValue(labelName,value);
+   return false;
+}
+
+size_t Node::position() const
+{
+   Node* theParent = parent();
+   if (theParent) {
+      return theParent->child_position(this);
+   }
+   else {
+      Defs* theDefs = defs();
+      if (theDefs) {
+         return theDefs->child_position(this);
+      }
+   }
+   return std::numeric_limits<std::size_t>::max();
+}
+
+
+void Node::gen_variables(std::vector<Variable>& vec) const
+{
+   if (!repeat_.empty()) {
+      vec.push_back(repeat_.gen_variable());
+   }
+}
+
+const Variable& Node::findGenVariable(const std::string& name) const
+{
+   if (!repeat_.empty() && repeat_.name() == name) return repeat_.gen_variable();
+   return Variable::EMPTY();
+}
+
+void Node::update_repeat_genvar() const
+{
+   if (!repeat_.empty()) {
+      repeat_.update_repeat_genvar();
+   }
+}
+
+static std::vector<ecf::TimeAttr>  timeVec_;
+static std::vector<ecf::TodayAttr> todayVec_;
+static std::vector<DateAttr>       dates_;
+static std::vector<DayAttr>        days_;
+static std::vector<ecf::CronAttr>  crons_;
+const std::vector<ecf::TimeAttr>&   Node::timeVec()  const { if (time_dep_attrs_) return time_dep_attrs_->timeVec(); return timeVec_; }
+const std::vector<ecf::TodayAttr>&  Node::todayVec() const { if (time_dep_attrs_) return time_dep_attrs_->todayVec();return todayVec_; }
+const std::vector<DateAttr>&        Node::dates()    const { if (time_dep_attrs_) return time_dep_attrs_->dates(); return dates_; }
+const std::vector<DayAttr>&         Node::days()     const { if (time_dep_attrs_) return time_dep_attrs_->days(); return days_; }
+const std::vector<ecf::CronAttr>&   Node::crons()    const { if (time_dep_attrs_) return time_dep_attrs_->crons(); return crons_; }
+std::vector<ecf::TimeAttr>::const_iterator Node::time_begin() const   { if (time_dep_attrs_) return time_dep_attrs_->time_begin(); return timeVec_.begin();}
+std::vector<ecf::TimeAttr>::const_iterator Node::time_end() const     { if (time_dep_attrs_) return time_dep_attrs_->time_end(); return timeVec_.end();}
+std::vector<ecf::TodayAttr>::const_iterator Node::today_begin() const { if (time_dep_attrs_) return time_dep_attrs_->today_begin(); return todayVec_.begin();}
+std::vector<ecf::TodayAttr>::const_iterator Node::today_end() const   { if (time_dep_attrs_) return time_dep_attrs_->today_end(); return todayVec_.end();}
+std::vector<DateAttr>::const_iterator Node::date_begin() const {        if (time_dep_attrs_) return time_dep_attrs_->date_begin(); return dates_.begin();}
+std::vector<DateAttr>::const_iterator Node::date_end() const {          if (time_dep_attrs_) return time_dep_attrs_->date_end(); return dates_.end();}
+std::vector<DayAttr>::const_iterator Node::day_begin() const {          if (time_dep_attrs_) return time_dep_attrs_->day_begin(); return days_.begin();}
+std::vector<DayAttr>::const_iterator Node::day_end() const {            if (time_dep_attrs_) return time_dep_attrs_->day_end(); return days_.end();}
+std::vector<ecf::CronAttr>::const_iterator Node::cron_begin() const {   if (time_dep_attrs_) return time_dep_attrs_->cron_begin(); return crons_.begin();}
+std::vector<ecf::CronAttr>::const_iterator Node::cron_end() const {     if (time_dep_attrs_) return time_dep_attrs_->cron_end(); return crons_.end();}
+
+static std::vector<Meter> meters_;
+static std::vector<Event> events_;
+static std::vector<Label> labels_;
+const std::vector<Meter>& Node::meters() const { if (child_attrs_) return child_attrs_->meters(); return meters_;}
+const std::vector<Event>& Node::events() const { if (child_attrs_) return child_attrs_->events(); return events_;}
+const std::vector<Label>& Node::labels() const { if (child_attrs_) return child_attrs_->labels(); return labels_;}
+std::vector<Meter>&  Node::ref_meters()        { if (child_attrs_) return child_attrs_->ref_meters(); return meters_;} // allow simulator set meter value
+std::vector<Event>&  Node::ref_events()        { if (child_attrs_) return child_attrs_->ref_events(); return events_;} // allow simulator set event value
+std::vector<Meter>::const_iterator Node::meter_begin() const { if (child_attrs_) return child_attrs_->meter_begin(); return meters_.begin();}
+std::vector<Meter>::const_iterator Node::meter_end() const {   if (child_attrs_) return child_attrs_->meter_end(); return meters_.end();}
+std::vector<Event>::const_iterator Node::event_begin() const { if (child_attrs_) return child_attrs_->event_begin(); return events_.begin();}
+std::vector<Event>::const_iterator Node::event_end() const {   if (child_attrs_) return child_attrs_->event_end(); return events_.end();}
+std::vector<Label>::const_iterator Node::label_begin() const { if (child_attrs_) return child_attrs_->label_begin(); return labels_.begin();}
+std::vector<Label>::const_iterator Node::label_end() const {   if (child_attrs_) return child_attrs_->label_end(); return labels_.end();}
+
+static std::vector<VerifyAttr> verifys_;
+static std::vector<ZombieAttr> zombies_;
+const std::vector<VerifyAttr>& Node::verifys()  const { if (misc_attrs_) return misc_attrs_->verifys(); return verifys_;}
+const std::vector<ZombieAttr>& Node::zombies()  const { if (misc_attrs_) return misc_attrs_->zombies(); return zombies_; }
+std::vector<ZombieAttr>::const_iterator Node::zombie_begin() const { if (misc_attrs_) return misc_attrs_->zombie_begin(); return zombies_.begin();}
+std::vector<ZombieAttr>::const_iterator Node::zombie_end() const {   if (misc_attrs_) return misc_attrs_->zombie_end(); return zombies_.end();}
+std::vector<VerifyAttr>::const_iterator Node::verify_begin() const { if (misc_attrs_) return misc_attrs_->verify_begin(); return verifys_.begin();}
+std::vector<VerifyAttr>::const_iterator Node::verify_end() const {   if (misc_attrs_) return misc_attrs_->verify_end(); return verifys_.end();}
diff --git a/ecflow_4_0_7/ANode/src/Node.hpp b/ecflow_4_0_7/ANode/src/Node.hpp
new file mode 100644
index 0000000..9c2bdad
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Node.hpp
@@ -0,0 +1,748 @@
+#ifndef NODE_HPP_
+#define NODE_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #251 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+// Node: The node class does NOT serialise the triggers and complete.
+//       These are created on demand in the server.
+//       However when the client code loads the definition file, the Defs::check
+//       will create AST for trigger and complete expressions.
+//       Because:
+//          1/ the AST are created, so that any parser errors can be _reported_ to the user
+//          2/ References in the AST expressions are resolved, and errors flagged.
+//       This information could have been saved, however was _not_.
+//       Because:
+//          1/ problems on AIX
+//          2/ Cut down on IPC load between client/server
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <ostream>
+#include <set>
+#include <limits>
+
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+#include <boost/serialization/shared_ptr.hpp>     // no need to include shared_ptr
+#include <boost/foreach.hpp>                      // used so often just placed here for convenience
+
+#include "DState.hpp"
+#include "NOrder.hpp"
+#include "NodeAttr.hpp"
+#include "Limit.hpp"
+#include "InLimit.hpp"
+#include "Variable.hpp"
+#include "LateAttr.hpp"
+#include "RepeatAttr.hpp"
+#include "AutoCancelAttr.hpp"
+#include "Expression.hpp"
+#include "InLimitMgr.hpp"
+#include "TimeDepAttrs.hpp"
+#include "ChildAttrs.hpp"
+#include "MiscAttrs.hpp"
+#include "NodeFwd.hpp"
+#include "Flag.hpp"
+
+namespace ecf { class Simulator; class SimulatorVisitor; class DefsAnalyserVisitor; class FlatAnalyserVisitor; } // forward declare for friendship
+namespace ecf { class Calendar; class NodeTreeVisitor; } // forward declare class
+
+class Node : public boost::enable_shared_from_this<Node>, private boost::noncopyable {
+protected:
+   Node(const std::string& name);
+   Node();
+public:
+   virtual ~Node();
+
+   /// The Parent Must set the parent pointer. For a Suite however this will be NULL
+   void set_parent(Node* p) { parent_ = p; }
+
+   // Server called functions:
+   /// Required when we have time attributes, when time related attribute are free they stay free
+   virtual void calendarChanged(const ecf::Calendar&, std::vector<node_ptr>& auto_cancelled_nodes);
+
+   /// resolving dependencies means we look at day,date,time and triggers and check to
+   /// to see if a node is free or still holding. When a node if free of its dependencies and limits
+   /// Its state is changed to submitted. When a task is in a the submitted state its
+   /// associated ecf file can be submitted.
+   /// ************************************************************************************
+   /// There is no point in resolving child dependencies if the parent is not FREE
+   //  We will return a bool, true means we are free, false for holding
+   // *************************************************************************************
+   virtual bool resolveDependencies(JobsParam& jobsParam);
+
+   /// Command related functions:
+   /// suspend generation of jobs. Below this node.
+   /// Note: When a node is suspended. time/date dependencies are still handled
+   ///       A node which is free of time is marked.
+   /// Note: suspended is *NOT* a node state. It just an *attribute*. NState::State
+   /// represents all the life cycle change a Node can go through. Suspended does
+   /// not real fit into this and has been separated out.
+   bool isSuspended() const { return suspended_; }
+   bool isParentSuspended() const;
+   void suspend();
+
+   /// resume generation of jobs, and kick of an immediate job generation
+   /// If not previously suspended does nothing
+   void resume();
+
+   /// Kill the task if it is active. For NodeContainers do it hierarchically
+   /// will throw std::runtime_error for any errors
+   virtual void kill(const std::string& zombie_pid = "") = 0;
+
+   /// Show status of a node. For NodeContainers do it hierarchically
+   /// will throw std::runtime_error for any errors
+   virtual void status() = 0;
+
+   /// Order the node using the second parameter
+   virtual void order(Node*/*immediateChild*/, NOrder::Order) {}
+
+   /// For suites it allows dependencies to be resolved, and changes state to defStatus
+   virtual void begin();
+
+   /// re queue this node. States are reset to defStatus
+   /// Typically resetRepeats is set to true, when called from user command
+   /// or when re-queue is called from NodeContainer/parent
+   ///
+   /// With user interaction : we need to clear the suspended state for *child* nodes
+   /// To distinguish between child and parent, we use a integer 'level'
+   /// This was done so that if user had suspended a task deep in the hierarchy. (which is then
+   /// not displayed in the GUI), and then chooses to re-queue at a *high* level,
+   /// we need to clear child suspended state.(Principle of least surprise)
+   /// However we will preserve def status.
+   /// If a user re-queues a node that is suspended then it stays suspended
+   /// We use -1 to mean leave suspended state as is
+   ///
+   /// When the user issues force-complete or run interactive commands, we want to miss
+   /// the next-time slot. (i.e to avoid running the job again).
+   /// This is done by using NO_REQUE_IF_SINGLE_TIME_DEP flag.
+   /// The flag remain set until we get to *this* function. We use it to avoid
+   /// resetting the time slots, effectively missing the next time slot. we then clear the flag.
+   /// However if the JOB *abort* we clear NO_REQUE_IF_SINGLE_TIME_DEP
+   /// Otherwise if we run again, we miss additional time slots necessarily
+   virtual void requeue(bool resetRepeats,
+                          int clear_suspended_in_child_nodes,
+                          bool reset_next_time_slot);
+
+   /// Re queue the time based attributes only.
+   /// Used as a part of Alter (clock) functionality.
+   /// Note: Under the hybrid clock this will not mark node as complete, (if we have day,date,cron attributes)
+   /// Since alter clock, should not change node state. This is left for user to re-queue the suite
+   virtual void requeue_time_attrs();
+
+   /// Previously < 4.0.6 requeue always reset the labels on requeue.
+   /// However ECFLOW-195 suggest some user prefer to see the last label value.
+   /// hence we will only reset the labels on the tasks when task is being run.
+   void requeue_labels();
+
+   /// This functionality is only required during interactive force or run
+   /// Avoid running the task on the same time slot, by missing the next time slot.
+   /// Requires we set a flag, to avoid the requeue resetting the time slots
+   void miss_next_time_slot();
+
+   /// Recursively run the tasks under this node, ignore suspend,limits,triggers, and time dependencies
+   /// if force is set, run even if task is submitted or active. (will create zombies)
+   virtual bool run(JobsParam& jobsParam, bool force) = 0;
+
+   /// Recursively determines why the node is not running.
+   virtual void top_down_why(std::vector<std::string>& theReasonWhy) const;
+   void bottom_up_why(std::vector<std::string>& theReasonWhy) const;
+
+   void freeTrigger() const;
+   void clearTrigger() const;
+   void freeComplete() const;
+   void clearComplete() const;
+   void freeHoldingDateDependencies();
+   void freeHoldingTimeDependencies();
+
+   // Used in the force cmd
+   bool set_event( const std::string& event_name_or_number);
+   bool clear_event( const std::string& event_name_or_number);
+   void setRepeatToLastValue();
+   virtual void setRepeatToLastValueHierarchically() { setRepeatToLastValue(); }
+
+   /// find all %VAR% and replaces with variable values, returns false on the
+   /// first variable that can't be found, cmd will be left half processed.
+   /// Will search for ECF_MICRO, if not found assumes % as the micro char
+   bool variableSubsitution(std::string& cmd) const;
+
+   bool variable_substitution(std::string& cmd, const NameValueMap& user_edit_variables, char micro = '%') const;
+
+   /// Find all %VAR% and add to the list, there can be more than one. i.e %ECF_FILES% -I %ECF_INCLUDE%"
+   bool find_all_used_variables(std::string& cmd, NameValueMap& used_variables, char micro = '%') const;
+
+   /// Find all environment variables, in the input string and substitute.
+   /// with correspondingly named variable value.
+   /// i.e search for ${ENV} and replace
+   bool enviromentSubsitution(std::string& cmd);
+
+   /// Resolve inlimit references to limits, and check trigger and complete expression
+   virtual bool check(std::string& errorMsg,std::string& warningMsg) const;
+
+   /// Generated variables. Suites can have thousands of tasks. If the generated variables associated with
+   /// tasks are sent to the client, it can amount to a very large network traffic.
+   /// To minimise this bandwidth the generated variables for tasks/families are not persisted.
+   /// However client can demand create the generated  variable by calling this function.
+   virtual void update_generated_variables() const = 0;
+
+   ///  generates job file independent of dependencies
+   virtual void check_job_creation( job_creation_ctrl_ptr jobCtrl) = 0;
+
+   node_ptr remove(); // gets the parent then calls removeChild
+   virtual node_ptr removeChild( Node* child) = 0;
+   virtual bool addChild( node_ptr child,size_t position = std::numeric_limits<std::size_t>::max()) = 0; // return false if child of same name exist, leak!!!
+   virtual bool isAddChildOk( Node* child, std::string& errorMsg) const = 0; // return false if child of same name
+
+   virtual void verification(std::string& errorMsg) const;
+
+   /// See defs.hpp
+   virtual void generate_scripts( const std::map<std::string,std::string>& override) const = 0;
+
+   // standard functions: ==============================================
+   virtual std::ostream& print(std::ostream&) const;
+   bool operator==(const Node& rhs) const;
+   virtual bool checkInvariants(std::string& errorMsg) const;
+
+   /// Implements the visitor pattren
+   virtual void accept(ecf::NodeTreeVisitor&) = 0;
+   virtual void acceptVisitTraversor(ecf::NodeTreeVisitor&) = 0; // Visitor does the traversal
+
+// state related functions: ========================================
+
+   /// If the task was aborted provide the reason, default returns empty string
+   /// Only the task will return the reason for abort.
+   virtual const std::string& abortedReason() const;
+
+   /// This state added as an convenience, it includes Suspended attribute returned as enum
+   DState:: State dstate() const;
+
+   /// This represents the persisted/saved state // First = NState, Second = time_duration
+   /// The State represent the life cycle changes of a node.
+   NState::State state() const { return state_.first.state(); }
+
+   /// return the state and duration time(relative to when suite was begun) when the state change happened
+   std::pair<NState,boost::posix_time::time_duration> get_state() const { return state_;}
+
+   /// Set the state, this can have side affects. To handle state changes
+   ///	  Should family triggers use saved state, or computed state.
+   ///	  *** If we use computed state, this may be wrong, since computed state
+   ///	  *** does not take repeats, or time dependencies into account
+   ///	  *** Hence after each state change, we bubble up node tree, work out if
+   ///	  *** Node is free of repeat, and time dependencies,
+   /// 	** Every time we set the state on a nodecontainer, we call handleStateChange
+   /// 	** This by default works out the most significant state of the children
+   /// 	** ie. the computed state. Hence setting the state on Suite/Family is really
+   /// 	** meaningless, since it will always be the computed state.
+   void set_state(NState::State s, bool force = false, const std::string& additional_info_to_log = "");
+   virtual void set_state_hierarchically(NState::State s, bool force) { set_state(s,force); }
+
+   /// Set state only, has no side effects
+   void setStateOnly(NState::State s, bool force = false, const std::string& additional_info_to_log = "");
+   virtual void setStateOnlyHierarchically(NState::State s, bool force = false) { setStateOnly(s,force); }
+
+   /// This returns the time of state change: (relative to real time when the suite calendar was begun)
+   /// The returned time is *real time/computer UTC time* and *not* suite real time.
+   boost::posix_time::ptime state_change_time() const;
+
+   /// Sets the default status the node should have when the begin/re-queue is called
+   /// *Distinguish* between adding a def status and changing it.
+   /// Changing via defStatus_.setState(s);  should alter state_change_no
+   void addDefStatus(DState::State s ) { defStatus_ = DState(s); }
+   DState::State defStatus() const { return defStatus_.state(); }
+
+   // Query functions: =========================================================
+   /// returns my parent, for suite will return NULL;
+   Node* parent() const { return parent_;}
+   virtual Suite* suite() const = 0;
+   virtual Defs* defs() const = 0;
+
+   // Performance hack, to avoid casts
+   virtual Task* isTask() const   { return NULL;}
+   virtual Alias* isAlias() const { return NULL;}
+   virtual Submittable* isSubmittable() const { return NULL;}
+   virtual NodeContainer* isNodeContainer() const { return NULL;}
+   virtual Family* isFamily() const { return NULL;}
+   virtual Suite* isSuite() const  { return NULL;}
+
+   ///  returns the absolute node path
+   std::string absNodePath() const;
+   virtual const std::string& debugType() const = 0;
+
+   /// returns abs node path preceded by the type of the node
+   std::string debugNodePath() const;
+
+   /// returns true if this node OR any of its children
+   /// has cron,time,day,date or today time dependencies
+   virtual bool hasTimeDependencies() const { return (time_dep_attrs_) ? true : false; }
+   bool isTimeFree() const { return (time_dep_attrs_) ? time_dep_attrs_->timeDependenciesFree() : false;}
+
+
+   /// A hierarchical function
+   virtual bool hasAutoCancel() const { return (autoCancel_) ? true : false;}
+
+
+   // Access functions: ======================================================
+   const std::string& name() const { return name_; }
+   std::string toString() const    { return name_; }  // keep ecflowview/ecf_node.h happy
+   const Repeat& repeat() const    { return repeat_;} // can be empty()
+   const std::vector<Variable>&        variables()const { return varVec_;}
+   const std::vector<limit_ptr>&       limits()   const { return limitVec_;}
+   const std::vector<InLimit>&         inlimits() const { return inLimitMgr_.inlimits(); }
+   const std::vector<Meter>&           meters()    const;
+   const std::vector<Event>&           events()    const;
+   const std::vector<Label>&           labels()   const;
+   const std::vector<ecf::TimeAttr>&   timeVec()  const;
+   const std::vector<ecf::TodayAttr>&  todayVec() const;
+   const std::vector<DateAttr>&        dates()    const;
+   const std::vector<DayAttr>&         days()     const;
+   const std::vector<ecf::CronAttr>&   crons()    const;
+   const std::vector<VerifyAttr>&      verifys()  const;
+   const std::vector<ZombieAttr>&      zombies()  const;
+   TimeDepAttrs*  get_time_dep_attrs() const { return time_dep_attrs_;} // can be NULL
+   ecf::LateAttr* get_late() const { return lateAttr_;}
+   ecf::AutoCancelAttr*  get_autocancel() const { return autoCancel_;}
+   ecf::Flag&       flag()           { return flag_;}
+   const ecf::Flag& get_flag() const { return flag_;}
+
+   virtual void gen_variables(std::vector<Variable>&) const;
+   bool getLabelValue(const std::string& name, std::string& value) const;
+
+   // Use get_trigger()/get_complete() for determining if we have trigger
+   // and complete expressions. This is many times faster than calling
+   // triggerAst()/completeAst() as this will force a parse and construction
+   // of Abstract syntax tree, first time it is called.
+   Expression* get_trigger()    const { return triggerExpr_;}
+   Expression* get_complete()   const { return completeExpr_;}
+   AstTop* completeAst() const;   // Will create AST on demand
+   AstTop* triggerAst() const;    // Will create AST on demand
+   std::string completeExpression() const;
+   std::string triggerExpression() const;
+
+   virtual void get_all_tasks(std::vector<task_ptr>&) const = 0;
+   virtual void get_all_nodes(std::vector<node_ptr>&) const = 0;
+   virtual void get_all_aliases(std::vector<alias_ptr>&) const = 0;
+   virtual void getAllTasks(std::vector<Task*>&) const = 0;
+   virtual void getAllSubmittables(std::vector<Submittable*>&) const = 0;
+   virtual void get_all_active_submittables(std::vector<Submittable*>&) const = 0;
+   virtual void getAllNodes(std::vector<Node*>&) const = 0;
+   virtual void getAllAstNodes(std::set<Node*>&) const;
+
+   /// returns the immediate children
+   virtual void immediateChildren(std::vector<node_ptr>&) const {}
+
+   /// retrieve _ALL_ children by hierarchically traversing down the node tree
+   virtual void allChildren(std::set<Node*>&) const {}
+
+   // Add functions: ===============================================================
+   void addVerify( const VerifyAttr& );  // for testing and verification Can throw std::runtime_error
+   void addVariable(const Variable& );   // will throw std::runtime_error if duplicate
+   void add_variable(const std::string& name, const std::string& value );// will write to std:out if duplicates
+   void add_variable_int(const std::string& name, int);// will throw std::runtime_error if duplicate
+
+   void add_trigger(const std::string&);            // use for short complete expressions,Can throw std::runtime_error
+   void add_complete(const std::string&);           // use for short complete expressions,Can throw std::runtime_error
+   void add_trigger_expr(const Expression&);        // Can throw std::runtime_error
+   void add_complete_expr(const Expression&);       // Can throw std::runtime_error
+   void add_part_trigger(const PartExpression& );   // for adding multiple and/or expression,Can throw std::runtime_error
+   void add_part_complete(const PartExpression& );  // for adding multiple and/or expression,Can throw std::runtime_error
+
+   void addTime( const ecf::TimeAttr& );
+   void addToday( const ecf::TodayAttr& );
+   void addDate( const DateAttr& );
+   void addDay( const DayAttr& );
+   void addCron( const ecf::CronAttr& );
+
+   void addLimit(const Limit& );        // will throw std::runtime_error if duplicate
+   void addInLimit(const InLimit& l)         { inLimitMgr_.addInLimit(l);}   // will throw std::runtime_error if duplicate
+   void auto_add_inlimit_externs(Defs* defs) { inLimitMgr_.auto_add_inlimit_externs(defs);}
+   void addEvent( const Event& );       // will throw std::runtime_error if duplicate
+   void addMeter( const Meter& );       // will throw std::runtime_error if duplicate
+   void addLabel( const Label& );       // will throw std::runtime_error if duplicate
+   void addAutoCancel( const ecf::AutoCancelAttr& );
+   void addLate( const ecf::LateAttr& );
+   void addRepeat( const Repeat& );      // will throw std::runtime_error if duplicate
+   void addZombie( const ZombieAttr& );  // will throw std::runtime_error if duplicate
+
+
+   // Delete functions: can throw std::runtime_error ===================================
+   // if name argument is empty, delete all attributes of that type
+   // Can throw std::runtime_error of the attribute can not be found
+   void deleteTime(const std::string& name );
+   void delete_time( const ecf::TimeAttr&  );
+   void deleteToday(const std::string& name);
+   void delete_today(const ecf::TodayAttr&);
+   void deleteDate(const std::string& name);
+   void delete_date(const DateAttr&);
+   void deleteDay(const std::string& name);
+   void delete_day(const DayAttr&);
+   void deleteCron(const std::string& name);
+   void delete_cron(const ecf::CronAttr&);
+
+   void delete_zombie(const ecf::Child::ZombieType);
+   void deleteVariable( const std::string& name);
+   void deleteEvent(const std::string& name);
+   void deleteMeter(const std::string& name);
+   void deleteLabel(const std::string& name);
+   void deleteTrigger();
+   void deleteComplete();
+   void deleteRepeat();
+   void deleteLimit(const std::string& name);
+   void delete_limit_path(const std::string& limit_name, const std::string& limit_path);
+   void deleteInlimit(const std::string& name);
+   void deleteZombie(const std::string& type); // string must be one of [ user | ecf | path ]
+
+   // Change functions: ================================================================
+   /// returns true the change was made else false, Can throw std::runtime_error for parse errors
+   void changeVariable(const std::string& name,const std::string& value);
+   void changeEvent(const std::string& name,const std::string& setOrClear = "");
+   void changeEvent(const std::string& name,bool value);
+   void changeMeter(const std::string& name,const std::string& value);
+   void changeMeter(const std::string& name,int value);
+   void changeLabel(const std::string& name,const std::string& value);
+   void changeTrigger(const std::string& expression);
+   void changeComplete(const std::string& expression);
+   void changeRepeat(const std::string& value);
+   void changeLimitMax(const std::string& name,const std::string& maxValue);
+   void changeLimitMax(const std::string& name,int maxValue);
+   void changeLimitValue(const std::string& name,const std::string& value);
+   void changeLimitValue(const std::string& name,int value);
+   void changeDefstatus(const std::string& state);
+
+   bool set_meter(const std::string& name,int value); // does not throw if meter not found
+   bool set_event(const std::string& name,bool value);  // does not throw if event not found
+
+   void increment_repeat(); // used in test only
+
+   // mementos functions:
+   /// Collect all the state changes, so that only small subset is returned to client
+   virtual void collateChanges(DefsDelta& ) const = 0;
+   void incremental_changes(DefsDelta&, compound_memento_ptr& comp) const;
+
+   void set_memento(const StateMemento* );
+   void set_memento(const NodeDefStatusDeltaMemento* );
+   void set_memento(const SuspendedMemento* );
+   void set_memento(const NodeEventMemento* );
+   void set_memento(const NodeMeterMemento* );
+   void set_memento(const NodeLabelMemento* );
+   void set_memento(const NodeTriggerMemento* );
+   void set_memento(const NodeCompleteMemento* );
+   void set_memento(const NodeRepeatMemento* );
+   void set_memento(const NodeLimitMemento* );
+   void set_memento(const NodeInLimitMemento* );
+   void set_memento(const NodeVariableMemento* );
+   void set_memento(const NodeLateMemento* );
+   void set_memento(const NodeTodayMemento* );
+   void set_memento(const NodeTimeMemento* );
+   void set_memento(const NodeDayMemento* );
+   void set_memento(const NodeCronMemento* );
+   void set_memento(const NodeDateMemento* );
+   void set_memento(const NodeZombieMemento* );
+   void set_memento(const NodeVerifyMemento* );
+   void set_memento(const FlagMemento* );
+
+   // Find functions: ============================================================
+   // Will search for a node by name(ie not a path) first on siblings, then on a parent
+   // then up the node tree, will stop at the suite .
+   virtual node_ptr find_node_up_the_tree(const std::string& name) const = 0;
+
+   // This is used to find relative nodes.
+   virtual node_ptr find_relative_node(const std::vector<std::string>& pathToNode) = 0;
+
+   /// Look for user,generated and repeat variables
+   /// Find variable corresponding to the given name, by search up the parent hierarchy
+   /// ** We need to distinguish between a variable the exists, but has an empty value
+   /// ** hence we return true if variable is found, and false otherwise
+   bool findParentVariableValue(const std::string& name, std::string& theValue) const;
+
+   /// Look for the parent generated variable only
+   bool find_parent_gen_variable_value(const std::string& name, std::string& theValue) const;
+
+   /// Only looks at user variables
+   /// Find variable corresponding to the given name, by search up the parent hierarchy
+   /// Use when we know that variable is user defined. This is more efficient than
+   /// calling findParentVariableValue.
+   /// *** We need to distinguish between a variable the exists, but has an empty value
+   /// *** hence we return true if variable is found, and false otherwise
+   bool findParentUserVariableValue(const std::string& name, std::string& theValue) const;
+
+   /// This function should be used, when we don't care about the distinctions between
+   /// a variable that exist but has a empty value, and variable not found.(still return empty string)
+   /// Useful when we want to return by reference
+   const std::string& find_parent_user_variable_value(const std::string& name) const;
+
+   /// Search up the hierarchy, simply checks for existence independent of variable vlaue
+   bool user_variable_exists(const std::string& name) const;
+
+   virtual node_ptr findImmediateChild(const std::string& /*name*/, size_t& /*child_pos*/) const { return node_ptr();}
+   const Variable& findVariable(const std::string& name) const;
+   virtual const Variable& findGenVariable(const std::string& name) const;
+   bool findVariableValue( const std::string& name, std::string& returnedValue) const;
+   bool findGenVariableValue( const std::string& name, std::string& returnedValue) const;
+
+   bool findVerify(const VerifyAttr& ) const;
+   bool findLimit(const Limit& ) const;
+   bool findLabel(const std::string& name) const;
+   const Label& find_label(const std::string& name) const;
+   limit_ptr find_limit(const std::string& name) const;
+   limit_ptr findLimitUpNodeTree(const std::string& name) const;
+   Limit* findLimitViaInLimit(const InLimit& l) const { return  inLimitMgr_.findLimitViaInLimit(l); }         // used in *test* only
+   bool findInLimitByNameAndPath(const InLimit& l) const { return inLimitMgr_.findInLimitByNameAndPath(l); }  // use name,path,token,
+   const Repeat& findRepeat(const std::string& name) const;
+   const Meter& findMeter(const std::string& name) const;
+   Meter& find_meter(const std::string& name);
+   const Event& findEvent(const Event&) const;
+   const Event& findEventByNameOrNumber( const std::string& name) const;
+
+   const ZombieAttr& findZombie( ecf::Child::ZombieType ) const;
+   bool findParentZombie(ecf::Child::ZombieType, ZombieAttr&) const;
+
+   /// Finds the referenced node. The node path can be relative or absolute or a extern path
+   /// however if its an extern path, and corresponding suite is loaded, but we still
+   /// can't find the path, then an error is returned
+   node_ptr findReferencedNode(const std::string& nodePath, std::string& errorMsg) const;
+   node_ptr findReferencedNode(const std::string& nodePath, const std::string& externObj, std::string& errorMsg) const;
+
+   /// return true if we can find a event, meter, user, repeat or generated variable with the given name
+   bool findExprVariable( const std::string& name);  // update event & meter as used in trigger for simulator
+
+   /// The status of family/suite is the inherited most significant status of all its children
+   enum TraverseType { IMMEDIATE_CHILDREN, HIERARCHICAL };
+   virtual NState::State computedState(Node::TraverseType) const = 0;
+
+   /// Sets the most significant state up the node tree. Ignores tasks
+   void set_most_significant_state_up_node_tree();
+
+   /// For use with GUI only
+   void set_graphic_ptr(void* p) { graphic_ptr_ = p; }
+   void* graphic_ptr() const { return  graphic_ptr_;}
+
+   /// returns the position of this node relative to its peers
+   /// If not attached to parent returns std::numeric_limits<std::size_t>::max();
+   size_t position() const;
+
+protected:
+   /// Used in conjunction with Node::position()
+   /// returns std::numeric_limits<std::size_t>::max() if child not found
+   virtual size_t child_position(const Node*) const = 0;
+
+   /// The set_state_only() requires a correctly formed tree, ie since it needs suite()/calendar
+   /// to initialise the duration. We need a way set the state directly. For initialization
+   void set_state_only(NState::State s) { state_.first.setState(s);}
+
+   /// based on the *current* state increment or decrements the limits
+   /// Should *only* be called within a task
+   virtual void update_limits() = 0;
+
+   /// After job submission we need to increment the in limit, to indicate that a
+   /// resource is consumed. The set ensure we only update once during a traversal
+   void incrementInLimit(std::set<Limit*>& limitSet) const;
+
+   /// After job aborts or completes we need to decrement the in limit, to indicate that
+   /// additional resource is available. The set ensure we only update once during a traversal
+   void decrementInLimit(std::set<Limit*>& limitSet) const;
+
+   friend class InLimitMgr;
+   bool check_in_limit() const { return inLimitMgr_.inLimit(); }
+   bool check_in_limit_up_node_tree() const;
+
+
+   friend class Defs;
+   friend class Family;
+   friend class NodeContainer;
+   virtual bool doDeleteChild(Node* child) { return false;}
+
+   /// called at the end of state change function
+   /// ** Every time we set the state on a nodecontainer, we call handleStateChange
+   /// ** This by default works out the most significant state of the children
+   /// ** ie. the computed state. Hence setting the state on Suite/Family is really
+   /// ** meaningless, since it will always be the computed state.
+   /// ** For Aliases we only update the limits, and do not bubble up state changes
+   virtual void handleStateChange() = 0; // can end up changing state
+
+   /// This function is called as a part of handling state change.
+   /// When a suite completes it can be re-queued due to:
+   ///   o repeat attribute
+   ///     When going up the hierarchy we should not reset Repeats
+   ///     The inner repeat must complete before parent repeat (if any) is incremented
+   ///     (i.e Mimics a nested loops)
+   ///  o Time, Today, cron attributes
+   ///
+   ///  Otherwise we need to traverse up the node tree and set the most significant state
+   void requeueOrSetMostSignificantStateUpNodeTree();
+   virtual void resetRelativeDuration();
+
+   node_ptr non_const_this() const;
+
+   void update_repeat_genvar() const;
+
+   // returns node state without trailing new lines
+   virtual std::string write_state() const;
+   virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
+
+private:
+   void why(std::vector<std::string>& theReasonWhy) const;
+   /// Function used as a part of trigger and complete expressions.
+   /// The search pattern is event,meter,user-variable,repeat, generated-variable
+   int findExprVariableValue( const std::string& name) const;
+   int findExprVariableValueAndPlus(const std::string& name, int val) const;
+   int findExprVariableValueAndMinus(const std::string& name, int val) const;
+   int findExprVariableValueAndType( const std::string& name, std::string& varType) const;
+   void findExprVariableAndPrint( const std::string& name, std::ostream& os) const;
+   friend class VariableHelper;
+
+private:
+   bool checkForAutoCancel(const ecf::Calendar& c) const;
+
+   void add_trigger_expression(const Expression&);     // Can throw std::runtime_error
+   void add_complete_expression(const Expression&);    // Can throw std::runtime_error
+   const Event& findEventByNumber(int number) const;
+   const Event& findEventByName( const std::string& name) const;
+   bool set_meter_used_in_trigger(const std::string& name);
+   bool set_event_used_in_trigger(const std::string& name);
+
+
+   /// When the begin/re-queue is called this function will initialise the state
+   /// on the node. If node has a default state this is applied to the node, and
+   /// hierarchically to all the children
+   /// Can also clear suspended see re-queue()
+   void initState(int clear_suspended_in_child_nodes);
+
+   // Clear the node suspended and update state change number, no other side effects
+   void clearSuspended();
+
+private: // alow simulator access
+   friend class ecf::DefsAnalyserVisitor;
+   friend class ecf::FlatAnalyserVisitor;
+   friend class ecf::SimulatorVisitor;
+   friend class ecf::Simulator;
+   std::vector<Meter>&  ref_meters();// allow simulator set meter value
+   std::vector<Event>&  ref_events();// allow simulator set event value
+   Repeat& ref_repeat()              { return repeat_;} // allow simulator to modify repeat
+
+   /// Note: If the complete expression evaluation fails. we should continue resolving dependencies
+   ///       If the complete expression evaluation evaluates, then we set node to complete
+   bool evaluateComplete() const;
+   bool evaluateTrigger() const;
+   bool timeDependenciesFree() const;
+
+   AstTop* completeAst(std::string& errorMsg) const;   // Will create AST on demand
+   AstTop* triggerAst(std::string& errorMsg) const;    // Will create AST on demand
+
+   void checkForLateness( const ecf::Calendar& );
+
+private: // All mementos access
+   friend class CompoundMemento;
+   void clear(); /// Clear *ALL* internal attributes
+
+private: /// For use by python interface,
+   friend void export_Node();
+   friend void export_Task();
+   friend void export_SuiteAndFamily();
+   std::vector<Meter>::const_iterator meter_begin() const;
+   std::vector<Meter>::const_iterator meter_end() const;
+   std::vector<Event>::const_iterator event_begin() const;
+   std::vector<Event>::const_iterator event_end() const;
+   std::vector<Label>::const_iterator label_begin() const;
+   std::vector<Label>::const_iterator label_end() const;
+   std::vector<ecf::TimeAttr>::const_iterator time_begin() const;
+   std::vector<ecf::TimeAttr>::const_iterator time_end() const;
+   std::vector<ecf::TodayAttr>::const_iterator today_begin() const;
+   std::vector<ecf::TodayAttr>::const_iterator today_end() const ;
+   std::vector<DateAttr>::const_iterator date_begin() const ;
+   std::vector<DateAttr>::const_iterator date_end() const;
+   std::vector<DayAttr>::const_iterator day_begin() const ;
+   std::vector<DayAttr>::const_iterator day_end() const;
+   std::vector<ecf::CronAttr>::const_iterator cron_begin() const ;
+   std::vector<ecf::CronAttr>::const_iterator cron_end() const;
+   std::vector<ZombieAttr>::const_iterator zombie_begin() const;
+   std::vector<ZombieAttr>::const_iterator zombie_end() const;
+   std::vector<VerifyAttr>::const_iterator verify_begin() const;
+   std::vector<VerifyAttr>::const_iterator verify_end() const;
+   std::vector<Variable>::const_iterator variable_begin() const { return varVec_.begin();}
+   std::vector<Variable>::const_iterator variable_end() const { return varVec_.end();}
+   std::vector<limit_ptr>::const_iterator limit_begin() const { return limitVec_.begin();}
+   std::vector<limit_ptr>::const_iterator limit_end() const { return limitVec_.end();}
+   std::vector<InLimit>::const_iterator inlimit_begin() const { return inLimitMgr_.inlimit_begin();}
+   std::vector<InLimit>::const_iterator inlimit_end() const { return inLimitMgr_.inlimit_end();}
+   std::string to_string() const;                                  // For python interface
+
+private:
+   Node*        parent_; // *NOT* persisted must be set by the parent class
+   std::string  name_;
+   bool                        suspended_;
+   std::pair<NState,boost::posix_time::time_duration> state_; // state and duration since suite start when state changed
+   DState                      defStatus_;    // default value is QUEUED
+
+   mutable Expression*         completeExpr_; // can only have one complete expression
+   mutable Expression*         triggerExpr_;  // can only have one trigger expression
+
+   ecf::LateAttr*              lateAttr_;     // Can only have one late attribute per node
+   ecf::AutoCancelAttr*        autoCancel_;   // Can only have 1 auto cancel per node
+   TimeDepAttrs*               time_dep_attrs_;
+   ChildAttrs*                 child_attrs_;  // event meter & lables
+   MiscAttrs*                  misc_attrs_;   // VerifyAttr(used for statistics and test verification) & Zombies
+   Repeat                      repeat_;       // each node can only have one repeat. By value, since has pimpl
+
+   std::vector<Variable>       varVec_;
+   std::vector<limit_ptr>      limitVec_;    // Ptrs since many in-limits can point to a single limit
+   InLimitMgr                  inLimitMgr_;  // manages the inlimit
+
+   ecf::Flag                   flag_;
+
+   unsigned int state_change_no_;     // *not* persisted, only used on server side,Used to indicate addition or deletion of attribute
+   unsigned int variable_change_no_;  // *not* persisted, placed here rather than Variable, to save memory
+   unsigned int suspended_change_no_; // *not* persisted,
+
+#ifdef DEBUG
+   boost::posix_time::ptime  submit_to_complete_duration_;  // *not* persisted
+#endif
+
+   void* graphic_ptr_;  // for use with the gui only
+
+   friend class TimeDepAttrs;
+   friend class ChildAttrs;
+   friend class MiscAttrs;
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & name_;
+      ar & state_;
+      ar & suspended_;
+      ar & defStatus_;
+      ar & completeExpr_;
+      ar & triggerExpr_;
+      ar & lateAttr_;
+      ar & autoCancel_;
+      ar & time_dep_attrs_;
+      ar & child_attrs_;
+      ar & misc_attrs_;    // VerifyAttr & Zombies
+      ar & repeat_;
+      ar & varVec_;
+      ar & limitVec_;
+      ar & inLimitMgr_;
+      ar & flag_;
+
+      if (Archive::is_loading::value) {
+         if (time_dep_attrs_)  time_dep_attrs_->set_node(this);
+         if (child_attrs_) child_attrs_->set_node(this);
+         if (misc_attrs_) misc_attrs_->set_node(this);
+         for(std::vector<limit_ptr>::iterator i = limitVec_.begin(); i!= limitVec_.end(); ++i)  (*i)->set_node(this);
+      }
+   }
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/src/NodeAdd.cpp b/ecflow_4_0_7/ANode/src/NodeAdd.cpp
new file mode 100644
index 0000000..1d1fcc0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeAdd.cpp
@@ -0,0 +1,299 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #50 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/make_shared.hpp>
+#include <boost/lexical_cast.hpp>
+#include "Node.hpp"
+#include "Ecf.hpp"
+
+using namespace ecf;
+using namespace std;
+
+void Node::addVariable(const Variable& v )
+{
+   state_change_no_ = Ecf::incr_state_change_no();
+
+   const std::string& variable_name = v.name();
+   size_t theSize = varVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (varVec_[i].name() == variable_name) {
+         // Variable already exist, *UPDATE* its value
+         varVec_[i].set_value(v.theValue());
+         if (0 == Ecf::debug_level())
+            std::cout << "Node::addVariable: Variable of name '" << v.name() << "' already exist for node " << debugNodePath() << " updating with value '" << v.theValue() << "'\n";
+         return;
+      }
+   }
+
+   if (varVec_.capacity() == 0) varVec_.reserve(5);
+	varVec_.push_back( v );
+}
+
+void Node::add_variable(const std::string& name, const std::string& value )
+{
+	addVariable( Variable(name, value) );
+}
+
+void Node::add_variable_int(const std::string& name, int some_int )
+{
+	std::string value =  boost::lexical_cast<std::string>(some_int);
+	addVariable( Variable(name, value) );
+}
+
+void Node::add_trigger(const std::string& string_expression)
+{
+	add_trigger_expression(Expression(string_expression));
+}
+void Node::add_complete(const std::string& string_expression)
+{
+	add_complete_expression(Expression(string_expression));
+}
+void Node::add_trigger_expr(const Expression& expr)
+{
+	add_trigger_expression(expr);
+}
+void Node::add_complete_expr(const Expression& expr)
+{
+	add_complete_expression(expr);
+}
+void Node::add_trigger_expression(const Expression& t)
+{
+	if ( triggerExpr_ ) {
+		std::stringstream ss;
+		ss << "Node::add_trigger_expression. A Node(" << absNodePath() << " can only have one trigger ";
+		ss << "to add large triggers use multiple calls to Node::add_part_trigger( PartExpression('t1 == complete') )";
+ 		throw std::runtime_error( ss.str() );
+	}
+  	triggerExpr_ = new Expression(t);
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void Node::add_complete_expression(const Expression& t)
+{
+	if ( completeExpr_ ) {
+		std::stringstream ss;
+		ss << "Node::add_complete_expression. A Node(" << absNodePath() << " can only have one complete expression ";
+		ss << "to add large complete expressions use multiple calls to Node::add_part_complete( PartExpression('t1 == complete') )";
+ 		throw std::runtime_error( ss.str() );
+	}
+  	completeExpr_ = new Expression(t);
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void Node::add_part_trigger(const PartExpression& part)
+{
+	if (!triggerExpr_) triggerExpr_ = new Expression();
+	triggerExpr_->add( part );
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+void Node::add_part_complete(const PartExpression& part)
+{
+	if (!completeExpr_) completeExpr_ = new Expression();
+	completeExpr_->add( part );
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+
+void Node::addTime(const ecf::TimeAttr& t)
+{
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "Node::addTime\n";
+#endif
+
+   if (isSuite()) {
+      throw std::runtime_error("Can not add time based dependency on a suite");
+   }
+
+   if (!time_dep_attrs_) time_dep_attrs_ = new TimeDepAttrs(this);
+   time_dep_attrs_->addTime(t);  // will call  Ecf::incr_state_change_no();
+}
+
+void Node::addToday(const ecf::TodayAttr& t)
+{
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "Node::addToday()\n";
+#endif
+
+   if (isSuite()) {
+      throw std::runtime_error("Can not add time based dependency on a suite");
+   }
+
+   if (!time_dep_attrs_) time_dep_attrs_ = new TimeDepAttrs(this);
+   time_dep_attrs_->addToday(t); // will call  Ecf::incr_state_change_no();
+}
+
+void Node::addDate( const DateAttr& d)
+{
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "Node::addDate()\n";
+#endif
+
+	// By disallowing what effect would if have on existing suites ?
+   if (isSuite()) {
+      throw std::runtime_error("Can not add time based dependency on a suite"); // Added at 4.0.2
+   }
+
+   if (!time_dep_attrs_) time_dep_attrs_ = new TimeDepAttrs(this);
+   time_dep_attrs_->addDate(d); // will call  Ecf::incr_state_change_no();
+}
+
+void Node::addDay( const DayAttr& d)
+{
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "Node::addDay\n";
+#endif
+
+   // By disallowing what effect would if have on existing suites ?
+   if (isSuite()) {
+      throw std::runtime_error("Can not add time based dependency on a suite"); // Added at 4.0.2
+   }
+
+   if (!time_dep_attrs_) time_dep_attrs_ = new TimeDepAttrs(this);
+   time_dep_attrs_->addDay(d); // will call  Ecf::incr_state_change_no();
+}
+
+void Node::addCron( const CronAttr& d)
+{
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "Node::addCron()\n";
+#endif
+
+	if (d.time().isNULL()) {
+		throw std::runtime_error("Node::addCron: The cron is in-complete, no time specified");
+	}
+	if (d.time().hasIncrement() && !repeat_.empty()) {
+		std::stringstream ss;
+		ss << "Node::addCron: Node " << absNodePath() << " already has a repeat. Inappropriate to add two looping structures at the same level\n";
+		throw std::runtime_error(ss.str());
+	}
+
+   if (!time_dep_attrs_) time_dep_attrs_ = new TimeDepAttrs(this);
+   time_dep_attrs_->addCron(d); // will call  Ecf::incr_state_change_no();
+}
+
+
+void Node::addLabel( const Label& l)
+{
+   if (child_attrs_) {
+      child_attrs_->addLabel(l); // can throw
+      return;
+   }
+   child_attrs_ = new ChildAttrs(this);
+   child_attrs_->addLabel(l);
+}
+
+void Node::addMeter( const Meter& m)
+{
+//   if ( isSuite() ) {
+//      throw std::runtime_error("Node::addMeter: Can not add meter to a Suite");
+//   }
+
+   if (child_attrs_) {
+      child_attrs_->addMeter(m); // can throw
+      return;
+   }
+   child_attrs_ = new ChildAttrs(this);
+   child_attrs_->addMeter(m);
+}
+
+void Node::addEvent( const Event& e)
+{
+   if (child_attrs_) {
+      child_attrs_->addEvent(e); // can throw
+      return;
+   }
+   child_attrs_ = new ChildAttrs(this);
+   child_attrs_->addEvent(e);
+}
+
+void Node::addLimit(const Limit& l )
+{
+	if (findLimit(l)) {
+		std::stringstream ss;
+		ss << "Add Limit failed: Duplicate Limit of name '" << l.name() << "' already exist for node " << debugNodePath();
+		throw std::runtime_error( ss.str() );
+	}
+	limit_ptr the_limit = boost::make_shared<Limit>(l);
+	the_limit->set_node(this);
+	limitVec_.push_back( the_limit );
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+static void throwIfRepeatAllreadyExists(Node* node)
+{
+	if (!node->repeat().empty()) {
+		std::stringstream ss;
+		ss << "Add Repeat failed: Repeat of name '" << node->repeat().name() << "' already exist for node " << node->debugNodePath();
+		throw std::runtime_error( ss.str() );
+ 	}
+
+	if (!node->crons().empty()) {
+		std::stringstream ss;
+		ss << "Node::addRepeat: Node " << node->absNodePath() << " already has a cron. Inappropriate to add two looping structures at the same level\n";
+		throw std::runtime_error(ss.str());
+	}
+}
+void Node::addRepeat( const Repeat& r ){
+	throwIfRepeatAllreadyExists(this);
+ 	repeat_ = Repeat(r);
+ 	repeat_.update_repeat_genvar();
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void Node::addAutoCancel( const AutoCancelAttr& ac)
+{
+	if (autoCancel_) {
+		std::stringstream ss;
+		ss << "Node::addAutoCancel: A node can only have one Autocancel, see node " << debugNodePath();
+		throw std::runtime_error( ss.str() );
+	}
+	autoCancel_ = new ecf::AutoCancelAttr(ac);
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void Node::addLate( const ecf::LateAttr& l )
+{
+	if (! lateAttr_) {
+		lateAttr_ = new ecf::LateAttr(l);
+	   state_change_no_ = Ecf::incr_state_change_no();
+		return;
+	}
+ 	throw std::runtime_error("Add Late failed: A node can only have one Late attribute, see node " + debugNodePath() );
+}
+
+
+void Node::addVerify( const VerifyAttr& v )
+{
+   if (misc_attrs_) {
+      misc_attrs_->addVerify(v); // can throw
+      return;
+   }
+   misc_attrs_ =  new MiscAttrs(this);
+   misc_attrs_->addVerify(v);
+}
+
+void Node::addZombie( const ZombieAttr& z)
+{
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Node::addZombie()\n";
+#endif
+
+   if (misc_attrs_) {
+      misc_attrs_->addZombie(z); // can throw
+      return;
+   }
+   misc_attrs_ = new MiscAttrs(this);
+   misc_attrs_->addZombie(z);
+
+}
diff --git a/ecflow_4_0_7/ANode/src/NodeChange.cpp b/ecflow_4_0_7/ANode/src/NodeChange.cpp
new file mode 100644
index 0000000..251ec8a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeChange.cpp
@@ -0,0 +1,188 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #33 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/lexical_cast.hpp>
+
+#include "Node.hpp"
+#include "ExprAst.hpp"
+#include "Stl.hpp"
+#include "NState.hpp"
+#include "Ecf.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+
+void Node::changeVariable(const std::string& name,const std::string& value)
+{
+	size_t theSize = varVec_.size();
+	for(size_t i = 0; i < theSize; i++) {
+		if (varVec_[i].name() == name) {
+			varVec_[i].set_value( value );
+			variable_change_no_ = Ecf::incr_state_change_no();
+			return;
+		}
+	}
+ 	throw std::runtime_error("Node::changeVariable: Could not find variable " + name);
+}
+
+bool Node::set_event(const std::string& event_name_or_number ,bool value)
+{
+   if (child_attrs_) return child_attrs_->set_event(event_name_or_number,value);
+	return false;
+}
+
+bool Node::set_event_used_in_trigger(const std::string& event_name_or_number)
+{
+   if (child_attrs_) return child_attrs_->set_event_used_in_trigger(event_name_or_number);
+	return false;
+}
+void Node::changeEvent(const std::string& event_name_or_number,const std::string& setOrClear)
+{
+   if (child_attrs_) return child_attrs_->changeEvent(event_name_or_number,setOrClear);
+}
+void Node::changeEvent(const std::string& event_name_or_number,bool value)
+{
+   if (child_attrs_) {
+      child_attrs_->changeEvent(event_name_or_number,value);
+      return;
+   }
+ 	throw std::runtime_error("Node::changeEvent: Could not find event " + event_name_or_number);
+}
+
+bool Node::set_meter(const std::string& meter_name,int value)
+{
+   if (child_attrs_) return child_attrs_->set_meter(meter_name,value);
+	return false;
+}
+bool Node::set_meter_used_in_trigger(const std::string& meter_name)
+{
+   if (child_attrs_) return child_attrs_->set_meter_used_in_trigger(meter_name);
+	return false;
+}
+void Node::changeMeter(const std::string& meter_name,const std::string& value)
+{
+   if (child_attrs_) {
+      child_attrs_->changeMeter(meter_name,value);
+      return;
+   }
+   throw std::runtime_error("Node::changeMeter: Could not find meter " + meter_name);
+}
+void Node::changeMeter(const std::string& meter_name,int value)
+{
+   if (child_attrs_) {
+      child_attrs_->changeMeter(meter_name,value);
+      return;
+   }
+ 	throw std::runtime_error("Node::changeMeter: Could not find meter " + meter_name);
+}
+
+void Node::changeLabel(const std::string& name,const std::string& value)
+{
+   if (child_attrs_) {
+      child_attrs_->changeLabel(name,value);
+      return;
+   }
+	throw std::runtime_error("Node::changeLabel: Could not find label " + name);
+}
+
+void Node::changeTrigger(const std::string& expression)
+{
+	PartExpression part(expression);
+ 	string parseErrorMsg;
+	std::auto_ptr<AstTop> ast = part.parseExpressions( parseErrorMsg );
+	if (!ast.get()) {
+		std::stringstream ss;
+		ss << "Node::changeTrigger: Failed to parse expression '" << expression << "'.  " << parseErrorMsg;
+		throw std::runtime_error( ss.str() );
+	}
+
+	deleteTrigger();
+	add_trigger( expression );
+}
+
+void Node::changeComplete(const std::string& expression)
+{
+	PartExpression part(expression);
+ 	string parseErrorMsg;
+	std::auto_ptr<AstTop> ast = part.parseExpressions( parseErrorMsg );
+	if (!ast.get()) {
+		std::stringstream ss;
+		ss << "Node::changeComplete: Failed to parse expression '" << expression << "'.  " << parseErrorMsg;
+		throw std::runtime_error( ss.str() );
+	}
+
+	deleteComplete();
+	add_complete( expression );
+}
+
+void Node::changeRepeat(const std::string& value)
+{
+	if (repeat_.empty())  throw std::runtime_error("Node::changeRepeat: Could not find repeat on " + absNodePath());
+ 	repeat_.change( value ); // this can throw std::runtime_error
+}
+
+void Node::increment_repeat()
+{
+   if (repeat_.empty())  throw std::runtime_error("Node::increment_repeat: Could not find repeat on " + absNodePath());
+   repeat_.increment();
+}
+
+void Node::changeLimitMax(const std::string& name,const std::string& maxValue)
+{
+	int theValue = 0;
+ 	try {
+ 		theValue = boost::lexical_cast< int >( maxValue );
+	}
+	catch ( boost::bad_lexical_cast& ) {
+		throw std::runtime_error( "Node::changeLimitMax expected integer value but found " + maxValue);
+	}
+	changeLimitMax(name, theValue);
+}
+
+void Node::changeLimitMax(const std::string& name,int maxValue)
+{
+	limit_ptr limit = find_limit(name);
+	if (!limit.get())  throw std::runtime_error("Node::changeLimitMax: Could not find limit " + name);
+	limit->setLimit( maxValue );
+}
+
+void Node::changeLimitValue(const std::string& name,const std::string& value)
+{
+	int theValue = 0;
+ 	try {
+ 		theValue = boost::lexical_cast< int >( value );
+	}
+	catch ( boost::bad_lexical_cast& ) {
+		throw std::runtime_error( "Node::changeLimitValue expected integer value but found " + value);
+	}
+	changeLimitValue(name,theValue);
+}
+
+void Node::changeLimitValue(const std::string& name,int value)
+{
+	limit_ptr limit = find_limit(name);
+	if (!limit.get())  throw std::runtime_error("Node::changeLimitValue: Could not find limit " + name);
+	limit->setValue( value );
+}
+
+void Node::changeDefstatus(const std::string& theState)
+{
+	if (!DState::isValid(theState)) {
+		throw std::runtime_error( "Node::changeDefstatus expected a state but found " + theState);
+	}
+
+	// Updates state_change_no on the defStatus
+	defStatus_.setState( DState::toState(theState) );
+}
diff --git a/ecflow_4_0_7/ANode/src/NodeContainer.cpp b/ecflow_4_0_7/ANode/src/NodeContainer.cpp
new file mode 100644
index 0000000..6798ced
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeContainer.cpp
@@ -0,0 +1,1000 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #135 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <limits>
+#include <assert.h>
+#include <sstream>
+#include <boost/bind.hpp>
+#include <boost/make_shared.hpp>
+
+#include "NodeContainer.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "JobsParam.hpp"
+#include "NodeTreeVisitor.hpp"
+
+#include "Stl.hpp"
+#include "Indentor.hpp"
+#include "ExprAst.hpp"
+#include "NodeState.hpp"
+#include "Ecf.hpp"
+#include "NodeState.hpp"
+#include "SuiteChanged.hpp"
+#include "DefsDelta.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+//#define DEBUG_FIND_NODE 1
+//#define DEBUG_JOB_SUBMISSION 1
+
+/////////////////////////////////////////////////////////////////////////////////////////
+NodeContainer::NodeContainer( const std::string& name )
+: Node(name),order_state_change_no_(0), add_remove_state_change_no_(0) {}
+NodeContainer::NodeContainer()
+: order_state_change_no_(0),add_remove_state_change_no_(0) {}
+NodeContainer::~NodeContainer() {}
+
+void NodeContainer::accept(ecf::NodeTreeVisitor& v)
+{
+	v.visitNodeContainer(this);
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)   { nodeVec_[t]->accept(v); }
+}
+
+void NodeContainer::acceptVisitTraversor(ecf::NodeTreeVisitor& v)
+{
+	v.visitNodeContainer(this);
+}
+
+void NodeContainer::begin()
+{
+	Node::begin();
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++)   { nodeVec_[t]->begin(); }
+ 	handle_defstatus_propagation();
+}
+
+void NodeContainer::requeue(
+         bool resetRepeats,
+         int clear_suspended_in_child_nodes,
+         bool reset_next_time_slot
+         )
+{
+//	LOG(Log::DBG,"   " << debugType() << "::requeue() " << absNodePath() << " resetRepeats = " << resetRepeats);
+	Node::requeue(resetRepeats,clear_suspended_in_child_nodes,reset_next_time_slot);
+
+	// For negative numbers, do nothing, i.e do not clear
+	if (clear_suspended_in_child_nodes >=0) clear_suspended_in_child_nodes++;
+
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++) {
+ 	   nodeVec_[t]->requeue(true /*reset child repeats. Moot for tasks*/,
+ 	                        clear_suspended_in_child_nodes,
+ 	                        reset_next_time_slot);
+ 	}
+   handle_defstatus_propagation();
+}
+
+void NodeContainer::requeue_time_attrs()
+{
+   Node::requeue_time_attrs();
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++) {
+      nodeVec_[t]->requeue_time_attrs();
+   }
+}
+
+void NodeContainer::handle_defstatus_propagation()
+{
+   if ( defStatus_ == DState::COMPLETE ) {
+       /// A defstatus of complete and *ONLY* complete should always be applied
+       /// hierarchically downwards
+       setStateOnlyHierarchically(NState::COMPLETE);
+    }
+    else if ( defStatus_ == DState::default_state() ) {
+       /// Reflect that the status of the children.
+       /// *However* do NOT override the defstatus setting
+       NState::State theSignificantStateOfImmediateChildren = computedState( Node::IMMEDIATE_CHILDREN );
+       if ( theSignificantStateOfImmediateChildren != state()) {
+          setStateOnly( theSignificantStateOfImmediateChildren );
+       }
+    }
+}
+
+void NodeContainer::resetRelativeDuration()
+{
+	Node::resetRelativeDuration();
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)     { nodeVec_[t]->resetRelativeDuration(); }
+}
+
+bool NodeContainer::run(JobsParam& jobsParam, bool force)
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)     { (void) nodeVec_[t]->run(jobsParam,force); }
+	return jobsParam.getErrorMsg().empty();
+}
+
+void NodeContainer::kill(const std::string& /* zombie_pid, only valid for single task */)
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)   {     nodeVec_[t]->kill(); }
+}
+
+void NodeContainer::status()
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)   {     nodeVec_[t]->status(); }
+}
+
+void NodeContainer::top_down_why(std::vector<std::string>& theReasonWhy) const
+{
+	Node::why(theReasonWhy);
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)   {     nodeVec_[t]->top_down_why(theReasonWhy); }
+}
+
+void NodeContainer::incremental_changes( DefsDelta& changes, compound_memento_ptr& comp) const
+{
+   /// There no point doing a OrderMemento if children have been added/delete
+   if (add_remove_state_change_no_ > changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(absNodePath());
+      comp->add( boost::make_shared<ChildrenMemento>( nodeVec_ ) );
+   }
+   else if (order_state_change_no_ > changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(absNodePath());
+      std::vector<std::string> order_vec; order_vec.reserve(nodeVec_.size());
+      size_t node_vec_size = nodeVec_.size();
+      for(size_t i =0; i < node_vec_size; i++)  order_vec.push_back( nodeVec_[i]->name());
+      comp->add( boost::make_shared<OrderMemento>( order_vec ) );
+   }
+
+   Node::incremental_changes(changes, comp);
+}
+
+void NodeContainer::set_memento( const OrderMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+   std::cout << "NodeContainer::set_memento( const OrderMemento* ) " << debugNodePath() << "\n";
+#endif
+
+   // Order nodeVec_ according to memento ordering
+   const std::vector<std::string>& order = memento->order_;
+   if (order.size() != nodeVec_.size()) {
+      // something gone wrong.
+      std::cout << "NodeContainer::set_memento OrderMemento, memento.size() " << order.size() << " Not the same as nodeVec_size() " << nodeVec_.size() << "\n";
+      return;
+   }
+
+   std::vector<node_ptr> vec; vec.reserve(nodeVec_.size());
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t i = 0; i < order.size(); i++) {
+      for(size_t t = 0; t < node_vec_size; t++) {
+          if (order[i] == nodeVec_[t]->name()) {
+             vec.push_back(nodeVec_[t]);
+             break;
+          }
+       }
+   }
+   if (vec.size() !=  nodeVec_.size()) {
+       std::cout << "NodeContainer::set_memento could not find all the names\n";
+       return;
+   }
+
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ORDER);
+   nodeVec_ = vec;
+}
+
+void NodeContainer::set_memento( const ChildrenMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+   std::cout << "NodeContainer::set_memento( const OrderMemento* ) " << debugNodePath() << "\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ADD_REMOVE_NODE);
+   nodeVec_ = memento->children_;
+
+   // setup child parent pointers
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++)   {
+      nodeVec_[t]->set_parent(this);
+   }
+}
+
+
+void NodeContainer::collateChanges(DefsDelta& changes) const
+{
+   /// There no point in traversing children of we have added/removed children
+   /// since ChildrenMemento will copy all children.
+   if (add_remove_state_change_no_ > changes.client_state_change_no()) {
+      return;
+   }
+
+	// Traversal to children
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++)   { nodeVec_[t]->collateChanges(changes); }
+}
+
+void NodeContainer::order(Node* immediateChild, NOrder::Order ord)
+{
+	SuiteChanged1 changed(suite());
+	switch (ord) {
+		case NOrder::TOP:  {
+			for(std::vector<node_ptr>::iterator i = nodeVec_.begin(); i != nodeVec_.end(); ++i) {
+ 				if ((*i).get() == immediateChild) {
+ 					node_ptr node = (*i);
+					nodeVec_.erase(i);
+					nodeVec_.insert(nodeVec_.begin(),node);
+               order_state_change_no_ = Ecf::incr_state_change_no();
+					return;
+ 				}
+			}
+			throw std::runtime_error("NodeContainer::order TOP, immediate child not found");
+		}
+		case NOrder::BOTTOM:  {
+			for(std::vector<node_ptr>::iterator i = nodeVec_.begin(); i != nodeVec_.end(); ++i) {
+ 				if ((*i).get() == immediateChild) {
+ 					node_ptr node = (*i);
+					nodeVec_.erase(i);
+					nodeVec_.push_back(node);
+               order_state_change_no_ = Ecf::incr_state_change_no();
+					return;
+ 				}
+			}
+         throw std::runtime_error("NodeContainer::order BOTTOM, immediate child not found");
+		}
+		case NOrder::ALPHA:  {
+			std::sort(nodeVec_.begin(),nodeVec_.end(),
+			            boost::bind(Str::caseInsLess,
+			                          boost::bind(&Node::name,_1),
+			                          boost::bind(&Node::name,_2)));
+         order_state_change_no_ = Ecf::incr_state_change_no();
+			break;
+		}
+		case NOrder::ORDER:  {
+			std::sort(nodeVec_.begin(),nodeVec_.end(),
+			            boost::bind(Str::caseInsGreater,
+			                          boost::bind(&Node::name,_1),
+			                          boost::bind(&Node::name,_2)));
+         order_state_change_no_ = Ecf::incr_state_change_no();
+			break;
+		}
+		case NOrder::UP:  {
+			for(size_t t = 0; t  < nodeVec_.size();t++) {
+				if ( nodeVec_[t].get() == immediateChild) {
+					if (t != 0) {
+						node_ptr node =  nodeVec_[t];
+						nodeVec_.erase(nodeVec_.begin()+t);
+						t--;
+						nodeVec_.insert(nodeVec_.begin()+t,node);
+                  order_state_change_no_ = Ecf::incr_state_change_no();
+				    }
+					return;
+ 				}
+			}
+         throw std::runtime_error("NodeContainer::order UP, immediate child not found");
+		}
+		case NOrder::DOWN: {
+		   for(size_t t = 0; t  < nodeVec_.size();t++) {
+		      if ( nodeVec_[t].get() == immediateChild) {
+		         if (t != nodeVec_.size()-1) {
+		            node_ptr node =  nodeVec_[t];
+		            nodeVec_.erase(nodeVec_.begin()+t);
+		            t++;
+		            nodeVec_.insert(nodeVec_.begin()+t,node);
+		            order_state_change_no_ = Ecf::incr_state_change_no();
+		         }
+		         return;
+		      }
+		   }
+         throw std::runtime_error("NodeContainer::order DOWN, immediate child not found");
+		}
+	}
+}
+
+void NodeContainer::calendarChanged(
+         const ecf::Calendar& c,
+         std::vector<node_ptr>& auto_cancelled_nodes)
+{
+	Node::calendarChanged(c,auto_cancelled_nodes);
+
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->calendarChanged(c,auto_cancelled_nodes); }
+}
+
+bool NodeContainer::hasAutoCancel() const
+{
+	if (Node::hasAutoCancel()) return true;
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++)     { if (nodeVec_[t]->hasAutoCancel()) return true; }
+	return false;
+}
+
+bool NodeContainer::resolveDependencies(JobsParam& jobsParam)
+{
+	// Don't evaluate children unless parent is free. BOMB out early for this case.
+	// Note:: Task::resolveDependencies() will check inLimit up front. *** THIS CHECKS UP THE HIERARCHY ***
+	// Note:: Node::resolveDependencies() may have forced family node to complete, should have have
+	//        returned false in this case, to stop any job submission
+	if ( ! Node::resolveDependencies(jobsParam) ) {
+
+#ifdef DEBUG_JOB_SUBMISSION
+		LOG(Log::DBG, "   NodeContainer::resolveDependencies " << absNodePath() << " could not resolve dependencies, may have completed");
+		cout << "NodeContainer::resolveDependencies " << absNodePath() << " could not resolve dependencies may have completed" << endl;
+#endif
+		return false;
+	}
+
+   /// During *top down* traversal we check in limits at this level. Done here rather than
+	/// in Node::resolveDependencies(). Otherwise this particular check will get duplicated
+	/// since the task, will do *bottom up* traversal.
+   if (!check_in_limit()) {
+#ifdef DEBUG_DEPENDENCIES
+      LOG(Log::DBG,"   NodeContainer::resolveDependencies() " << absNodePath() << " HOLDING due to inLIMIT");
+#endif
+      return false;
+   }
+
+	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++) {
+ 		// Note: we don't bomb out early here. Since a later child could be free. i.e f1/ty or t4
+ 		// child t1 holding
+ 		// child t2 holding
+ 		// child f1 free
+ 		//   child tx holding
+ 		//   child ty free
+ 		// child t3 holding
+ 		// child t4 free
+  		(void) nodeVec_[t]->resolveDependencies(jobsParam) ;
+ 	}
+ 	return true;
+}
+
+NState::State NodeContainer::computedState(Node::TraverseType traverseType) const
+{
+	if (nodeVec_.empty()) {
+		/// Note: theComputedNodeState will return unknown if no children, in this
+		/// case just return the current state.
+		return state();
+	}
+
+	// returns the computed state depending on traverseType
+	// If not IMMEDIATE_CHILDREN, will recurse down calling each child's computedState() function
+  	return ecf::theComputedNodeState(nodeVec_, (traverseType == Node::IMMEDIATE_CHILDREN) );
+}
+
+node_ptr NodeContainer::removeChild(Node* child)
+{
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++)     {
+ 		if (nodeVec_[t].get() == child) {
+ 			node_ptr node = boost::dynamic_pointer_cast<Node>(nodeVec_[t]);
+ 			child->set_parent(NULL); // must set to NULL, allows it to be re-added to different parent
+ 			nodeVec_.erase( nodeVec_.begin() + t);
+ 			add_remove_state_change_no_ = Ecf::incr_state_change_no();
+ 			return node ;
+ 		}
+  	}
+	// Should never happen
+ 	LOG_ASSERT(false,"NodeContainer::removeChild: Could not remove child");
+	return node_ptr();
+}
+
+bool NodeContainer::addChild( node_ptr child, size_t position)
+{
+	// *** CANT construct shared_ptr from a raw pointer, must use dynamic_pointer_cast,
+	// *** otherwise the reference counts will get messed up.
+	try {
+		if ( child->isTask() ) {
+			// can throw if duplicate names
+			addTask( boost::dynamic_pointer_cast<Task>(child), position );
+			return true;
+		}
+
+		if ( child->isFamily() ) {
+			// can throw if duplicate names
+			addFamily( boost::dynamic_pointer_cast<Family>(child), position );
+			return true;
+		}
+	}
+	catch  ( std::runtime_error &e) {}
+
+	// Duplicate names, or trying to add a Suite?
+	return false;
+}
+
+bool NodeContainer::isAddChildOk( Node* theChild, std::string& errorMsg) const
+{
+	Task* theTaskChild = theChild->isTask();
+	if ( theTaskChild ) {
+
+		task_ptr theTask = findTask(theChild->name());
+		if (!theTask.get())  return true;
+
+		std::stringstream ss;
+		ss << "Task of name " << theChild->name() << " already exist in container node " << name() ;
+		errorMsg += ss.str();
+		return false;
+ 	}
+
+	Family* theFamilyChild = theChild->isFamily();
+	if ( theFamilyChild ) {
+
+		family_ptr theFamily = findFamily(theChild->name());
+		if (!theFamily.get())  return true;
+
+		std::stringstream ss;
+		ss << "Family of name " << theChild->name() << " already exist in container node " << name() ;
+		errorMsg += ss.str();
+		return false;
+ 	}
+
+	Suite* theSuite = theChild->isSuite();
+	if ( theSuite ) {
+		errorMsg += "Can not add a suite as child.";
+		return false;
+	}
+
+	errorMsg += "Unknown node type";
+	return false;
+}
+
+void NodeContainer::handleStateChange()
+{
+	// Increment any repeats & requeue
+	requeueOrSetMostSignificantStateUpNodeTree();
+}
+
+size_t NodeContainer::child_position(const Node* child) const
+{
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++)     {
+      if (nodeVec_[t].get() == child) {
+         return t;
+      }
+   }
+   return std::numeric_limits<std::size_t>::max();
+}
+
+task_ptr NodeContainer::add_task(const std::string& task_name)
+{
+   if (findTask(task_name).get()) {
+      std::stringstream ss;
+      ss << "Add Task failed: A task of name '" << task_name << "' already exist on node " << debugNodePath();
+      throw std::runtime_error( ss.str() );
+   }
+   task_ptr the_task = Task::create(task_name);
+   add_task_only(the_task);
+   return the_task;
+}
+
+family_ptr NodeContainer::add_family(const std::string& family_name)
+{
+   if (findFamily(family_name).get()) {
+      std::stringstream ss;
+      ss << "Add Family failed: A Family of name '" << family_name << "' already exist on node " << debugNodePath();
+      throw std::runtime_error( ss.str() );
+   }
+   family_ptr the_family = Family::create(family_name);
+   add_family_only( the_family );
+   return the_family;
+}
+
+void NodeContainer::addTask(task_ptr t,size_t position)
+{
+	if (findTask(t->name()).get()) {
+		std::stringstream ss;
+		ss << "Add Task failed: A task of name '" << t->name() << "' already exist on node " << debugNodePath();
+		throw std::runtime_error( ss.str() );
+	}
+	add_task_only( t, position);
+}
+
+void NodeContainer::add_task_only( task_ptr t, size_t position)
+{
+   if (t->parent()) {
+      std::stringstream ss;
+      ss << debugNodePath() << ": Add Task failed: A task of name '" << t->name() << "' is already owned by another node" ;
+      throw std::runtime_error( ss.str() );
+   }
+
+   t->set_parent(this);
+   if (position >= nodeVec_.size()) {
+      nodeVec_.push_back( t );
+   }
+   else {
+      nodeVec_.insert( nodeVec_.begin() + position, t);
+   }
+   add_remove_state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void NodeContainer::add_family_only( family_ptr f, size_t position)
+{
+   if (f->parent()) {
+      std::stringstream ss;
+      ss << debugNodePath() << ": Add Family failed: A family of name '" << f->name() << "' is already owned by another node";
+      throw std::runtime_error( ss.str() );
+   }
+
+   f->set_parent(this);
+   if (position >= nodeVec_.size()) {
+      nodeVec_.push_back( f );
+   }
+   else {
+      nodeVec_.insert( nodeVec_.begin() + position, f);
+   }
+   add_remove_state_change_no_ = Ecf::incr_state_change_no();
+}
+
+
+void NodeContainer::addFamily(family_ptr f,size_t position)
+{
+	if (findFamily(f->name()).get()) {
+		std::stringstream ss;
+		ss << "Add Family failed: A Family of name '" << f->name() << "' already exist on node " << debugNodePath();
+		throw std::runtime_error( ss.str() );
+	}
+	add_family_only( f, position );
+}
+
+node_ptr NodeContainer::findImmediateChild(const std::string& theName, size_t& child_pos) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++) {
+		if (nodeVec_[t]->name() == theName) {
+		   child_pos = t;
+	 		return nodeVec_[t];
+ 		}
+ 	}
+   child_pos = std::numeric_limits<std::size_t>::max();
+	return node_ptr();
+}
+
+node_ptr NodeContainer::find_node_up_the_tree(const std::string& the_name) const
+{
+   if (name() == the_name) {
+      return non_const_this();
+   }
+
+   size_t not_used;
+   node_ptr fnd_node = findImmediateChild(the_name,not_used);
+   if (fnd_node) return fnd_node;
+
+   Node* the_parent = parent();
+   if (the_parent) return the_parent->find_node_up_the_tree(the_name);
+   return node_ptr();
+}
+
+
+node_ptr NodeContainer::find_relative_node( const std::vector< std::string >& pathToNode)
+{
+//#ifdef DEBUG_FIND_NODE
+//	cout << "NodeContainer::find_relative_node for '" << name()
+//		 << "' path = '" << pathToNode << "\n";
+//    cout << " tasks = ";  BOOST_FOREACH(task_ptr t, nodeVec_ ) { cout << " " << t->name(); } cout << "\n";
+//    cout << " family = "; BOOST_FOREACH(family_ptr f, familyVec_ ) { cout << " " << f->name();} cout << "\n";
+//#endif
+ 	if (pathToNode.empty())  return node_ptr();
+	int pathSize = static_cast<int>(pathToNode.size());
+
+#ifdef DEBUG_FIND_NODE
+	cout << "NodeContainer::find_relative_node name = '" << name() << "' pathToNode[0] = '" << pathToNode[0] << "'\n";
+#endif
+
+ 	if (pathSize == 1 && name() == pathToNode[0]) {
+ 		// Match the Container i.e family or suite
+   	return shared_from_this();
+ 	}
+
+ 	// Must match all children
+	int index = 0;
+ 	size_t child_pos = 0 ; // unused
+ 	node_ptr the_node = shared_from_this();
+ 	while (index < pathSize) {
+      the_node = the_node->findImmediateChild(pathToNode[index],child_pos);
+      if (the_node) {
+         if (index == pathSize - 1) return the_node;
+         index++;
+      }
+      else {
+         return node_ptr();
+      }
+ 	}
+ 	return node_ptr();
+}
+
+void NodeContainer::find_closest_matching_node( const std::vector< std::string >& pathToNode, int indexIntoPathNode, node_ptr& closest_matching_node )
+{
+	int pathSize = static_cast<int>(pathToNode.size());
+	if (indexIntoPathNode >= pathSize)  return;
+
+	int index = indexIntoPathNode;
+ 	if (name() == pathToNode[indexIntoPathNode]) {
+
+ 		closest_matching_node = shared_from_this();
+
+ 		// Match the Container i.e family or suite
+ 		bool lastIndex = ( indexIntoPathNode == pathSize - 1);
+ 		if ( lastIndex ) {
+ 			return;
+		}
+
+		// Match the Children, i.e. go down the hierarchy
+		index++;
+		match_closest_children(pathToNode,index,closest_matching_node);
+ 	}
+}
+
+void NodeContainer::match_closest_children(const std::vector<std::string>& pathToNode, int indexIntoPathNode, node_ptr& closest_matching_node)
+{
+	int pathSize = static_cast<int>(pathToNode.size());
+	if (indexIntoPathNode >= pathSize)  return;
+
+	bool lastIndex = ( indexIntoPathNode == pathSize - 1);
+	if ( lastIndex ) {
+		// even if the name matches, its only valid if the index is the last index
+		// i.e if we have a suite like /a/b/c/d/e
+		//     and a path like         /a/b/c/d/e/f/g
+		// In this we will match with e but it not valid since its not the last index
+		size_t task_vec_size = nodeVec_.size();
+		for(size_t t = 0; t < task_vec_size; t++) {
+			if (nodeVec_[t]->name() == pathToNode[indexIntoPathNode]) {
+				closest_matching_node = nodeVec_[t];
+				return;
+			}
+		}
+	}
+	else {
+		// Path to node is of the form "/family/task" or "/family/family/task"
+		// Path to node is of the form "/suite/task" or "/suite/family/task"
+		size_t family_vec_size = nodeVec_.size();
+		for(size_t f = 0; f < family_vec_size; f++) {
+			Family* family = nodeVec_[f]->isFamily();
+			if (family) {
+				node_ptr matching_node;
+				family->find_closest_matching_node(pathToNode, indexIntoPathNode,matching_node);
+				if (matching_node.get()) {
+					closest_matching_node = matching_node;
+					return;
+				}
+			}
+		}
+	}
+}
+
+family_ptr NodeContainer::findFamily(const std::string& familyName) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t f = 0; f < node_vec_size; f++) {
+ 		if (nodeVec_[f]->name() == familyName && nodeVec_[f]->isFamily()) {
+	 		return boost::dynamic_pointer_cast<Family>(nodeVec_[f]);
+ 		}
+	}
+	return family_ptr();
+}
+
+task_ptr NodeContainer::findTask(const std::string& taskName) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++) {
+ 		if (nodeVec_[t]->name() == taskName && nodeVec_[t]->isTask()) {
+	 		return boost::dynamic_pointer_cast<Task>(nodeVec_[t]);
+ 		}
+	}
+	return task_ptr();
+}
+
+bool NodeContainer::hasTimeDependencies() const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)  { if (nodeVec_[t]->hasTimeDependencies()) return true;}
+ 	return false;
+}
+
+void NodeContainer::immediateChildren(std::vector<node_ptr>& theChildren) const
+{
+	size_t task_vec_size = nodeVec_.size();
+	theChildren.reserve( theChildren.size() + task_vec_size);
+	for(size_t t = 0; t < task_vec_size; t++) {
+ 		theChildren.push_back( nodeVec_[t] );
+	}
+}
+
+void NodeContainer::allChildren(std::set<Node*>& theSet) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t f = 0; f < node_vec_size; f++) {
+		theSet.insert(nodeVec_[f].get());
+		nodeVec_[f]->allChildren(theSet);
+	}
+}
+
+void NodeContainer::getAllFamilies(std::vector<Family*>& vec) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t f = 0; f < node_vec_size; f++) {
+		Family* family =  nodeVec_[f]->isFamily();
+		if ( family ) {
+			vec.push_back(family);
+			family->getAllFamilies(vec);
+		}
+	}
+}
+
+void NodeContainer::getAllNodes(std::vector<Node*>& vec) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++) {
+	   vec.push_back(nodeVec_[t].get());
+	   nodeVec_[t]->getAllNodes(vec);
+	}
+}
+
+void NodeContainer::getAllTasks(std::vector<Task*>& tasks) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)   {
+	   nodeVec_[t]->getAllTasks(tasks);
+	}
+}
+
+void NodeContainer::getAllSubmittables(std::vector<Submittable*>& tasks) const
+{
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++)   {
+      nodeVec_[t]->getAllSubmittables(tasks);
+   }
+}
+
+void NodeContainer::get_all_active_submittables(std::vector<Submittable*>& tasks) const
+{
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++)   {
+      nodeVec_[t]->get_all_active_submittables(tasks);
+   }
+}
+
+void NodeContainer::get_all_tasks(std::vector<task_ptr>& tasks) const
+{
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++)   {
+      nodeVec_[t]->get_all_tasks(tasks);
+   }
+}
+
+void NodeContainer::get_all_nodes(std::vector<node_ptr>& nodes) const
+{
+   nodes.push_back(non_const_this());
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++)   {
+      nodeVec_[t]->get_all_nodes(nodes);
+   }
+}
+
+void NodeContainer::get_all_aliases(std::vector<alias_ptr>& aliases) const
+{
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++)   {
+      nodeVec_[t]->get_all_aliases(aliases);
+   }
+}
+
+void NodeContainer::getAllAstNodes(std::set<Node*>& vec) const
+{
+	Node::getAllAstNodes(vec);
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++)     { nodeVec_[t]->getAllAstNodes(vec); }
+}
+
+bool NodeContainer::check(std::string& errorMsg, std::string& warningMsg) const
+{
+	Node::check(errorMsg, warningMsg);
+
+	// recursive to handle hierarchical families
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++) {
+ 		nodeVec_[t]->check(errorMsg,warningMsg);
+      // if (!errorMsg.empty()) break;
+  	}
+
+	return errorMsg.empty();
+}
+
+std::vector<task_ptr> NodeContainer::taskVec() const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	std::vector<task_ptr> vec; vec.reserve(node_vec_size);
+	for(size_t t = 0; t < node_vec_size; t++)   {
+ 		if (nodeVec_[t]->isTask()) {
+ 			vec.push_back( boost::dynamic_pointer_cast<Task>(nodeVec_[t]) );
+		}
+	}
+	return vec;
+}
+
+std::vector<family_ptr> NodeContainer::familyVec() const
+{
+	std::vector<family_ptr> vec;
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++)   {
+ 		if (nodeVec_[t]->isFamily()) {
+ 			vec.push_back( boost::dynamic_pointer_cast<Family>(nodeVec_[t]) );
+		}
+	}
+	return vec;
+}
+
+bool NodeContainer::operator==(const NodeContainer& rhs) const
+{
+	size_t node_vec_size = nodeVec_.size();
+	if ( node_vec_size != rhs.nodeVec_.size()) {
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "NodeContainer::operator==  node_vec_size != rhs.nodeVec_.size() " << absNodePath() << "\n";
+			std::cout << "   nodeVec_.size() = " << node_vec_size << "  rhs.nodeVec_.size() = " << rhs.nodeVec_.size() << "\n";
+		}
+#endif
+ 		return false;
+	}
+
+	for(size_t i =0; i < node_vec_size; ++i) {
+
+		Task* task = nodeVec_[i]->isTask();
+		if (task) {
+			Task* rhs_task = rhs.nodeVec_[i]->isTask();
+			if ( !rhs_task ) {
+#ifdef DEBUG
+				if (Ecf::debug_equality()) {
+					std::cout << "NodeContainer::operator==  if ( !rhs_task ) " << absNodePath() << "\n";
+				}
+#endif
+				return false;
+			}
+
+			if ( !( *task == *rhs_task )) {
+#ifdef DEBUG
+				if (Ecf::debug_equality()) {
+					std::cout << "NodeContainer::operator==  if ( !( *task == *rhs_task )) " << absNodePath() << "\n";
+				}
+#endif
+				return false;
+			}
+		}
+		else {
+			Family* rhs_family = rhs.nodeVec_[i]->isFamily();
+			if ( !rhs_family ) {
+#ifdef DEBUG
+				if (Ecf::debug_equality()) {
+					std::cout << "NodeContainer::operator==  if ( !rhs_family ) " << absNodePath() << "\n";
+				}
+#endif
+				return false;
+			}
+
+			Family* family = nodeVec_[i]->isFamily(); LOG_ASSERT( family, "" );
+			if ( !( *family == *rhs_family )) {
+#ifdef DEBUG
+				if (Ecf::debug_equality()) {
+					std::cout << "NodeContainer::operator==  if ( !( *family == *rhs_family )) " << absNodePath() << "\n";
+				}
+#endif
+				return false;
+			}
+		}
+	}
+
+	return Node::operator==(rhs);
+}
+
+std::ostream& NodeContainer::print(std::ostream& os) const
+{
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->print( os ); }
+ 	return os;
+}
+
+bool NodeContainer::checkInvariants(std::string& errorMsg) const
+{
+   if (!Node::checkInvariants(errorMsg)) return false;
+
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++) {
+      if (nodeVec_[t]->parent() != this) {
+         errorMsg += "NodeContainer::checkInvariants family/task parent() not correct";
+         return false;
+      }
+      if (!nodeVec_[t]->checkInvariants(errorMsg)) {
+         return false;
+      }
+   }
+   return true;
+}
+
+void NodeContainer::verification(std::string& errorMsg) const
+{
+ 	Node::verification(errorMsg);
+ 	size_t node_vec_size = nodeVec_.size();
+ 	for(size_t t = 0; t < node_vec_size; t++)  { nodeVec_[t]->verification(errorMsg); }
+}
+
+void NodeContainer::setRepeatToLastValueHierarchically()
+{
+	setRepeatToLastValue();
+ 	size_t node_vec_size = nodeVec_.size();
+  	for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->setRepeatToLastValueHierarchically(); }
+}
+
+void NodeContainer::setStateOnlyHierarchically(NState::State s,bool force)
+{
+	setStateOnly(s,force);
+ 	size_t node_vec_size = nodeVec_.size();
+	for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->setStateOnlyHierarchically(s,force); }
+}
+
+void NodeContainer::set_state_hierarchically(NState::State s, bool force)
+{
+	setStateOnlyHierarchically(s,force);
+	if (force) {
+	   // *force* is only set via ForceCmd.
+	   update_limits();  // hierarchical
+	}
+	handleStateChange(); // non-hierarchical
+}
+
+void NodeContainer::update_limits()
+{
+   /// Only tasks can affect the limits, hence no point calling locally
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->update_limits(); }
+}
+
+bool NodeContainer::doDeleteChild(Node* child)
+{
+	SuiteChanged1 changed(suite());
+	std::vector<node_ptr>::iterator theTaskEnd = nodeVec_.end();
+ 	for(std::vector<node_ptr>::iterator t = nodeVec_.begin(); t!=theTaskEnd; ++t) {
+ 		if ( (*t).get() == child) {
+ 		   child->set_parent(NULL); // must set to NULL, allow it to be re-added to different parent
+  			nodeVec_.erase(t);
+         add_remove_state_change_no_ = Ecf::incr_state_change_no();
+         set_most_significant_state_up_node_tree();
+  			return true;
+ 		}
+		if ((*t)->doDeleteChild(child)) {
+ 			return true;
+ 		}
+ 	}
+
+ 	return false;
+}
+
+void NodeContainer::check_job_creation( job_creation_ctrl_ptr jobCtrl) {
+
+	if (defStatus() != DState::COMPLETE) {
+	 	size_t node_vec_size = nodeVec_.size();
+		for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->check_job_creation( jobCtrl ); }
+ 	}
+}
+
+void NodeContainer::generate_scripts( const std::map<std::string,std::string>& override) const
+{
+   size_t node_vec_size = nodeVec_.size();
+   for(size_t t = 0; t < node_vec_size; t++) {
+      nodeVec_[t]->generate_scripts( override );
+   }
+}
diff --git a/ecflow_4_0_7/ANode/src/NodeContainer.hpp b/ecflow_4_0_7/ANode/src/NodeContainer.hpp
new file mode 100644
index 0000000..59bf464
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeContainer.hpp
@@ -0,0 +1,151 @@
+#ifndef NODE_CONTAINER_HPP_
+#define NODE_CONTAINER_HPP_
+
+//============================================================================
+// Name        : NodeContainer.hpp
+// Author      : Avi
+// Revision    : $Revision: #88 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : A class that holds families and tasks
+//============================================================================
+
+#include <limits>
+#include "Node.hpp"
+
+class NodeContainer : public Node {
+public:
+	NodeContainer ( const std::string& name );
+	NodeContainer();
+	virtual ~NodeContainer();
+
+	virtual void accept(ecf::NodeTreeVisitor&);
+	virtual void acceptVisitTraversor(ecf::NodeTreeVisitor& v);
+	virtual void begin();
+	virtual void requeue( bool resetRepeats,
+	                        int clear_suspended_in_child_nodes,
+	                        bool reset_next_time_slot);
+   virtual void requeue_time_attrs();
+	virtual void resetRelativeDuration();
+	virtual bool run(JobsParam& jobsParam, bool force);
+	virtual void kill(const std::string& zombie_pid = "");
+	virtual void status();
+	virtual void top_down_why(std::vector<std::string>& theReasonWhy) const;
+	virtual void collateChanges(DefsDelta&) const;
+   void set_memento(const OrderMemento* );
+   void set_memento(const ChildrenMemento* );
+   virtual void order(Node* immediateChild, NOrder::Order);
+
+	virtual bool hasAutoCancel() const;
+ 	virtual void calendarChanged(const ecf::Calendar&,std::vector<node_ptr>& auto_cancelled_nodes);
+ 	virtual bool resolveDependencies(JobsParam& );
+ 	virtual bool check(std::string& errorMsg, std::string& warningMsg) const;
+
+   task_ptr add_task(const std::string& task_name);
+   family_ptr add_family(const std::string& family_name);
+ 	void addTask( task_ptr , size_t position = std::numeric_limits<std::size_t>::max());
+ 	void addFamily( family_ptr, size_t position = std::numeric_limits<std::size_t>::max());
+
+	virtual void immediateChildren(std::vector<node_ptr>&) const;
+ 	virtual void allChildren(std::set<Node*>&) const;
+
+ 	virtual node_ptr findImmediateChild(const std::string& name,size_t& child_pos) const;
+   virtual node_ptr find_node_up_the_tree(const std::string& name) const;
+
+	virtual node_ptr find_relative_node(const std::vector<std::string>& pathToNode);
+	void find_closest_matching_node( const std::vector< std::string >& pathToNode, int indexIntoPathNode, node_ptr& closest_matching_node );
+
+	family_ptr findFamily(const std::string& familyName) const;
+	task_ptr findTask(const std::string& taskName) const;
+	void getAllFamilies(std::vector<Family*>&) const;
+	virtual void getAllNodes(std::vector<Node*>&) const;
+   virtual void getAllTasks(std::vector<Task*>&) const;
+   virtual void getAllSubmittables(std::vector<Submittable*>&) const;
+   virtual void get_all_active_submittables(std::vector<Submittable*>&) const;
+   virtual void get_all_tasks(std::vector<task_ptr>&) const;
+   virtual void get_all_nodes(std::vector<node_ptr>&) const;
+   virtual void get_all_aliases(std::vector<alias_ptr>&) const;
+	virtual void getAllAstNodes(std::set<Node*>&) const;
+ 	const std::vector<node_ptr>& nodeVec() const { return nodeVec_;}
+ 	std::vector<task_ptr> taskVec() const;
+ 	std::vector<family_ptr> familyVec() const;
+
+	std::ostream& print(std::ostream&) const;
+	bool operator==(const NodeContainer& rhs) const;
+
+	virtual bool hasTimeDependencies() const;
+
+	virtual void check_job_creation( job_creation_ctrl_ptr jobCtrl);
+   virtual void generate_scripts( const std::map<std::string,std::string>& override) const;
+
+	virtual bool checkInvariants(std::string& errorMsg) const;
+ 	virtual void verification(std::string& errorMsg) const;
+
+	virtual NState::State computedState(Node::TraverseType) const;
+
+ 	virtual node_ptr removeChild( Node* child);
+ 	virtual bool addChild( node_ptr child,size_t position = std::numeric_limits<std::size_t>::max());
+ 	virtual bool isAddChildOk( Node* child, std::string& errorMsg) const;
+
+ 	virtual void setRepeatToLastValueHierarchically();
+	virtual void setStateOnlyHierarchically(NState::State s,bool force = false);
+	virtual void set_state_hierarchically(NState::State s, bool force);
+   virtual void update_limits();
+
+private:
+   virtual size_t child_position(const Node*) const;
+   void add_task_only( task_ptr ,size_t position = std::numeric_limits<std::size_t>::max());
+   void add_family_only( family_ptr ,size_t position = std::numeric_limits<std::size_t>::max());
+
+	void handle_defstatus_propagation();
+	void match_closest_children(const std::vector<std::string>& pathToNode, int indexIntoPathToNode,node_ptr& closest_matching_node);
+
+	virtual void handleStateChange(); // called when a state change happens
+
+	friend class Defs;
+	friend class Family;
+  	virtual bool doDeleteChild(Node* child);
+
+	/// For use by python interface,
+	std::vector<node_ptr>::const_iterator node_begin() const { return nodeVec_.begin();}
+	std::vector<node_ptr>::const_iterator node_end() const { return nodeVec_.end();}
+	friend void export_SuiteAndFamily();
+
+protected:
+   unsigned int order_state_change_no_;     // no need to persist
+   unsigned int add_remove_state_change_no_;// no need to persist
+
+   void incremental_changes( DefsDelta& changes, compound_memento_ptr& comp) const;
+
+private:
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize(Archive & ar, const unsigned int /*version*/)
+	{
+	   ar.register_type(static_cast<Task *>(NULL));
+	   ar.register_type(static_cast<Family *>(NULL));
+
+	   // serialise base class information
+	   ar & boost::serialization::base_object<Node>(*this);
+	   ar & nodeVec_;
+
+      // Setup the parent pointers. Since they are not serialised
+      if (Archive::is_loading::value) {
+         size_t vec_size = nodeVec_.size();
+         for(size_t i = 0; i < vec_size; i++) {
+            nodeVec_[i]->set_parent(this);
+         }
+      }
+	}
+
+private:
+  	std::vector<node_ptr> nodeVec_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/NodeDelete.cpp b/ecflow_4_0_7/ANode/src/NodeDelete.cpp
new file mode 100644
index 0000000..c54c3f0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeDelete.cpp
@@ -0,0 +1,263 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #26 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "Node.hpp"
+#include "ExprAst.hpp"
+#include "Stl.hpp"
+#include "Ecf.hpp"
+
+using namespace ecf;
+using namespace std;
+
+void Node::deleteTime(const std::string& name )
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->deleteTime(name);
+      return;
+   }
+   throw std::runtime_error("Node::delete_time: Can not find time attribute: ");
+}
+
+void Node::delete_time( const ecf::TimeAttr& attr )
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->delete_time(attr);
+      return;
+   }
+   throw std::runtime_error("Node::delete_time: Can not find time attribute: ");
+}
+
+void Node::deleteToday(const std::string& name)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->deleteToday(name);
+      return;
+   }
+   throw std::runtime_error("Node::delete_today: Can not find today attribute: ");
+}
+
+void Node::delete_today(const ecf::TodayAttr& attr)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->delete_today(attr);
+      return;
+   }
+   throw std::runtime_error("Node::delete_today: Can not find today attribute: " + attr.toString());
+}
+
+void Node::deleteDate(const std::string& name)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->deleteDate(name);
+      return;
+   }
+   throw std::runtime_error("Node::delete_date: Can not find date attribute: ");
+}
+
+void Node::delete_date(const DateAttr& attr)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->delete_date(attr);
+      return;
+   }
+   throw std::runtime_error("Node::delete_date: Can not find date attribute: " + attr.toString());
+}
+
+void Node::deleteDay(const std::string& name)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->deleteDay(name);
+      return;
+   }
+   throw std::runtime_error("Node::delete_day: Can not find day attribute: ");
+}
+
+void Node::delete_day(const DayAttr& attr)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->delete_day(attr);
+      return;
+   }
+   throw std::runtime_error("Node::delete_day: Can not find day attribute: " + attr.toString());
+}
+
+void Node::deleteCron(const std::string& name)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->deleteCron(name);
+      return;
+   }
+   throw std::runtime_error("Node::delete_cron: Can not find cron attribute: ");
+}
+
+void Node::delete_cron(const ecf::CronAttr& attr)
+{
+   if (time_dep_attrs_)  {
+      time_dep_attrs_->delete_cron(attr);
+      return;
+   }
+   throw std::runtime_error("Node::delete_cron: Can not find cron attribute: " + attr.toString());
+}
+
+void Node::deleteVariable( const std::string& name)
+{
+	if (name.empty()) {
+		varVec_.clear(); // delete all
+		state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+		std::cout << "Node::deleteVariable\n";
+#endif
+		return;
+	}
+
+	size_t theSize = varVec_.size();
+	for(size_t i = 0; i < theSize; i++) {
+		if (varVec_[i].name() == name) {
+ 			varVec_.erase( varVec_.begin() + i );
+ 			state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+ 			std::cout << "Node::deleteVariable\n";
+#endif
+			return;
+		}
+	}
+	throw std::runtime_error("Node::deleteVariable: Can not find variable of name " + name);
+}
+
+void Node::deleteEvent(const std::string& name)
+{
+   if (child_attrs_)  {
+      child_attrs_->deleteEvent(name);
+      return;
+   }
+	throw std::runtime_error("Node::deleteEvent: Can not find event: " + name);
+}
+
+void Node::deleteMeter(const std::string& name)
+{
+   if (child_attrs_)  {
+      child_attrs_->deleteMeter(name);
+      return;
+   }
+	throw std::runtime_error("Node::deleteMeter: Can not find meter: " + name);
+}
+
+void Node::deleteLabel(const std::string& name)
+{
+   if (child_attrs_)  {
+      child_attrs_->deleteLabel(name);
+      return;
+   }
+	throw std::runtime_error("Node::deleteLabel: Can not find label: " + name);
+}
+
+void Node::deleteTrigger()
+{
+	if (triggerExpr_)  {
+		delete triggerExpr_; triggerExpr_ = NULL;
+		state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+		std::cout << "Node::deleteTrigger()\n";
+#endif
+	}
+}
+
+void Node::deleteComplete()
+{
+	if (completeExpr_) {
+		delete completeExpr_; completeExpr_ = NULL;
+		state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+		std::cout << "Node::deleteComplete()\n";
+#endif
+	}
+}
+
+void Node::deleteRepeat()
+{
+	if (!repeat_.empty()) {
+		repeat_.clear(); // will delete the pimple
+ 		state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+		std::cout << "Node::deleteRepeat())\n";
+#endif
+	}
+}
+
+void Node::deleteLimit(const std::string& name)
+{
+	if (name.empty()) {
+		limitVec_.clear();
+		state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+		std::cout << "Node::deleteLimit\n";
+#endif
+  		return;
+	}
+
+	size_t theSize = limitVec_.size();
+	for(size_t i = 0; i < theSize; i++) {
+		if (limitVec_[i]->name() == name) {
+			limitVec_.erase( limitVec_.begin() + i );
+			state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+			std::cout << "Node::deleteLimit\n";
+#endif
+			return;
+		}
+	}
+	throw std::runtime_error("Node::deleteLimit: Can not find limit: " + name);
+}
+
+void Node::delete_limit_path(const std::string& name,const std::string& path)
+{
+   if (name.empty()) {
+      throw std::runtime_error("Node::delete_limit_path: the limit name must be provided");
+   }
+   if (path.empty()) {
+      throw std::runtime_error("Node::delete_limit_path: the limit path must be provided");
+   }
+
+   size_t theSize = limitVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (limitVec_[i]->name() == name) {
+         limitVec_[i]->delete_path(path); // will update state change no
+         return;
+      }
+   }
+   throw std::runtime_error("Node::delete_limit_path: Can not find limit: " + name);
+}
+
+void Node::deleteInlimit(const std::string& name)
+{
+	// if name exists but no corresponding in limit found raises an exception
+	if (inLimitMgr_.deleteInlimit(name)) {
+		state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+		std::cout << "Node::deleteInlimit\n";
+#endif
+	}
+}
+
+void Node::deleteZombie(const std::string& zombie_type)
+{
+   if (misc_attrs_) misc_attrs_->deleteZombie(zombie_type);
+}
+
+void Node::delete_zombie(Child::ZombieType zt)
+{
+   if (misc_attrs_) misc_attrs_->delete_zombie(zt);
+}
diff --git a/ecflow_4_0_7/ANode/src/NodeFind.cpp b/ecflow_4_0_7/ANode/src/NodeFind.cpp
new file mode 100644
index 0000000..3371344
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeFind.cpp
@@ -0,0 +1,738 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #53 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "Node.hpp"
+#include "Str.hpp"
+#include "NodePath.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+/// Output a vector to cout
+template<class T>
+ostream& operator<<(ostream& os, const vector<T>& v)
+{
+   copy(v.begin(), v.end(), ostream_iterator<T>(cout, " "));
+   return os;
+}
+
+bool Node::findParentVariableValue(const std::string& name, std::string& theValue) const
+{
+   if (findVariableValue(name,theValue)) return true;
+   const Repeat& repeat = findRepeat(name);
+   if (!repeat.empty())  { theValue = repeat.valueAsString(); return true; }
+   if (findGenVariableValue(name,theValue)) return true;
+
+
+   Node* theParent =  parent();
+   while (theParent) {
+
+      if (theParent->findVariableValue(name,theValue)) return true;
+      const Repeat& repeatVar = theParent->findRepeat(name);
+      if (!repeatVar.empty()) { theValue = repeatVar.valueAsString(); return true; }
+      if (theParent->findGenVariableValue(name,theValue)) return true;
+
+      theParent =  theParent->parent();
+   }
+
+   // If all else fails search defs environment, returns empty string if match not found
+   // The defs environment is constructed via:
+   //   o/ default settings for ECF_HOME,ECF_LOG, ECF_CHECK,ECF_CHECKOLD,ECF_CHECKINTERVAL
+   //                           ECF_INTERVAL ECF_CHECKMODE ECF_JOB_CMD ECF_MICRO ECF_TRIES ECF_PORT, ECF_NODE
+   //   o/ These values are updated from the server environment when the BEGIN cmd is called.
+   theValue = defs()->server().find_variable(name);
+   if ( !theValue.empty() ) return true;
+   return false; // the variable can not be found
+}
+
+bool Node::find_parent_gen_variable_value(const std::string& name, std::string& theValue) const
+{
+    if (findGenVariableValue(name,theValue)) return true;
+
+    Node* theParent =  parent();
+    while (theParent) {
+       if (theParent->findGenVariableValue(name,theValue)) return true;
+       theParent =  theParent->parent();
+    }
+
+    // If all else fails search defs environment, returns empty string if match not found
+    // The defs environment is constructed via:
+    //   o/ default settings for ECF_HOME,ECF_LOG, ECF_CHECK,ECF_CHECKOLD,ECF_CHECKINTERVAL
+    //                           ECF_INTERVAL ECF_CHECKMODE ECF_JOB_CMD ECF_MICRO ECF_TRIES ECF_PORT, ECF_NODE
+    //   o/ These values are updated from the server environment when the BEGIN cmd is called.
+    theValue = defs()->server().find_variable(name);
+    if ( !theValue.empty() ) return true;
+    return false; // the variable can not be found
+}
+
+bool Node::findParentUserVariableValue(const std::string& name, std::string& theValue) const
+{
+   if (findVariableValue(name,theValue)) return true;
+
+   Node* theParent =  parent();
+   while (theParent) {
+      if (theParent->findVariableValue(name,theValue)) return true;
+      theParent =  theParent->parent();
+   }
+
+   // If all else fails search defs environment, returns empty string if match not found
+   theValue = defs()->server().find_variable(name);
+   if ( !theValue.empty() ) return true;
+   return false; // the variable can not be found
+}
+
+const std::string& Node::find_parent_user_variable_value(const std::string& name) const
+{
+   const Variable& var = findVariable(name);
+   if (!var.empty()) return var.theValue();
+
+   Node* theParent = parent();
+   while (theParent) {
+      const Variable& pvar = theParent->findVariable(name);
+      if (!pvar.empty()) return pvar.theValue();
+      theParent = theParent->parent();
+   }
+
+   // If all else fails search defs environment, returns empty string if match not found
+   return defs()->server().find_variable(name);
+}
+
+bool Node::user_variable_exists(const std::string& name) const
+{
+   const Variable& var = findVariable(name);
+   if (!var.empty()) return true;
+
+   Node* theParent = parent();
+   while (theParent) {
+      const Variable& pvar = theParent->findVariable(name);
+      if (!pvar.empty()) return true;
+      theParent = theParent->parent();
+   }
+
+   // If all else fails search defs environment, returns empty string if match not found
+   return defs()->server().variable_exists(name);
+}
+
+const Variable& Node::findVariable(const std::string& name) const
+{
+   size_t theSize = varVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (varVec_[i].name() == name) {
+         return varVec_[i];
+      }
+   }
+   return Variable::EMPTY();
+}
+
+bool Node::findVariableValue( const std::string& name, std::string& returnedValue) const
+{
+   const Variable& var = findVariable(name);
+   if (!var.empty()) {
+      returnedValue = var.theValue();
+      return true;
+   }
+   return false;
+}
+
+bool Node::findGenVariableValue( const std::string& name, std::string& returnedValue) const
+{
+   const Variable& genVar = findGenVariable(name);
+   if (!genVar.empty()) {
+      returnedValue = genVar.theValue();
+      return true;
+   }
+   return false;
+}
+
+
+bool Node::findLimit(const Limit& theLimit) const
+{
+   size_t theSize = limitVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (limitVec_[i]->name() == theLimit.name()) {
+         return true;
+      }
+   }
+   return false;
+}
+
+limit_ptr Node::find_limit(const std::string& theName) const
+{
+   size_t theSize = limitVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      if (limitVec_[i]->name() == theName) {
+         return limitVec_[i];
+      }
+   }
+   return limit_ptr();
+}
+
+limit_ptr  Node::findLimitUpNodeTree(const std::string& name) const
+{
+   limit_ptr theFndLimit = find_limit(name);
+   if (theFndLimit.get()) return theFndLimit;
+
+   Node* theParent = parent();
+   while (theParent != NULL) {
+
+      limit_ptr theFndLimit = theParent->find_limit(name);
+      if (theFndLimit.get()) return theFndLimit;
+
+      theParent = theParent->parent();
+   }
+   return limit_ptr();
+}
+
+
+const Event& Node::findEvent(const Event& theEvent) const
+{
+   if (child_attrs_) return child_attrs_->findEvent(theEvent);
+   return Event::EMPTY();
+}
+
+const Event& Node::findEventByNumber(int number) const
+{
+   if (child_attrs_) return child_attrs_->findEventByNumber(number);
+   return Event::EMPTY();
+}
+
+const Event& Node::findEventByName( const std::string& event_name) const
+{
+   if (child_attrs_) return child_attrs_->findEventByName(event_name);
+   return Event::EMPTY();
+}
+
+const Event& Node::findEventByNameOrNumber( const std::string& theName) const
+{
+   if (child_attrs_) return child_attrs_->findEventByNameOrNumber(theName);
+   return Event::EMPTY();
+}
+const Meter& Node::findMeter(const std::string& name) const
+{
+   if (child_attrs_) return child_attrs_->findMeter(name);
+   return Meter::EMPTY();
+}
+
+Meter& Node::find_meter(const std::string& name)
+{
+   if (child_attrs_) return child_attrs_->find_meter(name);
+   return const_cast<Meter&>(Meter::EMPTY());
+}
+
+bool Node::findLabel(const std::string& name) const
+{
+   if (child_attrs_) return child_attrs_->findLabel(name);
+   return false;
+}
+
+const Label& Node::find_label(const std::string& name) const
+{
+   if (child_attrs_) return child_attrs_->find_label(name);
+   return Label::EMPTY();
+}
+
+bool Node::findVerify(const VerifyAttr& v) const
+{
+   if (misc_attrs_) return misc_attrs_->findVerify(v);
+   return false;
+}
+
+const Repeat& Node::findRepeat(const std::string& name) const
+{
+   if (!repeat_.empty() && repeat_.name() == name) {
+      return repeat_;
+   }
+   return Repeat::EMPTY();
+}
+
+
+bool Node::findExprVariable( const std::string& name)
+{
+   // if event found return true. also mark this event so simulator know its used in a trigger
+   if ( set_event_used_in_trigger(name) ) {
+      return true;
+   }
+
+   // if meter found mark as used in trigger for simulator and return
+   if ( set_meter_used_in_trigger(name) ) {
+      return true;
+   }
+
+   const Variable& user_variable = findVariable( name );
+   if (!user_variable.empty()) return true;
+
+   const Repeat& repeat = findRepeat( name );
+   if (!repeat.empty()) return true;
+
+   const Variable& gen_variable = findGenVariable( name );
+   if (!gen_variable.empty()) return true;
+
+   return false;
+}
+
+int Node::findExprVariableValue( const std::string& name) const
+{
+   const Event& event = findEventByNameOrNumber( name );
+   if ( !event.empty() )  return (event.value() ? 1 : 0);
+
+   const Meter& meter = findMeter( name );
+   if ( !meter.empty() )  return meter.value();
+
+   const Variable& variable = findVariable( name );
+   if ( !variable.empty() ) return variable.value();
+
+   const Repeat& repeat = findRepeat( name );
+   if ( !repeat.empty() )  {
+      // RepeatDate       last_valid_value() returns the date by its real value as a long
+      // RepeatInteger    last_valid_value() returns the value, by the current value of integer
+      // RepeatEnumerated last_valid_value() returns the current value if cast-able to integer otherwise position/index,
+      //                                     (i.e. since enum can be anything)
+      // RepeatString     last_valid_value() returns the current position/index  ( Alternatives ? )
+      // RepeatDay        last_valid_value() returns the current step
+      // Note: At Repeat expiration Repeat::value() may be out of range of start-end
+      //       But Repeat::last_valid_value() should always be in range, hence at Repeat expiration
+      //       will return the last valid value.
+      return repeat.last_valid_value();
+   }
+
+   const Variable& gen_variable =  findGenVariable( name );
+   if ( !gen_variable.empty() )  return gen_variable.value();
+   return 0;
+}
+
+int Node::findExprVariableValueAndPlus(const std::string& name, int val) const
+{
+   const Event& event = findEventByNameOrNumber( name );
+   if ( !event.empty() )  return ((event.value() ? 1 : 0) + val);
+
+   const Meter& meter = findMeter( name );
+   if ( !meter.empty() )  return (meter.value() + val);
+
+   const Variable& variable = findVariable( name );
+   if ( !variable.empty() ) return (variable.value() + val);
+
+   const Repeat& repeat = findRepeat( name );
+   if ( !repeat.empty() )  {
+      // RepeatDate       last_valid_value() returns the date by its real value as a long
+      // RepeatInteger    last_valid_value() returns the value, by the current value of integer
+      // RepeatEnumerated last_valid_value() returns the current value if cast-able as integer otherwise position/index,
+      //                                    (i.e. since enum can be anything)
+      // RepeatString     last_valid_value() returns the current position/index  ( Alternatives ? )
+      // RepeatDay        last_valid_value() returns the current step
+      // Note: At Repeat expiration Repeat::value() may be out of range of start-end
+      //       But Repeat::last_valid_value() should always be in range, hence at Repeat expiration
+      //       will return the last valid value.
+      return repeat.last_valid_value_plus(val);
+   }
+
+   const Variable& gen_variable =  findGenVariable( name );
+   if ( !gen_variable.empty() )  return (gen_variable.value()+val);
+   return val;
+}
+
+int Node::findExprVariableValueAndMinus(const std::string& name, int val) const
+{
+   const Event& event = findEventByNameOrNumber( name );
+   if ( !event.empty() )  return ( (event.value() ? 1 : 0) - val);
+
+   const Meter& meter = findMeter( name );
+   if ( !meter.empty() )  return (meter.value() - val );
+
+   const Variable& variable = findVariable( name );
+   if ( !variable.empty() ) return (variable.value() - val);
+
+   const Repeat& repeat = findRepeat( name );
+   if ( !repeat.empty() )  {
+      // RepeatDate       last_valid_value() returns the date by its real value as a long
+      // RepeatInteger    last_valid_value() returns the value, by the current value of integer
+      // RepeatEnumerated last_valid_value() returns the current value if cast-able as integer, else position/index, (
+      //                                     i.e. since enum can be anything)
+      // RepeatString     last_valid_value() returns the current position/index  ( Alternatives ? )
+      // RepeatDay        last_valid_value() returns the current step
+      // Note: At Repeat expiration Repeat::value() may be out of range of start-end
+      //       But Repeat::last_valid_value() should always be in range, hence at Repeat expiration
+      //       will return the last valid value.
+      return repeat.last_valid_value_minus(val);
+   }
+
+   const Variable& gen_variable = findGenVariable( name );
+   if ( !gen_variable.empty() )  return (gen_variable.value() - val);
+   return -val;
+}
+
+int Node::findExprVariableValueAndType( const std::string& name, std::string& varType) const
+{
+   const Event& event = findEventByNameOrNumber( name );
+   if ( !event.empty() )  {
+      varType = "event";
+      return (event.value() ? 1 : 0);
+   }
+   const Meter& meter = findMeter( name );
+   if ( !meter.empty() )  {
+      varType = "meter";
+      return meter.value();
+   }
+   const Variable& variable = findVariable( name );
+   if ( !variable.empty() ) {
+      varType = "user-variable";
+      return variable.value();
+   }
+   const Repeat& repeat = findRepeat( name );
+   if ( !repeat.empty() )  {
+      varType  = "repeat";
+      return repeat.last_valid_value();
+   }
+   const Variable& gen_variable = findGenVariable( name );
+   if ( !gen_variable.empty() )  {
+      varType = "gen-variable";
+      return gen_variable.value();
+   }
+   varType = "variable-not-found";
+   return 0;
+}
+
+void Node::findExprVariableAndPrint( const std::string& name, ostream& os) const
+{
+   const Event& event = findEventByNameOrNumber( name );
+   if ( !event.empty() )  {
+      os << event.dump();
+      return;
+   }
+   const Meter& meter = findMeter( name );
+   if ( !meter.empty() ) {
+      os << meter.dump();
+      return;
+   }
+   const Variable& variable = findVariable( name );
+   if ( !variable.empty() ) {
+      os << "USER-VARIABLE " << variable.dump();
+      return;
+   }
+   const Repeat& repeat = findRepeat( name );
+   if ( !repeat.empty() )  {
+      os << repeat.dump();
+      return;
+   }
+   const Variable& gen_variable = findGenVariable( name );
+   if ( !gen_variable.empty() )  {
+      os << "GEN-VARIABLE " << gen_variable.dump();
+      return;
+   }
+}
+
+
+node_ptr findRelativeNode(	const vector<std::string>& theExtractedPath,node_ptr triggerNode, std::string& errorMsg )
+{
+   // The referenced node could be itself(error) or most likely a sibling node.
+   int extractedPathSize = static_cast<int>(theExtractedPath.size());
+   if (extractedPathSize == 1 && triggerNode->name() == theExtractedPath[0]) {
+      // self referencing node ?
+      return triggerNode;
+   }
+
+   // Can only find *sibling* if triggerNode has a parent
+   if (!triggerNode->parent()) {
+      errorMsg = "Parent empty. Could not find referenced node\n";
+      return node_ptr();
+   }
+   if (extractedPathSize == 1) {
+      size_t child_pos; // not used
+      node_ptr theNode = triggerNode->parent()->findImmediateChild(theExtractedPath[0],child_pos);
+      if ( theNode.get() ) {
+         return theNode;
+      }
+   }
+
+   node_ptr constNode = triggerNode->parent()->find_relative_node(theExtractedPath);
+   if (constNode.get()) {
+      return constNode;
+   }
+
+   errorMsg = "Could not find node '";
+   if (extractedPathSize == 1)  errorMsg += theExtractedPath[0];
+   else { BOOST_FOREACH(const string& s, theExtractedPath) { errorMsg += s; errorMsg += Str::PATH_SEPERATOR();} }
+   errorMsg += "' from node ";
+   errorMsg += triggerNode->absNodePath();
+   if (extractedPathSize == 1) {
+      errorMsg += " . Expected '";
+      errorMsg += theExtractedPath[0];
+      errorMsg += "' to be a sibling.";
+   }
+   errorMsg += "\n";
+   return node_ptr();
+}
+
+
+node_ptr Node::non_const_this() const {
+   return const_pointer_cast<Node>(shared_from_this());
+}
+
+node_ptr Node::findReferencedNode(const std::string& nodePath, std::string& errorMsg) const
+{
+   return findReferencedNode(nodePath,Str::EMPTY(),errorMsg);
+}
+node_ptr Node::findReferencedNode(const std::string& nodePath, const std::string& extern_obj, std::string& errorMsg) const
+{
+   Defs* theDefs = defs();
+   if (!theDefs) {
+      // In the case where we have a stand alone Node. i.e no parent set. The Defs will be NULL.
+      // Take the case where we want to dump the state of a single node.
+      //    ecflow_client --get_state /test/f2 --port=4141
+      // Here we are printing the state of the Node only, *NO* defs is returned.
+      // The print will cause the AST to be evaluated. The trigger evaluation will required chasing
+      // down reference nodes. Hence we will end up here. Rather than crashing, just return a NULL Pointer.
+      return node_ptr();
+   }
+
+   /// findReferencedNode:: is used to locate references:
+   ///      a/ Trigger & complete expressions, this is where extern_obj is used.
+   ///      b/ Inlimit nodepaths.
+   ///  In *both* the case above, the node path may not exist, in the definition. Hence::
+   ///  On client side:: references not defined in externs are considered errors
+   ///  On server side:: No extern's are stored, hence for unresolved node paths, we return NULL
+
+#ifdef DEBUG_FIND_REFERENCED_NODE
+   string debug_path = "Searching for path " + nodePath + " from " + debugType() + Str::COLON() + absNodePath() + "\n";
+#endif
+
+   // if an absolute path cut in early
+   if (!nodePath.empty() && nodePath[0] == '/') {
+
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      debug_path += "(!nodePath.empty() && nodePath[0] == '/') \n";
+#endif
+
+      // Must be a absolute path. i.e /suite/family/path
+      node_ptr constNode = theDefs->findAbsNode(nodePath);
+      if (constNode.get()) {
+         return constNode;
+      }
+
+      // *NOTE*: The server does *NOT* store externs, hence the check below, will always return false, for the server:
+      // Must be an extern:
+      //    extern /referenceSuite/family/task:obj
+      //    extern /referenceSuite/family/task
+      if (theDefs->find_extern(nodePath,extern_obj)) {
+
+         // =================================================================
+         // **Client side* specific: Only client side defs, stores extrens
+         // =================================================================
+#ifdef DEBUG_FIND_REFERENCED_NODE
+         debug_path += "theDefs->find_extern(nodePath) \n";
+#endif
+
+         // return NULL *without* setting an error message as node path is defined as an extern
+
+         // OK: the node path appears in the extern list. This may be because that suite  has not been loaded.
+         // *** If the suite is loaded, then its an error that we did not
+         // *** locate the node. i.e in the previous call to defs->findAbsNode(nodePath);
+         vector<string> theExtractedPath;
+         NodePath::split(nodePath, theExtractedPath );
+
+         std::string referenceSuite = theExtractedPath[0];
+         if (theDefs->findSuite(referenceSuite)) {
+            // The suite referenced in the extern is LOADED, but path did not resolve,
+            // in previous call to defs->findAbsNode(nodePath);
+            errorMsg = "Extern path ";
+            errorMsg += nodePath;
+            errorMsg += " does not exist on suite ";
+            errorMsg += referenceSuite;
+            errorMsg += "\n";
+#ifdef DEBUG_FIND_REFERENCED_NODE
+            errorMsg += debug_path;
+#endif
+         }
+
+         // Its an extern path that references a suite thats NOT loaded yet
+         return node_ptr();
+      }
+
+      errorMsg = ": Could not find referenced node, using absolute path '";
+      errorMsg += nodePath;
+      errorMsg += "\n";
+      return node_ptr();
+   }
+
+   /// =============================================================================
+   /// Path is something other than ABSOLUTE path
+   /// =============================================================================
+  vector<string> theExtractedPath;
+   NodePath::split( nodePath, theExtractedPath );
+
+#ifdef DEBUG_FIND_REFERENCED_NODE
+   debug_path += "extracted path = ";
+   BOOST_FOREACH(const string& s, theExtractedPath) { debug_path += ",";debug_path += s;}
+   debug_path += "\n";
+#endif
+
+   if ( theExtractedPath.empty() ) {
+      std::stringstream ss;
+      ss << ": Could not find referenced node '" << nodePath << "' from node " << absNodePath() << "\n";
+      errorMsg = ss.str();
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      errorMsg += debug_path;
+#endif
+      return node_ptr();
+   }
+
+
+   //  i.e   " a == complete" =====>        nodePath = a
+   if ( theExtractedPath.size() == 1) {
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      debug_path += "( theExtractedPath.size() == 1)\n";
+#endif
+      // Search for a relative node first
+      string localErrorMsg;
+      node_ptr res = findRelativeNode(theExtractedPath,non_const_this(),localErrorMsg);
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      if (!localErrorMsg.empty()) {
+         debug_path += localErrorMsg;
+         localErrorMsg = debug_path;
+      }
+#endif
+
+      if (!res.get()) {
+         // lets see if its in an extern Node. extern can have absolute and relative paths
+         // In this case it will be a relative path, hence no point trying to see if suite
+         // is loaded
+         if (theDefs->find_extern(nodePath,extern_obj)) {
+            // =================================================================
+            // **Client side* specific: Only client side defs, stores externs
+            // =================================================================
+            // The path exist in the extern and we know its relative
+            return node_ptr();
+         }
+      }
+
+      errorMsg += localErrorMsg;
+      return res;
+   }
+
+   // handle Node path of type   a/b/c
+   if (theExtractedPath.size() >= 2 && theExtractedPath[0] != "." && theExtractedPath[0] != "..") {
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      debug_path += "(theExtractedPath.size() >= 2 && theExtractedPath[0] != \".\") && theExtractedPath[0] != \"..\"\n";
+#endif
+      // First check to see see if its in the externs
+      if (theDefs->find_extern(nodePath,extern_obj)) {
+         // =================================================================
+         // **Client side* specific: Only client side defs, stores externs
+         // =================================================================
+         // The path a/b/c exist in the extern and we know its relative
+         // Again no point in checking to see if suite is loaded if path is relative
+         return node_ptr();
+      }
+
+      // In this case its equivalent to: ./a/b/c
+      theExtractedPath.insert(theExtractedPath.begin(),".");
+   }
+
+   // node path == "./a"
+   if ( theExtractedPath.size() >= 2 && theExtractedPath[0] == ".") {
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      debug_path += "theExtractedPath.size() == 2 && theExtractedPath[0] == \".\" \n";
+#endif
+      theExtractedPath.erase( theExtractedPath.begin() + 0);
+      node_ptr res = findRelativeNode(theExtractedPath,non_const_this(),errorMsg);
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      if (!errorMsg.empty()) {
+         debug_path += errorMsg;
+         errorMsg = debug_path;
+      }
+#endif
+      return res;
+   }
+
+   // ********************************************************************
+   // Note  ./  This means go to the parent, then search down, i.e sibling
+   //       ../ This means go to the parents parent
+   //       This may be confusing, but this is how Axel expects it, hence I will use
+   //       the same understanding
+   // **********************************************************************
+   // Handle node path of the type "../a/b/c"  "../../a/b/c"
+   if ( theExtractedPath.size() >= 2 && theExtractedPath[0] == "..") {
+
+#ifdef DEBUG_FIND_REFERENCED_NODE
+      debug_path += "( theExtractedPath.size() >= 2 && theExtractedPath[0] == \"..\")\n";
+#endif
+
+      Node* theParent = parent(); // get past the first parent
+      while ( static_cast<int>(theExtractedPath.size()) &&
+               theParent &&
+               theExtractedPath[0] == ".." )
+      {
+         theExtractedPath.erase( theExtractedPath.begin() + 0);
+         theParent = theParent->parent();  // for each .. go up a parent
+#ifdef DEBUG_FIND_REFERENCED_NODE
+         debug_path += "..: thepParent = ";
+         if (theParent) debug_path += theParent->absNodePath();
+         else           debug_path += "NULL";
+#endif
+      }
+
+      if ( theParent ) {
+
+#ifdef DEBUG_FIND_REFERENCED_NODE
+         debug_path += "searching = " + theParent->name()  + "\n";
+         BOOST_FOREACH(const std::string& s , theExtractedPath) { debug_path += Str::PATH_SEPERATOR() + s; }
+         debug_path += "\n";
+#endif
+
+         node_ptr constNode = theParent->find_relative_node(theExtractedPath);
+         if (constNode) {
+            return constNode;
+         }
+      }
+   }
+
+   errorMsg = "Unrecognised path ";
+   errorMsg += nodePath;
+   errorMsg += " for Node ";
+   errorMsg += absNodePath();
+   errorMsg += "\n";
+#ifdef DEBUG_FIND_REFERENCED_NODE
+   errorMsg += debug_path;
+#endif
+   return node_ptr();
+}
+
+const ZombieAttr& Node::findZombie( ecf::Child::ZombieType zombie_type) const
+{
+   if (misc_attrs_) return misc_attrs_->findZombie(zombie_type);
+   return ZombieAttr::EMPTY();
+}
+
+bool Node::findParentZombie(ecf::Child::ZombieType z_type, ZombieAttr& z) const
+{
+   const ZombieAttr& the_zombie = findZombie(z_type);
+   if ( !the_zombie.empty() ) {
+      z = the_zombie;
+      return true;
+   }
+
+   Node* theParent =  parent();
+   while (theParent) {
+      const ZombieAttr& the_zombie = theParent->findZombie(z_type);
+      if ( !the_zombie.empty() ) {
+         z = the_zombie;
+         return true;
+      }
+      theParent = theParent->parent();
+   }
+   return false;
+}
diff --git a/ecflow_4_0_7/ANode/src/NodeFwd.hpp b/ecflow_4_0_7/ANode/src/NodeFwd.hpp
new file mode 100644
index 0000000..3aae9de
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeFwd.hpp
@@ -0,0 +1,107 @@
+#ifndef NODE_FWD_HPP_
+#define NODE_FWD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #44 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <vector>
+#include <string>
+#include <map>
+
+class AbstractObserver;
+class Suite;
+class Family;
+class Task;
+class Alias;
+class Submittable;
+class Node;
+class Defs;
+class Repeat;
+class Expression;
+class Memento;
+class CompoundMemento;
+class ClockAttr;
+class JobCreationCtrl;
+class Event;
+class Meter;
+class Repeat;
+class Variable;
+
+namespace ecf { class LateAttr; class AutoCancelAttr; } // forward declare class
+
+typedef boost::shared_ptr<Memento> memento_ptr;
+typedef boost::shared_ptr<CompoundMemento> compound_memento_ptr;
+typedef boost::shared_ptr<ClockAttr> clock_ptr;
+
+typedef boost::shared_ptr<JobCreationCtrl> job_creation_ctrl_ptr;
+typedef boost::shared_ptr<Node>   node_ptr;
+typedef boost::shared_ptr<Task>   task_ptr;
+typedef boost::shared_ptr<Alias>  alias_ptr;
+typedef boost::shared_ptr<Submittable>  submittable_ptr;
+typedef boost::shared_ptr<Family> family_ptr;
+typedef boost::shared_ptr<Suite>  suite_ptr;
+typedef boost::shared_ptr<Defs>   defs_ptr;
+
+typedef boost::weak_ptr<Defs>  weak_defs_ptr;
+typedef boost::weak_ptr<Suite> weak_suite_ptr;
+typedef boost::weak_ptr<Task>  weak_task_ptr;
+typedef boost::weak_ptr<Alias> weak_alias_ptr;
+typedef boost::weak_ptr<Submittable> weak_submittable_ptr;
+typedef boost::weak_ptr<Node>  weak_node_ptr;
+
+typedef std::map<std::string,std::string> NameValueMap;
+
+typedef std::vector< std::pair< std::string,std::string> > NameValueVec;
+
+
+class NodeContainer;
+class DefsDelta;
+class JobsParam;
+class JobCreationCtrl;
+class AstTop;
+
+class StateMemento;
+class NodeDefStatusDeltaMemento;
+class SuspendedMemento;
+class ServerStateMemento;
+class ServerVariableMemento;
+class NodeEventMemento;
+class NodeMeterMemento;
+class NodeLabelMemento;
+class NodeTriggerMemento;
+class NodeCompleteMemento;
+class NodeRepeatMemento;
+class NodeLimitMemento;
+class NodeInLimitMemento;
+class NodeVariableMemento;
+class NodeLateMemento;
+class NodeTodayMemento;
+class NodeTimeMemento;
+class NodeDayMemento;
+class NodeCronMemento;
+class NodeDateMemento;
+class NodeZombieMemento;
+class NodeVerifyMemento;
+class FlagMemento;
+class SubmittableMemento;
+class SuiteClockMemento;
+class SuiteBeginDeltaMemento;
+class SuiteCalendarMemento;
+class OrderMemento;
+class ChildrenMemento;
+class AliasChildrenMemento;
+class AliasNumberMemento;
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/NodeMemento.cpp b/ecflow_4_0_7/ANode/src/NodeMemento.cpp
new file mode 100644
index 0000000..430c941
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeMemento.cpp
@@ -0,0 +1,585 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #48 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/make_shared.hpp>
+
+#include "Suite.hpp"
+#include "Ecf.hpp"
+#include "DefsDelta.hpp"
+#include "ExprAst.hpp"
+#include "Stl.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+using namespace ecf;
+using namespace std;
+
+//#define DEBUG_MEMENTO 1
+
+/// CompoundMemento relies all clearing all attributes
+void Node::clear()
+{
+   delete lateAttr_; lateAttr_ = NULL;
+   delete completeExpr_; completeExpr_ = NULL;
+   delete triggerExpr_; triggerExpr_ = NULL;
+
+ 	// ************************************************************
+ 	// Note: auto cancel does not have any changeable state
+ 	//       Hence it is not cleared. Hence no need for memento
+  	// ************************************************************
+
+   if (time_dep_attrs_) time_dep_attrs_->clear();
+   if (child_attrs_) child_attrs_->clear();
+   if (misc_attrs_) misc_attrs_->clear();    // zombies can be added/removed via AlterCmd
+  	repeat_.clear();
+	varVec_.clear();
+	limitVec_.clear();
+	inLimitMgr_.clear();
+}
+
+void Node::incremental_changes( DefsDelta& changes, compound_memento_ptr& comp) const
+{
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::incremental_changes(DefsDelta& changes) " << debugNodePath() << "\n";
+#endif
+
+	unsigned int client_state_change_no = changes.client_state_change_no();
+
+	// determine if state changed
+	if (state_.first.state_change_no() > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<StateMemento>( state_.first.state()) );
+	}
+
+	// determine if def status changed
+	if (defStatus_.state_change_no() > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<NodeDefStatusDeltaMemento>( defStatus_.state()) );
+	}
+
+	// determine if node suspend changed
+	if (suspended_change_no_  > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<SuspendedMemento>( suspended_) );
+	}
+
+	// Determine if node attributes DELETED or ADDED, We copy **all** internal state
+	// When applying on the client side, we clear all node attributes( ie Node::clear())
+	// and re-add
+	if (state_change_no_ > client_state_change_no) {
+
+	   /// *****************************************************************************************
+	   /// Node attributes DELETED or ADDED, i.e we call comp->clear_attributes()
+	   /// *****************************************************************************************
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "    Node::incremental_changes()    Attributes added or deleted\n";
+#endif
+	    // Note: auto-cancel does not have any alterable state hence, *NO* memento
+
+	   if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+ 		comp->clear_attributes();
+
+		if (child_attrs_) {
+         const std::vector<Meter>& meter_attrs = child_attrs_->meters();
+         BOOST_FOREACH(const Meter& m, meter_attrs )  { comp->add( boost::make_shared<NodeMeterMemento>( m) ); }
+
+         const std::vector<Event>& event_attrs = child_attrs_->events();
+         BOOST_FOREACH(const Event& e, event_attrs ) { comp->add( boost::make_shared<NodeEventMemento>( e) ); }
+
+         const std::vector<Label>& label_attrs = child_attrs_->labels();
+         BOOST_FOREACH(const Label& l, label_attrs )  { comp->add( boost::make_shared<NodeLabelMemento>(  l) ); }
+		}
+		if (time_dep_attrs_) {
+		   const std::vector<ecf::TodayAttr>& today_attrs = time_dep_attrs_->todayVec();
+	      BOOST_FOREACH(const ecf::TodayAttr& attr, today_attrs){ comp->add( boost::make_shared<NodeTodayMemento>(  attr) ); }
+
+	      const std::vector<ecf::TimeAttr>& time_attrs = time_dep_attrs_->timeVec();
+         BOOST_FOREACH(const ecf::TimeAttr& attr, time_attrs ) { comp->add( boost::make_shared<NodeTimeMemento>(  attr) ); }
+
+         const std::vector<DayAttr>& day_attrs = time_dep_attrs_->days();
+         BOOST_FOREACH(const DayAttr& attr, day_attrs )     { comp->add( boost::make_shared<NodeDayMemento>(  attr) ); }
+
+         const std::vector<DateAttr>& dates_attrs = time_dep_attrs_->dates();
+         BOOST_FOREACH(const DateAttr& attr, dates_attrs )   { comp->add( boost::make_shared<NodeDateMemento>(  attr) ); }
+
+         const std::vector<ecf::CronAttr>& cron_attrs = time_dep_attrs_->crons();
+         BOOST_FOREACH(const CronAttr& attr, cron_attrs )   { comp->add( boost::make_shared<NodeCronMemento>(  attr) ); }
+		}
+		if (misc_attrs_) {
+         const std::vector<VerifyAttr>& verify_attrs = misc_attrs_->verifys();
+         if (!verify_attrs.empty()) comp->add( boost::make_shared<NodeVerifyMemento>( verify_attrs) );
+
+         const std::vector<ZombieAttr>& zombie_attrs = misc_attrs_->zombies();
+         BOOST_FOREACH(const ZombieAttr& attr, zombie_attrs){ comp->add( boost::make_shared<NodeZombieMemento>( attr) ); }
+		}
+
+		BOOST_FOREACH(limit_ptr l, limitVec_ )         { comp->add( boost::make_shared<NodeLimitMemento>(  *l) ); }
+  		BOOST_FOREACH(const Variable& v, varVec_ )     { comp->add( boost::make_shared<NodeVariableMemento>( v) ); }
+
+ 		inLimitMgr_.get_memento(comp);
+
+ 		if (triggerExpr_)     comp->add( boost::make_shared<NodeTriggerMemento>(  *triggerExpr_) );
+	 	if (completeExpr_)    comp->add( boost::make_shared<NodeCompleteMemento>(  *completeExpr_ ) );
+ 		if (!repeat_.empty()) comp->add( boost::make_shared<NodeRepeatMemento>(  repeat_) );
+ 		if (lateAttr_)        comp->add( boost::make_shared<NodeLateMemento>(  *lateAttr_) );
+
+  		changes.add( comp );
+		return;
+	}
+
+	/// *****************************************************************************************
+	/// Node attributes CHANGED
+   /// *****************************************************************************************
+
+	// ** if start to Change ZombieAttr then it needs to be added here, currently we only add/delete.
+
+   if (child_attrs_) {
+
+      // determine if event value changed.
+      const std::vector<Event>& event_attrs = child_attrs_->events();
+      BOOST_FOREACH(const Event& e, event_attrs ) {
+         if (e.state_change_no() > client_state_change_no) {
+            if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+            comp->add( boost::make_shared<NodeEventMemento>(e) );
+         }
+      }
+
+      // determine if Meter changed.
+      const std::vector<Meter>& meter_attrs = child_attrs_->meters();
+      BOOST_FOREACH(const Meter& m, meter_attrs ) {
+         if (m.state_change_no() > client_state_change_no) {
+            if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+            comp->add( boost::make_shared<NodeMeterMemento>( m) );
+         }
+      }
+
+      // determine if labels changed.
+      const std::vector<Label>& label_attrs = child_attrs_->labels();
+      BOOST_FOREACH(const Label& l, label_attrs ) {
+         if (l.state_change_no() > client_state_change_no) {
+            if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+            comp->add( boost::make_shared<NodeLabelMemento>(  l) );
+         }
+      }
+   }
+
+	// Determine if the time related dependency changed
+	if (time_dep_attrs_) {
+
+      const std::vector<ecf::TodayAttr>& today_attrs = time_dep_attrs_->todayVec();
+	   BOOST_FOREACH(const TodayAttr& attr, today_attrs ) {
+	      if (attr.state_change_no() > client_state_change_no) {
+	         if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+	         comp->add( boost::make_shared<NodeTodayMemento>( attr) );
+	      }
+	   }
+
+      const std::vector<ecf::TimeAttr>& time_attrs = time_dep_attrs_->timeVec();
+      BOOST_FOREACH(const TimeAttr& attr, time_attrs ) {
+	      if (attr.state_change_no() > client_state_change_no) {
+	         if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+	         comp->add( boost::make_shared<NodeTimeMemento>( attr) );
+	      }
+	   }
+
+      const std::vector<DayAttr>& day_attrs = time_dep_attrs_->days();
+	   BOOST_FOREACH(const DayAttr& attr, day_attrs ) {
+	      if (attr.state_change_no() > client_state_change_no) {
+	         if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+	         comp->add( boost::make_shared<NodeDayMemento>( attr) );
+	      }
+	   }
+
+      const std::vector<DateAttr>& dates_attrs = time_dep_attrs_->dates();
+	   BOOST_FOREACH(const DateAttr& attr, dates_attrs ) {
+	      if (attr.state_change_no() > client_state_change_no) {
+	         if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+	         comp->add( boost::make_shared<NodeDateMemento>( attr) );
+	      }
+	   }
+
+      const std::vector<ecf::CronAttr>& cron_attrs = time_dep_attrs_->crons();
+      BOOST_FOREACH(const CronAttr& attr, cron_attrs ) {
+	      if (attr.state_change_no() > client_state_change_no) {
+	         if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+	         comp->add( boost::make_shared<NodeCronMemento>( attr) );
+	      }
+	   }
+	}
+
+   if (misc_attrs_) {
+      // zombies have no state that changes
+      // If one verify changes then copy all. Avoids having to work out which one changed
+      const std::vector<VerifyAttr>& verify_attrs = misc_attrs_->verifys();
+      BOOST_FOREACH(const VerifyAttr& v, verify_attrs ) {
+         if (v.state_change_no() > client_state_change_no) {
+            if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+            comp->add( boost::make_shared<NodeVerifyMemento>( verify_attrs) );
+            break;
+         }
+      }
+   }
+
+	// determine if the trigger or complete changed
+	if (triggerExpr_ && triggerExpr_->state_change_no() > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<NodeTriggerMemento>(  *triggerExpr_) );
+	}
+ 	if (completeExpr_ && completeExpr_->state_change_no() > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<NodeCompleteMemento>(  *completeExpr_) );
+	}
+
+	// determine if the repeat changed
+	if (!repeat_.empty() && repeat_.state_change_no() > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<NodeRepeatMemento>( repeat_) );
+	}
+
+	// determine if limits changed.
+	BOOST_FOREACH(limit_ptr l, limitVec_ ) {
+		if (l->state_change_no() > client_state_change_no) {
+			if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+			comp->add( boost::make_shared<NodeLimitMemento>(  *l) );
+		}
+	}
+
+	// determine if variable values changed. Copy all variables. Save on having variable_change_no_ per variable
+	if (variable_change_no_ > client_state_change_no) {
+      if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+	   BOOST_FOREACH(const Variable& v, varVec_ )  { comp->add( boost::make_shared<NodeVariableMemento>( v) ); }
+	}
+
+	// Determine if the late attribute has changed
+	if (lateAttr_ && lateAttr_->state_change_no() > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<NodeLateMemento>( *lateAttr_) );
+	}
+
+	// Determine if the flag changed
+	if (flag_.state_change_no() > client_state_change_no) {
+		if (!comp.get()) comp =  boost::make_shared<CompoundMemento>(absNodePath());
+		comp->add( boost::make_shared<FlagMemento>( flag_ ) );
+	}
+
+
+	if (comp.get() ) {
+		changes.add( comp );
+	}
+}
+
+
+void Node::set_memento(const StateMemento* memento) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const StateMemento* memento) " << debugNodePath() << "  " << NState::toString(memento->state_) << "\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::STATE);
+	setStateOnly( memento->state_ );
+}
+
+
+void Node::set_memento( const NodeDefStatusDeltaMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeDefStatusDeltaMemento* memento) " << debugNodePath() << "\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::DEFSTATUS);
+	defStatus_.setState(  memento->state_ );
+}
+
+
+void Node::set_memento( const SuspendedMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const SuspendedMemento* memento) " << debugNodePath() << "\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::SUSPENDED);
+	if (memento->suspended_) suspend();
+	else                     clearSuspended();
+}
+
+
+void Node::set_memento( const NodeEventMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeEventMemento* memento) " << debugNodePath() << "\n";
+#endif
+	if (child_attrs_) {
+	   child_attrs_->set_memento(memento);
+	   return;
+	}
+	addEvent( memento->event_);
+}
+
+void Node::set_memento( const NodeMeterMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeMeterMemento* memento) " << debugNodePath() << "\n";
+#endif
+   if (child_attrs_) {
+      child_attrs_->set_memento(memento);
+      return;
+   }
+	addMeter(memento->meter_);
+}
+
+void Node::set_memento( const NodeLabelMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeLabelMemento* memento) " << debugNodePath() << "\n";
+#endif
+	if (child_attrs_) {
+	   child_attrs_->set_memento(memento);
+	   return;
+	}
+	addLabel(memento->label_);
+}
+
+void Node::set_memento( const NodeTriggerMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeTriggerMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+	if (triggerExpr_) {
+	   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::EXPR_TRIGGER);
+		if (memento->exp_.isFree()) freeTrigger();
+		else                        clearTrigger();
+		return;
+	}
+
+	// ADD_REMOVE_ATTR aspect
+	add_trigger_expression( memento->exp_);
+}
+
+void Node::set_memento( const NodeCompleteMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeCompleteMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+	if (completeExpr_) {
+	   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::EXPR_COMPLETE);
+		if (memento->exp_.isFree()) freeComplete();
+		else                        clearComplete();
+		return;
+	}
+
+   // ADD_REMOVE_ATTR aspect
+	add_complete_expression( memento->exp_);
+}
+
+void Node::set_memento( const NodeRepeatMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeRepeatMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+	if (!repeat_.empty()) {
+	   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::REPEAT);
+
+      // Note: the node is incremented one past, the last value
+      // In Node we increment() then check for validity
+      // hence the_new_value may be outside of the valid range.
+      // This can be seen when do a incremental sync,
+      // *hence* allow memento to copy the value as is.
+      repeat_.set_value(memento->repeat_.index_or_value());
+
+      // Alternative, but expensive since relies on cloning and coping potentially very large vectors
+		// repeat_ = memento->repeat_;
+ 		return;
+	}
+
+   // ADD_REMOVE_ATTR aspect
+	addRepeat(memento->repeat_);
+}
+
+void Node::set_memento( const NodeLimitMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeLimitMemento* memento) " << debugNodePath() << "  " << memento->limit_.toString() << "\n";
+#endif
+
+	limit_ptr limit = find_limit(memento->limit_.name());
+	if (limit.get())  {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::LIMIT);
+	   limit->set_state(  memento->limit_.theLimit(), memento->limit_.value(), memento->limit_.paths() );
+		return;
+	}
+
+   // ADD_REMOVE_ATTR aspect
+	addLimit(memento->limit_);
+}
+
+void Node::set_memento( const NodeInLimitMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeInLimitMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+   // ADD_REMOVE_ATTR aspect only, since no state
+
+	addInLimit(memento->inlimit_);
+}
+
+void Node::set_memento( const NodeVariableMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeVariableMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+
+	size_t theSize = varVec_.size();
+	for(size_t i = 0; i < theSize; i++) {
+		if (varVec_[i].name() == memento->var_.name()) {
+			varVec_[i].set_value( memento->var_.theValue() );
+			ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::NODE_VARIABLE);
+			return;
+		}
+ 	}
+
+	// ADD_REMOVE_ATTR aspect
+ 	addVariable(memento->var_);
+}
+
+void Node::set_memento( const NodeLateMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeLateMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+	if (lateAttr_) {
+	   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::LATE);
+		lateAttr_->setLate(memento->late_.isLate());
+		return;
+	}
+
+   // ADD_REMOVE_ATTR aspect
+	addLate(memento->late_);
+}
+
+void Node::set_memento( const NodeTodayMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeTodayMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+   if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::TODAY);
+      return;
+   }
+
+   // ADD_REMOVE_ATTR aspect
+	addToday(memento->attr_);
+}
+
+void Node::set_memento( const NodeTimeMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeTimeMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+   if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::TIME);
+      return;
+   }
+
+   // ADD_REMOVE_ATTR aspect
+	addTime(memento->attr_);
+}
+
+void Node::set_memento( const NodeDayMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeDayMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+
+   if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::DAY);
+      return;
+   }
+
+   // ADD_REMOVE_ATTR aspect
+	addDay(memento->attr_);
+}
+
+void Node::set_memento( const NodeDateMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "Node::set_memento(const NodeDateMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+   if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::DATE);
+      return;
+   }
+
+   // ADD_REMOVE_ATTR aspect
+   addDate(memento->attr_);
+}
+
+void Node::set_memento( const NodeCronMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeCronMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+
+   if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+      ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::CRON);
+      return;
+   }
+
+   // ADD_REMOVE_ATTR aspect
+	addCron(memento->attr_);
+}
+
+void Node::set_memento( const FlagMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const FlagMemento* memento) " << debugNodePath() << "\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::FLAG);
+
+	flag_.set_flag( memento->flag_.flag() );
+}
+
+void Node::set_memento( const NodeZombieMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "Node::set_memento(const NodeZombieMemento* memento) " << debugNodePath() << "\n";
+#endif
+
+   // Zombie attributes should always be via ADD_REMOVE_ATTR
+   // See Node::incremental_changes
+   // Since there is no state to change
+
+   /// remove existing attribute of same type, as duplicate of same type not allowed
+   delete_zombie( memento->attr_.zombie_type());
+   addZombie(memento->attr_);
+}
+
+void Node::set_memento( const NodeVerifyMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+	std::cout << "Node::set_memento(const NodeVerifyMemento* memento) " << debugNodePath() << "\n";
+#endif
+	if (misc_attrs_) {
+	   misc_attrs_->verifys_.clear();
+	   misc_attrs_->verifys_ = memento->verifys_;
+	   return;
+  	}
+	misc_attrs_ = new MiscAttrs(this);
+   misc_attrs_->verifys_ = memento->verifys_;
+}
diff --git a/ecflow_4_0_7/ANode/src/NodeState.hpp b/ecflow_4_0_7/ANode/src/NodeState.hpp
new file mode 100644
index 0000000..35b479f
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeState.hpp
@@ -0,0 +1,70 @@
+#ifndef NODESTATE_HPP_
+#define NODESTATE_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "NState.hpp"
+
+//
+// Given a set of nodes, return the the most significant state
+// Depend on the Node::computedState, hence include after Node.hpp
+// This will recurse down ****
+//
+namespace ecf {
+
+template < class T >
+NState::State theComputedNodeState( const std::vector<T>& nodeVec, bool immediate)
+{
+	// std::cout << "theComputedNodeState vec size = " << nodeVec.size() << " immediate  = " <<  immediate << "\n";
+	int unknownCount = 0;
+	int completeCount = 0;
+	int queuedCount = 0;
+	int submittedCount = 0;
+	int activeCount = 0;
+ 	int abortedCount = 0;
+
+	// We don't know the order, hence we must collate first
+	size_t theVecSize = nodeVec.size();
+ 	for(size_t n =0; n < theVecSize; n++) {
+ 		NState::State theState;
+ 		if (immediate) theState = nodeVec[n]->state();
+ 		else           theState = nodeVec[n]->computedState( Node::HIERARCHICAL );
+
+ 		// std::cout << "the computed state for " << nodeVec[n]->debugNodePath() << " is " << NState::toString(theState) << "\n";
+
+  		switch ( theState ) {
+ 			case NState::ABORTED:   abortedCount++;   break;
+  			case NState::ACTIVE:    activeCount++;    break;
+ 			case NState::SUBMITTED: submittedCount++; break;
+ 			case NState::QUEUED:    queuedCount++;    break;
+ 			case NState::COMPLETE:  completeCount++;  break;
+ 			case NState::UNKNOWN:   unknownCount++;   break;
+ 			default : assert(false); break;
+ 		}
+ 	}
+ 	if (abortedCount > 0)    return NState::ABORTED;
+  	if (activeCount > 0)     return NState::ACTIVE;
+ 	if (submittedCount > 0)  return NState::SUBMITTED;
+ 	if (queuedCount > 0)     return NState::QUEUED;
+ 	if (completeCount > 0 && completeCount == static_cast<int>(theVecSize)) {
+ 		return NState::COMPLETE;
+ 	}
+ 	if (completeCount > 0) {
+ 		return NState::QUEUED;
+ 	}
+ 	return NState::UNKNOWN;
+}
+}
+#endif
diff --git a/ecflow_4_0_7/ANode/src/NodeTreeVisitor.cpp b/ecflow_4_0_7/ANode/src/NodeTreeVisitor.cpp
new file mode 100644
index 0000000..f51657a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeTreeVisitor.cpp
@@ -0,0 +1,23 @@
+ //============================================================================
+// Name        : Cmd
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+
+#include "NodeTreeVisitor.hpp"
+
+namespace ecf {
+
+NodeTreeVisitor::~NodeTreeVisitor() {}
+
+} // namespace ecf
diff --git a/ecflow_4_0_7/ANode/src/NodeTreeVisitor.hpp b/ecflow_4_0_7/ANode/src/NodeTreeVisitor.hpp
new file mode 100644
index 0000000..96c05bd
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/NodeTreeVisitor.hpp
@@ -0,0 +1,40 @@
+#ifndef NODETREEVISITOR_HPP_
+#define NODETREEVISITOR_HPP_
+//============================================================================
+// Name        : Cmd
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+class Defs;
+class Suite;
+class Family;
+class Task;
+class NodeContainer;
+
+namespace ecf {
+
+class NodeTreeVisitor {
+public:
+	virtual ~NodeTreeVisitor();
+
+	virtual bool traverseObjectStructureViaVisitors() const { return false;}
+	virtual void visitDefs(Defs*) = 0;
+	virtual void visitSuite(Suite*) = 0;
+	virtual void visitFamily(Family*) = 0;
+	virtual void visitNodeContainer(NodeContainer*) = 0;
+	virtual void visitTask(Task*) = 0;
+};
+
+}
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ResolveExternsVisitor.cpp b/ecflow_4_0_7/ANode/src/ResolveExternsVisitor.cpp
new file mode 100644
index 0000000..537b6ac
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ResolveExternsVisitor.cpp
@@ -0,0 +1,125 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ResolveExternsVisitor.hpp"
+#include "ExprAstVisitor.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "ExprAst.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+///////////////////////////////////////////////////////////////////////////////
+// ResolveExternsVisitor: Will traverse node tree hierarchy
+ResolveExternsVisitor::ResolveExternsVisitor(Defs* defs) : defs_(defs) {}
+
+void ResolveExternsVisitor::visitDefs( Defs* d) {
+  	BOOST_FOREACH(suite_ptr s, d->suiteVec()) { s->acceptVisitTraversor(*this); }
+}
+
+void ResolveExternsVisitor::visitSuite( Suite* s)   { visitNodeContainer(s);}
+void ResolveExternsVisitor::visitFamily( Family* f) { visitNodeContainer(f); }
+
+void ResolveExternsVisitor::visitNodeContainer(NodeContainer* nc){
+
+ 	setup(nc);
+
+	BOOST_FOREACH(node_ptr t, nc->nodeVec()) {
+ 		t->acceptVisitTraversor(*this);
+  	}
+}
+
+void ResolveExternsVisitor::visitTask( Task* t) { setup(t);}
+
+void ResolveExternsVisitor::setup(Node* n)
+{
+   // Defs passed in to avoid, traversing up the node tree
+   n->auto_add_inlimit_externs(defs_);
+	doSetup(n,n->completeAst());
+	doSetup(n,n->triggerAst());
+}
+
+void ResolveExternsVisitor::doSetup(Node* node,Ast* ast)
+{
+  	if ( ast ) {
+		// The complete expression have been parsed and we have created the abstract syntax tree
+  		AstResolveExternVisitor astVisitor(node,defs_);
+ 		ast->accept(astVisitor);
+	}
+}
+
+//======================================================================================
+// AstResolveExternVisitor: Will traverse ASR tree hierarchy
+AstResolveExternVisitor::AstResolveExternVisitor(Node* node,Defs* defs)
+: triggerNode_(node), defs_(defs) {}
+
+AstResolveExternVisitor::~AstResolveExternVisitor() {}
+
+void AstResolveExternVisitor::visitNode(AstNode* astNode)
+{
+	//std::cout << "AstResolveExternVisitor::visitNode " << triggerNode_->debugNodePath() << "\n";
+
+	astNode->setParentNode(triggerNode_);
+
+	// See if can reference the path, on the AstNode, if we cant, it should be added as an extern
+	std::string errorMsg;
+	Node* node = astNode->referencedNode( errorMsg );
+	if ( !node ) {
+		/// Add this path to the extern's. Avoid adding duplicates
+		addExtern(astNode->nodePath());
+ 	}
+}
+
+void AstResolveExternVisitor::visitVariable(AstVariable* astVar)
+{
+	//std::cout << "AstResolveExternVisitor::visitNode " << triggerNode_->debugNodePath() << "\n";
+
+	astVar->setParentNode(triggerNode_);
+
+   // See if can reference the path, on the AstVariable, if we can't, it should be added as an extern
+	std::string errorMsg;
+	Node* theReferencedNode = astVar->referencedNode( errorMsg );
+	if ( !theReferencedNode ) {
+		addExtern(astVar->nodePath(),astVar->name());
+ 		return;
+	}
+	LOG_ASSERT(errorMsg.empty(),"");
+
+	// Ok,we found the referenced, node, now see if we can reference the attribute name
+	// Find in order, event, meter, user variable, repeat, generated variable
+ 	if (theReferencedNode->findExprVariable( astVar->name() ) ) {
+		return;
+	}
+
+ 	// Can't find name, in event, meter, user variable, repeat, generated variable, add as extern
+	addExtern(astVar->nodePath(),astVar->name());
+}
+
+void AstResolveExternVisitor::addExtern(const std::string& absNodePath, const std::string& var)
+{
+	string ext = absNodePath;
+	if (!var.empty()) {
+		ext += Str::COLON();
+		ext += var;
+	}
+	defs_->add_extern(ext); // stored in a set:
+}
+}
diff --git a/ecflow_4_0_7/ANode/src/ResolveExternsVisitor.hpp b/ecflow_4_0_7/ANode/src/ResolveExternsVisitor.hpp
new file mode 100644
index 0000000..14c3b1c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ResolveExternsVisitor.hpp
@@ -0,0 +1,81 @@
+#ifndef RESOLVE_EXTERNS_VISITOR_HPP_
+#define RESOLVE_EXTERNS_VISITOR_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "NodeTreeVisitor.hpp"
+#include "ExprAstVisitor.hpp"
+#include <string>
+#include <set>
+class Node;
+class Ast;
+
+namespace ecf {
+
+class ResolveExternsVisitor : public NodeTreeVisitor {
+public:
+	ResolveExternsVisitor(Defs*);
+
+	virtual bool traverseObjectStructureViaVisitors() const { return true;}
+	virtual void visitDefs(Defs*);
+	virtual void visitSuite(Suite*);
+	virtual void visitFamily(Family*);
+	virtual void visitNodeContainer(NodeContainer*);
+	virtual void visitTask(Task*);
+
+private:
+	void setup(Node*);
+	void doSetup(  Node* node, Ast* ast) ;
+
+  	Defs* defs_;
+};
+
+class AstResolveExternVisitor : public ExprAstVisitor {
+public:
+	AstResolveExternVisitor( Node*, Defs*);
+	virtual ~AstResolveExternVisitor();
+
+  	virtual void visitTop(AstTop*){}
+ 	virtual void visitRoot(AstRoot*){}
+ 	virtual void visitAnd(AstAnd*){}
+ 	virtual void visitNot(AstNot*){}
+ 	virtual void visitPlus(AstPlus*){}
+ 	virtual void visitMinus(AstMinus*){}
+ 	virtual void visitDivide(AstDivide*){}
+   virtual void visitMultiply(AstMultiply*){}
+   virtual void visitModulo(AstModulo*){}
+ 	virtual void visitOr(AstOr*){}
+ 	virtual void visitEqual(AstEqual*){}
+ 	virtual void visitNotEqual(AstNotEqual*){}
+ 	virtual void visitLessEqual(AstLessEqual*){}
+ 	virtual void visitGreaterEqual(AstGreaterEqual*){}
+ 	virtual void visitGreaterThan(AstGreaterThan*){}
+ 	virtual void visitLessThan(AstLessThan*){}
+ 	virtual void visitLeaf(AstLeaf*){}
+ 	virtual void visitInteger(AstInteger*){}
+ 	virtual void visitString(AstString*){}
+ 	virtual void visitNodeState(AstNodeState*){}
+ 	virtual void visitEventState(AstEventState*){}
+ 	virtual void visitNode(AstNode*);
+  	virtual void visitVariable(AstVariable*);
+
+private:
+	void addExtern(const std::string& absNodePath, const std::string& var = "");
+	Node* triggerNode_;
+	Defs* defs_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ANode/src/ServerState.cpp b/ecflow_4_0_7/ANode/src/ServerState.cpp
new file mode 100644
index 0000000..e1e2201
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ServerState.cpp
@@ -0,0 +1,455 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #29 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+#include <iostream>
+#include "ServerState.hpp"
+#include "Str.hpp"
+#include "Log.hpp"
+#include "Host.hpp"
+#include "Ecf.hpp"
+#include "Version.hpp"
+
+using namespace ecf;
+using namespace std;
+
+// When a Defs is loaded into a server:
+//       	o the jobSubmissionInterval_ is set
+//       	o the jobGeneration_ is set
+ServerState::ServerState() :
+	state_change_no_(0),
+   variable_state_change_no_(0),
+	server_state_( default_state() ),
+ 	jobSubmissionInterval_( 60 ),
+ 	jobGeneration_( true )
+{
+	setup_default_env();
+}
+
+bool ServerState::operator==(const ServerState& rhs) const
+{
+   if ( get_state() != rhs.get_state()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ServerState::operator== get_state(" << SState::to_string(get_state()) << ") != rhs.get_state(" << SState::to_string(rhs.get_state()) << ")\n";
+      }
+#endif
+      return false;
+   }
+
+   if ( user_variables_ != rhs.user_variables_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ServerState::compare user_variables_ != rhs.user_variables_\n";
+         std::cout << "user_variables_:\n";
+         for(std::vector<Variable>::const_iterator i = user_variables_.begin(); i!=user_variables_.end(); ++i) {
+            std::cout << "   " << (*i).name() << " " << (*i).theValue() << "\n";
+         }
+         std::cout << "rhs.user_variables_:\n";
+         for(std::vector<Variable>::const_iterator i = rhs.user_variables_.begin(); i!=rhs.user_variables_.end(); ++i) {
+            std::cout << "   " << (*i).name() << " " << (*i).theValue() << "\n";
+         }
+      }
+#endif
+      return false;
+   }
+
+   /// Check pointing, SAVES server variables, since they are visualised by client like ecflowview
+   /// HOWEVER PrintStyle::MIGRATE does not save the server variables, since they should
+   /// not take part in migration. However the testing compares migration files with check point files
+   /// This would always fail. Hence we do not compare server variables.
+
+   return true;
+}
+
+bool ServerState::compare(const ServerState& rhs) const
+{
+   if ( get_state() != rhs.get_state()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ServerState::compare get_state(" << SState::to_string(get_state()) << ") != rhs.get_state(" << SState::to_string(rhs.get_state()) << ")\n";
+      }
+#endif
+      return false;
+   }
+
+   if ( user_variables_ != rhs.user_variables_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ServerState::compare user_variables_ != rhs.user_variables_\n";
+         std::cout << "user_variables_:\n";
+         for(std::vector<Variable>::const_iterator i = user_variables_.begin(); i!=user_variables_.end(); ++i) {
+            std::cout << "   " << (*i).name() << " " << (*i).theValue() << "\n";
+         }
+         std::cout << "rhs.user_variables_:\n";
+         for(std::vector<Variable>::const_iterator i = rhs.user_variables_.begin(); i!=rhs.user_variables_.end(); ++i) {
+            std::cout << "   " << (*i).name() << " " << (*i).theValue() << "\n";
+         }
+      }
+#endif
+      return false;
+   }
+
+   if ( server_variables_ != rhs.server_variables_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "ServerState::compare server_variables_ != rhs.server_variables_\n";
+         std::cout << "server_variables_:\n";
+         for(std::vector<Variable>::const_iterator i = server_variables_.begin(); i!=server_variables_.end(); ++i) {
+            std::cout << "   " << (*i).name() << " " << (*i).theValue() << "\n";
+         }
+         std::cout << "rhs.server_variables_:\n";
+         for(std::vector<Variable>::const_iterator i = rhs.server_variables_.begin(); i!=rhs.server_variables_.end(); ++i) {
+            std::cout << "   " << (*i).name() << " " << (*i).theValue() << "\n";
+         }
+      }
+#endif
+      return false;
+   }
+   return true;
+}
+
+// server variable can NOT be modified or deleted, only overridden
+void ServerState::add_or_update_server_variables( const NameValueVec& env)
+{
+   // n2 could use map to speed things up.
+   NameValueVec::const_iterator i;
+   NameValueVec::const_iterator theEnd = env.end();
+   for(i = env.begin(); i!=theEnd; ++i) {
+      add_or_update_server_variables((*i).first, (*i).second);
+   }
+}
+void ServerState::add_or_update_server_variables( const std::string& name, const std::string& value)
+{
+   std::vector<Variable>::iterator var_end = server_variables_.end();
+   for(std::vector<Variable>::iterator i = server_variables_.begin(); i!=var_end; ++i) {
+      if ((*i).name() == name) {
+         (*i).set_value( value );
+//         std::cout << "   Server Variables: Updating " << name << "   " << value << "\n";
+         return;
+      }
+   }
+//   std::cout << "   Server Variables: Adding " << name << "   " << value << "\n";
+   server_variables_.push_back( Variable(name, value) );
+}
+
+void ServerState::set_server_variables(const std::vector<Variable>& e)
+{
+   server_variables_ = e;
+}
+
+void ServerState::delete_server_variable( const std::string& var)
+{
+   std::vector<Variable>::iterator var_end = server_variables_.end();
+   for(std::vector<Variable>::iterator i = server_variables_.begin(); i!=var_end; ++i) {
+      if ((*i).name() == var) {
+         server_variables_.erase(i);
+         break;
+      }
+   }
+}
+
+// ================================================================================
+
+void ServerState::add_or_update_user_variables( const NameValueVec& env)
+{
+   // n2 could use map to speed things up.
+   NameValueVec::const_iterator i;
+   NameValueVec::const_iterator theEnd = env.end();
+   for(i = env.begin(); i!=theEnd; ++i) {
+      add_or_update_user_variables((*i).first, (*i).second);
+   }
+}
+
+void ServerState::add_or_update_user_variables( const std::vector<Variable>& env)
+{
+   std::vector<Variable>::const_iterator var_end = env.end();
+   for(std::vector<Variable>::const_iterator i = env.begin(); i!=var_end; ++i) {
+      add_or_update_user_variables( (*i).name(), (*i).theValue());
+   }
+}
+
+void ServerState::add_or_update_user_variables( const std::string& name, const std::string& value)
+{
+   std::vector<Variable>::iterator var_end = user_variables_.end();
+   for(std::vector<Variable>::iterator i = user_variables_.begin(); i!=var_end; ++i) {
+      if ((*i).name() == name) {
+         (*i).set_value( value );
+         variable_state_change_no_ = Ecf::incr_state_change_no();
+//         std::cout << "   ServerState::add_or_update_user_variables: Updating " << name << "   " << value << "\n";
+         return;
+      }
+   }
+
+//	std::cout << "   ServerState::add_or_update_user_variables: Adding " << name << "   " << value << "\n";
+   user_variables_.push_back( Variable(name, value) );
+	variable_state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void ServerState::delete_user_variable( const std::string& var)
+{
+   if (var.empty()) {
+      // delete all user variables
+      user_variables_.clear();
+      variable_state_change_no_ = Ecf::incr_state_change_no();
+      return;
+   }
+
+   std::vector<Variable>::iterator var_end = user_variables_.end();
+   for(std::vector<Variable>::iterator i = user_variables_.begin(); i!=var_end; ++i) {
+      if ((*i).name() == var) {
+         user_variables_.erase(i);
+         variable_state_change_no_ = Ecf::incr_state_change_no();
+         break;
+      }
+   }
+}
+
+const std::string& ServerState::find_variable(const std::string& theVarName) const
+{
+   // SEARCH USER variables FIRST
+   std::vector<Variable>::const_iterator user_var_end = user_variables_.end();
+   for(std::vector<Variable>::const_iterator i = user_variables_.begin(); i!=user_var_end; ++i) {
+      if ((*i).name() == theVarName) {
+//			cerr << "FOUND '" << (*i).first << "'   '" << (*i).second << "'\n";
+			LOG_ASSERT(!(*i).theValue().empty(),"");
+ 			return (*i).theValue();
+		}
+	}
+
+   // NOW search server variables
+   std::vector<Variable>::const_iterator ser_var_end = server_variables_.end();
+   for(std::vector<Variable>::const_iterator i = server_variables_.begin(); i!=ser_var_end; ++i) {
+      if ((*i).name() == theVarName) {
+//       cerr << "FOUND '" << (*i).first << "'   '" << (*i).second << "'\n";
+         LOG_ASSERT(!(*i).theValue().empty(),"");
+         return (*i).theValue();
+      }
+   }
+
+//	cerr << "FAILED to FIND '" << theVarName << "'\n";
+	return Str::EMPTY();
+}
+
+const Variable& ServerState::findVariable(const std::string& name) const
+{
+   // SEARCH USER variables FIRST
+   std::vector<Variable>::const_iterator var_end = user_variables_.end();
+   for(std::vector<Variable>::const_iterator i = user_variables_.begin(); i!=var_end; ++i) {
+      if ((*i).name() == name) {
+         LOG_ASSERT(!(*i).theValue().empty(),"");
+         // if ((*i).theValue().empty() )  std::cout << (*i).name() << " has a empty value\n";
+         return (*i);
+      }
+   }
+
+   // NOW search server variables
+   std::vector<Variable>::const_iterator ser_var_end = server_variables_.end();
+   for(std::vector<Variable>::const_iterator i = server_variables_.begin(); i!=ser_var_end; ++i) {
+      if ((*i).name() == name) {
+         LOG_ASSERT(!(*i).theValue().empty(),"");
+         // if ((*i).theValue().empty() )  std::cout << (*i).name() << " has a empty value\n";
+         return (*i);
+      }
+   }
+
+// cerr << "FAILED to FIND '" << theVarName << "'\n";
+   return Variable::EMPTY();
+}
+
+bool ServerState::variable_exists(const std::string& name) const
+{
+   // SEARCH USER variables FIRST
+   std::vector<Variable>::const_iterator var_end = user_variables_.end();
+   for(std::vector<Variable>::const_iterator i = user_variables_.begin(); i!=var_end; ++i) {
+      if ((*i).name() == name) return true;
+   }
+
+   // NOW search server variables
+   std::vector<Variable>::const_iterator ser_var_end = server_variables_.end();
+   for(std::vector<Variable>::const_iterator i = server_variables_.begin(); i!=ser_var_end; ++i) {
+      if ((*i).name() == name) return true;
+   }
+
+   return false;
+}
+
+bool ServerState::variableSubsitution(std::string& cmd) const
+{
+   // scan the command for variables, and substitute
+   // We can also have
+   //
+   // "%<VAR>:<substitute>% i.e if VAR exist use it, else use substitute
+   //
+   // ************************************************************************************************************
+   // Special case handling for user variables, and generated variables, which take precedence over node variables
+   // ************************************************************************************************************
+   //
+   // i.e VAR is defined as BILL
+   //  %VAR:fred --f%  will either be "BILL" or if VAR is not defined "fred --f"
+   //
+   // Infinite recursion. Its possible to end up with infinite recursion:
+   //    edit hello '%hello%'  # string like %hello% will cause infinite recursion
+   //    edit fred '%bill%'
+   //    edit bill '%fred%'   # should be 10
+   // To prevent this we will use a simple count
+   char micro = '%';
+   const Variable& micro_var = findVariable(Str::ECF_MICRO());
+   if (!micro_var.empty() && !micro_var.theValue().empty() ) micro = micro_var.theValue()[0];
+
+   bool double_micro_found = false;
+   std::string::size_type pos = 0;
+   int count = 0;
+   while ( 1 ) {
+      // A while loop here is used to:
+      //    a/ Allow for multiple substitution on a single line. i.e %ECF_FILES% -I %ECF_INCLUDE%"
+      //    b/ Allow for recursive substitution. %fred% -> %bill%--> 10
+
+      size_t firstPercentPos = cmd.find( micro, pos );
+      if ( firstPercentPos == string::npos ) break;
+
+      size_t secondPercentPos = cmd.find( micro, firstPercentPos + 1 );
+      if ( secondPercentPos == string::npos ) break;
+
+      if ( secondPercentPos - firstPercentPos <= 1 ) {
+         // handle %% with no characters in between, skip over
+         // i.e to handle "printf %%02d %HOUR:00%" --> "printf %02d 00"   i.e if HOUR not defined
+         pos = secondPercentPos + 1;
+         double_micro_found = true;
+         continue;
+      }
+      else pos = 0;
+
+      string percentVar( cmd.begin() + firstPercentPos+1, cmd.begin() + secondPercentPos );
+
+      // First search user variable (*ONLY* set when doing user edit's the script)
+      // Handle case: cmd = "%fred:bill% and where we have user variable "fred:bill"
+      // Handle case: cmd = "%fred%      and where we have user variable "fred"
+      // If we fail to find the variable we return false.
+      // Note: When a variable is found, it can have an empty value  which is still valid
+      const Variable& variable = findVariable( percentVar );
+      if (!variable.empty() ) {
+         std::string varValue = variable.theValue();
+         cmd.replace( firstPercentPos, secondPercentPos - firstPercentPos + 1, varValue );
+      }
+      else {
+
+         size_t firstColon = percentVar.find( ':' );
+         if (firstColon != string::npos) {
+
+            string var(percentVar.begin(), percentVar.begin() + firstColon);
+
+            const Variable& variable2 = findVariable( var );
+            if (!variable2.empty() ) {
+               std::string varValue = variable2.theValue();
+               cmd.replace( firstPercentPos, secondPercentPos - firstPercentPos + 1, varValue );
+            }
+            else {
+               string substitute (percentVar.begin()+ firstColon+1, percentVar.end());
+               cmd.replace(firstPercentPos,secondPercentPos-firstPercentPos+1,substitute);
+            }
+         }
+         else {
+            // No Colon, Can't find in user variables, or node variable, hence can't go any further
+            return false;
+         }
+      }
+
+      // Simple Check for infinite recursion
+      if (count > 100)  return false;
+      count++;
+   }
+
+   if (double_micro_found) {
+      // replace all double micro with a single micro, this must be a single parse
+      // date +%%Y%%m%%d" ==> date +%Y%m%d
+      // %%%%             ==> %%            // i.e single parse
+      std::string doubleEcfMicro;
+      doubleEcfMicro += micro;
+      doubleEcfMicro += micro;
+      size_t last_pos = 0;
+      while ( 1 ) {
+          string::size_type ecf_double_micro_pos = cmd.find( doubleEcfMicro , last_pos);
+          if ( ecf_double_micro_pos != std::string::npos ) {
+             cmd.erase( cmd.begin() + ecf_double_micro_pos );
+             last_pos = ecf_double_micro_pos + 1;
+          }
+          else break;
+       }
+   }
+
+   return true;
+}
+
+void ServerState::set_user_variables(const std::vector<Variable>& e)
+{
+   user_variables_ = e;
+   variable_state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void ServerState::set_state(SState::State s) {
+	server_state_ = s;
+	state_change_no_ = Ecf::incr_state_change_no();
+}
+
+
+void ServerState::setup_default_env()
+{
+	// This environment is required for testing in the absence of the server.
+	// When the defs file is begun in the server this environment get *overridden*
+	hostPort_ = std::make_pair(Str::LOCALHOST(),Str::DEFAULT_PORT_NUMBER());
+
+	setup_default_server_variables(server_variables_,Str::DEFAULT_PORT_NUMBER());
+}
+
+void ServerState::setup_default_server_variables(std::vector<Variable>&  server_variables, const std::string& port)
+{
+   Host host;
+   server_variables.push_back( Variable(Str::ECF_MICRO(), Ecf::MICRO() )); //Preprocessor character for variable substitution and including files
+   server_variables.push_back( Variable(Str::ECF_HOME(), string(".")) );
+   server_variables.push_back( Variable(string("ECF_JOB_CMD"), Ecf::JOB_CMD() )); //Command to be executed to submit a job
+   server_variables.push_back( Variable(string("ECF_KILL_CMD"), Ecf::KILL_CMD() )); // Command to be executed to kill a job
+   server_variables.push_back( Variable(string("ECF_STATUS_CMD"), Ecf::STATUS_CMD() )); // Command to be executed to kill a job
+   server_variables.push_back( Variable(string("ECF_URL_CMD"), Ecf::URL_CMD() ));
+   server_variables.push_back( Variable(string("ECF_URL_BASE"), Ecf::URL_BASE() ));
+   server_variables.push_back( Variable(string("ECF_URL"), Ecf::URL() ));
+   server_variables.push_back( Variable(string("ECF_LOG"), host.ecf_log_file(port) ));
+   server_variables.push_back( Variable(string("ECF_INTERVAL"), string("60") ));            // Check time dependencies and submit any jobs
+   server_variables.push_back( Variable(string("ECF_LISTS"), host.ecf_lists_file(port) ));
+   server_variables.push_back( Variable(string("ECF_CHECK"), host.ecf_checkpt_file(port) ));
+   server_variables.push_back( Variable(string("ECF_CHECKOLD"), host.ecf_backup_checkpt_file(port)));
+   server_variables.push_back( Variable(string("ECF_CHECKINTERVAL"), string("120") ));      //The interval in seconds to save check point file
+   server_variables.push_back( Variable(string("ECF_CHECKMODE"), string("CHECK_ON_TIME")) );//The check mode, must be one of NEVER, ON_TIME, ALWAYS
+
+   // Number of times a job should rerun if it aborts. If more than one and
+   // job aborts, the job is automatically re-run. Useful when jobs are run in
+   // an unreliable environments. For example using using commands like ftp(1)
+   // in a job can fail easily, but re-running the job will often work
+   server_variables.push_back( Variable(Str::ECF_TRIES(), string("2")) );
+
+   server_variables.push_back( Variable(string("ECF_VERSION"),Version::raw()) );// server version
+
+   // Needed to setup client environment.
+   // The server sets these variable for use by the client. i.e when creating the jobs
+   // The clients then uses them to communicate with the server.
+   server_variables.push_back( Variable(Str::ECF_PORT(),port) );
+   server_variables.push_back( Variable(Str::ECF_NODE(),Str::LOCALHOST()) );
+}
+
+/// determines why the node is not running.
+void ServerState::why(std::vector<std::string>& theReasonWhy) const
+{
+   if (server_state_ == SState::HALTED)   theReasonWhy.push_back("The server is halted");
+   if (server_state_ == SState::SHUTDOWN) theReasonWhy.push_back("The server is shutdown");
+}
diff --git a/ecflow_4_0_7/ANode/src/ServerState.hpp b/ecflow_4_0_7/ANode/src/ServerState.hpp
new file mode 100644
index 0000000..fd522e5
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/ServerState.hpp
@@ -0,0 +1,139 @@
+#ifndef SERVER_STATE_HPP_
+#define SERVER_STATE_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/string.hpp>         // no need to include <string>
+
+#include "SState.hpp"
+#include "NodeFwd.hpp"
+#include "Variable.hpp"
+
+/// This class stores the server state, so that it is accessible by the node tree
+///
+/// The server variables could have been added/deleted or changed, hence these
+/// variables are serialised, also:  it has proved useful i.e for
+///    a/ Client to visualise the server environment during a call like -group="get; show state"
+///    b/ Allows the test code to update environment. ie. use ECF_CLIENT
+////      allows us to replace smsinit, smscomplete,etc, with the ECF client exe
+//
+// Note The default state here is RUNNING while in the server the default state is HALTED
+// By choosing RUNNING, it allows the Defs related test, to run without explicitly setting the state
+class ServerState : private boost::noncopyable {
+public:
+	ServerState();
+
+   /// Check pointing, SAVES server variables, since they are visualised by client like ecflowview
+   /// HOWEVER PrintStyle::MIGRATE does not save the server variables, since they should
+   /// not take part in migration. However the testing compares migration files with check point files
+   /// This would always fail. Hence we do not compare server variables.
+	/// This does not compare server variables
+   bool operator==(const ServerState& rhs) const;
+   bool operator!=(const ServerState& rhs) const { return !operator==(rhs);}
+
+   /// This does compare server variables. Used in testing
+   bool compare(const ServerState& rhs) const;
+
+   /// The server variable: are automatically added by the server
+   /// on STARTUP and when a checkpoint file is reloaded.
+   /// The variable are required by Job creation & needed in creation of generated variables
+   /// The variables should NOT be modified.
+   ///
+   /// However user variables can be freely added,deleted and modified
+   /// They will override server variables of the same name
+
+   void add_or_update_server_variables( const NameValueVec& env);
+   void delete_server_variable( const std::string&); // should only be used by test
+   void set_server_variables(const std::vector<Variable>& e);
+   const std::vector<Variable>& server_variables() const { return server_variables_; }
+
+   void add_or_update_user_variables( const NameValueVec& env);
+   void add_or_update_user_variables( const std::vector<Variable>& env);
+ 	void add_or_update_user_variables( const std::string&, const std::string&);
+ 	void delete_user_variable( const std::string&);
+
+   void set_user_variables(const std::vector<Variable>& e);
+   const std::vector<Variable>& user_variables() const { return user_variables_; }
+
+   // Search user variables, and then server variables
+   const std::string& find_variable(const std::string& name) const;
+   const Variable& findVariable(const std::string& name) const;
+   bool variable_exists(const std::string& name) const;
+
+   /// find all %VAR% and replaces with variable values, returns false on the
+   /// first variable that can't be found, cmd will be left half processed.
+   /// Will search for ECF_MICRO, if not found assumes % as the micro char
+   bool variableSubsitution(std::string& cmd) const;
+
+  	// These functions/data are used to during job generation
+	void jobSubmissionInterval(int s) { jobSubmissionInterval_ =  s;}
+	int jobSubmissionInterval() const { return jobSubmissionInterval_;}
+	bool jobGeneration() const { return jobGeneration_;} // testing may disable job generation
+	void jobGeneration(bool f) { jobGeneration_ = f;}
+
+ 	void set_state(SState::State s);
+ 	SState::State get_state() const { return server_state_; }
+ 	static SState::State default_state() { return SState::RUNNING; }
+
+	// set by the server hence no need persist
+	void hostPort( const std::pair<std::string,std::string>& hostPort ) { hostPort_ = hostPort;}
+	std::pair<std::string,std::string> hostPort() const { return hostPort_; }
+
+	/// Currently only SState::State server_state_ recorded
+   unsigned int state_change_no() const { return state_change_no_; }
+   unsigned int variable_state_change_no() const { return variable_state_change_no_; }
+
+   /// determines why the node is not running.
+   void why(std::vector<std::string>& theReasonWhy) const;
+
+   /// Used in test
+   static void setup_default_server_variables(std::vector<Variable>&  server_variables, const std::string& port);
+
+private:
+ 	void setup_default_env();
+
+   void add_or_update_server_variables( const std::string&, const std::string&);
+
+private:
+
+   unsigned int state_change_no_;                // *not* persisted, only used on server side
+   unsigned int variable_state_change_no_;       // *not* persisted, only used on server side
+
+ 	SState::State server_state_;
+   std::vector<Variable>  server_variables_;
+   std::vector<Variable>  user_variables_;
+
+ 	int jobSubmissionInterval_;                   // NOT persisted, since set in the server
+ 	bool jobGeneration_;                          // NOT persisted, since set in the server
+ 	std::pair<std::string,std::string> hostPort_; // NOT persisted, set by server hence no need to persist
+
+private:
+ 	friend class boost::serialization::access;
+ 	template<class Archive>
+ 	void serialize(Archive & ar, const unsigned int /*version*/)
+ 	{
+ 	   ar & server_state_;
+      ar & user_variables_;
+      ar & server_variables_;
+ 	}
+};
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+BOOST_CLASS_IMPLEMENTATION(ServerState, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(ServerState,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Signal.cpp b/ecflow_4_0_7/ANode/src/Signal.cpp
new file mode 100644
index 0000000..7a57b51
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Signal.cpp
@@ -0,0 +1,66 @@
+//============================================================================
+// Name        : Signal
+// Author      : Avi
+// Revision    : $Revision: #8 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include "Signal.hpp"
+#include <signal.h>
+#include <iostream>
+
+namespace ecf {
+
+// SIGCHLD : Child status has changed (POSIX)
+// Signal sent to parent process whenever one of its child processes terminates or stops.
+
+Signal::Signal() {}
+
+Signal::~Signal()
+{
+   // Unblock SIGCHLD. This will call the signal-handler in System.cpp,
+   // *IF* we have pending SIGCHLD
+   // This will not return until we have handled all the pending SIGCHLD signal
+   unblock_sigchild();
+
+   // Once the signals are processed, block them until we come in here again
+   // Now block again.
+   block_sigchild();
+}
+
+void Signal::block_sigchild()
+{
+   // Now block again.
+   sigset_t set;
+   sigemptyset( &set );
+   sigaddset( &set, SIGCHLD );
+#ifdef ECFLOW_MT
+   rc = pthread_sigmask(SIG_BLOCK, &set, 0 ); // not tested
+   if (rc != 0) std::cerr << "Signal::~Signal(): pthread_sigmask(SIG_UNBLOCK, &set, 0) returned " << rc << "\n";
+#else
+   sigprocmask( SIG_BLOCK, &set, 0 );
+#endif
+}
+
+void Signal::unblock_sigchild()
+{
+   sigset_t set;
+   sigemptyset( &set );
+   sigaddset( &set, SIGCHLD );
+#ifdef ECFLOW_MT
+   int rc = pthread_sigmask(SIG_UNBLOCK, &set, 0 ); // not tested
+   if (rc != 0) std::cerr << "Signal::~Signal(): pthread_sigmask(SIG_UNBLOCK, &set, 0) returned " << rc << "\n";
+#else
+   sigprocmask( SIG_UNBLOCK, &set, 0 );
+#endif
+}
+
+}
diff --git a/ecflow_4_0_7/ANode/src/Signal.hpp b/ecflow_4_0_7/ANode/src/Signal.hpp
new file mode 100644
index 0000000..1dddc74
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Signal.hpp
@@ -0,0 +1,38 @@
+#ifndef SIGNAL_HPP_
+#define SIGNAL_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : During destruction will un-block SIGCHILD and then reblock
+//               During job generation we want to avoid being notified of
+//               of child process termination.
+//               We want to control when child process termination is handled
+// Collaboration: System.hpp
+//============================================================================
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+class Signal : private boost::noncopyable {
+public:
+   Signal();
+
+   /// UNBLOCK SIGCHLD at start of destructor
+   /// BLOCK SIGCHLD and the end of the destructor
+   /// During the gap in between handle process termination
+   ~Signal();
+
+   static void block_sigchild();
+   static void unblock_sigchild();
+};
+}
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Submittable.cpp b/ecflow_4_0_7/ANode/src/Submittable.cpp
new file mode 100644
index 0000000..7eab59f
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Submittable.cpp
@@ -0,0 +1,906 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #37 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/filesystem/exception.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/make_shared.hpp>
+
+#include "Submittable.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "File.hpp"
+#include "Passwd.hpp"
+#include "Stl.hpp"
+#include "Str.hpp"
+#include "Indentor.hpp"
+#include "Log.hpp"
+#include "System.hpp"
+#include "JobsParam.hpp"
+#include "EcfFile.hpp"
+#include "Ecf.hpp"
+#include "DefsDelta.hpp"
+#include "Extract.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+namespace fs = boost::filesystem;
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+//#define DEBUG_TASK_LOCATION 1
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+// init static
+const std::string& Submittable::DUMMY_JOBS_PASSWORD()        { static const std::string DUMMY_JOBS_PASSWORD = "_DJP_"; return DUMMY_JOBS_PASSWORD;}
+const std::string& Submittable::FREE_JOBS_PASSWORD()         { static const std::string FREE_JOBS_PASSWORD = "FREE"; return FREE_JOBS_PASSWORD;}
+const std::string& Submittable::DUMMY_PROCESS_OR_REMOTE_ID() { static const std::string DUMMY_PROCESS_OR_REMOTE_ID = "_RID_"; return DUMMY_PROCESS_OR_REMOTE_ID;}
+
+Submittable::~Submittable()
+{
+   delete sub_gen_variables_;
+}
+
+void Submittable::init( const std::string& the_process_or_remote_id)
+{
+   set_state( NState::ACTIVE );
+   set_process_or_remote_id(the_process_or_remote_id);
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Submittable::init\n";
+#endif
+}
+
+void Submittable::complete()
+{
+// cout << "Completed " << debugNodePath() << " at " << suite()->calendar().toString() << "\n";
+   set_state( NState::COMPLETE );
+   flag().clear(ecf::Flag::ZOMBIE);
+
+   /// Should we clear jobsPassword_ & process_id? It can be argued that
+   /// we should keep this. In case it is needed. i.e The job may not really be
+   /// complete. However keeping, this means the memory usage will continue to rise
+   /// Dependent on number of tasks. This can affect network bandwidth as well.
+   /// Hence to reduce network bandwidth we chose to clear the strings
+   clear();       // jobs password, process_id, aborted_reason
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Submittable::complete()\n";
+#endif
+}
+
+void Submittable::aborted(const std::string& reason)
+{
+   // Called during *abnormal* child termination
+   // This will bubble the state, and decrement any limits
+   set_aborted_only(reason);
+}
+
+void Submittable::set_process_or_remote_id(const std::string& id)
+{
+   process_or_remote_id_ = id;
+   set_genvar_ecfrid(process_or_remote_id_);
+   state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG
+   if (tryNo_ == 0 && process_or_remote_id_ != Submittable::DUMMY_PROCESS_OR_REMOTE_ID()) {
+      LogToCout logToCout;
+      LOG(Log::ERR,"Submittable::set_process_or_remote_id: " << absNodePath() << " process_id(" << id << ") tryNo == 0, how can this be ???");
+   }
+#endif
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Submittable::set_process_or_remote_id\n";
+#endif
+}
+
+void Submittable::begin()
+{
+   /// It is *very* important that we reset the passwords. This allows us to detect zombies.
+   tryNo_ = 0;    // reset try number
+   clear();       // jobs password, process_id, aborted_reason
+
+   Node::begin(); // see  Notes in: Node::begin() about update_generated_variables()
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Submittable::begin()\n";
+#endif
+}
+
+void Submittable::requeue(bool resetRepeats, int clear_suspended_in_child_nodes, bool reset_next_time_slot)
+{
+   /// It is *very* important that we reset the passwords. This allows us to detect zombies.
+   tryNo_ = 0;    // reset try number
+   clear();       // jobs password, process_id, aborted_reason
+
+   Node::requeue(resetRepeats,clear_suspended_in_child_nodes,reset_next_time_slot);
+   update_generated_variables();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Submittable::requeue\n";
+#endif
+}
+
+std::string Submittable::write_state() const
+{
+   // *IMPORTANT* we *CANT* use ';' character, since is used in the parser, when we have
+   //             multiple statement on a single line i.e.
+   //                 task a; task b;
+   std::stringstream ss;
+   if ( !jobsPassword_.empty() && jobsPassword_!= Submittable::DUMMY_JOBS_PASSWORD())  ss << " passwd:" << jobsPassword_;
+   if ( !process_or_remote_id_.empty() )  ss << " rid:" << process_or_remote_id_;
+
+   // The abortedReason_, can contain user generated messages, including \n and ;, hence remove these
+   // as they can mess up the parsing on reload.
+   if ( !abortedReason_.empty() ) {
+      std::string the_abort_reason = abortedReason_;
+      Str::replaceall(the_abort_reason,"\n","\\n");
+      Str::replaceall(the_abort_reason,";"," ");
+      ss << " abort<:" << the_abort_reason << ">abort";
+   }
+   if ( tryNo_ != 0)  ss << " try:" << tryNo_;
+   ss << Node::write_state();
+   return ss.str();
+}
+
+void Submittable::read_state(const std::string& line,const std::vector<std::string>& lineTokens)
+{
+   //  0    1   2
+   // task name #
+   for(size_t i = 3; i < lineTokens.size(); i++) {
+      if (lineTokens[i].find("passwd:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],jobsPassword_))
+            throw std::runtime_error( "Submittable::read_state failed for jobs password : " + name());
+      }
+      else if (lineTokens[i].find("rid:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],process_or_remote_id_))
+            throw std::runtime_error( "Submittable::read_state failed for rid : " + name());
+      }
+      else if (lineTokens[i].find("try:") != std::string::npos ) {
+         std::string try_number;
+         if (!Extract::split_get_second(lineTokens[i],try_number))
+            throw std::runtime_error( "Submittable::read_state failed for try number : " + name());
+         tryNo_ = Extract::theInt(try_number,"Submittable::read_state failed for try number");
+      }
+   }
+
+   // extract aborted reason
+   // The line tokens will truncate multiple spaces into a single space chars
+   // Hence use the line to extract the abort reason: This will preserve spaces
+   size_t first_pos = line.find("abort<:");
+   size_t last_pos = line.find(">abort");
+   if (first_pos != std::string::npos) {
+      if ( last_pos != std::string::npos) {
+         abortedReason_ = line.substr(first_pos+7, (last_pos-first_pos-7) );
+      }
+      else {
+         throw std::runtime_error("Submittable::read_state failed for abort reason. Expected abort reason to on single line;");
+      }
+   }
+
+   Node::read_state(line,lineTokens);
+}
+
+
+bool Submittable::operator==(const Submittable& rhs) const
+{
+   if ( jobsPassword_ != rhs.jobsPassword_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Submittable::operator==  jobsPassword_(" << jobsPassword_ << ") != rhs.jobsPassword_(" << rhs.jobsPassword_ << ") " << debugNodePath() << "\n";
+         std::cout << "Submittable::operator==  state(" << NState::toString(state()) << ")  rhs.state(" << NState::toString(rhs.state()) << ") \n";
+         // No point dumping out change numbers, since we don't persist them, hence values will always be zero on client side.
+      }
+#endif
+      return false;
+   }
+
+   if ( process_or_remote_id_ != rhs.process_or_remote_id_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Submittable::operator==  process_or_remote_id_(" << process_or_remote_id_ << ") != rhs.process_or_remote_id_(" << rhs.process_or_remote_id_ << ") " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if ( tryNo_ != rhs.tryNo_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Submittable::operator==  tryNo_(" << tryNo_ << ") != rhs.tryNo_(" << rhs.tryNo_ << ") " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   if ( abortedReason_ != rhs.abortedReason_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Submittable::operator==  abortedReason_(" << abortedReason_ << ") != rhs.abortedReason_(" << rhs.abortedReason_ << ") " << debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   return Node::operator==(rhs);
+}
+
+string Submittable::tryNo() const
+{
+   try {
+      return boost::lexical_cast< string >( tryNo_ );
+   }
+   catch ( boost::bad_lexical_cast& e ) {}
+
+   LOG_ASSERT(false,"Submittable::tryNo() corrupt?");
+   return string();
+}
+
+
+EcfFile Submittable::locatedEcfFile() const
+{
+   // Look for scripts file(Task->.ecf | Alias->.usr) in the following order
+   // o/ ECF_SCRIPT Generated VARIABLE  absolute path, check if files exists
+   //    The variable MUST exist, but the file may not
+   // o/ ECF_FETCH (user variable)
+   //    if this variable exist, we need to flag it, somehow
+   //    So that when we open the sms file, we use popen.
+   // o/ ECF_FILES (Typically in the definition file, defines a directory)
+   // o/ ECF_HOME
+   std::string reasonEcfFileNotFound;
+   std::string theAbsNodePath = absNodePath();
+   std::string ecf_home;
+   findParentUserVariableValue( Str::ECF_HOME(), ecf_home);
+
+   /// Update local ECF_SCRIPT variable, ECF_SCRIPT is a generated variable. IT *MUST* exist
+   const Variable& genvar_ecfscript = update_genvar_ecfscript(ecf_home,theAbsNodePath);
+
+#ifdef DEBUG_TASK_LOCATION
+   std::cout << "Submittable::locatedEcfFile() Submittable " << name() << " searching ECF_SCRIPT = '" << genvar_ecfscript.theValue() << "'\n";
+#endif
+   if ( fs::exists( genvar_ecfscript.theValue() ) ) {
+#ifdef DEBUG_TASK_LOCATION
+      std::cout << "Submittable::locatedEcfFile() Submittable " << name() << " ECF_SCRIPT = '" << genvar_ecfscript.theValue() << "' exists\n";
+#endif
+      return EcfFile( const_cast<Submittable*>(this), genvar_ecfscript.theValue() );
+   }
+   else {
+      std::stringstream ss; ss << "   ECF_SCRIPT(" << genvar_ecfscript.theValue() << ") does not exist:\n";
+      reasonEcfFileNotFound += ss.str();
+   }
+
+   // Caution: This is not used in operations or research, equally is has not been tested.
+   // Need to test or remove.
+   std::string smsFetchCmd;
+   findParentVariableValue( Str::ECF_FETCH(), smsFetchCmd );
+   if ( !smsFetchCmd.empty() ) {
+#ifdef DEBUG_TASK_LOCATION
+      std::cout << "Submittable::locatedEcfFile() Submittable " << name() << " ECF_FETCH = '" << smsFetchCmd << "' variable exists\n";
+#endif
+      if (variableSubsitution(smsFetchCmd))  {
+         return EcfFile( const_cast<Submittable*>(this), smsFetchCmd, true/*is a command*/);
+      }
+      else {
+         std::stringstream ss; ss << "   Variable ECF_FETCH(" << smsFetchCmd << ") defined, but variable substitution has failed:\n";
+         reasonEcfFileNotFound += ss.str();
+         throw std::runtime_error( reasonEcfFileNotFound ) ;
+      }
+   }
+   else {
+      reasonEcfFileNotFound += "   Variable ECF_FETCH not defined:\n";
+   }
+
+
+   std::string ecf_filesDirectory ;
+   if (findParentUserVariableValue( Str::ECF_FILES() , ecf_filesDirectory)) {
+#ifdef DEBUG_TASK_LOCATION
+      std::cout << "Submittable::locatedEcfFile() Submittable " << name() << " searching ECF_FILES = '" << ecf_filesDirectory << "' backwards\n";
+#endif
+      if ( !ecf_filesDirectory.empty() && fs::exists( ecf_filesDirectory ) && fs::is_directory( ecf_filesDirectory ) )
+      {
+         // If File::backwardSearch fails it returns an empty string, i.e failure to locate script (Task/.ecf || Alias/.usr) file
+         std::string searchResult = File::backwardSearch( ecf_filesDirectory, theAbsNodePath, script_extension() );
+         if ( searchResult.empty()) {
+            std::stringstream ss; ss << "   Search of directory ECF_FILES(" << ecf_filesDirectory << ") failed:\n";
+            reasonEcfFileNotFound += ss.str();
+         }
+         else {
+            return EcfFile(const_cast<Submittable*>(this), searchResult);
+         }
+      }
+      else {
+         std::stringstream ss; ss << "   Directory ECF_FILES(" << ecf_filesDirectory << ") does not exist:\n";
+         reasonEcfFileNotFound += ss.str();
+      }
+   }
+   else {
+      reasonEcfFileNotFound += "   Variable ECF_FILES not defined:\n";
+   }
+
+
+#ifdef DEBUG_TASK_LOCATION
+   std::cout << "Submittable::locatedEcfFile() Submittable " << name() << " searching ECF_HOME = '" << ecf_home << "' backwards\n";
+#endif
+   if ( !ecf_home.empty() && fs::exists( ecf_home ) && fs::is_directory( ecf_home ) )
+   {
+      // If File::backwardSearch fails it returns an empty string, i.e failure to locate script (Task/.ecf || Alias/.usr) file
+      std::string searchResult = File::backwardSearch( ecf_home, theAbsNodePath, script_extension() );
+      if ( searchResult.empty()) {
+         std::stringstream ss; ss << "   Search of directory ECF_HOME(" << ecf_home << ") failed:\n";
+         reasonEcfFileNotFound += ss.str();
+      }
+      else {
+         return EcfFile(const_cast<Submittable*>(this), searchResult);
+      }
+   }
+   else {
+      std::stringstream ss; ss << "   Directory ECF_HOME(" << ecf_home << ") does not exist:\n";
+      reasonEcfFileNotFound += ss.str();
+   }
+
+   // failed to find  .ecf file
+   std::stringstream ss;
+   ss << "   Script for " << theAbsNodePath << " can not be found:\n" << reasonEcfFileNotFound;
+   throw std::runtime_error( ss.str() ) ;
+}
+
+void Submittable::set_jobs_password(const std::string& p)
+{
+   jobsPassword_ = p;
+   state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Submittable::set_jobs_password\n";
+#endif
+}
+
+void Submittable::increment_try_no()
+{
+   // EVERY time we SUBMIT a job we must:
+   // o generate a password, and hence updated generated variable ECF_PASS
+   // o increment the try number
+   //   This means we also need to regenerate the variables
+   //   since ECF_TRYNO , ECF_JOB, ECF_JOBOUT depend on the try number.
+   //   ALSO ECF_RID is updated with empty string
+   // o Clear the process/remote id. These will be reset by the child commands
+   // *** This MUST be done before pre-processing as it uses these variables ***
+   tryNo_++;
+   process_or_remote_id_.clear();
+   abortedReason_.clear();
+   jobsPassword_ = Passwd::generate();
+   state_change_no_ = Ecf::incr_state_change_no();
+   update_generated_variables();
+}
+
+void Submittable::clear()
+{
+   abortedReason_.clear();       // reset reason aborted
+   jobsPassword_.clear();        // reset password, it will be regenerated before submission
+   process_or_remote_id_.clear();// reset process id
+   state_change_no_ = Ecf::incr_state_change_no();
+}
+
+bool Submittable::submitJob( JobsParam& jobsParam)
+{
+   increment_try_no();
+
+   return submit_job_only(jobsParam);
+}
+
+bool Submittable::submit_job_only( JobsParam& jobsParam)
+{
+#ifdef DEBUG_JOB_SUBMISSION
+   cerr << "Submittable::submit_job_only for task " << name() << endl;
+#endif
+
+   if (state() == NState::ACTIVE  || state() == NState::SUBMITTED ) {
+      std::stringstream ss;
+      ss << "Submittable::submit_job_only: failed: Submittable " << absNodePath() << " is already " << NState::toString(state()) << " : ";
+      jobsParam.errorMsg() += ss.str();
+      flag().set(ecf::Flag::EDIT_FAILED);
+      return false;
+   }
+
+   // If the task is a dummy task, return true
+   std::string theValue;
+   if (findParentUserVariableValue(Str::ECF_DUMMY_TASK(),theValue)) {
+      return true;
+   }
+
+   // state change
+   flag().clear(ecf::Flag::NO_SCRIPT);
+   flag().clear(ecf::Flag::EDIT_FAILED);
+   flag().clear(ecf::Flag::JOBCMD_FAILED);
+   requeue_labels(); // ECFLOW-195, requeue no longer resets labels on tasks, hence we do it at task run time.
+
+   try {
+      // Locate the ecf files corresponding to the jobs.
+      EcfFile ecf_file = locatedEcfFile();
+
+      // Pre-process sms file (i.e expand includes, remove comments,manual) and perform
+      // variable substitution. This will then form the '.job' files.
+      // If the job file already exist it is overridden
+      try {
+         const std::string& job_size = ecf_file.create_job( jobsParam );
+
+         //... make sure ECF_PASS is set on the task, This is substituted in <head.h> file
+         //... and hence must be done before variable substitution in ECF_/JOB file
+         //... This is used by client->server authentication
+         if (createChildProcess(jobsParam)) {
+            set_state(NState::SUBMITTED, false, job_size );
+            return true;
+         }
+
+         // Fall through job submission failed.
+      }
+      catch ( std::exception& e) {
+         flag().set(ecf::Flag::EDIT_FAILED);
+         std::string reason = "Submittable::submit_job_only: Job creation failed for task ";
+         reason += absNodePath();
+         reason += " : \n   ";
+         reason += e.what();
+         reason += "\n";
+         jobsParam.errorMsg() += reason;
+         set_aborted_only( reason );
+         return false;
+      }
+   }
+   catch (std::exception& e) {
+
+      flag().set(ecf::Flag::NO_SCRIPT);
+      std::stringstream ss; ss << "Submittable::submit_job_only: Script location failed for task " << absNodePath() << " :\n" << e.what() << "\n";
+      jobsParam.errorMsg() += ss.str();
+      set_aborted_only( e.what() ); // remember jobsParam.errorMsg() is accumulated
+      return false;
+   }
+
+   flag().set(ecf::Flag::JOBCMD_FAILED);
+   std::string reason = " Job creation failed for task ";
+   reason += absNodePath();
+   reason += " could not create child process.";
+   jobsParam.errorMsg() += reason;
+   set_aborted_only( reason );
+   return false;
+}
+
+
+void Submittable::check_job_creation( job_creation_ctrl_ptr jobCtrl)
+{
+   // Typically a valid try number is >=1.
+   // Since check_job_creation is only used for testing/python, we will initialise tryNum to -1
+   // so than when it is incremented it will by a try_no of zero. *zero is an invalid try_no *
+   tryNo_ = -1;
+
+   /// call just before job submission, reset data members, update try_no, and *** generate variable ***
+   increment_try_no();
+
+   if ( !jobCtrl->dir_for_job_creation().empty() ) {
+      /// Override ECF_JOB, can be done by either adding a new user variable of same name
+      /// or the generated variable. We choose generated, since this is automatically reset.
+      /// before a real job submission
+      std::string tmpLocationForJob = jobCtrl->dir_for_job_creation();
+      tmpLocationForJob += absNodePath();
+      tmpLocationForJob += File::JOB_EXTN();
+      tmpLocationForJob += "0"; // try number of zero ( i.e an invalid try number)
+      set_genvar_ecfjob(tmpLocationForJob);
+   }
+
+   JobsParam jobsParam; // create jobs = false, spawn jobs = false
+   if ( submit_job_only(jobsParam) ) {
+      return;
+   }
+
+   std::string errorMsg = jobsParam.getErrorMsg();
+   LOG_ASSERT( !errorMsg.empty(), "failing to submit must raise an error message" );
+
+   jobCtrl->error_msg() += errorMsg;
+   jobCtrl->push_back_failing_submittable( dynamic_pointer_cast<Submittable>(shared_from_this()) );
+}
+
+bool Submittable::run(JobsParam& jobsParam, bool force)
+{
+   if (force || ((state() != NState::SUBMITTED) && (state() != NState::ACTIVE))) {
+
+      if ( jobsParam.createJobs() ) {
+
+         return submitJob(jobsParam);
+      }
+      else {
+         /// This is only for test path. Just return true
+         return true;
+      }
+   }
+   std::stringstream ss;
+   ss << "Submittable::run: Aborted for task " << absNodePath() << " because state is " << NState::toString(state()) << " and force not set\n";
+   jobsParam.errorMsg() += ss.str();
+   return false;
+}
+
+void Submittable::kill(const std::string& zombie_pid)
+{
+   std::string ecf_kill_cmd;
+   if ( zombie_pid.empty() ) {
+      if (state() != NState::ACTIVE && state() != NState::SUBMITTED) {
+         return;
+      }
+
+      // *** Generated variables are *NOT* persisted.                                     ***
+      // *** Hence if we have recovered from a check point file, then they will be empty. ***
+      // *** i.e terminate server with active jobs, restart from saved check_pt file
+      // *** and then try to kill the active job, will get an exception( see below) since
+      // *** Generated variable ECF_RID will be empty.
+      if (!sub_gen_variables_) {
+         // std::cout << "Generated variables empty, regenerating !!!!!\n";
+         update_generated_variables();
+      }
+
+      /// If we are in active state, then ECF_RID must have been setup
+      /// This is typically used in the KILL CMD, make sure its there
+      if (state() == NState::ACTIVE && genvar_ecfrid().theValue().empty() ) {
+         std::stringstream ss;
+         ss << "Submittable::kill: Generated variable ECF_RID is empty for task " << absNodePath();
+         throw std::runtime_error( ss.str() );
+      }
+
+      if (!findParentUserVariableValue( Str::ECF_KILL_CMD(), ecf_kill_cmd ) ||  ecf_kill_cmd.empty() ) {
+         std::stringstream ss;
+         ss << "Submittable::kill: ECF_KILL_CMD not defined, for task " << absNodePath() << "\n";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+   else {
+      // Use input
+      if (!findParentUserVariableValue( Str::ECF_KILL_CMD(), ecf_kill_cmd ) ||  ecf_kill_cmd.empty() ) {
+         std::stringstream ss;
+         ss << "Submittable::kill: ECF_KILL_CMD not defined, for task " << absNodePath() << "\n";
+         throw std::runtime_error( ss.str() );
+      }
+
+      // replace %ECF_RID% with the input args
+      Str::replace(ecf_kill_cmd,"%ECF_RID%", zombie_pid);
+   }
+
+   if (!variableSubsitution(ecf_kill_cmd)) {
+      std::stringstream ss;
+      ss << "Submittable::kill: Variable substitution failed for ECF_KILL_CMD(" << ecf_kill_cmd << ") on task " << absNodePath() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   // Please note: this is *non blocking* the output of the command(ECF_KILL_CMD) should be written to %ECF_JOB%.kill
+   // The output is accessible via the --file cmd
+   // Done as two separate steps as kill command is not blocking on the server
+//   LOG(Log::DBG,"Submittable::kill " << absNodePath() << "  " << ecf_kill_cmd );
+   std::string errorMsg;
+   if (!System::instance()->spawn(ecf_kill_cmd,"", errorMsg)) {
+      throw std::runtime_error( errorMsg );
+   }
+   flag().set(ecf::Flag::KILLED);
+}
+
+void Submittable::status()
+{
+   if (state() != NState::ACTIVE && state() != NState::SUBMITTED) {
+      return;
+   }
+
+   // *** Generated variables are *NOT* persisted.                                     ***
+   // *** Hence if we have recovered from a check point file, then they will be empty. ***
+   // *** i.e terminate server with active jobs, restart from saved check_pt file
+   // *** and then try to kill/status the active job, will get an exception(see below) since
+   // *** Generated variable ECF_RID will be empty.
+   if (!sub_gen_variables_) {
+      //std::cout << "Generated variables empty, regenerating !!!!!\n";
+      update_generated_variables();
+   }
+
+   /// If we are in active state, then ECF_RID must have been setup
+   if (state() == NState::ACTIVE && genvar_ecfrid().theValue().empty()) {
+      std::stringstream ss;
+      ss << "Submittable::status: Generated variable ECF_RID is empty for task " << absNodePath();
+      throw std::runtime_error( ss.str() );
+   }
+
+   std::string ecf_status_cmd;
+   if (!findParentUserVariableValue( Str::ECF_STATUS_CMD(), ecf_status_cmd ) ||  ecf_status_cmd.empty() ) {
+      std::stringstream ss;
+      ss << "Submittable::status: ECF_STATUS_CMD not defined, for task " << absNodePath() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   if (!variableSubsitution(ecf_status_cmd)) {
+      std::stringstream ss;
+      ss << "Submittable::status: Variable substitution failed for ECF_STATUS_CMD(" << ecf_status_cmd << ") on task " << absNodePath() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   // Please note: this is *non blocking* the output of the command(ECF_STATUS_CMD) should be written to %ECF_JOB%.stat
+   // SPAWN process, attach signal to monitor process. returns true
+   std::string errorMsg;
+   if (!System::instance()->spawn(ecf_status_cmd,"", errorMsg)) {
+      throw std::runtime_error( errorMsg );
+   }
+
+// flag().set(ecf::Flag::STATUS);
+}
+
+
+bool Submittable::createChildProcess(JobsParam& jobsParam)
+{
+#ifdef DEBUG_JOB_SUBMISSION
+   cout << "Submittable::createChildProcess for task " << name() << endl;
+#endif
+   std::string ecf_job_cmd;
+   findParentUserVariableValue( Str::ECF_JOB_CMD(), ecf_job_cmd );
+   if (ecf_job_cmd.empty()) {
+      jobsParam.errorMsg() += "Submittable::createChildProcess: Could not find ECF_JOB_CMD : ";
+      return false;
+   }
+
+   if (!variableSubsitution(ecf_job_cmd)) {
+      jobsParam.errorMsg() += "Submittable::createChildProcess: Variable substitution failed for ECF_JOB_CMD(" + ecf_job_cmd + ") :";
+      return false;
+   }
+
+   // Keep tabs on what was submitted for testing purposes
+   jobsParam.push_back_submittable(  this );
+
+   if ( jobsParam.spawnJobs() ) {
+
+      // SPAWN process, attach signal to monitor process. returns true
+      return System::instance()->spawn(ecf_job_cmd,absNodePath(),jobsParam.errorMsg());
+   }
+
+   // Test path ONLY
+   return true;
+}
+
+
+void Submittable::set_aborted_only(const std::string& reason)
+{
+#ifdef DEBUG_STATE_CHANGE_NO
+   std::cout << "Submittable::set_aborted_only\n";
+#endif
+
+   abortedReason_ = reason;
+   state_change_no_ = Ecf::incr_state_change_no();
+
+   // Do not use "\n" | ';' in abortedReason_, as this can mess up, --migrate output
+   // Which would then affect --load.
+   Str::replace(abortedReason_,"\n","");
+   Str::replace(abortedReason_,";"," ");
+
+   // This will set the state and bubble up the most significant state
+   set_state(NState::ABORTED);
+}
+
+
+void Submittable::update_limits()
+{
+   NState::State task_state = state();
+   std::set<Limit*> limitSet;     // ensure local limit have preference over parent
+   if (task_state == NState::COMPLETE) {
+      decrementInLimit(limitSet);    // will recurse up
+   }
+   else if (task_state == NState::ABORTED) {
+       decrementInLimit(limitSet);    // will recurse up
+   }
+   else if (task_state == NState::SUBMITTED) {
+       incrementInLimit(limitSet);    // will recurse up
+   }
+   else if (task_state == NState::ACTIVE) {
+      // *** Don't change limits in this state ***
+   }
+   else {
+      // UNKNOWN, QUEUED
+      // For all other states, this task should NOT be consuming a limit token.
+      // During interactive use a Submittable may get re-queued. In case its consuming
+      // a limit token, we decrement the limit. If the we are NOT consuming
+      // a token, its still *SAFE* to call decrementInLimit
+      decrementInLimit(limitSet);  // will recurse up
+   }
+}
+
+// Memento ==========================================================
+void Submittable::incremental_changes(DefsDelta& changes, compound_memento_ptr& comp) const
+{
+#ifdef DEBUG_MEMENTO
+   std::cout << "Submittable::incremental_changes() " << debugNodePath() << "\n";
+#endif
+
+   if (state_change_no_ > changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(absNodePath());
+      comp->add( boost::make_shared<SubmittableMemento>( jobsPassword_,process_or_remote_id_,abortedReason_,tryNo_) );
+   }
+
+   // ** if compound memento has children base class, will add it to DefsDelta
+   Node::incremental_changes(changes,comp);
+}
+
+void Submittable::set_memento(const SubmittableMemento* memento)
+{
+#ifdef DEBUG_MEMENTO
+   std::cout << "Submittable::set_memento(const SubmittableMemento*) " << debugNodePath() << "\n";
+#endif
+
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::SUBMITTABLE);
+
+   jobsPassword_ = memento->jobsPassword_;
+   process_or_remote_id_ = memento->process_or_remote_id_;
+   abortedReason_ = memento->abortedReason_;
+   tryNo_ = memento->tryNo_;
+}
+
+// Generated variables ---------------------------------------------------------------------------------
+
+void Submittable::update_generated_variables() const
+{
+   if (!sub_gen_variables_) sub_gen_variables_ = new SubGenVariables(this);
+   sub_gen_variables_->update_generated_variables();
+   update_repeat_genvar();
+}
+
+const Variable& Submittable::update_genvar_ecfscript( const std::string& ecf_home, const std::string& theAbsNodePath) const
+{
+   if (!sub_gen_variables_) sub_gen_variables_ = new SubGenVariables(this);
+   return sub_gen_variables_->update_genvar_ecfscript(ecf_home,theAbsNodePath);
+}
+
+const Variable& Submittable::findGenVariable(const std::string& name) const
+{
+   // AST can reference generated variables. Currently integer based values
+   // The task names can be integers, other valid option is try_no
+   if (!sub_gen_variables_) update_generated_variables();
+
+   const Variable& gen_var = sub_gen_variables_->findGenVariable(name);
+   if (!gen_var.empty()) return gen_var;
+
+   return Node::findGenVariable(name);
+}
+
+void Submittable::gen_variables(std::vector<Variable>& vec) const
+{
+   if (!sub_gen_variables_) update_generated_variables();
+
+   vec.reserve(vec.size() + 9);
+   sub_gen_variables_->gen_variables(vec);
+   Node::gen_variables(vec);
+}
+
+const Variable& Submittable::genvar_ecfrid() const
+{
+   if (!sub_gen_variables_) return Variable::EMPTY();
+   return sub_gen_variables_->genvar_ecfrid();
+}
+
+void Submittable::set_genvar_ecfjob(const std::string& value)
+{
+   if (!sub_gen_variables_) sub_gen_variables_ = new SubGenVariables(this);
+   sub_gen_variables_->set_genvar_ecfjob(value);
+}
+
+void Submittable::set_genvar_ecfrid(const std::string& value)
+{
+   if (!sub_gen_variables_) sub_gen_variables_ = new SubGenVariables(this);
+   sub_gen_variables_->set_genvar_ecfrid(value);
+}
+
+// Generated Variables ================================================================================================
+// The false below is used as a dummy argument to call the Variable constructor that does not
+// Check the variable names. i.e we know they are valid
+SubGenVariables::SubGenVariables(const Submittable* sub)
+: submittable_(sub),
+  genvar_task_("TASK", "", false),
+  genvar_ecfrid_(Str::ECF_RID(), "", false),
+  genvar_ecftryno_(Str::ECF_TRYNO(), "", false),
+  genvar_ecfname_(Str::ECF_NAME(), "", false),
+  genvar_ecfpass_(Str::ECF_PASS(), "", false),
+  genvar_ecfjob_(Str::ECF_JOB(), "", false),
+  genvar_ecfjobout_(Str::ECF_JOBOUT(), "", false),
+  genvar_ecfscript_(Str::ECF_SCRIPT(), "", false) {}
+
+void SubGenVariables::update_generated_variables() const
+{
+   // cache strings that are used in many variables
+   std::string theAbsNodePath = submittable_->absNodePath();
+   std::string the_try_no = submittable_->tryNo();
+
+   if (submittable_->isAlias() && submittable_->parent())
+      genvar_task_.set_value(submittable_->parent()->name());     // does *not* modify Variable::state_change_no
+   else
+      genvar_task_.set_value(submittable_->name());
+
+   genvar_ecfrid_.set_value(submittable_->process_or_remote_id_); // does *not* modify Variable::state_change_no
+   genvar_ecftryno_.set_value(the_try_no);                        // does *not* modify Variable::state_change_no
+   genvar_ecfname_.set_value(theAbsNodePath);                     // does *not* modify Variable::state_change_no
+   genvar_ecfpass_.set_value(submittable_->jobsPassword_);        // does *not* modify Variable::state_change_no
+
+   std::string ecf_home;
+   submittable_->findParentUserVariableValue(Str::ECF_HOME(), ecf_home);
+
+   /// The directory associated with ECF_JOB is automatically created if it does not exist.
+   /// This is Done during Job generation. See EcfFile::doCreateJobFile()
+   if (genvar_ecfjob_.value_by_ref().capacity() == 0) {
+      genvar_ecfjob_.value_by_ref().reserve( ecf_home.size() + theAbsNodePath.size() + File::JOB_EXTN().size() + the_try_no.size());
+   }
+   genvar_ecfjob_.value_by_ref() = ecf_home;          // does *not* modify Variable::state_change_no
+   genvar_ecfjob_.value_by_ref() += theAbsNodePath;
+   genvar_ecfjob_.value_by_ref() += File::JOB_EXTN();
+   genvar_ecfjob_.value_by_ref() += the_try_no;
+
+
+   /// If ECF_OUT is specified the user must ensure the directory exists, along with directories
+   /// associated with Suites/Families nodes.
+   /// Bottom up. Can be expensive when we have thousands of tasks.
+   std::string ecf_out;
+   submittable_->findParentUserVariableValue(Str::ECF_OUT(), ecf_out);
+
+   if (ecf_out.empty()) {
+      genvar_ecfjobout_.value_by_ref().reserve( ecf_home.size() + theAbsNodePath.size() + 1 + the_try_no.size());
+      genvar_ecfjobout_.value_by_ref() = ecf_home;
+   }
+   else  {
+      // For metabuilder, where we use %ECF_HOME% for ECF_OUT
+      char micro = '%';
+      if (ecf_out.find(micro) != std::string::npos) {
+         NameValueMap user_edit_variables;
+         submittable_->variable_substitution(ecf_out,user_edit_variables,micro);
+      }
+      genvar_ecfjobout_.value_by_ref().reserve( ecf_out.size() + theAbsNodePath.size() + 1 + the_try_no.size());
+      genvar_ecfjobout_.value_by_ref() = ecf_out;
+   }
+   genvar_ecfjobout_.value_by_ref() += theAbsNodePath;
+   genvar_ecfjobout_.value_by_ref() += ".";
+   genvar_ecfjobout_.value_by_ref() += the_try_no;
+
+   (void)update_genvar_ecfscript(ecf_home,theAbsNodePath);
+}
+
+const Variable& SubGenVariables::update_genvar_ecfscript( const std::string& ecf_home, const std::string& theAbsNodePath) const
+{
+   genvar_ecfscript_.value_by_ref().reserve( ecf_home.size() + theAbsNodePath.size() + 4 );
+   genvar_ecfscript_.value_by_ref() = ecf_home;   // does *not* modify Variable::state_change_no
+   genvar_ecfscript_.value_by_ref() += theAbsNodePath;
+   genvar_ecfscript_.value_by_ref() += submittable_->script_extension();
+   return genvar_ecfscript_;
+}
+
+const Variable& SubGenVariables::findGenVariable(const std::string& name) const
+{
+   if (genvar_task_.name() == name) return genvar_task_;
+   if (genvar_ecftryno_.name() == name) return genvar_ecftryno_;
+   if (genvar_ecfjob_.name() == name) return genvar_ecfjob_;
+   if (genvar_ecfscript_.name() == name) return genvar_ecfscript_;
+   if (genvar_ecfjobout_.name() == name) return genvar_ecfjobout_;
+   if (genvar_ecfrid_.name() == name) return genvar_ecfrid_;
+   if (genvar_ecfname_.name() == name) return genvar_ecfname_;
+   if (genvar_ecfpass_.name() == name) return genvar_ecfpass_;
+   return Variable::EMPTY();
+}
+
+void SubGenVariables::gen_variables(std::vector<Variable>& vec) const
+{
+   vec.push_back(genvar_task_);
+   vec.push_back(genvar_ecfjob_);
+   vec.push_back(genvar_ecfscript_);
+   vec.push_back(genvar_ecfjobout_);
+   vec.push_back(genvar_ecftryno_);
+   vec.push_back(genvar_ecfrid_);
+   vec.push_back(genvar_ecfname_);
+   vec.push_back(genvar_ecfpass_);
+}
diff --git a/ecflow_4_0_7/ANode/src/Submittable.hpp b/ecflow_4_0_7/ANode/src/Submittable.hpp
new file mode 100644
index 0000000..917bbc3
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Submittable.hpp
@@ -0,0 +1,196 @@
+#ifndef SUBMITTABLE_HPP_
+#define SUBMITTABLE_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/noncopyable.hpp>
+#include "Node.hpp"
+class EcfFile;
+class SubGenVariables;
+
+class Submittable : public Node {
+protected:
+   Submittable( const std::string& name )
+   : Node(name),
+     jobsPassword_(Submittable::DUMMY_JOBS_PASSWORD()),
+     tryNo_(0),
+     state_change_no_(0),
+     sub_gen_variables_(NULL) {}
+
+   Submittable()
+   : jobsPassword_(Submittable::DUMMY_JOBS_PASSWORD()),
+     tryNo_(0),
+     state_change_no_(0),
+     sub_gen_variables_(NULL) {}
+
+   bool operator==(const Submittable& rhs) const;
+
+public:
+   virtual ~Submittable();
+
+   /// Initialise the task. will set the state to NState::ACTIVE
+   void init(const std::string& processId);
+
+   /// complete the task. Will set the state to NState::COMPLETE
+   /// However if there is a valid Repeat or time dependencies then
+   /// task will be re-queued afterwards
+   void complete();
+
+   /// Overridden to reset the try number
+   /// The tasks job can be invoked multiple times. For each invocation we want to preserve
+   /// the output. The try number is used in SMSJOB/SMSJOBOUT to preserve the output when
+   /// there are multiple runs.  re-queue/begin() resets the try Number
+   virtual void begin();
+   virtual void requeue( bool resetRepeats,
+                           int clear_suspended_in_child_nodes,
+                           bool reset_next_time_slot);
+   virtual bool run(JobsParam& jobsParam, bool force);
+   virtual void kill(const std::string& zombie_pid = "");
+   virtual void status();
+
+   virtual void update_generated_variables() const;
+   virtual const Variable& findGenVariable(const std::string& name) const;
+   virtual void gen_variables(std::vector<Variable>& vec) const;
+
+
+   static const std::string& DUMMY_JOBS_PASSWORD();
+   static const std::string& FREE_JOBS_PASSWORD();
+   static const std::string& DUMMY_PROCESS_OR_REMOTE_ID();
+
+   // returns the corresponding .ecf file.
+   // i.e if the ecf file is missing or empty std::runtime_error is thrown
+   // For dummy tasks, i.e tasks with no .ecf file user should add ECF_DUMMY_TASK variable
+   EcfFile locatedEcfFile() const;
+   virtual const std::string& script_extension() const = 0;
+
+   /// Spawn of a child process. Clear process and remote id before jobs is spawned
+   /// Will increment try no first, and then update generated varaibles
+   bool submitJob( JobsParam& ) ;
+
+   /// generates job file independent of dependencies, resets the try Number
+   virtual void check_job_creation( job_creation_ctrl_ptr jobCtrl);
+
+   /// See Defs.hpp
+   virtual void generate_scripts( const std::map<std::string,std::string>&) const {}
+
+   virtual NState::State computedState(Node::TraverseType) const { return state();}
+
+/// data members accessor's and mutators:
+   /// return the current try number as a string, and int
+   std::string tryNo() const;
+   int try_no() const { return tryNo_;}
+
+   const std::string& jobsPassword() const { return jobsPassword_;}
+
+   /// The remote id (ECF_RID) allows a jobs to be killed when added via a queueing system
+   /// in which case the remote id is really the queueing id.
+   const std::string& process_or_remote_id() const { return process_or_remote_id_;}
+
+   /// Set the task to aborted, providing a reason. Will set the state to NState::ABORTED
+   /// This should only be called in two context's:
+   ///    1/ Called via Child Cmd (AbortCmd) i.e job raised a trap,
+   ///    2/ Abnormal process termination. i.e job killed by signal
+   /// *IMPORTANT* If task try number is less than ECF_TRIES then we should
+   /// resubmit the job. However we *should* not do this immediately here, instead we
+   /// wait of *next* call to resolveDependencies, as that will check if we are *inlimit*
+   void aborted(const std::string& reason);
+   virtual const std::string& abortedReason() const { return abortedReason_;}
+
+// Memento functions:
+   void incremental_changes(DefsDelta&, compound_memento_ptr& comp) const;
+   void set_memento(const SubmittableMemento* );
+
+   virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
+protected:
+
+   virtual std::string write_state() const;
+   /// call just before job submission, reset data members, update try_no, and generate variable
+   void increment_try_no(); // will increment state_change_no
+
+   /// Submits the job *WITHOUT* incrementing the try number
+   bool submit_job_only( JobsParam& );
+
+   // Overridden from Node to increment/decrement limits
+   virtual void update_limits();
+
+private:
+   friend class ZombieCtrl;
+   friend class AlterCmd;
+
+   void set_jobs_password(const std::string& p);
+
+   void set_process_or_remote_id(const std::string&);
+
+   // Use when we _only_ want to set the state,
+   void set_aborted_only(const std::string& reason);
+
+   bool createChildProcess(JobsParam& jobsParam);
+
+   void clear(); // process_id password and aborted reason
+
+   const Variable& update_genvar_ecfscript( const std::string& ecf_home,const std::string& theAbsNodePath) const;
+   const Variable& genvar_ecfrid() const;
+   void set_genvar_ecfjob(const std::string& value);
+   void set_genvar_ecfrid(const std::string& value);
+
+private:
+   std::string         jobsPassword_;
+   std::string         process_or_remote_id_;
+   std::string         abortedReason_;
+   int                 tryNo_;
+   unsigned int state_change_no_;               // *not* persisted, only used on server side
+   mutable SubGenVariables* sub_gen_variables_; // *not* persisted since they can be generated
+   friend class SubGenVariables;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & boost::serialization::base_object<Node>(*this); // Serialise base class information
+      ar & jobsPassword_;
+      ar & process_or_remote_id_;
+      ar & abortedReason_;
+      ar & tryNo_;
+   }
+};
+
+// We can have several thousands Submittables. This class helps in avoiding
+// the creation of generated variables until required.
+// This improves client->server down load times by avoiding thousands of string constructions
+class SubGenVariables : private boost::noncopyable {
+public:
+   SubGenVariables(const Submittable*);
+
+   void update_generated_variables() const;
+   const Variable& findGenVariable(const std::string& name) const;
+   void gen_variables(std::vector<Variable>& vec) const;
+   const Variable& update_genvar_ecfscript( const std::string& ecf_home, const std::string& theAbsNodePath) const;
+
+   const Variable& genvar_ecfrid() const  { return genvar_ecfrid_;}
+
+   void set_genvar_ecfjob(const std::string& value) { genvar_ecfjob_.set_value(value); }
+   void set_genvar_ecfrid(const std::string& value) { genvar_ecfrid_.set_value(value); }
+
+private:
+   const Submittable* submittable_;
+   mutable Variable genvar_task_;
+   mutable Variable genvar_ecfrid_;
+   mutable Variable genvar_ecftryno_;
+   mutable Variable genvar_ecfname_;
+   mutable Variable genvar_ecfpass_;
+   mutable Variable genvar_ecfjob_;
+   mutable Variable genvar_ecfjobout_;
+   mutable Variable genvar_ecfscript_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Suite.cpp b/ecflow_4_0_7/ANode/src/Suite.cpp
new file mode 100644
index 0000000..87c6cd1
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Suite.cpp
@@ -0,0 +1,727 @@
+//============================================================================
+// Name        : NodeTree.cpp
+// Author      : Avi
+// Revision    : $Revision: #128 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+#include <boost/lexical_cast.hpp>
+#include <boost/make_shared.hpp>
+
+#include "Suite.hpp"
+#include "Defs.hpp"
+#include "PrintStyle.hpp"
+#include "NodeTreeVisitor.hpp"
+#include "DefsDelta.hpp"
+
+#include "Stl.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Indentor.hpp"
+#include "ExprAst.hpp"
+#include "Log.hpp"
+#include "CalendarUpdateParams.hpp"
+#include "SuiteChanged.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "JobProfiler.hpp"
+#include "JobsParam.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost::posix_time;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+//#define DEBUG_FIND_NODE 1
+
+// Create the generated variable up-front. This allows them to be referenced
+// is abstract syntax tree during the post process call
+
+
+Suite::~Suite()
+{
+//	std::cout << "Suite::~Suite() " << debugNodePath() << "\n";
+   // Don't create the ChangeMgrSingleton during destruct sequence. (i.e in unit cases)
+   // Since that will cause a memory leak
+   if (!Ecf::server() && ChangeMgrSingleton::exists()) {
+      ChangeMgrSingleton::instance()->notify_delete( this );
+   }
+   delete suite_gen_variables_;
+}
+
+suite_ptr Suite::create(const std::string& name)
+{
+	return boost::make_shared<Suite>( name );
+}
+
+void Suite::accept(ecf::NodeTreeVisitor& v)
+{
+	SuiteChanged1 changed(this);
+	v.visitSuite(this);
+	NodeContainer::accept(v);
+}
+
+void Suite::acceptVisitTraversor(ecf::NodeTreeVisitor& v)
+{
+	SuiteChanged1 changed(this);
+	v.visitSuite(this);
+}
+
+void Suite::begin()
+{
+   if (false == begun_ ) {
+
+      // begin will change all the states of all child nodes, reset all attributes
+      SuiteChanged1 changed(this);
+
+      // begin can cause thousands of mementos to be created, to avoid this we
+      // update the modify change number.
+      Ecf::incr_modify_change_no();
+
+      begun_ = true;
+      begun_change_no_ = Ecf::incr_state_change_no();
+
+      begin_calendar();
+
+      NodeContainer::begin();
+
+      update_generated_variables();
+   }
+}
+
+void Suite::requeue(
+         bool resetRepeats,
+         int clear_suspended_in_child_nodes,
+         bool reset_next_time_slot)
+{
+   if (false == begun_) {
+      std::stringstream ss; ss << "Suite::requeue: The suite " << name() << " must be 'begun' first\n";
+      throw std::runtime_error( ss.str() ) ;
+   }
+
+   // This is more efficient than: since no locking is required
+   //    SuiteChanged changed(boost::dynamic_pointer_cast<Suite>(shared_from_this()));
+   // since no locking is required in SuiteChanged
+   SuiteChanged1 changed(this); //
+
+   // requeue can cause thousands of mementos to be created, to avoid this we
+   // update the modify change number.
+   Ecf::incr_modify_change_no();
+
+   begin_calendar();
+
+   NodeContainer::requeue(resetRepeats,
+                          clear_suspended_in_child_nodes,
+                          reset_next_time_slot);
+
+   update_generated_variables();
+}
+
+void Suite::reset_begin() {
+   SuiteChanged1 changed(this);
+   begun_ = false;
+   begun_change_no_ = Ecf::incr_state_change_no();
+}
+
+void Suite::begin_calendar()
+{
+	// Begin the calendar, from the clock attribute _ELSE_
+	// Get the local time, second level resolution, based on the
+	// time zone settings of the computer.
+	if (clockAttr_.get())  {
+	   clockAttr_->init_calendar(calendar_);  // *IF* AlterCmd was used, wait till Suite is requed
+	   clockAttr_->begin_calendar(calendar_);
+	}
+	else {
+	   calendar_.begin(Calendar::second_clock_time());
+	}
+}
+
+void Suite::updateCalendar( const ecf::CalendarUpdateParams & calParams, std::vector<node_ptr>& auto_cancelled_nodes )
+{
+	if (begun_) {
+
+//		cout << "Suite::updateCalendar " << debugNodePath()   << " serverRunning = " << calParams.serverRunning() << " jobSubInterval = " << to_simple_string(calParams.serverPollPeriod());
+//		if ( clockAttr_ )  cout << " clockAttr_->startStopWithServer() = " << clockAttr_->startStopWithServer();
+//		cout << "\n";
+
+		/// Some suite can elect to avoid updating the calendar when the server is stopped.
+		/// This allows normal and relative time dependencies to be honoured even
+		/// if the server is started/stopped many times.
+		if ( clockAttr_.get() &&  clockAttr_->startStopWithServer() && !calParams.serverRunning()) {
+			return;
+		}
+
+      SuiteChanged1 changed(this);
+
+		/// The calendar_ will cache server poll period/job submission interval, as calendar increment for easy access
+		calendar_.update( calParams );
+	   calendar_change_no_ = Ecf::state_change_no() + 1; // ** See: collateChanges **
+
+		update_generated_variables();
+
+ 		calendarChanged(calendar_,auto_cancelled_nodes);
+	}
+}
+
+bool Suite::resolveDependencies(JobsParam& jobsParam)
+{
+ 	if (begun_) {
+
+ 	   if (jobsParam.timed_out_of_job_generation()) return false;
+ 	   JobProfiler profile_me(jobsParam);
+ 	   if (jobsParam.timed_out_of_job_generation()) return false;
+
+ 	   SuiteChanged1 changed(this);
+  		return NodeContainer::resolveDependencies(jobsParam);
+ 	}
+ 	return true;
+}
+
+bool Suite::operator==(const Suite& rhs) const
+{
+	if (begun_ != rhs.begun_) {
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "Suite::operator==  (begun_(" <<  begun_ << ") != rhs.begun_(" << rhs.begun_ << ")) " << debugNodePath() << "\n";
+		}
+#endif
+		return false;
+	}
+
+ 	if ((clockAttr_.get() && !rhs.clockAttr_.get()) || (!clockAttr_.get() && rhs.clockAttr_.get()) ){
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "Suite::operator==  (clockAttr_ && !rhs.clockAttr_)  " << debugNodePath() << "\n";
+		}
+#endif
+		return false;
+	}
+	if (clockAttr_.get() && rhs.clockAttr_.get() && !(*clockAttr_ == *rhs.clockAttr_)) {
+#ifdef DEBUG
+		if (Ecf::debug_equality()) {
+			std::cout << "Suite::operator== (clockAttr_ && rhs.clockAttr_ && !(*clockAttr_ == *rhs.clockAttr_)) " << debugNodePath() << "\n";
+		}
+#endif
+		return false;
+	}
+
+ 	return NodeContainer::operator==(rhs);
+}
+
+std::ostream& Suite::print(std::ostream& os) const
+{
+	Indentor::indent(os) << "suite " << name();
+   if (!PrintStyle::defsStyle()) {
+      std::string st = write_state();
+      if (!st.empty()) os << " #" << st;
+   }
+   os << "\n";
+
+	Node::print(os);
+
+	// make sure clock attribute is written before
+	if (clockAttr_.get()) clockAttr_->print(os);
+	if (!PrintStyle::defsStyle()) {
+	   std::string calendar_state = calendar_.write_state();
+	   if (!calendar_state.empty()) {
+	      Indentor indent;
+	      Indentor::indent(os) << "calendar" << calendar_state << "\n";
+	   }
+	}
+
+	NodeContainer::print(os);
+	Indentor::indent(os) << "endsuite\n";
+
+	return os;
+}
+
+std::string Suite::write_state() const
+{
+   // *IMPORTANT* we *CANT* use ';' character, since is used in the parser, when we have
+   //             multiple statement on a single line i.e.
+   //                 task a; task b;
+   std::string ret;
+   if (begun_) ret += "  begun:1";
+   ret += NodeContainer::write_state();
+   return ret;
+}
+void Suite::read_state(const std::string& line,const std::vector<std::string>& lineTokens) {
+
+   // suite s1 # begun:1 state:queued flag:edit_failed suspended:1
+   if (lineTokens.size() >= 4 && lineTokens[3] == "begun:1") begun_ = true;
+   NodeContainer::read_state(line,lineTokens);
+}
+
+const std::string& Suite::debugType() const { return ecf::Str::SUITE();}
+
+std::ostream& operator<<(std::ostream& os, const Suite& d) { return d.print(os); }
+
+void Suite::addClock( const ClockAttr& c,bool initialize_calendar)
+{
+	if ( clockAttr_.get()) {
+ 		throw std::runtime_error("Add Clock failed: Suite can only have one clock " + absNodePath());
+ 	}
+	clockAttr_ = boost::make_shared<ClockAttr>(c);
+	if (initialize_calendar) clockAttr_->init_calendar(calendar_);
+}
+
+void Suite::changeClock( const ClockAttr& c)
+{
+   // When changing the clock, *WAIT* till requeue/begin to init the calendar
+	clockAttr_.reset();
+ 	addClock( c , false);
+}
+
+void Suite::changeClockType(const std::string& clockType)
+{
+   // ISSUES:
+   // Whenever the user *alters* the clock attributes, it needs to be followed by a re-queue of the suite, because:
+   //   o/ if we change from real ->hybrid, then we need to set cron, etc time based nodes to complete
+   //      Since we could have running tasks, it is up to user to decide when.
+   //   o/ If we change from hybrid ->real, then Node with cron attributes etc, need to be requeued.
+   //   o/ Any relative times are no longer valid
+   //   o/ Time attributes will be incorrect, and hence may fail/pass incorrectly during dependency evaluation.
+   //   o/ Why command may be wrong
+   //
+   //
+   // *IF* the user *forgets* to do this, it can cause spurious errors, hence to *minimise* these
+   // the best we can do is to :
+   //   o/ re-sync suite calendar for clock attribute
+   //   o/ re-queue all time based attributes, *avoiding*
+   //      change of state when switching to hybrid clock (i.e due to day,date,cron time attrs)
+   // This is handled in handle_clock_attribute_change()
+   //
+
+   if (clockType != "hybrid" && clockType != "real") {
+      throw std::runtime_error("Suite::changeClockType: expected clock type to be 'hybrid' or 'real'  but found " + clockType);
+   }
+
+   SuiteChanged1 changed(this);
+   if (clockAttr_.get()) {
+      clockAttr_->hybrid( clockType == "hybrid" ); // will update state change_no
+   }
+   else {
+      addClock( ClockAttr( clockType == "hybrid") ); // will update state change_no
+   }
+
+   // re-sync suite calendar for clock attribute, re-queue all time based attributes
+   handle_clock_attribute_change();
+}
+
+void Suite::changeClockDate(const std::string& theDate)
+{
+   // See ISSUES: Suite::changeClockType
+   int day,month,year;
+   DateAttr::getDate(theDate,day,month,year);
+   if (day == 0 || month == 0 || year == 0)  throw std::runtime_error("Suite::changeClockDate Invalid clock date:" + theDate );
+
+   SuiteChanged1 changed(this);
+   if (clockAttr_.get())  {
+      clockAttr_->date(day,month,year);      // this will check the date and update state change_no
+   }
+   else {
+      addClock( ClockAttr(day,month,year) ); // will update state change_no
+   }
+
+   handle_clock_attribute_change();
+}
+
+void Suite::changeClockGain(const std::string& gain)
+{
+   // See: ISSUES on Suite::changeClockType
+   long theGain = 0;
+   try { theGain = boost::lexical_cast< long >( gain ); }
+   catch ( boost::bad_lexical_cast& ) {
+      throw std::runtime_error( "Suite::changeClockGain: value '" + gain + "' is not convertible to an long, for suite " + name());
+   }
+
+   SuiteChanged1 changed(this);
+   if (!clockAttr_.get())  {
+      addClock( ClockAttr() ); // will update state change_no
+   }
+
+   if (theGain > 0) {
+      clockAttr_->set_gain_in_seconds( theGain, true);  // will update state change_no
+   }
+   else {
+      clockAttr_->set_gain_in_seconds( theGain, false); // will update state change_no
+   }
+
+   handle_clock_attribute_change();
+}
+
+void Suite::changeClockSync()
+{
+   // See: ISSUES on Suite::changeClockType
+   SuiteChanged1 changed(this);
+   if (clockAttr_.get()) {
+      clockAttr_->sync();     // clear so that on re-queue we sync with computer, + will update state change_no
+   }
+   else {
+      addClock( ClockAttr() ); // will update state change_no
+   }
+
+   handle_clock_attribute_change();
+}
+
+void Suite::handle_clock_attribute_change()
+{
+   // re-queue time could cause thousands of mementos to be created, to avoid this we
+   // update the modify change number.
+   Ecf::incr_modify_change_no();
+
+   // Since the suite clock attribute has changed, re-sync the suite calendar
+   begin_calendar();
+
+   // re-queue all the time attributes, since clock attribute has changed, avoid changing node state.
+   // Note: when switching to hybrid clock the re-queue of time dependencies will
+   //       *not* mark hybrid (day,date,cron) as complete
+   //       since these nodes could be in a active/submitted state.
+   NodeContainer::requeue_time_attrs();
+
+   update_generated_variables();
+}
+
+
+bool Suite::checkInvariants(std::string& errorMsg) const
+{
+	if (!calendar_.checkInvariants(errorMsg)) {
+		return false;
+	}
+   if (clockAttr_.get()) {
+      if ( calendar().hybrid() != clockAttr_->hybrid()) {
+         std::stringstream ss;
+         ss << "Suite:" << name() << " Calendar(hybrid(" << calendar().hybrid() << ")) and Clock attribute(hybrid(" << clockAttr_->hybrid() << ")) must be in sync, clock types differs";
+         errorMsg += ss.str();
+         return false;
+      }
+   }
+
+	if (Ecf::server()) {
+	   if (state_change_no_ > Ecf::state_change_no() ) {
+	      std::stringstream ss;
+	      ss << "Suite::checkInvariants: suite_change_no(" << state_change_no_ << ") > Ecf::state_change_no(" << Ecf::state_change_no() << ")\n";
+	      errorMsg += ss.str();
+	      return false;
+	   }
+      if (begun_change_no_ > Ecf::state_change_no() ) {
+         std::stringstream ss;
+         ss << "Suite::checkInvariants: begun_change_no_(" << begun_change_no_ << ") > Ecf::state_change_no(" << Ecf::state_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+      if (calendar_change_no_ > Ecf::state_change_no() ) {
+         std::stringstream ss;
+         ss << "Suite::checkInvariants: calendar_change_no_(" << calendar_change_no_ << ") > Ecf::state_change_no(" << Ecf::state_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+      if (modify_change_no_ > Ecf::modify_change_no() ) {
+         std::stringstream ss;
+         ss << "Suite::checkInvariants: modify_change_no_(" << modify_change_no_ << ") > Ecf::modify_change_no(" << Ecf::modify_change_no() << ")\n";
+         errorMsg += ss.str();
+         return false;
+      }
+	}
+	return NodeContainer::checkInvariants(errorMsg);
+}
+
+void Suite::collateChanges(DefsDelta& changes) const
+{
+	/// The suite hold the max state change no, for all its children and attributes
+#ifdef DEBUG_MEMENTO
+	std::cout << "Suite::collateChanges() changes.client_state_change_no("
+	          << changes.client_state_change_no() << ") state_change_no("
+	          << state_change_no() << ") "
+	          << debugNodePath() << "\n";
+#endif
+	// Optimising updates:
+	// Problem:
+	//    User has requested 1 second updated in the viewer. We used add SuiteCalendarMemento
+	//    when ever there were changes in the suite. However this causes the suite in the
+	//    viewer to *refresh* to often.
+	//
+	// Soln 1:
+	//   Use:
+	//      calendar_change_no_ = Ecf::incr_state_change_no();
+	//
+	//   plus only create SuiteCalendarMemento, where are suite changes *AND*
+	//   calendar has actually changed.
+	//   - This fixes the problem, at the expense of *always* creating a SuiteCalendarMemento
+	//     every 60 seconds. Thus adding to network traffic.
+	//   - The regression tests will fail, since a change is made in the server,
+	//     for which the sync does nothing. *************************************
+	//     This could be fixed only creating a SuiteCalendarMemento when calendar changes
+	//     However we then go back always creating SuiteCalendarMemento every 60 seconds
+	//     even when there are **no other** changes
+	//
+   // Soln 2:
+	//    Use:
+	//       calendar_change_no_ = Ecf::state_change_no() + 1
+	//
+	//    We mimick updating Ecf::state_change_no(), thus we can create memento when required
+	//    They should however not be recognised as state change.
+	//    + This fixes the problem, and the regression test will also work
+	//    This is the solution that has been implemented
+
+	// ********************************************************************
+	// Note: we separate determining incremental changes from the traversal
+	// ********************************************************************
+
+	// *TREAT* All changes to *a* Node, in a single compound_memento_ptr
+   size_t before = changes.size();
+
+ 	compound_memento_ptr suite_compound_mememto;
+	if (clockAttr_.get() && clockAttr_->state_change_no() > changes.client_state_change_no()) {
+		if (!suite_compound_mememto.get()) suite_compound_mememto = boost::make_shared<CompoundMemento>(absNodePath());
+		suite_compound_mememto->add( boost::make_shared<SuiteClockMemento>(  *clockAttr_ ) );
+	}
+	if (begun_change_no_ > changes.client_state_change_no()) {
+ 		if (!suite_compound_mememto.get()) suite_compound_mememto = boost::make_shared<CompoundMemento>(absNodePath());
+		suite_compound_mememto->add( boost::make_shared<SuiteBeginDeltaMemento>( begun_) );
+	}
+
+	/// Collate NodeContainer and Node changes into *SAME* compound_memento_ptr
+	NodeContainer::incremental_changes(changes, suite_compound_mememto);
+
+	// Traversal, we have finished with this node:
+	// Traverse children : *SEPARATE* compound_memento_ptr created on demand
+	NodeContainer::collateChanges(changes);
+
+	/// *ONLY* create SuiteCalendarMemento, if something changed in the suite.
+	/// Additionally calendar_change_no_ updates should not register as a state change, i.e for tests
+   /// SuiteCalendarMemento is need so that WhyCmd can work on the client side.
+   /// Need to use new compound since the suite may not have change, but it children may have.
+	/// Hence as side affect why command with reference to time will only be accurate
+	/// after some kind of state change. Discussed with Axel, who was happy with this.
+   size_t after = changes.size();
+   if (before != after && calendar_change_no_ > changes.client_state_change_no()) {
+      compound_memento_ptr compound_ptr =  boost::make_shared<CompoundMemento>(absNodePath());
+      compound_ptr->add( boost::make_shared<SuiteCalendarMemento>( calendar_ ) );
+      changes.add( compound_ptr );
+   }
+}
+
+void Suite::set_memento( const SuiteClockMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+	std::cout << "Suite::set_memento( const SuiteClockMemento*) " << debugNodePath() << "\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::SUITE_CLOCK);
+
+ 	changeClock(memento->clockAttr_);
+}
+
+void Suite::set_memento( const SuiteBeginDeltaMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+	std::cout << "Suite::set_memento( const SuiteBeginDeltaMemento* ) " << debugNodePath() << "\n";
+#endif
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::SUITE_BEGIN);
+
+	begun_ = memento->begun_;
+}
+
+void Suite::set_memento( const SuiteCalendarMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+	std::cout << "Suite::set_memento( const SuiteCalendarMemento* ) " << debugNodePath() << "\n";
+#endif
+
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::SUITE_CALENDAR);
+
+	// The calendar does *NOT* persist the calendar type (hybrid/real) since we can derive this for clock attribute
+	// Hence make sure calendar/clock are in sync. part of the suite invariants
+	calendar_ = memento->calendar_;
+   if  (clockAttr_.get()) {
+      if (clockAttr_->hybrid()) calendar_.set_clock_type(ecf::Calendar::HYBRID);
+      else                      calendar_.set_clock_type(ecf::Calendar::REAL);
+   }
+}
+
+// generated variables ---------------------------------------------------------------------
+void Suite::update_generated_variables() const
+{
+   // This function is called during:
+   //   o begin()
+   //   o requeue()
+   //   o when calendar changes
+   if (!suite_gen_variables_) suite_gen_variables_ = new SuiteGenVariables(this);
+   suite_gen_variables_->update_generated_variables();
+   update_repeat_genvar();
+}
+
+const Variable& Suite::findGenVariable(const std::string& name) const
+{
+   if (!suite_gen_variables_) update_generated_variables();
+
+   const Variable& gen_var = suite_gen_variables_->findGenVariable(name);
+   if (!gen_var.empty()) return gen_var;
+   return NodeContainer::findGenVariable(name);
+}
+
+void Suite::gen_variables(std::vector<Variable>& vec) const
+{
+   if (!suite_gen_variables_) update_generated_variables();
+
+   vec.reserve(vec.size() + 13);
+   NodeContainer::gen_variables(vec);
+   suite_gen_variables_->gen_variables(vec);
+}
+
+// =======================================================================================
+
+// The false below is used as a dummy argument to call the Variable constructor that does not
+// check the variable names. i.e we know they are valid
+SuiteGenVariables::SuiteGenVariables(const Suite* s)
+:  suite_(s),
+   genvar_suite_("SUITE", "", false),
+   genvar_yyyy_("YYYY","", false),
+   genvar_dow_("DOW", "", false),
+   genvar_doy_("DOY", "", false),
+   genvar_date_("DATE", "", false),
+   genvar_day_("DAY", "", false),
+   genvar_dd_("DD", "", false ),
+   genvar_mm_("MM", "", false ),
+   genvar_month_("MONTH", "", false ),
+   genvar_smsdate_("ECF_DATE", "", false ),
+   genvar_clock_("ECF_CLOCK", "", false ),
+   genvar_time_("ECF_TIME", "", false ){}
+
+void SuiteGenVariables::update_generated_variables() const
+{
+   genvar_suite_.set_value(suite_->name());
+
+   // The calendar_ is only initialised once the suite has begun
+   if (!suite_->begun_) {
+      return;
+   }
+
+   // The code below ASSUMES calendar has been initialised
+   boost::posix_time::time_duration time_of_day = suite_->calendar_.suiteTime().time_of_day();
+
+   //#ifdef DEBUG
+   //    using namespace boost::gregorian;
+   //    tm t = to_tm(suite_->calendar_.suiteTime());  // to_tm can be a bit of a performance hog
+   ////  cerr << "\ntm_year = " << t.tm_year << "\n";  /* year - 1900              */
+   ////  cerr << "tm_mon = " << t.tm_mon << "\n";      /* month of year (0 - 11)   */
+   ////  cerr << "tm_mday = " << t.tm_mday << "\n";    /* day of month (1 - 31)    */
+   ////  cerr << "tm_wday = " << t.tm_wday << "\n";    /* day of week (Sunday = 0) */
+   ////  cerr << "tm_yday = " << t.tm_yday << "\n";    /* day of year (0 - 365)    */
+   ////  cerr << "tm_hour = " << t.tm_hour << "\n";    /* hours (0 - 23)           */
+   ////  cerr << "tm_min = " << t.tm_min << "\n";      /* minutes (0 - 59)         */
+   ////  cerr << "tm_sec = " << t.tm_sec << "\n";      /* seconds (0 - 59)         */
+   //
+   //    // ***IMPORTANT*** suiteTime is only valid for real clock, note that
+   //    // *************** for hybrid the day does not change. hence assertion
+   //    // *************** needs to take into account calendar type
+   //       if (!suite_->calendar_.hybrid()) {
+   //          assert( t.tm_wday   == calendar_.day_of_week());
+   //          assert( t.tm_mday   == calendar_.day_of_month());
+   //          assert( t.tm_yday+1 == calendar_.day_of_year());
+   //          assert( t.tm_mon+1  == calendar_.month());
+   //       }
+   //    assert( time_of_day.hours() == t.tm_hour);
+   //    assert( time_of_day.minutes() == t.tm_min);
+   //    assert( t.tm_year + 1900 == calendar_.year());
+   //#endif
+
+   char smstime[255];
+   sprintf(smstime,"%02d:%02d", time_of_day.hours(),time_of_day.minutes());
+   genvar_time_.set_value( smstime );
+
+   // **********************************************************************
+   // The following generated variable need only be updated if NULL or if day changed
+   // Under: HYBRID the day will never change, hence a one time update
+   // **********************************************************************
+   if (genvar_yyyy_.theValue().empty() || suite_->calendar_.dayChanged()) {
+
+      genvar_yyyy_.set_value(boost::lexical_cast<std::string>(suite_->calendar_.year()));
+      genvar_dow_.set_value( boost::lexical_cast<std::string>(suite_->calendar_.day_of_week()) );
+      genvar_doy_.set_value( boost::lexical_cast<std::string>(suite_->calendar_.day_of_year()) );
+      //cout << "genvar_yyyy_ = " << genvar_yyyy_->theValue() << "\n";
+      //cout << "genvar_dow_ = " << genvar_dow_->theValue() << "\n";
+      //cout << "genvar_doy_ = " << genvar_doy_->theValue() << "\n";
+
+      char ddmmyyyyBuffer[255];
+      sprintf(ddmmyyyyBuffer,"%02d.%02d.%04d", suite_->calendar_.day_of_month(), suite_->calendar_.month(), suite_->calendar_.year());
+      genvar_date_.set_value( ddmmyyyyBuffer );
+      //cout << "genvar_date_ = " << genvar_date_->theValue() << "\n";
+
+      char *day_name[]= { const_cast<char*>("sunday"),   const_cast<char*>("monday"),
+                          const_cast<char*>("tuesday"),  const_cast<char*>("wednesday"),
+                          const_cast<char*>("thursday"), const_cast<char*>("friday"),
+                          const_cast<char*>("saturday"), NULL };
+      genvar_day_.set_value( day_name[suite_->calendar_.day_of_week()]  );
+      //cout << "genvar_day_ = " << genvar_day_->theValue() << "\n";
+
+      char dd[255];
+      sprintf(dd,"%02d",suite_->calendar_.day_of_month());
+      genvar_dd_.set_value( dd  );
+      //cout << "genvar_dd_ = " << genvar_dd_->theValue() << "\n";
+
+      char mm[255];
+      sprintf(mm,"%02d",suite_->calendar_.month());
+      genvar_mm_.set_value( mm  );
+      //cout << "genvar_mm_ = " << genvar_mm_->theValue() << "\n";
+
+      char *month_name[]
+                       = { const_cast<char*>("january"),   const_cast<char*>("february"),  const_cast<char*>("march"),
+                           const_cast<char*>("april"),     const_cast<char*>("may"),       const_cast<char*>("june"),
+                           const_cast<char*>("july"),      const_cast<char*>("august"),    const_cast<char*>("september"),
+                           const_cast<char*>("october"),   const_cast<char*>("november"),  const_cast<char*>("december"),
+                                NULL } ;
+      genvar_month_.set_value( month_name[suite_->calendar_.month()-1]  );
+      //cout << "genvar_month_ = " << genvar_month_->theValue() << "\n";
+
+      char smsdate[255];
+      sprintf(smsdate,"%04d%02d%02d", suite_->calendar_.year(), suite_->calendar_.month() , suite_->calendar_.day_of_month());
+      genvar_smsdate_.set_value( smsdate );
+      //cout << "genvar_smsdate_ = " << genvar_smsdate_->theValue() << "\n";
+
+      char smsclock[255];
+      sprintf(smsclock,"%s:%s:%d:%d", day_name[suite_->calendar_.day_of_week()], month_name[suite_->calendar_.month()-1],suite_->calendar_.day_of_week(),suite_->calendar_.day_of_year());
+      genvar_clock_.set_value( smsclock );
+      //cout << "genvar_clock_ = " << genvar_clock_->theValue() << "\n";
+   }
+}
+
+const Variable& SuiteGenVariables::findGenVariable(const std::string& name) const
+{
+   if (genvar_suite_.name() == name) return genvar_suite_;
+   if (genvar_smsdate_.name() == name) return genvar_smsdate_;
+   if (genvar_yyyy_.name() == name) return genvar_yyyy_;
+   if (genvar_dow_.name() == name) return genvar_dow_;
+   if (genvar_doy_.name() == name) return genvar_doy_;
+   if (genvar_date_.name() == name) return genvar_date_;
+   if (genvar_day_.name() == name) return genvar_day_;
+   if (genvar_dd_.name() == name) return genvar_dd_;
+   if (genvar_mm_.name() == name) return genvar_mm_;
+   if (genvar_month_.name() == name) return genvar_month_;
+   if (genvar_clock_.name() == name) return genvar_clock_;
+   if (genvar_time_.name() == name) return genvar_time_;
+   return Variable::EMPTY();
+}
+
+void SuiteGenVariables::gen_variables(std::vector<Variable>& vec) const
+{
+   vec.push_back(genvar_suite_);
+   vec.push_back(genvar_smsdate_);
+   vec.push_back(genvar_yyyy_);
+   vec.push_back(genvar_dow_);
+   vec.push_back(genvar_doy_);
+   vec.push_back(genvar_date_);
+   vec.push_back(genvar_day_);
+   vec.push_back(genvar_dd_);
+   vec.push_back(genvar_mm_);
+   vec.push_back(genvar_month_);
+   vec.push_back(genvar_clock_);
+   vec.push_back(genvar_time_);
+}
diff --git a/ecflow_4_0_7/ANode/src/Suite.hpp b/ecflow_4_0_7/ANode/src/Suite.hpp
new file mode 100644
index 0000000..6f523ef
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Suite.hpp
@@ -0,0 +1,175 @@
+#ifndef SUITE_HPP_
+#define SUITE_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #73 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "NodeContainer.hpp"
+#include "Calendar.hpp"
+#include "ClockAttr.hpp"
+class SuiteGenVariables;
+namespace ecf { class CalendarUpdateParams;  } // forward declare
+
+
+class Suite : public NodeContainer {
+public:
+   Suite( const std::string& name )
+   : NodeContainer(name),
+     defs_(NULL),
+     begun_(false),
+     state_change_no_(0),
+     modify_change_no_(0),
+     begun_change_no_(0),
+     calendar_change_no_(0),
+     suite_gen_variables_(NULL)
+     {}
+
+   Suite()
+   : defs_(NULL),
+     begun_(false),
+     state_change_no_(0),
+     modify_change_no_(0),
+     begun_change_no_(0),
+     calendar_change_no_(0),
+     suite_gen_variables_(NULL)
+     {}
+
+   virtual ~Suite();
+
+   static suite_ptr create(const std::string& name);
+
+   virtual Suite* suite() const { return const_cast<Suite*>(this); }
+   virtual Defs* defs() const { return defs_;}
+   void set_defs(Defs* d) { defs_ = d;}
+   virtual Suite* isSuite() const  {  return const_cast<Suite*>(this); }
+   virtual NodeContainer* isNodeContainer() const { return const_cast<Suite*>(this); }
+
+   /// Overridden to take into account begin()
+   virtual bool resolveDependencies(JobsParam& );
+
+   virtual void accept(ecf::NodeTreeVisitor&);
+   virtual void acceptVisitTraversor(ecf::NodeTreeVisitor& v);
+   virtual void begin();
+   virtual void requeue(
+            bool resetRepeats,
+            int clear_suspended_in_child_nodes,
+            bool reset_next_time_slot);
+   bool begun() const { return begun_; }
+   void reset_begin();
+   virtual void update_generated_variables() const;
+
+   virtual const Variable& findGenVariable(const std::string& name) const;
+   virtual void gen_variables(std::vector<Variable>&) const;
+
+   void updateCalendar( const ecf::CalendarUpdateParams &, std::vector<node_ptr>& auto_cancelled_nodes);
+
+   virtual const std::string& debugType() const;
+
+   bool operator==(const Suite& rhs) const;
+   std::ostream& print(std::ostream&) const;
+
+   void addClock( const ClockAttr& , bool initialize_calendar = true); // throw std::run_time if more than one clock is added
+   void changeClock( const ClockAttr& );
+   void changeClockType(const std::string& theType);
+   void changeClockDate(const std::string& theDate);
+   void changeClockGain(const std::string& theIntGain);
+   void changeClockSync();
+
+   /// return the suites calendar
+   const ecf::Calendar& calendar() const { return calendar_;}
+   ecf::Calendar& set_calendar() { return calendar_;}
+   clock_ptr clockAttr() const { return clockAttr_;}
+
+   virtual bool checkInvariants(std::string& errorMsg) const;
+
+   // Memento functions
+   virtual void collateChanges(DefsDelta&) const;
+   void set_memento(const SuiteClockMemento* );
+   void set_memento(const SuiteBeginDeltaMemento* );
+   void set_memento(const SuiteCalendarMemento* );
+   void set_memento(const OrderMemento* m) { NodeContainer::set_memento(m); }
+   void set_memento(const ChildrenMemento* m) { NodeContainer::set_memento(m); }
+
+   void set_state_change_no( unsigned int x )  { state_change_no_ = x;}
+   unsigned int state_change_no() const        { return state_change_no_; }
+   void set_modify_change_no( unsigned int x ) { modify_change_no_ = x;}
+   unsigned int modify_change_no() const       { return modify_change_no_; }
+
+   virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
+
+private:
+   void begin_calendar();
+   void handle_clock_attribute_change();
+   virtual std::string write_state() const;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      // serialise base class information
+      ar & boost::serialization::base_object<NodeContainer>(*this);
+      ar & begun_;
+      ar & clockAttr_;
+      ar & calendar_;
+
+      // The calendar does not persist the clock type or start stop with server since
+      // that is persisted with the clock attribute
+      if (Archive::is_loading::value) {
+         if (clockAttr_.get()) clockAttr_->init_calendar(calendar_);
+      }
+   }
+
+private:
+   Defs*                      defs_;                // *NOT* persisted, set by parent Defs
+   bool                       begun_;
+   clock_ptr                  clockAttr_;
+   ecf::Calendar              calendar_;              // *Only* persisted since used by the why() on client side
+   unsigned int               state_change_no_;     // no need to persist
+   unsigned int               modify_change_no_;    // no need to persist
+   unsigned int               begun_change_no_;     // no need to persist,  record changes to begun_. Needed for SSyncCmd
+   unsigned int               calendar_change_no_;  // no need to persist,
+   mutable SuiteGenVariables* suite_gen_variables_; // NOT persisted can be generated by calling update_generated_variables()
+   friend class SuiteGenVariables;
+};
+
+std::ostream& operator<<(std::ostream& os, const Suite&);
+
+
+// This class helps in avoiding the creation of generated variables until required.
+// This improves client->server down load times by avoiding thousands of string constructions
+class SuiteGenVariables : private boost::noncopyable {
+public:
+   SuiteGenVariables(const Suite*);
+
+   void update_generated_variables() const;
+   const Variable& findGenVariable(const std::string& name) const;
+   void gen_variables(std::vector<Variable>& vec) const;
+
+private:
+   const Suite* suite_;
+   mutable Variable genvar_suite_;   // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_yyyy_;    // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_dow_;     // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_doy_;     // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_date_;    // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_day_;     // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_dd_;      // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_mm_;      // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_month_;   // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_smsdate_; // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_clock_;   // *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_time_;    // *NOT* persisted, can be generated by calling update_generated_variables()
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/SuiteChanged.cpp b/ecflow_4_0_7/ANode/src/SuiteChanged.cpp
new file mode 100644
index 0000000..9d04483
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/SuiteChanged.cpp
@@ -0,0 +1,89 @@
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#ifdef DEBUG
+#include <iostream>
+#endif
+
+#include "SuiteChanged.hpp"
+#include "Suite.hpp"
+#include "Ecf.hpp"
+
+namespace ecf {
+
+SuiteChanged::SuiteChanged(suite_ptr s)
+: suite_(s),
+  state_change_no_(Ecf::state_change_no()),
+  modify_change_no_(Ecf::modify_change_no())
+  {}
+
+SuiteChanged::~SuiteChanged()
+{
+	suite_ptr suite = suite_.lock();
+	if (suite.get()) {
+		if ( modify_change_no_ != Ecf::modify_change_no() ) {
+ 			suite->set_modify_change_no(Ecf::modify_change_no());
+		}
+		if ( state_change_no_ != Ecf::state_change_no() ) {
+ 			suite->set_state_change_no(Ecf::state_change_no());
+		}
+	}
+}
+
+// ============================================================================
+SuiteChanged0::SuiteChanged0(node_ptr s)
+: node_(s),
+  suite_(s->suite()),
+  state_change_no_(Ecf::state_change_no()),
+  modify_change_no_(Ecf::modify_change_no())
+  {}
+
+SuiteChanged0::~SuiteChanged0()
+{
+	node_ptr node = node_.lock();
+	if (node.get() && suite_) {
+		if ( modify_change_no_ != Ecf::modify_change_no() ) {
+ 			suite_->set_modify_change_no(Ecf::modify_change_no());
+ 			//std::cout << "SuiteChanged0::~SuiteChanged0() modify_ changed \n";
+		}
+		if ( state_change_no_ != Ecf::state_change_no() ) {
+ 			suite_->set_state_change_no(Ecf::state_change_no());
+ 			//std::cout << "SuiteChanged0::~SuiteChanged0() state changed \n";
+		}
+	}
+}
+
+//================================================================
+
+SuiteChanged1::SuiteChanged1(Suite* s)
+: suite_(s),
+  state_change_no_(Ecf::state_change_no()),
+  modify_change_no_(Ecf::modify_change_no())
+  {}
+
+SuiteChanged1::~SuiteChanged1()
+{
+ 	if ( modify_change_no_ != Ecf::modify_change_no() ) {
+ 		suite_->set_modify_change_no(Ecf::modify_change_no());
+		//std::cout << "SuiteChanged1::~SuiteChanged0() modify_ changed \n";
+	}
+	if ( state_change_no_ != Ecf::state_change_no() ) {
+ 		suite_->set_state_change_no(Ecf::state_change_no());
+		//std::cout << "SuiteChanged1::~SuiteChanged0() modify_ changed \n";
+	}
+}
+
+}
diff --git a/ecflow_4_0_7/ANode/src/SuiteChanged.hpp b/ecflow_4_0_7/ANode/src/SuiteChanged.hpp
new file mode 100644
index 0000000..e02e34c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/SuiteChanged.hpp
@@ -0,0 +1,68 @@
+#ifndef SUITE_CHANGED_HPP_
+#define SUITE_CHANGED_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include "NodeFwd.hpp"
+
+namespace ecf {
+
+// Determine if suite was changed or modified if so, update suite change no
+// This mechanism was used because, when changing some attributes, we can not
+// immediately access the parent suites, to update the change numbers.
+//
+// When given a choice between where to add SuiteChanged, i.e in Node Tree or Commands
+// Generally favour commands, as it will require less maintenance over time.
+//
+// This mechanism was added specifically to support changes over client handles
+// i.e suites are added to handles, hence we need a way to determine which
+// suites (and hence handle) changed, and hence minimise the need for updates.
+
+class SuiteChanged  : private boost::noncopyable {
+public:
+	SuiteChanged(suite_ptr s);
+	~SuiteChanged();
+private:
+	weak_suite_ptr suite_;
+	unsigned int state_change_no_;
+	unsigned int modify_change_no_;
+};
+
+class SuiteChanged0  : private boost::noncopyable {
+public:
+	SuiteChanged0(node_ptr s);
+	~SuiteChanged0();
+private:
+	weak_node_ptr node_;
+   Suite* suite_; // if node is removed suite pointer is not accessible, hence store first
+	unsigned int state_change_no_;
+	unsigned int modify_change_no_;
+};
+
+
+class SuiteChanged1  : private boost::noncopyable {
+public:
+	SuiteChanged1(Suite* s);
+	~SuiteChanged1();
+private:
+	Suite* suite_;
+	unsigned int state_change_no_;
+	unsigned int modify_change_no_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ANode/src/System.cpp b/ecflow_4_0_7/ANode/src/System.cpp
new file mode 100644
index 0000000..4310d96
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/System.cpp
@@ -0,0 +1,411 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #39 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+#include <iostream>
+#include <signal.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <errno.h>
+
+#ifndef O_WRONLY
+#include <fcntl.h>
+#endif
+
+#include "System.hpp"
+#include "Signal.hpp"
+#include "Defs.hpp"
+#include "Submittable.hpp"
+#include "SuiteChanged.hpp"
+#include "Log.hpp"
+
+//#define DEBUG_FORK 1
+//#define DEBUG_CATCH_CHILD 1
+//#define DEBUG_TERMINATED_CHILD 1
+//#define DEBUG_CHILD_ABORT 1
+
+using namespace std;
+
+namespace ecf {
+
+// ===========================================================================
+// Process
+// ===========================================================================
+struct Process {
+public:
+	Process(const std::string& absPath,const std::string& cmdToSpawn, pid_t pid)
+	: absNodePath_(absPath), cmd_(cmdToSpawn),have_status_(0), pid_(pid), status_(0) {}
+
+    std::string absNodePath_; // Path to Task(ECF_JOB_CMD), empty for ECF_KILL_CMD & ECF_STATUS_CMD
+    std::string cmd_;         // the command that was spawned
+    sig_atomic_t have_status_;// Nonzero if this process has stopped or terminated.  */
+    pid_t pid_;               // The process ID of this child.
+    int status_;              // The status of this child; 0 if running,
+                              // otherwise a status value from waitpid
+};
+std::vector<Process> processVec_;
+
+/* Nonzero means some child's status has changed
+   so look at process_list for the details.  */
+volatile int process_status_change_ = 0;
+
+
+// ===========================================================================
+// System
+// ===========================================================================
+System* System::instance_ = NULL;
+
+System* System::instance()
+{
+	if ( instance_ == NULL) {
+
+	   // Block SIGCHLD so that we control, when child process termination is handled
+	   ecf::Signal::block_sigchild();
+
+		// install signal handler, that will catch Child process termination
+		// The install function can be called asynchronously, and hence deserves
+		// special consideration. Currently we temporarily unblock pending
+		// SIGCHLD signals at the end of Job generation, and then block them again.
+		// During the brief moment between unblock/block we expect
+		// the handler to be called.
+		catchChildProcessTermination();
+
+		instance_ = new System();
+	}
+	return instance_;
+}
+
+void System::destroy()
+{
+	delete instance_;
+	instance_ = NULL;
+}
+
+System::System() {}
+System::~System(){}
+
+bool System::spawn(const std::string& cmdToSpawn,const std::string& absPath,std::string& errorMsg)
+{
+#ifdef DEBUG_FORK
+	std::cout << " System::spawn path(" << absPath << ")  cmd(" << cmdToSpawn << ")\n";
+#endif
+
+	int rc   = 1; /* Not a zero          */
+	int tryi = 1; /* Currently hardcoded */
+
+	for (rc = 1; tryi && rc; tryi--) {
+		rc = sys(cmdToSpawn,absPath,errorMsg);
+		if ( rc ) sleep( 1 ); /* May be 2 many processes */
+	}
+
+	if ( rc ) {
+		std::stringstream ss;
+		ss << "Child process creation failed for command " << cmdToSpawn;
+		if ( !absPath.empty() ) ss << " at path(" << absPath << ")";
+		errorMsg = ss.str();
+#ifdef DEBUG_FORK
+		std::cout << " System::spawn returning false " << endl;
+#endif
+		return false;
+ 	}
+ 	return true;
+}
+
+int System::sys(const std::string& cmdToSpawn,const std::string& absPath,std::string& errorMsg)
+{
+#ifdef DEBUG_FORK
+	std::cout << "  System::sys path(" << absPath << ")  cmd(" << cmdToSpawn << ")\n";
+#endif
+	/**************************************************************************
+	 ?  Execute the command (cmdToSpawn) and return, DO NOT WAIT for the termination
+	 |  of the children.
+	 |  The stdin, stdout and stderr are closed (or redirected to /dev/null)
+	 =  PID in case of success or 0 in case of errors.
+	 ************************************o*************************************/
+	pid_t child_pid;
+	if ( (child_pid = fork()) == 0 ) { /* The child */
+
+	   int f;
+		close( 2 );
+		if ( (f = open( "/dev/null", O_WRONLY )) != 2 ) close( f );
+
+		close( 1 );
+		if ( (f = open( "/dev/null", O_WRONLY )) != 1 ) close( f );
+
+		close( 0 );
+		if ( (f = open( "/dev/null", O_RDONLY )) != 0 ) close( f );
+
+		// ==============================================================================
+		// Ideally we should close all open file descriptors in the child process
+		//    On Linux: sysconf(_SC_OPEN_MAX); returns 1024
+		//    This means making 1024 - 3 system calls
+		// This is especially import for socket descriptors, since if the server goes down
+		// The children/zombies will prevent the server restart on the same port.
+		// i.e the classic Address in use
+		// Its not clear how big a performance issue this, an alternative would be, to only close
+		// open socket file descriptors. But this will require a singleton of some sort
+		// ===============================================================================
+      int fd_limit = sysconf(_SC_OPEN_MAX);
+      for (int i=3; i<fd_limit; i++) close(i);
+
+		execl( "/bin/sh", "sh", "-c", cmdToSpawn.c_str(), (char *)NULL );
+		/*
+		 *  Maybe the file protection failed (no executable bit set)
+		 *  or the shell couldn't be found. Look at man execve(2).
+		 */
+		_exit( 127 );
+	}
+
+	if ( child_pid == -1 ) {
+		std::stringstream ss;
+		ss << "   ECF-PROCESS-SYS: FORK error for " << cmdToSpawn;
+		if (!absPath.empty()) ss << " and task " << absPath;
+		errorMsg = ss.str();
+		return 1;
+	}
+
+	// Store the process pid, so that we can wait for it. ho ho.
+	processVec_.push_back(Process(absPath,cmdToSpawn,child_pid));
+
+#ifdef DEBUG_FORK
+	//LogToCout logToCoutAsWell;
+	LOG( Log::DBG,"   submit: Path(" << absPath << ") child_pid(" << child_pid << ") cmd(" << cmdToSpawn << ")");
+#endif
+	return 0;
+}
+
+
+static void catch_child(int sig)
+/**************************************************************************
+?  Catch the death of the child process
+|  This function can be called asynchronously hence it could interfere
+   with the rest of program. Hence this function does not allocate or
+   free memory. We simply store the status, for later processing
+************************************o*************************************/
+{
+#ifdef DEBUG_CATCH_CHILD
+	std::cout << "   catch_child (process death) sig = " << sig << endl;
+#endif
+
+	int saved_errno = errno; // save error number since waitpid can change this
+	int status;
+	pid_t child_pid;
+
+	// waitpid returns:
+	//  - on success, returns the process ID of the child whose state has changed
+	//  - if WNOHANG was specified and one or more child(ren) specified by pid exist,
+	//    but have *NOT* yet changed state, then *0* is returned
+	//    *** hence we MUST check for 0, other wise we will end up in an infinite loop **
+	//  - returns -1 on error
+	while ( (child_pid = waitpid( -1, &status, WNOHANG )) != -1 && child_pid != 0) {
+
+	   std::vector<Process>::iterator theEnd = processVec_.end();
+	   for(std::vector<Process>::iterator i = processVec_.begin(); i!= theEnd; ++i) {
+	      if ((*i).pid_ == child_pid) {
+
+#ifdef DEBUG_CATCH_CHILD
+	         std::cout << "   catch_child Found pid " << child_pid << endl;
+#endif
+	         // Indicate that the status field
+	         // has data to look at.  We do this only after storing it.
+	         (*i).have_status_ = 1;
+
+	         // store the status
+	         (*i).status_ = status;
+
+	         // The program should check this flag from time to time
+	         // to see if there is any news in processVec_.
+	         process_status_change_++;
+	         break;
+	      }
+	   }
+	}
+
+	// restore error number
+	errno =  saved_errno ;
+}
+
+void System::processTerminatedChildren()
+{
+#ifdef DEBUG_TERMINATED_CHILD
+	std::cout << "System::processTerminatedChildren() process_status_change_ = " <<  process_status_change_
+	          <<  "   processVec_.size() = " <<  processVec_.size() << endl;
+	LogToCout logToCoutAsWell;
+#endif
+	if ( process_status_change_ == 0) {
+		return;
+	}
+
+	// Must be the first thing we do.
+	process_status_change_ = 0;
+
+	std::vector<Process>::iterator i;
+ 	for(i = processVec_.begin(); i!= processVec_.end(); ++i) {
+
+		if ((*i).have_status_) {
+
+#ifdef DEBUG_TERMINATED_CHILD
+			std::cout << "System::processTerminatedChildren() path(" << (*i).absNodePath_  << ")  pid(" << (*i).pid_ << ") has status " << endl;
+#endif
+			// exit status is one of mutually exclusive [ WIFEXITED | WIFSIGNALED | WIFSTOPPED | WIFCONTINUED ]
+			if (WIFEXITED((*i).status_)) {
+
+			   // *Normal* termination via exit
+            if ( WEXITSTATUS( (*i).status_ )) {
+               // exit is non zero.
+               std::stringstream ss; ss << " PID(" << (*i).pid_  << ")  path(" << (*i).absNodePath_ << ")  exited with status " << WEXITSTATUS((*i).status_)<< " [ " << (*i).cmd_ << " ]";
+               died( (*i).absNodePath_, ss.str());
+            }
+            else {
+               // exit(0) child terminated normally
+#ifdef DEBUG_TERMINATED_CHILD
+               LOG( Log::DBG, "PID " << (*i).pid_  << " exited normally [ " << (*i).cmd_ << " ]" );
+#endif
+            }
+
+            // remove the process since it has terminated
+            processVec_.erase(i--);
+			}
+			else if ( WIFSIGNALED( (*i).status_) ) {
+
+			   // *abnormal* child process terminated by a signal
+			   std::stringstream ss; ss << " ECF-PROCESS-CHILD:PID(" << (*i).pid_ << ") path(" << (*i).absNodePath_ << ")  died of signal " << WTERMSIG((*i).status_) << " [ " << (*i).cmd_ << " ]";
+			   died( (*i).absNodePath_, ss.str());
+
+            // remove the process since it has terminated
+            processVec_.erase(i--);
+			}
+			else if ( WIFSTOPPED( (*i).status_) ) {
+
+            LOG( Log::WAR, " ECF-PROCESS-CHILD:PID " << (*i).pid_ << " STOPPED? [ " << (*i).absNodePath_ << " ] [ " << (*i).cmd_ << " ]");
+			}
+			else {
+
+			   // Can only be WIFCONTINUED. (XSI extension to POSIX)
+            LOG( Log::WAR, " ECF-PROCESS-CHILD:PID " << (*i).pid_ << " CONTINUED? [ " << (*i).absNodePath_ << " ] [ " << (*i).cmd_ << " ]");
+			}
+		}
+		else {
+#ifdef DEBUG_TERMINATED_CHILD
+ 			LOG( Log::DBG, "   ECF-PROCESS-CHILD:stray PID " << (*i).pid_  << " (ignored)  [ " << (*i).cmd_ << " ]" );
+#endif
+		}
+	}
+
+#ifdef DEBUG_TERMINATED_CHILD
+ 	std::cout << "System::processTerminatedChildren() process size = " <<  processVec_.size() << endl;
+#endif
+}
+
+int System::process() const
+{
+	return static_cast<int>(processVec_.size());
+}
+
+// ============================================================================
+// See: Advanced programming in the UNIX environment: Page 328
+// Note: with sigaction the handle stays installed, until changed
+//       this is different to the signal(..) which on some system needs
+//       to be reinstalled at start/end of SignalFunction.
+// ============================================================================
+typedef void SignalFunction(int);
+SignalFunction* signal_(int signo, SignalFunction* func)
+{
+   struct sigaction act, oact;
+   act.sa_handler = func;
+   sigemptyset(&act.sa_mask);
+   act.sa_flags = 0;
+   if (signo == SIGALRM) {
+#ifdef SA_INTERRUPT
+      act.sa_flags |= SA_INTERRUPT;
+#endif
+   }
+   else {
+      // We intentionally try to set the SA_RESTART flag for all signals other than SIGALRM
+      // so that any system call interrupted by these other signals in automatically restarted
+#ifdef SA_RESTART
+      act.sa_flags |= SA_RESTART;
+#endif
+   }
+
+   if (sigaction(signo, &act, &oact) <  0)
+      return (SIG_ERR);
+
+   // Return the old handler
+   return oact.sa_handler;
+}
+
+void System::catchChildProcessTermination()
+{
+   // Call our local version (which uses sigaction) rather than the out date signal(..)
+	signal_( SIGCHLD, catch_child );
+}
+
+void System::died( const std::string& absNodePath, const std::string& reason)
+/**************************************************************************
+ ?  Process the death of the process. This is most unwanted and implies
+ |  that the shell died abnormally.
+ ************************************o*************************************/
+{
+#ifdef DEBUG_CHILD_ABORT
+	std::cout << "System::died path = '" << absNodePath << "'" << endl;
+#endif
+
+	/// always write to log, before returning
+	ecf::log(Log::ERR,reason);
+
+	/// If the Path is empty, then this could be something *OTHER THAN* job submission
+	/// that has failed. i.e kill cmd, or any other command, so don;t assert
+ 	if ( absNodePath.empty() ) {
+		return;
+	}
+
+	defs_ptr defs = defs_.lock();
+	if ( !defs.get() ) {
+		LOG_ASSERT(defs.get(),"System::died, defs not defined ???");
+		return;
+	}
+
+	node_ptr node = defs->findAbsNode( absNodePath );
+	if ( !node.get() ) {
+#ifdef DEBUG_CHILD_ABORT
+		std::cout << "System::died " << absNodePath << " could not be found in defs \n";
+#endif
+		return;
+	}
+
+	Submittable* submittable = node->isSubmittable();
+	if ( !submittable ) {
+#ifdef DEBUG_CHILD_ABORT
+		std::cout << "System::died " << absNodePath << " path is NOT a Task or Alias \n";
+#endif
+		return;
+	}
+
+	// This function can get called at any time.
+	// AND out of context of any command, hence we must handle case where Suite handles are used.
+	// Otherwise the view will not know about aborted states.
+	// ECFLOW-104 aborted state for a task following an error at submission
+	SuiteChanged1 changed(submittable->suite());
+
+	submittable->flag().set(ecf::Flag::JOBCMD_FAILED);
+
+#ifdef DEBUG_CHILD_ABORT
+	std::cout << "System::died aborting task " << absNodePath << "\n";
+#endif
+	// Set state aborted since the job terminated abnormally, and provide a reason
+	submittable->aborted(reason);
+}
+
+}
diff --git a/ecflow_4_0_7/ANode/src/System.hpp b/ecflow_4_0_7/ANode/src/System.hpp
new file mode 100644
index 0000000..c396bf2
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/System.hpp
@@ -0,0 +1,89 @@
+#ifndef SYSTEM_HPP_
+#define SYSTEM_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Works with class Signal
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+
+#include "NodeFwd.hpp"
+
+namespace ecf {
+
+/// Job submission in ECF is a two phase step.
+/// phase 1: Spawn of ECF_JOB_CMD
+/// phase 2: Invocation of ECF_JOB_CMD, this creates the *real* job which communicates with the server
+/// For TEST     :ECF_JOB_CMD = "%ECF_JOB% 1> %ECF_JOBOUT% 2>&1
+/// 	this collapses phase 1 and 2, to a single step
+/// For Operation:ECF_JOB_CMD = ecf_submit %USER% %SCHOST% %ECFJOB% %ECFJOBOUT%'
+///   	This uses ecf_submit,This spawns the process to the different load levellers depending on OS, etc.
+///   and hence involves at least 2 process.
+/// This class handles phase 1, we capture the death of the child process
+/// and hence this class will not in operations handle the death of the real job
+/// created by ecf_submit.
+
+class System : private boost::noncopyable {
+public:
+    static System* instance();
+
+    /// Destroy the singleton. used in test only, to avoid valgrind issues
+    static void destroy();
+
+    /// Let the server set this. Typically only set once, however in test  can be many times
+    /// Note:: In test the Defs file in the server can be cleared, i.e. for each new test
+    ///        Hence we maintain a weak_ptr to the Defs.
+    void setDefs(const defs_ptr& defs) { defs_ = defs;}
+
+    // return true, if command can be spawned, else false.
+    // For jobs, We can't store reference to Task*, as future functionality like
+    // auto-migrate, etc, means we may end up pointing to garbage.
+    // so instead we will store absNodePath. For other commands this can be empty
+    bool spawn(const std::string& cmdToSpawn,const std::string& absPath,std::string& errorMsg);
+
+    // Handle children that have stopped,aborted or terminated, etc
+    // The signal handler is kept as light as possible, since it is re-entrant.
+    // So Signal handles stores the termination state which handled later
+    // by processTerminatedChildren. Typically when we un-block SIGCHILD
+    void processTerminatedChildren();
+
+    /// returns the number of active process.
+    /// for debug only
+    int process() const;
+
+private:
+    ~System();
+    System();
+
+    /// Install signals that can catch signal from child process termination
+    static void catchChildProcessTermination();
+
+    // When a process terminates abnormally. This function is used to find the
+    // associated task, and set it to the abort state.
+    // Relies on the stored Defs ptr. which was set in the server
+    void died( const std::string& absNodePath, const std::string& reason);
+
+    /// Does the real work of spawning children
+    int sys(const std::string& cmdToSpawn,const std::string& absPath,std::string& errorMsg);
+
+private:
+    weak_defs_ptr  defs_;      // weak_ptr is an observer of a shared_ptr
+    static System* instance_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ANode/src/Task.cpp b/ecflow_4_0_7/ANode/src/Task.cpp
new file mode 100644
index 0000000..e8aaedd
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Task.cpp
@@ -0,0 +1,804 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #204 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include <sstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/filesystem/exception.hpp"
+#include <boost/bind.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/make_shared.hpp>
+
+#include "Task.hpp"
+#include "Defs.hpp"
+#include "PrintStyle.hpp"
+#include "Suite.hpp"
+#include "SuiteChanged.hpp"
+#include "NodeTreeVisitor.hpp"
+#include "File.hpp"
+#include "Stl.hpp"
+#include "Str.hpp"
+#include "Indentor.hpp"
+#include "Log.hpp"
+#include "ExprAst.hpp"
+#include "JobsParam.hpp"
+#include "Ecf.hpp"
+#include "DefsDelta.hpp"
+#include "TaskScriptGenerator.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "Extract.hpp"
+#include "JobProfiler.hpp"
+
+namespace fs = boost::filesystem;
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+//#define DEBUG_TASK_LOCATION 1
+
+Task::~Task()
+{
+   // Don't create the ChangeMgrSingleton during destruct sequence. (i.e in unit cases)
+   // Since that will cause a memory leak
+   if (!Ecf::server() && ChangeMgrSingleton::exists()) {
+      ChangeMgrSingleton::instance()->notify_delete( this );
+   }
+}
+
+task_ptr Task::create(const std::string& name)
+{
+	return boost::make_shared<Task>( name );
+}
+
+std::ostream& Task::print(std::ostream& os) const
+{
+   Indentor in;
+   Indentor::indent(os) << "task " << name();
+   if (!PrintStyle::defsStyle()) {
+      std::string st = write_state();
+      if (!st.empty()) os << " #" << st;
+   }
+   os << "\n";
+
+   Node::print(os);
+
+   // Generated variable are not persisted since they are created on demand
+   // There *NO* point in printing them they will always be empty
+
+   // Alias are not printed, but are check point able.
+   if (!PrintStyle::defsStyle()) {
+      Indentor in2;
+      size_t node_vec_size = aliases_.size();
+      for(size_t t = 0; t < node_vec_size; t++) { aliases_[t]->print( os ); }
+      if (node_vec_size != 0) {
+         Indentor in3;
+         Indentor::indent(os) << "endalias\n";
+      }
+   }
+
+   // if ( PrintStyle::defsStyle() ) Indentor::indent(os) << "endtask\n";
+   return os;
+}
+
+std::string Task::write_state() const
+{
+   // *IMPORTANT* we *CANT* use ';' character, since is used in the parser, when we have
+   //             multiple statement on a single line i.e.
+   //                 task a; task b;
+   std::stringstream ss;
+   if (alias_no_ != 0) ss << " alias_no:" << alias_no_;
+   ss << Submittable::write_state();
+   return ss.str();
+}
+
+void Task::read_state(const std::string& line, const std::vector<std::string>& lineTokens) {
+
+   // task t1 # alias_no:0 passwd:_DJP_
+   std::string token;
+   for(size_t i = 3; i < lineTokens.size(); i++) {
+      token.clear();
+      if (lineTokens[i].find("alias_no:") != std::string::npos ) {
+         if (!Extract::split_get_second(lineTokens[i],token)) throw std::runtime_error( "Task::read_state could not read alias_no for task " + name());
+         alias_no_ = Extract::theInt(token,"Task::read_state: invalid alias_no specified : " + line);
+         break;
+      }
+   }
+   Submittable::read_state(line,lineTokens);
+}
+
+std::ostream& operator<<(std::ostream& os, const Task& d)  { return d.print(os); }
+
+bool Task::operator==(const Task& rhs) const
+{
+   if (alias_no_ != rhs.alias_no_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Task::operator==  alias_no_(" << alias_no_ << ")  != rhs.alias_no_(" << rhs.alias_no_ << ") : " << absNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   size_t vec_size = aliases_.size();
+   if ( vec_size != rhs.aliases_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Task::operator==  aliases_.size() != rhs.aliases_.size() " << absNodePath() << "\n";
+         std::cout << "   aliases_.size() = " << vec_size << "  rhs.aliases_.size() = " << rhs.aliases_.size() << "\n";
+      }
+#endif
+      return false;
+   }
+
+   for(size_t i =0; i < vec_size; ++i) {
+
+      if ( !( *aliases_[i] == *rhs.aliases_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "Task::operator==  !( *aliases_[i] == *rhs.aliases_[i] : " << absNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   return Submittable::operator==(rhs);
+}
+
+alias_ptr Task::add_alias(std::vector<std::string>& user_file_contents,const NameValueVec& user_variables,bool create_directory)
+{
+   // Create directory
+   std::string dir_to_create;
+   if (create_directory) {
+
+      if (user_file_contents.empty()) {
+         std::stringstream ss;
+         ss << "Task::add_alias: No .usr file contents specified. Alias creation failed for task " << absNodePath();
+         throw std::runtime_error(ss.str());
+      }
+
+      findParentUserVariableValue( Str::ECF_HOME(), dir_to_create);
+      dir_to_create += absNodePath();
+      if (!File::createDirectories(dir_to_create)) {
+         throw std::runtime_error("Task::add_alias: could not create directory " +  dir_to_create);
+      }
+   }
+
+   // create alias
+   std::string alias_name = "alias" + boost::lexical_cast<std::string>(alias_no_);
+   alias_ptr alias = Alias::create( alias_name );
+   alias->set_parent(this);
+
+   // create .usr file
+   if (create_directory) {
+      std::string file_path = dir_to_create + "/" + alias_name + alias->script_extension();
+      std::string error_msg;
+      if (!File::create(file_path,user_file_contents,error_msg)) {
+         std::stringstream ss; ss << "Task::add_alias: could not create .usr file at path(" << file_path <<"): " <<  error_msg.c_str();
+         throw std::runtime_error(ss.str());
+      }
+   }
+
+   // copy over events, meters, labels
+   BOOST_FOREACH(const Meter& meter, meters()) { alias->addMeter(meter); }
+   BOOST_FOREACH(const Event& event, events()) { alias->addEvent(event); }
+   BOOST_FOREACH(const Label& label, labels()) { alias->addLabel(label); }
+
+   // Add user_variables as variables. Note: to reduce memory we could choose
+   // to only add those variable that have been changed/added. However this
+   // would mean an alias could be affected by changed to an inherited variable.
+   // Hence kept as existing sms functionality
+   //
+   // The variables may be **different** to normal variables in that they may contain a ":" & $
+   // This is **not** allowed in normal variables.
+   // i.e it allows for  %A:1%, %A:2%, %A:3%
+   // This is not really recommended but its what the old system supported.
+   // **** Hence add_alias_variable by passes variable name checking ***
+   NameValueVec::const_iterator theEnd = user_variables.end();
+   for(NameValueVec::const_iterator i = user_variables.begin(); i!=theEnd; ++i) {
+      alias->add_alias_variable((*i).first, (*i).second);
+   }
+
+   // increment alias number and store, alias in vector
+   alias_no_++;  // Alias number must be set to next valid alias number
+   aliases_.push_back(alias);
+
+   alias_change_no_ = Ecf::incr_state_change_no();
+   add_remove_state_change_no_ = alias_change_no_;
+   return alias;
+}
+
+alias_ptr Task::add_alias_only()
+{
+   std::vector<std::string> empty_user_file_contents;
+   NameValueVec empty_user_variables;
+   return add_alias(empty_user_file_contents,empty_user_variables,false/* don't create directory or .usr file*/);
+}
+
+alias_ptr Task::add_alias(const std::string& name)
+{
+   // Do not update alias_no, since that will be read in
+   alias_ptr alias = Alias::create( name );
+   alias->set_parent(this);
+   aliases_.push_back(alias);
+   return alias;
+}
+
+alias_ptr Task::find_alias(const std::string& name) const
+{
+   size_t vec_size = aliases_.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      if (aliases_[i]->name() == name) {
+         return aliases_[i];
+      }
+   }
+   return alias_ptr();
+}
+
+void Task::reset_alias_number()
+{
+   alias_no_ = 0;
+   alias_change_no_ = Ecf::incr_state_change_no();
+}
+
+node_ptr Task::findImmediateChild(const std::string& name, size_t& child_pos) const
+{
+   child_pos = std::numeric_limits<std::size_t>::max();
+   size_t vec_size = aliases_.size();
+    for(size_t i = 0; i < vec_size; i++) {
+       if (aliases_[i]->name() == name) {
+          child_pos = i;
+          return aliases_[i];
+       }
+    }
+    return node_ptr();
+}
+
+void Task::begin()
+{
+   if (aliases_.empty()) {
+      if (alias_no_ != 0) {
+         reset_alias_number();
+      }
+   }
+
+	Submittable::begin();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "Task::begin()\n";
+#endif
+}
+
+void Task::requeue(
+         bool resetRepeats,
+         int clear_suspended_in_child_nodes,
+         bool reset_next_time_slot)
+{
+   if (aliases_.empty()) {
+      if (alias_no_ != 0) {
+         reset_alias_number();
+      }
+   }
+
+	Submittable::requeue(resetRepeats,
+	                     clear_suspended_in_child_nodes,
+	                     reset_next_time_slot);
+
+#ifdef DEBUG_STATE_CHANGE_NO
+	std::cout << "Task::requeue\n";
+#endif
+}
+
+void Task::accept(ecf::NodeTreeVisitor& v)
+{
+	v.visitTask(this);
+}
+
+void Task::acceptVisitTraversor(ecf::NodeTreeVisitor& v)
+{
+	v.visitTask(this);
+}
+
+const std::string& Task::debugType() const { return ecf::Str::TASK();}
+
+void Task::getAllNodes(std::vector<Node*>& vec) const
+{
+   // See notes: getAllSubmittables, about reserve
+   size_t vec_size = aliases_.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      vec.push_back( aliases_[i].get() );
+   }
+}
+
+void Task::immediateChildren(std::vector<node_ptr>& vec) const
+{
+   size_t vec_size = aliases_.size();
+   vec.reserve(vec.size() + vec_size);
+   for(size_t i = 0; i < vec_size; i++) {
+      vec.push_back( boost::dynamic_pointer_cast<Node>(aliases_[i]) );
+   }
+}
+
+void Task::getAllTasks(std::vector<Task*>& vec) const
+{
+	vec.push_back(const_cast<Task*>(this));
+}
+
+void Task::getAllSubmittables(std::vector<Submittable*>& vec) const
+{
+   // *DO NOT reserve here, as it dominate time , for very large defs */
+   // * Previously we had::
+   //    vec.reserve(vec.size() + vec_size + 1);
+   // * This took 47 seconds when delete the full defs, i.e when check for active tasks
+
+   vec.push_back(const_cast<Task*>(this));
+   size_t vec_size = aliases_.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      vec.push_back( aliases_[i].get() );
+   }
+}
+
+node_ptr Task::find_node_up_the_tree(const std::string& name) const
+{
+   size_t vec_size = aliases_.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      if (aliases_[i]->name() == name ) {
+         return aliases_[i];
+      }
+   }
+   Node* the_parent = parent();
+   if (the_parent) return the_parent->find_node_up_the_tree(name);
+   return node_ptr();
+}
+
+void Task::get_all_active_submittables(std::vector<Submittable*>& vec) const
+{
+   // See notes: getAllSubmittables, about reserve
+   if (state() == NState::ACTIVE || state() == NState::SUBMITTED) {
+      vec.push_back(const_cast<Task*>(this));
+   }
+   size_t vec_size = aliases_.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      if (aliases_[i]->state() == NState::ACTIVE || aliases_[i]->state() == NState::SUBMITTED) {
+         vec.push_back( aliases_[i].get() );
+      }
+   }
+}
+
+void Task::get_all_tasks(std::vector<task_ptr>& vec) const
+{
+   vec.push_back(boost::dynamic_pointer_cast<Task>(non_const_this()));
+}
+
+void Task::get_all_nodes(std::vector<node_ptr>& nodes) const
+{
+   nodes.push_back( non_const_this() );
+   size_t vec_size = aliases_.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      aliases_[i]->get_all_nodes(nodes);
+   }
+}
+
+void Task::get_all_aliases(std::vector<alias_ptr>& destinationVec) const
+{
+   destinationVec.reserve(destinationVec.size() + aliases_.size());
+   std::copy(aliases_.begin(),aliases_.end(),std::back_inserter(destinationVec));
+}
+
+bool Task::resolveDependencies(JobsParam& jobsParam)
+{
+   if (jobsParam.timed_out_of_job_generation()) return false;
+   JobProfiler profile_me(this,jobsParam,JobProfiler::task_threshold());
+   if (jobsParam.timed_out_of_job_generation()) return false;
+
+
+   // Calling Submittable::resolveDependencies(jobsParam) up front can be expensive.
+   // Due to trigger and complete evaluations. Hence low cost state checks first
+
+ 	// Do state checking for tasks only. Note: container nodes inherit the most significant state
+ 	// from the children, hence we can't use the same same algorithm for containers nodes and leaf
+ 	// nodes like task.
+	NState::State task_state = state();
+	if ( task_state == NState::ACTIVE || task_state == NState::SUBMITTED || task_state == NState::UNKNOWN || task_state == NState::COMPLETE) {
+#ifdef DEBUG_DEPENDENCIES
+		LOG(Log::DBG,"   Task::resolveDependencies() " << absNodePath() << " HOLDING as task state " << NState::toString(state()) << " is not valid for job submission" );
+#endif
+		return false;
+	}
+	else if (task_state == NState::ABORTED) {
+      // If the task was aborted, and we have not exceeded ECF_TRIES, then resubmit
+      // otherwise ONLY in state QUEUED can we submit jobs
+      // The Node could have been placed into SUSPENDED state
+
+      /// If we have been killed by the user. Do not resubmit jobs, until begin or re-queue FLAG_ISSET
+      if (flag().is_set(ecf::Flag::KILLED)) {
+#ifdef DEBUG_DEPENDENCIES
+         LOG(Log::DBG,"   Task::resolveDependencies() " << absNodePath() << " HOLDING as task state " << NState::toString(state()) << " has been killed." );
+#endif
+         return false;
+      }
+
+      std::string varValue;
+      if (findParentUserVariableValue( Str::ECF_TRIES(), varValue ))  {
+         // std::cout << "tryNo_ = " << tryNo_ << " ECF_TRIES = " <<  varValue << "\n";
+         try {
+            int ecf_tries = boost::lexical_cast< int > (varValue);
+            if ( try_no() >= ecf_tries ) {
+#ifdef DEBUG_DEPENDENCIES
+               LOG(Log::DBG,"   Task::resolveDependencies() " << absNodePath() << " HOLDING as tryNo_(" << tryNo_ ") >= ECF_TRIES(" << ecf_tries << ") state = " << NState::toString(state()));
+#endif
+               return false;
+            }
+         }
+         catch ( boost::bad_lexical_cast& ) {
+            LOG(Log::ERR,"Variable ECF_TRIES must be convertible to an integer. Can not resubmit job for task:" << absNodePath());
+            return false;
+         }
+      }
+   }
+#ifdef DEBUG
+	else {
+	   /// Only one state left
+	   assert(task_state == NState::QUEUED);
+	}
+#endif
+
+   /// If we have been forcibly aborted by the user. Do not resubmit jobs, until *begin* or *re-queue*
+   if (flag().is_set(ecf::Flag::FORCE_ABORT)) {
+#ifdef DEBUG_DEPENDENCIES
+      LOG(Log::DBG,"   Task::resolveDependencies() " << absNodePath() << " HOLDING as task state " << NState::toString(state()) << " has been forcibly aborted." );
+#endif
+      return false;
+   }
+
+
+	if ( ! Node::resolveDependencies(jobsParam) ) {
+
+#ifdef DEBUG_JOB_SUBMISSION
+		LOG(Log::DBG, "   Task::resolveDependencies " << absNodePath() << " could not resolve dependencies, may have completed");
+		cout << "Task::resolveDependencies " << absNodePath() << " could not resolve dependencies may have completed" << endl;
+#endif
+		return false;
+	}
+
+	/// By default node tree traversal is top down. hence we only check in limits, at *that* level.
+	/// However *EACH* job submission can *affect* the in limits, hence we *must* check we are in
+	/// limit *up* the node tree. Done last and only in this function (as opposed to Node) as an optimisation
+	if (!check_in_limit_up_node_tree()) {
+#ifdef DEBUG_DEPENDENCIES
+		LOG(Log::DBG,"   Task::resolveDependencies() " << absNodePath() << " FREE of TRIGGER and inLIMIT");
+#endif
+		return false;
+	}
+
+   // call just before job submission, reset data members, update try_no, and generate variable
+	// *PLACED* outside of submitJob() so that we can configure job generation file ECF_JOB for test/python
+   increment_try_no(); // will increment state_change_no
+
+	if ( jobsParam.createJobs() ) {
+		// The task are ready for job submission.Clear process id and remote id (ECF_RID)
+		// Locate the ecf files corresponding to the task. Pre-process
+		// them(i.e expand includes, remove comments,manual) and perform
+		// variable substitution. This will then form the jobs file.
+		// If the job file already exist it is overridden
+		submit_job_only( jobsParam );
+	}
+	else {
+		// *************************************************************************************
+		// Debug/test path only... Enabled for testing when we don't want to create/spawn jobs
+		// ** Simulate ** job submission as closely as possible. For testing
+		// *************************************************************************************
+		jobsParam.push_back_submittable( this );
+
+		// follow normal life cycle queued->submitted->active. In real life there may be a noticeable
+		// time delay between process creation (via a user command, which could do anything)
+		// and when created process start talking back to the server.
+		// *** Setting state to SUBMITTED will increment any inlimit/Limit via handleStateChange
+ 		set_state( NState::SUBMITTED );
+
+		// The spawned process will typically call this, via client api. Set task into active state
+ 		// *** Test path, we take the hit of calling handleStateChange again.
+		init(Submittable::DUMMY_PROCESS_OR_REMOTE_ID());
+	}
+	return true;
+}
+
+void Task::generate_scripts( const std::map<std::string,std::string>& override) const
+{
+   TaskScriptGenerator ecf(this);
+   ecf.generate(override);
+}
+
+node_ptr Task::removeChild(Node* child)
+{
+#ifdef DEBUG
+   assert(child);
+   assert(child->isAlias());
+#endif
+   SuiteChanged1 changed(suite());
+   size_t node_vec_size = aliases_.size();
+   for(size_t t = 0; t < node_vec_size; t++)     {
+      if (aliases_[t].get() == child) {
+         child->set_parent(NULL);
+         node_ptr node = boost::dynamic_pointer_cast<Alias>(aliases_[t]);
+         aliases_.erase( aliases_.begin() + t);
+         add_remove_state_change_no_ = Ecf::incr_state_change_no();
+         return node ;
+      }
+   }
+   // Should never happen
+   LOG_ASSERT(false,"Task::removeChild: Could not remove child");
+   return node_ptr();
+}
+
+bool Task::doDeleteChild(Node* child)
+{
+   SuiteChanged1 changed(suite());
+   std::vector<alias_ptr>::iterator the_end = aliases_.end();
+   for(std::vector<alias_ptr>::iterator t = aliases_.begin(); t!=the_end; ++t) {
+      if ( (*t).get() == child) {
+         if (child && child->parent()) child->set_parent(NULL);
+         aliases_.erase(t);
+         add_remove_state_change_no_ = Ecf::incr_state_change_no();
+         return true;
+      }
+   }
+   return false;
+}
+
+bool Task::addChild( node_ptr, size_t)
+{
+   // Only used during PLUG: aliases can't be plugged.
+	LOG_ASSERT(false,"");
+	return false;
+}
+
+bool Task::isAddChildOk( Node*, std::string& errorMsg) const
+{
+   // Only used during PLUG: aliases can't be plugged.
+	errorMsg += "Can not add children to a task node.";
+	return false;
+}
+
+size_t Task::child_position(const Node* child) const
+{
+   size_t vec_size = aliases_.size();
+   for(size_t t = 0; t < vec_size; t++) {
+      if (aliases_[t].get() == child) {
+         return t;
+      }
+   }
+   return std::numeric_limits<std::size_t>::max();
+}
+
+void Task::order(Node* immediateChild, NOrder::Order ord)
+{
+   SuiteChanged1 changed(suite());
+   switch (ord) {
+      case NOrder::TOP:  {
+         for(std::vector<alias_ptr>::iterator i = aliases_.begin(); i != aliases_.end(); ++i) {
+            if ((*i).get() == immediateChild) {
+               alias_ptr node = (*i);
+               aliases_.erase(i);
+               aliases_.insert(aliases_.begin(),node);
+               order_state_change_no_ = Ecf::incr_state_change_no();
+               return;
+            }
+         }
+         throw std::runtime_error("Task::order TOP, immediate child not found");
+      }
+      case NOrder::BOTTOM:  {
+         for(std::vector<alias_ptr>::iterator i = aliases_.begin(); i != aliases_.end(); ++i) {
+            if ((*i).get() == immediateChild) {
+               alias_ptr node = (*i);
+               aliases_.erase(i);
+               aliases_.push_back(node);
+               order_state_change_no_ = Ecf::incr_state_change_no();
+               return;
+            }
+         }
+         throw std::runtime_error("Task::order BOTTOM, immediate child not found");
+      }
+      case NOrder::ALPHA:  {
+         std::sort(aliases_.begin(),aliases_.end(),
+                     boost::bind(Str::caseInsLess,
+                                   boost::bind(&Node::name,_1),
+                                   boost::bind(&Node::name,_2)));
+         order_state_change_no_ = Ecf::incr_state_change_no();
+         break;
+      }
+      case NOrder::ORDER:  {
+         std::sort(aliases_.begin(),aliases_.end(),
+                     boost::bind(Str::caseInsGreater,
+                                   boost::bind(&Node::name,_1),
+                                   boost::bind(&Node::name,_2)));
+         order_state_change_no_ = Ecf::incr_state_change_no();
+         break;
+      }
+      case NOrder::UP:  {
+         for(size_t t = 0; t  < aliases_.size();t++) {
+            if ( aliases_[t].get() == immediateChild) {
+               if (t != 0) {
+                  alias_ptr node =  aliases_[t];
+                  aliases_.erase(aliases_.begin()+t);
+                  t--;
+                  aliases_.insert(aliases_.begin()+t,node);
+                  order_state_change_no_ = Ecf::incr_state_change_no();
+                }
+               return;
+            }
+         }
+         throw std::runtime_error("Task::order UP, immediate child not found");
+      }
+      case NOrder::DOWN: {
+         for(size_t t = 0; t  < aliases_.size();t++) {
+            if ( aliases_[t].get() == immediateChild) {
+               if (t != aliases_.size()-1) {
+                  alias_ptr node =  aliases_[t];
+                  aliases_.erase(aliases_.begin()+t);
+                  t++;
+                  aliases_.insert(aliases_.begin()+t,node);
+                  order_state_change_no_ = Ecf::incr_state_change_no();
+               }
+               return;
+            }
+         }
+         throw std::runtime_error("Task::order DOWN, immediate child not found");
+      }
+   }
+}
+
+bool Task::checkInvariants(std::string& errorMsg) const
+{
+   if (!Node::checkInvariants(errorMsg)) return false;
+
+   size_t vec_size = aliases_.size();
+   for(size_t t = 0; t < vec_size; t++) {
+      if (aliases_[t]->parent() != this) {
+         std::stringstream ss;
+         ss << "Task::checkInvariants alias(" << aliases_[t]->name() << ") parent() not correct. See task : " << absNodePath();
+         errorMsg += ss.str();
+         return false;
+      }
+      if (!aliases_[t]->checkInvariants(errorMsg)) {
+         return false;
+      }
+   }
+   if ( vec_size > alias_no_ ) {
+      std::stringstream ss;
+      ss << "Task::checkInvariants: alias vector size " << vec_size << " should be less or equal to alias_no_ " << alias_no_ << " for task " << absNodePath() << "\n";
+      errorMsg += ss.str();
+      return false;
+   }
+   return true;
+}
+
+void Task::handleStateChange()
+{
+   /// Increment/decrement limits based on the current state
+   update_limits();
+
+	// Check if a re queue is required, then can eventually change the state, if
+	// repeats, time,today, or cron are involved, hence must be done last
+	// This will recurse up the node tree, causing repeats to increment, at the parent
+	// level and resetting repeats in the children. To mimic nested loops.
+ 	requeueOrSetMostSignificantStateUpNodeTree();
+}
+
+const std::string& Task::script_extension() const
+{
+   // Migration support, allow user to specify extension. This allows users to use '.sms'
+   // Note: This should be removed in the future since there is performance hit.
+   //       searching up the node tree, when most of the time we are using .ecf
+   const std::string& ecf_extn = find_parent_user_variable_value(Str::ECF_EXTN());
+   if (!ecf_extn.empty()) return ecf_extn;
+   return File::ECF_EXTN(); // ".ecf"
+}
+
+void Task::collateChanges(DefsDelta& changes) const
+{
+//   std::cout << "Task::collateChanges " << debugNodePath()
+//             << " changes.client_state_change_no() = " << changes.client_state_change_no()
+//             << " add_remove_state_change_no_ = " << add_remove_state_change_no_
+//             << " order_state_change_no_ = " << order_state_change_no_
+//             << " alias_change_no_ " << alias_change_no_
+//             << "\n";
+
+   /// All changes to Task should be on ONE compound_memento_ptr
+   compound_memento_ptr comp;
+
+   /// There no point doing a OrderMemento if children have been added/delete
+   if (add_remove_state_change_no_ > changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(absNodePath());
+      comp->add( boost::make_shared<AliasChildrenMemento>( aliases_ ) );
+   }
+   else if (order_state_change_no_ > changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(absNodePath());
+      std::vector<std::string> order_vec; order_vec.reserve(aliases_.size());
+      size_t node_vec_size = aliases_.size();
+      for(size_t i =0; i < node_vec_size; i++)  order_vec.push_back( aliases_[i]->name());
+      comp->add( boost::make_shared<OrderMemento>( order_vec ) );
+   }
+
+   if (alias_change_no_ > changes.client_state_change_no()) {
+      if (!comp.get()) comp = boost::make_shared<CompoundMemento>(absNodePath());
+      comp->add( boost::make_shared<AliasNumberMemento>( alias_no_ ) );
+   }
+
+   // ** base class will add compound memento into changes.
+   Submittable::incremental_changes(changes, comp);
+
+   // Traversal to children
+   size_t vec_size = aliases_.size();
+   for(size_t t = 0; t < vec_size; t++)   { aliases_[t]->collateChanges(changes); }
+}
+
+void Task::set_memento( const OrderMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+   std::cout << "Task::set_memento( const OrderMemento* ) " << debugNodePath() << "\n";
+#endif
+
+   // Order aliases_ according to memento ordering
+   const std::vector<std::string>& order = memento->order_;
+   if (order.size() != aliases_.size()) {
+      // something gone wrong.
+      std::cout << "Task::set_memento OrderMemento, memento.size() " << order.size() << " Not the same as aliases_size() " << aliases_.size() << "\n";
+      return;
+   }
+
+   std::vector<alias_ptr> vec; vec.reserve(aliases_.size());
+   size_t node_vec_size = aliases_.size();
+   for(size_t i = 0; i < order.size(); i++) {
+      for(size_t t = 0; t < node_vec_size; t++) {
+          if (order[i] == aliases_[t]->name()) {
+             vec.push_back(aliases_[t]);
+             break;
+          }
+       }
+   }
+   if (vec.size() !=  aliases_.size()) {
+       std::cout << "Task::set_memento(const OrderMemento* memento) could not find all the names\n";
+       return;
+   }
+
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ORDER);
+   aliases_ = vec;
+}
+
+void Task::set_memento( const AliasChildrenMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+   std::cout << "Task::set_memento( const AliasChildrenMemento* ) " << debugNodePath() << "\n";
+#endif
+
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ADD_REMOVE_NODE);
+   aliases_ = memento->children_;
+
+   // set up alias parent pointers. since they are *NOT* serialised.
+   size_t vec_size = aliases_.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      aliases_[i]->set_parent(this);
+   }
+}
+
+void Task::set_memento( const AliasNumberMemento* memento ) {
+#ifdef DEBUG_MEMENTO
+   std::cout << "Task::set_memento( const AliasNumberMemento* ) " << debugNodePath() << "\n";
+#endif
+
+   ChangeMgrSingleton::instance()->add_aspect(ecf::Aspect::ALIAS_NUMBER);
+   alias_no_ = memento->alias_no_;
+}
diff --git a/ecflow_4_0_7/ANode/src/Task.hpp b/ecflow_4_0_7/ANode/src/Task.hpp
new file mode 100644
index 0000000..8058f82
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/Task.hpp
@@ -0,0 +1,172 @@
+#ifndef TASK_HPP_
+#define TASK_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #108 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "Alias.hpp"
+
+class Task : public Submittable {
+public:
+   Task( const std::string& name )
+   : Submittable(name),
+     order_state_change_no_(0),
+     add_remove_state_change_no_(0),
+     alias_change_no_(0),
+     alias_no_(0)
+     {}
+
+   Task()
+   : order_state_change_no_(0),
+     add_remove_state_change_no_(0),
+     alias_change_no_(0),
+     alias_no_(0)
+     {}
+
+	virtual ~Task();
+
+	static task_ptr create(const std::string& name);
+
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const Task& rhs) const;
+
+   /// Add an alias. The .usr is populated with contents of user_file_contents
+   /// If create_directory is unset we create the alias with creating directory or .usr file
+   alias_ptr add_alias(std::vector<std::string>& user_file_contents,const NameValueVec& user_variables,bool create_directory = true);
+
+   /// Add alias without creating directory & user file
+   alias_ptr add_alias_only();
+
+   /// For Addition of alias via Defs Files
+   alias_ptr add_alias(const std::string& name);
+
+   /// Given a name find the alias.
+   alias_ptr find_alias(const std::string& name) const;
+
+   /// Reset alias number. Used in testing
+   void reset_alias_number();
+
+   /// return list of aliases held by this task
+   const std::vector<alias_ptr>& aliases() { return aliases_; }
+   virtual void immediateChildren(std::vector<node_ptr>&) const;
+
+   /// Overidden from Submittable
+   virtual const std::string& script_extension() const;
+
+   virtual node_ptr find_node_up_the_tree(const std::string& name) const;
+
+   /// Added for consistency, really used to find relative nodes, aliases should never, be in referenced nodes
+   virtual node_ptr find_relative_node(const std::vector<std::string>& pathToNode) { return node_ptr();}
+
+	/// Overridden to reset the try number
+	/// The tasks job can be invoked multiple times. For each invocation we want to preserve
+	/// the output. The try number is used in SMSJOB/SMSJOBOUT to preserve the output when
+	/// there are multiple runs.  re-queue/begin() resets the try Number
+	virtual void begin();
+	virtual void requeue( bool resetRepeats,
+	                        int clear_suspended_in_child_nodes,
+	                        bool reset_next_time_slot);
+
+   virtual Suite* suite() const { return parent()->suite(); }
+   virtual Defs* defs() const { return (parent()) ? parent()->defs() : NULL;} // exposed to python hence check for NULL first
+	virtual Task* isTask() const   { return const_cast<Task*>(this);}
+   virtual Submittable* isSubmittable() const { return const_cast<Task*>(this); }
+
+	virtual void accept(ecf::NodeTreeVisitor&);
+	virtual void acceptVisitTraversor(ecf::NodeTreeVisitor& v);
+
+   virtual void getAllNodes(std::vector<Node*>&) const;
+   virtual void getAllTasks(std::vector<Task*>&) const;
+   virtual void getAllSubmittables(std::vector<Submittable*>&) const;
+   virtual void get_all_active_submittables(std::vector<Submittable*>&) const;
+   virtual void get_all_tasks(std::vector<task_ptr>&) const;
+   virtual void get_all_nodes(std::vector<node_ptr>&) const;
+   virtual void get_all_aliases(std::vector<alias_ptr>&) const;
+
+	virtual const std::string& debugType() const;
+
+	/// submits the jobs of the dependencies resolve
+	virtual bool resolveDependencies(JobsParam& jobsParam);
+
+  	virtual node_ptr removeChild( Node* child);
+ 	virtual bool addChild( node_ptr child,size_t position = std::numeric_limits<std::size_t>::max());
+ 	virtual bool isAddChildOk( Node* child, std::string& errorMsg) const;
+
+   virtual void order(Node* immediateChild, NOrder::Order);
+   virtual void generate_scripts( const std::map<std::string,std::string>& override) const;
+
+   virtual bool checkInvariants(std::string& errorMsg) const;
+
+   virtual void collateChanges(DefsDelta&) const;
+   void set_memento(const OrderMemento* m);
+   void set_memento(const AliasChildrenMemento* m);
+   void set_memento(const AliasNumberMemento* m);
+   void set_memento(const SubmittableMemento* m) { Submittable::set_memento(m); }
+
+   virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
+private:
+   virtual size_t child_position(const Node*) const;
+   virtual std::string write_state() const;
+
+private:
+   /// For use by python interface,
+   std::vector<alias_ptr>::const_iterator alias_begin() const { return aliases_.begin();}
+   std::vector<alias_ptr>::const_iterator alias_end() const   { return aliases_.end();}
+   friend void export_Task();
+
+private:
+	// Overridden from Node to increment/decrement limits
+	virtual void handleStateChange();
+   virtual bool doDeleteChild(Node* child);
+
+   // Overridden to locate alias's
+   virtual node_ptr findImmediateChild(const std::string& name, size_t& child_pos) const;
+
+ 	friend class boost::serialization::access;
+ 	template<class Archive>
+ 	void serialize(Archive & ar, const unsigned int /*version*/) {
+ 	   ar & boost::serialization::base_object<Submittable>(*this); // Serialise base class information
+      ar & alias_no_;
+      ar & aliases_;
+
+      // Setup the alias parent pointers. Since they are not serialised
+      // ********************************************************************
+      // WE do not serialise the Alias parent pointer:
+      // WHY: AliasChildrenMenento saves a vector of aliases, had we serialised
+      //      the parent, it would also serialise the parent pointer(Task)
+      //      i.e the ENTIRE task, and then Task parent, and so on, up the parent hierarchy.
+      //      In our case it lead to unregistered class exception when trying to
+      //      serialise the Task's parent.
+      // SOLN: WE will not serialise the alias parent pointer. This will be left to
+      //       Parent task.
+      // ********************************************************************
+      if (Archive::is_loading::value) {
+         size_t vec_size = aliases_.size();
+         for(size_t i = 0; i < vec_size; i++) {
+            aliases_[i]->set_parent(this);
+         }
+      }
+ 	}
+
+private:
+   unsigned int order_state_change_no_;     // no need to persist
+   unsigned int add_remove_state_change_no_;// no need to persist
+
+   unsigned int alias_change_no_;           // no need to persist, for alias number only
+ 	unsigned int alias_no_;
+ 	std::vector<alias_ptr> aliases_;
+};
+
+std::ostream& operator<<(std::ostream& os, const Task&);
+
+#endif
diff --git a/ecflow_4_0_7/ANode/src/TaskScriptGenerator.cpp b/ecflow_4_0_7/ANode/src/TaskScriptGenerator.cpp
new file mode 100644
index 0000000..1ad0db8
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/TaskScriptGenerator.cpp
@@ -0,0 +1,263 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/filesystem.hpp>
+
+#include "TaskScriptGenerator.hpp"
+#include "Task.hpp"
+#include "File.hpp"
+#include "Ecf.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace boost;
+namespace fs = boost::filesystem;
+
+namespace ecf {
+
+TaskScriptGenerator::TaskScriptGenerator(const Task* task)
+: task_(task), is_dummy_task_(false)
+{
+   /// if ECF_DUMMY_TASK specified ignore
+   std::string theValue;
+   is_dummy_task_ = task_->findParentUserVariableValue(Str::ECF_DUMMY_TASK(),   theValue);
+   if (is_dummy_task_) return;
+
+   /// if ECF_FILES specified use this before ECF_HOME
+   if (task_->findParentUserVariableValue( Str::ECF_FILES(),ecf_files_)) {
+      // Create any missing directories if ECF_FILES is specified
+      try {  fs::create_directories(ecf_files_); }
+      catch ( std::exception& e) {
+         std::stringstream ss;
+         ss << "TaskScriptGenerator: Could not create directories for ECF_FILES " << ecf_files_ << " " << e.what();
+         throw std::runtime_error(ss.str());
+      }
+   }
+
+   /// Find ECF_HOME and ECF_INCLUDE
+   if (!task_->findParentUserVariableValue( Str::ECF_HOME(),ecf_home_)) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator: Could not generate scripts for task " << task_->absNodePath() << " no ECF_HOME specified\n";
+      throw std::runtime_error(ss.str());
+   }
+   if (!task_->findParentUserVariableValue( Str::ECF_INCLUDE(),ecf_include_)) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator: Could not generate scripts for task " << task_->absNodePath() << " no ECF_INCLUDE specified\n";
+      throw std::runtime_error(ss.str());
+   }
+
+   // Create any missing directories,
+   try {  fs::create_directories(ecf_home_); }
+   catch ( std::exception& e) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator: Could not create directories for ECF_HOME " << ecf_home_ << " " << e.what();
+      throw std::runtime_error(ss.str());
+   }
+
+   try {  fs::create_directories(ecf_include_); }
+   catch ( std::exception& e) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator: Could not create directories for ECF_INCLUDE " << ecf_include_ << " " << e.what();
+      throw std::runtime_error(ss.str());
+   }
+}
+
+void TaskScriptGenerator::generate(const std::map<std::string,std::string>& override)
+{
+   // Ignore generation for dummy tasks
+   if (is_dummy_task_) return;
+
+   // If ECF_FILES was specified use that in preference to ECF_HOME for the ecf files.
+   std::string root_directory_for_ecf_files;
+   if (!ecf_files_.empty()) root_directory_for_ecf_files = ecf_files_;
+   else                     root_directory_for_ecf_files = ecf_home_;
+
+   // Note: task_->absNodePath() starts with /.
+   std::string ecf_file_path = root_directory_for_ecf_files + task_->absNodePath() + task_->script_extension();
+   if (fs::exists(ecf_file_path)) {
+      std::cout << "Can not generate. Script file " << ecf_file_path << " already exists\n";
+      return;
+   }
+
+   if (!File::createMissingDirectories(ecf_file_path)) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator::generate: Could not create missing directories '" << ecf_file_path << "' for task " <<  task_->absNodePath();
+      throw std::runtime_error(ss.str());
+   }
+
+   // Create file head.h and tail.h in directory ECF_INCLUDE, check to see if they exist first
+   // If the variable ECF_CLIENT_EXE_PATH is specified use it
+   generate_head_file();
+   generate_tail_file();
+
+
+   // Create ECF file with default template or custom  file.
+   //cout << "creating ecf file  " << ecf_file_path << "\n";
+   std::string contents;
+   std::map<std::string,std::string>::const_iterator it = override.find(task_->absNodePath());
+   if (it == override.end()) {
+      contents = getDefaultTemplateEcfFile();
+   }
+   else {
+      contents =  (*it).second;
+   }
+
+   std::string errorMsg;
+   if (!File::create(ecf_file_path,contents,errorMsg)) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator::generate: Could not create '.ecf' script for task " <<  task_->absNodePath() << " " << errorMsg;
+      throw std::runtime_error(ss.str());
+   }
+   std::cout << "Generated script file " << ecf_file_path << "\n";
+}
+
+std::string TaskScriptGenerator::getDefaultTemplateEcfFile() const
+{
+   std::string content;
+
+   std::string sleep,var_sleep;
+   if (task_->findParentUserVariableValue("SLEEP",var_sleep)) sleep = "sleep %SLEEP%\n";
+   else sleep = "sleep 1\n";
+
+   std::string client_exe = "%ECF_CLIENT_EXE_PATH:";
+   client_exe += Ecf::CLIENT_NAME();
+   client_exe += "% ";
+
+   content += "%include <head.h>\n";
+   content += "%manual\n";
+   content += "This is the default **generated** ecf script file\n";
+   content += "If the task has events, meters or labels then the associated client\n";
+   content += "to server commands are automatically generated.\n";
+   content += "Will default to sleep for one second in between calls to the events, meters & labels,\n";
+   content += "this can be overridden by adding a variable SLEEP\n";
+   content += "%end\n";
+   content += "\n";
+   content += "%comment\n";
+   content += "#============================================================\n";
+   content += "# Using angle brackets means we look in directory ECF_INCLUDE\n";
+   content += "# and then ECF_HOME\n";
+   content += "#============================================================\n";
+   content += "%end\n";
+   content += "\n";
+   content += "echo do some work\n";
+   BOOST_FOREACH(const Event& e, task_->events()) {
+      content += client_exe + "--event=" + e.name_or_number() + "\n";
+      content += sleep;
+   }
+
+   content += "\n";
+   BOOST_FOREACH(const Meter& m, task_->meters()) {
+      content += "for i in";
+      for(int i = m.min(); i <= m.max(); i = i + 1) {
+         content += " ";
+         content += boost::lexical_cast<std::string>(i);
+      }
+      content += "\n";
+      content += "do\n";
+      content += "   " + client_exe + "--meter=" + m.name() + " $i\n";
+      content += "   " + sleep;
+      content += "done\n";
+   }
+   content += "\n";
+
+   /// labels require at least 2 arguments,
+   BOOST_FOREACH(const Label& label, task_->labels()) {
+
+      if (!label.new_value().empty()) {
+         content += client_exe + "--label=" + label.name() + " " + label.new_value() + "\n";
+      }
+      else if (!label.value().empty()) {
+         content += client_exe +  "--label=" + label.name() + " " + label.value() + "\n";
+      }
+      content += sleep;
+   }
+
+   content += "\n";
+   if (task_->events().empty() && task_->meters().empty()) {
+       content += sleep;
+   }
+   content += "\necho end of job\n";
+   content += "\n%include <tail.h>\n";
+   return content;
+}
+
+void TaskScriptGenerator::generate_head_file() const
+{
+   std::string path = ecf_include_ + "/head.h";
+   if (fs::exists(path)) return;
+
+   std::string client_exe = "%ECF_CLIENT_EXE_PATH:";
+   client_exe += Ecf::CLIENT_NAME();
+   client_exe += "% ";
+
+   std::string contents;
+   contents += "#!/bin/ksh\n";
+   contents += "set -e # stop the shell on first error\n";
+   contents += "set -u # fail when using an undefined variable\n";
+   contents += "set -x # echo script lines as they are executed\n";
+   contents += "\n";
+   contents += "# Defines the variables that are needed for any communication with ECF\n";
+   contents += "export ECF_PORT=%ECF_PORT%    # The server port number\n";
+   contents += "export ECF_NODE=%ECF_NODE%    # The name of ecf host that issued this task\n";
+   contents += "export ECF_NAME=%ECF_NAME%    # The name of this current task\n";
+   contents += "export ECF_PASS=%ECF_PASS%    # A unique password\n";
+   contents += "export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task\n";
+   contents += "export ECF_RID=$$\n";
+   contents += "\n";
+   contents += "# Tell ecFlow we have started\n";
+   contents += client_exe + "--init=$$\n";
+   contents += "\n";
+   contents += "# Defined a error handler\n";
+   contents += "ERROR() {\n";
+   contents += "   set +e                      # Clear -e flag, so we don't fail\n";
+   contents += "   " + client_exe + "--abort=trap   # Notify ecFlow that something went wrong, using 'trap' as the reason\n";
+   contents += "   trap 0                      # Remove the trap\n";
+   contents += "   exit 0                      # End the script\n";
+   contents += "}\n";
+   contents += "\n";
+   contents += "# Trap any calls to exit and errors caught by the -e flag\n";
+   contents += "trap ERROR 0\n";
+   contents += "\n";
+   contents += "# Trap any signal that may cause the script to fail\n";
+   contents += "trap '{ echo \"Killed by a signal\"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15\n";
+
+   std::string errorMsg;
+   if (!File::create(path,contents,errorMsg)) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator::generate_tail_file: Could not create head.h " <<  path << " " << errorMsg;
+      throw std::runtime_error(ss.str());
+   }
+}
+
+void TaskScriptGenerator::generate_tail_file() const
+{
+   std::string path = ecf_include_ + "/tail.h";
+   if (fs::exists(path)) return;
+
+   std::string contents = "%ECF_CLIENT_EXE_PATH:";
+   contents += Ecf::CLIENT_NAME();
+   contents +="% --complete    # Notify ecFlow of a normal end\n";
+
+   contents += "trap 0                 # Remove all traps\n";
+   contents += "exit 0                 # End the shell\n";
+
+   std::string errorMsg;
+   if (!File::create(path,contents,errorMsg)) {
+      std::stringstream ss;
+      ss << "TaskScriptGenerator::generate_tail_file: Could not create tail.h " <<  path << " " << errorMsg;
+      throw std::runtime_error(ss.str());
+   }
+}
+}
diff --git a/ecflow_4_0_7/ANode/src/TaskScriptGenerator.hpp b/ecflow_4_0_7/ANode/src/TaskScriptGenerator.hpp
new file mode 100644
index 0000000..a37f4f5
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/TaskScriptGenerator.hpp
@@ -0,0 +1,46 @@
+#ifndef TASKSCRIPTGENERATOR_HPP_
+#define TASKSCRIPTGENERATOR_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <map>
+#include <boost/noncopyable.hpp>
+class Task;
+
+namespace ecf {
+
+class TaskScriptGenerator : private boost::noncopyable {
+public:
+   TaskScriptGenerator(const Task*);
+
+   void generate(const std::map<std::string,std::string>& override);
+
+private:
+   void generate_head_file() const;
+   void generate_tail_file() const;
+   std::string getDefaultTemplateEcfFile() const;
+
+private:
+   const Task* task_;
+   bool is_dummy_task_;
+   std::string ecf_files_;
+   std::string ecf_home_;
+   std::string ecf_include_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/ANode/src/TimeDepAttrs.cpp b/ecflow_4_0_7/ANode/src/TimeDepAttrs.cpp
new file mode 100644
index 0000000..712b598
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/TimeDepAttrs.cpp
@@ -0,0 +1,872 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #281 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <assert.h>
+#include <boost/foreach.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+
+#include "TimeDepAttrs.hpp"
+#include "Str.hpp"
+#include "Log.hpp"
+#include "Ecf.hpp"
+#include "Memento.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+///////////////////////////////////////////////////////////////////////////////////////////
+
+void TimeDepAttrs::begin()
+{
+   // Let time base attributes use, relative duration if applicable
+   // reset requires calendar, to update next time slot, which is used in why command
+   const Calendar& calendar = node_->suite()->calendar();
+   for(size_t i = 0; i < todayVec_.size(); i++)  { todayVec_[i].reset(calendar);}
+   for(size_t i = 0; i < timeVec_.size(); i++)   {  timeVec_[i].reset(calendar);}
+   for(size_t i = 0; i < crons_.size(); i++)     {    crons_[i].reset(calendar);}
+
+   for(size_t i = 0; i < days_.size(); i++)      {  days_[i].clearFree(); }
+   for(size_t i = 0; i < dates_.size(); i++)     { dates_[i].clearFree(); }
+}
+
+void TimeDepAttrs::requeue(bool reset_next_time_slot) {
+
+   /// If a job takes longer than it slots, then that slot is missed, and next slot is used
+   /// Note we do *NOT* reset for requeue as we want to advance to the next time slot
+   /// *NOTE* Update calendar will *free* time dependencies *even* time series. They rely
+   /// on this function to clear the time dependencies so they *HOLD* the task.
+   const Calendar& calendar = node_->suite()->calendar();
+   for(size_t i = 0; i < todayVec_.size(); i++)  { todayVec_[i].requeue(calendar,reset_next_time_slot);}
+   for(size_t i = 0; i < timeVec_.size(); i++)   {  timeVec_[i].requeue(calendar,reset_next_time_slot);}
+   for(size_t i = 0; i < crons_.size(); i++)     {    crons_[i].requeue(calendar,reset_next_time_slot);}
+
+   for(size_t i = 0; i < days_.size(); i++)      {  days_[i].clearFree(); }
+   for(size_t i = 0; i < dates_.size(); i++)     { dates_[i].clearFree(); }
+}
+
+void TimeDepAttrs::calendarChanged(const ecf::Calendar& c )
+{
+   // For time/today/cron attributes if the time is free, it *remains* free until re-queued
+   // However if we have day/date dependencies, that do NOT match, then we should *NOT* free
+   // any time/today/cron attributes.
+   //
+   //   task t
+   //     day Monday
+   //     time 10:00
+   //
+   // Hence if we are on Sunday we do *NOT* want to free the time on SUNDAY
+   // (Otherwise we will end up running the task at Monday Midnight
+   //  and not Monday at 10.00)
+   //
+   bool have_day = false;
+   bool at_least_one_day_free = false;
+   for(size_t i = 0; i < days_.size(); i++){
+      have_day = true;
+      days_[i].calendarChanged(c);
+      if (!at_least_one_day_free) at_least_one_day_free = days_[i].isFree(c);
+   }
+
+   bool have_date = false;
+   bool at_least_one_date_free = false;
+   for(size_t i = 0; i < dates_.size(); i++) {
+      have_date = true;
+      dates_[i].calendarChanged(c);
+      if (!at_least_one_date_free) at_least_one_date_free = dates_[i].isFree(c);
+   }
+
+   if (have_day || have_date ) {
+      if ( at_least_one_day_free || at_least_one_date_free)  {
+         for(size_t i = 0; i < crons_.size(); i++)    {    crons_[i].calendarChanged(c); }
+         for(size_t i = 0; i < todayVec_.size(); i++) { todayVec_[i].calendarChanged(c); }
+         for(size_t i = 0; i < timeVec_.size(); i++)  {  timeVec_[i].calendarChanged(c); }
+      }
+   }
+   else {
+      // No Day or Date, If time matches  calendarChanged(c) will free time dependencies
+      for(size_t i = 0; i < crons_.size(); i++)    {    crons_[i].calendarChanged(c); }
+      for(size_t i = 0; i < todayVec_.size(); i++) { todayVec_[i].calendarChanged(c); }
+      for(size_t i = 0; i < timeVec_.size(); i++)  {  timeVec_[i].calendarChanged(c); }
+   }
+}
+
+void TimeDepAttrs::markHybridTimeDependentsAsComplete()
+{
+   // If hybrid clock and then we may have day/date/cron time dependencies
+   // which mean that node will be stuck in the QUEUED state, i.e since the
+   // date/day does not change with the hybrid clock.
+   // hence Mark these Nodes as complete
+   const Calendar& calendar = node_->suite()->calendar();
+   if (node_->state() != NState::COMPLETE && calendar.hybrid()) {
+      if ( !dates_.empty() || !days_.empty() || !crons_.empty()) {
+
+         int noOfTimeDependencies = 0;
+         if (!dates_.empty())    noOfTimeDependencies++;
+         if (!days_.empty())     noOfTimeDependencies++;
+         if (!crons_.empty())    noOfTimeDependencies++;
+
+         bool oneDateIsFree = false;
+         bool oneDayIsFree = false;
+         bool oneCronIsFree = false;
+
+         for(size_t i=0;i<dates_.size();i++) { if (dates_[i].validForHybrid(calendar)) { if (noOfTimeDependencies == 1) { node_->setStateOnly(NState::QUEUED); return;}oneDateIsFree = true;break;}}
+         for(size_t i=0;i<days_.size();i++)  { if (days_[i].validForHybrid(calendar))  { if (noOfTimeDependencies == 1) { node_->setStateOnly(NState::QUEUED); return;}oneDayIsFree = true;break;}}
+         for(size_t i=0;i<crons_.size();i++) { if (crons_[i].validForHybrid(calendar)) { if (noOfTimeDependencies == 1) { node_->setStateOnly(NState::QUEUED); return;}oneCronIsFree = true;break;}}
+
+         if ( oneDateIsFree || oneDayIsFree ||  oneCronIsFree) {
+            if ( noOfTimeDependencies > 1 ) {
+               // when we have multiple time dependencies they results *MUST* be anded for the node to be free.
+               if (!dates_.empty() && !oneDateIsFree) { node_->setStateOnly(NState::COMPLETE); return;}
+               if (!days_.empty()  && !oneDayIsFree)  { node_->setStateOnly(NState::COMPLETE); return;}
+               if (!crons_.empty() && !oneCronIsFree) { node_->setStateOnly(NState::COMPLETE); return;}
+
+               // We will only get here, if we have a multiple time dependencies any there is one free in each category
+               node_->setStateOnly(NState::QUEUED);
+               return;
+            }
+         }
+
+         node_->setStateOnly(NState::COMPLETE);
+      }
+   }
+}
+
+void TimeDepAttrs::resetRelativeDuration()
+{
+   for(size_t i = 0; i < crons_.size();    i++)  {   crons_[i].resetRelativeDuration(); }
+   for(size_t i = 0; i < todayVec_.size(); i++)  { todayVec_[i].resetRelativeDuration();}
+   for(size_t i = 0; i < timeVec_.size();  i++)  {  timeVec_[i].resetRelativeDuration(); }
+}
+
+// #define DEBUG_REQUEUE 1
+bool TimeDepAttrs::testTimeDependenciesForRequeue() const
+{
+   // Check for re-queue required for all time related attributes
+   const Calendar& calendar = node_->suite()->calendar();
+
+#ifdef DEBUG_REQUEUE
+   LogToCout logtocout;
+   LOG(Log::DBG,"TimeDepAttrs::testTimeDependenciesForRequeue() " << node_->debugNodePath() << " calendar " << calendar.toString());
+#endif
+
+
+   // When we have a mixture of cron *with* other time based attributes
+   // The cron *takes* priority.  Crons should always return true, for checkForRequeue
+   BOOST_FOREACH(const CronAttr& cron, crons_ ) {
+      if (cron.checkForRequeue(calendar)) {  // will always return true
+#ifdef DEBUG_REQUEUE
+         LOG(Log::DBG,"   TimeDepAttrs::testTimeDependenciesForRequeue() " << node_->debugNodePath() << " for cron");
+#endif
+         return true;
+      }
+   }
+
+
+   if (!timeVec_.empty()) {
+      TimeSlot the_min,the_max; // Needs to handle multiple single slot time attributes
+      BOOST_FOREACH(const ecf::TimeAttr& time, timeVec_) { time.min_max_time_slots(the_min,the_max);}
+      BOOST_FOREACH(const ecf::TimeAttr& time, timeVec_) {
+         if (time.checkForRequeue(calendar,the_min,the_max)) {
+#ifdef DEBUG_REQUEUE
+            LOG(Log::DBG,"   TimeDepAttrs::testTimeDependenciesForRequeue() " << node_->debugNodePath() << " for time " << time.toString());
+#endif
+            return true;
+         }
+      }
+   }
+
+
+   if (!todayVec_.empty()) {
+      TimeSlot the_min,the_max; // Needs to handle multiple single slot today attributes
+      BOOST_FOREACH(const ecf::TodayAttr& today,todayVec_)  { today.min_max_time_slots(the_min,the_max);}
+      BOOST_FOREACH(const ecf::TodayAttr& today,todayVec_) {
+         if (today.checkForRequeue(calendar,the_min,the_max)) {
+#ifdef DEBUG_REQUEUE
+            LOG(Log::DBG,"   TimeDepAttrs::testTimeDependenciesForRequeue() " << node_->debugNodePath() << " for today " << today.toString());
+#endif
+            return true;;
+         }
+      }
+   }
+
+
+   // **********************************************************************
+   // If we get here there are **NO** time/today/cron dependencies which are free
+   // We now need to determine if this node has a future time dependency which
+   // should re-queue this node
+   // *********************************************************************
+   BOOST_FOREACH(const DateAttr& date, dates_ ) {
+      if (date.checkForRequeue(calendar)) {
+#ifdef DEBUG_REQUEUE
+         LOG(Log::DBG,"   TimeDepAttrs::testTimeDependenciesForRequeue() " << node_->debugNodePath() << " for date " << date.toString());
+#endif
+         return true;
+      }
+   }
+
+   BOOST_FOREACH(const DayAttr& day, days_ ) {
+      if (day.checkForRequeue(calendar)) {
+#ifdef DEBUG_REQUEUE
+         LOG(Log::DBG,"   TimeDepAttrs::testTimeDependenciesForRequeue() " << node_->debugNodePath() << " for day " << day.toString());
+#endif
+         return true;
+      }
+   }
+
+#ifdef DEBUG_REQUEUE
+   LOG(Log::DBG,"   TimeDepAttrs::testTimeDependenciesForRequeue() " << node_->debugNodePath() << " HOLDING ");
+#endif
+   return false;
+}
+
+
+void TimeDepAttrs::miss_next_time_slot()
+{
+   // Note: when we have multiple time dependencies.
+   // We need find valid next time dependency:
+   //   time 10:00
+   //   time 11:00
+   //   time 12:00 14:00 00:30
+   // Also we could have a mix:
+   //   time  10:00
+   //   today 10:30
+   //   time 11:00
+   //   time 12:00 14:00 00:30
+
+   // for the moment assume, they have been added sequentially,
+   // hence only first non expired time is updated to miss next time slot
+   for(size_t i=0;i<timeVec_.size();i++) {
+      if (timeVec_[i].time_series().is_valid()) {
+         timeVec_[i].miss_next_time_slot();
+         break;
+      }
+   }
+   for(size_t i=0;i<todayVec_.size();i++){
+      if (todayVec_[i].time_series().is_valid()) {
+         todayVec_[i].miss_next_time_slot();
+         break;
+      }
+   }
+   for(size_t i=0;i<crons_.size();i++) {
+      if (crons_[i].time_series().is_valid()) {
+         crons_[i].miss_next_time_slot();
+         break;
+      }
+   }
+}
+
+
+void TimeDepAttrs::freeHoldingDateDependencies()
+{
+   // Multiple time dependencies of the same type are *ORed*
+   // Multiple time dependencies of different types are *ANDed*
+   //
+   // Hence since we have multiple time dependencies of the same
+   // type here, we need free only one of them
+   const Calendar& calendar = node_->suite()->calendar();
+   for(size_t i=0;i<dates_.size();i++)    {
+      if (!dates_[i].isFree(calendar))  {
+         dates_[i].setFree();
+         break;
+      }
+   }
+}
+
+void TimeDepAttrs::freeHoldingTimeDependencies()
+{
+   // Multiple time dependencies of the same type are *ORed*
+   // Multiple time dependencies of different types are *ANDed*
+   //
+   // If we have multiple time dependencies of different types
+   // we need only free one in each category
+   const Calendar& calendar = node_->suite()->calendar();
+   for(size_t i=0;i<timeVec_.size();i++)  {
+      if (!timeVec_[i].isFree(calendar))  {
+         timeVec_[i].setFree();
+         timeVec_[i].miss_next_time_slot();
+         break;
+      }
+   }
+   for(size_t i=0;i<todayVec_.size();i++)  {
+      if (!todayVec_[i].isFree(calendar)) {
+         todayVec_[i].setFree();
+         todayVec_[i].miss_next_time_slot();
+         break;
+      }
+   }
+   for(size_t i=0;i<days_.size();i++)  {
+      if (!days_[i].isFree(calendar)) {
+         days_[i].setFree();
+         break;
+      }
+   }
+   for(size_t i=0;i<crons_.size();i++)  {
+      if (!crons_[i].isFree(calendar))  {
+         crons_[i].setFree();
+         crons_[i].miss_next_time_slot();
+         break;
+      }
+   }
+}
+
+
+bool TimeDepAttrs::timeDependenciesFree() const
+{
+   if (!timeVec_.empty() || !todayVec_.empty() || !dates_.empty() || !days_.empty() || !crons_.empty()) {
+
+      int noOfTimeDependencies = 0;
+      if (!timeVec_.empty())  noOfTimeDependencies++;
+      if (!todayVec_.empty()) noOfTimeDependencies++;
+      if (!dates_.empty())    noOfTimeDependencies++;
+      if (!days_.empty())     noOfTimeDependencies++;
+      if (!crons_.empty())    noOfTimeDependencies++;
+
+      bool oneDateIsFree = false;
+      bool oneDayIsFree = false;
+      bool oneTodayIsFree = false;
+      bool oneTimeIsFree = false;
+      bool oneCronIsFree = false;
+
+      const Calendar& calendar = node_->suite()->calendar();
+      for(size_t i=0;i<timeVec_.size();i++)  { if (timeVec_[i].isFree(calendar))  {if ( noOfTimeDependencies == 1) return true;oneTimeIsFree = true;break;}}
+      for(size_t i=0;i<crons_.size();i++)    { if (crons_[i].isFree(calendar))    {if ( noOfTimeDependencies == 1) return true;oneCronIsFree = true;break;}}
+      for(size_t i=0;i<dates_.size();i++)    { if (dates_[i].isFree(calendar))    {if ( noOfTimeDependencies == 1) return true;oneDateIsFree = true;break;}}
+      for(size_t i=0;i<days_.size();i++)     { if (days_[i].isFree(calendar))     {if ( noOfTimeDependencies == 1) return true;oneDayIsFree = true;break;}}
+
+      if (!todayVec_.empty()) {
+         // : single Today: (single-time)   is free, if calendar time >= today_time
+         // : single Today: (range)         is free, if calendar time == (one of the time ranges)
+         // : multi Today : (single | range)is free, if calendar time == (one of the time ranges | tody_time)
+         if (todayVec_.size() == 1 ) {
+            // Single Today Attribute: could be single slot or range
+            if (todayVec_[0].isFree(calendar)) { if ( noOfTimeDependencies == 1) return true;oneTodayIsFree = true;}
+         }
+         else {
+            // Multiple Today Attributes, each could single, or range
+            for(size_t i=0;i<todayVec_.size();i++) {
+               if (todayVec_[i].isFreeMultipleContext(calendar)) {if ( noOfTimeDependencies == 1) return true;oneTodayIsFree = true;break;}
+            }
+         }
+      }
+
+
+      if ( oneDateIsFree || oneDayIsFree || oneTodayIsFree ||  oneTimeIsFree || oneCronIsFree) {
+         if ( noOfTimeDependencies > 1 ) {
+            // *When* we have multiple time dependencies of *different types* then the results
+            // *MUST* be anded for the node to be free.
+            if (!dates_.empty() && !oneDateIsFree) return false;
+            if (!days_.empty() && !oneDayIsFree) return false;
+            if (!todayVec_.empty() && !oneTodayIsFree) return false;
+            if (!timeVec_.empty() && !oneTimeIsFree) return false;
+            if (!crons_.empty() && !oneCronIsFree) return false;
+
+            // We will only get here, if we have a multiple time dependencies and they are free
+            return true;
+         }
+      }
+   }
+
+   return false;
+}
+
+bool TimeDepAttrs::time_today_cron_is_free() const
+{
+   if (!timeVec_.empty() || !todayVec_.empty() || !crons_.empty()) {
+
+      int noOfTimeDependencies = 0;
+      if (!timeVec_.empty())  noOfTimeDependencies++;
+      if (!todayVec_.empty()) noOfTimeDependencies++;
+      if (!crons_.empty())    noOfTimeDependencies++;
+
+      bool oneTodayIsFree = false;
+      bool oneTimeIsFree = false;
+      bool oneCronIsFree = false;
+
+      const Calendar& calendar = node_->suite()->calendar();
+      for(size_t i=0;i<timeVec_.size();i++)  { if (timeVec_[i].isFree(calendar))  {if ( noOfTimeDependencies == 1) return true;oneTimeIsFree = true;break;}}
+      for(size_t i=0;i<crons_.size();i++)    { if (crons_[i].isFree(calendar))    {if ( noOfTimeDependencies == 1) return true;oneCronIsFree = true;break;}}
+
+      if (!todayVec_.empty()) {
+         // : single Today: (single-time)   is free, if calendar time >= today_time
+         // : single Today: (range)         is free, if calendar time == (one of the time ranges)
+         // : multi Today : (single | range)is free, if calendar time == (one of the time ranges | tody_time)
+         if (todayVec_.size() == 1 ) {
+            // Single Today Attribute: could be single slot or range
+            if (todayVec_[0].isFree(calendar)) { if ( noOfTimeDependencies == 1) return true;oneTodayIsFree = true;}
+         }
+         else {
+            // Multiple Today Attributes, each could single, or range
+            for(size_t i=0;i<todayVec_.size();i++) {
+               if (todayVec_[i].isFreeMultipleContext(calendar)) {if ( noOfTimeDependencies == 1) return true;oneTodayIsFree = true;break;}
+            }
+         }
+      }
+
+
+      if ( oneTodayIsFree ||  oneTimeIsFree || oneCronIsFree) {
+         if ( noOfTimeDependencies > 1 ) {
+            // *When* we have multiple time dependencies of *different types* then the results
+            // *MUST* be anded for the node to be free.
+            if (!todayVec_.empty() && !oneTodayIsFree) return false;
+            if (!timeVec_.empty() && !oneTimeIsFree) return false;
+            if (!crons_.empty() && !oneCronIsFree) return false;
+
+            // We will only get here, if we have a multiple time dependencies and they are free
+            return true;
+         }
+      }
+   }
+
+   return false;
+}
+
+std::ostream& TimeDepAttrs::print(std::ostream& os) const
+{
+   BOOST_FOREACH(const ecf::TimeAttr& t, timeVec_)  { t.print(os);    }
+   BOOST_FOREACH(const ecf::TodayAttr& t,todayVec_) { t.print(os);    }
+   BOOST_FOREACH(const DateAttr& date, dates_)      { date.print(os); }
+   BOOST_FOREACH(const DayAttr& day, days_)         { day.print(os);  }
+   BOOST_FOREACH(const CronAttr& cron, crons_)      { cron.print(os); }
+   return os;
+}
+
+bool TimeDepAttrs::operator==(const TimeDepAttrs& rhs) const
+{
+   if (timeVec_.size() != rhs.timeVec_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeDepAttrs::operator==  (timeVec_.size() != rhs.timeVec_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < timeVec_.size(); ++i) {
+      if (!(timeVec_[i] == rhs.timeVec_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "TimeDepAttrs::operator==  (!(timeVec_[i] == rhs.timeVec_[i] ))  " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   if (todayVec_.size() != rhs.todayVec_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeDepAttrs::operator==  (todayVec_.size() != rhs.todayVec_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < todayVec_.size(); ++i) {
+      if (!(todayVec_[i] == rhs.todayVec_[i] )) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "TimeDepAttrs::operator==  (!(todayVec_[i] == rhs.todayVec_[i] ))  " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   if (dates_.size() != rhs.dates_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeDepAttrs::operator==   (dates_.size() != rhs.dates_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < dates_.size(); ++i) {
+      if (!(dates_[i] == rhs.dates_[i]) ) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "TimeDepAttrs::operator==   (!(dates_[i] == rhs.dates_[i]) " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   if (days_.size() != rhs.days_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeDepAttrs::operator==   (days_.size() != rhs.days_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < days_.size(); ++i) {
+      if (!(days_[i] == rhs.days_[i]) ) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "TimeDepAttrs::operator==   (!(days_[i] == rhs.days_[i]) " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   if (crons_.size() != rhs.crons_.size()) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "TimeDepAttrs::operator==   (crons_.size() != rhs.crons_.size()) " << node_->debugNodePath() << "\n";
+      }
+#endif
+      return false;
+   }
+   for(unsigned i = 0; i < crons_.size(); ++i) {
+      if (!(crons_[i] == rhs.crons_[i]) ) {
+#ifdef DEBUG
+         if (Ecf::debug_equality()) {
+            std::cout << "TimeDepAttrs::operator==   (!(crons_[i] == rhs.crons_[i]) " << node_->debugNodePath() << "\n";
+         }
+#endif
+         return false;
+      }
+   }
+
+   return true;
+}
+
+
+//#define DEBUG_WHY 1
+void TimeDepAttrs::why(std::vector<std::string>& vec,const std::string& prefix) const
+{
+#ifdef DEBUG_WHY
+   std::cout << "   TimeDepAttrs::why " << node_->debugNodePath() << " checking time dependencies\n";
+#endif
+   // postfix  = <attr-type dependent> <next run time > < optional current state>
+   std::string postFix;
+   const Calendar& c = node_->suite()->calendar();
+   for(size_t i = 0; i < days_.size(); i++)    { postFix.clear(); if (days_[i].why(c,postFix))   { vec.push_back(prefix + postFix); }}
+   for(size_t i = 0; i < dates_.size(); i++)   { postFix.clear(); if (dates_[i].why(c,postFix))  { vec.push_back(prefix + postFix); }}
+   for(size_t i = 0; i < todayVec_.size(); i++){ postFix.clear(); if (todayVec_[i].why(c,postFix)){ vec.push_back(prefix + postFix); }}
+   for(size_t i = 0; i < timeVec_.size(); i++) { postFix.clear(); if (timeVec_[i].why(c,postFix)) { vec.push_back(prefix + postFix); }}
+   for(size_t i = 0; i < crons_.size(); i++)   { postFix.clear(); if (crons_[i].why(c,postFix))  { vec.push_back(prefix + postFix); }}
+
+}
+
+bool TimeDepAttrs::checkInvariants(std::string& errorMsg) const
+{
+   if (node_ == NULL) {
+      errorMsg +="TimeDepAttrs::checkInvariants node_ not set";
+      return false;
+   }
+   BOOST_FOREACH(const ecf::TimeAttr& t, timeVec_)  { if (!t.checkInvariants(errorMsg)) return false; }
+   BOOST_FOREACH(const ecf::TodayAttr& t,todayVec_) { if (!t.checkInvariants(errorMsg)) return false; }
+   BOOST_FOREACH(const CronAttr& cron, crons_ )     { if (!cron.checkInvariants(errorMsg)) return false; }
+   return true;
+}
+
+
+void TimeDepAttrs::clear()
+{
+   timeVec_.clear();
+   todayVec_.clear();
+   dates_.clear();
+   days_.clear();
+   crons_.clear();
+}
+
+
+void TimeDepAttrs::addTime(const ecf::TimeAttr& t)
+{
+   timeVec_.push_back(t);
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void TimeDepAttrs::addToday(const ecf::TodayAttr& t)
+{
+   todayVec_.push_back(t);
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void TimeDepAttrs::addDate( const DateAttr& d)
+{
+   dates_.push_back( d );
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void TimeDepAttrs::addDay( const DayAttr& d)
+{
+   days_.push_back( d );
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+void TimeDepAttrs::addCron( const CronAttr& d)
+{
+   if (d.time().isNULL()) {
+      throw std::runtime_error("TimeDepAttrs::addCron: The cron is in-complete, no time specified");
+   }
+   if (d.time().hasIncrement() && !node_->repeat_.empty()) {
+      std::stringstream ss;
+      ss << "TimeDepAttrs::addCron: Node " << node_->absNodePath() << " already has a repeat. Inappropriate to add two looping structures at the same level\n";
+      throw std::runtime_error(ss.str());
+   }
+   crons_.push_back( d );
+   node_->state_change_no_ = Ecf::incr_state_change_no();
+}
+
+
+void TimeDepAttrs::deleteTime(const std::string& name )
+{
+   if (name.empty()) {
+      timeVec_.clear();  // delete all
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "TimeDepAttrs::deleteTime\n";
+#endif
+      return;
+   }
+   TimeAttr attr( TimeSeries::create(name) ); // can throw if parse fails
+   delete_time(attr);                         // can throw if search fails
+}
+void TimeDepAttrs::delete_time( const ecf::TimeAttr& attr )
+{
+   size_t theSize = timeVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      // Dont use '==' since that compares additional state like makeFree_
+      if (timeVec_[i].structureEquals(attr)) {
+         timeVec_.erase( timeVec_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "TimeDepAttrs::delete_time\n";
+#endif
+         return;
+      }
+   }
+   throw std::runtime_error("TimeDepAttrs::delete_time: Can not find time attribute: ");
+}
+
+
+void TimeDepAttrs::deleteToday(const std::string& name)
+{
+   if (name.empty()) {
+      todayVec_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "TimeDepAttrs::deleteToday\n";
+#endif
+      return;
+   }
+
+   TodayAttr attr( TimeSeries::create(name) ); // can throw if parse fails
+   delete_today(attr);                         // can throw if search fails
+}
+void TimeDepAttrs::delete_today(const ecf::TodayAttr& attr)
+{
+   size_t theSize = todayVec_.size();
+   for(size_t i = 0; i < theSize; i++) {
+      // Dont use '==' since that compares additional state like makeFree_
+      if (todayVec_[i].structureEquals(attr)) {
+         todayVec_.erase( todayVec_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "TimeDepAttrs::delete_today\n";
+#endif
+         return;
+      }
+   }
+   throw std::runtime_error("TimeDepAttrs::delete_today: Can not find today attribute: " + attr.toString());
+}
+
+void TimeDepAttrs::deleteDate(const std::string& name)
+{
+   if (name.empty()) {
+      dates_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "TimeDepAttrs::deleteDate\n";
+#endif
+      return;
+   }
+
+   DateAttr attr( DateAttr::create(name) ); // can throw if parse fails
+   delete_date(attr);                       // can throw if search fails
+}
+void TimeDepAttrs::delete_date(const DateAttr& attr)
+{
+   for(size_t i = 0; i < dates_.size(); i++) {
+      // Dont use '==' since that compares additional state like makeFree_
+      if (attr.structureEquals(dates_[i]) ) {
+         dates_.erase( dates_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "TimeDepAttrs::delete_date\n";
+#endif
+         return;
+      }
+   }
+   throw std::runtime_error("TimeDepAttrs::delete_date: Can not find date attribute: " + attr.toString());
+}
+
+
+void TimeDepAttrs::deleteDay(const std::string& name)
+{
+   if (name.empty()) {
+      days_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "TimeDepAttrs::deleteDay\n";
+#endif
+      return;
+   }
+
+   DayAttr attr( DayAttr::create(name) ); // can throw if parse fails.
+   delete_day(attr);                      // can throw if search fails
+}
+void TimeDepAttrs::delete_day(const DayAttr& attr)
+{
+   for(size_t i = 0; i < days_.size(); i++) {
+      // Dont use '==' since that compares additional state like makeFree_
+      if (attr.structureEquals(days_[i]) ) {
+         days_.erase( days_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "TimeDepAttrs::delete_day\n";
+#endif
+         return;
+      }
+   }
+   throw std::runtime_error("TimeDepAttrs::delete_day: Can not find day attribute: " + attr.toString());
+}
+
+void TimeDepAttrs::deleteCron(const std::string& name)
+{
+   if (name.empty()) {
+      crons_.clear();
+      node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+      std::cout << "TimeDepAttrs::deleteCron\n";
+#endif
+      return;
+   }
+
+   CronAttr attr = CronAttr::create(name); // can throw if parse fails
+   delete_cron(attr);                      // can throw if search fails
+}
+
+void TimeDepAttrs::delete_cron(const ecf::CronAttr& attr)
+{
+   for(size_t i = 0; i < crons_.size(); i++) {
+      // Dont use '==' since that compares additional state like makeFree_
+      if (attr.structureEquals(crons_[i]) ) {
+         crons_.erase( crons_.begin() + i );
+         node_->state_change_no_ = Ecf::incr_state_change_no();
+#ifdef DEBUG_STATE_CHANGE_NO
+         std::cout << "TimeDepAttrs::deleteCron\n";
+#endif
+         return ;
+      }
+   }
+   throw std::runtime_error("TimeDepAttrs::delete_cron: Can not find cron attribute: " + attr.toString());
+}
+
+// =================================================================================
+
+
+bool TimeDepAttrs::set_memento( const NodeTodayMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "TimeDepAttrs::set_memento(const NodeTodayMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   for(size_t i = 0; i < todayVec_.size(); ++i) {
+      // We need to ignore state changes in TodayAttr, (ie we don't use equality operator)
+      // otherwise today will never compare
+      if ( todayVec_[i].structureEquals(memento->attr_) ) {
+         todayVec_[i] = memento->attr_;  // need to copy over time series state
+         return true;
+      }
+   }
+   return false;
+}
+
+bool TimeDepAttrs::set_memento( const NodeTimeMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "TimeDepAttrs::set_memento(const NodeTimeMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   for(size_t i = 0; i < timeVec_.size(); ++i) {
+      // We need to ignore state changes in TimeAttr, (ie we don't use equality operator)
+      // otherwise time will never compare
+      if ( timeVec_[i].structureEquals(memento->attr_) ) {
+         timeVec_[i] = memento->attr_;    // need to copy over time series state
+         return true;
+      }
+   }
+   return false;
+}
+
+bool TimeDepAttrs::set_memento( const NodeCronMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "TimeDepAttrs::set_memento(const NodeCronMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   for(size_t i = 0; i < crons_.size(); ++i) {
+      // We need to ignore state changes (ie we don't use equality operator)
+      // otherwise attributes will never compare
+      if ( crons_[i].structureEquals(memento->attr_) ) {
+         crons_[i] = memento->attr_;   // need to copy over time series state
+         return true;
+      }
+   }
+   return false;
+}
+
+bool TimeDepAttrs::set_memento( const NodeDayMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "TimeDepAttrs::set_memento(const NodeDayMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   for(size_t i = 0; i < days_.size(); ++i) {
+      // We need to ignore state changes (ie we don't use equality operator)
+      // otherwise attributes will never compare
+      if ( days_[i].structureEquals(memento->attr_) ) {
+         if (memento->attr_.isSetFree()) days_[i].setFree();
+         else                            days_[i].clearFree();
+         return true;
+      }
+   }
+   return false;
+}
+
+bool TimeDepAttrs::set_memento( const NodeDateMemento* memento ) {
+
+#ifdef DEBUG_MEMENTO
+   std::cout << "TimeDepAttrs::set_memento(const NodeDateMemento* memento) " << node_->debugNodePath() << "\n";
+#endif
+
+   for(size_t i = 0; i < dates_.size(); ++i) {
+      // We need to ignore state changes (ie we don't use equality operator)
+      // otherwise attributes will never compare
+      if ( dates_[i].structureEquals(memento->attr_) ) {
+         if (memento->attr_.isSetFree()) dates_[i].setFree();
+         else                            dates_[i].clearFree();
+         return true;
+      }
+   }
+   return false;
+}
+
diff --git a/ecflow_4_0_7/ANode/src/TimeDepAttrs.hpp b/ecflow_4_0_7/ANode/src/TimeDepAttrs.hpp
new file mode 100644
index 0000000..674413c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/src/TimeDepAttrs.hpp
@@ -0,0 +1,148 @@
+#ifndef TIME_DEP_ATTRS_HPP_
+#define TIME_DEP_ATTRS_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #231 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <ostream>
+
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/vector.hpp>         // no need to include <vector>
+
+#include "TimeAttr.hpp"
+#include "TodayAttr.hpp"
+#include "DateAttr.hpp"
+#include "DayAttr.hpp"
+#include "CronAttr.hpp"
+#include "NodeFwd.hpp"
+
+class TimeDepAttrs  {
+public:
+   TimeDepAttrs(Node* node) : node_(node) {}
+   TimeDepAttrs() : node_(NULL) {}
+
+   // needed by node serialisation
+   void set_node(Node* n) { node_ = n; }
+
+   void begin();
+
+   /// If a job takes longer than it slots, then that slot is missed, and next slot is used
+   /// Note we do *NOT* reset for requeue as we want to advance the valid time slots.
+   /// *NOTE* Update calendar will *free* time dependencies *even* time series. They rely
+   /// on this function to clear the time dependencies so they *HOLD* the task.
+   ///
+   /// If we have done an interactive run or complete, *dont* increment next_time_slot_
+   void requeue(bool reset_next_time_slot);
+
+   void miss_next_time_slot();
+   void freeHoldingDateDependencies();
+   void freeHoldingTimeDependencies();
+
+   void calendarChanged(const ecf::Calendar& c);
+
+   // standard functions: ==============================================
+   std::ostream& print(std::ostream&) const;
+   bool operator==(const TimeDepAttrs& rhs) const;
+   bool checkInvariants(std::string& errorMsg) const;
+
+   bool timeDependenciesFree() const;
+   bool time_today_cron_is_free() const; /* used by viewer */
+
+   // Access functions: ======================================================
+   const std::vector<ecf::TimeAttr>&   timeVec()  const { return timeVec_; }
+   const std::vector<ecf::TodayAttr>&  todayVec() const { return todayVec_; }
+   const std::vector<DateAttr>&        dates()    const { return dates_; }
+   const std::vector<DayAttr>&         days()     const { return days_; }
+   const std::vector<ecf::CronAttr>&   crons()    const { return crons_; }
+
+   // Add functions: ===============================================================
+   void addTime( const ecf::TimeAttr& );
+   void addToday( const ecf::TodayAttr& );
+   void addDate( const DateAttr& );
+   void addDay( const DayAttr& );
+   void addCron( const ecf::CronAttr& );
+
+   // Delete functions: can throw std::runtime_error ===================================
+   // if name argument is empty, delete all attributes of that type
+   // Can throw std::runtime_error of the attribute can not be found
+   void deleteTime(const std::string& name );
+   void delete_time( const ecf::TimeAttr&  );
+   void deleteToday(const std::string& name);
+   void delete_today(const ecf::TodayAttr&);
+   void deleteDate(const std::string& name);
+   void delete_date(const DateAttr&);
+   void deleteDay(const std::string& name);
+   void delete_day(const DayAttr&);
+   void deleteCron(const std::string& name);
+   void delete_cron(const ecf::CronAttr&);
+
+   // Change functions: ================================================================
+   /// returns true the change was made else false, Can throw std::runtime_error for parse errors
+
+   // mementos functions:
+   /// Collect all the state changes, so that only small subset is returned to client
+   bool set_memento(const NodeTodayMemento* );
+   bool set_memento(const NodeTimeMemento* );
+   bool set_memento(const NodeDayMemento* );
+   bool set_memento(const NodeCronMemento* );
+   bool set_memento(const NodeDateMemento* );
+
+   void why(std::vector<std::string>& theReasonWhy,const std::string& prefix) const;
+   bool testTimeDependenciesForRequeue() const;
+   void resetRelativeDuration();
+
+
+/// For use by python interface,
+   std::vector<ecf::TimeAttr>::const_iterator time_begin() const { return timeVec_.begin();}
+   std::vector<ecf::TimeAttr>::const_iterator time_end() const { return timeVec_.end();}
+   std::vector<ecf::TodayAttr>::const_iterator today_begin() const { return todayVec_.begin();}
+   std::vector<ecf::TodayAttr>::const_iterator today_end() const { return todayVec_.end();}
+   std::vector<DateAttr>::const_iterator date_begin() const { return dates_.begin();}
+   std::vector<DateAttr>::const_iterator date_end() const { return dates_.end();}
+   std::vector<DayAttr>::const_iterator day_begin() const { return days_.begin();}
+   std::vector<DayAttr>::const_iterator day_end() const { return days_.end();}
+   std::vector<ecf::CronAttr>::const_iterator cron_begin() const { return crons_.begin();}
+   std::vector<ecf::CronAttr>::const_iterator cron_end() const { return crons_.end();}
+
+
+   void clear(); /// Clear *ALL* internal attributes
+
+
+   /// Under the hybrid calendar some time dependent attributes may not be applicable
+   /// i.e if day,date,cron attributes does correspond to 24 hours of today, then we
+   /// need make them as complete.
+   void markHybridTimeDependentsAsComplete();
+
+private:
+   Node*        node_; // *NOT* persisted must be set by the parent class
+
+   std::vector<ecf::TimeAttr>  timeVec_;
+   std::vector<ecf::TodayAttr> todayVec_;
+   std::vector<DateAttr>       dates_;
+   std::vector<DayAttr>        days_;
+   std::vector<ecf::CronAttr>  crons_;
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & timeVec_;
+      ar & todayVec_;
+      ar & dates_;
+      ar & days_;
+      ar & crons_;
+   }
+};
+
+#endif
diff --git a/ecflow_4_0_7/ANode/test/MyDefsFixture.hpp b/ecflow_4_0_7/ANode/test/MyDefsFixture.hpp
new file mode 100644
index 0000000..f7bc3b4
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/MyDefsFixture.hpp
@@ -0,0 +1,249 @@
+#ifndef MYDEFSFIXTURE_HPP_
+#define MYDEFSFIXTURE_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Description : The structure ONLY used to test the persistence/migration
+//               as each new object is created we add it here, to test
+//               Serialisation read/write and migration of previous fixtures
+//============================================================================
+#include <boost/lexical_cast.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+#include <algorithm> //for for_each()
+// =======================================================================
+// This struct is used in the node migration tests.
+// If we ever add to this , then update TestMigration.cpp
+// **Ensure** that we keep old fixture.def file, to test that future ecflow
+// versions can migrate old data.
+// =======================================================================
+struct MyDefsFixture {
+
+	MyDefsFixture(const std::string& fileName = "defsfile.txt") : defsfile_()
+	{
+		suite_ptr  suite = create_suite();
+
+ 		// Must be done last
+		defsfile_.addSuite( suite  );
+		defsfile_.add_extern("/limits:event");
+		defsfile_.add_extern("/a/b/c:meter");
+		defsfile_.add_extern("/a/b/c/d");
+
+		// add an empty suite. Needed for CHECK_JOB_GEN_ONLY cmd
+		defsfile_.addSuite( Suite::create("EmptySuite" ) );
+
+		// Check expression parse
+		std::string errorMsg, warningMsg;
+ 		bool result = defsfile_.check(errorMsg,warningMsg);
+ 		if (!result || !errorMsg.empty()) {
+ 			std::cout << errorMsg;
+ 			assert(false);
+ 		}
+	}
+	~MyDefsFixture() {}
+
+	const Defs& fixtureDefsFile() const { return defsfile_; }
+
+	void remove_host_depedent_server_variables()
+	{
+	   // Allow test data to be used on other platforms
+	   defsfile_.set_server().delete_server_variable("ECF_LOG");
+	   defsfile_.set_server().delete_server_variable("ECF_CHECK");
+	   defsfile_.set_server().delete_server_variable("ECF_CHECKOLD");
+	}
+
+
+	defs_ptr create_defs() const {
+
+		defs_ptr defs = Defs::create();
+
+ 		defs->addSuite(  create_suite()   );
+		defs->add_extern("/limits:event");
+		defs->add_extern("/a/b/c:meter");
+		defs->add_extern("/a/b/c/d");
+      defs->set_server().add_or_update_user_variables("MyDefsFixture_user_variable","This is a user variable added to server");
+
+		// add an empty suite. Needed for CHECK_JOB_GEN_ONLY cmd
+		defs->addSuite( Suite::create("EmptySuite" ) );
+
+		// Check expression parse
+		std::string errorMsg, warningMsg;
+ 		bool result = defs->check(errorMsg,warningMsg);
+ 		if (!result || !errorMsg.empty()) {
+ 			std::cout << errorMsg;
+ 			assert(false);
+ 		}
+ 		return defs;
+	}
+
+	Defs defsfile_;
+
+private:
+	suite_ptr create_suite() const {
+		std::string sname = "suiteName";
+		suite_ptr suite = Suite::create(  sname );
+
+      ClockAttr clockAttr(false);
+      clockAttr.date(1,1,2009);
+      clockAttr.set_gain_in_seconds(3600);
+      clockAttr.startStopWithServer(true);
+      suite->addClock( clockAttr );
+
+ 		suite->addAutoCancel( ecf::AutoCancelAttr(2) );
+ 		suite->addVariable( Variable("VAR","value") );
+		suite->addVariable( Variable("VAR1","\"value\"") );
+		suite->addVariable( Variable("ECF_FETCH","\"smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%\"") );
+
+		suite->add_task( "t1" );
+		suite->add_task( "t2" );
+		task_ptr suiteTask = suite->add_task( "t3" );
+		suiteTask->add_part_trigger( PartExpression("t1 == complete") );
+		suiteTask->add_part_trigger( PartExpression("t2 == complete",false) );
+		suiteTask->add_part_complete( PartExpression("t1 == complete") );
+		suiteTask->add_part_complete( PartExpression("t2 == complete",true) );
+
+		std::vector<ecf::Child::CmdType> child_cmds;
+		child_cmds.push_back(ecf::Child::INIT);
+		child_cmds.push_back(ecf::Child::EVENT);
+		child_cmds.push_back(ecf::Child::METER);
+		child_cmds.push_back(ecf::Child::LABEL);
+		child_cmds.push_back(ecf::Child::WAIT);
+		child_cmds.push_back(ecf::Child::ABORT);
+		child_cmds.push_back(ecf::Child::COMPLETE);
+		suiteTask->addZombie( ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10) );
+		suiteTask->addZombie( ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::FAIL,100) );
+		suiteTask->addZombie( ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::BLOCK,100) );
+
+
+		task_ptr suiteTask4 = suite->add_task( "t4" );
+		suiteTask4->addZombie( ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::ADOPT,10) );
+		suiteTask4->addZombie( ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::REMOVE,100) );
+		suiteTask4->addZombie( ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::BLOCK,100) );
+
+
+ 		ecf::CronAttr cronAttr;
+ 		ecf::TimeSlot start( 0, 0 );
+ 		ecf::TimeSlot finish( 10, 0 );
+ 		ecf::TimeSlot incr( 0, 5 );
+ 		std::vector<int> weekdays;   for(int i=0;i<7;++i) weekdays.push_back(i);
+ 		std::vector<int> daysOfMonth;for(int i=1;i<32;++i) daysOfMonth.push_back(i);
+ 		std::vector<int> months;     for(int i=1;i<13;++i) months.push_back(i);
+ 		cronAttr.addTimeSeries(start,finish,incr);
+		cronAttr.addWeekDays( weekdays  );
+		cronAttr.addDaysOfMonth(daysOfMonth);
+		cronAttr.addMonths(  months );
+ 		suite->addCron( cronAttr  );
+
+ 		ecf::LateAttr lateAttr;
+ 		lateAttr.addSubmitted( ecf::TimeSlot(3,12) );
+ 		lateAttr.addActive( ecf::TimeSlot(3,12) );
+ 		lateAttr.addComplete( ecf::TimeSlot(4,12), true);
+
+		std::string suiteLimit = "suiteLimit";
+		suite->addLimit( Limit(suiteLimit,10) );
+
+      std::vector<std::string> stringList; stringList.reserve(3);
+      stringList.push_back("10");
+      stringList.push_back("20");
+      stringList.push_back("30");
+
+      // Add tasks with all the repeat variants
+      task_ptr t5 = suite->add_task( "t5" );
+      t5->addRepeat( RepeatEnumerated("AEnum",stringList));
+
+      task_ptr t6 = suite->add_task( "t6" );
+      t6->addRepeat( RepeatString("aString",stringList));
+
+      task_ptr t7 = suite->add_task( "t7" );
+      t7->addRepeat( RepeatInteger("rep",0,100,1) );
+
+      task_ptr t8 = suite->add_task( "t8" );
+      t8->addRepeat( RepeatDate("YMD",20090916,20090916,1) );
+
+      task_ptr t9 = suite->add_task( "t9" );
+      t9->addRepeat( RepeatDay(2) );
+
+
+ 		for (int i = 0; i < 3; ++i) {
+			std::string fname = "familyName";
+         std::string tname = "taskName";
+			std::string eventName = "eventName";
+			std::string labelName = "labelName";
+			std::string limitName = "limitName";
+			if ( i != 0 ) {
+ 				fname += boost::lexical_cast< std::string >( i );
+				tname += boost::lexical_cast< std::string >( i );
+				labelName += boost::lexical_cast< std::string >( i );
+			}
+
+         family_ptr fam = suite->add_family( fname );
+         fam->addDate( DateAttr(0,0,2009) ); // 0 is equivalent to a *
+         fam->addRepeat( RepeatEnumerated("AEnum",stringList));
+         fam->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(1,0), true));
+         fam->addVariable( Variable("VAR","value") );
+         fam->addTime( ecf::TimeAttr(ecf::TimeSlot(0,0),ecf::TimeSlot(10,1),ecf::TimeSlot(0,1),true) );
+         fam->addLimit( Limit(limitName,20) );
+         fam->addLate( lateAttr );
+
+         task_ptr task = fam->add_task( tname );
+			task->addDate( DateAttr(1,2,2009) );
+			task->addDay( DayAttr(DayAttr::MONDAY) );
+			task->addVariable( Variable("VAR1","\"value\"") );
+			task->addEvent( Event(i) );
+			task->addEvent( Event(i+1, eventName ) );
+			task->addMeter( Meter("myMeter",0,100,100) );
+			task->addLabel( Label(labelName,"\"labelValue\"") );
+ 			task->addTime( ecf::TimeAttr(ecf::TimeSlot(10,10),true) );
+ 			task->addToday( ecf::TodayAttr(ecf::TimeSlot(10,12)) );
+ 			task->addToday( ecf::TodayAttr(ecf::TimeSlot(0,1),ecf::TimeSlot(0,3),ecf::TimeSlot(0,1),true) );
+ 			task->addDefStatus( DState::COMPLETE );
+ 			task->addInLimit( InLimit(suiteLimit,"/" + sname ));
+ 			task->addVerify( VerifyAttr(NState::COMPLETE,3) );
+ 			task->addLate( lateAttr );
+			if (i == 2) {
+				 std::string compExpr = "../familyName" + boost::lexical_cast< std::string >( i-1 );
+				 compExpr += "/taskName" + boost::lexical_cast< std::string >( i-1 );
+				 compExpr += ":myMeter ge 10";
+				 task->add_complete( compExpr );
+
+				 std::string expression = "../familyName" + boost::lexical_cast< std::string >( i-1 );
+				 expression += "/taskName" + boost::lexical_cast< std::string >( i-1 );
+				 expression += " == complete";
+				 task->add_trigger( expression );
+			}
+         task->add_alias_only(); //add alias without creating dir & .usr file
+         task->add_alias_only();
+
+
+			// Add a hierarchical family to the first family
+			if (i == 0) {
+				std::string heirFamily = "heir_" + fname;
+				family_ptr hierFam = fam->add_family( heirFamily );
+				hierFam->addVariable( Variable("VAR1","value") );
+				hierFam->addRepeat( RepeatString("aString",stringList));
+
+				task_ptr task1 = hierFam->add_task( tname );
+				task1->addVariable( Variable("VAR1","value") );
+				task1->addEvent( Event(i) );
+				task1->addEvent( Event(i+1, eventName ) );
+				task1->addMeter( Meter("myMeter",0,100,100) );
+		 		task1->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(0,1), false));
+			}
+ 		}
+ 		return suite;
+	}
+};
+#endif
diff --git a/ecflow_4_0_7/ANode/test/TestAdd.cpp b/ecflow_4_0_7/ANode/test/TestAdd.cpp
new file mode 100644
index 0000000..951c77c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestAdd.cpp
@@ -0,0 +1,51 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_add )
+{
+   cout << "ANode:: ...test_add\n";
+
+   defs_ptr defs = Defs::create();
+   task_ptr t1 = Task::create("t1");
+   family_ptr f1 = Family::create("f1");
+   suite_ptr s1 = Suite::create("s1");
+
+   defs->addSuite(s1);
+   s1->addFamily(f1);
+   f1->addTask(t1);
+
+   defs_ptr defs2 = Defs::create();
+   suite_ptr s2 = Suite::create("s2");
+   family_ptr f2 = Family::create("f2");
+
+   // This should all fail since, they are already owned.
+   // Otherwise we end up with two different container owning the same object
+   BOOST_CHECK_THROW( s2->addFamily(f1),std::runtime_error);
+   BOOST_CHECK_THROW( f2->addTask(t1),std::runtime_error);
+   BOOST_CHECK_THROW( defs2->addSuite(s1),std::runtime_error);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestAlias.cpp b/ecflow_4_0_7/ANode/test/TestAlias.cpp
new file mode 100644
index 0000000..76a8314
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestAlias.cpp
@@ -0,0 +1,103 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_alias_create )
+{
+   cout << "ANode:: ...test_alias_create\n";
+   std::string ecf_home = File::test_data("ANode/test/data/alias","ANode");
+
+   task_ptr t ;
+   Defs theDefs;
+   {
+      suite_ptr s = theDefs.add_suite("test_alias_create");
+      family_ptr f = s->add_family("f");
+      t = f->add_task("t");
+      t->addMeter(Meter("meter",0,100,100));
+      t->addMeter(Meter("meter1",0,100,100));
+      t->addEvent(Event(1,"event1"));
+      t->addEvent(Event(2,"event2"));
+      t->addLabel(Label("label_name","value"));
+      t->addLabel(Label("label_name1","value"));
+      s->add_variable(Str::ECF_HOME(),ecf_home);
+   }
+
+   // Create .usr file content
+   std::vector<std::string> usr_file_vec;
+   usr_file_vec.push_back("#This is a .usr file.");
+
+   // Create list of variables
+   NameValueVec used_variables;
+   used_variables.push_back( std::make_pair(std::string("a"),std::string("a_value")));
+   used_variables.push_back( std::make_pair(std::string("b"),std::string("b_value")));
+
+   // Finally create the alias.
+   alias_ptr alias = t->add_alias(usr_file_vec,used_variables);
+
+   // Test that default node state is QUEUED
+   BOOST_CHECK_MESSAGE(alias->state() == NState::QUEUED,"Expected initial state of QUEUED");
+
+   // Test that CHILD specific attributes event, meter, labels are copied over from the task.
+   BOOST_CHECK_MESSAGE(alias->meters().size() == 2,"Expected 2 meter to be copied from task but found " << alias->meters().size());
+   BOOST_CHECK_MESSAGE(alias->events().size() == 2,"Expected 2 events to be copied from task but found " << alias->events().size());
+   BOOST_CHECK_MESSAGE(alias->labels().size() == 2,"Expected 2 labels to be copied from task but found " << alias->labels().size());
+
+   // test that user variables passed in got added as Variables
+   BOOST_CHECK_MESSAGE(alias->variables().size() == 2,"Expected 2 variables to be create from input args but found " << alias->variables().size());
+
+   // Test directory creation
+   fs::path dir(ecf_home + "/" + t->absNodePath());
+   BOOST_CHECK_MESSAGE(fs::exists(dir),"Expected directory to be created " + dir.string());
+
+   // Test alias0.usr file creation
+   fs::path usr_file(ecf_home + "/" + t->absNodePath() + "/" + "alias0.usr");
+   BOOST_CHECK_MESSAGE(fs::exists(usr_file),"Expected alias0.usr file to be created " + usr_file.string());
+
+   // Create another alias. This should get created as alias1.usr
+   alias_ptr alias1 = t->add_alias(usr_file_vec,used_variables);
+   fs::path usr_file1(ecf_home + "/" + t->absNodePath() + "/" + "alias1.usr");
+   BOOST_CHECK_MESSAGE(fs::exists(usr_file1),"Expected alias1.usr file to be created " + usr_file1.string());
+
+   // Test Defs::get_all_aliases()
+   std::vector<alias_ptr> alias_vec;
+   theDefs.get_all_aliases(alias_vec);
+   BOOST_CHECK_MESSAGE(alias_vec.size() == 2,"Expected 2 aliases but found " << alias_vec.size());
+
+   // Check alias remove
+   BOOST_FOREACH(alias_ptr al,alias_vec) { al->remove();}
+   alias_vec.clear();
+   theDefs.get_all_aliases(alias_vec);
+   BOOST_CHECK_MESSAGE(alias_vec.empty(),"Expected no aliases but found " << alias_vec.size());
+
+   // Cleanup by removing the created directory
+   fs::remove_all(ecf_home);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestChangeMgrSingleton.cpp b/ecflow_4_0_7/ANode/test/TestChangeMgrSingleton.cpp
new file mode 100644
index 0000000..396efe7
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestChangeMgrSingleton.cpp
@@ -0,0 +1,130 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <stdlib.h>
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "AbstractObserver.hpp"
+
+using namespace std;
+using namespace ecf;
+
+class MyObserver : public AbstractObserver {
+public:
+   MyObserver(Defs* defs) : update_count_(0) { ChangeMgrSingleton::instance()->attach(defs,this); }
+   MyObserver(Node* node) : update_count_(0) { ChangeMgrSingleton::instance()->attach(node,this); }
+
+   virtual ~MyObserver() {/* std::cout << "~MyObserver()\n"; */ }
+
+   virtual void update(const Node*, const std::vector<ecf::Aspect::Type>&){update_count_++;}
+   virtual void update(const Defs*, const std::vector<ecf::Aspect::Type>&){update_count_++;}
+
+   /// After this call, the node will be deleted, hence observers must *NOT* use the pointers
+   virtual void update_delete(const Node* node) {
+      //std::cout << "update_delete(const Node* node)\n";
+      ChangeMgrSingleton::instance()->detach(const_cast<Node*>(node),this);
+   }
+   virtual void update_delete(const Defs* defs) {
+      //std::cout << "update_delete(const Defs* node)\n";
+      ChangeMgrSingleton::instance()->detach(const_cast<Defs*>(defs),this);
+   }
+
+   int update_count() const { return update_count_;}
+private:
+   int update_count_;
+};
+
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_change_mgr_singleton )
+{
+   cout << "ANode:: ...test_change_mgr_singleton\n";
+   {
+      defs_ptr theDefs = Defs::create();
+
+      MyObserver defs_obs(theDefs.get());
+      BOOST_CHECK_MESSAGE(ChangeMgrSingleton::instance()->no_of_def_observers() == 1,"Expected one observer");
+
+//      MyObserver defs_obs2(theDefs.get());
+//      MyObserver defs_obs3(theDefs.get());
+//      BOOST_CHECK_MESSAGE(ChangeMgrSingleton::instance()->no_of_def_observers() == 3,"Expected 3 observer");
+
+      ChangeMgrSingleton::instance()->notify(theDefs);
+      ChangeMgrSingleton::instance()->notify(theDefs);
+      ChangeMgrSingleton::instance()->notify(theDefs);
+      ChangeMgrSingleton::instance()->notify(theDefs);
+      ChangeMgrSingleton::instance()->notify(theDefs);
+      BOOST_CHECK_MESSAGE( defs_obs.update_count() == 5,"Expected 5 update");
+//      BOOST_CHECK_MESSAGE( defs_obs2.update_count() == 5,"Expected 5 update");
+//      BOOST_CHECK_MESSAGE( defs_obs3.update_count() == 5,"Expected 5 update");
+
+      theDefs.reset();
+      BOOST_CHECK_MESSAGE(ChangeMgrSingleton::instance()->no_of_def_observers() == 0,"Expected no observer");
+   }
+
+   {
+      // **** Note using node_ptr can extend the life of the Node, hence we use scoping ***
+      Defs* theDefs = new Defs;
+      std::vector<MyObserver*> obs_vec;
+      {
+         {
+            suite_ptr suite = theDefs->add_suite( "suite1" );
+            family_ptr fam = suite->add_family( "family" );
+            task_ptr t1 = fam->add_task( "t1" );
+         }
+
+         // get all nodes and observer them.
+         std::vector<node_ptr> node_vec; theDefs->get_all_nodes(node_vec);
+
+         // Need to make sure life time of observer is greater than Node tree
+         for(size_t i = 0; i < node_vec.size(); ++i) {
+            obs_vec.push_back( new MyObserver( node_vec[i].get() ) );
+         }
+         BOOST_CHECK_MESSAGE(ChangeMgrSingleton::instance()->no_of_node_observers() == 3,"Expected 3 observer");
+
+//         // Now add another set of observers
+//         for(size_t i = 0; i < node_vec.size(); ++i) {
+//            obs_vec.push_back( new MyObserver( node_vec[i].get() ) );
+//         }
+//         BOOST_CHECK_MESSAGE(ChangeMgrSingleton::instance()->no_of_node_observers() == 6,"Expected 6 observer");
+
+         // Do some updates
+         for(size_t i = 0; i < node_vec.size(); ++i) {
+            ChangeMgrSingleton::instance()->notify(node_vec[i]);
+            ChangeMgrSingleton::instance()->notify(node_vec[i]);
+         }
+         for(size_t i = 0; i < obs_vec.size(); ++i) {
+            BOOST_CHECK_MESSAGE( obs_vec[i]->update_count() == 2,"Expected 2 updates");
+         }
+      }
+
+      // make sure no node_ptr are in scope as they can *delay*
+      // the destructor to the end of the scope, and hence affect this test
+      delete theDefs;
+      BOOST_CHECK_MESSAGE(ChangeMgrSingleton::instance()->no_of_node_observers() == 0,"Expected no observer but found " << ChangeMgrSingleton::instance()->no_of_node_observers());
+
+      for(size_t i = 0; i < obs_vec.size(); ++i) { delete  obs_vec[i]; }
+   }
+
+   // keep valgrind happy
+   ChangeMgrSingleton::destroy();
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestDefStatus.cpp b/ecflow_4_0_7/ANode/test/TestDefStatus.cpp
new file mode 100644
index 0000000..d90e8fb
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestDefStatus.cpp
@@ -0,0 +1,154 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_defstatus )
+{
+	cout << "ANode:: ...test_defstatus\n";
+
+	// Create a defs file corresponding to:
+ 	//suite suite1
+ 	//	family f1
+	//   	task t1
+	//   	task t2
+ 	//	family f2
+	//   	task t1
+	//   	task t2
+ 	Defs theDefs;
+ 	suite_ptr suite =  theDefs.add_suite(  "suite1"  );
+ 	family_ptr f1 =  suite->add_family( "f1" );
+ 	task_ptr t1 =  f1->add_task( "t1" );
+ 	task_ptr t2 =  f1->add_task( "t2" );
+
+ 	family_ptr f2 =  suite->add_family( "f2" );
+ 	task_ptr f2_t1 =  f2->add_task( "t1" );
+ 	task_ptr f2_t2 =  f2->add_task( "t2" );
+
+ 	// Get all nodes and tasks for ease of test
+ 	vector<Node*> nodes;
+ 	vector<Task*> tasks;
+ 	theDefs.getAllNodes(nodes);
+ 	theDefs.getAllTasks(tasks);
+
+ 	/// It should be noted that once a suite has begun, it stays begun, however for test purposes we had
+ 	/// added ability to reset the begin state.
+
+ 	/// Test 1: with no defstatus. All nodes should be set to NState::QUEUED
+ 	theDefs.beginAll();
+ 	BOOST_FOREACH(Node* n,nodes) { BOOST_CHECK_MESSAGE(n->state() == NState::QUEUED,"Expected queued but found " << NState::toString(n->state())); }
+
+   theDefs.requeue();
+   BOOST_FOREACH(Node* n,nodes) { BOOST_CHECK_MESSAGE(n->state() == NState::QUEUED,"Expected queued but found " << NState::toString(n->state())); }
+
+
+ 	/// Test 2: with defstatus on suite. With complete the status should have been propagated down
+ 	suite->addDefStatus(DState::COMPLETE);
+ 	theDefs.reset_begin(); // for test purposes only
+ 	theDefs.beginAll();
+ 	BOOST_FOREACH(Node* n,nodes) {
+ 		BOOST_CHECK_MESSAGE(n->state() == NState::COMPLETE,"Expected complete but found " << NState::toString(n->state()));
+  	}
+
+   theDefs.requeue();
+   BOOST_FOREACH(Node* n,nodes) {
+      BOOST_CHECK_MESSAGE(n->state() == NState::COMPLETE,"Expected complete but found " << NState::toString(n->state()));
+   }
+
+ 	/// Test 3: defstatus of family f1 and f2. The parent node(suite) should reflect status of children
+ 	/// Also setting defstatus complete on a family should have propagated it downwards to tasks
+ 	suite->addDefStatus(DState::default_state()); // reset defstatus
+ 	f1->addDefStatus(DState::COMPLETE);
+ 	f2->addDefStatus(DState::COMPLETE);
+   theDefs.reset_begin(); // for test purposes only
+ 	theDefs.beginAll();
+   BOOST_FOREACH(Node* n,nodes) {
+       BOOST_CHECK_MESSAGE(n->state() == NState::COMPLETE,"Expected complete but found " << NState::toString(n->state()));
+   }
+
+   theDefs.requeue();
+   BOOST_FOREACH(Node* n,nodes) {
+      BOOST_CHECK_MESSAGE(n->state() == NState::COMPLETE,"Expected complete but found " << NState::toString(n->state()));
+   }
+
+
+	// Suspend is really a user interaction the real state suould be queued
+   f1->addDefStatus(DState::default_state());       // reset defstatus
+   f2->addDefStatus(DState::default_state());       // reset defstatus
+   suite->addDefStatus(DState::SUSPENDED);          // reset defstatus
+   theDefs.reset_begin(); // for test purposes only
+   theDefs.beginAll();
+   BOOST_FOREACH(Node* n,nodes) { BOOST_CHECK_MESSAGE(n->state() == NState::QUEUED,"Expected queued but found " << NState::toString(n->state())); }
+
+   theDefs.requeue();
+   BOOST_FOREACH(Node* n,nodes) { BOOST_CHECK_MESSAGE(n->state() == NState::QUEUED,"Expected queued but found " << NState::toString(n->state())); }
+}
+
+BOOST_AUTO_TEST_CASE( test_ECFLOW_139 )
+{
+   cout << "ANode:: ...test_ECFLOW_139\n";
+
+   // Create a defs file corresponding to:
+   //suite suite1
+   // family f1
+   //    task t1; defstatus suspended
+   //    task t2; defstatus suspended
+   // family f2
+   //    task t1; defstatus suspended
+   //    task t2; defstatus suspended
+   Defs theDefs;
+   suite_ptr suite =  theDefs.add_suite(  "suite1"  );
+   family_ptr f1 =  suite->add_family( "f1" );
+   task_ptr t1 =  f1->add_task( "t1" );
+   task_ptr t2 =  f1->add_task( "t2" );
+   t1->addDefStatus(DState::SUSPENDED);
+   t2->addDefStatus(DState::SUSPENDED);
+
+   family_ptr f2 =  suite->add_family( "f2" );
+   task_ptr f2_t1 =  f2->add_task( "t1" );
+   task_ptr f2_t2 =  f2->add_task( "t2" );
+   f2_t1->addDefStatus(DState::SUSPENDED);
+   f2_t2->addDefStatus(DState::SUSPENDED);
+
+   // Get all nodes and tasks for ease of test
+   vector<Task*> tasks;
+   theDefs.getAllTasks(tasks);
+
+   /// It should be noted that once a suite has begun, it stays begun, however for test purposes we had
+   /// added ability to reset the begin state.
+
+   /// Test 1: Check NODE state All nodes should be set to NState::QUEUED
+   theDefs.beginAll();
+   BOOST_FOREACH(Task* n,tasks) { BOOST_CHECK_MESSAGE(n->state() == NState::QUEUED,"Expected queued but found " << NState::toString(n->state())); }
+
+   /// Check: DSTATE
+   BOOST_FOREACH(Task* n,tasks) { BOOST_CHECK_MESSAGE(n->dstate() == DState::SUSPENDED,"Expected suspended but found " << DState::toString(n->dstate())); }
+
+   theDefs.requeue();
+   BOOST_FOREACH(Task* n,tasks) { BOOST_CHECK_MESSAGE(n->state() == NState::QUEUED,"Expected queued but found " << NState::toString(n->state())); }
+   BOOST_FOREACH(Task* n,tasks) { BOOST_CHECK_MESSAGE(n->dstate() == DState::SUSPENDED,"Expected suspended but found " << DState::toString(n->dstate())); }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestDefs.cpp b/ecflow_4_0_7/ANode/test/TestDefs.cpp
new file mode 100644
index 0000000..9c55639
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestDefs.cpp
@@ -0,0 +1,84 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_defs_absorb )
+{
+	cout << "ANode:: ...test_defs_absorb\n";
+
+	// Create a defs file corresponding to:
+ 	//suite suite1
+ 	//	family family
+	//   	task t1
+ 	//  endfamily
+	//endsuite
+ 	Defs theDefs;
+ 	{
+		suite_ptr suite = theDefs.add_suite( "suite1" );
+ 		family_ptr fam = suite->add_family( "family" );
+ 		fam->add_task( "t1" );
+ 	}
+	// Then ABSORB a new def
+ 	//suite suite1-n
+	//   family family
+	//   		task suite1_task1
+ 	//   endfamily
+	//endsuite
+ 	 Defs otherDefs;
+ 	 {
+ 	 	for(int i = 0; i < 14; ++i) {
+ 	 		suite_ptr suite1 = otherDefs.add_suite( "suite" + boost::lexical_cast<std::string>(i) );
+ 	 		family_ptr fam = suite1->add_family( "family" );
+ 	 		fam->add_task("suite1_task1");
+		}
+	}
+
+ 	theDefs.absorb(&otherDefs, true);
+ 	BOOST_CHECK_MESSAGE(otherDefs.suiteVec().empty(),"absorb failed");
+}
+
+BOOST_AUTO_TEST_CASE( test_defs_absorb_server_user_variables )
+{
+   cout << "ANode:: ...test_defs_absorb_server_user_variables\n";
+
+   Defs theDefs;
+   Defs otherDefs;
+   {
+      otherDefs.set_server().add_or_update_user_variables("VAR1","VAL");
+      otherDefs.set_server().add_or_update_user_variables("VAR2","VAL");
+      otherDefs.set_server().add_or_update_user_variables("VAR3","VAL");
+      otherDefs.add_suite("suite");
+   }
+
+   BOOST_CHECK_MESSAGE(theDefs.server().user_variables().empty(),"Expected no server user variables");
+
+   theDefs.absorb(&otherDefs, true);
+
+   BOOST_CHECK_MESSAGE(otherDefs.suiteVec().empty(),"absorb failed");
+   BOOST_CHECK_MESSAGE(theDefs.suiteVec().size() == 1,"absorb failed");
+   BOOST_CHECK_MESSAGE(theDefs.server().user_variables().size() == 3,"Expected 3 server user variables");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestEcfFile.cpp b/ecflow_4_0_7/ANode/test/TestEcfFile.cpp
new file mode 100644
index 0000000..309ddc5
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestEcfFile.cpp
@@ -0,0 +1,857 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "EcfFile.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "System.hpp"
+#include "File.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_ecf_file_with_bad_ECF_MICRO )
+{
+   cout << "ANode:: ...test_ecf_file_with_bad_ECF_MICRO\n";
+
+   // Create the defs file corresponding to the text below
+   //suite suite
+   //  task t1
+   //     ECF_MICRO ""   # can not be empty if overridden
+   //  task t2
+   //     ECF_MICRO "ss" # must be a single char
+   //endsuite
+
+   task_ptr task_t1;
+   task_ptr task_t2;
+   Defs theDefs; {
+      suite_ptr suite = theDefs.add_suite("suite");
+      task_t1 = suite->add_task( "t1" );  task_t1->add_variable("ECF_MICRO","");
+      task_t2 = suite->add_task( "t2" );  task_t2->add_variable("ECF_MICRO","ss");
+   }
+
+   // Check we throw for bad ECF_MICRO chars
+   std::string ecf_file_location;
+   BOOST_REQUIRE_THROW(EcfFile ecfFile(task_t1.get(),ecf_file_location),std::runtime_error);
+   BOOST_REQUIRE_THROW(EcfFile ecfFile(task_t2.get(),ecf_file_location),std::runtime_error);
+}
+
+BOOST_AUTO_TEST_CASE( test_ecf_simple_include_file )
+{
+   // The specific files are specified in ECF_INCLUDE and common files
+   // are specified in ECF_HOME. This test will ensure that if the file common.h
+   // is not found in ECF_INCLUDE we then look at ECF_HOME
+   cout << "ANode:: ...test_ecf_simple_include_file";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+    if (getenv("ECFLOW_CRAY_BATCH")) {
+       cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+       return;
+    }
+    cout << "\n";
+
+   // Create the defs file corresponding to the text below
+   //suite suite
+   //  edit ECF_INCLUDE $ECF_HOME/includes
+   //  task t1
+   //endsuite
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   task_ptr task_t1 = Task::create( "t1" );
+   suite_ptr suite = Suite::create( "suite"  );
+   Defs theDefs; {
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->addTask( task_t1 );
+      theDefs.addSuite( suite );
+   }
+
+   // Override ECF_HOME. ECF_HOME is as default location for .ecf files, when ECF_INCLUDE not specified
+   // or when file does not exist in ECF_INCLUDE
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // generate the ecf file;
+   string header = "%include <simple_head.h>\n";
+   string body = "#body\n";
+   string tail = "%include <simple_tail.h>\n";
+   string ecf_file = header;
+   ecf_file += body;
+   ecf_file += tail;
+
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   // cout << "file_location = " << ecf_file_location << "\n";
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables
+   task_t1->update_generated_variables();
+
+   /// Now finally the test
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   /// Check generation of '.usr' and job files
+   JobsParam jobsParam(true); // spawn_jobs = false
+   try { ecfFile.create_job(jobsParam); }
+   catch ( std::exception& e) { BOOST_CHECK_MESSAGE(false,"Expected job creation to succeed " << e.what());}
+
+   string job_file_location = ecf_home  + task_t1->absNodePath() + File::JOB_EXTN() + task_t1->tryNo();
+   BOOST_CHECK_MESSAGE(fs::exists(job_file_location), "Expected File " << job_file_location << " to exist");
+
+   // Open the job file/
+   std::string job_file_contents;
+   BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+
+   std::string expected_job_file_contents = "#head.h\n#body\n#tail.h";
+   BOOST_CHECK_MESSAGE(job_file_contents == expected_job_file_contents ,"Expected\n" <<expected_job_file_contents << "' but found \n" <<  job_file_contents << "'");
+
+   /// Remove all the generated files
+   boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
+}
+
+BOOST_AUTO_TEST_CASE( test_ecf_simple_used_variables )
+{
+   // Test that used variables are as expected
+   // This should PRUNE the generated variables from the used variables list
+   // Additionally it should NOT affect variables like ESUITE but should ignore generated variable SUITE
+   // See File: ANode/test/data/includes/used_variables.h
+   cout << "ANode:: ...test_ecf_simple_used_variables";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+
+   // Create the defs file corresponding to the text below
+   //suite suite
+   //  edit ECF_INCLUDE $ECF_HOME/includes
+   //  task t1
+   //endsuite
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   task_ptr task_t1;
+   suite_ptr suite;
+   Defs theDefs; {
+      suite = theDefs.add_suite("suite");
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->add_variable("ESUITE","suite");
+      task_t1 = suite->add_family("f1")->add_task( "t1" );
+   }
+
+   // Override ECF_HOME. ECF_HOME is as default location for .ecf files, when ECF_INCLUDE not specified
+   // or when file does not exist in ECF_INCLUDE
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // generate the ecf file;
+   string ecf_file = "%include <used_variables.h>\n";
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   // cout << "file_location = " << ecf_file_location << "\n";
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables
+   task_t1->update_generated_variables();
+
+   /// Now finally the test
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   string file_with_used_variables;
+   ecfFile.edit_used_variables(file_with_used_variables);
+   string expected_used_variables = "%comment - ecf user variables\nESUITE = suite\n%end - ecf user variables\n%include <used_variables.h>\n";
+   BOOST_CHECK_MESSAGE(file_with_used_variables==expected_used_variables,"Expected\n" << expected_used_variables << "\nBut found:\n" << file_with_used_variables);
+
+   /// Remove all the generated files
+   boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
+}
+
+BOOST_AUTO_TEST_CASE( test_ecf_simple_used_variables_with_comments )
+{
+   // Test that used variables are as expected
+   // This should PRUNE the generated variables from the used variables list
+   // Additionally it should NOT affect variables like ETASK but should ignore generated variable TASK
+   // See File: ANode/test/data/includes/used_variables_with_comments.h
+   //
+   // This WILL test that when we have user comment and manuals, we can still extract user variables
+   // Those variable defined within comments and manuals that are not defined should be ignored
+   cout << "ANode:: ...test_ecf_simple_used_variables_with_comments";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+
+   // Create the defs file corresponding to the text below
+   //suite suite
+   //  edit ECF_INCLUDE $ECF_HOME/includes
+   //  task t1
+   //endsuite
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   task_ptr task_t1;
+   suite_ptr suite;
+   Defs theDefs; {
+      suite = theDefs.add_suite("suite");
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->add_variable("ETASK","suite");
+      suite->add_variable("FRED","fred");
+      task_t1 = suite->add_family("f1")->add_task( "t1" );
+   }
+
+   // Override ECF_HOME. ECF_HOME is as default location for .ecf files, when ECF_INCLUDE not specified
+   // or when file does not exist in ECF_INCLUDE
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // generate the ecf file;
+   string ecf_file = "%include <used_variables_with_comments.h>\n";
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   // cout << "file_location = " << ecf_file_location << "\n";
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables
+   task_t1->update_generated_variables();
+
+   /// Now finally the test
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   string file_with_used_variables;
+   ecfFile.edit_used_variables(file_with_used_variables);
+   string expected_used_variables = "%comment - ecf user variables\nETASK = suite\nFRED = fred\n%end - ecf user variables\n%include <used_variables_with_comments.h>\n";
+   BOOST_CHECK_MESSAGE(file_with_used_variables==expected_used_variables,"Expected\n" << expected_used_variables << "\nBut found:\n" << file_with_used_variables);
+
+   /// Remove all the generated files
+   boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
+}
+
+
+BOOST_AUTO_TEST_CASE( test_ecf_simple_used_variables_errors )
+{
+   // Test that used variables are as expected
+   // This is similar to test_ecf_simple_used_variables_with_comments
+   // BUT we DO NOT define variable FRED, hence we expect failure
+   cout << "ANode:: ...test_ecf_simple_used_variables_errors";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+
+   // Create the defs file corresponding to the text below
+   //suite suite
+   //  edit ECF_INCLUDE $ECF_HOME/includes
+   //  task t1
+   //endsuite
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   task_ptr task_t1;
+   suite_ptr suite;
+   Defs theDefs; {
+      suite = theDefs.add_suite("suite");
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->add_variable("ETASK","suite");
+      task_t1 = suite->add_family("f1")->add_task( "t1" );
+   }
+
+   // Override ECF_HOME. ECF_HOME is as default location for .ecf files, when ECF_INCLUDE not specified
+   // or when file does not exist in ECF_INCLUDE
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // generate the ecf file;
+   string ecf_file = "%include <used_variables_with_comments.h>\n";
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   // cout << "file_location = " << ecf_file_location << "\n";
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables
+   task_t1->update_generated_variables();
+
+   /// Now finally the test
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   // Expect a throw since %FRED% is not defined, on the suite, but exists in used_variables_with_comments.h
+   string file_with_used_variables;
+   BOOST_REQUIRE_THROW(ecfFile.edit_used_variables(file_with_used_variables),std::runtime_error);
+
+   /// Remove all the generated files
+   boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
+}
+
+BOOST_AUTO_TEST_CASE( test_ecf_include_file )
+{
+   // The specific files are specified in ECF_INCLUDE and common files
+   // are specified in ECF_HOME. This test will ensure that if the file common.h
+   // is not found in ECF_INCLUDE we then look at ECF_HOME
+   cout << "ANode:: ...test_ecf_include_file";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+
+   // Create the defs file corresponding to the text below
+   //suite suite
+   // edit SLEEPTIME 10
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  task t1
+   //endsuite
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   task_ptr task_t1 = Task::create( "t1" );
+   suite_ptr suite = Suite::create( "suite"  );
+   Defs theDefs; {
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->addVariable( Variable( "SLEEPTIME", "1" ) );
+      suite->addVariable( Variable( "ECF_CLIENT_EXE_PATH",  "a/made/up/path" ) );
+      suite->addTask( task_t1 );
+      theDefs.addSuite( suite );
+   }
+
+   // Override ECF_HOME. ECF_HOME is as default location for .ecf files, when ECF_INCLUDE not specified
+   // or when file does not exist in ECF_INCLUDE
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // generate the ecf file;
+   string header = "%include <head.h>\n\n";
+   string body = "%include <common.h>\n\n";
+   string tail = "%include <tail.h>\n# ===================================";
+   string ecf_file = header;
+   ecf_file += body;
+   ecf_file += tail;
+
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   // cout << "file_location = " << ecf_file_location << "\n";
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables
+   task_t1->update_generated_variables();
+
+   /// Now finally the test
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   /// Check generation of '.usr' and job files
+   string job_file_location = ecf_home  + task_t1->absNodePath() + File::JOB_EXTN() + task_t1->tryNo();
+   JobsParam jobsParam(true); // spawn_jobs = false
+   try { ecfFile.create_job(jobsParam); }
+   catch ( std::exception& e) { BOOST_CHECK_MESSAGE(false,"Expected job creation to succeed " << e.what());}
+   BOOST_CHECK_MESSAGE(fs::exists(job_file_location), "Expected File " << job_file_location << " to exist");
+
+   // Open the job file/
+   std::string job_file_contents;
+   BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+
+   /// Remove all the generated files
+   boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
+}
+
+
+BOOST_AUTO_TEST_CASE( test_ecf_file )
+{
+   cout << "ANode:: ...test_ecf_file";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+
+   // Create the defs file corresponding to the text below
+   //# Test the sms file can be found via ECF_SCRIPT
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //#
+   //suite suite
+   //	edit SLEEPTIME 10
+   //	edit ECF_INCLUDE $ECF_HOME/includes
+   //  task t1
+   //endsuite
+
+   NameValueMap expected_used_variables;
+   expected_used_variables.insert( std::make_pair(string("VAR1"),string("_val1_")) );
+   expected_used_variables.insert( std::make_pair(string("VAR2"),string("_val2_")) );
+   expected_used_variables.insert( std::make_pair(string("VAR2_fred"),string("<ignored>")) );
+
+   // Create a defs file, where the task name mirrors the sms files in the given directory
+   task_ptr task_t1 = Task::create( "t1" );
+   suite_ptr suite = Suite::create( "suite"  );
+   std::pair<std::string,std::string> p;
+   Defs theDefs; {
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->addVariable( Variable( "SLEEPTIME", "1" ) );
+      suite->addVariable( Variable( "ECF_CLIENT_EXE_PATH",  "a/made/up/path" ) );
+      BOOST_FOREACH(p,expected_used_variables) { task_t1->addVariable( Variable( p.first,  p.second) );}
+      suite->addTask( task_t1 );
+      theDefs.addSuite( suite );
+   }
+
+
+   // Override ECF_HOME.   ECF_HOME is need to locate to the .ecf files
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // generate the ecf file;
+   string header = "%include <head.h>\n\n";
+   string manual_head = "%manual\n";
+   string manual_body = " manual. The contents of the manual\n";
+   manual_body +=       " end.\n";
+   string manual_tail = "%end\n\n";
+   string comment_head = "%comment\n";
+   string comment_body = " comment. The contents of the comment\n";
+   comment_body +=       " end.\n";
+   string comment_tail ="%end\n\n";
+   string ecf_body; {
+      std::pair<std::string,std::string> p;
+      BOOST_FOREACH(p,expected_used_variables) {  ecf_body += Ecf::MICRO() + p.first + Ecf::MICRO() + "\n";}
+      ecf_body +="%VAR3:substitute_var%\n";
+   }
+   string tail = "\n%include <tail.h>\n# ===================================";
+
+   string ecf_file = header;
+   ecf_file += manual_head;
+   ecf_file += manual_body;
+   ecf_file += manual_tail;
+   ecf_file += comment_head;
+   ecf_file += comment_body;
+   ecf_file += comment_tail;
+   ecf_file += ecf_body;
+   ecf_file += tail;
+
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   //	cout << "file_location = " << ecf_file_location << "\n";
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables
+   task_t1->update_generated_variables();
+
+   /// Now finally the test
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   /// Test manual extraction
+   /// The manual is manual of all the pre-processed includes
+   /// Test: SUP-762 Lines starting with "manually" are not shown in manual
+   std::string expected_manual = "#This is the manual from the head.h file\n manual. The contents of the manual\n end.\n#This is the manual from the tail.h file\n";
+
+   string theExtractedManual;
+   try { ecfFile.manual(theExtractedManual); }
+   catch (std::exception &e) { BOOST_CHECK_MESSAGE(false,e.what()); }
+   BOOST_CHECK_MESSAGE( theExtractedManual == expected_manual, "Expected \n'" << expected_manual << "' but found \n'" << theExtractedManual << "'");
+
+
+   /// Test script extraction
+   string theExtractedScript;
+   try { ecfFile.script(theExtractedScript); }
+   catch (std::exception &e) { BOOST_CHECK_MESSAGE(false,e.what()); }
+   BOOST_CHECK_MESSAGE( theExtractedScript == ecf_file, "\nExpected\n" << ecf_file
+            << "\nsize = " << ecf_file.size() << " but found-----------------\n"
+            << theExtractedScript << "\nsize = " << theExtractedScript.size() );
+
+
+   /// Test User edit script, this should return all the used variables, between %comment -%end
+   string file_with_used_variables;
+   ecfFile.edit_used_variables(file_with_used_variables);
+   //    std::cout << "file_with_used_variables:----------------------------------------------------------------\n" << file_with_used_variables << "\n";
+   BOOST_CHECK_MESSAGE(file_with_used_variables.find("%comment") == 0, "Expected to find variable %comment on the very first line: but found at: " << file_with_used_variables.find("%comment"));
+   BOOST_FOREACH(p,expected_used_variables) {
+      BOOST_CHECK_MESSAGE(file_with_used_variables.find(p.first) != string::npos, "Expected to find variable" << p.first);
+   }
+
+   /// Test extraction of all the used variables
+   std::vector<string> script_lines;
+   Str::split(file_with_used_variables,script_lines,"\n"); //  will ignore empty lines, but will do for this case
+   NameValueMap extracted_used_variables;
+   EcfFile::extract_used_variables( extracted_used_variables, script_lines );
+   BOOST_FOREACH(p,expected_used_variables) {
+      BOOST_CHECK_MESSAGE( extracted_used_variables.find(p.first) != extracted_used_variables.end()," expected to find variable " << p.first << " in the extracted variables\n");
+   }
+   //    cout << "Expected:----\n"; BOOST_FOREACH(p,expected_used_variables) { cout << p.first << " " << p.second << "\n";}
+   //    cout << "Actual:------\n"; BOOST_FOREACH(p,extracted_used_variables) { cout << p.first << " " << p.second << "\n";}
+
+
+   /// Test pre-processing
+   string pre_processed_file;
+   ecfFile.pre_process(pre_processed_file);
+   //	cout << "pre_processed_file\n" << pre_processed_file << "\n";
+   BOOST_CHECK_MESSAGE(!pre_processed_file.empty(),"Expected file not to be empty");
+   BOOST_CHECK_MESSAGE(pre_processed_file.find("%include") ==  string::npos,"Expected all includes to be removed");
+
+   /// Check generation of '.usr' and job files
+   string man_file_location = ecf_home  + task_t1->absNodePath() + File::MAN_EXTN();
+   string usr_file_location = ecf_home  + task_t1->absNodePath() + File::USR_EXTN();
+   string job_file_location = ecf_home  + task_t1->absNodePath() + File::JOB_EXTN() + task_t1->tryNo();
+   JobsParam jobsParam(true); // spawn_jobs = false
+   jobsParam.set_user_edit_variables( extracted_used_variables );
+   jobsParam.set_user_edit_file( script_lines );
+   try { ecfFile.create_job(jobsParam); }
+   catch ( std::exception& e) { BOOST_CHECK_MESSAGE(false,"Expected job creation to succeed " << e.what());}
+   BOOST_CHECK_MESSAGE(fs::exists(usr_file_location), "Expected File " << usr_file_location << " to exist");
+   BOOST_CHECK_MESSAGE(fs::exists(job_file_location), "Expected File " << job_file_location << " to exist");
+
+    // Open the job file/
+    std::string job_file_contents;
+    BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+
+    // Test the contents of the job file.
+//    cout << "\n" << job_file_contents << "\n";
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_PORT%") == string::npos,"Expected variables to be substituted:");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_NODE%") == string::npos,"Expected variables to be substituted:");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_NAME%") == string::npos,"Expected variables to be substituted:");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_PASS%") == string::npos,"Expected variables to be substituted");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_TRYNO%") == string::npos,"Expected variables to be substituted");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%include") == string::npos,"Expected all includes to be expanded");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%manual") == string::npos,"%manual should have been removed");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%comment") == string::npos,"%comment should have been removed:");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%end") == string::npos,"%end should have been removed:");
+    BOOST_CHECK_MESSAGE(job_file_contents.find("%ecfmicro") == string::npos,"%ecfmicro should have been removed:");
+
+
+   /// Remove all the generated files
+   boost::filesystem::remove( man_file_location );
+   boost::filesystem::remove( ecf_file_location );
+   boost::filesystem::remove( usr_file_location );
+   boost::filesystem::remove( job_file_location );
+   boost::filesystem::remove( ecf_home + suite->absNodePath() );
+}
+
+
+BOOST_AUTO_TEST_CASE( test_ecf_file_includenoop )
+{
+   cout << "ANode:: ...test_ecf_file_includenopp";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+
+   // This test is used to check that %includenopp are expanded only.
+   // There should be NO variable substitution, or removal of comments/manual
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   task_ptr task_t1 = Task::create( "t1" );
+   suite_ptr suite = Suite::create( "suite_test_ecf_file_includenopp"  );
+   std::pair<std::string,std::string> p;
+   Defs theDefs; {
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->addVariable( Variable( "SLEEPTIME", "1" ) );
+      suite->addVariable( Variable( "ECF_CLIENT_EXE_PATH",  "a/made/up/path" ) );
+      suite->addTask( task_t1 );
+      theDefs.addSuite( suite );
+   }
+   //cout << theDefs << "\n";
+
+   // Override ECF_HOME. ECF_HOME is need to locate to the .ecf files
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the ecf files
+   theDefs.beginAll();
+
+   // generate the ecf file;
+   string header = "%includenopp <head.h>\n";
+   string tail = "%includenopp <tail.h>";
+   string ecf_file = header;
+   ecf_file += tail;
+
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir " << ecf_file_location << "\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables. Then EcfFile
+   task_t1->update_generated_variables();
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   /// Check generation of job files
+   string man_file_location = ecf_home  + task_t1->absNodePath() + File::MAN_EXTN();
+   string job_file_location = ecf_home  + task_t1->absNodePath() + File::JOB_EXTN() + task_t1->tryNo();
+   JobsParam jobsParam(true); // spawn_jobs = false
+   try { ecfFile.create_job(jobsParam); }
+   catch ( std::exception& e) { BOOST_CHECK_MESSAGE(false,"Expected job creation to succeed " << e.what());}
+
+   // Open the job file and check the contents
+   BOOST_CHECK_MESSAGE(fs::exists(job_file_location), "Expected job File " << job_file_location << " to exist");
+   std::string job_file_contents;
+   BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+
+   // Test the contents of the job file. We expect includenopp to be expanded
+   // The contents should be left as is: i.e no pre_processing,hence expect to find %manual %comment, %VARIABLES%
+   //cout << "\n" << job_file_contents << "\n";
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%includenopp") == string::npos,"Expected all includes to be removed");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_PORT%") != string::npos,"Expected variables as is:");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_NODE%") != string::npos,"Expected variables as is:");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_NAME%") != string::npos,"Expected variables as is:");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_PASS%") != string::npos,"Expected variables as is:");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%ECF_TRYNO%") != string::npos,"Expected variables as is:");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%manual") != string::npos,"%manual should exist inside %nopp/%end pair:");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%comment") != string::npos,"%comment should exist inside %nopp/%end pair:");
+   BOOST_CHECK_MESSAGE(job_file_contents.find("%end") != string::npos,"%end associated with comment and manual should exist:");
+
+
+   // Remove all the generated files
+   boost::filesystem::remove( ecf_file_location );
+   boost::filesystem::remove( man_file_location );
+   boost::filesystem::remove( job_file_location );
+   boost::filesystem::remove( ecf_home + suite->absNodePath() );
+}
+
+
+BOOST_AUTO_TEST_CASE( test_ecf_file_override_ECF_JOB )
+{
+   cout << "ANode:: ...test_ecf_file_override_ECF_JOB";
+
+   // This test FAIL's randomly on the cray in BATCH mode, but passes in interactive mode.
+   if (getenv("ECFLOW_CRAY_BATCH")) {
+      cout << " **** SKIPPING test, until HPC team can  fix File::createMissingDirectories.(like mkdir -p)  *****\n";
+      return;
+   }
+   cout << "\n";
+
+   // This test is used to check that when user has added a variable ECF_JOB
+   // to specify the location of the job file, we use that, in preference
+   // to generated ECF_JOB for the location of the job file.
+   // Note: The directories to the job file should be created by EcfFile
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data","ANode");
+   std::string job_file_location = ecf_home + "/a/made/up/path/t1.job";
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   task_ptr task_t1 = Task::create( "t1" );
+   task_t1->addVariable( Variable( "ECF_JOB",  job_file_location  ) );
+   suite_ptr suite = Suite::create( "test_ecf_file_override_ECF_JOB"  );
+   std::pair<std::string,std::string> p;
+   Defs theDefs; {
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+      suite->addVariable( Variable( "SLEEPTIME", "1" ) );
+      suite->addVariable( Variable( "ECF_CLIENT_EXE_PATH",  "a/made/up/path" ) );
+      suite->addTask( task_t1 );
+      theDefs.addSuite( suite );
+   }
+   //cout << theDefs << "\n";
+
+   // Override ECF_HOME. ECF_HOME is need to locate to the .ecf files
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the ecf files
+   theDefs.beginAll();
+
+   // generate the dummy ecf file;
+   string header = "%include <head.h>\n";
+   string tail = "%include <tail.h>";
+   string ecf_file = header;
+   ecf_file += "# ";
+   ecf_file += tail;
+
+   string ecf_file_location = ecf_home  + task_t1->absNodePath() + File::ECF_EXTN();
+   BOOST_CHECK_MESSAGE(File::createMissingDirectories(ecf_file_location),"Could not create missing dir " << ecf_file_location << "\n");
+
+   string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(ecf_file_location, ecf_file, errormsg), errormsg);
+   BOOST_CHECK_MESSAGE(fs::exists(ecf_file_location), "Expected File " << ecf_file_location << " to exist");
+
+   // Create the generated variables. Then EcfFile
+   task_t1->update_generated_variables();
+   EcfFile ecfFile(task_t1.get(),ecf_file_location);
+
+   /// Check generation of job files
+   JobsParam jobsParam(true); // spawn_jobs = false
+   try { ecfFile.create_job(jobsParam); }
+   catch ( std::exception& e) { BOOST_CHECK_MESSAGE(false,"Expected job creation to succeed " << e.what());}
+
+   // Open the job file and check the contents
+   BOOST_CHECK_MESSAGE(fs::exists(job_file_location), "Expected job File " << job_file_location << " to exist");
+   std::string job_file_contents;
+   BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+   BOOST_CHECK_MESSAGE( !job_file_contents.empty(),"Job should not be empty");
+
+   // Remove all the generated files
+   boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
+   boost::filesystem::remove_all( ecf_home + "/a" );
+
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_CASE( test_manual_files )
+{
+   // The specific files are specified in ECF_INCLUDE and common files are specified in ECF_HOME.
+   cout << "ANode:: ...test_manual_files\n";
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data/SMSHOME","ANode");
+
+
+   // Create the defs file corresponding to the text below
+   //suite suite
+   // edit SLEEPTIME 10
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  family
+   //     task t1
+   //endsuite
+
+   // Create a defs file, where the task name mirrors the ecf files in the given directory
+   Defs theDefs;
+   suite_ptr suite = theDefs.add_suite( "suite"  );
+   suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/../includes" ) );
+   family_ptr family = suite->add_family("family");
+   task_ptr task_t1 = family->add_task("t1");
+
+
+   // Override ECF_HOME. ECF_HOME is as default location for .ecf files, when ECF_INCLUDE not specified
+   // or when file does not exist in ECF_INCLUDE
+   theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // Create the generated variables
+   task_t1->update_generated_variables();
+
+//   PrintStyle style(PrintStyle::STATE);
+//   std::cout << theDefs << "\n";
+
+   /// Now finally the test
+
+   // Task
+   {
+      std::string manual;
+      EcfFile ecf_file = task_t1->locatedEcfFile(); // will throw std::runtime_error for errors
+      ecf_file.manual(manual);                      // will throw std::runtime_error for errors
+      BOOST_REQUIRE_MESSAGE(!manual.empty(),"Manual not found");
+      BOOST_CHECK_MESSAGE(manual.find("ECF_MICRO=%") != std::string::npos,"Variable pre-processing failed during manual extraction");
+      BOOST_CHECK_MESSAGE(manual.find("manual-1") != std::string::npos,"Pre-processing of ecfmicro in manuals failed, expected to find string 'manual-1'\n" << manual);
+      BOOST_CHECK_MESSAGE(manual.find("end-1") != std::string::npos,"Pre-processing of ecfmicro in manuals failed, expected to find string 'end-1'\n" << manual);
+      BOOST_CHECK_MESSAGE(manual.find("Test manual files are pre-processed") != std::string::npos,"%include <manual.h> pre-processing failed inside manual->end\n" << manual);
+   }
+
+   {
+      // Family, Check the suite manuals are pre-processed. i.e %includes are expanded
+      // When the node container manual(family or suite) '.man' file, has content but *NO* %manual->%end directives
+      // Just pre-process and return file as is. Since the whole file is a manual.
+      std::string man_file = ecf_home + family->absNodePath() + File::MAN_EXTN();
+      EcfFile ecf_file(family.get(), man_file);
+
+      std::string manual;
+      ecf_file.manual(manual);
+      //cout << manual << "\n";
+      BOOST_CHECK_MESSAGE(!manual.empty(),"Manual not found");
+      BOOST_CHECK_MESSAGE(manual.find("Test manual files are pre-processed") != std::string::npos,"Pre-processing in manual failed");
+      BOOST_CHECK_MESSAGE(manual.find("Special case where there are no manual directives") != std::string::npos,"family manual extraction failed");
+   }
+
+   {
+      // Suite, Check the suite manuals are pre-processed. i.e %includes are expanded
+      std::string man_file = ecf_home + suite->absNodePath() + File::MAN_EXTN();
+      EcfFile ecf_file(suite.get(), man_file);
+
+      std::string manual;
+      ecf_file.manual(manual);
+      // cout << manual << "\n";
+      BOOST_CHECK_MESSAGE(!manual.empty(),"Manual not found");
+      BOOST_CHECK_MESSAGE(manual.find("Test manual files are pre-processed") != std::string::npos,"Pre-processing in manual failed");
+      BOOST_CHECK_MESSAGE(manual.find("suite manual") != std::string::npos,"Suite manual extraction failed");
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestEnviromentSubstitution.cpp b/ecflow_4_0_7/ANode/test/TestEnviromentSubstitution.cpp
new file mode 100644
index 0000000..9b8424e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestEnviromentSubstitution.cpp
@@ -0,0 +1,85 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+#include <string>
+#include <map>
+#include <iostream>
+#include <fstream>
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_environment_substitution )
+{
+    std::cout <<  "ANode:: ...test_environment_substitution\n";
+
+    Defs defs;
+    Suite* s =  NULL;
+    {
+		suite_ptr suite = defs.add_suite( "suite" );  s =  suite.get();
+		suite->addVariable(Variable("AVI","avi"));
+
+  		std::vector<std::pair<std::string,std::string> > env;
+  		env.push_back( std::make_pair(Str::ECF_HOME(), string("/home/smshome")) );
+  		env.push_back( std::make_pair(string("FRED"),    string("/home/fred")) );
+  		env.push_back( std::make_pair(string("BILL"),    string("/home/bill")) );
+  		env.push_back( std::make_pair(string("JANE"),    string("/home/jane")) );
+  		defs.set_server().add_or_update_user_variables( env );
+	}
+
+ 	// See page 31, section 5.1 variable inheritance, of SMS users guide
+	string expected = "/home/smshome";
+ 	std::string cmd = "$ECF_HOME";
+ 	BOOST_REQUIRE_MESSAGE(s->enviromentSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "$ECF_HOME/include"; expected = "/home/smshome/include";
+ 	BOOST_REQUIRE_MESSAGE(s->enviromentSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "$ECF_HOME$FRED$BILL$JANE"; expected = "/home/smshome/home/fred/home/bill/home/jane";
+ 	BOOST_REQUIRE_MESSAGE(s->enviromentSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+
+ 	cmd = "$ECF_HOME/$FRED/$BILL/$JANE";  expected = "/home/smshome//home/fred//home/bill//home/jane";
+  	BOOST_CHECK_MESSAGE(s->enviromentSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%PATH"; expected = "%PATH";
+ 	BOOST_CHECK_MESSAGE(s->enviromentSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "$$"; expected = "$$";
+ 	BOOST_CHECK_MESSAGE(s->enviromentSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "$ERROR$"; expected = "$ERROR$";
+ 	BOOST_CHECK_MESSAGE(!s->enviromentSubsitution(cmd)," substitution expected to fail since ERROR does not exist");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = ""; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->enviromentSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANode/test/TestExprParser.cpp b/ecflow_4_0_7/ANode/test/TestExprParser.cpp
new file mode 100644
index 0000000..295c376
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestExprParser.cpp
@@ -0,0 +1,393 @@
+#define BOOST_TEST_MODULE TestNode
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ExprParser.hpp"
+#include "ExprAst.hpp"
+#include "Expression.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+#include <string>
+#include <map>
+#include <iostream>
+#include <fstream>
+using namespace std;
+
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+
+BOOST_AUTO_TEST_CASE( test_expression_parser_basic )
+{
+   std::cout <<  "ANode:: ...test_expression_parser_basic\n";
+
+   // This must be nicely formatted, i.e. AST is nicely space formatted otherwise it will fail the test
+   // This test ENSURES the the AST matches the expression. (i.e by getting AST to print the expression)
+   // Note: we can use NOT,eq,ne,le,ge, or brackets
+   //       we can't use a:event_name  ==> a:event_name == set
+   std::vector<std::string> vec;
+   vec.push_back("a == complete");
+   vec.push_back("a != complete");
+   vec.push_back("a:value == 10");
+   vec.push_back("a:value != 10");
+   vec.push_back("a:value >= 10");
+   vec.push_back("a:value <= 10");
+   vec.push_back("a:value > 10");
+   vec.push_back("a:value < 10");
+   vec.push_back("1 == 1");
+   vec.push_back("a:event_name == set");
+   vec.push_back("a:event_name != set");
+   vec.push_back("a:event_name == clear");
+   vec.push_back("a:event_name != clear");
+   vec.push_back("../a/b:eventname == set");
+   vec.push_back("../a/b:eventname == clear");
+   vec.push_back("../a/b:eventname != clear");
+   vec.push_back("../a:event_name >= 10");
+   vec.push_back("a == unknown and b != complete");
+   vec.push_back("a == unknown or b != complete");
+   vec.push_back("a == complete and b == complete or c == complete");
+   vec.push_back("! a == unknown");
+   vec.push_back("/mc/main:YMD <= /mc/main/ref:MC_STOP");
+   vec.push_back("! ../../../prod2diss/operation_is_late:yes == set or ! a == complete");
+   vec.push_back("./a:YMD - ./b:YMD < 5");
+   vec.push_back("./a:YMD + ./b:YMD < 5");
+   vec.push_back("./a:YMD / ./b:YMD < 5");
+   vec.push_back("./a:YMD * ./b:YMD < 5");
+   vec.push_back("./a:YMD % ./b:YMD < 5");
+   vec.push_back("inigroup:YMD == ! 1");
+   vec.push_back("inigroup:YMD == ! 0");
+
+   for(size_t i = 0; i < vec.size(); i++) {
+
+      PartExpression part(vec[i]);
+      string parseErrorMsg;
+      std::auto_ptr<AstTop> ast = part.parseExpressions( parseErrorMsg );
+      BOOST_REQUIRE_MESSAGE(ast.get(),"Failed to parse " << vec[i] << "  " << parseErrorMsg);
+
+      std::stringstream s2;
+      ast->print_flat(s2);
+      std::string ast_expr = s2.str();
+      BOOST_CHECK_MESSAGE(vec[i]==ast_expr," Failed '" << vec[i] << "' != '" << ast_expr << "'" );
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_expression_parser_basic_with_brackets )
+{
+   std::cout <<  "ANode:: ...test_expression_parser_basic_with_brackets\n";
+
+   // This must be nicely formatted, i.e. AST is nicely space formatted otherwise it will fail the test
+   // This test ENSURES the the AST matches the expression. (i.e by getting AST to print the expression)
+   // Note: we can use NOT,eq,ne,le,ge,
+   //       we can't use a:event_name  ==> a:event_name == set
+   std::vector<std::string> vec;
+   vec.push_back("((a == complete) and (b == complete))");
+   vec.push_back("(((a == complete) or (b == complete)) and (c == complete))");
+   vec.push_back("((a == complete) and ((b == complete) or (nodepath:eventname == set)))");
+   vec.push_back("((a == complete) and ((b == complete) or ((a == complete) and (b == complete))))");
+   vec.push_back("! ((a == unknown))");
+   vec.push_back("((t:step + 20) >= (t:step1 - 20))");
+   vec.push_back("(((/o/main/12/an/slwet == complete) and ((/o/main/12/an/4dvar/ifstraj:finalwave == set) or (/o/main/12/an/4dvar == complete))) or (/o/main/12/an == complete))");
+   vec.push_back("((obs:YMD <= (main:YMD + 1)) and ((../make/setup == complete) and (obs:YMD <= /o/lag:YMD)))");
+   vec.push_back("(((stage == complete) or (./stage:YMD > ./retrieve:YMD)) and ((./retrieve:YMD - ./load:YMD) < 5))");
+   vec.push_back("((./a:YMD - ./b:YMD) < 5)");
+
+   for(size_t i = 0; i < vec.size(); i++) {
+
+      PartExpression part(vec[i]);
+      string parseErrorMsg;
+      std::auto_ptr<AstTop> ast = part.parseExpressions( parseErrorMsg );
+      BOOST_REQUIRE_MESSAGE(ast.get(),"Failed to parse " << vec[i] << "  " << parseErrorMsg);
+
+      std::stringstream s2;
+      ast->print_flat(s2,true/*add_brackets*/);
+      std::string ast_expr = s2.str();
+      BOOST_CHECK_MESSAGE(vec[i]==ast_expr," Failed '" << vec[i] << "' != '" << ast_expr << "'" );
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_parser_good_expressions )
+{
+    std::cout <<  "ANode:: ...test_parser_good_expressions\n";
+
+	// The map key  = trigger expression,
+    // value.first  = type of the expected root abstract syntax tree
+    // value.second = result of expected evaluation
+	map<string,std::pair<string,bool> > exprMap;
+
+   exprMap["a:value == 0"] = std::make_pair(AstEqual::stype(),true);
+   exprMap["a:value == 10"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["a:value eq 10"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["a:value != 10"] = std::make_pair(AstNotEqual::stype(),true);
+   exprMap["a:value ne 10"] = std::make_pair(AstNotEqual::stype(),true);
+   exprMap["a:value > 10"] = std::make_pair(AstGreaterThan::stype(),false);
+   exprMap["a:value gt 10"] = std::make_pair(AstGreaterThan::stype(),false);
+   exprMap["a:value >= 10"] = std::make_pair(AstGreaterEqual::stype(),false);
+   exprMap["a:value ge 10"] = std::make_pair(AstGreaterEqual::stype(),false);
+ 	exprMap["a:value < 10"] = std::make_pair(AstLessThan::stype(),true);
+   exprMap["a:value lt 10"] = std::make_pair(AstLessThan::stype(),true);
+   exprMap["a:value <= 10"] = std::make_pair(AstLessEqual::stype(),true);
+   exprMap["a:value le 10"] = std::make_pair(AstLessEqual::stype(),true);
+
+   exprMap["0 == a:value"] = std::make_pair(AstEqual::stype(),true);
+   exprMap["10 == a:value"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["10 eq a:value"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["10 != a:value"] = std::make_pair(AstNotEqual::stype(),true);
+   exprMap["10 ne a:value"] = std::make_pair(AstNotEqual::stype(),true);
+   exprMap["10 > a:value"] = std::make_pair(AstGreaterThan::stype(),true);
+   exprMap["10 gt a:value"] = std::make_pair(AstGreaterThan::stype(),true);
+   exprMap["10 >= a:value"] = std::make_pair(AstGreaterEqual::stype(),true);
+   exprMap["10 < a:value"] = std::make_pair(AstLessThan::stype(),false);
+   exprMap["10 lt a:value"] = std::make_pair(AstLessThan::stype(),false);
+   exprMap["10 <= a:value"] = std::make_pair(AstLessEqual::stype(),false);
+   exprMap["10 le a:value"] = std::make_pair(AstLessEqual::stype(),false);
+
+	exprMap["a == complete"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["a==complete"]   = std::make_pair(AstEqual::stype(),false);
+	exprMap["a eq complete"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["a ne complete"] = std::make_pair(AstNotEqual::stype(),true);
+
+   exprMap["0 eq 1"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["1000 eq 9"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["10 eq 10"] = std::make_pair(AstEqual::stype(),true);
+   exprMap["10 ge 4"] = std::make_pair(AstGreaterEqual::stype(),true);
+   exprMap["10 le 4"] = std::make_pair(AstLessEqual::stype(),false);
+
+   exprMap["0 == 1"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["0 != 1"] = std::make_pair(AstNotEqual::stype(),true);
+   exprMap["0 < 1"] = std::make_pair(AstLessThan::stype(),true);
+   exprMap["10 < 1"] = std::make_pair(AstLessThan::stype(),false);
+   exprMap["1000 == 9"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["10 == 10"] = std::make_pair(AstEqual::stype(),true);
+   exprMap["10 >= 4"] = std::make_pair(AstGreaterEqual::stype(),true);
+   exprMap["10 <= 4"] = std::make_pair(AstLessEqual::stype(),false);
+   exprMap["0 > 1"] = std::make_pair(AstGreaterThan::stype(),false);
+   exprMap["10 > 1"] = std::make_pair(AstGreaterThan::stype(),true);
+
+	exprMap["a:eventname"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["./a/b:eventname"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["/a/b:eventname"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["../a/b:eventname == set"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["../a/b:eventname == clear"] = std::make_pair(AstEqual::stype(),true);
+	exprMap["../a/b:eventname != clear"] = std::make_pair(AstNotEqual::stype(),false);
+   exprMap["a:eventname == set"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["a:eventname != set"] = std::make_pair(AstNotEqual::stype(),true);
+   exprMap["a:eventname == clear"] = std::make_pair(AstEqual::stype(),true);
+
+	exprMap["a:metername >= 100"] = std::make_pair(AstGreaterEqual::stype(),false);
+	exprMap["b:metername le 100"] = std::make_pair(AstLessEqual::stype(),true);
+	exprMap["./b:metername <= 100"] = std::make_pair(AstLessEqual::stype(),true);
+	exprMap["../a/b:metername ge 100"] = std::make_pair(AstGreaterEqual::stype(),false);
+	exprMap["../a/b/c:metername >= 100"] = std::make_pair(AstGreaterEqual::stype(),false);
+
+	exprMap["./a == unknown"] = std::make_pair(AstEqual::stype(),true);
+	exprMap["./a/b != queued"] = std::make_pair(AstNotEqual::stype(),true);
+	exprMap["../a == complete"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["../a/b == aborted"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["../a/b/c != aborted"] = std::make_pair(AstNotEqual::stype(),true);
+
+	exprMap["a eq unknown and b ne complete"] = std::make_pair(AstAnd::stype(),true);
+	exprMap["a eq complete or b eq complete"] = std::make_pair(AstOr::stype(),false);
+	exprMap["a eq complete or b eq unknown"] = std::make_pair(AstOr::stype(),true);
+	exprMap["a eq complete and b eq complete"] = std::make_pair(AstAnd::stype(),false);
+	exprMap["(a eq complete and b == complete)"] = std::make_pair(AstAnd::stype(),false);
+
+   exprMap["a == unknown && b != complete"] = std::make_pair(AstAnd::stype(),true);
+   exprMap["a == complete || b == complete"] = std::make_pair(AstOr::stype(),false);
+   exprMap["a == complete || b == unknown"] = std::make_pair(AstOr::stype(),true);
+   exprMap["a eq complete && b eq complete"] = std::make_pair(AstAnd::stype(),false);
+   exprMap["(a == complete && b == complete)"] = std::make_pair(AstAnd::stype(),false);
+
+	// This should be interpreted as '(a == complete and b == complete) or c == complete'
+	// because 'and' has a higher priority than the 'or'. Hence 'OR' must be at the root.
+   exprMap["a == complete and b == complete or c == complete"] = std::make_pair(AstOr::stype(),false);
+   exprMap["a == complete &&  b == complete || c == complete"] = std::make_pair(AstOr::stype(),false);
+	exprMap["a == complete and b == complete or c == unknown"] = std::make_pair(AstOr::stype(),true);
+	exprMap["a == complete and (b == complete or c == complete)"] = std::make_pair(AstAnd::stype(),false);
+	exprMap["a == complete or b == complete and c == complete"] = std::make_pair(AstOr::stype(),false);
+	exprMap["((a == complete or b == complete)) and c == complete"] = std::make_pair(AstAnd::stype(),false);
+
+	exprMap["(a != aborted and b == unknown or c != queued)"] = std::make_pair(AstOr::stype(),true);
+ 	exprMap["(a == complete and b == complete) or nodepath:eventname"] = std::make_pair(AstOr::stype(),false);
+	exprMap["(a == complete and b == complete) or (a == complete and b == complete)"] = std::make_pair(AstOr::stype(),false);
+	exprMap["a == complete and (b == complete or a == complete) and b == complete"] = std::make_pair(AstAnd::stype(),false);
+
+	// Expression that initially fail to parse for the operational suites
+   exprMap["(/skull/consumer/admin/leader:1 and (0 le /skull/consumer/produce1/produce:STEP)) or (not /skull/consumer/admin/leader:1)"] = std::make_pair(AstOr::stype(),true);
+	exprMap["./pdb eq complete and  (  not ../../../prod2diss/operation_is_late:yes or ../000/q2diss eq complete)"] = std::make_pair(AstAnd::stype(),false);
+   exprMap["! ../../../prod2diss//operation_is_late:yes"] = std::make_pair(AstNot::stype(),true);
+ 	exprMap["not ../../../prod2diss//operation_is_late:yes"] = std::make_pair(AstNot::stype(),true);
+ 	exprMap["not ../../../prod2diss/operation_is_late:yes"] = std::make_pair(AstNot::stype(),true);
+ 	exprMap["not ../../../prod2diss/operation_is_late:yes or a == complete "] = std::make_pair(AstOr::stype(),true);
+	exprMap["not ../../../prod2diss/operation_is_late:yes or not a == complete "] = std::make_pair(AstOr::stype(),true);
+ 	exprMap["not ( a == complete )"] = std::make_pair(AstNot::stype(),true);
+ 	exprMap["not ( a == unknown )"] = std::make_pair(AstNot::stype(),false);
+   exprMap["~ ( a == unknown )"] = std::make_pair(AstNot::stype(),false);
+   exprMap["~ ( a != unknown )"] = std::make_pair(AstNot::stype(),true);
+   exprMap["! ( a == unknown )"] = std::make_pair(AstNot::stype(),false);
+   exprMap["!( a == unknown )"] = std::make_pair(AstNot::stype(),false);
+ 	exprMap["inigroup:YMD eq ~ 1"] = std::make_pair(AstEqual::stype(),true);
+   exprMap["inigroup:YMD eq ~ 0"] = std::make_pair(AstEqual::stype(),false);
+   exprMap["inigroup:YMD eq ! 0"] = std::make_pair(AstEqual::stype(),false);
+	exprMap["/net/main:YMD le /net/cleanplus1:YMD and 1"] = std::make_pair(AstAnd::stype(),true);
+
+ 	exprMap["bins/wamabs eq complete and links eq complete"] = std::make_pair(AstAnd::stype(),false);
+ 	exprMap["/mc/main:YMD le /mc/main/ref:MC_STOP"] = std::make_pair(AstLessEqual::stype(),true);
+ 	exprMap["/mc//main:YMD le /mc/main//ref:MC_STOP"] = std::make_pair(AstLessEqual::stype(),true);
+ 	exprMap["(  ( /o/main/12/an/slwet eq complete and  ( /o/main/12/an/4dvar/ifstraj:finalwave or /o/main/12/an/4dvar eq complete)) or /o/main/12/an eq complete)"] = std::make_pair(AstOr::stype(),false);
+	exprMap["../../sv/getsvs eq complete and  ( getae:1 or getae eq complete)"] = std::make_pair(AstAnd::stype(),false);
+	exprMap["(  ( /o/lag:YMD gt /sync/o/o/lag:YMD) or  ( /o/main:YMD gt /sync/o/o/main:YMD) or 1 eq 0) and /sync/o ne active and /sync/o ne submitted"] = std::make_pair(AstAnd::stype(),false);
+
+
+ 	exprMap["t:step + 20 le 19"] = std::make_pair(AstLessEqual::stype(),false);
+ 	exprMap["(t:step + 20) le 19"] = std::make_pair(AstLessEqual::stype(),false);
+ 	exprMap["t:step + 20 ge 120"] = std::make_pair(AstGreaterEqual::stype(),false);
+ 	exprMap["t:step - 20 ge 120"] = std::make_pair(AstGreaterEqual::stype(),false);
+ 	exprMap["t:step + 20 ge t:step1 - 20"] = std::make_pair(AstGreaterEqual::stype(),true);
+ 	exprMap["(t:step + 20) ge (t:step1 - 20)"] = std::make_pair(AstGreaterEqual::stype(),true);
+
+ 	// Note: t:step will evaluate to 0,  0 % number  == 0, however 20 % 0 is a runtime error, same as divide by zero
+   exprMap["t:step % 20 < 19"] = std::make_pair(AstLessThan::stype(),true);
+   exprMap["t:step % 10 == 0"] = std::make_pair(AstEqual::stype(),true);
+   exprMap["t:step % 20 ge 19"] = std::make_pair(AstGreaterEqual::stype(),false);
+   exprMap["(t:step % 20) ge 19"] = std::make_pair(AstGreaterEqual::stype(),false);
+   exprMap["t:step % 20 ge 120"] = std::make_pair(AstGreaterEqual::stype(),false);
+   exprMap["t:step % 20 ge 120"] = std::make_pair(AstGreaterEqual::stype(),false);
+   exprMap["t:step % 20 ge t:step1 - 20"] = std::make_pair(AstGreaterEqual::stype(),true);
+   exprMap["(t:step % 20) ge (t:step1 - 20)"] = std::make_pair(AstGreaterEqual::stype(),true);
+   exprMap["(t:step % 20) == (t:step1 % 10)"] = std::make_pair(AstEqual::stype(),true);
+
+ 	exprMap["( obs:YMD le  ( main:YMD + 1)) and ../make/setup eq complete and  ( obs:YMD le /o/lag:YMD)"] = std::make_pair(AstAnd::stype(),false);
+ 	exprMap["( stage eq complete or ./stage:YMD gt ./retrieve:YMD) and ( ./retrieve:YMD - ./load:YMD lt 5)"] = std::make_pair(AstAnd::stype(),false);
+ 	exprMap["./a:YMD - ./b:YMD lt 5"] = std::make_pair(AstLessThan::stype(),true);
+
+
+ 	std::pair<string, std::pair<string,bool> > p;
+	BOOST_FOREACH(p, exprMap ) {
+
+	   ExprParser theExprParser(p.first);
+		std::string errorMsg;
+		bool ok = theExprParser.doParse(errorMsg);
+		BOOST_REQUIRE_MESSAGE(ok,errorMsg);
+
+		string expectedRootType       = p.second.first;
+		bool expectedEvaluationResult = p.second.second;
+
+		Ast* top = theExprParser.getAst();
+		BOOST_REQUIRE_MESSAGE( top ,"No abstract syntax tree");
+ 		BOOST_CHECK_MESSAGE( top->left() ,"No root created");
+ 		BOOST_CHECK_MESSAGE( top->left()->isRoot() ,"First child of top should be a root");
+ 		BOOST_CHECK_MESSAGE( top->left()->type() == expectedRootType,"expected root type " << expectedRootType << " but found " << top->left()->type());
+ 		BOOST_CHECK_MESSAGE( expectedEvaluationResult == top->evaluate(),"evaluation not as expected for " << *top);
+
+ 		std::string error_msg;
+      BOOST_CHECK_MESSAGE(  top->check(error_msg),error_msg << ":  Check failed for " << *top);
+	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_trigger_expression_divide_by_zero )
+{
+   std::cout <<  "ANode:: ...test_trigger_expression_divide_by_zero\n";
+
+   // The map key  = trigger expression,
+   // value.first  = type of the expected root abstract syntax tree
+   // value.second = result of expected evaluation
+   map<string,std::pair<string,bool> > exprMap;
+
+   // Divide by zero or modulo by zero would lead to run-time crash
+   // However the Ast::evaluate() checks for this, and return zero for the whole expression i.e ./a:YMD % 0 returns 0
+   exprMap["./a:YMD % 0 == 0"] = std::make_pair(AstEqual::stype(),true);
+   exprMap["./a:YMD / 0 == 0"] = std::make_pair(AstEqual::stype(),true);
+
+
+   std::pair<string, std::pair<string,bool> > p;
+   BOOST_FOREACH(p, exprMap ) {
+
+      ExprParser theExprParser(p.first);
+      std::string errorMsg;
+      bool ok = theExprParser.doParse(errorMsg);
+      BOOST_REQUIRE_MESSAGE(ok,errorMsg);
+
+      string expectedRootType       = p.second.first;
+      bool expectedEvaluationResult = p.second.second;
+
+      Ast* top = theExprParser.getAst();
+      BOOST_REQUIRE_MESSAGE( top ,"No abstract syntax tree");
+      BOOST_CHECK_MESSAGE( top->left() ,"No root created");
+      BOOST_CHECK_MESSAGE( top->left()->isRoot() ,"First child of top should be a root");
+      BOOST_CHECK_MESSAGE( top->left()->type() == expectedRootType,"expected root type " << expectedRootType << " but found " << top->left()->type());
+      BOOST_CHECK_MESSAGE( expectedEvaluationResult == top->evaluate(),"evaluation not as expected for " << *top);
+
+      // expect check to fail, due to divide/modulo by zero
+      std::string error_msg;
+      BOOST_CHECK_MESSAGE( !top->check(error_msg),error_msg << ":  Check failed for " << *top);
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_parser_bad_expressions )
+{
+    std::cout <<  "ANode:: ...test_parser_bad_expressions\n";
+	vector<string> exprvec;
+   exprvec.push_back("a = complete");
+   exprvec.push_back("a e complete");
+   exprvec.push_back("a=complete");
+   exprvec.push_back("a ! complete");
+   exprvec.push_back("a==complet e");
+   exprvec.push_back("a eq complet e");
+	exprvec.push_back("a::eventname");
+	exprvec.push_back("a:eventname =  set");
+	exprvec.push_back("a:eventname == ");
+   exprvec.push_back("a:eventname !  set");
+   exprvec.push_back("a:eventname ! = set");
+   exprvec.push_back("a:eventname %");
+ 	exprvec.push_back("a:metername  100");
+   exprvec.push_back(". == complete");
+   exprvec.push_back("/ == complete");
+   exprvec.push_back(". == error");
+   exprvec.push_back("./ == error");
+   exprvec.push_back(".a == error");
+   exprvec.push_back(".a == unknown");
+   exprvec.push_back(".a/. == unknown");
+   exprvec.push_back(".. == unknown");
+	exprvec.push_back(".a/b == queued");
+	exprvec.push_back("./a/b/ == active");
+   exprvec.push_back("..a == complete");
+   exprvec.push_back(".../a == complete");
+   exprvec.push_back("../.../a == complete");
+   exprvec.push_back(".. /a == complete");
+   exprvec.push_back("../.. /a == complete");
+   exprvec.push_back("../../.a == complete");
+	exprvec.push_back("..a/b == aborted");
+	exprvec.push_back("..a/b/c == aborted");
+   exprvec.push_back("a == complete and");
+   exprvec.push_back("a %");
+	exprvec.push_back("(a == complete   b == complete)");
+	exprvec.push_back("a == complete and  b == complete)");
+	exprvec.push_back("(a == complete and  b == complete");
+	exprvec.push_back("(a = complete and b = complete or c = complete)");
+	exprvec.push_back("(a erro complete and b == complete) or nodepath:eventname");
+	exprvec.push_back("(a == complete and b == complete or (a == complete and b == complete)");
+    // triggers that dont make sense in the operational suites.
+	exprvec.push_back("../../../legA/fc/pf/01 eq complete eq complete");
+
+	BOOST_FOREACH(const string& expr, exprvec ) {
+
+		//std::cout << "parsing expression " << expr << "\n";
+		ExprParser theExprParser(expr);
+		std::string errorMsg;
+ 		BOOST_CHECK_MESSAGE( !theExprParser.doParse( errorMsg), expr << " expected to fail " );
+ 	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANode/test/TestExprRepeatDateArithmetic.cpp b/ecflow_4_0_7/ANode/test/TestExprRepeatDateArithmetic.cpp
new file mode 100644
index 0000000..f7aab10
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestExprRepeatDateArithmetic.cpp
@@ -0,0 +1,216 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_repeat_data_arithmetic )
+{
+   cout << "ANode:: ...test_repeat_data_arithmetic\n" ;
+
+   Defs theDefs;
+   task_ptr t2,t1;
+   {
+      suite_ptr s1 = theDefs.add_suite("s1");
+      t1 = s1->add_task("t1"); t1->addRepeat( RepeatDate("YMD",20090101,20091231,1));
+      t2 = s1->add_task("t2"); t2->add_trigger("t1:YMD ge 20080601");
+   }
+   theDefs.beginAll();
+
+   // Check trigger expressions
+   std::string errorMsg, warningMsg;
+   BOOST_REQUIRE_MESSAGE(theDefs.check(errorMsg,warningMsg),"Expected triggers expressions to parse " << errorMsg);
+
+   // Get the trigger AST
+   Ast* trigger = t2->triggerAst();
+   BOOST_REQUIRE_MESSAGE(trigger,"Expected trigger");
+
+   // check evaluation
+   BOOST_CHECK_MESSAGE(trigger->evaluate(),"Expected trigger to evaluate i.e 20090101 >= 20080601");
+
+   // Check date arithmetic. Basics, end of months
+   t2->changeTrigger("t1:YMD - 1 eq 20081231");   // 20090101 - 1  == 20081231
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic for evaluation");
+
+   t2->changeTrigger("t1:YMD + 1 eq 20090102");   // 20090101 + 1  == 20090102
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic for evaluation");
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_data_arithmetic_add_to_end_of_month )
+{
+   cout << "ANode:: ...test_repeat_data_arithmetic_add_to_end_of_month\n" ;
+
+   Defs theDefs;
+   task_ptr t2,t1;
+   {
+      suite_ptr s1 = theDefs.add_suite("s1");
+      t1 = s1->add_task("t1"); t1->addRepeat( RepeatDate("YMD",20090101,20091231,1));
+      t2 = s1->add_task("t2"); t2->add_trigger("t1:YMD ge 20080601");
+   }
+   theDefs.beginAll();
+
+   // Check trigger expressions
+   std::string errorMsg, warningMsg;
+   BOOST_REQUIRE_MESSAGE(theDefs.check(errorMsg,warningMsg),"Expected triggers expressions to parse " << errorMsg);
+
+   // Check the end of each month + 1
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090131,20101231,1));   // jan
+   t2->changeTrigger("t1:YMD + 1 eq 20090201");   // 20090131 + 1  == 20090201
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090228,20101231,1));  // feb
+   t2->changeTrigger("t1:YMD + 1 eq 20090301");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090331,20101231,1)); // mar
+   t2->changeTrigger("t1:YMD + 1 eq 20090401");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090430,20101231,1)); // apr
+   t2->changeTrigger("t1:YMD + 1 eq 20090501");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090531,20101231,1)); // may
+   t2->changeTrigger("t1:YMD + 1 eq 20090601");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090630,20101231,1)); // June
+   t2->changeTrigger("t1:YMD + 1 eq 20090701");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090731,20101231,1)); // July
+   t2->changeTrigger("t1:YMD + 1 eq 20090801");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090831,20101231,1)); // Aug
+   t2->changeTrigger("t1:YMD + 1 eq 20090901");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090930,20101231,1)); // Sept
+   t2->changeTrigger("t1:YMD + 1 eq 20091001");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20091031,20101231,1)); // Oct
+   t2->changeTrigger("t1:YMD + 1 eq 20091101");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20091130,20101231,1)); // Nov
+   t2->changeTrigger("t1:YMD + 1 eq 20091201");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20091231,20101231,1)); // Dec
+   t2->changeTrigger("t1:YMD + 1 eq 20100101");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_data_arithmetic_take_from_end_of_month )
+{
+   cout << "ANode:: ...test_repeat_data_arithmetic_take_from_end_of_month\n" ;
+
+   Defs theDefs;
+   task_ptr t2,t1;
+   {
+      suite_ptr s1 = theDefs.add_suite("s1");
+      t1 = s1->add_task("t1"); t1->addRepeat( RepeatDate("YMD",20090101,20091231,1));
+      t2 = s1->add_task("t2"); t2->add_trigger("t1:YMD ge 20080601");
+   }
+   theDefs.beginAll();
+
+   // Check trigger expressions
+   std::string errorMsg, warningMsg;
+   BOOST_REQUIRE_MESSAGE(theDefs.check(errorMsg,warningMsg),"Expected triggers expressions to parse " << errorMsg);
+
+   // Check the end of each month - 1
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090201,20101231,1));   // jan
+   t2->changeTrigger("t1:YMD - 1 eq 20090131");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090301,20101231,1));  // feb
+   t2->changeTrigger("t1:YMD - 1 eq 20090228");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090401,20101231,1)); // mar
+   t2->changeTrigger("t1:YMD - 1 eq 20090331");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090501,20101231,1)); // apr
+   t2->changeTrigger("t1:YMD - 1 eq 20090430");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090601,20101231,1)); // may
+   t2->changeTrigger("t1:YMD - 1 eq 20090531");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090701,20101231,1)); // June
+   t2->changeTrigger("t1:YMD - 1 eq 20090630");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090801,20101231,1)); // July
+   t2->changeTrigger("t1:YMD - 1 eq 20090731");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20090901,20101231,1)); // Aug
+   t2->changeTrigger("t1:YMD - 1 eq 20090831");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20091001 ,20101231,1)); // Sept
+   t2->changeTrigger("t1:YMD - 1 eq 20090930");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20091101 ,20101231,1)); // Oct
+   t2->changeTrigger("t1:YMD - 1 eq 20091031");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20091201 ,20101231,1)); // Nov
+   t2->changeTrigger("t1:YMD - 1 eq 20091130");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+
+   t1->deleteRepeat();
+   t1->addRepeat( RepeatDate("YMD",20100101 ,20101231,1)); // Dec
+   t2->changeTrigger("t1:YMD - 1 eq 20091231");
+   BOOST_CHECK_MESSAGE(t2->triggerAst()->evaluate(),"Expected trigger to use date arithmetic");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestFindAbsNodePath.cpp b/ecflow_4_0_7/ANode/test/TestFindAbsNodePath.cpp
new file mode 100644
index 0000000..74c889f
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestFindAbsNodePath.cpp
@@ -0,0 +1,75 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+#include "PrintStyle.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_find_abs_node_path )
+{
+   cout << "ANode:: ...test_find_abs_node_path\n";
+
+   size_t no_of_nodes = 0;
+   size_t no_of_alias = 0;
+   Defs theDefs;
+   {
+      for(int s = 0; s < 3; s++) {
+         suite_ptr suite = theDefs.add_suite( "suite" + boost::lexical_cast<std::string>(s));  no_of_nodes++;
+         for(int f = 0; f < 3; f++) {
+            family_ptr fam = suite->add_family( "family" + boost::lexical_cast<std::string>(f));  no_of_nodes++;
+            for(int ff = 0; ff < 3; ff++) {
+                family_ptr hfam = fam->add_family( "family" + boost::lexical_cast<std::string>(ff));  no_of_nodes++;
+                for(int t = 0; t < 3; t++) {
+                   task_ptr task = hfam->add_task( "t1" + boost::lexical_cast<std::string>(t));  no_of_nodes++;
+                   for(int a = 0; a < 3; a++) {
+                      task->add_alias_only();  no_of_nodes++; no_of_alias++;
+                   }
+                }
+            }
+          }
+      }
+   }
+
+   // Test Defs::getAllNodes()
+   std::vector<Node*> all_nodes;
+   theDefs.getAllNodes(all_nodes);
+   BOOST_CHECK_MESSAGE(all_nodes.size() == no_of_nodes,"Expected theDefs.getAllNodes() to return " << no_of_nodes << " node, but found " << all_nodes.size());
+
+   // Test Defs::get_all_aliases()
+   std::vector<alias_ptr> alias_vec;
+   theDefs.get_all_aliases(alias_vec);
+   BOOST_CHECK_MESSAGE(alias_vec.size() == no_of_alias,"Expected theDefs.get_all_aliases() to return " << no_of_alias << " node, but found " << alias_vec.size());
+
+   // Test Defs::findAbsNode()
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   std::cout << theDefs;
+   for(size_t i= 0; i < all_nodes.size(); i++) {
+      Node* node = all_nodes[i];
+      node_ptr found_node = theDefs.findAbsNode(node->absNodePath());
+      BOOST_CHECK_MESSAGE(found_node.get(),"Could not find node " <<  node->debugNodePath());
+      BOOST_CHECK_MESSAGE(found_node.get() == node," Expected to find " <<  node->debugNodePath() << " but found " << found_node->debugNodePath());
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestFlag.cpp b/ecflow_4_0_7/ANode/test/TestFlag.cpp
new file mode 100644
index 0000000..69374a8
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestFlag.cpp
@@ -0,0 +1,75 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+
+#include "Flag.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_node_flags )
+{
+	cout << "ANode:: ...test_node_flags\n";
+
+	Flag flag;
+	std::string expected_flags = "force_aborted,user_edit,task_aborted,ecfcmd_failed,no_script,killed,migrated,late,message,by_rule,queue_limit,task_waiting,locked,zombie,no_reque";
+
+	/// Set the flags
+	std::vector<Flag::Type> flag_list =  Flag::list();
+	for (size_t i = 0; i < flag_list.size(); ++i) {
+	   flag.set( flag_list[i] );
+	   BOOST_REQUIRE_MESSAGE(flag.is_set( flag_list[i] ), "Expected flag to be set");
+	}
+   BOOST_REQUIRE_MESSAGE(flag.to_string() == expected_flags, "Expected string '" << expected_flags << "' but found '" << flag.to_string() << "'");
+	for (size_t i = 0; i < flag_list.size(); ++i) {
+	   BOOST_REQUIRE_MESSAGE(flag.is_set( flag_list[i] ), "Expected flag to be set");
+	}
+
+	/// clears the flags
+	for (size_t i = 0; i < flag_list.size(); ++i) {
+	   flag.clear( flag_list[i] );
+	   BOOST_REQUIRE_MESSAGE(!flag.is_set( flag_list[i] ), "Expected flag to be clear");
+	}
+	for (size_t i = 0; i < flag_list.size(); ++i) {
+	   BOOST_REQUIRE_MESSAGE(!flag.is_set( flag_list[i] ), "Expected flag to be clear");
+	}
+
+	/// set all flags
+ 	for (size_t i = 0; i < flag_list.size(); ++i) { flag.set( flag_list[i] );}
+
+	// reset, all flags should be clear
+	flag.reset();
+	for (size_t i = 0; i < flag_list.size(); ++i) {
+ 	 	BOOST_REQUIRE_MESSAGE(!flag.is_set( flag_list[i] ), "Expected flag to be clear");
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_node_flags_parsing )
+{
+   cout << "ANode:: ...test_node_flags_parsing\n";
+
+   /// Set the flags
+   Flag flag;
+   std::vector<Flag::Type> flag_list =  Flag::list();
+   for (size_t i = 0; i < flag_list.size(); ++i) flag.set( flag_list[i] );
+
+   Flag flag2;
+   flag2.set_flag(flag.to_string());
+   BOOST_REQUIRE_MESSAGE(flag == flag2, "Flags should be equal.\nflag1:" << flag.to_string() << "\nflag2:" << flag2.to_string());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestHistoryParser.cpp b/ecflow_4_0_7/ANode/test/TestHistoryParser.cpp
new file mode 100644
index 0000000..4e27c8a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestHistoryParser.cpp
@@ -0,0 +1,93 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Log.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+static std::string dump(const std::vector<std::string>& vec)
+{
+   std::stringstream ss;
+   std::copy (vec.begin(), vec.end(), std::ostream_iterator<std::string> (ss, "\n"));
+   return ss.str();
+}
+
+BOOST_AUTO_TEST_CASE( test_defs_history_parser )
+{
+   cout << "ACore:: ...test_defs_history_parser\n";
+
+   {
+      string str1("MSG:[12:03:55 21.8.2013] --shutdown=yes :map");
+      DefsHistoryParser parser;
+      parser.parse(str1);
+
+      std::vector<std::string> expected_messages;
+      expected_messages.push_back("MSG:[12:03:55 21.8.2013] --shutdown=yes :map");
+
+      BOOST_CHECK_MESSAGE(parser.parsed_messages() == expected_messages,"Expected:\n" <<  dump(expected_messages) << "but found:\n" << dump(parser.parsed_messages()));
+   }
+   {
+      string str1("MSG:[12:03:55 21.8.2013] --shutdown=yes :mapMSG:[12:34:08 21.8.2013] --restart :map");
+      DefsHistoryParser parser;
+      parser.parse(str1);
+
+      std::vector<std::string> expected_messages;
+      expected_messages.push_back("MSG:[12:03:55 21.8.2013] --shutdown=yes :map");
+      expected_messages.push_back("MSG:[12:34:08 21.8.2013] --restart :map");
+      BOOST_CHECK_MESSAGE(parser.parsed_messages() == expected_messages,"Expected:\n" <<  dump(expected_messages) << "but found:\n" << dump(parser.parsed_messages()));
+    }
+   {
+      string str1("MSG:[12:03:55 21.8.2013] --shutdown=yes :mapMSG:[12:34:08 21.8.2013] --restart :mapMSG:[12:47:22 21.8.2013] --alter add variable SMSNODE 0 /  :mapMSG:[13:38:45 21.8.2013] --alter add variable SMSTRYNO 0 /  :mapMSG:[13:44:09 21.8.2013] --alter add variable SMSHOME /vol/emos/output /  :mapMSG:[15:36:14 21.8.2013] --shutdown=yes :mapMSG:[16:04:26 21.8.2013] --alter add variable SMSNODE 0 /  :map");
+      DefsHistoryParser parser;
+      parser.parse(str1);
+
+      std::vector<std::string> expected_messages;
+      expected_messages.push_back("MSG:[12:03:55 21.8.2013] --shutdown=yes :map");
+      expected_messages.push_back("MSG:[12:34:08 21.8.2013] --restart :map");
+      expected_messages.push_back("MSG:[12:47:22 21.8.2013] --alter add variable SMSNODE 0 /  :map");
+      expected_messages.push_back("MSG:[13:38:45 21.8.2013] --alter add variable SMSTRYNO 0 /  :map");
+      expected_messages.push_back("MSG:[13:44:09 21.8.2013] --alter add variable SMSHOME /vol/emos/output /  :map");
+      expected_messages.push_back("MSG:[15:36:14 21.8.2013] --shutdown=yes :map");
+      expected_messages.push_back("MSG:[16:04:26 21.8.2013] --alter add variable SMSNODE 0 /  :map");
+      BOOST_CHECK_MESSAGE(parser.parsed_messages() == expected_messages,"Expected:\n" <<  dump(expected_messages) << "but found:\n" << dump(parser.parsed_messages()));
+    }
+   {
+      string str1("MSG:[12:03:55 21.8.2013] --shutdown=yes :mapLOG:[12:34:08 21.8.2013] --restart :mapERR:[12:47:22 21.8.2013] --alter add variable SMSNODE 0 /  :mapWAR:[13:38:45 21.8.2013] --alter add variable SMSTRYNO 0 /  :mapDBG:[13:44:09 21.8.2013] --alter add variable SMSHOME /vol/emos/output /  :mapOTH:[15:36:14 21.8.2013] --shutdown=yes :mapOTH:[16:04:26 21.8.2013] --alter add variable SMSNODE 0 /  :map");
+      DefsHistoryParser parser;
+      parser.parse(str1);
+
+      std::vector<std::string> expected_messages;
+      expected_messages.push_back("MSG:[12:03:55 21.8.2013] --shutdown=yes :map");
+      expected_messages.push_back("LOG:[12:34:08 21.8.2013] --restart :map");
+      expected_messages.push_back("ERR:[12:47:22 21.8.2013] --alter add variable SMSNODE 0 /  :map");
+      expected_messages.push_back("WAR:[13:38:45 21.8.2013] --alter add variable SMSTRYNO 0 /  :map");
+      expected_messages.push_back("DBG:[13:44:09 21.8.2013] --alter add variable SMSHOME /vol/emos/output /  :map");
+      expected_messages.push_back("OTH:[15:36:14 21.8.2013] --shutdown=yes :map");
+      expected_messages.push_back("OTH:[16:04:26 21.8.2013] --alter add variable SMSNODE 0 /  :map");
+      BOOST_CHECK_MESSAGE(parser.parsed_messages() == expected_messages,"Expected:\n" <<  dump(expected_messages) << "but found:\n" << dump(parser.parsed_messages()));
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestInLimit.cpp b/ecflow_4_0_7/ANode/test/TestInLimit.cpp
new file mode 100644
index 0000000..8d52932
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestInLimit.cpp
@@ -0,0 +1,76 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #1 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+
+#include "SerializationTest.hpp"
+#include "InLimit.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_inlimit_basics )
+{
+	cout << "ANode:: ...test_inlimit_basics \n";
+
+	{
+		InLimit empty;
+		InLimit empty2;
+		BOOST_CHECK_MESSAGE(empty == empty2,"Equality failed");
+
+		InLimit l1("name","path");
+		InLimit l2("name","path");
+ 		BOOST_CHECK_MESSAGE(l1 == l2,"Equality failed");
+
+ 		InLimit a("name","path",10);
+ 		InLimit b("name","path");
+ 		BOOST_CHECK_MESSAGE(!(a == b),"Equality passed when should fail");
+	}
+
+	InLimit inlim("fred","/path/to/node");
+	{
+		InLimit testCopy = inlim;
+		BOOST_CHECK_MESSAGE(testCopy == inlim,"Copy constructor failed");
+	}
+	{
+		InLimit testCopy;
+		testCopy = inlim;
+		BOOST_CHECK_MESSAGE(testCopy == inlim,"Assignment failed");
+	}
+}
+
+
+// Globals used throughout the test
+static std::string fileName = "test.txt";
+BOOST_AUTO_TEST_CASE( test_InLimit_serialisation )
+{
+    cout << "ANode:: ...test_InLimit_serialisation\n";
+
+    doSaveAndRestore<InLimit>(fileName);
+
+    InLimit saved("limitName","/path/to/some/node",20);
+    save(fileName,saved);
+
+    InLimit restored;      restore(fileName,restored);
+    BOOST_CHECK_MESSAGE(saved == restored," save and restored don't match");
+    std::remove(fileName.c_str());
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANode/test/TestJobCreator.cpp b/ecflow_4_0_7/ANode/test/TestJobCreator.cpp
new file mode 100644
index 0000000..8dbf55a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestJobCreator.cpp
@@ -0,0 +1,121 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "EcfFile.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "System.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_job_creator )
+{
+	cout << "ANode:: ...test_job_creator\n";
+
+	// SET SMSHOME
+   std::string ecf_home = File::test_data("ANode/test/data/SMSHOME","ANode");
+
+	// Create the defs file corresponding to the text below
+	//# Test the sms file can be found via ECF_SCRIPT
+	//# Note: we have to use relative paths, since these tests are relocatable
+	//#
+	//suite suite
+	//	edit SLEEPTIME 10
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//   	task t1
+	//   	task t2
+	//    	task t3
+	//  	endfamily
+	//endsuite
+	//#
+	//# This test suite should force a backwards search since the sms files
+	//# are located in SMSHOME
+	//suite suite1
+	//    family family
+	//   		task suite1_task1
+	//   		task suite1_task2
+	//    	    task suite1_task3
+	//    endfamily
+	//endsuite
+	// Create a defs file, where the task name mirrors the sms files in the given directory
+ 	Defs theDefs;
+ 	{
+		suite_ptr suite = Suite::create( "suite"  );
+ 		family_ptr fam =   Family::create( "family"  );
+		suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/../includes" ) );
+ 		suite->addVariable( Variable( "SLEEPTIME", "1" ) );
+		suite->addVariable( Variable( "ECF_CLIENT_EXE_PATH",  "a/made/up/path" ) );
+ 		fam->addTask( Task::create( "t1" )  );
+		fam->addTask( Task::create( "t2" )  );
+		fam->addTask( Task::create( "t3" )  );
+		suite->addFamily( fam );
+		theDefs.addSuite( suite );
+ 	}
+ 	{
+		suite_ptr suite1( new Suite( "suite1" ) );
+ 		family_ptr fam( new Family( "family" ) );
+		fam->addTask( Task::create( "suite1_task1" )  );
+		fam->addTask( Task::create( "suite1_task2" )  );
+		fam->addTask( Task::create( "suite1_task3" )  );
+		suite1->addFamily( fam );
+		theDefs.addSuite( suite1 );
+ 	}
+// 	cerr << theDefs << "\n";
+
+	// get all the task, assume non hierarchical families
+	std::vector<Task*> theTasks;
+	theDefs.getAllTasks(theTasks);
+	BOOST_REQUIRE_MESSAGE(theTasks.size() == 6, "Expected 6 tasks but found, " << theTasks.size());
+
+
+	// Override ECF_HOME.   ECF_HOME is need to locate to the .ecf files
+	theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+
+	/// begin , will cause creation of generated variables. The generated variables
+	/// are use in client scripts and used to locate the ecf files
+	theDefs.beginAll();
+
+	// Test Job creator. The job creation should succeed 3 times only, since
+	// the sms file suite1_task1, suite1_task2,suite1_task3 are empty.
+  	JobsParam jobsParam(true/*create jobs*/); // spawn_jobs = false
+  	Jobs jobs(&theDefs);
+  	jobs.generate(jobsParam);
+	BOOST_REQUIRE_MESSAGE( jobsParam.submitted().size() == 3 , "expected 3 jobs but found " << jobsParam.submitted().size() << "\n" << jobsParam.errorMsg());
+
+	// Expect error message complaining about sms file suite1_task1, suite1_task2,suite1_task3 being empty
+	BOOST_REQUIRE_MESSAGE( !jobsParam.errorMsg().empty(), "expected error message about empty ecf files");
+
+	/// Destroy System singleton to avoid valgrind from complaining
+	System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestJobProfiler.cpp b/ecflow_4_0_7/ANode/test/TestJobProfiler.cpp
new file mode 100644
index 0000000..136aa29
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestJobProfiler.cpp
@@ -0,0 +1,89 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+#include "Log.hpp"
+#include "Jobs.hpp"
+#include "JobsParam.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_job_profiler )
+{
+   cout << "ANode:: ...test_job_profiler\n";
+
+   // delete the log file if it exists.
+   std::string log_path = File::test_data("ANode/test/logfile.txt","ANode");
+   fs::remove(log_path);
+   BOOST_CHECK_MESSAGE(!fs::exists( log_path ), "log file " << log_path << " not deleted ");
+
+   // Create a new log, file, we will look in here to see if job profiling is working
+   Log::create(log_path);
+
+
+   // SET ECF_HOME, re-use exist test of directory and scripts
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("suite");
+      suite->addVariable( Variable( Str::ECF_INCLUDE(), File::test_data("ANode/test/data/includes","ANode") ) );
+      suite->addVariable( Variable( "ECF_HOME",         File::test_data("ANode/test/data/SMSHOME","ANode") ) );
+      suite->addVariable( Variable( "SLEEPTIME", "10" ) );
+      family_ptr fam = suite->add_family( "family" );
+      fam->add_task( "t1" );
+   }
+   // cerr << theDefs << "\n";
+
+   // begin , will cause creation of generated variables. The generated variables
+   // are use in client scripts and used to locate the ecf files
+   theDefs.beginAll();
+
+   // By setting submitJobsInterval to -1, we enable the jobs profiling testing
+   // createJobs enables us to ensure job size is profiled
+   // spawn jobs set to false, do not create a separate process to spawn jobs
+   JobsParam jobParam(-1 /*submitJobsInterval*/, true /*createJobs*/, false/* spawn jobs */);
+   Jobs job(&theDefs);
+   bool ok = job.generate( jobParam );
+   BOOST_CHECK_MESSAGE(ok,"generate failed: " << jobParam.getErrorMsg());
+
+   // Check the log file, has the profiling
+   std::string log_file_contents;
+   BOOST_CHECK_MESSAGE(File::open(log_path,log_file_contents), "Could not open log file at " << log_path);
+   BOOST_CHECK_MESSAGE(!log_file_contents.empty(),"log file is is empty ?");
+   BOOST_CHECK_MESSAGE(log_file_contents.find("Exceeds ECF_TASK_THRESHOLD") != std::string::npos, "Exceeds ECF_TASK_THRESHOLD  not in profile");
+
+   // Remove the log file. Comment out for debugging
+   fs::remove(log_path);
+
+   // Explicitly destroy log. To keep valgrind happy
+   Log::destroy();
+
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestLimit.cpp b/ecflow_4_0_7/ANode/test/TestLimit.cpp
new file mode 100644
index 0000000..35a9c9b
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestLimit.cpp
@@ -0,0 +1,157 @@
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #1 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include "SerializationTest.hpp"
+
+#include "Limit.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_limit_basics )
+{
+	cout << "ANode:: ...test_limit_basics \n";
+
+	{
+		Limit empty;
+		Limit empty2;
+		BOOST_CHECK_MESSAGE(empty == empty2,"Equality failed");
+
+		Limit l1("name",2);
+		Limit l2("name",2);
+ 		BOOST_CHECK_MESSAGE(l1 == l2,"Equality failed");
+
+		Limit l3("name",2);
+		Limit l4("name",4);
+ 		BOOST_CHECK_MESSAGE(!(l3 == l4),"Equality failed");
+	}
+
+	std::set<std::string> expected_empty_paths;
+	std::set<std::string> expected_paths;
+
+	Limit l1("name",100);
+	for(int i = 1; i < 10; i++) {
+		std::string path = boost::lexical_cast<std::string>(i);
+		expected_paths.insert(path);
+		l1.increment(1,path);
+		BOOST_CHECK_MESSAGE(l1.paths() == expected_paths,"Expected paths not the same at " << i);
+	}
+
+	for(int i = 9; i >= 1; i--) {
+	   std::string path = boost::lexical_cast<std::string>(i);
+		l1.decrement(1,path);
+		std::set<std::string>::iterator iter = expected_paths.find(path); expected_paths.erase(iter);
+
+ 		if (l1.paths() != expected_paths) {
+ 			std::cout << " Expected:";
+ 			std::copy (expected_paths.begin(), expected_paths.end(), std::ostream_iterator <std::string> (std::cout, " "));
+ 			std::cout << "    Found:";
+         std::copy (l1.paths().begin(), l1.paths().end(), std::ostream_iterator <std::string> (std::cout, " "));
+ 		}
+ 		BOOST_CHECK_MESSAGE(l1.paths() == expected_paths,"Expected paths not the same at " << i);
+	}
+
+	expected_paths.insert("/a/b/c");
+	l1.increment(1,"/a/b/c");
+	BOOST_CHECK_MESSAGE(l1.paths() == expected_paths,"Expected paths not the same");
+
+	l1.decrement(1,"/a/b/c");
+	BOOST_CHECK_MESSAGE(l1.paths() == expected_empty_paths,"Expected paths not the same");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_limit_increment )
+{
+   cout << "ANode:: ...test_limit_increment\n";
+
+   Limit limit("name",10);     // Limit of 10
+   limit.increment(1,"path");  // consume 1 token
+
+   BOOST_CHECK_MESSAGE(limit.value() == 1,"Expected increment to consume 1 token but it has consumed " << limit.value());
+   BOOST_CHECK_MESSAGE(limit.paths().size() == 1,"Expected 1 task path but found " << limit.paths().size());
+
+   limit.increment(1,"path");  // Increment with same path, should *NOT* consume a token
+
+   BOOST_CHECK_MESSAGE(limit.value() == 1,"Expected 1 token but it has consumed " << limit.value());
+   BOOST_CHECK_MESSAGE(limit.paths().size() == 1,"Expected 1 task path but found " << limit.paths().size());
+}
+
+BOOST_AUTO_TEST_CASE( test_limit_decrement )
+{
+   cout << "ANode:: ...test_limit_decrement\n";
+
+   Ecf::set_server(true); // needed to test state_change_numbers
+
+   Limit limit("name",10);     // Limit of 10
+   unsigned int expected_state_change_no = limit.state_change_no();
+
+   limit.increment(1,"path"); expected_state_change_no++; // consume 1 token, should increment state change no
+   BOOST_CHECK_MESSAGE(limit.value() == 1,"Expected limit of value 1  but found " << limit.value());
+   BOOST_CHECK_MESSAGE(limit.paths().size() == 1,"Expected 1 task path but found " << limit.paths().size());
+   BOOST_CHECK_MESSAGE( limit.state_change_no() == expected_state_change_no,"Expected increment to increase state change no, expected " << expected_state_change_no << " but found " <<  limit.state_change_no());
+
+   // Since 'path_x' is NOT in the list of paths stored by the limit, there should be NO change to state_change_no
+   limit.decrement(1,"path_x");
+   BOOST_CHECK_MESSAGE(limit.value() == 1," decrement of path that does not exist, should not affect the Limit: Expected limit of value 1  but found " << limit.value());
+   BOOST_CHECK_MESSAGE(limit.paths().size() == 1," decrement of path that does not exist, should not affect the Limit : Expected 1 task path but found " << limit.paths().size());
+   BOOST_CHECK_MESSAGE( limit.state_change_no() == expected_state_change_no,"Expected no change in state change no, expected " << expected_state_change_no << " but found " <<  limit.state_change_no());
+
+   // Multiple decrements should leave Limit of value = 0, and not a negative number
+   limit.decrement(1,"path"); expected_state_change_no++;
+   BOOST_CHECK_MESSAGE( limit.state_change_no() == expected_state_change_no,"Expected decrement to increase state change no, expected " << expected_state_change_no << " but found " <<  limit.state_change_no());
+
+   // Since we have removed 'path' from the limit expect no further state changes
+   limit.decrement(1,"path");
+   limit.decrement(1,"path");
+   limit.decrement(1,"path");
+   BOOST_CHECK_MESSAGE(limit.value() == 0,"Expected limit of value 0  but found " << limit.value());
+   BOOST_CHECK_MESSAGE(limit.paths().size() == 0,"Expected no task paths but found " << limit.paths().size());
+   BOOST_CHECK_MESSAGE( limit.state_change_no() == expected_state_change_no,"Expected no change to state change no, expected " << expected_state_change_no << " but found " <<  limit.state_change_no());
+
+   Ecf::set_server(false); // needed to test state_change_numbers
+}
+
+
+// Globals used throughout the test
+static std::string fileName = "testLimit.txt";
+BOOST_AUTO_TEST_CASE( test_LimitDefaultConstructor_serialisation )
+{
+   cout << "ANode:: ...test_LimitDefaultConstructor_serialisation \n";
+
+   doSaveAndRestore<Limit>(fileName);
+}
+
+BOOST_AUTO_TEST_CASE( test_Limit_serialisation )
+{
+   cout << "ANode:: ...test_Limit_serialisation\n";
+   Limit saved1("limitName",100 );
+   doSaveAndRestore(fileName,saved1);
+
+   std::set<std::string> paths; paths.insert("path1"); paths.insert("path2");
+   Limit saved2("limitName",100,10,paths );
+   doSaveAndRestore(fileName,saved2);
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANode/test/TestMigration.cpp b/ecflow_4_0_7/ANode/test/TestMigration.cpp
new file mode 100644
index 0000000..89179d7
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestMigration.cpp
@@ -0,0 +1,113 @@
+#if defined(TEXT_ARCHIVE) || !defined(BINARY_ARCHIVE) && !defined(PORTABLE_BINARY_ARCHIVE) && !defined(EOS_PORTABLE_BINARY_ARCHIVE)
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/test/unit_test.hpp>
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+#include "Ecf.hpp"
+#include "SerializationTest.hpp"
+#include "MyDefsFixture.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+namespace fs = boost::filesystem;
+
+// If you are updating the tests, *MAKE SURE* to check out test/data/migration/* files
+//#define UPDATE_TESTS 1
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+//
+// These test are used for future release. They help to ensure that we have
+// backward compatibility.i.e future release can open file, created by an earlier release
+//
+BOOST_AUTO_TEST_CASE( test_migration_restore_def_con_3_0_1 )
+{
+   cout << "ANode:: ...test_migration_restore_def_con_3_0_1\n";
+
+   std::string file_name = File::test_data("ANode/test/data/migration/default_constructor/","ANode");
+
+   // Create migration data
+   Defs defs;
+   Suite suite;
+   Family family;
+   Task   task;
+
+   // Remove host dependent variables from server state, so that we can run on other platforms
+   defs.set_server().delete_server_variable("ECF_LOG");
+   defs.set_server().delete_server_variable("ECF_CHECK");
+   defs.set_server().delete_server_variable("ECF_CHECKOLD");
+
+   // We use .def extension so that we copy over writable files with extension .def to
+   // other platforms during incremental build's
+#ifdef UPDATE_TESTS
+   // remember to check out data
+   doSave(file_name + "Defs.def",defs);
+   doSave(file_name + "Suite.def",suite);
+   doSave(file_name + "Family.def",family);
+   doSave(file_name + "Task.def",task);
+   doSave(file_name + "Limit.def",Limit());
+#else
+   Ecf::set_debug_equality(true);
+   do_restore<Defs>(file_name + "Defs.def",defs);
+   do_restore<Suite>(file_name + "Suite.def",suite);
+   do_restore<Family>(file_name + "Family.def",family);
+   do_restore<Task>(file_name + "Task.def",task);
+   do_restore<Limit>(file_name + "Limit.def",Limit());
+   Ecf::set_debug_equality(false);
+#endif
+}
+
+//#define UPDATE_TESTS 1
+
+BOOST_AUTO_TEST_CASE( test_migration_restore_boost_1_47_checkpt_file )
+{
+   cout << "ANode:: ...test_migration_restore_boost_1_47_checkpt_file\n";
+
+   std::string file_name = File::test_data("ANode/test/data/migration/fixture/","ANode");
+
+   // Create migration data
+   // This will create a pre-built definition.
+   // If the definition is changed we will need to update this test.
+   // **Keep*** old checkpt test data, to ensure future ecflow versions can be migrated
+   // **Update** here for future boost updates
+   // **IF MyDefsFixture is changed, we need to ensure we can migrate it to future versions
+   MyDefsFixture fixture("boost_1_47.checkpt");
+
+   // Allow the test data, to be used on other platforms
+   fixture.remove_host_depedent_server_variables();
+
+#ifdef UPDATE_TESTS
+   // remember to check out data
+   doSave(file_name + "boost_1_47.checkpt",fixture.fixtureDefsFile());
+#else
+   Ecf::set_debug_equality(true);
+   do_restore<Defs>(file_name + "boost_1_47.checkpt",fixture.fixtureDefsFile());
+   Ecf::set_debug_equality(false);
+#endif
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
+
+#endif
diff --git a/ecflow_4_0_7/ANode/test/TestMissNextTimeSlot.cpp b/ecflow_4_0_7/ANode/test/TestMissNextTimeSlot.cpp
new file mode 100644
index 0000000..dfc71f0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestMissNextTimeSlot.cpp
@@ -0,0 +1,114 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_miss_next_time_slot )
+{
+   cout << "ANode:: ...test_miss_next_time_slot\n";
+
+   // Start TIME at 9:30
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user set of time slots. In this case the node should complete and then
+   // requee and miss the next time. If this is repeated, eventually we should reach the
+   // end of the time slot. In which case the node should *not* re-queue and stay complete
+   //
+   // When the node is then re-queued check that the time has been correctly reset.
+
+   //   suite s1
+   //       task t1
+   //          time 10:00
+   //          time 11:00
+   //          time 12:00
+   //          time 13:00
+   //   endsuite
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   task_ptr t1 = suite->add_task("t1");
+   t1->addTime( TimeAttr(10,0) );
+   t1->addTime( TimeAttr(11,0) );
+   t1->addTime( TimeAttr(12,0) );
+   t1->addTime( TimeAttr(13,0) );
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // *start* at 9:30
+   suite->addClock( clockAttr );
+
+   suite->begin();
+
+   // get all the time attributes
+   const TimeSeries& ts_10 = t1->timeVec()[0].time_series();
+   const TimeSeries& ts_11 = t1->timeVec()[1].time_series();
+   const TimeSeries& ts_12 = t1->timeVec()[2].time_series();
+   const TimeSeries& ts_13 = t1->timeVec()[3].time_series();
+   BOOST_CHECK_MESSAGE( ts_10.is_valid(),  "Expected time 10 to be valid since we started at 9:30 ");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid since we started at 9:30");
+
+   const TimeSlot& time_10 = t1->timeVec()[0].time_series().get_next_time_slot();
+   const TimeSlot& time_11 = t1->timeVec()[1].time_series().get_next_time_slot();
+   const TimeSlot& time_12 = t1->timeVec()[2].time_series().get_next_time_slot();
+   const TimeSlot& time_13 = t1->timeVec()[3].time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( time_10 == TimeSlot(10,0),"Expected next time slot of 10:00 but found " << time_10.toString());
+   BOOST_CHECK_MESSAGE( time_11 == TimeSlot(11,0),"Expected next time slot of 11:00 but found " << time_11.toString());
+   BOOST_CHECK_MESSAGE( time_12 == TimeSlot(12,0),"Expected next time slot of 12:00 but found " << time_12.toString());
+   BOOST_CHECK_MESSAGE( time_13 == TimeSlot(13,0),"Expected next time slot of 13:00 but found " << time_13.toString());
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   t1->miss_next_time_slot();
+   BOOST_CHECK_MESSAGE(t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set,");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid since we started at 9:30");
+
+   // Calling miss_next_time_slot again, should have *NO* effect, since its only takes affect when NO_REQUE_IF_SINGLE_TIME_DEP is clear
+   t1->miss_next_time_slot();
+   BOOST_CHECK_MESSAGE(t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set,");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid since we started at 9:30");
+
+   // Clear the flag and call miss_next_time_slot, this time an additional time slot should have expired
+   t1->flag().clear(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP);
+   t1->miss_next_time_slot();
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid since we started at 9:30");
+
+   // call twice more, to expire all time slots
+   t1->flag().clear(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP);
+   t1->miss_next_time_slot();
+   t1->flag().clear(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP);
+   t1->miss_next_time_slot();
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired");
+   BOOST_CHECK_MESSAGE( !ts_12.is_valid(), "Expected time 12 to be expired");
+   BOOST_CHECK_MESSAGE( !ts_13.is_valid(), "Expected time 13 to be expired");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestNodeBeginReque.cpp b/ecflow_4_0_7/ANode/test/TestNodeBeginReque.cpp
new file mode 100644
index 0000000..aaaf02d
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestNodeBeginReque.cpp
@@ -0,0 +1,75 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_node_begin_reque_hybrid )
+{
+   cout << "ANode:: ...test_node_begin_reque_hybrid\n";
+
+   // Create a suite with a *HYBRID* clock, and tasks with day,date and cron time attributes
+   defs_ptr the_defs = Defs::create();
+   suite_ptr s1 = the_defs->add_suite( "s1" ) ;
+   s1->addClock( ClockAttr(true) );
+   family_ptr f1  = s1->add_family( "f1" ) ;
+
+   CronAttr cron;
+   std::vector<int> week_days; week_days.push_back(0);  week_days.push_back(1);
+   cron.addWeekDays(week_days);
+   cron.add_time_series(10,10,true);
+
+   // For task t1 which has day attribute. For this test to succeed the day must not match today day.
+   // So that under the hybrid clock, its is set to complete
+   boost::gregorian::date todays_date = Calendar::second_clock_time().date();
+   int todays_day_as_number = todays_date.day_of_week().as_number();
+   int tommorrow = todays_day_as_number + 1;
+   if (tommorrow > 6) tommorrow = 0;
+
+   task_ptr t1 = f1->add_task("t1"); t1->addDay( DayAttr( DayAttr::Day_t(tommorrow) ));
+   task_ptr t2 = f1->add_task("t2"); t2->addDate( DateAttr(0,0,2014));
+   task_ptr t3 = f1->add_task("t3"); t3->addCron( cron );
+
+   // begin the suite, Under hybrid clock, nodes with day,date and cron attributes should be marked as complete
+   the_defs->beginAll();
+   BOOST_CHECK_MESSAGE(t1->state() == NState::COMPLETE,"Expected node to be complete");
+   BOOST_CHECK_MESSAGE(t2->state() == NState::COMPLETE,"Expected node to be complete");
+   BOOST_CHECK_MESSAGE(t3->state() == NState::COMPLETE,"Expected node to be complete");
+
+   // Change the node state, so that we can test re-queue
+   t1->set_state(NState::QUEUED);
+   t2->set_state(NState::QUEUED);
+   t3->set_state(NState::QUEUED);
+   BOOST_CHECK_MESSAGE(t1->state() == NState::QUEUED,"Expected node to be QUEUED");
+   BOOST_CHECK_MESSAGE(t2->state() == NState::QUEUED,"Expected node to be QUEUED");
+   BOOST_CHECK_MESSAGE(t3->state() == NState::QUEUED,"Expected node to be QUEUED");
+
+   // Now re-queue all and make sure re-queue also Under hybrid clock, nodes with day,date and cron
+   // attributes should be marked as complete
+   the_defs->requeue();
+   BOOST_CHECK_MESSAGE(t1->state() == NState::COMPLETE,"Expected node to be complete");
+   BOOST_CHECK_MESSAGE(t2->state() == NState::COMPLETE,"Expected node to be complete");
+   BOOST_CHECK_MESSAGE(t3->state() == NState::COMPLETE,"Expected node to be complete");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestOrder.cpp b/ecflow_4_0_7/ANode/test/TestOrder.cpp
new file mode 100644
index 0000000..a5d7dc8
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestOrder.cpp
@@ -0,0 +1,336 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+template <typename T>
+static std::vector<std::string> toStrVec(const std::vector<T>& vec)
+{
+	std::vector<std::string> retVec; retVec.reserve(vec.size());
+	BOOST_FOREACH(T s, vec) { retVec.push_back(s->name()); }
+	return retVec;
+}
+
+std::string toString(const std::vector<std::string>& c)
+{
+	std::stringstream ss;
+	std::copy (c.begin(), c.end(), std::ostream_iterator <std::string> (ss, ", "));
+	return ss.str();
+}
+
+static void test_invariants(Defs& the_defs, int line) {
+   std::string errorMsg;
+   bool passed = the_defs.checkInvariants(errorMsg);
+   BOOST_REQUIRE_MESSAGE( passed,"Invariants failed " << errorMsg << " at line " << line);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_order )
+{
+	cout << "ANode:: ...test_order\n" ;
+	std::vector<std::string> vec; vec.reserve(5);
+	vec.push_back("a");
+	vec.push_back("A");
+	vec.push_back("b");
+	vec.push_back("B");
+	vec.push_back("c");
+	Defs theDefs; {
+		for(size_t s = 0; s < vec.size(); s++) {
+ 			suite_ptr suite = theDefs.add_suite( vec[s] ) ;
+ 			for(size_t f = 0; f < vec.size(); f++) {
+ 				family_ptr fam = suite->add_family( vec[f] ) ;
+ 				for(size_t t = 0; t < vec.size(); t++) {
+ 			 		fam->add_task( vec[t] );
+ 				}
+ 			}
+		}
+	}
+
+   std::vector<std::string> alpha;
+   alpha.push_back("a");
+   alpha.push_back("A");
+   alpha.push_back("b");
+   alpha.push_back("B");
+   alpha.push_back("c");
+
+   std::vector<std::string> order;
+   order.push_back("c");
+   order.push_back("B");
+   order.push_back("b");
+   order.push_back("A");
+   order.push_back("a");
+
+	// Test suite ordering ==========================================================================
+	// In init state all suite should be in alpha order
+	theDefs.order(theDefs.findAbsNode("/A").get(), NOrder::ALPHA);
+	test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == alpha,"NOrder::ALPHA expected " << toString(alpha) << " but found " << toString(toStrVec(theDefs.suiteVec())) );
+
+	// sort in reverse order
+	theDefs.order(theDefs.findAbsNode("/a").get(), NOrder::ORDER);
+   test_invariants(theDefs,__LINE__);
+   BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == order,"NOrder::ORDER expected " << toString(order) << " but found " << toString(toStrVec(theDefs.suiteVec())) );
+
+	// Change back to alpha, then move suite 'c' to the top
+	theDefs.order(theDefs.findAbsNode("/A").get(), NOrder::ALPHA);
+   BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == alpha,"NOrder::ALPHA expected " << toString(alpha) << " but found " << toString(toStrVec(theDefs.suiteVec())) );
+   test_invariants(theDefs,__LINE__);
+
+   std::vector<std::string> expected;
+   expected.push_back("c");
+   expected.push_back("a");
+   expected.push_back("A");
+   expected.push_back("b");
+   expected.push_back("B");
+	theDefs.order(theDefs.findAbsNode("/c").get(), NOrder::TOP);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == expected,"NOrder::TOP expected " << toString(expected) << " but found " << toString(toStrVec(theDefs.suiteVec())) );
+
+	// move suite 'c' back to the bottom
+	theDefs.order(theDefs.findAbsNode("/c").get(), NOrder::BOTTOM);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == alpha,"NOrder::BOTTOM order not as expected" );
+
+	// move suite 'a' up one place. Should be no change, since its already at the top
+ 	theDefs.order(theDefs.findAbsNode("/a").get(), NOrder::UP);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == alpha,"NOrder::UP order not as expected" );
+
+	// move suite 'c' down one place. Should be no change, since its already at the bottom
+ 	theDefs.order(theDefs.findAbsNode("/c").get(), NOrder::DOWN);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == alpha,"NOrder::DOWN order not as expected" );
+
+	// Move suite 'a' down by one place
+	expected.clear();
+   expected.push_back("A");
+   expected.push_back("a");
+   expected.push_back("b");
+   expected.push_back("B");
+   expected.push_back("c");
+	theDefs.order(theDefs.findAbsNode("/a").get(), NOrder::DOWN);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == expected,"NOrder::DOWN order not as expected" );
+
+	// Move suite 'b' up by one place
+ 	expected.clear();
+   expected.push_back("A");
+   expected.push_back("b");
+   expected.push_back("a");
+   expected.push_back("B");
+   expected.push_back("c");
+	theDefs.order(theDefs.findAbsNode("/b").get(), NOrder::UP);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(theDefs.suiteVec()) == expected,"NOrder::UP order not as expected" );
+
+
+	// Test family ordering ==========================================================================
+	// In init state all suite should be in alpha order
+	suite_ptr suite = theDefs.findSuite("a");
+	BOOST_REQUIRE_MESSAGE( suite.get() ,"Expected suite /a to exist " );
+
+	theDefs.order(theDefs.findAbsNode("/a/a").get(), NOrder::ALPHA);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == alpha,"NOrder::ALPHA Init order " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(alpha));
+
+	// sort in reverse order
+	std::sort(expected.begin(),expected.end(),std::greater<std::string>());
+ 	suite->order(theDefs.findAbsNode("/a/a").get(), NOrder::ORDER);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == order,"NOrder::ORDER order " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(order));
+
+	// Change back to alpha, then move family 'e' to the top
+	suite->order(theDefs.findAbsNode("/a/a").get(), NOrder::ALPHA);
+   BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == alpha,"NOrder::ALPHA expected " << toString(alpha) << " but found " << toString(toStrVec(suite->nodeVec())) );
+   test_invariants(theDefs,__LINE__);
+	expected.clear();
+	expected.push_back("c");
+	expected.push_back("a");
+	expected.push_back("A");
+	expected.push_back("b");
+	expected.push_back("B");
+	suite->order(theDefs.findAbsNode("/a/c").get(), NOrder::TOP);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == expected,"NOrder::TOP order  " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(expected));
+
+	//  move family 'c' back to the bottom
+	suite->order(theDefs.findAbsNode("/a/c").get(), NOrder::BOTTOM);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == alpha,"NOrder::BOTTOM order  " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(alpha));
+
+	// move family 'a' up one place. Should be no change, since its already at the top
+ 	suite->order(theDefs.findAbsNode("/a/a").get(), NOrder::UP);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == alpha,"NOrder::UP order  " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(alpha));
+
+	// move family 'c' down one place. Should be no change, since its already at the bottom
+ 	suite->order(theDefs.findAbsNode("/a/c").get(), NOrder::DOWN);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == alpha,"NOrder::DOWN order  " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(alpha));
+
+	// Move family 'a' down by one place
+	expected.clear();
+	expected.push_back("A");
+	expected.push_back("a");
+	expected.push_back("b");
+	expected.push_back("B");
+	expected.push_back("c");
+	suite->order(theDefs.findAbsNode("/a/a").get(), NOrder::DOWN);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == expected,"NOrder::DOWN order  " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(expected));
+
+	// Move family 'b' up by one place
+	suite->order(theDefs.findAbsNode("/a/a").get(), NOrder::ALPHA); // reset
+   test_invariants(theDefs,__LINE__);
+	expected.clear();
+   expected.push_back("a");
+   expected.push_back("b");
+   expected.push_back("A");
+   expected.push_back("B");
+   expected.push_back("c");
+	suite->order(theDefs.findAbsNode("/a/b").get(), NOrder::UP);
+	BOOST_REQUIRE_MESSAGE( toStrVec(suite->nodeVec()) == expected,"NOrder::UP order  " << toString(toStrVec(suite->nodeVec())) << " not as expected " << toString(expected));
+
+
+	// Test Task ordering ==========================================================================
+	// In init state all tasks should be in alpha order
+	Family* family = theDefs.findAbsNode("/a/a")->isFamily();
+	BOOST_REQUIRE_MESSAGE( family ,"Expected family /a/a to exist " );
+
+	family->order(theDefs.findAbsNode("/a/a/a").get(), NOrder::ALPHA);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == alpha,"NOrder::ALPHA Init state " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(alpha));
+
+	// sort in reverse order
+	family->order(theDefs.findAbsNode("/a/a/a").get(), NOrder::ORDER);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == order,"NOrder::ORDER  " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(order));
+
+	// Change back to alpha, then move task 'c' to the top
+	family->order(theDefs.findAbsNode("/a/a/a").get(), NOrder::ALPHA); // reset
+	expected.clear();
+	expected.push_back("c");
+	expected.push_back("a");
+	expected.push_back("A");
+	expected.push_back("b");
+	expected.push_back("B");
+	family->order(theDefs.findAbsNode("/a/a/c").get(), NOrder::TOP);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == expected,"NOrder::TOP order  " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(expected));
+
+	//  move task 'c' back to the bottom
+	family->order(theDefs.findAbsNode("/a/a/c").get(), NOrder::BOTTOM);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == alpha,"NOrder::BOTTOM order  " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(alpha));
+
+	// move task 'a' up one place. Should be no change, since its already at the top
+	family->order(theDefs.findAbsNode("/a/a/a").get(), NOrder::UP);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == alpha,"NOrder::UP order  " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(alpha));
+
+	// move task 'e' down one place. Should be no change, since its already at the bottom
+	family->order(theDefs.findAbsNode("/a/a/c").get(), NOrder::DOWN);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == alpha,"NOrder::DOWN order  " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(alpha));
+
+	// Move task 'a' down by one place
+	expected.clear();
+	expected.push_back("A");
+	expected.push_back("a");
+	expected.push_back("b");
+	expected.push_back("B");
+	expected.push_back("c");
+	family->order(theDefs.findAbsNode("/a/a/a").get(), NOrder::DOWN);
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == expected,"NOrder::DOWN order  " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(expected));
+
+	// Move task 'b' up by one place
+	family->order(theDefs.findAbsNode("/a/a/b").get(), NOrder::DOWN);
+	expected.clear();
+   expected.push_back("A");
+   expected.push_back("a");
+   expected.push_back("B");
+   expected.push_back("b");
+   expected.push_back("c");
+   test_invariants(theDefs,__LINE__);
+	BOOST_REQUIRE_MESSAGE( toStrVec(family->nodeVec()) == expected,"NOrder::UP order  " << toString(toStrVec(family->nodeVec())) << " not as expected " << toString(expected));
+}
+
+BOOST_AUTO_TEST_CASE( test_alias_order )
+{
+   cout << "ANode:: ...test_alias_order\n" ;
+   task_ptr task;
+   Defs theDefs; {
+      suite_ptr s = theDefs.add_suite("s");
+      task = s->add_task("t");
+      task->add_alias_only(); // alias0
+      task->add_alias_only(); // alias1
+      task->add_alias_only(); // alias2
+      task->add_alias_only(); // alias3
+   }
+
+   // Test alias ordering ==========================================================================
+   // In init state all suite should be in alpha order
+   alias_ptr alias0 = task->find_alias("alias0");
+   BOOST_REQUIRE_MESSAGE( alias0,"expected to find alias0");
+
+   std::vector<std::string> expected;
+   expected.push_back("alias1");
+   expected.push_back("alias0");
+   expected.push_back("alias2");
+   expected.push_back("alias3");
+   task->order(alias0.get(), NOrder::DOWN);
+   test_invariants(theDefs,__LINE__);
+   BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::DOWN expected " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+
+
+   task->order(alias0.get(), NOrder::ALPHA);
+   test_invariants(theDefs,__LINE__);
+   expected.clear();
+   expected.push_back("alias0");
+   expected.push_back("alias1");
+   expected.push_back("alias2");
+   expected.push_back("alias3");
+   BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::ALPHA expectex " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+
+
+   task->order(task->find_alias("alias3").get(), NOrder::UP);
+   test_invariants(theDefs,__LINE__);
+   expected.clear();
+   expected.push_back("alias0");
+   expected.push_back("alias1");
+   expected.push_back("alias3");
+   expected.push_back("alias2");
+   BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::UP expected " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+
+   // sort in reverse order
+   std::sort(expected.begin(),expected.end(),std::greater<std::string>());
+   task->order(alias0.get(), NOrder::ORDER);
+   test_invariants(theDefs,__LINE__);
+   expected.clear();
+   expected.push_back("alias3");
+   expected.push_back("alias2");
+   expected.push_back("alias1");
+   expected.push_back("alias0");
+   BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::ORDER expected " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestPersistence.cpp b/ecflow_4_0_7/ANode/test/TestPersistence.cpp
new file mode 100644
index 0000000..2ae72be
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestPersistence.cpp
@@ -0,0 +1,79 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "MyDefsFixture.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_FIXTURE_TEST_SUITE( NodeTestSuite, MyDefsFixture )
+
+// Allow for multiple archives
+static void testPersistence(const Defs& fixtureDefs,ecf::Archive::Type at)
+{
+	std::string check_pt_file = "fixture_defs.check";
+	fixtureDefs.save_as_checkpt(check_pt_file,at);
+
+	Defs restoredDefs;
+	restoredDefs.restore_from_checkpt(check_pt_file,at);
+
+	bool theyCompare = (restoredDefs == fixtureDefs);
+	if (!theyCompare) {
+
+		std::cout << "Dump restored defs\n" << restoredDefs << "\n";
+		std::cout << "Dump fixture defs\n" << fixtureDefs << "\n";
+
+		BOOST_CHECK_MESSAGE(theyCompare,"restored defs file is not same as fixtureDefs defs file");
+	}
+
+	cout << " check pt file_size: " <<  fs::file_size(check_pt_file) << "\n";
+
+ 	// Uncomment if you want see what this file looks like
+	fs::remove(check_pt_file);
+}
+
+#if defined(BINARY_ARCHIVE)
+BOOST_AUTO_TEST_CASE( test_node_tree_persistence_binary )
+{
+	cout << left << setw(54) << "ANode:: ...test_node_tree_persistence_binary";
+	BOOST_CHECK_MESSAGE(true,""); // stop boost complaining about no assertions
+	testPersistence(fixtureDefsFile(),ecf::Archive::BINARY);
+}
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+BOOST_AUTO_TEST_CASE( test_node_tree_persistence_portable_binary )
+{
+	cout << left << setw(54) << "ANode:: ...test_node_tree_persistence_portable_binary";
+	BOOST_CHECK_MESSAGE(true,""); // stop boost complaining about no assertions
+	testPersistence(fixtureDefsFile(),ecf::Archive::PORTABLE_BINARY);
+}
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+BOOST_AUTO_TEST_CASE( test_node_tree_persistence_eos_portable_binary )
+{
+   cout << left << setw(54) << "ANode:: ...test_node_tree_persistence_eos_portable_binary";
+   BOOST_CHECK_MESSAGE(true,""); // stop boost complaining about no assertions
+   testPersistence(fixtureDefsFile(),ecf::Archive::EOS_PORTABLE_BINARY);
+}
+#else
+BOOST_AUTO_TEST_CASE( test_node_tree_persistence_text )
+{
+   cout << left << setw(54) << "ANode:: ...test_node_tree_persistence_text" ;
+   BOOST_CHECK_MESSAGE(true,""); // stop boost complaining about no assertions
+   testPersistence(fixtureDefsFile(),ecf::Archive::TEXT);
+}
+#endif
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestPreProcessing.cpp b/ecflow_4_0_7/ANode/test/TestPreProcessing.cpp
new file mode 100644
index 0000000..8b6c3bd
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestPreProcessing.cpp
@@ -0,0 +1,232 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+#include <set>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "EcfFile.hpp"
+#include "File.hpp"
+#include "JobsParam.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+void findVariable(std::string& line, std::set<std::string>& variables)
+{
+	// scan for variables
+ 	// edit SMSFETCH "/home/ma/map/sms/smsfectch -F %ECF_FILES% -I %ECF_INCLUDE%"
+	// We can also have
+	//
+	// "%<VAR>:<substitute>% i.e if VAR exist use it, else use substitute
+	//
+	// i.e VAR is defined as BILL
+	//  %VAR:fred --f%  will either be "BILL" or if VAR is not defined "fred --f"
+ 	while ( 1 ) {
+		size_t firstPercentPos = line.find( Ecf::MICRO() );
+		if ( firstPercentPos == string::npos ) break;
+		size_t secondPercentPos = line.find( Ecf::MICRO(), firstPercentPos + 1 );
+		if ( secondPercentPos == string::npos ) break;
+		if ( secondPercentPos - firstPercentPos <= 1 ) break; // handle %% with no characters in between
+
+		string percentVar( line.begin() + firstPercentPos+1, line.begin() + secondPercentPos );
+
+ 		size_t firstColon = percentVar.find( ':' );
+		if ( firstColon != string::npos ) {
+			string var( percentVar.begin(), percentVar.begin() + firstColon );
+			percentVar = var;
+ 		}
+
+		// Ignore auto-generated variables
+		if (	percentVar.find("ECF_") == string::npos &&
+				percentVar != "DATE"  &&
+				percentVar != "DAY" &&
+				percentVar != "DD" &&
+				percentVar != "DOW" &&
+				percentVar != "DOY" &&
+				percentVar != "MM" &&
+				percentVar != "MONTH" &&
+				percentVar != "YYYY" &&
+				percentVar != "TASK" &&
+				percentVar != "FAMILY" &&
+				percentVar != "FAMILY1" &&
+				percentVar != "SUITE"
+			) {
+			variables.insert( percentVar );
+		}
+
+		//std::cerr << "line before delete " << line << "\n";
+		line.erase(firstPercentPos, secondPercentPos - firstPercentPos + 1);
+		//std::cerr << "line after delete " << line << "\n";
+	}
+}
+
+void autoDiscoverVariables(const std::string& directory, std::set<std::string>& variables)
+{
+	fs::path full_path( fs::initial_path<fs::path>() );
+	full_path = fs::system_complete( fs::path( directory ) );
+
+	BOOST_CHECK(fs::exists( full_path ));
+	BOOST_CHECK(fs::is_directory( full_path ));
+
+	//std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
+	fs::directory_iterator end_iter;
+	for ( fs::directory_iterator dir_itr( full_path ); dir_itr != end_iter; ++dir_itr ) {
+		try {
+         fs::path relPath(directory + "/" + dir_itr->path().filename().string());
+
+ 			// recurse down directories
+		    if ( fs::is_directory(dir_itr->status()) )  {
+		    	autoDiscoverVariables(relPath.string(),variables);
+		    	continue;
+		    }
+			// std::cout << "......autoDiscoverVariables for file " << relPath.string() << "\n";
+		    if (relPath.extension() != ".h")  continue; // Only look at .h files
+
+		    // open the file, and find variables.
+		    std::vector<std::string> lines;
+		 	if ( File::splitFileIntoLines(relPath.string(), lines) ) {
+		 		for(size_t i = 0; i < lines.size(); ++i) {
+		 			findVariable(lines[i], variables);
+		 		}
+		 	}
+		}
+		catch ( const std::exception & ex ) {
+ 			std::cout << "Exception::" << dir_itr->path().filename() << " " << ex.what() << std::endl;
+		}
+	}
+}
+
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+// *Auto* discover the good/bad sms files
+void test_sms_preprocessing(const std::string& directory, bool pass)
+{
+//	cerr << " directory =  " << directory << "\n";
+
+	// SET ECF_HOME
+	std::string smshome = directory;
+
+	fs::path full_path( fs::initial_path<fs::path>() );
+	full_path = fs::system_complete( fs::path( directory ) );
+	BOOST_CHECK(fs::exists( full_path ));
+	BOOST_CHECK(fs::is_directory( full_path ));
+
+	// Create a defs file, where the task name mirrors the sms files in the given directory
+ 	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite("suite");
+		suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+		suite->addVariable( Variable( Str::ECF_OUT(),     "$ECF_HOME" ) );
+		suite->addVariable( Variable( "SLEEPTIME", "10" ) );
+      family_ptr fam = suite->add_family( "family" );
+
+		// for operations auto discover the variables used in the header files and give
+		// them a dummy value. This would allow the test to pass when doing
+		// variable substitution. hence if variable substitution fails its likely to be
+		// a bug in autoDiscoverVariables
+		std::set<std::string> discoveredVariables;
+		autoDiscoverVariables(smshome + "/includes", discoveredVariables );
+		BOOST_FOREACH(const string& var, discoveredVariables) {
+// 			cerr << "autoDiscoverVariables = " << var << "\n";
+			suite->addVariable( Variable( var, "gobblygook" ) );
+		}
+
+		//std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
+		fs::directory_iterator end_iter;
+		for (fs::directory_iterator dir_itr( full_path ); dir_itr != end_iter; ++dir_itr) {
+			try {
+				fs::path relPath( directory + "/" + dir_itr->path().filename().string());
+
+				// Ignore directores were only interested in .ecf files.
+ 				if (fs::is_directory(relPath)) continue;
+            if (File::getExt(relPath.filename().string()) != "ecf" ) continue; // ignore other files
+
+				//std::cout << "......Parsing file " << relPath.string() << "\n";
+ 				//std::cout << "adding task name " << relPath.leaf() << "\n";
+ 				fam->add_task( relPath.stem().string() );
+			}
+			catch ( const std::exception & ex ) {
+				std::cout << "Exception " << dir_itr->path().filename() << " " << ex.what() << std::endl;
+			}
+		}
+		//cerr << "The defs\n" << theDefs << "\n";
+	}
+
+	// get all the task
+	std::vector<Task*> theTasks;
+ 	theDefs.getAllTasks(theTasks);
+
+	// Override ECF_HOME.   ECF_HOME is need to locate to the ecf files
+	theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),smshome);
+
+	/// begin , will cause creation of generated variables. The generated variables
+	/// are used in client scripts(sms) and used to locate the sms files
+	theDefs.beginAll();
+
+	// Test Job creator, this will pre-process and perform variable substitution on sms files
+	BOOST_FOREACH(Task* t, theTasks) {
+
+	   //cout << "task " << t->absNodePath() << "\n";
+	   JobsParam jobsParam; // create jobs =  false, spawn_jobs = false
+	   bool ok = t-> submitJob( jobsParam ) ;
+
+	   if ( pass ) { // Test expected to pass
+	      BOOST_CHECK_MESSAGE(ok,"Failed to create jobs. " << jobsParam.getErrorMsg() );
+	   }
+	   else {        // test expected to fail
+	      BOOST_CHECK_MESSAGE(!ok,"Expected failure " << jobsParam.getErrorMsg() );
+	      BOOST_CHECK_MESSAGE(!ok,"expected no passes but found " <<  t->absNodePath() << " passes");
+	      //		cerr << "\n" << jobsParam.getErrorMsg() << " \n"; // un-comment to ensure correct error message
+	   }
+	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_good_sms )
+{
+	cout << "ANode:: ...test_good_ecf\n";
+
+   std::string path = File::test_data("ANode/test/data/SMSHOME2/good","ANode");
+
+	// All the sms in this directory are expected to pass
+	test_sms_preprocessing(path, true);
+}
+
+BOOST_AUTO_TEST_CASE( test_bad_sms )
+{
+	cout << "ANode:: ...test_bad_ecf\n";
+
+   std::string path = File::test_data("ANode/test/data/SMSHOME2/bad","ANode");
+
+	// All the sms in this directory are expected to fail
+	test_sms_preprocessing(path, false);
+
+	/// Destroy System singleton to avoid valgrind from complaining
+	System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestReplace.cpp b/ecflow_4_0_7/ANode/test/TestReplace.cpp
new file mode 100644
index 0000000..0b9a38c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestReplace.cpp
@@ -0,0 +1,575 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/make_shared.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_replace_add_task )
+{
+   cout << "ANode:: ...test_replace_add_task\n" ;
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = Suite::create( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task( "t2"  );
+      clientDef->addSuite( suite );
+   }
+
+   // add Child t2 to the server defs
+   Defs serverDefs; {
+      suite_ptr suite = Suite::create( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task( "t1"  );
+      serverDefs.addSuite( suite );
+   }
+
+   Defs expectedDefs;  {
+      suite_ptr suite = Suite::create( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task(  "t2"   );   // notice we preserve client position, and not server position
+      fam->add_task(  "t1"   );
+      expectedDefs.addSuite( suite );
+   }
+
+   std::string errorMsg;
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/family/t2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_add_suite )
+{
+   cout << "ANode:: ...test_replace_add_suite\n";
+   // In this test the server defs is *EMPTY* hence we should copy/move over the whole suite
+   // provided the a/ Path to node exists in the client def, b/ create nodes as needed is TRUE
+   Defs expectedDefs;  {
+      suite_ptr suite = expectedDefs.add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task(  "t1"   );
+      fam->add_task(  "t2"   );
+   }
+
+   {
+      // The whole suite should get *MOVED* from clientDef to the *EMPTY* server def. i.e add
+      defs_ptr clientDef = Defs::create(); {
+         suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+         family_ptr fam = suite->add_family("family" ) ;
+         fam->add_task( "t1"  );
+         fam->add_task( "t2"  );
+      }
+
+      // Server defs is empty
+      Defs serverDefs;
+
+      std::string errorMsg;
+      BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/family/t2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+      BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   }
+
+   {
+      // The whole suite should get *MOVED* from clientDef to the *EMPTY* server def. i.e add
+       defs_ptr clientDef = Defs::create(); {
+          suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+          family_ptr fam = suite->add_family("family" ) ;
+          fam->add_task( "t1"  );
+          fam->add_task( "t2"  );
+       }
+
+       // Server defs is empty
+       Defs serverDefs;
+
+       std::string errorMsg;
+       BOOST_REQUIRE_MESSAGE(serverDefs.replaceChild("/suite1/family",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+       BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   }
+
+   {
+       // The whole suite should get *MOVED* from clientDef to the *EMPTY* server def. i.e add
+       defs_ptr clientDef = Defs::create(); {
+          suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+          family_ptr fam = suite->add_family("family" ) ;
+          fam->add_task( "t1"  );
+          fam->add_task( "t2"  );
+       }
+
+       // Server defs is empty
+       Defs serverDefs;
+
+       std::string errorMsg;
+       BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+       BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_child )
+{
+	cout << "ANode:: ...test_replace_child\n" ;
+	defs_ptr clientDef = Defs::create(); {
+ 		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+ 		fam->addTask(   Task::create( "t1" )  );
+ 		suite->addFamily( fam );
+ 		clientDef->addSuite( suite );
+ 	}
+	Defs comparisonDef;  {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+ 		fam->addTask( Task::create( "t1" )  );
+ 		suite->addFamily( fam );
+ 		comparisonDef.addSuite( suite );
+ 	}
+	BOOST_CHECK_MESSAGE(comparisonDef == *clientDef,"client and comparisonDef should be the same");
+
+ 	std::string errorMsg;
+ 	Defs serverDefs;
+ 	BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+	BOOST_CHECK_MESSAGE(comparisonDef == serverDefs,"comparisonDef and servers defs should be the same");
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_add_preserves_states )
+{
+   cout << "ANode:: ...test_replace_add_preserves_states\n" ;
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task( "t1"  );
+      fam->add_task( "t2"  );
+      fam->add_task( "t3"  );
+      fam->add_task( "t4"  );
+   }
+
+   // add Child t4 to the server defs, the states on t1->t3 should be preserved
+   // The abort should be progagated up the node tree
+   family_ptr fam;
+   suite_ptr suite;
+   Defs serverDefs; {
+      suite = serverDefs.add_suite( "suite1" ) ;
+      fam = suite->add_family("family" ) ;
+      task_ptr t1 = fam->add_task( "t1"  );
+      task_ptr t2 = fam->add_task( "t2"  );
+      task_ptr t3 = fam->add_task( "t3"  );
+      serverDefs.beginAll();
+      t1->set_state(NState::COMPLETE);
+      t2->set_state(NState::ABORTED);
+      t3->set_state(NState::ACTIVE);
+   }
+
+   //cout << serverDefs;
+   std::string errorMsg;
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/family/t4",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+
+   /// The Nodes t1,t2,t3 may have been replaced hence we must get Nodes again
+   node_ptr st1 = serverDefs.findAbsNode("/suite1/family/t1");
+   node_ptr st2 = serverDefs.findAbsNode("/suite1/family/t2");
+   node_ptr st3 = serverDefs.findAbsNode("/suite1/family/t3");
+   node_ptr st4 = serverDefs.findAbsNode("/suite1/family/t4");
+   BOOST_REQUIRE_MESSAGE(st1,"Expected to find task t1");
+   BOOST_REQUIRE_MESSAGE(st2,"Expected to find task t2");
+   BOOST_REQUIRE_MESSAGE(st3,"Expected to find task t3");
+   BOOST_REQUIRE_MESSAGE(st4,"Expected to find task t4");
+   BOOST_REQUIRE_MESSAGE(st1->state() == NState::COMPLETE," state on task t1 not preserved after replace");
+   BOOST_REQUIRE_MESSAGE(st2->state() == NState::ABORTED," state on task t2 not preserved after replace");
+   BOOST_REQUIRE_MESSAGE(st3->state() == NState::ACTIVE," state on task t3 not preserved after replace");
+   BOOST_REQUIRE_MESSAGE(st4->state() == NState::QUEUED," state on task t4 to be queued");
+   BOOST_REQUIRE_MESSAGE(fam->state() == NState::ABORTED,"Aborted should have propagated to family");
+   BOOST_REQUIRE_MESSAGE(suite->state() == NState::ABORTED,"Aborted should have propagated to suite");
+   BOOST_REQUIRE_MESSAGE(serverDefs.state() == NState::ABORTED,"Aborted should have propagated to Defs");
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_preserves_sibling_states )
+{
+   cout << "ANode:: ...test_replace_preserves_sibling_states\n" ;
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = Suite::create( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task( "t4"  );
+      clientDef->addSuite( suite );
+   }
+
+   // add Child t4 to the server defs, the states on t1->t4 should be preserved
+   task_ptr t1,t2,t3;
+   Defs serverDefs; {
+      suite_ptr suite = serverDefs.add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      t1 = fam->add_task( "t1"  ); t1->set_state(NState::COMPLETE);
+      t2 = fam->add_task( "t2"  ); t2->set_state(NState::ABORTED);
+      t3 = fam->add_task( "t3"  ); t3->set_state(NState::ACTIVE);
+      fam->add_task( "t4"  );
+   }
+
+   std::string errorMsg;
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/family/t4",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_REQUIRE_MESSAGE(t1->state() == NState::COMPLETE," state on task t1 not preserved after replace");
+   BOOST_REQUIRE_MESSAGE(t2->state() == NState::ABORTED," state on task t2 not preserved after replace");
+   BOOST_REQUIRE_MESSAGE(t3->state() == NState::ACTIVE," state on task t3 not preserved after replace");
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_preserves_begun_status )
+{
+   cout << "ANode:: ...test_replace_preserves_begun_status\n" ;
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family( "family" ) ;
+      fam->addTask(   Task::create( "t1" )  );
+   }
+   Defs comparisonDef;  {
+      suite_ptr suite = comparisonDef.add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family( "family" ) ;
+      fam->addTask( Task::create( "t1" )  );
+   }
+   BOOST_CHECK_MESSAGE(comparisonDef == *clientDef,"client and comparisonDef should be the same");
+   comparisonDef.beginAll();
+
+   defs_ptr serverDefs = Defs::create(); {
+      suite_ptr suite = serverDefs->add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family( "family" ) ;
+      fam->addTask(   Task::create( "t1" )  );
+   }
+   serverDefs->beginAll();
+
+   std::string errorMsg;
+   BOOST_REQUIRE_MESSAGE( serverDefs->replaceChild("/suite1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_REQUIRE_MESSAGE( serverDefs->findSuite("suite1"),"Can't find suite1");
+   BOOST_REQUIRE_MESSAGE( serverDefs->findSuite("suite1")->begun(),"Expected replaced suite to preserve begun status");
+   Ecf::set_debug_equality(true);  // only has affect in DEBUG build
+   BOOST_CHECK_MESSAGE(comparisonDef == *serverDefs,"comparisonDef and servers defs should be the same");
+   Ecf::set_debug_equality(false);
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_add_node )
+{
+	cout << "ANode:: ...test_replace_add_node\n" ;
+	defs_ptr clientDef = Defs::create(); {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" )  );
+ 		suite->addFamily( fam );
+  		suite->addTask(  Task::create( "t2" ) );
+ 		clientDef->addSuite( suite );
+ 	}
+	Defs comparisonDef; {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" ) );
+ 		suite->addFamily( fam );
+  		suite->addTask( Task::create( "t2" )  );
+ 		comparisonDef.addSuite( suite );
+ 	}
+	BOOST_CHECK_MESSAGE(comparisonDef == *clientDef,"client and comparisonDef should be the same");
+
+
+	// Here /suite1/t2 does not exist in the server. Moved from client defs to server
+ 	Defs serverDefs; {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" ) );
+  		suite->addFamily( fam );
+ 		serverDefs.addSuite( suite );
+ 	}
+ 	std::string errorMsg;
+ 	BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/t2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+	BOOST_CHECK_MESSAGE(comparisonDef == serverDefs,"comparisonDef and servers defs should be the same");
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_add_hierarchy )
+{
+	cout << "ANode:: ...test_replace_add_hierarchy\n" ;
+	defs_ptr clientDef = Defs::create(); {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fa = Family::create( "fa" ) ;
+ 		family_ptr fb = Family::create( "fb" ) ;
+ 		family_ptr fc = Family::create( "fc" ) ;
+ 		family_ptr fd = Family::create( "fd" ) ;
+ 		fa->addFamily( fb );
+ 		fb->addFamily( fc );
+ 		fc->addFamily( fd );
+    	fd->addTask( Task::create( "t1" )  );
+ 		suite->addFamily( fa );
+  		clientDef->addSuite( suite );
+ 	}
+	Defs comparisonDef; {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fa = Family::create( "fa" ) ;
+ 		family_ptr fb = Family::create( "fb" ) ;
+ 		family_ptr fc = Family::create( "fc" ) ;
+ 		family_ptr fd = Family::create( "fd" ) ;
+ 		fa->addFamily( fb );
+ 		fb->addFamily( fc );
+ 		fc->addFamily( fd );
+    	fd->addTask( Task::create( "t1" )  );
+ 		suite->addFamily( fa );
+ 		comparisonDef.addSuite( suite );
+ 	}
+	BOOST_CHECK_MESSAGE(comparisonDef == *clientDef,"client and comparisonDef should be the same");
+
+
+	// Here /suite1/fa/fb/fc/fd/t1 does not exist in the server.  These should be created.
+	// by adding family "fa" as a child of suite1
+ 	Defs serverDefs; {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+  		serverDefs.addSuite( suite );
+ 	}
+ 	std::string errorMsg;
+ 	BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/fa/fb/fc/fd/t1",clientDef,true/*create nodes as needed*/, false/*force*/,errorMsg), errorMsg  );
+	BOOST_CHECK_MESSAGE(comparisonDef == serverDefs,"comparisonDef and servers defs should be the same");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_replace_order_preserved_for_suite )
+{
+   cout << "ANode:: ...test_replace_order_preserved_for_suite\n" ;
+   // Test that when we replace a suite, its order is preserved,
+   // See  ECFLOW-23 - When replacing a node the order is changed.
+   defs_ptr clientDef = Defs::create(); {
+      clientDef->add_suite( "s1" ) ;
+      clientDef->add_suite( "s2" ) ;
+      clientDef->add_suite( "s3" ) ;
+   }
+
+   // Replace suite s1 with another suite s1 check order is preserved
+   Defs serverDefs; {
+      serverDefs.add_suite( "s1" ) ;
+      serverDefs.add_suite( "s2" ) ;
+      serverDefs.add_suite( "s3" ) ;
+   }
+
+   Defs expectedDefs;  {
+      expectedDefs.add_suite( "s1" ) ;
+      expectedDefs.add_suite( "s2" ) ;
+      expectedDefs.add_suite( "s3" ) ;
+   }
+
+   std::string errorMsg;
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/s1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/s2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/s3",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_replace_order_preserved_for_family )
+{
+   cout << "ANode:: ...test_replace_order_preserved_for_family\n" ;
+   // Test that when we replace a family, its order is preserved,
+   // See  ECFLOW-23 - When replacing a node the order is changed.
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+      suite->add_family("f1" ) ;
+      suite->add_family("f2" ) ;
+      suite->add_family("f3" ) ;
+    }
+
+   // Replace family f1 with another family f1 check order is preserved
+   Defs serverDefs; {
+      suite_ptr suite = serverDefs.add_suite( "suite1" ) ;
+      suite->add_family("f1" ) ;
+      suite->add_family("f2" ) ;
+      suite->add_family("f3" ) ;
+   }
+
+   Defs expectedDefs;  {
+      suite_ptr suite = expectedDefs.add_suite( "suite1" ) ;
+      suite->add_family("f1" ) ;
+      suite->add_family("f2" ) ;
+      suite->add_family("f3" ) ;
+   }
+
+   std::string errorMsg;
+   Ecf::set_debug_equality(true);  // only has affect in DEBUG build
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f3",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   Ecf::set_debug_equality(false);
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_order_preserved_for_task )
+{
+   cout << "ANode:: ...test_replace_order_preserved_for_task\n" ;
+   // Test that when we replace a family, its order is preserved,
+   // See  ECFLOW-23 - When replacing a node the order is changed.
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+      family_ptr f1 = suite->add_family("f1" ) ;
+      f1->add_task("t1");
+      f1->add_task("t2");
+      f1->add_task("t3");
+    }
+
+   // Replace task t1 with another task t1, check order is preserved
+   Defs serverDefs; {
+      suite_ptr suite = serverDefs.add_suite( "suite1" ) ;
+      family_ptr f1 = suite->add_family("f1" ) ;
+      f1->add_task("t1");
+      f1->add_task("t2");
+      f1->add_task("t3");
+   }
+
+   Defs expectedDefs;  {
+      suite_ptr suite = expectedDefs.add_suite( "suite1" ) ;
+      family_ptr f1 = suite->add_family("f1" ) ;
+      f1->add_task("t1");
+      f1->add_task("t2");
+      f1->add_task("t3");
+   }
+
+   std::string errorMsg;
+   Ecf::set_debug_equality(true);  // only has affect in DEBUG build
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f1/t1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f1/t2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f1/t3",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+   BOOST_CHECK_MESSAGE(expectedDefs == serverDefs,"expectedDefs and servers defs should be the same");
+   Ecf::set_debug_equality(false);
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_child_errors )
+{
+	cout << "ANode:: ...test_replace_child_errors\n" ;
+	defs_ptr clientDef = Defs::create(); {
+ 		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" ) );
+ 		suite->addFamily( fam );
+  		suite->addTask(  Task::create( "t2" ) );
+ 		clientDef->addSuite( suite );
+ 	}
+ 	Defs serverDefs;
+ 	std::string errorMsg;
+ 	BOOST_REQUIRE_MESSAGE(!serverDefs.replaceChild("/suite1/i/dont/exist", clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), "Expected failure"  );
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_child_errors_2 )
+{
+	cout << "ANode:: ...test_replace_child_errors_2\n" ;
+	defs_ptr clientDef = Defs::create(); {
+ 		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" )  );
+ 		suite->addFamily( fam );
+  		suite->addTask(  Task::create( "t2" ) );
+ 		clientDef->addSuite( suite );
+ 	}
+  	Defs serverDefs; {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" ) );
+  		suite->addFamily( fam );
+ 		serverDefs.addSuite( suite );
+ 	}
+
+  	// because createNodesAsNeeded is false, child adoption should fail since /suite1/t2
+  	// does not exist on the server
+ 	std::string errorMsg;
+ 	BOOST_REQUIRE_MESSAGE(!serverDefs.replaceChild("/suite1/t2", clientDef , false/*create nodes as needed*/, false, errorMsg), "Expected failure");
+
+ 	// With flag now set, we will create any missing nodes even if they dont exist in the server
+ 	errorMsg.clear();
+ 	BOOST_REQUIRE_MESSAGE(serverDefs.replaceChild("/suite1/t2", clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), "Expected success " << errorMsg );
+}
+
+
+BOOST_AUTO_TEST_CASE( test_replace_child_errors_3 )
+{
+	// test force option
+	cout << "ANode:: ...test_replace_child_errors_3\n" ;
+	defs_ptr clientDef = Defs::create(); {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" )  );
+ 		suite->addFamily( fam );
+  		suite->addTask(  Task::create( "t2" ) );
+ 		clientDef->addSuite( suite );
+ 	}
+
+  	Defs serverDefs; {
+		suite_ptr suite = Suite::create( "suite1" ) ;
+ 		family_ptr fam = Family::create( "family" ) ;
+  		fam->addTask( Task::create( "t1" )  );
+  		suite->addFamily( fam );
+ 		task_ptr t2 = Task::create( "t2" );
+  		suite->addTask(  t2 );
+  		serverDefs.addSuite( suite );
+
+ 		t2->set_state( NState::ACTIVE ); // Must be done after parent has been setup
+ 	}
+ 	std::string errorMsg;
+ 	BOOST_REQUIRE_MESSAGE( !serverDefs.replaceChild("/suite1/t2", clientDef, true/*create nodes as needed*/, false/*force*/, errorMsg), "Expected failure since server task t2 is active, and force not used");
+ 	errorMsg.clear();
+ 	BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/t2",  clientDef, true/*create nodes as needed*/, true/*force*/, errorMsg),  errorMsg);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_replace_add_task_with_bad_trigger )
+{
+   cout << "ANode:: ...test_replace_add_task_with_bad_trigger\n" ;
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      task_ptr task = fam->add_task( "t2"  );
+      task->add_trigger("txx eq complete");
+   }
+
+   // add Child t2 to the server defs
+   Defs serverDefs; {
+      suite_ptr suite = serverDefs.add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task( "t1"  );
+   }
+
+   // expect to fail since trigger expression on added task, should not resolve
+   std::string errorMsg;
+   BOOST_REQUIRE_MESSAGE( !serverDefs.replaceChild("/suite1/family/t2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+}
+
+BOOST_AUTO_TEST_CASE( test_replace_add_suite_with_bad_triggers )
+{
+   cout << "ANode:: ...test_replace_add_suite_with_bad_triggers\n";
+
+   // The whole suite should get *MOVED* from clientDef to the *EMPTY* server def. i.e add
+   defs_ptr clientDef = Defs::create(); {
+      suite_ptr suite = clientDef->add_suite( "suite1" ) ;
+      family_ptr fam = suite->add_family("family" ) ;
+      fam->add_task( "t1"  );
+      fam->add_task( "t2"  );
+      task_ptr t3 = fam->add_task("t3");
+      t3->add_trigger("txxxxx eq complete");
+   }
+
+   // Server defs is empty
+   Defs serverDefs;
+
+   // expect failure since trigger expression should not resolve
+   std::string errorMsg;
+   BOOST_REQUIRE_MESSAGE( !serverDefs.replaceChild("/suite1/family/t2",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestSetState.cpp b/ecflow_4_0_7/ANode/test/TestSetState.cpp
new file mode 100644
index 0000000..b0fa265
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestSetState.cpp
@@ -0,0 +1,97 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "EcfFile.hpp"
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+static void set_state(node_ptr n,NState::State set,NState::State expected)
+{
+	n->set_state(set);
+	BOOST_REQUIRE_MESSAGE(n->state() == expected,"Expected state " << NState::toString(expected) << " but found " << NState::toString(n->state()) << " for " << n->debugNodePath());
+}
+
+static void test_state(node_ptr n,NState::State expected)
+{
+	BOOST_REQUIRE_MESSAGE(n->state() == expected,"Expected state " << NState::toString(expected) << " but found " << NState::toString(n->state()) << " for " << n->debugNodePath());
+}
+
+BOOST_AUTO_TEST_CASE( test_set_state )
+{
+	cout << "ANode:: ...test_set_state\n";
+ 	std::vector<NState::State> stateVec = NState::states();
+
+// 	cout << "Defs setState\n";
+ 	Defs theDefs;
+  	BOOST_FOREACH(NState::State state, stateVec) {
+  		theDefs.set_state(state);
+  		BOOST_REQUIRE_MESSAGE(theDefs.state() == state,"Expected defs state " << NState::toString(state) << " but found " << NState::toString(theDefs.state()));
+  	}
+//  	theDefs.resume();                   // unset the suspended state. Start with default, for next set of test
+	theDefs.set_state(NState::UNKNOWN); // Start with default, for next set of test
+
+
+// 	cout << "Suite setState\n";
+ 	suite_ptr s = Suite::create("s");
+ 	theDefs.addSuite(s);
+  	BOOST_FOREACH(NState::State state, stateVec) {
+ 		set_state(s,state,state);         // suite with no children, state should be what was set
+  	}
+ 	s->resume();                   // unset the suspended state. Start with default, for next set of test
+	s->set_state(NState::UNKNOWN); // Start with default, for next set of test
+
+
+// 	cout << "family setState\n";
+ 	family_ptr f = Family::create("f");
+ 	s->addFamily(f);
+  	BOOST_FOREACH(NState::State state, stateVec) {
+ 		set_state(f,state,state);         // family with no children, state should be what was set
+  	}
+ 	f->resume();                   // unset the suspended state. Start with default, for next set of test
+	f->set_state(NState::UNKNOWN); // Start with default, for next set of test
+
+
+// 	cout << "task setState\n";
+ 	task_ptr t = Task::create("t");
+ 	f->addTask(t);
+
+  	BOOST_FOREACH(NState::State state, stateVec) {
+  		f->setStateOnly(NState::UNKNOWN);  // reset family state
+  		s->setStateOnly(NState::UNKNOWN);  // reset suite state
+		set_state(t,state,state);          // task state should be what was set
+
+		test_state(f,state);              // family state should be computed state
+		test_state(s,state);              // suite state should be computed state
+  	}
+
+ 	/// Everytime we set the state on a nodecontainer, we call handleStateChange
+ 	/// This by default works out the most significant state of the children
+ 	/// ie. the computed state. Hence setting the state on Suite/Family is really
+ 	/// meaningless, since it will always be the computed state.
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestSingleExprParse.cpp b/ecflow_4_0_7/ANode/test/TestSingleExprParse.cpp
new file mode 100644
index 0000000..85fbacd
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestSingleExprParse.cpp
@@ -0,0 +1,67 @@
+#define BOOST_TEST_MODULE TestSingle
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ExprParser.hpp"
+#include "ExprAst.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+#include <string>
+#include <map>
+#include <iostream>
+#include <fstream>
+using namespace std;
+
+
+// DEBUG AID: to see the expression tree, invert the expected evaluation
+//            so that test fail's
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_single_expression )
+{
+    std::cout <<  "ANode:: ...test_single_expression\n";
+
+	// The map key = trigger expression,
+    // value.first  = type of expected root abstract syntax tree
+    // value.second = result of expected evaluation
+	map<string,std::pair<string,bool> > exprMap;
+
+//  	exprMap["inigroup:YMD eq not 1"] = std::make_pair(AstEqual::stype(),true);
+//	exprMap["/net/main:YMD le /net/cleanplus1:YMD and 1"] = std::make_pair(AstAnd::stype(),true);
+   exprMap["!../../../prod2diss//operation_is_late:yes"] = std::make_pair(AstNot::stype(),true);
+// 	exprMap["../obs:YMD ge  ( 19720101 + 6576 - 1)"] = std::make_pair(AstGreaterEqual::stype(),true);
+// 	exprMap["../obs:YMD ge  ( (19720101 + 6576) - (12 + 1) )"] = std::make_pair(AstGreaterEqual::stype(),true);
+
+ 	std::pair<string, std::pair<string,bool> > p;
+	BOOST_FOREACH(p, exprMap ) {
+
+  		ExprParser theExprParser(p.first);
+		std::string errorMsg;
+		bool ok = theExprParser.doParse(errorMsg);
+		BOOST_REQUIRE_MESSAGE(ok,errorMsg);
+
+		string expectedRootType       = p.second.first;
+		bool expectedEvaluationResult = p.second.second;
+
+		Ast* top = theExprParser.getAst();
+		BOOST_REQUIRE_MESSAGE( top ,"No abstract syntax tree");
+		BOOST_REQUIRE_MESSAGE( top->left() ,"No root created");
+		BOOST_REQUIRE_MESSAGE( top->left()->isRoot() ,"First child of top should be a root");
+		BOOST_REQUIRE_MESSAGE( top->left()->type() == expectedRootType,"expected root type " << expectedRootType << " but found " << top->left()->type());
+		BOOST_REQUIRE_MESSAGE( expectedEvaluationResult == top->evaluate(),"evaluation not as expected for " << *top);
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANode/test/TestSmsLocator.cpp b/ecflow_4_0_7/ANode/test/TestSmsLocator.cpp
new file mode 100644
index 0000000..19b92d2
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestSmsLocator.cpp
@@ -0,0 +1,128 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "EcfFile.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_sms_file_locator )
+{
+	cout << "ANode:: ...test_sms_file_locator\n";
+
+	// SET ECF_HOME
+   std::string smshome = File::test_data("ANode/test/data/SMSHOME","ANode");
+
+	// Create a defs file corresponding to:
+ 	//# Test the sms file can be found via ECF_SCRIPT
+	//#
+	//suite suite
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	edit SLEEPTIME 10
+	//	family family
+	//   		task t1
+	//   		task t2
+	//    		task t3
+	//  	endfamily
+	//endsuite
+	//
+	//#
+	//# This test suite should force a backwards search since the ecf files
+	//# are located in ECF_HOME
+	//suite suite1
+	//  	family family
+	//   		task suite1_task1
+	//   		task suite1_task2
+	//    		task suite1_task3
+	//    endfamily
+	//endsuite
+	//
+	//#
+	//# This suite is used to test command substition with ECF_FETCH command
+	//#
+	//suite suite2
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	edit ECF_FILES   $ECF_HOME
+	//	family family
+	//		edit SMSFETCH "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"
+	//		task t2
+	//	endfamily
+	//endsuite
+ 	Defs theDefs;
+ 	{
+ 	   suite_ptr suite = theDefs.add_suite("suite");
+		suite->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+ 		suite->addVariable( Variable( "SLEEPTIME", "10" ) );
+ 		family_ptr fam = suite->add_family( "family" );
+		fam->add_task( "t1" );
+		fam->add_task( "t2" );
+		fam->add_task( "t3" );
+ 	}
+ 	{
+      suite_ptr suite = theDefs.add_suite("suite1");
+      family_ptr fam = suite->add_family( "family" );
+      fam->add_task( "suite1_task1" );
+      fam->add_task( "suite1_task2" );
+      fam->add_task( "suite1_task3" );
+ 	}
+ 	{
+      suite_ptr suite2 = theDefs.add_suite("suite2");
+		suite2->addVariable( Variable( Str::ECF_INCLUDE(), "$ECF_HOME/includes" ) );
+ 		suite2->addVariable( Variable( Str::ECF_FILES(), "$ECF_HOME" ) );
+      family_ptr fam = suite2->add_family( "family" );
+		fam->addVariable( Variable( Str::ECF_FETCH(), "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%" ) );
+ 		fam->add_task( "t2" );
+ 	}
+// 	cerr << theDefs << "\n";
+
+	// get all the task, assume non hierarchical families
+	std::vector<Task*> theTasks;
+ 	theDefs.getAllTasks(theTasks);
+	BOOST_REQUIRE_MESSAGE(theTasks.size() == 7, "Expected 7 tasks but found, " << theTasks.size());
+
+	// Override ECF_HOME.   ECF_HOME is need to locate to the ecf files
+	theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),smshome);
+
+
+	/// begin , will cause creation of generated variables. The generated variables
+	/// are use in client scripts and used to locate the sms files
+	theDefs.beginAll();
+
+	// Test for ECF_ file location
+  	BOOST_FOREACH(Task* t, theTasks) {
+  		try {
+  			EcfFile ecf_file = t->locatedEcfFile();
+  			BOOST_REQUIRE_MESSAGE( !ecf_file.path().empty(), "Could not locate ecf file for task ");
+  		}
+  		catch (std::exception& e) {
+  			BOOST_REQUIRE_MESSAGE(false,"Could not locate ecf file for task " << e.what());
+  		}
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestTaskScriptGenerator.cpp b/ecflow_4_0_7/ANode/test/TestTaskScriptGenerator.cpp
new file mode 100644
index 0000000..41c8aed
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestTaskScriptGenerator.cpp
@@ -0,0 +1,205 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <stdlib.h>
+
+#include "boost/make_shared.hpp"
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "EcfFile.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_task_script_generator )
+{
+   cout << "ANode:: ...test_task_script_generator\n";
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data/TaskScriptGenerator","ANode");
+
+   std::string head = ecf_home + "/head.h";
+   std::string tail = ecf_home + "/tail.h";
+   fs::remove_all(ecf_home);
+   BOOST_REQUIRE_MESSAGE( !fs::exists(head), "Remove of head file failed");
+   BOOST_REQUIRE_MESSAGE( !fs::exists(tail), "Remove of tail file failed");
+
+
+   // Create a defs file corresponding to:
+   //suite suite
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   // edit SLEEP 10
+   // task t1
+   //    family f1
+   //       task t1
+   //       task t2
+   //    endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("suite");
+      suite->add_variable( Str::ECF_INCLUDE(),ecf_home );
+      suite->add_variable( Str::ECF_HOME(), ecf_home );
+      suite->add_variable(  "SLEEP","10" );
+      task_ptr t1 = suite->add_task("t1");
+      t1->addEvent( Event("event1") );
+      t1->addEvent( Event("event2") );
+      t1->addEvent( Event("event4") );
+      t1->addMeter( Meter("meter1",1,100,90));
+      t1->addMeter( Meter("meter2",1,100,90));
+      t1->addLabel( Label("label","label value"));
+      family_ptr fam = suite->add_family("f1");
+      fam->add_task("t1");
+      fam->add_task("t2");
+//    cerr << theDefs << "\n";
+   }
+
+   /// generate the scripts and head.h and tail.h
+   theDefs.generate_scripts();
+
+   /// Test the ecf file were created, by doing job creation
+   /// JobCreationCtrl is used control what node we generate the jobs for:
+   /// Since we have not set the node on it, we force job generation for all tasks
+   job_creation_ctrl_ptr jobCtrl = boost::make_shared<JobCreationCtrl>();
+   theDefs.check_job_creation(jobCtrl);
+   BOOST_REQUIRE_MESSAGE(jobCtrl->get_error_msg().empty(), jobCtrl->get_error_msg());
+   BOOST_REQUIRE_MESSAGE(jobCtrl->fail_submittables().empty(),"Expected no failing tasks");
+
+   /// Additional sanity tests #######################################################
+
+   /// test that header and tail file were created
+   BOOST_REQUIRE_MESSAGE( fs::exists(head), "Head file " << head << " not created");
+   BOOST_REQUIRE_MESSAGE( fs::exists(tail), "Tail file " << tail << " not created");
+
+   // get all the task, assume non hierarchical families
+   std::vector<Task*> theTasks;
+   theDefs.getAllTasks(theTasks);
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the sms files
+   theDefs.beginAll();
+
+   // Test for ECF_ file location
+   BOOST_FOREACH(Task* t, theTasks) {
+      try {
+         EcfFile ecf_file = t->locatedEcfFile();
+         BOOST_REQUIRE_MESSAGE( !ecf_file.path().empty(), "Could not locate ecf file for task ");
+      }
+      catch (std::exception& e) {
+         BOOST_REQUIRE_MESSAGE(false,"Could not locate ecf file for task " << e.what());
+      }
+   }
+
+   // Remove the directories that were generated
+   fs::remove_all(ecf_home);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_task_script_generator_with_dummy_tasks )
+{
+   cout << "ANode:: ...test_task_script_generator_with_dummy_tasks\n";
+
+   // SET ECF_HOME
+   std::string ecf_home = File::test_data("ANode/test/data/TaskScriptGenerator","ANode");
+
+   std::string head = ecf_home + "/head.h";
+   std::string tail = ecf_home + "/tail.h";
+   fs::remove_all(ecf_home);
+   BOOST_REQUIRE_MESSAGE( !fs::exists(head), "Remove of head file failed");
+   BOOST_REQUIRE_MESSAGE( !fs::exists(tail), "Remove of tail file failed");
+
+
+   // Create a defs file corresponding to:
+   // suite suite
+   //   edit ECF_INCLUDE $ECF_HOME/includes
+   //   edit ECF_HOME $ECF_HOME/includes
+   //   edit SLEEP 10
+   //   family f1
+   //       task t1
+   //       task t2
+   //   endfamily
+   //   family f2
+   //       edit ECF_DUMMY_TASK ''
+   //       task t1
+   //       task t2
+   //   endfamily
+   // endsuite
+   std::vector<task_ptr> tasks_with_scripts,tasks_without_scripts;
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("suite");
+      suite->add_variable( Str::ECF_INCLUDE(),ecf_home );
+      suite->add_variable( Str::ECF_HOME(), ecf_home );
+      suite->add_variable(  "SLEEP","10" );
+      family_ptr f1 = suite->add_family("f1");
+      tasks_with_scripts.push_back(f1->add_task("t1"));
+      family_ptr f2 = suite->add_family("f2");
+      f2->add_variable( "ECF_DUMMY_TASK", "" );
+      tasks_without_scripts.push_back(f2->add_task("t1"));
+      tasks_without_scripts.push_back(f2->add_task("t2"));
+//      cout << theDefs << "\n";
+   }
+
+   /// generate the scripts and head.h and tail.h
+   theDefs.generate_scripts();
+
+   /// Test the ecf file were created, by doing job creation
+   /// JobCreationCtrl is used control what node we generate the jobs for:
+   /// Since we have *NOT* set the node on it, we force job generation for all tasks
+   job_creation_ctrl_ptr jobCtrl = boost::make_shared<JobCreationCtrl>();
+   theDefs.check_job_creation(jobCtrl);
+   BOOST_REQUIRE_MESSAGE(jobCtrl->get_error_msg().empty(), jobCtrl->get_error_msg());
+   BOOST_REQUIRE_MESSAGE(jobCtrl->fail_submittables().empty(),"Expected no failing tasks");
+
+   /// Additional sanity tests #######################################################
+
+   /// test that header and tail file were created
+   BOOST_REQUIRE_MESSAGE( fs::exists(head), "Head file " << head << " not created");
+   BOOST_REQUIRE_MESSAGE( fs::exists(tail), "Tail file " << tail << " not created");
+
+   /// begin , will cause creation of generated variables. The generated variables
+   /// are use in client scripts and used to locate the ecf files
+   theDefs.beginAll();
+
+   // Test for script generation
+   BOOST_FOREACH(task_ptr t, tasks_with_scripts) {
+      try {
+         EcfFile ecf_file = t->locatedEcfFile();
+         BOOST_REQUIRE_MESSAGE( !ecf_file.path().empty(), "Could not locate ecf file for task ");
+      }
+      catch (std::exception& e) {
+         BOOST_REQUIRE_MESSAGE(false,"Could not locate ecf file for task " << e.what());
+      }
+   }
+
+   // Test  that no scripts are generated when ECF_DUMMY_TASK is used
+   BOOST_FOREACH(task_ptr t, tasks_without_scripts) {
+      BOOST_REQUIRE_THROW(t->locatedEcfFile(),std::runtime_error);
+   }
+
+   // Remove the directories that were generated
+   fs::remove_all(ecf_home);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestVariableGeneration.cpp b/ecflow_4_0_7/ANode/test/TestVariableGeneration.cpp
new file mode 100644
index 0000000..ebc0c6e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestVariableGeneration.cpp
@@ -0,0 +1,93 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+static void findParentVariableValue(task_ptr t, const std::string& name, const std::string& expected)
+{
+   std::string value;
+   BOOST_CHECK_MESSAGE(t->findParentVariableValue(name,value), "Task " << t->debugNodePath() << " could not find variable of name " << name );
+//   if (expected.empty()) std::cout << name  << " = " << value << "\n";
+   if (!expected.empty())
+      BOOST_CHECK_MESSAGE( value == expected , "From task " << t->debugNodePath() << " for variable " << name  << " expected value " << expected << " but found " <<  value );
+}
+
+BOOST_AUTO_TEST_CASE( test_generated_variables )
+{
+   std::cout <<  "ANode:: ...test_generated_variables\n";
+
+   task_ptr t;
+
+   Defs defs; {
+
+      suite_ptr suite = defs.add_suite("suite");
+      suite->addRepeat( RepeatInteger("RepeatInteger",10,20,1));
+
+      family_ptr fam = suite->add_family("f" );
+      fam->addRepeat( RepeatDate("YMD",20090101,20091231,1));
+
+      t = fam->add_family("f2")->add_task("t");
+      std::vector<std::string> stringList; stringList.reserve(3);
+      stringList.push_back("AA"); stringList.push_back("BB"); stringList.push_back("CC");
+      t->addRepeat( RepeatEnumerated("AEnum",stringList));
+   }
+
+   // Generate variables, needed since,findParentVariableValue also serach's the generated variables
+   defs.beginAll();
+
+   // Check Submittable generated variables
+   findParentVariableValue(t,"TASK","t");
+   findParentVariableValue(t,Str::ECF_RID(),"");
+   findParentVariableValue(t,Str::ECF_TRYNO(),"0");
+   findParentVariableValue(t,Str::ECF_NAME(),"/suite/f/f2/t");
+   findParentVariableValue(t,Str::ECF_PASS(),"");
+   findParentVariableValue(t,Str::ECF_JOB(),"./suite/f/f2/t.job0");
+   findParentVariableValue(t,Str::ECF_JOBOUT(),"./suite/f/f2/t.0");
+   findParentVariableValue(t,Str::ECF_SCRIPT(),"./suite/f/f2/t.ecf");
+
+   // Check Family generated variables
+   findParentVariableValue(t,"FAMILY","f/f2");
+   findParentVariableValue(t,"FAMILY1","f2");
+
+   // Check Suite generated variables
+   findParentVariableValue(t,"SUITE","suite");
+   findParentVariableValue(t,"YYYY","");
+   findParentVariableValue(t,"DOW","");
+   findParentVariableValue(t,"DOY","");
+   findParentVariableValue(t,"DATE","");
+   findParentVariableValue(t,"DAY","");
+   findParentVariableValue(t,"DD","");
+   findParentVariableValue(t,"MM","");
+   findParentVariableValue(t,"MONTH","");
+   findParentVariableValue(t,"ECF_DATE","");
+   findParentVariableValue(t,"ECF_CLOCK","");
+   findParentVariableValue(t,"ECF_TIME","");
+
+   // Test repeat generated variables
+   findParentVariableValue(t,"AEnum","AA");
+   findParentVariableValue(t,"YMD","20090101");
+   findParentVariableValue(t,"RepeatInteger","10");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestVariableInheritance.cpp b/ecflow_4_0_7/ANode/test/TestVariableInheritance.cpp
new file mode 100644
index 0000000..46eb82c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestVariableInheritance.cpp
@@ -0,0 +1,78 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <map>
+#include <iostream>
+#include <fstream>
+using namespace std;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+static void findParentVariableValue(task_ptr t, const std::string& name, const std::string& expected)
+{
+   std::string value;
+   BOOST_CHECK_MESSAGE(t->findParentVariableValue(name,value), "Task " << t->debugNodePath() << " could not find variable of name " << name );
+   BOOST_CHECK_MESSAGE( value == expected , "From task " << t->debugNodePath() << " for variable " << name  << " expected value " << expected << " but found " <<  value );
+}
+
+BOOST_AUTO_TEST_CASE( test_variable_inheritance )
+{
+   std::cout <<  "ANode:: ...test_variable_inheritance\n";
+
+   // See page 31, section 5.1 variable inheritance, of SMS users guide
+   task_ptr t;
+   task_ptr t2 ;
+   task_ptr z;
+
+   Defs defs; {
+      suite_ptr suite = defs.add_suite("suite");
+      suite->addVariable(Variable("TOPLEVEL","10"));
+      suite->addVariable(Variable("MIDDLE","10"));
+      suite->addVariable(Variable("LOWER","10"));
+
+      family_ptr fam = suite->add_family("f" );
+      fam->addVariable( Variable("MIDDLE","20") );
+      t = fam->add_task("t");
+      t->addVariable( Variable("LOWER","abc") );
+      t2 = fam->add_task("t2");
+
+      family_ptr fam2 = suite->add_family("f2" );
+      fam2->addVariable( Variable("TOPLEVEL","40") );
+      z = fam2->add_task("z");
+   }
+
+   // Generate variables, needed since,findParentVariableValue also serach's the generated variables
+   defs.beginAll();
+
+   // See page 31, section 5.1 variable inheritance, of SMS users guide
+   findParentVariableValue(t,"TOPLEVEL","10");
+   findParentVariableValue(t2, "TOPLEVEL","10");
+   findParentVariableValue(z,"TOPLEVEL","40");
+
+   findParentVariableValue(t,"MIDDLE","20");
+   findParentVariableValue(t2, "MIDDLE","20");
+   findParentVariableValue(z,"MIDDLE","10");
+
+   findParentVariableValue(t, "LOWER","abc");
+   findParentVariableValue(t2, "LOWER","10");
+   findParentVariableValue(z, "LOWER","10");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANode/test/TestVariableSubstitution.cpp b/ecflow_4_0_7/ANode/test/TestVariableSubstitution.cpp
new file mode 100644
index 0000000..c71c726
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestVariableSubstitution.cpp
@@ -0,0 +1,438 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <map>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Version.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_variable_substitution )
+{
+    std::cout <<  "ANode:: ...test_variable_substitution\n";
+
+    Defs defs;
+    suite_ptr s = defs.add_suite("suite");
+    {
+		s->addVariable(Variable("AVI","avi"));
+		s->addVariable(Variable("BAHRA","bahra"));
+		s->addVariable(Variable("LOWER","10"));
+		s->addVariable(Variable("PATH","/fred/bill/joe"));
+		s->addVariable(Variable("EMPTY_VARIABLE",""));
+		s->addVariable(Variable("fred","%bill%"));
+		s->addVariable(Variable("bill","%fred%"));
+		s->addVariable(Variable("hello","%hello%"));
+		s->addVariable(Variable("mary","%jane%"));
+		s->addVariable(Variable("jane","10"));
+	}
+
+
+ 	// See page 31, section 5.1 variable inheritance, of SMS users guide
+ 	std::string cmd = "%AVI%-%BAHRA%-%LOWER%-%AVI%";
+	string expected = "avi-bahra-10-avi";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd),"substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%ECF_VERSION%";
+   expected = Version::raw();
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%PATH%"; expected = "/fred/bill/joe";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "/%AVI%/%BAHRA%/%LOWER%%PATH%"; expected = "/avi/bahra/10/fred/bill/joe";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%EMPTY_VARIABLE%"; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%mary%"; expected = "10"; // double substitution
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%fred%"; expected = "%fred%"; // infinite substitution
+ 	BOOST_CHECK_MESSAGE(!s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%hello%"; expected = "%hello%"; // infinite substitution
+ 	BOOST_CHECK_MESSAGE(!s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = Ecf::MICRO(); expected = Ecf::MICRO();
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%PATH"; expected = "%PATH";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%%"; expected = "%";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%ERROR%"; expected = "%ERROR%";
+ 	BOOST_CHECK_MESSAGE(!s->variableSubsitution(cmd)," substitution expected to fail since ERROR does not exist");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = ""; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+
+ 	// new rules
+ 	// %<VAR>:substitute %
+ 	// If we find VAR, then use it, else use substitute
+ 	cmd = "%AVI:goblly gook%"; expected = "avi";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%PATH:goblly::: gook%"; expected = "/fred/bill/joe";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%LOWER:fred% %AVI:fred2%"; expected = "10 avi";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%LOWER:fred% %AVI:fred2"; expected = "10 %AVI:fred2";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%EMPTY_VARIABLE::goblly gook%"; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%NULL:goblly gook%"; expected = "goblly gook";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%NULL::goblly gook%"; expected = ":goblly gook";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%NULL:%"; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%:%"; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+}
+
+BOOST_AUTO_TEST_CASE( test_variable_substitution_double_micro )
+{
+   std::cout <<  "ANode:: ...test_variable_substitution_double_micro\n";
+
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+
+   std::string cmd = "%%"; std::string expected = "%";
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%%%"; expected = "%%";
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%%%%"; expected = "%%";
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%%%%%"; expected = "%%%";
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "date +%%Y.%%m.%%d"; expected = "date +%Y.%m.%d";
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "printf %%02d %HOUR:00%"; expected = "printf %02d 00";
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   s->addVariable(Variable("HOUR","hammer time"));
+   cmd = "printf %%02d %HOUR:00%"; expected = "printf %02d hammer time";
+   BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+}
+
+BOOST_AUTO_TEST_CASE( test_user_variable_substitution )
+{
+    std::cout <<  "ANode:: ...test_user_variable_substitution\n";
+
+    Defs defs;
+    suite_ptr s = defs.add_suite("suite");
+    {
+		s->addVariable(Variable("AVI","avi"));
+		s->addVariable(Variable("BAHRA","bahra"));
+		s->addVariable(Variable("LOWER","10"));
+		s->addVariable(Variable("PATH","/fred/bill/joe"));
+		s->addVariable(Variable("EMPTY_VARIABLE",""));
+		s->addVariable(Variable("fred","%bill%"));
+		s->addVariable(Variable("bill","%fred%"));
+		s->addVariable(Variable("hello","%hello%"));
+		s->addVariable(Variable("mary","%jane%"));
+		s->addVariable(Variable("jane","10"));
+	}
+
+    NameValueMap user_variables;
+    user_variables.insert( std::make_pair(string("AVI"),string("_avi")) );
+    user_variables.insert( std::make_pair(string("BAHRA"),string("_bahra")) );
+    user_variables.insert( std::make_pair(string("LOWER"),string("_10")) );
+    user_variables.insert( std::make_pair(string("PATH"),string("_/fred/bill/joe")) );
+    user_variables.insert( std::make_pair(string("EMPTY_VARIABLE"),string("_")) );
+    user_variables.insert( std::make_pair(string("fred"),string("%bill%")) );
+    user_variables.insert( std::make_pair(string("bill"),string("%fred%")) );
+    user_variables.insert( std::make_pair(string("hello"),string("%hello%")) );
+    user_variables.insert( std::make_pair(string("mary"),string("%jane%")) );
+    user_variables.insert( std::make_pair(string("jane"),string("_10")) );
+
+ 	// See page 31, section 5.1 variable inheritance, of SMS users guide
+ 	std::string cmd = "%AVI%-%BAHRA%-%LOWER%-%AVI%";   string expected = "_avi-_bahra-_10-_avi";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables),"substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%PATH%"; expected = "_/fred/bill/joe";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "/%AVI%/%BAHRA%/%LOWER%%PATH%"; expected = "/_avi/_bahra/_10_/fred/bill/joe";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%EMPTY_VARIABLE%"; expected = "_";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%mary%"; expected = "_10"; // double substitution
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%fred%"; expected = "%fred%"; // infinite substitution
+ 	BOOST_CHECK_MESSAGE(!s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%hello%"; expected = "%hello%"; // infinite substitution
+ 	BOOST_CHECK_MESSAGE(!s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = Ecf::MICRO(); expected = Ecf::MICRO();
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%PATH"; expected = "%PATH";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+
+ 	cmd = "%%"; expected = "%";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%ERROR%"; expected = "%ERROR%";
+ 	BOOST_CHECK_MESSAGE(!s->variable_substitution(cmd,user_variables)," substitution expected to fail since ERROR does not exist");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = ""; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+
+ 	// new rules
+ 	// %<VAR>:substitute %
+ 	// If we find VAR, then use it, else use substitute
+ 	cmd = "%AVI:goblly gook%"; expected = "_avi";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%PATH:goblly::: gook%"; expected = "_/fred/bill/joe";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%LOWER:fred% %AVI:fred2%"; expected = "_10 _avi";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%LOWER:fred% %AVI:fred2"; expected = "_10 %AVI:fred2";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%EMPTY_VARIABLE::goblly gook%"; expected = "_";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+ 	cmd = "%NULL:goblly gook%"; expected = "goblly gook";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%NULL::goblly gook%"; expected = ":goblly gook";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%NULL:%"; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+	cmd = "%:%"; expected = "";
+ 	BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+ 	BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_user_variable_substitution_1 )
+{
+    std::cout <<  "ANode:: ...test_user_variable_substitution_1\n";
+
+    Defs defs;
+    suite_ptr s = defs.add_suite("suite");
+    s->addVariable(Variable("AVI","avi"));
+
+    NameValueMap user_variables;
+    user_variables.insert( std::make_pair(string("AVI:goblly gook"),string("avtar")) );
+
+   // new rules
+   // %<VAR>:substitute %
+   // If we find VAR, then use it, else use substitute
+   // However when we have user_variables if we find the complete string
+   // in the user variable list, we use user veriable value:
+   // cmd = %FRED:BILL%"   and   user_variable = "FRED:BILL","Joe90"   ===> cmd = "Joe90"
+   std::string cmd = "%AVI:goblly gook%"; std::string expected = "avtar";
+   BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%AVI:goblly%"; expected = "avi";
+   BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%FRED:goblly%"; expected = "goblly";
+   BOOST_CHECK_MESSAGE(s->variable_substitution(cmd,user_variables)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+}
+
+
+static std::vector<std::string> required_server_variables()
+{
+   std::vector<std::string> required_server_variables;
+   required_server_variables.push_back( Str::ECF_PORT() );
+   required_server_variables.push_back( std::string("ECF_NODE") );
+
+   required_server_variables.push_back( Str::ECF_HOME() );
+   required_server_variables.push_back( std::string("ECF_LOG") );
+   required_server_variables.push_back( std::string("ECF_CHECK") );
+   required_server_variables.push_back( std::string("ECF_CHECKOLD") );
+
+   // These variable are read in from the environment, but are not exposed
+   // since they only affect the server
+   // ECF_CHECKINTERVAL
+   // ECF_LISTS
+
+   // variables that can be overridden, in the suite definition
+   required_server_variables.push_back( std::string("ECF_JOB_CMD") );
+   required_server_variables.push_back( std::string("ECF_KILL_CMD") );
+   required_server_variables.push_back( std::string("ECF_STATUS_CMD") );
+   required_server_variables.push_back( std::string("ECF_URL_CMD") );
+   required_server_variables.push_back( std::string("ECF_URL_BASE") );
+   required_server_variables.push_back( std::string("ECF_URL") );
+   required_server_variables.push_back( std::string("ECF_MICRO") );
+
+   // Reference variable, these should be read only
+   required_server_variables.push_back( std::string("ECF_PID") );   // server PID
+   required_server_variables.push_back( std::string("ECF_VERSION") );// server version
+   return required_server_variables;
+}
+
+BOOST_AUTO_TEST_CASE( test_server_variable_substitution )
+{
+   std::cout <<  "ANode:: ...test_server_variable_substitution\n";
+
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+
+   std::vector<std::string> vec = required_server_variables();
+   for(size_t i = 0; i < vec.size(); i++) {
+      if (vec[i] == "ECF_PID") continue;         // CANT test since, this is process ID of server
+      std::string value;
+      BOOST_CHECK_MESSAGE(s->findParentVariableValue(vec[i],value),"Could not find Server variable " << vec[i]);
+      BOOST_CHECK_MESSAGE(!value.empty(),"Empty server variable value for " << vec[i]);
+   }
+
+   for(size_t i = 0; i < vec.size(); i++) {
+      if (vec[i] == "ECF_JOB_CMD") continue;     // CANT test since it requires %ECF_JOB% and %ECF_JOBOUT%
+      if (vec[i] == "ECF_KILL_CMD") continue;    // CANT test since it requires %ECF_PID%
+      if (vec[i] == "ECF_STATUS_CMD") continue;  // CANT test since it requires %ECF_RID%
+      if (vec[i] == "ECF_PID") continue;         // CANT test since, this is process ID of server
+      std::string cmd = "%";
+      cmd += vec[i];
+      cmd += "%";
+      BOOST_CHECK_MESSAGE(s->variableSubsitution(cmd)," substitution failed for " << vec[i] << " : " << cmd);
+      if (vec[i] == "ECF_VERSION") {
+         BOOST_CHECK_MESSAGE( cmd == Version::raw(), "expected '" << Version::raw() << "' but found '" << cmd << "'");
+      }
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_generated_variable_substitution_of_ECF_OUT )
+{
+   // test that if ECF_OUT is defined using %, then we perform variable substitution
+   std::cout <<  "ANode:: ...test_generated_variable_substitution_of_ECF_OUT\n";
+
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+   s->addVariable(Variable("PATH","/fred/bill/joe"));
+   s->addVariable(Variable("ECF_HOME","/ecf_home"));
+   family_ptr f = s->add_family("f");
+   task_ptr t = f->add_task("t");
+   t->addVariable(Variable("ECF_OUT","%PATH%"));
+   family_ptr f1 = s->add_family("f1");
+   f1->addVariable(Variable("PATH2","/fred/bill/joe2"));
+   task_ptr t1 = f1->add_task("t1");
+   t1->addVariable(Variable("ECF_OUT","%PATH2%"));
+
+   // begin_all
+   defs.beginAll();
+   t->update_generated_variables();
+   t1->update_generated_variables();
+
+   // cout << defs;
+
+   string value;
+   value.clear();
+   t->findParentVariableValue(Str::ECF_JOBOUT(),value);
+   BOOST_CHECK_MESSAGE(value == "/fred/bill/joe/suite/f/t.0","ECF_JOBOUT expected /fred/bill/joe/suite/f/t.0, but found " << value);
+
+   value.clear();
+   t1->findParentVariableValue(Str::ECF_JOBOUT(),value);
+   BOOST_CHECK_MESSAGE(value == "/fred/bill/joe2/suite/f1/t1.0","ECF_JOBOUT expected /fred/bill/joe/suite/f/t.0, but found " << value);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/ANode/test/TestVariableSubstitutionDefs.cpp b/ecflow_4_0_7/ANode/test/TestVariableSubstitutionDefs.cpp
new file mode 100644
index 0000000..9dbb074
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestVariableSubstitutionDefs.cpp
@@ -0,0 +1,174 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2015 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <map>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+
+#include "Defs.hpp"
+#include "Str.hpp"
+#include "Version.hpp"
+#include "Ecf.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_defs_variable_substitution )
+{
+    std::cout <<  "ANode:: ...test_defs_variable_substitution\n";
+
+    Defs defs;
+    {
+      std::vector<Variable> vec;
+      vec.push_back(Variable("AVI","avi"));
+      vec.push_back(Variable("BAHRA","bahra"));
+      vec.push_back(Variable("LOWER","10"));
+      vec.push_back(Variable("PATH","/fred/bill/joe"));
+      vec.push_back(Variable("fred","%bill%"));
+      vec.push_back(Variable("bill","%fred%"));
+      vec.push_back(Variable("hello","%hello%"));
+      vec.push_back(Variable("mary","%jane%"));
+      vec.push_back(Variable("jane","10"));
+      defs.set_server().add_or_update_user_variables(vec);
+   }
+
+   // See page 31, section 5.1 variable inheritance, of SMS users guide
+   std::string cmd = "%AVI%-%BAHRA%-%LOWER%-%AVI%";
+   string expected = "avi-bahra-10-avi";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%ECF_VERSION%";   expected = Version::raw();
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%PATH%"; expected = "/fred/bill/joe";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "/%AVI%/%BAHRA%/%LOWER%%PATH%"; expected = "/avi/bahra/10/fred/bill/joe";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%mary%"; expected = "10"; // double substitution
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%fred%"; expected = "%fred%"; // infinite substitution
+   BOOST_CHECK_MESSAGE(!defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%hello%"; expected = "%hello%"; // infinite substitution
+   BOOST_CHECK_MESSAGE(!defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = Ecf::MICRO(); expected = Ecf::MICRO();
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%PATH"; expected = "%PATH";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%%"; expected = "%";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%ERROR%"; expected = "%ERROR%";
+   BOOST_CHECK_MESSAGE(!defs.variableSubsitution(cmd)," substitution expected to fail since ERROR does not exist");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = ""; expected = "";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+
+   // new rules
+   // %<VAR>:substitute %
+   // If we find VAR, then use it, else use substitute
+   cmd = "%AVI:goblly gook%"; expected = "avi";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%PATH:goblly::: gook%"; expected = "/fred/bill/joe";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%LOWER:fred% %AVI:fred2%"; expected = "10 avi";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%LOWER:fred% %AVI:fred2"; expected = "10 %AVI:fred2";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%NULL:goblly gook%"; expected = "goblly gook";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%NULL::goblly gook%"; expected = ":goblly gook";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%NULL:%"; expected = "";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%:%"; expected = "";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed ");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+}
+
+BOOST_AUTO_TEST_CASE( test_defs_variable_substitution_double_micro )
+{
+   std::cout <<  "ANode:: ...test_defs_variable_substitution_double_micro\n";
+
+   Defs defs;
+
+   std::string cmd = "%%"; std::string expected = "%";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%%%"; expected = "%%";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%%%%"; expected = "%%";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "%%%%%"; expected = "%%%";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd)," substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "date +%%Y.%%m.%%d"; expected = "date +%Y.%m.%d";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   cmd = "printf %%02d %HOUR:00%"; expected = "printf %02d 00";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+
+   defs.set_server().add_or_update_user_variables("HOUR","hammer time");
+   cmd = "printf %%02d %HOUR:00%"; expected = "printf %02d hammer time";
+   BOOST_CHECK_MESSAGE(defs.variableSubsitution(cmd),"substitution failed");
+   BOOST_CHECK_MESSAGE( cmd == expected, "expected '" << expected << "' but found '" << cmd << "'");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/TestZombies.cpp b/ecflow_4_0_7/ANode/test/TestZombies.cpp
new file mode 100644
index 0000000..96a9302
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/TestZombies.cpp
@@ -0,0 +1,77 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <stdlib.h>
+
+#include <boost/test/unit_test.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_zombies )
+{
+   cout << "ANode:: ...test_zombies\n";
+   Defs theDefs;
+   suite_ptr s = theDefs.add_suite("s");
+   task_ptr t = s->add_family("f")->add_task("t");
+
+   // SANITY
+   {
+      BOOST_REQUIRE_MESSAGE(s->zombies().size() == 0, "Expected 0 zombies but found " << s->zombies().size());
+      BOOST_REQUIRE_MESSAGE(s->findZombie(ecf::Child::USER).empty(), "Expected no zombies");
+      BOOST_REQUIRE_MESSAGE(s->findZombie(ecf::Child::ECF).empty(), "Expected no zombies");
+      BOOST_REQUIRE_MESSAGE(s->findZombie(ecf::Child::PATH).empty(), "Expected no zombies");
+      ZombieAttr attr;
+      BOOST_REQUIRE_MESSAGE(!t->findParentZombie(ecf::Child::PATH,attr) && attr.empty(), "Expected to NOT find PATH zombies on parent");
+   }
+
+   // ADD
+   std::vector<ecf::Child::CmdType> child_cmds;
+   child_cmds.push_back(ecf::Child::INIT);
+   child_cmds.push_back(ecf::Child::EVENT);
+   child_cmds.push_back(ecf::Child::METER);
+   child_cmds.push_back(ecf::Child::LABEL);
+   child_cmds.push_back(ecf::Child::WAIT);
+   child_cmds.push_back(ecf::Child::ABORT);
+   child_cmds.push_back(ecf::Child::COMPLETE);
+   {
+      s->addZombie( ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10) );
+      BOOST_REQUIRE_MESSAGE(s->zombies().size() == 1, "Expected 1 zombie but found " << s->zombies().size());
+      s->addZombie( ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::FAIL,100) );
+      BOOST_REQUIRE_MESSAGE(s->zombies().size() == 2, "Expected 2 zombie but found " << s->zombies().size());
+      s->addZombie( ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::BLOCK,100) );
+      BOOST_REQUIRE_MESSAGE(s->zombies().size() == 3, "Expected 3 zombie but found " << s->zombies().size());
+   }
+
+   // FIND
+   BOOST_REQUIRE_MESSAGE(!s->findZombie(ecf::Child::USER).empty(), "Expected to find USER zombies");
+   BOOST_REQUIRE_MESSAGE(!s->findZombie(ecf::Child::ECF).empty(), "Expected to find ECF zombies");
+   BOOST_REQUIRE_MESSAGE(!s->findZombie(ecf::Child::PATH).empty(), "Expected to find PATH zombies");
+
+   // FIND on parent
+   {
+      ZombieAttr path_z,ecf_z,user_z;
+      BOOST_REQUIRE_MESSAGE(t->findParentZombie(ecf::Child::PATH,path_z) && !path_z.empty(), "Expected to find PATH zombies on parent");
+      BOOST_REQUIRE_MESSAGE(t->findParentZombie(ecf::Child::ECF,ecf_z) && !ecf_z.empty(), "Expected to find ECF zombies on parent");
+      BOOST_REQUIRE_MESSAGE(t->findParentZombie(ecf::Child::USER,user_z) && !user_z.empty(), "Expected to find USER zombies on parent");
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/Test_ECFLOW-195.cpp b/ecflow_4_0_7/ANode/test/Test_ECFLOW-195.cpp
new file mode 100644
index 0000000..20a3215
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/Test_ECFLOW-195.cpp
@@ -0,0 +1,97 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2015 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( NodeTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_ECFLOW_195 )
+{
+   cout << "ANode:: ...test_ECFLOW_195 re-queue on task should retain label value\n";
+
+   defs_ptr defs = Defs::create();
+   suite_ptr s1 = defs->add_suite("s1");
+   family_ptr f1 = s1->add_family("f1");
+   task_ptr t1 = f1->add_task("t1");
+
+   s1->addLabel( Label("s1","s1"));
+   f1->addLabel( Label("f1","f1"));
+   t1->addLabel( Label("t1","t1"));
+
+   defs->beginAll();
+
+   // Set the labels, with new values
+   s1->changeLabel("s1","xx");
+   f1->changeLabel("f1","xx");
+   t1->changeLabel("t1","xx");
+
+   {  // Check new values have not changed
+      Label s1_label = s1->find_label("s1");
+      BOOST_CHECK_MESSAGE(!s1_label.empty(),"expected to find label 's1'");
+      BOOST_CHECK_MESSAGE(s1_label.new_value() == "xx","expected xx but found " << s1_label.new_value());
+
+      Label f1_label = f1->find_label("f1");
+      BOOST_CHECK_MESSAGE(!f1_label.empty(),"expected to find label 'f1'");
+      BOOST_CHECK_MESSAGE(f1_label.new_value() == "xx","expected xx but found " << f1_label.new_value());
+
+      Label t1_label = t1->find_label("t1");
+      BOOST_CHECK_MESSAGE(!t1_label.empty(),"expected to find label 't1'");
+      BOOST_CHECK_MESSAGE(t1_label.new_value() == "xx","expected xx but found " << t1_label.new_value());
+   }
+
+   // Now requee. the suite and family should be cleared and task label should remain.
+   defs->requeue();
+
+   {  // Suite and Family labels should be reset, and task labels should retain their values
+      Label s1_label = s1->find_label("s1");
+      BOOST_CHECK_MESSAGE(!s1_label.empty(),"expected to find label 's1'");
+      BOOST_CHECK_MESSAGE(s1_label.new_value().empty(),"expected empty string for suite label value after re-queue, but found " << s1_label.new_value());
+
+      Label f1_label = f1->find_label("f1");
+      BOOST_CHECK_MESSAGE(!f1_label.empty(),"expected to find label 'f1'");
+      BOOST_CHECK_MESSAGE(f1_label.new_value().empty(),"expected empty string for family label value after re-queue, but found " << f1_label.new_value());
+
+      Label t1_label = t1->find_label("t1");
+      BOOST_CHECK_MESSAGE(!t1_label.empty(),"expected to find label 't1'");
+      BOOST_CHECK_MESSAGE(t1_label.new_value() == "xx","Expected task label to remain unchanged after re-queue but found " << t1_label.new_value());
+   }
+
+   // After explicit re-queue expect new labels to be empty
+   s1->requeue_labels();
+   f1->requeue_labels();
+   t1->requeue_labels();
+   {
+      Label s1_label = s1->find_label("s1");
+      BOOST_CHECK_MESSAGE(!s1_label.empty(),"expected to find label 's1'");
+      BOOST_CHECK_MESSAGE(s1_label.new_value().empty(),"expected empty string for suite label value after explicit re-queue, but found " << s1_label.new_value());
+
+      Label f1_label = f1->find_label("f1");
+      BOOST_CHECK_MESSAGE(!f1_label.empty(),"expected to find label 'f1'");
+      BOOST_CHECK_MESSAGE(f1_label.new_value().empty(),"expected empty string for family label value after explicit re-queue, but found " << f1_label.new_value());
+
+      Label t1_label = t1->find_label("t1");
+      BOOST_CHECK_MESSAGE(!t1_label.empty(),"expected to find label 't1'");
+      BOOST_CHECK_MESSAGE(t1_label.new_value().empty(),"expected empty string for task label value after explicit re-queue, but found " << t1_label.new_value());
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite.man b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite.man
new file mode 100644
index 0000000..5fce62e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite.man
@@ -0,0 +1,4 @@
+%manual
+%include <manual.h>
+suite manual
+%end
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family.man b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family.man
new file mode 100644
index 0000000..0e9c2d0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family.man
@@ -0,0 +1,5 @@
+Special case where there are no manual directives.
+Just include contents of file as is:
+
+no directives in here either
+%include <manual.h> 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/head.h b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/head.h
new file mode 100644
index 0000000..b93927a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/head.h
@@ -0,0 +1,44 @@
+#!/bin/ksh
+
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the three variables that are needed for any
+# communication with ECF_
+
+export ECF_PORT=%ECF_PORT%    # ECF_ port numner
+export ECF_NODE=%ECF_NODE%    # The name ecf server that issued this task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of smsinit
+# Here we give the current PID.
+
+#smsinit $$
+
+# Defined a error hanlder
+
+ERROR() {
+	set +e        # Clear -e flag, so we don't fail
+	#smsabort      # Notify ECF_ that something went wrong
+	trap 0        # Remove the trap
+	exit 0        # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t1.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t1.ecf
new file mode 100644
index 0000000..b43ded3
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t1.ecf
@@ -0,0 +1,81 @@
+%manual
+	OPERATORS: This is an example of using a manual
+	
+	This is used to also test variable subsitution of 
+	generated variables
+	SUITE     = %SUITE%
+	DATE      = %DATE%
+	DAY       = %DAY%
+	DD        = %DD%
+	DOW       = %DOW%
+	DOY       = %DOY%
+	MM        = %MM%
+	MONTH     = %MONTH%
+	YYYY      = %YYYY%
+	ECF_DATE   = %ECF_DATE%
+	ECF_TIME   = %ECF_TIME%
+	ECF_CLOCK  = %ECF_CLOCK%
+
+	FAMILY    = %FAMILY%
+	FAMILY1   = %FAMILY1%
+
+	TASK      = %TASK%
+	ECF_RID    = %ECF_RID:<not defined yet, since empty string in task>%
+	ECF_TRYNO  = %ECF_TRYNO%
+	ECF_NAME   = %ECF_NAME%
+	ECF_PASS   = %ECF_PASS%
+	ECF_SCRIPT = %ECF_SCRIPT%
+	ECF_JOB    = %ECF_JOB%
+	ECF_JOBOUT = %ECF_JOBOUT%
+    
+    Other ECF_ variables
+   ECF_KILL_CMD    = %ECF_KILL_CMD:<not defined yet>%
+   ECF_STATUS_CMD  = %ECF_STATUS_CMD:<not defined yet>%
+	ECF_JOB_CMD     = %ECF_JOB_CMD%
+	ECF_HOME      = %ECF_HOME%
+	ECF_TRIES     = %ECF_TRIES:<Error>%
+	SMFILES       = %SMFILES:<not defined yet>%
+	ECF_INCLUDE   = %ECF_INCLUDE:<not defined yet>%
+	ECF_FETCH     = %ECF_FETCH:<not defined yet>%
+	ECF_OUT       = %ECF_OUT:<not defined yet>%
+	ECF_MICRO=%ECF_MICRO%
+%end
+
+#============================================================
+# Using angle brackets should use ECF_INCLUDES
+#=========================================================
+%include <head.h>
+
+
+echo do some work
+# SLEEPTIME is defined thedefs.def file. Test variable substituition
+sleep %SLEEPTIME%
+echo end of job
+
+
+%include <tail.h>
+
+# This is used in TestEcfFile.cpp
+# o check we handle ecfmicro when extracting manuals
+# o ensure we only handle manual/end if preceded with current ecfmicro char
+# o Pre-process %includes in manual, treat contents as manual contents
+%ecfmicro *
+*manual
+*include <manual.h>
+ manual-1
+ end-1
+*end
+*ecfmicro %
+
+%manual
+Rest of the manual page is placed here, closer to the code
+%end
+%comment
+  Comment start
+%end
+%comment
+  Comment end
+%end
+%nopp
+  ignore everything in here
+%end
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t2.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t2.ecf
new file mode 100644
index 0000000..3676b4d
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t2.ecf
@@ -0,0 +1,19 @@
+ 
+# using %include "filename"
+# include the contents of the file %ECF_HOME%/%SUITE%/%FAMILY%/filename
+#
+# since we are using quotes we expect to find 'head.h' and 'tail.h'
+# in the same directory as the sms files.
+#======================================================================
+%include "head.h"
+
+
+echo do some work
+# SLEEPTIME is defined thedefs.def file. Test variable substituition
+sleep 10
+echo end of job
+
+
+%include "tail.h"
+
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t3.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t3.ecf
new file mode 100644
index 0000000..bccc9bc
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/t3.ecf
@@ -0,0 +1,39 @@
+# using %include "filename"
+# include the contents of the file %ECF_HOME%/%SUITE%/%FAMILY%/filename
+#
+# since we are using quotes we expect to find 'head.h' and 'tail.h'
+# in the same directory as the sms files.
+#======================================================================
+%include "head.h"
+
+
+echo do some work
+sleep 10
+echo end of job
+
+#=====================================================
+# change the ecfmicro character
+%ecfmicro &
+
+&manual
+	START Rest of the manual page is placed here, closer to the code
+&end
+&comment
+  Comment start
+  &SUITE&
+&end
+&comment
+  Comment end
+&end
+&nopp
+  ignore everything in here
+&end
+&manual
+	END of the manual
+&end
+#=====================================================
+# change the ecfmicro character back
+&ecfmicro %
+
+
+%include "tail.h"
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/tail.h b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/tail.h
new file mode 100644
index 0000000..eb7f7a0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite/family/tail.h
@@ -0,0 +1,10 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#smscomplete  # Notify SMS of a normal end
+trap 0       # Remove all traps
+exit 0       # End the shell
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite1_task1.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite1_task1.ecf
new file mode 100644
index 0000000..e69de29
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite1_task2.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite1_task2.ecf
new file mode 100644
index 0000000..e69de29
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME/suite1_task3.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME/suite1_task3.ecf
new file mode 100644
index 0000000..e69de29
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad.ecf
new file mode 100644
index 0000000..6829195
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad.ecf
@@ -0,0 +1,6 @@
+
+# test for unterminated manual
+
+%manual
+	OPERATORS: This is an example of using a manual
+  
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad1.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad1.ecf
new file mode 100644
index 0000000..1ac50ee
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad1.ecf
@@ -0,0 +1,5 @@
+# test for unterminated comment
+
+%comment
+	OPERATORS: This is an example of using a manual
+  
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad10.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad10.ecf
new file mode 100644
index 0000000..ffd33ae
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad10.ecf
@@ -0,0 +1,6 @@
+
+ 
+# test for uneven number for microcharacter's
+ 
+%ecfmicro £
+sleep £SLEEPTIME
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad11.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad11.ecf
new file mode 100644
index 0000000..c8a4f35
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad11.ecf
@@ -0,0 +1,6 @@
+
+ 
+# test for uneven number for microcharacter's
+ 
+%ecfmicro £
+sleep £SLEEPTIME££
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad2.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad2.ecf
new file mode 100644
index 0000000..293c000
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad2.ecf
@@ -0,0 +1,6 @@
+
+# test for missing nopp, manual, comment
+
+%end
+	 
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad3.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad3.ecf
new file mode 100644
index 0000000..2195fa7
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad3.ecf
@@ -0,0 +1,6 @@
+
+# test for unterminate nopp
+
+%nopp
+  ignore everything in here
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad4.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad4.ecf
new file mode 100644
index 0000000..f437831
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad4.ecf
@@ -0,0 +1,13 @@
+
+#
+# test for embedded manual
+%manual
+	OPERATORS: This is an example of usinh a manual
+	First include head.h
+	
+%manual
+    Illegal we can't have embedded manuals
+%end
+
+%end
+ 
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad5.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad5.ecf
new file mode 100644
index 0000000..3e649c2
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad5.ecf
@@ -0,0 +1,15 @@
+
+#
+# test for embedded comments
+#
+
+%comment
+	OPERATORS: This is an example of using a manual
+	First include head.h
+	
+%comment
+    Illegal we can't have embedded comments
+%end
+
+%end
+ 
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad6.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad6.ecf
new file mode 100644
index 0000000..158aeb5
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad6.ecf
@@ -0,0 +1,15 @@
+
+#
+# test for embedded  manual/comment
+#
+
+%comment
+	OPERATORS: This is an example of usinh a manual
+	First include head.h
+	
+%manual
+    Illegal we cannt have embedded manuals in a comment
+%end
+
+%end
+ 
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad7.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad7.ecf
new file mode 100644
index 0000000..0e082d0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad7.ecf
@@ -0,0 +1,8 @@
+ 
+ 
+# test for uneven number for microcharacter's
+ 
+sleep %SLEEPTIME%%
+
+ 
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad8.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad8.ecf
new file mode 100644
index 0000000..c158283
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad8.ecf
@@ -0,0 +1,8 @@
+ 
+ 
+# test for uneven number for microcharacter's
+ 
+sleep %SLEEPTIME
+
+ 
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad9.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad9.ecf
new file mode 100644
index 0000000..823d9e2
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad9.ecf
@@ -0,0 +1,12 @@
+#======================================================================
+# test recursive include
+#======================================================================
+%include <recursive_head.h>
+
+
+echo do some work
+sleep 10
+echo end of job
+
+
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad_ecfmicro.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad_ecfmicro.ecf
new file mode 100644
index 0000000..8899145
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad_ecfmicro.ecf
@@ -0,0 +1,6 @@
+
+
+# Test that a replacement character should be specified for ecfmicro
+ 
+%ecfmicro
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad_ecfmicro_1.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad_ecfmicro_1.ecf
new file mode 100644
index 0000000..45502e9
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/bad_ecfmicro_1.ecf
@@ -0,0 +1,5 @@
+# Test that a replacement character for ecfmicro must be single character
+# Note: a single £ is multi-character of size 2
+ 
+%ecfmicro ££
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/includes/recursive_head.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/includes/recursive_head.h
new file mode 100644
index 0000000..3640d36
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/bad/includes/recursive_head.h
@@ -0,0 +1,14 @@
+#!/bin/ksh
+
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#
+# test recursive include
+#
+%include <recursive_head.h>
+
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/.gitignore b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/.gitignore
new file mode 100644
index 0000000..1c7e4c9
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/.gitignore
@@ -0,0 +1 @@
+/suite
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/ecf_micro_2.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/ecf_micro_2.ecf
new file mode 100644
index 0000000..59f833c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/ecf_micro_2.ecf
@@ -0,0 +1,10 @@
+
+
+%ecfmicro ^
+exe_time=`date +%s -r ACore/bin/^COMPILER_TEST_PATH:gcc^/u_acore`
+^ecfmicro %
+
+
+%manual
+  Rest of the manual page is placed here, closer to the code
+%end
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/ecfmicro.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/ecfmicro.ecf
new file mode 100644
index 0000000..ec2b56c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/ecfmicro.ecf
@@ -0,0 +1,10 @@
+
+# test exfmicro with a pound sign, this is multi-character
+%ecfmicro £  
+
+
+£VAR:sub£
+
+£ecfmicro %
+
+%VAR1:sub%
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/good.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/good.ecf
new file mode 100644
index 0000000..eeb2b4c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/good.ecf
@@ -0,0 +1,27 @@
+%manual
+	OPERATORS: This is an example of usinh a manual
+	First include head.h
+%end
+
+ 
+
+
+echo do some work
+echo end of job
+
+
+ 
+
+%manual
+  Rest of the manual page is placed here, closer to the code
+%end
+%comment
+  Comment start
+%end
+%comment
+  Comment end
+%end
+
+%nopp
+  ignore everything in here
+%end
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/good1.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/good1.ecf
new file mode 100644
index 0000000..0077333
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/good1.ecf
@@ -0,0 +1,8 @@
+ 
+#============================================================
+# test for include included twice. 
+# This is not a recursive include
+#=========================================================
+%include <head.h>
+%include <head.h>
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/config.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/config.h
new file mode 100644
index 0000000..cd29553
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/config.h
@@ -0,0 +1,1527 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#=======================================================================
+#  config.h
+#=======================================================================
+banner config.h
+
+if [[ "$ARCH" != "linux" ]] ;then
+  typeset -l ARCH
+fi
+
+export SCRATCHDIR=${SCRATCHDIR:-UNDEFINED}
+export ARCH=${ARCH:-sgimips}
+export TMPDIR=${TMPDIR:-UNDEFINED}
+export HOST=${HOST:-`hostname`}
+export NPES=${NPES:-0}
+
+if [[ $ARCH = linux ]] ; then
+  export EMOS_TMPDIR=/var/tmp/tmpdir/%TASK%_%ECF_TRYNO%.$$
+  export TMPDIR=$EMOS_TMPDIR
+  [[ -d $TMPDIR ]] || mkdir -p $TMPDIR
+  export USE_EMOS_TMP="true"
+  cd $TMPDIR
+else
+  EMOS_TMPDIR=""
+fi
+
+if [[ "$TMPDIR" = "UNDEFINED" ]] ; then
+   TMPDIR="$TEMP/NQS_tmpdir.$$"  export TMPDIR
+   export USE_EMOS_TMP="true"
+   [[ -d $TMPDIR ]] || mkdir $TMPDIR
+   if [[ $? -ne 0 ]] ; then
+      echo "####### CANNOT CREATE TMPDIR #######" >&2
+      exit 1
+   fi
+fi
+
+PS4="+ "
+
+echo "\
+  This is the config.h file and\n\
+  System variables used were:\n\
+  USER     $USER\n\
+  TMPDIR   $TMPDIR\n\
+  HOME     $HOME\n\
+  HOST     $HOST\n\
+  ARCH     $ARCH\n\
+  PATH     $PATH\n\
+"
+set -xa
+
+#=======================================================================
+#  Experiment version and initial data origin (default values)
+#=======================================================================
+
+EXPVER=%VERSION:0001%
+GRIBCLASS=1
+BASEVER=0001
+BASETIME=1996072200
+
+#=======================================================================
+#  Software configuration (library cycles etc)
+#=======================================================================
+
+IFSMASTER=ifsMASTER
+#####################################
+IFS_CYCLE=35r3
+#####################################
+
+
+SUITE_TYPE=%SUITE_TYPE:"undef"%
+NEWSTREAM=none
+EMOS_CYCLE=000370
+VIEW_IFS=
+VIEW_IFSAUX=
+VIEW_OBSPROC=
+VIEW_OBSORT=
+VIEW_TOVSCODE=
+VIEW_SSMICODE=
+VIEW_BL=
+VIEW_SSA=
+VIEW_SST=
+VIEW_WAM=
+MAKE_LIBS=yes
+
+GRIB_API_VERSION=1.8.0
+GRIB_API_INCLUDE="-I/usr/local/lib/metaps/lib/grib_api/jasper/include -I/usr/local/lib/metaps/lib/grib_api/$GRIB_API_VERSION/include"
+GRIB_API_LIB="-L/usr/local/lib/metaps/lib/grib_api/jasper/lib -ljasper -L/usr/local/lib/metaps/lib/grib_api/$GRIB_API_VERSION/lib -lgrib_api_f90 -lgrib_api"
+export GRIB_API=/usr/local/lib/metaps/lib/grib_api/$GRIB_API_VERSION/bin   # change to fixed version
+export PATH=$GRIB_API:$PATH
+
+#=======================================================================
+#  Model configuration
+#=======================================================================
+
+RESOL=799
+LEVELS=91
+GTYPE=l_2
+FCLENGTH=%FCLENGTH:6%
+FCLENGTH0N=$FCLENGTH
+RUN_GFC=no
+
+#=======================================================================
+#  Analysis parameters
+#=======================================================================
+
+IFSMODE=early_delivery
+PERIOD=6
+TSTEP=720
+
+if [[ "%STREAM%" = SCDA ]] && [[ %MXUP_TRAJ:3% = 1 ]] ; then
+  RESOLINC_0=255 # HR:255, LR:159
+  TSTEP_INC_0=1800
+else
+  RESOLINC_0=95
+  TSTEP_INC_0=3600
+fi
+
+RESOLINC_1=159     # 255 32r1
+RESOLINC_2=255     # 159 32r1
+TSTEP_INC_1=1800
+TSTEP_INC_2=1800
+
+LFG=.false.
+
+ITER_MIN_0=70
+ITER_MIN_1=50
+ITER_MIN_2=50
+MXUP_TRAJ=%MXUP_TRAJ:3%
+NMINSIMPHY=1
+LINCNMI=false
+LVERIFY_SCREEN=true
+SCRANA=active
+
+RESOLFCE=42
+ITER_FCE=150
+NWRIEVEC=25
+
+OBPATH=ops
+BLACK_DS=ops
+BLACK_MM=ops
+BLACK_EX=ops
+
+LOZONE=true
+LOZONECH=true
+ANEMOM_HT=true
+LISENTRPP=true
+LESUITE=false
+
+OBNLAT=90.00
+OBSLAT=-90.00
+OBWLON=-180.00
+OBELON=180.00
+
+MPLARGS="check=0"
+
+#================================
+# New for 25r3
+
+LINRADEX=true
+LREDUCOB=false
+TSLOTSEC=1800
+UPTRAJ_FCE=0
+LAMV_REASSIGN=false
+
+#================================
+# New for 25r4
+
+BRANCH=""
+BRF=0
+LAIRS=true
+PARALLEL=4
+PROJECTS="none"
+
+#================================
+# New for 26r3
+
+if [[ "%SUITE%" = o || "%SUITE%" = e_* ]] ; then
+  LARCHINCR=true
+else
+  LARCHINCR=false
+fi
+
+#================================
+# New for 28r1
+
+FPOSCLD=%FPOSCLD:false%  # should be true for 4dvar, false for 3d_fgat
+PROFILE=%PROFILE:0%  # for diagnostic purposes
+LANOBSENS=false
+
+#================================
+# New for 28r2
+#==========================================================
+# Variables configuring testOfAnalysis
+#==========================================================
+LTESTVAR=false
+NTESTVAR=0
+LCVTEST=false
+LTLTEST=false
+LADTEST=false
+LGRTEST=false
+LTESTINC=false    # should be set to false and will turn off other testing
+
+#==========================================================
+# New for 28r3
+#==========================================================
+REINIHOUR=%REINIHOUR:0%
+ED_PERIOD=%ED_PERIOD:12%
+ED_ONLY=%ED_ONLY:false%
+REINICLASS=%REINICLASS:od%
+REINI_NOT_ED=%REINI_NOT_ED:false%
+OBSTREAM=%STREAM%
+
+#==========================================================
+# New for 29r1
+#==========================================================
+set -a
+LOBREALTIME=%OBREALTIME:false% ; # false in catchup mode, true in rt
+LCALC_PSBIAS=%CALC_PSBIAS:true%
+LUSE_PSBIAS=%USE_PSBIAS:true%
+INIPSBIAS=%INIPSBIAS:true%
+INIVARBC=%INIVARBC:false%
+
+NTYPE_MODERR=2
+NCOMP_MODERR=1
+LFGMODERR=true
+ALPHAQ=0.3         # 31r2
+NSERR=-1
+LINITCV=true
+LMODERRFC=false
+LBGMODERR=false
+
+LPROPTL=false
+LINTEST=false
+
+SAVINI=false
+
+EPSROTPATH=""
+
+#==========================================================
+# New for 29r2
+#==========================================================
+set -a
+LTWINTRUTH=false
+LTWINEXP=false
+TRUTHEXP="none"
+LCO2=false
+LCO2ANER=false
+INICO2=false
+LERA40_PREODB=false
+Q2CREATE_NEWSTREAM=false
+Q2USE=false
+Q2CHANGELIST=0
+
+# EPS
+NSVET=50
+NITERLET=120
+EPSBASIS=50 # number of tropical singular vectors used in
+            # Gaussian sampling
+EPSBASIST=5 # number of tropical singular vectors used in
+
+            # in order to startup emc suite this might be set to 25
+            # for the first 2 way. Then make_sv would not be used.
+
+EPSEVO_NORMALIZE=true
+ICPEXPVER=%ICPEXPVER:0001%
+EPSGAMMA_TC2INI=1.5
+EPSGAMMA_EVO2INI=1.0 # 1.5 for 29r2
+EPSGAMMA=0.014
+EPSSIMPL=5     # Gaussian sampling for all singular vectors
+#==========================================================
+# New for 29r3
+#==========================================================
+
+LGPINNER=true
+NFRDHP=3
+
+#==========================================================
+# New for 30r1
+#==========================================================
+FILTERRESOL=255
+FILTERFACTOR=5
+FILTEREXPONENT=4
+EC_FILL_NANS=false
+USE_SMT=%USE_SMT:true%
+
+if [[ "%EC_SMT:yes%" = yes ]] ; then
+  USE_SMT=true
+else
+  USE_SMT=false
+fi
+
+#==========================================================
+# New for 30r2
+#==========================================================
+LUSE_RSTBIAS=%USE_RSTBIAS:true%
+ERA_MODE=false
+
+#==========================================================
+# New for 31r1
+#==========================================================
+DOFDBK=true # ie true
+LCALC_RSTBIAS=%CALC_RSTBIAS:false%
+VARBC_PATH=%VARBC_PATH:standard%
+NCS_CONFIG=2  # 31r2
+USE_SMT=%USE_SMT:true%
+LPML=%PRODUCE_EPS_ML:0%
+
+if [[ %EC_SMT:yes% = yes ]] && [[ %USE_SMT:true% = false ]] ; then
+  echo "ECF_ variable EC_SMT and USE_SMT are not compatible"
+  exit 1
+elif [[ %EC_SMT:yes% = no ]] && [[ %USE_SMT:true% = true ]] ; then
+  echo "ECF_ variable EC_SMT and USE_SMT are not compatible"
+  exit 1
+fi
+#==========================================================
+# New for 31r2
+#==========================================================
+LRAIN4D=true
+LNMPHYS=true   #32r1
+ENDANENS=0
+ENDANENSODB=0
+
+P4CLIENT=0     #32r1 not used in operations
+
+#==========================================================
+# New for 32r1
+#==========================================================
+LCONSTANT_VARBC=false
+
+#==========================================================
+# New for 32r2
+#==========================================================
+LIASI=true
+
+INIMODISALB=true # if intial data was run with 32r1 or later
+VARBC_ARCHIVE_EVOLVE=false
+
+#==========================================================
+# New for 32r3
+#==========================================================
+LFULL_IASI=%LFULL_IASI:true%   # true = use full iasi data and screen: false use screened data
+LGEMS=false                    # run with gems parameters
+GHGVAR=
+GRGVAR=
+AEROVAR=
+TRACVAR=
+INIGHG=false
+INIGRG=false
+INIAERO=false
+INITRAC=false
+LEVGEN=true          # Use van Genuchten hydrology
+INIHTESSEL=true      # if starteding from experiment where LEVGEN=true
+LCALC_RSTRHBIAS=%CALC_RSTRHBIAS:true%
+LUSE_RSTRHBIAS=%LUSE_RSTRHBIAS:true%
+LSSMI1D=true
+LSSMIS1D=true
+LAMSRE1D=true
+LTMI1D=true
+LAMSRE1D=true
+ODB_IO_OPENMP=1
+
+#==========================================================
+# New for 33r2
+#==========================================================
+LOBSCOR=false
+
+#==========================================================
+# New for 35r2
+#==========================================================
+
+LECURR=false
+INIECURR=false
+LSCATT_NEUTRAL=false
+D3GGFIELDSSTEND="0"
+LFSOBS=false
+LSEKF=false
+
+#==========================================================
+# New for 35r3
+#==========================================================
+# if EPS or associated then LEMISKF & LWEAK4DVAR=false
+INIOZONE=true
+
+WEAK4D_INTERV=0.0
+LMODERR_PERIODIC=false
+NSPLIT4DWIN=0
+LBALSTRATO=false
+AMSU_LAND=Dynamic_emis
+EMISKF_PATH=standard
+INIEMISKF=true
+INIMODERR=true
+LDUCTDIA=false
+LASCATSM=true
+if [[ %SUITE% = "e_*" ]] ; then LANOBSENS=true; fi
+
+#==========================================================
+# Variables configuring ifs_ctm
+#==========================================================
+LCOUPLO4=false
+CTM_MODEL=mozart
+NFRCOUPLO4=1
+NFRCOUPLO4_FB=1
+LGLOBALGP=true
+LGLOBALSP=true
+MPROCGPG=1
+MPROCSPG=1
+LOUT_SPC=false
+LOUT_FLUX=true
+LOUT_COOR=false
+LIN_GRG=true
+LIN_COOR=false
+LCOUPLO4_CTM=true
+LOUT_GRG=false
+LOUT_CO=false
+LOUT_SO2=false
+LOUT_NOX=false
+LOUT_NO2=false
+LOUT_GO3=false
+LOUT_HCHO=false
+LNOX2NO2=false
+INTERP2D=bilinear
+PARA_SEARCH=global
+IF_MASKED=novalue
+LGRG_CYCLE=true
+LDIFF_GRG=false
+LCONV_GRG=false
+LDIA_GRG=false
+NPROC_CTM=8
+NPROC_CTM_AN=8
+NPROC_DRV=1
+CTM_THREADS=4
+CTM_THREADS_AN=4
+DRV_THREADS=1
+DRV_THREADS_AN=1
+IFS_THREADS_AN=6
+LSTATS=true
+
+#==========================================================
+# Variables configuring Gems
+#==========================================================
+LGEMS=false
+GHGVAR=""
+INIGHG=false
+GRGVAR=""
+INIGRG=false
+AEROVAR=""
+INIAERO=false
+TRACVAR=""
+INITRAC=false
+
+#=======================================================================
+# DR_HOOK
+#=======================================================================
+DR_HOOK=true # 30r1 was false
+DR_HOOK_OPT="none" # 30r1 was "prof"
+DR_HOOK_PROFILE_LIMIT=-10
+DR_HOOK_HASHBITS=15
+DR_HOOK_CATCH_SIGNALS=false
+DR_HOOK_IGNORE_SIGNALS=false
+
+LIBHPM=""
+if [[ $DR_HOOK = true ]] ; then
+  DR_HOOK_OPT=`echo $DR_HOOK_OPT | sed -e 's/\// /g'`
+  if [[ $ARCH = ibm_power4 ]] ; then
+    LIBHPM="-L/usr/pmapi/lib -lpmapi"
+  fi
+fi
+
+#=======================================================================
+#  BC project setup for analysis (only those that are different)
+#=======================================================================
+
+if [[ "%STREAM%" = SCDA ]] ; then
+  PERIOD_4D=6 ;
+  WINDOW_LENGTH_4D=%WINDOW_LENGTH_4D:12%
+  WINDOW_OFFSET_4D=%WINDOW_OFFSET_4D:9%
+
+  if [[ %MXUP_TRAJ:3% = 3 ]] ; then
+
+  IFSMODE=4d_inc
+
+  else
+
+  IFSMODE=3d_fgat
+  ITER_MIN=70
+  ITER_MIN_1=0
+  SIMUL_MIN=80
+  SIMUL_MIN_1=0
+  LISENTRPP=false
+  LVERIFY_SCREEN=false
+
+  fi
+else
+  # PERIOD_4D=6 ; # 20040423 should stay 12 by default (for SCDA reinit), then SMS variable is set to 12, this variable is considered for reinit = false (vardata.sms)
+if [[ `echo %FAMILY:NOT_DEF% | cut -d / -f 1` = "main" ]] ; then
+  ## RD behaviour : default is constant 12,
+  ## if SMS variable is changed, task should consider it specifically
+  ## some tasks (vardata, fetcherr) may want this default and not SMS
+  ## variable for REINITIALIZE state
+  PERIOD_4D=12
+  WINDOW_LENGTH_4D=12
+  WINDOW_OFFSET_4D=3
+
+else  # SMS variable IS the environment variable for other families
+  PERIOD_4D=%PERIOD_4D:12%
+  WINDOW_LENGTH_4D=%WINDOW_LENGTH_4D:12%
+  WINDOW_OFFSET_4D=%WINDOW_OFFSET_4D:3%
+fi
+fi
+
+#=================================================
+#  Simplified Kalman filter parameters
+#=================================================
+
+TSTEP_SV=1200
+RESOLSV=42
+NLANTYPE=6
+NJDSTOP=48
+NITERL=60
+NINNER=30
+NEIGEVO=60
+HESSTYPE=3d
+SVPPFRQ=6
+
+
+################### New for 23r1 #############
+LATE4DSTART=true
+FPOSINC=false
+INICLOUDAN=true
+
+
+#=======================================================================
+#  Satellite parameters
+#=======================================================================
+
+LTOVS=.false.
+LATOVS=true
+LAIRS=true # 31r1
+LSSMI=true # 33r1
+LSCAT=.true.
+LGEOS=true
+LRAIN1D=false    # 35r2
+LSSMIRAIN=true   # 33r2
+LSSMISRAIN=true  # 35r3
+LTMIRAIN=true    # 35r3
+LAMSRERAIN=true  # 33r2
+LPRERAD1C=false
+LREO3=true
+LAEOLUS=false # 31r1
+LSSMIS=true   # 31r2
+LAMSRE=true   # 31r2
+LMERIS=true # 20080714 until which was false  # 33r2
+LTMI=true     # 31r2
+LGPSRO=true   # 31r2
+
+BIAS_PATH_AMV=none
+BIAS_PATH_REO3=none
+LREO3_BCOR=false
+
+BIASCOLD=yes
+BIASDAYS=14
+BIASMISS=7
+BIAS_ARCHIVE=1
+
+if [[ "%SUITE%" = o || "%SUITE%" = e_* ]] ; then
+  export FDB_NOF_BUFF=4
+  export FDB_BUF_SECT_SIZE=25165824
+elif [[ "%SUITE%" = bc || "%SUITE%" = ebc_* ]] ; then
+  export FDB_NOF_BUFF=3
+  export FDB_BUF_SECT_SIZE=33554432
+else
+  export FDB_NOF_BUFF=4
+  export FDB_BUF_SECT_SIZE=4194304
+fi
+
+# 23r4
+RSTBIAS=true
+
+# 24r2
+ERAFS=false
+
+#  SATMON parameters
+SMON_OPT_DIR=""
+SMON_OPT_GEOS=ops
+SMON_OPT_NOAA=ops
+SMON_OPT_DMSP=ops
+SMON_OPT_O3=ops
+SMON_OPT_O3KNMI=ops
+SMON_OPT_O3MSG=ops
+SMON_OPT_TEMP=ops
+SMON_OPT_PWC=ops
+SMON_OPT_AMV=ops
+SMON_OPT_DBAMV=ops       # 33r1
+SMON_OPT_AIRS=ops
+SMON_OPT_IASI=ops        # 32r3
+SMON_OPT_EARS=ops
+SMON_OPT_PACRARS=ops     # 33r1
+SMON_OPT_MERIS=ops       # 33r2
+SMON_OPT_SSMIS=ops       # 31r2
+SMON_OPT_AMSRE=ops       # 31r2
+SMON_OPT_TMI=ops         # 31r2
+SMON_OPT_GPSRO=ops       # 31r2
+SMON_OPT_SCATT=ops       # 35r3
+SMON_OPT_SLMOIST=ops     # 35r3
+
+
+SATROOT=/od_archive/data/satmon
+
+#==========================================================
+# Variables configuring Reanalysis
+#==========================================================
+MEANS=true
+MOMENTS=true
+INTEGRALS=true
+INCREMENTS=true
+PLOTS=true
+RSTBIAS_TS=false
+RSTBIAS_SE=true
+ERAPRODUCTS="/era/intprod/data/monitor"
+
+#=======================================================================
+#  Coupled wave model parameters
+#=======================================================================
+
+WAVE=yes
+WAM2WAY=yes
+WAMNSTPW=1
+  if [[ "%FSFAMILY%" = @(mc|refc|assim) ]] ; then
+WAMRESOL=global100
+else
+WAMRESOL=global36 # HR global50
+fi
+WAMALT=yes
+WAMSAR=yes
+WAMSARASS=true
+
+if [[ "%FSFAMILY%" = "euroshelf" || $SUITE_TYPE = "law" ]] ; then  # law suites
+  WAMNFRE=30  # 36 future 0044
+  WAMNANG=24  # 36 future 0044
+else
+  WAMNFRE=30
+  WAMNANG=24
+fi
+
+date_ers1_wave=1994010100
+
+if [[ $BASETIME -lt $date_ers1_wave || $WAMALT != yes ]] ; then
+  WAMANPARAM_DYN="215/216/220/221/222/223/224/225/226/227/228/229/230/231/232/233/234/235/236/237/238/239/244/245/249"
+else
+  WAMANPARAM_DYN="215/216/217/218/220/221/222/223/224/225/226/227/228/229/230/231/232/233/234/235/236/237/238/239/244/245/246/247/248/249/252/253/254"
+fi
+
+WAMANPARAM_STAT="219"
+WAMANPARAM=$WAMANPARAM_STAT/$WAMANPARAM_DYN
+
+WAMFCPARAM_STAT="219"
+WAMFCPARAM_DYN="215/216/217/218/220/221/222/223/224/225/226/227/228/229/230/231/232/233/234/235/236/237/238/239/244/245/249/252/253/254"
+WAMFCPARAM=$WAMFCPARAM_STAT/$WAMFCPARAM_DYN
+
+INIWAVE=yes
+WAMCOLDLENGTH=240
+WAMSTREAM=0
+# Many of these values are overridden for
+# local area model in law.h
+
+if [[ "%STREAM%" = SCDA ]] ; then
+  WAMSTREAM=1027
+elif  [[ "%STREAM%" = DCDA ]] ; then
+  WAMSTREAM=1029
+fi
+
+#=======================================================================
+#  Initial data parameters
+#=======================================================================
+
+
+INITIME=%INITIME:2001042900%
+INICLASS=%INICLASS:od%
+INISTREAM=%INISTREAM:da%
+# da : early delivery suite initialised from standard suite
+# dcda : early delivery suite initialised from another delayed cutoff suite
+INITYPE=4v
+INIEXPVER=%INIEXPVER:0001%
+INILEVELS=%INILEVELS:60%
+INISTEP=%INISTEP:0%
+# size of the 4dvar window
+
+# offset from the beginning of the 4V for FC
+INIOFFSET_4D=%INIOFFSET_4D:3%
+# 9 : early delivery suite initialised from standard suite
+# 3 : early delivery suite initialised from another ealry delivery suite
+INITILES=true
+INIRESOL=799 # was 511
+INICI=true
+FORCE_FP=no
+
+if [[ "%FAMILY1:NOT_DEF%" = sv || "%FAMILY1:NOT_DEF%" = m2_12 || "%FAMILY1:NOT_DEF%" = m2_00 || "%FAMILY1:NOT_DEF%" = m1_12 || "%FAMILY1:NOT_DEF%" = m1_00 ]] ; then
+  INITYPE=fc
+#  ------- vv
+#  INISTEP=12   # for 00,12 UTC forecasts
+#  ------- ^^
+  INISTEP=6     # for 06,18 UTC forecasts
+  INISTREAM=dcda
+  INISUFFIX="_sv"
+else
+  INISUFFIX=
+fi
+
+if [[ "$ARCH" != "linux" ]];then
+  typeset -l REINITIALIZE
+fi
+REINITIALIZE=%REINITIALIZE:false%
+REINIEXPVER=%REINIEXPVER:0001%
+REINISTREAM=%REINISTREAM:da%
+REINIPERIOD_4D=%REINIPERIOD_4D:12%
+REINIOFFSET=%REINIOFFSET:12%
+ED_CUTOFF=%ED_CUTOFF:4%
+
+#=================================================
+# PE settings
+#=================================================
+NPES_MKCMA=%MKCMANPES:1%
+NPES_AN=%ANNPES:1%
+NPES_FC=%FCNPES:1%
+NPES_SV=%FCNPES:1%
+#=================================================
+#  PREPAN parameters
+#=================================================
+
+OWNER=emos
+AMASTER=/ws/home/ma/emos/amaster/xxxx
+RUN_PARALLEL=true
+
+#=======================================================================
+#  Sami's variables + ODB
+#=======================================================================
+
+CONCAT=1
+PMETHOD=2
+FSODB=/emos_backup
+
+ODB_CTX_DEBUG=0
+ODB_MAXHANDLE=5
+ODB_STATIC_LINKING=1
+ODB_UNDEF=2146959359
+ODB_CCMA_CREATE_DIRECT=1
+ODBSAVE_ODBCMP=true     #31r2
+ODB_FROM_FB=false
+if [[ "%STREAM%" = SCDA ]] ; then
+  ODBSAVE_CCMA=false
+  ODBSAVE_ECMA=false
+else
+  ODBSAVE_CCMA=true
+  ODBSAVE_ECMA=true
+fi
+ODB_CATCH_SIGNALS=0
+ODB_CCMA_IGNORE_TSLOTS=0
+ODB_CCMA_OBS_RANDOMIZE=0
+ODB_CCMA_WTMETHOD=107
+ODB_ERRTRA=1
+ODB_FLPCHECK=0
+ODB_INTCHECK=0
+ODB_IO_METHOD=4
+ODB_IO_FILESIZE=128
+ODB_PACKING=-1
+ODB_REPRODUCIBLE_SEQNO=4
+ODB_TEST_INDEX_RANGE=0
+ODB_WRITE_EMPTY_FILES=0
+
+MANPATH=""
+#=======================================================================
+#  Coupled wave variables
+#=======================================================================
+
+WGRIBIN=yes
+
+#================================
+# New for 19r1, should be put in correct place.
+
+HESS3D=3d
+PPFRQ=12
+LINCNMI=false
+NEIGEVO=60
+#================================
+# New for 24r4
+
+LMAPSOP=false
+MPP_TYPE=1
+if [[ "%STREAM%" = SCDA ]] && [[ %MXUP_TRAJ:3% = 1 ]] ; then
+  LTRAJHR=false
+else
+  LTRAJHR=true
+fi
+
+#================================
+# New for 26r3
+
+LMODERR=false
+
+#=======================================================================
+#  Plot control
+#=======================================================================
+
+PLOT_RMS=true
+
+#=======================================================================
+#  Standard libraries
+#=======================================================================
+
+SCHOST=%SCHOST%
+SCHOST_BKUP=%SCHOST_BKUP:not_set%
+# storage host
+STHOST=%STHOST:%
+STHOST_BKUP=%STHOST_BKUP%
+WSHOST=%WSHOST%
+
+LIBRESOL=.R64.D64.I32
+ELIB=/usr/local/lib/metaps/lib/${EMOS_CYCLE}
+
+if [[ $ARCH = ibm_power* ]] ; then
+  SLIB=/usr/local/lib
+###########################################
+#temporary setting: A.Hofstadler, 200200821
+  EMOSLIB="-lemos.R64.D64.I32"
+  ECLIB="-L $SLIB "
+  FDBLIB="-L $SLIB -lfdb"
+#temporary setting:
+###########################################
+  EMOSLIB="-L $ELIB $EMOSLIB"
+  OBJECT_MODE=64
+  XLFRTEOPTS=err_recovery=no
+else
+###########################################
+#temporary setting: A.Hofstadler, 200200821
+#  EMOSLIB="-lemos.R64.D64.I32"
+  EMOSLIB="-lemos.R32.D64.I32" # or single???
+#temporary setting:
+###########################################
+  SLIB=/usr/local/lib
+  EMOSLIB="-L $ELIB $EMOSLIB"
+fi
+
+emosbin=/home/ma/emos/bin/${EMOS_CYCLE}/$ARCH
+#=======================================================================
+#  Singular vector configuration
+#  NSVHEM=1 for SVs over NH only
+#         2      "       SH only
+#         3      "       NH+SH
+#=======================================================================
+
+EPSSVPATH=
+EPSSVROTPATH=
+EPSFCRES=%EPSFCRES:399% # HR 255
+
+# VAREPS 30r2
+EPSFCRES_A=%EPSFCRES_A:399% # HR 255
+EPSFCRES_B=%EPSFCRES_B:255% # HR 255
+EPSFCRES_C=%EPSFCRES_C:255% # HR 255
+
+EPSFCLENGTH_A=%EPSFCLENGTH_A:240%
+EPSFCLENGTH_B=%EPSFCLENGTH_B:144%
+EPSFCLENGTH_C=%EPSFCLENGTH_C:408%
+
+EPSINISTEP_B=%EPSINISTEP_B:216%
+EPSINISTEP_C=%EPSINISTEP_C:360%
+
+EPSFCGTYPE=%EPSFCGTYPE:l_2%
+EPSFCGTYPE_A=%EPSFCGTYPE_A:l_2%
+EPSFCGTYPE_B=%EPSFCGTYPE_B:l_2%
+EPSFCGTYPE_C=%EPSFCGTYPE_C:l_2%
+
+EPSVARHDIF=false
+EPSVARHDIFT=24
+
+EPS_USE_ICP=0
+# /VAREPS
+
+EPSFCLEV=%EPSFCLEV:62%  # HR 40
+EPSSVRES=%EPSSVRES:42%
+EPSSVGTYPE=_full
+EPSSVLEV=%EPSSVLEV:62%  # HR 40
+EPSMEMBERS=`echo "%ENSEMBLES:50% + 1" | bc`
+EPSNENS=%ENSEMBLES:50%
+EPSEVO=1
+EPSHEM=%EPSHEM:3%
+EPSEVOTIME=48
+
+EPSWAMRESOL=%EPSWAMRESOL:global100%
+EPSWAMNSTPW=%EPSWAMSTPW:1%
+EPSTSTEP=%TSTEP:1800% # HR 2700
+EPSSVTSTEP=%EPSSVTSTEP:900%
+
+if [[ %STREAM% = MAED ]] ; then
+  INIMODISALB=false
+TSTEP=$EPSTSTEP
+fi
+
+EPSTSTEP_SV=900 # HR 1200
+EPSWAMALT=no
+EPSTYPE=%EPSTYPE%
+EPSMEMBER=%MEMBER%
+FCTOTAL=$EPSMEMBERS
+NTOTAL=$EPSNENS
+EPSSVDIAB=%EPSSVDIAB:false%
+EPSSVNUM=%EPSSVNUM:0%
+
+# 28r3
+DELTAHH_TC_TRACKS=12 # 12h lag from previous TC used in targets task
+EPSSV_TOPT=48        # optimization time for the tropical singular vectors
+                     # targets
+
+TC_TRACKS_EXPVER=%VERSION:0001%    # ???TDB
+
+if [[ %VERSION:0001% = 0020 ]] ; then
+  TC_TRACKS_EXPVER=0001
+fi
+
+OD_PROJ=%OD_PROJ:od%
+
+if [[ "%SUITE%" = emc* ]] && [[ %IS_REAL_TIME:false% = false ]] ; then
+  TC_TRACKS_PATH=/emos/tc/0001
+elif [[ $REINITIALIZE = true ]] ; then
+  TC_TRACKS_PATH=/emos/tc/$REINIEXPVER
+elif [[ %FIRST_DAY% = 1 ]] ; then
+  TC_TRACKS_PATH=/emos/tc/$INIEXPVER
+  TC_TRACKS_EXPVER=0001
+elif [[ ! "$OD_PROJ" = "od" ]] ; then
+# || [[ %IS_REAL_TIME:false% = false ]] ; then
+  ## MC_NO and other MS suites
+  ## and catchup mode running 12 cycle only
+  TC_TRACKS_PATH=/emos/tc/0001
+else
+  TC_TRACKS_PATH=/emos/tc/%VERSION%
+fi
+
+TC_TRACKS_FROM_MARS=true
+TC_TRACKS_CLASS=od
+
+EPSSVTCSUB=%EPSSVTCSUB:0%
+EPSTCBB=%EPSTCBB:1%       # use TC tracks to define optimization regions
+EPSSVOP=%EPSSVOP:0%       # not required to set sms variable in OD
+EPSSVTC_ORTHONORM=1       # ortho-normalize tropical SVs
+
+RUNHINDCAST=%RUNHINDCAST:0% # 1 for back loop and 0 for realtime
+
+#=======================================================================
+# EFI PATHS:
+#=======================================================================
+EFI_WS_CACHE=/efi_clim/data/cache
+EFI_WS_SCRATCH=/efi_clim/data/scratch
+EFI_ECFS_PATH=ec:/emos/efi_clim
+EFI_HPCF_PATH=/home/ma/emos/data/efi_clim
+#=======================================================================
+#  Ocean model configuration
+#=======================================================================
+
+OCVER=h2e2
+ASVER=cy2r3
+
+#=======================================================================
+#  Configuration for sensitivity suite
+#=======================================================================
+
+SENSFCRES=255
+SENSFCLEV=60
+SENSADJRES=63
+SENSADJLEV=60
+SENSADJGTYPE=_2
+SENSFCGTYPE=l_2
+SENSADJSTEP=48
+SENSADJTSTEP=600.0
+SENSRUNFC=yes
+INISPQ=no
+
+#new for 25r1
+SENSADJADVEC=euler
+SENSFORCE=false
+SENSDIAB=true
+SENSITER=6
+
+#=======================================================================
+#  The disk configuration
+#  Look at e-suite configuration below also
+#=======================================================================
+
+if [[ $ARCH = ibm_power* ]] ; then
+  if [[ "%SUITE%" = mc_no ]] ; then
+    TROOT=$STHOST/ms_crit/teps
+    WROOT=$STHOST/ms_crit/teps
+    OROOT=$STHOST/emos_data
+    FDB_ROOT=$STHOST/ms_crit/fdb
+    FDB_IROOT=$STHOST/ms_crit/fdb
+    WAVEEPS_ROOT=$FDB_ROOT
+    WAVEEPS_IROOT=$FDB_IROOT
+  elif [[ "%SUITE%" = e*35r3* || "%SUITE%" = "e_sync" || "%SUITE%" = "emc_no*" ]] ; then
+    TROOT=$STHOST/emos_esuite/emos_data
+    WROOT=$STHOST/emos_esuite/emos_data
+    OROOT=$STHOST/emos_data
+    WBASE=/
+    FDB_ROOT=$STHOST/emos_esuite/ma_fdb
+    FDB_ROOT_BKUP=$STHOST_BKUP/emos_esuite/ma_fdb
+    FDB_IROOT=$STHOST/emos_esuite/ma_fdb
+    WAVEEPS_ROOT=$FDB_ROOT
+    WAVEEPS_IROOT=$FDB_IROOT
+  else
+    TROOT=$STHOST/emos_data
+    WROOT=$STHOST/emos_data
+    OROOT=$STHOST/emos_data
+    FDB_ROOT=$STHOST/ma_fdb
+    FDB_ROOT_BKUP=$STHOST_BKUP/ma_fdb
+    FDB_IROOT=$STHOST/ma_fdb
+    WAVEEPS_ROOT=$STHOST$FDB_ROOT
+    WAVEEPS_IROOT=$STHOST$FDB_IROOT
+  fi
+  if [[ "%FSFAMILY%" = mars  ]] ; then
+    WROOT=/od_archive/data
+  fi
+elif [[ $ARCH = linux ]] ; then
+  TROOT=/var/tmp/tmpdir/emos
+  WROOT=/var/tmp/tmpdir/emos
+  OROOT=/var/tmp/tmpdir/emos
+  FDB_ROOT=""
+  FDB_IROOT=""
+else
+  TROOT=/var/tmp/emos
+  WROOT=/var/tmp/emos
+  OROOT=/var/tmp/emos
+  FDB_ROOT=""
+  FDB_IROOT=""
+fi
+
+WBASE=${WROOT}/${EXPVER}
+
+XROOT=/home/ma/emos
+XLIB=$XROOT/lib/${IFS_CYCLE}
+XDATA=$XROOT/data
+XBINS=$XROOT/bin
+XMOD=/cc/rd/module/frt
+XSRC=$XROOT/src
+ODATA=/home/ma/emos/data
+SCRATCH=/ws/scratch/ma/emos
+
+FSROOT=/$USER
+FSOROOT=/emos
+FSFAMILY=""
+FSXDATA=/emos/data
+FSXBINS=/emos/$ARCH/bin
+
+#=======================================================================
+#
+#  The following is the configuration filled in by the SMS
+#
+#=======================================================================
+
+#EXPVER=%VERSION% # done further up...
+
+if [[ "%USE_YMD:false%" = true ]] ; then
+  BASETIME=%YMD%%EMOS_BASE%
+else
+  BASETIME=%YYYY%%MM%%DD%%EMOS_BASE%
+fi
+
+FSFAMILY=%FSFAMILY%
+
+ECF_PASS=%ECF_PASS%
+ECF_NODE=%ECF_NODE%
+ECF_NAME=%ECF_NAME%
+ECF_TRYNO=%ECF_TRYNO%
+
+ECF_HOSTFILE=$HOME/.smshostfile
+ECF_PORT=%ECF_PORT%
+ECF_JOBOUT=%ECF_JOBOUT%
+
+
+SUITE=%SUITE%
+FAMILY=%FAMILY:NOT_DEF%
+TASK=%TASK%
+
+DEBUG=0
+DISPLAY=0
+
+# INFORM_EMOS_AUTORESOL=1
+
+#
+#  For e-suites only
+#
+if [[ $EXPVER -eq 2 ]] ; then
+  BASEVER=0002
+fi
+
+#Multianalysis
+INIMA="%INIMA:ecmwf%"
+INIMACONS=%INIMACONS:0%
+INIORIG=mars
+MANNCEP=0
+MANMFR=0
+MANDWD=0
+MANUKM=0
+
+INIORIGIN=OFF
+MAORIGINS="CONS"
+MAMISSING="%MAMISSING:%"
+
+if [[ %STREAM% = "MAED" || %STREAM% = MAWV ]] ; then
+  WAMRESOL=global100
+  WAMNFRE=30
+  WAMNANG=24
+  INIOZONE=false
+  LOZONE=false
+  LOZONECH=false
+  RESOL=399
+  LEVELS=62
+
+  for xxx in $INIMA ; do
+  if [[ "$xxx" = ncep ]] ; then
+    MANNCEP=1
+    MAORIGINS="$MAORIGINS KWBC"
+  elif [[ "$xxx" = mfr ]] ; then
+    MANMFR=1
+    MAORIGINS="$MAORIGINS LFPW"
+  elif [[ "$xxx" = ukm ]] ; then
+    MANUKM=1
+    MAORIGINS="$MAORIGINS EGRR"
+  elif [[ "$xxx" = dwd ]] ; then
+    MANDWD=1
+    MAORIGINS="$MAORIGINS EDZW"
+  fi
+  done
+
+
+  # Find WMO centre number. Do this more cleverly
+  if [[ $INIMACONS -eq 1 ]] ; then
+    INIORIGIN=CONS
+  elif [[ $INIMA = mfr ]] ; then
+   INIORIGIN=LFPW
+  elif [[ $INIMA = ncep ]] ; then
+   INIORIGIN=KWBC
+  elif [[ $INIMA = ukm ]] ; then
+   INIORIGIN=EGRR
+  elif [[ $INIMA = dwd ]] ; then
+   INIORIGIN=EDZW
+  fi
+
+fi
+
+#=================================================
+# For mars compute. This will use model number found.
+# If not set, model number will be 255.
+export MARS_COMPUTE_FLAG=0
+
+# User for e-suite plots
+EPLOT_USER=mos
+
+set +a
+
+if [[ %DELTA_DAY% -ne 0 ]] ; then
+  delta=`expr %DELTA_DAY% \* 24`
+  BASETIME=`newdate $BASETIME $delta`
+fi
+
+if [[ $FSFAMILY = "refc" ]] ; then
+  HC_REFDATE=`echo $BASETIME | cut -c 1-8`
+  EPSTYPE=fc
+
+  export HC_REFDATE EPSTYPE
+
+  if [[ %YEAR:0% -ne 0 ]] ; then
+    YEAR=%YEAR:0%
+    YYYY=`echo $BASETIME | cut -c 1-4`
+    MM=`echo $BASETIME | cut -c 5-6`
+    DDHH=`echo $BASETIME | cut -c 7-10`
+    if [[ $MM$DDHH = 0229* ]] ; then
+      BASETIME=`newdate $(( $YEAR$MM$DDHH - 100 )) 24 `
+    else
+      BASETIME=$YEAR$MM$DDHH
+    fi
+  fi
+fi
+
+DELTA_YEAR=%DELTA_YEAR:0%
+YYYY=`echo $BASETIME | cut -c 1-4`
+YYYY=$(( $DELTA_YEAR + $YYYY ))
+if [[ $DELTA_YEAR -ne 0 ]] ; then
+  YYYY=`echo $BASETIME | cut -c 1-4`
+  DELTA_YEAR=%DELTA_YEAR:0%
+  MMDDHH=`echo $BASETIME | cut -c 5-10`
+  YYYY=$(( $DELTA_YEAR + $YYYY ))
+  BASETIME=$YYYY$MMDDHH
+  YMD=$(substring $BASETIME 1 8)
+fi
+
+DELTA_HOUR=%DELTA_HOUR:0%
+if [[ $DELTA_HOUR -ne 0 ]] ; then
+  BASETIME=`newdate $BASETIME $DELTA_HOUR`
+fi
+
+# remove when hpcf gone
+if [[ $HOST = hpc* ]] ; then
+  EMOSLIB="-qextname $EMOSLIB"
+fi
+
+if [[ $ARCH = linux ]] ; then
+  export LINK_C="pgf90 -tp k8-32 -g"
+  export LINK_F="pgf90 -tp k8-32 -g"
+fi
+
+if [[ "%OD_PROJ:od%" = no ]] ; then
+  ### TEPS project
+  EPSHEM=1
+  EPSGAMMA=0.016
+  EPSBASIS=10
+  EPSMEMBERS=21
+  EPSNENS=20
+  GRIBCLASS=113 # from http://www.ecmwf.int/publications/manuals/libraries/gribex/gribClass.html
+fi
+
+#=====================================================================
+# ocean model configuration
+#======================================================================
+export RUNVARFC=%RUNVARFC:0%
+export EPSLEG=%EPSLEG:1%
+if [[ $RUNHINDCAST = 1 ]] ; then
+  # export HC_REFDATE=%YMD%
+  export HC_REFDATE=$((YYYY -(DELTA_YEAR)))`echo $BASETIME | cut -c 5-8`
+
+INIMODISALB=false # if intial data was run with 32r1 or later
+
+#==========================================================
+# Variables configuring inidata
+#==========================================================
+INIPATH="/net/fujitsu/ifs/initial/t95r/ic_19r1_%YMD%"
+INISTREAM=DA
+INITYPE=an
+INISTEP=0
+INISPQ=no
+LFG=.true.
+INIOFFSET=0
+INISCHEME=lslag
+SAVINI=""
+SVRF=no
+IFRF=no
+FORCE_FP=no
+
+INICLASS=`oper_model -b $BASETIME -c`
+INIRESOL=`oper_model -b $BASETIME -r`
+INILEVELS=`oper_model -b $BASETIME -l`
+INIGTYPE=`oper_model -b $BASETIME -t`
+INIEXPVER=`oper_model -b $BASETIME -e`
+INITILES=`oper_model -b $BASETIME -T`
+INICLOUDAN=`oper_model -b $BASETIME -C`
+
+if [[ %RUNHINDCAST:0% = 0 ]] ; then
+  INILEVELS=91
+  INIRESOL=799
+
+if [[ $BASETIME -le %ERA40END:2002073100% ]] ; then
+  INICLASS=e4
+  INILEVELS=60
+  INIEXPVER=0001
+  INITILES=true
+  INICLOUDAN=true
+  INIMODISALB=false
+  EPSGAMMA=0.018
+fi
+
+else # HINDCAST mode
+  INICLASS=ei
+  INILEVELS=60
+
+  if [[ $BASETIME -lt 2008010100 ]] ; then
+    INIEXPVER=0001
+  else
+    INIEXPVER=1112 # temporary while Manuel is changing 1112 to 0001
+  fi
+  EPSGAMMA=0.016 # to be updated according to Martin Leutbecher
+  INIRESOL=255
+  INIMODISALB=true
+  INIHTESSEL=false
+  INITILES=true
+fi
+
+fi
+
+export MARS_CMD='mars'
+
+if [[ %RUNHINDCAST:0% = 1 ]] ; then
+  INIHTESSEL=`oper_model -b $BASETIME -I ${CLASSORIG:="er_ops"} -H`
+fi
+
+### check if MOFC-VarEps is to run
+  sim=`newdate -d -D $BASETIME`
+  real=`date +'%%Y%%m%%d'`
+  real=`newdate -d -D $real`
+  dow=`date +'%%u'`
+  res=$((($sim - $real + $dow) %% 7))
+
+  if [[ $((res)) -lt 0 ]] ; then res=$((res+7)); fi
+
+  RUN_VAREPS=0
+  if [[ $res = 4 ]] ; then # Thursday MOFC
+    RUN_VAREPS=1
+  fi
+  export EPSNLEGS=$((2+$RUN_VAREPS)) # do not refer to sms variables while this changes
+  # 35r2
+  export EPSCOUPL_A=no                    # 35r2
+  export EPSCOUPLE_A=0                    # 35r2
+  CC=`substring $BASETIME 9 10`           # later EMOS_BASE
+  export EPSCOUPLE_B=$((CC == 00))        # 35r2
+  export EPSCOUPLE_C=$RUN_VAREPS          # 35r2
+
+
+export RUN_VAREPS
+###########
+export OCNINDAT=$(substring $BASETIME 1 8) # 19900101
+
+if [[ $EPSLEG != 1 ]] || [[ $RUNVARFC = 1 ]] ; then
+set -a
+
+
+ENAMELIST=general
+FULL_POS=yes
+LPPL=1
+LPSU=1
+LPPV=0
+LPTH=0
+LPGZ=0
+PPSTEPS="0"
+ERF=408
+FRQRF=-1
+DATE_BRANCH=2005112409
+USEDATE_BRANCH=no
+VIEW=""
+VIEW_HOPE="hope_h2e20"
+OCEPS=no
+OCUSESV=no
+EPSLROT=no
+OCPATM=yes
+OCFCRESOL=255
+OCFCLEVELS=62
+OCFCGTYPE=l_2
+OCFCTSTEP=%TSTEP:1800%.0
+FCCHUNKTOT=1
+NEWSTREAMLIB=none
+SAVLIB=false
+OCEAN_BRANCH="neh_h2e20_enfo"
+OCEAN_CYCLE="h2e20"
+OCIAUFR=2
+if [[ $RUNHINDCAST = 1 ]] ; then
+
+GRIB_API_VERSION=1.7.0
+GRIB_API_INCLUDE="-I/usr/local/lib/metaps/lib/grib_api/jasper/include -I/usr/local/lib/metaps/lib/grib_api/$GRIB_API_VERSION/include"
+GRIB_API_LIB="-L/usr/local/lib/metaps/lib/grib_api/jasper/lib -ljasper -L/usr/local/lib/metaps/lib/grib_api/$GRIB_API_VERSION/lib -lgrib_api_f90 -lgrib_api"
+export GRIB_API=/usr/local/lib/metaps/lib/grib_api/$GRIB_API_VERSION/bin   # change to fixed version
+export PATH=$GRIB_API:$PATH
+
+  if [[ $HC_REFDATE -lt 20080605 ]] ; then
+    OCINI="seas_0001_01_NN_${OCNINDAT}_od_02"
+  else
+    OCINI="ocea_0001_01_NN_$(substring $BASETIME 1 8)_od_03"
+  fi
+else
+  OCINI="ocea_0001_01_NN_$(substring $BASETIME 1 8)_od_03"
+fi
+OCNEWREST=false
+OCNMINI="00"
+CLASSORIG=e4_ops
+
+OCRUNCTRLAN=no
+OCRUNCTRLAC=no
+OCRUNCTRLFC=no
+OCRUNASSIMAN=no
+OCRUNASSIMAC=yes
+OCRUNASSIMFC=yes
+MEMBERSTATE=no
+%include <config.oc.h>
+
+ OCINPUT=mars
+ OCSUITE=vareps
+ if [[ -n $OCINI ]] ;then
+    OCINPUT=$(substring $OCINI 1 4)
+ fi
+
+ if [[ $OCINPUT != 'ecfs' ]] ; then
+   OCSTREAM_INI=$OCINPUT
+    if [[ $OCINPUT = 'mars' ]];then
+      OCSTREAM_INI='ocea' # 'seas'
+    fi
+    if [[ $OCINPUT = 'seas' ]];then
+      OCINPUT='mars'
+    fi
+    if [[ $OCINPUT = 'mofc' ]];then
+     OCINPUT='mars'
+    fi
+   OCEXPVER_INI=0001 # $(substring $OCINI 6 9 )
+   OCMETHOD_INI=$(substring $OCINI 11 12 )
+   OCNUMBER_INI=$(substring $OCINI 14 15 )
+   OCDATE_INI=$(substring $OCINI 17 24 )
+   OCCLASS_INI=$(substring $OCINI 26 27 )
+   OCSYST_INI=$(substring $OCINI 29 30 )
+ fi
+
+# For EPS runs only. Change of EPSNORM
+#
+   LASTERA40=%ERA40END:2000070100%
+
+  if [[ $OCEPS = "yes" ]] ; then
+     if [[ $BASETIME  -le 2001031400 ]] || [[ $BASETIME  -le $LASTERA40 ]] ;
+     then
+        EPSNORM=2.0
+        EPSNORMT=2.0
+     fi
+     EPSTROP=%EPSTROP:$EPSTROP%
+     EPSSVDIAB=%EPSSVDIAB:$EPSSVDIAB%
+     EPSSVNUM=%EPSSVNUM:$EPSSVNUM%
+  fi
+
+#=======================================================================
+#  special mofc variables
+#=======================================================================
+
+# pop/web/mofc
+
+MOFC_PROCESS=$WROOT/data/%SUITE%_process
+MOFC_PROCESS=`echo $MOFC_PROCESS | sed -e 's/var\/tmp\/tmpdir\/emos\/data/emos_data/'`
+Y=`echo $BASETIME | cut -c 1-4`
+STREAM=EF
+CLIMYEAR1=$((Y + - %NH_YEARS:18%))
+CLIMYEAR2=$((Y - 1))
+OCUTILS=$XBINS/$STREAM/$EXPVER
+
+export NH_ENSEMBLES=%NH_ENSEMBLES:4%
+export MOFC_PROCESS
+
+if [[ %RUNHINDCAST:0% = 1 ]] ; then
+  MOFCCLIM_VERIF=$WROOT/data/%SUITE%_clim
+  [[ -d $MOFCCLIM_VERIF ]] || mkdir -p $MOFCCLIM_VERIF
+  MOFC_VERIFY=/gpfs1/emos_verify/data/%SUITE%_verify
+  export PATH=$PATH:$HOME/bin/EF/verify
+  [[ -d $MOFC_VERIFY ]] || mkdir -p $MOFC_VERIFY
+
+  INIHTESSEL=`oper_model -b $BASETIME -I ${CLASSORIG:="er_ops"} -H`
+fi
+
+fi
+
+set -a
+
+if [[ %EPSTYPE:cf% = sv ]] ; then
+   INIMODISALB=false
+fi
+
+if [[ "%STREAM%" = EF ]] ; then
+  INIPERIOD_4D=%INIPERIOD_4D:12%
+else
+  INIPERIOD_4D=12
+fi
+
+if [[ "%FSFAMILY:0%" != refc ]] && [[ %RUNHINDCAST:0% != 1 ]] ; then
+  LVARBC=true
+else
+  LVARBC=false
+  INIMODISALB=false # if intial data was run with 32r1 or later
+
+  date4v12h=2000091200
+  # CHANGE date_dcda=2004062900
+  date_dcda=2004062912
+  if [ $BASETIME -ge $date4v12h ] ; then
+     INIPERIOD_4D=12
+  fi
+  if [ $BASETIME -ge $date_dcda ] ; then
+    INIPERIOD_4D=6
+  fi
+fi
+
+inidate=`echo $BASETIME | cut -c 1-8`
+if [ ${inidate} -ge 19971125 ] && [ $INICLASS = od ] && [ $INIPERIOD_4D = 6 ] ; then
+    INIOFFSET_4D=3
+elif [ $INICLASS = ei ] ; then
+    INIOFFSET_4D=9
+elif [ $INICLASS = e4 ] ; then
+    INIOFFSET_4D=3
+elif [ $INIPERIOD_4D = 12 ] ; then
+  if [[ %RUNHINDCAST:0% = 1 ]] || [[ %STREAM:UNDEF% = EF ]] ; then
+    INIOFFSET_4D=9
+  else
+    INIOFFSET_4D=3
+  fi
+elif [ $INIPERIOD_4D = 6 ] ; then
+    INIOFFSET_4D=3
+else
+    INIOFFSET_4D=0
+fi
+
+### SST ###
+CLMSST=no
+PERSST=%PERSST:false%
+FORCE_SST=no
+SSTLEN=%SSTLEN:240%
+SSTINT=%SSTINT:1%
+LOSTIA=%LOSTIA:true%              # 33r2
+
+NUMBER=%FCTOTAL:NOT_SET%
+VAR=%VAR:NOT_SET%
+CNUMBER=5
+
+if [[ "%SUITE%" = @(mc*|emc*|mofc*|emofc*|ma|tparc*|dts*) || $SUITE_TYPE = "eps" ]] ; then
+  LWEAK4DVAR=false
+  LEMISKF=false
+  LOZONE=false
+  INIOZONE=false
+  LOZONECH=false
+  LVARBC=false
+else
+  LWEAK4DVAR=true
+  LEMISKF=true
+fi
+
+
+set +a
+
+
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/config.oc.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/config.oc.h
new file mode 100644
index 0000000..6cee2ef
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/config.oc.h
@@ -0,0 +1,197 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+# EXPVER=et34
+#==========================================================
+# Variables configuring emptyNamelist
+#==========================================================
+ENAMELIST=general
+#
+#==========================================================
+# Variables configuring wsconfig
+#==========================================================
+
+# WSHOST=metis
+# SCRATCH="/scratch/rd/rdx"
+#
+#==========================================================
+# Variables configuring ppgeneral
+#==========================================================
+
+IFSMODE=fc
+#PERIOD=6
+#PERIOD_4D=12
+
+FULL_POS=yes
+LPPL=1
+LPSU=1
+LPML=0
+LPPV=0
+LPTH=0
+LPGZ=0
+#PPFRQ=24
+PPSTEPS="0"
+#BRF=0
+ERF=408
+FRQRF=-1
+#
+#==========================================================
+# Variables configuring Ozone
+#==========================================================
+LOZONE=false
+LOZONECH=false
+#
+#==========================================================
+# Variables configuring clearcase
+#==========================================================
+#PROJECTS="none"
+DATE_BRANCH=2005112409
+USEDATE_BRANCH=no
+VIEW=""
+VIEW_HOPE="hope_h2e20"
+#
+#==========================================================
+# Variables configuring eps_svect
+#==========================================================
+OCEPS=no
+OCUSESV=no
+EPSLROT=no
+EPSNLEGS=%EPSNLEGS:3%
+EPSFCLEV_A=40
+EPSTSTEP_A=1800
+EPSFCLEV_B=40
+EPSTSTEP_B=%TSTEP:2700% # 2700
+EPSFCLEV_C=40
+EPSTSTEP_C=%TSTEP:2700% # 2700
+
+#
+#==========================================================
+# Variables configuring Dr_Hook
+#==========================================================
+#DR_HOOK=true
+#DR_HOOK_OPT="none"
+#DR_HOOK_PROFILE_LIMIT=-10
+#DR_HOOK_HASHBITS=15
+#DR_HOOK_CATCH_SIGNALS=0
+#DR_HOOK_IGNORE_SIGNALS=0
+#
+#==========================================================
+# Variables configuring wavgeneral
+#==========================================================
+#WAVE=yes
+#INIWAVE=yes
+#WAM2WAY=yes
+#WAMALT=no
+#WAMSAR=no
+#WAMSARASS=false
+#WGRIBIN=yes
+#WAMNSTPW=1
+#WAMRESOL=global100
+#WAMCOLDLENGTH=240
+WAMNFRE=%EPSWAMNFRE:25%
+WAMNANG=%EPSWAMNANG:12%
+#WAMFCPARAM="229/230/231/232/220/221/244/233/245"
+#
+#==========================================================
+# Variables configuring compile
+#==========================================================
+OCPATM=yes
+#LD="mpxlf90_r"
+#LDCC="xlc_r"
+#USE=standard
+#USECC=vac_6000
+#PARALLEL=4
+#NATIVE=true
+#F90_DEBUG=0
+#RUN_PARALLEL=true
+#EC_FILL_NANS=false
+#
+#==========================================================
+# Variables configuring system
+#==========================================================
+# ABO all comments
+#FSROOT="/RDX/prepIFS"
+#FSOROOT="/emos"
+#ABO FSXDATA="/ocx/data"
+#ABO FSXBINS="/ocx/$ARCH/bin"
+#ACCOUNT=ecrmoc
+#USER=ocx
+#GROUP=rd
+#FDB_GROUP=ecmwf
+#BASEVER=0001
+#CLASS=rd
+#GRIBCLASS=2
+#NOW=2005112409
+#MEMBERSTATE=no
+#
+#==========================================================
+# Variables configuring submit
+#==========================================================
+#SMS_NAME=ocx-prod
+#
+#==========================================================
+# Variables configuring general
+#==========================================================
+OCFCRESOL=255
+OCFCLEVELS=62
+OCFCGTYPE=l_2
+OCFCTSTEP=%TSTEP:1800%.0
+FCCHUNKTOT=1
+VERSION="fc"
+LESUITE=false
+#
+#==========================================================
+# Variables configuring libraries
+#==========================================================
+# IFS_CYCLE="31r1"
+# Q2USE=true
+# EMOS_CYCLE="000281"
+# Q2CREATE_NEWSTREAM=false
+# NEWSTREAM=none
+NEWSTREAMLIB=none
+# LIBRESOL=".R64.D64.I32"
+SAVLIB=false
+#GETLIB=false
+# MAKE_LIBS=yes
+# Q2CHANGELIST=0
+OCEAN_BRANCH="neh_h2e20_enfo"
+OCEAN_CYCLE="h2e20"
+#
+#==========================================================
+# Variables configuring inidata
+#==========================================================
+#OCNINDAT=$(substring $BASETIME 1 8) # 19900101
+#OCIAUFR=2
+#if [[ $RUNHINDCAST = 1 ]] ; then
+#OCINI="seas_0001_01_NN_${OCNINDAT}_od_02"
+#else
+#OCINI="ocea_0001_01_NN_$(substring $BASETIME 1 8)_od_03"
+## "seas_0001_01_NN_${OCNINDAT}_od_02"
+#fi
+#OCNEWREST=false
+#OCNMINI="00"
+#INIORIG=mars
+#CLASSORIG=e4_ops
+#INISCHEME=lslag
+SVRF=no
+IFRF=no
+#
+#==========================================================
+# Variables configuring ocgeneral
+#==========================================================
+OCRUNCTRLAN=no
+OCRUNCTRLAC=no
+OCRUNCTRLFC=no
+OCRUNASSIMAN=no
+OCRUNASSIMAC=yes
+OCRUNASSIMFC=yes
+#
+MEMBERSTATE=no
+#if [ $RUNVARFC -eq 1 ] ; then
+#  OCSUITE=vareps
+#fi
+
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/endt.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/endt.h
new file mode 100644
index 0000000..cbbfbd9
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/endt.h
@@ -0,0 +1,13 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#==========================================================================
+#  End task (complete -> SMS)
+#  Clean up and exit
+#==========================================================================
+
+smscomplete ; trap 0 ; exit
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/head.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/head.h
new file mode 100644
index 0000000..2560d19
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/head.h
@@ -0,0 +1,43 @@
+#!/bin/ksh
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the three variables that are needed for any
+# communication with ECF_
+
+export ECF_PORT=%ECF_PORT%  # ECF_ Remote Procedure Call number
+export ECF_NODE=%ECF_NODE%    # The name sms that issued this task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of smsinit
+# Here we give the current PID.
+
+#smsinit $$
+
+# Defined a error hanlder
+
+ERROR() {
+	set +e        # Clear -e flag, so we don't fail
+	#smsabort      # Notify ECF_ that something went wrong
+	trap 0        # Remove the trap
+	exit 0        # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/law.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/law.h
new file mode 100644
index 0000000..9033f8e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/law.h
@@ -0,0 +1,43 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+### start of law.h, normally included from config.h ####################
+
+# Override for local area wave model
+if [[ "%FSFAMILY%" = "euroshelf" ]] ; then
+  set -a
+  PPFRQ=6
+  WAMRESOL=medite10
+  WAMANLEN=12
+  WAMFCLEN=120
+  WAMSAR=yes
+  WAMIDELRES=6
+  INIWDEXPVER=%INIWDEXPVER:0001%     # expver for wind forcing
+  INIWDCLASS=%INIWDCLASS:od%
+  INIWDSTREAM=DA
+  WGRIBIN=yes
+  gflag=T
+  nsysnb=-1
+  nmetnb=-1
+
+  ALTIMETER=ers2
+  SAR=ers2
+  ERS=`echo $SAR | cut -c4`
+
+  model=medite
+  FSALT=$FSBASE/${ALTIMETER}/alt/$model
+  FSALT_B=$FSBASE/${ALTIMETER}_b/alt/$model
+  FSALT_S=$FSBASE/${ALTIMETER}_s/alt/$model
+  FSSAR=$FSBASE/${SAR}/sar/$model
+  FSSAR_B=$FSBASE/${SAR}_b/sar/$model
+  FSSAR_S=$FSBASE/${SAR}_s/sar/$model
+
+  WAVE_ROOT=$FDB_ROOT
+  WAVE_IROOT=$FDB_IROOT
+
+fi
+# end of law.h #################################
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/qsub.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/qsub.h
new file mode 100644
index 0000000..271c1aa
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/qsub.h
@@ -0,0 +1,11 @@
+:
+# QSUB -q %QUEUE%
+# QSUB -u %USER%
+# QSUB -eo
+# QSUB -ro
+# QSUB -ko
+# QSUB -nr
+# QSUB -A %ACCOUNT%
+# QSUB -s /bin/ksh
+# QSUB -r %TASK%-%FAMILY1%
+# QSUB -o %LOGDIR%%SMSNAME%.%SMSTRYNO%
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/rcp.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/rcp.h
new file mode 100644
index 0000000..061c1cb
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/rcp.h
@@ -0,0 +1,41 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#  rcp.h
+
+SMSRCP() {
+  set -x
+  set +e
+  if [[ "${ARCH:=UNDEF}" = hppa || "${ARCH:=UNDEF}" = hpia64 ]] ; then
+    if [[ $PBS_JOBID = NOT_SET ]] ; then
+      rcp %LOGDIR%%SMSNAME%.%SMSTRYNO% \
+          emos@%SMSNODE%:%SMSOUT%%SMSNAME%.%SMSTRYNO%
+    else
+      rm -f %SMSJOBOUT% || : # remove link
+
+      # hardcoded to hanfs2 then mordred to release load on ablamor
+      rcp /var/spool/PBS/spool/${PBS_JOBID}.OU \
+        emos at hanfs2:/hanfs%SMSHOME%%SMSNAME%.%SMSTRYNO% || \
+      rcp /var/spool/PBS/spool/${PBS_JOBID}.OU \
+        emos at mordred:%SMSHOME%%SMSNAME%.%SMSTRYNO% || \
+      rcp /var/spool/PBS/spool/${PBS_JOBID}.OU \
+        emos@%SMSNODE%:%SMSHOME%%SMSNAME%.%SMSTRYNO%
+
+      link_name=`~emos/bin/subs_path.pl -f %SMSOUT% -t $TOPATH -n %SMSJOBOUT%`
+      rm -f $link_name || :
+
+    fi
+  fi
+
+  if [[ ${ARCH:=UNDEF} = ibm_power* ]] ; then
+    rcp %LOGDIR%%SMSNAME%.%SMSTRYNO% %SMSNODE%:%SMSHOME%%SMSNAME%.%SMSTRYNO%
+  fi
+
+}
+typeset -fx SMSRCP
+
+#  end of rcp.h
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/set_traps.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/set_traps.h
new file mode 100644
index 0000000..d2bbcba
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/set_traps.h
@@ -0,0 +1,6 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/setup.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/setup.h
new file mode 100644
index 0000000..056b7d8
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/setup.h
@@ -0,0 +1,535 @@
+banner setup.h
+#=======================================================================
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+USER=${USER:=$LOGNAME}
+
+set -a
+
+#=======================================================================
+#  Get the prompt PS4 to be ok with -u option
+#=======================================================================
+
+typeset -Z2 _h _m _s
+if [[ $ARCH != linux ]] ; then
+SECONDS="$(date '+3600*%%H+60*%%M+%%S')"
+_x=""
+_time='${_x[(_h=(SECONDS/3600)%%24)==(_m=SECONDS/60%%60)==(_s=SECONDS%%60)]}$_h:$_m:$_s'
+PS4="$_time + "
+elif [[ $ARCH = linux ]] ; then
+  set +e
+  LKSH93=`isksh93 && echo "true" || echo "false"`
+  set -e
+  if [[ $ARCH = linux ]] && [[ "$LKSH93" = "true" ]] ; then
+# ksh93 syntax
+    _time='$((_h=(SECONDS/3600)%%24)):$((_m=(SECONDS/60)%%60)):$((_s=SECONDS%%60))'
+    PS4="$_time + "
+  fi
+fi
+
+unset _hh _mm || true
+#=======================================================================
+#
+#  Distinguish between OD and RD
+#
+#=======================================================================
+
+STREAM=%STREAM:DA%
+if [[ $STREAM = DA ]] ; then
+  stream=""
+else
+  stream="/${STREAM}"
+fi
+
+  # OD_MODE is set to false (default) for rd, e4 projects
+  #                   true for od and all od projects
+  OD_MODE=true
+  CLASS=%OD_PROJ:od%
+  OD_PROJ=%OD_PROJ:od%
+
+  #---------------------------------------------------------------------
+  #  EMOS specific setup
+  #---------------------------------------------------------------------
+
+  EMOS_YEAR=`substring $BASETIME 1 4`
+  EMOS_MONTH=`substring $BASETIME 5 6`
+  EMOS_DAY=`substring $BASETIME 7 8`
+  EMOS_BASE=`substring $BASETIME 9 10`
+  EMOS_VERSION=$EXPVER
+  EMOS_TIME_STEP_H=%EMOS_TIME_STEP_H%
+  EMOS_STREAM=$STREAM
+
+  if [[ $EXPVER -ne 1 && $EXPVER -ne 2 ]] ; then
+    alias -x gksplot="gksplot -u $EPLOT_USER"
+    alias -x magplot="magplot -u $EPLOT_USER"
+  fi
+
+#=======================================================================
+#
+#  Derive the disk variables
+#
+#=======================================================================
+
+export FWROOT=$FSROOT/${EXPVER} # this variable for similar path WITHOUT stream
+export FWBASE=$FSROOT/${EXPVER} # this variable for similar path WITHOUT stream
+
+if [[ %OD_PROJ:od% != od ]] ; then
+  BASE=$TROOT/$CLASS/$EXPVER
+  WORK=$WROOT/$CLASS/$EXPVER
+  LIBS=$BASE/lib
+  BINS=$BASE/bin
+  DATA=$BASE/data
+
+elif [[ $STREAM = MAED ]] ; then
+  TROOT=${TROOT}/${STREAM}
+  WROOT=${WROOT}/${STREAM}
+  FSROOT=${FSROOT}/${STREAM}
+  BASE=$TROOT/$EXPVER
+  WORK=$WROOT/$EXPVER
+  LIBS=$BASE/lib
+  BINS=$BASE/bin
+  DATA=$BASE/data
+
+elif [[ $STREAM = DCDA ]] ; then
+  # TBD TBD TBD ODIR configuration for operational mode
+
+  BASE=$TROOT/$EXPVER
+  LIBS=$BASE/lib
+  BINS=$BASE/bin
+  DATA=$BASE/data
+  TROOT=${TROOT}/${STREAM}
+  BASE=$TROOT/$EXPVER
+  WROOT=${WROOT}/${STREAM}
+  WORK=$WROOT/$EXPVER
+  FSROOT=${FSROOT}/${STREAM}
+  FSODB=${FSODB}/${STREAM}
+
+else
+  BASE=$TROOT/$EXPVER
+  WORK=$WROOT/$EXPVER
+  LIBS=$BASE/lib
+  BINS=$BASE/bin
+  DATA=$BASE/data
+fi
+
+
+if [[ $OD_MODE = true ]] ; then
+  LOGS=%LOGDIR%/$SUITE/$FAMILY
+else
+  LOGS=$TROOT/log/$SUITE/$FAMILY
+fi
+
+if [ "$FSFAMILY" != "" ] ; then
+  PATH=${XBINS}/${ARCH}/${IFS_CYCLE}/${FSFAMILY}:${XBINS}/${ARCH}/${IFS_CYCLE}:${XBINS}/${ARCH}/${IFS_CYCLE}/an:/${BINS}/${FSFAMILY}:${HOME}/bin/${FSFAMILY}:${XBINS}/${IFS_CYCLE}:${XBINS}/an:$PATH:$emosbin:${HOME}/bin/${ARCH}
+  FSFAMILY=/$FSFAMILY
+fi
+
+SUBFSFAMILY=%SUBFSFAMILY:""%
+
+XDIR=$XROOT/bin
+ADIR=$BASE/${BASETIME}${FSFAMILY}$SUBFSFAMILY
+WDIR=$WORK/${BASETIME}${FSFAMILY}$SUBFSFAMILY
+ODIR=$OROOT/0001/${BASETIME}
+
+
+if [[ "$STREAM" = MAED ]] ; then
+ if [[ "$FSFAMILY" = "/fc" ]] ; then
+   if [[ $INIMACONS -eq 1 ]] ; then
+    ADIR="${ADIR}_cons"
+    WDIR="${WDIR}_cons"
+   elif [[ "$INIMA" != "" ]] ; then
+     ADIR="${ADIR}_$INIMA"
+     WDIR="${WDIR}_$INIMA"
+   fi
+ fi
+fi
+
+PATH=$HOME/bin/ppdi:$TMPDIR:$BINS:$BINS/$WAMRESOL:$XROOT/bin/$EMOS_CYCLE:$PATH
+
+if [[ "$FSFAMILY" = /mc ]] && [[ $RUNHINDCAST != 1 ]] ; then
+  EMOS_STREAM=EF
+  STREAM=EF
+fi
+
+#=======================================================================
+#
+#  Suite specific fdb settings
+#
+#=======================================================================
+#=======================================================================
+#
+#  Derive the FileServer variables
+#
+#=======================================================================
+
+if [[ %OD_PROJ:od% = od ]] ; then
+  FSBASE=${FSROOT}${FSFAMILY}/${EXPVER}
+else
+  FSBASE=${FSROOT}${FSFAMILY}/${CLASS}/${EXPVER}
+fi
+
+FDBASE=$FSBASE
+
+FSHOST=${FSBASE}/${ARCH}
+
+FSLIBS=${FSHOST}/lib
+FSBINS=${FSHOST}/bin
+FSDATA=${FSHOST}/data
+FSODIR=${FSROOT}/0001/$(substring $BASETIME 1 6)/$(substring $BASETIME 7 10)
+
+DHSWAVE=${FSROOT}/${EXPVER}/wave
+
+if [[ "$FSFAMILY" = /euroshelf ]] ; then
+ DHSWAVE=${FSROOT}/${EXPVER}/euroshelf
+fi
+
+if [[ $OD_MODE = true ]] ; then
+  FSDIR=${FSBASE}/${BASETIME}
+  FSLOG=${FSBASE}/log
+
+  DHSTIME=$(substring $BASETIME 1 6)/$(substring $BASETIME 7 10)
+
+  FSBDIR=$FSOROOT/$EXPVER/$DHSTIME
+else
+  FSDIR=$FSROOT/${EXPVER}/${BASETIME}
+  FSLOG=$FSROOT/${EXPVER}/log
+
+  DHSTIME=${BASETIME}
+fi
+FODBDIR=${FSODB}${FSFAMILY}/${EXPVER}${stream}/${BASETIME}
+
+PSDIR=/ws/scratch/ma/emos/ps
+
+#=======================================================================
+# Set variable to run metview macros on a different fs from normal users
+# Please see comments in web.h if you want to change it.
+#
+# On linux cluster we use the default one
+#=======================================================================
+
+
+
+#=======================================================================
+#  Model variables that depend on configuration
+#=======================================================================
+
+VPP_MBX_SIZE=1000000
+MBX_SIZE=1000000
+MPP_TYPE=2
+if [[ $ARCH = @(ibm_power*) ]] ; then
+  MBX_SIZE=64000000
+fi
+
+[[ $RESOL = 213 || $RESOL = 319 ]] && NRESOL=160
+[[ $RESOL = 106 || $RESOL = 159 ]] && NRESOL=80
+[[ $RESOL = 511 ]] && NRESOL=256
+[[ $RESOL = 799 ]] && NRESOL=400
+[[ $RESOL = 255 ]] && NRESOL=160
+[[ $RESOL = 399 ]] && NRESOL=200
+
+
+if [[ $ARCH = @(ibm_power*) ]] ; then
+  CC=xlc_r
+  FRT=xlf90
+  FRT77=xlf
+  LD=mpxlf90_r
+  LDCC=xlc_r
+  BUILDWS=true
+  WSUSE=xlf_7112
+  PARALLEL=4
+  NATIVE=true
+  F90_DEBUG=0
+  RUN_PARALLEL=true
+fi
+#==========================================================
+# New for 33r1
+#==========================================================
+
+if [[ $ARCH = ibm_power4 ]] ; then
+  USE=xlf_11102
+elif [[ $ARCH = @(ibm_power6) ]] ; then
+  USE=standard
+fi
+
+if [[ $TASK != exp_setup ]] ; then
+  USE=${USE:-standard}
+
+  if [[ $USE != standard ]] && [[ $ARCH = ibm_power* ]] ; then
+    use $USE
+#    addon1=`echo $PATH | cut -d: -f1`
+#    addon2=`echo $PATH | cut -d: -f2`
+#    REDUCED_PATH=$addon1:$addon2:$REDUCED_PATH
+  fi
+fi
+
+set +a
+
+#=======================================================================
+#
+#  Functions to manipulate the variables
+#
+#=======================================================================
+
+NEWADIR() {
+  set -xe
+  if [ $# -lt 1 ] ; then echo $0: error; return 1 ; fi
+    echo $BASE/$(newdate $BASETIME $1)/$(basename $ADIR)
+}
+
+NEWWDIR() {
+  set -xe
+  if [ $# -lt 1 ] ; then echo $0: error; return 1 ; fi
+    # echo $WORK/$(newdate $BASETIME $1)/$(basename $WDIR) # 29r2 TBD
+    echo `echo $WDIR | sed -e "s/$BASETIME/$(newdate $BASETIME $1)/g"`
+}
+
+NEWFSBDIR() {
+  set -x
+    if [ $# -lt 1 ] ; then echo $0: error; return 1 ; fi;
+    XX=`newdate ${BASETIME} $1`;
+    # used to define the location for PS_BIAS file
+    # shall contain DCDA stream within the path _but_ this would mean
+    # modifying FSBDIR variable. However, too many script use already
+    # this variable.
+      echo $FSOROOT/$EXPVER/$(substring $XX 1 6)/$(substring $XX 7 10);
+# ${FSBASE}/$STREAM/$(substring $XX 1 6)/$(substring $XX 7 10)
+}
+
+NEWFDIR() {
+  set -xe
+    if [ $# -lt 1 ] ; then echo $0: error; return 1 ; fi;
+    XX=`newdate ${BASETIME} $1`;
+    echo $FSBASE/$(substring $XX 1 6)/$(substring $XX 7 10)
+}
+
+CHECK_DIR(){
+  if [[ $ARCH = ibm_power* ]]  ; then
+    trap '{ echo "Error in function"; exit 1; }' 0 $SMS_SIGNAL_LIST
+  fi
+  set -xeu
+  if [[ ! "$ARCH" = "linux" ]] ; then
+    trap '{ echo "Error in function"; exit 1; }' 0 $SMS_SIGNAL_LIST
+  fi
+  if [[ $# -eq 0 ]]; then
+    return 1
+  fi
+
+ if [[ $ARCH = ibm_power* ]] then
+   (umask 022;pmkdir $1 || exit )
+ else
+    mkdir -p -m 755 $1 || exit
+ fi
+  if [[ ! "$ARCH" = "linux" ]] ; then
+    trap 0
+  fi
+
+  return 0
+}
+
+
+PUT() {
+  set -xe
+  Ecp -o $1 ec:$FSDIR/$1 || return 1
+}
+
+GET() {
+  set -xe
+  Ecp ec:$FSDIR/$1 $1 || return 1
+}
+
+if [[ $OD_MODE = true ]] ; then
+
+  GETSV() {
+    set -xe
+    file=$(basename $2)
+    Ecp ec:$1/$file $2 || return 1
+  }
+
+else
+  GETSV() {
+       set -xe
+       Ecp ec:$1/$2 $2 || return 1
+  }
+
+fi
+
+typeset -fx NEWADIR NEWWDIR NEWFDIR CHECK_DIR PUT GET GETSV NEWFSBDIR
+
+if [[ $ARCH != fujitsu ]] ; then
+  function libselect { echo WARNING - dummy command : libselect $1 ;}
+  typeset -fx libselect
+fi
+
+export OLDADIR=`NEWADIR -$PERIOD`
+export OLDWDIR=`NEWWDIR -$PERIOD`
+export YESTERDIR=`NEWWDIR -24`
+
+#==========================================================================
+#  Copy postscript file into a scratch directory;
+#
+#  PSFILE [filename [countem [rename]]]
+#
+#  Default filename is "ps"
+#
+#  countem (set but can contain anything) means that there is more than
+#  one file from this task in which case the files are numbered.
+#
+#  If only one file is produced it is copied as
+#    ${_PSDIR}/${SUITE}${EMOS_BASE}${TASK}.ps
+#  otherwise it is copied as
+#    ${_PSDIR}/${SUITE}${EMOS_BASE}${TASK}.fileno.ps
+#  where fileno is counted automatically
+#
+#  If the third parameter is given the naming convention is not followed
+#  except that the file numbering is still being done (stupid if there's
+#  only one file, but what the hell...)
+#
+#  Old file is not saved
+#==========================================================================
+
+PSFILE() {
+  set +exv
+  if [ $# -ge 1 ] ; then _psfile="$1" ; else _psfile="ps" ; fi
+  if [ ! -f $_psfile ] ; then return 1; fi
+  if [ $# -ge 2 ] ; then _fileno=`expr ${_fileno:-0} + 1`; else _fileno=0; fi
+  if [ $# -ge 3 ] ; then _name=$3; else _name=${SUITE}${EMOS_BASE}${TASK}; fi
+
+  if [ ${_fileno} -gt 0 ] ; then
+    /bin/rm -f ${PSDIR}/${_name}.${_fileno}.ps
+    cp $_psfile ${PSDIR}/${_name}.${_fileno}.ps
+  else
+    /bin/rm -f ${PSDIR}/${_name}.ps
+    cp $_psfile ${PSDIR}/${_name}.ps
+  fi
+
+  set -ex
+}
+
+typeset -fx PSFILE
+
+#=======================================================================
+#  For FDB we need a different stream. Oh why can they not be the same?
+#=======================================================================
+
+set -a
+[[ $STREAM = DA   ]] && { WSTREAM=WV;   FDB_STREAM=oper; FDB_WSTREAM=wave; }
+[[ $STREAM = EF   ]] && { WSTREAM=WAEF; FDB_STREAM=enfo; FDB_WSTREAM=waef; }
+[[ $STREAM = SCDA ]] && { WSTREAM=SCWV; FDB_STREAM=scda; FDB_WSTREAM=scwv; }
+[[ $STREAM = MAED ]] && { WSTREAM=MAWV; FDB_STREAM=maed; FDB_WSTREAM=mawv; }
+[[ $STREAM = sens ]] && { WSTREAM=sens; FDB_STREAM=sens; FDB_WSTREAM=sens; }
+[[ $STREAM = SCDA ]] && unset FDB_SERVER_HOST || true
+[[ $STREAM = DCDA ]] && { WSTREAM=DCWV ; FDB_STREAM=dcda ;  FDB_WSTREAM=dcwv; }
+[[ $STREAM = EFHC ]] && { WSTREAM=EWHC ; FDB_STREAM=efhc ;  FDB_WSTREAM=ewhc; } # MC HINDCAST
+[[ $STREAM = ENFH ]] && { WSTREAM=ENWH; FDB_STREAM=enfh ;  FDB_WSTREAM=enwh; } # MC HINDCAST
+[[ $STREAM = DAHC ]] && { WSTREAM=WVHC ; FDB_STREAM=dahc ;  FDB_WSTREAM=wvhc; } # MC HINDCAST
+
+set +a
+
+#=======================================================================
+#  Check for day and date mask
+#=======================================================================
+
+echo checking for date mask
+
+datemask=$(echo '%DATEMASK%' | cut -f1 -d.)
+day=$(substring $BASETIME 7 8)
+weekday=%WEEKDAY:none%
+
+if [[ $weekday != "none" ]] ; then
+  jday=$(newdate -d $BASETIME)
+  jday=$(expr $jday %% 7) || true
+  if [[ $jday -eq 0 ]] ; then
+    dow=monday
+  elif [[ $jday -eq 1 ]] ; then
+    dow=tuesday
+  elif [[ $jday -eq 2 ]] ; then
+    dow=wednesday
+  elif [[ $jday -eq 3 ]] ; then
+    dow=thursday
+  elif [[ $jday -eq 4 ]] ; then
+    dow=friday
+  elif [[ $jday -eq 5 ]] ; then
+    dow=saturday
+  elif [[ $jday -eq 6 ]] ; then
+    dow=sunday
+  fi
+fi
+
+if [[ $datemask != "*" && $day -ne $datemask ]] || [[ $weekday != "none" && $weekday != $dow ]] ; then
+echo job should not run today ... setting it complete
+%include <endt.h>
+fi
+
+#=======================================================================
+#
+#  Check the directories
+#
+#=======================================================================
+
+CHECK_DIR $ADIR
+CHECK_DIR $WDIR
+
+if [[ $ARCH = ibm_power* ]];then
+  export PBIO_BUFSIZE=1048576
+fi
+
+#=======================================================================
+#
+#  Suite stopper
+#
+#=======================================================================
+
+if [[ %SUITE% = "e_35r3" && $BASETIME = "2012120500" ]] ; then
+  echo "ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR"
+  echo "Suite e_35r3 has been set up to stop now"
+  echo "Operators  You can suspend this suite and requeue failed tasks if you like!"
+  echo "ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR"
+  exit 1
+elif [[ %SUITE% = "emc_35r3" && $BASETIME = "2012022600" ]] ; then
+  echo "ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR"
+  echo "Suite emc_35r3 has been set up to stop now"
+  echo "Operators  You can suspend this suite and requeue failed tasks if you like!"
+  echo "ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR"
+  exit 1
+fi
+
+#=======================================================================
+# We use an operation only Magics version to be on the safe side.
+# This is of course only on the servers
+#=======================================================================
+MAGICS=%MAGICS:magics_emos%
+
+#=======================================================================
+# We use an operation only Metview version to be on the safe side.
+#=======================================================================
+
+if [[ $ARCH = linux ]] ; then
+  metview_cmd=%METVIEW:metview_emos%
+
+elif [[ $ARCH = ibm_power4 ]] ; then
+  METVIEW_TMPDIR=/home/ma/emos/metview/metview_tmpdir
+  metview_cmd=%METVIEW:/home/ma/emos/metview/MvRun_3.9.3%
+elif [[ $ARCH = ibm_power6 ]] ; then
+  METVIEW_TMPDIR=/home/ma/emos/metview/metview_tmpdir
+  metview_cmd=%METVIEW:/home/ma/emos/metview/MvRun_3.10%
+fi
+
+#=======================================================================
+# We use an operation only metpy version to be on the safe side.
+#=======================================================================
+metpy_cmd=%METPY:metpy_emos%
+
+echo setup complete
+
+# 20040720 add /home/rd/rdx/bin/filter/bufr_filter from hpcd
+#
+%include <law.h>
+
+export LEDFAMILY=%EDFAMILY:false%
+
+banner end setup.h
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/sms.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/sms.h
new file mode 100644
index 0000000..34cd64b
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/sms.h
@@ -0,0 +1,55 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#==========================================================================
+#  Define environment variables and export them.
+#==========================================================================
+
+set -a
+
+ECF_PASS=%ECF_PASS%
+ECF_NODE=%ECF_NODE%
+ECF_NAME=%ECF_NAME%
+ECF_TRYNO=%ECF_TRYNO%
+ECF_RID=$(echo $QSUB_REQID | cut -f1 -d.)
+ECF_HOSTFILE=$HOME/.smshostfile
+ECF_PORT=%ECF_PORT%
+ECF_JOBOUT=%ECF_JOBOUT%
+
+SUITE=%SUITE%
+FAMILY=%FAMILY%
+TASK=%TASK%
+
+DEBUG=0
+DISPLAY=0
+
+#==========================================================================
+#  Initialize sms.
+#  Trap handling.
+#  Modify the ERROR function what to do in case of any error.
+#==========================================================================
+
+#if [[ $ARCH = sgimips && -f /usr/local/ecfs/prodn/.ecfs_k_env ]] ; then
+if [[ -f /usr/local/ecfs/prodn/.ecfs_k_env ]] ; then
+  . /usr/local/ecfs/prodn/.ecfs_k_env
+fi
+
+smsinit $ECF_RID &
+
+ERROR() {
+  smsabort; printenv; trap 0; exit
+}
+
+trap ERROR 0
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
+
+set -ex
+
+if [[ $ARCH = sgimips && -f /usr/local/ecfs/prodn/.ecfs_k_env ]] ; then
+  . /usr/local/ecfs/prodn/.ecfs_k_env
+fi
+
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/tail.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/tail.h
new file mode 100644
index 0000000..eb7f7a0
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/tail.h
@@ -0,0 +1,10 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#smscomplete  # Notify SMS of a normal end
+trap 0       # Remove all traps
+exit 0       # End the shell
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/trap.h b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/trap.h
new file mode 100644
index 0000000..bfdc421
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/includes/trap.h
@@ -0,0 +1,137 @@
+banner trap.h
+
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+
+#==========================================================================
+#  Trap handling and ECF_ initialisation
+#
+#  Write into the ERROR function what to do in case of any error.
+#==========================================================================
+
+typeset -l ARCH
+
+if [[ "$ARCH" = hpia64 ]] ; then
+  rcp /home/ma/emos/data/dummy.output emos@%ECF_NODE%:%ECF_JOBOUT% || true
+fi
+
+set -a
+LOADL_STEP_ID=${LOADL_STEP_ID:=NOT_SET}
+QSUB_REQID=${QSUB_REQID:=NOT_SET}
+PBS_JOBID=${PBS_JOBID:=NOT_SET}
+
+if [[ $LOADL_STEP_ID != NOT_SET ]] ; then
+  ECF_RID=$(echo $LOADL_STEP_ID | cut -f1 -d.)
+  ECF_RID=$(substring $ECF_RID 6 8  )
+  ECF_RID=$(echo $LOADL_STEP_ID | cut -f2 -d.)${ECF_RID}
+  JOB_ID=$LOADL_STEP_ID
+elif [[ $QSUB_REQID != NOT_SET ]] ; then
+  ECF_RID=$(echo $QSUB_REQID | cut -f1 -d.)
+  JOB_ID=$QSUB_REQID
+elif [[ $PBS_JOBID != NOT_SET ]] ; then
+  ECF_RID=$(echo $PBS_JOBID | cut -f1 -d.)
+  JOB_ID=$PBS_JOBID
+
+  TOPATH=%TOPATH:/tmp/output%
+  link_name=`~emos/bin/subs_path.pl -f %ECF_OUT% -t $TOPATH -n %ECF_JOBOUT%`
+  mkdir -p `dirname $link_name` || :
+  ln -sf /var/spool/PBS/spool/${PBS_JOBID}.OU $link_name || :
+  rm -f %ECF_JOBOUT% || :
+  ln -sf /var/spool/PBS/spool/${PBS_JOBID}.OU %ECF_JOBOUT%
+else
+  ECF_RID=$$
+  JOB_ID=$ECF_RID
+fi
+
+ECF_PASS=%ECF_PASS%
+ECF_NODE=%ECF_NODE%
+ECF_NAME=%ECF_NAME%
+ECF_TRYNO=%ECF_TRYNO%
+ECF_HOSTFILE=$HOME/.smshostfile
+ECF_JOBOUT=%ECF_JOBOUT%
+
+set +a
+ARCHWDIR=${ARCHWDIR:=""}
+
+SMSCLEAN() {
+  set -x
+  set +e
+  STREAM=${STREAM:=""}
+  if [[ "$STREAM" = @(SEAS|MOFC|OCEA|mnfc|mnfh) ]] ; then
+    if [[ "%TASK%" = logfiles ]] ; then
+      n=0
+      while [[ -d $WDIR ]] ; do
+        # Forked processes could still be around, and 'rm -rf' fails
+        rm -rf $WDIR || true
+        ls -l $WDIR && sleep 2 || true
+        n=$((n+1))
+        [[ $n -gt 5 ]] && break
+      done || true
+    fi
+  fi
+  FSFAMILY=${FSFAMILY:=""}
+  if [[ "$FSFAMILY" = /mars || "%FAMILY1%" = archive ]] ; then
+    cd $TMPDIR
+    n=0
+    while [[ -d ${WDIR}$ECF_NAME ]] ; do
+      # Forked processes could still be around, and 'rm -rf' fails
+      rm -rf ${WDIR}$ECF_NAME || true
+      ls -l ${WDIR}$ECF_NAME && sleep 2 || true
+      n=$((n+1))
+      [[ $n -gt 5 ]] && break
+    done || true
+  fi
+
+  if [[ $ARCH = linux ]] ; then
+    . /usr/local/share/ecmwf/share/.epilog
+  fi
+}
+typeset -fx SMSCLEAN
+
+%include <rcp.h>
+
+ERROR() {
+  set -x
+  set +e
+  wait
+  smsabort
+  trap 0
+  date
+  times
+  echo "environment was:"
+  printenv | sort
+
+  SMSCLEAN
+
+  if [[ $$ARCH != "ibm_power*" ]] ; then
+    SMSRCP || :
+  fi
+  exit 1
+}
+
+if [[ $ARCH == hpia64 ]]; then
+  export SMS_SIGNAL_LIST='1 2 3 4 5 6 7 8 10 12 13 15 24 30 33'
+elif [[ $ARCH == ibm_power* ]]; then
+  export SMS_SIGNAL_LIST='1 2 3 4 5 6 7 8 10 12 13 15 24 30'
+elif [[ $ARCH == linux ]]; then
+  export SMS_SIGNAL_LIST='1 2 3 4 5 6 7 8 13 15 24 31'
+else
+  export SMS_SIGNAL_LIST='1 2 3 4 5 6 7 8 13 15 24 31'
+fi
+
+%include <set_traps.h>
+trap
+set -exu
+
+[[ -d $TMPDIR ]] && cd $TMPDIR
+
+smsinit $ECF_RID &
+smsmsg "#ID ECF_NAME=%ECF_NAME%;ECF_JOBOUT=%ECF_JOBOUT%;ECF_HOME=%ECF_HOME%;JOB_ID=${JOB_ID:-}"
+
+date
+
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/micro_in_comment.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/micro_in_comment.ecf
new file mode 100644
index 0000000..ed50b43
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/micro_in_comment.ecf
@@ -0,0 +1,7 @@
+
+echo do %% some work
+
+# mismatched micro characters staring with a # are not reported as errors
+#BSUB -o /u/Carolyn.Pasti/ecf/out/test500/sleep2.o%J
+#BSUB -e /u/Carolyn.Pasti/ecf/out/test500/sleep2.o%J
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/operations.ecf b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/operations.ecf
new file mode 100644
index 0000000..347f7cf
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/SMSHOME2/good/operations.ecf
@@ -0,0 +1,16 @@
+
+
+# Since we have comment out, this should not appear in the jobs file
+#%include <qsub.h>
+# QSUB -lT 3500
+# QSUB -lt 3500
+# QSUB -lM 50mb
+
+
+%include <config.h>
+
+%include <trap.h>
+%include <setup.h>
+ 
+%include <endt.h>
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/ANode/test/data/common.h b/ecflow_4_0_7/ANode/test/data/common.h
new file mode 100644
index 0000000..ec65607
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/common.h
@@ -0,0 +1,7 @@
+#
+# Used to test inclusion with angle brackets  <filename>
+# First look in %ECF_INCLUDE%/filename
+# If file not there then look at ECF_HOME/filename
+#
+# THIS ALLOWS USE TO PUT SPECIFIC FILES IN ECF_INCLUDE
+# AND COMMON FILE IN ECF_HOME
diff --git a/ecflow_4_0_7/ANode/test/data/includes/head.h b/ecflow_4_0_7/ANode/test/data/includes/head.h
new file mode 100644
index 0000000..e49b80e
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/includes/head.h
@@ -0,0 +1,65 @@
+#!/bin/ksh
+# ================================== start of head.h ================================
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+%manual
+#This is the manual from the head.h file
+%end
+
+%comment
+#This is the comment from the head.h file
+%end
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the three variables that are needed for any
+# communication with ECF
+
+export ECF_PORT=%ECF_PORT%  # ECF_ Remote Procedure Call number
+export ECF_NODE=%ECF_NODE%    # The name sms that issued this task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# to debug client communication with the server, enable this environment
+#export ECF_DEBUG_CLIENT=
+
+# Typically we dont set this, however the zombie automated test require this.
+# it allows us to disambiguate a zomie from a real job.
+export ECF_RID=$$
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of smsinit
+# Here we give the current PID.
+
+
+# Defined a error hanlder
+ERROR() {
+	echo "ERROR called"
+	set +e        # Clear -e flag, so we don't fail
+    #smsabort      # Notify ECF_ that something went wrong
+	%ECF_CLIENT_EXE_PATH:ecflow_client% --abort
+	trap 0        # Remove the trap
+	exit 0        # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
+
+
+#smsinit $$
+%ECF_CLIENT_EXE_PATH:ecflow_client% --init=$$
+echo $?
+# ================================== end of head.h ================================
diff --git a/ecflow_4_0_7/ANode/test/data/includes/manual.h b/ecflow_4_0_7/ANode/test/data/includes/manual.h
new file mode 100644
index 0000000..e84cb0c
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/includes/manual.h
@@ -0,0 +1 @@
+Test manual files are pre-processed
diff --git a/ecflow_4_0_7/ANode/test/data/includes/simple_head.h b/ecflow_4_0_7/ANode/test/data/includes/simple_head.h
new file mode 100644
index 0000000..a20f538
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/includes/simple_head.h
@@ -0,0 +1 @@
+#head.h
diff --git a/ecflow_4_0_7/ANode/test/data/includes/simple_tail.h b/ecflow_4_0_7/ANode/test/data/includes/simple_tail.h
new file mode 100644
index 0000000..ef7d1d8
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/includes/simple_tail.h
@@ -0,0 +1 @@
+#tail.h
diff --git a/ecflow_4_0_7/ANode/test/data/includes/tail.h b/ecflow_4_0_7/ANode/test/data/includes/tail.h
new file mode 100644
index 0000000..6405e61
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/includes/tail.h
@@ -0,0 +1,19 @@
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+# ================================== start of tail.h ================================
+#smscomplete  # Notify ECF of a normal end
+%ECF_CLIENT_EXE_PATH:ecflow_client% --complete
+trap 0       # Remove all traps
+exit 0       # End the shell
+%manual
+#This is the manual from the tail.h file
+%end
+%comment
+#This is the comment from the tail.h file
+%end
+# ================================== end of tail.h ================================
diff --git a/ecflow_4_0_7/ANode/test/data/includes/used_variables.h b/ecflow_4_0_7/ANode/test/data/includes/used_variables.h
new file mode 100644
index 0000000..980d42f
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/includes/used_variables.h
@@ -0,0 +1,12 @@
+suite=%SUITE%
+suite=%FAMILY%
+suite=%FAMILY1%
+suite=%TASK%
+suite=%ECF_TRYNO%
+suite=%ECF_JOB%
+suite=%ECF_JOBOUT%
+suite=%ECF_PASS%
+suite=%ECF_PORT%
+suite=%ECF_NODE%
+suite=%ECF_NAME%
+suite=%ESUITE%
diff --git a/ecflow_4_0_7/ANode/test/data/includes/used_variables_with_comments.h b/ecflow_4_0_7/ANode/test/data/includes/used_variables_with_comments.h
new file mode 100644
index 0000000..a70fe7f
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/includes/used_variables_with_comments.h
@@ -0,0 +1,9 @@
+%comment
+suite = %ETASK%
+%end
+
+%manual
+suite = %ETASK%
+%end
+
+suite=%FRED%
diff --git a/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Defs.def b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Defs.def
new file mode 100644
index 0000000..132049b
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Defs.def
@@ -0,0 +1 @@
+22 serialization::archive 9 0 0 0 0 0 0 2 0 0 0 0 15 0 9 ECF_MICRO 1 % 8 ECF_HOME 1 . 11 ECF_JOB_CMD 32 %ECF_JOB% 1> %ECF_JOBOUT% 2>&1 & 12 ECF_KILL_CMD 18 kill -15 %ECF_RID% 14 ECF_STATUS_CMD 21 ps --sid %ECF_RID% -f 11 ECF_URL_CMD 63 ${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)' 12 ECF_URL_BASE 20 http://www.ecmwf.int 7 ECF_URL 27 publications/manuals/ecflow 12 ECF_INTERVAL 2 60 17 ECF_CHECKINTERVAL 3 120 13 ECF_CHECKMODE 13 CHECK_ON_TIME 9 ECF_TRIES 1 2 11 ECF_VERSIO [...]
diff --git a/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Family.def b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Family.def
new file mode 100644
index 0000000..1d8b35f
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Family.def
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
diff --git a/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Limit.def b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Limit.def
new file mode 100644
index 0000000..43b219a
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Limit.def
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0  0 0 0 0 0 0
diff --git a/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Suite.def b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Suite.def
new file mode 100644
index 0000000..a2508b2
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Suite.def
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 -1 0 0 0 0 8 20121030 0 10 3 23 0 8 20121030 0 10 3 23 0 0 0 0 0 0 0 8 20121030 0 10 3 23 0 8 20121030 0 10 3 23 0 0 0 1 0 0
diff --git a/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Task.def b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Task.def
new file mode 100644
index 0000000..5f719fe
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/migration/default_constructor/Task.def
@@ -0,0 +1,2 @@
+22 serialization::archive 9 1 0
+0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 1 0 0 0 0 0 5 _DJP_ 0  0  0 0 0 0 0 1
diff --git a/ecflow_4_0_7/ANode/test/data/migration/fixture/boost_1_47.checkpt b/ecflow_4_0_7/ANode/test/data/migration/fixture/boost_1_47.checkpt
new file mode 100644
index 0000000..e22b3da
--- /dev/null
+++ b/ecflow_4_0_7/ANode/test/data/migration/fixture/boost_1_47.checkpt
@@ -0,0 +1,77 @@
+22 serialization::archive 9 0 0 0 0 0 0 2 0 0 0 0 15 0 9 ECF_MICRO 1 % 8 ECF_HOME 1 . 11 ECF_JOB_CMD 30 %ECF_JOB% 1> %ECF_JOBOUT% 2>&1 12 ECF_KILL_CMD 18 kill -15 %ECF_RID% 14 ECF_STATUS_CMD 21 ps --sid %ECF_RID% -f 11 ECF_URL_CMD 63 ${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)' 12 ECF_URL_BASE 26 https://software.ecmwf.int 7 ECF_URL 24 wiki/display/ECFLOW/Home 12 ECF_INTERVAL 2 60 17 ECF_CHECKINTERVAL 3 120 13 ECF_CHECKMODE 13 CHECK_ON_TIME 9 ECF_TRIES 1 2 11 ECF_VERSI [...]
+0 0 0 0 0 9 suiteName 0 0 0 0 0 0 0 0 0 0 0 2 -1 -1 -1 13 1 0
+1 48 0 0 1 1 14 1 0
+2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 10 0 0 0 5 0 0 0 0 0 0 0 0 0 7 0 0 1 2 3 4 5 6 31 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 12 0 1 2 3 4 5 6 7 8 9 10 11 12 0 -1 -1 -1 3 0 3 VAR 5 value 4 VAR1 7 "value" 9 ECF_FETCH 42 "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%" 0 0 1 1 0 1 25 1 0
+3 10 suiteLimit 10 0 0 0 0 0 0 0 0 0 0 0 0 12 1 0 1 6 1 0
+4 0 0 2 t1 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 0 0 1 6
+5 2 t2 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 6
+6 2 t3 0 0 0 0 0 0 0 2 11 1 0
+7 0 0 2 0 0 0 14 t1 == complete 0 14 t2 == complete 1 0 11
+8 2 0 14 t1 == complete 0 14 t2 == complete 2 0 -1 -1 -1 -1 22 1 0
+9 0 0 3 0 0 0 10 0 0 7 0 0 1 2 3 4 5 6 1 1 100 7 0 0 1 2 3 4 5 6 2 4 100 7 0 0 1 2 3 4 5 6 0 0 0 0 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 6
+10 2 t4 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 22
+11 3 0 0 2 10 7 0 0 1 2 3 4 5 6 1 3 100 7 0 0 1 2 3 4 5 6 2 4 100 7 0 0 1 2 3 4 5 6 0 0 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 6
+12 2 t5 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 37 16 RepeatEnumerated 1 0
+13 0 0 5 AEnum 0 0 3 0 2 10 2 20 2 30 0 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 6
+14 2 t6 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 40 12 RepeatString 1 0
+15 7 aString 3 0 2 10 2 20 2 30 0 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 6
+16 2 t7 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 41 13 RepeatInteger 1 0
+17 3 rep 0 100 1 0 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 6
+18 2 t8 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 42 10 RepeatDate 1 0
+19 3 YMD 20090916 20090916 1 20090916 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 6
+20 2 t9 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 43 9 RepeatDay 1 0
+21 3 day 2 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 7 1 0
+22 10 familyName 0 0 0 0 0 0 0 2 -1 -1 12 1 0
+23 3 12 0 3 12 0 4 12 0 1 0 13
+24 1 0 0 1 0 14
+25 1 0 1 1 0 0 0 10 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2009 0 0 0 0 0 -1 -1 37
+26 5 AEnum 3 0 2 10 2 20 2 30 0 1 0 3 VAR 5 value 1 1 25
+27 9 limitName 20 0 0 0 0 0 0 2 1 6
+28 8 taskName 0 0 0 0 0 0 0 1 -1 -1 12
+29 3 12 0 3 12 0 4 12 0 1 0 -1 14
+30 1 0 1 1 10 10 0 0 0 1 0 0 1 10 10 0 0 0 0 0 0 0 2 0 0 1 10 12 0 0 0 1 0 0 1 10 12 0 0 0 0 0 0 0 1 1 0 1 0 0 3 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 2 2009 0 1 0 1 0 0 0 21 1 0
+31 0 0 1 0 0 100 0 100 7 myMeter 0 0 2 0 0 0 0  0 1 9 eventName 0 0 1 0 9 labelName 12 "labelValue" 0  22
+32 0 0 1 0 1 3 0 -1 1 0 4 VAR1 7 "value" 0 1 1 0 0 0 10 suiteLimit 10 /suiteName 1 0 5 _DJP_ 0  0  0 2 2 1 0 1 49 1 0
+33 6 alias0 2 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 21
+34 1 0 0 100 0 100 7 myMeter 2 0 0 0 0  0 1 9 eventName 1 0 9 labelName 12 "labelValue" 0  -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 49
+35 6 alias1 2 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 21
+36 1 0 0 100 0 100 7 myMeter 2 0 0 0 0  0 1 9 eventName 1 0 9 labelName 12 "labelValue" 0  -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 7
+37 15 heir_familyName 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 40
+38 7 aString 3 0 2 10 2 20 2 30 0 1 0 4 VAR1 5 value 0 1 0 0 0 1 1 6
+39 8 taskName 0 0 0 0 0 0 0 2 -1 -1 -1 13
+40 0 1 0 0 0 -1 21
+41 1 0 0 100 0 100 7 myMeter 2 0 0 0 0  0 1 9 eventName 0 0 -1 -1 1 0 4 VAR1 5 value 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 7
+42 11 familyName1 0 0 0 0 0 0 0 2 -1 -1 12
+43 3 12 0 3 12 0 4 12 0 1 0 13
+44 1 0 0 1 0 14
+45 1 0 1 1 0 0 0 10 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2009 0 0 0 0 0 -1 -1 37
+46 5 AEnum 3 0 2 10 2 20 2 30 0 1 0 3 VAR 5 value 1 1 25
+47 9 limitName 20 0 0 0 0 0 0 1 1 6
+48 9 taskName1 0 0 0 0 0 0 0 1 -1 -1 12
+49 3 12 0 3 12 0 4 12 0 1 0 -1 14
+50 1 0 1 1 10 10 0 0 0 1 0 0 1 10 10 0 0 0 0 0 0 0 2 0 0 1 10 12 0 0 0 1 0 0 1 10 12 0 0 0 0 0 0 0 1 1 0 1 0 0 3 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 2 2009 0 1 0 1 0 0 0 21
+51 1 0 0 100 0 100 7 myMeter 2 0 0 1 0  0 2 9 eventName 1 0 10 labelName1 12 "labelValue" 0  22
+52 0 0 1 0 1 3 0 -1 1 0 4 VAR1 7 "value" 0 1 1 0 10 suiteLimit 10 /suiteName 1 0 5 _DJP_ 0  0  0 2 2 1 49
+53 6 alias0 2 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 21
+54 1 0 0 100 0 100 7 myMeter 2 0 0 1 0  0 2 9 eventName 1 0 10 labelName1 12 "labelValue" 0  -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 49
+55 6 alias1 2 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 21
+56 1 0 0 100 0 100 7 myMeter 2 0 0 1 0  0 2 9 eventName 1 0 10 labelName1 12 "labelValue" 0  -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 7
+57 11 familyName2 0 0 0 0 0 0 0 2 -1 -1 12
+58 3 12 0 3 12 0 4 12 0 1 0 13
+59 1 0 0 1 0 14
+60 1 0 1 1 0 0 0 10 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2009 0 0 0 0 0 -1 -1 37
+61 5 AEnum 3 0 2 10 2 20 2 30 0 1 0 3 VAR 5 value 1 1 25
+62 9 limitName 20 0 0 0 0 0 0 1 1 6
+63 9 taskName2 0 0 0 0 0 0 0 1 11
+64 1 0 38 ../familyName1/taskName1:myMeter ge 10 0 0 11
+65 1 0 36 ../familyName1/taskName1 == complete 0 0 12
+66 3 12 0 3 12 0 4 12 0 1 0 -1 14
+67 1 0 1 1 10 10 0 0 0 1 0 0 1 10 10 0 0 0 0 0 0 0 2 0 0 1 10 12 0 0 0 1 0 0 1 10 12 0 0 0 0 0 0 0 1 1 0 1 0 0 3 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 2 2009 0 1 0 1 0 0 0 21
+68 1 0 0 100 0 100 7 myMeter 2 0 0 2 0  0 3 9 eventName 1 0 10 labelName2 12 "labelValue" 0  22
+69 0 0 1 0 1 3 0 -1 1 0 4 VAR1 7 "value" 0 1 1 0 10 suiteLimit 10 /suiteName 1 0 5 _DJP_ 0  0  0 2 2 1 49
+70 6 alias0 2 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 21
+71 1 0 0 100 0 100 7 myMeter 2 0 0 2 0  0 3 9 eventName 1 0 10 labelName2 12 "labelValue" 0  -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 49
+72 6 alias1 2 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 21
+73 1 0 0 100 0 100 7 myMeter 2 0 0 2 0  0 3 9 eventName 1 0 10 labelName2 12 "labelValue" 0  -1 -1 0 0 0 1 0 0 0 5 _DJP_ 0  0  0 0 0 1 51 1 0
+74 0 1 1 3600 1 1 2009 0 0 0 0 8 20130822 0 8 46 24 0 8 20130822 0 8 46 24 0 0 0 0 0 0 0 8 20130822 0 8 46 24 0 8 20130822 0 8 46 24 0 0 0 1 0 0 4
+75 10 EmptySuite 0 0 0 0 0 0 0 2 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 1 0 0 0 0 1 0 -1 8 20130822 0 8 46 24 0 8 20130822 0 8 46 24 0 0 0 0 0 0 0 8 20130822 0 8 46 24 0 8 20130822 0 8 46 24 0 0 0 1 0 0 0 0 0 0 0
diff --git a/ecflow_4_0_7/AParser/CMakeLists.txt b/ecflow_4_0_7/AParser/CMakeLists.txt
new file mode 100644
index 0000000..e2f0022
--- /dev/null
+++ b/ecflow_4_0_7/AParser/CMakeLists.txt
@@ -0,0 +1,71 @@
+# Note:
+# If new src or test cpp files are added make sure you touch this file
+#
+
+file( GLOB srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp" )
+
+ecbuild_add_library( TARGET   libparser
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     LIBS     node nodeattr core     
+                     INCLUDES src
+                              ../ACore/src 
+                              ../ANattr/src
+                              ../ANode/src
+                     )
+
+# ===================================================================
+# Use following to populate list: 
+#  cd $WK/AParser                      
+#  find test -name \*.cpp | sort   
+list( APPEND test_srcs
+   test/PersistHelper.cpp
+   test/TestAutoAddExterns.cpp
+   test/TestDefsStructurePersistAndReload.cpp
+   test/TestMigration.cpp
+   test/TestParser.cpp
+   test/TestVariableParsing.cpp
+)
+ecbuild_add_test( TARGET       u_aparser
+                  BOOST
+                  SOURCES      ${test_srcs}
+                  LIBS         libparser 
+                  TEST_DEPENDS u_anode
+                 )
+
+
+#
+# Tests parser for a single defs file but with a range of tests
+#
+list( APPEND t2_src test/TestSingleDefsFile.cpp test/PersistHelper.cpp )                    
+ecbuild_add_test( TARGET   perf_aparser
+                  BOOST
+                  SOURCES  ${t2_src}
+                  LIBS     libparser
+                )
+
+#
+# Timer for arbitary defs file,  
+#
+list( APPEND t3_src test/ParseTimer.cpp  test/PersistHelper.cpp )                    
+ecbuild_add_test( TARGET   perf_aparser_timer
+                  ARGS     ${CMAKE_CURRENT_SOURCE_DIR}/test/data/single_defs/mega.def
+                  SOURCES  ${t3_src}
+                  LIBS     libparser 
+                  INCLUDES ../ANode/test
+                           ${Boost_INCLUDE_DIRS} 
+                 )
+
+
+#
+# Tests parser for a single defs file.  
+#
+list( APPEND t4_src test/ParseOnly.cpp )                    
+ecbuild_add_test( TARGET   perf_aparser_only
+                  ARGS     ${CMAKE_CURRENT_SOURCE_DIR}/test/data/single_defs/mega.def
+                  SOURCES  ${t4_src}
+                  LIBS     libparser
+                  INCLUDES ../ANode/test
+                           ${Boost_INCLUDE_DIRS} 
+                 )
diff --git a/ecflow_4_0_7/AParser/Jamfile.jam b/ecflow_4_0_7/AParser/Jamfile.jam
new file mode 100644
index 0000000..d4dd8a2
--- /dev/null
+++ b/ecflow_4_0_7/AParser/Jamfile.jam
@@ -0,0 +1,126 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Parser
+#
+project theParser ;
+
+use-project theCore     : ../ACore ;
+use-project theNodeAttr : ../ANattr ;
+use-project theNode     : ../ANode ;
+
+#
+# Having a library avoid compile objects shared between client and test having
+# differing compilation properties
+#
+lib libparser : [ glob src/*.cpp ]
+              : <include>../ACore/src
+                <include>../ANattr/src 
+                <include>../ANode/src 
+                <variant>debug:<define>DEBUG
+                <link>static
+         	 :
+             : <include>../AParser/src         
+             ;              
+
+#
+# This is *ONLY* required when the define ECFLOW_MT is used,(used by Signal.cpp)
+lib pthread ;
+              
+#
+# Tests for parser.  Exclude file test/TestSingleDefsFile.cpp, test/ParseOnly.cpp test/ParseTimer.cpp
+#                                 test/TestJobGenPerf.cpp    
+#
+exe u_aparser : [ glob test/*.cpp : 
+                  test/TestSingleDefsFile.cpp 
+                  test/ParseOnly.cpp test/ParseTimer.cpp  
+                  test/TestJobGenPerf.cpp
+                ] 
+           pthread 
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           libparser
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../ANode/test 
+           <variant>debug:<define>DEBUG
+ 	     ;
+ 	     
+#
+# Tests parser for a single defs file.  
+#
+exe perf_aparser : test/TestSingleDefsFile.cpp test/PersistHelper.cpp 
+           pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           libparser
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../ANode/test 
+           <variant>debug:<define>DEBUG
+ 	     ;
+ 	     
+#
+# Timer for arbitary defs file,  
+#
+exe perf_aparser_timer : test/ParseTimer.cpp  test/PersistHelper.cpp
+           pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           libparser
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+         : <include>../ANode/test 
+           <variant>debug:<define>DEBUG
+        ;
+        
+#
+# Tests parser for a single defs file.  
+#
+exe perf_aparser_only : test/ParseOnly.cpp   
+           pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           libparser
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+         : <include>../ANode/test 
+           <variant>debug:<define>DEBUG
+        ;
+        
+#
+# Tests job generation performance, relies on python (Pyext/samples/TestJobGenPerf.py) to setup data
+#
+exe perf_job_gen : test/TestJobGenPerf.cpp   
+           pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           libparser
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+         : <include>../ANode/test 
+           <variant>debug:<define>DEBUG
+        ;
+	     
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/src/AutoCancelParser.cpp b/ecflow_4_0_7/AParser/src/AutoCancelParser.cpp
new file mode 100644
index 0000000..d7cad2c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/AutoCancelParser.cpp
@@ -0,0 +1,55 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "AutoCancelParser.hpp"
+#include "TimeSeries.hpp"
+#include "Extract.hpp"
+#include "Node.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool AutoCancelParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	// autocancel +01:00    # cancel one hour after complete
+	// autocancel 01:00     # cancel at 1 am in morning after complete
+	// autocancel 10        # cancel 10 days after complete
+	// autocancel 0         # cancel immediately after complete
+
+	if ( lineTokens.size() < 2 )  throw std::runtime_error( "AutoCancelParser::doParse: Invalid autocancel :" + line );
+	if ( nodeStack().empty() ) throw std::runtime_error("AutoCancelParser::doParse: Could not add autocancel as node stack is empty at line: " + line );
+
+ 	if (lineTokens[1].find_first_of(':') == string::npos) {
+		// Must be of the form:
+		// autocancel 10        # cancel 10 days after complete
+		// autocancel 0         # cancel immediately after complete
+		int days = Extract::theInt(lineTokens[1],"invalid autocancel " + line) ;
+
+		nodeStack_top()->addAutoCancel( AutoCancelAttr( days ) ) ;
+  	}
+	else {
+		// Must be of the form:
+		// autocancel +01:00    # cancel one hour after complete
+		// autocancel 01:00     # cancel at 1 am in morning after complete
+ 		int hour = 0;
+		int min = 0;
+		bool relative = TimeSeries::getTime(lineTokens[1],hour,min);
+
+		nodeStack_top()->addAutoCancel( AutoCancelAttr( TimeSlot( hour, min), relative  ) ) ;
+ 	}
+	return true;
+}
+
+
diff --git a/ecflow_4_0_7/AParser/src/AutoCancelParser.hpp b/ecflow_4_0_7/AParser/src/AutoCancelParser.hpp
new file mode 100644
index 0000000..230f85e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/AutoCancelParser.hpp
@@ -0,0 +1,27 @@
+#ifndef AUTOCANCELPARSER_HPP_
+#define AUTOCANCELPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class AutoCancelParser : public Parser {
+public:
+	AutoCancelParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "autocancel"; }
+	virtual bool doParse(const std::string& line,std::vector<std::string>& lineTokens);
+};
+#endif
diff --git a/ecflow_4_0_7/AParser/src/CalendarParser.cpp b/ecflow_4_0_7/AParser/src/CalendarParser.cpp
new file mode 100644
index 0000000..490ce14
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/CalendarParser.cpp
@@ -0,0 +1,39 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #21 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <stdexcept>
+
+#include "CalendarParser.hpp"
+#include "Str.hpp"
+#include "Suite.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool CalendarParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+   if ( lineTokens.size() < 2 ) {
+      throw std::runtime_error( "CalendarParser::doParse: Invalid calendar :" + line );
+   }
+   if ( nodeStack().empty() ) {
+      throw std::runtime_error("CalendarParser::doParse: Could not add calendar as node stack is empty at line: " + line );
+   }
+
+   Suite* suite =  nodeStack_top()->isSuite();
+   if (!suite) throw std::runtime_error("Calendar can only be added to suites and not " + nodeStack_top()->debugType()  );
+   suite->set_calendar().read_state(line,lineTokens);
+
+   return true;
+}
+
diff --git a/ecflow_4_0_7/AParser/src/CalendarParser.hpp b/ecflow_4_0_7/AParser/src/CalendarParser.hpp
new file mode 100644
index 0000000..60c6557
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/CalendarParser.hpp
@@ -0,0 +1,28 @@
+#ifndef CALENDAR_PARSER_HPP_
+#define CALENDAR_PARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class CalendarParser : public Parser {
+public:
+   CalendarParser(DefsStructureParser* p) : Parser(p) {}
+   virtual const char* keyword() const { return "calendar"; }
+   virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/ClockParser.cpp b/ecflow_4_0_7/AParser/src/ClockParser.cpp
new file mode 100644
index 0000000..162f4db
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/ClockParser.cpp
@@ -0,0 +1,143 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <stdexcept>
+
+#include "ClockParser.hpp"
+#include "DateParser.hpp"
+#include "TimeSeries.hpp"
+#include "Extract.hpp"
+#include "Str.hpp"
+#include "Suite.hpp"
+
+using namespace ecf;
+using namespace std;
+
+static void extractTheGain(const std::string& theGainToken, ClockAttr& clockAttr)
+{
+   if ( theGainToken.find(Str::COLON()) != std::string::npos ) {
+      // clock real +01:00
+      // clock real  01:36
+      int hour,min ;
+      bool positiveGain = TimeSeries::getTime(theGainToken,hour,min);
+      clockAttr.set_gain(hour,min,positiveGain);
+      return;
+   }
+
+   long theGain = 0;
+   std::string theGainStr = theGainToken;
+   bool positiveGain = false;
+   if ( theGainStr[0] == '+') {
+      positiveGain = true;
+      theGainStr.erase(theGainStr.begin());
+   }
+   theGain =  Extract::theInt(theGainStr,"Invalid clock gain:" + theGainToken);
+   clockAttr.set_gain_in_seconds(theGain,positiveGain);
+}
+
+
+bool ClockParser::doParse( const std::string& line,
+                           std::vector<std::string >& lineTokens )
+{
+	// clock hybrid   # a comment
+	// clock hybrid
+	// clock real                  #a comment
+	// clock real 300
+	// clock real +01:00
+	// clock real 20.1.2007
+	// clock real 20.1.2007 +01:00
+
+	// For Testing we allow calendar increment to be change on a per suite basis
+	// -c is optional
+	// clock real 20.1.2007 +01:00
+	// clock hybrid
+
+	// Allow clock to be stopped/started when the server is stopped/started
+	// and hence always honour time dependencies. See Calendar.h for more details
+	// This is optional.( Need to advertise this functionality)
+	// clock real 20.1.2007 +01:00 -s
+	// clock hybrid -s
+	if ( lineTokens.size() < 2 ) {
+		throw std::runtime_error( "ClockParser::doParse: Invalid clock :" + line );
+	}
+	if ( nodeStack().empty() ) {
+		throw std::runtime_error("ClockParser::doParse: Could not add clock as node stack is empty at line: " + line );
+	}
+
+	bool hybrid = true ;
+	if ( lineTokens[1] == "real" )         hybrid = false ;
+	else if ( lineTokens[1] == "hybrid" )  hybrid = true;
+	else throw std::runtime_error( "Invalid clock :" + line );
+
+
+	ClockAttr clockAttr(hybrid);
+
+	if ( lineTokens.size() >= 3 && lineTokens[2][0] != '#' ) {
+		// if third token is not a comment the time must be of the form
+		// clock real 300
+		// clock real +01:00
+		// clock real 20.1.2007
+		// clock real 20.1.2007
+
+		if ( lineTokens[2].find(".") != std::string::npos ) {
+			// clock real 20.1.2007
+
+			// If 0 returned then day,month,year is of form *, and not valid
+			int day,month,year;
+			DateAttr::getDate(lineTokens[2],day,month,year);
+
+			// This will throw std::aout_of_range for an invalid clock date. Note no wild carding allowed.
+			clockAttr.date(day,month,year); // this will check the date
+
+		   if ( lineTokens.size() >= 4 && lineTokens[3][0] != '#' ) {
+		      // clock real 20.1.2007 +01:00
+		      // clock real 20.1.2007 +300
+		      // clock real 20.1.2007 350
+		      extractTheGain(lineTokens[3], clockAttr);
+		   }
+		}
+		else {
+			// clock real 300
+			// clock real +01:00
+			extractTheGain(lineTokens[2], clockAttr);
+		}
+	}
+
+	// Look for the optional -s  , i.e start/stop calendar when the server starts/stops
+	// 	clock real 20.1.2007 +01:00  -s
+	// 	clock hybrid -s
+	size_t line_token_size = lineTokens.size();
+ 	for(size_t i = 2; i < line_token_size; i++ ) {
+ 	   if (lineTokens[i] == "-s") {
+ 			clockAttr.startStopWithServer(true);
+			break;
+		}
+		// Reached the comment, no more valid tokens possible
+		if (lineTokens[i][0] == '#') {
+			// handles comments of the form:
+			//    # comment
+			//    #comment
+			// since we check the first character
+			break;
+		}
+	}
+
+ 	Suite* suite =  nodeStack_top()->isSuite();
+ 	if (!suite) throw std::runtime_error("Clock can only be added to suites and not " + nodeStack_top()->debugType()  );
+
+ 	suite->addClock(clockAttr);
+
+	return true;
+}
+
diff --git a/ecflow_4_0_7/AParser/src/ClockParser.hpp b/ecflow_4_0_7/AParser/src/ClockParser.hpp
new file mode 100644
index 0000000..e996b95
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/ClockParser.hpp
@@ -0,0 +1,29 @@
+#ifndef CLOCKPARSER_HPP_
+#define CLOCKPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+class ClockAttr;
+
+class ClockParser : public Parser {
+public:
+	ClockParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "clock"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/CronParser.cpp b/ecflow_4_0_7/AParser/src/CronParser.cpp
new file mode 100644
index 0000000..9f2ff39
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/CronParser.cpp
@@ -0,0 +1,47 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "CronParser.hpp"
+#include "Node.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+//#define DEBUG_CRON 1
+
+bool CronParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	// cron 23:00                 # run every day at 23:00
+	// cron 10:00 20:00 01:00     # run every hour between 10am and 8pm
+	// cron -w 0,1 10:00          # run every sunday and monday at 10am
+	// cron -d 10,11,12 12:00     # run 10th, 11th and 12th of each month at noon
+	// cron -m 1,2,3 12:00        # run on Jan,Feb and March every day at noon.
+	// cron -w 0 -m 5,6,7,8 10:00 20:00 01:00 # run every sunday, between May-Aug, every hour between 10am and 8pm
+	if ( lineTokens.size() < 2 ) throw std::runtime_error( "CronParser::doParse: Invalid cron: " + line );
+
+#ifdef DEBUG_CRON
+	cerr << "CronParser::doParse " << line << "\n";
+#endif
+
+   bool parse_state = (rootParser()->get_file_type() != PrintStyle::DEFS);
+
+	size_t index = 1; // to get over the cron
+	CronAttr cronAttr;
+	CronAttr::parse( cronAttr,lineTokens, index, parse_state);
+
+	nodeStack_top()->addCron( cronAttr  );
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/CronParser.hpp b/ecflow_4_0_7/AParser/src/CronParser.hpp
new file mode 100644
index 0000000..baadf7c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/CronParser.hpp
@@ -0,0 +1,30 @@
+#ifndef CRONPARSER_HPP_
+#define CRONPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class CronParser : public Parser {
+public:
+	CronParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "cron"; }
+	virtual bool doParse(const std::string& line,std::vector<std::string>& lineTokens);
+};
+
+#endif
+
+
diff --git a/ecflow_4_0_7/AParser/src/DateParser.cpp b/ecflow_4_0_7/AParser/src/DateParser.cpp
new file mode 100644
index 0000000..b3a4c9d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DateParser.cpp
@@ -0,0 +1,51 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <iostream>
+#include "DefsStructureParser.hpp"
+#include "DateParser.hpp"
+#include "Node.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool DateParser::doParse( const std::string& line,
+                          std::vector<std::string >& lineTokens )
+{
+	//  date 15.11.2009 # <value>   // with PersistStyle::STATE & MIGRATE
+	//  date 15.*.*
+	//  date *.1.*
+	if ( lineTokens.size() < 2 ) {
+		throw std::runtime_error( "DateParser::doParse: Invalid date :" + line );
+	}
+
+	if ( nodeStack().empty() ) {
+		throw std::runtime_error("DateParser::doParse: Could not add date as node stack is empty at line: " + line );
+	}
+
+	// DateAttr::create can throw for invalid dates
+	DateAttr date = DateAttr::create( lineTokens[1]) ;
+
+	// state
+	if (lineTokens.size() == 4 && rootParser()->get_file_type() != PrintStyle::DEFS) {
+	   if (lineTokens[3] == "free") {
+	      date.setFree();
+	   }
+	}
+
+ 	nodeStack_top()->addDate( date );
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/DateParser.hpp b/ecflow_4_0_7/AParser/src/DateParser.hpp
new file mode 100644
index 0000000..9616f70
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DateParser.hpp
@@ -0,0 +1,28 @@
+#ifndef DATEPARSER_HPP_
+#define DATEPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class DateParser : public Parser {
+public:
+	DateParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "date"; }
+	virtual bool doParse(const std::string& /*line*/, std::vector<std::string>& lineTokens);
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/DayParser.cpp b/ecflow_4_0_7/AParser/src/DayParser.cpp
new file mode 100644
index 0000000..18b0e6f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DayParser.cpp
@@ -0,0 +1,46 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <stdexcept>
+#include "DayParser.hpp"
+#include "DefsStructureParser.hpp"
+#include "Node.hpp"
+
+using namespace std;
+
+bool DayParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	//  day monday  # free
+	//  day tuesday
+	if ( lineTokens.size() < 2 ) {
+		throw std::runtime_error( "DayParser::doParse: Invalid day :" + line );
+	}
+	if ( nodeStack().empty() ) {
+		throw std::runtime_error("DayParser::doParse: Could not add day as node stack is empty at line: " + line );
+	}
+
+	DayAttr day = DayAttr::create( lineTokens[1] );
+
+   // state
+   if (lineTokens.size() == 4 && rootParser()->get_file_type() != PrintStyle::DEFS) {
+      if (lineTokens[3] == "free") {
+         day.setFree();
+      }
+   }
+
+ 	nodeStack_top()->addDay( day );
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/DayParser.hpp b/ecflow_4_0_7/AParser/src/DayParser.hpp
new file mode 100644
index 0000000..5708c57
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DayParser.hpp
@@ -0,0 +1,27 @@
+#ifndef DAYPARSER_HPP_
+#define DAYPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class DayParser : public Parser {
+public:
+	DayParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "day"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+#endif
diff --git a/ecflow_4_0_7/AParser/src/DefsParser.cpp b/ecflow_4_0_7/AParser/src/DefsParser.cpp
new file mode 100644
index 0000000..313a57a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsParser.cpp
@@ -0,0 +1,425 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #47 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <sstream>
+#include <fstream>
+
+#include "DefsParser.hpp"
+#include "ExternParser.hpp"
+#include "AutoCancelParser.hpp"
+#include "RepeatParser.hpp"
+#include "ClockParser.hpp"
+#include "CalendarParser.hpp"
+#include "VariableParser.hpp"
+#include "InlimitParser.hpp"
+#include "LimitParser.hpp"
+#include "TimeParser.hpp"
+#include "TodayParser.hpp"
+#include "CronParser.hpp"
+#include "MeterParser.hpp"
+#include "DefsStatusParser.hpp"
+#include "EventParser.hpp"
+#include "LabelParser.hpp"
+#include "TriggerParser.hpp"
+#include "DefsStructureParser.hpp"
+#include "DateParser.hpp"
+#include "DayParser.hpp"
+#include "VerifyParser.hpp"
+#include "ZombieAttrParser.hpp"
+#include "LateParser.hpp"
+#include "DefsStateParser.hpp"
+#include "Stl.hpp"
+#include "Str.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+#include <boost/token_functions.hpp>
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+//#define DEBUG_PARSER 1
+
+template<class T>
+ostream& operator<<(ostream& os, const vector<T>& v) {
+   copy(v.begin(), v.end(), ostream_iterator<T>(cout, ","));
+   return os;
+}
+
+
+class TextParser : public Parser {
+public:
+   TextParser(DefsStructureParser* p) : Parser(p) {}
+
+   virtual const char* keyword() const { return "text"; }
+
+   virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens) {
+#ifdef DEBUG
+      assert(*lineTokens.begin() == keyword());
+#endif
+      return true;
+   }
+};
+
+class AliasParser : public Parser {
+public:
+   AliasParser(DefsStructureParser* p, Parser* parentParser) : Parser(p) {
+      reserve_vec(19);
+      addParser( new VariableParser(p) );
+      addParser( new LabelParser(p) );
+      addParser( new MeterParser(p) );
+      addParser( new EventParser(p) );
+      addParser( new TriggerParser(p) );
+      addParser( new InlimitParser(p) );
+      addParser( new LateParser(p) );
+      addParser( new DefsStatusParser(p) );
+      addParser( new CompleteParser(p) );
+      addParser( new TimeParser(p) );
+      addParser( new RepeatParser(p) );
+      addParser( new TodayParser(p) );
+      addParser( new CronParser(p) );
+      addParser( new LimitParser(p) );
+      addParser( new DateParser(p) );
+      addParser( new DayParser(p) );
+      addParser( new AutoCancelParser(p) );
+      addParser( new VerifyParser(p) );
+      addParser( new ZombieAttrParser(p) );
+   }
+
+   virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens) {
+
+      const char* first_token = lineTokens[0].c_str();
+      if (Str::local_strcmp(first_token,keyword()) == 0) {
+
+         if (lineTokens.size() < 2)  throw std::runtime_error("Alias name missing.");
+
+         addAlias(line,lineTokens);
+
+         return true;
+      }
+      else if (Str::local_strcmp(first_token,"endalias") == 0) { // required at the end
+         popNode();
+         return true;
+      }
+      return Parser::doParse(line,lineTokens);
+   }
+
+   virtual const char* keyword() const { return "alias"; }
+
+private:
+
+   void addAlias(const std::string& line,std::vector<std::string>& lineTokens) const
+   {
+      // bad test data can mean that last node is not a suite family or task, will fail parse
+      if (nodeStack().empty() )  throw std::runtime_error("Add alias failed empty node stack");
+
+      // alias can only be added to tasks
+      Task* lastAddedTask = nodeStack_top()->isTask();
+      if ( lastAddedTask ) {
+
+         alias_ptr alias = lastAddedTask->add_alias(lineTokens[1]);
+         alias->read_state(line,lineTokens);
+         nodeStack().push( std::make_pair(alias.get(),this) );
+      }
+      else {
+         if ( nodeStack_top()->isAlias() ) {
+
+            // Alias can _only_ be added to tasks pop the top Node to get to the task
+            popNode();
+            addAlias(line, lineTokens );
+         }
+         else throw std::runtime_error("Add alias failed, expected task on node stack");
+      }
+   }
+};
+
+//================================================================================
+
+class TaskParser : public Parser {
+public:
+   TaskParser(DefsStructureParser* p, Parser* parentParser) : Parser(p) {
+      reserve_vec(21);
+      addParser( new VariableParser(p) );
+      addParser( new TriggerParser(p) );
+      addParser( new LabelParser(p) );
+      addParser( new InlimitParser(p) );
+      addParser( new EventParser(p) );
+      addParser( new LateParser(p) );
+      addParser( new MeterParser(p) );
+      addParser( new DefsStatusParser(p) );
+      addParser( new CompleteParser(p) );
+      addParser( new TimeParser(p) );
+      addParser( new RepeatParser(p) );
+      addParser( new TodayParser(p) );
+      addParser( new CronParser(p) );
+      addParser( new LimitParser(p) );
+      addParser( new DateParser(p) );
+      addParser( new DayParser(p) );
+      addParser( new AutoCancelParser(p) );
+      addParser( new VerifyParser(p) );
+      addParser( new ZombieAttrParser(p) );
+      addParser( new AliasParser(p,this) );
+      addParser( new TextParser(p) );
+   }
+
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens) {
+
+	   const char* first_token = lineTokens[0].c_str();
+	   if (Str::local_strcmp(first_token,keyword()) == 0) {
+
+	      if (lineTokens.size() < 2)  throw std::runtime_error("Task name missing.");
+
+	      // end task is optional, so if we get another task, whilst in a task pop the parser
+	      if ( nodeStack_top()->isTask()) {
+	         popToContainerNode();            // pop the node stack
+	      }
+
+	      addTask(line,lineTokens);
+
+	      return true;
+	   }
+	   else if (Str::local_strcmp(first_token,"endtask") == 0) { // optional
+	      popToContainerNode();
+	      return true;
+	   }
+		return Parser::doParse(line,lineTokens);
+ 	}
+
+	virtual const char* keyword() const { return "task"; }
+
+private:
+
+	void addTask(const std::string& line,std::vector<std::string>& lineTokens) const
+	{
+	   // bad test data can mean that last node is not a suite family or task, will fail parse
+	   if (nodeStack().empty() )  throw std::runtime_error("Add task failed empty node stack");
+
+	   NodeContainer* lastAddedContainer = nodeStack_top()->isNodeContainer();
+	   if ( lastAddedContainer ) {
+
+	      task_ptr task = Task::create(lineTokens[1]);
+         if (rootParser()->get_file_type() != PrintStyle::DEFS) task->read_state(line,lineTokens);
+	      nodeStack().push( std::make_pair(task.get(),this) );
+	      lastAddedContainer->addTask( task );
+	   }
+	   else {
+	      if ( nodeStack_top()->isTask() ) {
+
+	         // Task can _only_ be added to suite and families.
+	         // pop the top Node to get to the Container(suite or family), then call recursively to add task
+	         popNode();
+	         addTask(line, lineTokens );
+	      }
+	   }
+	}
+};
+
+//================================================================================
+
+class FamilyParser : public Parser {
+public:
+   FamilyParser(DefsStructureParser* p) : Parser(p)
+   {
+      reserve_vec(21);
+      addParser( new VariableParser(p) );
+      addParser( new TaskParser(p,this) );
+      addParser( new TriggerParser(p) );
+      addParser( new InlimitParser(p) );
+      addParser( new DefsStatusParser(p) );
+      addParser( new LimitParser(p) );
+      addParser( new CompleteParser(p) );
+      addParser( new MeterParser(p) );
+      addParser( new TimeParser(p) );
+      addParser( new LabelParser(p) );
+      addParser( new RepeatParser(p) );
+      addParser( new LateParser(p) );
+      addParser( new EventParser(p) );
+      addParser( new TodayParser(p) );
+      addParser( new CronParser(p) );
+      addParser( new DateParser(p) );
+      addParser( new DayParser(p) );
+      addParser( new AutoCancelParser(p) );
+      addParser( new VerifyParser(p) );
+      addParser( new ZombieAttrParser(p) );
+      addParser( new TextParser(p) );
+   }
+
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens) {
+
+	   const char* first_token = lineTokens[0].c_str();
+		if (Str::local_strcmp(first_token,keyword()) == 0) {
+
+			if (lineTokens.size() < 2)  throw std::runtime_error("Family name missing.");
+
+			addFamily(line,lineTokens);
+
+ 			return true;
+		}
+		else if (Str::local_strcmp(first_token,"endfamily") == 0) {
+
+ 			popFamily();
+ 			return true;
+		}
+		else if (Str::local_strcmp(first_token,"endtask") == 0) { // optional
+  			popNode();
+ 			return true;
+		}
+		return Parser::doParse(line,lineTokens);
+ 	}
+
+	virtual const char* keyword() const { return "family"; }
+
+private:
+
+	void addFamily(const std::string& line,const std::vector<std::string>& lineTokens) const
+	{
+	   assert( !nodeStack().empty() );
+	   Suite* lastAddedSuite = nodeStack_top()->isSuite();
+	   if (lastAddedSuite ) {
+
+	      family_ptr family = Family::create(lineTokens[1]);
+	      if (rootParser()->get_file_type() != PrintStyle::DEFS) family->read_state(line,lineTokens);
+
+	      nodeStack().push( std::make_pair(family.get(),this) );
+	      lastAddedSuite->addFamily( family );
+	   }
+	   else {
+	      // support hierarchical families
+	      Family* lastAddedFamily = nodeStack_top()->isFamily();
+	      if ( lastAddedFamily ) {
+
+	         family_ptr family = Family::create(lineTokens[1]);
+	         if (rootParser()->get_file_type() != PrintStyle::DEFS) family->read_state(line,lineTokens);
+
+	         nodeStack().push( std::make_pair(family.get(),this));
+	         lastAddedFamily->addFamily( family );
+	      }
+	      else {
+	         Task* lastAddedTask = nodeStack_top()->isTask();
+	         if ( lastAddedTask ) {
+	            // Pop the node, since tasks don't always have end task
+	            popNode();
+	            addFamily(line,lineTokens);
+	         }
+	      }
+	   }
+	}
+
+    void popFamily() const
+    {
+       // Compensate for the fact that Task don't have endtask, hence when we pop for a
+       // family, the top should be a suite/family
+       if ( nodeStack_top()->isTask()) {
+          nodeStack().pop(); // pop the task
+          nodeStack().pop(); // pop the family to get to suite/family
+       }
+       else {
+          nodeStack().pop(); // pop the family to get to suite/family
+       }
+    }
+};
+
+//================================================================================
+
+// See ECFLOW-106, and SUP-1198, why we don't allow time,today,date,day ate the suite level.
+class SuiteParser : public Parser {
+public:
+	SuiteParser(DefsStructureParser* p) : Parser(p), started_(false)
+	{
+      reserve_vec(17);
+	   addParser( new VariableParser(p) );
+	   addParser( new FamilyParser(p) );
+	   addParser( new TaskParser(p,this) );
+	   addParser( new LimitParser(p) );
+	   addParser( new DefsStatusParser(p) );
+	   addParser( new ClockParser(p) );
+	   addParser( new InlimitParser(p) );
+	   addParser( new RepeatParser(p) );
+	   addParser( new LateParser(p) );
+	   addParser( new CronParser(p) );
+	   addParser( new AutoCancelParser(p) );
+	   addParser( new VerifyParser(p) );
+	   addParser( new ZombieAttrParser(p) );
+      addParser( new EventParser(p) );
+      addParser( new LabelParser(p) );
+      addParser( new CalendarParser(p) );
+      addParser( new MeterParser(p) );
+ 	}
+
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens) {
+
+      const char* first_token = lineTokens[0].c_str();
+		if (Str::local_strcmp(first_token,keyword()) == 0) {
+
+			if (started_)               throw std::runtime_error("Can't have hierarchical suites.");
+			if (lineTokens.size() < 2)  throw std::runtime_error("Suite name missing.");
+			started_ = true;
+
+			addSuite(line,lineTokens);
+
+ 			return true;
+		}
+		else if (Str::local_strcmp(first_token,"endsuite") == 0) {
+
+			if (!started_) {
+				throw std::runtime_error("Misplaced endsuite..");
+ 			}
+
+			// ... process end suite
+			while ( !nodeStack().empty() ) nodeStack().pop();
+			started_ = false; // since this parser is reused
+			return true;
+		}
+		return Parser::doParse(line,lineTokens);
+ 	}
+
+	virtual const char* keyword() const { return "suite"; }
+
+private:
+
+    void addSuite(const std::string& line,std::vector<std::string>& lineTokens) const {
+
+       if ( !nodeStack().empty() ) {
+          throw std::runtime_error("SuiteParser::addSuite node stack should be empty");
+       }
+
+       suite_ptr suite = Suite::create(lineTokens[1]);
+       if (rootParser()->get_file_type() != PrintStyle::DEFS) suite->read_state(line,lineTokens);
+
+       nodeStack().push( std::make_pair(suite.get(),this) );
+       defsfile()->addSuite( suite );
+     }
+
+	bool started_;
+};
+
+//================================================================================
+
+DefsParser::DefsParser(DefsStructureParser* p) : Parser(p)
+{
+   reserve_vec(5);
+   addParser( new ExternParser(p) );
+	addParser( new SuiteParser(p) );
+
+   // for defs stat only
+   addParser( new DefsStateParser(p) );
+   addParser( new VariableParser(p,true) );
+   addParser( new HistoryParser(p) );
+}
+
diff --git a/ecflow_4_0_7/AParser/src/DefsParser.hpp b/ecflow_4_0_7/AParser/src/DefsParser.hpp
new file mode 100644
index 0000000..546ba6d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsParser.hpp
@@ -0,0 +1,27 @@
+#ifndef DEFSPARSER_HPP_
+#define DEFSPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class DefsParser : public Parser {
+public:
+	DefsParser(DefsStructureParser* p);
+	virtual const char* keyword() const { return "DEFS" ;}
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/DefsStateParser.cpp b/ecflow_4_0_7/AParser/src/DefsStateParser.cpp
new file mode 100644
index 0000000..216aacc
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsStateParser.cpp
@@ -0,0 +1,42 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include "DefsStateParser.hpp"
+#include "Defs.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace std;
+using namespace boost;
+
+
+bool DefsStateParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+// cout << "line = " << line << "\n";
+   if ( lineTokens.size() < 2 ) throw std::runtime_error( "DefsStateParser::doParse Invalid defs_state " + line );
+
+   if (lineTokens[1] == PrintStyle::to_string(PrintStyle::STATE)) rootParser()->set_file_type( PrintStyle::STATE );
+   else if (lineTokens[1] == PrintStyle::to_string(PrintStyle::MIGRATE)) rootParser()->set_file_type( PrintStyle::MIGRATE );
+   else throw std::runtime_error( "DefsStateParser::doParse: file type not specified : " + line );
+
+   defsfile()->read_state(line,lineTokens); // this can throw
+   return true;
+}
+
+bool HistoryParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+// cout << "line = " << line << "\n";
+   defsfile()->read_history(line,lineTokens); // this can throw
+   return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/DefsStateParser.hpp b/ecflow_4_0_7/AParser/src/DefsStateParser.hpp
new file mode 100644
index 0000000..a158bab
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsStateParser.hpp
@@ -0,0 +1,35 @@
+#ifndef DEFS_STATE_PARSER_HPP_
+#define DEFS_STATE_PARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class DefsStateParser : public Parser {
+public:
+   DefsStateParser(DefsStructureParser* p) : Parser(p){}
+   virtual bool doParse(const std::string& line,std::vector<std::string>& lineTokens);
+   virtual const char* keyword() const { return "defs_state"; }
+};
+
+class HistoryParser : public Parser {
+public:
+   HistoryParser(DefsStructureParser* p) : Parser(p){}
+   virtual bool doParse(const std::string& line,std::vector<std::string>& lineTokens);
+   virtual const char* keyword() const { return "history"; }
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/DefsStatusParser.cpp b/ecflow_4_0_7/AParser/src/DefsStatusParser.cpp
new file mode 100644
index 0000000..5c269d9
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsStatusParser.cpp
@@ -0,0 +1,52 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <sstream>
+#include "DefsStatusParser.hpp"
+#include "DState.hpp"
+#include "Node.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+bool DefsStatusParser::doParse(
+                                const std::string& line,
+                                std::vector<std::string >& lineTokens )
+{
+	if ( lineTokens.size() < 2 ) throw std::runtime_error( "DefsStatusParser::doParse: Invalid defstatus :" + line );
+
+	if ( ! DState::isValid(lineTokens[1])  ) {
+		throw std::runtime_error( "DefsStatusParser::doParse: Invalid defstatus state :" + line );
+	}
+
+	if ( !nodeStack().empty() ) {
+		Node* node = nodeStack_top();
+
+		// Check default status not already defined for this node.
+		std::map< Node*, bool >::const_iterator it = defStatusMap().find( node );
+		if ( it != defStatusMap().end() ) {
+			if ( (*it).second ) {
+				std::stringstream ss;
+				ss << "DefsStatusParser::doParse: " << node->debugType() << " " << node->name() << " already has a default status\n";
+				throw std::runtime_error( ss.str() );
+			}
+		}
+		defStatusMap()[node] = true;
+		node->addDefStatus( DState::toState( lineTokens[1] ) );
+	}
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/DefsStatusParser.hpp b/ecflow_4_0_7/AParser/src/DefsStatusParser.hpp
new file mode 100644
index 0000000..b8b78c7
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsStatusParser.hpp
@@ -0,0 +1,28 @@
+#ifndef DEFSSTATUSPARSER_HPP_
+#define DEFSSTATUSPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class DefsStatusParser : public Parser {
+public:
+	DefsStatusParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "defstatus"; }
+	virtual bool doParse(const std::string& line,std::vector<std::string>& lineTokens);
+};
+
+#endif /* DEFSSTATUSPARSER_HPP_ */
diff --git a/ecflow_4_0_7/AParser/src/DefsStructureParser.cpp b/ecflow_4_0_7/AParser/src/DefsStructureParser.cpp
new file mode 100644
index 0000000..b97e77d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsStructureParser.cpp
@@ -0,0 +1,220 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #26 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <sstream>
+
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/tokenizer.hpp>
+#include <boost/token_functions.hpp>
+
+#include "DefsStructureParser.hpp"
+#include "DefsParser.hpp"
+#include "Defs.hpp"
+#include "Version.hpp"
+#include "Str.hpp"
+
+//#define DEBUG_PARSER 1
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+/////////////////////////////////////////////////////////////////////////////////////
+DefsStructureParser::DefsStructureParser(Defs* defsfile,const std::string& file_name)
+: defsfile_(defsfile),defsParser_(new DefsParser(this)),
+  infile_(file_name),
+  lineNumber_(0),
+  file_type_(PrintStyle::DEFS)
+{
+}
+
+DefsStructureParser::~DefsStructureParser()
+{
+#ifdef SHOW_PARSER_STATS
+	defsParser_->printStats();
+#endif
+}
+
+bool DefsStructureParser::doParse(std::string& errorMsg,std::string& warningMsg)
+{
+   if (!do_parse_only(errorMsg)) {
+      return false;
+   }
+
+   if (file_type_ == PrintStyle::MIGRATE) {
+      return true;
+   }
+
+ 	// Now parse the trigger/complete expressions and resolve in-limits
+	return defsfile_->check(errorMsg,warningMsg);
+}
+
+//#define DO_STATS  1
+bool DefsStructureParser::do_parse_only(std::string& errorMsg)
+{
+   if ( !infile_.ok() ) {
+      std::stringstream ss;
+      ss << "Unable to open file! " << infile_.file_name() << "\n\n";
+      ss << Version::description() << "\n";
+      errorMsg = ss.str();
+      return false;
+   }
+
+   std::vector< std::string > lineTokens; lineTokens.reserve(30); // derived from 3199.def & DO_STATS
+   string line;                           line.reserve(350);      // derived from 3199.def & DO_STATS
+#ifdef DO_STATS
+   size_t max_line_size = 0; max_no_of_tokens = 0;
+#endif
+   while ( infile_.good() ) {
+
+      getNextLine( line ); // will increment lineNumer_
+#ifdef DO_STATS
+      max_line_size = std::max(max_line_size,line.size());
+#endif
+
+      lineTokens.clear();  // This is re-used, hence clear up front
+      Str::split(line, lineTokens);
+      if (lineTokens.empty()) continue;  // ignore empty lines
+#ifdef DO_STATS
+      max_no_of_tokens = std::max(max_no_of_tokens,lineTokens.size());
+#endif
+
+      // Process each line, according to the parser which is on *top* of the stack
+      // If the *top* of the stack is empty use the DefsParser
+      Parser* theCurrentParser  = (nodeStack_.empty()) ? defsParser_.get() : const_cast<Parser*>(nodeStack_.top().second) ;
+      if ( theCurrentParser == NULL ) {
+         std::stringstream ss;
+         ss << "No parser found: Could not parse '" << line << "' around line number " << lineNumber_ << "\n";
+         ss << Version::description() << "\n\n";
+         errorMsg = ss.str();
+         return false;
+      }
+
+      try {
+         // Note: if the chosen parser does not recognise first token then the parent parser has a go at parsing.
+         //       If first token begins with '#' it is ignored
+         // cout << "DefsStructureParser::currentParser() = " << theCurrentParser->keyword() << "\n";
+         theCurrentParser->doParse(line,lineTokens);
+      }
+      catch ( std::exception& e) {
+         std::stringstream ss;
+         ss << e.what() << "\n";
+         ss << "Could not parse '" << line << "' around line number " << lineNumber_ << "\n";
+         ss << Version::description() << "\n\n";
+         errorMsg = ss.str();
+         return false;
+      }
+   }
+#ifdef DO_STATS
+   cout << "max line size = " << max_line_size << "\n";
+   cout << "max token size = " << max_no_of_tokens << "\n";
+#endif
+   return true;
+}
+
+void DefsStructureParser::getNextLine(std::string& line)
+{
+	// *ALL* the handling of multiple statements per line are handled in this function
+	// The presence of ';' signals multiple statements per line.
+	if (multi_statements_per_line_vec_.empty()) {
+		infile_.getline(line);
+		lineNumber_++;
+	   if (file_type_ == PrintStyle::MIGRATE) {
+	      // ignore multiline for migrate, *BECAUSE* *history* for group command uses ';'
+	      return;
+	   }
+
+
+		if (!line.empty()) {
+
+			// See if there are multi statements per line, ie task a; task b; task b # comment
+			if (line.find(';') != std::string::npos) {
+
+			   // ignore lines which have ';' but start with a comment.  i.e.
+			   //     # task a, task b
+	         /// calling trim can be very expensive, hence avoid if possible
+	         std::string::size_type first_non_space_char_pos = line.find_first_not_of(' ');
+	         if (first_non_space_char_pos != std::string::npos && line[first_non_space_char_pos] == '#') {
+	            // found leading_comment can ignore this line
+	            return;
+	         }
+
+
+	         // Handle multiple statement with # comment at the end
+	         //      suite fred; task a; task b; endsuite   # suite fred; task a; task b; endsuite
+	         // Remove comment at the end, to avoid adding to list of tokens
+	         std::string::size_type commentPos = line.find('#');
+	         if ( commentPos !=  std::string::npos) line = line.substr(0,commentPos);
+
+	         char_separator<char> sep(";");
+	         typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+	         tokenizer tokens(line, sep);
+	         std::copy(tokens.begin(), tokens.end(), back_inserter(multi_statements_per_line_vec_));
+	         assert( !multi_statements_per_line_vec_.empty());
+
+	         if ( semiColonInEditVariable() ) {
+	            // clear multi_statements_per_line_vec_ since we can't cope with ';' in variable value
+	            // hence    edit VAR1 'A;B';   edit VAR2 "b;C"
+	            // will be treated as one variable and not two
+	            // TODO need more sophisticated parsing
+	            multi_statements_per_line_vec_.clear();
+	         }
+	         else {
+	            line = *(multi_statements_per_line_vec_.begin());
+	            multi_statements_per_line_vec_.erase( multi_statements_per_line_vec_.begin() );
+	         }
+			}
+		}
+	}
+	else {
+		line = *(multi_statements_per_line_vec_.begin());
+ 		multi_statements_per_line_vec_.erase( multi_statements_per_line_vec_.begin() );
+ 	}
+
+#ifdef DEBUG_PARSER
+	Parser* theParser = currentParser();
+	if ( theParser == NULL) {
+	   cout << lineNumber_ << ": '" << line
+	            << "'              parser( NULL ) node(";
+	}
+	else {
+	   cout << lineNumber_ << ": '" << line
+	            << "'              parser(" << theParser->keyword() << ") ";
+	   if (theParser->parent()) cout << " parent_parser(" << theParser->parent()->keyword() << ")";
+	   cout << " node(";
+	}
+
+	if (!nodeStack_.empty())
+	   cout << nodeStack_top()->debugType() << " : " << nodeStack_top()->name() << ")\n";
+	else
+	   cout << "NULL)\n";
+#endif
+}
+
+bool DefsStructureParser::semiColonInEditVariable()
+{
+ 	if ( multi_statements_per_line_vec_[0].find("edit") != std::string::npos) {
+		// all statements must start with a edit, else we have a semi colon inside variable
+		//    edit A fred;        edit B bill         # valid
+		//    edit A 'fred;bill'; edit B 'bill;bill'  # Can't cope with this, will be ONE variable !!!!
+		for(size_t i = 0; i < multi_statements_per_line_vec_.size(); i++) {
+			boost::algorithm::trim(multi_statements_per_line_vec_[i]);
+			if (multi_statements_per_line_vec_[i].find("edit") != 0) {
+				return true;
+ 			}
+		}
+	}
+ 	return false;
+}
+
diff --git a/ecflow_4_0_7/AParser/src/DefsStructureParser.hpp b/ecflow_4_0_7/AParser/src/DefsStructureParser.hpp
new file mode 100644
index 0000000..c02e20d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/DefsStructureParser.hpp
@@ -0,0 +1,79 @@
+#ifndef DEFS_STRUCTURE_PARSER_HPP_
+#define DEFS_STRUCTURE_PARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <stack>
+#include <map>
+#include <vector>
+#include <fstream>
+
+#include "boost/utility.hpp"
+#include "boost/scoped_ptr.hpp"
+
+#include "File_r.hpp"
+#include "PrintStyle.hpp"
+
+class Defs;
+class Node;
+class Parser;
+
+// This class is used to parse the DEFS file.
+class DefsStructureParser : private boost::noncopyable {
+public:
+
+	DefsStructureParser(Defs* defsfile, const std::string& file_name);
+	~DefsStructureParser();
+
+	/// Parse the definition file, *AND* check expressions and limits
+	/// return true if parse and check are OK, false otherwise
+	/// if false is returned, and error message is also returned
+	bool doParse(std::string& errorMsg,std::string& warningMsg);
+
+	// The file can be of different styles:
+	//    DEFS: This is the structure only (default)
+	//    STATE: structure + state
+	//    MIGRATE: structure + state (No checking, and no externs )
+	void set_file_type(PrintStyle::Type_t t) { file_type_ = t; }
+	PrintStyle::Type_t get_file_type() const { return file_type_; }
+
+protected: // allow test code access
+   bool do_parse_only(std::string& errorMsg);
+
+private:
+
+ 	std::stack< std::pair<Node*,const Parser*> > nodeStack_;  // stack of nodes used in parsing
+   std::map<Node*,bool> defStatusMap_;          // check for duplicates
+
+	Defs* defsfile_;
+	boost::scoped_ptr<Parser> defsParser_;        // Child parsers will be deleted as well
+	friend class Parser;
+
+	ecf::File_r   infile_;
+	int           lineNumber_;
+
+	std::vector<std::string> multi_statements_per_line_vec_;
+	PrintStyle::Type_t file_type_;
+
+private:
+	// read in the next line form the defs file
+	void getNextLine(std::string& line);
+	bool semiColonInEditVariable();
+	friend class TriggerCompleteParser;
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/EventParser.cpp b/ecflow_4_0_7/AParser/src/EventParser.cpp
new file mode 100644
index 0000000..c809f7f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/EventParser.cpp
@@ -0,0 +1,75 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <stdexcept>
+#include <boost/lexical_cast.hpp>
+#include "EventParser.hpp"
+#include "DefsStructureParser.hpp"
+#include "Str.hpp"
+#include "Node.hpp"
+
+using namespace std;
+using namespace ecf;
+
+bool EventParser::doParse( const std::string& line,
+                           std::vector<std::string >& lineTokens )
+{
+	if ( lineTokens.size() < 2 ) throw std::runtime_error( "EventParser::doParse: Invalid event : " + line );
+
+   // Events added to suite/family can not be signaled by child command
+   // However alter/force should allow events to set/cleared on Family/suite
+	if ( nodeStack().empty() ) {
+		throw std::runtime_error("EventParser::doParse: Could not add event as node stack is empty at line: " + line );
+	}
+
+
+	// ===============================================================
+	// Don't use -1, to represent that no number was specified, as on
+	// AIX portable binary archive can't cope with this
+	// use std::numeric_limits<int>::max()
+	// THIS HAS TO BE THE SAME AS THE Event() constructor
+	// ================================================================
+	string name;
+	int number = std::numeric_limits<int>::max();
+
+	// Test for numeric, and then casting, is ****faster***** than relying on exception alone
+	if ( lineTokens[1].find_first_of( Str::NUMERIC() ) != std::string::npos ) {
+		try {
+			number = boost::lexical_cast< int >( lineTokens[1] );
+			if ( lineTokens.size() >= 3 && lineTokens[2][0] != '#' ) {
+				name = lineTokens[2];
+			}
+		}
+		catch ( boost::bad_lexical_cast&  ) {
+			name = lineTokens[1];
+ 		}
+	}
+	else {
+		name = lineTokens[1];
+ 	}
+
+	Event event( number, name );
+
+   // state
+   if (rootParser()->get_file_type() != PrintStyle::DEFS) {
+      if (lineTokens[lineTokens.size()-1] == Event::SET()) {
+         event.set_value(true);
+      }
+   }
+
+   nodeStack_top()->addEvent( event ) ;
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/EventParser.hpp b/ecflow_4_0_7/AParser/src/EventParser.hpp
new file mode 100644
index 0000000..b4fc04c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/EventParser.hpp
@@ -0,0 +1,28 @@
+#ifndef EVENTPARSER_HPP_
+#define EVENTPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class EventParser : public Parser {
+public:
+	EventParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "event"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/ExternParser.cpp b/ecflow_4_0_7/AParser/src/ExternParser.cpp
new file mode 100644
index 0000000..6e17d0f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/ExternParser.cpp
@@ -0,0 +1,48 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "ExternParser.hpp"
+#include "Extract.hpp"
+#include "Defs.hpp"
+
+using namespace std;
+using namespace boost;
+
+bool ExternParser::doParse( const std::string& line,
+                            std::vector<std::string >& lineTokens )
+{
+//	cout << "line = " << line << "\n";
+	if ( lineTokens.size() < 2 )
+		throw std::runtime_error( "ExternParser::doParse Invalid extern " + line );
+
+	// Guard against
+	// extern   # empty extern with a comment
+	// extern   #empty extern with a comment
+	if (lineTokens[1][0] == '#') {
+		throw std::runtime_error( "ExternParser::doParse Invalid extern paths." + line );
+	}
+
+	// Expecting:
+	//   extern <path>
+	//   extern <path>:<attr>
+	// where attr is the name of [ event, meter, repeat, variable, generated variable ]
+	//
+	// We will not split it up:
+
+//	cout << "add extern  = '" << lineTokens[1] << "'\n";
+	defsfile()->add_extern( lineTokens[1]);
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/ExternParser.hpp b/ecflow_4_0_7/AParser/src/ExternParser.hpp
new file mode 100644
index 0000000..93f12f1
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/ExternParser.hpp
@@ -0,0 +1,41 @@
+#ifndef EXTERNPARSER_HPP_
+#define EXTERNPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+//
+// Externs: will typically have a absolute path, however sometimes when
+//          suite are generated incrementally relative paths can be added
+// extern a           path =  a
+// extern /a/b/c      path = /a/b/c
+// extern a/b/c       path = a/b/c
+// extern /a/b/c:YMD  path = /a/b/c   variable:YMD (i.e event, meter, variable, repeat, generated variable)
+//
+// Externs are not persisted, why ?:
+//   o Externs are un-resolved references to node paths in trigger expressions and inlimits
+//     These references could be dynamically generated.
+//   o Saves on network bandwidth and checkpoint file size.
+// Hence externs are *ONLY* used on the client side.
+//
+class ExternParser : public Parser {
+public:
+	ExternParser(DefsStructureParser* p) : Parser(p) {}
+	virtual bool doParse(const std::string& line,std::vector<std::string>& lineTokens);
+	virtual const char* keyword() const { return "extern"; }
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/InlimitParser.cpp b/ecflow_4_0_7/AParser/src/InlimitParser.cpp
new file mode 100644
index 0000000..88b60c2
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/InlimitParser.cpp
@@ -0,0 +1,45 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "InlimitParser.hpp"
+#include "Extract.hpp"
+#include "Node.hpp"
+
+using namespace std;
+
+bool InlimitParser::doParse(
+                             const std::string& line,
+                             std::vector<std::string >& lineTokens )
+{
+	if ( lineTokens.size() < 2 )
+		throw std::runtime_error( "InlimitParser::doParse: Invalid inlimit :" + line );
+
+	string path;
+	string limitName;
+	if ( !Extract::pathAndName( lineTokens[1], path, limitName ) ) {
+		throw std::runtime_error( "InlimitParser::doParse: Invalid inlimit : " + line );
+	}
+
+	//extract priority, if third token is not a comment it must be a priority
+	int tokens = Extract::optionalInt( lineTokens, 2, 1, "Invalid in limit : " + line );
+
+	if ( !nodeStack().empty() ) {
+		Node* node = nodeStack_top();
+
+		//     		cerr << "limitName=" << limitName << " path=" << path << "\n";
+		node->addInLimit( InLimit( limitName, path, tokens ) ) ;
+	}
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/InlimitParser.hpp b/ecflow_4_0_7/AParser/src/InlimitParser.hpp
new file mode 100644
index 0000000..3d905e5
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/InlimitParser.hpp
@@ -0,0 +1,28 @@
+#ifndef INLIMITPARSER_HPP_
+#define INLIMITPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class InlimitParser : public Parser {
+public:
+	InlimitParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "inlimit"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens) ;
+};
+
+#endif /* INLIMITPARSER_HPP_ */
diff --git a/ecflow_4_0_7/AParser/src/LabelParser.cpp b/ecflow_4_0_7/AParser/src/LabelParser.cpp
new file mode 100644
index 0000000..f6516e8
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/LabelParser.cpp
@@ -0,0 +1,35 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "LabelParser.hpp"
+#include "Node.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace std;
+using namespace ecf;
+
+bool LabelParser::doParse( const std::string& line,
+                           std::vector<std::string >& lineTokens )
+{
+	if ( nodeStack().empty() ) {
+		throw std::runtime_error("LabelParser::doParse: Could not add label as node stack is empty at line: " + line );
+	}
+
+	Label label;
+	label.parse(line,lineTokens,rootParser()->get_file_type() != PrintStyle::DEFS);
+	nodeStack_top()->addLabel( label );
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/LabelParser.hpp b/ecflow_4_0_7/AParser/src/LabelParser.hpp
new file mode 100644
index 0000000..a7cced7
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/LabelParser.hpp
@@ -0,0 +1,28 @@
+#ifndef LABELPARSER_HPP_
+#define LABELPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class LabelParser : public Parser {
+public:
+	LabelParser(DefsStructureParser* p) : Parser(p) {}
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+	virtual const char* keyword() const { return "label"; }
+};
+
+#endif /* LABELPARSER_HPP_ */
diff --git a/ecflow_4_0_7/AParser/src/LateParser.cpp b/ecflow_4_0_7/AParser/src/LateParser.cpp
new file mode 100644
index 0000000..b9c1fa0
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/LateParser.cpp
@@ -0,0 +1,73 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "LateParser.hpp"
+#include "TimeSeries.hpp"
+#include "LateAttr.hpp"
+#include "DefsStructureParser.hpp"
+#include "Node.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool LateParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	if ( lineTokens.size() < 3 ) throw std::runtime_error( "LateParser::doParse: Invalid late :" + line );
+
+	// late -s +00:15  -a  20:00  -c +02:00     #The option can be in any order
+	//  0   1    2      3   4     5     6        7     8     9  10 11 12  13
+ 	// late -s +00:15  -c +02:00                # not all options are needed
+	//  0    1   2      3   4                   5
+
+	LateAttr lateAttr; // lateAttr.isNull() will return true;
+	assert(lateAttr.isNull());
+
+	size_t line_token_size = lineTokens.size();
+	for(size_t i = 1; i+1 < line_token_size; i += 2) {
+	   if (lineTokens[i][0] == '#') break;
+
+	   if ( lineTokens[i] == "-s") {
+	      if ( !lateAttr.submitted().isNULL() ) throw std::runtime_error( "LateParser::doParse:2: Invalid late :" + line );
+	      int hour = -1; int min = -1;
+	      TimeSeries::getTime(lineTokens[i+1],hour,min);
+	      lateAttr.addSubmitted( TimeSlot(hour,min) );
+	   }
+	   else if ( lineTokens[i] == "-a") {
+	      if ( !lateAttr.active().isNULL() ) throw std::runtime_error( "LateParser::doParse:3: Invalid late :" + line );
+	      int hour = -1; int min = -1;
+	      TimeSeries::getTime(lineTokens[i+1],hour,min);
+	      lateAttr.addActive( TimeSlot(hour,min) );
+	   }
+	   else if ( lineTokens[i] == "-c") {
+	      if ( !lateAttr.complete().isNULL() ) throw std::runtime_error( "LateParser::doParse:4: Invalid late :" + line );
+	      int hour = -1; int min = -1;
+	      bool relative = TimeSeries::getTime(lineTokens[i+1],hour,min);
+	      lateAttr.addComplete( TimeSlot(hour,min), relative );
+	   }
+	   else throw std::runtime_error( "LateParser::doParse:5: Invalid late :" + line );
+	}
+
+	if (lateAttr.isNull()) {
+	   throw std::runtime_error( "LateParser::doParse:6: Invalid late :" + line );
+	}
+
+	// state
+	if (rootParser()->get_file_type() != PrintStyle::DEFS && lineTokens[line_token_size-1] == "late") {
+	   lateAttr.setLate(true);
+	}
+
+	nodeStack_top()->addLate( lateAttr  ) ;
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/LateParser.hpp b/ecflow_4_0_7/AParser/src/LateParser.hpp
new file mode 100644
index 0000000..2cdb6d6
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/LateParser.hpp
@@ -0,0 +1,27 @@
+#ifndef LATEPARSER_HPP_
+#define LATEPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class LateParser : public Parser {
+public:
+	LateParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "late"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+#endif
diff --git a/ecflow_4_0_7/AParser/src/LimitParser.cpp b/ecflow_4_0_7/AParser/src/LimitParser.cpp
new file mode 100644
index 0000000..95517b1
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/LimitParser.cpp
@@ -0,0 +1,64 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "LimitParser.hpp"
+#include "Extract.hpp"
+#include "Node.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace std;
+
+bool LimitParser::doParse(
+                           const std::string& line,
+                           std::vector<std::string >& lineTokens )
+{
+   // limit name the_limit # value path1 path2
+	if ( lineTokens.size() < 3 )
+		throw std::runtime_error( "LimitParser::doParse: Invalid limit " + line );
+
+   if ( nodeStack().empty() )
+      throw std::runtime_error("LimitParser::doParse: Could not add limit as node stack is empty at line: " + line );
+
+   int limitValue = Extract::theInt( lineTokens[2], "LimitParser::doParse: Invalid limit value: " + line );
+
+   Node* node = nodeStack_top();
+
+   if (rootParser()->get_file_type() != PrintStyle::DEFS) {
+      // state
+      int value = 0;
+      std::set<std::string> paths;
+      bool comment_fnd  = false;
+      bool value_processed = false;
+      for(size_t i = 3; i < lineTokens.size(); i++) {
+         if (comment_fnd) {
+            if (!value_processed) {
+               value = Extract::theInt(lineTokens[i],"LimitParser::doParse: Could not extract limit value: " + lineTokens[i]);
+               value_processed = true;
+            }
+            else {
+               paths.insert(lineTokens[i]);
+            }
+         }
+         if (lineTokens[i] == "#") comment_fnd = true;
+      }
+
+      node->addLimit( Limit( lineTokens[1], limitValue, value, paths ) ) ;
+   }
+   else {
+      // structure
+      node->addLimit( Limit( lineTokens[1], limitValue ) ) ;
+   }
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/LimitParser.hpp b/ecflow_4_0_7/AParser/src/LimitParser.hpp
new file mode 100644
index 0000000..503b18b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/LimitParser.hpp
@@ -0,0 +1,28 @@
+#ifndef LIMITPARSER_HPP_
+#define LIMITPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class LimitParser : public Parser {
+public:
+	LimitParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "limit"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+
+#endif /* LIMITPARSER_HPP_ */
diff --git a/ecflow_4_0_7/AParser/src/MeterParser.cpp b/ecflow_4_0_7/AParser/src/MeterParser.cpp
new file mode 100644
index 0000000..70024e2
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/MeterParser.cpp
@@ -0,0 +1,54 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "MeterParser.hpp"
+#include "Extract.hpp"
+#include "Node.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool MeterParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+   // meter 0 100 100 # value
+	if ( lineTokens.size() < 4 )
+		throw std::runtime_error("MeterParser::doParse: Invalid meter :" + line );
+
+	if ( nodeStack().empty() ) {
+		throw std::runtime_error("MeterParser::doParse: Could not add meter as node stack is empty at line: " + line );
+	}
+
+	int min = Extract::theInt( lineTokens[2], "Invalid meter : " + line );
+	int max = Extract::theInt( lineTokens[3], "Invalid meter : " + line );
+	int colorChange = Extract::optionalInt( lineTokens, 4, 0, "Invalid meter : " + line );
+	Meter meter(lineTokens[1], min, max, colorChange );
+
+   // state
+   if (rootParser()->get_file_type() != PrintStyle::DEFS) {
+      bool comment_fnd =  false;
+      for(size_t i = 2; i < lineTokens.size(); i++) {
+         if (comment_fnd) {
+            // token after comment is the value
+            int value = Extract::theInt(lineTokens[i],"MeterParser::doParse, could not extract meter value");
+            meter.set_value(value); // can throw if value not in range
+         }
+         if (lineTokens[i] == "#") comment_fnd = true;
+      }
+   }
+
+	nodeStack_top()->addMeter( meter ) ;
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/MeterParser.hpp b/ecflow_4_0_7/AParser/src/MeterParser.hpp
new file mode 100644
index 0000000..d7aa14c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/MeterParser.hpp
@@ -0,0 +1,28 @@
+#ifndef METERPARSER_HPP_
+#define METERPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class MeterParser : public Parser {
+public:
+	MeterParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "meter"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+
+#endif /* METERPARSER_HPP_ */
diff --git a/ecflow_4_0_7/AParser/src/Parser.cpp b/ecflow_4_0_7/AParser/src/Parser.cpp
new file mode 100644
index 0000000..169f954
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/Parser.cpp
@@ -0,0 +1,167 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #34 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <sstream>
+#include <fstream>
+#include <boost/foreach.hpp>
+
+#include "Parser.hpp"
+#include "DefsStructureParser.hpp"
+#include "Stl.hpp"
+#include "Str.hpp"
+#include "Indentor.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+using namespace boost::gregorian;
+
+//#define DEBUG_PARSER 1
+
+template<class T>
+ostream& operator<<(ostream& os, const vector<T>& v) {
+    copy(v.begin(), v.end(), ostream_iterator<T>(cout, ","));
+    return os;
+}
+
+
+
+// ===============================================================================
+
+Parser::Parser( DefsStructureParser* p )
+: parent_(NULL),
+  rootParser_( p )
+#ifdef SHOW_PARSER_STATS
+  ,parserCount_(0)
+#endif
+{}
+
+Parser::~Parser() {
+	DeletePtrs( expectedParsers_ );
+}
+
+bool Parser::doParse(const std::string& line, std::vector<std::string>& lineTokens)
+{
+   const char *first_token = lineTokens[0].c_str();
+	size_t theSize = expectedParsers_.size();
+	for(size_t i = 0; i < theSize; ++i) {
+		Parser* p = expectedParsers_[i];
+
+		if (Str::local_strcmp(first_token,p->keyword()) == 0) {
+
+#ifdef SHOW_PARSER_STATS
+			p->incrementParserCount();  // used for stats
+#endif
+
+			return p->doParse(line,lineTokens);
+ 		}
+	}
+
+#ifdef DEBUG_PARSER
+	cerr << "Parser::" << keyword() << " token = '" << *lineTokens.begin() << "' did not match parsers(";
+	BOOST_FOREACH(Parser* p, expectedParsers_) { cerr << " " <<  p->keyword() ; }
+	cerr << ") Trying parent ";
+	if (parent()) cout << "Parser::" << parent()->keyword();
+	cerr << "\n";
+#endif
+
+	// Parent should handle "endfamily", "family" and "endsuite" for hierarchical families
+	if (parent() && ((Str::local_strcmp(first_token,"endfamily") == 0)  ||
+	                 (Str::local_strcmp(first_token,"family") == 0)  ||
+	                 (Str::local_strcmp(first_token,"endsuite") == 0))) {
+		return parent()->doParse(line,lineTokens);
+	}
+
+   // Check if first token is '#' comment character
+   // very first non space character is # comment, hence ignore this line
+   if (*first_token == '#') {
+      // std::cout << "Ignoring line with leading comment : " << line << "\n";
+      return true;
+   }
+
+   // Does not match any parser, or leading comment
+	std::string errorMsg = "Unexpected keyword ";
+	errorMsg += *lineTokens.begin();
+ 	errorMsg += " found whilst parsing ";
+	errorMsg += keyword();
+	if ( !nodeStack().empty() ) {
+		errorMsg += " ";
+		errorMsg += nodeStack_top()->name();
+	}
+	throw std::runtime_error( errorMsg );
+	return false;
+}
+
+
+Defs* Parser::defsfile() const { return rootParser_->defsfile_ ;}
+std::stack< std::pair<Node*,const Parser*> >& Parser::nodeStack() const { return rootParser_->nodeStack_;}
+Node* Parser::nodeStack_top() const { return rootParser_->nodeStack_.top().first;}
+std::map<Node*,bool>& Parser::defStatusMap() const { return rootParser_->defStatusMap_;  }
+
+void Parser::dumpStackTop(const std::string& msg, const std::string& msg2) const
+{
+   std::cout << msg << "  '" << msg2 << "' ++++++++++++++++++++++++++++++++++++++++++++++++++\n";
+   if (rootParser_->nodeStack_.empty()) std::cout << "nodeStack_ is EMPTY\n";
+   else  std::cout << "TOP = " <<  rootParser_->nodeStack_.top().first->debugType()
+    	                         << " '" << rootParser_->nodeStack_.top().first->name() << "'\n";
+}
+
+void Parser::addParser(Parser* p)
+{
+	p->parent(this);
+	expectedParsers_.push_back(p);
+}
+
+void Parser::popNode() const { nodeStack().pop();}
+
+
+void Parser::popToContainerNode() const
+{
+	while ( !nodeStack().empty() &&  !nodeStack_top()->isNodeContainer() ) {
+ 	     nodeStack().pop(); // keep poping till we get to family or suite
+ 	}
+}
+
+void Parser::dump(const std::vector<std::string>& lineTokens)
+{
+   cout << "tokens:";
+   for(unsigned i=0; i < lineTokens.size(); i++) {
+      cout << " '" << lineTokens[i] << "' ";
+   }
+   cout << "\n";
+}
+
+
+#ifdef SHOW_PARSER_STATS
+void Parser::printStats()
+{
+ 	Indentor::indent( std::cout ) << "Parser::" << keyword() << "\n";
+	BOOST_FOREACH(Parser* p, expectedParsers_) {
+		Indentor::indent( std::cout ) << p->keyword() << " " << p->parserCount() << "\n";
+	}
+
+	Indentor in;
+	BOOST_FOREACH(Parser* p, expectedParsers_) {
+ 		if (p->hasChildren()) {
+			p->printStats();
+		}
+	}
+}
+#endif
+
diff --git a/ecflow_4_0_7/AParser/src/Parser.hpp b/ecflow_4_0_7/AParser/src/Parser.hpp
new file mode 100644
index 0000000..cafb833
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/Parser.hpp
@@ -0,0 +1,80 @@
+#ifndef PARSER_HPP_
+#define PARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <vector>
+#include <stack>
+#include <map>
+
+class DefsStructureParser;
+class Node;
+class Defs;
+
+//#define SHOW_PARSER_STATS 1
+
+class Parser {
+public:
+	Parser(DefsStructureParser* p);
+	virtual ~Parser();
+
+	// if child does not recognise token try the parent
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+	Parser* parent() const { return parent_;}
+	void parent(Parser* p)   { parent_ = p;}
+
+	virtual const char* keyword() const = 0;
+
+	DefsStructureParser* rootParser() const { return rootParser_;}
+
+	// convenience function that access DefsStructureParser
+   std::stack< std::pair<Node*,const   Parser*> >& nodeStack() const;
+   Node* nodeStack_top() const;
+	std::map<Node*,bool >& defStatusMap() const;
+
+#ifdef SHOW_PARSER_STATS
+	// The following function used in parser stats only
+	void printStats();
+#endif
+
+protected:
+
+	Defs* defsfile() const;
+	void dumpStackTop(const std::string& msg, const std::string& msg2 = "") const;
+	void addParser(Parser* p);
+	void popNode() const;
+	void popToContainerNode() const;
+	static void dump(const std::vector<std::string>& lineTokens);
+	void reserve_vec(int res) { expectedParsers_.reserve(res); }
+
+private:
+
+	bool hasChildren() const    { return !expectedParsers_.empty();}
+
+	Parser* parent_;
+	DefsStructureParser* rootParser_;
+	std::vector<Parser*> expectedParsers_;
+
+#ifdef SHOW_PARSER_STATS
+	// The following function used in parser stats only
+	void incrementParserCount() { parserCount_++;}
+	int parserCount() const     { return parserCount_;}
+	int parserCount_;
+#endif
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/RepeatParser.cpp b/ecflow_4_0_7/AParser/src/RepeatParser.cpp
new file mode 100644
index 0000000..f6cc351
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/RepeatParser.cpp
@@ -0,0 +1,178 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #31 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "RepeatParser.hpp"
+#include "Extract.hpp"
+#include "Str.hpp"
+#include "Node.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+
+bool RepeatParser::doParse( const std::string& line,
+                            std::vector<std::string >& lineTokens )
+{
+   size_t line_token_size = lineTokens.size();
+	if ( line_token_size < 3 ) throw std::runtime_error( "RepeatParser::doParse: Invalid repeat " + line );
+	if ( nodeStack().empty() )   throw std::runtime_error("RepeatParser::doParse: Could not add repeat as node stack is empty at line: " + line );
+
+	string errorMsg = "Invalid repeat : ";
+	errorMsg += line;
+
+	if ( lineTokens[1] == "date" ) {
+		// repeat date VARIABLE yyyymmdd yyyymmdd [delta]
+		if ( line_token_size < 5 ) throw std::runtime_error( errorMsg );
+
+		string name = lineTokens[2];
+		int startYMD = Extract::ymd( lineTokens[3], errorMsg );
+		int endYMD = Extract::ymd( lineTokens[4], errorMsg );
+		int delta = Extract::optionalInt( lineTokens, 5, 1, errorMsg );
+		RepeatDate rep( name, startYMD, endYMD, delta );
+		int value = 0;
+		if (get_value(lineTokens,value)) rep.set_value(value);
+
+		nodeStack_top()->addRepeat( Repeat( rep ) ) ;
+	}
+	else if ( lineTokens[1] == "enumerated" ) {
+
+		if ( line_token_size < 4 ) throw std::runtime_error( errorMsg );
+
+		// repeat enumerated VARIABLE "first" "second" "last" # comment
+		string name = lineTokens[2];
+		std::vector<std::string> theEnums; theEnums.reserve(line_token_size);
+		for(size_t i = 3; i < line_token_size; i++) {
+			std::string theEnum = lineTokens[i];
+			if (theEnum[0] == '#') break;
+		   Str::removeSingleQuotes(theEnum);// remove quotes, they get added back when we persist
+			Str::removeQuotes(theEnum);      // remove quotes, they get added back when we persist
+			theEnums.push_back(theEnum);
+		}
+		if ( theEnums.empty() ) throw std::runtime_error( errorMsg );
+
+		RepeatEnumerated rep( name, theEnums) ;
+      int index = 0; // This is *assumed to be the index* and not the value
+      if (get_value(lineTokens,index)) rep.set_value(index);
+
+ 		nodeStack_top()->addRepeat( Repeat( rep ) ) ;
+ 	}
+	else if ( lineTokens[1] == "integer" ) {
+		// repeat integer VARIABLE start end [step]
+		if ( line_token_size < 5 ) throw std::runtime_error( errorMsg );
+
+		string name = lineTokens[2];
+ 		int start = Extract::theInt(lineTokens[3],errorMsg);
+		int end =   Extract::theInt(lineTokens[4],errorMsg);
+		int step =  Extract::optionalInt(lineTokens,5, 1,errorMsg );
+		RepeatInteger rep( name, start, end, step );
+		int value = 0;
+		if (get_value(lineTokens,value)) rep.set_value(value);
+
+ 		nodeStack_top()->addRepeat( Repeat( rep ) ) ;
+	}
+	else if ( lineTokens[1] == "day" ) {
+		// repeat day step [ yyyymmdd ]  # the step can be positive or negative
+		// *** See RepeatAttr.h ***
+		// *** We will not support end date until there is a clear requirement for this
+		int step = Extract::theInt(lineTokens[2],"Invalid repeat day:");
+
+		// report end date as a parser error
+		if ( line_token_size >= 4 && lineTokens[3][0] != '#') {
+			throw std::runtime_error( "RepeatParser::doParse: repeat day, <end-date> not supported: " + line );
+  	 	}
+		// day has no state
+		nodeStack_top()->addRepeat( Repeat( RepeatDay( step ) ) ) ;
+	}
+	else if ( lineTokens[1] == "string" ) {
+
+		if ( line_token_size < 4 ) throw std::runtime_error( errorMsg );
+
+		string name = lineTokens[2];
+		std::vector<std::string> theEnums; theEnums.reserve(line_token_size);
+		for(size_t i = 3; i < line_token_size; i++) {
+			std::string theEnum = lineTokens[i];
+			if (theEnum[0] == '#') break;
+         Str::removeSingleQuotes(theEnum);// remove quotes, they get added back when we persist
+			Str::removeQuotes(theEnum);      // remove quotes, they get added back when we persist
+			theEnums.push_back(theEnum);
+		}
+		if ( theEnums.empty() ) throw std::runtime_error( errorMsg );
+
+		RepeatString rep( name, theEnums) ;
+      int index = 0;
+      if (get_value(lineTokens,index)) rep.set_value(index);
+
+ 		nodeStack_top()->addRepeat( Repeat( rep ) ) ;
+	}
+	else if ( lineTokens[1] == "month" ) {
+		// repeat month step [ yyyymmdd ]  # the step can be positive or negative
+		throw std::runtime_error( "RepeatParser::doParse: repeat month not supported: " + line );
+
+//		int endDate = 0;
+//		int step = 0;
+//		extractDayMonthYear( lineTokens, step, endDate );
+//		nodeStack_top()->addRepeat( Repeat( RepeatMonth( step, endDate ) ) );
+	}
+	else if ( lineTokens[1] == "year" ) {
+		// repeat year step [ yyyymmdd ]  # the step can be positive or negative
+		throw std::runtime_error( "RepeatParser::doParse: repeat year not supported: " + line );
+//		int endDate = 0;
+//		int step = 0;
+//		extractDayMonthYear( lineTokens, step, endDate );
+//		nodeStack_top()->addRepeat( Repeat( RepeatYear( step, endDate ) ) );
+	}
+	else if ( lineTokens[1] == "file" ) {
+		// NOT SUPPORTED
+ 	}
+	else {
+		throw std::runtime_error( "RepeatParser::doParse: Invalid repeat " + line );
+	}
+	return true;
+}
+
+//void RepeatParser::extractDayMonthYear( const std::vector< std::string >& lineTokens,
+//										int& x,
+//										int& endDate )
+//{
+//	x = Extract::theInt( lineTokens[2], "invalid repeat" );
+//	if ( lineTokens.size() >= 4 && lineTokens[3][0] != '#') {
+//		std::string errorMsg = "Invalid repeat";
+//		endDate = Extract::ymd( lineTokens[3], errorMsg );
+// 	}
+//	if ( ! nodeStack_top()->isSuite() ) {
+//		throw std::runtime_error( "RepeatParser::doParse: Invalid repeat day/month/year only valid for suite " );
+//	}
+//}
+
+bool RepeatParser::get_value(const std::vector< std::string >& lineTokens, int& value) const
+{
+   // state
+   if (rootParser()->get_file_type() != PrintStyle::DEFS) {
+      // search back for comment
+      // repeat integer VARIABLE start end [step] # value
+      std::string token_after_comment;
+      for(size_t i = lineTokens.size()-1; i > 3; i--) {
+         if (lineTokens[i] == "#") {
+            // token after comment is the value
+            value = Extract::theInt(token_after_comment,"RepeatParser::doParse, could not extract repeat value");
+            return true;
+         }
+         else token_after_comment = lineTokens[i];
+      }
+   }
+   return false;
+}
diff --git a/ecflow_4_0_7/AParser/src/RepeatParser.hpp b/ecflow_4_0_7/AParser/src/RepeatParser.hpp
new file mode 100644
index 0000000..b946019
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/RepeatParser.hpp
@@ -0,0 +1,33 @@
+#ifndef REPEATPARSER_HPP_
+#define REPEATPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class RepeatParser : public Parser {
+public:
+	RepeatParser(DefsStructureParser* p) : Parser(p) {}
+
+	virtual const char* keyword() const { return "repeat"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+
+private:
+//	void extractDayMonthYear(const std::vector<std::string>& lineTokens,int& x, int& endDate);
+	bool get_value(const std::vector< std::string >& lineTokens, int& value) const;
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/TimeParser.cpp b/ecflow_4_0_7/AParser/src/TimeParser.cpp
new file mode 100644
index 0000000..146a06d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/TimeParser.cpp
@@ -0,0 +1,48 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "TimeParser.hpp"
+#include "TimeSeries.hpp"
+#include "Node.hpp"
+#include "DefsStructureParser.hpp"
+
+
+using namespace ecf;
+using namespace std;
+
+bool TimeParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	if ( lineTokens.size() < 2 )
+		throw std::runtime_error( "TimeParser::doParse: Invalid time :" + line );
+
+   bool parse_state = false;
+   bool isFree = false;
+   if (rootParser()->get_file_type() != PrintStyle::DEFS) {
+      parse_state = true;
+      bool comment_fnd =  false;
+      for(size_t i = 2; i < lineTokens.size(); i++) {
+         if (comment_fnd && lineTokens[i] == "free") isFree = true;
+         if (lineTokens[i] == "#") comment_fnd = true;
+      }
+   }
+
+   size_t index = 1;
+   TimeAttr attr( TimeSeries::create(index,lineTokens,parse_state) );
+   if (isFree) attr.setFree();
+
+   nodeStack_top()->addTime( attr );
+   return true;
+}
+
diff --git a/ecflow_4_0_7/AParser/src/TimeParser.hpp b/ecflow_4_0_7/AParser/src/TimeParser.hpp
new file mode 100644
index 0000000..c559430
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/TimeParser.hpp
@@ -0,0 +1,28 @@
+#ifndef TIMEPARSER_HPP_
+#define TIMEPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class TimeParser : public Parser {
+public:
+	TimeParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "time"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+
+#endif /* TIMEPARSER_HPP_ */
diff --git a/ecflow_4_0_7/AParser/src/TodayParser.cpp b/ecflow_4_0_7/AParser/src/TodayParser.cpp
new file mode 100644
index 0000000..89a3275
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/TodayParser.cpp
@@ -0,0 +1,45 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "TodayParser.hpp"
+#include "TodayAttr.hpp"
+#include "Node.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool TodayParser::doParse( const std::string& line,  std::vector<std::string >& lineTokens )
+{
+	if ( lineTokens.size() < 2 ) throw std::runtime_error( "TodayParser::doParse: Invalid today :" + line );
+
+	bool parse_state = false;
+	bool isFree = false;
+   if (rootParser()->get_file_type() != PrintStyle::DEFS) {
+      parse_state = true;
+      bool comment_fnd =  false;
+      for(size_t i = 2; i < lineTokens.size(); i++) {
+         if (comment_fnd && lineTokens[i] == "free") isFree = true;
+         if (lineTokens[i] == "#") comment_fnd = true;
+      }
+   }
+
+	size_t index = 1;
+   TodayAttr attr( TimeSeries::create(index,lineTokens,parse_state) );
+   if (isFree) attr.setFree();
+
+	nodeStack_top()->addToday( attr );
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/TodayParser.hpp b/ecflow_4_0_7/AParser/src/TodayParser.hpp
new file mode 100644
index 0000000..5444f13
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/TodayParser.hpp
@@ -0,0 +1,28 @@
+#ifndef TODAYPARSER_HPP_
+#define TODAYPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class TodayParser : public Parser {
+public:
+	TodayParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "today"; }
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/TriggerParser.cpp b/ecflow_4_0_7/AParser/src/TriggerParser.cpp
new file mode 100644
index 0000000..f646b7b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/TriggerParser.cpp
@@ -0,0 +1,180 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <stdexcept>
+#include <sstream>
+
+#include "TriggerParser.hpp"
+#include "Str.hpp"
+#include "DefsStructureParser.hpp"
+#include "Node.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+
+static bool hasExtension( const std::string& line, const std::vector< std::string >& lineTokens )
+{
+   //    cout << "hasExtension = ";
+   if ( line[line.size() - 1] == '\\' ) {
+      //       cout << "true\n";
+      return true;
+   }
+   const std::string& lastToken = lineTokens.back();
+   if ( lastToken == "\\" || lastToken[lastToken.size() - 1] == '\\' ) {
+      //       cout << "true\n";
+      return true;
+   }
+   //    cout << "false\n";
+   return false;
+}
+
+// ===============================================================================
+
+void TriggerCompleteParser::getExpression(
+         const std::string& line,
+         std::vector< std::string >& theLineTokens,
+         std::string& expression,
+         bool& andExp,
+         bool& orExp,
+         bool& isFree) const
+{
+	assert( *theLineTokens.begin() == keyword() );
+	if ( theLineTokens.size() < 2 ) throw std::runtime_error( "Invalid " + std::string(keyword()) + " " + line );
+
+	// trigger -a n == complete
+	// complete -o n == complete
+	if (theLineTokens[1] == "-a") {
+		andExp = true;
+		theLineTokens.erase(theLineTokens.begin() + 1);
+	}
+	else if (theLineTokens[1] == "-o") {
+		orExp = true;
+		theLineTokens.erase(theLineTokens.begin() + 1);
+	}
+
+
+	// Handle continuations, by removing them and adding to expression
+	if ( hasExtension( line, theLineTokens ) ) {
+		/*
+		     trigger a == complete and  /
+			         b == complete
+		 */
+		std::vector< std::string > accumalatedTokens = theLineTokens;
+		while ( true ) {
+
+			std::string line2;
+			rootParser()->getNextLine( line2 );
+
+			std::vector< std::string > lineTokens2;
+			Str::split( line2, lineTokens2 );
+
+			std::copy( lineTokens2.begin(), lineTokens2.end(),
+						std::back_inserter( accumalatedTokens ) );
+
+			if ( !hasExtension( line2, lineTokens2 ) ) {
+				break;
+			}
+
+			if ( accumalatedTokens.back() == "\\" ) { // remove continuation
+				accumalatedTokens.pop_back();
+			}
+		}
+
+      size_t accumalated_tokens_size = accumalatedTokens.size();
+		for (size_t i = 1; i < accumalated_tokens_size; i++) {
+			std::string token = accumalatedTokens[i];
+			if ( token[token.size() - 1] == '\\' ) {
+				token.erase( token.begin() + token.size() - 1 );
+			}
+			if ( token.empty() )
+				continue;
+			if ( token.at( 0 ) == '#' )
+				break;
+			if ( i != 1 )
+				expression += " ";
+			expression += token;
+		}
+	}
+	else {
+
+		// lineTokens[0] == "trigger";/ "complete"
+	   size_t line_token_size = theLineTokens.size();
+	   expression.reserve(line.size());
+		for (size_t i = 1; i < line_token_size; i++) {
+			if ( theLineTokens[i].at( 0 ) == '#' ) break;
+			if ( i != 1 ) expression += " ";
+			expression += theLineTokens[i];
+		}
+
+	   // state
+	   if (rootParser()->get_file_type() != PrintStyle::DEFS) {
+	      bool comment_fnd =  false;
+	      for(size_t i = 3; i < line_token_size; i++) {
+	         if (comment_fnd) {
+	            if (theLineTokens[i] == "free") {
+	               isFree = true;
+	               break;
+	            }
+	         }
+	         if (theLineTokens[i] == "#") comment_fnd = true;
+	      }
+	   }
+	}
+
+//	cout << "expression = '" << expression << "'\n";
+	if ( expression.empty() ) throw std::runtime_error( "Invalid trigger " + line );
+}
+
+
+bool TriggerParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	bool andExp = false;
+	bool orExp = false;
+	bool isFree = false;
+	std::string expression;
+	getExpression( line, lineTokens, expression, andExp , orExp, isFree);
+
+	if ( !nodeStack().empty() ) {
+		Node* node = nodeStack_top();
+		if (!andExp && !orExp) node->add_part_trigger( PartExpression( expression )) ;
+		else if (andExp)       node->add_part_trigger( PartExpression( expression, true)) ;
+		else if (orExp)        node->add_part_trigger( PartExpression( expression, false)) ;
+		else throw std::runtime_error( "Invalid trigger " + line );
+		if (isFree) node->freeTrigger();
+	}
+
+	return true;
+}
+
+bool CompleteParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	bool andExp = false;
+	bool orExp = false;
+	bool isFree = false;
+	std::string expression;
+	getExpression( line, lineTokens, expression, andExp , orExp, isFree);
+
+	if ( !nodeStack().empty() ) {
+		Node* node = nodeStack_top();
+      if (!andExp && !orExp) node->add_part_complete( PartExpression( expression )) ;
+      else if (andExp)       node->add_part_complete( PartExpression( expression, true)) ;
+      else if (orExp)        node->add_part_complete( PartExpression( expression, false)) ;
+      else throw std::runtime_error( "Invalid complete trigger " + line );
+		if (isFree) node->freeComplete();
+	}
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/TriggerParser.hpp b/ecflow_4_0_7/AParser/src/TriggerParser.hpp
new file mode 100644
index 0000000..39d7add
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/TriggerParser.hpp
@@ -0,0 +1,46 @@
+#ifndef TRIGGERPARSER_HPP_
+#define TRIGGERPARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class TriggerCompleteParser : public Parser {
+protected:
+	TriggerCompleteParser(DefsStructureParser* p) : Parser(p) {}
+	void getExpression(const std::string& line,
+	                   std::vector<std::string>& lineTokens,
+	                   std::string& expression,
+	                   bool& andExr,
+	                   bool& orExpr,
+	                   bool& isFree) const;
+};
+
+class TriggerParser : public TriggerCompleteParser {
+public:
+	TriggerParser(DefsStructureParser* p) : TriggerCompleteParser(p) {}
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens);
+	virtual const char* keyword() const { return "trigger"; }
+};
+
+class CompleteParser : public TriggerCompleteParser {
+public:
+	CompleteParser(DefsStructureParser* p) : TriggerCompleteParser(p) {}
+	virtual bool doParse(const std::string& line, std::vector<std::string>& lineTokens) ;
+	virtual const char* keyword() const { return "complete"; }
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/VariableParser.cpp b/ecflow_4_0_7/AParser/src/VariableParser.cpp
new file mode 100644
index 0000000..4ee7bc5
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/VariableParser.cpp
@@ -0,0 +1,103 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "VariableParser.hpp"
+#include "Node.hpp"
+#include "Str.hpp"
+#include "Defs.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool VariableParser::doParse(
+         const std::string& line,
+         std::vector<std::string >& lineTokens )
+{
+   // Note: For migrate the defs can have variables
+   Node* node =  NULL;
+   if ( nodeStack().empty()) {
+      if (!parsing_defs_) throw std::runtime_error("VariableParser::doParse: Could not add variable, as node stack is empty at line: " + line );
+   }
+   else node = nodeStack_top();
+
+   size_t line_tokens_size = lineTokens.size();
+   if ( line_tokens_size < 3 ) {
+      std::stringstream ss;
+      ss << "VariableParser::doParse: expected at least 3 tokens, found " << line_tokens_size << " on line:" << line << "\n";
+      if (node) ss << "At node: " << node->debugNodePath() << "\n";
+      throw std::runtime_error(ss.str());
+   }
+
+   // There is no need check for '#' comment character in variable name
+   // since the variable constructor will check for this
+   // i.e  edit #var value
+   //      edit var# value
+
+   // Make sure value does not begin with '#' comment character
+   if ( lineTokens[2][0] == '#') {
+      // edit fred #comment
+      // edit fred #
+      std::stringstream ss;
+      ss << "VariableParser::doParse: Expected value but found comment at line:" << line << "\n";
+      if (node) ss << "At node: " << node->debugNodePath() << "\n";
+      throw std::runtime_error(ss.str());
+   }
+
+
+   // ** For aliases, the variables may be **different** to normal variables in that they may contain a ":" & $
+   // ** This is **not** allowed in normal variables.
+   // ** i.e it allows for  %A:1%, %A:2%, %A:3%
+   // ** This is not really recommended but its what the old system supported.
+   // ** Hence the variable construction by-passes variable name checking ***
+
+   // Note:
+   // edit OWNER 'fred'               => value = fred
+   // edit OWNER 'fred and "ginger"'  => value = fred and "ginger"
+   // edit OWNER ""                   => value =
+   // edit OWNER ''                   => value =
+   // edit OWNER '"fred"'             => value = "fred"   * quotes are preserved *
+   // edit OWNER "'fred'"             => value = fred     * tick are not preserved *
+   if ( line_tokens_size == 3 ) {
+      // The order of removing double quotes and then single quotes is significant here
+      Str::removeQuotes(lineTokens[2]);       // if first *and* last character is "
+      Str::removeSingleQuotes(lineTokens[2]); // if first *and* last character is '
+      if (node) {
+         if (node->isAlias()) node->addVariable( Variable( lineTokens[1], lineTokens[2],false )); // bypass name checking
+         else node->addVariable( Variable( lineTokens[1], lineTokens[2] ));
+      }
+      else defsfile()->set_server().add_or_update_user_variables(lineTokens[1], lineTokens[2]);
+      return true;
+   }
+
+   // i.e
+   //  0     1         2
+   // edit ECF_FETCH "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"  #fred
+   std::string value; value.reserve(line.size()-4);
+   for (size_t i = 2; i < line_tokens_size; ++i) {
+      if ( lineTokens[i].at( 0 ) == '#' ) break;
+      if ( i != 2 ) value += " ";
+      value += lineTokens[i];
+   }
+
+   Str::removeQuotes(value);
+   Str::removeSingleQuotes(value);
+   if (node) {
+      if (node->isAlias()) node->addVariable( Variable( lineTokens[1], value, false )); // bypass name checking
+      else                 node->addVariable( Variable( lineTokens[1], value )) ;
+   }
+   else defsfile()->set_server().add_or_update_user_variables(lineTokens[1], value);
+
+   return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/VariableParser.hpp b/ecflow_4_0_7/AParser/src/VariableParser.hpp
new file mode 100644
index 0000000..7a94db6
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/VariableParser.hpp
@@ -0,0 +1,48 @@
+#ifndef VARIABLEPARSER_HPP_
+#define VARIABLEPARSER_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//               edit fred 'val'
+//               edit FRED "smscheck %WSHOST% %EXPVER% %ECF_JOB%"
+//
+//               In the old SMS single quotes are used if no interpretation
+//               is required and double quotes to allow variable substitution
+//               However this is ONLY a requirement for CDP.
+//               Note when OLD SMS uses the show command it always outputs with single quotes
+//
+//               Do we remove the quotes when we store internally ?
+//               i.e if we have :
+//                      edit YMD '20090901'
+//               Then the value '20090901' is not immediately convertible to an integer
+//               *************************************************************
+//               This is required for evaluation in the abstract syntax tree
+//               *************************************************************
+//
+//               Hence we will do the following:
+//                  a/ On parsing always remove quotes ie single or double
+//                  b/ On serialising always add single quotes
+//============================================================================
+
+#include "Parser.hpp"
+
+class VariableParser : public Parser {
+public:
+	VariableParser(DefsStructureParser* p, bool parsing_defs = false) : Parser(p), parsing_defs_(parsing_defs) {}
+	virtual const char* keyword() const { return "edit"; }
+	virtual bool doParse( const std::string& line, std::vector<std::string >& lineTokens );
+private:
+	bool parsing_defs_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/VerifyParser.cpp b/ecflow_4_0_7/AParser/src/VerifyParser.cpp
new file mode 100644
index 0000000..c9938c5
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/VerifyParser.cpp
@@ -0,0 +1,53 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "VerifyParser.hpp"
+#include "Node.hpp"
+#include "Extract.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool VerifyParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	// expect:
+	//    verify <state>:int  i.e
+	//    verify complete:3
+	if ( lineTokens.size() < 2 ) throw std::runtime_error( "VerifyParser::doParse: Invalid verify :" + line );
+
+	if ( !nodeStack().empty() ) {
+		Node* node = nodeStack_top();
+
+		std::string stateInt = lineTokens[1];
+
+		size_t colonPos = stateInt.find_first_of(':');
+		if (colonPos == std::string::npos)  throw std::runtime_error( "Invalid verify :" + line );
+
+		std::string state = stateInt.substr(0,colonPos);
+		std::string expected = stateInt.substr(colonPos+1);
+//		cout << "state = " << state << "\n";
+//		cout << "expected = " << expected << "\n";
+
+		if (!NState::isValid(state)) {
+			throw std::runtime_error( "VerifyParser::doParse: Invalid state :" + line );
+		}
+
+		NState::State theState = NState::toState(state);
+		int theExpectedStateCnt = Extract::theInt(expected,"Invalid verify" );
+
+		node->addVerify( VerifyAttr(theState,theExpectedStateCnt) ) ;
+	}
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/VerifyParser.hpp b/ecflow_4_0_7/AParser/src/VerifyParser.hpp
new file mode 100644
index 0000000..26309fe
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/VerifyParser.hpp
@@ -0,0 +1,29 @@
+#ifndef VERIFYPARSER_HPP_
+#define VERIFYPARSER_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : A verify attribute parser. Note verify are only used for verification
+//               and do not constitute to the structure of a definition file
+//
+//============================================================================
+
+#include "Parser.hpp"
+
+class VerifyParser : public Parser {
+public:
+	VerifyParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "verify"; }
+	virtual bool doParse( const std::string& line, std::vector<std::string >& lineTokens );
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/src/ZombieAttrParser.cpp b/ecflow_4_0_7/AParser/src/ZombieAttrParser.cpp
new file mode 100644
index 0000000..a832080
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/ZombieAttrParser.cpp
@@ -0,0 +1,39 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "ZombieAttrParser.hpp"
+#include "Node.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool ZombieAttrParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
+{
+	// expect:  tokenizer
+	//    zombie <zombie_type>: action : child_cmds :  lifetime
+   //    zombie_type = [ user | ecf | path ]                                 # can only have one
+   //    action      = [ fob | fail | block | remove | adopt ]               # can only have one
+	//    child_cmd   = [ init, event, meter, label, wait, abort, complete ]  # can have mutiple
+	//    zombie ecf:fob::                                                    # fob all child commands
+	//    zombie ecf:fail:event,meter:200                                     # fail child command  event,meter and block other children
+ 	if ( lineTokens.size() < 2 ) throw std::runtime_error( "ZombieAttrParser::doParse: Invalid zombie :" + line );
+	if (nodeStack().empty() )  throw std::runtime_error("Add zombie failed empty node stack");
+
+	//cout << "ZombieAttrParser::doParse: " << lineTokens[1] << "\n";
+
+  	nodeStack_top()->addZombie( ZombieAttr::create(lineTokens[1]) ) ;
+
+	return true;
+}
diff --git a/ecflow_4_0_7/AParser/src/ZombieAttrParser.hpp b/ecflow_4_0_7/AParser/src/ZombieAttrParser.hpp
new file mode 100644
index 0000000..8a9a55d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/src/ZombieAttrParser.hpp
@@ -0,0 +1,27 @@
+#ifndef ZOMBIE_ATTR_PARSER_HPP_
+#define ZOMBIE_ATTR_PARSER_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Parser.hpp"
+
+class ZombieAttrParser : public Parser {
+public:
+	ZombieAttrParser(DefsStructureParser* p) : Parser(p) {}
+	virtual const char* keyword() const { return "zombie"; }
+	virtual bool doParse( const std::string& line, std::vector<std::string >& lineTokens );
+};
+
+#endif
diff --git a/ecflow_4_0_7/AParser/test/ParseOnly.cpp b/ecflow_4_0_7/AParser/test/ParseOnly.cpp
new file mode 100644
index 0000000..57c3427
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/ParseOnly.cpp
@@ -0,0 +1,51 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace ecf;
+
+int main(int argc, char* argv[])
+{
+//   cout << "argc = " << argc << "\n";
+//   for(int i = 0; i < argc; i++) {
+//      cout << "arg " << i << ":" << argv[i] << "\n";
+//   }
+
+   if (argc != 2) {
+      cout << "Expect single argument which is path to a defs file\n";
+      return 1;
+   }
+
+   std::string path = argv[1];
+
+   Defs defs;
+   DefsStructureParser checkPtParser( &defs, path);
+   std::string errorMsg,warningMsg;
+   if (!checkPtParser.doParse(errorMsg,warningMsg)) {
+      cout << errorMsg << "\n";
+      cout << warningMsg << "\n";
+      return 1;
+   }
+//   PrintStyle::setStyle(PrintStyle::MIGRATE);
+//   cout << defs;
+   return 0;
+}
diff --git a/ecflow_4_0_7/AParser/test/ParseTimer.cpp b/ecflow_4_0_7/AParser/test/ParseTimer.cpp
new file mode 100644
index 0000000..2a337fc
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/ParseTimer.cpp
@@ -0,0 +1,224 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/timer.hpp>
+#include "boost/date_time/posix_time/posix_time_types.hpp"
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "NodeContainer.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "PrintStyle.hpp"
+#include "PersistHelper.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "DurationTimer.hpp"
+#include "Log.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+
+// This test is used to find a task given a path of the form:
+//      suite/family/task
+//    suite/family/family/task
+void test_find_task_using_path( NodeContainer* f,const Defs& defs )
+{
+   if (f != defs.findAbsNode(f->absNodePath()).get() ) cout << "Could not find path " << f->absNodePath() << "\n";
+
+   BOOST_FOREACH(node_ptr t, f->nodeVec()) {
+      if (t.get() != defs.findAbsNode(t->absNodePath()).get()) cout <<  "Could not find path " << t->absNodePath() << "\n";
+      Family* family = t->isFamily();
+      if (family) {
+         test_find_task_using_path(family, defs);
+      }
+   }
+}
+
+// Create derived class, so that we can time the parse only
+// i.e ignore expression build/checking and limit checking
+class TestDefsStructureParser : public DefsStructureParser {
+public:
+   TestDefsStructureParser(Defs* defsfile, const std::string& file_name) : DefsStructureParser(defsfile,file_name) {}
+   bool do_parse_only(std::string& errorMsg) { return DefsStructureParser::do_parse_only(errorMsg); }
+};
+
+
+int main(int argc, char* argv[])
+{
+//   cout << "argc = " << argc << "\n";
+//   for(int i = 0; i < argc; i++) {
+//      cout << "arg " << i << ":" << argv[i] << "\n";
+//   }
+
+   if (argc != 2) {
+      cout << "Expect single argument which is path to a defs file\n";
+      return 1;
+   }
+
+   std::string path = argv[1];
+
+   DurationTimer duration_timer;
+   boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+
+   /// If this is moved below, we get some caching affect, with the persist and reload timing
+   Defs defs;
+   {
+      timer.restart();
+      DefsStructureParser checkPtParser( &defs, path);
+      std::string errorMsg,warningMsg;
+      bool result = checkPtParser.doParse(errorMsg,warningMsg);
+      std::cout << " Parsing Node tree and AST creation time = " << timer.elapsed() << " parse(" << result << ")" << endl;
+   }
+
+   //   {
+   //      Defs local_defs;
+   //      timer.restart();
+   //      TestDefsStructureParser checkPtParser( &local_defs, path);
+   //      std::string errorMsg;
+   //      bool result = checkPtParser.do_parse_only(errorMsg);
+   //      std::cout << " Parsing Node tree *only* time           = " << timer.elapsed() << " parse(" << result << ")" << endl;
+   //   }
+
+
+   //   {
+   //      timer.restart();
+   //      BOOST_FOREACH(suite_ptr s, defs.suiteVec()) { test_find_task_using_path(s.get(),defs); }
+   //      cout << " Test all paths can be found. time taken = " << timer.elapsed() << endl;
+   //   }
+   //
+   //   {
+   //      // Test time for persisting to defs file only
+   //      std::string tmpFilename = "tmp.def";
+   //
+   //      timer.restart();
+   //      PrintStyle style(PrintStyle::DEFS);
+   //      std::ofstream ofs( tmpFilename.c_str() );  ofs << defs;
+   //      cout << " Persist only, time taken                                   = " << timer.elapsed()  << endl;
+   //
+   //      std::remove(tmpFilename.c_str());
+   //   }
+
+   //   {
+   //      // may need to comment out output for large differences. Will double the time.
+   //      timer.restart();
+   //      PersistHelper helper;
+   //      bool result = helper.test_persist_and_reload(defs);
+   //      cout << " Persist and reload(DEFS) and compare, time taken           = "
+   //               << timer.elapsed()  << " file_size(" << helper.file_size() << ")  result(" << result << ") msg(" << helper.errorMsg() << ")" << endl;
+   //   }
+
+#if defined(BINARY_ARCHIVE)
+   {
+      bool do_compare = false;
+      timer.restart();
+      PersistHelper helper;
+      bool result = helper.test_checkpt_and_reload(defs, do_compare,ecf::Archive::BINARY);
+      cout << " Checkpt(BINARY_ARCHIVE) and reload , time taken   = ";
+      cout << timer.elapsed() << " file_size(" << helper.file_size() << ")  result(" << result << ") msg(" << helper.errorMsg() << ")" << endl;
+   }
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+   {
+      bool do_compare = false;
+      timer.restart();
+      PersistHelper helper;
+      bool result = helper.test_checkpt_and_reload(defs, do_compare, ecf::Archive::PORTABLE_BINARY);
+      cout << " Checkpt(PORTABLE_BINARY_ARCHIVE) and reload , time taken   = ";
+      cout << timer.elapsed() << " file_size(" << helper.file_size() << ")  result(" << result << ") msg(" << helper.errorMsg() << ")" << endl;
+   }
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   {
+      bool do_compare = false;
+      timer.restart();
+      PersistHelper helper;
+      bool result = helper.test_checkpt_and_reload(defs, do_compare, ecf::Archive::EOS_PORTABLE_BINARY);
+      cout << " Checkpt(EOS_PORTABLE_BINARY_ARCHIVE) and reload , time taken   = ";
+      cout << timer.elapsed() << " file_size(" << helper.file_size() << ")  result(" << result << ") msg(" << helper.errorMsg() << ")" << endl;
+   }
+#else
+   {
+      bool do_compare = false;
+      timer.restart();
+      PersistHelper helper;
+      bool result = helper.test_checkpt_and_reload(defs, do_compare, ecf::Archive::TEXT);
+      cout << " Checkpt(TEXT_ARCHIVE) and reload , time taken   = ";
+      cout << timer.elapsed() << " file_size(" << helper.file_size() << ")  result(" << result << ") msg(" << helper.errorMsg() << ")" << endl;
+   }
+//   {
+//      bool do_compare = false;
+//      timer.restart();
+//      PersistHelper helper;
+//      for(int i = 0; i < 5; i++) {
+//         bool result = helper.test_checkpt_and_reload(defs, do_compare, ecf::Archive::TEXT);
+//         if (!helper.errorMsg().empty())  cout << " result(" << result << ") msg(" << helper.errorMsg() << ")\n";
+//      }
+//      cout << " Checkpt(TEXT_ARCHIVE) and reload 5 times: Average time taken = ";
+//      cout << timer.elapsed()/5 << " : file_size(" << helper.file_size() << ")\n";
+//   }
+#endif
+
+//   {
+//      // Time how long it takes for job submission. Must call begin on all suites first.
+//      timer.restart();
+//      defs.beginAll();
+//      int count = 10;
+//      JobsParam jobsParam; // default is not to create jobs, hence only used in testing
+//      Jobs jobs(&defs);
+//      for (int i = 0; i < count; i++) {jobs.generate(jobsParam);}
+//      cout << " time for " << count << " jobSubmissions:" << timer.elapsed() << "s jobs:" << jobsParam.submitted().size() << endl;
+//   }
+//
+//   {
+//      // Time how long it takes for post process
+//      timer.restart();
+//      string errorMsg,warningMsg;
+//      bool result = defs.check(errorMsg,warningMsg);
+//      cout << " time for Defs::check (  inlimit resolution) = " << timer.elapsed() <<  " result(" << result << ") msg(" << errorMsg << ")" << endl;
+//   }
+
+//   {
+//      // Time how long it takes to delete all nodes/ references. Delete all tasks and then suites/families.
+//      timer.restart();
+//      std::vector<Task*> tasks;
+//      defs.getAllTasks(tasks);
+//      BOOST_FOREACH(Task* t, tasks) {
+//         if (!defs.deleteChild(t)) cout << "Failed to delete task\n";
+//      }
+//      tasks.clear(); defs.getAllTasks(tasks);
+//      if (!tasks.empty()) cout << "Expected all tasks to be deleted but found " << tasks.size() << "\n";
+//
+//      std::vector<suite_ptr> vec = defs.suiteVec(); // make a copy, to avoid invalidating iterators
+//      BOOST_FOREACH(suite_ptr s, vec) {
+//         std::vector<node_ptr> familyVec = s->nodeVec(); // make a copy, to avoid invalidating iterators
+//         BOOST_FOREACH(node_ptr f, familyVec) {
+//            if (!defs.deleteChild(f.get())) cout << "Failed to delete family\n";
+//         }
+//         if (!s->nodeVec().empty()) cout << "Expected all Families to be deleted but found " << s->nodeVec().size() << "\n";
+//         if (!defs.deleteChild(s.get())) cout << "Failed to delete suite\n";
+//      }
+//      if (!defs.suiteVec().empty()) cout << "Expected all Suites to be deleted but found " << defs.suiteVec().size() << "\n";
+//
+//      cout << " time for deleting all nodes = " << timer.elapsed() << endl;
+//   }
+   cout << " Total elapsed time = " << duration_timer.duration() << " seconds\n";
+}
diff --git a/ecflow_4_0_7/AParser/test/PersistHelper.cpp b/ecflow_4_0_7/AParser/test/PersistHelper.cpp
new file mode 100644
index 0000000..184471e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/PersistHelper.cpp
@@ -0,0 +1,237 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/archive/tmpdir.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <iostream>
+#include <fstream>
+
+#include "PersistHelper.hpp"
+#include "DefsStructureParser.hpp"
+#include "PrintStyle.hpp"
+#include "Defs.hpp"
+#include "Ecf.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+bool PersistHelper::test_persist_and_reload( const Defs& theInMemoryDefs, PrintStyle::Type_t file_type_on_disk)
+{
+ 	// Write parsed file to disk, and reload, then compare defs, they should be the same
+	errorMsg_.clear();
+	file_size_ = 0;
+
+#ifdef DEBUG
+	std::string tmpFilename = "tmp_d.def";
+#else
+	std::string tmpFilename = "tmp.def";
+#endif
+	{
+	   // The file MUST be written in the *SAME* form that it was read
+	   // Otherwise they will not compare:
+	   PrintStyle style(file_type_on_disk);
+		std::ofstream ofs( tmpFilename.c_str() );
+		ofs << theInMemoryDefs;
+	}
+
+	// Reload the file we just persisted and compare with in memory defs
+	Defs savedDef;
+	return reload_from_defs_file(theInMemoryDefs,savedDef,tmpFilename);
+}
+
+
+bool PersistHelper::test_checkpt_and_reload( const Defs& theInMemoryDefs, bool do_compare, ecf::Archive::Type at)
+{
+ 	errorMsg_.clear();
+ 	file_size_ = 0;
+
+   // Save in memory defs as a check pt file, then restore and compare
+ 	Defs reloaded_defs;
+ 	return reload_from_checkpt_file(theInMemoryDefs,reloaded_defs,do_compare,at);
+}
+
+
+bool PersistHelper::test_state_persist_and_reload_with_checkpt(const Defs& theInMemoryDefs )
+{
+   // Write Defs to disk, and reload, then compare defs relaoded checkpt file, they should be the same
+   errorMsg_.clear();
+   file_size_ = 0;
+
+#ifdef DEBUG
+   std::string tmpFilename = "tmp_d.def";
+#else
+   std::string tmpFilename = "tmp.def";
+#endif
+   {
+      // The file MUST be written in the *SAME* form that it was read
+      // Otherwise they will not compare:
+      PrintStyle style(PrintStyle::MIGRATE); // will save edit history
+      std::ofstream ofs( tmpFilename.c_str() );
+      ofs << theInMemoryDefs;
+   }
+
+   // Reload the file we just persisted and compare with in memory defs
+   Defs reloaded_defs;
+   if (!reload_from_defs_file(theInMemoryDefs,reloaded_defs,tmpFilename)) {
+      return false;
+   }
+
+   // Save in memory defs as a check pt file, then restore and compare
+   Defs reloaded_checkPt_defs;
+   if (!reload_from_checkpt_file(theInMemoryDefs,reloaded_checkPt_defs,true,ecf::Archive::default_archive())) {
+      return false;
+   }
+
+   // Make sure reloading def's file with state is same as the checkpt file
+   Ecf::set_debug_equality(true);
+   bool match = reloaded_defs == reloaded_checkPt_defs;
+   Ecf::set_debug_equality(false);
+
+   if (!match) {
+      std::stringstream ss;
+      ss << "\nPersistHelper::test_state_persist_and_reload_with_checkpt\n";
+      ss << "In reloaded_defs_file and reloaded_checkPt_defs don't match\n";
+      ss << "+++++++++++++ in memory defs  ++++++++++++++++++++++++++++\n";
+      PrintStyle style(PrintStyle::MIGRATE); // will save edit history
+      ss << theInMemoryDefs;
+      ss << "+++++++++++++ reloaded_defs  ++++++++++++++++++++++++++++\n";
+      ss << reloaded_defs;
+      ss << "++++++++++++++ reloaded_checkPt_defs  ++++++++++++++++++++++++++++\n";
+      ss << reloaded_checkPt_defs;
+      errorMsg_ += ss.str();
+   }
+   else {
+      if (compare_edit_history_ && !reloaded_defs.compare_edit_history(reloaded_checkPt_defs)) {
+         std::stringstream ss;
+         ss << "\nPersistHelper::test_state_persist_and_reload_with_checkpt  compare_edit_history_\n";
+         ss << "In reloaded_defs_file and reloaded_checkPt_defs edit history don't match\n";
+         ss << "+++++++++++++ in memory defs  ++++++++++++++++++++++++++++\n";
+         PrintStyle style(PrintStyle::MIGRATE); // will save edit history
+         ss << theInMemoryDefs;
+         ss << "+++++++++++++ reloaded_defs  ++++++++++++++++++++++++++++\n";
+         ss << reloaded_defs;
+         ss << "++++++++++++++ reloaded_checkPt_defs  ++++++++++++++++++++++++++++\n";
+         ss << reloaded_checkPt_defs;
+         errorMsg_ += ss.str();
+      }
+   }
+   return errorMsg_.empty();
+}
+
+
+bool PersistHelper::reload_from_defs_file(const Defs& theInMemoryDefs, Defs& reloaded_defs, const std::string& tmpFilename )
+{
+   std::string warningMsg;
+   DefsStructureParser defsParser( &reloaded_defs, tmpFilename );
+   bool theParse = defsParser.doParse(errorMsg_,warningMsg);
+   if (!theParse) {
+      std::stringstream ss;
+      ss << "RE-PARSE failed for " << tmpFilename << "\n";
+      errorMsg_ += ss.str();
+      return false;
+   }
+
+   // Make sure the file we just parsed match's the one we persisted
+   Ecf::set_debug_equality(true);
+   bool match = reloaded_defs == theInMemoryDefs;
+   Ecf::set_debug_equality(false);
+
+   if (!match) {
+      std::stringstream ss;
+      ss << "\nPersistHelper::reload_from_defs_file\n";
+      ss << "In memory and reloaded def's don't match\n";
+      ss << "+++++++++++++ Saved/reloaded_defs  ++++++++++++++++++++++++++++\n";
+      PrintStyle style(PrintStyle::STATE);
+      ss << reloaded_defs;
+      ss << "++++++++++++++ In memory def ++++++++++++++++++++++++++++\n";
+      ss << theInMemoryDefs;
+      errorMsg_ += ss.str();
+   }
+   else {
+      if (compare_edit_history_ && !reloaded_defs.compare_edit_history(theInMemoryDefs)) {
+         std::stringstream ss;
+         ss << "\nPersistHelper::reload_from_defs_file compare_edit_history_\n";
+         ss << "In memory and reloaded def's don't match\n";
+         ss << "+++++++++++++ Saved/reloaded_defs  ++++++++++++++++++++++++++++\n";
+         PrintStyle style(PrintStyle::MIGRATE);
+         ss << reloaded_defs;
+         ss << "++++++++++++++ In memory def ++++++++++++++++++++++++++++\n";
+         ss << theInMemoryDefs;
+         errorMsg_ += ss.str();
+      }
+   }
+
+   file_size_ = fs::file_size(tmpFilename);
+   std::remove(tmpFilename.c_str());
+   return errorMsg_.empty();
+}
+
+
+bool PersistHelper::reload_from_checkpt_file(const Defs& theInMemoryDefs,
+                                             Defs& reloaded_defs,
+                                             bool do_compare ,
+                                             ecf::Archive::Type at)
+{
+   // make sure edit history is saved
+#ifdef DEBUG
+   std::string tmpCheckPt_file = "tmp.check_debug";
+#else
+   std::string tmpCheckPt_file = "tmp.check";
+#endif
+   theInMemoryDefs.save_as_checkpt(tmpCheckPt_file,at);
+
+   try  {
+      // Parse the file we just persisted and load the defs file into memory.
+      reloaded_defs.restore_from_checkpt(tmpCheckPt_file,at);
+
+      if (do_compare ) {
+         // Make sure the checkpoint file file we just parsed match's the one we persisted
+         bool match = reloaded_defs == theInMemoryDefs;
+         if (!match) {
+            std::stringstream ss;
+            ss << "\nPersistHelper::reload_from_checkpt_file\n";
+            ss << "In memory and reloaded def's don't match\n";
+            ss << "+++++++++++++ Saved/reloaded check pt file ++++++++++++++++++++++++++++\n";
+            PrintStyle style(PrintStyle::STATE);
+            ss << reloaded_defs;
+            ss << "++++++++++++++ In memory def ++++++++++++++++++++++++++++\n";
+            ss << theInMemoryDefs;
+            errorMsg_ += ss.str();
+         }
+         else {
+            if (compare_edit_history_ && !reloaded_defs.compare_edit_history(theInMemoryDefs)) {
+               std::stringstream ss;
+               ss << "\nPersistHelper::reload_from_checkpt_file  compare_edit_history_\n";
+               ss << "In reloaded_defs_file and reloaded_checkPt_defs edit history don't match\n";
+               ss << "+++++++++++++ Saved/reloaded check pt file ++++++++++++++++++++++++++++\n";
+               PrintStyle style(PrintStyle::MIGRATE);
+               ss << reloaded_defs;
+               ss << "++++++++++++++ theInMemoryDefs  ++++++++++++++++++++++++++++\n";
+               ss << theInMemoryDefs;
+               errorMsg_ += ss.str();
+            }
+         }
+      }
+   }
+   catch (std::exception& e) {
+      errorMsg_ =  "PersistHelper::reload_from_checkpt_file: " + string(e.what());
+   }
+
+   file_size_ = fs::file_size(tmpCheckPt_file);
+   std::remove(tmpCheckPt_file.c_str());
+
+   return errorMsg_.empty();
+}
diff --git a/ecflow_4_0_7/AParser/test/PersistHelper.hpp b/ecflow_4_0_7/AParser/test/PersistHelper.hpp
new file mode 100644
index 0000000..02b607d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/PersistHelper.hpp
@@ -0,0 +1,58 @@
+#ifndef PERSISTHELPER_HPP_
+#define PERSISTHELPER_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+
+#include <boost/noncopyable.hpp>
+#include <string>
+#include "Archive.hpp"
+#include "PrintStyle.hpp"
+class Defs;
+
+/// Given a in memory defs file, this class will write it to disk
+/// and reload the definition file structure and will then make a comparison
+/// to ensure they are the same
+class PersistHelper : private boost::noncopyable {
+public:
+	PersistHelper(bool compare_edit_history = false) : file_size_(0),compare_edit_history_(compare_edit_history) {}
+
+	bool test_persist_and_reload( const Defs& theInMemoryDefs, PrintStyle::Type_t file_type_on_disk);
+	bool test_checkpt_and_reload( const Defs& theInMemoryDefs, bool do_compare = true,ecf::Archive::Type at = ecf::Archive::default_archive());
+	bool test_state_persist_and_reload_with_checkpt( const Defs& theInMemoryDefs );
+	const std::string& errorMsg() const { return errorMsg_;}
+
+	/// returns the file size of the temporary file created by:
+	///   test_persist_and_reload(..) or test_checkpt_and_reload(..)
+	size_t file_size() const { return file_size_;}
+
+private:
+
+   bool reload_from_defs_file( const Defs& theInMemoryDefs, Defs& reloaded_defs, const std::string& filename );
+   bool reload_from_checkpt_file(const Defs& theInMemoryDefs,
+                                 Defs& reloaded_defs,
+                                 bool do_compare = true,
+                                 ecf::Archive::Type at = ecf::Archive::default_archive() );
+
+private:
+
+	std::string errorMsg_;
+	size_t file_size_;
+	bool compare_edit_history_;
+};
+#endif
+
+
+
diff --git a/ecflow_4_0_7/AParser/test/TestAutoAddExterns.cpp b/ecflow_4_0_7/AParser/test/TestAutoAddExterns.cpp
new file mode 100644
index 0000000..80a9000
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/TestAutoAddExterns.cpp
@@ -0,0 +1,69 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/timer.hpp>
+#include "boost/date_time/posix_time/posix_time_types.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "NodeContainer.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "Log.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE( ParserTestSuite )
+
+// Test that automatic add of externs
+BOOST_AUTO_TEST_CASE( test_auto_add_externs )
+{
+   std::string path = File::test_data("AParser/test/data/single_defs/test_auto_add_extern.def","AParser");
+
+	size_t mega_file_size = fs::file_size(path);
+	cout << "AParser:: ...test_auto_add_externs " << path << " file_size(" << mega_file_size << ")\n";
+
+	Defs defs;
+	DefsStructureParser checkPtParser( &defs, path);
+	std::string errorMsg,warningMsg;
+  	BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+   BOOST_REQUIRE_MESSAGE(warningMsg.empty(),"Expected no warnings but found:\n" << warningMsg);
+
+   // Check number of extrens read in: Duplicate should be ignore
+  	BOOST_REQUIRE_MESSAGE(defs.externs().size() ==  9 ,"Expected 9 externs as starting point but found " << defs.externs().size() << "\n");
+
+  	// Test auto extern generation. Don't remove existing extern's
+   defs.auto_add_externs(false/* remove_existing_externs_first*/);
+  	BOOST_REQUIRE_MESSAGE(defs.externs().size() ==  9 ,"Expected 9, auto_add_extern(false) gave: " << defs.externs().size() << "\n" << defs << "\n");
+
+  	// By removing the externs read, in we can determine the real number of extern;s from
+  	// parsing all the trigger expressions, and inlimit references
+   defs.auto_add_externs(true/* remove_existing_externs_first*/);
+  	BOOST_REQUIRE_MESSAGE(defs.externs().size() ==  8 ,"Expected 8 externs, since redundant externs removed, auto_add_extern(true) gave: " << defs.externs().size() << "\n"<< defs << "\n");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/AParser/test/TestDefsStructurePersistAndReload.cpp b/ecflow_4_0_7/AParser/test/TestDefsStructurePersistAndReload.cpp
new file mode 100644
index 0000000..4b21b56
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/TestDefsStructurePersistAndReload.cpp
@@ -0,0 +1,96 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+
+#include "PersistHelper.hpp"
+#include "DefsStructureParser.hpp"
+#include "PrintStyle.hpp"
+#include "MyDefsFixture.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ParserTestSuite )
+
+//=============================================================================
+// This test case will save the defs file in old style format
+// and the parse it back in. As we add different types to our defs fixture
+// we can automatically check that what we save can be parsed back in.
+// Specifically written to test the parser.
+// Note: Aliases are *NOT* written in the defs file.
+BOOST_AUTO_TEST_CASE( test_defs_structure_persistence_and_reload )
+{
+	cout << "AParser:: ...test_defs_structure_persistence_and_reload\n";
+
+   std::string checkPtFile = File::test_data("AParser/test/generated_defs_file.txt","AParser");
+
+	MyDefsFixture theDefsFixture(checkPtFile);
+
+	PersistHelper helper;
+ 	BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(theDefsFixture.defsfile_), helper.errorMsg());
+
+   // Note: Aliases are *NOT* written in the defs file.
+ 	// Hence in order for this test to pass, we must delete the alias first & reset task alias_no
+   std::vector<alias_ptr> alias_vec;
+   theDefsFixture.defsfile_.get_all_aliases(alias_vec);
+   BOOST_FOREACH(alias_ptr al,alias_vec) {
+      al->parent()->isTask()->reset_alias_number();
+      al->remove();
+   }
+ 	BOOST_CHECK_MESSAGE( helper.test_persist_and_reload(theDefsFixture.defsfile_, PrintStyle::DEFS), helper.errorMsg());
+}
+
+
+// This test is used to find a task given a path of the form:
+// 	  suite/family/task
+//    suite/family/family/task
+//
+void test_find_task_using_path( NodeContainer* f,const Defs& defs )
+{
+ 	BOOST_CHECK_MESSAGE(f == defs.findAbsNode(f->absNodePath()).get(), "Could not find path " << f->absNodePath() << "\n");
+
+	BOOST_FOREACH(node_ptr t, f->nodeVec()) {
+ 		BOOST_CHECK_MESSAGE( t.get() == defs.findAbsNode(t->absNodePath()).get(), "Could not find path " << t->absNodePath() << "\n");
+ 		Family* family = t->isFamily();
+ 		if (family) {
+ 			test_find_task_using_path(family, defs);
+ 		}
+ 	}
+}
+
+BOOST_AUTO_TEST_CASE( test_find_task_using_paths )
+{
+	cout << "AParser:: ...test_find_task_using_paths\n";
+
+ 	MyDefsFixture theDefsFixture;
+
+	const std::vector<suite_ptr>& suiteVec = theDefsFixture.defsfile_.suiteVec();
+	BOOST_FOREACH(suite_ptr s, suiteVec) {
+		test_find_task_using_path(s.get(),theDefsFixture.defsfile_);
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+
diff --git a/ecflow_4_0_7/AParser/test/TestJobGenPerf.cpp b/ecflow_4_0_7/AParser/test/TestJobGenPerf.cpp
new file mode 100644
index 0000000..422dbef
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/TestJobGenPerf.cpp
@@ -0,0 +1,84 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "Defs.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+#include "Log.hpp"
+#include "Jobs.hpp"
+#include "JobsParam.hpp"
+#include "DefsStructureParser.hpp"
+#include "JobProfiler.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+
+// This relies on Pyext/samples/TestJobGenPerf.py to make any defs amenable
+// for this test program.
+//
+// The defs is in /var/tmp/ma0/ECFLOW_TEST/TestJobGenPerf
+//
+int main(int argc, char* argv[])
+{
+   if (argc != 2) {
+      cout << "Expect single argument which is path to a defs file\n";
+      return 1;
+   }
+
+   // delete the log file if it exists.
+   std::string log_path = File::test_data("AParser/test/TestJobGenPerf.log","AParser");
+   fs::remove(log_path);
+
+
+   std::string path = argv[1];
+
+   Defs defs;
+   DefsStructureParser checkPtParser( &defs, path);
+   std::string errorMsg,warningMsg;
+   if (!checkPtParser.doParse(errorMsg,warningMsg)) {
+      cout << errorMsg << "\n";
+      cout << warningMsg << "\n";
+      return 1;
+   }
+
+   // Check number of tasks, if the submitted output below is too low
+   // Then remove, limits,triggers,time,cron so more jobs can be generated.
+   std::vector<Task*> tasks;
+   defs.getAllTasks(tasks);
+   cout << "Tasks = " << tasks.size() << "\n";
+
+   defs.beginAll();
+
+
+   // Create a new log, file, place after begin to avoid queued state
+   Log::create(log_path);
+
+   // This controls the log output when job generation > submitJobsInterval
+   JobProfiler::set_task_threshold(0);
+
+   JobsParam jobParam(20 /*submitJobsInterval*/, true /*createJobs*/, false/* spawn jobs */);
+   Jobs job(&defs);
+   bool ok = job.generate( jobParam );
+   if (!ok) cout << " generate failed: " << jobParam.getErrorMsg();
+   cout << "submitted " << jobParam.submitted().size() << "\n";
+
+   // fs::remove(log_path);
+
+   return 0;
+}
diff --git a/ecflow_4_0_7/AParser/test/TestMigration.cpp b/ecflow_4_0_7/AParser/test/TestMigration.cpp
new file mode 100644
index 0000000..351b958
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/TestMigration.cpp
@@ -0,0 +1,427 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision$
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/archive/tmpdir.hpp>
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "PrintStyle.hpp"
+#include "PersistHelper.hpp"
+#include "Flag.hpp"
+#include "Memento.hpp"
+#include "MyDefsFixture.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+// ********************************************************************
+// These test are used to check that MIGRATE is equivalent to check pt
+// MIGRATE will be used for migration from old to new release
+// MIGRATE is essentially the defs structure with state.
+// The state is written out as comments
+// It is loaded like a normal Defs, the parser detects MIGRATE
+// and loads the state in.
+//
+// By default  persistence/MIGRATE *ONLY* writes the state when it not the default.
+// Hence the defaults should *NOT* change. These test will change the state
+// to a non default value.
+//
+// Write the Defs with state and the compare with in memory defs
+// Write the Defs as check pt an then compare with in memory defs
+// Finally compare the two *RELOADED* defs file.
+// ********************************************************************
+
+BOOST_AUTO_TEST_SUITE( ParserTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_state_parser )
+{
+   cout << "AParser:: ...test_state_parser\n";
+   // **** The persistence will NOT write the defaults, hence we need to change the states
+   // **** to test the persistence
+   PersistHelper helper;
+   std::vector<Flag::Type> flag_list = Flag::list();
+   {
+      Defs defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Empty Defs failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+
+      // Change state other the default
+      defs.beginAll();
+      suite->set_state(NState::ABORTED);
+      for (size_t i = 0; i < flag_list.size(); ++i)  suite->flag().set( flag_list[i] );
+      suite->suspend();
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"Add one suite failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      family_ptr f1 = suite->add_family("f1");
+
+      // Change state other the default
+      f1->set_state(NState::COMPLETE);
+      for (size_t i = 0; i < flag_list.size(); ++i)  f1->flag().set( flag_list[i] );
+      f1->suspend();
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"Add one family failed: " <<  helper.errorMsg());
+
+      // Test multiple
+      suite->add_family("f2");
+      suite->add_family("f3");
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"Add one family failed: " <<  helper.errorMsg());
+   }
+   {
+      Defs defs;
+      family_ptr f1 = defs.add_suite("s1")->add_family("f1");
+      task_ptr t1 = f1->add_task("t1");
+
+      for (size_t i = 0; i < flag_list.size(); ++i)  t1->flag().set( flag_list[i] );
+      t1->suspend();
+      t1->set_state(NState::COMPLETE);
+
+      // Use memento to modify task state
+      SubmittableMemento memento( "Jobs_password","the_rid","the abort  reason with spaces",12);
+      t1->set_memento(&memento);
+
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Add one task failed: " << helper.errorMsg());
+
+      // Test multiple
+      f1->add_task("t2");
+      f1->add_task("t3");
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Add one task failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      task_ptr task = defs.add_suite("s1")->add_family("f1")->add_task("t1");
+      alias_ptr t1 = task->add_alias_only();
+      for (size_t i = 0; i < flag_list.size(); ++i)  t1->flag().set( flag_list[i] );
+      t1->suspend();
+      t1->set_state(NState::COMPLETE);
+      // Use memento to modify alias state
+      SubmittableMemento memento( "Jobs_password","the_rid","the abort  reason with spaces",12);
+      t1->set_memento(&memento);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Add one alias failed: " << helper.errorMsg());
+
+      // Test multiple
+      task->add_alias_only();
+      task->add_alias_only();
+      //      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Add multiple alias failed: " << helper.errorMsg());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_state_node_attributes )
+{
+   cout << "AParser:: ...test_state_node_attributes\n";
+   PersistHelper helper;
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      task_ptr task = suite->add_task("t1");
+      ecf::LateAttr lateAttr;
+      lateAttr.addSubmitted( ecf::TimeSlot(3,12) );
+      lateAttr.addActive( ecf::TimeSlot(3,12) );
+      lateAttr.addComplete( ecf::TimeSlot(4,12), true);
+      lateAttr.setLate(true);
+      task->addLate(lateAttr);
+
+      ecf::LateAttr lateAttr1;
+      lateAttr1.addSubmitted( ecf::TimeSlot(3,12) );
+      lateAttr1.addActive( ecf::TimeSlot(3,12) );
+      lateAttr1.addComplete( ecf::TimeSlot(4,12), false);
+      lateAttr1.setLate(true);
+      task_ptr task1 = suite->add_task("t2");
+      task1->addLate(lateAttr1);
+
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Late state: failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      task_ptr task = defs.add_suite("s1")->add_task("t1");
+      Meter meter("meter",0,100,100); meter.set_value(10);
+      task->addMeter(meter);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Meter state: failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      task_ptr task = defs.add_suite("s1")->add_task("t1");
+      Event event("event");     event.set_value(true);
+      Event event2(10,"event"); event2.set_value(true);
+      Event event3(10);         event3.set_value(true);
+      task->addEvent(event);
+      task->addEvent(event2);
+      task->addEvent(event3);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Event state: failed: " << helper.errorMsg());
+   }
+   {
+      {
+         Defs defs;
+         task_ptr task = defs.add_suite("s1")->add_task("t1");
+         Label label("name","value"); label.set_new_value("new  value");
+         task->addLabel(label);
+         //      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+         BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
+      }
+      {
+         Defs defs;
+         suite_ptr suite = defs.add_suite("s1");
+         Label label("name","value"); label.set_new_value("new  value");
+         suite->addLabel(label);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+         BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
+      }
+      {
+         Defs defs;
+         suite_ptr suite = defs.add_suite("s1");
+         Label label("name","value\nvalue");
+         suite->addLabel(label);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+         BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
+      }
+      {
+         Defs defs;
+         suite_ptr suite = defs.add_suite("s1");
+         Label label("name","value\nvalue");  label.set_new_value("value\nwith\nmany\nnewlines");
+         suite->addLabel(label);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+         BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
+      }
+   }
+   {
+       Defs defs;
+       suite_ptr suite = defs.add_suite("s1");
+       task_ptr t1 = suite->add_task("t1");
+       task_ptr t2 = suite->add_task("t2");
+       task_ptr t3 = suite->add_task("t3");
+       task_ptr t4 = suite->add_task("t4");
+       Limit limit("limit",10);
+       limit.increment(1,t1->absNodePath());
+       limit.increment(1,t2->absNodePath());
+       limit.increment(1,t3->absNodePath());
+       limit.increment(1,t4->absNodePath());
+       suite->addLimit(limit);
+//       PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Limit state: failed: " << helper.errorMsg());
+    }
+
+   // **** Note InLimit does not have any changeable state
+
+   {
+        Defs defs;
+        suite_ptr suite = defs.add_suite("s1");
+        task_ptr t1 = suite->add_task("t1");
+        task_ptr t2 = suite->add_task("t2");
+        task_ptr t3 = suite->add_task("t3");
+        task_ptr t4 = suite->add_task("t4");
+        task_ptr t5 = suite->add_task("t5");
+        task_ptr t6 = suite->add_task("t6");
+
+        std::vector<std::string> stringList; stringList.reserve(3);
+        stringList.push_back("20130101");
+        stringList.push_back("20130201");
+        stringList.push_back("20130301");
+
+        RepeatEnumerated rep("AEnum",stringList);
+        rep.increment();
+        t1->addRepeat( rep );
+
+        RepeatString rep2("AEnum",stringList);
+        rep2.increment();
+        t2->addRepeat( rep2 );
+
+        RepeatDate rep3("YMD",20090916,20090916,1);
+        rep3.increment();
+        t3->addRepeat( rep3 );
+
+        RepeatInteger rep4("rep",0,100,1);
+        rep4.increment();
+        t4->addRepeat( rep4 );
+        t4->increment_repeat();
+
+        RepeatDay rep5(2);
+        rep5.increment();
+        t5->addRepeat( rep5 );
+
+//        PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+        BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Repeat state: failed: " << helper.errorMsg());
+     }
+}
+
+BOOST_AUTO_TEST_CASE( test_state_time_attributes )
+{
+   cout << "AParser:: ...test_state_time_attributes\n";
+   PersistHelper helper;
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1"); suite->begin();
+      task_ptr task = suite->add_task("t1");
+      TimeAttr time(10,10);  time.setFree(); time.miss_next_time_slot();
+      TimeAttr time2(10,10,true); time2.calendarChanged(suite->calendar()); time2.setFree(); time2.miss_next_time_slot();
+      TimeAttr time3(TimeSlot(10,10),TimeSlot(12,10),TimeSlot(0,10),true); time3.calendarChanged(suite->calendar());time3.setFree(); time3.miss_next_time_slot();
+
+      task->addTime(time);
+      task->addTime(time2);
+      task->addTime(time3);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Time state: failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1"); suite->begin();
+      task_ptr task = suite->add_task("t1");
+      TodayAttr time(10,10);  time.setFree(); time.miss_next_time_slot();
+      TodayAttr time2(10,10,true); time2.calendarChanged(suite->calendar()); time2.setFree(); time2.miss_next_time_slot();
+      TodayAttr time3(TimeSlot(10,10),TimeSlot(12,10),TimeSlot(0,10),true); time3.calendarChanged(suite->calendar());time3.setFree(); time3.miss_next_time_slot();
+      task->addToday(time);
+      task->addToday(time2);
+      task->addToday(time3);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Today state: failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      task_ptr task = defs.add_suite("s1")->add_task("t1");
+      DayAttr day;
+      DayAttr day1; day1.setFree();
+      DayAttr day2(DayAttr::FRIDAY); day2.setFree();
+      task->addDay(day);
+      task->addDay(day1);
+      task->addDay(day2);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Day state: failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      task_ptr task = defs.add_suite("s1")->add_task("t1");
+      DateAttr d;
+      DateAttr d1; d1.setFree();
+      DateAttr d2(1,1,2012); d2.setFree();
+      DateAttr d3(0,0,2012); d3.setFree();
+      task->addDate(d);
+      task->addDate(d1);
+      task->addDate(d2);
+      task->addDate(d3);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Date state: failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1"); suite->begin();
+      task_ptr task = suite->add_task("t1");
+      task_ptr task2 = suite->add_task("t2");
+
+      ecf::CronAttr cronAttr;
+      ecf::TimeSlot start( 0, 0 );
+      ecf::TimeSlot finish( 10, 0 );
+      ecf::TimeSlot incr( 0, 5 );
+      std::vector<int> weekdays;   for(int i=0;i<7;++i) weekdays.push_back(i);
+      std::vector<int> daysOfMonth;for(int i=1;i<32;++i) daysOfMonth.push_back(i);
+      std::vector<int> months;     for(int i=1;i<13;++i) months.push_back(i);
+      cronAttr.addTimeSeries(start,finish,incr);
+      cronAttr.addWeekDays( weekdays  );
+      cronAttr.addDaysOfMonth(daysOfMonth);
+      cronAttr.addMonths(  months );
+      cronAttr.setFree();
+      task->addCron(cronAttr);
+
+      // Change TimeSeries state
+      TimeSeries ts(start,finish,incr,true);
+      ts.calendarChanged(suite->calendar());
+      ts.miss_next_time_slot();
+      cronAttr.addTimeSeries(ts);
+      task2->addCron(cronAttr);
+
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Date state: failed: " << helper.errorMsg());
+   }
+
+   // ZombieAttr do not have any changeable state
+}
+
+BOOST_AUTO_TEST_CASE( test_state_edit_history )
+{
+   cout << "AParser:: ...test_state_edit_history\n";
+   PersistHelper helper(true /* compare edit History */);
+   Defs defs;
+   suite_ptr suite = defs.add_suite("s1");
+   defs.add_edit_history(suite->absNodePath(),"request1 with single spaces");
+   defs.add_edit_history(suite->absNodePath(),"request2 with double  spaces");
+   defs.add_edit_history(suite->absNodePath(),"request3_with_no_spaces!|?<>$%^&*()_{}:@<>?");
+   suite_ptr suite2 = defs.add_suite("s2");
+   defs.add_edit_history(suite2->absNodePath(),"request1 with single spaces");
+   defs.add_edit_history(suite2->absNodePath(),"request2 with double  spaces");
+   defs.add_edit_history(suite2->absNodePath(),"request3_with_no_spaces!|?<>$%^&*()_{}:@<>?");
+//   PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+   BOOST_REQUIRE_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Edit history failed: " << helper.errorMsg());
+}
+
+BOOST_AUTO_TEST_CASE( test_server_state )
+{
+   cout << "AParser:: ...test_server_state\n";
+   PersistHelper helper(true /* compare edit History */);
+   {
+      Defs defs;
+      defs.set_server().set_state(SState::HALTED);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Set server state failed " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      defs.set_server().set_state(SState::RUNNING);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Set server state failed " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      defs.set_server().set_state(SState::SHUTDOWN);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Set server state failed " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      std::vector<Variable> vec;
+      vec.push_back(Variable("name","value1"));
+      vec.push_back(Variable("name2","val with 'spaces' "));
+      vec.push_back(Variable("name3",""));
+      defs.set_server().set_user_variables(vec);
+//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Set server variables failed " << helper.errorMsg());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_state_fixture_defs )
+{
+   cout << "AParser:: ...test_state_fixture_defs\n";
+   PersistHelper helper;
+   MyDefsFixture theDefsFixture;
+   BOOST_REQUIRE_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(theDefsFixture.defsfile_), "Fixture failed: " << helper.errorMsg());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/AParser/test/TestParser.cpp b/ecflow_4_0_7/AParser/test/TestParser.cpp
new file mode 100644
index 0000000..e214433
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/TestParser.cpp
@@ -0,0 +1,125 @@
+#define BOOST_TEST_MODULE TestParser
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/archive/tmpdir.hpp>
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "PrintStyle.hpp"
+#include "PersistHelper.hpp"
+#include "File.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ParserTestSuite )
+
+void test_defs(const std::string& directory, bool pass)
+{
+	fs::path full_path( fs::initial_path<fs::path>() );
+	full_path = fs::system_complete( fs::path( directory ) );
+
+	BOOST_CHECK(fs::exists( full_path ));
+	BOOST_CHECK(fs::is_directory( full_path ));
+
+	//std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
+	fs::directory_iterator end_iter;
+	for ( fs::directory_iterator dir_itr( full_path ); dir_itr != end_iter; ++dir_itr )
+	{
+		try
+		{
+         fs::path relPath(directory + "/" + dir_itr->path().filename().string());
+
+ 			// recurse down directories
+		    if ( fs::is_directory(dir_itr->status()) )  {
+		    	test_defs(relPath.string(),pass);
+		    	continue;
+		    }
+
+			//std::cout << "......Parsing file " << relPath.string() << "\n";
+
+			Defs defs;
+			DefsStructureParser parser( &defs , relPath.string() );
+
+ 			std::string errorMsg,warningMsg;
+			bool parsedOk = parser.doParse(errorMsg,warningMsg);
+			if (pass) {
+				// Test expected to pass
+				BOOST_CHECK_MESSAGE(parsedOk,"Failed to parse file " << relPath << "\n" << errorMsg);
+
+				if (parsedOk) {
+ 					// Write parsed file to a temporary file on disk, and reload, then compare defs, should be the same
+ 					PersistHelper helper;
+					BOOST_CHECK_MESSAGE( helper.test_persist_and_reload(defs,parser.get_file_type()), relPath.string() << " " << helper.errorMsg());
+					BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs), relPath.string() << " " << helper.errorMsg());
+				}
+ 			}
+			else {
+				// test expected to fail
+			   //std::cout << errorMsg << "\n";
+				BOOST_CHECK_MESSAGE(!parsedOk,"Parse expected to fail for " << relPath << "\n" << errorMsg);
+ 			}
+		}
+		catch ( const std::exception & ex )
+		{
+ 			std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
+		}
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_parsing_for_good_defs )
+{
+	cout << "AParser:: ...test_parsing_for_good_defs\n";
+
+   std::string path = File::test_data("AParser/test/data/good_defs","AParser");
+
+	// All the defs in this directory are expected to pass
+	test_defs(path, true);
+}
+
+BOOST_AUTO_TEST_CASE( test_parsing_for_bad_defs )
+{
+	cout << "AParser:: ...test_parsing_for_bad_defs\n";
+
+   std::string path = File::test_data("AParser/test/data/bad_defs","AParser");
+
+	// All the defs in this directory are expected to fail
+	test_defs(path, false);
+}
+
+BOOST_AUTO_TEST_CASE( test_parsing_for_good_defs_state )
+{
+   cout << "AParser:: ...test_parsing_for_good_defs_state\n";
+
+   std::string path = File::test_data("AParser/test/data/good_defs_state","AParser");
+
+   // All the defs in this directory are expected to pass
+   test_defs(path, true);
+
+   // Fix memory leaks
+   ChangeMgrSingleton::destroy();
+}
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/AParser/test/TestSingleDefsFile.cpp b/ecflow_4_0_7/AParser/test/TestSingleDefsFile.cpp
new file mode 100644
index 0000000..365d504
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/TestSingleDefsFile.cpp
@@ -0,0 +1,304 @@
+#define BOOST_TEST_MODULE TestParser
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/timer.hpp>
+#include "boost/date_time/posix_time/posix_time_types.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "NodeContainer.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "PrintStyle.hpp"
+#include "PersistHelper.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "DurationTimer.hpp"
+#include "Log.hpp"
+#include "System.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE( ParserTestSuite )
+
+// This test is used to find a task given a path of the form:
+// 	  suite/family/task
+//    suite/family/family/task
+void test_find_task_using_path( NodeContainer* f,const Defs& defs )
+{
+   BOOST_CHECK_MESSAGE(f == defs.findAbsNode(f->absNodePath()).get(), "Could not find path " << f->absNodePath() << "\n");
+
+   BOOST_FOREACH(node_ptr t, f->nodeVec()) {
+      BOOST_CHECK_MESSAGE(t.get() == defs.findAbsNode(t->absNodePath()).get(), "Could not find path " << t->absNodePath() << "\n");
+      Family* family = t->isFamily();
+      if (family) {
+         test_find_task_using_path(family, defs);
+      }
+   }
+}
+
+// Create derived class, so that we can time the parse only
+// i.e ignore expression build/checking and limit checking
+class TestDefsStructureParser : public DefsStructureParser {
+public:
+   TestDefsStructureParser(Defs* defsfile, const std::string& file_name) : DefsStructureParser(defsfile,file_name) {}
+   bool do_parse_only(std::string& errorMsg) { return DefsStructureParser::do_parse_only(errorMsg); }
+};
+
+BOOST_AUTO_TEST_CASE( test_single_defs )
+{
+   DurationTimer duration_timer;
+
+   std::string path = File::test_data("AParser/test/data/single_defs/mega.def","AParser");
+   size_t mega_file_size = fs::file_size(path);
+   cout << "AParser:: ...test_single_defs " << path << " file_size(" << mega_file_size << ")\n";
+
+   // Time parse/resolve dependencies: This will need to be #defined depending on the platform
+   // Change for file_iterator to plain string halved the time taken to load operation suite
+   boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+#ifdef DEBUG
+#if defined(HPUX) || defined(_AIX)
+   double expectedTimeForParse = 15.0;
+   double expectedTimeForParseOnly = 10.0;
+   double expectedTimeForResolveDependencies = 3.5; // this is time for 10 job submissions
+   double checkExprAndLimits = 1.0;
+   double expectedTimeForFindAllPaths = 7.2;
+   double expectedTimeForDefsPersistOnly = 6 ;
+   double expectedTimeForDefsPersistAndReload = 24;
+   double expectedTimeForCheckPtPersistAndReload = 27;
+#else
+   double expectedTimeForParse = 4.5;
+   double expectedTimeForParseOnly = 2.0;
+   double expectedTimeForResolveDependencies = 0.5 ; // this is time for 10 job submissions
+   double checkExprAndLimits = 0.5;
+   double expectedTimeForFindAllPaths = 1.2;
+   double expectedTimeForDefsPersistOnly = 2 ;
+   double expectedTimeForDefsPersistAndReload = 4.5;
+   double expectedTimeForCheckPtPersistAndReload = 8.0;
+#endif
+#else
+#if defined(HPUX) || defined(_AIX)
+   double expectedTimeForParse = 7.8;
+   double expectedTimeForParseOnly = 5.0;
+   double expectedTimeForResolveDependencies = 3.5; // this is time for 10 job submissions
+   double checkExprAndLimits = 1.0;
+   double expectedTimeForFindAllPaths = 4.5;
+   double expectedTimeForDefsPersistOnly = 3.5 ;
+   double expectedTimeForDefsPersistAndReload = 9.5;
+   double expectedTimeForCheckPtPersistAndReload = 11.5;
+#else
+   double expectedTimeForParse = 1.2;
+   double expectedTimeForParseOnly = 0.6;
+   double expectedTimeForResolveDependencies = 0.2 ; // this is time for 10 job submissions
+   double checkExprAndLimits = 0.1;
+   double expectedTimeForFindAllPaths = 0.58;
+   double expectedTimeForDefsPersistOnly = 0.5 ;
+   double expectedTimeForDefsPersistAndReload = 1.5;
+   double expectedTimeForCheckPtPersistAndReload = 1.6;
+#endif
+#endif
+   // ****************************************************************************************
+   // Please note: that for Parsing: that the predominate time is taken in creating the AST/ and checking
+
+   /// If this is moved below, we get some caching affect, with the persist and reload timing
+   Defs defs;
+   {
+      timer.restart();
+      DefsStructureParser checkPtParser( &defs, path);
+      std::string errorMsg,warningMsg;
+      BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForParse,"Performance regression, expected < " << expectedTimeForParse << " seconds for parse/node tree creation but found " << timer.elapsed());
+      std::cout << " Parsing Node tree and AST creation time = " << timer.elapsed() << " < limit(" << expectedTimeForParse << ")" << endl;
+   }
+
+   {
+      Defs local_defs;
+      timer.restart();
+      TestDefsStructureParser checkPtParser( &local_defs, path);
+      std::string errorMsg;
+      BOOST_REQUIRE_MESSAGE(checkPtParser.do_parse_only(errorMsg),errorMsg);
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForParse,"Performance regression, expected < " << expectedTimeForParseOnly << " seconds for parse/node tree creation but found " << timer.elapsed());
+      std::cout << " Parsing Node tree *only* time           = " << timer.elapsed() << " < limit(" << expectedTimeForParseOnly << ")" << endl;
+   }
+
+
+   {
+      timer.restart();
+      BOOST_FOREACH(suite_ptr s, defs.suiteVec()) { test_find_task_using_path(s.get(),defs); }
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForFindAllPaths,"Performance regression, expected < " << expectedTimeForFindAllPaths << " seconds to find all paths, but found " << timer.elapsed());
+      cout << " Test all paths can be found. time taken = " << timer.elapsed() << " < limit(" << expectedTimeForFindAllPaths << ")" << endl;
+   }
+
+   {
+      // Test time for persisting to defs file only
+#ifdef DEBUG
+      std::string tmpFilename = "tmp_d.def";
+#else
+      std::string tmpFilename = "tmp.def";
+#endif
+
+      timer.restart();
+      PrintStyle style(PrintStyle::DEFS);
+      std::ofstream ofs( tmpFilename.c_str() );  ofs << defs;
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForDefsPersistOnly,"Performance regression, expected < " << expectedTimeForDefsPersistOnly << " to persist defs file, but found " << timer.elapsed());
+      cout << " Persist only, time taken                                   = " << timer.elapsed() << " < limit(" << expectedTimeForDefsPersistOnly << ")" << endl;
+
+      std::remove(tmpFilename.c_str());
+   }
+
+   {
+      // may need to comment out output for large differences. Will double the time.
+      timer.restart();
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_persist_and_reload(defs,PrintStyle::DEFS), helper.errorMsg());
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForDefsPersistAndReload,"Performance regression, expected < " << expectedTimeForDefsPersistAndReload << " seconds to persist and reload, but found " << timer.elapsed());
+      cout << " Persist and reload(DEFS) and compare, time taken           = "
+               << timer.elapsed() <<  " < limit(" << expectedTimeForDefsPersistAndReload << ")"
+               << " file_size(" << helper.file_size() << ")" << endl;
+   }
+   {
+      timer.restart();
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_persist_and_reload(defs,PrintStyle::STATE), helper.errorMsg());
+      cout << " Persist and reload(STATE) and compare, time taken          = " << timer.elapsed()
+           << " file_size(" << helper.file_size() << ")" << endl;
+   }
+   {
+      timer.restart();
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_persist_and_reload(defs,PrintStyle::MIGRATE), helper.errorMsg());
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForDefsPersistAndReload,"Performance regression, expected < " << expectedTimeForDefsPersistAndReload << " seconds to persist and reload *state*, but found " << timer.elapsed());
+      cout << " Persist and reload(MIGRATE) and compare, time taken        = "
+               << timer.elapsed() <<  " < limit(" << expectedTimeForDefsPersistAndReload << ")"
+               << " file_size(" << helper.file_size() << ")" << endl;
+
+      // each platform will have a slightly different size, since the server environment variables
+      // will be different, i.e host, pid, i.e check point etc, encompasses the host name, which will be different
+      BOOST_CHECK_MESSAGE(helper.file_size() <= 6679000 ,"File size regression expected <= 6679000 but found " << helper.file_size());
+   }
+
+#if defined(BINARY_ARCHIVE)
+   {
+      timer.restart();
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::BINARY), helper.errorMsg());
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForCheckPtPersistAndReload,"Performance regression, expected < " << expectedTimeForCheckPtPersistAndReload << " seconds to persist and reload, but found " << timer.elapsed());
+      cout << " Checkpt(BINARY_ARCHIVE) and reload and compare, time taken  = ";
+      cout << timer.elapsed() << " < limit(" << expectedTimeForCheckPtPersistAndReload << ")" << " file_size(" << helper.file_size() << ")" << endl;
+   }
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+   {
+      timer.restart();
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::PORTABLE_BINARY), helper.errorMsg());
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForCheckPtPersistAndReload,"Performance regression, expected < " << expectedTimeForCheckPtPersistAndReload << " seconds to persist and reload, but found " << timer.elapsed());
+      cout << " Checkpt(PORTABLE_BINARY) and reload and compare, time taken = ";
+      cout << timer.elapsed() << " < limit(" << expectedTimeForCheckPtPersistAndReload << ")" << " file_size(" << helper.file_size() << ")" << endl;
+   }
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+   {
+      timer.restart();
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::EOS_PORTABLE_BINARY), helper.errorMsg());
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForCheckPtPersistAndReload,"Performance regression, expected < " << expectedTimeForCheckPtPersistAndReload << " seconds to persist and reload, but found " << timer.elapsed());
+      cout << " Checkpt(EOS_PORTABLE_BINARY) and reload and compare, time taken = ";
+      cout << timer.elapsed() << " < limit(" << expectedTimeForCheckPtPersistAndReload << ")" << " file_size(" << helper.file_size() << ")" << endl;
+   }
+#else
+   {
+      timer.restart();
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::TEXT), helper.errorMsg());
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForCheckPtPersistAndReload,"Performance regression, expected < " << expectedTimeForCheckPtPersistAndReload << " seconds to persist and reload, but found " << timer.elapsed());
+      cout << " Checkpt(TEXT_ARCHIVE) and reload and compare, time taken   = ";
+      cout << timer.elapsed() << " < limit(" << expectedTimeForCheckPtPersistAndReload << ")" << " file_size(" << helper.file_size() << ")" << endl;
+   }
+#endif
+
+   {
+      // Time how long it takes for job submission. Must call begin on all suites first.
+      timer.restart();
+      defs.beginAll();
+      int count = 10;
+      JobsParam jobsParam; // default is *not* to create jobs, and *not* to spawn jobs, hence only used in testing
+      Jobs jobs(&defs);
+      for (int i = 0; i < count; i++) {jobs.generate(jobsParam);}
+      cout << " time for " << count << " jobSubmissions:" << timer.elapsed() << "s jobs:" << jobsParam.submitted().size() << " < limit(" << expectedTimeForResolveDependencies << ")" << endl;
+      BOOST_CHECK_MESSAGE(timer.elapsed() < expectedTimeForResolveDependencies,
+                          "jobSubmission Performance regression, expected < " << expectedTimeForResolveDependencies << " seconds for resolving dependencies but found " << timer.elapsed() );
+   }
+
+   {
+      // Time how long it takes for post process
+      timer.restart();
+      string errorMsg,warningMsg;
+      BOOST_CHECK(defs.check(errorMsg,warningMsg));
+      cout << " time for Defs::check (  inlimit resolution) = " << timer.elapsed() << " < limit(" << checkExprAndLimits << ")" << endl;
+      BOOST_CHECK_MESSAGE(timer.elapsed() < checkExprAndLimits,
+                          "Defs::check Performance regression, expected < " << checkExprAndLimits << " seconds for resolving dependencies but found " << timer.elapsed() );
+   }
+
+   {
+      // Time how long it takes to delete all nodes/ references. Delete all tasks and then suites/families.
+      timer.restart();
+      std::vector<Task*> tasks;
+      defs.getAllTasks(tasks);
+      BOOST_CHECK_MESSAGE( tasks.size() > 0,"Expected > 0 tasks but found " << tasks.size());
+      BOOST_FOREACH(Task* t, tasks) {
+         BOOST_REQUIRE_MESSAGE(defs.deleteChild(t)," Failed to delete task");
+      }
+      tasks.clear(); defs.getAllTasks(tasks);
+      BOOST_REQUIRE_MESSAGE( tasks.empty(),"Expected all tasks to be deleted but found " << tasks.size());
+
+      std::vector<suite_ptr> vec = defs.suiteVec(); // make a copy, to avoid invalidating iterators
+      BOOST_CHECK_MESSAGE( vec.size() > 0,"Expected > 0 Suites but found " << vec.size());
+      BOOST_FOREACH(suite_ptr s, vec) {
+         std::vector<node_ptr> familyVec = s->nodeVec(); // make a copy, to avoid invalidating iterators
+         BOOST_FOREACH(node_ptr f, familyVec) {
+            BOOST_REQUIRE_MESSAGE(defs.deleteChild(f.get())," Failed to delete family");
+         }
+         BOOST_REQUIRE_MESSAGE( s->nodeVec().empty(),"Expected all Families to be deleted but found " << s->nodeVec().size());
+         BOOST_REQUIRE_MESSAGE(defs.deleteChild(s.get())," Failed to delete suite");
+      }
+      BOOST_REQUIRE_MESSAGE( defs.suiteVec().empty(),"Expected all Suites to be deleted but found " << defs.suiteVec().size());
+
+      cout << " time for deleting all nodes = " << timer.elapsed() << endl;
+   }
+
+   // Explicitly destroy, To keep valgrind happy
+   Log::destroy();
+   System::destroy();
+
+   // cout << "Printing Defs \n";
+   // PrintStyle style(PrintStyle::DEFS);
+   //	std::cout << defs;
+   cout << " Total elapsed time = " << duration_timer.duration() << " seconds\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/AParser/test/TestVariableParsing.cpp b/ecflow_4_0_7/AParser/test/TestVariableParsing.cpp
new file mode 100644
index 0000000..316e297
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/TestVariableParsing.cpp
@@ -0,0 +1,81 @@
+ //============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ParserTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_single_defs ) {
+
+	cout << "AParser:: ...test_variable  \n";
+
+   std::string path = File::test_data("AParser/test/data/good_defs/edit/edit.def","AParser");
+
+	Defs defs;
+	DefsStructureParser checkPtParser( &defs, path );
+	std::string errorMsg,warningMsg;
+  	BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+
+//  	suite edit
+//  		edit ECF_INCLUDE /home/ma/map/sms/example/x                  # comment line
+//  		edit ECF_FILES   /home/ma/map/sms/example/x                  #comment line
+//  	    edit EXPVER 'f8na'                                          #
+//  	    edit USER 'ecgems'                                          #comment
+//  	    edit USER2 "ecgems"                                         # comment
+//  	    edit INT1 "10"                                             # comment
+//  	    edit INT2 '11'                                             # comment
+//  	    edit YMD  '20091012'                                        # comment
+//  	 	family family
+//  			edit ECF_FETCH  "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"  # comment line
+//  			edit ECF_FETCH2 'smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%'  #comment line
+//  			task t2
+//  		endfamily
+//  	endsuite
+	suite_ptr editSuite = defs.findSuite("edit");
+  	BOOST_REQUIRE_MESSAGE(editSuite,"Could not find the edit suite");
+
+  	const Variable& int1 = editSuite->findVariable("INT1");
+  	BOOST_REQUIRE_MESSAGE(!int1.empty(),"Could not find variable INT1");
+  	BOOST_REQUIRE_MESSAGE(int1.value() == 10,"Expected INT1 to have a value of 10, but found " << int1.value());
+
+  	const Variable& int2 = editSuite->findVariable("INT2");
+  	BOOST_REQUIRE_MESSAGE(!int2.empty(),"Could not find variable INT2");
+  	BOOST_REQUIRE_MESSAGE(int2.value() == 11,"Expected INT2 to have a value of 11, but found " << int2.value());
+
+  	const Variable& ymd = editSuite->findVariable("YMD");
+  	BOOST_REQUIRE_MESSAGE(!ymd.empty(),"Could not find variable YMD");
+  	BOOST_REQUIRE_MESSAGE(ymd.value() == 20091012,"Expected YMD to have a value of 20091012, but found " << ymd.value());
+
+  	const Variable& user = editSuite->findVariable("USER");
+  	BOOST_REQUIRE_MESSAGE(!user.empty(),"Could not find variable USER");
+  	BOOST_REQUIRE_MESSAGE(user.value() == 0,"Expected user to have a value of 0, but found " << user.value());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/clock/clock1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/clock/clock1.def
new file mode 100644
index 0000000..904d6ab
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/clock/clock1.def
@@ -0,0 +1,12 @@
+suite suiteName
+    clock real 0.1.2006   # clock date should not have wild carding
+endsuite
+
+suite suiteName1
+    clock real 1.0.2006   # clock date should not have wild carding
+endsuite
+
+suite suiteName1
+    clock real 1.12.0   # clock date should not have wild carding
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/clock/clock2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/clock/clock2.def
new file mode 100644
index 0000000..97f0bca
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/clock/clock2.def
@@ -0,0 +1,11 @@
+suite suiteName
+    clock real 99.1.2006   # day out of range
+endsuite
+
+suite suiteName
+    clock real 1.15.2006   # month out of range
+endsuite
+
+suite suiteName
+    clock real 1.15.0000   # 0 year out of range
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron1.def
new file mode 100644
index 0000000..0374beb
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron1.def
@@ -0,0 +1,3 @@
+suite cron
+	cron 36:00                              #  error should between hour 0-23
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron2.def
new file mode 100644
index 0000000..cccf1b8
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron2.def
@@ -0,0 +1,3 @@
+suite cron
+	cron 00:60                              #  error should   min 0-59
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron3.def
new file mode 100644
index 0000000..dc70c4d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron3.def
@@ -0,0 +1,3 @@
+suite cron
+ 	cron -w 0,1,3,4,5,6,7,8 10:00           # Error should be range [0-6] where 0=sunday,1=monday,etc
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron4.def
new file mode 100644
index 0000000..5d42141
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron4.def
@@ -0,0 +1,3 @@
+suite cron
+	cron -d 10,11,12,35,36 12:00            # errors days of month should have range 1-31
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron5.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron5.def
new file mode 100644
index 0000000..4f5ba01
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron5.def
@@ -0,0 +1,3 @@
+suite cron
+	cron -m 1,2,3,13,14 12:00   #  Error month should have range 1-12
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron5_1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron5_1.def
new file mode 100644
index 0000000..9c2ec28
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron5_1.def
@@ -0,0 +1,3 @@
+suite cron
+    cron -m 0,1,2,3 12:00   #  Error month should have range 1-12
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron6.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron6.def
new file mode 100644
index 0000000..e4f6a09
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron6.def
@@ -0,0 +1,3 @@
+suite cron
+	cron -w -1,0,6 10:00                     #  weekdays should have range [0-6]
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron7.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron7.def
new file mode 100644
index 0000000..884bf4e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/cron7.def
@@ -0,0 +1,3 @@
+suite cron
+	cron -w 0 -m 5,6,7,8 10:00 20:00 25:00  # error in increment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/cron/repeat_with_cron.def b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/repeat_with_cron.def
new file mode 100644
index 0000000..ec0d8ed
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/cron/repeat_with_cron.def
@@ -0,0 +1,9 @@
+suite suiteName
+    family f
+        cron 23:00                          # cant have repeat  & cron at same level
+        repeat date YMD 20090331 20121212 1 # status 0
+        task t
+        task t2
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/date/date.def b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date.def
new file mode 100644
index 0000000..8dfef1f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date.def
@@ -0,0 +1,5 @@
+suite suiteName
+   task a
+      date 100.*.2009   # day should be in range 1-31
+   endtask
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/date/date0.def b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date0.def
new file mode 100644
index 0000000..3682583
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date0.def
@@ -0,0 +1,3 @@
+suite a
+   date 10.10.2009   # date should not be allowed on a suite, see SUP-1198, ECFLOW-106 Times/Dates attributes attached to suite node 
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/date/date1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date1.def
new file mode 100644
index 0000000..336d775
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date1.def
@@ -0,0 +1,6 @@
+suite suiteName
+   task a
+      date 1.14.2009         # month should be in range 1-12
+   endtask
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/date/date2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date2.def
new file mode 100644
index 0000000..715f225
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date2.def
@@ -0,0 +1,5 @@
+suite suiteName
+   task a
+      date 0.14.2009       # day is invalid, month is invalid
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/date/date3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date3.def
new file mode 100644
index 0000000..06e2c28
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date3.def
@@ -0,0 +1,5 @@
+suite suiteName
+   task a
+      date 1.0.2009
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/date/date4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date4.def
new file mode 100644
index 0000000..b281868
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date4.def
@@ -0,0 +1,5 @@
+suite suiteName
+   task b
+      date 1.1.200
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/date/date5.def b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date5.def
new file mode 100644
index 0000000..06facdf
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/date/date5.def
@@ -0,0 +1,4 @@
+suite suiteName
+   task b
+      date 2.29.2002
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/day/day.def b/ecflow_4_0_7/AParser/test/data/bad_defs/day/day.def
new file mode 100644
index 0000000..d69dc85
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/day/day.def
@@ -0,0 +1,3 @@
+suite a
+  day wednesday  # do not allow day at suite level, see SUP-1198, ECFLOW-106 Times/Dates attributes attached to suite node 
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/defstatus/defstatus.def b/ecflow_4_0_7/AParser/test/data/bad_defs/defstatus/defstatus.def
new file mode 100644
index 0000000..f54ec59
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/defstatus/defstatus.def
@@ -0,0 +1,10 @@
+suite suiteName
+   defstatus suspended
+   family familyName0
+      defstatus complete
+      task taskName0
+      	 defstatus complete  
+      	 defstatus complete  
+  		 edit VAR2 value2
+   endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_1.def
new file mode 100644
index 0000000..51db831
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_1.def
@@ -0,0 +1,8 @@
+suite suiteName
+   family familyName0
+      task taskName0
+         event name_1
+         event name_1
+     endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_2.def
new file mode 100644
index 0000000..2aa3e5e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_2.def
@@ -0,0 +1,8 @@
+suite suiteName
+   family familyName0
+      task taskName0
+         event 0 
+         event 0
+     endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_3.def
new file mode 100644
index 0000000..0549a36
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_3.def
@@ -0,0 +1,8 @@
+suite suiteName
+   family familyName0
+      task taskName0
+           event 1 eventName
+           event 1 eventName
+      endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_4.def
new file mode 100644
index 0000000..124daa2
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/event/event_4.def
@@ -0,0 +1,8 @@
+suite suiteName
+   family familyName0
+      task taskName0
+           event 1  
+           event "1"
+      endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/event/simple_event.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/event/simple_event.txt
new file mode 100644
index 0000000..630e59c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/event/simple_event.txt
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName0
+      task taskName0
+         event //
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/extern/bad.def b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/bad.def
new file mode 100644
index 0000000..de04e2b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/bad.def
@@ -0,0 +1,12 @@
+extern                    #extern without anything
+extern                    # extern without anything
+extern /limits:c1a
+extern /limits:linux_cluster;
+extern /limits:pdb
+ 
+suite suiteName
+    limit sg1  10
+    limit mars 10
+endsuite
+
+ 
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/extern/complete.def b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/complete.def
new file mode 100644
index 0000000..99ecde2
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/complete.def
@@ -0,0 +1,11 @@
+#
+# complete references to node path, not in externs is an error
+#
+suite suiteName
+   family familyName
+      task q
+            complete /a/b/c/d/e:event == set       # extern event path
+      task r
+            complete /a/b/c/d/e:meter le 30        # extern meter path   
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/extern/trigger1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/trigger1.def
new file mode 100644
index 0000000..f251538
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/trigger1.def
@@ -0,0 +1,11 @@
+#
+# Trigger references to node path, not in externs is an error
+#
+suite suiteName
+   family familyName
+      task q
+            trigger /a/b/c/d/e:event == set       # extern event path
+      task r
+            trigger /a/b/c/d/e:meter le 30        # extern meter path   
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/extern/trigger2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/trigger2.def
new file mode 100644
index 0000000..4c9d7de
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/extern/trigger2.def
@@ -0,0 +1,10 @@
+#
+# Trigger references to node path, not in externs is an error
+#
+suite bad_extern
+   family f1
+      task p
+            trigger /a/b/c/d == complete          # extern path
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/family/family.def b/ecflow_4_0_7/AParser/test/data/bad_defs/family/family.def
new file mode 100644
index 0000000..7097f6f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/family/family.def
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName0
+   endfamily
+   family familyName0             # duplicate family names
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/family/family_1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/family/family_1.def
new file mode 100644
index 0000000..10eb48f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/family/family_1.def
@@ -0,0 +1,14 @@
+    suite suiteName
+       family familyName0
+          task taskName0
+          family heir_familyName0
+          endfamily
+          family heir_familyName0     # duplicate hierarchical familys
+          endfamily
+      endfamily
+      family familyName1
+      endfamily
+      family familyName2
+      endfamily
+   endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/family/simple_family.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/family/simple_family.txt
new file mode 100644
index 0000000..bc51d07
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/family/simple_family.txt
@@ -0,0 +1,5 @@
+suite suiteName
+   family  
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/inlimit/limit.def b/ecflow_4_0_7/AParser/test/data/bad_defs/inlimit/limit.def
new file mode 100755
index 0000000..11409a0
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/inlimit/limit.def
@@ -0,0 +1,26 @@
+
+extern /limits:c1a
+extern /limits:linux_cluster
+extern /limits:pdb
+extern /limits:q2diss
+
+suite suiteName
+	limit sg1  10
+	limit mars 10
+endsuite
+
+suite obs
+    inlimit /limits:c1a
+    family limits
+    	limit hpcd 20
+    endfamily
+    
+    family anon    
+            inlimit /suiteName:sg1        #  
+    	task t1
+            inlimit /suiteName:sg1        #  
+            inlimit /suiteName:sg1        # duplicate inlimit
+   		task t2
+   		task t3
+     endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/inlimit/limt2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/inlimit/limt2.def
new file mode 100755
index 0000000..1edb49a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/inlimit/limt2.def
@@ -0,0 +1,22 @@
+
+extern /limits:c1a
+extern /limits:linux_cluster
+extern /limits:pdb
+extern /limits:q2diss
+
+suite obs
+    limit sg1
+    inlimit /limits:c1a
+    family limits
+    	limit hpcd 20
+    endfamily
+    
+    family anon    
+            inlimit  sg1       
+    	task t1
+            inlimit  sg1        #  
+            inlimit  sg1        # duplicate inlimit
+   		task t2
+   		task t3
+     endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/late/late.def b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late.def
new file mode 100644
index 0000000..2e4b50c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late.def
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName
+      task t1
+      	  late -s +00:15 -s 20:00 -c +02:00  # how to cope with duplivates ????????????
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/late/late2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late2.def
new file mode 100644
index 0000000..12da9d3
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late2.def
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName
+      task t1
+      		late -c +00:15 -s 20:00 -c +02:00  # how to cope with duplivates ????????????
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/late/late3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late3.def
new file mode 100644
index 0000000..f9d12d1
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late3.def
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName
+      task t1
+      	  late  # oops no -s -a -c specified
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/late/late4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late4.def
new file mode 100644
index 0000000..a9bfa0e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/late/late4.def
@@ -0,0 +1,8 @@
+suite suiteName
+   family familyName
+      task t1
+      	  late -s +00:15 -c +02:00  #  Con only have one late per node
+      	  late -a 00:15 -c +02:00   #  Con only have one late per node
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/limit/limit.def b/ecflow_4_0_7/AParser/test/data/bad_defs/limit/limit.def
new file mode 100644
index 0000000..fcfe559
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/limit/limit.def
@@ -0,0 +1,10 @@
+ 
+suite suite
+    limit disk 50
+    
+    family anon    
+    	inlimit /suite:disk 100    # inlimit value is greater than the LIMIT
+    	task t1
+    	task t2
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter.def b/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter.def
new file mode 100644
index 0000000..5afabf9
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName
+      task taskName
+          meter myMeter  200 100 100  #  min val(200)  > max value(100)
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter2.def
new file mode 100644
index 0000000..0a2a9d6
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter2.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName
+      task taskName
+          meter myMeter  0 100 200  #  color change must be between min(0) and max(100)
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter3.def
new file mode 100644
index 0000000..1e8f793
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/meter/meter3.def
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName
+      task taskName
+          meter myMeter  0 100 100  
+          meter myMeter  0 100 100  #  duplicate meters are not allowed
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/date_missing_name.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/date_missing_name.def
new file mode 100644
index 0000000..c9c8a81
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/date_missing_name.def
@@ -0,0 +1,3 @@
+suite suiteName
+    repeat date 20090331 20121212 1  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/duplicate_repeats_per_node.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/duplicate_repeats_per_node.def
new file mode 100644
index 0000000..5228092
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/duplicate_repeats_per_node.def
@@ -0,0 +1,4 @@
+suite suiteName
+    repeat date YMD 20090331 20121212 1 # status 0
+    repeat date YMD1 20090331 20121212 1 # status 0
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/invalid_dates.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/invalid_dates.def
new file mode 100644
index 0000000..74a426f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/invalid_dates.def
@@ -0,0 +1,5 @@
+suite suiteName
+   
+    repeat date YMD 20091901 20091501   # should have format yyyymmdd  19 and 15 ar not valid months
+  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/invalid_dates_2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/invalid_dates_2.def
new file mode 100644
index 0000000..fa09982
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/invalid_dates_2.def
@@ -0,0 +1,5 @@
+suite suiteName
+   
+    repeat date YMD 20091099 20091501   # should have format yyyymmdd  invalid day of month
+  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_integer.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_integer.def
new file mode 100644
index 0000000..89724b6
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_integer.def
@@ -0,0 +1,7 @@
+suite suiteName
+   
+    repeat integer VARIABLE 0 10 2 # comment
+    repeat integer VARIABLE 0 10 # duplicate variable name
+    repeat integer VARIABLE 0 10 # duplicate variable name
+ 
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_month.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_month.def
new file mode 100644
index 0000000..d1f0670
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_month.def
@@ -0,0 +1,4 @@
+suite suiteName
+     repeat month 2                         #111
+endsuite
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_with_cron.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_with_cron.def
new file mode 100644
index 0000000..c03a13a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_with_cron.def
@@ -0,0 +1,5 @@
+suite suiteName
+    repeat date YMD 20090331 20121212 1 # status 0
+    cron 10:00 23:00 00:10              # cant have repeat  & cron time series at same level
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_year.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_year.def
new file mode 100644
index 0000000..f803915
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/repeat_year.def
@@ -0,0 +1,4 @@
+suite suiteName
+  
+    repeat year 3 20090331 20121212 1 # status 0
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/string_missing_name.def b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/string_missing_name.def
new file mode 100644
index 0000000..743f645
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/repeat/string_missing_name.def
@@ -0,0 +1,4 @@
+suite suiteName
+ 
+    repeat string  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/suite/clock.def b/ecflow_4_0_7/AParser/test/data/bad_defs/suite/clock.def
new file mode 100644
index 0000000..295bb87
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/suite/clock.def
@@ -0,0 +1,7 @@
+    # only suites are allowed to have clocks
+    suite suiteName
+       family familyName0
+		 	clock real 20.1.2006
+      endfamily
+   endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/suite/clock1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/suite/clock1.def
new file mode 100644
index 0000000..515ad70
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/suite/clock1.def
@@ -0,0 +1,7 @@
+    # only suites are allowed to have clocks
+    suite suiteName
+       family familyName0
+       		task t1
+		 		clock real 20.1.2006
+      endfamily
+   endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/suite/simple_suite.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/suite/simple_suite.txt
new file mode 100644
index 0000000..15ed9fe
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/suite/simple_suite.txt
@@ -0,0 +1,2 @@
+suite  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/task/simple_task.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/task/simple_task.txt
new file mode 100644
index 0000000..d5e291b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/task/simple_task.txt
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName0
+      task  
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/task/task.def b/ecflow_4_0_7/AParser/test/data/bad_defs/task/task.def
new file mode 100644
index 0000000..e479608
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/task/task.def
@@ -0,0 +1,8 @@
+suite suiteName
+   family familyName0
+      task fred             # duplicate task names
+      task fred
+      endtask
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/task/task_1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/task/task_1.def
new file mode 100644
index 0000000..bcb3fb0
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/task/task_1.def
@@ -0,0 +1,12 @@
+   suite suiteName
+       family familyName0
+          family heir_familyName0      
+          		task fred                      # duplicate tasks within hier family
+          		task fred
+          endfamily
+      endfamily
+      family familyName1
+      endfamily
+      family familyName2
+      endfamily
+   endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time.def
new file mode 100644
index 0000000..7a6525f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time.def
@@ -0,0 +1,16 @@
+suite suiteName
+   family familyName0
+   		time 15:00 20:00   # ERROR should  time <start> <finish> <increment>
+   		time 19:00
+   		time +15:00
+   		time 10:00 20:00 01:00
+   		time +10:00 20:00 01:00
+		task t
+   			time 15:00
+   			time 19:00
+   			time +15:00
+   			time 10:00 20:00 01:00
+   			time +10:00 20:00 01:00		   		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_1.def
new file mode 100644
index 0000000..9f8c6e0
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_1.def
@@ -0,0 +1,4 @@
+suite a
+   time 19:00  # suites don't have a time, See see SUP-1198, ECFLOW-106 Times/Dates attributes attached to suite node
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_2.def
new file mode 100644
index 0000000..328f13a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_2.def
@@ -0,0 +1,15 @@
+suite suiteName
+   family familyName0
+    	time 19:00
+   		time -15:00                  # minus not allowed
+   		time 10:00 20:00 01:00
+   		time +10:00 20:00 01:00
+		task t
+   			time 15:00
+   			time 19:00
+   			time +15:00
+   			time 10:00 20:00 01:00
+   			time +10:00 20:00 01:00		   		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_3.def
new file mode 100644
index 0000000..bec8d03
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_3.def
@@ -0,0 +1,16 @@
+suite suiteName
+   family familyName0
+   		time 15:000   # ERROR minutes should be limited to 2 digits
+   		time 19:00
+   		time +15:00
+   		time 10:00 20:00 01:00
+   		time +10:00 20:00 01:00
+		task t
+   			time 15:00
+   			time 19:00
+   			time +15:00
+   			time 10:00 20:00 01:00
+   			time +10:00 20:00 01:00		   		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_4.def
new file mode 100644
index 0000000..9128330
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_4.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName0
+   		time 99:00        # bad hour range should be 00-23
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_5.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_5.def
new file mode 100644
index 0000000..5843ec4
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_5.def
@@ -0,0 +1,5 @@
+suite suiteName
+   family familyName0
+   		time 23:76        # bad minutes range should be 00-59
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_6.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_6.def
new file mode 100644
index 0000000..a06e910
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_6.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName0
+   		time  20:00 10:00 01:00          # invalid range start time > end time
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_7.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_7.def
new file mode 100644
index 0000000..6a0dd9a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_7.def
@@ -0,0 +1,16 @@
+suite suiteName
+   family familyName0
+   		time 15:00 20:00 00:00  # ERROR  increment cant be NULL
+   		time 19:00
+   		time +15:00
+   		time 10:00 20:00 01:00
+   		time +10:00 20:00 01:00
+		task t
+   			time 15:00
+   			time 19:00
+   			time +15:00
+   			time 10:00 20:00 01:00
+   			time +10:00 20:00 01:00		   		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_8.def b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_8.def
new file mode 100644
index 0000000..62c45e9
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/time/time_8.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName0
+        time 00:00 01:00 10:00  # ERROR  increment duration is greater than duration between start/finish
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/today/today.def b/ecflow_4_0_7/AParser/test/data/bad_defs/today/today.def
new file mode 100644
index 0000000..983487e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/today/today.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName0
+   		today 15:00
+   		today 23:59 00:00  00:30     # start should be less than finish
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/today/today1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/today/today1.def
new file mode 100644
index 0000000..19fe9c8
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/today/today1.def
@@ -0,0 +1,4 @@
+suite a
+   today 19:00  # suites dont have a today, See  see SUP-1198, ECFLOW-106 Times/Dates attributes attached to suite node
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger2.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger2.txt
new file mode 100644
index 0000000..bc45899
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger2.txt
@@ -0,0 +1,7 @@
+suite suiteName
+    family familyName1
+		task a
+    	task b
+   			trigger z == complete   # reference to non existing sibling
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger3.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger3.txt
new file mode 100644
index 0000000..6d60033
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger3.txt
@@ -0,0 +1,7 @@
+suite suiteName
+    family familyName1
+		task a
+    	task b
+   			trigger /suiteName/ == complete   # incomplete absolute path
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger4.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger4.txt
new file mode 100644
index 0000000..240c436
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger4.txt
@@ -0,0 +1,20 @@
+suite suite
+    family family
+    	task t1
+    	task t2
+    	task t3
+    	task t4
+    	task t5
+    	task t6
+    	task t7
+    	task t8
+    	task t9
+    	task t10
+		task a             
+         	event eventName 
+    	task b             
+   			trigger -a t2  == complete     # option -a and -o should be last
+   			trigger -o t3  == complete     # option -a and -o should be last
+   			trigger t1  == complete        # trigger with out options should be first
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger5.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger5.txt
new file mode 100644
index 0000000..d466b78
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/bad_trigger5.txt
@@ -0,0 +1,14 @@
+# here we have a trigger expression that references a meter and a node.
+# We should only except a string which is 'set' or 'clear'
+# i.e
+#    trigger /suite/family/m:var gt  0 or /suite/family/m:var eq set
+# here var could be an event
+
+suite suite
+    family family
+      task a             
+         trigger /suite/family/m:meter gt  0 or /suite/family/m:meter eq complete
+      task m
+         meter meter  0 100 100  # meter <name> <min> <max> [optional color change]
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/complex.def b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/complex.def
new file mode 100644
index 0000000..e98fc0c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/complex.def
@@ -0,0 +1,16 @@
+
+suite main
+  family dc00
+         task obs
+         task ref
+         family an
+            task forceinv
+         endfamily
+         family fc
+            # this should fail to find the referenced node, since .. means parents parent i.e main
+            # since there is no family 'an' under main this should fail.
+            trigger ../an/forceinv == complete # this should really be ./an/forceinv == complete
+         endfamily    
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/divide_by_zero.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/divide_by_zero.txt
new file mode 100644
index 0000000..36aa778
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/divide_by_zero.txt
@@ -0,0 +1,9 @@
+suite suiteName
+    family f1
+      task a
+      event event
+      task b
+            trigger ((/suiteName/f1/a:event / 0) == 0)   # divide by zero
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/extern_trigger.def b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/extern_trigger.def
new file mode 100644
index 0000000..2285ec2
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/extern_trigger.def
@@ -0,0 +1,11 @@
+extern /a/b/c/d         
+extern /a/b/c/d/e:event        
+extern /a/b/c/d/e:meter        
+
+suite suiteName
+  family familyName
+  		task a
+   			trigger /a/b/c/d/e/f == complete  		   # non existing path, not even extern
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/modulo_by_zero.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/modulo_by_zero.txt
new file mode 100644
index 0000000..f52cc82
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/modulo_by_zero.txt
@@ -0,0 +1,6 @@
+suite suiteName
+      task a
+         meter meter 0 100 100
+      task b
+            trigger /suiteName/a:meter % 0 >= 0   # modulo by zero, should failed check
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/simple_trigger_bad_expression.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/simple_trigger_bad_expression.txt
new file mode 100644
index 0000000..b51ad0a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/simple_trigger_bad_expression.txt
@@ -0,0 +1,11 @@
+suite suiteName
+  family familyNamea
+   		task a
+   		task b
+       endfamily
+   family familyName
+   		task a
+   		task b
+    			trigger ..//familyNamea\b == complete                      
+     endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/trigger.txt b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/trigger.txt
new file mode 100644
index 0000000..5e87b6d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/trigger.txt
@@ -0,0 +1,9 @@
+suite suiteName
+   family familyName
+   		task a
+   		task b
+   			trigger a == complete                       
+   			trigger b == complete               # duplicate task trigger        
+     endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/trigger_1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/trigger_1.def
new file mode 100644
index 0000000..1964c03
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/trigger/trigger_1.def
@@ -0,0 +1,10 @@
+suite suiteName
+   family familyName
+   		trigger familyName1 == complete                
+   		trigger familyName1 == complete    # duplicate family trigger
+   		task a
+   		task b
+   			trigger a == complete                       
+      endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad.def
new file mode 100644
index 0000000..591d04e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad1.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad1.def
new file mode 100644
index 0000000..bc809e7
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad1.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit var
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad2.def
new file mode 100644
index 0000000..28b54ab
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad2.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit var # a comment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad3.def
new file mode 100644
index 0000000..39e24ad
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad3.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit #comment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad4.def
new file mode 100644
index 0000000..fd25d49
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad4.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit #var value
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad5.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad5.def
new file mode 100644
index 0000000..2ff70f4
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/bad5.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit var#bad value
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/comment.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/comment.def
new file mode 100644
index 0000000..ca7d5f5
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/comment.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit # comment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/variable/comment2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/comment2.def
new file mode 100644
index 0000000..df1bd4a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/variable/comment2.def
@@ -0,0 +1,3 @@
+suite suiteName
+   edit comment # start of a comment,  this is an error since value starts with #
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verfiy3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verfiy3.def
new file mode 100644
index 0000000..63ce2ca
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verfiy3.def
@@ -0,0 +1,3 @@
+suite  
+	verify complete:int        # correct format is <state>:int, ie verify complete:3
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify.def b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify.def
new file mode 100644
index 0000000..4dbd72b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify.def
@@ -0,0 +1,3 @@
+suite  
+	verify complete        # correct format is <state>:int
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify2.def
new file mode 100644
index 0000000..9ac10f1
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify2.def
@@ -0,0 +1,3 @@
+suite  
+	verify complete:        # correct format is <state>:int
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify4.def
new file mode 100644
index 0000000..cc734cb
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/verify/verify4.def
@@ -0,0 +1,4 @@
+suite  
+	verify complete:3        # cant have 2 verify completes, must be of different states
+	verify complete:4        #  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad.def b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad.def
new file mode 100644
index 0000000..03c7805
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad.def
@@ -0,0 +1,4 @@
+suite suiteName
+   zombie ecf               # should be ecf:::0
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad2.def b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad2.def
new file mode 100644
index 0000000..1ba779b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad2.def
@@ -0,0 +1,7 @@
+suite suiteName
+   zombie ecf:fob:init:100
+   zombie path:fail:event:100
+   zombie user:adopt:meter:100
+   zombie ecf:fob:init:100       # can only have one ecf
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad3.def b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad3.def
new file mode 100644
index 0000000..085394b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad3.def
@@ -0,0 +1,4 @@
+suite suiteName
+    zombie fred:adopt:meter:100    # fred is not a valid zombie type
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad4.def b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad4.def
new file mode 100644
index 0000000..19b8155
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad4.def
@@ -0,0 +1,4 @@
+suite suiteName
+    zombie user:fred:event,meter:100    # fred is not a valid user action
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad5.def b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad5.def
new file mode 100644
index 0000000..94c132a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/bad_defs/zombie/bad5.def
@@ -0,0 +1,4 @@
+suite suiteName
+    zombie user:fob:fred:100    # fred is not a valid child cmd
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock.def b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock.def
new file mode 100644
index 0000000..8397868
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock.def
@@ -0,0 +1,5 @@
+suite suiteName
+	clock real 300
+endsuite
+
+suite s1; clock real 300;endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock1.def b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock1.def
new file mode 100644
index 0000000..c22a2c3
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock1.def
@@ -0,0 +1,5 @@
+suite suiteName
+	clock real +01:00
+endsuite
+
+suite s1; clock real +01:00;endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock2.def b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock2.def
new file mode 100644
index 0000000..716b51a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock2.def
@@ -0,0 +1,5 @@
+suite suiteName
+	clock real 01:00
+endsuite
+
+suite s1; clock real 01:00;endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock3.def b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock3.def
new file mode 100644
index 0000000..8316ebc
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock3.def
@@ -0,0 +1,5 @@
+suite suiteName
+	clock real 20.1.2006
+endsuite
+
+suite s1;clock real 20.1.2006;endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock4.def b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock4.def
new file mode 100644
index 0000000..8c92d95
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock4.def
@@ -0,0 +1,6 @@
+suite suiteName
+	clock real 20.1.2006 +02:00
+endsuite
+ 
+suite s1; clock real 20.1.2006 +02:00;endsuite
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock5.def b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock5.def
new file mode 100644
index 0000000..b3e2a01
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock5.def
@@ -0,0 +1,5 @@
+suite suiteName
+	clock real 01.01.2006 +02:00
+endsuite
+
+suite s1;clock real 01.01.2006 +02:00;endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock6.def b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock6.def
new file mode 100644
index 0000000..105984a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/clock/clock6.def
@@ -0,0 +1,24 @@
+suite s1
+  clock real 300 -s                #  
+endsuite
+ 
+suite s3
+  clock real 20.1.1992 300 -s  
+endsuite
+
+suite s4
+  clock real 20.1.1992 +01:00 -s
+endsuite
+
+
+suite s01
+  clock real 300  -s            # -s means stop start calendar with server
+endsuite
+
+suite s02
+  clock real +01:00  -s         # 
+endsuite
+
+suite s03
+  clock real 20.1.1992 +01:00   -s
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/comment/comment.txt b/ecflow_4_0_7/AParser/test/data/good_defs/comment/comment.txt
new file mode 100644
index 0000000..2f8148a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/comment/comment.txt
@@ -0,0 +1,35 @@
+# # comment 
+# This is defs file that show use of comments
+# # comment 
+
+suite suiteName                      # comment 
+   family familyName0                # comment 
+      task taskName0                 # comment 
+         event 0                     # comment 
+         event 1 eventName           # comment 
+         meter myMeter 0 100         # comment 
+      family heir_familyName0        # comment 
+         task taskName0              # comment 
+            event 0                  # comment 
+            event 1 eventName        # comment 
+            meter myMeter 0 100      # comment 
+      endfamily                      # comment 
+   endfamily                         # comment 
+   family familyName1                # comment 
+      task taskName1                 # comment 
+         event 1                     # comment 
+         event 2 eventName           # comment 
+         meter myMeter 0 100         # comment 
+   endfamily                         # comment 
+   family familyName2                # comment 
+      task taskName2                 # comment 
+         event 2                     # comment 
+         event 3 eventName           # comment 
+         meter myMeter 0 100         # comment 
+   endfamily                         # comment 
+endsuite                             # comment 
+
+# Final comment  # comment 
+                    
+
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/complete/complete.def b/ecflow_4_0_7/AParser/test/data/good_defs/complete/complete.def
new file mode 100644
index 0000000..949e4dd
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/complete/complete.def
@@ -0,0 +1,14 @@
+suite suiteName
+   family f
+   		task t
+   			meter step 0 240 120
+   		task tt
+   			complete t:step ge 120
+   			trigger t == complete
+   endfamily
+endsuite
+
+suite s1; family f; task t;meter step 0 240 120;task tt;complete t:step ge 120;trigger t == complete
+endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/complete/complex.def b/ecflow_4_0_7/AParser/test/data/good_defs/complete/complex.def
new file mode 100644
index 0000000..a557825
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/complete/complex.def
@@ -0,0 +1,27 @@
+suite suite
+    family family
+    	task t1
+    	task t2
+    	task t3
+    	task t4
+    	task t5
+    	task t6
+    	task t7
+    	task t8
+    	task t9
+    	task t10
+		task a             
+         	event eventName 
+    	task b             
+   			complete t1  == complete        # a comment at end of trigger
+   			complete -a t2  == complete     # a comment at end of trigger
+   			complete -a t3  == complete     # a comment at end of trigger
+   			complete -a t4  == complete     # a comment at end of trigger
+   			complete -a t5  == complete     # a comment at end of trigger
+   			complete -o t6  == complete      # a comment at end of trigger
+   			complete -o t7  == complete      # a comment at end of trigger
+   			complete -o t8  == complete      # a comment at end of trigger
+   			complete -o t9  == complete      # a comment at end of trigger
+   			complete -o t10  == complete      # a comment at end of trigger
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron.def b/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron.def
new file mode 100644
index 0000000..ea98a6e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron.def
@@ -0,0 +1,13 @@
+suite cron
+	cron 23:00                              # run every day at 23:00
+	cron 10:00 20:00 01:00                  # run every hour between 10am and 8pm
+	cron -w 0,1 10:00                       # run every sunday and monday at 10am
+	cron -d 10,11,12 12:00                  # run 10th, 11th and 12th of each month at noon
+	cron -m 1,2,3 12:00                     # run on Jan,Feb and March every day at noon.
+	cron -w 0,6 12:00
+	cron -w 0,1,2,3,4,5,6 12:00
+	cron -w 0 -m 5,6,7,8 10:00 20:00 01:00  # run every sunday, between May-Aug, every hour between 10am and 8pm
+endsuite
+
+suite s1;cron 23:00 ;cron 10:00 20:00 01:00 ;cron -w 0,1 10:00 ;cron -d 10,11,12 12:00 ;cron -m 1,2,3 12:00 ; cron -w 0,6 12:00;cron -w 0,1,2,3,4,5,6 12:00;cron -w 0 -m 5,6,7,8 10:00 20:00 01:00  # run every sunday, between May-Aug, every hour between 10am and 8pm
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron1.def b/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron1.def
new file mode 100644
index 0000000..5cfda5b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron1.def
@@ -0,0 +1,4 @@
+suite cron
+  
+	cron -w 0 , 1, 2 -m 5, 6, 7 , 8,9,10      10:00  20:00  01:00  # run every sunday, between May-Aug, every hour between 10am and 8pm
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron2.def b/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron2.def
new file mode 100644
index 0000000..1c64df0
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/cron/cron2.def
@@ -0,0 +1,3 @@
+suite cron
+	cron -w 0,1,2 -d 1,20,24 -m 5,6,7,8 10:00 20:00 01:00  #  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/date/date.def b/ecflow_4_0_7/AParser/test/data/good_defs/date/date.def
new file mode 100644
index 0000000..5494423
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/date/date.def
@@ -0,0 +1,25 @@
+suite suiteName
+   task a
+      date *.*.2009
+   endtask
+   family familyName0
+   	  date 1.*.2009
+      task taskName0
+   	  		date 1.12.2009
+      task fred
+   	  		date 01.*.*
+      endtask
+   endfamily
+endsuite
+
+suite s1;
+   family familyName0
+   	  date 1.*.2009
+      task taskName0
+   	  		date 1.12.2009
+      task fred
+   	  		date 01.*.*
+      endtask
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/day/day.def b/ecflow_4_0_7/AParser/test/data/good_defs/day/day.def
new file mode 100644
index 0000000..1fcfca1
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/day/day.def
@@ -0,0 +1,26 @@
+suite suiteName
+   family familyName0
+   	  day tuesday
+      task taskName0
+   	  		day wednesday
+      task fred
+   	  		day thursday
+   	  		day friday
+   	  		day saturday
+   	  		day sunday
+       endtask
+   endfamily
+endsuite
+
+suite s1; family familyName0 ; day tuesday
+      task taskName0
+   	  		day wednesday
+      task fred
+   	  		day thursday
+   	  		day friday
+   	  		day saturday
+   	  		day sunday
+      endtask
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/defstatus/defstatus.txt b/ecflow_4_0_7/AParser/test/data/good_defs/defstatus/defstatus.txt
new file mode 100644
index 0000000..a0c62fe
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/defstatus/defstatus.txt
@@ -0,0 +1,19 @@
+suite suiteName
+   defstatus suspended
+   family familyName0
+      defstatus complete
+      task taskName0
+  		 edit VAR2 value2
+      	 defstatus complete  # TODO defstatus ordering, if edit,event,meter first it wont parse
+   endfamily
+endsuite
+
+suite s1;
+   defstatus suspended
+   family familyName0
+      defstatus complete
+      task taskName0
+  		 edit VAR2 value2
+      	 defstatus complete  # TODO defstatus ordering, if edit,event,meter first it wont parse
+   endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/edit/edit.def b/ecflow_4_0_7/AParser/test/data/good_defs/edit/edit.def
new file mode 100644
index 0000000..cac7245
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/edit/edit.def
@@ -0,0 +1,24 @@
+ 
+suite edit
+	edit ECF_INCLUDE /home/ma/map/sms/example/x                  # comment line
+	edit ECF_FILES   /home/ma/map/sms/example/x                  #comment line
+    edit EXPVER 'f8na'                                          #
+    edit USER 'ecgems'                                          #comment
+    edit USER2 "ecgems"                                         # comment
+    edit INT1 "10"                                             # comment
+    edit INT2 '11'                                             # comment
+    edit YMD  '20091012'                                        # comment
+ 	family family
+		edit ECF_FETCH  "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"  # comment line
+		edit ECF_FETCH2 'smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%'  #comment line
+		task t2
+	endfamily
+endsuite
+	
+suite s1; edit ECF_INCLUDE /home/ma/map/sms/example/x ; edit INT2 '11'                                             # comment
+    edit YMD  '20091012'                                        # comment
+ 	family family
+		edit ECF_FETCH  "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%" ; edit ECF_FETCH2 'smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%'  #comment line
+		task t2 ; endfamily
+endsuite
+	
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/event/event_1.def b/ecflow_4_0_7/AParser/test/data/good_defs/event/event_1.def
new file mode 100644
index 0000000..3b27019
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/event/event_1.def
@@ -0,0 +1,14 @@
+suite suiteName
+   family familyName0
+      task taskName0
+         event 0 
+         event name
+         event 1 eventName
+         event 2 eventNamea
+     endfamily
+endsuite
+
+suite s1;family familyName0 ; task taskName0 ; event 0  ;event name ;event 1 eventName
+         event 2 eventNamea ; endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/event/event_2.def b/ecflow_4_0_7/AParser/test/data/good_defs/event/event_2.def
new file mode 100644
index 0000000..0abb394
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/event/event_2.def
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName0
+      task taskName0
+         event 0 
+         event 1
+    endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/event/family_event.def b/ecflow_4_0_7/AParser/test/data/good_defs/event/family_event.def
new file mode 100644
index 0000000..196d8d9
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/event/family_event.def
@@ -0,0 +1,10 @@
+suite suiteName
+   family familyName0
+      # Events added to suite/family can not be signaled by child commands
+      # However alter/force should allow events to set/cleared on Family/suite
+      event 0 
+      event name
+      event 1 eventName
+      event 2 eventNamea
+   endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/event/spaces.def b/ecflow_4_0_7/AParser/test/data/good_defs/event/spaces.def
new file mode 100644
index 0000000..912b92c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/event/spaces.def
@@ -0,0 +1,15 @@
+suite suiteName
+   family familyName0
+      task taskName0
+      
+         event 0 
+         
+         event name
+         
+         event 1 eventName
+         
+         event 2 eventNamea
+         
+     endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/event/suite_event.def b/ecflow_4_0_7/AParser/test/data/good_defs/event/suite_event.def
new file mode 100644
index 0000000..12da456
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/event/suite_event.def
@@ -0,0 +1,8 @@
+suite suiteName
+   # Events added to suite/family can not be signaled by child commands
+   # However alter/force should allow events to set/cleared on Family/suite
+   event 0 
+   event name
+   event 1 eventName
+   event 2 eventNamea
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/extern/extern.def b/ecflow_4_0_7/AParser/test/data/good_defs/extern/extern.def
new file mode 100644
index 0000000..334aa33
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/extern/extern.def
@@ -0,0 +1,52 @@
+extern /o/main/12/an;extern /limits:c1a
+extern /limits:linux_cluster;extern /limits:pdb
+extern /limits:q2diss;extern /o/main:YMD
+extern /o/main/12/an/slwet
+extern /o/main/12/an/4dvar/ifstraj:finalwave
+extern /o/main/12/an/4dvar
+extern /o/main/12/an
+extern /o/main/12/fc/model
+extern /o/main/12/fc/model
+extern /o/main/12/an/4dvar/uptraj_0
+extern /o/main/12/an/4dvar/uptraj_0
+extern /o/main/12/fc/model
+extern /o/main/00dc/fc/model:step
+extern /o/main/00dc/fc/model
+extern /o/main/12/obs/get/get_stor
+extern /limits:prod
+extern /o/main/12/prod/240/prod_wparam
+extern /o/main:YMD
+extern /o/main/00/an
+extern /o/main/00/an/slwet
+extern /o/main/00/an/4dvar/ifstraj:finalwave
+extern /o/main/00/an/4dvar
+extern /o/main/00/an
+extern /o/main/00/fc/model
+extern /o/main/00/fc/model
+extern /o/main/00/an/4dvar/uptraj_0
+extern /o/main/00/an/4dvar/uptraj_0
+extern /o/main/00/fc/model
+extern /o/main/12dc/fc/model:step
+extern /o/main/12dc/fc/model
+extern /o/main/00/obs/get/get_stor
+extern /o/main/00/prod/240/prod_wparam
+extern /limits:mars
+extern /mofc/00/efi/swarm/sync_climate
+
+suite suiteName
+	limit sg1  10
+	limit mars 10
+endsuite
+
+suite obs
+    family limits
+    	limit hpcd 20
+    endfamily
+    
+    family anon
+    	task t1
+    		inlimit /suiteName:sg1
+   		task t2
+   			inlimit /obs/limits:hpcd         
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/extern/first.def b/ecflow_4_0_7/AParser/test/data/good_defs/extern/first.def
new file mode 100644
index 0000000..880476b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/extern/first.def
@@ -0,0 +1,20 @@
+#
+# This defines extern which are defined in second.def
+#
+extern /a/b/c/d         
+extern /a/b/c/d/e:event        
+extern /a/b/c/d/e:meter       
+
+extern /a/b/c/d/e/f/g/h/j     # this does not exist in second.def
+
+suite suiteName
+   family familyName
+   	task p
+   			trigger /a/b/c/d == complete  		  # extern path
+  		task q
+   			trigger /a/b/c/d/e:event == set  	  # extern event path
+ 		task r
+   			trigger /a/b/c/d/e:meter le 30		  # extern meter path	
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/extern/plain.def b/ecflow_4_0_7/AParser/test/data/good_defs/extern/plain.def
new file mode 100644
index 0000000..a4f6947
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/extern/plain.def
@@ -0,0 +1,7 @@
+extern fred                             # allow non absolute paths
+extern /mofc/00/efi/swarm/sync_climate
+
+suite suiteName
+    limit sg1  10
+    limit mars 10
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/extern/second.def b/ecflow_4_0_7/AParser/test/data/good_defs/extern/second.def
new file mode 100644
index 0000000..e135d35
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/extern/second.def
@@ -0,0 +1,17 @@
+ 
+#
+# The defs is used conjunction with first.def to test resolution of externs
+#
+
+suite a
+   family b
+   		family c
+   			family d
+   				task e
+   					event event
+           	    	meter meter  0 100 100  # meter <name> <min> <max> [optional color change]
+           	endfamily
+    	endfamily
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/extern/simple_extern.def b/ecflow_4_0_7/AParser/test/data/good_defs/extern/simple_extern.def
new file mode 100644
index 0000000..fb5f925
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/extern/simple_extern.def
@@ -0,0 +1,40 @@
+extern /o/main/12/an
+extern /limits:c1a
+extern /limits:linux_cluster
+extern /limits:pdb
+extern /limits:q2diss
+extern /o/main:YMD
+extern /o/main/12/an/slwet
+extern /o/main/12/an/4dvar/ifstraj:finalwave
+extern /o/main/12/an/4dvar
+extern /o/main/12/an
+extern /o/main/12/fc/model
+extern /o/main/12/fc/model
+extern /o/main/12/an/4dvar/uptraj_0
+extern /o/main/12/an/4dvar/uptraj_0
+extern /o/main/12/fc/model
+extern /o/main/00dc/fc/model:step
+extern /o/main/00dc/fc/model
+extern /o/main/12/obs/get/get_stor
+extern /limits:prod
+extern /o/main/12/prod/240/prod_wparam
+extern /o/main:YMD
+extern /o/main/00/an
+extern /o/main/00/an/slwet
+extern /o/main/00/an/4dvar/ifstraj:finalwave
+extern /o/main/00/an/4dvar
+extern /o/main/00/an
+extern /o/main/00/fc/model
+extern /o/main/00/fc/model
+extern /o/main/00/an/4dvar/uptraj_0
+extern /o/main/00/an/4dvar/uptraj_0
+extern /o/main/00/fc/model
+extern /o/main/12dc/fc/model:step
+extern /o/main/12dc/fc/model
+extern /o/main/00/obs/get/get_stor
+extern /o/main/00/prod/240/prod_wparam
+extern /limits:mars
+extern /mofc/00/efi/swarm/sync_climate
+
+suite suiteName
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/family/hierarchical_family.txt b/ecflow_4_0_7/AParser/test/data/good_defs/family/hierarchical_family.txt
new file mode 100644
index 0000000..db810fb
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/family/hierarchical_family.txt
@@ -0,0 +1,38 @@
+    suite suiteName
+      edit VAR value
+      edit VAR1 "value"
+      family familyName0
+         edit VAR value
+         task taskName0
+            edit VAR1 "value"
+            event 0 
+            event 1 eventName
+            meter myMeter 0 100
+         family heir_familyName0
+            edit VAR1 value
+            task taskName0
+               edit VAR1 value
+               event 0 
+               event 1 eventName
+               meter myMeter 0 100
+         endfamily
+      endfamily
+      family familyName1
+         edit VAR value
+         task taskName1
+            edit VAR1 "value"
+            event 1 
+            event 2 eventName
+            meter myMeter 0 100
+      endfamily
+      family familyName2
+         edit VAR value
+         task taskName2
+            trigger ../familyName1/taskName1 == complete
+            edit VAR1 "value"
+            event 2 
+            event 3 eventName
+            meter myMeter 0 100
+      endfamily
+   endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/family/missingEnds.txt b/ecflow_4_0_7/AParser/test/data/good_defs/family/missingEnds.txt
new file mode 100644
index 0000000..6b050cf
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/family/missingEnds.txt
@@ -0,0 +1,3 @@
+suite suiteName
+   family familyName0    # missing endfamily and endsuite, should parse ok if its last family and suite
+ 
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/family/simple_family.txt b/ecflow_4_0_7/AParser/test/data/good_defs/family/simple_family.txt
new file mode 100644
index 0000000..44c7c2a
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/family/simple_family.txt
@@ -0,0 +1,5 @@
+suite suiteName
+   family familyName0
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/label/label.txt b/ecflow_4_0_7/AParser/test/data/good_defs/label/label.txt
new file mode 100644
index 0000000..97282bc
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/label/label.txt
@@ -0,0 +1,16 @@
+suite suiteName
+   family familyName
+      task taskName
+      	label foo ""
+    endfamily
+endsuite
+
+suite s1
+   family familyName
+      task taskName ; label foo ""
+    endfamily
+endsuite
+
+suite s3
+   label foo ""
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/label/multi_line_lables.def b/ecflow_4_0_7/AParser/test/data/good_defs/label/multi_line_lables.def
new file mode 100644
index 0000000..8a94e5e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/label/multi_line_lables.def
@@ -0,0 +1,7 @@
+ 
+suite s3
+   label foo ""
+   label foo2 "value"
+   label foo3 "value\\nvalue" #\\n should be converted to new line
+   label foo4 "value\\nvalue  \\nfred fred2\\n" # \\n should be converted to new line
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/label/spaces.def b/ecflow_4_0_7/AParser/test/data/good_defs/label/spaces.def
new file mode 100644
index 0000000..2a81e84
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/label/spaces.def
@@ -0,0 +1,10 @@
+suite suiteName
+   family familyName
+      task taskName
+      
+      	label foo ""
+      	
+      	label fred ""
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/late/late.def b/ecflow_4_0_7/AParser/test/data/good_defs/late/late.def
new file mode 100644
index 0000000..47f138c
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/late/late.def
@@ -0,0 +1,15 @@
+suite late
+   family familyName
+      task t1
+      		late -s +00:15 -a 20:00 -c +02:00
+      task t2
+      		late -a 20:00 -c +02:00 -s +00:15
+      task t3
+      		late -c +02:00 -a 20:00  -s +00:15
+      task t4
+            late  -s 00:02 -c +00:05
+      task t5
+            late  -s 00:01 -a 14:30 -c +00:01
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/lifecycle.txt b/ecflow_4_0_7/AParser/test/data/good_defs/lifecycle.txt
new file mode 100644
index 0000000..0493bb5
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/lifecycle.txt
@@ -0,0 +1,16 @@
+suite suite1
+  family family1
+   	task a
+        event 1 myEvent
+        meter myMeter 0 100
+   	task b
+   		trigger a == complete
+   endfamily
+   family family2
+   		task aa
+   			trigger ../family1/a:myMeter >= 20 and ../family1/a:myEvent 
+   		task bb
+   			trigger ../family1/a:myMeter >= 50  or  ../family1/a:myEvent
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/limit/limit.def b/ecflow_4_0_7/AParser/test/data/good_defs/limit/limit.def
new file mode 100644
index 0000000..0d72623
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/limit/limit.def
@@ -0,0 +1,27 @@
+
+extern /limits:c1a
+extern /limits:linux_cluster
+extern /limits:pdb
+extern /limits:q2diss
+
+suite suiteName
+	limit sg1  10
+	limit mars 10
+endsuite
+
+suite obs
+    inlimit /limits:c1a
+    family limits
+    	limit hpcd 20
+    endfamily
+    
+    family anon    
+   		inlimit limits:hpcd       
+    	task t1
+    		inlimit /suiteName:sg1        # another suite limit
+   		task t2
+   			inlimit /obs/limits:hpcd      # This suite limit
+  		task t3
+   			inlimit /limits:c1a           # extern suite limit
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/limit/limit2.def b/ecflow_4_0_7/AParser/test/data/good_defs/limit/limit2.def
new file mode 100644
index 0000000..293696b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/limit/limit2.def
@@ -0,0 +1,6 @@
+
+suite pop
+  clock hybrid 0 # 24.02.2006 14:47
+  inlimit pop
+  limit pop 10
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/meter/negative.def b/ecflow_4_0_7/AParser/test/data/good_defs/meter/negative.def
new file mode 100644
index 0000000..df56227
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/meter/negative.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName
+      task taskName
+          meter myMeter  -1 100 100  # meter <name> <min> <max> [optional color change]
+     endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/meter/simple_meter.txt b/ecflow_4_0_7/AParser/test/data/good_defs/meter/simple_meter.txt
new file mode 100644
index 0000000..d8a7ecb
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/meter/simple_meter.txt
@@ -0,0 +1,7 @@
+suite suiteName
+   family familyName
+      task taskName
+          meter myMeter  0 100 100  # meter <name> <min> <max> [optional color change]
+          meter myMeter2 0 100      
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/meter/spaces.def b/ecflow_4_0_7/AParser/test/data/good_defs/meter/spaces.def
new file mode 100644
index 0000000..71e7979
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/meter/spaces.def
@@ -0,0 +1,14 @@
+suite suiteName
+   family familyName
+      task taskName
+      
+          meter myMeter  0 100 100  # meter <name> <min> <max> [optional color change]
+          
+          meter myMeter1 0 100      
+          
+          meter myMeter2 0 100      
+          
+          meter myMeter3 0 100      
+          
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_date.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_date.def
new file mode 100644
index 0000000..94be19e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_date.def
@@ -0,0 +1,6 @@
+suite suiteName
+    repeat date YMD 20090331 20121212 1 # status 0
+endsuite
+
+suite s1; repeat date YMD 20090331 20121212 1 # status 0
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_day.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_day.def
new file mode 100644
index 0000000..7336121
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_day.def
@@ -0,0 +1,3 @@
+suite suiteName
+    repeat day 1                             #status 0
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_enumerate_quotes.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_enumerate_quotes.def
new file mode 100644
index 0000000..87ea3e1
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_enumerate_quotes.def
@@ -0,0 +1,11 @@
+suite suiteName
+   
+     repeat enumerated quotes "first" "second" "third"  # sdsdsd 
+   
+endsuite
+
+suite suiteName2
+   
+     repeat enumerated quotes 'first' 'second' "third"  # sdsdsd 
+   
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_enumerated.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_enumerated.def
new file mode 100644
index 0000000..4e5d614
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_enumerated.def
@@ -0,0 +1,11 @@
+suite s1
+   
+    repeat enumerated VARIABLE first second third #sdsdsd
+   
+endsuite
+
+suite s2
+   
+    repeat enumerated VARIABLE 20130101 20130102 20130103 #sdsdsd
+   
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_file.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_file.def
new file mode 100644
index 0000000..7fc5d2e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_file.def
@@ -0,0 +1,4 @@
+suite suiteName
+ 
+    repeat file filename fred.txt   # comment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer.def
new file mode 100644
index 0000000..98a76a8
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer.def
@@ -0,0 +1,5 @@
+suite suiteName
+ 
+    repeat integer VARIABLE3_XZ 0 10 #comment
+ 
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer_1.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer_1.def
new file mode 100644
index 0000000..1571bc9
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer_1.def
@@ -0,0 +1,5 @@
+suite suiteName
+   
+    repeat integer VARIABLE_XX 0 10 2 # comment
+  
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer_2.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer_2.def
new file mode 100644
index 0000000..5bfaa90
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_integer_2.def
@@ -0,0 +1,3 @@
+suite suiteName
+     repeat integer VARIABLE_XY 0 10 # comment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_string.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_string.def
new file mode 100644
index 0000000..3319b08
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_string.def
@@ -0,0 +1,4 @@
+suite suiteName
+ 
+    repeat string VARIABLE str1 str2              #comment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_string_quotes.def b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_string_quotes.def
new file mode 100644
index 0000000..d8e0b87
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/repeat/repeat_string_quotes.def
@@ -0,0 +1,3 @@
+suite suiteName
+     repeat string quotes "str1" "str2"  "str2" # comment
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/suite/multi_statements_per_line.def b/ecflow_4_0_7/AParser/test/data/good_defs/suite/multi_statements_per_line.def
new file mode 100644
index 0000000..bfce605
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/suite/multi_statements_per_line.def
@@ -0,0 +1,16 @@
+suite suiteName;endsuite
+suite obs; endsuite
+
+suite fred; task a; task b; endsuite # a comment suite fred; task a; task b; endsuite
+
+
+suite  s1; task t1; task t2;task t3;family f1;task f1_t1;task f1_t2;endfamily;task t4
+endsuite
+
+suite  s2;task t1;task t2;task t3;family f1;task f1_t1;task f1_t2;endfamily; task t4 # comment,
+endsuite
+
+#suite fred; task a; task b; endsuite
+ #suite fred; task a; task b; endsuite
+ # suite fred; task a; task b; endsuite
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/suite/multi_suite.def b/ecflow_4_0_7/AParser/test/data/good_defs/suite/multi_suite.def
new file mode 100755
index 0000000..30688c0
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/suite/multi_suite.def
@@ -0,0 +1,8 @@
+
+suite suiteName
+ 
+endsuite
+
+suite obs
+ 
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/suite/simple_suite.txt b/ecflow_4_0_7/AParser/test/data/good_defs/suite/simple_suite.txt
new file mode 100755
index 0000000..212e987
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/suite/simple_suite.txt
@@ -0,0 +1,5 @@
+
+# this is comment
+  # this is another comment line
+suite  theSuiteName
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/suite/suite_with_hierarchy.def b/ecflow_4_0_7/AParser/test/data/good_defs/suite/suite_with_hierarchy.def
new file mode 100644
index 0000000..ac2416b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/suite/suite_with_hierarchy.def
@@ -0,0 +1,20 @@
+suite  theSuiteName
+	task t1
+	task t2
+	task t3
+	family f1
+		task f1_t1
+		task f1_t2
+	endfamily
+	task t4
+endsuite
+suite  s1
+	task t1
+	task t2
+	task t3
+	family f1
+		task f1_t1
+		task f1_t2
+	endfamily
+	task t4
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/suite/suite_with_task.def b/ecflow_4_0_7/AParser/test/data/good_defs/suite/suite_with_task.def
new file mode 100644
index 0000000..6d174d9
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/suite/suite_with_task.def
@@ -0,0 +1,5 @@
+suite  theSuiteName
+	task a
+	task b
+	task c
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/task/simple_task.txt b/ecflow_4_0_7/AParser/test/data/good_defs/task/simple_task.txt
new file mode 100644
index 0000000..331edce
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/task/simple_task.txt
@@ -0,0 +1,17 @@
+suite suiteName
+   family familyName0
+      task t1
+      task t2
+      task t4
+      task t5
+      endtask
+   endfamily
+endsuite
+
+suite s1
+   family familyName0
+      task t1 ; task t2 ;task t4 ; task t5
+      endtask
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/task/spaces.def b/ecflow_4_0_7/AParser/test/data/good_defs/task/spaces.def
new file mode 100644
index 0000000..95eed22
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/task/spaces.def
@@ -0,0 +1,12 @@
+suite suiteName
+   family familyName0
+   
+      task taskName0
+      
+      task fred
+      
+      endtask
+      
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/task/task.def b/ecflow_4_0_7/AParser/test/data/good_defs/task/task.def
new file mode 100644
index 0000000..b5909e3
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/task/task.def
@@ -0,0 +1,9 @@
+suite suiteName
+   family f
+      task t1
+      endtask
+      task t2
+      endtask
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/time/time.def b/ecflow_4_0_7/AParser/test/data/good_defs/time/time.def
new file mode 100644
index 0000000..dfdeccf
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/time/time.def
@@ -0,0 +1,16 @@
+suite suiteName
+   family familyName0
+   		time 15:00
+   		time 19:00
+   		time +15:00
+   		time 10:00 20:00 01:00
+   		time +10:00 20:00 01:00
+		task t
+   			time 15:00
+   			time 19:00
+   			time +15:00
+   			time 10:00 20:00 01:00
+   			time +10:00 20:00 01:00		   		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/time/time_1.def b/ecflow_4_0_7/AParser/test/data/good_defs/time/time_1.def
new file mode 100644
index 0000000..4004492
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/time/time_1.def
@@ -0,0 +1,20 @@
+suite suiteName
+   family f1
+      task t1
+   		time 15:00
+   		time 00:00 23:59 00:30
+         time 00:00 06:59 00:30
+      task t2
+         time 17:00
+      task t3
+         time 18:00
+         time 19:00
+         time 20:00
+   endfamily
+endsuite
+
+suite s1 
+   family familyName0
+   		time 15:00 ; time 00:00 23:59 00:30 ;time 00:00 06:59 00:30
+   endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/time/time_2.def b/ecflow_4_0_7/AParser/test/data/good_defs/time/time_2.def
new file mode 100644
index 0000000..396f77e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/time/time_2.def
@@ -0,0 +1,11 @@
+suite suiteName
+   family familyName0
+		task t
+   			time 15:00
+   			time 19:00
+   			time +15:00
+   			time 10:00 20:00 01:00
+   			time +10:00 20:00 01:00		   		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/today/today.def b/ecflow_4_0_7/AParser/test/data/good_defs/today/today.def
new file mode 100644
index 0000000..a77a7a6
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/today/today.def
@@ -0,0 +1,14 @@
+suite suiteName
+   family familyName0
+   		today 15:00
+   		today 00:00 23:59 00:30
+        today 00:00 06:59 00:30
+   endfamily
+endsuite
+
+suite s1
+   family familyName0
+   		today 15:00 ; today 00:00 23:59 00:30
+        today 00:00 06:59 00:30
+   endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/today/today1.def b/ecflow_4_0_7/AParser/test/data/good_defs/today/today1.def
new file mode 100644
index 0000000..05bd7eb
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/today/today1.def
@@ -0,0 +1,16 @@
+suite suiteName
+   family familyName0
+   		today 15:00            #comment
+   		today 19:00
+   		today 15:00
+   		today 10:00 20:00 01:00
+   		today 10:00 20:00 01:00
+		task t
+   			today 15:00
+   			today 19:00
+   			today 15:00
+   			today 10:00 20:00 01:00
+   			today 10:00 20:00 01:00		   		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/trigger/anded_ored.def b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/anded_ored.def
new file mode 100644
index 0000000..3f62a08
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/anded_ored.def
@@ -0,0 +1,12 @@
+suite suite
+    family family
+    	task t1
+    	task t2
+		task a             
+         	event eventName 
+    	task b             
+   			trigger t1  == complete                  # a comment at end of trigger
+   			trigger -a t2  == complete               # a comment at end of trigger
+   			trigger -o a  == complete               # a comment at end of trigger
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/trigger/complex_hier.def b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/complex_hier.def
new file mode 100644
index 0000000..05a3602
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/complex_hier.def
@@ -0,0 +1,34 @@
+# test node referencing in triggers
+suite s1
+  family f1
+     family f2
+        family f3
+           family f4
+              task a
+                 event 1 theEventName
+                 meter myMeter 0 100
+            endfamily   
+         endfamily
+      endfamily
+   endfamily
+   family f0
+      task c
+         # The initial .. means parents parent( i.e /s1 in this case)
+         # i.e task 'c' parents parent is suite 's1'
+         trigger  ../f1/f2/f3/f4/a == complete
+         complete ../f1/f2/f3/f4/a:myMeter >= 10
+      family f1
+         family f2
+            family f3
+               family f4
+                  # ..          -> /s1/f0/f1/f2    The initial .. means parents parent 
+                  # ../..       -> /s1/f0/f1
+                  # ../../..    -> /s1/f0
+                  # ../../../.. -> /s1
+                  trigger ../../../../f1/f2/f3/f4/a == complete
+            endfamily
+         endfamily
+      endfamily
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/trigger/complex_trigger.txt b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/complex_trigger.txt
new file mode 100644
index 0000000..ce6156f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/complex_trigger.txt
@@ -0,0 +1,60 @@
+extern /a/b/c/d         
+extern /a/b/c/d/e:event        
+extern /a/b/c/d/e:meter        
+
+suite suiteName
+  family familyName
+   		task a
+        	event 1 theEventName
+         	meter myMeter 0 100
+   		task b
+     	family heir_familyName
+         	task taskName0
+            	event 0 
+            	event 1 eventName
+            	meter myMeter 0 100
+      	endfamily
+   endfamily
+   family familyName1
+   		trigger familyName == complete                      # this is a comment
+   		task a
+         	event 1 theEventName
+         	event aEvent
+         	meter myMeter 0 100
+   		task b
+   			trigger ./a == unknown
+   		task c
+   			trigger ../familyName/a == complete
+   		task d
+   			trigger ../familyName/b == aborted
+   		task e
+   			trigger (a == complete and b == complete)
+   		task f
+   			trigger (a == complete and b == complete or ../familyName/a == complete)
+   		task g
+   			trigger a:theEventName and a:aEvent
+   		task h
+   			trigger a:myMeter >= 10
+   		task i
+   			trigger ../familyName/a:myMeter <= 30
+   		task j
+   			trigger a == complete                      # this is a comment
+   		task k
+   		    trigger (a == complete and b == complete) or (c == complete and d == complete)
+   		task l
+   			trigger (a == complete and b == complete) or ../familyName/a:theEventName == set
+   		task m
+   			trigger ../familyName/heir_familyName/taskName0 == complete
+   		task n
+   			trigger ../familyName/heir_familyName/taskName0:myMeter >= 10  	     # relative path
+  		task o
+   			trigger /suiteName/familyName/heir_familyName/taskName0:myMeter >= 10  # absolute path
+  		task p
+   			trigger /a/b/c/d == complete  		                                   # extern path
+  		task q
+   			trigger /a/b/c/d/e:event == set  		                                # extern event path
+ 		task r
+   			trigger /a/b/c/d/e:meter le 30		                                   # extern meter path
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/trigger/extension.def b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/extension.def
new file mode 100644
index 0000000..68e73b2
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/extension.def
@@ -0,0 +1,12 @@
+ 
+suite suiteName
+  family familyName
+  	    task b
+  	    task c
+   		task a
+   			trigger a == complete and \
+   			        b == complete and\
+   			        c == complete
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/trigger/simple_trigger.txt b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/simple_trigger.txt
new file mode 100644
index 0000000..2949c93
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/simple_trigger.txt
@@ -0,0 +1,8 @@
+suite suiteName
+    family familyName1
+		task a             
+         	event eventName 
+    	task b             
+   			trigger a  == complete                  # a comment at end of trigger
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/trigger/trigger_references.def b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/trigger_references.def
new file mode 100644
index 0000000..8fe3e34
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/trigger/trigger_references.def
@@ -0,0 +1,10 @@
+suite pontus
+  family acq
+    task data
+      trigger wait/wait:data
+    family wait
+      task wait
+        event data
+    endfamily
+  endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/variable/alias.def b/ecflow_4_0_7/AParser/test/data/good_defs/variable/alias.def
new file mode 100644
index 0000000..7165441
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/variable/alias.def
@@ -0,0 +1,49 @@
+#  
+defs_state MIGRATE
+
+# The file can be of different styles:
+#    DEFS: This is the structure only (default), 
+#          when we write out defs to disk, this will exclude aliases.
+#          Hence we use 
+#             defs_state MIGRATE
+#          So that when *testing*, we write out the defs in the state state in meant to be loaded
+#   STATE: structure + state
+#   MIGRATE: structure + state (No checking, and no externs )
+    
+# ===============================================================================
+# This will test that for alias we allow _variables_ names *without* checking
+# i.e for tasks EDACLASS:"od" would be an illegal variable name
+# ===============================================================================
+suite suiteName
+
+  task t1
+    alias alias0
+    
+         edit SMSURLCMD '${BROWSER:=firefox} -remote 'openURL(%SMSURLBASE%/%SMSURL%)'' # comment
+   
+         edit VAR  "value !£$%^&*() ~@: ?><,."   #comment
+   
+         edit VAR1 '123'
+   
+         edit VAR2 value2
+   
+         edit VAR3 ""
+         edit VAR55 ''
+         edit VAR56 '#'
+         edit VAR57 "#"
+         
+         # alias show allow variable names with invalid names
+         edit name:1 '1'
+         edit namx$1 '1'
+         
+         
+        edit DO_PUSH_TO_WEB:yes 'yes'
+        edit ECF_HOME:0 '/vol/emos_nc/output'
+        edit ECF_OUT:0 '/vol/emos_nc/output'
+        edit EDACLASS:"od" 'od'
+        edit EDACLASS:undef 'od'
+        edit EDAEXPVER:"0001" '0001'
+        
+    endalias
+endsuite
+ 
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/variable/duplicate.def b/ecflow_4_0_7/AParser/test/data/good_defs/variable/duplicate.def
new file mode 100644
index 0000000..09b0fe7
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/variable/duplicate.def
@@ -0,0 +1,4 @@
+suite suiteName
+   edit VAR2 value2
+   edit VAR2 value3     # allow duplicates to update the last value
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/variable/variable.txt b/ecflow_4_0_7/AParser/test/data/good_defs/variable/variable.txt
new file mode 100644
index 0000000..77f1d2b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/variable/variable.txt
@@ -0,0 +1,24 @@
+suite suiteName
+ 
+   edit SMSURLCMD '${BROWSER:=firefox} -remote 'openURL(%SMSURLBASE%/%SMSURL%)''
+   
+   edit VAR  "value !£$%^&*() ~@: ?><,."
+   
+   edit VAR1 '123'
+   
+   edit VAR2 value2
+   
+   edit VAR3 ""
+   edit VAR55 ''
+   edit VAR56 '#'
+   edit VAR57 "#"
+
+endsuite
+
+suite s1
+ 
+   edit SMSURLCMD '${BROWSER:=firefox} -remote 'openURL(%SMSURLBASE%/%SMSURL%)''; edit VAR  "value !£$%^&*() ~@: ?><,."
+   
+   edit VAR1 '123'; edit VAR2 value2
+   
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/verify/verify.def b/ecflow_4_0_7/AParser/test/data/good_defs/verify/verify.def
new file mode 100644
index 0000000..6935e2e
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/verify/verify.def
@@ -0,0 +1,32 @@
+
+suite suiteName
+   verify complete:3 
+   verify unknown:3 
+   verify queued:3 
+   verify aborted:3 
+   verify submitted:3 
+    verify active:3 
+   family f
+    	verify complete:3 
+   		verify unknown:3 
+   		verify queued:3 
+   		verify aborted:3 
+   		verify submitted:3 
+   		verify active:3 
+      task t1
+    		verify complete:3 
+   			verify unknown:3 
+   			verify queued:3 
+   			verify aborted:3 
+   			verify submitted:3 
+    			verify active:3 
+      task t2
+    		verify complete:3 
+   			verify unknown:3 
+   			verify queued:3 
+   			verify aborted:3 
+   			verify submitted:3 
+   			verify active:3 
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs/zombie/zombie.def b/ecflow_4_0_7/AParser/test/data/good_defs/zombie/zombie.def
new file mode 100644
index 0000000..a23ab5f
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs/zombie/zombie.def
@@ -0,0 +1,21 @@
+suite suiteName
+   zombie ecf:fob:init:100
+   zombie path:fail:init:100
+   zombie user:adopt:meter:100
+
+   task t1
+     zombie ecf:remove::
+     zombie path:block:wait:
+     zombie user:fob:complete:
+
+   task t2
+     zombie ecf:fob::
+     zombie path:fail::
+     zombie user:adopt::
+    
+   task t3
+     zombie ecf:remove:init,event,meter,label,wait,complete:2000     # comment
+     zombie path:::0
+     zombie user:::0
+endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/good_defs_state/defs/defs_state.def b/ecflow_4_0_7/AParser/test/data/good_defs_state/defs/defs_state.def
new file mode 100644
index 0000000..767c651
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/good_defs_state/defs/defs_state.def
@@ -0,0 +1,4 @@
+# 2.0.31 
+defs_state STATE state:unknown flag: state_change:17 modify_change:0 server_state:SHUTDOWN
+  edit ECF_MICRO '%'
+  edit ECF_HOME '/var/tmp/ma0/clientRoot/workspace/MyProject'
diff --git a/ecflow_4_0_7/AParser/test/data/single_defs/ealadin.def b/ecflow_4_0_7/AParser/test/data/single_defs/ealadin.def
new file mode 100644
index 0000000..8171f75
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/single_defs/ealadin.def
@@ -0,0 +1,3671 @@
+extern /limits:mars
+extern /limits:localhost
+extern /limits:c1b
+extern /limits:linux_cluster
+extern /limits:swarm
+extern /limits:ha_pp
+extern /limits:ecfs
+extern /limits:obs_get
+extern /limits:pdb
+extern /limits:q2diss
+extern /limits:pdb_bc
+extern /limits:q2diss_bc
+extern /limits:rebuild
+extern /o/main/12/fc
+extern /o/main/12/fc/model:step
+extern /o/main:YMD
+extern /o/main/18/fc
+extern /o/main/18/fc/model:step
+extern /o/main/00/fc
+extern /o/main/00/fc/model:step
+extern /o/main/06/fc
+extern /o/main/06/fc/model:step
+extern /o/main/12bc/fc
+extern /o/main/12bc/fc/model:step
+extern /o/main/18bc/fc
+extern /o/main/18bc/fc/model:step
+extern /o/main/00bc/fc
+extern /o/main/00bc/fc/model:step
+extern /o/main/06bc/fc
+extern /o/main/06bc/fc/model:step
+
+suite ealadin
+  #defstatus suspended
+  edit QUEUE 'ts'
+  edit QUEUE_EPILOG 'SC_QUEUE_EPILOG'
+  edit ECFCMD 'smssubmit %USER% %SCHOST% %ECFJOB% %ECFJOBOUT%'
+  edit ECFKILL 'smskill %USER% %SCHOST% %ECFRID% %ECFJOB% %ECFJOBOUT%'
+  edit ECFSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %ECFRID% %ECFJOB%'
+  edit LOGDIR '/s1a/emos_esuite/emos_data/0047/log'
+  edit ECFOUT '/s1a/emos_esuite/emos_data/0047/log'
+  edit THREADS_FRA '6'
+  edit THREADS_LBC '6'
+  edit EMOS_TIME_STEP_H 'undef'
+  edit STREAM 'undef'
+  edit ECF_URLBASE 'http://www.ecmwf.int'
+  edit NB_TASKS_FRA '38'
+  edit SCLOGDIR '/s1a/emos_esuite/emos_data/0047/log'
+  edit USER 'emos'
+  edit STHOST_BKUP '/s1b'
+  edit DATEMASK '*.*.*'
+  edit CALL_ECPDS 'false'
+  edit EXPVER '0047'
+  edit MEMBER '-1'
+  edit ECF_OUT '/vol/emos_nc/output'
+  edit FSFAMILY 'undef'
+  edit USE_YMD 'true'
+  edit ECF_URLCMD '${BROWSER:=firefox} -remote 'openURL(%ECF_URLBASE%/%ECF_URL%)''
+  edit NB_TASKS_LBC '32'
+  edit DELTA_DAY '0'
+  edit STHOST '/s1a'
+  edit VERSION '%EXPVER%'
+  edit SCHOST_BKUP 'c1b'
+  edit ACCOUNT_FRA 'oesu'
+  edit MEM '2500'
+  edit EPSTYPE 'undef'
+  edit ACCOUNT_LBC 'oesu'
+  edit ALADIN_STEP '-1'
+  edit ECF_LOGHOST 'localhost'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit INIEXPVER '0001'
+  edit WSHOST 'localhost'
+  edit ECF_URL 'index.html'
+  edit THREADS '1'
+  edit SCHOST 'localhost'
+  edit ECF_LOGPORT '9316'
+  edit REAL_TIME '1'
+  edit FIRST_DAY '0'
+  inlimit /limits:localhost
+  family limits
+    defstatus complete
+    limit limiter 1
+    limit oper 7
+    limit bkup 7
+    limit clst 7
+    limit lbc 26
+    limit main 84
+    limit 927 21
+    limit subd 21
+    limit init 7
+  endfamily
+  family main
+    repeat date YMD 20100607 20201212 1
+    edit LOGTASK 'main'
+    edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+    edit ECPDS_STREAM 'JSN2'
+    edit DESTINATION 'FRA'
+    family 12
+      edit ACCOUNT '%ACCOUNT_FRA%'
+      edit NB_TASKS '%NB_TASKS_FRA%'
+      edit STREAM 'oper'
+      edit EMOS_BASE '1'
+      edit ECF_URL 'FRA/ALADIN/12'
+      inlimit /ealadin/limits:main
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/main:YMD
+        edit EMOS_BASE '1'
+        task external
+          defstatus complete
+          complete /o/main/12/fc eq complete or /o/main/12/fc/model:step gt 42
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 17:58
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 42 42
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 42 42
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 42 42
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../00/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 42 42
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 42 42
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 42 42
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../00/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../03/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 42 42
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 42 42
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 42 42
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../03/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 42 42
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '17:58'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '17:58'
+        limit mutex 1
+        inlimit prod:mutex
+        family fra
+          edit DESTINATION 'FRA'
+          edit ECF_URL 'FRA/ALADIN/12'
+          task ecpds
+            edit ECPDS_STREAM 'JSN2'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    family 18
+      edit ACCOUNT '%ACCOUNT_FRA%'
+      edit NB_TASKS '%NB_TASKS_FRA%'
+      edit STREAM 'scda'
+      edit EMOS_BASE '1'
+      edit ECF_URL 'FRA/ALADIN/18'
+      inlimit /ealadin/limits:main
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/main:YMD
+        edit EMOS_BASE '1'
+        task external
+          defstatus complete
+          complete /o/main/18/fc eq complete or /o/main/18/fc/model:step gt 60
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 00:00
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 60 60
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../00/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 60 60
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../00/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../03/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 60 60
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../03/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 42
+          edit ALADIN_STEP '42'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 45
+          edit ALADIN_STEP '45'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 48
+          edit ALADIN_STEP '48'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 51
+          edit ALADIN_STEP '51'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 54
+          edit ALADIN_STEP '54'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 57
+          edit ALADIN_STEP '57'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '00:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '00:00'
+        limit mutex 1
+        inlimit prod:mutex
+        family fra
+          edit DESTINATION 'FRA'
+          edit ECF_URL 'FRA/ALADIN/18'
+          task ecpds
+            edit ECPDS_STREAM 'JSN2'
+            edit ECPDS_OPER 'false'
+            edit CALL_ECPDS 'false'
+            edit TO_ECPDS 'false'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    family 00
+      edit ACCOUNT '%ACCOUNT_FRA%'
+      edit NB_TASKS '%NB_TASKS_FRA%'
+      edit DELTA_DAY '1'
+      edit STREAM 'oper'
+      edit EMOS_BASE '0'
+      edit ECF_URL 'FRA/ALADIN/00'
+      inlimit /ealadin/limits:main
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/main:YMD
+        edit EMOS_BASE '0'
+        task external
+          defstatus complete
+          complete /o/main/00/fc eq complete or /o/main/00/fc/model:step gt 54
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 06:01
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 54 54
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 54 54
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 54 54
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../00/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 54 54
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 54 54
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 54 54
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../00/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../03/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 54 54
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 54 54
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 54 54
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../03/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 42
+          edit ALADIN_STEP '42'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 45
+          edit ALADIN_STEP '45'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 48
+          edit ALADIN_STEP '48'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 51
+          edit ALADIN_STEP '51'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 54 54
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '06:01'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '06:01'
+        limit mutex 1
+        inlimit prod:mutex
+        family fra
+          edit DESTINATION 'FRA'
+          edit ECF_URL 'FRA/ALADIN/00'
+          task ecpds
+            edit ECPDS_STREAM 'JSN2'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    family 06
+      edit ACCOUNT '%ACCOUNT_FRA%'
+      edit NB_TASKS '%NB_TASKS_FRA%'
+      edit DELTA_DAY '1'
+      edit STREAM 'scda'
+      edit EMOS_BASE '0'
+      edit ECF_URL 'FRA/ALADIN/06'
+      inlimit /ealadin/limits:main
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/main:YMD
+        edit EMOS_BASE '0'
+        task external
+          defstatus complete
+          complete /o/main/06/fc eq complete or /o/main/06/fc/model:step gt 60
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 12:00
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 60 60
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../00/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 60 60
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../00/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../03/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+          family subd
+            trigger ./927 eq active or ./927 eq complete
+            inlimit /ealadin/limits:subd
+            family poly
+              edit DOM 'polyf'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family antg
+              edit DOM 'antig'
+              task 927
+                meter step -1 60 60
+            endfamily
+            family ncal
+              edit DOM 'ncal'
+              task 927
+                meter step -1 60 60
+            endfamily
+            task ecpds
+              defstatus complete
+              trigger ./poly==complete and ./antg==complete and ./ncal==complete
+              trigger -a ../../03/subd/ecpds eq complete
+              edit DOM 'polyf antig ncal'
+              label scheduled ""
+          endfamily
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 42
+          edit ALADIN_STEP '42'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 45
+          edit ALADIN_STEP '45'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 48
+          edit ALADIN_STEP '48'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 51
+          edit ALADIN_STEP '51'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 54
+          edit ALADIN_STEP '54'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+        family 57
+          edit ALADIN_STEP '57'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_FRA%'
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            inlimit /ealadin/limits:927
+            meter step -1 60 60
+          task ecpds
+            defstatus complete
+            trigger ./927 eq complete
+            trigger -a ../06/ecpds eq complete
+            edit ECPDS_AT '12:00'
+            edit DOM 'francecep'
+            label scheduled ""
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '12:00'
+        limit mutex 1
+        inlimit prod:mutex
+        family fra
+          edit DESTINATION 'FRA'
+          edit ECF_URL 'FRA/ALADIN/06'
+          task ecpds
+            edit ECPDS_STREAM 'JSN2'
+            edit ECPDS_OPER 'false'
+            edit CALL_ECPDS 'false'
+            edit TO_ECPDS 'false'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    task logfilestore
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit KEEPLOGS 'no'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit ECFCMD 'smssubmit %USER% %WSHOST% %ECFJOB% %ECFJOBOUT%'
+      edit ECFKILL 'smskill %USER% %WSHOST% %ECFRID% %ECFJOB% %ECFJOBOUT%'
+      edit ECFSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %ECFRID% %ECFJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit ECFOUT '/vol/emos_nc/output'
+    task logfiles
+      trigger ./12==complete and ./18==complete and ./00==complete and ./06==complete and ./logfilestore==complete
+      edit MOVE_TO_ECFS 'no'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit ECFCMD 'smssubmit %USER% %WSHOST% %ECFJOB% %ECFJOBOUT%'
+      edit ECFKILL 'smskill %USER% %WSHOST% %ECFRID% %ECFJOB% %ECFJOBOUT%'
+      edit ECFSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %ECFRID% %ECFJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit ECFOUT '/vol/emos_nc/output'
+      edit ACCOUNT 'oesu'
+      time 12:30
+  endfamily
+  family lbc
+    repeat date YMD 20100607 20201212 1
+    edit LOGTASK 'lbc'
+    family 12bc
+      task clean
+        edit ACCOUNT '%ACCOUNT_LBC%'
+        edit NB_TASKS '%NB_TASKS_LBC%'
+        edit STREAM 'oper'
+        edit EMOS_BASE '1'
+        inlimit /ealadin/limits:lbc
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/lbc:YMD
+        edit EMOS_BASE '1'
+        task external
+          defstatus complete
+          complete /o/main/12bc/fc eq complete or /o/main/12bc/fc/model:step gt 72
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 18:06
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 42
+          edit ALADIN_STEP '42'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 45
+          edit ALADIN_STEP '45'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 48
+          edit ALADIN_STEP '48'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 51
+          edit ALADIN_STEP '51'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 54
+          edit ALADIN_STEP '54'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 57
+          edit ALADIN_STEP '57'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 60
+          edit ALADIN_STEP '60'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 63
+          edit ALADIN_STEP '63'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 66
+          edit ALADIN_STEP '66'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 69
+          edit ALADIN_STEP '69'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '18:06'
+        limit mutex 1
+        inlimit prod:mutex
+        family hun
+          edit DESTINATION 'HUN'
+          edit ECF_URL 'HUN/ALADIN/1'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family czm
+          edit DESTINATION 'CZM'
+          edit ECF_URL 'CZM/ALADIN/1'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family sli
+          edit DESTINATION 'SLI'
+          edit ECF_URL 'SLI/ALADIN/1'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family aus
+          edit DESTINATION 'AUS'
+          edit ECF_URL 'AUS/ALADIN/1'
+          task ecpds
+            edit ECPDS_OPER 'false'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    family 18bc
+      task clean
+        edit ACCOUNT '%ACCOUNT_LBC%'
+        edit NB_TASKS '%NB_TASKS_LBC%'
+        edit STREAM 'SCDA'
+        edit EMOS_BASE '1'
+        inlimit /ealadin/limits:lbc
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/lbc:YMD
+        edit EMOS_BASE '1'
+        task external
+          defstatus complete
+          complete /o/main/18bc/fc eq complete or /o/main/18bc/fc/model:step gt 72
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 00:06
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 42
+          edit ALADIN_STEP '42'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 45
+          edit ALADIN_STEP '45'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 48
+          edit ALADIN_STEP '48'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 51
+          edit ALADIN_STEP '51'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 54
+          edit ALADIN_STEP '54'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 57
+          edit ALADIN_STEP '57'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 60
+          edit ALADIN_STEP '60'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 63
+          edit ALADIN_STEP '63'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 66
+          edit ALADIN_STEP '66'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 69
+          edit ALADIN_STEP '69'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '00:06'
+        limit mutex 1
+        inlimit prod:mutex
+        family hun
+          edit DESTINATION 'HUN'
+          edit ECF_URL 'HUN/ALADIN/1'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family czm
+          edit DESTINATION 'CZM'
+          edit ECF_URL 'CZM/ALADIN/1'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family sli
+          edit DESTINATION 'SLI'
+          edit ECF_URL 'SLI/ALADIN/1'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family aus
+          edit DESTINATION 'AUS'
+          edit ECF_URL 'AUS/ALADIN/1'
+          task ecpds
+            edit ECPDS_OPER 'false'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    family 00bc
+      task clean
+        edit ACCOUNT '%ACCOUNT_LBC%'
+        edit NB_TASKS '%NB_TASKS_LBC%'
+        edit DELTA_DAY '1'
+        edit STREAM 'oper'
+        edit EMOS_BASE '0'
+        inlimit /ealadin/limits:lbc
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/lbc:YMD
+        edit EMOS_BASE '0'
+        task external
+          defstatus complete
+          complete /o/main/00bc/fc eq complete or /o/main/00bc/fc/model:step gt 72
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 06:06
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 42
+          edit ALADIN_STEP '42'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 45
+          edit ALADIN_STEP '45'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 48
+          edit ALADIN_STEP '48'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 51
+          edit ALADIN_STEP '51'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 54
+          edit ALADIN_STEP '54'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 57
+          edit ALADIN_STEP '57'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 60
+          edit ALADIN_STEP '60'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 63
+          edit ALADIN_STEP '63'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 66
+          edit ALADIN_STEP '66'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 69
+          edit ALADIN_STEP '69'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '06:06'
+        limit mutex 1
+        inlimit prod:mutex
+        family hun
+          edit DESTINATION 'HUN'
+          edit ECF_URL 'HUN/ALADIN/0'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family czm
+          edit DESTINATION 'CZM'
+          edit ECF_URL 'CZM/ALADIN/0'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family sli
+          edit DESTINATION 'SLI'
+          edit ECF_URL 'SLI/ALADIN/0'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family aus
+          edit DESTINATION 'AUS'
+          edit ECF_URL 'AUS/ALADIN/0'
+          task ecpds
+            edit ECPDS_OPER 'false'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    family 06bc
+      task clean
+        edit ACCOUNT '%ACCOUNT_LBC%'
+        edit NB_TASKS '%NB_TASKS_LBC%'
+        edit DELTA_DAY '1'
+        edit STREAM 'SCDA'
+        edit EMOS_BASE '0'
+        inlimit /ealadin/limits:lbc
+      family ref
+        defstatus complete
+        complete /o/main:YMD gt /ealadin/lbc:YMD
+        edit EMOS_BASE '0'
+        task external
+          defstatus complete
+          complete /o/main/06bc/fc eq complete or /o/main/06bc/fc/model:step gt 72
+          trigger 0==1
+        family timed
+          complete /ealadin:REAL_TIME eq 0
+          time 12:06
+          task dummy
+            complete 1==1
+        endfamily
+      endfamily
+      family prl
+        trigger ref eq complete
+        family 00
+          edit ALADIN_STEP '00'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 03
+          edit ALADIN_STEP '03'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 06
+          edit ALADIN_STEP '06'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 09
+          edit ALADIN_STEP '09'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 12
+          edit ALADIN_STEP '12'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 15
+          edit ALADIN_STEP '15'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 18
+          edit ALADIN_STEP '18'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 21
+          edit ALADIN_STEP '21'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 24
+          edit ALADIN_STEP '24'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 27
+          edit ALADIN_STEP '27'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 30
+          edit ALADIN_STEP '30'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 33
+          edit ALADIN_STEP '33'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 36
+          edit ALADIN_STEP '36'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 39
+          edit ALADIN_STEP '39'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 42
+          edit ALADIN_STEP '42'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 45
+          edit ALADIN_STEP '45'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 48
+          edit ALADIN_STEP '48'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 51
+          edit ALADIN_STEP '51'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 54
+          edit ALADIN_STEP '54'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 57
+          edit ALADIN_STEP '57'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 60
+          edit ALADIN_STEP '60'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 63
+          edit ALADIN_STEP '63'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 66
+          edit ALADIN_STEP '66'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+        family 69
+          edit ALADIN_STEP '69'
+          task init
+            inlimit /ealadin/limits:init
+          task 901
+            trigger init ==complete
+            edit THREADS '%THREADS_LBC%'
+            meter step -1 72 72
+          task 927
+            trigger ./901==complete
+            edit DOM 'francecep'
+            meter step -1 72 72
+        endfamily
+      endfamily
+      family prod
+        defstatus complete
+        trigger prl eq complete
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit TO_ECFS 'false'
+        edit ECPDS_AT '12:06'
+        limit mutex 1
+        inlimit prod:mutex
+        family hun
+          edit DESTINATION 'HUN'
+          edit ECF_URL 'HUN/ALADIN/0'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family czm
+          edit DESTINATION 'CZM'
+          edit ECF_URL 'CZM/ALADIN/0'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family sli
+          edit DESTINATION 'SLI'
+          edit ECF_URL 'SLI/ALADIN/0'
+          task ecpds
+            label scheduled ""
+        endfamily
+        family aus
+          edit DESTINATION 'AUS'
+          edit ECF_URL 'AUS/ALADIN/0'
+          task ecpds
+            edit ECPDS_OPER 'false'
+            label scheduled ""
+        endfamily
+      endfamily
+    endfamily
+    task logfilestore
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit KEEPLOGS 'no'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit ECFCMD 'smssubmit %USER% %WSHOST% %ECFJOB% %ECFJOBOUT%'
+      edit ECFKILL 'smskill %USER% %WSHOST% %ECFRID% %ECFJOB% %ECFJOBOUT%'
+      edit ECFSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %ECFRID% %ECFJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit ECFOUT '/vol/emos_nc/output'
+    task logfiles
+      trigger ./12bc==complete and ./18bc==complete and ./00bc==complete and ./06bc==complete and ./logfilestore==complete
+      edit MOVE_TO_ECFS 'no'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit ECFCMD 'smssubmit %USER% %WSHOST% %ECFJOB% %ECFJOBOUT%'
+      edit ECFKILL 'smskill %USER% %WSHOST% %ECFRID% %ECFJOB% %ECFJOBOUT%'
+      edit ECFSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %ECFRID% %ECFJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit ECFOUT '/vol/emos_nc/output'
+      edit ACCOUNT 'oesu'
+      time 12:30
+  endfamily
+  family lag
+    repeat date YMD 20100607 20201212 1
+    edit LOGTASK 'lag'
+    family 12
+      task clean
+      task ecpds
+        trigger /ealadin/main/12 eq complete
+        trigger -a /ealadin/main:YMD eq /ealadin/lag:YMD
+        trigger -a /ealadin/main:YMD gt /ealadin/lag:YMD
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit ECPDS_STREAM 'JSN2'
+        edit DESTINATION 'FRA'
+        edit CALL_ECPDS 'false'
+        edit ECPDS_AT '12:06'
+        edit ECPDS_OPER 'false'
+        edit TO_ECFS 'true'
+        edit ECF_URL ' FRA/ALADIN/12'
+        edit TO_ECPDS 'false'
+        edit ACCOUNT '%ACCOUNT_FRA%'
+        edit NB_TASKS '%NB_TASKS_FRA%'
+        edit STREAM 'oper'
+        edit EMOS_BASE '1'
+        inlimit /ealadin/limits:main
+        label scheduled ""
+    endfamily
+    family 18
+      task clean
+      task ecpds
+        trigger /ealadin/main/18 eq complete
+        trigger -a /ealadin/main:YMD eq /ealadin/lag:YMD
+        trigger -a /ealadin/main:YMD gt /ealadin/lag:YMD
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit ECPDS_STREAM 'JSN2'
+        edit DESTINATION 'FRA'
+        edit CALL_ECPDS 'false'
+        edit ECPDS_AT '17:58'
+        edit ECPDS_OPER 'false'
+        edit TO_ECFS 'true'
+        edit ECF_URL ' FRA/ALADIN/18'
+        edit TO_ECPDS 'false'
+        edit ACCOUNT '%ACCOUNT_FRA%'
+        edit NB_TASKS '%NB_TASKS_FRA%'
+        edit STREAM 'scda'
+        edit EMOS_BASE '1'
+        inlimit /ealadin/limits:main
+        label scheduled ""
+    endfamily
+    family 00
+      task clean
+      task ecpds
+        trigger /ealadin/main/00 eq complete
+        trigger -a /ealadin/main:YMD eq /ealadin/lag:YMD
+        trigger -a /ealadin/main:YMD gt /ealadin/lag:YMD
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit ECPDS_STREAM 'JSN2'
+        edit DESTINATION 'FRA'
+        edit CALL_ECPDS 'false'
+        edit ECPDS_AT '00:00'
+        edit ECPDS_OPER 'false'
+        edit TO_ECFS 'true'
+        edit ECF_URL ' FRA/ALADIN/00'
+        edit TO_ECPDS 'false'
+        edit ACCOUNT '%ACCOUNT_FRA%'
+        edit NB_TASKS '%NB_TASKS_FRA%'
+        edit DELTA_DAY '1'
+        edit STREAM 'oper'
+        edit EMOS_BASE '0'
+        inlimit /ealadin/limits:main
+        label scheduled ""
+    endfamily
+    family 06
+      task clean
+      task ecpds
+        trigger /ealadin/main/06 eq complete
+        trigger -a /ealadin/main:YMD eq /ealadin/lag:YMD
+        trigger -a /ealadin/main:YMD gt /ealadin/lag:YMD
+        edit ECF_URLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+        edit ECPDS_STREAM 'JSN2'
+        edit DESTINATION 'FRA'
+        edit CALL_ECPDS 'false'
+        edit ECPDS_AT '06:01'
+        edit ECPDS_OPER 'false'
+        edit TO_ECFS 'true'
+        edit ECF_URL ' FRA/ALADIN/06'
+        edit TO_ECPDS 'false'
+        edit ACCOUNT '%ACCOUNT_FRA%'
+        edit NB_TASKS '%NB_TASKS_FRA%'
+        edit DELTA_DAY '1'
+        edit STREAM 'scda'
+        edit EMOS_BASE '0'
+        inlimit /ealadin/limits:main
+        label scheduled ""
+    endfamily
+    task logfilestore
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit KEEPLOGS 'no'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit ECFCMD 'smssubmit %USER% %WSHOST% %ECFJOB% %ECFJOBOUT%'
+      edit ECFKILL 'smskill %USER% %WSHOST% %ECFRID% %ECFJOB% %ECFJOBOUT%'
+      edit ECFSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %ECFRID% %ECFJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit ECFOUT '/vol/emos_nc/output'
+    task logfiles
+      trigger ./12==complete and ./18==complete and ./00==complete and ./06==complete and ./logfilestore==complete
+      edit MOVE_TO_ECFS 'no'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit ECFCMD 'smssubmit %USER% %WSHOST% %ECFJOB% %ECFJOBOUT%'
+      edit ECFKILL 'smskill %USER% %WSHOST% %ECFRID% %ECFJOB% %ECFJOBOUT%'
+      edit ECFSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %ECFRID% %ECFJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit ECFOUT '/vol/emos_nc/output'
+      edit ACCOUNT 'oesu'
+      time 12:30
+  endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/single_defs/mega.def b/ecflow_4_0_7/AParser/test/data/single_defs/mega.def
new file mode 100644
index 0000000..9940474
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/single_defs/mega.def
@@ -0,0 +1,194073 @@
+# 4.0.6
+extern /e_36r1/main/00/an
+extern /e_36r1/main/00/an/4dvar
+extern /e_36r1/main/00/an/4dvar/ifstraj:finalwave
+extern /e_36r1/main/00/an/4dvar/uptraj_0
+extern /e_36r1/main/00/an/surf_anal/slwet
+extern /e_36r1/main/00/an/surf_anal/sst
+extern /e_36r1/main/00/fc/model
+extern /e_36r1/main/00/getreq
+extern /e_36r1/main/00/obs/get/get_stor
+extern /e_36r1/main/00/prod/240/prod_wparam
+extern /e_36r1/main/00dc/fc/model
+extern /e_36r1/main/00dc/fc/model:step
+extern /e_36r1/main/12/an
+extern /e_36r1/main/12/an/4dvar
+extern /e_36r1/main/12/an/4dvar/ifstraj:finalwave
+extern /e_36r1/main/12/an/4dvar/uptraj_0
+extern /e_36r1/main/12/an/surf_anal/slwet
+extern /e_36r1/main/12/an/surf_anal/sst
+extern /e_36r1/main/12/fc/model
+extern /e_36r1/main/12/getreq
+extern /e_36r1/main/12/obs/get/get_stor
+extern /e_36r1/main/12/prod/240/prod_wparam
+extern /e_36r1/main/12dc/fc/model
+extern /e_36r1/main/12dc/fc/model:step
+extern /e_36r1/main:YMD
+extern /ecgems/f93i/an/lag/00/archive
+extern /ecgems/f93i/an/lag:YMD
+extern /emc_36r1/main/00/legB/prod
+extern /emc_36r1/main/12/legB/prod
+extern /limits:c1a
+extern /limits:c1b
+extern /limits:hpce
+extern /limits:hpcf
+extern /limits:linux_cluster
+extern /limits:mars
+extern /limits:obs_get
+extern /limits:pdb
+extern /limits:pdb_bc
+extern /limits:prod
+extern /limits:q2diss
+extern /limits:q2diss_bc
+extern /limits:swarm
+extern /mc/main/00
+extern /mc/main/00/legA/fc
+extern /mc/main/00/legB/fc
+extern /mc/main/00/legB/postproc
+extern /mc/main/12/legA/fc
+extern /mc/main/12/legB/fc
+extern /mc/main/12/legB/postproc
+extern /mc/main:YMD
+extern /o/lag/00/archive/anml
+extern /o/lag/00/archive/anpl
+extern /o/lag/00/archive/ansfc
+extern /o/lag/00/archive/fc048
+extern /o/lag/00/archive/fc240
+extern /o/lag/00/archive/obs
+extern /o/lag/00/archive/sst
+extern /o/lag/00/fb/feedback/matchup
+extern /o/lag/00/satim
+extern /o/lag/00/verif
+extern /o/lag/00dc/archive
+extern /o/lag/00dc/fb/feedback/matchup
+extern /o/lag/06/archive
+extern /o/lag/06/fb/feedback/matchup
+extern /o/lag/06bc/archive
+extern /o/lag/06bc/fb/feedback/matchup
+extern /o/lag/12/archive/fc240
+extern /o/lag/12/archive/obs
+extern /o/lag/12/fb/feedback/matchup
+extern /o/lag/12/satim
+extern /o/lag/12/verif
+extern /o/lag/12dc/archive
+extern /o/lag/12dc/fb/feedback/matchup
+extern /o/lag/18/archive
+extern /o/lag/18/fb/feedback/matchup
+extern /o/lag/18bc/archive
+extern /o/lag/18bc/fb/feedback/matchup
+extern /o/lag:YMD
+extern /o/main/00/an
+extern /o/main/00/an/4dvar
+extern /o/main/00/an/surf_anal
+extern /o/main/00/fc
+extern /o/main/00/fc/clean
+extern /o/main/00/fc/model
+extern /o/main/00/fc/model:step
+extern /o/main/00/prod/18an/derived_param
+extern /o/main/00/prod2diss/oper
+extern /o/main/00/prod2diss/sched/240
+extern /o/main/00/prod2diss/wave
+extern /o/main/00dc/an/4dvar
+extern /o/main/00dc/an/surf_anal
+extern /o/main/00dc/fc/clean
+extern /o/main/00dc/fc/model
+extern /o/main/06bc/an/4dvar
+extern /o/main/06bc/an/surf_anal
+extern /o/main/06bc/fc/model
+extern /o/main/06bc/prod2diss/oper
+extern /o/main/06bc/prod2diss/sched/72
+extern /o/main/12/an
+extern /o/main/12/an/4dvar
+extern /o/main/12/an/surf_anal
+extern /o/main/12/fc
+extern /o/main/12/fc/model
+extern /o/main/12/fc/model:step
+extern /o/main/12/obs/get/get_stor
+extern /o/main/12/prod/06an/derived_param
+extern /o/main/12/prod2diss/oper
+extern /o/main/12/prod2diss/sched/240
+extern /o/main/12/prod2diss/wave
+extern /o/main/12dc/an/4dvar
+extern /o/main/12dc/an/surf_anal
+extern /o/main/12dc/fc/model
+extern /o/main/12dc/obs/get/get_stor
+extern /o/main/18bc/an/4dvar
+extern /o/main/18bc/an/surf_anal
+extern /o/main/18bc/fc/model
+extern /o/main/18bc/prod2diss/oper
+extern /o/main/18bc/prod2diss/sched/72
+extern /o/main:YMD
+extern /pp1/main/extractions/dc00/airs
+extern /pp1/main/extractions/dc00/amsr
+extern /pp1/main/extractions/dc00/atap
+extern /pp1/main/extractions/dc00/ateu
+extern /pp1/main/extractions/dc00/atov
+extern /pp1/main/extractions/dc00/bice
+extern /pp1/main/extractions/dc00/eas1
+extern /pp1/main/extractions/dc00/emer
+extern /pp1/main/extractions/dc00/ers1_ra
+extern /pp1/main/extractions/dc00/ers1_wa
+extern /pp1/main/extractions/dc00/ers1_wi
+extern /pp1/main/extractions/dc00/grad
+extern /pp1/main/extractions/dc00/grst
+extern /pp1/main/extractions/dc00/ice/ice_fdb_c1b
+extern /pp1/main/extractions/dc00/nonbin
+extern /pp1/main/extractions/dc00/qsca
+extern /pp1/main/extractions/dc00/rado
+extern /pp1/main/extractions/dc00/rtovs
+extern /pp1/main/extractions/dc00/sbuv
+extern /pp1/main/extractions/dc00/smin
+extern /pp1/main/extractions/dc00/snow
+extern /pp1/main/extractions/dc00/ssbt
+extern /pp1/main/extractions/dc00/sst/sst_fdb_c1b
+extern /pp1/main/extractions/dc00/stor
+extern /pp1/main/extractions/dc00/trmm
+extern /pp1/main/extractions/dc06/airs
+extern /pp1/main/extractions/dc06/amsr
+extern /pp1/main/extractions/dc06/atap
+extern /pp1/main/extractions/dc06/ateu
+extern /pp1/main/extractions/dc06/atov
+extern /pp1/main/extractions/dc06/bice
+extern /pp1/main/extractions/dc06/eas1
+extern /pp1/main/extractions/dc06/emer
+extern /pp1/main/extractions/dc06/ers1_ra
+extern /pp1/main/extractions/dc06/ers1_wa
+extern /pp1/main/extractions/dc06/ers1_wi
+extern /pp1/main/extractions/dc06/grad
+extern /pp1/main/extractions/dc06/grst
+extern /pp1/main/extractions/dc06/ice/ice_fdb_c1b
+extern /pp1/main/extractions/dc06/nonbin
+extern /pp1/main/extractions/dc06/qsca
+extern /pp1/main/extractions/dc06/rado
+extern /pp1/main/extractions/dc06/rtovs
+extern /pp1/main/extractions/dc06/sbuv
+extern /pp1/main/extractions/dc06/smin
+extern /pp1/main/extractions/dc06/snow
+extern /pp1/main/extractions/dc06/ssbt
+extern /pp1/main/extractions/dc06/sst/sst_fdb_c1b
+extern /pp1/main/extractions/dc06/stor
+extern /pp1/main/extractions/dc06/trmm
+extern /pp1/main/extractions/dc12/airs
+extern /pp1/main/extractions/dc12/amsr
+extern /pp1/main/extractions/dc12/atap
+extern /pp1/main/extractions/dc12/ateu
+extern /pp1/main/extractions/dc12/atov
+extern /pp1/main/extractions/dc12/bice
+extern /pp1/main/extractions/dc12/eas1
+extern /pp1/main/extractions/dc12/emer
+extern /pp1/main/extractions/dc12/ers1_ra
+extern /pp1/main/extractions/dc12/ers1_wa
+extern /pp1/main/extractions/dc12/ers1_wi
+extern /pp1/main/extractions/dc12/grad
+extern /pp1/main/extractions/dc12/grst
+extern /pp1/main/extractions/dc12/ice/ice_fdb_c1b
+extern /pp1/main/extractions/dc12/nonbin
+extern /pp1/main/extractions/dc12/qsca
+extern /pp1/main/extractions/dc12/rado
+extern /pp1/main/extractions/dc12/rtovs
+extern /pp1/main/extractions/dc12/sbuv
+extern /pp1/main/extractions/dc12/smin
+extern /pp1/main/extractions/dc12/snow
+extern /pp1/main/extractions/dc12/ssbt
+extern /pp1/main/extractions/dc12/sst/sst_fdb_c1b
+extern /pp1/main/extractions/dc12/stor
+extern /pp1/main/extractions/dc12/trmm
+extern /pp1/main/extractions/dc18/airs
+extern /pp1/main/extractions/dc18/amsr
+extern /pp1/main/extractions/dc18/atap
+extern /pp1/main/extractions/dc18/ateu
+extern /pp1/main/extractions/dc18/atov
+extern /pp1/main/extractions/dc18/bice
+extern /pp1/main/extractions/dc18/eas1
+extern /pp1/main/extractions/dc18/emer
+extern /pp1/main/extractions/dc18/ers1_ra
+extern /pp1/main/extractions/dc18/ers1_wa
+extern /pp1/main/extractions/dc18/ers1_wi
+extern /pp1/main/extractions/dc18/grad
+extern /pp1/main/extractions/dc18/grst
+extern /pp1/main/extractions/dc18/ice/ice_fdb_c1b
+extern /pp1/main/extractions/dc18/nonbin
+extern /pp1/main/extractions/dc18/qsca
+extern /pp1/main/extractions/dc18/rado
+extern /pp1/main/extractions/dc18/rtovs
+extern /pp1/main/extractions/dc18/sbuv
+extern /pp1/main/extractions/dc18/smin
+extern /pp1/main/extractions/dc18/snow
+extern /pp1/main/extractions/dc18/ssbt
+extern /pp1/main/extractions/dc18/sst/sst_fdb_c1b
+extern /pp1/main/extractions/dc18/stor
+extern /pp1/main/extractions/dc18/trmm
+extern /pp1/main/extractions/ex00/airs
+extern /pp1/main/extractions/ex00/amsr
+extern /pp1/main/extractions/ex00/atap
+extern /pp1/main/extractions/ex00/ateu
+extern /pp1/main/extractions/ex00/atov
+extern /pp1/main/extractions/ex00/bice
+extern /pp1/main/extractions/ex00/eas1
+extern /pp1/main/extractions/ex00/emer
+extern /pp1/main/extractions/ex00/ers1_ra
+extern /pp1/main/extractions/ex00/ers1_wa
+extern /pp1/main/extractions/ex00/ers1_wi
+extern /pp1/main/extractions/ex00/grad
+extern /pp1/main/extractions/ex00/grst
+extern /pp1/main/extractions/ex00/ice/ice_fdb_c1b
+extern /pp1/main/extractions/ex00/nonbin
+extern /pp1/main/extractions/ex00/qsca
+extern /pp1/main/extractions/ex00/rado
+extern /pp1/main/extractions/ex00/rtovs
+extern /pp1/main/extractions/ex00/sbuv
+extern /pp1/main/extractions/ex00/smin
+extern /pp1/main/extractions/ex00/snow
+extern /pp1/main/extractions/ex00/ssbt
+extern /pp1/main/extractions/ex00/sst/sst_fdb_c1b
+extern /pp1/main/extractions/ex00/stor
+extern /pp1/main/extractions/ex00/trmm
+extern /pp1/main/extractions/ex06/airs
+extern /pp1/main/extractions/ex06/amsr
+extern /pp1/main/extractions/ex06/atap
+extern /pp1/main/extractions/ex06/ateu
+extern /pp1/main/extractions/ex06/atov
+extern /pp1/main/extractions/ex06/bice
+extern /pp1/main/extractions/ex06/eas1
+extern /pp1/main/extractions/ex06/emer
+extern /pp1/main/extractions/ex06/ers1_ra
+extern /pp1/main/extractions/ex06/ers1_wa
+extern /pp1/main/extractions/ex06/ers1_wi
+extern /pp1/main/extractions/ex06/grad
+extern /pp1/main/extractions/ex06/grst
+extern /pp1/main/extractions/ex06/ice/ice_fdb_c1b
+extern /pp1/main/extractions/ex06/nonbin
+extern /pp1/main/extractions/ex06/qsca
+extern /pp1/main/extractions/ex06/rado
+extern /pp1/main/extractions/ex06/rtovs
+extern /pp1/main/extractions/ex06/sbuv
+extern /pp1/main/extractions/ex06/smin
+extern /pp1/main/extractions/ex06/snow
+extern /pp1/main/extractions/ex06/ssbt
+extern /pp1/main/extractions/ex06/sst/sst_fdb_c1b
+extern /pp1/main/extractions/ex06/stor
+extern /pp1/main/extractions/ex06/trmm
+extern /pp1/main/extractions/ex12/airs
+extern /pp1/main/extractions/ex12/amsr
+extern /pp1/main/extractions/ex12/atap
+extern /pp1/main/extractions/ex12/ateu
+extern /pp1/main/extractions/ex12/atov
+extern /pp1/main/extractions/ex12/bice
+extern /pp1/main/extractions/ex12/eas1
+extern /pp1/main/extractions/ex12/emer
+extern /pp1/main/extractions/ex12/ers1_ra
+extern /pp1/main/extractions/ex12/ers1_wa
+extern /pp1/main/extractions/ex12/ers1_wi
+extern /pp1/main/extractions/ex12/grad
+extern /pp1/main/extractions/ex12/grst
+extern /pp1/main/extractions/ex12/ice/ice_fdb_c1b
+extern /pp1/main/extractions/ex12/nonbin
+extern /pp1/main/extractions/ex12/qsca
+extern /pp1/main/extractions/ex12/rado
+extern /pp1/main/extractions/ex12/rtovs
+extern /pp1/main/extractions/ex12/sbuv
+extern /pp1/main/extractions/ex12/smin
+extern /pp1/main/extractions/ex12/snow
+extern /pp1/main/extractions/ex12/ssbt
+extern /pp1/main/extractions/ex12/sst/sst_fdb_c1b
+extern /pp1/main/extractions/ex12/stor
+extern /pp1/main/extractions/ex12/trmm
+extern /pp1/main/extractions/ex18/airs
+extern /pp1/main/extractions/ex18/amsr
+extern /pp1/main/extractions/ex18/atap
+extern /pp1/main/extractions/ex18/ateu
+extern /pp1/main/extractions/ex18/atov
+extern /pp1/main/extractions/ex18/bice
+extern /pp1/main/extractions/ex18/eas1
+extern /pp1/main/extractions/ex18/emer
+extern /pp1/main/extractions/ex18/ers1_ra
+extern /pp1/main/extractions/ex18/ers1_wa
+extern /pp1/main/extractions/ex18/ers1_wi
+extern /pp1/main/extractions/ex18/grad
+extern /pp1/main/extractions/ex18/grst
+extern /pp1/main/extractions/ex18/ice/ice_fdb_c1b
+extern /pp1/main/extractions/ex18/nonbin
+extern /pp1/main/extractions/ex18/qsca
+extern /pp1/main/extractions/ex18/rado
+extern /pp1/main/extractions/ex18/rtovs
+extern /pp1/main/extractions/ex18/sbuv
+extern /pp1/main/extractions/ex18/smin
+extern /pp1/main/extractions/ex18/snow
+extern /pp1/main/extractions/ex18/ssbt
+extern /pp1/main/extractions/ex18/sst/sst_fdb_c1b
+extern /pp1/main/extractions/ex18/stor
+extern /pp1/main/extractions/ex18/trmm
+extern /pp1/main/extractions/ma
+extern /pp2/main/extractions/dc00/amsa
+extern /pp2/main/extractions/dc00/asc2
+extern /pp2/main/extractions/dc00/ascs
+extern /pp2/main/extractions/dc00/asel
+extern /pp2/main/extractions/dc00/avhn
+extern /pp2/main/extractions/dc00/g2to
+extern /pp2/main/extractions/dc00/gras
+extern /pp2/main/extractions/dc00/hirs
+extern /pp2/main/extractions/dc00/iasi
+extern /pp2/main/extractions/dc00/j2eo
+extern /pp2/main/extractions/dc00/j2nb
+extern /pp2/main/extractions/dc00/mhsa
+extern /pp2/main/extractions/dc00/modw
+extern /pp2/main/extractions/dc06/amsa
+extern /pp2/main/extractions/dc06/asc2
+extern /pp2/main/extractions/dc06/ascs
+extern /pp2/main/extractions/dc06/asel
+extern /pp2/main/extractions/dc06/avhn
+extern /pp2/main/extractions/dc06/g2to
+extern /pp2/main/extractions/dc06/gras
+extern /pp2/main/extractions/dc06/hirs
+extern /pp2/main/extractions/dc06/iasi
+extern /pp2/main/extractions/dc06/j2eo
+extern /pp2/main/extractions/dc06/j2nb
+extern /pp2/main/extractions/dc06/mhsa
+extern /pp2/main/extractions/dc06/modw
+extern /pp2/main/extractions/dc12/amsa
+extern /pp2/main/extractions/dc12/asc2
+extern /pp2/main/extractions/dc12/ascs
+extern /pp2/main/extractions/dc12/asel
+extern /pp2/main/extractions/dc12/avhn
+extern /pp2/main/extractions/dc12/g2to
+extern /pp2/main/extractions/dc12/gras
+extern /pp2/main/extractions/dc12/hirs
+extern /pp2/main/extractions/dc12/iasi
+extern /pp2/main/extractions/dc12/j2eo
+extern /pp2/main/extractions/dc12/j2nb
+extern /pp2/main/extractions/dc12/mhsa
+extern /pp2/main/extractions/dc12/modw
+extern /pp2/main/extractions/dc18/amsa
+extern /pp2/main/extractions/dc18/asc2
+extern /pp2/main/extractions/dc18/ascs
+extern /pp2/main/extractions/dc18/asel
+extern /pp2/main/extractions/dc18/avhn
+extern /pp2/main/extractions/dc18/g2to
+extern /pp2/main/extractions/dc18/gras
+extern /pp2/main/extractions/dc18/hirs
+extern /pp2/main/extractions/dc18/iasi
+extern /pp2/main/extractions/dc18/j2eo
+extern /pp2/main/extractions/dc18/j2nb
+extern /pp2/main/extractions/dc18/mhsa
+extern /pp2/main/extractions/dc18/modw
+extern /pp2/main/extractions/ex00/amsa
+extern /pp2/main/extractions/ex00/asc2
+extern /pp2/main/extractions/ex00/ascs
+extern /pp2/main/extractions/ex00/asel
+extern /pp2/main/extractions/ex00/avhn
+extern /pp2/main/extractions/ex00/g2to
+extern /pp2/main/extractions/ex00/gras
+extern /pp2/main/extractions/ex00/hirs
+extern /pp2/main/extractions/ex00/iasi
+extern /pp2/main/extractions/ex00/j2eo
+extern /pp2/main/extractions/ex00/j2nb
+extern /pp2/main/extractions/ex00/mhsa
+extern /pp2/main/extractions/ex00/modw
+extern /pp2/main/extractions/ex06/amsa
+extern /pp2/main/extractions/ex06/asc2
+extern /pp2/main/extractions/ex06/ascs
+extern /pp2/main/extractions/ex06/asel
+extern /pp2/main/extractions/ex06/avhn
+extern /pp2/main/extractions/ex06/g2to
+extern /pp2/main/extractions/ex06/gras
+extern /pp2/main/extractions/ex06/hirs
+extern /pp2/main/extractions/ex06/iasi
+extern /pp2/main/extractions/ex06/j2eo
+extern /pp2/main/extractions/ex06/j2nb
+extern /pp2/main/extractions/ex06/mhsa
+extern /pp2/main/extractions/ex06/modw
+extern /pp2/main/extractions/ex12/amsa
+extern /pp2/main/extractions/ex12/asc2
+extern /pp2/main/extractions/ex12/ascs
+extern /pp2/main/extractions/ex12/asel
+extern /pp2/main/extractions/ex12/avhn
+extern /pp2/main/extractions/ex12/g2to
+extern /pp2/main/extractions/ex12/gras
+extern /pp2/main/extractions/ex12/hirs
+extern /pp2/main/extractions/ex12/iasi
+extern /pp2/main/extractions/ex12/j2eo
+extern /pp2/main/extractions/ex12/j2nb
+extern /pp2/main/extractions/ex12/mhsa
+extern /pp2/main/extractions/ex12/modw
+extern /pp2/main/extractions/ex18/amsa
+extern /pp2/main/extractions/ex18/asc2
+extern /pp2/main/extractions/ex18/ascs
+extern /pp2/main/extractions/ex18/asel
+extern /pp2/main/extractions/ex18/avhn
+extern /pp2/main/extractions/ex18/g2to
+extern /pp2/main/extractions/ex18/gras
+extern /pp2/main/extractions/ex18/hirs
+extern /pp2/main/extractions/ex18/iasi
+extern /pp2/main/extractions/ex18/j2eo
+extern /pp2/main/extractions/ex18/j2nb
+extern /pp2/main/extractions/ex18/mhsa
+extern /pp2/main/extractions/ex18/modw
+suite limits
+  defstatus complete
+  edit SLEEPTIME '1'
+  limit mars 16
+  limit ha_pp 10
+  limit ha_pp2 10
+  limit swarm 40
+  limit linux_cluster 40
+  limit obs_get 20
+  limit hpcf 150
+  limit c1a 150
+  limit c1b 150
+  limit prod 25
+  limit prod2diss 6
+  limit prod2ecpds 6
+  limit pdb 10
+  limit q2diss 10
+  limit pdb_bc 6
+  limit q2diss_bc 6
+  clock hybrid 
+endsuite
+suite pp1
+  edit ECF_DATE '20080711'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family main
+    edit YMD '20100114'
+    family extractions
+      family ex00
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task buoy
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task smiu
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task cmwn
+        task ap19
+      endfamily
+      family ex06
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task mtsat
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task smiu
+        task cmwn
+        task ap19
+      endfamily
+      family ex12
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task mtsat
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task smiu
+        task cmwn
+        task ap19
+      endfamily
+      family ex18
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task mtsat
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task smiu
+        task cmwn
+        task ap19
+      endfamily
+      family dc00
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task mtsat
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task smiu
+        task cmwn
+        task ap19
+      endfamily
+      family dc06
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task mtsat
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task smiu
+        task cmwn
+        task ap19
+      endfamily
+      family dc12
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task mtsat
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task smiu
+        task cmwn
+        task ap19
+      endfamily
+      family dc18
+        task nonbin
+        task airs
+        task amsr
+        task at18
+        task at19
+        task atap
+        task ateu
+        task atov
+        task avhr
+        task bice
+        task bssh
+        task btem
+        task cmwi
+        task csrj
+        task eas1
+        task eas2
+        task emer
+        task erad
+        task ers1_at
+        task ers1_ra
+        task ers1_wa
+        task ers1_wi
+        task esck
+        task goes
+        task gomw
+        task grad
+        task grst
+        family ice
+          task ice_ex
+          task ice_fdb_hpcf
+          task ice_fdb_c1a
+          task ice_fdb_c1b
+        endfamily
+        task jaso
+        task masr
+        family metop_a
+          task amsa
+          task asca
+          task hirs
+          task iasi
+          task mhsa
+        endfamily
+        task mtsat
+        task nomi
+        task qsca
+        task rado
+        task rtovs
+        task sb19
+        task sbuv
+        task smin
+        task smis
+        task snow
+        task ssbt
+        family sst
+          task sst_ex
+          task sst_fdb_hpcf
+          task sst_fdb_c1a
+          task sst_fdb_c1b
+        endfamily
+        task stor
+        task tozo
+        task trmm
+        task trmr
+        task wavb
+        task smiu
+        task cmwn
+        task ap19
+      endfamily
+      family ma
+        family egrr
+          task extract
+          task fdb_c1a
+          task fdb_c1b
+          task fdb_hpcf
+        endfamily
+        family edzw
+          task extract
+          task fdb_c1a
+          task fdb_c1b
+          task fdb_hpcf
+        endfamily
+        family lfpw
+          task extract
+          task fdb_c1a
+          task fdb_c1b
+          task fdb_hpcf
+        endfamily
+        family kwbc
+          task extract
+          task fdb_c1a
+          task fdb_c1b
+          task fdb_hpcf
+        endfamily
+      endfamily
+    endfamily
+  endfamily
+endsuite
+suite o
+  edit SMSFILES '/home/ma/emos/def/sync'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family main
+    edit YMD '20100114'
+    family 00
+      family an
+        task 4dvar
+        task surf_anal
+      endfamily
+      family prod
+        family 18an
+          task derived_param
+        endfamily
+      endfamily
+      family prod2diss
+        task oper
+        task wave
+        family sched
+          task 240
+        endfamily
+      endfamily
+      family fc
+        task model
+        task clean
+      endfamily
+    endfamily
+    family 12
+      family an
+        task 4dvar
+        task surf_anal
+      endfamily
+      family prod
+        family 06an
+          task derived_param
+        endfamily
+      endfamily
+      family prod2diss
+        task oper
+        task wave
+        family sched
+          task 240
+        endfamily
+      endfamily
+      family fc
+        task model
+      endfamily
+      family obs
+        family get
+          task get_stor
+        endfamily
+      endfamily
+    endfamily
+    family 00dc
+      family an
+        task 4dvar
+        task surf_anal
+      endfamily
+      family fc
+        task model
+        task clean
+      endfamily
+    endfamily
+    family 12dc
+      family an
+        task 4dvar
+        task surf_anal
+      endfamily
+      family fc
+        task model
+      endfamily
+      family obs
+        family get
+          task get_stor
+        endfamily
+      endfamily
+    endfamily
+    family 06bc
+      family an
+        task 4dvar
+        task surf_anal
+      endfamily
+      family prod2diss
+        task oper
+        family sched
+          task 72
+        endfamily
+      endfamily
+      family fc
+        task model
+      endfamily
+    endfamily
+    family 18bc
+      family an
+        task 4dvar
+        task surf_anal
+      endfamily
+      family prod2diss
+        task oper
+        family sched
+          task 72
+        endfamily
+      endfamily
+      family fc
+        task model
+      endfamily
+    endfamily
+  endfamily
+  family lag
+    edit YMD '20100114'
+    family 00dc
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task archive
+    endfamily
+    family 06
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task archive
+    endfamily
+    family 12
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task satim
+      task verif
+      family archive
+        task obs
+        task fc240
+      endfamily
+    endfamily
+    family 12dc
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task archive
+    endfamily
+    family 18
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task archive
+    endfamily
+    family 00
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task satim
+      task verif
+      family archive
+        task obs
+        task anml
+        task anpl
+        task ansfc
+        task sst
+        task fc048
+        task fc240
+      endfamily
+    endfamily
+    family 18bc
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task archive
+    endfamily
+    family 06bc
+      family fb
+        family feedback
+          task matchup
+        endfamily
+      endfamily
+      task archive
+    endfamily
+  endfamily
+endsuite
+suite pp2
+  edit ECF_DATE '20091117'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family main
+    edit YMD '20100114'
+    family extractions
+      family ex00
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+      family ex06
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+      family ex12
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+      family ex18
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+      family dc00
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+      family dc06
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+      family dc12
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+      family dc18
+        task amsa
+        task amse
+        task asc2
+        task asca
+        task ascs
+        task asch
+        task aseh
+        task asel
+        task ashs
+        task avhn
+        task cori
+        task earn
+        task emsg
+        task er19
+        task g2to
+        task gras
+        task hirs
+        task iasi
+        task ias1
+        task ias2
+        task ias3
+        task ias4
+        task itwt
+        task j2eo
+        task j2nb
+        task mhsa
+        task mhse
+        task mloz
+        task modw
+      endfamily
+    endfamily
+  endfamily
+endsuite
+suite pp3
+  edit ECF_DATE '20121212'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family limits
+  endfamily
+  family first
+    task log
+      event tar
+    task clean
+    task clean_stat
+    task clean_err_db
+    task pp_src
+    task chktasks
+  endfamily
+  family meb
+    task restore
+    task clean
+    task stat
+    task feed
+  endfamily
+  family reb
+    task restore
+    task clean
+      event deqc
+    task stat
+  endfamily
+  family bkup
+    family meb
+      task strhandle
+      task MAER
+    endfamily
+    family reb
+      task strhandle
+      task MAER
+    endfamily
+  endfamily
+  family deqc
+    task MAER
+  endfamily
+  family ex00
+    task maer
+      event 1 
+  endfamily
+  family ex06
+    task maer
+      event 1 
+  endfamily
+  family ex12
+    task maer
+      event 1 
+  endfamily
+  family ex18
+    task maer
+      event 1 
+  endfamily
+  family dc00
+    task maer
+      event 1 
+  endfamily
+  family dc06
+    task maer
+      event 1 
+  endfamily
+  family dc12
+    task maer
+      event 1 
+  endfamily
+  family dc18
+    task maer
+      event 1 
+  endfamily
+  family last
+    task stop
+    task chksuite
+  endfamily
+endsuite
+suite mc
+  edit SMSFILES '/home/ma/emos/def/sync'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family main
+    edit YMD '20100114'
+    family 00
+      family sv
+        task svsh
+        task svnh
+        task sv1
+        task sv2
+        task sv3
+        task sv4
+        task sv5
+        task sv6
+      endfamily
+      family legA
+        family fc
+          task pert_ic
+          task pf
+          task cf
+        endfamily
+        task postproc
+      endfamily
+      family legB
+        task postproc
+      endfamily
+    endfamily
+    family 12
+      family legA
+        family fc
+          task pf
+          task cf
+        endfamily
+        task postproc
+      endfamily
+      family legB
+        task postproc
+      endfamily
+    endfamily
+  endfamily
+endsuite
+suite esync
+  edit USER 'emos'
+  edit QUEUE 'emos-exp'
+  edit ACCOUNT 'oosu'
+  edit WSHOST 'localhost'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+  edit SMSOUT '/vol/emos/output'
+  edit LOGDIR '/vol/emos/output'
+  edit SMSHOME '/vol/emos/output'
+  edit SMSFILES '/home/ma/emos/def/esync'
+  edit SMSINCLUDE '/home/ma/emos/def/esync/include'
+  edit SMSTRIES '1'
+  edit SYNC_HOSTS 'marhaus percard marhaus percard ibis'
+  edit SYNC_PORTS ' 314122 314111 314288 314155 314159 314159'
+  edit SYNC_SUITES 'o pp1'
+  edit SLEEPTIME '1'
+  inlimit /esync/limits:sync
+  clock hybrid 
+  family limits
+    limit sync 3
+  endfamily
+  family o
+    family o
+      edit SMSFILES '/home/ma/emos/def/sync'
+      family main
+        edit YMD '20100114'
+        family 00
+          family an
+            family 4dvar
+              task sync
+                trigger /o/main/00/an/4dvar eq complete
+                edit SYNC_NODE '/o/main/00/an/4dvar'
+            endfamily
+            family surf_anal
+              task sync
+                trigger /o/main/00/an/surf_anal eq complete
+                edit SYNC_NODE '/o/main/00/an/surf_anal'
+            endfamily
+          endfamily
+          family prod
+            family 18an
+              family derived_param
+                task sync
+                  trigger /o/main/00/prod/18an/derived_param eq complete
+                  edit SYNC_NODE '/o/main/00/prod/18an/derived_param'
+              endfamily
+            endfamily
+          endfamily
+          family prod2diss
+            family oper
+              task sync
+                trigger /o/main/00/prod2diss/oper eq complete
+                edit SYNC_NODE '/o/main/00/prod2diss/oper'
+            endfamily
+            family wave
+              task sync
+                trigger /o/main/00/prod2diss/wave eq complete
+                edit SYNC_NODE '/o/main/00/prod2diss/wave'
+            endfamily
+            family sched
+              family 240
+                task sync
+                  trigger /o/main/00/prod2diss/sched/240 eq complete
+                  edit SYNC_NODE '/o/main/00/prod2diss/sched/240'
+              endfamily
+            endfamily
+          endfamily
+          family fc
+            family model
+              task sync
+                trigger /o/main/00/fc/model eq complete
+                edit SYNC_NODE '/o/main/00/fc/model'
+            endfamily
+            family clean
+              task sync
+                trigger /o/main/00/fc/clean eq complete
+                edit SYNC_NODE '/o/main/00/fc/clean'
+            endfamily
+          endfamily
+        endfamily
+        family 12
+          family an
+            family 4dvar
+              task sync
+                trigger /o/main/12/an/4dvar eq complete
+                edit SYNC_NODE '/o/main/12/an/4dvar'
+            endfamily
+            family surf_anal
+              task sync
+                trigger /o/main/12/an/surf_anal eq complete
+                edit SYNC_NODE '/o/main/12/an/surf_anal'
+            endfamily
+          endfamily
+          family prod
+            family 06an
+              family derived_param
+                task sync
+                  trigger /o/main/12/prod/06an/derived_param eq complete
+                  edit SYNC_NODE '/o/main/12/prod/06an/derived_param'
+              endfamily
+            endfamily
+          endfamily
+          family prod2diss
+            family oper
+              task sync
+                trigger /o/main/12/prod2diss/oper eq complete
+                edit SYNC_NODE '/o/main/12/prod2diss/oper'
+            endfamily
+            family wave
+              task sync
+                trigger /o/main/12/prod2diss/wave eq complete
+                edit SYNC_NODE '/o/main/12/prod2diss/wave'
+            endfamily
+            family sched
+              family 240
+                task sync
+                  trigger /o/main/12/prod2diss/sched/240 eq complete
+                  edit SYNC_NODE '/o/main/12/prod2diss/sched/240'
+              endfamily
+            endfamily
+          endfamily
+          family fc
+            family model
+              task sync
+                trigger /o/main/12/fc/model eq complete
+                edit SYNC_NODE '/o/main/12/fc/model'
+            endfamily
+          endfamily
+          family obs
+            family get
+              family get_stor
+                task sync
+                  trigger /o/main/12/obs/get/get_stor eq complete
+                  edit SYNC_NODE '/o/main/12/obs/get/get_stor'
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family 00dc
+          family an
+            family 4dvar
+              task sync
+                trigger /o/main/00dc/an/4dvar eq complete
+                edit SYNC_NODE '/o/main/00dc/an/4dvar'
+            endfamily
+            family surf_anal
+              task sync
+                trigger /o/main/00dc/an/surf_anal eq complete
+                edit SYNC_NODE '/o/main/00dc/an/surf_anal'
+            endfamily
+          endfamily
+          family fc
+            family model
+              task sync
+                trigger /o/main/00dc/fc/model eq complete
+                edit SYNC_NODE '/o/main/00dc/fc/model'
+            endfamily
+            family clean
+              task sync
+                trigger /o/main/00dc/fc/clean eq complete
+                edit SYNC_NODE '/o/main/00dc/fc/clean'
+            endfamily
+          endfamily
+        endfamily
+        family 12dc
+          family an
+            family 4dvar
+              task sync
+                trigger /o/main/12dc/an/4dvar eq complete
+                edit SYNC_NODE '/o/main/12dc/an/4dvar'
+            endfamily
+            family surf_anal
+              task sync
+                trigger /o/main/12dc/an/surf_anal eq complete
+                edit SYNC_NODE '/o/main/12dc/an/surf_anal'
+            endfamily
+          endfamily
+          family fc
+            family model
+              task sync
+                trigger /o/main/12dc/fc/model eq complete
+                edit SYNC_NODE '/o/main/12dc/fc/model'
+            endfamily
+          endfamily
+          family obs
+            family get
+              family get_stor
+                task sync
+                  trigger /o/main/12dc/obs/get/get_stor eq complete
+                  edit SYNC_NODE '/o/main/12dc/obs/get/get_stor'
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family 06bc
+          family an
+            family 4dvar
+              task sync
+                trigger /o/main/06bc/an/4dvar eq complete
+                edit SYNC_NODE '/o/main/06bc/an/4dvar'
+            endfamily
+            family surf_anal
+              task sync
+                trigger /o/main/06bc/an/surf_anal eq complete
+                edit SYNC_NODE '/o/main/06bc/an/surf_anal'
+            endfamily
+          endfamily
+          family prod2diss
+            family oper
+              task sync
+                trigger /o/main/06bc/prod2diss/oper eq complete
+                edit SYNC_NODE '/o/main/06bc/prod2diss/oper'
+            endfamily
+            family sched
+              family 72
+                task sync
+                  trigger /o/main/06bc/prod2diss/sched/72 eq complete
+                  edit SYNC_NODE '/o/main/06bc/prod2diss/sched/72'
+              endfamily
+            endfamily
+          endfamily
+          family fc
+            family model
+              task sync
+                trigger /o/main/06bc/fc/model eq complete
+                edit SYNC_NODE '/o/main/06bc/fc/model'
+            endfamily
+          endfamily
+        endfamily
+        family 18bc
+          family an
+            family 4dvar
+              task sync
+                trigger /o/main/18bc/an/4dvar eq complete
+                edit SYNC_NODE '/o/main/18bc/an/4dvar'
+            endfamily
+            family surf_anal
+              task sync
+                trigger /o/main/18bc/an/surf_anal eq complete
+                edit SYNC_NODE '/o/main/18bc/an/surf_anal'
+            endfamily
+          endfamily
+          family prod2diss
+            family oper
+              task sync
+                trigger /o/main/18bc/prod2diss/oper eq complete
+                edit SYNC_NODE '/o/main/18bc/prod2diss/oper'
+            endfamily
+            family sched
+              family 72
+                task sync
+                  trigger /o/main/18bc/prod2diss/sched/72 eq complete
+                  edit SYNC_NODE '/o/main/18bc/prod2diss/sched/72'
+              endfamily
+            endfamily
+          endfamily
+          family fc
+            family model
+              task sync
+                trigger /o/main/18bc/fc/model eq complete
+                edit SYNC_NODE '/o/main/18bc/fc/model'
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family lag
+        edit YMD '20100114'
+        family 00dc
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/00dc/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/00dc/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family archive
+            task sync
+              trigger /o/lag/00dc/archive eq complete
+              edit SYNC_NODE '/o/lag/00dc/archive'
+          endfamily
+        endfamily
+        family 06
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/06/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/06/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family archive
+            task sync
+              trigger /o/lag/06/archive eq complete
+              edit SYNC_NODE '/o/lag/06/archive'
+          endfamily
+        endfamily
+        family 12
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/12/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/12/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family satim
+            task sync
+              trigger /o/lag/12/satim eq complete
+              edit SYNC_NODE '/o/lag/12/satim'
+          endfamily
+          family verif
+            task sync
+              trigger /o/lag/12/verif eq complete
+              edit SYNC_NODE '/o/lag/12/verif'
+          endfamily
+          family archive
+            family obs
+              task sync
+                trigger /o/lag/12/archive/obs eq complete
+                edit SYNC_NODE '/o/lag/12/archive/obs'
+            endfamily
+            family fc240
+              task sync
+                trigger /o/lag/12/archive/fc240 eq complete
+                edit SYNC_NODE '/o/lag/12/archive/fc240'
+            endfamily
+          endfamily
+        endfamily
+        family 12dc
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/12dc/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/12dc/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family archive
+            task sync
+              trigger /o/lag/12dc/archive eq complete
+              edit SYNC_NODE '/o/lag/12dc/archive'
+          endfamily
+        endfamily
+        family 18
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/18/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/18/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family archive
+            task sync
+              trigger /o/lag/18/archive eq complete
+              edit SYNC_NODE '/o/lag/18/archive'
+          endfamily
+        endfamily
+        family 00
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/00/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/00/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family satim
+            task sync
+              trigger /o/lag/00/satim eq complete
+              edit SYNC_NODE '/o/lag/00/satim'
+          endfamily
+          family verif
+            task sync
+              trigger /o/lag/00/verif eq complete
+              edit SYNC_NODE '/o/lag/00/verif'
+          endfamily
+          family archive
+            family obs
+              task sync
+                trigger /o/lag/00/archive/obs eq complete
+                edit SYNC_NODE '/o/lag/00/archive/obs'
+            endfamily
+            family anml
+              task sync
+                trigger /o/lag/00/archive/anml eq complete
+                edit SYNC_NODE '/o/lag/00/archive/anml'
+            endfamily
+            family anpl
+              task sync
+                trigger /o/lag/00/archive/anpl eq complete
+                edit SYNC_NODE '/o/lag/00/archive/anpl'
+            endfamily
+            family ansfc
+              task sync
+                trigger /o/lag/00/archive/ansfc eq complete
+                edit SYNC_NODE '/o/lag/00/archive/ansfc'
+            endfamily
+            family sst
+              task sync
+                trigger /o/lag/00/archive/sst eq complete
+                edit SYNC_NODE '/o/lag/00/archive/sst'
+            endfamily
+            family fc048
+              task sync
+                trigger /o/lag/00/archive/fc048 eq complete
+                edit SYNC_NODE '/o/lag/00/archive/fc048'
+            endfamily
+            family fc240
+              task sync
+                trigger /o/lag/00/archive/fc240 eq complete
+                edit SYNC_NODE '/o/lag/00/archive/fc240'
+            endfamily
+          endfamily
+        endfamily
+        family 18bc
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/18bc/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/18bc/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family archive
+            task sync
+              trigger /o/lag/18bc/archive eq complete
+              edit SYNC_NODE '/o/lag/18bc/archive'
+          endfamily
+        endfamily
+        family 06bc
+          family fb
+            family feedback
+              family matchup
+                task sync
+                  trigger /o/lag/06bc/fb/feedback/matchup eq complete
+                  edit SYNC_NODE '/o/lag/06bc/fb/feedback/matchup'
+              endfamily
+            endfamily
+          endfamily
+          family archive
+            task sync
+              trigger /o/lag/06bc/archive eq complete
+              edit SYNC_NODE '/o/lag/06bc/archive'
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+    task restart
+      trigger ( ( /o/lag:YMD gt /esync/o/o/lag:YMD) or ( /o/main:YMD gt /esync/o/o/main:YMD) or 1 eq 0) and /esync/o ne active and /esync/o ne submitted
+      edit SMSPASS 'stripped'
+  endfamily
+endsuite
+suite admin3
+  repeat day 1
+  edit USER 'emos'
+  edit ACCOUNT 'oosu'
+  edit SCHOST 'hpce'
+  edit VERSION '0011'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '12'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY ''
+  edit STREAM 'TMP'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit INIMA ''
+  edit INIMACONS '0'
+  edit WSHOST 'swarm'
+  edit QUEUE 'emos-e'
+  edit QUEUE_EPILOG 'emos-exp'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+  edit LOGDIR '/vol/emos/output'
+  edit SMSOUT '/vol/emos/output'
+  edit SMSHOME '/vol/emos/output'
+  edit SMSINCLUDE '/home/ma/emos/def/o/include'
+  edit SMSFILES '/home/ma/emos/def/o/admin'
+  edit SERVER_HOME '/var/tmp/emos/sms'
+  edit CLASS 'od'
+  edit DATEMASK '*.*.*'
+  edit SLEEPTIME '1'
+  inlimit /limits:swarm
+  clock hybrid 
+  family daily
+    repeat date YMD 20070115 20121212 1
+    edit USE_YMD 'true'
+    edit LOGTASK 'daily'
+    family check
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      task rcp
+        time 00:00 23:59 00:10
+        time 00:00 06:59 00:10
+      task ecfs
+        edit SMSTRIES '3'
+        time 00:00 23:59 00:30
+        time 00:00 06:59 00:30
+    endfamily
+    family files
+      task usr_edt
+      task smslog
+        trigger usr_edt eq complete or usr_edt eq aborted
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+        edit LOGDIR '/vol/emos/output'
+        edit SMSOUT '/vol/emos/output'
+      task no_jobs
+        trigger smslog eq complete or smslog eq aborted
+      task tar
+        trigger no_jobs eq complete or no_jobs eq aborted
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      edit SMSFILES '/home/ma/emos/def/admin'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'daily'
+    task logfiles
+      trigger ( check eq complete and files eq complete)
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      edit KEEPLOGS 'no'
+      edit MOVE_TO_ECFS 'no'
+      edit SMSFILES '/home/ma/emos/def/o'
+      time 06:45
+  endfamily
+endsuite
+suite new_monitor
+  edit SMSOUT '/vol/emos_nc/output'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/new_monitor'
+  edit SMSINCLUDE '/home/ma/emos/def/new_monitor/include'
+  edit WSHOST 'bilbo'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/vol/emos_nc/output'
+  edit EMPDIR '/usr/local/apps/empress/v8.60'
+  edit EMPTMPDIR '/acq/tmp/empress'
+  edit EDBPATH 'not_used'
+  edit EPSTYPE 'not_used'
+  edit MEMBER '0'
+  edit FIRST_DAY '0'
+  edit VERSION '0001'
+  edit YMD 'not_used'
+  edit DELTA_DAY '0'
+  edit WDIR 'not_used'
+  edit PACKAGE 'not_used'
+  edit SCHOST 'not_used'
+  edit HAACQ 'not_used'
+  edit AN_TIME 'not_used'
+  edit EDBNAME 'not_used'
+  edit PP_BASE 'not_used'
+  edit EXPVER 'not_used'
+  edit STREAM 'not_used'
+  edit USEEXTRACTED 'not_used'
+  edit SMSHOST 'not_used'
+  edit USER 'emos'
+  edit QUEUE 'emos'
+  edit ACCOUNT 'not_used'
+  edit FSFAMILY 'disk_space'
+  edit EMOS_BASE '00'
+  edit EMOS_TIME_STEP_H '0000'
+  edit DATEMASK '*.*.*'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family admin
+    task display_seaice
+      edit WSHOST 'swarm'
+      edit SMSLOG '/vol/emos/output/monitor'
+      edit MCSLOG '/vol/emos/output'
+      edit FSFAMILY 'undef'
+      edit EMOS_BASE '12'
+      edit SMSURLBASE 'http://w3ec2.ecmwf.int/metapps/preprocessing/Monitoring'
+      edit SMSURL 'seaice.html'
+      edit YMD '20071025'
+      edit METVIEW 'metview'
+      edit EMOS_TYPE 'undef'
+      edit MARS_DB 'mars_od'
+  endfamily
+  family disk_space
+    edit SMSOUT '/vol/emos_nc/output'
+    edit SMSHOME '/vol/emos_nc/output'
+    edit SMSLOG '/vol/emos_nc/output'
+    edit LOGDIR '/vol/emos_nc/output'
+    task chkspace
+      edit WSHOST 'swarm'
+      edit SMSPASS 'stripped'
+      cron 00:00 23:00 00:30
+    task chkspace_img
+      edit WSHOST 'bilbo'
+      edit SMSCMD '/home/ma/emos/bin/smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      cron 00:05 23:05 00:30
+    task chkspace_img_copy
+      edit WSHOST 'localhost'
+      cron 00:10 23:10 00:30
+    task rd_chkspace
+      edit WSHOST 'swarm'
+      cron 00:15 23:15 00:30
+    task rd_chkspace_img
+      edit WSHOST 'bilbo'
+      cron 00:20 23:20 00:30
+    task rd_chkspace_img_copy
+      edit WSHOST 'localhost'
+      cron 00:25 23:25 00:30
+    task chkfeed
+      cron 00:00 23:00 00:30
+  endfamily
+  family stats
+    edit FSFAMILY 'stats'
+    edit ODBCINIFILE '/home/ma/emos/maw/stats2/odbc.ini'
+    task chk_stats_meb
+      label info ""
+      cron 07:00
+    task chk_stats_reb
+      label info ""
+      cron 07:30
+    task chk_stats_reb2
+      label info ""
+      cron 07:35
+    task chk_grib_meb
+      cron 09:30
+    task chk_grib_reb
+      cron 09:30
+    task copy_stats_to_intra
+      edit WSHOST 'localhost'
+      cron 09:45
+  endfamily
+  family acq2
+    edit WSHOST 'localhost'
+    edit WARNINGMAIL 'true'
+    family emc1
+      task amsua
+        edit WARNINGMAIL 'true'
+        cron 00:05 23:05 00:30
+      task mhs
+        edit WARNINGMAIL 'false'
+        cron 00:05 23:05 00:30
+      task hirs
+        edit WARNINGMAIL 'false'
+        cron 00:05 23:05 00:30
+    endfamily
+    family emc2
+      task amsua
+        edit WARNINGMAIL 'false'
+        cron 00:08 23:08 00:30
+      task mhs
+        edit WARNINGMAIL 'false'
+        cron 00:08 23:08 00:30
+      task hirs
+        edit WARNINGMAIL 'false'
+        cron 00:08 23:08 00:30
+    endfamily
+  endfamily
+  family radar
+    task get_radar
+      edit WSHOST 'localhost'
+      edit SMSLOG '/vol/emos/output/monitor'
+      edit MCSLOG '/vol/emos/output'
+      edit FSFAMILY 'radar'
+      cron 00:00 23:00 00:15
+    task get_img
+      edit WSHOST 'bilbo'
+      edit SMSLOG '/vol/emos/output/monitor'
+      edit MCSLOG '/vol/emos/output'
+      edit FSFAMILY 'radar'
+      cron 00:05 23:05 00:15
+  endfamily
+  family db_locks
+    edit SMSOUT '/vol/emos_nc/output'
+    edit SMSHOME '/vol/emos_nc/output'
+    edit SMSLOG '/vol/emos_nc/output'
+    edit LOGDIR '/vol/emos_nc/output'
+    task lockinfo_meb
+      edit WSHOST 'pp1'
+      cron 09:00 15:00 00:02
+    task lockinfo_reb
+      edit WSHOST 'pp1'
+      cron 09:01 15:01 00:02
+    task lockinfo_graph
+      edit WSHOST 'bilbo'
+      cron 09:05 15:05 00:02
+    task lockinfo_img_copy
+      edit WSHOST 'localhost'
+      cron 09:06 15:06 00:02
+  endfamily
+endsuite
+suite preview
+  edit USER 'emos'
+  edit SCHOST 'c1a'
+  edit SCHOST_BKUP 'c1b'
+  edit WSHOST 'swarm'
+  edit WSLOGDIR '/vol/emos/output'
+  edit SCLOGDIR '/emos_dir/0001/log'
+  edit USE_YMD 'true'
+  edit YMD '20070712'
+  edit DATEMASK '*.*.*'
+  edit VERSION '0001'
+  edit INIEXPVER '0001'
+  edit TCINIEXPVER '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '00'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'tc'
+  edit USER_PRIORITY '70'
+  edit REINITIALIZE 'false'
+  edit SMSHOME '/vol/emos/output'
+  edit SMSFILES '/home/ma/emos/def/preview/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/preview/include'
+  edit ACCOUNT 'oosu'
+  edit STREAM 'DA'
+  edit EMOS_STREAM 'EF'
+  edit ENSEMBLES '50'
+  edit ENS_SIZE '50'
+  edit MARS_DB 'marsod'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit SMSLOGHOST 'c1a'
+  edit SMSLOGPORT '9316'
+  edit OD_PROJ 'od'
+  edit SUITE_START '20070602'
+  edit QUEUE 'emos-e'
+  edit QUEUE_EPILOG 'emos-exp'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/vol/emos/output'
+  edit SMSOUT '/vol/emos/output'
+  edit METPY 'metpy_new'
+  edit SLEEPTIME '1'
+  inlimit /limits:swarm
+  clock hybrid 
+  family pop
+    repeat date YMD 20070712 20201215 1
+    limit plots 3
+    family 00
+      edit PLOT_AREAS 'Preview'
+      edit EMOS_BASE '00'
+      edit UPDATE_WEB_NOW 'yes'
+      inlimit plots
+      family deterministic
+        edit SMSFILES '/home/ma/emos/def/preview/pop/web'
+        edit PLOT_STEPS '60,72,84,96,108,120'
+        edit STREAM 'DA'
+        task delay
+          time 07:20
+        family data
+          trigger delay eq complete
+          edit SMSFILES '/home/ma/emos/def/preview/pop/data/fields'
+          edit STEP_LIST '60/to/120/by/12'
+          task mslp
+          task rain
+          task rh
+          task t2m
+          task t850
+          task z500
+          task w30m
+          task wind
+          task wr
+          task wbpt
+        endfamily
+        family web
+          trigger data eq complete
+          task w_msl_uv200
+          task w_mslrain
+          task w_t2m30mw
+          task w_uv_rh
+          task w_z500t850
+          task w_wr850_700
+          task w_wbpt_msl
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/preview/pop'
+      endfamily
+      family eps
+        edit SMSFILES '/home/ma/emos/def/preview/pop/web'
+        edit STREAM 'EF'
+        edit PLOT_STEPS '60/72/84/96/108/120'
+        task delay
+          time 08:50
+        family data
+          trigger delay eq complete
+          edit SMSFILES '/home/ma/emos/def/preview/pop/data/fields'
+          task efi
+          task lsmoro
+            edit STEP_LIST '0/to/48/by/12'
+          task proba
+            edit PLOT_STEPS_RANGE '48-72/60-84/72-96/84-108/96-120/108-132'
+            edit PLOT_STEPS '60/72/84/96/108/120'
+            edit RANGE 'legA'
+        endfamily
+        family web
+          trigger data eq complete
+          edit SMSFILES '/home/ma/emos/def/preview/pop/web'
+          edit STEP_RANGE 'legA'
+          family probabilities
+            task pb_2t
+            task pb_ff
+            task pb_tp
+              edit PLOT_STEPS '48-72/60-84/72-96/84-108/96-120/108-132'
+            task w_proba_gusts
+              edit PLOT_STEPS '48-72/60-84/72-96/84-108/96-120/108-132'
+          endfamily
+          family efi
+            family efi_tpi
+              task w_efi
+                edit PARAMETER 'tpi'
+            endfamily
+            family efi_10wsi
+              task w_efi
+                edit PARAMETER '10wsi'
+            endfamily
+            family efi_2ti
+              task w_efi
+                edit PARAMETER '2ti'
+            endfamily
+            family efi_10fgi
+              task w_efi
+                edit PARAMETER '10fgi'
+            endfamily
+          endfamily
+          family others
+            edit PLOT_STEPS '60,72,84,96,108,120'
+            task w_msl_mean_spread
+            task w_z500_mean_spread
+            task w_z200_mean_spread
+            task w_t850_mean_spread
+          endfamily
+          family quartiles
+            edit AREA_TO_PLOT '-5/-50/60/80'
+            edit MAP_VERT_LONG '0'
+            edit MAP_PROJECTION 'POLAR_STEREOGRAPHIC'
+            edit STEP_LIST '54/TO/126/by/12'
+            edit STEP_PLOT '60/TO/120/by/12'
+            task w_tp_quartiles
+            task w_wind_quartiles
+            task w_wgust_quartiles
+            task w_wind925_quartiles
+            task w_cape_quartiles
+          endfamily
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/preview/pop'
+      endfamily
+    endfamily
+    family ukmo
+      edit SMSFILES '/home/ma/emos/def/preview/pop/mogreps'
+      edit PLOT_AREAS 'Preview'
+      edit EMOS_BASE '00'
+      edit STREAM 'EF'
+      edit UPDATE_WEB_NOW 'yes'
+      inlimit plots
+      task delay
+        time 08:55
+      family mogreps
+        trigger delay eq complete
+        edit PLOT_STEPS '60,72,84,96,108,120'
+        family web
+          family en_mean_spread
+            task m_msl_mean_spread
+            task m_z500_mean_spread
+            task m_z200_mean_spread
+            task m_t850_mean_spread
+          endfamily
+          family quartiles
+            edit AREA_TO_PLOT '-5/-50/60/80'
+            edit MAP_VERT_LONG '0'
+            edit MAP_PROJECTION 'POLAR_STEREOGRAPHIC'
+            edit STEP_LIST '54/TO/126/by/12'
+            task m_tp_quartiles
+            task m_wind_quartiles
+            task m_wind925_quartiles
+          endfamily
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/preview/pop'
+      endfamily
+    endfamily
+    task restart
+      trigger ./00 eq complete
+      time 15:00
+  endfamily
+endsuite
+suite gems
+  edit USER 'emos'
+  edit SCHOST 'hpce'
+  edit SCHOST_BKUP 'hpcf'
+  edit WSHOST 'swarm'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/emos_dir/evnj/log'
+  edit USE_YMD 'true'
+  edit YMD '20071217'
+  edit DATEMASK '*.*.*'
+  edit VERSION 'evnj'
+  edit INIEXPVER '0001'
+  edit TCINIEXPVER '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '1'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '00'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'tc'
+  edit USER_PRIORITY '70'
+  edit REINITIALIZE 'false'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/gems/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/gems/include'
+  edit ACCOUNT 'oosu'
+  edit STREAM 'EF'
+  edit EMOS_STREAM 'EF'
+  edit ENSEMBLES '50'
+  edit ENS_SIZE '50'
+  edit MARS_DB 'marsod'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit SMSLOGHOST 'c1a'
+  edit SMSLOGPORT '9316'
+  edit OD_PROJ 'od'
+  edit SUITE_START '20061126'
+  edit QUEUE 'emos-e'
+  edit QUEUE_EPILOG 'emos-exp'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/vol/emos_nc/output'
+  edit SMSOUT '/vol/emos_nc/output'
+  edit SLEEPTIME '1'
+  inlimit /limits:swarm
+  clock hybrid 
+  family limits
+    limit linux_cluster 8
+    limit raq_ensemble 3
+    limit calchas 4
+  endfamily
+  family grg
+    inlimit /gems/limits:linux_cluster
+    family plot
+      edit METPY 'metpy_dev'
+      edit UPDATE_WEB_NOW 'yes'
+      edit DO_PUSH_TO_WEB 'yes'
+      family realtime
+        repeat date YMD 20081223 20120924 1
+        edit VERSION 'f7kn'
+        edit METPY 'metpy_new'
+        edit PARAMETERS 'co,go3'
+        edit LEVELS '850,500,300,50'
+        family deps
+          task dummy
+            time 01:00
+        endfamily
+        task daily_fields
+          trigger deps eq complete
+        task daily_totalcolumns
+          trigger daily_fields eq complete
+          edit PARAMETERS 'tcco,gtco3'
+        task daily_zonalmean
+          trigger daily_totalcolumns eq complete
+        task daily_crosssection
+          trigger daily_zonalmean eq complete
+      endfamily
+      family realtime_da
+        repeat date YMD 20081223 20120924 1
+        edit METPY 'metpy_new'
+        edit VERSION 'f8na'
+        edit PARAMETERS 'co,go3'
+        edit LEVELS '850,500,300,50'
+        family deps
+          task dummy
+            time 12:00
+        endfamily
+        task daily_fields_da
+          trigger deps eq complete
+        task daily_totalcolumns_da
+          trigger daily_fields_da eq complete
+          edit PARAMETERS 'tcco,gtco3'
+        task daily_zonalmean_da
+          trigger daily_totalcolumns_da eq complete
+        task daily_crosssection_da
+          trigger daily_zonalmean_da eq complete
+      endfamily
+      family uv
+        repeat date YMD 20081223 20090924 1
+        edit VERSION 'ewsf'
+        edit PARAMETERS '82'
+        family deps
+          task dummy
+            time 16:00
+        endfamily
+        task uv_dose
+          trigger deps eq complete
+          edit METPY 'metpy_new'
+      endfamily
+      family reanalysis
+        repeat integer month 200301 200312
+        edit VERSION 'eyih'
+        edit LEVELS '850,500,300,50'
+        edit PARAMETERS 'co,go3,hcho,nox'
+        task monthly_fields
+        task monthly_totalcolumns
+          edit PARAMETERS 'tcco,gtco3,tchcho'
+        task monthly_zonalmean
+          trigger monthly_totalcolumns eq complete
+        task monthly_crosssection
+          trigger monthly_zonalmean eq complete
+      endfamily
+      task logfilestore
+        trigger realtime eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit KEEPLOGS 'no'
+        edit LOGSTOECFS 'no'
+        edit MOVE_TO_ECFS 'yes'
+      task logfiles
+        trigger logfilestore eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit MOVE_TO_ECFS 'no'
+      family polarcat
+        repeat date YMD 20081223 20120924 1
+        edit VERSION 'f7kn'
+        edit OWNER 'nal'
+        family deps
+          task dummy
+            time 11:00
+        endfamily
+        task polarcat_retrieve_and_process
+          trigger deps eq complete
+        task polarcat_make_latlon_plots
+          trigger polarcat_retrieve_and_process eq complete
+        task polarcat_make_polar_plots
+          trigger polarcat_make_latlon_plots eq complete
+        task polarcat_make_xs_plots
+          trigger polarcat_make_polar_plots eq complete
+        task polarcat_cleanup
+          trigger polarcat_make_xs_plots eq complete
+      endfamily
+    endfamily
+  endfamily
+  family ghg
+    inlimit /gems/limits:linux_cluster
+    family plot
+      edit METPY 'metpy_new'
+      edit UPDATE_WEB_NOW 'yes'
+      edit DO_PUSH_TO_WEB 'yes'
+      family reanalysis
+        edit PARAMETERS 'tcco2'
+        task tcco2_mean
+      endfamily
+      family ch4_reanalysis
+        repeat enumerated month "200301" "200302" "200303" "200304" "200305" "200306" "200307" "200308" "200309" "200310" "200311" "200312" "200401" "200402" "200403" "200404" "200405" "200406" "200407" "200408" "200409" "200410" "200411" "200412" "200501" "200502" "200503" "200504" "200505" "200506" "200507" "200508" "200509" "200510" "200511" "200512" "200601" "200602" "200603" "200604" "200605" "200606" "200607" "200608" "200609" "200610" "200611" "200612" "200701" "200702" "200703" " [...]
+        edit VERSION 'f46b'
+        edit PARAMETERS 'tcch4'
+        task ch4_monthly_totalcolumns
+      endfamily
+      family iasi_plots
+        repeat enumerated month "200801" "200802" "200803" "200804" "200805" "200806" "200807" "200808" "200809" "200810" "200811" "200812"
+        task iasi
+      endfamily
+      family ch4_flux_inversion
+        repeat enumerated month "200401" "200402" "200403" "200404" "200405" "200406" "200407" "200408" "200409" "200410" "200411" "200412"
+        task plot_ch4_flux
+      endfamily
+    endfamily
+  endfamily
+  family aer
+    edit UPDATE_WEB_NOW 'yes'
+    edit DO_PUSH_TO_WEB 'yes'
+    edit METPY 'metpy_dev'
+    inlimit /gems/limits:linux_cluster
+    family realtime
+      repeat date YMD 20080507 20081224 1
+      edit VERSION 'f0dm'
+      edit AERTYPES 'total,natural,anthropogenic'
+      edit METPY 'metpy_new'
+      family deps
+        task dummy
+          time 08:30
+      endfamily
+      task optical_depth
+        trigger deps eq complete
+    endfamily
+    family realtime_da
+      repeat date YMD 20080506 20091224 1
+      edit VERSION 'f8na'
+      edit AERTYPES 'total,natural,anthropogenic'
+      edit METPY 'metpy_new'
+      family deps
+        task dummy
+          time 12:00
+      endfamily
+      task optical_depth_da
+        trigger deps eq complete
+    endfamily
+    family verif
+      repeat enumerated month "200301" "200302" "200303" "200304" "200305" "200306" "200307" "200308" "200309" "200310" "200311" "200312" "200401" "200402" "200403" "200404" "200405" "200406" "200407" "200408" "200409" "200410" "200411" "200412"
+      task aer_station_plots_exlz_ezub
+      task aer_stat_plots_exlz_ezub
+        trigger aer_station_plots_exlz_ezub eq complete
+    endfamily
+    family fire_products
+      repeat date YMD 20080506 20091224 1
+      edit METPY 'metpy_new'
+      family deps
+        task dummy
+          time 07:00
+      endfamily
+      task fire_radiative_power
+        trigger deps eq complete
+    endfamily
+    family verif_f1kd
+      repeat enumerated month "200807" "200808" "200809" "200810" "200811" "200812" "200901" "200902" "200903" "200904" "200905" "200906" "200907" "200908" "200909" "200910" "200911" "200912"
+      task aer_station_plots_f1kd
+      task aer_stat_plots_f1kd
+        trigger aer_station_plots_f1kd eq complete
+    endfamily
+  endfamily
+  family raq
+    edit SMSTRIES '5'
+    edit UPDATE_WEB_NOW 'yes'
+    edit DO_PUSH_TO_WEB 'yes'
+    edit METPY 'metpy_new'
+    edit VERSION 'gems'
+    inlimit /gems/limits:linux_cluster
+    family obs
+      repeat date YMD 20081223 20111001 1
+      edit METPY 'metpy_new'
+      edit FIRST_HOUR '0'
+      edit FINAL_HOUR '23'
+      edit STEP '1'
+      edit PARAMETERS 'o3,no2,so2,co,pm10'
+      edit COUNTRIES 'pl,fi,se,nl,fr'
+      edit ARCHIVED_COUNTRIES 'uk,es,de'
+      family deps
+        task dummy
+          time 11:35
+      endfamily
+      task plot_obs
+        trigger deps eq complete
+    endfamily
+    family ensemble
+      repeat date YMD 20081223 20111001 1
+      edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH,UKN'
+      family deps
+        task dummy
+          time 10:00
+      endfamily
+      task regrid_models
+        trigger deps eq complete
+        edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH,UKN'
+      family plot_ensemble
+        inlimit /gems/limits:raq_ensemble
+        task plot_ensemble_o3
+          trigger ../regrid_models eq complete
+          edit PARAMETER 'o3'
+          edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH'
+        task plot_ensemble_no2
+          trigger ../regrid_models eq complete
+          edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH,UKN'
+          edit PARAMETER 'no2'
+        task plot_ensemble_so2
+          trigger ../regrid_models eq complete
+          edit PARAMETER 'so2'
+          edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH,UKN'
+        task plot_ensemble_co
+          trigger ../regrid_models eq complete
+          edit PARAMETER 'co'
+          edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH,UKN'
+        task plot_ensemble_pm10
+          trigger ../regrid_models eq complete
+          edit PARAMETER 'pm10'
+          edit MODELS 'CHI,EMP,FMI,NKU,RIU,SMH,UKN'
+        task plot_epsgram
+          trigger ../regrid_models eq complete
+        task plot_ensemble_aqi
+          trigger ./plot_ensemble_o3 eq complete and ./plot_ensemble_no2 eq complete and ./plot_ensemble_so2 eq complete and ./plot_ensemble_pm10 eq complete
+          edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,NKU,RIU,SMH'
+      endfamily
+      task compute_hourly_ensemble
+        trigger plot_ensemble eq complete
+        edit PARAMETERS 'o3,no2,so2,co,pm10'
+      task cleanup_models
+        trigger compute_hourly_ensemble eq complete
+        time 15:30
+    endfamily
+    family verif
+      edit METPY 'metpy_new'
+      family scores
+        repeat date YMD 20080731 20100716 1
+        family deps
+          task dummy
+            time 11:35
+        endfamily
+        family compute_scores
+          edit PARAMETERS 'o3,no2,so2,pm10'
+          task verify_RAQ
+            trigger ../deps eq complete
+            label status ""
+        endfamily
+        family plot_scores
+          edit PARAMETERS 'o3,no2,so2,co,pm10'
+          edit COUNTRIES 'pl,fi,se,nl,fr'
+          edit ARCHIVED_COUNTRIES 'uk,es,de'
+          task plot_RAQ_mean_scores
+            trigger ../compute_scores eq complete
+          task plot_RAQ_ts_scores
+            trigger ../compute_scores eq complete
+          task plot_RAQ_taylor_plots
+            trigger ../compute_scores eq complete
+        endfamily
+      endfamily
+      family obs_model
+        family values
+          repeat date YMD 20080731 20100716 1
+          edit COUNTRIES 'pl,fi,se,nl,fr'
+          edit ARCHIVED_COUNTRIES 'uk,es,de'
+          task plot_obs_model_o3
+            trigger ( /gems/raq/verif/scores:YMD gt /gems/raq/verif/obs_model/values:YMD) or ../../scores eq complete
+            edit PARAMETER 'o3'
+            edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH'
+          task plot_obs_model_no2
+            trigger plot_obs_model_o3 eq complete
+            edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH,UKN'
+            edit PARAMETER 'no2'
+          task plot_obs_model_so2
+            trigger plot_obs_model_no2 eq complete
+            edit PARAMETER 'so2'
+            edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,NKU,RIU,SMH,UKN'
+          task plot_obs_model_co
+            trigger plot_obs_model_so2 eq complete
+            edit PARAMETER 'co'
+            edit MODELS 'CHI,CNR,DMI,EMP,FMI,MFM,MOZ,NKU,RIU,SMH'
+          task plot_obs_model_pm10
+            trigger plot_obs_model_co eq complete
+            edit PARAMETER 'pm10'
+            edit MODELS 'CHI,EMP,FMI,NKU,RIU,SMH,UKN'
+        endfamily
+      endfamily
+      family plot_OMI
+        repeat date YMD 20080731 20100716 1
+        family deps
+          task dummy
+            time 11:00
+        endfamily
+        task plot_OMI_tc
+          trigger deps eq complete
+          edit MODELS 'CHI,CNR,DMI,EMP,FMI,NKU,RIU,SMH'
+      endfamily
+      family rescore_fam
+        family rescore_1
+          repeat date YMD 20080601 20081031 1
+          task rescore_RAQ_1
+            label status ""
+        endfamily
+        family rescore_2
+          repeat date YMD 20080601 20081031 1
+          task rescore_RAQ_2
+            label status ""
+        endfamily
+        family rescore_3
+          repeat date YMD 20080601 20081031 1
+          task rescore_RAQ_3
+            label status ""
+        endfamily
+        family rescore_4
+          repeat date YMD 20080601 20081031 1
+          task rescore_RAQ_4
+            label status ""
+        endfamily
+        family rescore_5
+          repeat date YMD 20080601 20081031 1
+          task rescore_RAQ_5
+            label status ""
+        endfamily
+      endfamily
+    endfamily
+    family models
+      edit FIRST_STEP '0'
+      edit FINAL_STEP '72'
+      edit STEP '1'
+      edit DEADLINE '1500'
+      edit LEVELS '500,1000,3000'
+      edit PARAMETERS 'o3,no,no2'
+      family CHI
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'CHI'
+        family plot
+          complete plot/finish eq complete
+          task plot_CHI
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_CHI:done or plot_CHI eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family CNR
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'CNR'
+        family plot
+          complete plot/finish eq complete
+          task plot_CNR
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_CNR:done or plot_CNR eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family DMI
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'DMI'
+        family plot
+          complete plot/finish eq complete
+          task plot_DMI
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_DMI:done or plot_DMI eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family EMP
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'EMP'
+        family plot
+          complete plot/finish eq complete
+          task plot_EMP
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_EMP:done or plot_EMP eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family FMI
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'FMI'
+        edit PARAMETERS 'o3,no,no2'
+        family plot
+          complete plot/finish eq complete
+          task plot_FMI
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_FMI:done or plot_FMI eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family KNM
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'KNM'
+        family plot
+          complete plot/finish eq complete
+          task plot_KNM
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_KNM:done or plot_KNM eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family MFM
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'MFM'
+        family plot
+          complete plot/finish eq complete
+          task plot_MFM
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_MFM:done or plot_MFM eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family MOZ
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'MOZ'
+        edit FIRST_STEP '1'
+        family plot
+          complete plot/finish eq complete
+          task plot_MOZ
+            label status "nothing yet"
+            event done
+            cron 10:00 16:00 00:30
+          task finish
+            complete plot_MOZ:done or plot_MOZ eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 16:15
+      endfamily
+      family NKU
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'NKU'
+        family plot
+          complete plot/finish eq complete
+          task plot_NKU
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_NKU:done or plot_NKU eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family RIU
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'RIU'
+        family plot
+          complete plot/finish eq complete
+          task plot_RIU
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_RIU:done or plot_RIU eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family SMH
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'SMH'
+        family plot
+          complete plot/finish eq complete
+          task plot_SMH
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_SMH:done or plot_SMH eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+      family UKN
+        repeat date YMD 20081223 20111001 1
+        edit MODEL 'UKN'
+        edit FINAL_STEP '71'
+        edit PARAMETERS 'no,no2'
+        family plot
+          complete plot/finish eq complete
+          task plot_UKN
+            label status "nothing yet"
+            event done
+            cron 00:00 15:00 00:30
+          task finish
+            complete plot_UKN:done or plot_UKN eq complete
+            trigger 1 eq 0
+        endfamily
+        task dummy
+          trigger plot eq complete
+          time 15:15
+      endfamily
+    endfamily
+    family etc
+      task cleanup_ftp
+        cron 23:55
+    endfamily
+  endfamily
+  family combined
+    inlimit /gems/limits:linux_cluster
+    family reanalysis
+      repeat enumerated month "200301" "200302" "200303" "200304" "200305" "200306" "200307" "200308" "200309" "200310" "200311" "200312" "200401" "200402" "200403" "200404" "200405" "200406" "200407" "200408" "200409" "200410" "200411" "200412" "200501" "200502" "200503" "200504" "200505" "200506" "200507" "200508" "200509" "200510" "200511" "200512" "200601" "200602" "200603" "200604" "200605" "200606" "200607" "200608" "200609" "200610" "200611" "200612" "200701" "200702" "200703" "20 [...]
+      edit VERSION 'f026'
+      edit LEVELS '850,500,300,50'
+      edit PARAMETERS 'co,go3,hcho,ch4,nox'
+      task gems_monthly_fields
+      task gems_monthly_zonalmean
+      task gems_monthly_totalcolumns
+        edit PARAMETERS 'tcco2,tcco,gtco3,tchcho,tcch4'
+    endfamily
+    family reanalysis_update
+      repeat enumerated month "200301" "200302" "200303" "200304" "200305" "200306" "200307" "200308" "200309" "200310" "200311" "200312" "200401" "200402" "200403" "200404" "200405" "200406" "200407" "200408" "200409" "200410" "200411" "200412" "200501" "200502" "200503" "200504" "200505" "200506" "200507" "200508" "200509" "200510" "200511" "200512" "200601" "200602" "200603" "200604" "200605" "200606" "200607" "200608" "200609" "200610" "200611" "200612" "200701" "200702" "200703" "20 [...]
+      edit VERSION 'ey2o'
+      task gems_monthly_totalcolumns
+        edit PARAMETERS 'tcco2'
+    endfamily
+  endfamily
+endsuite
+suite tparc
+  edit USER 'emos'
+  edit SCHOST 'hpce'
+  edit SCHOST_BKUP 'hpcf'
+  edit WSHOST 'swarm'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/emos_dir/0001/log'
+  edit USE_YMD 'true'
+  edit YMD '20100105'
+  edit DATEMASK '*.*.*'
+  edit VERSION '0001'
+  edit INIEXPVER '0015'
+  edit TCINIEXPVER '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '00'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'tc'
+  edit USER_PRIORITY '70'
+  edit REINITIALIZE 'false'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/tparc/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/tparc/include'
+  edit ACCOUNT 'oosu'
+  edit STREAM 'DA'
+  edit EMOS_STREAM 'EF'
+  edit ENSEMBLES '50'
+  edit ENS_SIZE '50'
+  edit MARS_DB 'marsod'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit SMSLOGHOST 'hpce'
+  edit SMSLOGPORT '9316'
+  edit OD_PROJ 'od'
+  edit SUITE_START '20080611'
+  edit QUEUE 'emos-e'
+  edit QUEUE_EPILOG 'emos-exp'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/vol/emos_nc/output'
+  edit SMSOUT '/vol/emos_nc/output'
+  edit METPY 'metpy_new'
+  edit SLEEPTIME '1'
+  inlimit /limits:swarm
+  clock hybrid 
+  family pop
+    repeat date YMD 20100105 20120410 1
+    limit plots 5
+    family 00
+      edit DELTA_DAY '1'
+      edit PLOT_AREAS 'Tparc_winter'
+      edit EMOS_BASE '00'
+      edit UPDATE_WEB_NOW 'yes'
+      inlimit plots
+      family deterministic
+        edit SMSFILES '/home/ma/emos/def/tparc/pop/web'
+        edit PLOT_STEPS '12,24,36,48,60,72,84,96,108,120,132,144'
+        edit STREAM 'DA'
+        task delay
+          time 07:30
+        family data
+          trigger delay eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop/data/fields'
+          edit STEP_LIST '12/to/144/by/12'
+          task mslp
+          task rain
+          task rh
+          task t2m
+          task t850
+          task z500
+          task w30m
+          task wind
+          task wr
+          task wbpt
+        endfamily
+        family web
+          trigger data eq complete
+          task w_msl_uv200
+          task w_mslrain
+          task w_t2m30mw
+          task w_uv_rh
+          task w_z500t850
+          task w_wr850_700
+          task w_wbpt_msl
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop'
+      endfamily
+      family interactive_chart
+        edit SMSFILES '/home/ma/emos/def/tparc/pop/web'
+        family interactive_ghost
+          time 00:01
+          task w_msl_mean_spread_ghost
+            edit PLOT_STEPS '36,48,60,72,84,96,108,120,132,144'
+            edit DELTA_VALUE '-1'
+        endfamily
+        family interactive_real
+          time 08:55
+          task w_msl_mean_spread_ghost
+            edit PLOT_STEPS '36,48,60,72,84,96,108,120,132,144'
+            edit DELTA_VALUE '0'
+        endfamily
+      endfamily
+      family eps
+        edit SMSFILES '/home/ma/emos/def/tparc/pop/web'
+        edit STREAM 'EF'
+        edit PLOT_STEPS '12/24/36/48/60/72/84/96/108/120/132/144'
+        task delay
+          time 08:55
+        family data
+          trigger delay eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop/data/fields'
+          task efi
+          task lsmoro
+            edit STEP_LIST '0/to/48/by/12'
+          task proba
+            edit PLOT_STEPS_RANGE '0-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156'
+            edit PLOT_STEPS '12/24/36/48/60/72/84/96/108/120/132/144'
+            edit RANGE 'legA'
+        endfamily
+        family web
+          trigger data eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop/web'
+          edit STEP_RANGE 'legA'
+          family probabilities
+            task pb_2t
+            task pb_ff
+            task pb_tp
+              edit PLOT_STEPS '0-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156'
+            task w_proba_gusts
+              edit PLOT_STEPS '0-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156'
+          endfamily
+          family efi
+            family efi_tpi
+              task w_efi
+                edit PARAMETER 'tpi'
+            endfamily
+            family efi_10wsi
+              task w_efi
+                edit PARAMETER '10wsi'
+            endfamily
+            family efi_2ti
+              task w_efi
+                edit PARAMETER '2ti'
+            endfamily
+            family efi_10fgi
+              task w_efi
+                edit PARAMETER '10fgi'
+            endfamily
+          endfamily
+          family others
+            edit PLOT_STEPS '12,24,36,48,60,72,84,96,108,120,132,144'
+            task w_msl_mean_spread
+            task w_z500_mean_spread
+            task w_z200_mean_spread
+            task w_t850_mean_spread
+          endfamily
+          family quartiles
+            edit AREA_TO_PLOT '-10/100/90/300'
+            edit AREA_TO_PLOT_ZOOM '20/140/90/280'
+            edit MAP_VERT_LONG '160'
+            edit MAP_VERT_LONG_ZOOM '160'
+            edit MAP_PROJECTION 'CYLINDRICAL'
+            edit STEP_LIST '6/TO/150/by/12'
+            edit STEP_PLOT '12/TO/144/by/12'
+            task w_tp_quartiles
+            task w_wind_quartiles
+            task w_wgust_quartiles
+            task w_wind925_quartiles
+            task w_cape_quartiles
+          endfamily
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop'
+      endfamily
+    endfamily
+    family 12
+      edit PLOT_AREAS 'Tparc_winter'
+      edit EMOS_BASE '12'
+      edit UPDATE_WEB_NOW 'yes'
+      inlimit plots
+      family deterministic
+        edit SMSFILES '/home/ma/emos/def/tparc/pop/web'
+        edit PLOT_STEPS '12,24,36,48,60,72,84,96,108,120,132,144'
+        edit STREAM 'DA'
+        task delay
+          time 19:20
+        family data
+          trigger delay eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop/data/fields'
+          edit STEP_LIST '12/to/144/by/12'
+          task mslp
+          task rain
+          task rh
+          task t2m
+          task t850
+          task z500
+          task w30m
+          task wind
+          task wr
+          task wbpt
+        endfamily
+        family web
+          trigger data eq complete
+          task w_msl_uv200
+          task w_mslrain
+          task w_t2m30mw
+          task w_uv_rh
+          task w_z500t850
+          task w_wr850_700
+          task w_wbpt_msl
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop'
+      endfamily
+      family eps
+        edit SMSFILES '/home/ma/emos/def/tparc/pop/web'
+        edit STREAM 'EF'
+        edit PLOT_STEPS '12/24/36/48/60/72/84/96/108/120/132/144'
+        task delay
+          time 20:50
+        family data
+          trigger delay eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop/data/fields'
+          task efi
+          task lsmoro
+            edit STEP_LIST '0/to/48/by/12'
+          task proba
+            edit PLOT_STEPS_RANGE '0-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156'
+            edit PLOT_STEPS '12/24/36/48/60/72/84/96/108/120/132/144'
+            edit RANGE 'legA'
+        endfamily
+        family web
+          trigger data eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop/web'
+          edit STEP_RANGE 'legA'
+          family probabilities
+            task pb_2t
+            task pb_ff
+            task pb_tp
+              edit PLOT_STEPS '0-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156'
+            task w_proba_gusts
+              edit PLOT_STEPS '0-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156'
+          endfamily
+          family efi
+            family efi_tpi
+              task w_efi
+                edit PARAMETER 'tpi'
+            endfamily
+            family efi_10wsi
+              task w_efi
+                edit PARAMETER '10wsi'
+            endfamily
+            family efi_2ti
+              task w_efi
+                edit PARAMETER '2ti'
+            endfamily
+            family efi_10fgi
+              task w_efi
+                edit PARAMETER '10fgi'
+            endfamily
+          endfamily
+          family others
+            edit PLOT_STEPS '12,24,36,48,60,72,84,96,108,120,132,144'
+            task w_msl_mean_spread
+            task w_z500_mean_spread
+            task w_z200_mean_spread
+            task w_t850_mean_spread
+          endfamily
+          family quartiles
+            edit AREA_TO_PLOT '-10/100/90/300'
+            edit AREA_TO_PLOT_ZOOM '20/140/90/280'
+            edit MAP_VERT_LONG '160'
+            edit MAP_VERT_LONG_ZOOM '160'
+            edit MAP_PROJECTION 'CYLINDRICAL'
+            edit STEP_LIST '6/TO/150/by/12'
+            edit STEP_PLOT '12/TO/144/by/12'
+            task w_tp_quartiles
+            task w_wind_quartiles
+            task w_wgust_quartiles
+            task w_wind925_quartiles
+            task w_cape_quartiles
+          endfamily
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop'
+      endfamily
+    endfamily
+    family ukmo
+      edit DELTA_DAY '1'
+      edit SMSFILES '/home/ma/emos/def/tparc/pop/mogreps'
+      edit PLOT_AREAS 'Tparc_winter'
+      edit EMOS_BASE '00'
+      edit STREAM 'EF'
+      edit UPDATE_WEB_NOW 'yes'
+      inlimit plots
+      task delay
+        time 09:00
+      family mogreps
+        trigger delay eq complete
+        edit PLOT_STEPS '12,24,36,48,60,72,84,96,108,120,132,144'
+        family web
+          family en_mean_spread
+            task m_msl_mean_spread
+            task m_z500_mean_spread
+            task m_z200_mean_spread
+            task m_t850_mean_spread
+          endfamily
+          family quartiles
+            edit AREA_TO_PLOT '-10/100/90/300'
+            edit AREA_TO_PLOT_ZOOM '20/140/90/280'
+            edit MAP_VERT_LONG '160'
+            edit MAP_VERT_LONG_ZOOM '160'
+            edit MAP_PROJECTION 'CYLINDRICAL'
+            edit STEP_LIST '6/TO/150/by/12'
+            edit STEP_PLOT '12/TO/144/by/12'
+            task m_tp_quartiles
+            task m_wind_quartiles
+            task m_wind925_quartiles
+          endfamily
+        endfamily
+        task cleanup
+          trigger web eq complete
+          edit SMSFILES '/home/ma/emos/def/tparc/pop'
+      endfamily
+    endfamily
+    task restart
+      trigger ./00 eq complete and ukmo eq complete and ./12 eq complete
+      time 11:00
+  endfamily
+endsuite
+suite tparc_dts
+  edit USER 'emos'
+  edit SCHOST 'hpcf'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/emos_esuite/emos_data/0015/log'
+  edit EMOS_TYPE '1'
+  edit DTS '1'
+  edit USE_YMD 'true'
+  edit YMD '20090327'
+  edit DATEMASK '*.*.*'
+  edit VERSION '0015'
+  edit INIEXPVER '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'mc'
+  edit USER_PRIORITY '70'
+  edit PRIORITY '70'
+  edit ININPES '16'
+  edit NPROCA '16'
+  edit NPROCB '1'
+  edit SVMODE 'dts'
+  edit SVPROJVERT 'lower_troposphere'
+  edit REINITIALIZE 'false'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/tparc_33r1/dts'
+  edit SMSINCLUDE '/home/ma/emos/def/tparc_33r1/include'
+  edit ACCOUNT 'oodts'
+  edit STREAM 'EF'
+  edit EMOS_STREAM 'EF'
+  edit MARS_DB 'marser'
+  edit EPSTYPE 'sv'
+  edit MEMBER '0'
+  edit INILEVELS '91'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit FCGROUP 'fc0'
+  edit SMSLOGHOST 'hpcf'
+  edit SMSLOGPORT '9316'
+  edit SVTHREADS '2'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/emos_esuite/emos_data/0015/log'
+  edit SMSOUT '/emos_esuite/emos_data/0015/log'
+  edit SLEEPTIME '1'
+  inlimit /limits:hpcf
+  clock hybrid 
+  family limits
+    limit hpce 5
+    limit hpcf 5
+    limit mars 3
+    limit webplots 3
+    limit linux_cluster 3
+  endfamily
+  family main
+    repeat date YMD 20090327 20190101 1
+    family make
+      edit EMOS_BASE '00'
+      task setup
+      task links
+        trigger setup eq complete
+      task datalinks
+        trigger links eq complete and setup eq complete
+      family bins
+        trigger datalinks eq complete
+        task ifs
+        task prepdata
+        task mc_tools
+      endfamily
+    endfamily
+    family 00
+      edit EMOS_BASE '00'
+      task concordiasi_control
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        time 10:00
+      family case1
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '1'
+        edit INISTEP '42'
+        edit FCLENGTH '30'
+        edit FSFAMILY 'mc/case1'
+        edit ALAT1 '20'
+        edit ALON1 '0'
+        edit ALAT3 '-20'
+        edit ALON3 '359'
+        edit DELTA_HOUR '42'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case2
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '2'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case2'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case3
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '3'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case3'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case4
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '4'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case4'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case5
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '5'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case5'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case6
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '6'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case6'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case7
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '7'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case7'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case8
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '8'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case8'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case9
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '9'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case9'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case10
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_control eq complete
+        edit REGIONNR '10'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit FSFAMILY 'mc/case10'
+        inlimit /tparc_dts/limits:hpcf
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '4'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit EMOS_BASE '00'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'main'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'main'
+      time 19:00
+  endfamily
+  family lag
+    trigger ( main:YMD ge lag:YMD)
+    repeat date YMD 20090327 20190101 1
+    inlimit /tparc_dts/limits:mars
+    family 00
+      edit EMOS_BASE '00'
+      edit SUBFSFAMILY ''
+      task concordiasi_archivecontrol
+        trigger /tparc_dts/main/00/concordiasi_control eq complete
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+      family case1
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case1 eq complete
+        edit FSFAMILY 'mc/case1'
+        edit REGIONNR '1'
+        edit INISTEP '42'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '42'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case2
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case2 eq complete
+        edit FSFAMILY 'mc/case2'
+        edit REGIONNR '2'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case3
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case3 eq complete
+        edit FSFAMILY 'mc/case3'
+        edit REGIONNR '3'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case4
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case4 eq complete
+        edit FSFAMILY 'mc/case4'
+        edit REGIONNR '4'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case5
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case5 eq complete
+        edit FSFAMILY 'mc/case5'
+        edit REGIONNR '5'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case6
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case6 eq complete
+        edit FSFAMILY 'mc/case6'
+        edit REGIONNR '6'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case7
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case7 eq complete
+        edit FSFAMILY 'mc/case7'
+        edit REGIONNR '7'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case8
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case8 eq complete
+        edit FSFAMILY 'mc/case8'
+        edit REGIONNR '8'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case9
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case9 eq complete
+        edit FSFAMILY 'mc/case9'
+        edit REGIONNR '9'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+      family case10
+        trigger ./concordiasi_archivecontrol eq complete and /tparc_dts/main/00/case10 eq complete
+        edit FSFAMILY 'mc/case10'
+        edit REGIONNR '10'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave_concordiasi
+        task svsave
+        task archive_sv
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGTASK 'lag'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'lag'
+      time 19:00
+  endfamily
+  family pop
+    trigger ( main:YMD ge pop:YMD)
+    repeat date YMD 20090327 20190101 1
+    edit SMSFILES '/home/ma/emos/def/tparc_33r1/dts'
+    edit EMOS_BASE '00'
+    inlimit /tparc_dts/limits:webplots
+    family 00
+      edit SUBFSFAMILY ''
+      edit HOUR '0'
+      task concordiasi_plotcontrol
+        trigger /tparc_dts/main/00/concordiasi_control eq complete
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+      task getobslist
+        trigger concordiasi_plotcontrol eq complete
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+      family case1
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case1 eq complete
+        edit FSFAMILY 'mc/case1'
+        edit INISTEP '42'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '42'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case2
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case2 eq complete
+        edit FSFAMILY 'mc/case2'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case3
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case3 eq complete
+        edit FSFAMILY 'mc/case3'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case4
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case4 eq complete
+        edit FSFAMILY 'mc/case4'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case5
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case5 eq complete
+        edit FSFAMILY 'mc/case5'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case6
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case6 eq complete
+        edit FSFAMILY 'mc/case6'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case7
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case7 eq complete
+        edit FSFAMILY 'mc/case7'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case8
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case8 eq complete
+        edit FSFAMILY 'mc/case8'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case9
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case9 eq complete
+        edit FSFAMILY 'mc/case9'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+      family case10
+        trigger /tparc_dts/main/make eq complete and ./concordiasi_plotcontrol eq complete and /tparc_dts/main/00/case10 eq complete
+        edit FSFAMILY 'mc/case10'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /tparc_dts/limits:linux_cluster
+      endfamily
+    endfamily
+    task cases2ftp
+      trigger /tparc_dts/main/00/concordiasi_control eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      inlimit /tparc_dts/limits:linux_cluster
+    task cases2web
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      inlimit /tparc_dts/limits:linux_cluster
+    task clean
+      trigger ./00 eq complete and cases2web eq complete
+    task clean_ws
+      trigger ./00 eq complete and cases2web eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      inlimit /tparc_dts/limits:linux_cluster
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/tparc_33r1/dts'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'pop'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete and ./clean eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/tparc_33r1/dts'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'pop'
+      time 22:00
+  endfamily
+  family sap_other_centres
+    trigger ( main:YMD ge pop:YMD)
+    repeat date YMD 20090327 20190101 1
+    edit EMOS_BASE '00'
+    family 00
+      family ukmo
+        edit CENTRE 'metoffice'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'egrr'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task getdata
+          time 17:00
+        task plotftg_other
+          trigger getdata eq complete
+        task sap_other2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_other2web eq complete
+      endfamily
+      family ncep
+        edit CENTRE 'ncep'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'kwbc'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task getdata
+          time 17:00
+        task getfields
+          trigger getdata eq complete
+        task plotftg_other
+          trigger getfields eq complete
+        task sap_ncep2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task others2cfs
+          trigger sap_ncep2web eq complete
+        task archive_other
+          trigger others2cfs eq complete
+      endfamily
+      family nrl
+        edit CENTRE 'nrl'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'fnmoc'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'sv'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task get_some_data
+          time 18:20
+        task get_some_fields
+          trigger get_some_data eq complete
+        task plotftg_other
+          trigger get_some_fields eq complete
+        task sap_nrl2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task others2cfs
+          trigger sap_nrl2web eq complete
+        task archive_other
+          trigger others2cfs eq complete
+      endfamily
+      family jma
+        edit CENTRE 'jma'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'jma'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task get_some_data
+          time 12:00
+        task get_some_fields
+          trigger get_some_data eq complete
+        task grib_mod_jma
+          trigger get_some_fields eq complete
+        task plotftg_other
+          trigger grib_mod_jma eq complete
+        task sap_jma2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task others2cfs
+          trigger sap_jma2web eq complete
+        task archive_other
+          trigger sap_jma2web eq complete
+      endfamily
+      family ntu
+        edit CENTRE 'ntu'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'ntu'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task getdata
+          time 10:00
+        task getfields
+          trigger getdata eq complete
+        task plotftg_other
+          trigger getfields eq complete
+        task sap_ntu2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_ntu2web eq complete
+      endfamily
+      family UYonsei
+        edit CENTRE 'UYonsei'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'UYonsei'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task get_some_data
+          time 15:45
+        task get_some_fields
+          trigger get_some_data eq complete
+        task plotftg_other
+          trigger get_some_fields eq complete
+        task sap_UYonsei2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task others2cfs
+          trigger sap_UYonsei2web eq complete
+        task archive_other
+          trigger others2cfs eq complete
+      endfamily
+      family UWash
+        edit CENTRE 'UWash'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'UWash'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task get_some_data
+          time 10:00
+        task get_some_fields
+          trigger get_some_data eq complete
+        task plotftg_other
+          trigger get_some_fields eq complete
+        task sap_UWash2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_UWash2web eq complete
+      endfamily
+      family noaa_hrd
+        edit CENTRE 'noaa_hrd'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'noaa_hrd'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /tparc_dts/limits:linux_cluster
+        task getdata
+          time 10:00
+        task getfields
+          trigger getdata eq complete
+        task plotftg_other
+          trigger getfields eq complete
+        task sap_noaa_hrd2web
+          trigger plotftg_other eq complete and /tparc_dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_noaa_hrd2web eq complete
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'sap_other_centres'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'sap_other_centres'
+      time 22:00
+  endfamily
+  family post_process
+    trigger ( main:YMD ge pop:YMD)
+    repeat date YMD 20090327 20190101 1
+    edit EMOS_BASE '00'
+    edit QUEUE 'emos'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit SMSOUT '/vol/emos_nc/output'
+    inlimit /tparc_dts/limits:linux_cluster
+    task fixed_cases
+      time 10:00
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'post_process'
+    task logfiles
+      late -s +00:05 -c +00:15
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'post_process'
+      time 19:00
+  endfamily
+endsuite
+suite dts
+  edit USER 'emos'
+  edit SCHOST 'c1b'
+  edit WSHOST 'swarm'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/s1b/emos_esuite/emos_data/0014/log'
+  edit EMOS_TYPE '1'
+  edit USE_YMD 'true'
+  edit YMD '20080901'
+  edit DATEMASK '*.*.*'
+  edit VERSION '0014'
+  edit INIEXPVER '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'mc'
+  edit USER_PRIORITY '70'
+  edit PRIORITY '70'
+  edit ININPES '16'
+  edit NPROCA '16'
+  edit NPROCB '1'
+  edit SVMODE 'tg'
+  edit REINITIALIZE 'false'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/dts/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/dts/include'
+  edit ACCOUNT 'oodts'
+  edit STREAM 'EF'
+  edit EMOS_STREAM 'EF'
+  edit MARS_DB 'marser'
+  edit EPSTYPE 'sv'
+  edit MEMBER '0'
+  edit INILEVELS '91'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit FCGROUP 'fc0'
+  edit SMSLOGHOST 'c1b'
+  edit SMSLOGPORT '9316'
+  edit SVTHREADS '2'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/s1b/emos_esuite/emos_data/0014/log'
+  edit SMSOUT '/s1b/emos_esuite/emos_data/0014/log'
+  edit SLEEPTIME '1'
+  inlimit /limits:c1b
+  clock hybrid 
+  family limits
+    limit c1b 5
+    limit mars 3
+    limit webplots 3
+    limit swarm 3
+  endfamily
+  family main
+    repeat date YMD 20080901 20121212 1
+    family make
+      edit EMOS_BASE '00'
+      task setup
+      task links
+        trigger setup eq complete
+      task datalinks
+        trigger links eq complete and setup eq complete
+      family bins
+        trigger datalinks eq complete
+        task ifs
+        task prepdata
+        task mc_tools
+      endfamily
+    endfamily
+    family 00
+      edit EMOS_BASE '00'
+      task control
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+        time 10:35
+      family case1
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case1'
+        edit REGIONNR '1'
+        edit INISTEP '42'
+        edit FCLENGTH '30'
+        edit ALAT1 '47.3'
+        edit ALON1 '13.5'
+        edit ALAT3 '27.8'
+        edit ALON3 '37.7'
+        edit DELTA_HOUR '42'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case2
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case2'
+        edit REGIONNR '2'
+        edit INISTEP '54'
+        edit FCLENGTH '30'
+        edit ALAT1 '46.3'
+        edit ALON1 '342.9'
+        edit ALAT3 '26.9'
+        edit ALON3 '7.2'
+        edit DELTA_HOUR '54'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case3
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case3'
+        edit REGIONNR '3'
+        edit INISTEP '66'
+        edit FCLENGTH '30'
+        edit ALAT1 '49.5'
+        edit ALON1 '353.7'
+        edit ALAT3 '30.1'
+        edit ALON3 '18'
+        edit DELTA_HOUR '66'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case4
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case4'
+        edit REGIONNR '4'
+        edit INISTEP '42'
+        edit FCLENGTH '42'
+        edit ALAT1 '48.1'
+        edit ALON1 '353.6'
+        edit ALAT3 '28.6'
+        edit ALON3 '17.8'
+        edit DELTA_HOUR '42'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case5
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case5'
+        edit REGIONNR '5'
+        edit INISTEP '54'
+        edit FCLENGTH '30'
+        edit ALAT1 '48.9'
+        edit ALON1 '356.5'
+        edit ALAT3 '29.4'
+        edit ALON3 '20.8'
+        edit DELTA_HOUR '54'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case6
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case6'
+        edit REGIONNR '6'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case7
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case7'
+        edit REGIONNR '7'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case8
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case8'
+        edit REGIONNR '8'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case9
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case9'
+        edit REGIONNR '9'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+      family case10
+        trigger /dts/main/make eq complete and ./control eq complete
+        edit FSFAMILY 'mc/case10'
+        edit REGIONNR '10'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        inlimit /dts/limits:c1b
+        task getini
+        task inidata_sv
+          trigger getini eq complete
+          edit NPES '16'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit CPUTIME '1000'
+          edit STACK '450'
+        task sv
+          trigger inidata_sv eq complete
+          edit MEM '890'
+          edit NPES '42'
+          edit THREADS '2'
+          edit CPUTIME '20000'
+        task sv2gg
+          trigger sv eq complete
+          edit EMOS_TYPE '0'
+        task sv_te
+          trigger sv2gg eq complete
+        task sv2fdb
+          trigger sv_te eq complete
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit EMOS_BASE '00'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'main'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'main'
+      time 15:00
+  endfamily
+  family lag
+    trigger ( main:YMD ge lag:YMD)
+    repeat date YMD 20080901 20121212 1
+    inlimit /dts/limits:mars
+    family 00
+      edit EMOS_BASE '00'
+      edit SUBFSFAMILY ''
+      task archivecontrol
+        trigger /dts/main/00/control eq complete
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+      family case1
+        trigger ./archivecontrol eq complete and /dts/main/00/case1 eq complete
+        edit FSFAMILY 'mc/case1'
+        edit REGIONNR '1'
+        edit INISTEP '42'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '42'
+        task svsave
+        task archive_sv
+      endfamily
+      family case2
+        trigger ./archivecontrol eq complete and /dts/main/00/case2 eq complete
+        edit FSFAMILY 'mc/case2'
+        edit REGIONNR '2'
+        edit INISTEP '54'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '54'
+        task svsave
+        task archive_sv
+      endfamily
+      family case3
+        trigger ./archivecontrol eq complete and /dts/main/00/case3 eq complete
+        edit FSFAMILY 'mc/case3'
+        edit REGIONNR '3'
+        edit INISTEP '66'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '66'
+        task svsave
+        task archive_sv
+      endfamily
+      family case4
+        trigger ./archivecontrol eq complete and /dts/main/00/case4 eq complete
+        edit FSFAMILY 'mc/case4'
+        edit REGIONNR '4'
+        edit INISTEP '42'
+        edit FCLENGTH '42'
+        edit DELTA_HOUR '42'
+        task svsave
+        task archive_sv
+      endfamily
+      family case5
+        trigger ./archivecontrol eq complete and /dts/main/00/case5 eq complete
+        edit FSFAMILY 'mc/case5'
+        edit REGIONNR '5'
+        edit INISTEP '54'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '54'
+        task svsave
+        task archive_sv
+      endfamily
+      family case6
+        trigger ./archivecontrol eq complete and /dts/main/00/case6 eq complete
+        edit FSFAMILY 'mc/case6'
+        edit REGIONNR '6'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave
+        task archive_sv
+      endfamily
+      family case7
+        trigger ./archivecontrol eq complete and /dts/main/00/case7 eq complete
+        edit FSFAMILY 'mc/case7'
+        edit REGIONNR '7'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave
+        task archive_sv
+      endfamily
+      family case8
+        trigger ./archivecontrol eq complete and /dts/main/00/case8 eq complete
+        edit FSFAMILY 'mc/case8'
+        edit REGIONNR '8'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave
+        task archive_sv
+      endfamily
+      family case9
+        trigger ./archivecontrol eq complete and /dts/main/00/case9 eq complete
+        edit FSFAMILY 'mc/case9'
+        edit REGIONNR '9'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave
+        task archive_sv
+      endfamily
+      family case10
+        trigger ./archivecontrol eq complete and /dts/main/00/case10 eq complete
+        edit FSFAMILY 'mc/case10'
+        edit REGIONNR '10'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task svsave
+        task archive_sv
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGTASK 'lag'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'lag'
+      time 13:00
+  endfamily
+  family pop
+    trigger ( main:YMD ge pop:YMD)
+    repeat date YMD 20080901 20121212 1
+    edit EMOS_BASE '00'
+    inlimit /dts/limits:webplots
+    family 00
+      edit SUBFSFAMILY ''
+      edit HOUR '0'
+      task plotcontrol
+        trigger /dts/main/00/control eq complete
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+      task getobslist
+        trigger plotcontrol eq complete
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+      family case1
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case1 eq complete
+        edit FSFAMILY 'mc/case1'
+        edit INISTEP '42'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '42'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case2
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case2 eq complete
+        edit FSFAMILY 'mc/case2'
+        edit INISTEP '54'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '54'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case3
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case3 eq complete
+        edit FSFAMILY 'mc/case3'
+        edit INISTEP '66'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '66'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case4
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case4 eq complete
+        edit FSFAMILY 'mc/case4'
+        edit INISTEP '42'
+        edit FCLENGTH '42'
+        edit DELTA_HOUR '42'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case5
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case5 eq complete
+        edit FSFAMILY 'mc/case5'
+        edit INISTEP '54'
+        edit FCLENGTH '30'
+        edit DELTA_HOUR '54'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case6
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case6 eq complete
+        edit FSFAMILY 'mc/case6'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case7
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case7 eq complete
+        edit FSFAMILY 'mc/case7'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case8
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case8 eq complete
+        edit FSFAMILY 'mc/case8'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case9
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case9 eq complete
+        edit FSFAMILY 'mc/case9'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+      family case10
+        trigger /dts/main/make eq complete and ./plotcontrol eq complete and /dts/main/00/case10 eq complete
+        edit FSFAMILY 'mc/case10'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        task plotftg
+          edit QUEUE 'emos'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /dts/limits:swarm
+      endfamily
+    endfamily
+    task cases2ftp
+      trigger /dts/main/00/control eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      inlimit /dts/limits:swarm
+    task cases2web
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      inlimit /dts/limits:swarm
+    task clean
+      trigger ./00 eq complete and cases2web eq complete
+    task clean_ws
+      trigger ./00 eq complete and cases2web eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      inlimit /dts/limits:swarm
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'pop'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete and ./clean eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'pop'
+      time 15:00
+  endfamily
+  family sap_other_centres
+    trigger ( main:YMD ge pop:YMD)
+    repeat date YMD 20080901 20121212 1
+    edit EMOS_BASE '00'
+    family 00
+      family ukmo
+        edit CENTRE 'metoffice'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'egrr'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+        task getdata
+          time 11:00
+        task plotftg_other
+          trigger getdata eq complete
+        task sap_other2web
+          trigger plotftg_other eq complete and /dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_other2web eq complete
+      endfamily
+      family meteofrance
+        edit CENTRE 'meteofrance'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'lfpw'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+        task getdata
+          time 11:00
+        task getfields
+          trigger getdata eq complete
+        task plotftg_other
+          trigger getfields eq complete
+        task sap_meteofrance2web
+          trigger plotftg_other eq complete and /dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_meteofrance2web eq complete
+      endfamily
+      family uib
+        edit CENTRE 'uib'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'uib'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+        task getdata
+          time 11:00
+        task getfields
+          trigger getdata eq complete
+        task plotftg_other
+          trigger getfields eq complete
+          edit SMSPASS 'stripped'
+        task sap_uib2web
+          trigger plotftg_other eq complete and /dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_uib2web eq complete
+      endfamily
+      family cnrm
+        edit CENTRE 'cnrm'
+        edit SUBFSFAMILY ''
+        edit FSFAMILY 'mc/%CENTRE%'
+        edit HOUR '0'
+        edit INISTEP '48'
+        edit FCLENGTH '24'
+        edit CENTRE_ORIGIN 'cnrm'
+        edit SAP_METHOD '0'
+        edit SAP_TYPE 'svar'
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /dts/limits:swarm
+        task getdata
+          time 11:00
+        task getfields
+          trigger getdata eq complete
+        task plotftg_other
+          trigger getfields eq complete
+        task sap_cnrm2web
+          trigger plotftg_other eq complete and /dts/pop/cases2web eq complete
+        task archive_other
+          trigger sap_cnrm2web eq complete
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'sap_other_centres'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'sap_other_centres'
+      time 15:00
+  endfamily
+  family post_process
+    trigger ( main:YMD ge pop:YMD)
+    repeat date YMD 20080901 20121212 1
+    edit EMOS_BASE '00'
+    edit QUEUE 'emos'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit SMSOUT '/vol/emos_nc/output'
+    inlimit /dts/limits:swarm
+    task monitor
+      time 07:00
+    task extraobs
+      time 14:05
+    task sendrequest
+      trigger extraobs eq complete
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'post_process'
+    task logfiles
+      late -s +00:05 -c +00:15
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'post_process'
+      time 15:00
+  endfamily
+endsuite
+suite seas_fr3_back
+  edit VERSION '0001'
+  edit EXPVER '0001'
+  edit SCHOST 'hpce'
+  edit WSHOST 'swarm'
+  edit WSLOGDIR '/vol/emos/output'
+  edit SCLOGDIR '/hpce/emos_dir/0001/log'
+  edit STREAM 'MMSF'
+  edit REINITIALIZE 'false'
+  edit EPSTYPE 'fc'
+  edit EMOS_BASE '00'
+  edit DATEMASK '*.*.*'
+  edit START_DAY '19781101'
+  edit END_DAY '20071201'
+  edit YMD '19781101'
+  edit USE_YMD 'true'
+  edit FCLENGTH '5160'
+  edit FCTOTAL '11'
+  edit OCTOTAL '1'
+  edit OCGROUP 'an0'
+  edit RUNCOUPLE '1'
+  edit OCSYSTEM '0'
+  edit OCMETHOD '1'
+  edit ORIGIN 'LFPW'
+  edit FDB_ROOT_FR '/fdb'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit USER_PRIORITY '50'
+  edit FIRST_DAY '0'
+  edit EMOS_TYPE 'fc'
+  edit EMOS_TIME_STEP_H '0000'
+  edit EMOS_STREAM 'DA'
+  edit MARS_DB 'marsod'
+  edit FCNPES '1'
+  edit ANNPES '1'
+  edit SMSHOME '/vol/emos/output'
+  edit SMSFILES '/home/ma/emos/def/seas_fr3_back/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/seas_fr3_back/include'
+  edit ACCOUNT 'oosu'
+  edit USER 'emos'
+  edit MEMBER '0'
+  edit RUNBACK '1'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/hpce/emos_dir/0001/log'
+  edit SMSOUT '/hpce/emos_dir/0001/log'
+  edit SMSLOGHOST 'hpce-batch'
+  edit SMSLOGPORT '9316'
+  edit HOUR '00'
+  edit FSFAMILY 'seas'
+  edit SLEEPTIME '1'
+  inlimit /limits:hpce
+  clock hybrid 
+  family limits
+    limit retrieve 2
+    limit mars 2
+    limit ws 6
+  endfamily
+  family make
+    task setup
+    task mmsf_tools
+      trigger setup eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      inlimit /limits:swarm
+      inlimit /seas_fr3_back/limits:ws
+    task sc_tools
+      trigger setup eq complete
+    task logfiles
+      trigger setup eq complete and sc_tools eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      edit LOGTASK 'make'
+  endfamily
+  family main
+    trigger make eq complete
+    repeat enumerated YMD "19790101" "19800101" "19810101" "19820101" "19830101" "19840101" "19850101" "19860101" "19870101" "19880101" "19890101" "19900101" "19910101" "19920101" "19930101" "19940101" "19950101" "19960101" "19970101" "19980101" "19990101" "20000101" "20010101" "20020101" "20030101" "20040101" "20050101" "20060101" "20070101" "19790201" "19800201" "19810201" "19820201" "19830201" "19840201" "19850201" "19860201" "19870201" "19880201" "19890201" "19900201" "19910201" "199 [...]
+    edit LOGTASK 'main'
+    family fc
+      family fc0
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc0'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc1
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc1'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc2
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc2'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc3
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc3'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc4
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc4'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc5
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc5'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc6
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc6'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc7
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc7'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc8
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc8'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc9
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc9'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+      family fc10
+        edit FCNUM 'fcnum'
+        edit FCGROUP 'fc10'
+        task fr2fdb
+          inlimit /seas_fr3_back/limits:retrieve
+        task extrafields_fr
+          trigger fr2fdb eq complete
+        task mm_sfc_fr
+          trigger fr2fdb eq complete and extrafields_fr eq complete
+        task mm_ua_fr
+          trigger fr2fdb eq complete and mm_sfc_fr eq complete
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      trigger fc eq complete and logfilestore eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+  family lag
+    trigger make eq complete
+    repeat enumerated YMD "19790101" "19800101" "19810101" "19820101" "19830101" "19840101" "19850101" "19860101" "19870101" "19880101" "19890101" "19900101" "19910101" "19920101" "19930101" "19940101" "19950101" "19960101" "19970101" "19980101" "19990101" "20000101" "20010101" "20020101" "20030101" "20040101" "20050101" "20060101" "20070101" "19790201" "19800201" "19810201" "19820201" "19830201" "19840201" "19850201" "19860201" "19870201" "19880201" "19890201" "19900201" "19910201" "199 [...]
+    edit LOGTASK 'lag'
+    family archive
+      trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc eq complete)
+      edit SMSFILES '/home/ma/emos/def/seas_fr3_back/smsfiles/archive'
+      inlimit /limits:mars
+      inlimit /seas_fr3_back/limits:mars
+      task daily_sfc_fr
+        label files ""
+        event fdb
+      task daily_ua_fr
+        trigger daily_sfc_fr eq complete
+        label files ""
+        event fdb
+      task mm_sfc_fr
+        label files ""
+        event fdb
+      task mm_ua_fr
+        label files ""
+        event fdb
+    endfamily
+    family process
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      inlimit /limits:swarm
+      inlimit /seas_fr3_back/limits:ws
+      family fc0
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc0 eq complete)
+        edit FCGROUP 'fc0'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc1
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc1 eq complete)
+        edit FCGROUP 'fc1'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc2
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc2 eq complete)
+        edit FCGROUP 'fc2'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc3
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc3 eq complete)
+        edit FCGROUP 'fc3'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc4
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc4 eq complete)
+        edit FCGROUP 'fc4'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc5
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc5 eq complete)
+        edit FCGROUP 'fc5'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc6
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc6 eq complete)
+        edit FCGROUP 'fc6'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc7
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc7 eq complete)
+        edit FCGROUP 'fc7'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc8
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc8 eq complete)
+        edit FCGROUP 'fc8'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc9
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc9 eq complete)
+        edit FCGROUP 'fc9'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+      family fc10
+        trigger ( /seas_fr3_back/main:YMD gt /seas_fr3_back/lag:YMD) or ( /seas_fr3_back/main:YMD eq /seas_fr3_back/lag:YMD and /seas_fr3_back/main/fc/fc10 eq complete)
+        edit FCGROUP 'fc10'
+        edit FCNUM 'fcnum'
+        task nino_sst_fr
+        task nino_atmos_fr
+          trigger nino_sst_fr eq complete
+        task tcyc_fr
+          trigger nino_atmos_fr eq complete
+      endfamily
+    endfamily
+    family clean
+      trigger archive eq complete and process eq complete
+      task postclean_fdb
+      task clean_sc
+      task clean_ws
+        edit QUEUE 'emos'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+        edit LOGDIR '/vol/emos/output'
+        edit SMSOUT '/vol/emos/output'
+        inlimit /limits:swarm
+        inlimit /seas_fr3_back/limits:ws
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      trigger archive eq complete and process eq complete and clean eq complete and logfilestore eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID%'
+      edit LOGDIR '/vol/emos/output'
+      edit SMSOUT '/vol/emos/output'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+endsuite
+suite cweb
+  edit USER 'emos'
+  edit SCHOST 'c1a'
+  edit SCHOST_BKUP 'c1b'
+  edit STHOST '/s1a'
+  edit STHOST_BKUP '/s1b'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/s1a/emos_esuite/emos_data/9001/log'
+  edit DATEMASK '*.*.*'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSLOGHOST 'c1a'
+  edit SMSLOGPORT '9316'
+  edit ACCOUNT 'oocweb'
+  edit VERSION '9001'
+  edit EPSVERSION '0001'
+  edit RFVERSION '0001'
+  edit SMSTRIES '1'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '00'
+  edit FIRST_DAY '0'
+  edit USE_YMD 'true'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/cweb'
+  edit SMSINCLUDE '/home/ma/emos/def/cweb/include'
+  edit FSFAMILY '/'
+  edit XBINS '/home/ma/emos/bin'
+  edit STREAM 'undef'
+  edit EPSTYPE 'undef'
+  edit MEMBER '0'
+  edit EMOS_TIME_STEP_H '00'
+  edit SUITE_START '20091001'
+  edit LOW_RESOLUTION '1.5'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family limits
+    limit retrieve 10
+    limit purge 1
+  endfamily
+  family o
+    repeat date YMD 20091001 20121212 1
+    edit STREAM 'oper'
+    family 00
+      trigger ( /cweb/o:YMD lt /o/main:YMD) or ( /cweb/o:YMD eq /o/main:YMD and /o/main/00/fc eq complete)
+      edit QUEUE 'ns'
+      edit QUEUE_EPILOG 'ns'
+      edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/s1a/emos_esuite/emos_data/9001/log'
+      edit SMSOUT '/s1a/emos_esuite/emos_data/9001/log'
+      edit DELTA_DAY '1'
+      edit EMOS_BASE '00'
+      edit SMSFILES '/home/ma/emos/def/cweb/cweb'
+      inlimit /limits:c1a
+      task purge
+        inlimit /cweb/limits:purge
+        label info ""
+      family feed
+        trigger purge eq complete
+        inlimit /cweb/limits:retrieve
+        task an_sfc
+          label info ""
+          label grid ""
+        task an_pl
+          label info ""
+          label grid ""
+        task an_ml
+          label info ""
+          label grid ""
+        task fc_sfc
+          label info ""
+          label grid ""
+        task fc_pl
+          label info ""
+          label grid ""
+        task fc_ml
+          label info ""
+          label grid ""
+        task fc_wave
+          label info ""
+          label grid ""
+        task sim
+          trigger ( /o/lag:YMD gt /cweb/o:YMD) or ( /o/lag:YMD eq /cweb/o:YMD and /o/lag/00/satim eq complete)
+          label info ""
+          label grid ""
+      endfamily
+      task check
+        trigger feed eq complete
+        label info ""
+      task ready
+        trigger check eq complete
+        label info ""
+    endfamily
+    family 12
+      trigger ( /cweb/o:YMD lt /o/main:YMD) or ( /cweb/o:YMD eq /o/main:YMD and /o/main/12/fc eq complete)
+      edit QUEUE 'ns'
+      edit QUEUE_EPILOG 'ns'
+      edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/s1a/emos_esuite/emos_data/9001/log'
+      edit SMSOUT '/s1a/emos_esuite/emos_data/9001/log'
+      edit DELTA_DAY '0'
+      edit EMOS_BASE '12'
+      edit SMSFILES '/home/ma/emos/def/cweb/cweb'
+      inlimit /limits:c1a
+      task purge
+        inlimit /cweb/limits:purge
+        label info ""
+      family feed
+        trigger purge eq complete
+        inlimit /cweb/limits:retrieve
+        task an_sfc
+          label info ""
+          label grid ""
+        task an_pl
+          label info ""
+          label grid ""
+        task an_ml
+          label info ""
+          label grid ""
+        task fc_sfc
+          label info ""
+          label grid ""
+        task fc_pl
+          label info ""
+          label grid ""
+        task fc_ml
+          label info ""
+          label grid ""
+        task fc_wave
+          label info ""
+          label grid ""
+        task sim
+          trigger ( /o/lag:YMD gt /cweb/o:YMD) or ( /o/lag:YMD eq /cweb/o:YMD and /o/lag/12/satim eq complete)
+          label info ""
+          label grid ""
+      endfamily
+      task check
+        trigger feed eq complete
+        label info ""
+      task ready
+        trigger check eq complete
+        label info ""
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/cweb'
+      edit LOGTASK 'o'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete and ./12 eq complete and logfilestore eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/cweb'
+      edit LOGTASK 'o'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+  family mc
+    repeat date YMD 20091001 20121212 1
+    edit STREAM 'enfo'
+    family 00
+      trigger ( /cweb/mc:YMD lt /mc/main:YMD) or ( /cweb/mc:YMD eq /mc/main:YMD and /mc/main/00/legB/postproc eq complete)
+      edit QUEUE 'ns'
+      edit QUEUE_EPILOG 'ns'
+      edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/s1a/emos_esuite/emos_data/9001/log'
+      edit SMSOUT '/s1a/emos_esuite/emos_data/9001/log'
+      edit DELTA_DAY '1'
+      edit EMOS_BASE '00'
+      edit SMSFILES '/home/ma/emos/def/cweb/cweb'
+      inlimit /limits:c1a
+      task purge
+        inlimit /cweb/limits:purge
+        label info ""
+      family feed
+        trigger purge eq complete
+        inlimit /cweb/limits:retrieve
+        family leg_A
+          edit LEG 'A'
+          task cf_sfc
+            label info ""
+            label grid ""
+          task cf_pl
+            label info ""
+            label grid ""
+          task cf_wave_sfc
+            label info ""
+            label grid ""
+          task pf_sfc
+            label info ""
+            label grid ""
+          task pf_pl
+            label info ""
+            label grid ""
+          task pf_wave_sfc
+            label info ""
+            label grid ""
+          task efi_sfc
+            label info ""
+            label grid ""
+        endfamily
+        family leg_B
+          edit LEG 'B'
+          task cf_sfc
+            label info ""
+            label grid ""
+          task cf_pl
+            label info ""
+            label grid ""
+          task cf_wave_sfc
+            label info ""
+            label grid ""
+          task pf_sfc
+            label info ""
+            label grid ""
+          task pf_pl
+            label info ""
+            label grid ""
+          task pf_wave_sfc
+            label info ""
+            label grid ""
+        endfamily
+        family leg_C
+          edit LEG 'C'
+          task cf_sfc
+            label info ""
+            label grid ""
+          task cf_pl
+            label info ""
+            label grid ""
+          task cf_wave_sfc
+            label info ""
+            label grid ""
+          task pf_sfc
+            label info ""
+            label grid ""
+          task pf_pl
+            label info ""
+            label grid ""
+          task pf_wave_sfc
+            label info ""
+            label grid ""
+        endfamily
+      endfamily
+      task check
+        trigger feed eq complete
+        label info ""
+      task ready
+        trigger check eq complete
+        label info ""
+    endfamily
+    family 12
+      trigger ( /cweb/mc:YMD lt /mc/main:YMD) or ( /cweb/mc:YMD eq /mc/main:YMD and /mc/main/12/legB/postproc eq complete)
+      edit QUEUE 'ns'
+      edit QUEUE_EPILOG 'ns'
+      edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/s1a/emos_esuite/emos_data/9001/log'
+      edit SMSOUT '/s1a/emos_esuite/emos_data/9001/log'
+      edit DELTA_DAY '0'
+      edit EMOS_BASE '12'
+      edit SMSFILES '/home/ma/emos/def/cweb/cweb'
+      inlimit /limits:c1a
+      task purge
+        inlimit /cweb/limits:purge
+        label info ""
+      family feed
+        trigger purge eq complete
+        inlimit /cweb/limits:retrieve
+        family leg_A
+          edit LEG 'A'
+          task cf_sfc
+            label info ""
+            label grid ""
+          task cf_pl
+            label info ""
+            label grid ""
+          task cf_wave_sfc
+            label info ""
+            label grid ""
+          task pf_sfc
+            label info ""
+            label grid ""
+          task pf_pl
+            label info ""
+            label grid ""
+          task pf_wave_sfc
+            label info ""
+            label grid ""
+          task efi_sfc
+            label info ""
+            label grid ""
+        endfamily
+        family leg_B
+          edit LEG 'B'
+          task cf_sfc
+            label info ""
+            label grid ""
+          task cf_pl
+            label info ""
+            label grid ""
+          task cf_wave_sfc
+            label info ""
+            label grid ""
+          task pf_sfc
+            label info ""
+            label grid ""
+          task pf_pl
+            label info ""
+            label grid ""
+          task pf_wave_sfc
+            label info ""
+            label grid ""
+        endfamily
+        family leg_C
+          edit LEG 'C'
+          task cf_sfc
+            label info ""
+            label grid ""
+          task cf_pl
+            label info ""
+            label grid ""
+          task cf_wave_sfc
+            label info ""
+            label grid ""
+          task pf_sfc
+            label info ""
+            label grid ""
+          task pf_pl
+            label info ""
+            label grid ""
+          task pf_wave_sfc
+            label info ""
+            label grid ""
+        endfamily
+      endfamily
+      task check
+        trigger feed eq complete
+        label info ""
+      task ready
+        trigger check eq complete
+        label info ""
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/cweb'
+      edit LOGTASK 'mc'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete and ./12 eq complete and logfilestore eq complete
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/cweb'
+      edit LOGTASK 'mc'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+endsuite
+suite emc_33r1
+  edit USER 'emos'
+  edit SCHOST 'c1a'
+  edit SCHOST_BKUP 'hpcf'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/emos_esuite/emos_data/0039/log'
+  edit USE_YMD 'true'
+  edit YMD '20080203'
+  edit DATEMASK '*.*.*'
+  edit VERSION '0039'
+  edit INIEXPVER '0039'
+  edit TCINIEXPVER '0039'
+  edit FIRST_DAY '1'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '12'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'mc'
+  edit IMPL_DATE '2012123112'
+  edit EVERSION '0001'
+  edit USER_PRIORITY '70'
+  edit ININPES '16'
+  edit FCNPES '16'
+  edit PGNPES '32'
+  edit ANNPES '4'
+  edit REINITIALIZE 'false'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/emc_33r1'
+  edit SMSINCLUDE '/home/ma/emos/def/emc_33r1/include'
+  edit ACCOUNT 'oeenfo'
+  edit STREAM 'EF'
+  edit EMOS_STREAM 'EF'
+  edit ENSEMBLES '50'
+  edit ENS_SIZE '50'
+  edit MARS_DB 'marsod'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit INILEVELS '91'
+  edit INIPERIOD_4D '6'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit RUNHINDCAST '0'
+  edit ERA40END '2002073100'
+  edit NH_YEARS '18'
+  edit NH_WEEKS '2'
+  edit DELTA_DAY_M '-15'
+  edit DELTA_DAY_P '25'
+  edit FCGTYPE 'l_2'
+  edit EPSFCGTYPE 'l_2'
+  edit LUSE_RSTRHBIAS 'true'
+  edit FCGROUP 'fc0'
+  edit SMSLOGHOST 'c1a'
+  edit SMSLOGPORT '9316'
+  edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+  edit OCNPES_OC '4'
+  edit OCNPES_IFS '28'
+  edit OD_PROJ 'od'
+  edit SMSURLBASE 'http://datasvc.ecmwf.int/twiki/bin/view/Main'
+  edit SMSURL 'CurrentAndOldESuites'
+  edit SUITE_START '20080204'
+  edit PRODUCE_EPS_ML '0'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit.35r3 %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/s1a/emos_esuite/emos_data/0039/log'
+  edit SMSOUT '/s1a/emos_esuite/emos_data/0039/log'
+  edit STHOST '/s1a'
+  edit COURTESY '0'
+  edit SLEEPTIME '1'
+  inlimit /limits:hpce
+  clock hybrid 
+  family efi_curop
+    edit SMSFILES '/home/ma/emos/def/o/mc/efi_hdc'
+    edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+    edit SMSURL 'GENFO/00'
+    limit ext 30
+    inlimit ext
+    family hind
+      repeat date YMD 20080403 20121212 1
+      edit EMOS_BASE '00'
+      family op
+        family stage
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit.legc %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit ACC '24'
+          edit EFI_STEP1 '00'
+          edit EFI_STEP2 '24'
+          edit RETRIEVE 'stage'
+          inlimit /limits:linux_cluster
+          family all
+            edit RF_NAME 'all'
+            task prep
+          endfamily
+        endfamily
+        family d0105_24
+          edit EFI_STEP1 '000 012 024 036 048 060 072 084 096'
+          edit EFI_STEP2 '024 036 048 060 072 084 096 108 120'
+          edit ACC '24'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+        endfamily
+        family d0610_24
+          edit EFI_STEP1 '108 120 132 144 168 192 216'
+          edit EFI_STEP2 '132 144 156 168 192 216 240'
+          edit ACC '24'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+        endfamily
+      endfamily
+      family nop
+        family stage
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit.legc %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit ACC '24'
+          edit EFI_STEP1 '00'
+          edit EFI_STEP2 '24'
+          edit RETRIEVE 'stage'
+          inlimit /limits:linux_cluster
+          family all
+            edit RF_NAME 'all'
+            task prep
+          endfamily
+        endfamily
+        family d0105_24
+          edit EFI_STEP1 '000 012 024 036 048 060 072 084 096'
+          edit EFI_STEP2 '024 036 048 060 072 084 096 108 120'
+          edit ACC '24'
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+        family d0610_24
+          edit EFI_STEP1 '108 120 132 144 168 192 216'
+          edit EFI_STEP2 '132 144 156 168 192 216 240'
+          edit ACC '24'
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+        family d1115_24
+          edit EFI_STEP1 '240 264 288 312 336'
+          edit EFI_STEP2 '264 288 312 336 360'
+          edit ACC '24'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+        family d0102_06
+          edit EFI_STEP1 '006 012 018 024 030 036 042 048'
+          edit EFI_STEP2 '006 012 018 024 030 036 042 048'
+          edit ACC '0'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+        family d0304_06
+          edit EFI_STEP1 '054 060 066 072 078 084 090 096'
+          edit EFI_STEP2 '054 060 066 072 078 084 090 096'
+          edit ACC '0'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+        family d0506_06
+          edit EFI_STEP1 '102 108 114 120 126 132 138 144'
+          edit EFI_STEP2 '102 108 114 120 126 132 138 144'
+          edit ACC '0'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+        family d0708_06
+          edit EFI_STEP1 '150 156 162 168 174 180 186 192'
+          edit EFI_STEP2 '150 156 162 168 174 180 186 192'
+          edit ACC '0'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+        family d0910_06
+          edit EFI_STEP1 '198 204 210 216 222 228 234 240'
+          edit EFI_STEP2 '198 204 210 216 222 228 234 240'
+          edit ACC '0'
+          family 2t
+            edit RF_NAME '2t'
+            task prep
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+    family clim
+      trigger ./clim:YMD lt ./hind:YMD
+      repeat date YMD 20080403 20121212 1
+      edit EMOS_BASE '00'
+      family op
+        family steps24
+          family 000_024
+            edit ACC '24'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '24'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '24'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '24'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '24'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '24'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '24'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '24'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '24'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '24'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '24'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 000_120
+          edit ACC '120'
+          edit EFI_STEP1 '000'
+          edit EFI_STEP2 '120'
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+        endfamily
+        family 024_144
+          edit ACC '120'
+          edit EFI_STEP1 '024'
+          edit EFI_STEP2 '144'
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+        endfamily
+        family 000_240
+          edit ACC '240'
+          edit EFI_STEP1 '000'
+          edit EFI_STEP2 '240'
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+        endfamily
+      endfamily
+      family nop
+        family steps24
+          family 000_024
+            edit ACC '24'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '24'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '24'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '24'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '24'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '24'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '24'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '24'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '24'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '24'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '24'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '24'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '24'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '24'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '24'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_264
+            edit ACC '24'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '264'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 264_288
+            edit ACC '24'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '288'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 288_312
+            edit ACC '24'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '312'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 312_336
+            edit ACC '24'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 336_360
+            edit ACC '24'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '360'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family steps06
+          family 006_006
+            edit ACC '0'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '006'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_012
+            edit ACC '0'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '012'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 018_018
+            edit ACC '0'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '018'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_024
+            edit ACC '0'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 030_030
+            edit ACC '0'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '030'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_036
+            edit ACC '0'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 042_042
+            edit ACC '0'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '042'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_048
+            edit ACC '0'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 054_054
+            edit ACC '0'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '054'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_060
+            edit ACC '0'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 066_066
+            edit ACC '0'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '066'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_072
+            edit ACC '0'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 078_078
+            edit ACC '0'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '078'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_084
+            edit ACC '0'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 090_090
+            edit ACC '0'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '090'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_096
+            edit ACC '0'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 102_102
+            edit ACC '0'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '102'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_108
+            edit ACC '0'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 114_114
+            edit ACC '0'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '114'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_120
+            edit ACC '0'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 126_126
+            edit ACC '0'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '126'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 132_132
+            edit ACC '0'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 138_138
+            edit ACC '0'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '138'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_144
+            edit ACC '0'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 150_150
+            edit ACC '0'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '150'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 156_156
+            edit ACC '0'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '156'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 162_162
+            edit ACC '0'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '162'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_168
+            edit ACC '0'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 174_174
+            edit ACC '0'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '174'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 180_180
+            edit ACC '0'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '180'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 186_186
+            edit ACC '0'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '186'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_192
+            edit ACC '0'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '192'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 198_198
+            edit ACC '0'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '198'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 204_204
+            edit ACC '0'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '204'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 210_210
+            edit ACC '0'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '210'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_216
+            edit ACC '0'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '216'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 222_222
+            edit ACC '0'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '222'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 228_228
+            edit ACC '0'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '228'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 234_234
+            edit ACC '0'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '234'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_240
+            edit ACC '0'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 120_168
+          trigger ./steps24 eq complete
+          edit ACC '48'
+          edit EFI_STEP1 '120'
+          edit EFI_STEP2 '168'
+          family 2t
+            edit RF_NAME '2t'
+            task prep_sort
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep_sort
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep_sort
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep_sort
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep_sort
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep_sort
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep_sort
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep_sort
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep_sort
+          endfamily
+        endfamily
+        family 168_240
+          trigger ./steps24 eq complete
+          edit ACC '72'
+          edit EFI_STEP1 '168'
+          edit EFI_STEP2 '240'
+          family 2t
+            edit RF_NAME '2t'
+            task prep_sort
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep_sort
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep_sort
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep_sort
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep_sort
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep_sort
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep_sort
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep_sort
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep_sort
+          endfamily
+        endfamily
+        family 000_168
+          trigger ./steps24 eq complete
+          edit ACC '168'
+          edit EFI_STEP1 '000'
+          edit EFI_STEP2 '168'
+          family 2t
+            edit RF_NAME '2t'
+            task prep_sort
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep_sort
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep_sort
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep_sort
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep_sort
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep_sort
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep_sort
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep_sort
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep_sort
+          endfamily
+        endfamily
+        family 240_336
+          trigger ./steps24 eq complete
+          edit ACC '96'
+          edit EFI_STEP1 '240'
+          edit EFI_STEP2 '336'
+          family 2t
+            edit RF_NAME '2t'
+            task prep_sort
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep_sort
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep_sort
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep_sort
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep_sort
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep_sort
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep_sort
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep_sort
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep_sort
+          endfamily
+        endfamily
+        family 168_336
+          trigger ./steps24 eq complete
+          edit ACC '168'
+          edit EFI_STEP1 '168'
+          edit EFI_STEP2 '336'
+          family 2t
+            edit RF_NAME '2t'
+            task prep_sort
+          endfamily
+          family 10ff
+            edit RF_NAME '10ff'
+            task prep_sort
+          endfamily
+          family 10fg
+            edit RF_NAME '10fg'
+            task prep_sort
+          endfamily
+          family tp
+            edit RF_NAME 'tp'
+            task prep_sort
+          endfamily
+          family 2tmin
+            edit RF_NAME '2tmin'
+            task prep_sort
+          endfamily
+          family 2tmax
+            edit RF_NAME '2tmax'
+            task prep_sort
+          endfamily
+          family 10dd
+            edit RF_NAME '10dd'
+            task prep_sort
+          endfamily
+          family ts
+            edit RF_NAME 'ts'
+            task prep_sort
+          endfamily
+          family tcc
+            edit RF_NAME 'tcc'
+            task prep_sort
+          endfamily
+          family hsttmax
+            edit RF_NAME 'hsttmax'
+            task prep_sort
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+    family mn
+      trigger ./mn:YMD lt ./clim:YMD
+      repeat date YMD 20080221 20121212 1
+      family 12
+        edit EMOS_BASE '12'
+        family op
+          task stage
+            edit NC_DAYS '31'
+          family 000_120
+            trigger ./stage eq complete
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 024_144
+            trigger ./stage eq complete
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 000_240
+            trigger ./stage eq complete
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 012_036
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 036_060
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 060_084
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 084_108
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 108_132
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+        endfamily
+        family nop
+          task stage
+            edit NC_DAYS '31'
+          family 228_324
+            trigger ./stage eq complete
+            edit ACC '96'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '324'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 168_336
+            trigger ./stage eq complete
+            edit ACC '168'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 000_024
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 024_048
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 048_072
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 072_096
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 096_120
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 120_144
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 108_156
+            trigger ./stage eq complete
+            edit ACC '48'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '156'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 156_228
+            trigger ./stage eq complete
+            edit ACC '72'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '228'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 000_168
+            trigger ./stage eq complete
+            edit ACC '168'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 012_036
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 036_060
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 060_084
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 084_108
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 108_132
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+        endfamily
+        family arch_op
+          trigger op eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family pf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'pf'
+            edit EFI_TYPE 'efi'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+          family cf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'cf'
+            edit EFI_TYPE 'efic'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+        endfamily
+        family arch_nop
+          trigger nop eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family pf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'pf'
+            edit EFI_TYPE 'efi'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+          family cf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'cf'
+            edit EFI_TYPE 'efic'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family 00
+        edit EMOS_BASE '00'
+        edit DELTA_DAY '1'
+        family op
+          task stage
+            edit NC_DAYS '31'
+          family 000_120
+            trigger ./stage eq complete
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 024_144
+            trigger ./stage eq complete
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 000_240
+            trigger ./stage eq complete
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 000_024
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 024_048
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 048_072
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 072_096
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+          family 096_120
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+          endfamily
+        endfamily
+        family nop
+          task stage
+            edit NC_DAYS '31'
+          family 240_336
+            trigger ./stage eq complete
+            edit ACC '96'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 168_336
+            trigger ./stage eq complete
+            edit ACC '168'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 012_036
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 036_060
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 060_084
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 084_108
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 108_132
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 120_144
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 120_168
+            trigger ./stage eq complete
+            edit ACC '48'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 168_240
+            trigger ./stage eq complete
+            edit ACC '72'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 000_168
+            trigger ./stage eq complete
+            edit ACC '168'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task extindex
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task extindex
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task extindex
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task extindex
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 000_024
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 024_048
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 048_072
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 072_096
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+          family 096_120
+            trigger ./stage eq complete
+            edit ACC '24'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task extindex
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task extindex
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task extindex
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task extindex
+            endfamily
+          endfamily
+        endfamily
+        family arch_op
+          trigger op eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family pf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'pf'
+            edit EFI_TYPE 'efi'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+          family cf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'cf'
+            edit EFI_TYPE 'efic'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+        endfamily
+        family arch_nop
+          trigger nop eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family pf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'pf'
+            edit EFI_TYPE 'efi'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+          family cf
+            trigger ./efi2fdb eq complete
+            edit EMOS_TYPE 'cf'
+            edit EFI_TYPE 'efic'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+  endfamily
+  family efi_next
+    edit VERSION '0039'
+    edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi'
+    edit EVERSION '0001'
+    edit IMPL_DATE '2012121212'
+    edit EMOS_BASE '00'
+    edit MARS_DB 'marsod'
+    edit EMOS_TYPE 'undef'
+    edit EPS_VERSION '0001'
+    edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+    edit SMSURL 'GENFO/00'
+    edit MARS_NEW '0'
+    edit UPDATE_WEB_NOW 'yes'
+    edit SCHOST 'c1a'
+    edit STHOST '/s1a'
+    edit SCHOST_BKUP 'c1b'
+    edit SCLOGDIR '/s1a/emos_esuite/emos_data/0039/log'
+    edit LOGDIR '/s1a/emos_esuite/emos_data/0039/log'
+    edit SMSOUT '/s1a/emos_esuite/emos_data/0039/log'
+    edit SMSLOGHOST 'c1a'
+    limit ext 35
+    inlimit ext
+    family mn
+      trigger ./mn:YMD lt ./clim:YMD
+      repeat date YMD 20080221 20121212 1
+      edit EFINENS '50'
+      family deps
+        edit SMSFILES '/home/ma/emos/def/emc_33r1/ref'
+        family 00
+          time 09:30
+          task dummy
+            edit SMSPASS 'stripped'
+        endfamily
+        family 12
+          time 21:30
+          task dummy
+        endfamily
+      endfamily
+      family 12
+        trigger ./deps/12 eq complete
+        edit EMOS_BASE '12'
+        family op
+          edit EPSLEG '1'
+          task stage
+          family 024
+            family 012_036
+              edit ACC '024'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_060
+              edit ACC '024'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_084
+              edit ACC '024'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_108
+              edit ACC '024'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_132
+              edit ACC '024'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '024'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '024'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '024'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            trigger ./024 eq complete
+            family 000_120
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_144
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            trigger ./024 eq complete
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family nop
+          edit EPSLEG '2'
+          task stage
+          family 024
+            family 012_036
+              edit ACC '024'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_060
+              edit ACC '024'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_084
+              edit ACC '024'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_108
+              edit ACC '024'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_132
+              edit ACC '024'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 132_156
+              edit ACC '024'
+              edit EFI_STEP1 '132'
+              edit EFI_STEP2 '156'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 156_180
+              edit ACC '024'
+              edit EFI_STEP1 '156'
+              edit EFI_STEP2 '180'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 180_204
+              edit ACC '024'
+              edit EFI_STEP1 '180'
+              edit EFI_STEP2 '204'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 204_228
+              edit ACC '024'
+              edit EFI_STEP1 '204'
+              edit EFI_STEP2 '228'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '24'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '24'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '24'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 240_264
+              edit ACC '24'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '264'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 264_288
+              edit ACC '24'
+              edit EFI_STEP1 '264'
+              edit EFI_STEP2 '288'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 288_312
+              edit ACC '24'
+              edit EFI_STEP1 '288'
+              edit EFI_STEP2 '312'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 312_336
+              edit ACC '24'
+              edit EFI_STEP1 '312'
+              edit EFI_STEP2 '336'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 336_360
+              edit ACC '24'
+              edit EFI_STEP1 '336'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 072
+            family 012_084
+              edit ACC '072'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '084'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_108
+              edit ACC '072'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '108'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_132
+              edit ACC '072'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '132'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_156
+              edit ACC '072'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '156'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_180
+              edit ACC '072'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '180'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 132_204
+              edit ACC '072'
+              edit EFI_STEP1 '132'
+              edit EFI_STEP2 '204'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 156_228
+              edit ACC '072'
+              edit EFI_STEP1 '156'
+              edit EFI_STEP2 '228'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            family 012_132
+              edit ACC '120'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '132'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_156
+              edit ACC '120'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '156'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_180
+              edit ACC '120'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '180'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_204
+              edit ACC '120'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '204'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_228
+              edit ACC '120'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '228'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 240_360
+              edit ACC '120'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 360
+            family 000_360
+              edit ACC '360'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_op
+          trigger op eq complete
+          edit EPSLEG '1'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_nop
+          trigger nop eq complete
+          edit EPSLEG '2'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmin
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family ts
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family hsttmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family data
+          trigger ./op eq complete and ./nop eq complete and ./arch_nop eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit.legc %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/smsfiles/web'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efidata
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efidata
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efidata
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efidata
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efidata
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efidata
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efidata
+          endfamily
+          family hsstmax
+            edit PARAM 'hsttmax'
+            task efidata
+          endfamily
+        endfamily
+        family plot
+          trigger ./op eq complete and ./nop eq complete and data eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit.legc %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/smsfiles/web'
+          edit METVIEW 'metview_new'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efiplot
+              edit SMSPASS 'stripped'
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efiplot
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efiplot
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efiplot
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efiplot
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efiplot
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efiplot
+          endfamily
+          family hsttmax
+            edit PARAM 'hsttmax'
+            task efiplot
+          endfamily
+        endfamily
+      endfamily
+      family 00
+        trigger ./deps/00 eq complete and ./12 eq complete
+        edit EMOS_BASE '00'
+        edit DELTA_DAY '1'
+        family op
+          edit EPSLEG '1'
+          task stage
+          family 024
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '024'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '024'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '024'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            trigger ./024 eq complete
+            family 000_120
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_144
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            trigger ./024 eq complete
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family nop
+          edit EPSLEG '2'
+          task stage
+          family 024
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family reproc
+              family 120_144
+                edit ACC '024'
+                edit EFI_STEP1 '120'
+                edit EFI_STEP2 '144'
+                family tp
+                  edit RF_NAME 'tp'
+                  task extindex
+                endfamily
+              endfamily
+              family 144_168
+                edit ACC '024'
+                edit EFI_STEP1 '144'
+                edit EFI_STEP2 '168'
+                family tp
+                  edit RF_NAME 'tp'
+                  task extindex
+                endfamily
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '24'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '24'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '24'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 240_264
+              edit ACC '24'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '264'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 264_288
+              edit ACC '24'
+              edit EFI_STEP1 '264'
+              edit EFI_STEP2 '288'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 288_312
+              edit ACC '24'
+              edit EFI_STEP1 '288'
+              edit EFI_STEP2 '312'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 312_336
+              edit ACC '24'
+              edit EFI_STEP1 '312'
+              edit EFI_STEP2 '336'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 336_360
+              edit ACC '24'
+              edit EFI_STEP1 '336'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 072
+            family 000_072
+              edit ACC '072'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '072'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_096
+              edit ACC '072'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '096'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_120
+              edit ACC '072'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_144
+              edit ACC '072'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_168
+              edit ACC '072'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 120_192
+              edit ACC '072'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 144_216
+              edit ACC '072'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            family 000_120
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_144
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_168
+              edit ACC '120'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_192
+              edit ACC '120'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_216
+              edit ACC '120'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 240_360
+              edit ACC '120'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 360
+            family 000_360
+              edit ACC '360'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_op
+          trigger op eq complete
+          edit EPSLEG '1'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_nop
+          trigger nop eq complete
+          edit EPSLEG '2'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmin
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family ts
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family hsttmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family data
+          trigger ./op eq complete and ./nop eq complete and ./arch_nop eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit.legc %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/smsfiles/web'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efidata
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efidata
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efidata
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efidata
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efidata
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efidata
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efidata
+          endfamily
+          family hsstmax
+            edit PARAM 'hsttmax'
+            task efidata
+          endfamily
+        endfamily
+        family plot
+          trigger ./op eq complete and ./nop eq complete and data eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit.legc %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/smsfiles/web'
+          edit METVIEW 'metview_new'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efiplot
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efiplot
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efiplot
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efiplot
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efiplot
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efiplot
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efiplot
+          endfamily
+          family hsttmax
+            edit PARAM 'hsttmax'
+            task efiplot
+          endfamily
+        endfamily
+      endfamily
+      task efi_cleaner
+        trigger ./12 eq complete and ./00 eq complete
+    endfamily
+    family hind
+      repeat date YMD 20080717 20121212 7
+      edit DELTA_DAY '0'
+      time 09:30
+      family stage
+        edit RF_NAME 'all'
+        edit RETRIEVE 'stage'
+        task prep
+      endfamily
+      family op
+        trigger ./stage eq complete
+        edit EPSLEG '1'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+                edit SMSPASS 'stripped'
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+                edit SMSPASS 'stripped'
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+                edit SMSPASS 'stripped'
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          trigger ./024 eq complete
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          trigger ./024 eq complete
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family nop
+        trigger ./stage eq complete
+        edit EPSLEG '2'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 240_264
+            edit ACC '024'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '264'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 264_288
+            edit ACC '024'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '288'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 288_312
+            edit ACC '024'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '312'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 312_336
+            edit ACC '024'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 336_360
+            edit ACC '024'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '360'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 000
+          family 006_006
+            edit ACC '000'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '006'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 012_012
+            edit ACC '000'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '012'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 018_018
+            edit ACC '000'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '018'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 024_024
+            edit ACC '000'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '024'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 030_030
+            edit ACC '000'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '030'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 036_036
+            edit ACC '000'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '036'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 042_042
+            edit ACC '000'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '042'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 048_048
+            edit ACC '000'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '048'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 054_054
+            edit ACC '000'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '054'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 060_060
+            edit ACC '000'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '060'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 066_066
+            edit ACC '000'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '066'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 072_072
+            edit ACC '000'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '072'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 078_078
+            edit ACC '000'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '078'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 084_084
+            edit ACC '000'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '084'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 090_090
+            edit ACC '000'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '090'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 096_096
+            edit ACC '000'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '096'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 102_102
+            edit ACC '000'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '102'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 108_108
+            edit ACC '000'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '108'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 114_114
+            edit ACC '000'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '114'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_120
+            edit ACC '000'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '120'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 126_126
+            edit ACC '000'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '126'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 132_132
+            edit ACC '000'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '132'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 138_138
+            edit ACC '000'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '138'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 144_144
+            edit ACC '000'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '144'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 150_150
+            edit ACC '000'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '150'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 156_156
+            edit ACC '000'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '156'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 162_162
+            edit ACC '000'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '162'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 168_168
+            edit ACC '000'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '168'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 174_174
+            edit ACC '000'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '174'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 180_180
+            edit ACC '000'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '180'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 186_186
+            edit ACC '000'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '186'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 192_192
+            edit ACC '000'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '192'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 198_198
+            edit ACC '000'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '198'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 204_204
+            edit ACC '000'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '204'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 210_210
+            edit ACC '000'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '210'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 216_216
+            edit ACC '000'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '216'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 222_222
+            edit ACC '000'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '222'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 228_228
+            edit ACC '000'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '228'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 234_234
+            edit ACC '000'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '234'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 240_240
+            edit ACC '000'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '240'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 252_252
+            edit ACC '000'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '252'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 264_264
+            edit ACC '000'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '264'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 276_276
+            edit ACC '000'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '276'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 288_288
+            edit ACC '000'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '288'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 300_300
+            edit ACC '000'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '300'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 312_312
+            edit ACC '000'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '312'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 324_324
+            edit ACC '000'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '324'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 336_336
+            edit ACC '000'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '336'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 348_348
+            edit ACC '000'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '348'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 360_360
+            edit ACC '000'
+            edit EFI_STEP1 '360'
+            edit EFI_STEP2 '360'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 006
+          family 000_006
+            edit ACC '006'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '006'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 006_012
+            edit ACC '006'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 012_018
+            edit ACC '006'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '018'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 018_024
+            edit ACC '006'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 024_030
+            edit ACC '006'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '030'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 030_036
+            edit ACC '006'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 036_042
+            edit ACC '006'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '042'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 042_048
+            edit ACC '006'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 048_054
+            edit ACC '006'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '054'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 054_060
+            edit ACC '006'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 060_066
+            edit ACC '006'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '066'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 066_072
+            edit ACC '006'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 072_078
+            edit ACC '006'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '078'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 078_084
+            edit ACC '006'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 084_090
+            edit ACC '006'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '090'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 090_096
+            edit ACC '006'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 096_102
+            edit ACC '006'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '102'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 102_108
+            edit ACC '006'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 108_114
+            edit ACC '006'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '114'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 114_120
+            edit ACC '006'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 120_126
+            edit ACC '006'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '126'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 126_132
+            edit ACC '006'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 132_138
+            edit ACC '006'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '138'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 138_144
+            edit ACC '006'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 144_150
+            edit ACC '006'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '150'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 150_156
+            edit ACC '006'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 156_162
+            edit ACC '006'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '162'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 162_168
+            edit ACC '006'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 168_174
+            edit ACC '006'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '174'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 174_180
+            edit ACC '006'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 180_186
+            edit ACC '006'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '186'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 186_192
+            edit ACC '006'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 192_198
+            edit ACC '006'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '198'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 198_204
+            edit ACC '006'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 204_210
+            edit ACC '006'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '210'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 210_216
+            edit ACC '006'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 216_222
+            edit ACC '006'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '222'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 222_228
+            edit ACC '006'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 228_234
+            edit ACC '006'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '234'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 234_240
+            edit ACC '006'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 012
+          family 000_012
+            edit ACC '012'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 012_024
+            edit ACC '012'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 024_036
+            edit ACC '012'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 036_048
+            edit ACC '012'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 048_060
+            edit ACC '012'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 060_072
+            edit ACC '012'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 072_084
+            edit ACC '012'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 084_096
+            edit ACC '012'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 096_108
+            edit ACC '012'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 108_120
+            edit ACC '012'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 120_132
+            edit ACC '012'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 132_144
+            edit ACC '012'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 144_156
+            edit ACC '012'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 156_168
+            edit ACC '012'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 168_180
+            edit ACC '012'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 180_192
+            edit ACC '012'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 192_204
+            edit ACC '012'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 204_216
+            edit ACC '012'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 216_228
+            edit ACC '012'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 228_240
+            edit ACC '012'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 240_252
+            edit ACC '012'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '252'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 252_264
+            edit ACC '012'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '264'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 264_276
+            edit ACC '012'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '276'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 276_288
+            edit ACC '012'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '288'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 288_300
+            edit ACC '012'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '300'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 300_312
+            edit ACC '012'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '312'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 312_324
+            edit ACC '012'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '324'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 324_336
+            edit ACC '012'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '336'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 336_348
+            edit ACC '012'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '348'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 348_360
+            edit ACC '012'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 072
+          trigger ./024 eq complete
+          family 000_072
+            edit ACC '072'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 024_096
+            edit ACC '072'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 048_120
+            edit ACC '072'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 072_144
+            edit ACC '072'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 096_168
+            edit ACC '072'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_192
+            edit ACC '072'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 144_216
+            edit ACC '072'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 168_240
+            edit ACC '072'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          trigger ./024 eq complete
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 048_168
+            edit ACC '120'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 072_192
+            edit ACC '120'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 096_216
+            edit ACC '120'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_240
+            edit ACC '120'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 240_360
+            edit ACC '120'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          trigger ./024 eq complete
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_360
+            edit ACC '240'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 360
+          trigger ./024 eq complete
+          family 000_360
+            edit ACC '360'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family check_nrt
+        complete ./check_nrt/go eq complete
+        edit REFPATH '/mofc/hc2'
+        family catchup
+          task check_nrt
+            event ok
+        endfamily
+        family rt
+          trigger catchup eq complete
+          task check_nrt
+            event ok
+            cron -w 1 08:00
+        endfamily
+        task go
+          complete ./rt/check_nrt:ok or ./catchup/check_nrt:ok
+          trigger 0 eq 1
+      endfamily
+    endfamily
+    family clim
+      trigger ./clim:YMD lt ./hind:YMD
+      repeat date YMD 20080717 20121212 7
+      edit EFI_REMOVE_GRIB 'echo'
+      edit DELTA_DAY '-7'
+      time 09:30
+      family op
+        edit EPSLEG '1'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family op2fdb
+        trigger op eq complete
+        edit EPSLEG '1'
+        task efi2fdb
+          edit KIND 'clim1'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+      endfamily
+      family nop
+        edit EPSLEG '2'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_264
+            edit ACC '024'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '264'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 264_288
+            edit ACC '024'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '288'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 288_312
+            edit ACC '024'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '312'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 312_336
+            edit ACC '024'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 336_360
+            edit ACC '024'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '360'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 000
+          family 006_006
+            edit ACC '000'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '006'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_012
+            edit ACC '000'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '012'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 018_018
+            edit ACC '000'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '018'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_024
+            edit ACC '000'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '024'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 030_030
+            edit ACC '000'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '030'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_036
+            edit ACC '000'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '036'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 042_042
+            edit ACC '000'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '042'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_048
+            edit ACC '000'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '048'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 054_054
+            edit ACC '000'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '054'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_060
+            edit ACC '000'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '060'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 066_066
+            edit ACC '000'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '066'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_072
+            edit ACC '000'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '072'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 078_078
+            edit ACC '000'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '078'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_084
+            edit ACC '000'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '084'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 090_090
+            edit ACC '000'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '090'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_096
+            edit ACC '000'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '096'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 102_102
+            edit ACC '000'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '102'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_108
+            edit ACC '000'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '108'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 114_114
+            edit ACC '000'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '114'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_120
+            edit ACC '000'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '120'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 126_126
+            edit ACC '000'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '126'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 132_132
+            edit ACC '000'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '132'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 138_138
+            edit ACC '000'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '138'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_144
+            edit ACC '000'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '144'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 150_150
+            edit ACC '000'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '150'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 156_156
+            edit ACC '000'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '156'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 162_162
+            edit ACC '000'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '162'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_168
+            edit ACC '000'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '168'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 174_174
+            edit ACC '000'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '174'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 180_180
+            edit ACC '000'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '180'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 186_186
+            edit ACC '000'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '186'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_192
+            edit ACC '000'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '192'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 198_198
+            edit ACC '000'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '198'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 204_204
+            edit ACC '000'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '204'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 210_210
+            edit ACC '000'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '210'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_216
+            edit ACC '000'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '216'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 222_222
+            edit ACC '000'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '222'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 228_228
+            edit ACC '000'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '228'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 234_234
+            edit ACC '000'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '234'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_240
+            edit ACC '000'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '240'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 252_252
+            edit ACC '000'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '252'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 264_264
+            edit ACC '000'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '264'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 276_276
+            edit ACC '000'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '276'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 288_288
+            edit ACC '000'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '288'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 300_300
+            edit ACC '000'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '300'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 312_312
+            edit ACC '000'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '312'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 324_324
+            edit ACC '000'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '324'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 336_336
+            edit ACC '000'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '336'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 348_348
+            edit ACC '000'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '348'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 360_360
+            edit ACC '000'
+            edit EFI_STEP1 '360'
+            edit EFI_STEP2 '360'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 006
+          family 000_006
+            edit ACC '006'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '006'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 006_012
+            edit ACC '006'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_018
+            edit ACC '006'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '018'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 018_024
+            edit ACC '006'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_030
+            edit ACC '006'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '030'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 030_036
+            edit ACC '006'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_042
+            edit ACC '006'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '042'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 042_048
+            edit ACC '006'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_054
+            edit ACC '006'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '054'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 054_060
+            edit ACC '006'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_066
+            edit ACC '006'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '066'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 066_072
+            edit ACC '006'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_078
+            edit ACC '006'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '078'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 078_084
+            edit ACC '006'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_090
+            edit ACC '006'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '090'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 090_096
+            edit ACC '006'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_102
+            edit ACC '006'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '102'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 102_108
+            edit ACC '006'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_114
+            edit ACC '006'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '114'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 114_120
+            edit ACC '006'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_126
+            edit ACC '006'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '126'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 126_132
+            edit ACC '006'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 132_138
+            edit ACC '006'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '138'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 138_144
+            edit ACC '006'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_150
+            edit ACC '006'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '150'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 150_156
+            edit ACC '006'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 156_162
+            edit ACC '006'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '162'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 162_168
+            edit ACC '006'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_174
+            edit ACC '006'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '174'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 174_180
+            edit ACC '006'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 180_186
+            edit ACC '006'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '186'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 186_192
+            edit ACC '006'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_198
+            edit ACC '006'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '198'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 198_204
+            edit ACC '006'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 204_210
+            edit ACC '006'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '210'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 210_216
+            edit ACC '006'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_222
+            edit ACC '006'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '222'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 222_228
+            edit ACC '006'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 228_234
+            edit ACC '006'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '234'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 234_240
+            edit ACC '006'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 012
+          family 000_012
+            edit ACC '012'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_024
+            edit ACC '012'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_036
+            edit ACC '012'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_048
+            edit ACC '012'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_060
+            edit ACC '012'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_072
+            edit ACC '012'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_084
+            edit ACC '012'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_096
+            edit ACC '012'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_108
+            edit ACC '012'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_120
+            edit ACC '012'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_132
+            edit ACC '012'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 132_144
+            edit ACC '012'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_156
+            edit ACC '012'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 156_168
+            edit ACC '012'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_180
+            edit ACC '012'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 180_192
+            edit ACC '012'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_204
+            edit ACC '012'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 204_216
+            edit ACC '012'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_228
+            edit ACC '012'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 228_240
+            edit ACC '012'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_252
+            edit ACC '012'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '252'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 252_264
+            edit ACC '012'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '264'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 264_276
+            edit ACC '012'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '276'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 276_288
+            edit ACC '012'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '288'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 288_300
+            edit ACC '012'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '300'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 300_312
+            edit ACC '012'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '312'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 312_324
+            edit ACC '012'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '324'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 324_336
+            edit ACC '012'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '336'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 336_348
+            edit ACC '012'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '348'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 348_360
+            edit ACC '012'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 072
+          family 000_072
+            edit ACC '072'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_096
+            edit ACC '072'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_120
+            edit ACC '072'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_144
+            edit ACC '072'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_168
+            edit ACC '072'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_192
+            edit ACC '072'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_216
+            edit ACC '072'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_240
+            edit ACC '072'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_168
+            edit ACC '120'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_192
+            edit ACC '120'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_216
+            edit ACC '120'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_240
+            edit ACC '120'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_360
+            edit ACC '120'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_360
+            edit ACC '240'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 360
+          family 000_360
+            edit ACC '360'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family nop2fdb
+        trigger nop eq complete and ./op2fdb eq complete
+        edit EPSLEG '2'
+        task efi2fdb
+          edit KIND 'clim2'
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/mc/efi_hdc'
+      endfamily
+      family arch_nop
+        trigger nop2fdb eq complete
+        edit EPSLEG '2'
+        edit SMSFILES '/home/ma/emos/def/emc_33r1/archive'
+        family 2t
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '2t'
+          task eficlim
+            label info ""
+        endfamily
+        family 10ff
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '10ff'
+          task eficlim
+            label info ""
+        endfamily
+        family 10fg
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '10fg'
+          task eficlim
+            label info ""
+        endfamily
+        family tp
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'tp'
+          task eficlim
+            label info ""
+        endfamily
+        family 2tmin
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '2tmin'
+          task eficlim
+            label info ""
+        endfamily
+        family 2tmax
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '2tmax'
+          task eficlim
+            label info ""
+        endfamily
+        family ts
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'ts'
+          task eficlim
+            label info ""
+        endfamily
+        family hsttmax
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'hsttmax'
+          task eficlim
+            label info ""
+        endfamily
+        family 10dd
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '10dd'
+          task eficlim
+            label info ""
+        endfamily
+        family 850t
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '850t'
+          task eficlim
+            label info ""
+        endfamily
+        family 500z
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '500z'
+          task eficlim
+            label info ""
+        endfamily
+        family 2tmean
+          edit step2 '24'
+          edit RF_NAME '2t'
+          edit step1 '0'
+          task eficlim
+            label info ""
+        endfamily
+        family 10ffmean
+          edit step2 '24'
+          edit RF_NAME '10ff'
+          edit step1 '0'
+          task eficlim
+            label info ""
+        endfamily
+        family tcc
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'tcc'
+          task eficlim
+            label info ""
+        endfamily
+        family tccmean
+          edit step2 '24'
+          edit RF_NAME 'tcc'
+          edit step1 '0'
+          task eficlim
+            label info ""
+        endfamily
+      endfamily
+      task efi_cleaner
+        trigger arch_nop eq complete and op eq complete and nop eq complete and op2fdb eq complete and nop2fdb eq complete
+        edit DELTA_DAY '-43'
+      family gdb
+        trigger ( op eq complete and nop eq complete) and ( arch_nop eq complete)
+        edit RHOST 'epsgrams'
+        edit RDIR '/webapps/epsgrams/data/'
+        edit KIND 'clim_15_days'
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /limits:linux_cluster
+        task sync_climate
+        task gclean
+          trigger sync_climate eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/pop/data/epsgrams/grams'
+          edit KEEP_DAYS '14'
+          edit REMOTE_KEEP_DAYS '14'
+        task gdb
+          trigger gclean eq complete and ( /mc/main:YMD ge /emc_33r1/efi_next/mn:YMD and /mc/main/00 eq complete)
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/pop/data/epsgrams/grams'
+          label files "="
+          label info "="
+          label local "="
+          label remote "="
+          event fdb
+        task glink
+          trigger gdb eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_33r1/pop/data/epsgrams/grams'
+      endfamily
+      family check_nrt
+        complete ./check_nrt/go eq complete
+        edit REFPATH '/mofc/hc2'
+        family catchup
+          task check_nrt
+            event ok
+        endfamily
+        family rt
+          trigger catchup eq complete
+          task check_nrt
+            event ok
+            cron -w 3 06:30
+        endfamily
+        task go
+          complete ./rt/check_nrt:ok or ./catchup/check_nrt:ok
+          trigger 0 eq 1
+      endfamily
+    endfamily
+  endfamily
+  family limits
+    limit mars 4
+    limit pftotal 20
+    limit pertic 13
+    limit modelepsA 13
+    limit modelepsB 15
+    limit pl 3
+    limit sfc 2
+    limit prodeps 5
+    limit prodwave 4
+    limit pdb 5
+    limit q2diss 5
+    limit efi 13
+    limit efih 13
+    limit refc 10
+    limit tc 5
+    limit webplots 10
+    limit dp 16
+    limit hind 14
+    limit pesh 20
+  endfamily
+endsuite
+suite metops_test
+  repeat date YMD 20090401 20191210 1
+  edit USER 'emos'
+  edit SCHOST 'c1a'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/c1a/emos_dir/0001/log'
+  edit USE_YMD 'true'
+  edit VERSION '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '00'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY ''
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit PGNPES '3'
+  edit SVNPES '8'
+  edit REINITIALIZE 'false'
+  edit DATEMASK '*.*.*'
+  edit REMOVE_ADIR 'false'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/metops_test/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/metops_test/include'
+  edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+  edit SMSURLBASE 'http://www.ecmwf.int'
+  edit SMSURL 'publications/manuals/sms'
+  edit ACCOUNT 'oosu'
+  edit STREAM 'DA'
+  edit EMOS_STREAM 'DA'
+  edit FAMILY 'metops_test'
+  edit MARS_DB 'marsod'
+  edit OBSHOST 'dummy'
+  edit SUITE_START '2000022100'
+  edit QUEUE 'plots-medium'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+  edit LOGDIR '/vol/emos_nc/output'
+  edit SMSOUT '/vol/emos_nc/output'
+  edit SLEEPTIME '1'
+  inlimit /limits:linux_cluster
+  clock hybrid 
+  family 00
+    edit EMOS_BASE '00'
+    family web
+      family quartiles
+        edit PLOT_AREAS 'Europe,North_America,Asia,South_Atlantic,South_Pacific,Australia'
+        edit STEP_LIST '18/TO/126/by/12'
+        edit STEP_PLOT '12/TO/120/by/12'
+        edit ENSEMBLES '50'
+        time 10:00
+        task w_tp_quartiles
+        task w_wind_quartiles
+        task w_wgust_quartiles
+        task w_wind925_quartiles
+        task w_cape_quartiles
+      endfamily
+      family genesis
+        task w_tc_genesis
+          edit UPDATE_WEB_NOW 'yes'
+          time 10:00
+      endfamily
+      family swfdp_pacific
+        edit SMSFILES '/home/ma/emos/def/metops_test/smsfiles/swfdp_pacific'
+        edit PLOTDOM '-40/150/10/-120'
+        edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+        edit UPDATE_WEB_NOW 'yes'
+        edit SMSINCLUDE '/home/ma/emos/def/o/include'
+        edit PLOT_STEPS '12/to/144/by/12'
+        time 10:00
+        family proba
+          task swfdp_pacific_proba
+          task swfdp_pacific_tp
+            trigger swfdp_pacific_proba eq complete
+          task swfdp_pacific_ff
+            trigger swfdp_pacific_proba eq complete
+          task swfdp_pacific_tp24
+            trigger swfdp_pacific_proba eq complete
+            edit STEPS '24/48/72/96/120'
+          task swfdp_pacific_proba_clean
+            trigger swfdp_pacific_tp eq complete and swfdp_pacific_ff eq complete and swfdp_pacific_tp24 eq complete
+        endfamily
+        family efi
+          edit QUEUE 'plots-medium'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSINCLUDE '/home/ma/emos/def/o/include'
+          inlimit /limits:linux_cluster
+          family swfdp_pacific_tpi
+            task w_efi
+              edit PARAMETER 'tpi'
+          endfamily
+          family swfdp_pacific_10wsi
+            task w_efi
+              edit PARAMETER '10wsi'
+          endfamily
+          family swfdp_pacific_2ti
+            task w_efi
+              edit PARAMETER '2ti'
+          endfamily
+          family swfdp_pacific_10fgi
+            task w_efi
+              edit PARAMETER '10fgi'
+          endfamily
+        endfamily
+        task pb_swh
+        task pb_mwp
+        task swfdp_pacific_wavegrams
+          edit SMSINCLUDE '/home/ma/emos/def/metops_test/include'
+        family maps
+          edit PLOT_LOCATION '/webplots_e/data/swfdp_pacific/maps'
+          edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+          task swfdp_pacific_maps
+          task swfdp_pacific_toweb1
+            trigger swfdp_pacific_maps eq complete
+          task swfdp_pacific_toweb2
+            trigger swfdp_pacific_maps eq complete
+          task swfdp_pacific_toweb3
+            trigger swfdp_pacific_maps eq complete
+          task swfdp_pacific_clean
+            trigger swfdp_pacific_toweb1 eq complete and swfdp_pacific_toweb2 eq complete and swfdp_pacific_toweb3 eq complete
+        endfamily
+        family waves
+          edit PLOT_LEGS '1'
+          edit STEPS '6/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+          task wave_data
+          family plots
+            task swfdp_pacific_swh
+              trigger ../wave_data eq complete
+            task swfdp_pacific_mwp
+              trigger ../wave_data eq complete
+            task swfdp_pacific_wwsh
+              trigger ../wave_data eq complete
+            task swfdp_pacific_wwmp
+              trigger ../wave_data eq complete
+            task swfdp_pacific_tssh
+              trigger ../wave_data eq complete
+            task swfdp_pacific_tsmp
+              trigger ../wave_data eq complete
+          endfamily
+          task swfdp_pacific_wave_clean
+            trigger ./plots eq complete
+        endfamily
+      endfamily
+      family swdfp
+        edit SMSFILES '/home/ma/emos/def/metops_test/smsfiles/swdfp'
+        edit PLOTDOM '-45/-10/6/62'
+        edit UPDATE_WEB_NOW 'yes'
+        edit SMSINCLUDE '/home/ma/emos/def/o/include'
+        edit PLOT_STEPS '12/to/144/by/12'
+        time 10:00
+        family waves
+          edit SMSINCLUDE '/home/ma/emos/def/o/include'
+          edit PLOT_LEGS '1'
+          edit STEPS '6/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+          task wave_data
+          family plots
+            task swdfp_swh
+              trigger ../wave_data eq complete
+            task swdfp_mwp
+              trigger ../wave_data eq complete
+            task swdfp_wwsh
+              trigger ../wave_data eq complete
+            task swdfp_wwmp
+              trigger ../wave_data eq complete
+            task swdfp_tssh
+              trigger ../wave_data eq complete
+            task swdfp_tsmp
+              trigger ../wave_data eq complete
+          endfamily
+          task swdfp_wave_clean
+            trigger ./plots eq complete
+        endfamily
+        task pb_swdfp_swh
+        task pb_swdfp_mwp
+      endfamily
+      family wave_verif
+        edit UPDATE_WEB_NOW 'yes'
+        time 10:00
+        task w_wave_timeseries
+        task w_wave_annualscores
+        task w_wave_intercomparison
+      endfamily
+      family newcluster
+        task cluster_plot
+          edit UPDATE_WEB_NOW 'yes'
+          time 10:00
+      endfamily
+    endfamily
+  endfamily
+  family 12
+    edit EMOS_BASE '12'
+    family web
+      family quartiles
+        edit PLOT_AREAS 'Europe,North_America,Asia,South_Atlantic,South_Pacific,Australia'
+        edit STEP_LIST '18/TO/126/by/12'
+        edit STEP_PLOT '12/TO/120/by/12'
+        edit ENSEMBLES '50'
+        time 20:45
+        task w_tp_quartiles
+        task w_wind_quartiles
+        task w_wgust_quartiles
+        task w_wind925_quartiles
+        task w_cape_quartiles
+      endfamily
+      family genesis
+        task w_tc_genesis
+          edit UPDATE_WEB_NOW 'yes'
+          time 20:45
+      endfamily
+      family swfdp_pacific
+        edit SMSFILES '/home/ma/emos/def/metops_test/smsfiles/swfdp_pacific'
+        edit PLOTDOM '-40/150/10/-120'
+        edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+        edit UPDATE_WEB_NOW 'yes'
+        edit SMSINCLUDE '/home/ma/emos/def/o/include'
+        edit PLOT_STEPS '12/to/144/by/12'
+        time 20:45
+        family proba
+          task swfdp_pacific_proba
+          task swfdp_pacific_tp
+            trigger swfdp_pacific_proba eq complete
+          task swfdp_pacific_ff
+            trigger swfdp_pacific_proba eq complete
+          task swfdp_pacific_tp24
+            trigger swfdp_pacific_proba eq complete
+            edit STEPS '24/48/72/96/120'
+          task swfdp_pacific_proba_clean
+            trigger swfdp_pacific_tp eq complete and swfdp_pacific_ff eq complete and swfdp_pacific_tp24 eq complete
+        endfamily
+        family efi
+          edit QUEUE 'plots-medium'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSINCLUDE '/home/ma/emos/def/o/include'
+          inlimit /limits:linux_cluster
+          family swfdp_pacific_tpi
+            task w_efi
+              edit PARAMETER 'tpi'
+          endfamily
+          family swfdp_pacific_10wsi
+            task w_efi
+              edit PARAMETER '10wsi'
+          endfamily
+          family swfdp_pacific_2ti
+            task w_efi
+              edit PARAMETER '2ti'
+          endfamily
+          family swfdp_pacific_10fgi
+            task w_efi
+              edit PARAMETER '10fgi'
+          endfamily
+        endfamily
+        task pb_swh
+        task pb_mwp
+        task swfdp_pacific_wavegrams
+          edit SMSINCLUDE '/home/ma/emos/def/metops_test/include'
+        family maps
+          edit PLOT_LOCATION '/webplots_e/data/swfdp_pacific/maps'
+          edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+          task swfdp_pacific_maps
+          task swfdp_pacific_toweb1
+            trigger swfdp_pacific_maps eq complete
+          task swfdp_pacific_toweb2
+            trigger swfdp_pacific_maps eq complete
+          task swfdp_pacific_toweb3
+            trigger swfdp_pacific_maps eq complete
+          task swfdp_pacific_clean
+            trigger swfdp_pacific_toweb1 eq complete and swfdp_pacific_toweb2 eq complete and swfdp_pacific_toweb3 eq complete
+        endfamily
+        family waves
+          edit PLOT_LEGS '1'
+          edit STEPS '6/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+          task wave_data
+          family plots
+            task swfdp_pacific_swh
+              trigger ../wave_data eq complete
+            task swfdp_pacific_mwp
+              trigger ../wave_data eq complete
+            task swfdp_pacific_wwsh
+              trigger ../wave_data eq complete
+            task swfdp_pacific_wwmp
+              trigger ../wave_data eq complete
+            task swfdp_pacific_tssh
+              trigger ../wave_data eq complete
+            task swfdp_pacific_tsmp
+              trigger ../wave_data eq complete
+          endfamily
+          task swfdp_pacific_wave_clean
+            trigger ./plots eq complete
+        endfamily
+      endfamily
+      family swdfp
+        edit SMSFILES '/home/ma/emos/def/metops_test/smsfiles/swdfp'
+        edit PLOTDOM '-45/-10/6/62'
+        edit UPDATE_WEB_NOW 'yes'
+        time 20:45
+        family waves
+          edit PLOT_LEGS '1'
+          edit STEPS '6/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+          task wave_data
+          family plots
+            task swdfp_wwsh
+              trigger ../wave_data eq complete
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+  endfamily
+endsuite
+suite verify
+  edit METPY_VERSION '3.4.2.emos'
+  edit METPY 'metpy_001'
+  edit VERIFY 'metpy_001'
+  edit FIRST_DATE '20091008'
+  edit LAST_DATE '20111031'
+  edit DATE_INCREMENT '1'
+  edit RUNS_PER_DAY '1'
+  edit OPERATIONAL 'yes'
+  edit USER 'emos'
+  edit SCHOST 'c1a'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/c1a/emos_dir/0001/log'
+  edit USE_YMD 'true'
+  edit VERSION '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '1'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '12'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY ''
+  edit STHOST_BKUP 'toto'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit PGNPES '3'
+  edit SVNPES '8'
+  edit REINITIALIZE 'false'
+  edit DATEMASK '*.*.*'
+  edit YMD 'dummy'
+  edit REMOVE_ADIR 'false'
+  edit ANNPES '18'
+  edit ANMEM '3584'
+  edit ANSTACK '700'
+  edit ANMRFS '160'
+  edit FCNPES '24'
+  edit FCMEM '3584'
+  edit FCSTACK '690'
+  edit FCMRFS '32'
+  edit PERIOD_4D '12'
+  edit WINDOW_LENGTH_4D '12'
+  edit WINDOW_OFFSET_4D '12'
+  edit MKCMANPES '6'
+  edit MKCMAMEM '3284'
+  edit MKCMASTACK '600'
+  edit MKCMAMRFS '600'
+  edit SMSHOME '/home/ma/emos/def/verify'
+  edit SMSFILES '/home/ma/emos/def/verify'
+  edit SMSINCLUDE '/home/ma/emos/def/verify/include'
+  edit ACCOUNT 'oosu'
+  edit STREAM 'DA'
+  edit EMOS_STREAM 'DA'
+  edit MARS_DB 'marsod'
+  edit OBSHOST 'ha_pp'
+  edit SUITE_START '19971117'
+  edit SCRIPTFILES '/home/ma/emos/def/verify/scripts'
+  edit VERIFY_CACHE '/var/tmp/verify'
+  edit WSHOST 'swarm'
+  edit QUEUE 'verify'
+  edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+  edit LOGDIR '/vol/emos_nc/output'
+  edit SMSOUT '/vol/emos_nc/output'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family 00
+    repeat date YMD 20091009 20111031 1
+    edit SMSFILES '/home/ma/emos/def/verify/verify_oper'
+    edit EMOS_BASE '00'
+    family hr
+      trigger /o/lag/00/archive/fc240 eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'oper'
+      limit count 3
+      inlimit count
+      task hr_retrieve
+        edit SMSTRIES '2'
+      family z
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'z'
+        task hr_upperair
+      endfamily
+      family t
+        trigger hr_retrieve eq complete
+        edit PARAMETER 't'
+        task hr_upperair
+      endfamily
+      family u_v_ff
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'u,v,ff'
+        task hr_upperair
+          edit SMSPASS 'stripped'
+      endfamily
+      family r
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'r'
+        task hr_upperair
+      endfamily
+      family q
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'q'
+        task hr_upperair
+      endfamily
+      family o3
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'o3'
+        task hr_upperair
+      endfamily
+      task hr_sfc
+        trigger hr_retrieve eq complete
+      task hr_to_ct
+        trigger hr_retrieve eq complete
+      task hr_from_ct
+        trigger hr_to_ct eq complete
+      task hr_to_ct_wind_850
+        trigger hr_retrieve eq complete
+      task hr_from_ct_wind_850
+        trigger hr_to_ct_wind_850 eq complete
+      task hr_to_ct_wind_250
+        trigger hr_retrieve eq complete
+      task hr_from_ct_wind_250
+        trigger hr_to_ct_wind_250 eq complete
+    endfamily
+    family hrobs
+      trigger ./hr eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores1'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FDB_HOST 'scores1'
+      edit STREAM 'oper'
+      edit DELTA_DAY '-2'
+      limit count 2
+      inlimit count
+      task hrobs_retrieve1
+        edit SMSTRIES '2'
+      task hrobs_retrieve2
+        edit SMSTRIES '2'
+      family z
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'z'
+        task hrobs
+      endfamily
+      family t
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 't'
+        task hrobs
+      endfamily
+      family u_v_ff
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'u,v,ff'
+        task hrobs
+      endfamily
+      family r
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'r'
+        task hrobs
+      endfamily
+      family q
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'q'
+        task hrobs
+      endfamily
+    endfamily
+    family ctrl
+      trigger /mc/main/00/legB/postproc eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'enfo'
+      limit count 2
+      inlimit count
+      task ctrl_retrieve
+      family z
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'z'
+        task ctrl_upperair
+      endfamily
+      family t
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 't'
+        task ctrl_upperair
+      endfamily
+      family u_v_ff
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'u,v,ff'
+        task ctrl_upperair
+      endfamily
+      family r
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'r'
+        task ctrl_upperair
+      endfamily
+      family q
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'q'
+        task ctrl_upperair
+      endfamily
+      task ctrl_sfc
+        trigger ctrl_retrieve eq complete
+      task ctrl_to_ct
+        trigger ctrl_retrieve eq complete
+      task ctrl_from_ct
+        trigger ctrl_to_ct eq complete
+      task ctrl_to_ct_wind_850
+        trigger ctrl_retrieve eq complete
+      task ctrl_from_ct_wind_850
+        trigger ctrl_to_ct_wind_850 eq complete
+      task ctrl_to_ct_wind_250
+        trigger ctrl_retrieve eq complete
+      task ctrl_from_ct_wind_250
+        trigger ctrl_to_ct_wind_250 eq complete
+    endfamily
+    family ctrlobs
+      trigger ./ctrl eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores1'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FDB_HOST 'scores1'
+      edit STREAM 'enfo'
+      edit DELTA_DAY '-2'
+      limit count 2
+      inlimit count
+      task ctrlobs_retrieve1
+        edit SMSTRIES '2'
+      task ctrlobs_retrieve2
+        edit SMSTRIES '2'
+      family z
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'z'
+        task ctrlobs
+      endfamily
+      family t
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 't'
+        task ctrlobs
+      endfamily
+      family r
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'r'
+        task ctrlobs
+      endfamily
+      family q
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'q'
+        task ctrlobs
+      endfamily
+      family u_v_ff
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'u,v,ff'
+        task ctrlobs
+      endfamily
+    endfamily
+    family eps
+      trigger /mc/main/00/legB/postproc eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'enfo'
+      limit count 4
+      inlimit count
+      task eps_retrieve
+        edit SMSTRIES '2'
+      task eps_to_ct_z
+        trigger eps_retrieve eq complete
+      task eps_to_ct_msl
+        trigger eps_retrieve eq complete
+      task eps_to_ct_t
+        trigger eps_retrieve eq complete
+      task eps_from_ct
+        trigger eps_to_ct_z eq complete and eps_to_ct_t eq complete and eps_to_ct_msl eq complete
+      task eps_to_ct_wind_850
+        trigger eps_retrieve eq complete
+      task eps_from_ct_wind_850
+        trigger eps_to_ct_wind_850 eq complete
+      task eps_to_ct_wind_250
+        trigger eps_retrieve eq complete
+      task eps_from_ct_wind_250
+        trigger eps_to_ct_wind_250 eq complete
+      task eps_spread_score1
+        trigger eps_to_ct_z eq complete and eps_to_ct_t eq complete and eps_to_ct_msl eq complete
+      task eps_spread_score2
+        trigger eps_to_ct_wind_850 eq complete and eps_to_ct_wind_250 eq complete
+      task eps_cal_val
+      task eps_mean_spread_z
+        trigger eps_to_ct_z eq complete
+      task eps_mean_spread_t
+        trigger eps_to_ct_t eq complete
+      task eps_mean_spread_msl
+        trigger eps_to_ct_msl eq complete
+      task eps_mean_spread_wind_850
+        trigger eps_to_ct_wind_850 eq complete
+      task eps_mean_spread_wind_250
+        trigger eps_to_ct_wind_250 eq complete
+    endfamily
+    family clim
+      trigger /o/main/00/an eq complete
+      edit STREAM 'oper'
+      limit count 1
+      inlimit count
+      task clim_z
+      task clim_msl
+      task clim_t
+      task clim_wind_850
+      task clim_wind_250
+      task clim_waves_mwp
+      task clim_waves_swh
+    endfamily
+    family waves
+      trigger /mc/main/00/legB/postproc eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      limit count 4
+      inlimit count
+      task waves_retrieve
+        edit SMSTRIES '2'
+      task waves_retrieve_ff
+        edit SMSTRIES '2'
+      task waves_eps_retrieve
+        edit SMSTRIES '2'
+      task waves_ctrl_retrieve
+        edit SMSTRIES '2'
+      task waves
+        trigger waves_retrieve eq complete
+      task waves_ff
+        trigger waves_retrieve_ff eq complete
+      task waves_ff_sea
+        trigger waves_ff eq complete
+      task waves_to_ct
+        trigger waves eq complete
+      task waves_from_ct
+        trigger waves_to_ct eq complete
+      task waves_ctrl
+        trigger waves_ctrl_retrieve eq complete
+      task waves_ctrl_to_ct
+        trigger waves_ctrl eq complete
+      task waves_ctrl_from_ct
+        trigger waves_ctrl_to_ct eq complete
+      task waves_eps_to_ct
+        trigger waves_eps_retrieve eq complete
+      task waves_eps_from_ct
+        trigger waves_eps_to_ct eq complete
+      task waves_eps_mean_spread
+        trigger waves_eps_to_ct eq complete
+      task waves_eps_spread_score
+        trigger waves_eps_to_ct eq complete
+    endfamily
+    family other
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'oper'
+      limit count 3
+      inlimit count
+      time 08:00
+      task other_ukmo_fc
+      task other_ukmo_an
+      task other_ncep_fc
+      task other_ncep_an
+      task other_dwd_fc
+      task other_dwd_an
+      task other_metfr_fc
+      task other_metfr_an
+      task other_jma_fc
+      task other_jma_an
+      task other_cmc_fc
+      task other_cmc_an
+      task other_bom_fc
+      task other_bom_an
+    endfamily
+    task restart
+      time 17:00
+  endfamily
+  family 12
+    repeat date YMD 20091008 20111031 1
+    edit SMSFILES '/home/ma/emos/def/verify/verify_oper'
+    edit EMOS_BASE '12'
+    edit OVERWRITE 'yes'
+    family hr
+      trigger /o/lag/12/archive/fc240 eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'oper'
+      limit count 3
+      inlimit count
+      task hr_retrieve
+        edit SMSTRIES '2'
+      family z
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'z'
+        task hr_upperair
+      endfamily
+      family t
+        trigger hr_retrieve eq complete
+        edit PARAMETER 't'
+        task hr_upperair
+      endfamily
+      family u_v_ff
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'u,v,ff'
+        task hr_upperair
+      endfamily
+      family r
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'r'
+        task hr_upperair
+      endfamily
+      family q
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'q'
+        task hr_upperair
+      endfamily
+      family o3
+        trigger hr_retrieve eq complete
+        edit PARAMETER 'o3'
+        task hr_upperair
+      endfamily
+      task hr_sfc
+        trigger hr_retrieve eq complete
+      task hr_to_ct
+        trigger hr_retrieve eq complete
+      task hr_from_ct
+        trigger hr_to_ct eq complete
+      task hr_to_ct_wind_850
+        trigger hr_retrieve eq complete
+      task hr_from_ct_wind_850
+        trigger hr_to_ct_wind_850 eq complete
+      task hr_to_ct_wind_250
+        trigger hr_retrieve eq complete
+      task hr_from_ct_wind_250
+        trigger hr_to_ct_wind_250 eq complete
+    endfamily
+    family hrobs
+      trigger ./hr eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores1'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FDB_HOST 'scores1'
+      edit STREAM 'oper'
+      edit DELTA_DAY '-2'
+      edit OVERWRITE 'yes'
+      limit count 2
+      inlimit count
+      task hrobs_retrieve1
+        edit SMSTRIES '2'
+      task hrobs_retrieve2
+        edit SMSTRIES '2'
+      family z
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'z'
+        task hrobs
+      endfamily
+      family t
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 't'
+        task hrobs
+      endfamily
+      family u_v_ff
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'u,v,ff'
+        task hrobs
+      endfamily
+      family r
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'r'
+        task hrobs
+      endfamily
+      family q
+        trigger hrobs_retrieve1 eq complete and hrobs_retrieve2 eq complete
+        edit PARAMETER 'q'
+        task hrobs
+      endfamily
+    endfamily
+    family ctrl
+      trigger /mc/main/12/legB/postproc eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'enfo'
+      limit count 2
+      inlimit count
+      task ctrl_retrieve
+        edit SMSTRIES '2'
+      family z
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'z'
+        task ctrl_upperair
+      endfamily
+      family t
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 't'
+        task ctrl_upperair
+      endfamily
+      family u_v_ff
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'u,v,ff'
+        task ctrl_upperair
+      endfamily
+      family r
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'r'
+        task ctrl_upperair
+      endfamily
+      family q
+        trigger ctrl_retrieve eq complete
+        edit PARAMETER 'q'
+        task ctrl_upperair
+      endfamily
+      task ctrl_sfc
+        trigger ctrl_retrieve eq complete
+      task ctrl_to_ct
+        trigger ctrl_retrieve eq complete
+      task ctrl_from_ct
+        trigger ctrl_to_ct eq complete
+      task ctrl_to_ct_wind_850
+        trigger ctrl_retrieve eq complete
+      task ctrl_from_ct_wind_850
+        trigger ctrl_to_ct_wind_850 eq complete
+      task ctrl_to_ct_wind_250
+        trigger ctrl_retrieve eq complete
+      task ctrl_from_ct_wind_250
+        trigger ctrl_to_ct_wind_250 eq complete
+    endfamily
+    family ctrlobs
+      trigger ./ctrl eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores1'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FDB_HOST 'scores1'
+      edit STREAM 'enfo'
+      edit DELTA_DAY '-2'
+      edit OVERWRITE 'yes'
+      limit count 2
+      inlimit count
+      task ctrlobs_retrieve1
+        edit SMSTRIES '2'
+      task ctrlobs_retrieve2
+        edit SMSTRIES '2'
+      family z
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'z'
+        task ctrlobs
+      endfamily
+      family t
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 't'
+        task ctrlobs
+      endfamily
+      family r
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'r'
+        task ctrlobs
+      endfamily
+      family q
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'q'
+        task ctrlobs
+      endfamily
+      family u_v_ff
+        trigger ctrlobs_retrieve1 eq complete and ctrlobs_retrieve2 eq complete
+        edit PARAMETER 'u,v,ff'
+        task ctrlobs
+      endfamily
+    endfamily
+    family eps
+      trigger /mc/main/12/legB/postproc eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'enfo'
+      limit count 2
+      inlimit count
+      task eps_retrieve
+        edit SMSTRIES '2'
+      task eps_to_ct_z
+        trigger eps_retrieve eq complete
+      task eps_to_ct_msl
+        trigger eps_retrieve eq complete
+      task eps_to_ct_t
+        trigger eps_retrieve eq complete
+      task eps_from_ct
+        trigger eps_to_ct_z eq complete and eps_to_ct_t eq complete and eps_to_ct_msl eq complete
+      task eps_to_ct_wind_850
+        trigger eps_retrieve eq complete
+      task eps_from_ct_wind_850
+        trigger eps_to_ct_wind_850 eq complete
+      task eps_to_ct_wind_250
+        trigger eps_retrieve eq complete
+      task eps_from_ct_wind_250
+        trigger eps_to_ct_wind_250 eq complete
+      task eps_spread_score1
+        trigger eps_to_ct_z eq complete and eps_to_ct_t eq complete and eps_to_ct_msl eq complete
+      task eps_spread_score2
+        trigger eps_to_ct_wind_850 eq complete and eps_to_ct_wind_250 eq complete
+      task eps_cal_val
+      task eps_mean_spread_z
+        trigger eps_to_ct_z eq complete
+      task eps_mean_spread_t
+        trigger eps_to_ct_t eq complete
+      task eps_mean_spread_msl
+        trigger eps_to_ct_msl eq complete
+      task eps_mean_spread_wind_850
+        trigger eps_to_ct_wind_850 eq complete
+      task eps_mean_spread_wind_250
+        trigger eps_to_ct_wind_250 eq complete
+    endfamily
+    family clim
+      trigger /o/main/12/an eq complete
+      edit STREAM 'oper'
+      limit count 1
+      inlimit count
+      task clim_z
+      task clim_msl
+      task clim_t
+      task clim_wind_850
+      task clim_wind_250
+      task clim_waves_mwp
+      task clim_waves_swh
+    endfamily
+    family waves
+      trigger /mc/main/12/legB/postproc eq complete
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit OVERWRITE 'yes'
+      limit count 4
+      inlimit count
+      task waves_retrieve
+        edit SMSTRIES '2'
+      task waves_retrieve_ff
+        edit SMSTRIES '2'
+      task waves_eps_retrieve
+        edit SMSTRIES '2'
+      task waves_ctrl_retrieve
+        edit SMSTRIES '2'
+      task waves
+        trigger waves_retrieve eq complete
+        edit SMSSTATUS '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      task waves_ff
+        trigger waves_retrieve_ff eq complete
+      task waves_ff_sea
+        trigger waves_ff eq complete
+      task waves_to_ct
+        trigger waves eq complete
+      task waves_from_ct
+        trigger waves_to_ct eq complete
+      task waves_ctrl
+        trigger waves_ctrl_retrieve eq complete
+      task waves_ctrl_to_ct
+        trigger waves_ctrl eq complete
+      task waves_ctrl_from_ct
+        trigger waves_ctrl_to_ct eq complete
+      task waves_eps_to_ct
+        trigger waves_eps_retrieve eq complete
+      task waves_eps_from_ct
+        trigger waves_eps_to_ct eq complete
+      task waves_eps_mean_spread
+        trigger waves_eps_to_ct eq complete
+      task waves_eps_spread_score
+        trigger waves_eps_to_ct eq complete
+    endfamily
+    family other
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'oper'
+      limit count 3
+      inlimit count
+      time 22:00
+      task other_ukmo_fc
+      task other_ukmo_an
+      task other_ncep_fc
+      task other_ncep_an
+      task other_dwd_fc
+      task other_dwd_an
+      task other_metfr_fc
+      task other_metfr_an
+      task other_jma_fc
+      task other_jma_an
+      task other_cmc_fc
+      task other_cmc_an
+      task other_bom_fc
+      task other_bom_an
+    endfamily
+    task restart
+      time 17:30
+  endfamily
+  family 06
+    repeat date YMD 20091008 20111031 1
+    edit SMSFILES '/home/ma/emos/def/verify/verify_oper'
+    edit EMOS_BASE '06'
+    family bc
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'scda'
+      limit count 1
+      inlimit count
+      task bc_upperair
+      task bc_sfc
+    endfamily
+    task restart
+      time 17:00
+  endfamily
+  family 18
+    repeat date YMD 20091008 20111031 1
+    edit SMSFILES '/home/ma/emos/def/verify/verify_oper'
+    edit EMOS_BASE '18'
+    family bc
+      edit WSHOST 'swarm'
+      edit QUEUE 'verify at scores2'
+      edit SMSCMD 'smssubmit.claude1 %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOBOUT%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'scda'
+      limit count 1
+      inlimit count
+      task bc_upperair
+      task bc_sfc
+    endfamily
+    task restart
+      time 09:00
+  endfamily
+endsuite
+suite macc
+  edit USER 'emos'
+  edit SCHOST 'bee01'
+  edit SCHOST_BKUP 'drn01'
+  edit WSHOST 'swarm'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/emos_dir/f93i/log'
+  edit USE_YMD 'true'
+  edit YMD '20090601'
+  edit DATEMASK '*.*.*'
+  edit VERSION 'f93i'
+  edit INIEXPVER '0001'
+  edit TCINIEXPVER '0001'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '00'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'tc'
+  edit USER_PRIORITY '70'
+  edit REINITIALIZE 'false'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/macc/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/macc/include'
+  edit ACCOUNT 'oosu'
+  edit STREAM 'EF'
+  edit EMOS_STREAM 'EF'
+  edit ENSEMBLES '50'
+  edit ENS_SIZE '50'
+  edit MARS_DB 'marsod'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit SMSLOGHOST 'c1a'
+  edit SMSLOGPORT '9316'
+  edit OD_PROJ 'od'
+  edit SUITE_START '20090602'
+  edit QUEUE 'emos-e'
+  edit QUEUE_EPILOG 'emos-exp'
+  edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB%'
+  edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/vol/emos_nc/output'
+  edit SMSOUT '/vol/emos_nc/output'
+  edit SLEEPTIME '1'
+  inlimit /limits:swarm
+  clock hybrid 
+  family limits
+    limit linux_cluster 8
+    limit raq_ensemble 2
+    limit calchas 4
+  endfamily
+  family gac
+    inlimit /macc/limits:linux_cluster
+    family plot
+      edit METPY 'metpy'
+      edit UPDATE_WEB_NOW 'yes'
+      edit DO_PUSH_TO_WEB 'yes'
+      family nrt
+        repeat date YMD 20090928 20111215 1
+        edit METPY 'metpy'
+        edit VERSION 'f93i'
+        edit PARAMETERS 'co,go3'
+        edit LEVELS '850,500,300,50'
+        task nrt_fields
+          trigger ( /ecgems/f93i/an/lag:YMD gt /macc/gac/plot/nrt:YMD) or ( /ecgems/f93i/an/lag:YMD eq /macc/gac/plot/nrt:YMD and /ecgems/f93i/an/lag/00/archive eq complete)
+        task nrt_totalcolumns
+          trigger nrt_fields eq complete
+          edit PARAMETERS 'tcco,gtco3'
+        task nrt_zonalmean
+          trigger nrt_totalcolumns eq complete
+          edit METPY 'metpy_new'
+        task nrt_opticaldepth
+          trigger nrt_zonalmean eq complete
+          edit AERTYPES 'total,natural,anthropogenic'
+          edit METPY 'metpy_new'
+        task nrt_uvindex
+          trigger nrt_opticaldepth eq complete
+      endfamily
+      family fcampaign
+        repeat date YMD 20090928 20111215 1
+        edit VERSION 'f7kn'
+        edit OWNER 'nal'
+        family deps
+          task dummy
+            time 09:00
+        endfamily
+        task fcampaign_retrieve_and_process
+          trigger deps eq complete
+        task fcampaign_make_horiz_plots
+          trigger fcampaign_retrieve_and_process eq complete
+        task fcampaign_make_xs_plots
+          trigger fcampaign_make_horiz_plots eq complete
+        task fcampaign_cleanup
+          trigger fcampaign_make_xs_plots eq complete
+      endfamily
+      family gems_reanalysis
+        repeat enumerated month "200301" "200302" "200303" "200304" "200305" "200306" "200307" "200308" "200309" "200310" "200311" "200312" "200401" "200402" "200403" "200404" "200405" "200406" "200407" "200408" "200409" "200410" "200411" "200412" "200501" "200502" "200503" "200504" "200505" "200506" "200507" "200508" "200509" "200510" "200511" "200512" "200601" "200602" "200603" "200604" "200605" "200606" "200607" "200608" "200609" "200610" "200611" "200612" "200701" "200702" "200703" " [...]
+        edit VERSION 'f026'
+        edit LEVELS '850,500,300,50'
+        edit title 'GEMS_Reanalysis'
+        edit PARAMETERS 'co,go3,hcho,ch4,nox'
+        task gems_monthly_fields
+        task gems_monthly_zonalmean
+          trigger gems_monthly_fields eq complete
+          edit METPY 'metpy_new'
+        task gems_monthly_totalcolumns
+          trigger gems_monthly_zonalmean eq complete
+          edit PARAMETERS 'tcco,gtco3,tchcho,tcch4'
+      endfamily
+      family fire_products
+        repeat date YMD 20090928 20111215 1
+        edit METPY 'metpy_new'
+        family deps
+          task dummy
+            time 07:00
+        endfamily
+        task fire_radiative_power
+          trigger deps eq complete
+      endfamily
+    endfamily
+    family verif
+      family aer
+        family nrt
+          repeat date YMD 20090928 20111215 1
+          edit OWNER 'nal'
+          task aerover_nrt_make_plots
+            trigger ( /ecgems/f93i/an/lag:YMD gt /macc/gac/verif/aer/nrt:YMD) or ( /ecgems/f93i/an/lag:YMD eq /macc/gac/verif/aer/nrt:YMD and /ecgems/f93i/an/lag/00/archive eq complete)
+          family publish
+            repeat integer imonth 1 0 -1
+            task aerover_nrt_push_statistic_plots
+              trigger ../aerover_nrt_make_plots eq complete
+            task aerover_nrt_push_station_plots
+              trigger aerover_nrt_push_statistic_plots eq complete
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+  endfamily
+  family diss
+    task fcampaign_diss
+      trigger ( /macc/gac/plot/fcampaign:YMD gt /macc/diss/fcampaign_diss:YMD) or ( /macc/gac/plot/fcampaign:YMD eq /macc/diss/fcampaign_diss:YMD and /macc/gac/plot/fcampaign eq complete)
+      repeat date YMD 20090928 20111215 1
+    task nrt_diss
+      trigger ( /macc/gac/plot/nrt:YMD gt /macc/diss/nrt_diss:YMD) or ( /macc/gac/plot/nrt:YMD eq /macc/diss/nrt_diss:YMD and /macc/gac/plot/nrt eq complete)
+      repeat date YMD 20090928 20111215 1
+  endfamily
+endsuite
+suite ecgems
+  edit SMSFILES '/home/ma/emos/def/sync'
+  edit SLEEPTIME '1'
+  clock hybrid 
+  family f93i
+    family an
+      family lag
+        edit YMD '20100114'
+        family 00
+          task archive
+        endfamily
+        family 12
+          task archive
+        endfamily
+      endfamily
+    endfamily
+  endfamily
+  family f8na
+    family an
+      family lag
+        edit YMD '20010101'
+        family 00
+          task archive
+        endfamily
+        family 12
+          task archive
+        endfamily
+      endfamily
+    endfamily
+  endfamily
+endsuite
+suite e_36r1
+  edit CALC_PSBIAS 'true'
+  edit CALC_RSTRHBIAS 'false'
+  edit OBREALTIME 'true'
+  edit LFULL_IASI 'true'
+  edit USER 'emos'
+  edit SCHOST 'c1b'
+  edit STHOST '/s1b'
+  edit SCHOST_BKUP 'c1a'
+  edit STHOST_BKUP '/s1a'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit SMSLOGHOST 'c1b'
+  edit SMSLOGPORT '9316'
+  edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+  edit RESERVATION_ON '0'
+  edit VERSION '0046'
+  edit INIEXPVER '0045'
+  edit INISTREAM 'DCDA'
+  edit INIOFFSET_4D '3'
+  edit INICLASS 'od'
+  edit INILEVELS '91'
+  edit INIRESOL '1279'
+  edit FIRST_DAY '0'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '12'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY ''
+  edit INITIME '2009111800'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit PGNPES '64'
+  edit SVNPES '8'
+  edit ININPES '64'
+  edit REINITIALIZE 'false'
+  edit REINIEXPVER '0046'
+  edit REINIPERIOD_4D '12'
+  edit REINISTREAM 'DCDA'
+  edit REINIOFFSET '6'
+  edit REINI_NOT_ED 'false'
+  edit DATEMASK '*.*.*'
+  edit YMD '20091118'
+  edit USE_YMD 'true'
+  edit PARALLEL '4'
+  edit USER_PRIORITY '70'
+  edit FC_USER_PRIORITY '90'
+  edit ANNPES '192'
+  edit NPES_CCMA '%ANNPES%'
+  edit ANMEM '3584'
+  edit ANSTACK '700'
+  edit ANMRFS '160'
+  edit FCNPES '192'
+  edit FCMEM '3584'
+  edit FCSTACK '690'
+  edit FCMRFS '32'
+  edit PERIOD_4D '12'
+  edit WINDOW_LENGTH_4D '12'
+  edit WINDOW_OFFSET_4D '3'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/e_36r1'
+  edit SMSINCLUDE '/home/ma/emos/def/e_36r1/include'
+  edit ACCOUNT 'oesu'
+  edit STREAM 'DA'
+  edit EMOS_STREAM 'DA'
+  edit PGEN_BINDIR '/home/ma/emos/bin/diss'
+  edit PGEN_OBJDIR '/home/ma/emos/bin/diss'
+  edit DISS_REQDB_ROOT '/diss/requirements'
+  edit DISS_BINDIR '/diss/bin/DISS'
+  edit MARS_DB 'marsod'
+  edit OBSHOST 'pp1'
+  edit OBS_USER 'emos'
+  edit OBS_BASE '/pp1'
+  edit LANONLY 'true'
+  edit LAR_4V_EF 'true'
+  edit LFC_DIR_FREQ 'true'
+  edit SMSLOGTIMEOUT '10'
+  edit INIVARBC 'true'
+  edit RUN_3HOURS_PP '1'
+  edit VERIFY 'verify'
+  edit SUITE_START '2009100212'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit.36r1 %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+  edit SLEEPTIME '1'
+  inlimit /limits:c1b
+  clock hybrid 
+  family limits
+    limit mars 7
+    limit obs 1
+    limit ml 3
+    limit prod 20
+    limit q2diss 8
+    limit w2diss 2
+    limit pdb 8
+    limit prod_bc 6
+    limit prod_bc2 6
+    limit q2diss_bc 5
+    limit pdb_bc 2
+    limit prodcheck 1
+    limit backupprod 4
+    limit dissbackup 4
+    limit webplots 4
+    limit satmon 7
+    limit smon 3
+    limit obs_get 5
+    limit sync_fdb 1
+    limit sync_data 1
+    limit reservation 1
+    limit satimsim 20
+    limit satimsim_ret 5
+  endfamily
+  family main
+    trigger ( main:YMD le ( lag:YMD + 3))
+    repeat date YMD 20091118 20121212 1
+    family make
+      edit DELTA_DAY '-1'
+      edit EMOS_BASE '18'
+      edit STREAM 'DCDA'
+      task setup
+      task links
+        trigger setup eq complete
+        edit FSFAMILY 'an'
+        edit WSHOST 'bee01'
+      task datalinks
+        trigger setup eq complete and links eq complete
+        edit FSFAMILY 'an'
+      family bins
+        trigger ./links eq complete and ./datalinks eq complete
+        edit SMSFILES '/home/ma/emos/def/e_36r1/make'
+        task odbsql
+        task odbtools
+          trigger odbsql eq complete
+        task b2otools
+          trigger odbtools eq complete
+        task black
+          edit FSFAMILY 'an'
+        task ifs
+          trigger black eq complete and b2otools eq complete
+          edit FSFAMILY 'an'
+        task ssaabs
+          trigger ifs eq complete
+          edit FSFAMILY 'surf_anal'
+        task wamabs
+        task satrad
+          trigger ifs eq complete
+        task scat
+        task obstat
+          trigger odbsql eq complete
+        task satmon
+          trigger odbtools eq complete
+        task prepdata
+          trigger b2otools eq complete
+        task satimbin
+      endfamily
+      family const
+        edit SMSFILES '/home/ma/emos/def/e_36r1/make'
+        task wconst
+          trigger ../bins/wamabs eq complete
+        task wavini
+          trigger wconst eq complete
+          edit FSFAMILY 'fc'
+      endfamily
+      task obstat_ws
+        trigger links eq complete and datalinks eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSTRIES '1'
+        inlimit /limits:linux_cluster
+      task sync_basedir
+      task getini
+        trigger links eq complete and datalinks eq complete and ./bins/prepdata eq complete
+        edit FSFAMILY 'fc'
+      task inidata
+        trigger ./bins/ifs eq complete and getini eq complete
+        edit THREADS '8'
+        edit FSFAMILY 'fc'
+      family fc
+        trigger inidata eq complete and const eq complete
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task model
+          trigger getfcdata eq complete
+          edit FCLENGTH '15'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          meter step -1 15 15
+        task clean
+          trigger model eq complete
+          edit DELTA_DAY '-2'
+      endfamily
+      family prod
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod/make'
+        edit EMOS_DOMAIN 'g'
+        edit EMOS_TYPE 'fc'
+        edit EMOS_STREAM 'OPER'
+        task wparam
+          edit EMOS_TYPE 'wp'
+        task tf
+          edit EMOS_TYPE 'tf'
+        task sortreq
+        task bitmap
+        task clima
+        task disssch
+        task tools
+        task oper
+        task wave
+          edit EMOS_STREAM 'WAVE'
+      endfamily
+      task plotdb
+        trigger links eq complete and datalinks eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /limits:linux_cluster
+    endfamily
+    family 00dc
+      trigger make eq complete
+      edit EMOS_BASE '00'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/dc00/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc00/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc00/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        family getplus6
+          edit EMOS_BASE '06'
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/dc06/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc06/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc06/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete and ./getplus6 eq complete
+        family prepare_obs
+          trigger ./get eq complete and ./getplus6 eq complete
+          task preobs
+            edit mode 'not1crad'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+        family reservation
+          late -c +00:03
+          trigger ./get/get_stor eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task adv_res
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '30'
+            edit RESERVE_IN '30'
+            edit RESERVED_NODES '48'
+            edit RESERVATION_LABEL 'emos00dcA'
+            label info ""
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit PERIOD_4D '12'
+        edit WINDOW_LENGTH_4D '12'
+        edit WINDOW_OFFSET_4D '3'
+        edit ACCOUNT 'oedcdaan'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          event hires
+        task fetcherr
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+        task emiskf
+          trigger ./4dvar/uptraj_0/ifstraj eq complete
+          edit THREADS '1'
+        task update_psbias
+          trigger ./4dvar/ifstraj:finalwave
+        task update_rstrhbias
+          trigger ./4dvar/ifstraj:finalwave
+        task dcda_to_da
+          trigger ./4dvar eq complete and surf_anal eq complete
+          edit EMOS_TYPE 'an'
+          edit OPHOST 'c1b'
+        family reservation1
+          late -c +00:03
+          trigger ./4dvar/uptraj_0/ifstraj eq active or ./4dvar/uptraj_0/ifstraj eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:02 -c +00:02
+            edit RESERVED_CPUS '3328'
+            edit RESERVE_FOR '65'
+            label info ""
+          task rm_res
+            late -s +00:02 -c +00:02
+            edit RESERVATION_LABEL 'emos00'
+            label info ""
+          task set_class
+            late -s +00:02 -c +00:02
+            edit RESERVATION_DEFINITION 'default_nodiag'
+            label info ""
+        endfamily
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit EMOS_BASE '06'
+        edit ACCOUNT 'oedcdafc'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task model
+          late -s +00:02
+          trigger getfcdata eq complete
+          edit FCLENGTH '15'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          meter step -1 15 15
+        task ddh
+          trigger model eq complete
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete and ddh eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./getfcdata eq active or ./getfcdata eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '3072'
+            edit RESERVE_FOR '4'
+            label info ""
+        endfamily
+        family reservation2
+          late -c +00:03
+          trigger ./model eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reset_cpu
+            late -s +00:03 -c +00:02
+            complete /e_36r1/main/12/an/vardata eq active or /e_36r1/main/12/an/vardata eq complete
+            edit RESERVED_CPUS '0'
+            label info ""
+        endfamily
+      endfamily
+    endfamily
+    family 06
+      trigger make eq complete
+      edit EMOS_BASE '06'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DA'
+      edit LAR_4V_EF 'false'
+      edit LFC_DIR_FREQ 'false'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/ex06/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete
+        family prepare_obs
+          trigger ./get eq complete
+          task preobs
+            edit mode 'not1crad'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit ACCOUNT 'oeoperan'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          trigger ../../00dc/fc/model:step ge 6 or ../../00dc/fc/model eq complete
+          event hires
+        task fetcherr
+          trigger ../../00dc/an eq complete
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit ACCOUNT 'oeoperfc'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task getpersSST
+          trigger getfcdata eq complete
+          edit SSTLEN '9'
+          edit SSTINT '1'
+          edit THREADS '2'
+          edit NPES '16'
+          edit MEM '1000'
+          edit CPUTIME '960'
+        task model
+          late -s +00:02
+          trigger ( getfcdata eq complete) and ( getpersSST eq complete)
+          edit PERSST 'true'
+          edit FCLENGTH '9'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          meter step -1 9 9
+        task ddh
+          trigger model eq complete
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete and ddh eq complete
+      endfamily
+    endfamily
+    family 12bc
+      edit EMOS_BASE '12'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '0'
+      edit ACCOUNT 'opebcpg'
+      edit SMSURL 'GSCDA/12'
+      edit USER_PRIORITY '91'
+      family getreq
+        trigger ( /e_36r1/main/12/an/4dvar eq active or /e_36r1/main/12/an/4dvar eq complete) and ( ./prod eq queued or ./prod eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit PROD_TASK '1'
+        edit EMOS_DOMAIN 'G'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_PROJECT '12'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'SCDA'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '12'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger collectreq eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete and ( req:001 or req eq complete)
+          label info ""
+          event 1 
+      endfamily
+      family prod
+        trigger ( getreq/req:001 or getreq/req eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit EMOS_PROJECT '12'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        family an
+          trigger /e_36r1/main/12/an/surf_anal eq complete and ( /e_36r1/main/12/an/4dvar/ifstraj:finalwave or /e_36r1/main/12/an/4dvar/ifstraj eq complete) and 0 eq 0
+          edit EMOS_TYPE 'an'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ../090/prodgen eq complete and ../../prod eq queued and /e_36r1/main/12/prod eq complete
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 000
+          trigger ( /e_36r1/main/12/fc/model:step ge 000 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0000'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 12 or /e_36r1/main/12/fc/model eq complete) and ( ../an/backupprod eq complete or ../an/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 003
+          trigger ( /e_36r1/main/12/fc/model:step ge 003 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 15 or /e_36r1/main/12/fc/model eq complete) and ( ../000/backupprod eq complete or ../000/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 006
+          trigger ( /e_36r1/main/12/fc/model:step ge 006 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 18 or /e_36r1/main/12/fc/model eq complete) and ( ../003/backupprod eq complete or ../003/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 009
+          trigger ( /e_36r1/main/12/fc/model:step ge 009 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 21 or /e_36r1/main/12/fc/model eq complete) and ( ../006/backupprod eq complete or ../006/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 012
+          trigger ( /e_36r1/main/12/fc/model:step ge 012 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 24 or /e_36r1/main/12/fc/model eq complete) and ( ../009/backupprod eq complete or ../009/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 015
+          trigger ( /e_36r1/main/12/fc/model:step ge 015 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 27 or /e_36r1/main/12/fc/model eq complete) and ( ../012/backupprod eq complete or ../012/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 018
+          trigger ( /e_36r1/main/12/fc/model:step ge 018 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 30 or /e_36r1/main/12/fc/model eq complete) and ( ../015/backupprod eq complete or ../015/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 021
+          trigger ( /e_36r1/main/12/fc/model:step ge 021 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 33 or /e_36r1/main/12/fc/model eq complete) and ( ../018/backupprod eq complete or ../018/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 024
+          trigger ( /e_36r1/main/12/fc/model:step ge 024 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 36 or /e_36r1/main/12/fc/model eq complete) and ( ../021/backupprod eq complete or ../021/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 027
+          trigger ( /e_36r1/main/12/fc/model:step ge 027 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 39 or /e_36r1/main/12/fc/model eq complete) and ( ../024/backupprod eq complete or ../024/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 030
+          trigger ( /e_36r1/main/12/fc/model:step ge 030 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 42 or /e_36r1/main/12/fc/model eq complete) and ( ../027/backupprod eq complete or ../027/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 033
+          trigger ( /e_36r1/main/12/fc/model:step ge 033 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 45 or /e_36r1/main/12/fc/model eq complete) and ( ../030/backupprod eq complete or ../030/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 036
+          trigger ( /e_36r1/main/12/fc/model:step ge 036 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0036'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 48 or /e_36r1/main/12/fc/model eq complete) and ( ../033/backupprod eq complete or ../033/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 039
+          trigger ( /e_36r1/main/12/fc/model:step ge 039 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0039'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 51 or /e_36r1/main/12/fc/model eq complete) and ( ../036/backupprod eq complete or ../036/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 042
+          trigger ( /e_36r1/main/12/fc/model:step ge 042 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0042'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 54 or /e_36r1/main/12/fc/model eq complete) and ( ../039/backupprod eq complete or ../039/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 045
+          trigger ( /e_36r1/main/12/fc/model:step ge 045 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0045'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 57 or /e_36r1/main/12/fc/model eq complete) and ( ../042/backupprod eq complete or ../042/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 048
+          trigger ( /e_36r1/main/12/fc/model:step ge 048 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0048'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 60 or /e_36r1/main/12/fc/model eq complete) and ( ../045/backupprod eq complete or ../045/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 051
+          trigger ( /e_36r1/main/12/fc/model:step ge 051 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0051'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 63 or /e_36r1/main/12/fc/model eq complete) and ( ../048/backupprod eq complete or ../048/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 054
+          trigger ( /e_36r1/main/12/fc/model:step ge 054 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0054'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 66 or /e_36r1/main/12/fc/model eq complete) and ( ../051/backupprod eq complete or ../051/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 057
+          trigger ( /e_36r1/main/12/fc/model:step ge 057 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0057'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 69 or /e_36r1/main/12/fc/model eq complete) and ( ../054/backupprod eq complete or ../054/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 060
+          trigger ( /e_36r1/main/12/fc/model:step ge 060 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0060'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 72 or /e_36r1/main/12/fc/model eq complete) and ( ../057/backupprod eq complete or ../057/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 063
+          trigger ( /e_36r1/main/12/fc/model:step ge 063 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0063'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 75 or /e_36r1/main/12/fc/model eq complete) and ( ../060/backupprod eq complete or ../060/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 066
+          trigger ( /e_36r1/main/12/fc/model:step ge 066 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0066'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 78 or /e_36r1/main/12/fc/model eq complete) and ( ../063/backupprod eq complete or ../063/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 069
+          trigger ( /e_36r1/main/12/fc/model:step ge 069 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0069'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 81 or /e_36r1/main/12/fc/model eq complete) and ( ../066/backupprod eq complete or ../066/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 072
+          trigger ( /e_36r1/main/12/fc/model:step ge 072 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0072'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 84 or /e_36r1/main/12/fc/model eq complete) and ( ../069/backupprod eq complete or ../069/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 075
+          trigger ( /e_36r1/main/12/fc/model:step ge 075 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0075'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 87 or /e_36r1/main/12/fc/model eq complete) and ( ../072/backupprod eq complete or ../072/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 078
+          trigger ( /e_36r1/main/12/fc/model:step ge 078 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0078'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/12/fc/model:step ge 90 or /e_36r1/main/12/fc/model eq complete) and ( ../075/backupprod eq complete or ../075/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 081
+          trigger ( /e_36r1/main/12/fc/model:step ge 081 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0081'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+        family 084
+          trigger ( /e_36r1/main/12/fc/model:step ge 084 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0084'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+        family 087
+          trigger ( /e_36r1/main/12/fc/model:step ge 087 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0087'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+        family 090
+          trigger ( /e_36r1/main/12/fc/model:step ge 090 or /e_36r1/main/12/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0090'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        task operation_is_late
+          event yes
+        family oper
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '92'
+          edit SMSURL 'GSCDA/12'
+          edit EMOS_PROJECT '12'
+          family an
+            task pdb
+              trigger ../../../prod/an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../090/q2diss eq complete and ../../../prod/an/backupprod eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event 1 
+          endfamily
+          family 000
+            edit EMOS_TIME_STEP_H '0000'
+            task pdb
+              trigger ../../../prod/000/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ../an/q2diss eq complete
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 003
+            edit EMOS_TIME_STEP_H '0003'
+            task pdb
+              trigger ../../../prod/003/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../000/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/003/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 006
+            edit EMOS_TIME_STEP_H '0006'
+            task pdb
+              trigger ../../../prod/006/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../003/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/006/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 009
+            edit EMOS_TIME_STEP_H '0009'
+            task pdb
+              trigger ../../../prod/009/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../006/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/009/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 012
+            edit EMOS_TIME_STEP_H '0012'
+            task pdb
+              trigger ../../../prod/012/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../009/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/012/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 015
+            edit EMOS_TIME_STEP_H '0015'
+            task pdb
+              trigger ../../../prod/015/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../012/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/015/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 018
+            edit EMOS_TIME_STEP_H '0018'
+            task pdb
+              trigger ../../../prod/018/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../015/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/018/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 021
+            edit EMOS_TIME_STEP_H '0021'
+            task pdb
+              trigger ../../../prod/021/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../018/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/021/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 024
+            edit EMOS_TIME_STEP_H '0024'
+            task pdb
+              trigger ../../../prod/024/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../021/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/024/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 027
+            edit EMOS_TIME_STEP_H '0027'
+            task pdb
+              trigger ../../../prod/027/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../024/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/027/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 030
+            edit EMOS_TIME_STEP_H '0030'
+            task pdb
+              trigger ../../../prod/030/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../027/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/030/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 033
+            edit EMOS_TIME_STEP_H '0033'
+            task pdb
+              trigger ../../../prod/033/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../030/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/033/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 036
+            edit EMOS_TIME_STEP_H '0036'
+            task pdb
+              trigger ../../../prod/036/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../033/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/036/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 039
+            edit EMOS_TIME_STEP_H '0039'
+            task pdb
+              trigger ../../../prod/039/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../036/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/039/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 042
+            edit EMOS_TIME_STEP_H '0042'
+            task pdb
+              trigger ../../../prod/042/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../039/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/042/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 045
+            edit EMOS_TIME_STEP_H '0045'
+            task pdb
+              trigger ../../../prod/045/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../042/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/045/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 048
+            edit EMOS_TIME_STEP_H '0048'
+            task pdb
+              trigger ../../../prod/048/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../045/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/048/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 051
+            edit EMOS_TIME_STEP_H '0051'
+            task pdb
+              trigger ../../../prod/051/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../048/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/051/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 054
+            edit EMOS_TIME_STEP_H '0054'
+            task pdb
+              trigger ../../../prod/054/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../051/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/054/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 057
+            edit EMOS_TIME_STEP_H '0057'
+            task pdb
+              trigger ../../../prod/057/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../054/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/057/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 060
+            edit EMOS_TIME_STEP_H '0060'
+            task pdb
+              trigger ../../../prod/060/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../057/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/060/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 063
+            edit EMOS_TIME_STEP_H '0063'
+            task pdb
+              trigger ../../../prod/063/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../060/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/063/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 066
+            edit EMOS_TIME_STEP_H '0066'
+            task pdb
+              trigger ../../../prod/066/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../063/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/066/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 069
+            edit EMOS_TIME_STEP_H '0069'
+            task pdb
+              trigger ../../../prod/069/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../066/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/069/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 072
+            edit EMOS_TIME_STEP_H '0072'
+            task pdb
+              trigger ../../../prod/072/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../069/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/072/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 075
+            edit EMOS_TIME_STEP_H '0075'
+            task pdb
+              trigger ../../../prod/075/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../072/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/075/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 078
+            edit EMOS_TIME_STEP_H '0078'
+            task pdb
+              trigger ../../../prod/078/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../075/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/078/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 081
+            edit EMOS_TIME_STEP_H '0081'
+            task pdb
+              trigger ../../../prod/081/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../078/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 084
+            edit EMOS_TIME_STEP_H '0084'
+            task pdb
+              trigger ../../../prod/084/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../081/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 087
+            edit EMOS_TIME_STEP_H '0087'
+            task pdb
+              trigger ../../../prod/087/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../084/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 090
+            edit EMOS_TIME_STEP_H '0090'
+            task pdb
+              trigger ../../../prod/090/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../087/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          task check
+            trigger ./078 eq complete
+        endfamily
+      endfamily
+    endfamily
+    family 12
+      trigger make eq complete
+      edit EMOS_BASE '12'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      edit ACCOUNT 'oeoperpg'
+      edit SMSURL 'GOPER/12'
+      edit USER_PRIORITY '90'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/ex12/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex12/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex12/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete
+        family prepare_obs
+          trigger ./get eq complete
+          task preobs
+            trigger /e_36r1/main/00dc/an/update_psbias eq complete and /e_36r1/main/00dc/an/update_rstrhbias eq complete
+            edit mode 'not1crad'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+        family reservation
+          late -c +00:03
+          trigger ./get/get_stor eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task adv_res
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '30'
+            edit RESERVE_IN '60'
+            edit RESERVED_NODES '45'
+            edit RESERVATION_LABEL 'emos12XP'
+            label info ""
+          task adv_resA
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '80'
+            edit RESERVE_IN '11'
+            edit RESERVED_NODES '48'
+            edit RESERVATION_LABEL 'emos12A'
+            label info ""
+          task adv_resB
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '30'
+            edit RESERVE_IN '48'
+            edit RESERVED_NODES '48'
+            edit RESERVATION_LABEL 'emos12B'
+            label info ""
+          task adv_resC
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '50'
+            edit RESERVE_IN '55'
+            edit RESERVED_NODES '132'
+            edit RESERVATION_LABEL 'emos12C'
+            label info ""
+          task loadl_cycle_limit
+            late -s +00:03 -c +00:02
+            edit LOADL_CYCLE '65'
+            label info ""
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit PERIOD_4D '6'
+        edit WINDOW_LENGTH_4D '6'
+        edit WINDOW_OFFSET_4D '3'
+        edit ACCOUNT 'oeoperan'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          trigger ( ../../00dc/fc/model:step ge 6 or ../../00dc/fc/model eq complete) and ../../06/an eq complete
+          event hires
+        task fetcherr
+          trigger ../../06/an eq complete and ../../00dc/an eq complete
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./4dvar/uptraj_0/ifstraj eq active or ./4dvar/uptraj_0/ifstraj eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '3328'
+            edit RESERVE_FOR '80'
+            label info ""
+          task rm_res
+            late -s +00:03 -c +00:02
+            edit RESERVATION_LABEL 'emos12A'
+            label info ""
+          task ms_cpu
+            late -s +00:03 -c +00:02
+            edit MS_CPUS '$((64*30))'
+            label info ""
+        endfamily
+        family reservation3
+          late -c +00:03
+          trigger ./4dvar/uptraj_1 eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task set_class
+            late -s +00:03 -c +00:02
+            edit RESERVATION_DEFINITION 'default'
+            label info ""
+        endfamily
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit ACCOUNT 'oeoperfc'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task getpersSST
+          trigger getfcdata eq complete
+          edit SSTLEN '240'
+          edit SSTINT '1'
+          edit THREADS '2'
+          edit NPES '16'
+          edit MEM '1000'
+          edit CPUTIME '960'
+        task model
+          late -s +00:02
+          trigger ( getfcdata eq complete) and ( getpersSST eq complete)
+          edit PERSST 'true'
+          edit FCLENGTH '240'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          meter step -1 240 240
+        task ddh
+          trigger model eq complete
+        task imet
+          trigger ddh eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task ddh_arm
+          trigger ddh eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete and ddh eq complete and ../../00dc/fc eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./getfcdata eq active or ./getfcdata eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          family xp
+            task set_xp
+              late -s +00:03 -c +00:02
+              edit RESERVATION_LABEL 'emos12XP'
+              label info ""
+            task rm_res
+              late -s +00:03 -c +00:02
+              trigger ./set_xp eq complete
+              edit RESERVATION_LABEL 'emos12XP'
+              label info ""
+          endfamily
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '12160'
+            edit RESERVE_FOR '2'
+            label info ""
+          task rm_res
+            late -s +00:03 -c +00:02
+            edit RESERVATION_LABEL 'emos12B'
+            label info ""
+        endfamily
+      endfamily
+      family getreq
+        trigger ( /e_36r1/main/12/an/4dvar eq active or /e_36r1/main/12/an/4dvar eq complete) and ( ./prod eq queued or ./prod eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit PROD_TASK '1'
+        edit EMOS_DOMAIN 'G'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_PROJECT '12'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'OPER'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '12'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger collectreq eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete and ( req:001 or req eq complete)
+          label info ""
+          event 1 
+        task collectwave
+          trigger ./collectbitmap eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '12'
+          edit EMOS_STREAM 'WAVE'
+        task wavereq
+          late -s +00:03 -c +00:10
+          trigger ./collectwave eq complete
+          edit EMOS_STREAM 'WAVE'
+          label info ""
+          event 1 
+        task pgclima
+          late -s +00:03 -c +00:10
+          event 1 
+        task cleanpdb
+      endfamily
+      family prod
+        trigger ( getreq/req:001 or getreq/req eq complete) and ( getreq/bitmap:001 or getreq/bitmap eq complete) and ( getreq/wavereq:001 or getreq/wavereq eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit EMOS_PROJECT '12'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        family 06an
+          trigger /e_36r1/main/00dc/an/dcda_to_da eq complete
+          edit EMOS_TYPE 'an'
+          edit EMOS_BASE '06'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 12an
+          trigger /e_36r1/main/12/an/surf_anal eq complete and ( /e_36r1/main/12/an/4dvar/ifstraj:finalwave or /e_36r1/main/12/an/4dvar/ifstraj eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TYPE 'an'
+          edit PGNPES '90'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            edit SMSPASS 'stripped'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ( ./derived_param:SMOS or ./derived_param eq complete) and ( ( /e_36r1/main/12/an/4dvar/ifstraj:finalwave or /e_36r1/main/12/an/4dvar/ifstraj eq complete))
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 000
+          trigger ( /e_36r1/main/12/fc/model:step ge 000 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0000'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '000'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 003
+          trigger ( /e_36r1/main/12/fc/model:step ge 003 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../000/derived_param:SMOS or ../000/derived_param eq complete) or ( ../000/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '003'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 006
+          trigger ( /e_36r1/main/12/fc/model:step ge 006 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../003/derived_param:SMOS or ../003/derived_param eq complete) or ( ../003/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '006'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 009
+          trigger ( /e_36r1/main/12/fc/model:step ge 009 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../006/derived_param:SMOS or ../006/derived_param eq complete) or ( ../006/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '009'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 012
+          trigger ( /e_36r1/main/12/fc/model:step ge 012 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../009/derived_param:SMOS or ../009/derived_param eq complete) or ( ../009/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '012'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 015
+          trigger ( /e_36r1/main/12/fc/model:step ge 015 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../012/derived_param:SMOS or ../012/derived_param eq complete) or ( ../012/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '015'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 018
+          trigger ( /e_36r1/main/12/fc/model:step ge 018 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../015/derived_param:SMOS or ../015/derived_param eq complete) or ( ../015/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '018'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 021
+          trigger ( /e_36r1/main/12/fc/model:step ge 021 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../018/derived_param:SMOS or ../018/derived_param eq complete) or ( ../018/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '021'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 024
+          trigger ( /e_36r1/main/12/fc/model:step ge 024 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../021/derived_param:SMOS or ../021/derived_param eq complete) or ( ../021/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '024'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 027
+          trigger ( /e_36r1/main/12/fc/model:step ge 027 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../024/derived_param:SMOS or ../024/derived_param eq complete) or ( ../024/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '027'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 030
+          trigger ( /e_36r1/main/12/fc/model:step ge 030 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../027/derived_param:SMOS or ../027/derived_param eq complete) or ( ../027/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '030'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 033
+          trigger ( /e_36r1/main/12/fc/model:step ge 033 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../030/derived_param:SMOS or ../030/derived_param eq complete) or ( ../030/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '033'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 036
+          trigger ( /e_36r1/main/12/fc/model:step ge 036 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0036'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../033/derived_param:SMOS or ../033/derived_param eq complete) or ( ../033/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '036'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 039
+          trigger ( /e_36r1/main/12/fc/model:step ge 039 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0039'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../036/derived_param:SMOS or ../036/derived_param eq complete) or ( ../036/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '039'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 042
+          trigger ( /e_36r1/main/12/fc/model:step ge 042 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0042'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../039/derived_param:SMOS or ../039/derived_param eq complete) or ( ../039/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '042'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 045
+          trigger ( /e_36r1/main/12/fc/model:step ge 045 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0045'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../042/derived_param:SMOS or ../042/derived_param eq complete) or ( ../042/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '045'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 048
+          trigger ( /e_36r1/main/12/fc/model:step ge 048 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0048'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../045/derived_param:SMOS or ../045/derived_param eq complete) or ( ../045/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '048'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 051
+          trigger ( /e_36r1/main/12/fc/model:step ge 051 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0051'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../048/derived_param:SMOS or ../048/derived_param eq complete) or ( ../048/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '051'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 054
+          trigger ( /e_36r1/main/12/fc/model:step ge 054 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0054'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../051/derived_param:SMOS or ../051/derived_param eq complete) or ( ../051/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '054'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 057
+          trigger ( /e_36r1/main/12/fc/model:step ge 057 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0057'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../054/derived_param:SMOS or ../054/derived_param eq complete) or ( ../054/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '057'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 060
+          trigger ( /e_36r1/main/12/fc/model:step ge 060 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0060'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../057/derived_param:SMOS or ../057/derived_param eq complete) or ( ../057/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '060'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 063
+          trigger ( /e_36r1/main/12/fc/model:step ge 063 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0063'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../060/derived_param:SMOS or ../060/derived_param eq complete) or ( ../060/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '063'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 066
+          trigger ( /e_36r1/main/12/fc/model:step ge 066 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0066'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../063/derived_param:SMOS or ../063/derived_param eq complete) or ( ../063/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '066'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 069
+          trigger ( /e_36r1/main/12/fc/model:step ge 069 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0069'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../066/derived_param:SMOS or ../066/derived_param eq complete) or ( ../066/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '069'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 072
+          trigger ( /e_36r1/main/12/fc/model:step ge 072 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0072'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../069/derived_param:SMOS or ../069/derived_param eq complete) or ( ../069/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '072'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 075
+          trigger ( /e_36r1/main/12/fc/model:step ge 075 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0075'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../072/derived_param:SMOS or ../072/derived_param eq complete) or ( ../072/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '075'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 078
+          trigger ( /e_36r1/main/12/fc/model:step ge 078 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0078'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../075/derived_param:SMOS or ../075/derived_param eq complete) or ( ../075/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '078'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 081
+          trigger ( /e_36r1/main/12/fc/model:step ge 081 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0081'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../078/derived_param:SMOS or ../078/derived_param eq complete) or ( ../078/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '081'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 084
+          trigger ( /e_36r1/main/12/fc/model:step ge 084 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0084'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../081/derived_param:SMOS or ../081/derived_param eq complete) or ( ../081/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '084'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 087
+          trigger ( /e_36r1/main/12/fc/model:step ge 087 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0087'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../084/derived_param:SMOS or ../084/derived_param eq complete) or ( ../084/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '087'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 090
+          trigger ( /e_36r1/main/12/fc/model:step ge 090 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0090'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../087/derived_param:SMOS or ../087/derived_param eq complete) or ( ../087/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '090'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 093
+          trigger ( /e_36r1/main/12/fc/model:step ge 093 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0093'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../090/derived_param:SMOS or ../090/derived_param eq complete) or ( ../090/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '093'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 096
+          trigger ( /e_36r1/main/12/fc/model:step ge 096 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0096'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../093/derived_param:SMOS or ../093/derived_param eq complete) or ( ../093/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '096'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 099
+          trigger ( /e_36r1/main/12/fc/model:step ge 099 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0099'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../096/derived_param:SMOS or ../096/derived_param eq complete) or ( ../096/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '099'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 102
+          trigger ( /e_36r1/main/12/fc/model:step ge 102 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0102'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../099/derived_param:SMOS or ../099/derived_param eq complete) or ( ../099/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '102'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 105
+          trigger ( /e_36r1/main/12/fc/model:step ge 105 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0105'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../102/derived_param:SMOS or ../102/derived_param eq complete) or ( ../102/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '105'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 108
+          trigger ( /e_36r1/main/12/fc/model:step ge 108 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0108'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../105/derived_param:SMOS or ../105/derived_param eq complete) or ( ../105/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '108'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 111
+          trigger ( /e_36r1/main/12/fc/model:step ge 111 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0111'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../108/derived_param:SMOS or ../108/derived_param eq complete) or ( ../108/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '111'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 114
+          trigger ( /e_36r1/main/12/fc/model:step ge 114 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0114'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../111/derived_param:SMOS or ../111/derived_param eq complete) or ( ../111/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '114'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 117
+          trigger ( /e_36r1/main/12/fc/model:step ge 117 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0117'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../114/derived_param:SMOS or ../114/derived_param eq complete) or ( ../114/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '117'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 120
+          trigger ( /e_36r1/main/12/fc/model:step ge 120 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0120'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../117/derived_param:SMOS or ../117/derived_param eq complete) or ( ../117/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '120'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 123
+          trigger ( /e_36r1/main/12/fc/model:step ge 123 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0123'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../120/derived_param:SMOS or ../120/derived_param eq complete) or ( ../120/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '123'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 126
+          trigger ( /e_36r1/main/12/fc/model:step ge 126 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0126'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../123/derived_param:SMOS or ../123/derived_param eq complete) or ( ../123/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '126'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 129
+          trigger ( /e_36r1/main/12/fc/model:step ge 129 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0129'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../126/derived_param:SMOS or ../126/derived_param eq complete) or ( ../126/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '129'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 132
+          trigger ( /e_36r1/main/12/fc/model:step ge 132 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0132'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../129/derived_param:SMOS or ../129/derived_param eq complete) or ( ../129/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '132'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 135
+          trigger ( /e_36r1/main/12/fc/model:step ge 135 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0135'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../132/derived_param:SMOS or ../132/derived_param eq complete) or ( ../132/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '135'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 138
+          trigger ( /e_36r1/main/12/fc/model:step ge 138 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0138'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../135/derived_param:SMOS or ../135/derived_param eq complete) or ( ../135/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '138'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 141
+          trigger ( /e_36r1/main/12/fc/model:step ge 141 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0141'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../138/derived_param:SMOS or ../138/derived_param eq complete) or ( ../138/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '141'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 144
+          trigger ( /e_36r1/main/12/fc/model:step ge 144 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0144'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../141/derived_param:SMOS or ../141/derived_param eq complete) or ( ../141/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '144'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 150
+          trigger ( /e_36r1/main/12/fc/model:step ge 150 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0150'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../144/derived_param:SMOS or ../144/derived_param eq complete) or ( ../144/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '150'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 156
+          trigger ( /e_36r1/main/12/fc/model:step ge 156 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0156'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../150/derived_param:SMOS or ../150/derived_param eq complete) or ( ../150/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '156'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 162
+          trigger ( /e_36r1/main/12/fc/model:step ge 162 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0162'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../156/derived_param:SMOS or ../156/derived_param eq complete) or ( ../156/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '162'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 168
+          trigger ( /e_36r1/main/12/fc/model:step ge 168 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0168'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../162/derived_param:SMOS or ../162/derived_param eq complete) or ( ../162/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '168'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 174
+          trigger ( /e_36r1/main/12/fc/model:step ge 174 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0174'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../168/derived_param:SMOS or ../168/derived_param eq complete) or ( ../168/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '174'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 180
+          trigger ( /e_36r1/main/12/fc/model:step ge 180 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0180'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../174/derived_param:SMOS or ../174/derived_param eq complete) or ( ../174/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '180'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 186
+          trigger ( /e_36r1/main/12/fc/model:step ge 186 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0186'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../180/derived_param:SMOS or ../180/derived_param eq complete) or ( ../180/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '186'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 192
+          trigger ( /e_36r1/main/12/fc/model:step ge 192 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0192'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../186/derived_param:SMOS or ../186/derived_param eq complete) or ( ../186/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '192'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 198
+          trigger ( /e_36r1/main/12/fc/model:step ge 198 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0198'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../192/derived_param:SMOS or ../192/derived_param eq complete) or ( ../192/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '198'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 204
+          trigger ( /e_36r1/main/12/fc/model:step ge 204 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0204'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../198/derived_param:SMOS or ../198/derived_param eq complete) or ( ../198/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '204'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 210
+          trigger ( /e_36r1/main/12/fc/model:step ge 210 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0210'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../204/derived_param:SMOS or ../204/derived_param eq complete) or ( ../204/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '210'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 216
+          trigger ( /e_36r1/main/12/fc/model:step ge 216 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0216'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../210/derived_param:SMOS or ../210/derived_param eq complete) or ( ../210/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '216'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 222
+          trigger ( /e_36r1/main/12/fc/model:step ge 222 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0222'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../216/derived_param:SMOS or ../216/derived_param eq complete) or ( ../216/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '222'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 228
+          trigger ( /e_36r1/main/12/fc/model:step ge 228 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0228'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../222/derived_param:SMOS or ../222/derived_param eq complete) or ( ../222/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '228'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 234
+          trigger ( /e_36r1/main/12/fc/model:step ge 234 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0234'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../228/derived_param:SMOS or ../228/derived_param eq complete) or ( ../228/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '234'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 240
+          trigger ( /e_36r1/main/12/fc/model:step ge 240 or /e_36r1/main/12/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete) and ../getreq/cleanpdb eq complete
+          edit EMOS_TIME_STEP_H '0240'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodmet
+            late -s +00:05 -c +00:15
+            edit PROD_TASK '5'
+            edit PGNPES '1'
+            edit EMOS_TYPE 'mt'
+            inlimit /e_36r1/limits:prod
+          task prod_wparam
+            late -s +00:05 -c +00:15
+            trigger ./derived_param eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TYPE 'wp'
+            edit PGNPES '64'
+            edit INIMEM '800'
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../234/derived_param:SMOS or ../234/derived_param eq complete) or ( ../234/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '240'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family reservation1
+          late -c +00:03
+          trigger /e_36r1/main/12bc/prod/078/prodgen eq active or /e_36r1/main/12bc/prod/078/prodgen eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task set_xp
+            late -s +00:03 -c +00:02
+            edit RESERVATION_NODES '45'
+            label info ""
+        endfamily
+        family reservation2
+          late -c +00:03
+          trigger /e_36r1/main/12/prod/240/prodgen eq active or /e_36r1/main/12/prod/240/prodgen eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task set_xp
+            late -s +00:03 -c +00:02
+            edit RESERVATION_NODES '20'
+            label info ""
+        endfamily
+        family reservation3
+          late -c +00:03
+          trigger /e_36r1/main/12/prod/240/prodgen eq active or /e_36r1/main/12/prod/240/prodgen eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reset_xp
+            late -s +00:03 -c +00:02
+            trigger /emc_36r1/main/12/legB/prod eq complete
+            edit RESERVATION_NODES '0'
+            label info ""
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        task operation_is_late
+          event yes
+        family oper
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '92'
+          edit EMOS_PROJECT '12'
+          edit SMSURL 'GSCDA/12'
+          family 06an
+            edit EMOS_BASE '06'
+            edit EMOS_TYPE 'an'
+            edit SMSURL 'GOPER/06'
+            task pdb
+              trigger ../../../prod/06an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 12an
+            edit EMOS_TYPE 'an'
+            edit SMSURL 'GOPER/12'
+            task pdb
+              trigger ../../../prod/12an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 000
+            edit EMOS_TIME_STEP_H '0000'
+            task pdb
+              trigger ../../../prod/000/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../12an/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 003
+            edit EMOS_TIME_STEP_H '0003'
+            task pdb
+              trigger ../../../prod/003/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../000/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 006
+            edit EMOS_TIME_STEP_H '0006'
+            task pdb
+              trigger ../../../prod/006/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../003/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 009
+            edit EMOS_TIME_STEP_H '0009'
+            task pdb
+              trigger ../../../prod/009/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../006/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 012
+            edit EMOS_TIME_STEP_H '0012'
+            task pdb
+              trigger ../../../prod/012/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../009/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 015
+            edit EMOS_TIME_STEP_H '0015'
+            task pdb
+              trigger ../../../prod/015/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../012/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 018
+            edit EMOS_TIME_STEP_H '0018'
+            task pdb
+              trigger ../../../prod/018/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../015/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 021
+            edit EMOS_TIME_STEP_H '0021'
+            task pdb
+              trigger ../../../prod/021/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../018/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 024
+            edit EMOS_TIME_STEP_H '0024'
+            task pdb
+              trigger ../../../prod/024/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../021/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 027
+            edit EMOS_TIME_STEP_H '0027'
+            task pdb
+              trigger ../../../prod/027/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../024/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 030
+            edit EMOS_TIME_STEP_H '0030'
+            task pdb
+              trigger ../../../prod/030/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../027/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 033
+            edit EMOS_TIME_STEP_H '0033'
+            task pdb
+              trigger ../../../prod/033/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../030/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 036
+            edit EMOS_TIME_STEP_H '0036'
+            task pdb
+              trigger ../../../prod/036/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../033/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 039
+            edit EMOS_TIME_STEP_H '0039'
+            task pdb
+              trigger ../../../prod/039/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../036/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 042
+            edit EMOS_TIME_STEP_H '0042'
+            task pdb
+              trigger ../../../prod/042/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../039/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 045
+            edit EMOS_TIME_STEP_H '0045'
+            task pdb
+              trigger ../../../prod/045/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../042/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 048
+            edit EMOS_TIME_STEP_H '0048'
+            task pdb
+              trigger ../../../prod/048/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../045/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 051
+            edit EMOS_TIME_STEP_H '0051'
+            task pdb
+              trigger ../../../prod/051/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../048/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 054
+            edit EMOS_TIME_STEP_H '0054'
+            task pdb
+              trigger ../../../prod/054/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../051/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 057
+            edit EMOS_TIME_STEP_H '0057'
+            task pdb
+              trigger ../../../prod/057/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../054/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 060
+            edit EMOS_TIME_STEP_H '0060'
+            task pdb
+              trigger ../../../prod/060/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../057/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 063
+            edit EMOS_TIME_STEP_H '0063'
+            task pdb
+              trigger ../../../prod/063/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../060/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 066
+            edit EMOS_TIME_STEP_H '0066'
+            task pdb
+              trigger ../../../prod/066/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../063/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 069
+            edit EMOS_TIME_STEP_H '0069'
+            task pdb
+              trigger ../../../prod/069/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../066/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 072
+            edit EMOS_TIME_STEP_H '0072'
+            task pdb
+              trigger ../../../prod/072/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../069/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 075
+            edit EMOS_TIME_STEP_H '0075'
+            task pdb
+              trigger ../../../prod/075/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../072/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 078
+            edit EMOS_TIME_STEP_H '0078'
+            task pdb
+              trigger ../../../prod/078/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../075/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 081
+            edit EMOS_TIME_STEP_H '0081'
+            task pdb
+              trigger ../../../prod/081/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../078/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 084
+            edit EMOS_TIME_STEP_H '0084'
+            task pdb
+              trigger ../../../prod/084/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../081/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 087
+            edit EMOS_TIME_STEP_H '0087'
+            task pdb
+              trigger ../../../prod/087/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../084/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 090
+            edit EMOS_TIME_STEP_H '0090'
+            task pdb
+              trigger ../../../prod/090/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../087/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 093
+            edit EMOS_TIME_STEP_H '0093'
+            task pdb
+              trigger ../../../prod/093/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../090/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 096
+            edit EMOS_TIME_STEP_H '0096'
+            task pdb
+              trigger ../../../prod/096/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../093/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 099
+            edit EMOS_TIME_STEP_H '0099'
+            task pdb
+              trigger ../../../prod/099/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../096/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 102
+            edit EMOS_TIME_STEP_H '0102'
+            task pdb
+              trigger ../../../prod/102/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../099/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 105
+            edit EMOS_TIME_STEP_H '0105'
+            task pdb
+              trigger ../../../prod/105/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../102/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 108
+            edit EMOS_TIME_STEP_H '0108'
+            task pdb
+              trigger ../../../prod/108/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../105/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 111
+            edit EMOS_TIME_STEP_H '0111'
+            task pdb
+              trigger ../../../prod/111/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../108/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 114
+            edit EMOS_TIME_STEP_H '0114'
+            task pdb
+              trigger ../../../prod/114/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../111/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 117
+            edit EMOS_TIME_STEP_H '0117'
+            task pdb
+              trigger ../../../prod/117/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../114/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 120
+            edit EMOS_TIME_STEP_H '0120'
+            task pdb
+              trigger ../../../prod/120/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../117/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 123
+            edit EMOS_TIME_STEP_H '0123'
+            task pdb
+              trigger ../../../prod/123/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../120/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 126
+            edit EMOS_TIME_STEP_H '0126'
+            task pdb
+              trigger ../../../prod/126/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../123/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 129
+            edit EMOS_TIME_STEP_H '0129'
+            task pdb
+              trigger ../../../prod/129/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../126/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 132
+            edit EMOS_TIME_STEP_H '0132'
+            task pdb
+              trigger ../../../prod/132/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../129/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 135
+            edit EMOS_TIME_STEP_H '0135'
+            task pdb
+              trigger ../../../prod/135/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../132/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 138
+            edit EMOS_TIME_STEP_H '0138'
+            task pdb
+              trigger ../../../prod/138/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../135/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 141
+            edit EMOS_TIME_STEP_H '0141'
+            task pdb
+              trigger ../../../prod/141/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../138/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 144
+            edit EMOS_TIME_STEP_H '0144'
+            task pdb
+              trigger ../../../prod/144/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../141/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 150
+            edit EMOS_TIME_STEP_H '0150'
+            task pdb
+              trigger ../../../prod/150/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../144/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 156
+            edit EMOS_TIME_STEP_H '0156'
+            task pdb
+              trigger ../../../prod/156/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../150/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 162
+            edit EMOS_TIME_STEP_H '0162'
+            task pdb
+              trigger ../../../prod/162/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../156/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 168
+            edit EMOS_TIME_STEP_H '0168'
+            task pdb
+              trigger ../../../prod/168/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../162/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 174
+            edit EMOS_TIME_STEP_H '0174'
+            task pdb
+              trigger ../../../prod/174/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../168/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 180
+            edit EMOS_TIME_STEP_H '0180'
+            task pdb
+              trigger ../../../prod/180/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../174/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 186
+            edit EMOS_TIME_STEP_H '0186'
+            task pdb
+              trigger ../../../prod/186/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../180/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 192
+            edit EMOS_TIME_STEP_H '0192'
+            task pdb
+              trigger ../../../prod/192/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../186/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 198
+            edit EMOS_TIME_STEP_H '0198'
+            task pdb
+              trigger ../../../prod/198/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../192/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 204
+            edit EMOS_TIME_STEP_H '0204'
+            task pdb
+              trigger ../../../prod/204/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../198/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 210
+            edit EMOS_TIME_STEP_H '0210'
+            task pdb
+              trigger ../../../prod/210/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../204/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 216
+            edit EMOS_TIME_STEP_H '0216'
+            task pdb
+              trigger ../../../prod/216/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../210/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 222
+            edit EMOS_TIME_STEP_H '0222'
+            task pdb
+              trigger ../../../prod/222/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../216/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 228
+            edit EMOS_TIME_STEP_H '0228'
+            task pdb
+              trigger ../../../prod/228/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../222/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 234
+            edit EMOS_TIME_STEP_H '0234'
+            task pdb
+              trigger ../../../prod/234/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../228/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 240
+            edit EMOS_TIME_STEP_H '0240'
+            task pdb
+              trigger ../../../prod/240/prodgen eq complete and ../../../prod/240/prodmet eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../234/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+            task diss_wparam
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/240/prod_wparam eq complete
+              edit PROD_TASK 'w'
+              edit EMOS_TYPE 'wp'
+              label info ""
+              event pdb
+          endfamily
+          task check
+            trigger ./240 eq complete
+        endfamily
+        family wave
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit EMOS_PROJECT '12'
+          edit EMOS_STREAM 'WV'
+          edit SMSURL 'GWAVE/12'
+          inlimit /e_36r1/limits:w2diss
+          inlimit /limits:q2diss
+          family 06an
+            edit EMOS_TYPE 'an'
+            edit EMOS_BASE '06'
+            task diss
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/06an/prodwave eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event pdb
+          endfamily
+          family 12an
+            edit EMOS_TYPE 'an'
+            task diss
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/12an/prodwave eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event pdb
+          endfamily
+          family 000
+            trigger ../../prod/000/prodwave eq complete and ./06an eq complete and ./12an eq complete
+            edit EMOS_TIME_STEP_H '0000'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 003
+            trigger ../../prod/003/prodwave eq complete and ( ./000/diss:pdb or ./000 eq complete)
+            edit EMOS_TIME_STEP_H '0003'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 006
+            trigger ../../prod/006/prodwave eq complete and ( ./003/diss:pdb or ./003 eq complete)
+            edit EMOS_TIME_STEP_H '0006'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 009
+            trigger ../../prod/009/prodwave eq complete and ( ./006/diss:pdb or ./006 eq complete)
+            edit EMOS_TIME_STEP_H '0009'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 012
+            trigger ../../prod/012/prodwave eq complete and ( ./009/diss:pdb or ./009 eq complete)
+            edit EMOS_TIME_STEP_H '0012'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 015
+            trigger ../../prod/015/prodwave eq complete and ( ./012/diss:pdb or ./012 eq complete)
+            edit EMOS_TIME_STEP_H '0015'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 018
+            trigger ../../prod/018/prodwave eq complete and ( ./015/diss:pdb or ./015 eq complete)
+            edit EMOS_TIME_STEP_H '0018'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 021
+            trigger ../../prod/021/prodwave eq complete and ( ./018/diss:pdb or ./018 eq complete)
+            edit EMOS_TIME_STEP_H '0021'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 024
+            trigger ../../prod/024/prodwave eq complete and ( ./021/diss:pdb or ./021 eq complete)
+            edit EMOS_TIME_STEP_H '0024'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 027
+            trigger ../../prod/027/prodwave eq complete and ( ./024/diss:pdb or ./024 eq complete)
+            edit EMOS_TIME_STEP_H '0027'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 030
+            trigger ../../prod/030/prodwave eq complete and ( ./027/diss:pdb or ./027 eq complete)
+            edit EMOS_TIME_STEP_H '0030'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 033
+            trigger ../../prod/033/prodwave eq complete and ( ./030/diss:pdb or ./030 eq complete)
+            edit EMOS_TIME_STEP_H '0033'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 036
+            trigger ../../prod/036/prodwave eq complete and ( ./033/diss:pdb or ./033 eq complete)
+            edit EMOS_TIME_STEP_H '0036'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 039
+            trigger ../../prod/039/prodwave eq complete and ( ./036/diss:pdb or ./036 eq complete)
+            edit EMOS_TIME_STEP_H '0039'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 042
+            trigger ../../prod/042/prodwave eq complete and ( ./039/diss:pdb or ./039 eq complete)
+            edit EMOS_TIME_STEP_H '0042'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 045
+            trigger ../../prod/045/prodwave eq complete and ( ./042/diss:pdb or ./042 eq complete)
+            edit EMOS_TIME_STEP_H '0045'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 048
+            trigger ../../prod/048/prodwave eq complete and ( ./045/diss:pdb or ./045 eq complete)
+            edit EMOS_TIME_STEP_H '0048'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 051
+            trigger ../../prod/051/prodwave eq complete and ( ./048/diss:pdb or ./048 eq complete)
+            edit EMOS_TIME_STEP_H '0051'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 054
+            trigger ../../prod/054/prodwave eq complete and ( ./051/diss:pdb or ./051 eq complete)
+            edit EMOS_TIME_STEP_H '0054'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 057
+            trigger ../../prod/057/prodwave eq complete and ( ./054/diss:pdb or ./054 eq complete)
+            edit EMOS_TIME_STEP_H '0057'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 060
+            trigger ../../prod/060/prodwave eq complete and ( ./057/diss:pdb or ./057 eq complete)
+            edit EMOS_TIME_STEP_H '0060'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 063
+            trigger ../../prod/063/prodwave eq complete and ( ./060/diss:pdb or ./060 eq complete)
+            edit EMOS_TIME_STEP_H '0063'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 066
+            trigger ../../prod/066/prodwave eq complete and ( ./063/diss:pdb or ./063 eq complete)
+            edit EMOS_TIME_STEP_H '0066'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 069
+            trigger ../../prod/069/prodwave eq complete and ( ./066/diss:pdb or ./066 eq complete)
+            edit EMOS_TIME_STEP_H '0069'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 072
+            trigger ../../prod/072/prodwave eq complete and ( ./069/diss:pdb or ./069 eq complete)
+            edit EMOS_TIME_STEP_H '0072'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 075
+            trigger ../../prod/075/prodwave eq complete and ( ./072/diss:pdb or ./072 eq complete)
+            edit EMOS_TIME_STEP_H '0075'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 078
+            trigger ../../prod/078/prodwave eq complete and ( ./075/diss:pdb or ./075 eq complete)
+            edit EMOS_TIME_STEP_H '0078'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 081
+            trigger ../../prod/081/prodwave eq complete and ( ./078/diss:pdb or ./078 eq complete)
+            edit EMOS_TIME_STEP_H '0081'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 084
+            trigger ../../prod/084/prodwave eq complete and ( ./081/diss:pdb or ./081 eq complete)
+            edit EMOS_TIME_STEP_H '0084'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 087
+            trigger ../../prod/087/prodwave eq complete and ( ./084/diss:pdb or ./084 eq complete)
+            edit EMOS_TIME_STEP_H '0087'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 090
+            trigger ../../prod/090/prodwave eq complete and ( ./087/diss:pdb or ./087 eq complete)
+            edit EMOS_TIME_STEP_H '0090'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 093
+            trigger ../../prod/093/prodwave eq complete and ( ./090/diss:pdb or ./090 eq complete)
+            edit EMOS_TIME_STEP_H '0093'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 096
+            trigger ../../prod/096/prodwave eq complete and ( ./093/diss:pdb or ./093 eq complete)
+            edit EMOS_TIME_STEP_H '0096'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 099
+            trigger ../../prod/099/prodwave eq complete and ( ./096/diss:pdb or ./096 eq complete)
+            edit EMOS_TIME_STEP_H '0099'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 102
+            trigger ../../prod/102/prodwave eq complete and ( ./099/diss:pdb or ./099 eq complete)
+            edit EMOS_TIME_STEP_H '0102'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 105
+            trigger ../../prod/105/prodwave eq complete and ( ./102/diss:pdb or ./102 eq complete)
+            edit EMOS_TIME_STEP_H '0105'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 108
+            trigger ../../prod/108/prodwave eq complete and ( ./105/diss:pdb or ./105 eq complete)
+            edit EMOS_TIME_STEP_H '0108'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 111
+            trigger ../../prod/111/prodwave eq complete and ( ./108/diss:pdb or ./108 eq complete)
+            edit EMOS_TIME_STEP_H '0111'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 114
+            trigger ../../prod/114/prodwave eq complete and ( ./111/diss:pdb or ./111 eq complete)
+            edit EMOS_TIME_STEP_H '0114'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 117
+            trigger ../../prod/117/prodwave eq complete and ( ./114/diss:pdb or ./114 eq complete)
+            edit EMOS_TIME_STEP_H '0117'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 120
+            trigger ../../prod/120/prodwave eq complete and ( ./117/diss:pdb or ./117 eq complete)
+            edit EMOS_TIME_STEP_H '0120'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 123
+            trigger ../../prod/123/prodwave eq complete and ( ./120/diss:pdb or ./120 eq complete)
+            edit EMOS_TIME_STEP_H '0123'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 126
+            trigger ../../prod/126/prodwave eq complete and ( ./123/diss:pdb or ./123 eq complete)
+            edit EMOS_TIME_STEP_H '0126'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 129
+            trigger ../../prod/129/prodwave eq complete and ( ./126/diss:pdb or ./126 eq complete)
+            edit EMOS_TIME_STEP_H '0129'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 132
+            trigger ../../prod/132/prodwave eq complete and ( ./129/diss:pdb or ./129 eq complete)
+            edit EMOS_TIME_STEP_H '0132'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 135
+            trigger ../../prod/135/prodwave eq complete and ( ./132/diss:pdb or ./132 eq complete)
+            edit EMOS_TIME_STEP_H '0135'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 138
+            trigger ../../prod/138/prodwave eq complete and ( ./135/diss:pdb or ./135 eq complete)
+            edit EMOS_TIME_STEP_H '0138'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 141
+            trigger ../../prod/141/prodwave eq complete and ( ./138/diss:pdb or ./138 eq complete)
+            edit EMOS_TIME_STEP_H '0141'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 144
+            trigger ../../prod/144/prodwave eq complete and ( ./141/diss:pdb or ./141 eq complete)
+            edit EMOS_TIME_STEP_H '0144'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 150
+            trigger ../../prod/150/prodwave eq complete and ( ./144/diss:pdb or ./144 eq complete)
+            edit EMOS_TIME_STEP_H '0150'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 156
+            trigger ../../prod/156/prodwave eq complete and ( ./150/diss:pdb or ./150 eq complete)
+            edit EMOS_TIME_STEP_H '0156'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 162
+            trigger ../../prod/162/prodwave eq complete and ( ./156/diss:pdb or ./156 eq complete)
+            edit EMOS_TIME_STEP_H '0162'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 168
+            trigger ../../prod/168/prodwave eq complete and ( ./162/diss:pdb or ./162 eq complete)
+            edit EMOS_TIME_STEP_H '0168'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 174
+            trigger ../../prod/174/prodwave eq complete and ( ./168/diss:pdb or ./168 eq complete)
+            edit EMOS_TIME_STEP_H '0174'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 180
+            trigger ../../prod/180/prodwave eq complete and ( ./174/diss:pdb or ./174 eq complete)
+            edit EMOS_TIME_STEP_H '0180'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 186
+            trigger ../../prod/186/prodwave eq complete and ( ./180/diss:pdb or ./180 eq complete)
+            edit EMOS_TIME_STEP_H '0186'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 192
+            trigger ../../prod/192/prodwave eq complete and ( ./186/diss:pdb or ./186 eq complete)
+            edit EMOS_TIME_STEP_H '0192'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 198
+            trigger ../../prod/198/prodwave eq complete and ( ./192/diss:pdb or ./192 eq complete)
+            edit EMOS_TIME_STEP_H '0198'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 204
+            trigger ../../prod/204/prodwave eq complete and ( ./198/diss:pdb or ./198 eq complete)
+            edit EMOS_TIME_STEP_H '0204'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 210
+            trigger ../../prod/210/prodwave eq complete and ( ./204/diss:pdb or ./204 eq complete)
+            edit EMOS_TIME_STEP_H '0210'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 216
+            trigger ../../prod/216/prodwave eq complete and ( ./210/diss:pdb or ./210 eq complete)
+            edit EMOS_TIME_STEP_H '0216'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 222
+            trigger ../../prod/222/prodwave eq complete and ( ./216/diss:pdb or ./216 eq complete)
+            edit EMOS_TIME_STEP_H '0222'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 228
+            trigger ../../prod/228/prodwave eq complete and ( ./222/diss:pdb or ./222 eq complete)
+            edit EMOS_TIME_STEP_H '0228'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 234
+            trigger ../../prod/234/prodwave eq complete and ( ./228/diss:pdb or ./228 eq complete)
+            edit EMOS_TIME_STEP_H '0234'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 240
+            trigger ../../prod/240/prodwave eq complete and ( ./234/diss:pdb or ./234 eq complete)
+            edit EMOS_TIME_STEP_H '0240'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          task check
+            trigger ./240 eq complete
+        endfamily
+      endfamily
+    endfamily
+    family 18bc
+      trigger ( ./make eq complete) and ( /e_36r1/main/12/fc eq complete)
+      edit EMOS_BASE '18'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '0'
+      edit ACCOUNT 'opebcpg'
+      edit SMSURL 'GSCDA/18'
+      edit USER_PRIORITY '91'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/ex18/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete
+        family prepare_obs
+          trigger ./get eq complete
+          task preobs
+            trigger /e_36r1/main/00dc/an/update_psbias eq complete and /e_36r1/main/00dc/an/update_rstrhbias eq complete
+            edit mode 'not1crad'
+            edit REINITIALIZE 'true'
+            edit REINIPERIOD_4D '6'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+        family reservation
+          late -c +00:03
+          trigger ./get/get_stor eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task adv_res
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '30'
+            edit RESERVE_IN '11'
+            edit RESERVED_NODES '32'
+            edit RESERVATION_LABEL 'emos18A'
+            label info ""
+          task loadl_cycle_limit
+            late -s +00:03 -c +00:02
+            edit LOADL_CYCLE '65'
+            label info ""
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit PERIOD_4D '6'
+        edit WINDOW_LENGTH_4D '6'
+        edit WINDOW_OFFSET_4D '3'
+        edit ACCOUNT 'opebcan'
+        edit REINITIALIZE 'true'
+        edit ANNPES '144'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          trigger ( ../../12/fc/model:step ge 9 or ../../12/fc/model eq complete)
+          event hires
+        task fetcherr
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./4dvar/uptraj_0/ifstraj eq active or ./4dvar/uptraj_0/ifstraj eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '2432'
+            edit RESERVE_FOR '35'
+            label info ""
+          task rm_res
+            late -s +00:03 -c +00:02
+            edit RESERVATION_LABEL 'emos18A'
+            label info ""
+        endfamily
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit ACCOUNT 'opebcfc'
+        edit REINITIALIZE 'true'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task getpersSST
+          trigger getfcdata eq complete
+          edit SSTLEN '90'
+          edit SSTINT '1'
+          edit THREADS '2'
+          edit NPES '16'
+          edit MEM '1000'
+          edit CPUTIME '960'
+        task model
+          late -s +00:02
+          trigger ( getfcdata eq complete) and ( getpersSST eq complete)
+          edit PERSST 'true'
+          edit FCLENGTH '90'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          edit FCNPES '144'
+          meter step -1 90 90
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./getfcdata eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '3072'
+            edit RESERVE_FOR '20'
+            label info ""
+        endfamily
+        family reservation2
+          late -c +00:03
+          trigger ./model eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reset_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '0'
+            label info ""
+        endfamily
+      endfamily
+      family getreq
+        trigger ( /e_36r1/main/18bc/an/4dvar eq active or /e_36r1/main/18bc/an/4dvar eq complete) and ( ./prod eq queued or ./prod eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit PROD_TASK '1'
+        edit EMOS_DOMAIN 'G'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_PROJECT '12'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'SCDA'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '18'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger collectreq eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete and ( req:001 or req eq complete)
+          label info ""
+          event 1 
+      endfamily
+      family prod
+        trigger ( getreq/req:001 or getreq/req eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit EMOS_PROJECT '12'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        family an
+          trigger /e_36r1/main/18bc/an/surf_anal eq complete and ( /e_36r1/main/18bc/an/4dvar/ifstraj:finalwave or /e_36r1/main/18bc/an/4dvar/ifstraj eq complete) and 0 eq 0
+          edit EMOS_TYPE 'an'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ../090/prodgen eq complete and ( /e_36r1/main/18bc/fc/model:step ge 12 or /e_36r1/main/18bc/fc/model eq complete)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 000
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 000 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0000'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 12 or /e_36r1/main/18bc/fc/model eq complete) and ( ../an/backupprod eq complete or ../an/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '000'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 003
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 003 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 15 or /e_36r1/main/18bc/fc/model eq complete) and ( ../000/backupprod eq complete or ../000/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../000/derived_param:SMOS or ../000/derived_param eq complete) or ( ../000/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '003'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 006
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 006 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 18 or /e_36r1/main/18bc/fc/model eq complete) and ( ../003/backupprod eq complete or ../003/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../003/derived_param:SMOS or ../003/derived_param eq complete) or ( ../003/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '006'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 009
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 009 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 21 or /e_36r1/main/18bc/fc/model eq complete) and ( ../006/backupprod eq complete or ../006/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../006/derived_param:SMOS or ../006/derived_param eq complete) or ( ../006/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '009'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 012
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 012 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 24 or /e_36r1/main/18bc/fc/model eq complete) and ( ../009/backupprod eq complete or ../009/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../009/derived_param:SMOS or ../009/derived_param eq complete) or ( ../009/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '012'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 015
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 015 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 27 or /e_36r1/main/18bc/fc/model eq complete) and ( ../012/backupprod eq complete or ../012/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../012/derived_param:SMOS or ../012/derived_param eq complete) or ( ../012/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '015'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 018
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 018 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 30 or /e_36r1/main/18bc/fc/model eq complete) and ( ../015/backupprod eq complete or ../015/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../015/derived_param:SMOS or ../015/derived_param eq complete) or ( ../015/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '018'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 021
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 021 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 33 or /e_36r1/main/18bc/fc/model eq complete) and ( ../018/backupprod eq complete or ../018/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../018/derived_param:SMOS or ../018/derived_param eq complete) or ( ../018/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '021'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 024
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 024 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 36 or /e_36r1/main/18bc/fc/model eq complete) and ( ../021/backupprod eq complete or ../021/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../021/derived_param:SMOS or ../021/derived_param eq complete) or ( ../021/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '024'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 027
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 027 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 39 or /e_36r1/main/18bc/fc/model eq complete) and ( ../024/backupprod eq complete or ../024/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../024/derived_param:SMOS or ../024/derived_param eq complete) or ( ../024/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '027'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 030
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 030 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 42 or /e_36r1/main/18bc/fc/model eq complete) and ( ../027/backupprod eq complete or ../027/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../027/derived_param:SMOS or ../027/derived_param eq complete) or ( ../027/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '030'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 033
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 033 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 45 or /e_36r1/main/18bc/fc/model eq complete) and ( ../030/backupprod eq complete or ../030/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../030/derived_param:SMOS or ../030/derived_param eq complete) or ( ../030/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '033'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 036
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 036 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0036'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 48 or /e_36r1/main/18bc/fc/model eq complete) and ( ../033/backupprod eq complete or ../033/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../033/derived_param:SMOS or ../033/derived_param eq complete) or ( ../033/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '036'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 039
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 039 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0039'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 51 or /e_36r1/main/18bc/fc/model eq complete) and ( ../036/backupprod eq complete or ../036/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../036/derived_param:SMOS or ../036/derived_param eq complete) or ( ../036/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '039'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 042
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 042 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0042'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 54 or /e_36r1/main/18bc/fc/model eq complete) and ( ../039/backupprod eq complete or ../039/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../039/derived_param:SMOS or ../039/derived_param eq complete) or ( ../039/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '042'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 045
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 045 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0045'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 57 or /e_36r1/main/18bc/fc/model eq complete) and ( ../042/backupprod eq complete or ../042/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../042/derived_param:SMOS or ../042/derived_param eq complete) or ( ../042/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '045'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 048
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 048 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0048'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 60 or /e_36r1/main/18bc/fc/model eq complete) and ( ../045/backupprod eq complete or ../045/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../045/derived_param:SMOS or ../045/derived_param eq complete) or ( ../045/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '048'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 051
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 051 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0051'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 63 or /e_36r1/main/18bc/fc/model eq complete) and ( ../048/backupprod eq complete or ../048/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../048/derived_param:SMOS or ../048/derived_param eq complete) or ( ../048/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '051'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 054
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 054 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0054'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 66 or /e_36r1/main/18bc/fc/model eq complete) and ( ../051/backupprod eq complete or ../051/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../051/derived_param:SMOS or ../051/derived_param eq complete) or ( ../051/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '054'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 057
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 057 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0057'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 69 or /e_36r1/main/18bc/fc/model eq complete) and ( ../054/backupprod eq complete or ../054/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../054/derived_param:SMOS or ../054/derived_param eq complete) or ( ../054/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '057'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 060
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 060 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0060'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 72 or /e_36r1/main/18bc/fc/model eq complete) and ( ../057/backupprod eq complete or ../057/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../057/derived_param:SMOS or ../057/derived_param eq complete) or ( ../057/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '060'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 063
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 063 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0063'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 75 or /e_36r1/main/18bc/fc/model eq complete) and ( ../060/backupprod eq complete or ../060/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../060/derived_param:SMOS or ../060/derived_param eq complete) or ( ../060/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '063'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 066
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 066 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0066'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 78 or /e_36r1/main/18bc/fc/model eq complete) and ( ../063/backupprod eq complete or ../063/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../063/derived_param:SMOS or ../063/derived_param eq complete) or ( ../063/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '066'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 069
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 069 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0069'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 81 or /e_36r1/main/18bc/fc/model eq complete) and ( ../066/backupprod eq complete or ../066/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../066/derived_param:SMOS or ../066/derived_param eq complete) or ( ../066/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '069'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 072
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 072 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0072'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 84 or /e_36r1/main/18bc/fc/model eq complete) and ( ../069/backupprod eq complete or ../069/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../069/derived_param:SMOS or ../069/derived_param eq complete) or ( ../069/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '072'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 075
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 075 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0075'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 87 or /e_36r1/main/18bc/fc/model eq complete) and ( ../072/backupprod eq complete or ../072/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../072/derived_param:SMOS or ../072/derived_param eq complete) or ( ../072/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '075'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 078
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 078 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0078'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/18bc/fc/model:step ge 90 or /e_36r1/main/18bc/fc/model eq complete) and ( ../075/backupprod eq complete or ../075/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../075/derived_param:SMOS or ../075/derived_param eq complete) or ( ../075/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '078'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 081
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 081 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0081'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../078/derived_param:SMOS or ../078/derived_param eq complete) or ( ../078/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '081'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 084
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 084 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0084'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../081/derived_param:SMOS or ../081/derived_param eq complete) or ( ../081/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '084'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 087
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 087 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0087'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../084/derived_param:SMOS or ../084/derived_param eq complete) or ( ../084/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '087'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 090
+          trigger ( /e_36r1/main/18bc/fc/model:step ge 090 or /e_36r1/main/18bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0090'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../087/derived_param:SMOS or ../087/derived_param eq complete) or ( ../087/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '090'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        task operation_is_late
+          event yes
+        family oper
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '92'
+          edit SMSURL 'GSCDA/18'
+          edit EMOS_PROJECT '12'
+          family an
+            task pdb
+              trigger ../../../prod/an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../090/q2diss eq complete and ../../../prod/an/backupprod eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event 1 
+          endfamily
+          family 000
+            edit EMOS_TIME_STEP_H '0000'
+            task pdb
+              trigger ../../../prod/000/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ../an/q2diss eq complete
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 003
+            edit EMOS_TIME_STEP_H '0003'
+            task pdb
+              trigger ../../../prod/003/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../000/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/003/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 006
+            edit EMOS_TIME_STEP_H '0006'
+            task pdb
+              trigger ../../../prod/006/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../003/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/006/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 009
+            edit EMOS_TIME_STEP_H '0009'
+            task pdb
+              trigger ../../../prod/009/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../006/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/009/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 012
+            edit EMOS_TIME_STEP_H '0012'
+            task pdb
+              trigger ../../../prod/012/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../009/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/012/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 015
+            edit EMOS_TIME_STEP_H '0015'
+            task pdb
+              trigger ../../../prod/015/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../012/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/015/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 018
+            edit EMOS_TIME_STEP_H '0018'
+            task pdb
+              trigger ../../../prod/018/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../015/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/018/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 021
+            edit EMOS_TIME_STEP_H '0021'
+            task pdb
+              trigger ../../../prod/021/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../018/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/021/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 024
+            edit EMOS_TIME_STEP_H '0024'
+            task pdb
+              trigger ../../../prod/024/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../021/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/024/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 027
+            edit EMOS_TIME_STEP_H '0027'
+            task pdb
+              trigger ../../../prod/027/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../024/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/027/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 030
+            edit EMOS_TIME_STEP_H '0030'
+            task pdb
+              trigger ../../../prod/030/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../027/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/030/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 033
+            edit EMOS_TIME_STEP_H '0033'
+            task pdb
+              trigger ../../../prod/033/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../030/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/033/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 036
+            edit EMOS_TIME_STEP_H '0036'
+            task pdb
+              trigger ../../../prod/036/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../033/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/036/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 039
+            edit EMOS_TIME_STEP_H '0039'
+            task pdb
+              trigger ../../../prod/039/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../036/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/039/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 042
+            edit EMOS_TIME_STEP_H '0042'
+            task pdb
+              trigger ../../../prod/042/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../039/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/042/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 045
+            edit EMOS_TIME_STEP_H '0045'
+            task pdb
+              trigger ../../../prod/045/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../042/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/045/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 048
+            edit EMOS_TIME_STEP_H '0048'
+            task pdb
+              trigger ../../../prod/048/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../045/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/048/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 051
+            edit EMOS_TIME_STEP_H '0051'
+            task pdb
+              trigger ../../../prod/051/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../048/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/051/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 054
+            edit EMOS_TIME_STEP_H '0054'
+            task pdb
+              trigger ../../../prod/054/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../051/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/054/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 057
+            edit EMOS_TIME_STEP_H '0057'
+            task pdb
+              trigger ../../../prod/057/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../054/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/057/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 060
+            edit EMOS_TIME_STEP_H '0060'
+            task pdb
+              trigger ../../../prod/060/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../057/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/060/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 063
+            edit EMOS_TIME_STEP_H '0063'
+            task pdb
+              trigger ../../../prod/063/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../060/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/063/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 066
+            edit EMOS_TIME_STEP_H '0066'
+            task pdb
+              trigger ../../../prod/066/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../063/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/066/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 069
+            edit EMOS_TIME_STEP_H '0069'
+            task pdb
+              trigger ../../../prod/069/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../066/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/069/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 072
+            edit EMOS_TIME_STEP_H '0072'
+            task pdb
+              trigger ../../../prod/072/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../069/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/072/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 075
+            edit EMOS_TIME_STEP_H '0075'
+            task pdb
+              trigger ../../../prod/075/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../072/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/075/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 078
+            edit EMOS_TIME_STEP_H '0078'
+            task pdb
+              trigger ../../../prod/078/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../075/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/078/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 081
+            edit EMOS_TIME_STEP_H '0081'
+            task pdb
+              trigger ../../../prod/081/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../078/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 084
+            edit EMOS_TIME_STEP_H '0084'
+            task pdb
+              trigger ../../../prod/084/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../081/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 087
+            edit EMOS_TIME_STEP_H '0087'
+            task pdb
+              trigger ../../../prod/087/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../084/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 090
+            edit EMOS_TIME_STEP_H '0090'
+            task pdb
+              trigger ../../../prod/090/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../087/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          task check
+            trigger ./078 eq complete
+        endfamily
+      endfamily
+    endfamily
+    family 12dc
+      trigger make eq complete
+      edit EMOS_BASE '12'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/dc12/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc12/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc12/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        family getplus6
+          edit EMOS_BASE '18'
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/dc18/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/dc18/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/dc18/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete and ./getplus6 eq complete
+        family prepare_obs
+          trigger ./get eq complete and ./getplus6 eq complete
+          task preobs
+            trigger /e_36r1/main/00dc/an/update_psbias eq complete and /e_36r1/main/00dc/an/update_rstrhbias eq complete
+            edit mode 'not1crad'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+        family reservation
+          late -c +00:03
+          trigger ./get/get_stor eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task adv_res
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '30'
+            edit RESERVE_IN '30'
+            edit RESERVED_NODES '48'
+            edit RESERVATION_LABEL 'emos12dcA'
+            label info ""
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit PERIOD_4D '12'
+        edit WINDOW_LENGTH_4D '12'
+        edit WINDOW_OFFSET_4D '3'
+        edit ACCOUNT 'oedcdaan'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          trigger ( ../../00dc/fc/model:step ge 9 or ../../00dc/fc/model eq complete)
+          event hires
+        task fetcherr
+          trigger ../../00dc/an eq complete
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+        task emiskf
+          trigger ./4dvar/uptraj_0/ifstraj eq complete
+          edit THREADS '1'
+        task update_psbias
+          trigger ./4dvar/ifstraj:finalwave
+        task update_rstrhbias
+          trigger ./4dvar/ifstraj:finalwave
+        task dcda_to_da
+          trigger ./4dvar eq complete and surf_anal eq complete
+          edit EMOS_TYPE 'an'
+          edit OPHOST 'c1b'
+        family reservation1
+          late -c +00:03
+          trigger ./4dvar/uptraj_0/ifstraj eq active or ./4dvar/uptraj_0/ifstraj eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:02 -c +00:02
+            edit RESERVED_CPUS '3328'
+            edit RESERVE_FOR '65'
+            label info ""
+          task rm_res
+            late -s +00:02 -c +00:02
+            edit RESERVATION_LABEL 'emos12'
+            label info ""
+          task set_class
+            late -s +00:02 -c +00:02
+            edit RESERVATION_DEFINITION 'default_nodiag'
+            label info ""
+        endfamily
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit EMOS_BASE '18'
+        edit ACCOUNT 'oedcdafc'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task model
+          late -s +00:02
+          trigger getfcdata eq complete
+          edit FCLENGTH '15'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          meter step -1 15 15
+        task ddh
+          trigger model eq complete
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete and ddh eq complete and ../../12/fc eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./getfcdata eq active or ./getfcdata eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '3072'
+            edit RESERVE_FOR '4'
+            label info ""
+        endfamily
+        family reservation2
+          late -c +00:03
+          trigger ./model eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reset_cpu
+            late -s +00:03 -c +00:02
+            complete /e_36r1/main/00/an/vardata eq active or /e_36r1/main/00/an/vardata eq complete
+            edit RESERVED_CPUS '0'
+            label info ""
+        endfamily
+      endfamily
+    endfamily
+    family 18
+      trigger make eq complete
+      edit EMOS_BASE '18'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DA'
+      edit LAR_4V_EF 'false'
+      edit LFC_DIR_FREQ 'false'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/ex18/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex18/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex18/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete
+        family prepare_obs
+          trigger ./get eq complete
+          task preobs
+            edit mode 'not1crad'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+        family reservation
+          late -c +00:03
+          trigger ./get/get_stor eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit ACCOUNT 'oeoperan'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          trigger ../../12dc/fc/model:step ge 6 or ../../12dc/fc/model eq complete
+          event hires
+        task fetcherr
+          trigger ../../12dc/an eq complete
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./4dvar/uptraj_0/ifstraj eq active or ./4dvar/uptraj_0/ifstraj eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+        endfamily
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit ACCOUNT 'oeoperfc'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task getpersSST
+          trigger getfcdata eq complete
+          edit SSTLEN '9'
+          edit SSTINT '1'
+          edit THREADS '2'
+          edit NPES '16'
+          edit MEM '1000'
+          edit CPUTIME '960'
+        task model
+          late -s +00:02
+          trigger ( getfcdata eq complete) and ( getpersSST eq complete)
+          edit PERSST 'true'
+          edit FCLENGTH '9'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          meter step -1 9 9
+        task ddh
+          trigger model eq complete
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete and ddh eq complete
+        family reservation1
+          late -c +00:03
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+        endfamily
+      endfamily
+    endfamily
+    family 00bc
+      edit EMOS_BASE '00'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '1'
+      edit ACCOUNT 'opebcpg'
+      edit SMSURL 'GSCDA/00'
+      edit USER_PRIORITY '91'
+      family getreq
+        trigger ( /e_36r1/main/00/an/4dvar eq active or /e_36r1/main/00/an/4dvar eq complete) and ( ./prod eq queued or ./prod eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit PROD_TASK '1'
+        edit EMOS_DOMAIN 'G'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_PROJECT '12'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'SCDA'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '00'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger collectreq eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete and ( req:001 or req eq complete)
+          label info ""
+          event 1 
+      endfamily
+      family prod
+        trigger ( getreq/req:001 or getreq/req eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit EMOS_PROJECT '12'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit EMOS_BASE '00'
+        family an
+          trigger /e_36r1/main/00/an/surf_anal eq complete and ( /e_36r1/main/00/an/4dvar/ifstraj:finalwave or /e_36r1/main/00/an/4dvar/ifstraj eq complete) and 0 eq 0
+          edit EMOS_TYPE 'an'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ../090/prodgen eq complete and ../../prod eq queued and /e_36r1/main/00/prod eq complete
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 000
+          trigger ( /e_36r1/main/00/fc/model:step ge 000 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0000'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 12 or /e_36r1/main/00/fc/model eq complete) and ( ../an/backupprod eq complete or ../an/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 003
+          trigger ( /e_36r1/main/00/fc/model:step ge 003 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 15 or /e_36r1/main/00/fc/model eq complete) and ( ../000/backupprod eq complete or ../000/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 006
+          trigger ( /e_36r1/main/00/fc/model:step ge 006 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 18 or /e_36r1/main/00/fc/model eq complete) and ( ../003/backupprod eq complete or ../003/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 009
+          trigger ( /e_36r1/main/00/fc/model:step ge 009 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 21 or /e_36r1/main/00/fc/model eq complete) and ( ../006/backupprod eq complete or ../006/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 012
+          trigger ( /e_36r1/main/00/fc/model:step ge 012 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 24 or /e_36r1/main/00/fc/model eq complete) and ( ../009/backupprod eq complete or ../009/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 015
+          trigger ( /e_36r1/main/00/fc/model:step ge 015 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 27 or /e_36r1/main/00/fc/model eq complete) and ( ../012/backupprod eq complete or ../012/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 018
+          trigger ( /e_36r1/main/00/fc/model:step ge 018 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 30 or /e_36r1/main/00/fc/model eq complete) and ( ../015/backupprod eq complete or ../015/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 021
+          trigger ( /e_36r1/main/00/fc/model:step ge 021 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 33 or /e_36r1/main/00/fc/model eq complete) and ( ../018/backupprod eq complete or ../018/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 024
+          trigger ( /e_36r1/main/00/fc/model:step ge 024 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 36 or /e_36r1/main/00/fc/model eq complete) and ( ../021/backupprod eq complete or ../021/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 027
+          trigger ( /e_36r1/main/00/fc/model:step ge 027 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 39 or /e_36r1/main/00/fc/model eq complete) and ( ../024/backupprod eq complete or ../024/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 030
+          trigger ( /e_36r1/main/00/fc/model:step ge 030 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 42 or /e_36r1/main/00/fc/model eq complete) and ( ../027/backupprod eq complete or ../027/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 033
+          trigger ( /e_36r1/main/00/fc/model:step ge 033 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 45 or /e_36r1/main/00/fc/model eq complete) and ( ../030/backupprod eq complete or ../030/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 036
+          trigger ( /e_36r1/main/00/fc/model:step ge 036 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0036'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 48 or /e_36r1/main/00/fc/model eq complete) and ( ../033/backupprod eq complete or ../033/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 039
+          trigger ( /e_36r1/main/00/fc/model:step ge 039 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0039'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 51 or /e_36r1/main/00/fc/model eq complete) and ( ../036/backupprod eq complete or ../036/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 042
+          trigger ( /e_36r1/main/00/fc/model:step ge 042 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0042'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 54 or /e_36r1/main/00/fc/model eq complete) and ( ../039/backupprod eq complete or ../039/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 045
+          trigger ( /e_36r1/main/00/fc/model:step ge 045 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0045'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 57 or /e_36r1/main/00/fc/model eq complete) and ( ../042/backupprod eq complete or ../042/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 048
+          trigger ( /e_36r1/main/00/fc/model:step ge 048 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0048'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 60 or /e_36r1/main/00/fc/model eq complete) and ( ../045/backupprod eq complete or ../045/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 051
+          trigger ( /e_36r1/main/00/fc/model:step ge 051 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0051'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 63 or /e_36r1/main/00/fc/model eq complete) and ( ../048/backupprod eq complete or ../048/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 054
+          trigger ( /e_36r1/main/00/fc/model:step ge 054 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0054'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 66 or /e_36r1/main/00/fc/model eq complete) and ( ../051/backupprod eq complete or ../051/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 057
+          trigger ( /e_36r1/main/00/fc/model:step ge 057 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0057'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 69 or /e_36r1/main/00/fc/model eq complete) and ( ../054/backupprod eq complete or ../054/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 060
+          trigger ( /e_36r1/main/00/fc/model:step ge 060 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0060'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 72 or /e_36r1/main/00/fc/model eq complete) and ( ../057/backupprod eq complete or ../057/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 063
+          trigger ( /e_36r1/main/00/fc/model:step ge 063 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0063'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 75 or /e_36r1/main/00/fc/model eq complete) and ( ../060/backupprod eq complete or ../060/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 066
+          trigger ( /e_36r1/main/00/fc/model:step ge 066 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0066'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 78 or /e_36r1/main/00/fc/model eq complete) and ( ../063/backupprod eq complete or ../063/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 069
+          trigger ( /e_36r1/main/00/fc/model:step ge 069 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0069'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 81 or /e_36r1/main/00/fc/model eq complete) and ( ../066/backupprod eq complete or ../066/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 072
+          trigger ( /e_36r1/main/00/fc/model:step ge 072 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0072'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 84 or /e_36r1/main/00/fc/model eq complete) and ( ../069/backupprod eq complete or ../069/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 075
+          trigger ( /e_36r1/main/00/fc/model:step ge 075 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0075'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 87 or /e_36r1/main/00/fc/model eq complete) and ( ../072/backupprod eq complete or ../072/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 078
+          trigger ( /e_36r1/main/00/fc/model:step ge 078 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0078'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/00/fc/model:step ge 90 or /e_36r1/main/00/fc/model eq complete) and ( ../075/backupprod eq complete or ../075/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+        endfamily
+        family 081
+          trigger ( /e_36r1/main/00/fc/model:step ge 081 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0081'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+        family 084
+          trigger ( /e_36r1/main/00/fc/model:step ge 084 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0084'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+        family 087
+          trigger ( /e_36r1/main/00/fc/model:step ge 087 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0087'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+        family 090
+          trigger ( /e_36r1/main/00/fc/model:step ge 090 or /e_36r1/main/00/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0090'
+          task prodgen
+            late -s +00:05 -c +00:15
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        task operation_is_late
+          event yes
+        family oper
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '92'
+          edit SMSURL 'GSCDA/00'
+          edit EMOS_BASE '00'
+          edit EMOS_PROJECT '12'
+          family an
+            task pdb
+              trigger ../../../prod/an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../090/q2diss eq complete and ../../../prod/an/backupprod eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event 1 
+          endfamily
+          family 000
+            edit EMOS_TIME_STEP_H '0000'
+            task pdb
+              trigger ../../../prod/000/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ../an/q2diss eq complete
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 003
+            edit EMOS_TIME_STEP_H '0003'
+            task pdb
+              trigger ../../../prod/003/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../000/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/003/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 006
+            edit EMOS_TIME_STEP_H '0006'
+            task pdb
+              trigger ../../../prod/006/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../003/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/006/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 009
+            edit EMOS_TIME_STEP_H '0009'
+            task pdb
+              trigger ../../../prod/009/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../006/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/009/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 012
+            edit EMOS_TIME_STEP_H '0012'
+            task pdb
+              trigger ../../../prod/012/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../009/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/012/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 015
+            edit EMOS_TIME_STEP_H '0015'
+            task pdb
+              trigger ../../../prod/015/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../012/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/015/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 018
+            edit EMOS_TIME_STEP_H '0018'
+            task pdb
+              trigger ../../../prod/018/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../015/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/018/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 021
+            edit EMOS_TIME_STEP_H '0021'
+            task pdb
+              trigger ../../../prod/021/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../018/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/021/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 024
+            edit EMOS_TIME_STEP_H '0024'
+            task pdb
+              trigger ../../../prod/024/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../021/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/024/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 027
+            edit EMOS_TIME_STEP_H '0027'
+            task pdb
+              trigger ../../../prod/027/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../024/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/027/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 030
+            edit EMOS_TIME_STEP_H '0030'
+            task pdb
+              trigger ../../../prod/030/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../027/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/030/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 033
+            edit EMOS_TIME_STEP_H '0033'
+            task pdb
+              trigger ../../../prod/033/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../030/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/033/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 036
+            edit EMOS_TIME_STEP_H '0036'
+            task pdb
+              trigger ../../../prod/036/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../033/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/036/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 039
+            edit EMOS_TIME_STEP_H '0039'
+            task pdb
+              trigger ../../../prod/039/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../036/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/039/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 042
+            edit EMOS_TIME_STEP_H '0042'
+            task pdb
+              trigger ../../../prod/042/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../039/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/042/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 045
+            edit EMOS_TIME_STEP_H '0045'
+            task pdb
+              trigger ../../../prod/045/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../042/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/045/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 048
+            edit EMOS_TIME_STEP_H '0048'
+            task pdb
+              trigger ../../../prod/048/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../045/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/048/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 051
+            edit EMOS_TIME_STEP_H '0051'
+            task pdb
+              trigger ../../../prod/051/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../048/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/051/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 054
+            edit EMOS_TIME_STEP_H '0054'
+            task pdb
+              trigger ../../../prod/054/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../051/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/054/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 057
+            edit EMOS_TIME_STEP_H '0057'
+            task pdb
+              trigger ../../../prod/057/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../054/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/057/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 060
+            edit EMOS_TIME_STEP_H '0060'
+            task pdb
+              trigger ../../../prod/060/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../057/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/060/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 063
+            edit EMOS_TIME_STEP_H '0063'
+            task pdb
+              trigger ../../../prod/063/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../060/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/063/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 066
+            edit EMOS_TIME_STEP_H '0066'
+            task pdb
+              trigger ../../../prod/066/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../063/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/066/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 069
+            edit EMOS_TIME_STEP_H '0069'
+            task pdb
+              trigger ../../../prod/069/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../066/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/069/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 072
+            edit EMOS_TIME_STEP_H '0072'
+            task pdb
+              trigger ../../../prod/072/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../069/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/072/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 075
+            edit EMOS_TIME_STEP_H '0075'
+            task pdb
+              trigger ../../../prod/075/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../072/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/075/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 078
+            edit EMOS_TIME_STEP_H '0078'
+            task pdb
+              trigger ../../../prod/078/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../075/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/078/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 081
+            edit EMOS_TIME_STEP_H '0081'
+            task pdb
+              trigger ../../../prod/081/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../078/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 084
+            edit EMOS_TIME_STEP_H '0084'
+            task pdb
+              trigger ../../../prod/084/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../081/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 087
+            edit EMOS_TIME_STEP_H '0087'
+            task pdb
+              trigger ../../../prod/087/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../084/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 090
+            edit EMOS_TIME_STEP_H '0090'
+            task pdb
+              trigger ../../../prod/090/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../087/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          task check
+            trigger ./078 eq complete
+        endfamily
+      endfamily
+    endfamily
+    family 00
+      trigger make eq complete
+      edit EMOS_BASE '00'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '1'
+      edit ACCOUNT 'oeoperpg'
+      edit SMSURL 'GOPER/00'
+      edit USER_PRIORITY '90'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/ex00/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex00/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex00/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete
+        family prepare_obs
+          trigger ./get eq complete
+          task preobs
+            trigger /e_36r1/main/12dc/an/update_psbias eq complete and /e_36r1/main/12dc/an/update_rstrhbias eq complete
+            edit mode 'not1crad'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+        family reservation
+          late -c +00:03
+          trigger ./get/get_stor eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task adv_res
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '40'
+            edit RESERVE_IN '60'
+            edit RESERVED_NODES '24'
+            edit RESERVATION_LABEL 'emos00XP'
+            label info ""
+          task adv_resA
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '100'
+            edit RESERVE_IN '11'
+            edit RESERVED_NODES '48'
+            edit RESERVATION_LABEL 'emos00A'
+            label info ""
+          task adv_resB
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '30'
+            edit RESERVE_IN '48'
+            edit RESERVED_NODES '48'
+            edit RESERVATION_LABEL 'emos00B'
+            label info ""
+          task adv_resC
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '80'
+            edit RESERVE_IN '60'
+            edit RESERVED_NODES '120'
+            edit RESERVATION_LABEL 'emos00C'
+            label info ""
+          task loadl_cycle_limit
+            late -s +00:03 -c +00:02
+            edit LOADL_CYCLE '65'
+            label info ""
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit PERIOD_4D '6'
+        edit WINDOW_LENGTH_4D '6'
+        edit WINDOW_OFFSET_4D '3'
+        edit ACCOUNT 'oeoperan'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          trigger ( ../../12dc/fc/model:step ge 6 or ../../12dc/fc/model eq complete) and ../../18/an eq complete
+          event hires
+        task fetcherr
+          trigger ../../18/an eq complete and ../../12dc/an eq complete
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./4dvar/uptraj_0/ifstraj eq active or ./4dvar/uptraj_0/ifstraj eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '3072'
+            edit RESERVE_FOR '100'
+            label info ""
+          task rm_res
+            late -s +00:03 -c +00:02
+            edit RESERVATION_LABEL 'emos00A'
+            label info ""
+          task ms_cpu
+            late -s +00:03 -c +00:02
+            edit MS_CPUS '$((64*30))'
+            label info ""
+        endfamily
+        family reservation3
+          late -c +00:03
+          trigger ./4dvar/uptraj_1 eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task set_class
+            late -s +00:03 -c +00:02
+            edit RESERVATION_DEFINITION 'default'
+            label info ""
+        endfamily
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit ACCOUNT 'oeoperfc'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task getpersSST
+          trigger getfcdata eq complete
+          edit SSTLEN '240'
+          edit SSTINT '1'
+          edit THREADS '2'
+          edit NPES '16'
+          edit MEM '1000'
+          edit CPUTIME '960'
+        task model
+          late -s +00:02
+          trigger ( getfcdata eq complete) and ( getpersSST eq complete)
+          edit PERSST 'true'
+          edit FCLENGTH '240'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          meter step -1 240 240
+        task ddh
+          trigger model eq complete
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete and ddh eq complete and ../../12dc/fc eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./getfcdata eq active or ./getfcdata eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          family xp
+            task set_xp
+              late -s +00:03 -c +00:02
+              edit RESERVATION_LABEL 'emos00XP'
+              label info ""
+            task rm_res
+              late -s +00:03 -c +00:02
+              trigger ./set_xp eq complete
+              edit RESERVATION_LABEL 'emos00XP'
+              label info ""
+          endfamily
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '12160'
+            edit RESERVE_FOR '2'
+            label info ""
+          task rm_res
+            late -s +00:03 -c +00:02
+            edit RESERVATION_LABEL 'emos00B'
+            label info ""
+        endfamily
+      endfamily
+      family getreq
+        trigger ( /e_36r1/main/00/an/4dvar eq active or /e_36r1/main/00/an/4dvar eq complete) and ( ./prod eq queued or ./prod eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit PROD_TASK '1'
+        edit EMOS_DOMAIN 'G'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_PROJECT '12'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'OPER'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '00'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger collectreq eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete and ( req:001 or req eq complete)
+          label info ""
+          event 1 
+        task collectwave
+          trigger ./collectbitmap eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '00'
+          edit EMOS_STREAM 'WAVE'
+        task wavereq
+          late -s +00:03 -c +00:10
+          trigger ./collectwave eq complete
+          edit EMOS_STREAM 'WAVE'
+          label info ""
+          event 1 
+        task pgclima
+          late -s +00:03 -c +00:10
+          event 1 
+      endfamily
+      family prod
+        trigger ( getreq/req:001 or getreq/req eq complete) and ( getreq/bitmap:001 or getreq/bitmap eq complete) and ( getreq/wavereq:001 or getreq/wavereq eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit EMOS_PROJECT '12'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit EMOS_BASE '00'
+        family 18an
+          trigger /e_36r1/main/12dc/an/dcda_to_da eq complete
+          edit EMOS_TYPE 'an'
+          edit EMOS_BASE '18'
+          edit DELTA_DAY '0'
+          edit SMSURL 'GOPER/18'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 00an
+          trigger /e_36r1/main/00/an/surf_anal eq complete and ( /e_36r1/main/00/an/4dvar/ifstraj:finalwave or /e_36r1/main/00/an/4dvar/ifstraj eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TYPE 'an'
+          edit PGNPES '90'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ( ./derived_param:SMOS or ./derived_param eq complete) and ( ( /e_36r1/main/00/an/4dvar/ifstraj:finalwave or /e_36r1/main/00/an/4dvar/ifstraj eq complete))
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 000
+          trigger ( /e_36r1/main/00/fc/model:step ge 000 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0000'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '000'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 003
+          trigger ( /e_36r1/main/00/fc/model:step ge 003 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../000/derived_param:SMOS or ../000/derived_param eq complete) or ( ../000/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '003'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 006
+          trigger ( /e_36r1/main/00/fc/model:step ge 006 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../003/derived_param:SMOS or ../003/derived_param eq complete) or ( ../003/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '006'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 009
+          trigger ( /e_36r1/main/00/fc/model:step ge 009 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../006/derived_param:SMOS or ../006/derived_param eq complete) or ( ../006/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '009'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 012
+          trigger ( /e_36r1/main/00/fc/model:step ge 012 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../009/derived_param:SMOS or ../009/derived_param eq complete) or ( ../009/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '012'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 015
+          trigger ( /e_36r1/main/00/fc/model:step ge 015 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../012/derived_param:SMOS or ../012/derived_param eq complete) or ( ../012/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '015'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 018
+          trigger ( /e_36r1/main/00/fc/model:step ge 018 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../015/derived_param:SMOS or ../015/derived_param eq complete) or ( ../015/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '018'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 021
+          trigger ( /e_36r1/main/00/fc/model:step ge 021 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../018/derived_param:SMOS or ../018/derived_param eq complete) or ( ../018/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '021'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 024
+          trigger ( /e_36r1/main/00/fc/model:step ge 024 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../021/derived_param:SMOS or ../021/derived_param eq complete) or ( ../021/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '024'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 027
+          trigger ( /e_36r1/main/00/fc/model:step ge 027 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../024/derived_param:SMOS or ../024/derived_param eq complete) or ( ../024/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '027'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 030
+          trigger ( /e_36r1/main/00/fc/model:step ge 030 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../027/derived_param:SMOS or ../027/derived_param eq complete) or ( ../027/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '030'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 033
+          trigger ( /e_36r1/main/00/fc/model:step ge 033 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../030/derived_param:SMOS or ../030/derived_param eq complete) or ( ../030/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '033'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 036
+          trigger ( /e_36r1/main/00/fc/model:step ge 036 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0036'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../033/derived_param:SMOS or ../033/derived_param eq complete) or ( ../033/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '036'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 039
+          trigger ( /e_36r1/main/00/fc/model:step ge 039 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0039'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../036/derived_param:SMOS or ../036/derived_param eq complete) or ( ../036/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '039'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 042
+          trigger ( /e_36r1/main/00/fc/model:step ge 042 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0042'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../039/derived_param:SMOS or ../039/derived_param eq complete) or ( ../039/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '042'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 045
+          trigger ( /e_36r1/main/00/fc/model:step ge 045 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0045'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../042/derived_param:SMOS or ../042/derived_param eq complete) or ( ../042/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '045'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 048
+          trigger ( /e_36r1/main/00/fc/model:step ge 048 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0048'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../045/derived_param:SMOS or ../045/derived_param eq complete) or ( ../045/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '048'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 051
+          trigger ( /e_36r1/main/00/fc/model:step ge 051 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0051'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../048/derived_param:SMOS or ../048/derived_param eq complete) or ( ../048/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '051'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 054
+          trigger ( /e_36r1/main/00/fc/model:step ge 054 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0054'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../051/derived_param:SMOS or ../051/derived_param eq complete) or ( ../051/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '054'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 057
+          trigger ( /e_36r1/main/00/fc/model:step ge 057 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0057'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../054/derived_param:SMOS or ../054/derived_param eq complete) or ( ../054/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '057'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 060
+          trigger ( /e_36r1/main/00/fc/model:step ge 060 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0060'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../057/derived_param:SMOS or ../057/derived_param eq complete) or ( ../057/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '060'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 063
+          trigger ( /e_36r1/main/00/fc/model:step ge 063 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0063'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../060/derived_param:SMOS or ../060/derived_param eq complete) or ( ../060/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '063'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 066
+          trigger ( /e_36r1/main/00/fc/model:step ge 066 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0066'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../063/derived_param:SMOS or ../063/derived_param eq complete) or ( ../063/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '066'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 069
+          trigger ( /e_36r1/main/00/fc/model:step ge 069 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0069'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../066/derived_param:SMOS or ../066/derived_param eq complete) or ( ../066/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '069'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 072
+          trigger ( /e_36r1/main/00/fc/model:step ge 072 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0072'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../069/derived_param:SMOS or ../069/derived_param eq complete) or ( ../069/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '072'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 075
+          trigger ( /e_36r1/main/00/fc/model:step ge 075 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0075'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../072/derived_param:SMOS or ../072/derived_param eq complete) or ( ../072/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '075'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 078
+          trigger ( /e_36r1/main/00/fc/model:step ge 078 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0078'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../075/derived_param:SMOS or ../075/derived_param eq complete) or ( ../075/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '078'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 081
+          trigger ( /e_36r1/main/00/fc/model:step ge 081 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0081'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../078/derived_param:SMOS or ../078/derived_param eq complete) or ( ../078/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '081'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 084
+          trigger ( /e_36r1/main/00/fc/model:step ge 084 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0084'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../081/derived_param:SMOS or ../081/derived_param eq complete) or ( ../081/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '084'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 087
+          trigger ( /e_36r1/main/00/fc/model:step ge 087 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0087'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../084/derived_param:SMOS or ../084/derived_param eq complete) or ( ../084/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '087'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 090
+          trigger ( /e_36r1/main/00/fc/model:step ge 090 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0090'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../087/derived_param:SMOS or ../087/derived_param eq complete) or ( ../087/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '090'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 093
+          trigger ( /e_36r1/main/00/fc/model:step ge 093 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0093'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../090/derived_param:SMOS or ../090/derived_param eq complete) or ( ../090/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '093'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 096
+          trigger ( /e_36r1/main/00/fc/model:step ge 096 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0096'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../093/derived_param:SMOS or ../093/derived_param eq complete) or ( ../093/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '096'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 099
+          trigger ( /e_36r1/main/00/fc/model:step ge 099 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0099'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../096/derived_param:SMOS or ../096/derived_param eq complete) or ( ../096/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '099'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 102
+          trigger ( /e_36r1/main/00/fc/model:step ge 102 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0102'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../099/derived_param:SMOS or ../099/derived_param eq complete) or ( ../099/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '102'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 105
+          trigger ( /e_36r1/main/00/fc/model:step ge 105 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0105'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../102/derived_param:SMOS or ../102/derived_param eq complete) or ( ../102/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '105'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 108
+          trigger ( /e_36r1/main/00/fc/model:step ge 108 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0108'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../105/derived_param:SMOS or ../105/derived_param eq complete) or ( ../105/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '108'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 111
+          trigger ( /e_36r1/main/00/fc/model:step ge 111 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0111'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../108/derived_param:SMOS or ../108/derived_param eq complete) or ( ../108/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '111'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 114
+          trigger ( /e_36r1/main/00/fc/model:step ge 114 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0114'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../111/derived_param:SMOS or ../111/derived_param eq complete) or ( ../111/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '114'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 117
+          trigger ( /e_36r1/main/00/fc/model:step ge 117 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0117'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../114/derived_param:SMOS or ../114/derived_param eq complete) or ( ../114/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '117'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 120
+          trigger ( /e_36r1/main/00/fc/model:step ge 120 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0120'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../117/derived_param:SMOS or ../117/derived_param eq complete) or ( ../117/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '120'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 123
+          trigger ( /e_36r1/main/00/fc/model:step ge 123 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0123'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../120/derived_param:SMOS or ../120/derived_param eq complete) or ( ../120/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '123'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 126
+          trigger ( /e_36r1/main/00/fc/model:step ge 126 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0126'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../123/derived_param:SMOS or ../123/derived_param eq complete) or ( ../123/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '126'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 129
+          trigger ( /e_36r1/main/00/fc/model:step ge 129 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0129'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../126/derived_param:SMOS or ../126/derived_param eq complete) or ( ../126/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '129'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 132
+          trigger ( /e_36r1/main/00/fc/model:step ge 132 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0132'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../129/derived_param:SMOS or ../129/derived_param eq complete) or ( ../129/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '132'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 135
+          trigger ( /e_36r1/main/00/fc/model:step ge 135 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0135'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../132/derived_param:SMOS or ../132/derived_param eq complete) or ( ../132/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '135'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 138
+          trigger ( /e_36r1/main/00/fc/model:step ge 138 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0138'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../135/derived_param:SMOS or ../135/derived_param eq complete) or ( ../135/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '138'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 141
+          trigger ( /e_36r1/main/00/fc/model:step ge 141 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0141'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../138/derived_param:SMOS or ../138/derived_param eq complete) or ( ../138/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '141'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 144
+          trigger ( /e_36r1/main/00/fc/model:step ge 144 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0144'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../141/derived_param:SMOS or ../141/derived_param eq complete) or ( ../141/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '144'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 150
+          trigger ( /e_36r1/main/00/fc/model:step ge 150 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0150'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../144/derived_param:SMOS or ../144/derived_param eq complete) or ( ../144/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '150'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 156
+          trigger ( /e_36r1/main/00/fc/model:step ge 156 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0156'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../150/derived_param:SMOS or ../150/derived_param eq complete) or ( ../150/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '156'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 162
+          trigger ( /e_36r1/main/00/fc/model:step ge 162 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0162'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../156/derived_param:SMOS or ../156/derived_param eq complete) or ( ../156/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '162'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 168
+          trigger ( /e_36r1/main/00/fc/model:step ge 168 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0168'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../162/derived_param:SMOS or ../162/derived_param eq complete) or ( ../162/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '168'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 174
+          trigger ( /e_36r1/main/00/fc/model:step ge 174 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0174'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../168/derived_param:SMOS or ../168/derived_param eq complete) or ( ../168/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '174'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 180
+          trigger ( /e_36r1/main/00/fc/model:step ge 180 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0180'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../174/derived_param:SMOS or ../174/derived_param eq complete) or ( ../174/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '180'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 186
+          trigger ( /e_36r1/main/00/fc/model:step ge 186 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0186'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../180/derived_param:SMOS or ../180/derived_param eq complete) or ( ../180/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '186'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 192
+          trigger ( /e_36r1/main/00/fc/model:step ge 192 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0192'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../186/derived_param:SMOS or ../186/derived_param eq complete) or ( ../186/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '192'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 198
+          trigger ( /e_36r1/main/00/fc/model:step ge 198 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0198'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../192/derived_param:SMOS or ../192/derived_param eq complete) or ( ../192/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '198'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 204
+          trigger ( /e_36r1/main/00/fc/model:step ge 204 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0204'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../198/derived_param:SMOS or ../198/derived_param eq complete) or ( ../198/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '204'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 210
+          trigger ( /e_36r1/main/00/fc/model:step ge 210 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0210'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../204/derived_param:SMOS or ../204/derived_param eq complete) or ( ../204/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '210'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 216
+          trigger ( /e_36r1/main/00/fc/model:step ge 216 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0216'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../210/derived_param:SMOS or ../210/derived_param eq complete) or ( ../210/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '216'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 222
+          trigger ( /e_36r1/main/00/fc/model:step ge 222 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0222'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../216/derived_param:SMOS or ../216/derived_param eq complete) or ( ../216/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '222'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 228
+          trigger ( /e_36r1/main/00/fc/model:step ge 228 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0228'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../222/derived_param:SMOS or ../222/derived_param eq complete) or ( ../222/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '228'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 234
+          trigger ( /e_36r1/main/00/fc/model:step ge 234 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0234'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../228/derived_param:SMOS or ../228/derived_param eq complete) or ( ../228/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '234'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 240
+          trigger ( /e_36r1/main/00/fc/model:step ge 240 or /e_36r1/main/00/fc/model eq complete) and ( ../getreq/pgclima:001 or ../getreq/pgclima eq complete)
+          edit EMOS_TIME_STEP_H '0240'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '91'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task prod_wparam
+            late -s +00:05 -c +00:15
+            trigger ./derived_param eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TYPE 'wp'
+            edit PGNPES '64'
+            edit INIMEM '800'
+            inlimit /e_36r1/limits:prod
+          task prodwave
+            late -s +00:05 -c +00:15
+            edit EMOS_STREAM 'WV'
+            edit PGNPES '2'
+            inlimit /limits:prod
+            inlimit /e_36r1/limits:prod
+          task derived_param
+            trigger ( ../234/derived_param:SMOS or ../234/derived_param eq complete) or ( ../234/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '240'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family reservation1
+          late -c +00:03
+          trigger /e_36r1/main/00bc/prod/078/prodgen eq active or /e_36r1/main/00bc/prod/078/prodgen eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task set_xp
+            late -s +00:03 -c +00:02
+            edit RESERVATION_NODES '18'
+            label info ""
+        endfamily
+        family reservation2
+          late -c +00:03
+          trigger /e_36r1/main/00/prod/240/prodgen eq active or /e_36r1/main/00/prod/240/prodgen eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task set_xp
+            late -s +00:03 -c +00:02
+            edit RESERVATION_NODES '18'
+            label info ""
+        endfamily
+        family reservation3
+          late -c +00:03
+          trigger /e_36r1/main/00/prod/240/prodgen eq active or /e_36r1/main/00/prod/240/prodgen eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reset_xp
+            late -s +00:03 -c +00:02
+            trigger /emc_36r1/main/00/legB/prod eq complete
+            edit RESERVATION_NODES '0'
+            label info ""
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        task operation_is_late
+          event yes
+        family oper
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '92'
+          edit EMOS_PROJECT '12'
+          edit SMSURL 'GOPER/00'
+          edit EMOS_BASE '00'
+          family 18an
+            edit EMOS_TYPE 'an'
+            edit EMOS_BASE '18'
+            edit SMSURL 'GOPER/18'
+            edit DELTA_DAY '0'
+            task pdb
+              trigger ../../../prod/18an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 00an
+            edit EMOS_TYPE 'an'
+            task pdb
+              trigger ../../../prod/00an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 000
+            edit EMOS_TIME_STEP_H '0000'
+            task pdb
+              trigger ../../../prod/000/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../00an/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 003
+            edit EMOS_TIME_STEP_H '0003'
+            task pdb
+              trigger ../../../prod/003/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../000/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 006
+            edit EMOS_TIME_STEP_H '0006'
+            task pdb
+              trigger ../../../prod/006/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../003/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 009
+            edit EMOS_TIME_STEP_H '0009'
+            task pdb
+              trigger ../../../prod/009/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../006/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 012
+            edit EMOS_TIME_STEP_H '0012'
+            task pdb
+              trigger ../../../prod/012/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../009/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 015
+            edit EMOS_TIME_STEP_H '0015'
+            task pdb
+              trigger ../../../prod/015/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../012/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 018
+            edit EMOS_TIME_STEP_H '0018'
+            task pdb
+              trigger ../../../prod/018/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../015/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 021
+            edit EMOS_TIME_STEP_H '0021'
+            task pdb
+              trigger ../../../prod/021/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../018/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 024
+            edit EMOS_TIME_STEP_H '0024'
+            task pdb
+              trigger ../../../prod/024/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../021/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 027
+            edit EMOS_TIME_STEP_H '0027'
+            task pdb
+              trigger ../../../prod/027/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../024/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 030
+            edit EMOS_TIME_STEP_H '0030'
+            task pdb
+              trigger ../../../prod/030/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../027/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 033
+            edit EMOS_TIME_STEP_H '0033'
+            task pdb
+              trigger ../../../prod/033/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../030/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 036
+            edit EMOS_TIME_STEP_H '0036'
+            task pdb
+              trigger ../../../prod/036/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../033/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 039
+            edit EMOS_TIME_STEP_H '0039'
+            task pdb
+              trigger ../../../prod/039/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../036/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 042
+            edit EMOS_TIME_STEP_H '0042'
+            task pdb
+              trigger ../../../prod/042/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../039/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 045
+            edit EMOS_TIME_STEP_H '0045'
+            task pdb
+              trigger ../../../prod/045/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../042/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 048
+            edit EMOS_TIME_STEP_H '0048'
+            task pdb
+              trigger ../../../prod/048/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../045/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 051
+            edit EMOS_TIME_STEP_H '0051'
+            task pdb
+              trigger ../../../prod/051/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../048/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 054
+            edit EMOS_TIME_STEP_H '0054'
+            task pdb
+              trigger ../../../prod/054/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../051/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 057
+            edit EMOS_TIME_STEP_H '0057'
+            task pdb
+              trigger ../../../prod/057/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../054/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 060
+            edit EMOS_TIME_STEP_H '0060'
+            task pdb
+              trigger ../../../prod/060/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../057/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 063
+            edit EMOS_TIME_STEP_H '0063'
+            task pdb
+              trigger ../../../prod/063/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../060/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 066
+            edit EMOS_TIME_STEP_H '0066'
+            task pdb
+              trigger ../../../prod/066/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../063/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 069
+            edit EMOS_TIME_STEP_H '0069'
+            task pdb
+              trigger ../../../prod/069/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../066/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 072
+            edit EMOS_TIME_STEP_H '0072'
+            task pdb
+              trigger ../../../prod/072/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../069/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 075
+            edit EMOS_TIME_STEP_H '0075'
+            task pdb
+              trigger ../../../prod/075/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../072/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 078
+            edit EMOS_TIME_STEP_H '0078'
+            task pdb
+              trigger ../../../prod/078/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../075/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 081
+            edit EMOS_TIME_STEP_H '0081'
+            task pdb
+              trigger ../../../prod/081/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../078/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 084
+            edit EMOS_TIME_STEP_H '0084'
+            task pdb
+              trigger ../../../prod/084/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../081/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 087
+            edit EMOS_TIME_STEP_H '0087'
+            task pdb
+              trigger ../../../prod/087/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../084/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 090
+            edit EMOS_TIME_STEP_H '0090'
+            task pdb
+              trigger ../../../prod/090/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../087/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 093
+            edit EMOS_TIME_STEP_H '0093'
+            task pdb
+              trigger ../../../prod/093/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../090/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 096
+            edit EMOS_TIME_STEP_H '0096'
+            task pdb
+              trigger ../../../prod/096/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../093/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 099
+            edit EMOS_TIME_STEP_H '0099'
+            task pdb
+              trigger ../../../prod/099/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../096/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 102
+            edit EMOS_TIME_STEP_H '0102'
+            task pdb
+              trigger ../../../prod/102/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../099/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 105
+            edit EMOS_TIME_STEP_H '0105'
+            task pdb
+              trigger ../../../prod/105/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../102/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 108
+            edit EMOS_TIME_STEP_H '0108'
+            task pdb
+              trigger ../../../prod/108/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../105/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 111
+            edit EMOS_TIME_STEP_H '0111'
+            task pdb
+              trigger ../../../prod/111/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../108/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 114
+            edit EMOS_TIME_STEP_H '0114'
+            task pdb
+              trigger ../../../prod/114/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../111/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 117
+            edit EMOS_TIME_STEP_H '0117'
+            task pdb
+              trigger ../../../prod/117/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../114/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 120
+            edit EMOS_TIME_STEP_H '0120'
+            task pdb
+              trigger ../../../prod/120/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../117/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 123
+            edit EMOS_TIME_STEP_H '0123'
+            task pdb
+              trigger ../../../prod/123/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../120/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 126
+            edit EMOS_TIME_STEP_H '0126'
+            task pdb
+              trigger ../../../prod/126/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../123/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 129
+            edit EMOS_TIME_STEP_H '0129'
+            task pdb
+              trigger ../../../prod/129/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../126/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 132
+            edit EMOS_TIME_STEP_H '0132'
+            task pdb
+              trigger ../../../prod/132/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../129/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 135
+            edit EMOS_TIME_STEP_H '0135'
+            task pdb
+              trigger ../../../prod/135/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../132/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 138
+            edit EMOS_TIME_STEP_H '0138'
+            task pdb
+              trigger ../../../prod/138/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../135/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 141
+            edit EMOS_TIME_STEP_H '0141'
+            task pdb
+              trigger ../../../prod/141/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../138/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 144
+            edit EMOS_TIME_STEP_H '0144'
+            task pdb
+              trigger ../../../prod/144/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../141/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 150
+            edit EMOS_TIME_STEP_H '0150'
+            task pdb
+              trigger ../../../prod/150/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../144/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 156
+            edit EMOS_TIME_STEP_H '0156'
+            task pdb
+              trigger ../../../prod/156/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../150/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 162
+            edit EMOS_TIME_STEP_H '0162'
+            task pdb
+              trigger ../../../prod/162/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../156/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 168
+            edit EMOS_TIME_STEP_H '0168'
+            task pdb
+              trigger ../../../prod/168/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../162/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 174
+            edit EMOS_TIME_STEP_H '0174'
+            task pdb
+              trigger ../../../prod/174/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../168/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 180
+            edit EMOS_TIME_STEP_H '0180'
+            task pdb
+              trigger ../../../prod/180/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../174/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 186
+            edit EMOS_TIME_STEP_H '0186'
+            task pdb
+              trigger ../../../prod/186/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../180/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 192
+            edit EMOS_TIME_STEP_H '0192'
+            task pdb
+              trigger ../../../prod/192/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../186/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 198
+            edit EMOS_TIME_STEP_H '0198'
+            task pdb
+              trigger ../../../prod/198/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../192/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 204
+            edit EMOS_TIME_STEP_H '0204'
+            task pdb
+              trigger ../../../prod/204/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../198/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 210
+            edit EMOS_TIME_STEP_H '0210'
+            task pdb
+              trigger ../../../prod/210/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../204/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 216
+            edit EMOS_TIME_STEP_H '0216'
+            task pdb
+              trigger ../../../prod/216/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../210/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 222
+            edit EMOS_TIME_STEP_H '0222'
+            task pdb
+              trigger ../../../prod/222/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../216/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 228
+            edit EMOS_TIME_STEP_H '0228'
+            task pdb
+              trigger ../../../prod/228/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../222/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 234
+            edit EMOS_TIME_STEP_H '0234'
+            task pdb
+              trigger ../../../prod/234/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../228/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family 240
+            edit EMOS_TIME_STEP_H '0240'
+            task pdb
+              trigger ../../../prod/240/prodgen eq complete
+              inlimit /e_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../234/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+            task diss_wparam
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/240/prod_wparam eq complete
+              edit PROD_TASK 'w'
+              edit EMOS_TYPE 'wp'
+              label info ""
+              event pdb
+          endfamily
+          task check
+            trigger ./240 eq complete
+        endfamily
+        family wave
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit EMOS_PROJECT '12'
+          edit EMOS_STREAM 'WV'
+          edit SMSURL 'GWAVE/00'
+          inlimit /e_36r1/limits:w2diss
+          inlimit /limits:q2diss
+          family 18an
+            edit EMOS_TYPE 'an'
+            edit EMOS_BASE '18'
+            edit SMSURL 'GWAVE/18'
+            edit DELTA_DAY '0'
+            task diss
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/18an/prodwave eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event pdb
+          endfamily
+          family 00an
+            edit EMOS_TYPE 'an'
+            task diss
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/00an/prodwave eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event pdb
+          endfamily
+          family 000
+            trigger ../../prod/000/prodwave eq complete and ./18an eq complete and ./00an eq complete
+            edit EMOS_TIME_STEP_H '0000'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 003
+            trigger ../../prod/003/prodwave eq complete and ( ./000/diss:pdb or ./000 eq complete)
+            edit EMOS_TIME_STEP_H '0003'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 006
+            trigger ../../prod/006/prodwave eq complete and ( ./003/diss:pdb or ./003 eq complete)
+            edit EMOS_TIME_STEP_H '0006'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 009
+            trigger ../../prod/009/prodwave eq complete and ( ./006/diss:pdb or ./006 eq complete)
+            edit EMOS_TIME_STEP_H '0009'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 012
+            trigger ../../prod/012/prodwave eq complete and ( ./009/diss:pdb or ./009 eq complete)
+            edit EMOS_TIME_STEP_H '0012'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 015
+            trigger ../../prod/015/prodwave eq complete and ( ./012/diss:pdb or ./012 eq complete)
+            edit EMOS_TIME_STEP_H '0015'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 018
+            trigger ../../prod/018/prodwave eq complete and ( ./015/diss:pdb or ./015 eq complete)
+            edit EMOS_TIME_STEP_H '0018'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 021
+            trigger ../../prod/021/prodwave eq complete and ( ./018/diss:pdb or ./018 eq complete)
+            edit EMOS_TIME_STEP_H '0021'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 024
+            trigger ../../prod/024/prodwave eq complete and ( ./021/diss:pdb or ./021 eq complete)
+            edit EMOS_TIME_STEP_H '0024'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 027
+            trigger ../../prod/027/prodwave eq complete and ( ./024/diss:pdb or ./024 eq complete)
+            edit EMOS_TIME_STEP_H '0027'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 030
+            trigger ../../prod/030/prodwave eq complete and ( ./027/diss:pdb or ./027 eq complete)
+            edit EMOS_TIME_STEP_H '0030'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 033
+            trigger ../../prod/033/prodwave eq complete and ( ./030/diss:pdb or ./030 eq complete)
+            edit EMOS_TIME_STEP_H '0033'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 036
+            trigger ../../prod/036/prodwave eq complete and ( ./033/diss:pdb or ./033 eq complete)
+            edit EMOS_TIME_STEP_H '0036'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 039
+            trigger ../../prod/039/prodwave eq complete and ( ./036/diss:pdb or ./036 eq complete)
+            edit EMOS_TIME_STEP_H '0039'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 042
+            trigger ../../prod/042/prodwave eq complete and ( ./039/diss:pdb or ./039 eq complete)
+            edit EMOS_TIME_STEP_H '0042'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 045
+            trigger ../../prod/045/prodwave eq complete and ( ./042/diss:pdb or ./042 eq complete)
+            edit EMOS_TIME_STEP_H '0045'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 048
+            trigger ../../prod/048/prodwave eq complete and ( ./045/diss:pdb or ./045 eq complete)
+            edit EMOS_TIME_STEP_H '0048'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 051
+            trigger ../../prod/051/prodwave eq complete and ( ./048/diss:pdb or ./048 eq complete)
+            edit EMOS_TIME_STEP_H '0051'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 054
+            trigger ../../prod/054/prodwave eq complete and ( ./051/diss:pdb or ./051 eq complete)
+            edit EMOS_TIME_STEP_H '0054'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 057
+            trigger ../../prod/057/prodwave eq complete and ( ./054/diss:pdb or ./054 eq complete)
+            edit EMOS_TIME_STEP_H '0057'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 060
+            trigger ../../prod/060/prodwave eq complete and ( ./057/diss:pdb or ./057 eq complete)
+            edit EMOS_TIME_STEP_H '0060'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 063
+            trigger ../../prod/063/prodwave eq complete and ( ./060/diss:pdb or ./060 eq complete)
+            edit EMOS_TIME_STEP_H '0063'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 066
+            trigger ../../prod/066/prodwave eq complete and ( ./063/diss:pdb or ./063 eq complete)
+            edit EMOS_TIME_STEP_H '0066'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 069
+            trigger ../../prod/069/prodwave eq complete and ( ./066/diss:pdb or ./066 eq complete)
+            edit EMOS_TIME_STEP_H '0069'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 072
+            trigger ../../prod/072/prodwave eq complete and ( ./069/diss:pdb or ./069 eq complete)
+            edit EMOS_TIME_STEP_H '0072'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 075
+            trigger ../../prod/075/prodwave eq complete and ( ./072/diss:pdb or ./072 eq complete)
+            edit EMOS_TIME_STEP_H '0075'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 078
+            trigger ../../prod/078/prodwave eq complete and ( ./075/diss:pdb or ./075 eq complete)
+            edit EMOS_TIME_STEP_H '0078'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 081
+            trigger ../../prod/081/prodwave eq complete and ( ./078/diss:pdb or ./078 eq complete)
+            edit EMOS_TIME_STEP_H '0081'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 084
+            trigger ../../prod/084/prodwave eq complete and ( ./081/diss:pdb or ./081 eq complete)
+            edit EMOS_TIME_STEP_H '0084'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 087
+            trigger ../../prod/087/prodwave eq complete and ( ./084/diss:pdb or ./084 eq complete)
+            edit EMOS_TIME_STEP_H '0087'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 090
+            trigger ../../prod/090/prodwave eq complete and ( ./087/diss:pdb or ./087 eq complete)
+            edit EMOS_TIME_STEP_H '0090'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 093
+            trigger ../../prod/093/prodwave eq complete and ( ./090/diss:pdb or ./090 eq complete)
+            edit EMOS_TIME_STEP_H '0093'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 096
+            trigger ../../prod/096/prodwave eq complete and ( ./093/diss:pdb or ./093 eq complete)
+            edit EMOS_TIME_STEP_H '0096'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 099
+            trigger ../../prod/099/prodwave eq complete and ( ./096/diss:pdb or ./096 eq complete)
+            edit EMOS_TIME_STEP_H '0099'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 102
+            trigger ../../prod/102/prodwave eq complete and ( ./099/diss:pdb or ./099 eq complete)
+            edit EMOS_TIME_STEP_H '0102'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 105
+            trigger ../../prod/105/prodwave eq complete and ( ./102/diss:pdb or ./102 eq complete)
+            edit EMOS_TIME_STEP_H '0105'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 108
+            trigger ../../prod/108/prodwave eq complete and ( ./105/diss:pdb or ./105 eq complete)
+            edit EMOS_TIME_STEP_H '0108'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 111
+            trigger ../../prod/111/prodwave eq complete and ( ./108/diss:pdb or ./108 eq complete)
+            edit EMOS_TIME_STEP_H '0111'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 114
+            trigger ../../prod/114/prodwave eq complete and ( ./111/diss:pdb or ./111 eq complete)
+            edit EMOS_TIME_STEP_H '0114'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 117
+            trigger ../../prod/117/prodwave eq complete and ( ./114/diss:pdb or ./114 eq complete)
+            edit EMOS_TIME_STEP_H '0117'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 120
+            trigger ../../prod/120/prodwave eq complete and ( ./117/diss:pdb or ./117 eq complete)
+            edit EMOS_TIME_STEP_H '0120'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 123
+            trigger ../../prod/123/prodwave eq complete and ( ./120/diss:pdb or ./120 eq complete)
+            edit EMOS_TIME_STEP_H '0123'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 126
+            trigger ../../prod/126/prodwave eq complete and ( ./123/diss:pdb or ./123 eq complete)
+            edit EMOS_TIME_STEP_H '0126'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 129
+            trigger ../../prod/129/prodwave eq complete and ( ./126/diss:pdb or ./126 eq complete)
+            edit EMOS_TIME_STEP_H '0129'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 132
+            trigger ../../prod/132/prodwave eq complete and ( ./129/diss:pdb or ./129 eq complete)
+            edit EMOS_TIME_STEP_H '0132'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 135
+            trigger ../../prod/135/prodwave eq complete and ( ./132/diss:pdb or ./132 eq complete)
+            edit EMOS_TIME_STEP_H '0135'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 138
+            trigger ../../prod/138/prodwave eq complete and ( ./135/diss:pdb or ./135 eq complete)
+            edit EMOS_TIME_STEP_H '0138'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 141
+            trigger ../../prod/141/prodwave eq complete and ( ./138/diss:pdb or ./138 eq complete)
+            edit EMOS_TIME_STEP_H '0141'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 144
+            trigger ../../prod/144/prodwave eq complete and ( ./141/diss:pdb or ./141 eq complete)
+            edit EMOS_TIME_STEP_H '0144'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 150
+            trigger ../../prod/150/prodwave eq complete and ( ./144/diss:pdb or ./144 eq complete)
+            edit EMOS_TIME_STEP_H '0150'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 156
+            trigger ../../prod/156/prodwave eq complete and ( ./150/diss:pdb or ./150 eq complete)
+            edit EMOS_TIME_STEP_H '0156'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 162
+            trigger ../../prod/162/prodwave eq complete and ( ./156/diss:pdb or ./156 eq complete)
+            edit EMOS_TIME_STEP_H '0162'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 168
+            trigger ../../prod/168/prodwave eq complete and ( ./162/diss:pdb or ./162 eq complete)
+            edit EMOS_TIME_STEP_H '0168'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 174
+            trigger ../../prod/174/prodwave eq complete and ( ./168/diss:pdb or ./168 eq complete)
+            edit EMOS_TIME_STEP_H '0174'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 180
+            trigger ../../prod/180/prodwave eq complete and ( ./174/diss:pdb or ./174 eq complete)
+            edit EMOS_TIME_STEP_H '0180'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 186
+            trigger ../../prod/186/prodwave eq complete and ( ./180/diss:pdb or ./180 eq complete)
+            edit EMOS_TIME_STEP_H '0186'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 192
+            trigger ../../prod/192/prodwave eq complete and ( ./186/diss:pdb or ./186 eq complete)
+            edit EMOS_TIME_STEP_H '0192'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 198
+            trigger ../../prod/198/prodwave eq complete and ( ./192/diss:pdb or ./192 eq complete)
+            edit EMOS_TIME_STEP_H '0198'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 204
+            trigger ../../prod/204/prodwave eq complete and ( ./198/diss:pdb or ./198 eq complete)
+            edit EMOS_TIME_STEP_H '0204'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 210
+            trigger ../../prod/210/prodwave eq complete and ( ./204/diss:pdb or ./204 eq complete)
+            edit EMOS_TIME_STEP_H '0210'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 216
+            trigger ../../prod/216/prodwave eq complete and ( ./210/diss:pdb or ./210 eq complete)
+            edit EMOS_TIME_STEP_H '0216'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 222
+            trigger ../../prod/222/prodwave eq complete and ( ./216/diss:pdb or ./216 eq complete)
+            edit EMOS_TIME_STEP_H '0222'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 228
+            trigger ../../prod/228/prodwave eq complete and ( ./222/diss:pdb or ./222 eq complete)
+            edit EMOS_TIME_STEP_H '0228'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 234
+            trigger ../../prod/234/prodwave eq complete and ( ./228/diss:pdb or ./228 eq complete)
+            edit EMOS_TIME_STEP_H '0234'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 240
+            trigger ../../prod/240/prodwave eq complete and ( ./234/diss:pdb or ./234 eq complete)
+            edit EMOS_TIME_STEP_H '0240'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          task check
+            trigger ./240 eq complete
+        endfamily
+      endfamily
+    endfamily
+    family 06bc
+      trigger ( ( ./make eq complete) and ( /e_36r1/main/00/fc eq complete)) and ( /e_36r1/main/18bc/fc eq complete)
+      edit EMOS_BASE '06'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '1'
+      edit ACCOUNT 'opebcpg'
+      edit SMSURL 'GSCDA/06'
+      edit USER_PRIORITY '91'
+      family obs
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/obs'
+        family get
+          inlimit /e_36r1/limits:obs_get
+          inlimit /limits:obs_get
+          task get_nonbin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/nonbin eq complete
+            edit OBSFILE_OBSHOST 'BUFR'
+            edit OBSFILE_HPCF 'bufr'
+          task get_ers1_wa
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ers1_wa eq complete
+            edit OBSFILE_OBSHOST 'UWAX'
+            edit OBSFILE_HPCF 'wavescat'
+          task get_eas1
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/eas1 eq complete
+            edit OBSFILE_OBSHOST 'EAS1'
+            edit OBSFILE_HPCF 'wavesar'
+          task get_ers1_wi
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ers1_wi eq complete
+            edit OBSFILE_OBSHOST 'UWIX'
+            edit OBSFILE_HPCF 'scat'
+          task get_ers1_ra
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ers1_ra eq complete
+            edit OBSFILE_OBSHOST 'URAX'
+            edit OBSFILE_HPCF 'ralt'
+          task get_rtovs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/rtovs eq complete
+            edit OBSFILE_OBSHOST 'TOVH'
+            edit OBSFILE_HPCF 'tovh'
+          task get_ssbt
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ssbt eq complete
+            edit OBSFILE_OBSHOST 'SSBT'
+            edit OBSFILE_HPCF 'ssbt'
+          task get_sst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/sst/sst_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_atov
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/atov eq complete
+            edit OBSFILE_OBSHOST 'ATOV'
+            edit OBSFILE_HPCF 'atov'
+          task get_grad
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/grad eq complete
+            edit OBSFILE_OBSHOST 'GRAD'
+            edit OBSFILE_HPCF 'grad'
+          task get_stor
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/stor eq complete
+            edit OBSFILE_OBSHOST 'STOR'
+            edit OBSFILE_HPCF 'storm'
+          task get_trmm
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/trmm eq complete
+            edit OBSFILE_OBSHOST 'TRMM'
+            edit OBSFILE_HPCF 'tmi'
+          task get_qsca
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/qsca eq complete
+            edit OBSFILE_OBSHOST 'QSCA'
+            edit OBSFILE_HPCF 'qsca'
+          task get_sbuv
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/sbuv eq complete
+            edit OBSFILE_OBSHOST 'SBUV'
+            edit OBSFILE_HPCF 'reo3'
+          task get_airs
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/airs eq complete
+            edit OBSFILE_OBSHOST 'AIRS'
+            edit OBSFILE_HPCF 'airs'
+          task get_ice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ice/ice_fdb_c1b eq complete
+            edit OBSFILE_OBSHOST 'nil'
+            edit OBSFILE_HPCF 'nil'
+          task get_snow
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/snow eq complete
+            edit OBSFILE_OBSHOST 'SNOW'
+            edit OBSFILE_HPCF 'imssnow'
+          task get_ateu
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/ateu eq complete
+            edit OBSFILE_OBSHOST 'ATEU'
+            edit OBSFILE_HPCF 'amsu_ears'
+          task get_bice
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/bice eq complete
+            edit OBSFILE_OBSHOST 'BICE'
+            edit OBSFILE_HPCF 'baltic_ci'
+          task get_amsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/amsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AMSA'
+            edit OBSFILE_HPCF 'amsa'
+          task get_mhsa
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/mhsa eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MHSA'
+            edit OBSFILE_HPCF 'mhsa'
+          task get_hirs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/hirs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'HIRS'
+            edit OBSFILE_HPCF 'hirs'
+          task get_amsr
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/amsr eq complete
+            edit OBSFILE_OBSHOST 'AMSR'
+            edit OBSFILE_HPCF 'amsre_aq'
+          task get_rado
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/rado eq complete
+            edit OBSFILE_OBSHOST 'RADO'
+            edit OBSFILE_HPCF 'gpsro'
+          task get_smin
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/smin eq complete
+            edit OBSFILE_OBSHOST 'SMIN'
+            edit OBSFILE_HPCF 'ssmisbt'
+          task get_iasi
+            late -s +00:02 -c +00:07
+            trigger /pp2/main/extractions/ex06/iasi eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'IASI'
+            edit OBSFILE_HPCF 'iasi'
+          task get_gras
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/gras eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'GRAS'
+            edit OBSFILE_HPCF 'gras'
+          task get_modw
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/modw eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'MODW'
+            edit OBSFILE_HPCF 'dbmodiswinds'
+          task get_avhn
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/avhn eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'AVHN'
+            edit OBSFILE_HPCF 'avhrrwinds'
+          task get_atap
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/atap eq complete
+            edit OBSFILE_OBSHOST 'ATAP'
+            edit OBSFILE_HPCF 'amsu_pacrars'
+          task get_g2to
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/g2to eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'G2TO'
+            edit OBSFILE_HPCF 'reo3_gome2'
+          task get_grst
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/grst eq complete
+            edit OBSFILE_OBSHOST 'GRST'
+            edit OBSFILE_HPCF 'ostia'
+          task get_emer
+            late -s +00:02 -c +00:04
+            trigger /pp1/main/extractions/ex06/emer eq complete
+            edit OBSFILE_OBSHOST 'EMER'
+            edit OBSFILE_HPCF 'envisat_meris'
+          task get_j2nb
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/j2nb eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2NB'
+            edit OBSFILE_HPCF 'j2nb'
+          task get_j2eo
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/j2eo eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'J2EO'
+            edit OBSFILE_HPCF 'j2eo'
+          task get_asc2
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/asc2 eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASC2'
+            edit OBSFILE_HPCF 'ascat_l2'
+          task get_asel
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/asel eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASEL'
+            edit OBSFILE_HPCF 'ascat_ears'
+          task get_ascs
+            late -s +00:02 -c +00:04
+            trigger /pp2/main/extractions/ex06/ascs eq complete
+            edit OBSHOST 'pp2'
+            edit OBS_BASE '/pp2'
+            edit OBSFILE_OBSHOST 'ASCS'
+            edit OBSFILE_HPCF 'ascat_sm'
+          task atovairs
+            trigger get_atov eq complete and get_airs eq complete and get_ateu eq complete and get_amsa eq complete and get_mhsa eq complete and get_hirs eq complete and get_atap eq complete
+          task snowlinks
+            trigger get_nonbin eq complete and get_ers1_wi eq complete and get_rtovs eq complete and get_snow eq complete
+          task ro_combine
+            trigger get_rado eq complete and get_gras eq complete
+          task reo3_combine
+            trigger get_sbuv eq complete and get_g2to eq complete
+          task bufr_combine
+            trigger get_nonbin eq complete and get_modw eq complete and get_avhn eq complete
+          task jason2_combine
+            trigger get_ers1_ra eq complete and get_j2nb eq complete and get_j2eo eq complete
+          task ascat_combine
+            trigger get_asc2 eq complete and get_asel eq complete and get_ascs eq complete
+        endfamily
+        task fetchmars
+          trigger ./get eq complete
+        family prepare_obs
+          trigger ./get eq complete
+          task preobs
+            trigger /e_36r1/main/12dc/an/update_psbias eq complete and /e_36r1/main/12dc/an/update_rstrhbias eq complete
+            edit mode 'not1crad'
+            edit REINITIALIZE 'true'
+            edit REINIPERIOD_4D '6'
+          task premwimg
+          task preobs_wave
+            edit mode 'wave'
+          task pre1crad_prepare
+            edit mode '1crad'
+          task pre1crad_airs
+            trigger pre1crad_prepare eq complete
+          family pre1crad_iasi
+            trigger pre1crad_prepare eq complete
+            edit CPUTIME '1500'
+            edit MAXTASK '16'
+            task pre1crad_iasi_split_1
+              edit TASKNO '1'
+            task pre1crad_iasi_split_2
+              edit TASKNO '2'
+            task pre1crad_iasi_1
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '1'
+            task pre1crad_iasi_2
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '2'
+            task pre1crad_iasi_3
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '3'
+            task pre1crad_iasi_4
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '4'
+            task pre1crad_iasi_5
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '5'
+            task pre1crad_iasi_6
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '6'
+            task pre1crad_iasi_7
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '7'
+            task pre1crad_iasi_8
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '8'
+            task pre1crad_iasi_9
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '9'
+            task pre1crad_iasi_10
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '10'
+            task pre1crad_iasi_11
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '11'
+            task pre1crad_iasi_12
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '12'
+            task pre1crad_iasi_13
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '13'
+            task pre1crad_iasi_14
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '14'
+            task pre1crad_iasi_15
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '15'
+            task pre1crad_iasi_16
+              trigger pre1crad_iasi_split_1 eq complete and pre1crad_iasi_split_2 eq complete
+              edit TASKNO '16'
+          endfamily
+          task pre1crad_hirs
+            trigger pre1crad_prepare eq complete
+          task pre1crad_msu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_ssu
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsua
+            trigger pre1crad_prepare eq complete
+          task pre1crad_amsub
+            trigger pre1crad_prepare eq complete
+          task pre1crad_mhs
+            trigger pre1crad_prepare eq complete
+          task pregeos
+          task prereo3
+          task prescat
+        endfamily
+        family reservation
+          late -c +00:03
+          trigger ./get/get_stor eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task adv_res
+            late -s +00:03 -c +00:02
+            edit RESERVE_FOR '30'
+            edit RESERVE_IN '11'
+            edit RESERVED_NODES '32'
+            edit RESERVATION_LABEL 'emos06A'
+            label info ""
+          task loadl_cycle_limit
+            late -s +00:03 -c +00:02
+            edit LOADL_CYCLE '65'
+            label info ""
+        endfamily
+      endfamily
+      family an
+        trigger ./obs/fetchmars eq complete and ./obs/prepare_obs eq complete
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+        edit PERIOD_4D '6'
+        edit WINDOW_LENGTH_4D '6'
+        edit WINDOW_OFFSET_4D '3'
+        edit ACCOUNT 'opebcan'
+        edit REINITIALIZE 'true'
+        edit ANNPES '144'
+        family makeodb
+          edit NPES '16'
+          task cleanodb
+          family bufr2odb
+            trigger cleanodb eq complete
+            edit THREADS '1'
+            edit NPOOLS '%ANNPES%'
+            edit THINFAC '1'
+            edit SENSOR '-1'
+            edit REBALANCE '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task b2o_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit USER_PRIORITY '90'
+            task b2o_surf_conv
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+            task b2o_airs
+              late -s +00:05 -c +00:15
+              edit THREADS '2'
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '57'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_iasi
+              late -s +00:05 -c +00:15
+              edit SENSOR '993'
+              edit SUBTYPES_INCLUDE '240'
+              edit THREADS '4'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_hirs
+              late -s +00:05 -c +00:15
+              edit SENSOR '0'
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPOOLS '$((2* %ANNPES%))'
+            task b2o_msu
+              late -s +00:05 -c +00:15
+              edit SENSOR '1'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_ssu
+              late -s +00:05 -c +00:15
+              edit SENSOR '2'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsua
+              late -s +00:05 -c +00:15
+              edit SENSOR '3'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_amsub
+              late -s +00:05 -c +00:15
+              edit SENSOR '4'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_mhs
+              late -s +00:05 -c +00:15
+              edit SENSOR '11'
+              edit SUBTYPES_INCLUDE '54 55'
+            task b2o_satob
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '82 83 87'
+            task b2o_reo3
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+            task b2o_ssmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '6'
+              edit SUBTYPES_INCLUDE '55 127'
+            task b2o_ssmis
+              late -s +00:05 -c +00:15
+              edit SENSOR '10'
+              edit SUBTYPES_INCLUDE '49'
+            task b2o_amsre
+              late -s +00:05 -c +00:15
+              edit SENSOR '17'
+              edit SUBTYPES_INCLUDE '59'
+            task b2o_tmi
+              late -s +00:05 -c +00:15
+              edit SENSOR '9'
+              edit SUBTYPES_INCLUDE '129'
+            task b2o_scatt
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task b2o_geos
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+            task b2o_gpsro
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '250'
+            task b2o_meris
+              late -s +00:05 -c +00:15
+              edit SENSOR '-1'
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergeodb
+            trigger bufr2odb eq complete
+          task mergeodb_surf
+            trigger ./bufr2odb/b2o_surf_conv eq complete
+            edit NPES '16'
+            edit THREADS '1'
+        endfamily
+        task restartodb
+          trigger makeodb eq complete
+        task preCleanFDB
+        task vardata
+          trigger ( ../../00/fc/model:step ge 9 or ../../00/fc/model eq complete)
+          event hires
+        task fetcherr
+        task lowres
+          trigger vardata:hires
+          edit THREADS '4'
+          edit ININPES '32'
+        family surf_anal
+          trigger makeodb eq complete and restartodb eq complete and preCleanFDB eq complete and vardata:hires
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          edit FSFAMILY 'surf_anal'
+          task t2ana
+            edit mode 't2m'
+          task rh2ana
+            trigger t2ana eq complete
+            edit mode 'rh2m'
+          task snow
+            trigger rh2ana eq complete
+            edit mode 'snow'
+          task sst
+            edit THREADS '4'
+          task slwet
+            trigger sst eq complete and snow eq complete
+        endfamily
+        family 4dvar
+          trigger makeodb eq complete and restartodb eq complete and vardata eq complete and fetcherr eq complete and lowres eq complete and preCleanFDB eq complete
+          edit THREADS '8'
+          edit VAR_DELAY '00'
+          edit EMOS_SLEEP '00'
+          family uptraj_0
+            edit uptraj '0'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '91'
+              edit SMSTRIES '1'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '92'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '93'
+          endfamily
+          family uptraj_1
+            trigger uptraj_0 eq complete
+            edit uptraj '1'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '93'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '94'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '95'
+          endfamily
+          family uptraj_2
+            trigger uptraj_1 eq complete
+            edit uptraj '2'
+            task ifstraj
+              late -s +00:02
+              edit mode 'traj'
+              edit USER_PRIORITY '95'
+            task ifsmin
+              late -s +00:02
+              trigger ifstraj eq complete
+              edit mode 'min'
+              edit USER_PRIORITY '96'
+            task ifstsave
+              trigger ifstraj eq complete
+              edit THREADS '1'
+              edit USER_PRIORITY '97'
+          endfamily
+          task ifstraj
+            late -s +00:02
+            trigger uptraj_2 eq complete
+            edit uptraj '3'
+            edit mode 'traj'
+            edit USER_PRIORITY '97'
+            event finaltraj
+            event finalwave
+        endfamily
+        task forceinv
+          trigger ./4dvar/ifstraj:finaltraj and ./surf_anal eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./4dvar/uptraj_0/ifstraj eq active or ./4dvar/uptraj_0/ifstraj eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '2432'
+            edit RESERVE_FOR '35'
+            label info ""
+          task rm_res
+            late -s +00:03 -c +00:02
+            edit RESERVATION_LABEL 'emos06A'
+            label info ""
+        endfamily
+      endfamily
+      family fc
+        trigger an/forceinv eq complete and ( an/4dvar/ifstraj:finalwave or an/4dvar eq complete)
+        edit ACCOUNT 'opebcfc'
+        edit REINITIALIZE 'true'
+        edit FSFAMILY 'fc'
+        task getfcdata
+        task getpersSST
+          trigger getfcdata eq complete
+          edit SSTLEN '90'
+          edit SSTINT '1'
+          edit THREADS '2'
+          edit NPES '16'
+          edit MEM '1000'
+          edit CPUTIME '960'
+        task model
+          late -s +00:02
+          trigger ( getfcdata eq complete) and ( getpersSST eq complete)
+          edit PERSST 'true'
+          edit FCLENGTH '90'
+          edit THREADS '8'
+          edit USER_PRIORITY '94'
+          edit FCNPES '144'
+          meter step -1 90 90
+        task clean
+          trigger ../an eq complete and getfcdata eq complete and model eq complete and ../../18bc/fc eq complete
+        family reservation1
+          late -c +00:03
+          trigger ./getfcdata eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reserve_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '3072'
+            edit RESERVE_FOR '20'
+            label info ""
+        endfamily
+        family reservation2
+          late -c +00:03
+          trigger ./model eq complete
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+          inlimit /e_36r1/limits:reservation
+          task reset_cpu
+            late -s +00:03 -c +00:02
+            edit RESERVED_CPUS '0'
+            label info ""
+        endfamily
+      endfamily
+      family getreq
+        trigger ( /e_36r1/main/06bc/an/4dvar eq active or /e_36r1/main/06bc/an/4dvar eq complete) and ( ./prod eq queued or ./prod eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit PROD_TASK '1'
+        edit EMOS_DOMAIN 'G'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_PROJECT '12'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'SCDA'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '06'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger collectreq eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete and ( req:001 or req eq complete)
+          label info ""
+          event 1 
+      endfamily
+      family prod
+        trigger ( getreq/req:001 or getreq/req eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit EMOS_PROJECT '12'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        family an
+          trigger /e_36r1/main/06bc/an/surf_anal eq complete and ( /e_36r1/main/06bc/an/4dvar/ifstraj:finalwave or /e_36r1/main/06bc/an/4dvar/ifstraj eq complete) and 0 eq 0
+          edit EMOS_TYPE 'an'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ../090/prodgen eq complete and ( /e_36r1/main/06bc/fc/model:step ge 12 or /e_36r1/main/06bc/fc/model eq complete)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 000
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 000 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0000'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 12 or /e_36r1/main/06bc/fc/model eq complete) and ( ../an/backupprod eq complete or ../an/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            edit MEMBER 'off'
+            edit STEPS '000'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 003
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 003 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 15 or /e_36r1/main/06bc/fc/model eq complete) and ( ../000/backupprod eq complete or ../000/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../000/derived_param:SMOS or ../000/derived_param eq complete) or ( ../000/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '003'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 006
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 006 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 18 or /e_36r1/main/06bc/fc/model eq complete) and ( ../003/backupprod eq complete or ../003/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../003/derived_param:SMOS or ../003/derived_param eq complete) or ( ../003/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '006'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 009
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 009 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 21 or /e_36r1/main/06bc/fc/model eq complete) and ( ../006/backupprod eq complete or ../006/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../006/derived_param:SMOS or ../006/derived_param eq complete) or ( ../006/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '009'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 012
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 012 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 24 or /e_36r1/main/06bc/fc/model eq complete) and ( ../009/backupprod eq complete or ../009/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../009/derived_param:SMOS or ../009/derived_param eq complete) or ( ../009/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '012'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 015
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 015 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 27 or /e_36r1/main/06bc/fc/model eq complete) and ( ../012/backupprod eq complete or ../012/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../012/derived_param:SMOS or ../012/derived_param eq complete) or ( ../012/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '015'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 018
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 018 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 30 or /e_36r1/main/06bc/fc/model eq complete) and ( ../015/backupprod eq complete or ../015/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../015/derived_param:SMOS or ../015/derived_param eq complete) or ( ../015/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '018'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 021
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 021 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 33 or /e_36r1/main/06bc/fc/model eq complete) and ( ../018/backupprod eq complete or ../018/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../018/derived_param:SMOS or ../018/derived_param eq complete) or ( ../018/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '021'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 024
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 024 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 36 or /e_36r1/main/06bc/fc/model eq complete) and ( ../021/backupprod eq complete or ../021/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../021/derived_param:SMOS or ../021/derived_param eq complete) or ( ../021/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '024'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 027
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 027 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 39 or /e_36r1/main/06bc/fc/model eq complete) and ( ../024/backupprod eq complete or ../024/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../024/derived_param:SMOS or ../024/derived_param eq complete) or ( ../024/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '027'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 030
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 030 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 42 or /e_36r1/main/06bc/fc/model eq complete) and ( ../027/backupprod eq complete or ../027/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../027/derived_param:SMOS or ../027/derived_param eq complete) or ( ../027/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '030'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 033
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 033 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 45 or /e_36r1/main/06bc/fc/model eq complete) and ( ../030/backupprod eq complete or ../030/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../030/derived_param:SMOS or ../030/derived_param eq complete) or ( ../030/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '033'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 036
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 036 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0036'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 48 or /e_36r1/main/06bc/fc/model eq complete) and ( ../033/backupprod eq complete or ../033/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../033/derived_param:SMOS or ../033/derived_param eq complete) or ( ../033/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '036'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 039
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 039 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0039'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 51 or /e_36r1/main/06bc/fc/model eq complete) and ( ../036/backupprod eq complete or ../036/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../036/derived_param:SMOS or ../036/derived_param eq complete) or ( ../036/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '039'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 042
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 042 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0042'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 54 or /e_36r1/main/06bc/fc/model eq complete) and ( ../039/backupprod eq complete or ../039/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../039/derived_param:SMOS or ../039/derived_param eq complete) or ( ../039/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '042'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 045
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 045 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0045'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 57 or /e_36r1/main/06bc/fc/model eq complete) and ( ../042/backupprod eq complete or ../042/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../042/derived_param:SMOS or ../042/derived_param eq complete) or ( ../042/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '045'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 048
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 048 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0048'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 60 or /e_36r1/main/06bc/fc/model eq complete) and ( ../045/backupprod eq complete or ../045/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../045/derived_param:SMOS or ../045/derived_param eq complete) or ( ../045/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '048'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 051
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 051 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0051'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 63 or /e_36r1/main/06bc/fc/model eq complete) and ( ../048/backupprod eq complete or ../048/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../048/derived_param:SMOS or ../048/derived_param eq complete) or ( ../048/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '051'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 054
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 054 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0054'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 66 or /e_36r1/main/06bc/fc/model eq complete) and ( ../051/backupprod eq complete or ../051/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../051/derived_param:SMOS or ../051/derived_param eq complete) or ( ../051/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '054'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 057
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 057 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0057'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 69 or /e_36r1/main/06bc/fc/model eq complete) and ( ../054/backupprod eq complete or ../054/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../054/derived_param:SMOS or ../054/derived_param eq complete) or ( ../054/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '057'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 060
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 060 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0060'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 72 or /e_36r1/main/06bc/fc/model eq complete) and ( ../057/backupprod eq complete or ../057/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../057/derived_param:SMOS or ../057/derived_param eq complete) or ( ../057/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '060'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 063
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 063 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0063'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 75 or /e_36r1/main/06bc/fc/model eq complete) and ( ../060/backupprod eq complete or ../060/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../060/derived_param:SMOS or ../060/derived_param eq complete) or ( ../060/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '063'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 066
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 066 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0066'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 78 or /e_36r1/main/06bc/fc/model eq complete) and ( ../063/backupprod eq complete or ../063/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../063/derived_param:SMOS or ../063/derived_param eq complete) or ( ../063/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '066'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 069
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 069 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0069'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 81 or /e_36r1/main/06bc/fc/model eq complete) and ( ../066/backupprod eq complete or ../066/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../066/derived_param:SMOS or ../066/derived_param eq complete) or ( ../066/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '069'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 072
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 072 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0072'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 84 or /e_36r1/main/06bc/fc/model eq complete) and ( ../069/backupprod eq complete or ../069/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../069/derived_param:SMOS or ../069/derived_param eq complete) or ( ../069/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '072'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 075
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 075 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0075'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 87 or /e_36r1/main/06bc/fc/model eq complete) and ( ../072/backupprod eq complete or ../072/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../072/derived_param:SMOS or ../072/derived_param eq complete) or ( ../072/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '075'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 078
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 078 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0078'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task backupprod
+            late -s +00:05 -c +00:20
+            trigger ( /e_36r1/main/06bc/fc/model:step ge 90 or /e_36r1/main/06bc/fc/model eq complete) and ( ../075/backupprod eq complete or ../075/backupprod eq active)
+            edit PGNPES '16'
+            inlimit /e_36r1/limits:backupprod
+          task derived_param
+            trigger ( ../075/derived_param:SMOS or ../075/derived_param eq complete) or ( ../075/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '078'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 081
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 081 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0081'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../078/derived_param:SMOS or ../078/derived_param eq complete) or ( ../078/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '081'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 084
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 084 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0084'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../081/derived_param:SMOS or ../081/derived_param eq complete) or ( ../081/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '084'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 087
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 087 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0087'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../084/derived_param:SMOS or ../084/derived_param eq complete) or ( ../084/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '087'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+        family 090
+          trigger ( /e_36r1/main/06bc/fc/model:step ge 090 or /e_36r1/main/06bc/fc/model eq complete) and 0 eq 0
+          edit EMOS_TIME_STEP_H '0090'
+          task prodgen
+            late -s +00:05 -c +00:15
+            trigger ./derived_param:SMOS or ./derived_param eq complete
+            edit USER_PRIORITY '92'
+            inlimit /e_36r1/limits:prod
+            inlimit /e_36r1/limits:prod_bc2
+          task derived_param
+            trigger ( ../087/derived_param:SMOS or ../087/derived_param eq complete) or ( ../087/derived_param eq aborted)
+            edit MEMBER 'off'
+            edit STEPS '090'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/mc/fc'
+            event SMOS
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/prod'
+        task operation_is_late
+          event yes
+        family oper
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'fc'
+          edit FSFAMILY 'ppdi'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '92'
+          edit SMSURL 'GSCDA/06'
+          edit EMOS_PROJECT '12'
+          family an
+            task pdb
+              trigger ../../../prod/an/prodgen eq complete
+              edit EMOS_TYPE 'an'
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit EMOS_TYPE 'an'
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../090/q2diss eq complete and ../../../prod/an/backupprod eq complete
+              edit EMOS_TYPE 'an'
+              label info ""
+              event 1 
+          endfamily
+          family 000
+            edit EMOS_TIME_STEP_H '0000'
+            task pdb
+              trigger ../../../prod/000/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ../an/q2diss eq complete
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 003
+            edit EMOS_TIME_STEP_H '0003'
+            task pdb
+              trigger ../../../prod/003/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../000/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/003/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 006
+            edit EMOS_TIME_STEP_H '0006'
+            task pdb
+              trigger ../../../prod/006/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../003/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/006/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 009
+            edit EMOS_TIME_STEP_H '0009'
+            task pdb
+              trigger ../../../prod/009/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../006/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/009/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 012
+            edit EMOS_TIME_STEP_H '0012'
+            task pdb
+              trigger ../../../prod/012/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../009/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/012/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 015
+            edit EMOS_TIME_STEP_H '0015'
+            task pdb
+              trigger ../../../prod/015/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../012/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/015/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 018
+            edit EMOS_TIME_STEP_H '0018'
+            task pdb
+              trigger ../../../prod/018/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../015/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/018/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 021
+            edit EMOS_TIME_STEP_H '0021'
+            task pdb
+              trigger ../../../prod/021/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../018/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/021/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 024
+            edit EMOS_TIME_STEP_H '0024'
+            task pdb
+              trigger ../../../prod/024/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../021/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/024/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 027
+            edit EMOS_TIME_STEP_H '0027'
+            task pdb
+              trigger ../../../prod/027/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../024/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/027/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 030
+            edit EMOS_TIME_STEP_H '0030'
+            task pdb
+              trigger ../../../prod/030/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../027/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/030/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 033
+            edit EMOS_TIME_STEP_H '0033'
+            task pdb
+              trigger ../../../prod/033/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../030/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/033/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 036
+            edit EMOS_TIME_STEP_H '0036'
+            task pdb
+              trigger ../../../prod/036/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../033/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/036/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 039
+            edit EMOS_TIME_STEP_H '0039'
+            task pdb
+              trigger ../../../prod/039/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../036/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/039/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 042
+            edit EMOS_TIME_STEP_H '0042'
+            task pdb
+              trigger ../../../prod/042/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../039/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/042/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 045
+            edit EMOS_TIME_STEP_H '0045'
+            task pdb
+              trigger ../../../prod/045/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../042/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/045/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 048
+            edit EMOS_TIME_STEP_H '0048'
+            task pdb
+              trigger ../../../prod/048/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../045/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/048/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 051
+            edit EMOS_TIME_STEP_H '0051'
+            task pdb
+              trigger ../../../prod/051/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../048/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/051/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 054
+            edit EMOS_TIME_STEP_H '0054'
+            task pdb
+              trigger ../../../prod/054/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../051/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/054/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 057
+            edit EMOS_TIME_STEP_H '0057'
+            task pdb
+              trigger ../../../prod/057/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../054/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/057/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 060
+            edit EMOS_TIME_STEP_H '0060'
+            task pdb
+              trigger ../../../prod/060/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../057/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/060/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 063
+            edit EMOS_TIME_STEP_H '0063'
+            task pdb
+              trigger ../../../prod/063/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../060/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/063/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 066
+            edit EMOS_TIME_STEP_H '0066'
+            task pdb
+              trigger ../../../prod/066/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../063/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/066/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 069
+            edit EMOS_TIME_STEP_H '0069'
+            task pdb
+              trigger ../../../prod/069/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../066/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/069/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 072
+            edit EMOS_TIME_STEP_H '0072'
+            task pdb
+              trigger ../../../prod/072/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../069/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/072/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 075
+            edit EMOS_TIME_STEP_H '0075'
+            task pdb
+              trigger ../../../prod/075/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../072/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/075/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 078
+            edit EMOS_TIME_STEP_H '0078'
+            task pdb
+              trigger ../../../prod/078/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../075/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+            task dissbackup
+              late -s +00:05 -c +00:15
+              trigger ../../../prod/078/backupprod eq complete
+              inlimit /e_36r1/limits:dissbackup
+              label info ""
+              event 1 
+          endfamily
+          family 081
+            edit EMOS_TIME_STEP_H '0081'
+            task pdb
+              trigger ../../../prod/081/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../078/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 084
+            edit EMOS_TIME_STEP_H '0084'
+            task pdb
+              trigger ../../../prod/084/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../081/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 087
+            edit EMOS_TIME_STEP_H '0087'
+            task pdb
+              trigger ../../../prod/087/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../084/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          family 090
+            edit EMOS_TIME_STEP_H '0090'
+            task pdb
+              trigger ../../../prod/090/prodgen eq complete
+              inlimit /e_36r1/limits:pdb_bc
+              inlimit /limits:pdb_bc
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete and ( not ../../../prod2diss/operation_is_late:yes or ../087/q2diss eq complete)
+              edit USER_PRIORITY '93'
+              inlimit /e_36r1/limits:q2diss_bc
+              inlimit /limits:q2diss_bc
+              label info ""
+              event 1 
+          endfamily
+          task check
+            trigger ./078 eq complete
+        endfamily
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'main'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger make eq complete and ./00dc eq complete and ./06 eq complete and ./12 eq complete and ./12dc eq complete and ./18 eq complete and ./00 eq complete and ./12bc eq complete and ./18bc eq complete and ./00bc eq complete and ./06bc eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'main'
+      edit MOVE_TO_ECFS 'no'
+      time 12:00
+  endfamily
+  family lag
+    repeat date YMD 20091118 20121212 1
+    edit MARS_DB 'marsod'
+    family 00dc
+      edit EMOS_BASE '00'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      family ddh
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00dc/fc eq complete)
+        edit EMOS_BASE '06'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fc'
+        task ddh
+      endfamily
+      family sync
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00dc/an eq complete)
+        edit EMOS_TYPE 'an'
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/sync'
+        task dcda_to_da_bk
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit OPHOST 'c1b'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_satmon
+          trigger ../satmon eq complete
+        task sync_bias
+        task sync_fc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00dc/fc/model:step gt 6 or /e_36r1/main/00dc/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit EMOS_BASE '06'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_an
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit EMOS_BASE '06'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00dc/fc/model:step gt 3 or /e_36r1/main/00dc/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit EMOS_BASE '06'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_clean
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+      endfamily
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/00dc/an eq complete and ( ../../main/00dc/fc/model:step ge 15 or ../../main/00dc/fc/model eq complete))
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task sp2fdb
+          edit STEPS '3/6/9/12/18'
+          label files ""
+          label info ""
+          event fdb
+        task ansfc
+          trigger sp2fdb eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '15'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ./ansfc eq complete
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00dc/an/4dvar/ifstraj:finaltraj or /e_36r1/main/00dc/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc015
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00dc/fc/model:step ge 21 or /e_36r1/main/00dc/fc/model eq complete)
+          edit STEPS '3/6/9/12/15'
+          edit EMOS_BASE '06'
+          edit EMOS_TYPE 'fc'
+          task sp2fdb
+            label files ""
+            label info ""
+            event fdb
+          task fcsfc
+            trigger sp2fdb eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00dc/fc/model eq complete)
+          edit STEPS_SPECTRAL '6/12'
+          edit EMOS_BASE '06'
+          edit STEPS '0/3/6/9/12/15'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00dc/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'oedcdaan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/00dc/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      family traj
+        task feed
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/00dc/fc eq complete)
+        task cp_to_other
+          trigger feed eq complete
+      endfamily
+      family satmon
+        edit FSFAMILY 'an'
+        inlimit /e_36r1/limits:smon
+        task getsmon
+          trigger ../fb/fdbksave eq complete and ../archive/obs/af eq complete
+        task smon_meris
+          trigger getsmon eq complete
+          edit smon_smsmode 'MERIS'
+        task smon_amsre
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMSRE'
+        task smon_ssmis
+          trigger getsmon eq complete
+          edit smon_smsmode 'SSMIS'
+        task smon_tmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'TMI'
+        task smon_gpsro
+          trigger getsmon eq complete
+          edit smon_smsmode 'GPSRO'
+        task smon_pacrars
+          trigger getsmon eq complete
+          edit smon_smsmode 'PACRARS'
+        task smon_ears
+          trigger getsmon eq complete
+          edit smon_smsmode 'EARS'
+        task smon_o3msg
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3MSG'
+        task smon_o3knmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3KNMI'
+        task smon_pwc
+          trigger getsmon eq complete
+          edit smon_smsmode 'PWC'
+        task smon_temp
+          trigger getsmon eq complete
+          edit smon_smsmode 'TEMP'
+        task smon_iasi
+          trigger getsmon eq complete
+          edit smon_smsmode 'IASI'
+        task smon_airs
+          trigger getsmon eq complete
+          edit smon_smsmode 'AIRS'
+        task smon_dbamv
+          trigger getsmon eq complete
+          edit smon_smsmode 'DBAMV'
+        task smon_amv
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMV'
+        task smon_o3
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3'
+        task smon_dmsp
+          trigger getsmon eq complete
+          edit smon_smsmode 'DMSP'
+        task smon_noaa
+          trigger getsmon eq complete
+          edit smon_smsmode 'NOAA'
+        task smon_geos
+          trigger getsmon eq complete
+          edit smon_smsmode 'GEOS'
+        task smon_scatt
+          trigger getsmon eq complete
+          edit smon_smsmode 'SCATT'
+        task smon_slmoist
+          trigger getsmon eq complete
+          edit smon_smsmode 'SLMOIST'
+        task smon_clean
+          trigger getsmon eq complete and smon_meris eq complete and smon_amsre eq complete and smon_ssmis eq complete and smon_tmi eq complete and smon_gpsro eq complete and smon_pacrars eq complete and smon_ears eq complete and smon_o3msg eq complete and smon_o3knmi eq complete and smon_pwc eq complete and smon_temp eq complete and smon_iasi eq complete and smon_airs eq complete and smon_dbamv eq complete and smon_amv eq complete and smon_o3 eq complete and smon_dmsp eq complete and sm [...]
+      endfamily
+      task clean
+        trigger fb eq complete and satmon eq complete
+        edit FSFAMILY 'an'
+      task cleanplus6
+        trigger clean eq complete
+        edit EMOS_BASE '06'
+        edit FSFAMILY 'an'
+      family verif
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/verif'
+        edit DELTA_DAY '1'
+        inlimit /limits:linux_cluster
+        family fc
+          task v12li1
+          task v12li2
+          task v12up1
+            trigger v12li1 eq complete
+          task v12up2
+            trigger v12up1 eq complete and v12li2 eq complete
+          task v12pl
+            trigger v12up2 eq complete
+          task v12memv
+            trigger v12up2 eq complete
+            edit DATEMASK '02.*.*'
+          task v12memb
+            trigger v12up2 eq complete
+            edit DATEMASK '11.*.*'
+          task v12upmv
+            trigger v12memv eq complete
+            edit DATEMASK '02.*.*'
+          task v12upmb
+            trigger v12memb eq complete
+            edit DATEMASK '11.*.*'
+          task v12crmv
+            edit DATEMASK '28.*.*'
+          task v12crmb
+            edit DATEMASK '28.*.*'
+          task v12crd
+            edit DATEMASK '28.*.*'
+        endfamily
+        family oc
+          trigger ./fc eq complete or ./fc eq aborted
+          task mk_dummy_fields
+            edit QUEUE 'emos'
+            edit USER 'emos'
+            edit PP_BASE '/pp1'
+            edit WSHOST 'pp1'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit LOGDIR '/pp1/log'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit SMSOUT '/vol/emos_nc/output'
+          task insert_fields
+            trigger mk_dummy_fields eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit PP_BASE '/pp1'
+            inlimit /limits:linux_cluster
+          task vbrli1
+            trigger insert_fields eq complete
+          task vbrli2
+            trigger vbrli1 eq complete
+          task vwali1
+            trigger insert_fields eq complete
+          task vwali2
+            trigger vwali1 eq complete
+          task vwali3
+            trigger vwali2 eq complete
+          task vofli
+            trigger insert_fields eq complete
+          task vtlli
+            trigger insert_fields eq complete
+          task vtoli
+            trigger insert_fields eq complete
+          task vmoli
+            trigger insert_fields eq complete
+          task vbrup1
+            trigger vbrli1 eq complete
+          task vbrup2
+            trigger vbrup1 eq complete and vbrli2 eq complete
+          task vwaup1
+            trigger vwali1 eq complete
+          task vwaup2
+            trigger vwaup1 eq complete and vwali2 eq complete
+          task vwaup3
+            trigger vwaup2 eq complete and vwali3 eq complete
+          task vofup
+            trigger vofli eq complete
+          task vtlup
+            trigger vtlli eq complete
+          task vtoup
+            trigger vtoli eq complete
+          task vmoup
+            trigger vmoli eq complete
+          task vmeli
+            trigger insert_fields eq complete
+          task vmeup
+            trigger vmeli eq complete
+          task voccrd
+            edit DATEMASK '28.*.*'
+          task voccrm
+            edit DATEMASK '28.*.*'
+          task vocmem
+            edit DATEMASK '11.*.*'
+          task vocupm
+            trigger vocmem eq complete
+            edit DATEMASK '11.*.*'
+          task cleanup
+            trigger vmeup eq complete and vbrup2 eq complete and vwaup3 eq complete and vofup eq complete and vtlup eq complete and vtoup eq complete and vmoup eq complete and voccrd eq complete and voccrm eq complete and vocupm eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+        endfamily
+        family cf
+          trigger oc eq complete or oc eq aborted
+          task vcnli1
+            late -c +02:00
+          task vcnli2
+          task vcnup1
+            trigger vcnli1 eq complete
+          task vcnup2
+            trigger vcnup1 eq complete and vcnli2 eq complete
+          task vcnpl
+            trigger vcnup2 eq complete
+          task vcncrd
+          task vcncrm
+            edit DATEMASK '28.*.*'
+          task vcnmem
+            trigger vcnup2 eq complete
+            edit DATEMASK '11.*.*'
+          task vcnupm
+            trigger vcnmem eq complete
+            edit DATEMASK '11.*.*'
+          task vcnli3
+          task vcnli4
+          task vcnup3
+            trigger vcnup2 eq complete and vcnli3 eq complete
+          task vcnup4
+            trigger vcnup3 eq complete and vcnli4 eq complete
+          task vcnmem2
+            trigger vcnup4 eq complete
+            edit DATEMASK '22.*.*'
+          task vcnupm2
+            trigger vcnmem2 eq complete
+            edit DATEMASK '22.*.*'
+        endfamily
+        family ob
+          trigger oc eq complete or oc eq aborted
+          time 05:00
+          family stage1
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          family stage2
+            trigger ./stage1 eq complete
+            edit EMOS_BASE '00'
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          task vobcrd
+            edit DATEMASK '28.*.*'
+          task vobcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family em
+          task vemli
+            late -c +02:00
+          task vemup
+            trigger vemli eq complete
+          task vemcrd
+            edit DATEMASK '28.*.*'
+          task vemcrm
+            edit DATEMASK '28.*.*'
+          task vemmem
+            trigger vemup eq complete
+            edit DATEMASK '11.*.*'
+          task vemupm
+            trigger vemmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family es
+          trigger em eq complete
+          task vesli
+            late -c +02:00
+          task vesup
+            trigger vesli eq complete
+          task vescrd
+            edit DATEMASK '28.*.*'
+          task vescrm
+            edit DATEMASK '28.*.*'
+          task vesmem
+            trigger vesup eq complete
+            edit DATEMASK '11.*.*'
+          task vesupm
+            trigger vesmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family cv
+          trigger es eq complete
+          task vcvli
+            late -c +02:00
+          task vcvup
+            trigger vcvli eq complete
+          task vcvcrd
+            edit DATEMASK '28.*.*'
+          task vcvcrm
+            edit DATEMASK '28.*.*'
+          task vcvmem
+            trigger vcvup eq complete
+            edit DATEMASK '11.*.*'
+          task vcvupm
+            trigger vcvmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/00dc/fc/model eq complete)
+          task glver
+          task glupr
+            trigger glver eq complete
+          task glcrr
+            edit DATEMASK '28.*.*'
+          task ff10ver
+            trigger glver eq complete
+          task ff10upr
+            trigger ff10ver eq complete and glupr eq complete
+          task glmem
+            trigger ff10upr eq complete
+            edit DATEMASK '11.*.*'
+          task glupm
+            trigger glmem eq complete
+            edit DATEMASK '11.*.*'
+          task glcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family sf
+          trigger fc eq complete or fc eq aborted
+          task vseli1
+          task vseli2
+          task vseup1
+            trigger vseli1 eq complete
+          task vseup2
+            trigger vseup1 eq complete and vseli2 eq complete
+          task vsecrd
+            edit DATEMASK '28.*.*'
+          task vsecrm
+            edit DATEMASK '28.*.*'
+          task vsemem
+            trigger vseup2 eq complete
+            edit DATEMASK '12.*.*'
+          task vseupm
+            trigger vsemem eq complete
+            edit DATEMASK '12.*.*'
+        endfamily
+      endfamily
+    endfamily
+    family 06
+      edit EMOS_BASE '06'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DA'
+      edit LAR_4V_EF 'false'
+      edit LFC_DIR_FREQ 'false'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/12/prod/06an eq complete)
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task ansfc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod/06an/derived_param eq complete))
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '6'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod/06an/derived_param eq complete))
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task highres
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/06/an/4dvar/ifstraj:finaltraj or /e_36r1/main/06/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc015
+          edit STEPS '3/6/9/12/15'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06/fc/model eq complete)
+          edit STEPS '0/3/6/9/12/15'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'oeoperan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/06/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      family traj
+        task feed
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/06/fc eq complete)
+        task cp_to_other
+          trigger feed eq complete
+      endfamily
+      family satmon
+        trigger ../00dc/satmon eq complete
+        edit FSFAMILY 'an'
+        inlimit /e_36r1/limits:smon
+        task getsmon
+          trigger ../fb/fdbksave eq complete and ../archive/obs/af eq complete
+        task smon_meris
+          trigger getsmon eq complete
+          edit smon_smsmode 'MERIS'
+        task smon_amsre
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMSRE'
+        task smon_ssmis
+          trigger getsmon eq complete
+          edit smon_smsmode 'SSMIS'
+        task smon_tmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'TMI'
+        task smon_gpsro
+          trigger getsmon eq complete
+          edit smon_smsmode 'GPSRO'
+        task smon_pacrars
+          trigger getsmon eq complete
+          edit smon_smsmode 'PACRARS'
+        task smon_ears
+          trigger getsmon eq complete
+          edit smon_smsmode 'EARS'
+        task smon_o3msg
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3MSG'
+        task smon_o3knmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3KNMI'
+        task smon_pwc
+          trigger getsmon eq complete
+          edit smon_smsmode 'PWC'
+        task smon_temp
+          trigger getsmon eq complete
+          edit smon_smsmode 'TEMP'
+        task smon_iasi
+          trigger getsmon eq complete
+          edit smon_smsmode 'IASI'
+        task smon_airs
+          trigger getsmon eq complete
+          edit smon_smsmode 'AIRS'
+        task smon_dbamv
+          trigger getsmon eq complete
+          edit smon_smsmode 'DBAMV'
+        task smon_amv
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMV'
+        task smon_o3
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3'
+        task smon_dmsp
+          trigger getsmon eq complete
+          edit smon_smsmode 'DMSP'
+        task smon_noaa
+          trigger getsmon eq complete
+          edit smon_smsmode 'NOAA'
+        task smon_geos
+          trigger getsmon eq complete
+          edit smon_smsmode 'GEOS'
+        task smon_scatt
+          trigger getsmon eq complete
+          edit smon_smsmode 'SCATT'
+        task smon_slmoist
+          trigger getsmon eq complete
+          edit smon_smsmode 'SLMOIST'
+        task smon_clean
+          trigger getsmon eq complete and smon_meris eq complete and smon_amsre eq complete and smon_ssmis eq complete and smon_tmi eq complete and smon_gpsro eq complete and smon_pacrars eq complete and smon_ears eq complete and smon_o3msg eq complete and smon_o3knmi eq complete and smon_pwc eq complete and smon_temp eq complete and smon_iasi eq complete and smon_airs eq complete and smon_dbamv eq complete and smon_amv eq complete and smon_o3 eq complete and smon_dmsp eq complete and sm [...]
+      endfamily
+      task clean
+        trigger fb eq complete and ../00dc/clean eq complete
+        edit FSFAMILY 'an'
+      family verif
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/verif'
+        edit DELTA_DAY '1'
+        inlimit /limits:linux_cluster
+        family fc
+          task v12li1
+          task v12li2
+          task v12up1
+            trigger v12li1 eq complete
+          task v12up2
+            trigger v12up1 eq complete and v12li2 eq complete
+          task v12pl
+            trigger v12up2 eq complete
+          task v12memv
+            trigger v12up2 eq complete
+            edit DATEMASK '02.*.*'
+          task v12memb
+            trigger v12up2 eq complete
+            edit DATEMASK '11.*.*'
+          task v12upmv
+            trigger v12memv eq complete
+            edit DATEMASK '02.*.*'
+          task v12upmb
+            trigger v12memb eq complete
+            edit DATEMASK '11.*.*'
+          task v12crmv
+            edit DATEMASK '28.*.*'
+          task v12crmb
+            edit DATEMASK '28.*.*'
+          task v12crd
+            edit DATEMASK '28.*.*'
+        endfamily
+        family oc
+          trigger ./fc eq complete or ./fc eq aborted
+          task mk_dummy_fields
+            edit QUEUE 'emos'
+            edit USER 'emos'
+            edit PP_BASE '/pp1'
+            edit WSHOST 'pp1'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit LOGDIR '/pp1/log'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit SMSOUT '/vol/emos_nc/output'
+          task insert_fields
+            trigger mk_dummy_fields eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit PP_BASE '/pp1'
+            inlimit /limits:linux_cluster
+          task vbrli1
+            trigger insert_fields eq complete
+          task vbrli2
+            trigger vbrli1 eq complete
+          task vwali1
+            trigger insert_fields eq complete
+          task vwali2
+            trigger vwali1 eq complete
+          task vwali3
+            trigger vwali2 eq complete
+          task vofli
+            trigger insert_fields eq complete
+          task vtlli
+            trigger insert_fields eq complete
+          task vtoli
+            trigger insert_fields eq complete
+          task vmoli
+            trigger insert_fields eq complete
+          task vbrup1
+            trigger vbrli1 eq complete
+          task vbrup2
+            trigger vbrup1 eq complete and vbrli2 eq complete
+          task vwaup1
+            trigger vwali1 eq complete
+          task vwaup2
+            trigger vwaup1 eq complete and vwali2 eq complete
+          task vwaup3
+            trigger vwaup2 eq complete and vwali3 eq complete
+          task vofup
+            trigger vofli eq complete
+          task vtlup
+            trigger vtlli eq complete
+          task vtoup
+            trigger vtoli eq complete
+          task vmoup
+            trigger vmoli eq complete
+          task vmeli
+            trigger insert_fields eq complete
+          task vmeup
+            trigger vmeli eq complete
+          task voccrd
+            edit DATEMASK '28.*.*'
+          task voccrm
+            edit DATEMASK '28.*.*'
+          task vocmem
+            edit DATEMASK '11.*.*'
+          task vocupm
+            trigger vocmem eq complete
+            edit DATEMASK '11.*.*'
+          task cleanup
+            trigger vmeup eq complete and vbrup2 eq complete and vwaup3 eq complete and vofup eq complete and vtlup eq complete and vtoup eq complete and vmoup eq complete and voccrd eq complete and voccrm eq complete and vocupm eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+        endfamily
+        family cf
+          trigger oc eq complete or oc eq aborted
+          task vcnli1
+            late -c +02:00
+          task vcnli2
+          task vcnup1
+            trigger vcnli1 eq complete
+          task vcnup2
+            trigger vcnup1 eq complete and vcnli2 eq complete
+          task vcnpl
+            trigger vcnup2 eq complete
+          task vcncrd
+          task vcncrm
+            edit DATEMASK '28.*.*'
+          task vcnmem
+            trigger vcnup2 eq complete
+            edit DATEMASK '11.*.*'
+          task vcnupm
+            trigger vcnmem eq complete
+            edit DATEMASK '11.*.*'
+          task vcnli3
+          task vcnli4
+          task vcnup3
+            trigger vcnup2 eq complete and vcnli3 eq complete
+          task vcnup4
+            trigger vcnup3 eq complete and vcnli4 eq complete
+          task vcnmem2
+            trigger vcnup4 eq complete
+            edit DATEMASK '22.*.*'
+          task vcnupm2
+            trigger vcnmem2 eq complete
+            edit DATEMASK '22.*.*'
+        endfamily
+        family ob
+          trigger oc eq complete or oc eq aborted
+          time 05:00
+          family stage1
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          family stage2
+            trigger ./stage1 eq complete
+            edit EMOS_BASE '00'
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          task vobcrd
+            edit DATEMASK '28.*.*'
+          task vobcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family em
+          task vemli
+            late -c +02:00
+          task vemup
+            trigger vemli eq complete
+          task vemcrd
+            edit DATEMASK '28.*.*'
+          task vemcrm
+            edit DATEMASK '28.*.*'
+          task vemmem
+            trigger vemup eq complete
+            edit DATEMASK '11.*.*'
+          task vemupm
+            trigger vemmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family es
+          trigger em eq complete
+          task vesli
+            late -c +02:00
+          task vesup
+            trigger vesli eq complete
+          task vescrd
+            edit DATEMASK '28.*.*'
+          task vescrm
+            edit DATEMASK '28.*.*'
+          task vesmem
+            trigger vesup eq complete
+            edit DATEMASK '11.*.*'
+          task vesupm
+            trigger vesmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family cv
+          trigger es eq complete
+          task vcvli
+            late -c +02:00
+          task vcvup
+            trigger vcvli eq complete
+          task vcvcrd
+            edit DATEMASK '28.*.*'
+          task vcvcrm
+            edit DATEMASK '28.*.*'
+          task vcvmem
+            trigger vcvup eq complete
+            edit DATEMASK '11.*.*'
+          task vcvupm
+            trigger vcvmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/06/fc/model eq complete)
+          task glver
+          task glupr
+            trigger glver eq complete
+          task glcrr
+            edit DATEMASK '28.*.*'
+          task ff10ver
+            trigger glver eq complete
+          task ff10upr
+            trigger ff10ver eq complete and glupr eq complete
+          task glmem
+            trigger ff10upr eq complete
+            edit DATEMASK '11.*.*'
+          task glupm
+            trigger glmem eq complete
+            edit DATEMASK '11.*.*'
+          task glcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family sf
+          trigger fc eq complete or fc eq aborted
+          task vseli1
+          task vseli2
+          task vseup1
+            trigger vseli1 eq complete
+          task vseup2
+            trigger vseup1 eq complete and vseli2 eq complete
+          task vsecrd
+            edit DATEMASK '28.*.*'
+          task vsecrm
+            edit DATEMASK '28.*.*'
+          task vsemem
+            trigger vseup2 eq complete
+            edit DATEMASK '12.*.*'
+          task vseupm
+            trigger vsemem eq complete
+            edit DATEMASK '12.*.*'
+        endfamily
+      endfamily
+    endfamily
+    family 12
+      edit EMOS_BASE '12'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      family ddh
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/fc eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fc'
+        task ddh
+      endfamily
+      family sync
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/an eq complete)
+        edit EMOS_TYPE 'an'
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/sync'
+        task sync_bias
+          edit CALC_PSBIAS 'false'
+        task sync_fc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/fc/model:step gt 6 or /e_36r1/main/12/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_an
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/fc/model:step gt 3 or /e_36r1/main/12/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_clean
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+      endfamily
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/12/an eq complete and ( ../../main/12/fc/model:step ge 9 or ../../main/12/fc/model eq complete))
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task ansfc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/000 eq complete and /e_36r1/main/12/prod/12an eq complete)
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '240'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ./ansfc eq complete
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/an/4dvar/ifstraj:finaltraj or /e_36r1/main/12/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc024
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/024 eq complete)
+          edit STEPS '0/3/006/009/012/015/018/021/024'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc048
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/048 eq complete)
+          edit STEPS '027/030/033/036/039/042/045/048'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc072
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/072 eq complete)
+          edit STEPS '051/054/057/060/063/066/069/072'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc096
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/096 eq complete)
+          edit STEPS '075/078/081/084/087/090/093/096'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc120
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/120 eq complete)
+          edit STEPS '099/102/105/108/111/114/117/120'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc144
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/144 eq complete)
+          edit STEPS '123/126/129/132/135/138/141/144'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc192
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/192 eq complete)
+          edit STEPS '150/156/162/168/174/180/186/192'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc240
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/prod/240 eq complete)
+          edit STEPS '198/204/210/216/222/228/234/240'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family satim1
+          task satim
+            trigger ../../satim eq complete
+            edit STEPS '0/to/48/by/3'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family satim2
+          task satim
+            trigger ../../satim eq complete
+            edit STEPS '54/to/120/by/6'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/fc/model eq complete)
+          edit STEPS_SPECTRAL '6/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120'
+          edit STEPS '0/3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/75/78/81/84/87/90/93/96/99/102/105/108/111/114/117/120/123/126/129/132/135/138/141/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task rmfdb
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/obs eq complete)
+        task flush
+          edit STREAM 'oper'
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'oeoperan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/12/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      family traj
+        task feed
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/12/fc eq complete)
+        task cp_to_other
+          trigger feed eq complete
+      endfamily
+      family satim
+        edit QUEUE 'ns'
+        edit QUEUE_EPILOG 'ns'
+        edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+        edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+        edit MEM '11000'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+        edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+        edit SMSURLBASE 'http://intra.ecmwf.int/publications/cms/get/metapps'
+        inlimit /limits:c1b
+        task display_seaice
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/an eq complete)
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/admin'
+          edit FSFAMILY 'undef'
+          edit METVIEW 'metview_emos'
+          edit SMSURL 'seaice'
+          inlimit /limits:linux_cluster
+        task display_sst
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FSFAMILY 'undef'
+          edit SMSURL 'sst'
+          inlimit /limits:linux_cluster
+        family satim_0
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '0'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_3
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '3'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_6
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '6'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_9
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '9'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_12
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '12'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_15
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '15'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_18
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '18'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_21
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '21'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_24
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '24'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_27
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '27'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_30
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '30'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_33
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '33'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_36
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '36'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_39
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '39'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_42
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '42'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_45
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '45'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_48
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '48'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_54
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '54'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_60
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '60'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_66
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '66'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_72
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '72'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_78
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '78'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_84
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '84'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_90
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '90'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_96
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '96'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_102
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '102'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_108
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '108'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_114
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '114'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_120
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12/prod eq complete))
+          edit IMAGETIME '120'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+      endfamily
+      family satmon
+        trigger ../00dc/satmon eq complete
+        edit FSFAMILY 'an'
+        inlimit /e_36r1/limits:smon
+        task getsmon
+          trigger ../fb/fdbksave eq complete and ../archive/obs/af eq complete
+        task smon_meris
+          trigger getsmon eq complete
+          edit smon_smsmode 'MERIS'
+        task smon_amsre
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMSRE'
+        task smon_ssmis
+          trigger getsmon eq complete
+          edit smon_smsmode 'SSMIS'
+        task smon_tmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'TMI'
+        task smon_gpsro
+          trigger getsmon eq complete
+          edit smon_smsmode 'GPSRO'
+        task smon_pacrars
+          trigger getsmon eq complete
+          edit smon_smsmode 'PACRARS'
+        task smon_ears
+          trigger getsmon eq complete
+          edit smon_smsmode 'EARS'
+        task smon_o3msg
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3MSG'
+        task smon_o3knmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3KNMI'
+        task smon_pwc
+          trigger getsmon eq complete
+          edit smon_smsmode 'PWC'
+        task smon_temp
+          trigger getsmon eq complete
+          edit smon_smsmode 'TEMP'
+        task smon_iasi
+          trigger getsmon eq complete
+          edit smon_smsmode 'IASI'
+        task smon_airs
+          trigger getsmon eq complete
+          edit smon_smsmode 'AIRS'
+        task smon_dbamv
+          trigger getsmon eq complete
+          edit smon_smsmode 'DBAMV'
+        task smon_amv
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMV'
+        task smon_o3
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3'
+        task smon_dmsp
+          trigger getsmon eq complete
+          edit smon_smsmode 'DMSP'
+        task smon_noaa
+          trigger getsmon eq complete
+          edit smon_smsmode 'NOAA'
+        task smon_geos
+          trigger getsmon eq complete
+          edit smon_smsmode 'GEOS'
+        task smon_scatt
+          trigger getsmon eq complete
+          edit smon_smsmode 'SCATT'
+        task smon_slmoist
+          trigger getsmon eq complete
+          edit smon_smsmode 'SLMOIST'
+        task smon_clean
+          trigger getsmon eq complete and smon_meris eq complete and smon_amsre eq complete and smon_ssmis eq complete and smon_tmi eq complete and smon_gpsro eq complete and smon_pacrars eq complete and smon_ears eq complete and smon_o3msg eq complete and smon_o3knmi eq complete and smon_pwc eq complete and smon_temp eq complete and smon_iasi eq complete and smon_airs eq complete and smon_dbamv eq complete and smon_amv eq complete and smon_o3 eq complete and smon_dmsp eq complete and sm [...]
+      endfamily
+      task clean
+        trigger fb eq complete and ../06/clean eq complete
+        edit FSFAMILY 'an'
+      family verif
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/verif'
+        edit DELTA_DAY '1'
+        inlimit /limits:linux_cluster
+        time 02:00
+        family fc
+          task v12li1
+          task v12li2
+          task v12up1
+            trigger v12li1 eq complete
+          task v12up2
+            trigger v12up1 eq complete and v12li2 eq complete
+          task v12pl
+            trigger v12up2 eq complete
+          task v12memv
+            trigger v12up2 eq complete
+            edit DATEMASK '02.*.*'
+          task v12memb
+            trigger v12up2 eq complete
+            edit DATEMASK '11.*.*'
+          task v12upmv
+            trigger v12memv eq complete
+            edit DATEMASK '02.*.*'
+          task v12upmb
+            trigger v12memb eq complete
+            edit DATEMASK '11.*.*'
+          task v12crmv
+            edit DATEMASK '28.*.*'
+          task v12crmb
+            edit DATEMASK '28.*.*'
+          task v12crd
+            edit DATEMASK '28.*.*'
+        endfamily
+        family oc
+          trigger ./fc eq complete or ./fc eq aborted
+          task mk_dummy_fields
+            edit QUEUE 'emos'
+            edit USER 'emos'
+            edit PP_BASE '/pp1'
+            edit WSHOST 'pp1'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit LOGDIR '/pp1/log'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit SMSOUT '/vol/emos_nc/output'
+          task insert_fields
+            trigger mk_dummy_fields eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit PP_BASE '/pp1'
+            inlimit /limits:linux_cluster
+          task vbrli1
+            trigger insert_fields eq complete
+          task vbrli2
+            trigger vbrli1 eq complete
+          task vwali1
+            trigger insert_fields eq complete
+          task vwali2
+            trigger vwali1 eq complete
+          task vwali3
+            trigger vwali2 eq complete
+          task vofli
+            trigger insert_fields eq complete
+          task vtlli
+            trigger insert_fields eq complete
+          task vtoli
+            trigger insert_fields eq complete
+          task vmoli
+            trigger insert_fields eq complete
+          task vbrup1
+            trigger vbrli1 eq complete
+          task vbrup2
+            trigger vbrup1 eq complete and vbrli2 eq complete
+          task vwaup1
+            trigger vwali1 eq complete
+          task vwaup2
+            trigger vwaup1 eq complete and vwali2 eq complete
+          task vwaup3
+            trigger vwaup2 eq complete and vwali3 eq complete
+          task vofup
+            trigger vofli eq complete
+          task vtlup
+            trigger vtlli eq complete
+          task vtoup
+            trigger vtoli eq complete
+          task vmoup
+            trigger vmoli eq complete
+          task vmeli
+            trigger insert_fields eq complete
+          task vmeup
+            trigger vmeli eq complete
+          task voccrd
+            edit DATEMASK '28.*.*'
+          task voccrm
+            edit DATEMASK '28.*.*'
+          task vocmem
+            edit DATEMASK '11.*.*'
+          task vocupm
+            trigger vocmem eq complete
+            edit DATEMASK '11.*.*'
+          task cleanup
+            trigger vmeup eq complete and vbrup2 eq complete and vwaup3 eq complete and vofup eq complete and vtlup eq complete and vtoup eq complete and vmoup eq complete and voccrd eq complete and voccrm eq complete and vocupm eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+        endfamily
+        family cf
+          trigger oc eq complete or oc eq aborted
+          task vcnli1
+            late -c +02:00
+          task vcnli2
+          task vcnup1
+            trigger vcnli1 eq complete
+          task vcnup2
+            trigger vcnup1 eq complete and vcnli2 eq complete
+          task vcnpl
+            trigger vcnup2 eq complete
+          task vcncrd
+          task vcncrm
+            edit DATEMASK '28.*.*'
+          task vcnmem
+            trigger vcnup2 eq complete
+            edit DATEMASK '11.*.*'
+          task vcnupm
+            trigger vcnmem eq complete
+            edit DATEMASK '11.*.*'
+          task vcnli3
+          task vcnli4
+          task vcnup3
+            trigger vcnup2 eq complete and vcnli3 eq complete
+          task vcnup4
+            trigger vcnup3 eq complete and vcnli4 eq complete
+          task vcnmem2
+            trigger vcnup4 eq complete
+            edit DATEMASK '22.*.*'
+          task vcnupm2
+            trigger vcnmem2 eq complete
+            edit DATEMASK '22.*.*'
+        endfamily
+        family ob
+          trigger oc eq complete or oc eq aborted
+          time 05:00
+          family stage1
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          family stage2
+            trigger ./stage1 eq complete
+            edit EMOS_BASE '00'
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          task vobcrd
+            edit DATEMASK '28.*.*'
+          task vobcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family em
+          task vemli
+            late -c +02:00
+          task vemup
+            trigger vemli eq complete
+          task vemcrd
+            edit DATEMASK '28.*.*'
+          task vemcrm
+            edit DATEMASK '28.*.*'
+          task vemmem
+            trigger vemup eq complete
+            edit DATEMASK '11.*.*'
+          task vemupm
+            trigger vemmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family es
+          trigger em eq complete
+          task vesli
+            late -c +02:00
+          task vesup
+            trigger vesli eq complete
+          task vescrd
+            edit DATEMASK '28.*.*'
+          task vescrm
+            edit DATEMASK '28.*.*'
+          task vesmem
+            trigger vesup eq complete
+            edit DATEMASK '11.*.*'
+          task vesupm
+            trigger vesmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family cv
+          trigger es eq complete
+          task vcvli
+            late -c +02:00
+          task vcvup
+            trigger vcvli eq complete
+          task vcvcrd
+            edit DATEMASK '28.*.*'
+          task vcvcrm
+            edit DATEMASK '28.*.*'
+          task vcvmem
+            trigger vcvup eq complete
+            edit DATEMASK '11.*.*'
+          task vcvupm
+            trigger vcvmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/12/fc/model eq complete)
+          task glver
+          task glupr
+            trigger glver eq complete
+          task glcrr
+            edit DATEMASK '28.*.*'
+          task ff10ver
+            trigger glver eq complete
+          task ff10upr
+            trigger ff10ver eq complete and glupr eq complete
+          task glmem
+            trigger ff10upr eq complete
+            edit DATEMASK '11.*.*'
+          task glupm
+            trigger glmem eq complete
+            edit DATEMASK '11.*.*'
+          task glcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family sf
+          trigger fc eq complete or fc eq aborted
+          task vseli1
+          task vseli2
+          task vseup1
+            trigger vseli1 eq complete
+          task vseup2
+            trigger vseup1 eq complete and vseli2 eq complete
+          task vsecrd
+            edit DATEMASK '28.*.*'
+          task vsecrm
+            edit DATEMASK '28.*.*'
+          task vsemem
+            trigger vseup2 eq complete
+            edit DATEMASK '12.*.*'
+          task vseupm
+            trigger vsemem eq complete
+            edit DATEMASK '12.*.*'
+        endfamily
+      endfamily
+    endfamily
+    family 12dc
+      edit EMOS_BASE '12'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      family ddh
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12dc/fc eq complete)
+        edit EMOS_BASE '18'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fc'
+        task ddh
+      endfamily
+      family sync
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12dc/an eq complete)
+        edit EMOS_TYPE 'an'
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/sync'
+        task dcda_to_da_bk
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit OPHOST 'c1b'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/an'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_satmon
+          trigger ../satmon eq complete
+        task sync_bias
+        task sync_fc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12dc/fc/model:step gt 6 or /e_36r1/main/12dc/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit EMOS_BASE '18'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_an
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit EMOS_BASE '18'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12dc/fc/model:step gt 3 or /e_36r1/main/12dc/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          edit EMOS_BASE '18'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_clean
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+      endfamily
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/12dc/an eq complete and ( ../../main/12dc/fc/model:step ge 15 or ../../main/12dc/fc/model eq complete))
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task sp2fdb
+          edit STEPS '3/6/9/12/18'
+          label files ""
+          label info ""
+          event fdb
+        task ansfc
+          trigger sp2fdb eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '15'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ./ansfc eq complete
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/12dc/an/4dvar/ifstraj:finaltraj or /e_36r1/main/12dc/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc015
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12dc/fc/model:step ge 21 or /e_36r1/main/12dc/fc/model eq complete)
+          edit STEPS '3/6/9/12/15'
+          edit EMOS_BASE '18'
+          edit EMOS_TYPE 'fc'
+          task sp2fdb
+            label files ""
+            label info ""
+            event fdb
+          task fcsfc
+            trigger sp2fdb eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12dc/fc/model eq complete)
+          edit STEPS_SPECTRAL '6/12'
+          edit EMOS_BASE '18'
+          edit STEPS '0/3/6/9/12/15'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task rmfdb
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12dc/obs eq complete)
+        task flush
+          edit STREAM 'oper'
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12dc/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'oedcdaan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/12dc/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      family traj
+        task feed
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/12dc/fc eq complete)
+        task cp_to_other
+          trigger feed eq complete
+      endfamily
+      family satmon
+        trigger ../00dc/satmon eq complete
+        edit FSFAMILY 'an'
+        inlimit /e_36r1/limits:smon
+        task getsmon
+          trigger ../fb/fdbksave eq complete and ../archive/obs/af eq complete
+        task smon_meris
+          trigger getsmon eq complete
+          edit smon_smsmode 'MERIS'
+        task smon_amsre
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMSRE'
+        task smon_ssmis
+          trigger getsmon eq complete
+          edit smon_smsmode 'SSMIS'
+        task smon_tmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'TMI'
+        task smon_gpsro
+          trigger getsmon eq complete
+          edit smon_smsmode 'GPSRO'
+        task smon_pacrars
+          trigger getsmon eq complete
+          edit smon_smsmode 'PACRARS'
+        task smon_ears
+          trigger getsmon eq complete
+          edit smon_smsmode 'EARS'
+        task smon_o3msg
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3MSG'
+        task smon_o3knmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3KNMI'
+        task smon_pwc
+          trigger getsmon eq complete
+          edit smon_smsmode 'PWC'
+        task smon_temp
+          trigger getsmon eq complete
+          edit smon_smsmode 'TEMP'
+        task smon_iasi
+          trigger getsmon eq complete
+          edit smon_smsmode 'IASI'
+        task smon_airs
+          trigger getsmon eq complete
+          edit smon_smsmode 'AIRS'
+        task smon_dbamv
+          trigger getsmon eq complete
+          edit smon_smsmode 'DBAMV'
+        task smon_amv
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMV'
+        task smon_o3
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3'
+        task smon_dmsp
+          trigger getsmon eq complete
+          edit smon_smsmode 'DMSP'
+        task smon_noaa
+          trigger getsmon eq complete
+          edit smon_smsmode 'NOAA'
+        task smon_geos
+          trigger getsmon eq complete
+          edit smon_smsmode 'GEOS'
+        task smon_scatt
+          trigger getsmon eq complete
+          edit smon_smsmode 'SCATT'
+        task smon_slmoist
+          trigger getsmon eq complete
+          edit smon_smsmode 'SLMOIST'
+        task smon_clean
+          trigger getsmon eq complete and smon_meris eq complete and smon_amsre eq complete and smon_ssmis eq complete and smon_tmi eq complete and smon_gpsro eq complete and smon_pacrars eq complete and smon_ears eq complete and smon_o3msg eq complete and smon_o3knmi eq complete and smon_pwc eq complete and smon_temp eq complete and smon_iasi eq complete and smon_airs eq complete and smon_dbamv eq complete and smon_amv eq complete and smon_o3 eq complete and smon_dmsp eq complete and sm [...]
+      endfamily
+      task clean
+        trigger fb eq complete and ../12/clean eq complete
+        edit FSFAMILY 'an'
+      task cleanplus6
+        trigger clean eq complete
+        edit EMOS_BASE '18'
+        edit FSFAMILY 'an'
+      family verif
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/verif'
+        edit DELTA_DAY '1'
+        inlimit /limits:linux_cluster
+        family fc
+          task v12li1
+          task v12li2
+          task v12up1
+            trigger v12li1 eq complete
+          task v12up2
+            trigger v12up1 eq complete and v12li2 eq complete
+          task v12pl
+            trigger v12up2 eq complete
+          task v12memv
+            trigger v12up2 eq complete
+            edit DATEMASK '02.*.*'
+          task v12memb
+            trigger v12up2 eq complete
+            edit DATEMASK '11.*.*'
+          task v12upmv
+            trigger v12memv eq complete
+            edit DATEMASK '02.*.*'
+          task v12upmb
+            trigger v12memb eq complete
+            edit DATEMASK '11.*.*'
+          task v12crmv
+            edit DATEMASK '28.*.*'
+          task v12crmb
+            edit DATEMASK '28.*.*'
+          task v12crd
+            edit DATEMASK '28.*.*'
+        endfamily
+        family oc
+          trigger ./fc eq complete or ./fc eq aborted
+          task mk_dummy_fields
+            edit QUEUE 'emos'
+            edit USER 'emos'
+            edit PP_BASE '/pp1'
+            edit WSHOST 'pp1'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit LOGDIR '/pp1/log'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit SMSOUT '/vol/emos_nc/output'
+          task insert_fields
+            trigger mk_dummy_fields eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit PP_BASE '/pp1'
+            inlimit /limits:linux_cluster
+          task vbrli1
+            trigger insert_fields eq complete
+          task vbrli2
+            trigger vbrli1 eq complete
+          task vwali1
+            trigger insert_fields eq complete
+          task vwali2
+            trigger vwali1 eq complete
+          task vwali3
+            trigger vwali2 eq complete
+          task vofli
+            trigger insert_fields eq complete
+          task vtlli
+            trigger insert_fields eq complete
+          task vtoli
+            trigger insert_fields eq complete
+          task vmoli
+            trigger insert_fields eq complete
+          task vbrup1
+            trigger vbrli1 eq complete
+          task vbrup2
+            trigger vbrup1 eq complete and vbrli2 eq complete
+          task vwaup1
+            trigger vwali1 eq complete
+          task vwaup2
+            trigger vwaup1 eq complete and vwali2 eq complete
+          task vwaup3
+            trigger vwaup2 eq complete and vwali3 eq complete
+          task vofup
+            trigger vofli eq complete
+          task vtlup
+            trigger vtlli eq complete
+          task vtoup
+            trigger vtoli eq complete
+          task vmoup
+            trigger vmoli eq complete
+          task vmeli
+            trigger insert_fields eq complete
+          task vmeup
+            trigger vmeli eq complete
+          task voccrd
+            edit DATEMASK '28.*.*'
+          task voccrm
+            edit DATEMASK '28.*.*'
+          task vocmem
+            edit DATEMASK '11.*.*'
+          task vocupm
+            trigger vocmem eq complete
+            edit DATEMASK '11.*.*'
+          task cleanup
+            trigger vmeup eq complete and vbrup2 eq complete and vwaup3 eq complete and vofup eq complete and vtlup eq complete and vtoup eq complete and vmoup eq complete and voccrd eq complete and voccrm eq complete and vocupm eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+        endfamily
+        family cf
+          trigger oc eq complete or oc eq aborted
+          task vcnli1
+            late -c +02:00
+          task vcnli2
+          task vcnup1
+            trigger vcnli1 eq complete
+          task vcnup2
+            trigger vcnup1 eq complete and vcnli2 eq complete
+          task vcnpl
+            trigger vcnup2 eq complete
+          task vcncrd
+          task vcncrm
+            edit DATEMASK '28.*.*'
+          task vcnmem
+            trigger vcnup2 eq complete
+            edit DATEMASK '11.*.*'
+          task vcnupm
+            trigger vcnmem eq complete
+            edit DATEMASK '11.*.*'
+          task vcnli3
+          task vcnli4
+          task vcnup3
+            trigger vcnup2 eq complete and vcnli3 eq complete
+          task vcnup4
+            trigger vcnup3 eq complete and vcnli4 eq complete
+          task vcnmem2
+            trigger vcnup4 eq complete
+            edit DATEMASK '22.*.*'
+          task vcnupm2
+            trigger vcnmem2 eq complete
+            edit DATEMASK '22.*.*'
+        endfamily
+        family ob
+          trigger oc eq complete or oc eq aborted
+          time 05:00
+          family stage1
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          family stage2
+            trigger ./stage1 eq complete
+            edit EMOS_BASE '00'
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          task vobcrd
+            edit DATEMASK '28.*.*'
+          task vobcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family em
+          task vemli
+            late -c +02:00
+          task vemup
+            trigger vemli eq complete
+          task vemcrd
+            edit DATEMASK '28.*.*'
+          task vemcrm
+            edit DATEMASK '28.*.*'
+          task vemmem
+            trigger vemup eq complete
+            edit DATEMASK '11.*.*'
+          task vemupm
+            trigger vemmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family es
+          trigger em eq complete
+          task vesli
+            late -c +02:00
+          task vesup
+            trigger vesli eq complete
+          task vescrd
+            edit DATEMASK '28.*.*'
+          task vescrm
+            edit DATEMASK '28.*.*'
+          task vesmem
+            trigger vesup eq complete
+            edit DATEMASK '11.*.*'
+          task vesupm
+            trigger vesmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family cv
+          trigger es eq complete
+          task vcvli
+            late -c +02:00
+          task vcvup
+            trigger vcvli eq complete
+          task vcvcrd
+            edit DATEMASK '28.*.*'
+          task vcvcrm
+            edit DATEMASK '28.*.*'
+          task vcvmem
+            trigger vcvup eq complete
+            edit DATEMASK '11.*.*'
+          task vcvupm
+            trigger vcvmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/12dc/fc/model eq complete)
+          task glver
+          task glupr
+            trigger glver eq complete
+          task glcrr
+            edit DATEMASK '28.*.*'
+          task ff10ver
+            trigger glver eq complete
+          task ff10upr
+            trigger ff10ver eq complete and glupr eq complete
+          task glmem
+            trigger ff10upr eq complete
+            edit DATEMASK '11.*.*'
+          task glupm
+            trigger glmem eq complete
+            edit DATEMASK '11.*.*'
+          task glcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family sf
+          trigger fc eq complete or fc eq aborted
+          task vseli1
+          task vseli2
+          task vseup1
+            trigger vseli1 eq complete
+          task vseup2
+            trigger vseup1 eq complete and vseli2 eq complete
+          task vsecrd
+            edit DATEMASK '28.*.*'
+          task vsecrm
+            edit DATEMASK '28.*.*'
+          task vsemem
+            trigger vseup2 eq complete
+            edit DATEMASK '12.*.*'
+          task vseupm
+            trigger vsemem eq complete
+            edit DATEMASK '12.*.*'
+        endfamily
+      endfamily
+    endfamily
+    family 18
+      edit EMOS_BASE '18'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DA'
+      edit LAR_4V_EF 'false'
+      edit LFC_DIR_FREQ 'false'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/00/prod/18an eq complete)
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task ansfc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod/18an/derived_param eq complete))
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '6'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod/18an/derived_param eq complete))
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/18/an/4dvar/ifstraj:finaltraj or /e_36r1/main/18/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc015
+          edit STEPS '3/6/9/12/15'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18/fc/model eq complete)
+          edit STEPS '0/3/6/9/12/15'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'oeoperan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/18/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      family traj
+        task feed
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/18/fc eq complete)
+        task cp_to_other
+          trigger feed eq complete
+      endfamily
+      family satmon
+        trigger ../00dc/satmon eq complete
+        edit FSFAMILY 'an'
+        inlimit /e_36r1/limits:smon
+        task getsmon
+          trigger ../fb/fdbksave eq complete and ../archive/obs/af eq complete
+        task smon_meris
+          trigger getsmon eq complete
+          edit smon_smsmode 'MERIS'
+        task smon_amsre
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMSRE'
+        task smon_ssmis
+          trigger getsmon eq complete
+          edit smon_smsmode 'SSMIS'
+        task smon_tmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'TMI'
+        task smon_gpsro
+          trigger getsmon eq complete
+          edit smon_smsmode 'GPSRO'
+        task smon_pacrars
+          trigger getsmon eq complete
+          edit smon_smsmode 'PACRARS'
+        task smon_ears
+          trigger getsmon eq complete
+          edit smon_smsmode 'EARS'
+        task smon_o3msg
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3MSG'
+        task smon_o3knmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3KNMI'
+        task smon_pwc
+          trigger getsmon eq complete
+          edit smon_smsmode 'PWC'
+        task smon_temp
+          trigger getsmon eq complete
+          edit smon_smsmode 'TEMP'
+        task smon_iasi
+          trigger getsmon eq complete
+          edit smon_smsmode 'IASI'
+        task smon_airs
+          trigger getsmon eq complete
+          edit smon_smsmode 'AIRS'
+        task smon_dbamv
+          trigger getsmon eq complete
+          edit smon_smsmode 'DBAMV'
+        task smon_amv
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMV'
+        task smon_o3
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3'
+        task smon_dmsp
+          trigger getsmon eq complete
+          edit smon_smsmode 'DMSP'
+        task smon_noaa
+          trigger getsmon eq complete
+          edit smon_smsmode 'NOAA'
+        task smon_geos
+          trigger getsmon eq complete
+          edit smon_smsmode 'GEOS'
+        task smon_scatt
+          trigger getsmon eq complete
+          edit smon_smsmode 'SCATT'
+        task smon_slmoist
+          trigger getsmon eq complete
+          edit smon_smsmode 'SLMOIST'
+        task smon_clean
+          trigger getsmon eq complete and smon_meris eq complete and smon_amsre eq complete and smon_ssmis eq complete and smon_tmi eq complete and smon_gpsro eq complete and smon_pacrars eq complete and smon_ears eq complete and smon_o3msg eq complete and smon_o3knmi eq complete and smon_pwc eq complete and smon_temp eq complete and smon_iasi eq complete and smon_airs eq complete and smon_dbamv eq complete and smon_amv eq complete and smon_o3 eq complete and smon_dmsp eq complete and sm [...]
+      endfamily
+      task clean
+        trigger fb eq complete and ../12dc/clean eq complete
+        edit FSFAMILY 'an'
+      family verif
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/verif'
+        edit DELTA_DAY '1'
+        inlimit /limits:linux_cluster
+        family fc
+          task v12li1
+          task v12li2
+          task v12up1
+            trigger v12li1 eq complete
+          task v12up2
+            trigger v12up1 eq complete and v12li2 eq complete
+          task v12pl
+            trigger v12up2 eq complete
+          task v12memv
+            trigger v12up2 eq complete
+            edit DATEMASK '02.*.*'
+          task v12memb
+            trigger v12up2 eq complete
+            edit DATEMASK '11.*.*'
+          task v12upmv
+            trigger v12memv eq complete
+            edit DATEMASK '02.*.*'
+          task v12upmb
+            trigger v12memb eq complete
+            edit DATEMASK '11.*.*'
+          task v12crmv
+            edit DATEMASK '28.*.*'
+          task v12crmb
+            edit DATEMASK '28.*.*'
+          task v12crd
+            edit DATEMASK '28.*.*'
+        endfamily
+        family oc
+          trigger ./fc eq complete or ./fc eq aborted
+          task mk_dummy_fields
+            edit QUEUE 'emos'
+            edit USER 'emos'
+            edit PP_BASE '/pp1'
+            edit WSHOST 'pp1'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit LOGDIR '/pp1/log'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit SMSOUT '/vol/emos_nc/output'
+          task insert_fields
+            trigger mk_dummy_fields eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit PP_BASE '/pp1'
+            inlimit /limits:linux_cluster
+          task vbrli1
+            trigger insert_fields eq complete
+          task vbrli2
+            trigger vbrli1 eq complete
+          task vwali1
+            trigger insert_fields eq complete
+          task vwali2
+            trigger vwali1 eq complete
+          task vwali3
+            trigger vwali2 eq complete
+          task vofli
+            trigger insert_fields eq complete
+          task vtlli
+            trigger insert_fields eq complete
+          task vtoli
+            trigger insert_fields eq complete
+          task vmoli
+            trigger insert_fields eq complete
+          task vbrup1
+            trigger vbrli1 eq complete
+          task vbrup2
+            trigger vbrup1 eq complete and vbrli2 eq complete
+          task vwaup1
+            trigger vwali1 eq complete
+          task vwaup2
+            trigger vwaup1 eq complete and vwali2 eq complete
+          task vwaup3
+            trigger vwaup2 eq complete and vwali3 eq complete
+          task vofup
+            trigger vofli eq complete
+          task vtlup
+            trigger vtlli eq complete
+          task vtoup
+            trigger vtoli eq complete
+          task vmoup
+            trigger vmoli eq complete
+          task vmeli
+            trigger insert_fields eq complete
+          task vmeup
+            trigger vmeli eq complete
+          task voccrd
+            edit DATEMASK '28.*.*'
+          task voccrm
+            edit DATEMASK '28.*.*'
+          task vocmem
+            edit DATEMASK '11.*.*'
+          task vocupm
+            trigger vocmem eq complete
+            edit DATEMASK '11.*.*'
+          task cleanup
+            trigger vmeup eq complete and vbrup2 eq complete and vwaup3 eq complete and vofup eq complete and vtlup eq complete and vtoup eq complete and vmoup eq complete and voccrd eq complete and voccrm eq complete and vocupm eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+        endfamily
+        family cf
+          trigger oc eq complete or oc eq aborted
+          task vcnli1
+            late -c +02:00
+          task vcnli2
+          task vcnup1
+            trigger vcnli1 eq complete
+          task vcnup2
+            trigger vcnup1 eq complete and vcnli2 eq complete
+          task vcnpl
+            trigger vcnup2 eq complete
+          task vcncrd
+          task vcncrm
+            edit DATEMASK '28.*.*'
+          task vcnmem
+            trigger vcnup2 eq complete
+            edit DATEMASK '11.*.*'
+          task vcnupm
+            trigger vcnmem eq complete
+            edit DATEMASK '11.*.*'
+          task vcnli3
+          task vcnli4
+          task vcnup3
+            trigger vcnup2 eq complete and vcnli3 eq complete
+          task vcnup4
+            trigger vcnup3 eq complete and vcnli4 eq complete
+          task vcnmem2
+            trigger vcnup4 eq complete
+            edit DATEMASK '22.*.*'
+          task vcnupm2
+            trigger vcnmem2 eq complete
+            edit DATEMASK '22.*.*'
+        endfamily
+        family ob
+          trigger oc eq complete or oc eq aborted
+          time 05:00
+          family stage1
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          family stage2
+            trigger ./stage1 eq complete
+            edit EMOS_BASE '00'
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          task vobcrd
+            edit DATEMASK '28.*.*'
+          task vobcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family em
+          task vemli
+            late -c +02:00
+          task vemup
+            trigger vemli eq complete
+          task vemcrd
+            edit DATEMASK '28.*.*'
+          task vemcrm
+            edit DATEMASK '28.*.*'
+          task vemmem
+            trigger vemup eq complete
+            edit DATEMASK '11.*.*'
+          task vemupm
+            trigger vemmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family es
+          trigger em eq complete
+          task vesli
+            late -c +02:00
+          task vesup
+            trigger vesli eq complete
+          task vescrd
+            edit DATEMASK '28.*.*'
+          task vescrm
+            edit DATEMASK '28.*.*'
+          task vesmem
+            trigger vesup eq complete
+            edit DATEMASK '11.*.*'
+          task vesupm
+            trigger vesmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family cv
+          trigger es eq complete
+          task vcvli
+            late -c +02:00
+          task vcvup
+            trigger vcvli eq complete
+          task vcvcrd
+            edit DATEMASK '28.*.*'
+          task vcvcrm
+            edit DATEMASK '28.*.*'
+          task vcvmem
+            trigger vcvup eq complete
+            edit DATEMASK '11.*.*'
+          task vcvupm
+            trigger vcvmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/18/fc/model eq complete)
+          task glver
+          task glupr
+            trigger glver eq complete
+          task glcrr
+            edit DATEMASK '28.*.*'
+          task ff10ver
+            trigger glver eq complete
+          task ff10upr
+            trigger ff10ver eq complete and glupr eq complete
+          task glmem
+            trigger ff10upr eq complete
+            edit DATEMASK '11.*.*'
+          task glupm
+            trigger glmem eq complete
+            edit DATEMASK '11.*.*'
+          task glcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family sf
+          trigger fc eq complete or fc eq aborted
+          task vseli1
+          task vseli2
+          task vseup1
+            trigger vseli1 eq complete
+          task vseup2
+            trigger vseup1 eq complete and vseli2 eq complete
+          task vsecrd
+            edit DATEMASK '28.*.*'
+          task vsecrm
+            edit DATEMASK '28.*.*'
+          task vsemem
+            trigger vseup2 eq complete
+            edit DATEMASK '12.*.*'
+          task vseupm
+            trigger vsemem eq complete
+            edit DATEMASK '12.*.*'
+        endfamily
+      endfamily
+    endfamily
+    family 00
+      edit EMOS_BASE '00'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '1'
+      family ddh
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/fc eq complete)
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fc'
+        task ddh
+      endfamily
+      family sync
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/an eq complete)
+        edit EMOS_TYPE 'an'
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/sync'
+        task sync_bias
+          edit CALC_PSBIAS 'false'
+        task sync_fc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/fc/model:step gt 6 or /e_36r1/main/00/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_an
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/fc/model:step gt 3 or /e_36r1/main/00/fc/model eq complete))
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+          label files ""
+          label info ""
+          event fdb
+        task sync_clean
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SCHOST 'c1a'
+          edit STHOST '/s1a'
+          edit SCHOST_BKUP 'c1b'
+          edit STHOST_BKUP '/s1b'
+          edit SMSLOGHOST 'c1a'
+          edit LOGDIR '/s1a/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1a/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1a
+      endfamily
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/00/an eq complete and ( ../../main/00/fc/model:step ge 9 or ../../main/00/fc/model eq complete))
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task ansfc
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/000 eq complete and /e_36r1/main/00/prod/00an eq complete)
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '240'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ./ansfc eq complete
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/an/4dvar/ifstraj:finaltraj or /e_36r1/main/00/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc024
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/024 eq complete)
+          edit STEPS '0/3/006/009/012/015/018/021/024'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc048
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/048 eq complete)
+          edit STEPS '027/030/033/036/039/042/045/048'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc072
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/072 eq complete)
+          edit STEPS '051/054/057/060/063/066/069/072'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc096
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/096 eq complete)
+          edit STEPS '075/078/081/084/087/090/093/096'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc120
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/120 eq complete)
+          edit STEPS '099/102/105/108/111/114/117/120'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc144
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/144 eq complete)
+          edit STEPS '123/126/129/132/135/138/141/144'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc192
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/192 eq complete)
+          edit STEPS '150/156/162/168/174/180/186/192'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc240
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/prod/240 eq complete)
+          edit STEPS '198/204/210/216/222/228/234/240'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family satim1
+          task satim
+            trigger ../../satim eq complete
+            edit STEPS '0/to/48/by/3'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family satim2
+          task satim
+            trigger ../../satim eq complete
+            edit STEPS '54/to/120/by/6'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/fc/model eq complete)
+          edit STEPS_SPECTRAL '6/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120'
+          edit STEPS '0/3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/75/78/81/84/87/90/93/96/99/102/105/108/111/114/117/120/123/126/129/132/135/138/141/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'oeoperan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/00/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      family traj
+        task feed
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/00/fc eq complete)
+        task cp_to_other
+          trigger feed eq complete
+      endfamily
+      family satim
+        edit QUEUE 'ns'
+        edit QUEUE_EPILOG 'ns'
+        edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+        edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+        edit MEM '11000'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+        edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+        edit SMSURLBASE 'http://intra.ecmwf.int/publications/cms/get/metapps'
+        inlimit /limits:c1b
+        task display_seaice
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/an eq complete)
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/admin'
+          edit FSFAMILY 'undef'
+          edit METVIEW 'metview_emos'
+          edit SMSURL 'seaice'
+          inlimit /limits:linux_cluster
+        task display_sst
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FSFAMILY 'undef'
+          edit SMSURL 'sst'
+          inlimit /limits:linux_cluster
+        family satim_0
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '0'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_3
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '3'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_6
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '6'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_9
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '9'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_12
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '12'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_15
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '15'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_18
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '18'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_21
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '21'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_24
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '24'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_27
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '27'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_30
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '30'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_33
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '33'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_36
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '36'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_39
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '39'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_42
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '42'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_45
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '45'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_48
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '48'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_54
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '54'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_60
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '60'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_66
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '66'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_72
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '72'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_78
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '78'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_84
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '84'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_90
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '90'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_96
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '96'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_102
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '102'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_108
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '108'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_114
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '114'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+        family satim_120
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/00/prod eq complete))
+          edit IMAGETIME '120'
+          edit WMOID 'undef'
+          family retr
+            edit SATIM_MODE '1'
+            inlimit /e_36r1/limits:satimsim_ret
+            task satimsim
+              edit MEM '781'
+          endfamily
+          family sat
+            trigger ./retr eq complete
+            edit SATIM_MODE '2'
+            inlimit /e_36r1/limits:satimsim
+            family sat_54
+              edit WMOID '54'
+              task satimsim
+            endfamily
+            family sat_56
+              edit WMOID '56'
+              task satimsim
+            endfamily
+            family sat_171
+              edit WMOID '171'
+              task satimsim
+            endfamily
+            family sat_255
+              edit WMOID '255'
+              task satimsim
+            endfamily
+            family sat_256
+              edit WMOID '256'
+              task satimsim
+            endfamily
+          endfamily
+          family satim_flush
+            trigger ./sat eq complete
+            edit SATIM_MODE '3'
+            task satimsim
+              edit MEM '781'
+          endfamily
+        endfamily
+      endfamily
+      family satmon
+        trigger ../00dc/satmon eq complete
+        edit FSFAMILY 'an'
+        inlimit /e_36r1/limits:smon
+        task getsmon
+          trigger ../fb/fdbksave eq complete and ../archive/obs/af eq complete
+        task smon_meris
+          trigger getsmon eq complete
+          edit smon_smsmode 'MERIS'
+        task smon_amsre
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMSRE'
+        task smon_ssmis
+          trigger getsmon eq complete
+          edit smon_smsmode 'SSMIS'
+        task smon_tmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'TMI'
+        task smon_gpsro
+          trigger getsmon eq complete
+          edit smon_smsmode 'GPSRO'
+        task smon_pacrars
+          trigger getsmon eq complete
+          edit smon_smsmode 'PACRARS'
+        task smon_ears
+          trigger getsmon eq complete
+          edit smon_smsmode 'EARS'
+        task smon_o3msg
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3MSG'
+        task smon_o3knmi
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3KNMI'
+        task smon_pwc
+          trigger getsmon eq complete
+          edit smon_smsmode 'PWC'
+        task smon_temp
+          trigger getsmon eq complete
+          edit smon_smsmode 'TEMP'
+        task smon_iasi
+          trigger getsmon eq complete
+          edit smon_smsmode 'IASI'
+        task smon_airs
+          trigger getsmon eq complete
+          edit smon_smsmode 'AIRS'
+        task smon_dbamv
+          trigger getsmon eq complete
+          edit smon_smsmode 'DBAMV'
+        task smon_amv
+          trigger getsmon eq complete
+          edit smon_smsmode 'AMV'
+        task smon_o3
+          trigger getsmon eq complete
+          edit smon_smsmode 'O3'
+        task smon_dmsp
+          trigger getsmon eq complete
+          edit smon_smsmode 'DMSP'
+        task smon_noaa
+          trigger getsmon eq complete
+          edit smon_smsmode 'NOAA'
+        task smon_geos
+          trigger getsmon eq complete
+          edit smon_smsmode 'GEOS'
+        task smon_scatt
+          trigger getsmon eq complete
+          edit smon_smsmode 'SCATT'
+        task smon_slmoist
+          trigger getsmon eq complete
+          edit smon_smsmode 'SLMOIST'
+        task smon_clean
+          trigger getsmon eq complete and smon_meris eq complete and smon_amsre eq complete and smon_ssmis eq complete and smon_tmi eq complete and smon_gpsro eq complete and smon_pacrars eq complete and smon_ears eq complete and smon_o3msg eq complete and smon_o3knmi eq complete and smon_pwc eq complete and smon_temp eq complete and smon_iasi eq complete and smon_airs eq complete and smon_dbamv eq complete and smon_amv eq complete and smon_o3 eq complete and smon_dmsp eq complete and sm [...]
+      endfamily
+      task clean
+        trigger fb eq complete and ../18/clean eq complete
+        edit FSFAMILY 'an'
+      family verif
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/verif'
+        edit DELTA_DAY '1'
+        inlimit /limits:linux_cluster
+        time 09:00
+        family fc
+          task v12li1
+          task v12li2
+          task v12up1
+            trigger v12li1 eq complete
+          task v12up2
+            trigger v12up1 eq complete and v12li2 eq complete
+          task v12pl
+            trigger v12up2 eq complete
+          task v12memv
+            trigger v12up2 eq complete
+            edit DATEMASK '02.*.*'
+          task v12memb
+            trigger v12up2 eq complete
+            edit DATEMASK '11.*.*'
+          task v12upmv
+            trigger v12memv eq complete
+            edit DATEMASK '02.*.*'
+          task v12upmb
+            trigger v12memb eq complete
+            edit DATEMASK '11.*.*'
+          task v12crmv
+            edit DATEMASK '28.*.*'
+          task v12crmb
+            edit DATEMASK '28.*.*'
+          task v12crd
+            edit DATEMASK '28.*.*'
+        endfamily
+        family oc
+          trigger ./fc eq complete or ./fc eq aborted
+          task mk_dummy_fields
+            edit QUEUE 'emos'
+            edit USER 'emos'
+            edit PP_BASE '/pp1'
+            edit WSHOST 'pp1'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit LOGDIR '/pp1/log'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit SMSOUT '/vol/emos_nc/output'
+          task insert_fields
+            trigger mk_dummy_fields eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit PP_BASE '/pp1'
+            inlimit /limits:linux_cluster
+          task vbrli1
+            trigger insert_fields eq complete
+          task vbrli2
+            trigger vbrli1 eq complete
+          task vwali1
+            trigger insert_fields eq complete
+          task vwali2
+            trigger vwali1 eq complete
+          task vwali3
+            trigger vwali2 eq complete
+          task vofli
+            trigger insert_fields eq complete
+          task vtlli
+            trigger insert_fields eq complete
+          task vtoli
+            trigger insert_fields eq complete
+          task vmoli
+            trigger insert_fields eq complete
+          task vbrup1
+            trigger vbrli1 eq complete
+          task vbrup2
+            trigger vbrup1 eq complete and vbrli2 eq complete
+          task vwaup1
+            trigger vwali1 eq complete
+          task vwaup2
+            trigger vwaup1 eq complete and vwali2 eq complete
+          task vwaup3
+            trigger vwaup2 eq complete and vwali3 eq complete
+          task vofup
+            trigger vofli eq complete
+          task vtlup
+            trigger vtlli eq complete
+          task vtoup
+            trigger vtoli eq complete
+          task vmoup
+            trigger vmoli eq complete
+          task vmeli
+            trigger insert_fields eq complete
+          task vmeup
+            trigger vmeli eq complete
+          task voccrd
+            edit DATEMASK '28.*.*'
+          task voccrm
+            edit DATEMASK '28.*.*'
+          task vocmem
+            edit DATEMASK '11.*.*'
+          task vocupm
+            trigger vocmem eq complete
+            edit DATEMASK '11.*.*'
+          task cleanup
+            trigger vmeup eq complete and vbrup2 eq complete and vwaup3 eq complete and vofup eq complete and vtlup eq complete and vtoup eq complete and vmoup eq complete and voccrd eq complete and voccrm eq complete and vocupm eq complete
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+        endfamily
+        family cf
+          trigger oc eq complete or oc eq aborted
+          task vcnli1
+            late -c +02:00
+          task vcnli2
+          task vcnup1
+            trigger vcnli1 eq complete
+          task vcnup2
+            trigger vcnup1 eq complete and vcnli2 eq complete
+          task vcnpl
+            trigger vcnup2 eq complete
+          task vcncrd
+          task vcncrm
+            edit DATEMASK '28.*.*'
+          task vcnmem
+            trigger vcnup2 eq complete
+            edit DATEMASK '11.*.*'
+          task vcnupm
+            trigger vcnmem eq complete
+            edit DATEMASK '11.*.*'
+          task vcnli3
+          task vcnli4
+          task vcnup3
+            trigger vcnup2 eq complete and vcnli3 eq complete
+          task vcnup4
+            trigger vcnup3 eq complete and vcnli4 eq complete
+          task vcnmem2
+            trigger vcnup4 eq complete
+            edit DATEMASK '22.*.*'
+          task vcnupm2
+            trigger vcnmem2 eq complete
+            edit DATEMASK '22.*.*'
+        endfamily
+        family ob
+          trigger oc eq complete or oc eq aborted
+          time 05:00
+          family stage1
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          family stage2
+            trigger ./stage1 eq complete
+            edit EMOS_BASE '00'
+            task vobli1
+            task vobli2
+            task vobup1
+              trigger vobli1 eq complete
+            task vobup2
+              trigger vobup1 eq complete and vobli2 eq complete
+            task vobnobs
+              trigger vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobmem
+              trigger ./vobup2 eq complete
+              edit DATEMASK '03.*.*'
+            task vobupm
+              trigger vobmem eq complete
+              edit DATEMASK '03.*.*'
+          endfamily
+          task vobcrd
+            edit DATEMASK '28.*.*'
+          task vobcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family em
+          task vemli
+            late -c +02:00
+          task vemup
+            trigger vemli eq complete
+          task vemcrd
+            edit DATEMASK '28.*.*'
+          task vemcrm
+            edit DATEMASK '28.*.*'
+          task vemmem
+            trigger vemup eq complete
+            edit DATEMASK '11.*.*'
+          task vemupm
+            trigger vemmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family es
+          trigger em eq complete
+          task vesli
+            late -c +02:00
+          task vesup
+            trigger vesli eq complete
+          task vescrd
+            edit DATEMASK '28.*.*'
+          task vescrm
+            edit DATEMASK '28.*.*'
+          task vesmem
+            trigger vesup eq complete
+            edit DATEMASK '11.*.*'
+          task vesupm
+            trigger vesmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family cv
+          trigger es eq complete
+          task vcvli
+            late -c +02:00
+          task vcvup
+            trigger vcvli eq complete
+          task vcvcrd
+            edit DATEMASK '28.*.*'
+          task vcvcrm
+            edit DATEMASK '28.*.*'
+          task vcvmem
+            trigger vcvup eq complete
+            edit DATEMASK '11.*.*'
+          task vcvupm
+            trigger vcvmem eq complete
+            edit DATEMASK '11.*.*'
+        endfamily
+        family wv
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/00/fc/model eq complete)
+          task glver
+          task glupr
+            trigger glver eq complete
+          task glcrr
+            edit DATEMASK '28.*.*'
+          task ff10ver
+            trigger glver eq complete
+          task ff10upr
+            trigger ff10ver eq complete and glupr eq complete
+          task glmem
+            trigger ff10upr eq complete
+            edit DATEMASK '11.*.*'
+          task glupm
+            trigger glmem eq complete
+            edit DATEMASK '11.*.*'
+          task glcrm
+            edit DATEMASK '28.*.*'
+        endfamily
+        family sf
+          trigger fc eq complete or fc eq aborted
+          task vseli1
+          task vseli2
+          task vseup1
+            trigger vseli1 eq complete
+          task vseup2
+            trigger vseup1 eq complete and vseli2 eq complete
+          task vsecrd
+            edit DATEMASK '28.*.*'
+          task vsecrm
+            edit DATEMASK '28.*.*'
+          task vsemem
+            trigger vseup2 eq complete
+            edit DATEMASK '12.*.*'
+          task vseupm
+            trigger vsemem eq complete
+            edit DATEMASK '12.*.*'
+        endfamily
+      endfamily
+    endfamily
+    family 12bc
+      edit EMOS_BASE '12'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '0'
+      family verif
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/12/fc eq complete)
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/bcverif'
+        edit SCORE_STREAM 'BC_0046'
+        inlimit /limits:linux_cluster
+        task create_daily
+        task create_monthly
+          edit DATEMASK '28.*.*'
+        task clim
+          trigger create_daily eq complete
+        task non_clim
+          trigger create_daily eq complete
+        task clim_update
+          trigger clim eq complete
+        task non_clim_update
+          trigger non_clim eq complete and clim eq complete
+        task plot
+          trigger non_clim_update eq complete
+        task mean
+          trigger non_clim_update eq complete
+          edit DATEMASK '10.*.*'
+        task mean_update
+          trigger mean eq complete
+          edit DATEMASK '10.*.*'
+      endfamily
+    endfamily
+    family 18bc
+      edit EMOS_BASE '18'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '0'
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/18bc/an eq complete and ( ../../main/18bc/fc/model:step ge 90 or ../../main/18bc/fc/model eq complete))
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task ansfc
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          edit EDFAMILY 'true'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '9'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ./ansfc eq complete
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/18bc/an/4dvar/ifstraj:finaltraj or /e_36r1/main/18bc/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc024
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18bc/prod/024 eq complete)
+          edit STEPS '0/3/06/09/12/15/18/21/24'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc048
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18bc/prod/048 eq complete)
+          edit STEPS '27/30/33/36/39/42/45/48'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc072
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18bc/prod/072 eq complete)
+          edit STEPS '51/54/57/60/63/66/69/72'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc090
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18bc/prod/090 eq complete)
+          edit STEPS '75/78/81/84/87/90'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18bc/fc/model eq complete)
+          edit STEPS_SPECTRAL '6/12/18/24/30/36/42/48/54/60/66/72/78/84/90'
+          edit STEPS '0/6/12/18/24/30/36/42/48/54/60/66/72/78/84/90'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18bc/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'opebcan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/18bc/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      task clean
+        trigger fb eq complete
+        edit FSFAMILY 'an'
+      family verif
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/18bc/fc eq complete)
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/bcverif'
+        edit SCORE_STREAM 'BC_0046'
+        inlimit /limits:linux_cluster
+        task create_daily
+        task create_monthly
+          edit DATEMASK '28.*.*'
+        task clim
+          trigger create_daily eq complete
+        task non_clim
+          trigger create_daily eq complete
+        task clim_update
+          trigger clim eq complete
+        task non_clim_update
+          trigger non_clim eq complete and clim eq complete
+        task plot
+          trigger non_clim_update eq complete
+        task mean
+          trigger non_clim_update eq complete
+          edit DATEMASK '10.*.*'
+        task mean_update
+          trigger mean eq complete
+          edit DATEMASK '10.*.*'
+      endfamily
+    endfamily
+    family 00bc
+      edit EMOS_BASE '00'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '1'
+      family verif
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/00/fc eq complete)
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/bcverif'
+        edit SCORE_STREAM 'BC_0046'
+        inlimit /limits:linux_cluster
+        task create_daily
+        task create_monthly
+          edit DATEMASK '28.*.*'
+        task clim
+          trigger create_daily eq complete
+        task non_clim
+          trigger create_daily eq complete
+        task clim_update
+          trigger clim eq complete
+        task non_clim_update
+          trigger non_clim eq complete and clim eq complete
+        task plot
+          trigger non_clim_update eq complete
+        task mean
+          trigger non_clim_update eq complete
+          edit DATEMASK '10.*.*'
+        task mean_update
+          trigger mean eq complete
+          edit DATEMASK '10.*.*'
+      endfamily
+    endfamily
+    family 06bc
+      edit EMOS_BASE '06'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '6'
+      edit WINDOW_OFFSET_4D '3'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '1'
+      family archive
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../main/06bc/an eq complete and ( ../../main/06bc/fc/model:step ge 90 or ../../main/06bc/fc/model eq complete))
+        edit FSFAMILY 'mars'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/archive'
+        edit EMOS_TYPE 'an'
+        inlimit /limits:mars
+        inlimit /e_36r1/limits:mars
+        task ansfc
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anml
+          trigger ansfc:fdb or ansfc eq complete
+          edit EDFAMILY 'true'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          inlimit /e_36r1/limits:ml
+          label files ""
+          label info ""
+          event fdb
+        task anpl
+          trigger anml:fdb or anml eq complete
+          edit FCLENGTH '9'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anwave
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task anil
+          trigger anpl:fdb or anpl eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task derivedp
+          trigger ./ansfc eq complete
+          edit STEPS '0'
+          label files ""
+          label info ""
+          event fdb
+        family obs
+          edit FSFAMILY 'an'
+          inlimit /e_36r1/limits:obs
+          task highres
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            inlimit /limits:linux_cluster
+          task ai
+            trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ( /e_36r1/main/06bc/an/4dvar/ifstraj:finaltraj or /e_36r1/main/06bc/an/4dvar eq complete))
+            edit TYPE 'ai'
+            label files ""
+            label info ""
+            event fdb
+          task af
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'af'
+            label files ""
+            label info ""
+            event fdb
+          task fb
+            trigger ../../fb/feedback eq complete
+            edit TYPE 'fb'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task ice_nmc
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task sst
+          trigger ansfc:fdb or ansfc eq complete
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        family fc024
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06bc/prod/024 eq complete)
+          edit STEPS '0/3/06/09/12/15/18/21/24'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc048
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06bc/prod/048 eq complete)
+          edit STEPS '27/30/33/36/39/42/45/48'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc072
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06bc/prod/072 eq complete)
+          edit STEPS '51/54/57/60/63/66/69/72'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family fc090
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06bc/prod/090 eq complete)
+          edit STEPS '75/78/81/84/87/90'
+          edit EMOS_TYPE 'fc'
+          task fcsfc
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcml
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            inlimit /e_36r1/limits:ml
+            label files ""
+            label info ""
+            event fdb
+          task fcpl
+            trigger fcsfc:fdb or fcsfc eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task fcil
+            trigger fcpl:fdb or fcpl eq complete
+            inlimit /limits:mars
+            inlimit /e_36r1/limits:mars
+            label files ""
+            label info ""
+            event fdb
+          task derivedp
+            trigger fcil:fdb or fcil eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        task fc12g
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06bc/fc/model eq complete)
+          edit STEPS_SPECTRAL '6/12/18/24/30/36/42/48/54/60/66/72/78/84/90'
+          edit STEPS '0/6/12/18/24/30/36/42/48/54/60/66/72/78/84/90'
+          inlimit /limits:mars
+          inlimit /e_36r1/limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task rmfdb
+          trigger ansfc eq complete and anml eq complete and anpl eq complete and anwave eq complete and obs eq complete
+      endfamily
+      family fb
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06bc/an eq complete)
+        edit FSFAMILY 'an'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/fb'
+        task sync_rstrhbias
+          edit SMSFILES '/home/ma/emos/def/e_36r1/smsfiles'
+        task biassave
+          trigger sync_rstrhbias eq complete
+        family feedback
+          edit ACCOUNT 'opebcan'
+          edit NPES '8'
+          edit FBNEW2OLD '1'
+          edit LCONV '1'
+          edit LSATOB '1'
+          edit LREO3 '1'
+          edit LAEOLUS '0'
+          edit LSSMI '1'
+          edit LSSMIS '1'
+          edit LAMSRE '1'
+          edit LTMI '1'
+          edit LHIRS '1'
+          edit LMSU '1'
+          edit LSSU '1'
+          edit LAMSUA '1'
+          edit LAMSUB '1'
+          edit LMHS '1'
+          edit LGEOS '1'
+          edit LSCAT '1'
+          edit LAIRS '1'
+          edit LVTPR1 '0'
+          edit LVTPR2 '0'
+          edit LGPSRO '1'
+          edit LIASI '1'
+          edit LMERIS '1'
+          task revmatchup
+            edit NPES '128'
+            edit THREADS '2'
+          task matchup
+            trigger revmatchup eq complete
+            edit NPES '128'
+            edit THREADS '2'
+          task odbcmp_prepare
+            edit THREADS '1'
+            edit NPES '1'
+            edit MEM '1000'
+            edit CPUTIME '1000'
+            edit PRIORITY '90'
+          family odb_compress
+            trigger odbcmp_prepare eq complete and matchup eq complete
+            edit THREADS '2'
+            edit NPES '1'
+            task odbcmp_conv
+            task odbcmp_surf_conv
+            task odbcmp_airs
+            task odbcmp_iasi
+            task odbcmp_hirs
+            task odbcmp_msu
+            task odbcmp_ssu
+            task odbcmp_amsua
+            task odbcmp_amsub
+            task odbcmp_mhs
+            task odbcmp_satob
+            task odbcmp_reo3
+            task odbcmp_ssmi
+            task odbcmp_ssmis
+            task odbcmp_amsre
+            task odbcmp_tmi
+            task odbcmp_scatt
+            task odbcmp_geos
+            task odbcmp_gpsro
+            task odbcmp_meris
+          endfamily
+          family odb2bufr
+            trigger matchup eq complete
+            edit NPES '1'
+            edit SUBTYPES_INCLUDE ''
+            edit SUBTYPES_EXCLUDE ''
+            task o2b_conv
+              edit SUBTYPES_EXCLUDE '85 82 83 87'
+              edit NPES '2'
+            task o2b_surf_conv
+              edit SUBTYPES_EXCLUDE '142 143 144 145 85 82 83 87'
+              edit NPES '2'
+            task o2b_airs
+              edit SUBTYPES_INCLUDE '57'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_iasi
+              edit SUBTYPES_INCLUDE '240'
+              edit NPES '8'
+              edit THREADS '2'
+            task o2b_hirs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_msu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_ssu
+              edit SUBTYPES_INCLUDE '54 55'
+            task o2b_amsua
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_amsub
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_mhs
+              edit SUBTYPES_INCLUDE '54 55'
+              edit NPES '2'
+            task o2b_satob
+              edit SUBTYPES_INCLUDE '82 83 87'
+              edit NPES '2'
+            task o2b_reo3
+              edit SUBTYPES_INCLUDE '205 206 207 208 215'
+              edit NPES '4'
+              edit THREADS '2'
+            task o2b_ssmi
+              edit SUBTYPES_INCLUDE '55 127'
+            task o2b_ssmis
+              edit SUBTYPES_INCLUDE '49'
+            task o2b_amsre
+              edit SUBTYPES_INCLUDE '59'
+            task o2b_tmi
+              edit SUBTYPES_INCLUDE '129'
+            task o2b_scatt
+              edit SUBTYPES_INCLUDE '122 137 139'
+            task o2b_geos
+              edit SUBTYPES_INCLUDE '189 89 76 77 78'
+              edit NPES '2'
+            task o2b_gpsro
+              edit SUBTYPES_INCLUDE '250'
+            task o2b_meris
+              edit SUBTYPES_INCLUDE '212'
+          endfamily
+          task mergebufr
+            trigger odb2bufr eq complete
+        endfamily
+        family obstat
+          trigger feedback/odb2bufr eq complete
+          edit NPES '1'
+          task obstat_conv
+          task obstat_surf_conv
+          task obstat_airs
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_iasi
+            edit NPES '8'
+            edit THREADS '2'
+          task obstat_hirs
+            edit NPES '4'
+          task obstat_msu
+          task obstat_ssu
+          task obstat_amsua
+            edit NPES '2'
+          task obstat_amsub
+          task obstat_mhs
+          task obstat_satob
+          task obstat_reo3
+          task obstat_ssmi
+            edit NPES '2'
+          task obstat_ssmis
+            edit NPES '2'
+          task obstat_amsre
+            edit NPES '2'
+          task obstat_tmi
+            edit NPES '2'
+          task obstat_scatt
+          task obstat_geos
+            edit NPES '2'
+          task obstat_gpsro
+            edit NPES '2'
+          task obstat_meris
+            edit NPES '2'
+        endfamily
+        task fdbksave
+          trigger feedback eq complete and obstat eq complete
+        task clean_odbcmp
+          trigger feedback eq complete and obstat eq complete and fdbksave eq complete
+        task wavesave
+          trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and ../../../main/06bc/an/4dvar eq complete)
+        task obstat_merge
+          trigger obstat eq complete
+          edit WSHOST 'bee01'
+          edit PRIORITY '51'
+      endfamily
+      task clean
+        trigger fb eq complete
+        edit FSFAMILY 'an'
+      family verif
+        trigger ( /e_36r1/main:YMD gt /e_36r1/lag:YMD) or ( /e_36r1/main:YMD eq /e_36r1/lag:YMD and /e_36r1/main/06bc/fc eq complete)
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/e_36r1/bcverif'
+        edit SCORE_STREAM 'BC_0046'
+        inlimit /limits:linux_cluster
+        task create_daily
+        task create_monthly
+          edit DATEMASK '28.*.*'
+        task clim
+          trigger create_daily eq complete
+        task non_clim
+          trigger create_daily eq complete
+        task clim_update
+          trigger clim eq complete
+        task non_clim_update
+          trigger non_clim eq complete and clim eq complete
+        task plot
+          trigger non_clim_update eq complete
+        task mean
+          trigger non_clim_update eq complete
+          edit DATEMASK '10.*.*'
+        task mean_update
+          trigger mean eq complete
+          edit DATEMASK '10.*.*'
+      endfamily
+    endfamily
+    task checkarchive
+      trigger ./06 eq complete and ./12 eq complete and ./12dc eq complete and ./18 eq complete and ./00 eq complete and ./00dc eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FSFAMILY 'mars'
+      edit EMOS_TYPE 'an'
+      edit OSTREAN 'DCDA DCWV'
+      edit WSHOST 'linux_cluster'
+      inlimit /limits:linux_cluster
+    task checkarchivebc
+      trigger ./18bc eq complete and ./06bc eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit STREAM 'SCDA'
+      edit FSFAMILY 'mars'
+      edit EMOS_TYPE 'an'
+      edit WSTREAN 'DCDA DCWV'
+      edit WSHOST 'linux_cluster'
+      inlimit /limits:linux_cluster
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'lag'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger /e_36r1/main/make eq complete and ./00dc eq complete and ./06 eq complete and ./12 eq complete and ./12dc eq complete and ./18 eq complete and ./00 eq complete and ./12bc eq complete and ./18bc eq complete and ./00bc eq complete and ./06bc eq complete and checkarchive eq complete and checkarchivebc eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'lag'
+      edit MOVE_TO_ECFS 'no'
+      time 11:45
+  endfamily
+  family verify
+    repeat date YMD 20091118 20121212 1
+    edit VERIFY 'verify_test'
+    edit UPDATE_WEB_NOW 'yes'
+    edit SMSFILES '/home/ma/emos/def/e_36r1/verify'
+    edit FORECAST_DELTA '1'
+    edit RUN_PARALLEL '0'
+    edit EXPVERV '0046'
+    edit EXPVERP '0046'
+    edit EXPVERF '0046'
+    edit CLASSV 'od'
+    edit CLASSP 'od'
+    edit CLASSF 'od'
+    edit QUEUE 'emos-e'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit SMSOUT '/vol/emos_nc/output'
+    inlimit /limits:mars
+    inlimit /limits:linux_cluster
+    family 12
+      edit EMOS_BASE '12'
+      family forecast
+        trigger ( /e_36r1/lag:YMD gt /e_36r1/verify:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/verify:YMD and ../../lag/12/archive eq complete)
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SCORE_STREAM '36r1_0046'
+        edit OPER_STREAM 'OPER'
+        edit INDEX_SIZE '102400'
+        inlimit /limits:linux_cluster
+        task create_score
+        family clim_levels
+          trigger create_score eq complete
+          task fc_clim_levels
+          task update_score
+            trigger fc_clim_levels eq complete
+        endfamily
+        family non_clim_levels
+          trigger create_score eq complete
+          task fc_non_clim_levels
+          task update_score
+            trigger fc_non_clim_levels eq complete and ../clim_levels eq complete
+        endfamily
+        family others
+          trigger create_score eq complete
+          task fc_others
+          task update_score
+            trigger fc_others eq complete and ../non_clim_levels eq complete
+        endfamily
+      endfamily
+      family observations
+        trigger forecast eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit FORECAST_DELTA '3'
+        edit SCORE_STREAM '36r1_0046_OB'
+        edit OPER_STREAM 'O_ECMWF'
+        edit INDEX_SIZE '102400'
+        inlimit /limits:linux_cluster
+        task create_score
+        family clim_levels
+          trigger create_score eq complete
+          task ob_clim_levels
+          task update_score
+            trigger ob_clim_levels eq complete
+        endfamily
+        family non_clim_levels
+          trigger create_score eq complete
+          task ob_non_clim_levels
+          task update_score
+            trigger ob_non_clim_levels eq complete and ../clim_levels eq complete
+        endfamily
+      endfamily
+      family waves
+        trigger forecast eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit INDEX_SIZE '102400'
+        edit SCORE_STREAM '36r1_0046_WV'
+        edit OPER_STREAM 'WAVE_G'
+        inlimit /limits:linux_cluster
+        family height
+          edit STREAM 'WV'
+          task create_score
+          task wv_height
+            trigger create_score eq complete
+          task update_score
+            trigger wv_height eq complete
+        endfamily
+        family wind
+          trigger height eq complete
+          task wv_wind_all
+          task update_score
+            trigger wv_wind_all eq complete
+        endfamily
+        family wind_over_sea
+          trigger wind eq complete
+          edit INDEX_SIZE '102400'
+          edit SCORE_STREAM '36r1_0046_WV_SEA'
+          task create_score
+          task wv_wind_sea
+            trigger create_score eq complete
+          task update_score
+            trigger wv_wind_sea eq complete
+        endfamily
+      endfamily
+    endfamily
+    family 00
+      trigger ./12 eq complete
+      edit EMOS_BASE '00'
+      family forecast
+        trigger ( /e_36r1/lag:YMD gt /e_36r1/verify:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/verify:YMD and ../../lag/00/archive eq complete)
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SCORE_STREAM '36r1_0046'
+        edit OPER_STREAM 'OPER'
+        edit INDEX_SIZE '102400'
+        inlimit /limits:linux_cluster
+        task create_score
+        family clim_levels
+          trigger create_score eq complete
+          task fc_clim_levels
+          task update_score
+            trigger fc_clim_levels eq complete
+        endfamily
+        family non_clim_levels
+          trigger create_score eq complete
+          task fc_non_clim_levels
+          task update_score
+            trigger fc_non_clim_levels eq complete and ../clim_levels eq complete
+        endfamily
+        family others
+          trigger create_score eq complete
+          task fc_others
+          task update_score
+            trigger fc_others eq complete and ../non_clim_levels eq complete
+        endfamily
+      endfamily
+      family observations
+        trigger forecast eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit FORECAST_DELTA '3'
+        edit SCORE_STREAM '36r1_0046_OB'
+        edit OPER_STREAM 'O_ECMWF'
+        edit INDEX_SIZE '102400'
+        inlimit /limits:linux_cluster
+        task create_score
+        family clim_levels
+          trigger create_score eq complete
+          task ob_clim_levels
+          task update_score
+            trigger ob_clim_levels eq complete
+        endfamily
+        family non_clim_levels
+          trigger create_score eq complete
+          task ob_non_clim_levels
+          task update_score
+            trigger ob_non_clim_levels eq complete and ../clim_levels eq complete
+        endfamily
+      endfamily
+      family waves
+        trigger forecast eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit INDEX_SIZE '102400'
+        edit SCORE_STREAM '36r1_0046_WV'
+        edit OPER_STREAM 'WAVE_G'
+        inlimit /limits:linux_cluster
+        family height
+          edit STREAM 'WV'
+          task create_score
+          task wv_height
+            trigger create_score eq complete
+          task update_score
+            trigger wv_height eq complete
+        endfamily
+        family wind
+          trigger height eq complete
+          task wv_wind_all
+          task update_score
+            trigger wv_wind_all eq complete
+        endfamily
+        family wind_over_sea
+          trigger wind eq complete
+          edit INDEX_SIZE '102400'
+          edit SCORE_STREAM '36r1_0046_WV_SEA'
+          task create_score
+          task wv_wind_sea
+            trigger create_score eq complete
+          task update_score
+            trigger wv_wind_sea eq complete
+        endfamily
+      endfamily
+    endfamily
+    family plot
+      trigger ./00 eq complete and ./12 eq complete
+      edit WSHOST 'linux_cluster'
+      edit QUEUE 'serial'
+      limit plot 3
+      inlimit plot
+      family forecast
+        edit SCORE_STREAM '36r1_0046'
+        edit OPER_STREAM 'OPER'
+        edit FORECAST_DELTA '1'
+        task fc_scocom
+        task fc_scocat
+        task fc_pltime
+        task fc_error
+      endfamily
+      family observations
+        edit SCORE_STREAM '36r1_0046_OB'
+        edit OPER_STREAM 'O_ECMWF'
+        edit FORECAST_DELTA '3'
+        task ob_scocom
+        task ob_scocat
+        task ob_pltime
+        task ob_error
+      endfamily
+      family waves
+        edit SCORE_STREAM '36r1_0046_WV'
+        edit OPER_STREAM 'WAVE_G'
+        edit FORECAST_DELTA '1'
+        task wv_scocom
+        task wv_scocat
+        task wv_pltime
+        task wv_error
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'verify'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./00 eq complete and ./12 eq complete and plot eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'verify'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGSTOECFS 'no'
+      time 11:45
+  endfamily
+  family pop
+    repeat date YMD 20091118 20121212 1
+    edit VERIFY 'verify_test'
+    edit QUEUE 'emos-e'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit SMSOUT '/vol/emos_nc/output'
+    edit METVIEW '/usr/local/share/metview'
+    inlimit /limits:linux_cluster
+    family 00
+      edit EMOS_BASE '00'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '1'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/pop'
+      family data
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/'
+        family fields
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00/fc/model eq complete)
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit STEP_LIST '12/to/240/by/12'
+          inlimit /e_36r1/limits:webplots
+          task z500
+          task mslp
+          task mslp_gg
+          task t850
+          task rain
+          task t2m
+          task w30m
+          task cloud
+          task waves
+          task rainp
+          task w10m
+          task wind
+            edit STEP_LIST '24/to/240/by/24'
+          task rh
+            edit STEP_LIST '24/to/240/by/24'
+          task vorticity
+            edit STEP_LIST '24/to/240/by/24'
+          task divergence
+            edit STEP_LIST '24/to/240/by/24'
+        endfamily
+        family metgram
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00/fc/model eq complete and /mc/main/00/legA/fc eq complete)
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit RHOST 'epsgrams'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/plot/metgram'
+          inlimit /limits:linux_cluster
+          task metret
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00/fc/model eq complete )
+          task metclean
+            trigger metret eq complete
+            edit DELTA_DAY '-2'
+          family fc
+            edit KIND 'metgram_fc'
+            edit ENSEMBLES '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/pop/data/epsgrams/grams'
+            task gclean
+              edit REMOTE_KEEP_DAYS '3'
+              edit KEEP_DAYS '3'
+            task gdb
+              trigger gclean eq complete
+              label files ""
+              label info ""
+              event 1 
+              event fdb
+            task glink
+              trigger gdb eq complete
+          endfamily
+        endfamily
+        family bufr
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/data/bufr'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task feedback
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/00/archive/obs eq complete)
+        endfamily
+      endfamily
+      family web
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+        family fc
+          trigger ../data/fields eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          inlimit /e_36r1/limits:webplots
+          family members
+            edit PLOT_AREAS 'Europe,North_America,South_America,Asia,Australia,Africa'
+            edit PLOT_STEPS '0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,204,216,228,240'
+            edit PLOT_LEGS '1'
+            task w_z500t850
+            task w_mslrain
+            task w_t2m30mw
+            task w_clouds
+            task w_waves
+              edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+            task w_mwp
+              edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+          endfamily
+          family additional
+            edit PLOT_AREAS 'Europe,North_America,South_America,Asia,Australia,Africa,North_Hemisphere,South_Hemisphere'
+            edit PLOT_STEPS '0,24,48,72,96,120,144,168'
+            task w_uv_rh
+            task w_msl_uv200
+            task w_z500t850_gts
+              edit PLOT_STEPS '0,24,48,72,96,120,144,168,192,216,240'
+            task w_vordir
+              edit PLOT_STEPS '0,24,48,72,96,120,144'
+            family wmo_swh_dir
+              edit PLOT_STEPS '0,24,48,72,96,120,144,168'
+              edit PLOT_AREAS 'Global'
+              edit PLOT_TYPE '_wmo'
+              task w_waves
+            endfamily
+            family wmo_mwp_dir
+              edit PLOT_STEPS '0,24,48,72,96,120,144,168'
+              edit PLOT_AREAS 'Global'
+              edit PLOT_TYPE '_wmo'
+              task w_mwp
+            endfamily
+          endfamily
+          family essential
+            edit PLOT_AREAS 'Europe,North_America,South_America,Asia,Australia,Africa,North_Hemisphere,South_Hemisphere'
+            edit PLOT_STEPS '72,96,120,144,168,192,216,240'
+            task public_plots
+          endfamily
+          task web_update
+            trigger members eq complete and additional eq complete and essential eq complete
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            edit PACKAGES 'esuite'
+            inlimit /e_36r1/limits:webplots
+        endfamily
+        family satim
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+          edit UPDATE_WEB_NOW 'no'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit PLOT_AREAS 'Europe,North_America,South_America,Africa,Indian_Ocean,Australia,West_Pacific,East_Pacific'
+          task w_simulated
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/00/satim eq complete)
+          task web_update
+            trigger ./w_simulated eq complete and ../fc eq complete
+            edit PACKAGES 'esuite'
+        endfamily
+        family an
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00/fc/model eq complete)
+          edit SMSFILES '/home/ma/emos/def/e_36r1/plot/plot240'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          inlimit /e_36r1/limits:webplots
+          task w_albedo
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00/fc/model eq complete and ../../data/fields eq complete)
+            edit WEEKDAY 'tuesday'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web/'
+          task psst
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            inlimit /e_36r1/limits:webplots
+          task psw123
+          task web_update
+            trigger w_albedo eq complete and psst eq complete and psw123 eq complete
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            edit PACKAGES 'esuite'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web/'
+            inlimit /e_36r1/limits:webplots
+        endfamily
+        family monitoring
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task w_coverage
+            trigger /e_36r1/pop/00/data/bufr eq complete
+          task w_tscover
+            time 07:10
+          task w_guan
+            edit DATEMASK '03.*.*'
+        endfamily
+        family cloudsat
+          trigger fc eq complete
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit PLOT_AREAS 'South_Atlantic,Pacific,Indian'
+          edit PLOT_STEPS '0,12,24,36,48,60,72,84,96,108,120,132,144,156,168'
+          task csat_clouds
+          task csat_waves
+          task csat_wind
+        endfamily
+        family amma
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web/amma'
+          family monitoring
+            edit UPDATE_WEB_NOW 'yes'
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit WSHOST 'linux_cluster'
+            inlimit /limits:linux_cluster
+            time 10:00
+            task amma_cover
+              edit DATEMASK '03.*.*'
+            task amma_pilot
+              edit DATEMASK '03.*.*'
+            task amma_rs
+              edit DATEMASK '03.*.*'
+            task amma_tephigram
+              edit METVIEW '/usr/local/share/metview_old'
+          endfamily
+          family fc
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00/fc/model eq complete)
+            edit UPDATE_WEB_NOW 'yes'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'serial'
+            edit PLOTDOM '-30/-35/45/40'
+            time 09:30
+            task satplot
+              edit STEPS '00/06/12/15/18/24/30/36/39/42/48'
+            task maps
+              edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120'
+            task tephi
+              edit METVIEW '/usr/local/share/metview_old'
+              edit STEPS '00/06/12/18/24/30/36/42/48/54/60/66/72'
+            task trajectories
+              edit STEPS '24/48/72'
+            task cross
+              edit STEPS '00/06/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120'
+            task hovm
+              edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120/126/132/138/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+            task obs_mslp
+            task metgram
+            task prob
+              edit STEPS '60/72/84/96/108/120/132/144/156/168/180/192/204/216/228/240'
+          endfamily
+        endfamily
+        family swdfp
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00/fc/model eq complete)
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web/swdfp'
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'serial'
+          edit PLOTDOM '-45/-10/6/62'
+          time 10:30
+          family maps
+            edit PLOT_LOCATION '/webplots_e/data/swdfp/maps'
+            edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+            task swdfp_maps
+            task smaps_toweb1
+              trigger swdfp_maps eq complete
+            task smaps_toweb2
+              trigger swdfp_maps eq complete
+            task smaps_toweb3
+              trigger swdfp_maps eq complete
+            task swdfp_clean
+              trigger smaps_toweb1 eq complete and smaps_toweb2 eq complete and smaps_toweb3 eq complete
+          endfamily
+          task swdfp_satplot
+            edit STEPS '00/06/12/15/18/24/30/36/39/42/48'
+          task swdfp_tephi
+            edit METVIEW '/usr/local/share/metview_old'
+            edit STEPS '00/06/12/18/24/30/36/42/48/54/60/66/72'
+          task swdfp_obs_mslp
+            edit PLOTDOM '-37/3/-3/55'
+          task swdfp_metgram
+        endfamily
+      endfamily
+      family paper
+        task pobstat
+          trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/00/fb/obstat_merge eq complete)
+          edit FSFAMILY 'an'
+          edit WSHOST 'linux_cluster'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+      endfamily
+      task cleanup
+        trigger web eq complete
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        inlimit /e_36r1/limits:webplots
+    endfamily
+    family 12
+      edit EMOS_BASE '12'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/pop'
+      family proc
+        edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+        task buoycol
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12/obs eq complete)
+          edit FSFAMILY 'fc'
+      endfamily
+      family data
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/'
+        family fields
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12/fc/model eq complete)
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit STEP_LIST '12/to/240/by/12'
+          inlimit /e_36r1/limits:webplots
+          task z500
+          task mslp
+          task mslp_gg
+          task t850
+          task rain
+          task t2m
+          task w30m
+          task cloud
+          task waves
+          task rainp
+          task w10m
+          task wind
+            edit STEP_LIST '24/to/240/by/24'
+          task rh
+            edit STEP_LIST '24/to/240/by/24'
+          task vorticity
+            edit STEP_LIST '24/to/240/by/24'
+          task divergence
+            edit STEP_LIST '24/to/240/by/24'
+        endfamily
+        family metgram
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12/fc/model eq complete and /mc/main/12/legA/fc eq complete)
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit RHOST 'epsgrams'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/plot/metgram'
+          inlimit /limits:linux_cluster
+          task metret
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12/fc/model eq complete )
+          task metclean
+            trigger metret eq complete
+            edit DELTA_DAY '-3'
+          family fc
+            edit KIND 'metgram_fc'
+            edit ENSEMBLES '0'
+            edit SMSFILES '/home/ma/emos/def/e_36r1/pop/data/epsgrams/grams'
+            task gclean
+              edit REMOTE_KEEP_DAYS '3'
+              edit KEEP_DAYS '3'
+            task gdb
+              trigger gclean eq complete
+              label files ""
+              label info ""
+              event 1 
+              event fdb
+            task glink
+              trigger gdb eq complete
+          endfamily
+        endfamily
+        family bufr
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/data/bufr'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task feedback
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/12/archive/obs eq complete)
+        endfamily
+      endfamily
+      family web
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+        family fc
+          trigger ../data/fields eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          inlimit /e_36r1/limits:webplots
+          family members
+            edit PLOT_AREAS 'Europe,North_America,South_America,Asia,Australia,Africa'
+            edit PLOT_STEPS '0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,204,216,228,240'
+            edit PLOT_LEGS '1'
+            task w_z500t850
+            task w_mslrain
+            task w_t2m30mw
+            task w_clouds
+            task w_waves
+              edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+            task w_mwp
+              edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+          endfamily
+          family additional
+            edit PLOT_AREAS 'Europe,North_America,South_America,Asia,Australia,Africa,North_Hemisphere,South_Hemisphere'
+            edit PLOT_STEPS '0,24,48,72,96,120,144,168'
+            task w_uv_rh
+            task w_msl_uv200
+            task w_z500t850_gts
+              edit PLOT_STEPS '0,24,48,72,96,120,144,168,192,216,240'
+            task w_vordir
+              edit PLOT_STEPS '0,24,48,72,96,120,144'
+            family wmo_swh_dir
+              edit PLOT_STEPS '0,24,48,72,96,120,144,168'
+              edit PLOT_AREAS 'Global'
+              edit PLOT_TYPE '_wmo'
+              task w_waves
+            endfamily
+            family wmo_mwp_dir
+              edit PLOT_STEPS '0,24,48,72,96,120,144,168'
+              edit PLOT_AREAS 'Global'
+              edit PLOT_TYPE '_wmo'
+              task w_mwp
+            endfamily
+          endfamily
+          family essential
+            edit PLOT_AREAS 'Europe,North_America,South_America,Asia,Australia,Africa,North_Hemisphere,South_Hemisphere'
+            edit PLOT_STEPS '72,96,120,144,168,192,216,240'
+            task public_plots
+          endfamily
+          task web_update
+            trigger members eq complete and additional eq complete and essential eq complete
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            edit PACKAGES 'esuite'
+            inlimit /e_36r1/limits:webplots
+        endfamily
+        family satim
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+          edit UPDATE_WEB_NOW 'no'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit PLOT_AREAS 'Europe,North_America,South_America,Africa,Indian_Ocean,Australia,West_Pacific,East_Pacific'
+          task w_simulated
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/12/satim eq complete)
+          task web_update
+            trigger ./w_simulated eq complete and ../fc eq complete
+            edit PACKAGES 'esuite'
+        endfamily
+        family verification
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web/verification'
+          edit UPDATE_WEB_NOW 'yes'
+          family monthly
+            edit DATEMASK '11.*.*'
+            task w_2t
+            task w_cloud_humid
+            task w_preci
+            task w_scores
+            task w_scores_mean
+            task w_wmomeans
+            task w_pltime_waves
+          endfamily
+          family daily
+            trigger /e_36r1/lag/12/verif/oc eq complete
+            task w_allcentres
+            task w_weekly_centres
+              trigger w_allcentres eq complete
+              edit WEEKDAY 'monday'
+          endfamily
+        endfamily
+        family monitoring
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task w_coverage
+            trigger /e_36r1/pop/12/data/bufr eq complete
+        endfamily
+        family cloudsat
+          trigger fc eq complete
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit PLOT_AREAS 'South_Atlantic,Pacific,Indian'
+          edit PLOT_STEPS '0,12,24,36,48,60,72,84,96,108,120,132,144,156,168'
+          task csat_clouds
+          task csat_waves
+          task csat_wind
+        endfamily
+        family amma
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web/amma'
+          family fc
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12/fc/model eq complete)
+            edit UPDATE_WEB_NOW 'yes'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'serial'
+            edit PLOTDOM '-30/-35/45/40'
+            time 00:30
+            task satplot
+              edit STEPS '00/06/12/15/18/24/30/36/39/42/48'
+            task maps
+              edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120'
+            task tephi
+              edit METVIEW '/usr/local/share/metview_old'
+              edit STEPS '00/06/12/18/24/30/36/42/48/54/60/66/72'
+            task trajectories
+              edit STEPS '24/48/72'
+            task cross
+              edit STEPS '00/06/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120'
+            task hovm
+              edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120/126/132/138/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+            task obs_mslp
+            task metgram
+            task prob
+              edit STEPS '60/72/84/96/108/120/132/144/156/168/180/192/204/216/228/240'
+          endfamily
+        endfamily
+        family swdfp
+          trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12/fc/model eq complete)
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web/swdfp'
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'serial'
+          edit PLOTDOM '-45/-10/6/62'
+          time 01:30
+          family maps
+            edit PLOT_LOCATION '/webplots_e/data/swdfp/maps'
+            edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+            task swdfp_maps
+            task smaps_toweb1
+              trigger swdfp_maps eq complete
+            task smaps_toweb2
+              trigger swdfp_maps eq complete
+            task smaps_toweb3
+              trigger swdfp_maps eq complete
+            task swdfp_clean
+              trigger smaps_toweb1 eq complete and smaps_toweb2 eq complete and smaps_toweb3 eq complete
+          endfamily
+          task swdfp_satplot
+            edit STEPS '00/06/12/15/18/24/30/36/39/42/48'
+          task swdfp_tephi
+            edit METVIEW '/usr/local/share/metview_old'
+            edit STEPS '00/06/12/18/24/30/36/42/48/54/60/66/72'
+          task swdfp_obs_mslp
+            edit PLOTDOM '-37/3/-3/55'
+          task swdfp_metgram
+        endfamily
+      endfamily
+      family paper
+        task pobstat
+          trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/12/fb/obstat_merge eq complete)
+          edit FSFAMILY 'an'
+          edit WSHOST 'linux_cluster'
+          edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+      endfamily
+      family verify
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/verify'
+        family consistency
+          edit ECFS_OPTIONS '-o'
+          edit ECMWF 'ECMWF24'
+          edit BRACKNELL 'BRAKL24'
+          edit OFFENBACH 'OFFNB24'
+          edit WASHINGTON 'WASHN24'
+          edit DATEMASK '02.*.*'
+          task create_daily_files
+            edit DATEMASK '02.*.*'
+          task create_monthly_files
+            trigger create_daily_files eq complete
+            edit DATEMASK '02.01.*'
+          task ecmwf
+            trigger create_monthly_files eq complete
+            edit DATEMASK '02.*.*'
+          task bracknell
+            trigger create_monthly_files eq complete
+            edit DATEMASK '02.*.*'
+          task offenbach
+            trigger create_monthly_files eq complete
+            edit DATEMASK '02.*.*'
+          task washington
+            trigger create_monthly_files eq complete
+            edit DATEMASK '02.*.*'
+        endfamily
+      endfamily
+      task cleanup
+        trigger web eq complete
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        inlimit /e_36r1/limits:webplots
+    endfamily
+    family 00dc
+      edit EMOS_BASE '00'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/pop'
+      family web
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+        family an
+          task pincr
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00dc/an eq complete)
+            edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+            edit UPDATE_WEB_NOW 'yes'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            inlimit /e_36r1/limits:webplots
+        endfamily
+        family monitoring
+          edit UPDATE_WEB_NOW 'yes'
+          family satmon
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            inlimit /limits:linux_cluster
+            task satmon
+              trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/00dc/satmon eq complete)
+            family airs
+              trigger satmon eq complete
+              edit SATELLITE 'airs'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family noaa
+              trigger satmon eq complete
+              edit SATELLITE 'noaa'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family ears
+              trigger satmon eq complete
+              edit SATELLITE 'ears'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family geos
+              trigger satmon eq complete
+              edit SATELLITE 'geos'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family o3
+              trigger satmon eq complete
+              edit SATELLITE 'o3'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family o3knmi
+              trigger satmon eq complete
+              edit SATELLITE 'o3knmi'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family temp
+              trigger satmon eq complete
+              edit SATELLITE 'temp'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family pwc
+              trigger satmon eq complete
+              edit SATELLITE 'pwc'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family amv_speed
+              trigger satmon eq complete
+              edit SATELLITE 'amv_speed'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family dmsp
+              trigger satmon eq complete
+              edit SATELLITE 'dmsp'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family gpsro
+              trigger satmon eq complete
+              edit SATELLITE 'gpsro'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family tmi
+              trigger satmon eq complete
+              edit SATELLITE 'tmi'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family ssmis
+              trigger satmon eq complete
+              edit SATELLITE 'ssmis'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family amsre
+              trigger satmon eq complete
+              edit SATELLITE 'amsre'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family iasi
+              trigger satmon eq complete
+              edit SATELLITE 'iasi'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family pacrars
+              trigger satmon eq complete
+              edit SATELLITE 'pacrars'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family dbamv_speed
+              trigger satmon eq complete
+              edit SATELLITE 'dbamv_speed'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family meris
+              trigger satmon eq complete
+              edit SATELLITE 'meris'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family scatt_speed
+              trigger satmon eq complete
+              edit SATELLITE 'scatt_speed'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            family slmoist
+              trigger satmon eq complete
+              edit SATELLITE 'slmoist'
+              inlimit /e_36r1/limits:satmon
+              task w_satmon
+                edit PLOTALL 'true'
+                edit PLOTGEO 'false'
+              task w_satmon_geo
+                edit WEEKDAY 'saturday'
+                edit PLOTALL 'false'
+                edit PLOTGEO 'true'
+            endfamily
+            task web_daily
+              trigger airs eq complete and noaa eq complete and ears eq complete and geos eq complete and o3 eq complete and o3knmi eq complete and temp eq complete and pwc eq complete and amv_speed eq complete and dmsp eq complete and gpsro eq complete and tmi eq complete and ssmis eq complete and amsre eq complete and iasi eq complete and pacrars eq complete and dbamv_speed eq complete and meris eq complete and scatt_speed eq complete and slmoist eq complete
+            task web_weekly
+              trigger airs eq complete and noaa eq complete and ears eq complete and geos eq complete and o3 eq complete and o3knmi eq complete and temp eq complete and pwc eq complete and amv_speed eq complete and dmsp eq complete and gpsro eq complete and tmi eq complete and ssmis eq complete and amsre eq complete and iasi eq complete and pacrars eq complete and dbamv_speed eq complete and meris eq complete and scatt_speed eq complete and slmoist eq complete
+              edit WEEKDAY 'saturday'
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+    family 06dc
+      edit EMOS_BASE '06'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/pop'
+      family data
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/'
+        family bufr
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/data/bufr'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task feedback
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/00dc/archive/obs eq complete)
+        endfamily
+      endfamily
+      family web
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+        family an
+          task pincr
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/00dc/an eq complete and /e_36r1/pop/00dc/web/an/pincr eq complete)
+            edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+            edit UPDATE_WEB_NOW 'yes'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            inlimit /e_36r1/limits:webplots
+        endfamily
+        family monitoring
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task w_coverage
+            trigger /e_36r1/pop/06dc/data/bufr eq complete
+        endfamily
+      endfamily
+      task cleanup
+        trigger web eq complete
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        inlimit /e_36r1/limits:webplots
+    endfamily
+    family 12dc
+      edit EMOS_BASE '12'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/pop'
+      family web
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+        family an
+          task pincr
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12dc/an eq complete)
+            edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+            edit UPDATE_WEB_NOW 'yes'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            inlimit /e_36r1/limits:webplots
+        endfamily
+      endfamily
+    endfamily
+    family 18dc
+      edit EMOS_BASE '18'
+      edit MXUP_TRAJ '3'
+      edit STREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '3'
+      edit EDFAMILY 'false'
+      edit PERIOD_4D '12'
+      edit FCLENGTH '15'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/pop'
+      family data
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/'
+        family bufr
+          edit SMSFILES '/home/ma/emos/def/e_36r1/pop/data/bufr'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task feedback
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/12dc/archive/obs eq complete)
+        endfamily
+      endfamily
+      family web
+        edit SMSFILES '/home/ma/emos/def/e_36r1/pop/web'
+        family an
+          task pincr
+            trigger ( /e_36r1/main:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/main:YMD eq /e_36r1/pop:YMD and /e_36r1/main/12dc/an eq complete and /e_36r1/pop/12dc/web/an/pincr eq complete)
+            edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+            edit UPDATE_WEB_NOW 'yes'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            inlimit /e_36r1/limits:webplots
+        endfamily
+        family monitoring
+          edit UPDATE_WEB_NOW 'yes'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          task w_coverage
+            trigger /e_36r1/pop/18dc/data/bufr eq complete
+        endfamily
+      endfamily
+      task cleanup
+        trigger web eq complete
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        inlimit /e_36r1/limits:webplots
+    endfamily
+    family 18bc
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '12'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+      edit EMOS_BASE '18'
+      family paper
+        family an
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FSFAMILY 'an'
+          inlimit /limits:linux_cluster
+          task pobstat
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/18bc/fb/obstat_merge eq complete)
+            edit PRIORITY '51'
+        endfamily
+      endfamily
+      task prod_2t
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'serial'
+        edit SMSFILES '/home/mo/moz/sms/other_smsfiles/global_efi/daily'
+        edit REFDATE '0'
+        edit EFI_PARAM '2t'
+    endfamily
+    family 06bc
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '12'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '1'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/plot'
+      edit EMOS_BASE '06'
+      family paper
+        family an
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FSFAMILY 'an'
+          inlimit /limits:linux_cluster
+          task pobstat
+            trigger ( /e_36r1/lag:YMD gt /e_36r1/pop:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/pop:YMD and /e_36r1/lag/06bc/fb/obstat_merge eq complete)
+            edit PRIORITY '51'
+        endfamily
+      endfamily
+      task prod_2t
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'serial'
+        edit SMSFILES '/home/mo/moz/sms/other_smsfiles/global_efi/daily'
+        edit REFDATE '0'
+        edit EFI_PARAM '2t'
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'pop'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ../main/make eq complete and ./00 eq complete and ./12 eq complete and ./00dc eq complete and ./06dc eq complete and ./12dc eq complete and ./18dc eq complete and ./18bc eq complete and ./06bc eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'pop'
+      edit MOVE_TO_ECFS 'no'
+      time 14:15
+  endfamily
+  family msjobs
+    complete ( /e_36r1/msjobs:YMD le /e_36r1/main:YMD) and /e_36r1/main/logfiles eq active
+    trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD or ( /e_36r1/lag:YMD gt /e_36r1/msjobs:YMD)) or ( /e_36r1/lag:YMD eq /e_36r1/msjobs:YMD or ( /e_36r1/pop:YMD gt /e_36r1/msjobs:YMD)) or ( /e_36r1/pop:YMD eq /e_36r1/msjobs:YMD)
+    repeat date YMD 20091118 20121212 1
+    edit SMSURLBASE 'http://ecgate.ecmwf.int:9080/'
+    edit SMSURL 'do/events'
+    family 12
+      edit EMOS_BASE '12'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '-1'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/msjobs'
+      edit SMSTRYNO '1'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'ecgate'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGDIR '/vol/emos_nc/output'
+      family mstraj
+        trigger ( /e_36r1/lag:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/msjobs:YMD and /e_36r1/lag/12/traj/cp_to_other eq complete)
+        edit MSJ_DIR 'tr12h000'
+        time 18:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms_an06
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and /e_36r1/main/12/an eq complete and ( ../../main/12/fc/model:step gt 000 or ../../main/12/fc/model eq complete))
+        edit MSJ_DIR 'an06h000'
+        edit EMOS_BASE '06'
+        time 17:40
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms000
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and /e_36r1/main/12/an eq complete and ( ../../main/12/fc/model:step gt 009 or ../../main/12/fc/model eq complete))
+        edit MSJ_DIR 'an12h000'
+        time 17:40
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms036
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/12/fc/model:step gt 036 or /e_36r1/main/12/fc/model eq complete) and /e_36r1/main/12/prod/036/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0036'
+        edit MSJ_DIR 'fc12h036'
+        time 17:56
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms072
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/12/fc/model:step gt 072 or /e_36r1/main/12/fc/model eq complete) and /e_36r1/main/12/prod/072/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0072'
+        edit MSJ_DIR 'fc12h072'
+        time 18:06
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms144
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/12/fc/model:step gt 144 or /e_36r1/main/12/fc/model eq complete) and /e_36r1/main/12/prod/144/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0144'
+        edit MSJ_DIR 'fc12h144'
+        time 18:27
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms240
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/12/fc/model:step gt 240 or /e_36r1/main/12/fc/model eq complete) and /e_36r1/main/12/prod/240/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0240'
+        edit MSJ_DIR 'fc12h240'
+        time 18:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family mswave
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and /e_36r1/main/12/fc/model eq complete)
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'wg12h240'
+        time 18:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family msmetgram
+        trigger ( /e_36r1/pop:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/pop:YMD eq /e_36r1/msjobs:YMD and /e_36r1/pop/12/data/metgram eq complete)
+        edit MSJ_DIR 'fc12hmetgram'
+        time 18:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      task test_ll
+        edit MSJ_DIR 'test_ll'
+        edit USE_NEW_MSJ 'true'
+    endfamily
+    family 00
+      edit EMOS_BASE '00'
+      edit MXUP_TRAJ '3'
+      edit REINISTREAM 'DCDA'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit REINITIALIZE 'true'
+      edit EDFAMILY 'true'
+      edit PERIOD_4D '6'
+      edit FCLENGTH '9'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/msjobs'
+      edit SMSTRYNO '1'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'ecgate'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGDIR '/vol/emos_nc/output'
+      family mstraj
+        trigger ( /e_36r1/lag:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/lag:YMD eq /e_36r1/msjobs:YMD and /e_36r1/lag/00/traj/cp_to_other eq complete)
+        edit MSJ_DIR 'tr12h000'
+        time 06:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms_an18
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and /e_36r1/main/00/an eq complete and ( ../../main/00/fc/model:step gt 000 or ../../main/00/fc/model eq complete))
+        edit DELTA_DAY '0'
+        edit EMOS_BASE '18'
+        edit MSJ_DIR 'an18h000'
+        time 05:40
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms000
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and /e_36r1/main/00/an eq complete and ( ../../main/00/fc/model:step gt 009 or ../../main/00/fc/model eq complete))
+        edit MSJ_DIR 'an00h000'
+        time 05:40
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms036
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/00/fc/model:step gt 036 or /e_36r1/main/00/fc/model eq complete) and /e_36r1/main/00/prod/036/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0036'
+        edit MSJ_DIR 'fc00h036'
+        time 05:56
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms072
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/00/fc/model:step gt 072 or /e_36r1/main/00/fc/model eq complete) and /e_36r1/main/00/prod/072/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0072'
+        edit MSJ_DIR 'fc00h072'
+        time 06:06
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms144
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/00/fc/model:step gt 144 or /e_36r1/main/00/fc/model eq complete) and /e_36r1/main/00/prod/144/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0144'
+        edit MSJ_DIR 'fc00h144'
+        time 06:27
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms240
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/00/fc/model:step gt 240 or /e_36r1/main/00/fc/model eq complete) and /e_36r1/main/00/prod/240/derived_param eq complete)
+        edit EMOS_TIME_STEP_H '0240'
+        edit MSJ_DIR 'fc00h240'
+        time 06:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family mswave
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and /e_36r1/main/00/fc/model eq complete)
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'wg00h240'
+        time 06:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family msmetgram
+        trigger ( /e_36r1/pop:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/pop:YMD eq /e_36r1/msjobs:YMD and /e_36r1/pop/00/data/metgram eq complete)
+        edit MSJ_DIR 'fc00hmetgram'
+        time 06:55
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      task test_ll
+        edit MSJ_DIR 'test_ll'
+        edit USE_NEW_MSJ 'true'
+    endfamily
+    family 12bc
+      edit EMOS_BASE '12'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '-1'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/msjobs'
+      edit SMSTRYNO '1'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'ecgate'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGDIR '/vol/emos_nc/output'
+      family ms012
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/12/fc eq complete or /e_36r1/main/12/fc/model:step gt 012))
+        edit EMOS_TIME_STEP_H '0012'
+        edit MSJ_DIR 'bc12h012'
+        time 17:49
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms072
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/12/fc eq complete or /e_36r1/main/12/fc/model:step gt 072))
+        edit EMOS_TIME_STEP_H '0072'
+        edit MSJ_DIR 'bc12h072'
+        time 18:06
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+    endfamily
+    family 18bc
+      edit EMOS_BASE '18'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '-1'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/msjobs'
+      edit SMSTRYNO '1'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'ecgate'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGDIR '/vol/emos_nc/output'
+      family ms012
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/18bc/fc eq complete or /e_36r1/main/18bc/fc/model:step gt 012))
+        edit EMOS_TIME_STEP_H '0012'
+        edit MSJ_DIR 'bc18h012'
+        time 23:49
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms072
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/18bc/fc eq complete or /e_36r1/main/18bc/fc/model:step gt 072))
+        edit EMOS_TIME_STEP_H '0072'
+        edit MSJ_DIR 'bc18h072'
+        time 00:06
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+    endfamily
+    family 00bc
+      edit EMOS_BASE '00'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/msjobs'
+      edit SMSTRYNO '1'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'ecgate'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGDIR '/vol/emos_nc/output'
+      family ms012
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/00/fc eq complete or /e_36r1/main/00/fc/model:step gt 012))
+        edit EMOS_TIME_STEP_H '0012'
+        edit MSJ_DIR 'bc00h012'
+        time 05:49
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms072
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/00/fc eq complete or /e_36r1/main/00/fc/model:step gt 072))
+        edit EMOS_TIME_STEP_H '0072'
+        edit MSJ_DIR 'bc00h072'
+        time 06:06
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+    endfamily
+    family 06bc
+      edit EMOS_BASE '06'
+      edit EDFAMILY 'false'
+      edit INISTREAM 'DA'
+      edit REINITIALIZE 'false'
+      edit REINIEXPVER '0046'
+      edit INIEXPVER '0045'
+      edit REINIPERIOD_4D '6'
+      edit REINISTREAM 'DA'
+      edit REINIOFFSET '6'
+      edit RUN_HOURLY_PP '0'
+      edit PERIOD_4D '6'
+      edit WINDOW_LENGTH_4D '12'
+      edit WINDOW_OFFSET_4D '9'
+      edit MXUP_TRAJ '3'
+      edit PARALLEL '4'
+      edit LANONLY 'false'
+      edit ACCOUNT 'opebcmis'
+      edit STREAM 'SCDA'
+      edit EMOS_STREAM 'SCDA'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/e_36r1/msjobs'
+      edit SMSTRYNO '1'
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'ecgate'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGDIR '/vol/emos_nc/output'
+      family ms012
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/06bc/fc eq complete or /e_36r1/main/06bc/fc/model:step gt 012))
+        edit EMOS_TIME_STEP_H '0012'
+        edit MSJ_DIR 'bc06h012'
+        time 11:49
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+      family ms072
+        trigger ( /e_36r1/main:YMD gt /e_36r1/msjobs:YMD) or ( /e_36r1/main:YMD eq /e_36r1/msjobs:YMD and ( /e_36r1/main/06bc/fc eq complete or /e_36r1/main/06bc/fc/model:step gt 072))
+        edit EMOS_TIME_STEP_H '0072'
+        edit MSJ_DIR 'bc06h072'
+        time 12:06
+        task ms_ec
+          edit SMSTRIES '1'
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'msjobs'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger ./12 eq complete and ./00 eq complete and ./12bc eq complete and ./18bc eq complete and ./00bc eq complete and ./06bc eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit SMSFILES '/home/ma/emos/def/e_36r1'
+      edit LOGTASK 'msjobs'
+      edit MOVE_TO_ECFS 'no'
+      time 14:20
+  endfamily
+endsuite
+suite emc_36r1
+  edit USER 'emos'
+  edit SCHOST 'c1b'
+  edit STHOST '/s1b'
+  edit SCHOST_BKUP 'c1a'
+  edit STHOST_BKUP '/s1a'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit USE_YMD 'true'
+  edit YMD '20091003'
+  edit DATEMASK '*.*.*'
+  edit VERSION '0046'
+  edit INIEXPVER '0046'
+  edit TCINIEXPVER '0046'
+  edit FIRST_DAY '1'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '12'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY 'mc'
+  edit IMPL_DATE '2012123112'
+  edit EVERSION '0001'
+  edit USER_PRIORITY '70'
+  edit ININPES '24'
+  edit FCNPES '32'
+  edit PGNPES '32'
+  edit ANNPES '4'
+  edit REINITIALIZE 'false'
+  edit RESERVATION_ON '0'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/emc_36r1'
+  edit SMSINCLUDE '/home/ma/emos/def/emc_36r1/include'
+  edit ACCOUNT 'oeenfo'
+  edit STREAM 'EF'
+  edit EMOS_STREAM 'EF'
+  edit ENSEMBLES '50'
+  edit ENS_SIZE '50'
+  edit MARS_DB 'marsod'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit INILEVELS '91'
+  edit INIPERIOD_4D '6'
+  edit IS_REAL_TIME 'is_real_time'
+  edit RUN_3HOURS_PP '1'
+  edit RUNHINDCAST '0'
+  edit ERA40END '2002073100'
+  edit NH_YEARS '18'
+  edit NH_WEEKS '2'
+  edit PGEN_BINDIR '/home/ma/emos/bin/diss'
+  edit PGEN_OBJDIR '/home/ma/emos/bin/diss'
+  edit DISS_REQDB_ROOT '/diss/requirements'
+  edit DISS_BINDIR '/diss/bin/DISS'
+  edit DELTA_DAY_M '-15'
+  edit DELTA_DAY_P '25'
+  edit FCGTYPE 'l_2'
+  edit EPSFCGTYPE 'l_2'
+  edit LUSE_RSTRHBIAS 'true'
+  edit FCGROUP 'fc0'
+  edit SMSLOGHOST 'c1b'
+  edit SMSLOGPORT '9316'
+  edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+  edit COURTESY '0'
+  edit OCNPES_OC '8'
+  edit OCNPES_IFS '56'
+  edit OD_PROJ 'od'
+  edit SMSURLBASE 'http://datasvc.ecmwf.int/twiki/bin/view/Main'
+  edit SMSURL 'CurrentAndOldESuites'
+  edit SUITE_START '20091004'
+  edit PRODUCE_EPS_ML '1'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit.map %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+  edit NOEFI '0'
+  edit SLEEPTIME '1'
+  inlimit /limits:c1b
+  clock hybrid 
+  family hc0
+    repeat date YMD 20091008 20121212 7
+    edit ACCOUNT 'oeenfo'
+    edit LOGTASK 'hc0'
+    edit QUEUE 'ns'
+    edit QUEUE_EPILOG 'ns'
+    edit ENSEMBLES '4'
+    edit ENS_SIZE '4'
+    edit RUNHINDCAST '1'
+    edit STREAM 'ENFH'
+    edit EMOS_STREAM 'ENFH'
+    edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+    edit EMOS_BASE '00'
+    edit INICLASS 'EI'
+    edit INIEXPVER '0001'
+    edit INILEVELS '60'
+    edit DELETE_FAMILY 'true'
+    family back
+      trigger /emc_36r1/main/make eq complete
+      edit RUNVARFC '1'
+      edit YMD '20091217'
+      inlimit /emc_36r1/limits:hind
+      task stage_hc
+        edit RUNVARFC '1'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+      task rmfdb
+        trigger stage_hc eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+        edit NH_WEEKS_KEPT '1'
+      task lock_fam
+        trigger 0 eq 1
+      task lock_1701
+        complete ./18 eq complete
+        trigger 0 eq 1
+      family 18
+        trigger ./rmfdb eq complete
+        edit DELTA_YEAR '-18'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 17
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-17'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 16
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-16'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 15
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-15'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 14
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-14'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 13
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-13'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 12
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-12'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 11
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-11'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 10
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-10'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 09
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-09'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 08
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-08'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 07
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-07'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 06
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-06'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 05
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-05'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 04
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-04'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 03
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-03'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 02
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-02'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+      family 01
+        trigger ( ./rmfdb eq complete) and ( ./lock_1701 eq complete)
+        edit DELTA_YEAR '-01'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      endfamily
+    endfamily
+    family arch
+      edit EMOS_TYPE 'an'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+      edit FSFAMILY 'mars'
+      edit OVERLAP '0'
+      edit YMD '20100121'
+      limit mutex 1
+      inlimit /emc_36r1/limits:mars
+      inlimit /limits:mars
+      family 18
+        trigger ( ../back/18 eq complete)
+        edit DELTA_YEAR '-18'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/18/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 17
+        trigger ( ../back/17 eq complete)
+        edit DELTA_YEAR '-17'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/17/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 16
+        trigger ( ../back/16 eq complete)
+        edit DELTA_YEAR '-16'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/16/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 15
+        trigger ( ../back/15 eq complete)
+        edit DELTA_YEAR '-15'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/15/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 14
+        trigger ( ../back/14 eq complete)
+        edit DELTA_YEAR '-14'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/14/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 13
+        trigger ( ../back/13 eq complete)
+        edit DELTA_YEAR '-13'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/13/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 12
+        trigger ( ../back/12 eq complete)
+        edit DELTA_YEAR '-12'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/12/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 11
+        trigger ( ../back/11 eq complete)
+        edit DELTA_YEAR '-11'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/11/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 10
+        trigger ( ../back/10 eq complete)
+        edit DELTA_YEAR '-10'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/10/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 09
+        trigger ( ../back/09 eq complete)
+        edit DELTA_YEAR '-09'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/09/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 08
+        trigger ( ../back/08 eq complete)
+        edit DELTA_YEAR '-08'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/08/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 07
+        trigger ( ../back/07 eq complete)
+        edit DELTA_YEAR '-07'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/07/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 06
+        trigger ( ../back/06 eq complete)
+        edit DELTA_YEAR '-06'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/06/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 05
+        trigger ( ../back/05 eq complete)
+        edit DELTA_YEAR '-05'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/05/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 04
+        trigger ( ../back/04 eq complete)
+        edit DELTA_YEAR '-04'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/04/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 03
+        trigger ( ../back/03 eq complete)
+        edit DELTA_YEAR '-03'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/03/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 02
+        trigger ( ../back/02 eq complete)
+        edit DELTA_YEAR '-02'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/02/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 01
+        trigger ( ../back/01 eq complete)
+        edit DELTA_YEAR '-01'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/01/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+    endfamily
+    family postproc
+      trigger ./back eq complete and ( ../hc2:YMD gt ../hc0:YMD or ( ../hc2:YMD eq ../hc0:YMD and ../hc2/back eq complete))
+      edit EMOS_TYPE '00'
+      edit FCCHUNK '1'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+      inlimit /emc_36r1/limits:postproc
+      task stage_hc
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+      family legA
+        trigger ./stage_hc eq complete
+        edit FCLENGTH0 '0'
+        edit FCLENGTH '240'
+        edit EPSFCRES '399'
+        edit FCCHUNK '1'
+        edit STEP1 '0'
+        edit STEP2 '240'
+        task ensm
+        family reord
+          edit EPSCOUPLE '1'
+          edit EMOS_TYPE 'pf'
+          edit FCLENGTH0 '0'
+          edit FCLENGTH '240'
+          edit EPSFCRES '399'
+          edit FCCHUNK '1'
+          edit STEP1 '0'
+          edit STEP2 '240'
+          edit STEPS '-1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+          edit RUNVARFC '1'
+          limit reord 1
+          inlimit reord
+          label info ""
+          family 130
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '130.128'
+            task reord
+              label info ""
+          endfamily
+          family 228
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '228.128'
+            task reord
+              label info ""
+          endfamily
+          family 207
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '207.128'
+            task reord
+              label info ""
+          endfamily
+          family 167
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '167.128'
+            task reord
+              label info ""
+          endfamily
+          family 164
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '164.128'
+            task reord
+              label info ""
+          endfamily
+          family arch
+            trigger ./130 eq complete and ./228 eq complete and ./207 eq complete and ./167 eq complete and ./164 eq complete
+            edit GENERATE '0'
+            edit ARCHIVE '1'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task reord
+              label info ""
+          endfamily
+        endfamily
+      endfamily
+      family legB
+        trigger legA eq complete
+        edit FCLENGTH0 '240'
+        edit FCLENGTH '768'
+        edit EPSFCRES '255'
+        edit FCCHUNK '1'
+        edit STEP1 '240'
+        edit STEP2 '768'
+        task ensm
+        family reord
+          edit EPSCOUPLE '1'
+          edit EMOS_TYPE 'pf'
+          edit FCLENGTH0 '240'
+          edit FCLENGTH '768'
+          edit EPSFCRES '255'
+          edit FCCHUNK '1'
+          edit STEP1 '240'
+          edit STEP2 '768'
+          edit STEPS '-1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+          edit RUNVARFC '1'
+          limit reord 1
+          inlimit reord
+          label info ""
+          family 130
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '130.128'
+            task reord
+              label info ""
+          endfamily
+          family 228
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '228.128'
+            task reord
+              label info ""
+          endfamily
+          family 207
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '207.128'
+            task reord
+              label info ""
+          endfamily
+          family 167
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '167.128'
+            task reord
+              label info ""
+          endfamily
+          family 164
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '164.128'
+            task reord
+              label info ""
+          endfamily
+          family arch
+            trigger ./130 eq complete and ./228 eq complete and ./207 eq complete and ./167 eq complete and ./164 eq complete
+            edit GENERATE '0'
+            edit ARCHIVE '1'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task reord
+              label info ""
+          endfamily
+        endfamily
+      endfamily
+      task wmem_veps
+        trigger legA eq complete and legB eq complete
+        edit EMOS_TYPE 'UNDEF'
+        edit FCCHUNK '1'
+        edit FCLENGTH '768'
+      task wmem_archive
+        trigger wmem_veps eq complete and ./legA eq complete and ./legB eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+        edit FCLENGTH '768'
+        label info ""
+      family clim
+        trigger ../arch eq complete and ./stage_hc eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg/clim'
+        edit CLIM_FC_YEARS '0'
+        edit OCSUITE 'vareps'
+        edit ERA40 'YES'
+        edit START_DAY '20091008'
+        edit END_DAY '20121213'
+        edit RUNVARFC '1'
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /limits:linux_cluster
+        family init
+          task listclim
+          task getdata
+            trigger listclim eq complete
+          task getobsclim
+            trigger getdata eq complete
+        endfamily
+        family bias
+          trigger init eq complete
+          task cal_bias
+          task plot_bias
+            trigger cal_bias eq complete
+          task plot_clim
+            trigger plot_bias eq complete
+          task cal_zondia
+            trigger plot_clim eq complete
+          task plot_zondia
+            trigger cal_zondia eq complete
+          task migrate_bias
+            trigger plot_zondia eq complete
+          task clean_bias
+            trigger migrate_bias eq complete
+          task clean
+            trigger clean_bias eq complete
+        endfamily
+      endfamily
+    endfamily
+    family prod
+      trigger ./back eq complete and ./postproc eq complete
+      edit SMSFILES '/home/ma/emos/def/mc/prod'
+      edit EMOS_DOMAIN 'G'
+      edit EMOS_TYPE 'FC'
+      edit PROD_TASK '1'
+      edit EMOS_PROJECT '00'
+      edit EMOS_BASE '00'
+      edit PGNPES '32'
+      edit EMOS_STREAM 'ENFH'
+      family getreq
+        trigger ../back eq complete
+        edit EMOS_TYPE 'cm'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_PROJECT '12'
+        edit PROD_TASK '1'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'ENFH'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_BASE '00'
+        task eps
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectwave
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit EMOS_STREAM 'ENWH'
+        task wave_eps
+          trigger collectwave eq complete
+          edit EMOS_STREAM 'ENWH'
+          label info ""
+          event 1 
+      endfamily
+      family eps
+        trigger ../back eq complete and ( ./getreq/eps eq complete or ./getreq/eps:001)
+        edit EMOS_STREAM 'ENFH'
+        family day01
+          edit EMOS_TIME_STEP_H '0001'
+          task prodgen
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ./pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day02
+          edit EMOS_TIME_STEP_H '0002'
+          task prodgen
+            trigger ../day01/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day01/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day03
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            trigger ../day02/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day02/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day04
+          edit EMOS_TIME_STEP_H '0004'
+          task prodgen
+            trigger ../day03/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day03/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day05
+          edit EMOS_TIME_STEP_H '0005'
+          task prodgen
+            trigger ../day04/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day04/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day06
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            trigger ../day05/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day05/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day07
+          edit EMOS_TIME_STEP_H '0007'
+          task prodgen
+            trigger ../day06/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day06/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day08
+          edit EMOS_TIME_STEP_H '0008'
+          task prodgen
+            trigger ../day07/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day07/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day09
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            trigger ../day08/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day08/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day10
+          edit EMOS_TIME_STEP_H '0010'
+          task prodgen
+            trigger ../day09/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day09/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day11
+          edit EMOS_TIME_STEP_H '0011'
+          task prodgen
+            trigger ../day10/prodgen eq complete
+            edit MEM '1900'
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day10/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day12
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            trigger ../day11/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day11/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day13
+          edit EMOS_TIME_STEP_H '0013'
+          task prodgen
+            trigger ../day12/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day12/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day14
+          edit EMOS_TIME_STEP_H '0014'
+          task prodgen
+            trigger ../day13/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day13/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day15
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            trigger ../day14/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day14/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day16
+          edit EMOS_TIME_STEP_H '0016'
+          task prodgen
+            trigger ../day15/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day15/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day17
+          edit EMOS_TIME_STEP_H '0017'
+          task prodgen
+            trigger ../day16/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day16/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day18
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            trigger ../day17/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day17/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day19
+          edit EMOS_TIME_STEP_H '0019'
+          task prodgen
+            trigger ../day18/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day18/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day20
+          edit EMOS_TIME_STEP_H '0020'
+          task prodgen
+            trigger ../day19/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day19/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day21
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            trigger ../day20/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day20/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day22
+          edit EMOS_TIME_STEP_H '0022'
+          task prodgen
+            trigger ../day21/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day21/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day23
+          edit EMOS_TIME_STEP_H '0023'
+          task prodgen
+            trigger ../day22/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day22/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day24
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            trigger ../day23/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day23/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day25
+          edit EMOS_TIME_STEP_H '0025'
+          task prodgen
+            trigger ../day24/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day24/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day26
+          edit EMOS_TIME_STEP_H '0026'
+          task prodgen
+            trigger ../day25/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day25/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day27
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            trigger ../day26/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day26/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day28
+          edit EMOS_TIME_STEP_H '0028'
+          task prodgen
+            trigger ../day27/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day27/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day29
+          edit EMOS_TIME_STEP_H '0029'
+          task prodgen
+            trigger ../day28/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day28/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day30
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            trigger ../day29/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day29/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day31
+          edit EMOS_TIME_STEP_H '0031'
+          task prodgen
+            trigger ../day30/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day30/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day32
+          edit EMOS_TIME_STEP_H '0032'
+          task prodgen
+            trigger ../day31/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day31/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day33
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            trigger ../day32/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day32/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+      endfamily
+      family wave
+        trigger ../back eq complete and ( ./getreq/wave_eps eq complete or ./getreq/eps:001)
+        edit PGNPES '4'
+        edit EMOS_STREAM 'ENWH'
+        family day01
+          edit EMOS_TIME_STEP_H '0001'
+          task prodgen
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ./pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day02
+          edit EMOS_TIME_STEP_H '0002'
+          task prodgen
+            trigger ../day01/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day01/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day03
+          edit EMOS_TIME_STEP_H '0003'
+          task prodgen
+            trigger ../day02/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day02/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day04
+          edit EMOS_TIME_STEP_H '0004'
+          task prodgen
+            trigger ../day03/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day03/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day05
+          edit EMOS_TIME_STEP_H '0005'
+          task prodgen
+            trigger ../day04/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day04/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day06
+          edit EMOS_TIME_STEP_H '0006'
+          task prodgen
+            trigger ../day05/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day05/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day07
+          edit EMOS_TIME_STEP_H '0007'
+          task prodgen
+            trigger ../day06/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day06/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day08
+          edit EMOS_TIME_STEP_H '0008'
+          task prodgen
+            trigger ../day07/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day07/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day09
+          edit EMOS_TIME_STEP_H '0009'
+          task prodgen
+            trigger ../day08/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day08/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day10
+          edit EMOS_TIME_STEP_H '0010'
+          task prodgen
+            trigger ../day09/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day09/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day11
+          edit EMOS_TIME_STEP_H '0011'
+          task prodgen
+            trigger ../day10/prodgen eq complete
+            edit MEM '1900'
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day10/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day12
+          edit EMOS_TIME_STEP_H '0012'
+          task prodgen
+            trigger ../day11/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day11/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day13
+          edit EMOS_TIME_STEP_H '0013'
+          task prodgen
+            trigger ../day12/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day12/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day14
+          edit EMOS_TIME_STEP_H '0014'
+          task prodgen
+            trigger ../day13/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day13/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day15
+          edit EMOS_TIME_STEP_H '0015'
+          task prodgen
+            trigger ../day14/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day14/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day16
+          edit EMOS_TIME_STEP_H '0016'
+          task prodgen
+            trigger ../day15/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day15/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day17
+          edit EMOS_TIME_STEP_H '0017'
+          task prodgen
+            trigger ../day16/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day16/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day18
+          edit EMOS_TIME_STEP_H '0018'
+          task prodgen
+            trigger ../day17/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day17/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day19
+          edit EMOS_TIME_STEP_H '0019'
+          task prodgen
+            trigger ../day18/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day18/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day20
+          edit EMOS_TIME_STEP_H '0020'
+          task prodgen
+            trigger ../day19/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day19/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day21
+          edit EMOS_TIME_STEP_H '0021'
+          task prodgen
+            trigger ../day20/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day20/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day22
+          edit EMOS_TIME_STEP_H '0022'
+          task prodgen
+            trigger ../day21/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day21/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day23
+          edit EMOS_TIME_STEP_H '0023'
+          task prodgen
+            trigger ../day22/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day22/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day24
+          edit EMOS_TIME_STEP_H '0024'
+          task prodgen
+            trigger ../day23/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day23/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day25
+          edit EMOS_TIME_STEP_H '0025'
+          task prodgen
+            trigger ../day24/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day24/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day26
+          edit EMOS_TIME_STEP_H '0026'
+          task prodgen
+            trigger ../day25/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day25/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day27
+          edit EMOS_TIME_STEP_H '0027'
+          task prodgen
+            trigger ../day26/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day26/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day28
+          edit EMOS_TIME_STEP_H '0028'
+          task prodgen
+            trigger ../day27/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day27/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day29
+          edit EMOS_TIME_STEP_H '0029'
+          task prodgen
+            trigger ../day28/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day28/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day30
+          edit EMOS_TIME_STEP_H '0030'
+          task prodgen
+            trigger ../day29/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day29/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day31
+          edit EMOS_TIME_STEP_H '0031'
+          task prodgen
+            trigger ../day30/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day30/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day32
+          edit EMOS_TIME_STEP_H '0032'
+          task prodgen
+            trigger ../day31/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day31/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+        family day33
+          edit EMOS_TIME_STEP_H '0033'
+          task prodgen
+            trigger ../day32/prodgen eq complete
+          task pdb
+            trigger prodgen eq complete
+            inlimit /emc_36r1/limits:pdb
+            inlimit /limits:pdb
+            label info ""
+            event 1 
+          task q2diss
+            late -s +00:05 -c +00:15
+            trigger ../day32/q2diss eq complete and pdb eq complete
+            edit USER_PRIORITY '93'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event 1 
+        endfamily
+      endfamily
+    endfamily
+    family adm
+      task hindsync
+        trigger ../back eq complete and ../arch eq complete and ../postproc eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+        edit NH_WEEKS_KEPT '3'
+        edit BACKUP_HCFDB '0'
+      family fri
+        complete ./fri/compl eq complete and ./fri/dummy eq queued
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+        task dummy
+          cron -w 5 09:00
+        task compl
+          complete dummy eq active or dummy eq submitted or dummy eq complete
+          trigger 1 eq 0
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:25
+      trigger logfilestore eq complete and back eq complete and arch eq complete and postproc eq complete and prod eq complete and adm eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+  family 00
+    repeat date YMD 20091007 20121212 7
+    edit DELTA_DAY '1'
+    edit ACCOUNT 'oeenfo'
+    edit LOGTASK '00'
+    edit EMOS_BASE '00'
+    edit QUEUE 'os'
+    family ref
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+      family thu1000
+        complete ./thu1000/compl eq complete and ./thu1000/dummy eq queued
+        task dummy
+        task compl
+          complete ./dummy eq active or ./dummy eq submitted
+          trigger 1 eq 0
+      endfamily
+      family thu2200
+        complete ./thu2200/compl eq complete and ./thu2200/dummy eq queued
+        task dummy
+        task compl
+          complete ./dummy eq active or ./dummy eq submitted
+          trigger 1 eq 0
+      endfamily
+      family wed
+        complete ./wed/compl eq complete and ./wed/dummy eq queued
+        task dummy
+          cron -w 3 18:30
+        task compl
+          complete ./dummy eq active or ./dummy eq submitted
+          trigger 1 eq 0
+      endfamily
+      family tue
+        complete ./tue/compl eq complete and ./tue/dummy eq queued
+        task dummy
+          cron -w 2 08:00
+        task compl
+          complete ./dummy eq active or ./dummy eq submitted
+          trigger 1 eq 0
+      endfamily
+    endfamily
+    family legC
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legA/fc/pf eq complete and /emc_36r1/main/00/legA/fc/cf eq complete and /emc_36r1/main/make eq complete)
+      edit EPSCOUPLE '1'
+      edit RUNCOUPLE '1'
+      edit EPSLEG '3'
+      edit EPSFCLENGTH_C '408'
+      family fc
+        edit FCMEM '2240'
+        edit FCSTACK '700'
+        edit FCMRFS '0'
+        edit PRIORITY '69'
+        edit USER_PRIORITY '69'
+        edit N_PERT_AN '10'
+        edit EPSWAMNFRE '25'
+        edit EPSWAMNANG '12'
+        edit TSTEP '2700'
+        edit EPSFCRES '639'
+        edit RESOL '639'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+        edit CPUTIME '1000'
+        edit MEM '960'
+        edit THREADS '8'
+        edit NPES '8'
+        edit EPSLEG '3'
+        family pf
+          complete /emc_36r1/main/ref/00/events:cf
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit EPSTYPE 'pf'
+          edit EMOS_TYPE 'pf'
+          edit USER_PRIORITY '69'
+          edit PRIORITY '69'
+          edit FCNPES '32'
+          edit EPSNLEGS '3'
+          edit EPSFCLEV '62'
+          edit EPSWAMNSTPW '1'
+          edit EPSINISTEP_PREVIOUS '0'
+          edit EPSWAMRESOL 'global50'
+          edit EPSFCRES '639'
+          edit EPSWAMNFRE '30'
+          edit EPSWAMNANG '24'
+          edit FCLENGTH '240'
+          edit TSTEP '1200'
+          edit EPSLEG '3'
+          edit CLASS 'od'
+          edit THREADS '2'
+          edit RUNVARFC '1'
+          inlimit /emc_36r1/limits:pftotal
+          meter step -1 408 408
+          family 01
+            edit EPSMEMBER '1'
+            edit MEMBER '1'
+            edit SUBFSFAMILY '/pf001'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/01 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 02
+            edit EPSMEMBER '2'
+            edit MEMBER '2'
+            edit SUBFSFAMILY '/pf002'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/02 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 03
+            edit EPSMEMBER '3'
+            edit MEMBER '3'
+            edit SUBFSFAMILY '/pf003'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/03 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 04
+            edit EPSMEMBER '4'
+            edit MEMBER '4'
+            edit SUBFSFAMILY '/pf004'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/04 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 05
+            edit EPSMEMBER '5'
+            edit MEMBER '5'
+            edit SUBFSFAMILY '/pf005'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/05 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 06
+            edit EPSMEMBER '6'
+            edit MEMBER '6'
+            edit SUBFSFAMILY '/pf006'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/06 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 07
+            edit EPSMEMBER '7'
+            edit MEMBER '7'
+            edit SUBFSFAMILY '/pf007'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/07 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 08
+            edit EPSMEMBER '8'
+            edit MEMBER '8'
+            edit SUBFSFAMILY '/pf008'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/08 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 09
+            edit EPSMEMBER '9'
+            edit MEMBER '9'
+            edit SUBFSFAMILY '/pf009'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/09 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 10
+            edit EPSMEMBER '10'
+            edit MEMBER '10'
+            edit SUBFSFAMILY '/pf010'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/10 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 11
+            edit EPSMEMBER '11'
+            edit MEMBER '11'
+            edit SUBFSFAMILY '/pf011'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/11 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 12
+            edit EPSMEMBER '12'
+            edit MEMBER '12'
+            edit SUBFSFAMILY '/pf012'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/12 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 13
+            edit EPSMEMBER '13'
+            edit MEMBER '13'
+            edit SUBFSFAMILY '/pf013'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/13 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 14
+            edit EPSMEMBER '14'
+            edit MEMBER '14'
+            edit SUBFSFAMILY '/pf014'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/14 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 15
+            edit EPSMEMBER '15'
+            edit MEMBER '15'
+            edit SUBFSFAMILY '/pf015'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/15 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 16
+            edit EPSMEMBER '16'
+            edit MEMBER '16'
+            edit SUBFSFAMILY '/pf016'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/16 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 17
+            edit EPSMEMBER '17'
+            edit MEMBER '17'
+            edit SUBFSFAMILY '/pf017'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/17 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 18
+            edit EPSMEMBER '18'
+            edit MEMBER '18'
+            edit SUBFSFAMILY '/pf018'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/18 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 19
+            edit EPSMEMBER '19'
+            edit MEMBER '19'
+            edit SUBFSFAMILY '/pf019'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/19 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 20
+            edit EPSMEMBER '20'
+            edit MEMBER '20'
+            edit SUBFSFAMILY '/pf020'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/20 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 21
+            edit EPSMEMBER '21'
+            edit MEMBER '21'
+            edit SUBFSFAMILY '/pf021'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/21 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 22
+            edit EPSMEMBER '22'
+            edit MEMBER '22'
+            edit SUBFSFAMILY '/pf022'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/22 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 23
+            edit EPSMEMBER '23'
+            edit MEMBER '23'
+            edit SUBFSFAMILY '/pf023'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/23 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 24
+            edit EPSMEMBER '24'
+            edit MEMBER '24'
+            edit SUBFSFAMILY '/pf024'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/24 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 25
+            edit EPSMEMBER '25'
+            edit MEMBER '25'
+            edit SUBFSFAMILY '/pf025'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/25 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 26
+            edit EPSMEMBER '26'
+            edit MEMBER '26'
+            edit SUBFSFAMILY '/pf026'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/26 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 27
+            edit EPSMEMBER '27'
+            edit MEMBER '27'
+            edit SUBFSFAMILY '/pf027'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/27 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 28
+            edit EPSMEMBER '28'
+            edit MEMBER '28'
+            edit SUBFSFAMILY '/pf028'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/28 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 29
+            edit EPSMEMBER '29'
+            edit MEMBER '29'
+            edit SUBFSFAMILY '/pf029'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/29 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 30
+            edit EPSMEMBER '30'
+            edit MEMBER '30'
+            edit SUBFSFAMILY '/pf030'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/30 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 31
+            edit EPSMEMBER '31'
+            edit MEMBER '31'
+            edit SUBFSFAMILY '/pf031'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/31 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 32
+            edit EPSMEMBER '32'
+            edit MEMBER '32'
+            edit SUBFSFAMILY '/pf032'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/32 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 33
+            edit EPSMEMBER '33'
+            edit MEMBER '33'
+            edit SUBFSFAMILY '/pf033'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/33 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 34
+            edit EPSMEMBER '34'
+            edit MEMBER '34'
+            edit SUBFSFAMILY '/pf034'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/34 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 35
+            edit EPSMEMBER '35'
+            edit MEMBER '35'
+            edit SUBFSFAMILY '/pf035'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/35 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 36
+            edit EPSMEMBER '36'
+            edit MEMBER '36'
+            edit SUBFSFAMILY '/pf036'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/36 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 37
+            edit EPSMEMBER '37'
+            edit MEMBER '37'
+            edit SUBFSFAMILY '/pf037'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/37 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 38
+            edit EPSMEMBER '38'
+            edit MEMBER '38'
+            edit SUBFSFAMILY '/pf038'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/38 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 39
+            edit EPSMEMBER '39'
+            edit MEMBER '39'
+            edit SUBFSFAMILY '/pf039'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/39 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 40
+            edit EPSMEMBER '40'
+            edit MEMBER '40'
+            edit SUBFSFAMILY '/pf040'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/40 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 41
+            edit EPSMEMBER '41'
+            edit MEMBER '41'
+            edit SUBFSFAMILY '/pf041'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/41 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 42
+            edit EPSMEMBER '42'
+            edit MEMBER '42'
+            edit SUBFSFAMILY '/pf042'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/42 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 43
+            edit EPSMEMBER '43'
+            edit MEMBER '43'
+            edit SUBFSFAMILY '/pf043'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/43 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 44
+            edit EPSMEMBER '44'
+            edit MEMBER '44'
+            edit SUBFSFAMILY '/pf044'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/44 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 45
+            edit EPSMEMBER '45'
+            edit MEMBER '45'
+            edit SUBFSFAMILY '/pf045'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/45 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 46
+            edit EPSMEMBER '46'
+            edit MEMBER '46'
+            edit SUBFSFAMILY '/pf046'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/46 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 47
+            edit EPSMEMBER '47'
+            edit MEMBER '47'
+            edit SUBFSFAMILY '/pf047'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/47 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 48
+            edit EPSMEMBER '48'
+            edit MEMBER '48'
+            edit SUBFSFAMILY '/pf048'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/48 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 49
+            edit EPSMEMBER '49'
+            edit MEMBER '49'
+            edit SUBFSFAMILY '/pf049'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/49 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+          family 50
+            edit EPSMEMBER '50'
+            edit MEMBER '50'
+            edit SUBFSFAMILY '/pf050'
+            task getvarepsdata
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/pf/50 eq complete)
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSFCRESN '319'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit THREADS '8'
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '1200'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '360'
+              edit EPSFCRES '319'
+              edit EPSLEG '3'
+              edit NPES '1'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '3'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '408'
+              edit EPSINISTEP_PREVIOUS '360'
+              edit FCLENGTH '408'
+              edit MEM '1600'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit EPSFCRESN '255'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNSTPW '1'
+              edit EPSFCLENGTH_B '360'
+              edit TSTEP '2700'
+              edit EPSFCLENGTH_A '240'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 408 408
+          endfamily
+        endfamily
+        family cf
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit MEMBER '0'
+          edit EPSMEMBER '0'
+          edit SUBFSFAMILY '/cf000'
+          edit EPSTYPE 'cf'
+          edit EMOS_TYPE 'cf'
+          edit USER_PRIORITY '70'
+          edit EPSNLEGS '3'
+          edit EPSFCLEV '62'
+          edit EPSWAMNSTPW '1'
+          edit EPSINISTEP_PREVIOUS '0'
+          edit EPSWAMRESOL 'global50'
+          edit EPSFCRES '639'
+          edit EPSWAMNFRE '30'
+          edit EPSWAMNANG '24'
+          edit TSTEP '1200'
+          edit EPSLEG '3'
+          edit CLASS 'od'
+          edit OCGROUP 'an0'
+          edit FCGROUP 'fc0'
+          edit FCCHUNK '1'
+          edit OCTOTAL '5'
+          edit FCTOTAL '51'
+          edit DAILY '0'
+          edit RUNVARFC '1'
+          edit FCLENGTH '408'
+          edit FCLENGTH1 '360'
+          task getvarepsdata
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legBcpl/fc/cf eq complete)
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit TSTEP '1200'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit EPSLEG '3'
+            edit EPSINISTEP '360'
+            edit EPSFCRES '319'
+            edit EPSFCRESN '319'
+            edit EPSWAMNSTPW '1'
+            edit EPSFCLENGTH_B '360'
+            edit CLASS 'od'
+          task intHtoL
+            trigger getvarepsdata eq complete
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit TSTEP '1200'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit EPSINISTEP '360'
+            edit EPSFCRES '319'
+            edit EPSLEG '3'
+            edit NPES '1'
+            edit CLASS 'od'
+          task modeleps
+            trigger ./intHtoL eq complete and ./getvarepsdata eq complete
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit EPSLEG '3'
+            edit EPSFCRES '319'
+            edit EPSINISTEP '408'
+            edit EPSINISTEP_PREVIOUS '360'
+            edit FCLENGTH '408'
+            edit MEM '1600'
+            edit MRF '10'
+            edit STACK '350'
+            edit FCCHUNK '1'
+            edit EPSFCRESN '255'
+            edit EPSWAMRESOL 'global50'
+            edit EPSWAMNSTPW '1'
+            edit EPSFCLENGTH_B '360'
+            edit TSTEP '2700'
+            edit EPSFCLENGTH_A '240'
+            edit SMSTRIES '1'
+            edit NPES '1'
+            edit THREADS '64'
+            edit FCNPES '1'
+            edit CLASS 'od'
+            inlimit /emc_36r1/limits:modelepsB
+            meter step -1 408 408
+        endfamily
+      endfamily
+      family postproc
+        trigger ./fc eq active or ./fc eq complete
+        edit STEPS '372/768/12/24 768/768/12/120'
+        edit FCCHUNK '1'
+        edit OCTOTAL '5'
+        edit FCTOTAL '51'
+        edit DAILY '0'
+        edit RUNVARFC '1'
+        edit FCLENGTH1 '360'
+        edit FCLENGTH '768'
+        edit FCGROUP 'fc0'
+        inlimit /emc_36r1/limits:postproc
+        family dp
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit STEPS '366:768:6'
+          inlimit /emc_36r1/limits:dp
+          family cf
+            trigger ../../fc/cf eq complete
+            edit EMOS_TYPE 'cf'
+            task derived_param
+              edit MEMBER 'off'
+          endfamily
+          family pf
+            complete /emc_36r1/main/ref/00/events:cf
+            edit EMOS_TYPE 'pf'
+            family 01
+              trigger ../../../fc/pf/01 eq complete
+              edit EPSMEMBER '1'
+              edit MEMBER '1'
+              edit SUBFSFAMILY '/pf001'
+              task derived_param
+            endfamily
+            family 02
+              trigger ../../../fc/pf/02 eq complete
+              edit EPSMEMBER '2'
+              edit MEMBER '2'
+              edit SUBFSFAMILY '/pf002'
+              task derived_param
+            endfamily
+            family 03
+              trigger ../../../fc/pf/03 eq complete
+              edit EPSMEMBER '3'
+              edit MEMBER '3'
+              edit SUBFSFAMILY '/pf003'
+              task derived_param
+            endfamily
+            family 04
+              trigger ../../../fc/pf/04 eq complete
+              edit EPSMEMBER '4'
+              edit MEMBER '4'
+              edit SUBFSFAMILY '/pf004'
+              task derived_param
+            endfamily
+            family 05
+              trigger ../../../fc/pf/05 eq complete
+              edit EPSMEMBER '5'
+              edit MEMBER '5'
+              edit SUBFSFAMILY '/pf005'
+              task derived_param
+            endfamily
+            family 06
+              trigger ../../../fc/pf/06 eq complete
+              edit EPSMEMBER '6'
+              edit MEMBER '6'
+              edit SUBFSFAMILY '/pf006'
+              task derived_param
+            endfamily
+            family 07
+              trigger ../../../fc/pf/07 eq complete
+              edit EPSMEMBER '7'
+              edit MEMBER '7'
+              edit SUBFSFAMILY '/pf007'
+              task derived_param
+            endfamily
+            family 08
+              trigger ../../../fc/pf/08 eq complete
+              edit EPSMEMBER '8'
+              edit MEMBER '8'
+              edit SUBFSFAMILY '/pf008'
+              task derived_param
+            endfamily
+            family 09
+              trigger ../../../fc/pf/09 eq complete
+              edit EPSMEMBER '9'
+              edit MEMBER '9'
+              edit SUBFSFAMILY '/pf009'
+              task derived_param
+            endfamily
+            family 10
+              trigger ../../../fc/pf/10 eq complete
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              edit SUBFSFAMILY '/pf010'
+              task derived_param
+            endfamily
+            family 11
+              trigger ../../../fc/pf/11 eq complete
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              edit SUBFSFAMILY '/pf011'
+              task derived_param
+            endfamily
+            family 12
+              trigger ../../../fc/pf/12 eq complete
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              edit SUBFSFAMILY '/pf012'
+              task derived_param
+            endfamily
+            family 13
+              trigger ../../../fc/pf/13 eq complete
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              edit SUBFSFAMILY '/pf013'
+              task derived_param
+            endfamily
+            family 14
+              trigger ../../../fc/pf/14 eq complete
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              edit SUBFSFAMILY '/pf014'
+              task derived_param
+            endfamily
+            family 15
+              trigger ../../../fc/pf/15 eq complete
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              edit SUBFSFAMILY '/pf015'
+              task derived_param
+            endfamily
+            family 16
+              trigger ../../../fc/pf/16 eq complete
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              edit SUBFSFAMILY '/pf016'
+              task derived_param
+            endfamily
+            family 17
+              trigger ../../../fc/pf/17 eq complete
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              edit SUBFSFAMILY '/pf017'
+              task derived_param
+            endfamily
+            family 18
+              trigger ../../../fc/pf/18 eq complete
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              edit SUBFSFAMILY '/pf018'
+              task derived_param
+            endfamily
+            family 19
+              trigger ../../../fc/pf/19 eq complete
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              edit SUBFSFAMILY '/pf019'
+              task derived_param
+            endfamily
+            family 20
+              trigger ../../../fc/pf/20 eq complete
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              edit SUBFSFAMILY '/pf020'
+              task derived_param
+            endfamily
+            family 21
+              trigger ../../../fc/pf/21 eq complete
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              edit SUBFSFAMILY '/pf021'
+              task derived_param
+            endfamily
+            family 22
+              trigger ../../../fc/pf/22 eq complete
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              edit SUBFSFAMILY '/pf022'
+              task derived_param
+            endfamily
+            family 23
+              trigger ../../../fc/pf/23 eq complete
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              edit SUBFSFAMILY '/pf023'
+              task derived_param
+            endfamily
+            family 24
+              trigger ../../../fc/pf/24 eq complete
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              edit SUBFSFAMILY '/pf024'
+              task derived_param
+            endfamily
+            family 25
+              trigger ../../../fc/pf/25 eq complete
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              edit SUBFSFAMILY '/pf025'
+              task derived_param
+            endfamily
+            family 26
+              trigger ../../../fc/pf/26 eq complete
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              edit SUBFSFAMILY '/pf026'
+              task derived_param
+            endfamily
+            family 27
+              trigger ../../../fc/pf/27 eq complete
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              edit SUBFSFAMILY '/pf027'
+              task derived_param
+            endfamily
+            family 28
+              trigger ../../../fc/pf/28 eq complete
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              edit SUBFSFAMILY '/pf028'
+              task derived_param
+            endfamily
+            family 29
+              trigger ../../../fc/pf/29 eq complete
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              edit SUBFSFAMILY '/pf029'
+              task derived_param
+            endfamily
+            family 30
+              trigger ../../../fc/pf/30 eq complete
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              edit SUBFSFAMILY '/pf030'
+              task derived_param
+            endfamily
+            family 31
+              trigger ../../../fc/pf/31 eq complete
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              edit SUBFSFAMILY '/pf031'
+              task derived_param
+            endfamily
+            family 32
+              trigger ../../../fc/pf/32 eq complete
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              edit SUBFSFAMILY '/pf032'
+              task derived_param
+            endfamily
+            family 33
+              trigger ../../../fc/pf/33 eq complete
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              edit SUBFSFAMILY '/pf033'
+              task derived_param
+            endfamily
+            family 34
+              trigger ../../../fc/pf/34 eq complete
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              edit SUBFSFAMILY '/pf034'
+              task derived_param
+            endfamily
+            family 35
+              trigger ../../../fc/pf/35 eq complete
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              edit SUBFSFAMILY '/pf035'
+              task derived_param
+            endfamily
+            family 36
+              trigger ../../../fc/pf/36 eq complete
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              edit SUBFSFAMILY '/pf036'
+              task derived_param
+            endfamily
+            family 37
+              trigger ../../../fc/pf/37 eq complete
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              edit SUBFSFAMILY '/pf037'
+              task derived_param
+            endfamily
+            family 38
+              trigger ../../../fc/pf/38 eq complete
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              edit SUBFSFAMILY '/pf038'
+              task derived_param
+            endfamily
+            family 39
+              trigger ../../../fc/pf/39 eq complete
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              edit SUBFSFAMILY '/pf039'
+              task derived_param
+            endfamily
+            family 40
+              trigger ../../../fc/pf/40 eq complete
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              edit SUBFSFAMILY '/pf040'
+              task derived_param
+            endfamily
+            family 41
+              trigger ../../../fc/pf/41 eq complete
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              edit SUBFSFAMILY '/pf041'
+              task derived_param
+            endfamily
+            family 42
+              trigger ../../../fc/pf/42 eq complete
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              edit SUBFSFAMILY '/pf042'
+              task derived_param
+            endfamily
+            family 43
+              trigger ../../../fc/pf/43 eq complete
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              edit SUBFSFAMILY '/pf043'
+              task derived_param
+            endfamily
+            family 44
+              trigger ../../../fc/pf/44 eq complete
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              edit SUBFSFAMILY '/pf044'
+              task derived_param
+            endfamily
+            family 45
+              trigger ../../../fc/pf/45 eq complete
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              edit SUBFSFAMILY '/pf045'
+              task derived_param
+            endfamily
+            family 46
+              trigger ../../../fc/pf/46 eq complete
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              edit SUBFSFAMILY '/pf046'
+              task derived_param
+            endfamily
+            family 47
+              trigger ../../../fc/pf/47 eq complete
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              edit SUBFSFAMILY '/pf047'
+              task derived_param
+            endfamily
+            family 48
+              trigger ../../../fc/pf/48 eq complete
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              edit SUBFSFAMILY '/pf048'
+              task derived_param
+            endfamily
+            family 49
+              trigger ../../../fc/pf/49 eq complete
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              edit SUBFSFAMILY '/pf049'
+              task derived_param
+            endfamily
+            family 50
+              trigger ../../../fc/pf/50 eq complete
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              edit SUBFSFAMILY '/pf050'
+              task derived_param
+            endfamily
+          endfamily
+        endfamily
+        family extra
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit STEPS '366:768:6'
+          inlimit /emc_36r1/limits:extra
+          family cf
+            trigger ../dp/cf eq complete
+            edit EMOS_TYPE 'cf'
+            task extrafields
+              edit EPSFCRES '319'
+              edit FCLENGTH '768'
+              edit FCLENGTH0 '360'
+            task wm_sfc
+              trigger extrafields eq complete
+              edit FCLENGTH '768'
+            task wm_ua
+              trigger wm_sfc eq complete
+              edit FCLENGTH '768'
+          endfamily
+          family pf
+            complete /emc_36r1/main/ref/00/events:cf
+            edit EMOS_TYPE 'pf'
+            family 01
+              trigger ../../dp/pf/01 eq complete
+              edit EPSMEMBER '1'
+              edit MEMBER '1'
+              edit SUBFSFAMILY '/pf001'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 02
+              trigger ../../dp/pf/02 eq complete
+              edit EPSMEMBER '2'
+              edit MEMBER '2'
+              edit SUBFSFAMILY '/pf002'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 03
+              trigger ../../dp/pf/03 eq complete
+              edit EPSMEMBER '3'
+              edit MEMBER '3'
+              edit SUBFSFAMILY '/pf003'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 04
+              trigger ../../dp/pf/04 eq complete
+              edit EPSMEMBER '4'
+              edit MEMBER '4'
+              edit SUBFSFAMILY '/pf004'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 05
+              trigger ../../dp/pf/05 eq complete
+              edit EPSMEMBER '5'
+              edit MEMBER '5'
+              edit SUBFSFAMILY '/pf005'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 06
+              trigger ../../dp/pf/06 eq complete
+              edit EPSMEMBER '6'
+              edit MEMBER '6'
+              edit SUBFSFAMILY '/pf006'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 07
+              trigger ../../dp/pf/07 eq complete
+              edit EPSMEMBER '7'
+              edit MEMBER '7'
+              edit SUBFSFAMILY '/pf007'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 08
+              trigger ../../dp/pf/08 eq complete
+              edit EPSMEMBER '8'
+              edit MEMBER '8'
+              edit SUBFSFAMILY '/pf008'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 09
+              trigger ../../dp/pf/09 eq complete
+              edit EPSMEMBER '9'
+              edit MEMBER '9'
+              edit SUBFSFAMILY '/pf009'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 10
+              trigger ../../dp/pf/10 eq complete
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              edit SUBFSFAMILY '/pf010'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 11
+              trigger ../../dp/pf/11 eq complete
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              edit SUBFSFAMILY '/pf011'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 12
+              trigger ../../dp/pf/12 eq complete
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              edit SUBFSFAMILY '/pf012'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 13
+              trigger ../../dp/pf/13 eq complete
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              edit SUBFSFAMILY '/pf013'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 14
+              trigger ../../dp/pf/14 eq complete
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              edit SUBFSFAMILY '/pf014'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 15
+              trigger ../../dp/pf/15 eq complete
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              edit SUBFSFAMILY '/pf015'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 16
+              trigger ../../dp/pf/16 eq complete
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              edit SUBFSFAMILY '/pf016'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 17
+              trigger ../../dp/pf/17 eq complete
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              edit SUBFSFAMILY '/pf017'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 18
+              trigger ../../dp/pf/18 eq complete
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              edit SUBFSFAMILY '/pf018'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 19
+              trigger ../../dp/pf/19 eq complete
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              edit SUBFSFAMILY '/pf019'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 20
+              trigger ../../dp/pf/20 eq complete
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              edit SUBFSFAMILY '/pf020'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 21
+              trigger ../../dp/pf/21 eq complete
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              edit SUBFSFAMILY '/pf021'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 22
+              trigger ../../dp/pf/22 eq complete
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              edit SUBFSFAMILY '/pf022'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 23
+              trigger ../../dp/pf/23 eq complete
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              edit SUBFSFAMILY '/pf023'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 24
+              trigger ../../dp/pf/24 eq complete
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              edit SUBFSFAMILY '/pf024'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 25
+              trigger ../../dp/pf/25 eq complete
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              edit SUBFSFAMILY '/pf025'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 26
+              trigger ../../dp/pf/26 eq complete
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              edit SUBFSFAMILY '/pf026'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 27
+              trigger ../../dp/pf/27 eq complete
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              edit SUBFSFAMILY '/pf027'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 28
+              trigger ../../dp/pf/28 eq complete
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              edit SUBFSFAMILY '/pf028'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 29
+              trigger ../../dp/pf/29 eq complete
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              edit SUBFSFAMILY '/pf029'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 30
+              trigger ../../dp/pf/30 eq complete
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              edit SUBFSFAMILY '/pf030'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 31
+              trigger ../../dp/pf/31 eq complete
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              edit SUBFSFAMILY '/pf031'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 32
+              trigger ../../dp/pf/32 eq complete
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              edit SUBFSFAMILY '/pf032'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 33
+              trigger ../../dp/pf/33 eq complete
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              edit SUBFSFAMILY '/pf033'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 34
+              trigger ../../dp/pf/34 eq complete
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              edit SUBFSFAMILY '/pf034'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 35
+              trigger ../../dp/pf/35 eq complete
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              edit SUBFSFAMILY '/pf035'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 36
+              trigger ../../dp/pf/36 eq complete
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              edit SUBFSFAMILY '/pf036'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 37
+              trigger ../../dp/pf/37 eq complete
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              edit SUBFSFAMILY '/pf037'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 38
+              trigger ../../dp/pf/38 eq complete
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              edit SUBFSFAMILY '/pf038'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 39
+              trigger ../../dp/pf/39 eq complete
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              edit SUBFSFAMILY '/pf039'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 40
+              trigger ../../dp/pf/40 eq complete
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              edit SUBFSFAMILY '/pf040'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 41
+              trigger ../../dp/pf/41 eq complete
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              edit SUBFSFAMILY '/pf041'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 42
+              trigger ../../dp/pf/42 eq complete
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              edit SUBFSFAMILY '/pf042'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 43
+              trigger ../../dp/pf/43 eq complete
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              edit SUBFSFAMILY '/pf043'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 44
+              trigger ../../dp/pf/44 eq complete
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              edit SUBFSFAMILY '/pf044'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 45
+              trigger ../../dp/pf/45 eq complete
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              edit SUBFSFAMILY '/pf045'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 46
+              trigger ../../dp/pf/46 eq complete
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              edit SUBFSFAMILY '/pf046'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 47
+              trigger ../../dp/pf/47 eq complete
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              edit SUBFSFAMILY '/pf047'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 48
+              trigger ../../dp/pf/48 eq complete
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              edit SUBFSFAMILY '/pf048'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 49
+              trigger ../../dp/pf/49 eq complete
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              edit SUBFSFAMILY '/pf049'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+            family 50
+              trigger ../../dp/pf/50 eq complete
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              edit SUBFSFAMILY '/pf050'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '768'
+                edit FCLENGTH0 '360'
+              task wm_sfc
+                trigger extrafields eq complete
+                edit FCLENGTH '768'
+              task wm_ua
+                trigger wm_sfc eq complete
+                edit FCLENGTH '768'
+            endfamily
+          endfamily
+        endfamily
+        family mofc
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+          edit EMOS_TYPE '00'
+          edit EXPVER_ENFH '0046'
+          edit EXPVER_EFHS '0046'
+          edit NH_ENSEMBLES '4'
+          task wmem_veps
+            trigger ../dp eq complete and ../extra eq complete and ../ensms eq complete
+          family wmanom
+            trigger ( /emc_36r1/hc0:YMD gt /emc_36r1/00:YMD or ( /emc_36r1/hc0:YMD eq /emc_36r1/00:YMD and /emc_36r1/hc0/postproc/wmem_veps eq complete)) and wmem_veps eq complete and ../ensms eq complete
+            edit WRITE_FDB '0'
+            family fcmean
+              edit TYPES 'fcmean'
+              family 129
+                edit PARAMS '129'
+                task wmanom
+              endfamily
+              family all
+                edit PARAMS '130 133 001 078 228'
+                task wmanom
+              endfamily
+            endfamily
+            family em
+              edit TYPES 'em'
+              family all
+                edit PARAMS 'all'
+                task wmanom
+              endfamily
+            endfamily
+            task prob_fdb
+              trigger fcmean eq complete and em eq complete
+              edit PARAM '129 130 133 001 078 228 144 all'
+              edit MARS_FDB_SET_TABLE '1'
+          endfamily
+          task signi
+            trigger wmanom eq complete
+          task prob_thr
+            trigger wmanom eq complete
+          task prob_perc
+            trigger wmanom eq complete
+        endfamily
+        family ensms
+          complete /emc_36r1/main/ref/00/events:cf
+          trigger ../fc eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+          family limits
+            limit fdb 1
+            limit gen 8
+          endfamily
+          task ensms
+            edit ENS_M 'false'
+            edit ENS_S 'false'
+            edit ENS_MARS 'false'
+            event stage
+          family 498
+            trigger ./ensms:stage or ./ensms eq complete
+            edit STEP1 '366'
+            edit STEP2 '498'
+            edit BY '6'
+            edit STEPS '0'
+            family T
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit LIST_PARAM 'T'
+              inlimit ../limits:gen
+              family 850
+                task ensms
+                  edit LIST_LEV '850'
+              endfamily
+              family 500
+                task ensms
+                  edit LIST_LEV '500'
+              endfamily
+            endfamily
+            family Z
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit LIST_PARAM 'Z'
+              inlimit ../limits:gen
+              family 1000
+                task ensms
+                  edit LIST_LEV '1000'
+              endfamily
+              family 500
+                task ensms
+                  edit LIST_LEV '500'
+              endfamily
+            endfamily
+            task ensms
+              trigger T eq complete and Z eq complete
+              edit ENS_MARS 'false'
+              inlimit ../limits:fdb
+          endfamily
+          family 636
+            trigger ./ensms:stage or ./ensms eq complete
+            edit STEP1 '504'
+            edit STEP2 '636'
+            edit BY '6'
+            edit STEPS '0'
+            family T
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit LIST_PARAM 'T'
+              inlimit ../limits:gen
+              family 850
+                task ensms
+                  edit LIST_LEV '850'
+              endfamily
+              family 500
+                task ensms
+                  edit LIST_LEV '500'
+              endfamily
+            endfamily
+            family Z
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit LIST_PARAM 'Z'
+              inlimit ../limits:gen
+              family 1000
+                task ensms
+                  edit LIST_LEV '1000'
+              endfamily
+              family 500
+                task ensms
+                  edit LIST_LEV '500'
+              endfamily
+            endfamily
+            task ensms
+              trigger T eq complete and Z eq complete
+              edit ENS_MARS 'false'
+              inlimit ../limits:fdb
+          endfamily
+          family 768
+            trigger ./ensms:stage or ./ensms eq complete
+            edit STEP1 '642'
+            edit STEP2 '768'
+            edit BY '6'
+            edit STEPS '0'
+            family T
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit LIST_PARAM 'T'
+              inlimit ../limits:gen
+              family 850
+                task ensms
+                  edit LIST_LEV '850'
+              endfamily
+              family 500
+                task ensms
+                  edit LIST_LEV '500'
+              endfamily
+            endfamily
+            family Z
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit LIST_PARAM 'Z'
+              inlimit ../limits:gen
+              family 1000
+                task ensms
+                  edit LIST_LEV '1000'
+              endfamily
+              family 500
+                task ensms
+                  edit LIST_LEV '500'
+              endfamily
+            endfamily
+            task ensms
+              trigger T eq complete and Z eq complete
+              edit ENS_MARS 'false'
+              inlimit ../limits:fdb
+          endfamily
+        endfamily
+      endfamily
+      family prod
+        trigger fc eq complete and postproc eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+        edit EMOS_STREAM 'ENFO'
+        edit EMOS_DOMAIN 'G'
+        edit EMOS_TYPE 'FC'
+        edit PROD_TASK '1'
+        edit EMOS_PROJECT '00'
+        edit EMOS_BASE '00'
+        edit PGNPES '32'
+        family eps
+          trigger ( ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and ( /emc_36r1/main/00/legA/prod/getreq/eps eq complete or /emc_36r1/main/00/legA/prod/getreq/eps:001) and ( /emc_36r1/main/00/legA/prod/getreq/bitmap eq complete or /emc_36r1/main/00/legA/prod/getreq/bitmap:001)))
+          edit EMOS_STREAM 'ENFO'
+          family day01
+            edit EMOS_TIME_STEP_H '0001'
+            task prodgen
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day02
+            edit EMOS_TIME_STEP_H '0002'
+            task prodgen
+              trigger ../day01/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day01/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day03
+            edit EMOS_TIME_STEP_H '0003'
+            task prodgen
+              trigger ../day02/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day02/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day04
+            edit EMOS_TIME_STEP_H '0004'
+            task prodgen
+              trigger ../day03/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day03/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day05
+            edit EMOS_TIME_STEP_H '0005'
+            task prodgen
+              trigger ../day04/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day04/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day06
+            edit EMOS_TIME_STEP_H '0006'
+            task prodgen
+              trigger ../day05/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day05/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day07
+            edit EMOS_TIME_STEP_H '0007'
+            task prodgen
+              trigger ../day06/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day06/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day08
+            edit EMOS_TIME_STEP_H '0008'
+            task prodgen
+              trigger ../day07/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day07/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day09
+            edit EMOS_TIME_STEP_H '0009'
+            task prodgen
+              trigger ../day08/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day08/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day10
+            edit EMOS_TIME_STEP_H '0010'
+            task prodgen
+              trigger ../day09/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day09/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day11
+            edit EMOS_TIME_STEP_H '0011'
+            task prodgen
+              trigger ../day10/prodgen eq complete
+              edit MEM '1900'
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day10/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day12
+            edit EMOS_TIME_STEP_H '0012'
+            task prodgen
+              trigger ../day11/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day11/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day13
+            edit EMOS_TIME_STEP_H '0013'
+            task prodgen
+              trigger ../day12/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day12/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day14
+            edit EMOS_TIME_STEP_H '0014'
+            task prodgen
+              trigger ../day13/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day13/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day15
+            edit EMOS_TIME_STEP_H '0015'
+            task prodgen
+              trigger ../day14/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day14/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day16
+            edit EMOS_TIME_STEP_H '0016'
+            task prodgen
+              trigger ../day15/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day15/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day17
+            edit EMOS_TIME_STEP_H '0017'
+            task prodgen
+              trigger ../day16/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day16/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day18
+            edit EMOS_TIME_STEP_H '0018'
+            task prodgen
+              trigger ../day17/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day17/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day19
+            edit EMOS_TIME_STEP_H '0019'
+            task prodgen
+              trigger ../day18/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day18/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day20
+            edit EMOS_TIME_STEP_H '0020'
+            task prodgen
+              trigger ../day19/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day19/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day21
+            edit EMOS_TIME_STEP_H '0021'
+            task prodgen
+              trigger ../day20/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day20/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day22
+            edit EMOS_TIME_STEP_H '0022'
+            task prodgen
+              trigger ../day21/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day21/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day23
+            edit EMOS_TIME_STEP_H '0023'
+            task prodgen
+              trigger ../day22/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day22/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day24
+            edit EMOS_TIME_STEP_H '0024'
+            task prodgen
+              trigger ../day23/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day23/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day25
+            edit EMOS_TIME_STEP_H '0025'
+            task prodgen
+              trigger ../day24/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day24/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day26
+            edit EMOS_TIME_STEP_H '0026'
+            task prodgen
+              trigger ../day25/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day25/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day27
+            edit EMOS_TIME_STEP_H '0027'
+            task prodgen
+              trigger ../day26/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day26/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day28
+            edit EMOS_TIME_STEP_H '0028'
+            task prodgen
+              trigger ../day27/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day27/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day29
+            edit EMOS_TIME_STEP_H '0029'
+            task prodgen
+              trigger ../day28/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day28/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day30
+            edit EMOS_TIME_STEP_H '0030'
+            task prodgen
+              trigger ../day29/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day29/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day31
+            edit EMOS_TIME_STEP_H '0031'
+            task prodgen
+              trigger ../day30/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day30/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day32
+            edit EMOS_TIME_STEP_H '0032'
+            task prodgen
+              trigger ../day31/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day31/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day33
+            edit EMOS_TIME_STEP_H '0033'
+            task prodgen
+              trigger ../day32/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day32/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+        endfamily
+        family wave
+          trigger ./eps/day33/prodgen eq complete and ( ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and ( /emc_36r1/main/00/legA/prod/getreq/wave_eps eq complete or /emc_36r1/main/00/legA/prod/getreq/wave_eps:001)))
+          edit PGNPES '4'
+          edit EMOS_STREAM 'WAEF'
+          family day01
+            edit EMOS_TIME_STEP_H '0001'
+            task prodgen
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ./pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day02
+            edit EMOS_TIME_STEP_H '0002'
+            task prodgen
+              trigger ../day01/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day01/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day03
+            edit EMOS_TIME_STEP_H '0003'
+            task prodgen
+              trigger ../day02/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day02/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day04
+            edit EMOS_TIME_STEP_H '0004'
+            task prodgen
+              trigger ../day03/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day03/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day05
+            edit EMOS_TIME_STEP_H '0005'
+            task prodgen
+              trigger ../day04/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day04/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day06
+            edit EMOS_TIME_STEP_H '0006'
+            task prodgen
+              trigger ../day05/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day05/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day07
+            edit EMOS_TIME_STEP_H '0007'
+            task prodgen
+              trigger ../day06/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day06/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day08
+            edit EMOS_TIME_STEP_H '0008'
+            task prodgen
+              trigger ../day07/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day07/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day09
+            edit EMOS_TIME_STEP_H '0009'
+            task prodgen
+              trigger ../day08/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day08/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day10
+            edit EMOS_TIME_STEP_H '0010'
+            task prodgen
+              trigger ../day09/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day09/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day11
+            edit EMOS_TIME_STEP_H '0011'
+            task prodgen
+              trigger ../day10/prodgen eq complete
+              edit MEM '1900'
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day10/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day12
+            edit EMOS_TIME_STEP_H '0012'
+            task prodgen
+              trigger ../day11/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day11/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day13
+            edit EMOS_TIME_STEP_H '0013'
+            task prodgen
+              trigger ../day12/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day12/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day14
+            edit EMOS_TIME_STEP_H '0014'
+            task prodgen
+              trigger ../day13/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day13/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day15
+            edit EMOS_TIME_STEP_H '0015'
+            task prodgen
+              trigger ../day14/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day14/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day16
+            edit EMOS_TIME_STEP_H '0016'
+            task prodgen
+              trigger ../day15/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day15/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day17
+            edit EMOS_TIME_STEP_H '0017'
+            task prodgen
+              trigger ../day16/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day16/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day18
+            edit EMOS_TIME_STEP_H '0018'
+            task prodgen
+              trigger ../day17/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day17/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day19
+            edit EMOS_TIME_STEP_H '0019'
+            task prodgen
+              trigger ../day18/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day18/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day20
+            edit EMOS_TIME_STEP_H '0020'
+            task prodgen
+              trigger ../day19/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day19/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day21
+            edit EMOS_TIME_STEP_H '0021'
+            task prodgen
+              trigger ../day20/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day20/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day22
+            edit EMOS_TIME_STEP_H '0022'
+            task prodgen
+              trigger ../day21/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day21/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day23
+            edit EMOS_TIME_STEP_H '0023'
+            task prodgen
+              trigger ../day22/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day22/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day24
+            edit EMOS_TIME_STEP_H '0024'
+            task prodgen
+              trigger ../day23/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day23/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day25
+            edit EMOS_TIME_STEP_H '0025'
+            task prodgen
+              trigger ../day24/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day24/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day26
+            edit EMOS_TIME_STEP_H '0026'
+            task prodgen
+              trigger ../day25/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day25/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day27
+            edit EMOS_TIME_STEP_H '0027'
+            task prodgen
+              trigger ../day26/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day26/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day28
+            edit EMOS_TIME_STEP_H '0028'
+            task prodgen
+              trigger ../day27/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day27/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day29
+            edit EMOS_TIME_STEP_H '0029'
+            task prodgen
+              trigger ../day28/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day28/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day30
+            edit EMOS_TIME_STEP_H '0030'
+            task prodgen
+              trigger ../day29/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day29/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day31
+            edit EMOS_TIME_STEP_H '0031'
+            task prodgen
+              trigger ../day30/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day30/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day32
+            edit EMOS_TIME_STEP_H '0032'
+            task prodgen
+              trigger ../day31/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day31/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+          family day33
+            edit EMOS_TIME_STEP_H '0033'
+            task prodgen
+              trigger ../day32/prodgen eq complete
+            task pdb
+              trigger prodgen eq complete
+              inlimit /emc_36r1/limits:pdb
+              inlimit /limits:pdb
+              label info ""
+              event 1 
+            task q2diss
+              late -s +00:05 -c +00:15
+              trigger ../day32/q2diss eq complete and pdb eq complete
+              edit USER_PRIORITY '93'
+              inlimit /emc_36r1/limits:q2diss
+              inlimit /limits:q2diss
+              label info ""
+              event 1 
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+    family arch
+      trigger ./legC/fc eq complete
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+      edit EPSLEG '3'
+      edit FSFAMILY 'mars'
+      edit OVERLAP '0'
+      edit EMOS_TYPE 'an'
+      edit EPSFCRES '255'
+      inlimit /emc_36r1/limits:mars
+      inlimit /limits:mars
+      family cf
+        edit EMOS_TYPE 'cf'
+        edit NUMBER '0'
+        family cf408
+          edit STEPS '366/to/408/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family cf480
+          edit STEPS '414/to/480/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family cf600
+          edit STEPS '486/to/600/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family cf768
+          edit STEPS '606/to/768/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+      endfamily
+      family pf
+        complete /emc_36r1/main/ref/00/events:cf
+        edit EMOS_TYPE 'pf'
+        family pf408
+          edit STEPS '366/to/408/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family pf480
+          edit STEPS '414/to/480/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family pf600
+          edit STEPS '486/to/600/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family pf768
+          edit STEPS '606/to/768/by/6'
+          task pfpl
+            inlimit /emc_36r1/limits:pl
+            label files ""
+            label info ""
+            event fdb
+          task pfsfc
+            trigger ../../postproc/dp eq complete
+            inlimit /emc_36r1/limits:sfc
+            label files ""
+            label info ""
+            event fdb
+          task pfil
+            label files ""
+            label info ""
+            event fdb
+          task pfwv
+            edit STREAM 'WAEF'
+            edit EMOS_STREAM 'WAEF'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+      endfamily
+      family postproc
+        complete /emc_36r1/main/ref/00/events:cf
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+        edit FCCHUNK '1'
+        edit FCLENGTH '768'
+        inlimit /emc_36r1/limits:postproc
+        family mofc
+          complete /emc_36r1/main/ref/00/events:cf
+          trigger /emc_36r1/00/legC/postproc/mofc eq complete
+          task prob_archive
+            label info ""
+          task wmem_archive
+            label info ""
+          task wmanom_archive
+            label info ""
+          task signi_archive
+            trigger wmanom_archive eq complete
+            label info ""
+        endfamily
+        family ensms
+          trigger /emc_36r1/00/legC/postproc/ensms eq complete
+          edit EMOS_TYPE 'an'
+          family 768
+            edit STEPS '366/to/768/by/6'
+            task mean
+              edit TYPE 'em'
+              label files ""
+              label info ""
+              event fdb
+            task stdev
+              edit TYPE 'es'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family dp
+          trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+          edit RUNVARFC '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          edit EMOS_TYPE 'pf'
+          edit STEPS '366/to/768/by/6'
+          family cf
+            edit EMOS_TYPE 'cf'
+            task derivedp
+              label files ""
+              label info ""
+              event fdb
+            task extra_arc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit STEPS '360/to/768'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            task derivedp
+              label files ""
+              label info ""
+              event fdb
+            task extra_arc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit STEPS '360/to/768'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family extra
+          trigger /emc_36r1/00/legC/postproc/extra eq complete
+          edit RUNVARFC '1'
+          task wm_sfc_arc
+            label files ""
+            label info ""
+            event fdb
+          task wm_ua_arc
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family reord
+          complete /emc_36r1/lag/ref/00/events:cf
+          edit EPSCOUPLE '1'
+          edit EMOS_TYPE 'pf'
+          edit FCLENGTH0 '360'
+          edit FCLENGTH '768'
+          edit EPSFCRES '255'
+          edit FCCHUNK '1'
+          edit STEP1 '360'
+          edit STEP2 '768'
+          edit STEPS '-1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+          limit reord 1
+          inlimit reord
+          label info ""
+          family 130
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '130.128'
+            task reord
+              label info ""
+          endfamily
+          family 228
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '228.128'
+            task reord
+              label info ""
+          endfamily
+          family 207
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '207.128'
+            task reord
+              label info ""
+          endfamily
+          family 167
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '167.128'
+            task reord
+              label info ""
+          endfamily
+          family 164
+            edit GENERATE '1'
+            edit ARCHIVE '0'
+            edit PARAMS '164.128'
+            task reord
+              label info ""
+          endfamily
+          family arch
+            trigger ./130 eq complete and ./228 eq complete and ./207 eq complete and ./167 eq complete and ./164 eq complete
+            edit GENERATE '0'
+            edit ARCHIVE '1'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task reord
+              label info ""
+          endfamily
+        endfamily
+        family nino
+          edit FCCHUNK '1'
+          edit OCTOTAL '5'
+          edit FCTOTAL '51'
+          edit DAILY '0'
+          edit RUNVARFC '1'
+          edit FCLENGTH1 '360'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FCLENGTH '768'
+          edit EPSCOUPLE '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+          limit semaphore 10
+          inlimit /limits:linux_cluster
+          inlimit semaphore
+          family 00
+            edit OCGROUP 'an00'
+            edit FCGROUP 'fc0'
+            edit EPSMEMBER '0'
+            edit MEMBER '0'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 01
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc0'
+            edit EPSMEMBER '1'
+            edit MEMBER '1'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 02
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc0'
+            edit EPSMEMBER '2'
+            edit MEMBER '2'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 03
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc0'
+            edit EPSMEMBER '3'
+            edit MEMBER '3'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 04
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc0'
+            edit EPSMEMBER '4'
+            edit MEMBER '4'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 05
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc1'
+            edit EPSMEMBER '5'
+            edit MEMBER '5'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 06
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc1'
+            edit EPSMEMBER '6'
+            edit MEMBER '6'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 07
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc1'
+            edit EPSMEMBER '7'
+            edit MEMBER '7'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 08
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc1'
+            edit EPSMEMBER '8'
+            edit MEMBER '8'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 09
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc1'
+            edit EPSMEMBER '9'
+            edit MEMBER '9'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 10
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc2'
+            edit EPSMEMBER '10'
+            edit MEMBER '10'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 11
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc2'
+            edit EPSMEMBER '11'
+            edit MEMBER '11'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 12
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc2'
+            edit EPSMEMBER '12'
+            edit MEMBER '12'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 13
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc2'
+            edit EPSMEMBER '13'
+            edit MEMBER '13'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 14
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc2'
+            edit EPSMEMBER '14'
+            edit MEMBER '14'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 15
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc3'
+            edit EPSMEMBER '15'
+            edit MEMBER '15'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 16
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc3'
+            edit EPSMEMBER '16'
+            edit MEMBER '16'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 17
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc3'
+            edit EPSMEMBER '17'
+            edit MEMBER '17'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 18
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc3'
+            edit EPSMEMBER '18'
+            edit MEMBER '18'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 19
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc3'
+            edit EPSMEMBER '19'
+            edit MEMBER '19'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 20
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc4'
+            edit EPSMEMBER '20'
+            edit MEMBER '20'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 21
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc4'
+            edit EPSMEMBER '21'
+            edit MEMBER '21'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 22
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc4'
+            edit EPSMEMBER '22'
+            edit MEMBER '22'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 23
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc4'
+            edit EPSMEMBER '23'
+            edit MEMBER '23'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 24
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc4'
+            edit EPSMEMBER '24'
+            edit MEMBER '24'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 25
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc5'
+            edit EPSMEMBER '25'
+            edit MEMBER '25'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 26
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc5'
+            edit EPSMEMBER '26'
+            edit MEMBER '26'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 27
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc5'
+            edit EPSMEMBER '27'
+            edit MEMBER '27'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 28
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc5'
+            edit EPSMEMBER '28'
+            edit MEMBER '28'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 29
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc5'
+            edit EPSMEMBER '29'
+            edit MEMBER '29'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 30
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc6'
+            edit EPSMEMBER '30'
+            edit MEMBER '30'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 31
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc6'
+            edit EPSMEMBER '31'
+            edit MEMBER '31'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 32
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc6'
+            edit EPSMEMBER '32'
+            edit MEMBER '32'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 33
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc6'
+            edit EPSMEMBER '33'
+            edit MEMBER '33'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 34
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc6'
+            edit EPSMEMBER '34'
+            edit MEMBER '34'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 35
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc7'
+            edit EPSMEMBER '35'
+            edit MEMBER '35'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 36
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc7'
+            edit EPSMEMBER '36'
+            edit MEMBER '36'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 37
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc7'
+            edit EPSMEMBER '37'
+            edit MEMBER '37'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 38
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc7'
+            edit EPSMEMBER '38'
+            edit MEMBER '38'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 39
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc7'
+            edit EPSMEMBER '39'
+            edit MEMBER '39'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 40
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc8'
+            edit EPSMEMBER '40'
+            edit MEMBER '40'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 41
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc8'
+            edit EPSMEMBER '41'
+            edit MEMBER '41'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 42
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc8'
+            edit EPSMEMBER '42'
+            edit MEMBER '42'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 43
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc8'
+            edit EPSMEMBER '43'
+            edit MEMBER '43'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 44
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc8'
+            edit EPSMEMBER '44'
+            edit MEMBER '44'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 45
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc9'
+            edit EPSMEMBER '45'
+            edit MEMBER '45'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 46
+            edit OCGROUP 'an1'
+            edit FCGROUP 'fc9'
+            edit EPSMEMBER '46'
+            edit MEMBER '46'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 47
+            edit OCGROUP 'an2'
+            edit FCGROUP 'fc9'
+            edit EPSMEMBER '47'
+            edit MEMBER '47'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 48
+            edit OCGROUP 'an3'
+            edit FCGROUP 'fc9'
+            edit EPSMEMBER '48'
+            edit MEMBER '48'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 49
+            edit OCGROUP 'an4'
+            edit FCGROUP 'fc9'
+            edit EPSMEMBER '49'
+            edit MEMBER '49'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+          family 50
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc10'
+            edit EPSMEMBER '50'
+            edit MEMBER '50'
+            task nino_daily
+            task tcyc
+              trigger nino_daily eq complete or nino_daily eq aborted
+          endfamily
+        endfamily
+        task tcyctoecfs
+          trigger nino eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+          edit EPSCOUPLE '1'
+          edit FCLENGTH '768'
+          inlimit /limits:linux_cluster
+      endfamily
+      family coupled
+        complete /emc_36r1/main/ref/00/events:cf
+        edit EPSLEG '3'
+        edit OCLEG '3'
+        edit OCEPS '3'
+        edit FCCHUNK '1'
+        edit FCLENGTH '768'
+        edit FCLENGTH0 '360'
+        edit OCEPSTOT '3'
+        edit FCTOTAL '51'
+        edit RUNVARFC '1'
+        edit EPSCOUPLE '1'
+        edit RUNCOUPLE '1'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+        inlimit /emc_36r1/lag/ref/00:mutex
+        task preparcoce
+        task arcfc
+          trigger preparcoce eq complete
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+    endfamily
+    family msjobs
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/00:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/00:YMD and /emc_36r1/main/00/legA/fc/pf eq complete and /emc_36r1/main/00/legA/fc/cf eq complete and /emc_36r1/main/make eq complete)
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'ecgate'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit VERSION '0046'
+      edit STREAM 'EF'
+      edit EMOS_STREAM 'EF'
+      edit SMSURLBASE 'http://ecgate.ecmwf.int:9080'
+      edit SMSURL 'do/events'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/msjobs'
+      edit DELAY '120'
+      edit EMOS_TIME_STEP_H '768'
+      family hindcast
+        trigger /emc_36r1/hc0/postproc eq complete and /emc_36r1/00/ref/thu1000 eq complete
+        edit STREAM 'ENFH'
+        edit EMOS_STREAM 'ENFH'
+        edit MSJ_DIR 'mofcrefc'
+        task ms_ec
+      endfamily
+      family legC
+        trigger ../legC eq complete and /emc_36r1/00/ref/thu2200 eq complete
+        edit MSJ_DIR 'mofc_all'
+        task ms_ec
+        family noaa
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit RUNVARFC '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/msjobs/noaa'
+          edit DISS_HOUR '2200'
+          edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+          edit SMSURL 'CDC/EF/00'
+          edit CALL_FTP 'false'
+          edit CALL_ECPDS 'true'
+          task delete
+            trigger ncep_weekly eq complete and /emc_36r1/00/web eq complete and /emc_36r1/00/ref/tue eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+          task ncep_weekly
+            trigger /emc_36r1/00/web/process/mjo eq complete
+            edit SMSURL 'NO9/EF/00'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+            edit FCLENGTH '768'
+            edit ERA40END '2002033000'
+        endfamily
+      endfamily
+    endfamily
+    family web
+      trigger ../00:YMD + 14 le ../hc2:YMD
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit WSHOST 'linux_cluster'
+      edit QUEUE 'plots-medium'
+      edit MARS_DB 'c1b fdb'
+      edit EPSLEG '3'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+      edit EMOS_TYPE '00'
+      edit RUNVARFC '1'
+      edit NH_ENSEMBLES '4'
+      edit EXPVER_ENFH '0046'
+      edit EXPVER_EFHS '0046'
+      inlimit /limits:linux_cluster
+      inlimit /emc_36r1/limits:webplots
+      family stage
+        edit RETRIEVE 'stage'
+        task chi200
+        task olr
+        task u200
+        task u850
+      endfamily
+      family process
+        trigger ../legC/fc eq complete and ../legC/postproc eq complete
+        family anomaly
+          family temp
+            edit VAR 'TEMP'
+            task plot_anom
+          endfamily
+          family rain
+            edit VAR 'RAIN'
+            task plot_anom
+          endfamily
+          family mslp
+            edit VAR 'MSLP'
+            task plot_anom
+          endfamily
+          family 2mtm
+            edit VAR '2MTM'
+            task plot_anom
+          endfamily
+          task toweb
+            trigger temp eq complete and rain eq complete and mslp eq complete and ./2mtm eq complete
+        endfamily
+        family probanom
+          family temp
+            edit VAR 'TEMP'
+            task plot_prob
+          endfamily
+          family rain
+            edit VAR 'RAIN'
+            task plot_prob
+          endfamily
+          family mslp
+            edit VAR 'MSLP'
+            task plot_prob
+          endfamily
+          family 2mtm
+            edit VAR '2MTM'
+            task plot_prob
+          endfamily
+          task toweb
+            trigger temp eq complete and rain eq complete and mslp eq complete and ./2mtm eq complete
+        endfamily
+        family tercile
+          family temp
+            edit VAR 'TEMP'
+            task plot_terc
+          endfamily
+          family rain
+            edit VAR 'RAIN'
+            task plot_terc
+          endfamily
+          family mslp
+            edit VAR 'MSLP'
+            task plot_terc
+          endfamily
+          family 2mtm
+            edit VAR '2MTM'
+            task plot_terc
+          endfamily
+          task toweb
+            trigger temp eq complete and rain eq complete and mslp eq complete and ./2mtm eq complete
+            edit TERCILES '.terc1. .terc2.'
+        endfamily
+        family eps
+          trigger ./tercile eq complete or ./tercile/toweb eq aborted
+          family members
+            task mslp
+              late -c +02:00
+            task z500
+            task mslp_wm
+            task z500_wm
+          endfamily
+          family plumes
+            task plume31
+            task plumeter
+              trigger plume31 eq complete
+          endfamily
+          family regime
+            task kmeansclust
+            task kmeansclust_week
+            task plotkmeansclust
+              trigger kmeansclust_week eq complete and kmeansclust eq complete
+            task hovmoeller
+            task hovmoeller_itr
+            task flowz500
+            task multivar
+          endfamily
+          task epstoweb
+            trigger members eq complete and plumes eq complete and regime eq complete
+        endfamily
+        family mjo
+          trigger ../stage eq complete
+          edit FCLENGTH '768'
+          edit ERA40END '2002033000'
+          family process
+            task chi200
+            task olr
+            task u850
+            task u200
+          endfamily
+          task mjotoweb
+            trigger ceof eq complete
+          task ceof
+            trigger process eq complete
+          family ncep
+            trigger process eq complete
+            task olr_to_ncep
+            task u200_to_ncep
+            task u850_to_ncep
+          endfamily
+        endfamily
+        family tcyc
+          trigger /emc_36r1/00/arch/postproc/nino eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web/tcyc'
+          family hr
+            edit KIND 'hr'
+            family clim
+              edit PROC 'clim'
+              task tcycweb
+            endfamily
+            family map
+              edit PROC 'map'
+              task tcycweb
+            endfamily
+            family diff
+              trigger clim eq complete and map eq complete
+              edit PROC 'diff'
+              task tcycweb
+            endfamily
+          endfamily
+          family ts
+            edit KIND 'ts'
+            family clim
+              edit PROC 'clim'
+              task tcycweb
+            endfamily
+            family map
+              edit PROC 'map'
+              task tcycweb
+            endfamily
+            family diff
+              trigger clim eq complete and map eq complete
+              edit PROC 'diff'
+              task tcycweb
+            endfamily
+          endfamily
+          family td
+            edit KIND 'td'
+            family clim
+              edit PROC 'clim'
+              task tcycweb
+            endfamily
+            family map
+              edit PROC 'map'
+              task tcycweb
+            endfamily
+            family diff
+              trigger clim eq complete and map eq complete
+              edit PROC 'diff'
+              task tcycweb
+            endfamily
+          endfamily
+          task freq
+            trigger hr eq complete and ts eq complete and td eq complete
+          task tcyctoweb
+            trigger hr eq complete and ts eq complete and td eq complete and freq eq complete
+        endfamily
+        family tcyc_hc
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web/tcyc'
+          task tcyc_hc
+            edit WSHOST 'localhost'
+        endfamily
+      endfamily
+      task web_update
+        trigger ./process eq complete and /emc_36r1/00/ref/thu2200 eq complete
+      family clean
+        trigger process eq complete and web_update eq complete
+        task migrate
+        task delete
+          trigger migrate eq complete
+      endfamily
+    endfamily
+    family amma
+      trigger ./web eq complete and ./ref/thu2200 eq complete
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit UPDATE_WEB_NOW 'yes'
+      edit WSHOST 'linux_cluster'
+      edit QUEUE 'emos'
+      edit FSFAMILY 'assim'
+      edit FCTOTAL '51'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg/amma'
+      edit RUNVARFC '1'
+      edit EMOS_TYPE '00'
+      edit EMOS_BASE '00'
+      inlimit /limits:linux_cluster
+      family init
+        task list
+        task getfore
+          trigger ./list eq complete
+        task getclim
+          trigger ./getfore eq complete
+      endfamily
+      family anomaly
+        trigger ./init eq complete
+        family sf200
+          edit VAR 'SF200'
+          task stats_a
+          task plot_a
+            trigger stats_a eq complete
+        endfamily
+        family vp200
+          trigger ./sf200 eq complete
+          edit VAR 'VP200'
+          task stats_a
+          task plot_a
+            trigger stats_a eq complete
+        endfamily
+        task antoweb
+          trigger ./vp200 eq complete
+      endfamily
+      family tercile
+        trigger ./anomaly eq complete or ./anomaly/antoweb eq aborted
+        family sf200
+          edit VAR 'SF200'
+          task stats_t
+          task plot_t
+            trigger stats_t eq complete
+        endfamily
+        family vp200
+          trigger ./sf200 eq complete
+          edit VAR 'VP200'
+          task stats_t
+          task plot_t
+            trigger stats_t eq complete
+        endfamily
+        task trtoweb
+          trigger ./vp200 eq complete
+      endfamily
+      family mjo
+        trigger ./tercile eq complete or ./tercile/trtoweb eq aborted
+        edit ERA40END '2002033000'
+        task chi200
+          edit FCLENGTH '768'
+        task mjotoweb
+          trigger ./chi200 eq complete
+      endfamily
+      task cleanup
+        trigger ./mjo eq complete
+    endfamily
+    family efi
+      trigger ../hc0:YMD + 14 le ../hc2:YMD
+      edit MAXDAY '15'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+      inlimit /emc_36r1/limits:efih
+      family op
+        family clim
+          trigger /emc_36r1/hc2/efi/op eq complete
+          family steps24
+            family 000_024
+              edit ACC '24'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 012_036
+              edit ACC '24'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '24'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 036_060
+              edit ACC '24'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '24'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 060_084
+              edit ACC '24'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '24'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 084_108
+              edit ACC '24'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '24'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 108_132
+              edit ACC '24'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '24'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+            endfamily
+          endfamily
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family nop
+        family clim
+          trigger /emc_36r1/hc2/efi/nop eq complete
+          family steps24
+            family 000_024
+              edit ACC '24'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 012_036
+              edit ACC '24'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '24'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 036_060
+              edit ACC '24'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '24'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 060_084
+              edit ACC '24'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '24'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 084_108
+              edit ACC '24'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '24'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 108_132
+              edit ACC '24'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '24'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '24'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '24'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '24'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '24'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 240_264
+              edit ACC '24'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '264'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 264_288
+              edit ACC '24'
+              edit EFI_STEP1 '264'
+              edit EFI_STEP2 '288'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 288_312
+              edit ACC '24'
+              edit EFI_STEP1 '288'
+              edit EFI_STEP2 '312'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 312_336
+              edit ACC '24'
+              edit EFI_STEP1 '312'
+              edit EFI_STEP2 '336'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 336_360
+              edit ACC '24'
+              edit EFI_STEP1 '336'
+              edit EFI_STEP2 '360'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+          endfamily
+          family steps06
+            family 006_006
+              edit ACC '0'
+              edit EFI_STEP1 '006'
+              edit EFI_STEP2 '006'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 012_012
+              edit ACC '0'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '012'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 018_018
+              edit ACC '0'
+              edit EFI_STEP1 '018'
+              edit EFI_STEP2 '018'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 024_024
+              edit ACC '0'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 030_030
+              edit ACC '0'
+              edit EFI_STEP1 '030'
+              edit EFI_STEP2 '030'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 036_036
+              edit ACC '0'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '036'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 042_042
+              edit ACC '0'
+              edit EFI_STEP1 '042'
+              edit EFI_STEP2 '042'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 048_048
+              edit ACC '0'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 054_054
+              edit ACC '0'
+              edit EFI_STEP1 '054'
+              edit EFI_STEP2 '054'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 060_060
+              edit ACC '0'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '060'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 066_066
+              edit ACC '0'
+              edit EFI_STEP1 '066'
+              edit EFI_STEP2 '066'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 072_072
+              edit ACC '0'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 078_078
+              edit ACC '0'
+              edit EFI_STEP1 '078'
+              edit EFI_STEP2 '078'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 084_084
+              edit ACC '0'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '084'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 090_090
+              edit ACC '0'
+              edit EFI_STEP1 '090'
+              edit EFI_STEP2 '090'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 096_096
+              edit ACC '0'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 102_102
+              edit ACC '0'
+              edit EFI_STEP1 '102'
+              edit EFI_STEP2 '102'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 108_108
+              edit ACC '0'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '108'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 114_114
+              edit ACC '0'
+              edit EFI_STEP1 '114'
+              edit EFI_STEP2 '114'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 120_120
+              edit ACC '0'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 126_126
+              edit ACC '0'
+              edit EFI_STEP1 '126'
+              edit EFI_STEP2 '126'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 132_132
+              edit ACC '0'
+              edit EFI_STEP1 '132'
+              edit EFI_STEP2 '132'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 138_138
+              edit ACC '0'
+              edit EFI_STEP1 '138'
+              edit EFI_STEP2 '138'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 144_144
+              edit ACC '0'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 150_150
+              edit ACC '0'
+              edit EFI_STEP1 '150'
+              edit EFI_STEP2 '150'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 156_156
+              edit ACC '0'
+              edit EFI_STEP1 '156'
+              edit EFI_STEP2 '156'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 162_162
+              edit ACC '0'
+              edit EFI_STEP1 '162'
+              edit EFI_STEP2 '162'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 168_168
+              edit ACC '0'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 174_174
+              edit ACC '0'
+              edit EFI_STEP1 '174'
+              edit EFI_STEP2 '174'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 180_180
+              edit ACC '0'
+              edit EFI_STEP1 '180'
+              edit EFI_STEP2 '180'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 186_186
+              edit ACC '0'
+              edit EFI_STEP1 '186'
+              edit EFI_STEP2 '186'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 192_192
+              edit ACC '0'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '192'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 198_198
+              edit ACC '0'
+              edit EFI_STEP1 '198'
+              edit EFI_STEP2 '198'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 204_204
+              edit ACC '0'
+              edit EFI_STEP1 '204'
+              edit EFI_STEP2 '204'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 210_210
+              edit ACC '0'
+              edit EFI_STEP1 '210'
+              edit EFI_STEP2 '210'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 216_216
+              edit ACC '0'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '216'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 222_222
+              edit ACC '0'
+              edit EFI_STEP1 '222'
+              edit EFI_STEP2 '222'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 228_228
+              edit ACC '0'
+              edit EFI_STEP1 '228'
+              edit EFI_STEP2 '228'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 234_234
+              edit ACC '0'
+              edit EFI_STEP1 '234'
+              edit EFI_STEP2 '234'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+            family 240_240
+              edit ACC '0'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prep_sort
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prep_sort
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prep_sort
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prep_sort
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prep_sort
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prep_sort
+              endfamily
+              family 10dd
+                edit RF_NAME '10dd'
+                task prep_sort
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prep_sort
+              endfamily
+              family tcc
+                edit RF_NAME 'tcc'
+                task prep_sort
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prep_sort
+              endfamily
+            endfamily
+          endfamily
+          family 120_168
+            trigger ./steps24 eq complete
+            edit ACC '48'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_240
+            trigger ./steps24 eq complete
+            edit ACC '72'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 000_168
+            trigger ./steps24 eq complete
+            edit ACC '168'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_336
+            trigger ./steps24 eq complete
+            edit ACC '96'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_336
+            trigger ./steps24 eq complete
+            edit ACC '168'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      task efi_clean
+      task sync_climate
+        trigger op eq complete and nop eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi'
+        time 20:45
+      family swarm
+        trigger ./sync_climate eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        inlimit /limits:linux_cluster
+        time 20:45
+        task sync_climate
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:35
+      trigger ref eq complete and logfilestore eq complete and legC eq complete and arch eq complete and msjobs eq complete and web eq complete and amma eq complete and efi eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+  family limits
+    limit mars 15
+    limit marsret 10
+    limit reservation 1
+    limit pftotal 72
+    limit pertic 26
+    limit modelepsA 13
+    limit modelepsB 52
+    limit pl 3
+    limit sfc 3
+    limit prodeps 9
+    limit prodwave 5
+    limit pdb 5
+    limit q2diss 5
+    limit w2diss 2
+    limit hind 60
+    limit pesh 60
+    limit efih 40
+    limit refc 10
+    limit webplots 9
+    limit postproc 40
+    limit dp 8
+    limit tc 7
+    limit efi 20
+    limit extra 20
+  endfamily
+  family main
+    repeat date YMD 20091003 20121212 1
+    edit LOGTASK 'main'
+    edit SUITE_START '20091124'
+    family make
+      task setup
+      task links
+        trigger setup eq complete
+        edit FSFAMILY 'an'
+        edit WSHOST 'bee01'
+      task datalinks
+        trigger setup eq complete and links eq complete
+      family det_bins
+        trigger links eq complete and datalinks eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+        task odbsql
+        task odbtools
+          trigger odbsql eq complete
+        task black
+          edit FSFAMILY 'an'
+        task b2otools
+          trigger odbtools eq complete
+          edit CALC_PSBIAS 'false'
+          edit INIPSBIAS 'false'
+          edit USE_PSBIAS 'false'
+        task ifs
+          trigger black eq complete and odbsql eq complete and odbtools eq complete and b2otools eq complete
+          edit FSFAMILY 'an'
+      endfamily
+      family bins
+        trigger links eq complete and datalinks eq complete and det_bins eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+        task cluster
+        task wamabs
+        task prepdata
+        task tc_ws
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task mc_tools
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+          edit THREADS '1'
+        task efi
+      endfamily
+      family prod
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/prod/make'
+        edit EMOS_DOMAIN 'g'
+        edit EMOS_TYPE 'fc'
+        edit EMOS_STREAM 'OPER'
+        task wparam
+          edit EMOS_TYPE 'wp'
+        task tf
+          edit EMOS_TYPE 'tf'
+        task sortreq
+        task bitmap
+        task clima
+        task disssch
+        task tools
+        task ef
+          edit EMOS_STREAM 'ENFO'
+          edit EMOS_TYPE 'ef'
+        task waef
+          edit EMOS_STREAM 'WAEF'
+          edit EMOS_TYPE 'ef'
+      endfamily
+      family mofc
+        trigger links eq complete
+        edit EPSCOUPLE '1'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+        edit RUNCOUPLE '1'
+        edit RUNVARFC '1'
+        task ocsetup
+        task libsoc
+          trigger ocsetup eq complete
+        task oclinks
+          trigger libsoc eq complete
+        task oasis
+          trigger ../det_bins/ifs eq complete
+        task prepdata
+          trigger oclinks eq complete
+        task ma_tools
+          trigger oclinks eq complete
+        family ocean
+          trigger ./ma_tools eq complete
+          task getoce
+          task getfr
+            trigger getoce eq complete
+          task ocean
+            trigger ../libsoc eq complete
+          task forcing
+            trigger ../libsoc eq complete and ocean eq complete
+          task getcouple
+            trigger getoce eq complete
+            edit RUNCOUPLE '1'
+            edit FCGROUP 'fc0'
+        endfamily
+        task tools
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task mofc_tools
+          edit EPSCOUPLE '1'
+        task lib_pp
+          edit EPSCOUPLE '1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task lib_verif
+          edit EPSCOUPLE '1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task lib_clim
+          edit EPSCOUPLE '1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit START_DAY '20091008'
+          edit END_DAY '20121213'
+          edit RUNHINDCAST '1'
+          inlimit /limits:linux_cluster
+      endfamily
+      family wconst
+        trigger bins/wamabs eq complete and links eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+        edit EPSNLEGS '3'
+        edit EPSFCLEV '62'
+        edit EPSWAMNSTPW '1'
+        edit EPSINISTEP_PREVIOUS '0'
+        edit EPSWAMRESOL 'global50'
+        edit EPSFCRES '639'
+        edit TSTEP '1200'
+        edit EPSWAMNFRE '30'
+        edit EPSWAMNANG '24'
+        edit CLASS 'od'
+        task wconstA
+          edit EPSWAMRESOL 'global50'
+          edit EPSFCRES '639'
+          edit EPSWAMNFRE '30'
+          edit EPSWAMNANG '24'
+        task wconstB
+          trigger wconstA eq complete
+          edit EPSWAMRESOL 'global50'
+          edit EPSINISTEP '216'
+          edit EPSFCRES '319'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+        task wconstC
+          trigger wconstB eq complete
+          edit EPSCOUPLE '1'
+          edit EPSWAMRESOL 'global300'
+          edit EPSFCRES '319'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+      endfamily
+      task makesvevo
+        trigger links eq complete
+      task makesvevo_00
+        trigger links eq complete
+        edit DELTA_DAY '1'
+        edit EMOS_BASE '00'
+      task inistage
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+      family make_sv
+        trigger det_bins/ifs eq complete and links eq complete and inistage eq complete
+        family m2_12
+          edit EMOS_BASE '12'
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family m2_00
+          edit EMOS_BASE '00'
+          edit DELTA_DAY '-1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family m1_12
+          edit EMOS_BASE '12'
+          edit DELTA_DAY '-1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family m1_00
+          edit EMOS_BASE '00'
+          edit DELTA_DAY '-0'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+      endfamily
+      family calib
+        trigger links eq complete and datalinks eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+        family onws
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+          task tubes
+            edit DELTA_DAY '0'
+          task tubes_00
+            edit EMOS_BASE '00'
+            edit DELTA_DAY '1'
+        endfamily
+        family onsc
+          edit QUEUE 'ns'
+          edit QUEUE_EPILOG 'ns'
+          edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+          edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+          inlimit /limits:c1b
+          task tubes
+            edit DELTA_DAY '0'
+          task tubes_00
+            edit EMOS_BASE '00'
+            edit DELTA_DAY '1'
+        endfamily
+      endfamily
+    endfamily
+    task inistage
+      trigger ./make eq complete
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+    task inistage_1
+      trigger ./inistage eq complete
+      edit DELTA_DAY '1'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/make'
+    family ref
+      trigger /emc_36r1/main:YMD le /emc_36r1/main/ref:MC_STOP
+      edit MC_STOP '20121213'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+      limit mutex 1
+      family 12
+        edit EMOS_BASE '12'
+        task events
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+          edit HINDCAST '1'
+          edit ONLY_CF '0'
+          event noefi
+          event 240 
+          event 360 
+          event cpl
+          event 768 
+          event cf
+      endfamily
+      family 00
+        edit EMOS_BASE '00'
+        edit DELTA_DAY '1'
+        task events
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+          edit HINDCAST '1'
+          edit ONLY_CF '0'
+          event noefi
+          event 240 
+          event 360 
+          event cpl
+          event 768 
+          event cf
+      endfamily
+      task dummy
+        time 13:00
+      task cpl_nocpl
+      task wait
+        complete ( /emc_36r1/lag:YMD + 1) ge /emc_36r1/main:YMD
+        trigger ( /emc_36r1/lag:YMD + 1) ge /emc_36r1/main:YMD
+    endfamily
+    family 12
+      trigger ( ./make eq complete) and ( ./inistage eq complete)
+      edit EMOS_BASE '12'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+      family ref
+        trigger ../make eq complete and ( /emc_36r1/main:YMD le /e_36r1/main:YMD)
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit QUEUE 'emos-exp'
+        limit mutex 1
+        task an
+          trigger /e_36r1/main/12/an eq complete
+        task anfc
+          complete ( ( /e_36r1/main/12/an/surf_anal/slwet eq complete and ( /e_36r1/main/12/an/4dvar/ifstraj:finalwave or /e_36r1/main/12/an/4dvar eq complete)) or /e_36r1/main/12/an eq complete)
+          trigger 0 eq 1
+        task model_active
+          trigger /e_36r1/main/12/fc/model eq active or /e_36r1/main/12/fc/model eq complete
+        task an_active
+          trigger /e_36r1/main/12/an/4dvar/uptraj_0 eq active or /e_36r1/main/12/an/4dvar/uptraj_0 eq complete
+        task model
+          trigger /e_36r1/main/12/fc/model eq complete
+        task dc
+          trigger /e_36r1/main/00dc/fc/model:step ge 12 or /e_36r1/main/00dc/fc/model eq complete
+        task obs
+          trigger /e_36r1/main/12/obs/get/get_stor eq complete
+      endfamily
+      family sv
+        trigger ./ref/dc eq complete and ./ref/an_active eq complete
+        edit EVOLVE 'no'
+        edit FASTEX 'no'
+        edit EPSTYPE 'sv'
+        edit FCMEM '2000'
+        edit FCSTACK '400'
+        edit FCMRFS '100'
+        edit FCLENGTH '48'
+        edit EPSSVTCSUB '1'
+        edit EPSSVOP '1'
+        edit NPES '16'
+        edit EPSSVTSTEP '900'
+        task getini
+          edit LINIENDA '0'
+          edit INIDATEENDA '0'
+          edit EPSCOUPLE '0'
+          edit N_PERT_AN '10'
+          edit EPSCOUPL_A '0'
+          edit EPSCOUPL_B '0'
+          edit EPSCOUPL_C '0'
+        task inidata_sv
+          trigger getini eq complete
+          edit THREADS '8'
+        task targets
+          late -s +00:03 -c +00:10
+          trigger ../ref/obs eq complete
+          edit EPSTCBB '1'
+          label da_info ""
+          label dcda_info ""
+          event sv
+        task svsh
+          trigger inidata_sv eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit THREADS '8'
+          edit USER_PRIORITY '73'
+        task svnh
+          trigger inidata_sv eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit THREADS '8'
+          edit USER_PRIORITY '74'
+        task subspace
+          trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+        task sv1
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '1'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+          edit USER_PRIORITY '72'
+        task sv2
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '2'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+          edit USER_PRIORITY '71'
+        task sv3
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '3'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task sv4
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '4'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task sv5
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '5'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task sv6
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '6'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task getsvevo
+          event ecfs
+        task getsvs
+          trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit EPSTROP '1'
+        task sv_value
+          trigger getsvs eq complete
+          inlimit /emc_36r1/main/ref:mutex
+        task svnhevo
+          trigger svnh eq complete and ../legA/fc eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit STACK '350'
+          edit HEMISPHERE 'n'
+          edit EVOLVE 'yes'
+          edit ANNPES '8'
+          edit CPUTIME '120000'
+        task svshevo
+          trigger svsh eq complete and ../legA/fc eq complete
+          edit NPES '24'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit STACK '450'
+          edit EVOLVE 'yes'
+          edit ANNPES '8'
+          edit CPUTIME '120000'
+        task clean
+          trigger ../legA/fc eq complete and svnhevo eq complete and svshevo eq complete
+        task dcopy
+          trigger clean eq complete
+          edit SMSFILES '/home/ma/emos/def/o/system'
+      endfamily
+      family legA
+        edit EPSLEG '1'
+        family fc
+          trigger /emc_36r1/main/12/ref/anfc eq complete
+          edit FCMEM '2240'
+          edit FCSTACK '700'
+          edit FCMRFS '0'
+          edit PRIORITY '72'
+          edit USER_PRIORITY '72'
+          edit N_PERT_AN '10'
+          edit SSTLEN '240'
+          edit EPSINISTEP_PREVIOUS '0'
+          edit EPSWAMNFRE '30'
+          edit EPSWAMNANG '24'
+          edit TSTEP '1200'
+          edit EPSFCRES '639'
+          edit RESOL '639'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit CPUTIME '1000'
+          edit MEM '960'
+          edit THREADS '8'
+          edit NPES '8'
+          edit EPSLEG '1'
+          edit PERSST 'true'
+          edit SSTINT '1'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata
+            trigger getini eq complete
+            edit THREADS '8'
+          task getae
+            event 1 
+          task rot
+            trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+            edit EPSTROP '1'
+          family pert_ic
+            trigger rot eq complete and inidata eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+            inlimit /emc_36r1/limits:pertic
+            family 00
+              task pertinic
+                edit MEMBER '0'
+            endfamily
+            family 01
+              task pertinic
+                edit MEMBER '1'
+            endfamily
+            family 02
+              task pertinic
+                edit MEMBER '2'
+            endfamily
+            family 03
+              task pertinic
+                edit MEMBER '3'
+            endfamily
+            family 04
+              task pertinic
+                edit MEMBER '4'
+            endfamily
+            family 05
+              task pertinic
+                edit MEMBER '5'
+            endfamily
+            family 06
+              task pertinic
+                edit MEMBER '6'
+            endfamily
+            family 07
+              task pertinic
+                edit MEMBER '7'
+            endfamily
+            family 08
+              task pertinic
+                edit MEMBER '8'
+            endfamily
+            family 09
+              task pertinic
+                edit MEMBER '9'
+            endfamily
+            family 10
+              task pertinic
+                edit MEMBER '10'
+            endfamily
+            family 11
+              task pertinic
+                edit MEMBER '11'
+            endfamily
+            family 12
+              task pertinic
+                edit MEMBER '12'
+            endfamily
+            family 13
+              task pertinic
+                edit MEMBER '13'
+            endfamily
+            family 14
+              task pertinic
+                edit MEMBER '14'
+            endfamily
+            family 15
+              task pertinic
+                edit MEMBER '15'
+            endfamily
+            family 16
+              task pertinic
+                edit MEMBER '16'
+            endfamily
+            family 17
+              task pertinic
+                edit MEMBER '17'
+            endfamily
+            family 18
+              task pertinic
+                edit MEMBER '18'
+            endfamily
+            family 19
+              task pertinic
+                edit MEMBER '19'
+            endfamily
+            family 20
+              task pertinic
+                edit MEMBER '20'
+            endfamily
+            family 21
+              task pertinic
+                edit MEMBER '21'
+            endfamily
+            family 22
+              task pertinic
+                edit MEMBER '22'
+            endfamily
+            family 23
+              task pertinic
+                edit MEMBER '23'
+            endfamily
+            family 24
+              task pertinic
+                edit MEMBER '24'
+            endfamily
+            family 25
+              task pertinic
+                edit MEMBER '25'
+            endfamily
+            family 26
+              task pertinic
+                edit MEMBER '26'
+            endfamily
+            family 27
+              task pertinic
+                edit MEMBER '27'
+            endfamily
+            family 28
+              task pertinic
+                edit MEMBER '28'
+            endfamily
+            family 29
+              task pertinic
+                edit MEMBER '29'
+            endfamily
+            family 30
+              task pertinic
+                edit MEMBER '30'
+            endfamily
+            family 31
+              task pertinic
+                edit MEMBER '31'
+            endfamily
+            family 32
+              task pertinic
+                edit MEMBER '32'
+            endfamily
+            family 33
+              task pertinic
+                edit MEMBER '33'
+            endfamily
+            family 34
+              task pertinic
+                edit MEMBER '34'
+            endfamily
+            family 35
+              task pertinic
+                edit MEMBER '35'
+            endfamily
+            family 36
+              task pertinic
+                edit MEMBER '36'
+            endfamily
+            family 37
+              task pertinic
+                edit MEMBER '37'
+            endfamily
+            family 38
+              task pertinic
+                edit MEMBER '38'
+            endfamily
+            family 39
+              task pertinic
+                edit MEMBER '39'
+            endfamily
+            family 40
+              task pertinic
+                edit MEMBER '40'
+            endfamily
+            family 41
+              task pertinic
+                edit MEMBER '41'
+            endfamily
+            family 42
+              task pertinic
+                edit MEMBER '42'
+            endfamily
+            family 43
+              task pertinic
+                edit MEMBER '43'
+            endfamily
+            family 44
+              task pertinic
+                edit MEMBER '44'
+            endfamily
+            family 45
+              task pertinic
+                edit MEMBER '45'
+            endfamily
+            family 46
+              task pertinic
+                edit MEMBER '46'
+            endfamily
+            family 47
+              task pertinic
+                edit MEMBER '47'
+            endfamily
+            family 48
+              task pertinic
+                edit MEMBER '48'
+            endfamily
+            family 49
+              task pertinic
+                edit MEMBER '49'
+            endfamily
+            family 50
+              task pertinic
+                edit MEMBER '50'
+            endfamily
+          endfamily
+          task cp_pert
+            trigger pert_ic eq complete
+            event 1 
+          task wavini
+            trigger /emc_36r1/main/12/ref/an eq complete
+            edit FSFAMILY 'mc'
+          family cv
+            trigger ./pert_ic/00 eq complete and ./inidata eq complete and ./wavini eq complete and /emc_36r1/main/12/ref/model_active eq complete
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit EPSFCRES '639'
+            edit TSTEP '1200'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit CLASS 'od'
+            edit PERSST 'no'
+            edit EPSTYPE 'cv'
+            edit EMOS_TYPE 'cv'
+            edit EPSNLEGS '1'
+            edit EPSLEG '1'
+            edit EPSINISTEP '360'
+            edit FCLENGTH '360'
+            edit USER_PRIORITY '73'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            inlimit /emc_36r1/limits:pftotal
+            family control_1
+              edit MEMBER '1'
+              edit EPSMEMBER '1'
+              edit SUBFSFAMILY '/cv001'
+              task getiniLeg
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit FCNPES '32'
+                edit THREADS '4'
+                meter step -1 360 360
+              task derived_param
+                trigger modeleps eq complete
+                edit STEPS '0:144:3 144:360:6'
+            endfamily
+            family control_2
+              edit MEMBER '2'
+              edit EPSMEMBER '2'
+              edit SUBFSFAMILY '/cv002'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              task getiniLeg
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task intHtoL
+                trigger getiniLeg eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '1200'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                meter step -1 360 360
+              task derived_param
+                trigger modeleps eq complete
+                edit STEPS '0:144:3 144:360:6'
+            endfamily
+          endfamily
+          task wavfcdata
+            trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+            edit EPSCOUPLE '1'
+          task getpersSST
+            trigger ./inidata eq complete
+            edit EPSCOUPLE '1'
+            edit EPS_INI_STREAM 'DA'
+            edit EPSFCRES '639'
+          family pf
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete and ../../ref/model_active eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTYPE 'pf'
+            edit EMOS_TYPE 'pf'
+            edit USER_PRIORITY '72'
+            edit PRIORITY '72'
+            edit FCNPES '32'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit EPSFCRES '639'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit EPSINISTEP '216'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '1'
+            edit CLASS 'od'
+            inlimit /emc_36r1/limits:pftotal
+            meter step -1 240 240
+            family 01
+              edit EPSMEMBER '1'
+              edit MEMBER '1'
+              edit SUBFSFAMILY '/pf001'
+              task getiniLeg
+                trigger ../../pert_ic/01/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 02
+              edit EPSMEMBER '2'
+              edit MEMBER '2'
+              edit SUBFSFAMILY '/pf002'
+              task getiniLeg
+                trigger ../../pert_ic/02/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 03
+              edit EPSMEMBER '3'
+              edit MEMBER '3'
+              edit SUBFSFAMILY '/pf003'
+              task getiniLeg
+                trigger ../../pert_ic/03/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 04
+              edit EPSMEMBER '4'
+              edit MEMBER '4'
+              edit SUBFSFAMILY '/pf004'
+              task getiniLeg
+                trigger ../../pert_ic/04/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 05
+              edit EPSMEMBER '5'
+              edit MEMBER '5'
+              edit SUBFSFAMILY '/pf005'
+              task getiniLeg
+                trigger ../../pert_ic/05/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 06
+              edit EPSMEMBER '6'
+              edit MEMBER '6'
+              edit SUBFSFAMILY '/pf006'
+              task getiniLeg
+                trigger ../../pert_ic/06/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 07
+              edit EPSMEMBER '7'
+              edit MEMBER '7'
+              edit SUBFSFAMILY '/pf007'
+              task getiniLeg
+                trigger ../../pert_ic/07/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 08
+              edit EPSMEMBER '8'
+              edit MEMBER '8'
+              edit SUBFSFAMILY '/pf008'
+              task getiniLeg
+                trigger ../../pert_ic/08/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 09
+              edit EPSMEMBER '9'
+              edit MEMBER '9'
+              edit SUBFSFAMILY '/pf009'
+              task getiniLeg
+                trigger ../../pert_ic/09/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 10
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              edit SUBFSFAMILY '/pf010'
+              task getiniLeg
+                trigger ../../pert_ic/10/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 11
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              edit SUBFSFAMILY '/pf011'
+              task getiniLeg
+                trigger ../../pert_ic/11/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 12
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              edit SUBFSFAMILY '/pf012'
+              task getiniLeg
+                trigger ../../pert_ic/12/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 13
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              edit SUBFSFAMILY '/pf013'
+              task getiniLeg
+                trigger ../../pert_ic/13/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 14
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              edit SUBFSFAMILY '/pf014'
+              task getiniLeg
+                trigger ../../pert_ic/14/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 15
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              edit SUBFSFAMILY '/pf015'
+              task getiniLeg
+                trigger ../../pert_ic/15/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 16
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              edit SUBFSFAMILY '/pf016'
+              task getiniLeg
+                trigger ../../pert_ic/16/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 17
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              edit SUBFSFAMILY '/pf017'
+              task getiniLeg
+                trigger ../../pert_ic/17/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 18
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              edit SUBFSFAMILY '/pf018'
+              task getiniLeg
+                trigger ../../pert_ic/18/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 19
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              edit SUBFSFAMILY '/pf019'
+              task getiniLeg
+                trigger ../../pert_ic/19/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 20
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              edit SUBFSFAMILY '/pf020'
+              task getiniLeg
+                trigger ../../pert_ic/20/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 21
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              edit SUBFSFAMILY '/pf021'
+              task getiniLeg
+                trigger ../../pert_ic/21/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 22
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              edit SUBFSFAMILY '/pf022'
+              task getiniLeg
+                trigger ../../pert_ic/22/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 23
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              edit SUBFSFAMILY '/pf023'
+              task getiniLeg
+                trigger ../../pert_ic/23/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 24
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              edit SUBFSFAMILY '/pf024'
+              task getiniLeg
+                trigger ../../pert_ic/24/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 25
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              edit SUBFSFAMILY '/pf025'
+              task getiniLeg
+                trigger ../../pert_ic/25/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 26
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              edit SUBFSFAMILY '/pf026'
+              task getiniLeg
+                trigger ../../pert_ic/26/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 27
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              edit SUBFSFAMILY '/pf027'
+              task getiniLeg
+                trigger ../../pert_ic/27/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 28
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              edit SUBFSFAMILY '/pf028'
+              task getiniLeg
+                trigger ../../pert_ic/28/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 29
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              edit SUBFSFAMILY '/pf029'
+              task getiniLeg
+                trigger ../../pert_ic/29/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 30
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              edit SUBFSFAMILY '/pf030'
+              task getiniLeg
+                trigger ../../pert_ic/30/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 31
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              edit SUBFSFAMILY '/pf031'
+              task getiniLeg
+                trigger ../../pert_ic/31/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 32
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              edit SUBFSFAMILY '/pf032'
+              task getiniLeg
+                trigger ../../pert_ic/32/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 33
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              edit SUBFSFAMILY '/pf033'
+              task getiniLeg
+                trigger ../../pert_ic/33/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 34
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              edit SUBFSFAMILY '/pf034'
+              task getiniLeg
+                trigger ../../pert_ic/34/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 35
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              edit SUBFSFAMILY '/pf035'
+              task getiniLeg
+                trigger ../../pert_ic/35/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 36
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              edit SUBFSFAMILY '/pf036'
+              task getiniLeg
+                trigger ../../pert_ic/36/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 37
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              edit SUBFSFAMILY '/pf037'
+              task getiniLeg
+                trigger ../../pert_ic/37/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 38
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              edit SUBFSFAMILY '/pf038'
+              task getiniLeg
+                trigger ../../pert_ic/38/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 39
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              edit SUBFSFAMILY '/pf039'
+              task getiniLeg
+                trigger ../../pert_ic/39/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 40
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              edit SUBFSFAMILY '/pf040'
+              task getiniLeg
+                trigger ../../pert_ic/40/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 41
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              edit SUBFSFAMILY '/pf041'
+              task getiniLeg
+                trigger ../../pert_ic/41/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 42
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              edit SUBFSFAMILY '/pf042'
+              task getiniLeg
+                trigger ../../pert_ic/42/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 43
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              edit SUBFSFAMILY '/pf043'
+              task getiniLeg
+                trigger ../../pert_ic/43/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 44
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              edit SUBFSFAMILY '/pf044'
+              task getiniLeg
+                trigger ../../pert_ic/44/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 45
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              edit SUBFSFAMILY '/pf045'
+              task getiniLeg
+                trigger ../../pert_ic/45/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 46
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              edit SUBFSFAMILY '/pf046'
+              task getiniLeg
+                trigger ../../pert_ic/46/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 47
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              edit SUBFSFAMILY '/pf047'
+              task getiniLeg
+                trigger ../../pert_ic/47/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 48
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              edit SUBFSFAMILY '/pf048'
+              task getiniLeg
+                trigger ../../pert_ic/48/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 49
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              edit SUBFSFAMILY '/pf049'
+              task getiniLeg
+                trigger ../../pert_ic/49/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 50
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              edit SUBFSFAMILY '/pf050'
+              task getiniLeg
+                trigger ../../pert_ic/50/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family cf
+            trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete and /emc_36r1/main/12/ref/model_active eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit MEMBER '0'
+            edit EPSMEMBER '0'
+            edit SUBFSFAMILY '/cf000'
+            edit EPSTYPE 'cf'
+            edit EMOS_TYPE 'cf'
+            edit USER_PRIORITY '73'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit EPSFCRES '639'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit EPSINISTEP '216'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '1'
+            edit CLASS 'od'
+            task getiniLeg
+              trigger ../inidata eq complete and ../wavini eq complete
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task modeleps
+              trigger getiniLeg eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '1'
+              edit EPSFCRES '639'
+              edit EPSINISTEP '216'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit CLASS 'od'
+              edit FCNPES '32'
+              edit THREADS '4'
+              meter step -1 240 240
+          endfamily
+          family reservation1
+            trigger ./pf/01/modeleps eq active or ./pf/01/modeleps eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reserve_cpu
+              late -s +00:02 -c +00:02
+              edit RESERVED_CPUS '10880'
+              edit RESERVE_FOR '48'
+              label info ""
+            task rm_res
+              late -s +00:02 -c +00:02
+              trigger ./reserve_cpu eq complete
+              edit RESERVATION_LABEL 'emos12'
+              label info ""
+          endfamily
+          family reservation2
+            trigger ( ./pf/46/modeleps eq active or ./pf/46/modeleps eq complete) and ( ./pf/47/modeleps eq active or ./pf/47/modeleps eq complete) and ( ./pf/48/modeleps eq active or ./pf/48/modeleps eq complete) and ( ./pf/49/modeleps eq active or ./pf/49/modeleps eq complete) and ( ./pf/50/modeleps eq active or ./pf/50/modeleps eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reset_class
+              late -s +00:02 -c +00:02
+              edit RESERVATION_DEFINITION 'default'
+              label info ""
+            task ms_cpu
+              late -s +00:02 -c +00:02
+              edit MS_CPUS '12800'
+              label info ""
+            task reserve_cpu
+              late -s +00:02 -c +00:02
+              edit RESERVED_CPUS '6400'
+              edit RESERVE_FOR '40'
+              label info ""
+          endfamily
+          family reservation3
+            trigger ( ./pf eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reserve_cpu
+              late -s +00:02 -c +00:02
+              edit RESERVED_CPUS '1024'
+              edit RESERVE_FOR '20'
+              label info ""
+          endfamily
+        endfamily
+        family fax
+          trigger /emc_36r1/main/12/ref/an eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+          task ena4
+            trigger ../postproc/clusters eq complete and ../postproc/ensms eq complete
+            edit ANALYSIS 'NO'
+          task plume
+            trigger ../postproc/prob eq complete and /emc_36r1/main/12/ref/model eq complete
+            edit ANALYSIS 'YES'
+          task fax
+            trigger plume eq complete and ena4 eq complete
+            edit SMSTRIES '1'
+          task manfax
+            trigger plume eq complete and ena4 eq complete
+            edit SMSTRIES '1'
+            edit COUNTRY ''
+          task faxcheck
+            trigger fax eq complete
+          task faxcheck2
+            trigger fax eq complete
+            time 08:00
+        endfamily
+        family postproc
+          trigger ./fc ne queued
+          edit STEPS '24/240/12/24 168/168/12/48 240/240/12/72 240/240/12/120'
+          inlimit /emc_36r1/limits:postproc
+          family prepare
+            complete /emc_36r1/main/ref/12/events:cf
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            family all
+              complete ../../fc eq complete and ./query eq active
+              trigger ../../fc eq complete and ( ./query eq queued or ./query eq complete)
+              edit KIND 'all'
+              edit STEP '-1'
+              family t850
+                edit PARAM 'T'
+                edit LEVEL '850'
+                task pp_prep
+              endfamily
+              family t500
+                edit PARAM 'T'
+                edit LEVEL '500'
+                task pp_prep
+              endfamily
+              family z1000
+                edit PARAM 'Z'
+                edit LEVEL '1000'
+                task pp_prep
+              endfamily
+              family z500
+                edit PARAM 'Z'
+                edit LEVEL '500'
+                task pp_prep
+              endfamily
+            endfamily
+            family query
+              complete ../../fc eq complete and ../../fc/pf:step le 0
+              trigger ( ( ../../fc/pf:step ge 0) and ( ../../fc/cf/modeleps:step ge 0)) or ( ../../fc/pf eq complete and ../../fc/cf eq complete)
+              edit KIND 'query'
+              family t850
+                edit PARAM 'T'
+                edit LEVEL '850'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+              family t500
+                edit PARAM 'T'
+                edit LEVEL '500'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+              family z1000
+                edit PARAM 'Z'
+                edit LEVEL '1000'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+              family z500
+                edit PARAM 'Z'
+                edit LEVEL '500'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+            endfamily
+          endfamily
+          family ensms
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger ( ../fc eq complete) and ( ./prepare eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            family limits
+              limit fdb 1
+              limit gen 8
+            endfamily
+            task ensms
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit ENS_MARS 'false'
+              event stage
+            family 048
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '003'
+              edit STEP2 '048'
+              edit BY '3'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 096
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '051'
+              edit STEP2 '096'
+              edit BY '3'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 144
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '099'
+              edit STEP2 '144'
+              edit BY '3'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 240
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '150'
+              edit STEP2 '240'
+              edit BY '6'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+          endfamily
+          family prob
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger /emc_36r1/main/12/legA/fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            edit STEP1 '12'
+            edit STEP2 '240'
+            edit BY '12'
+            family 24
+              edit STEP1 '24'
+              edit STEP2 '240'
+              edit BY '24'
+              family t850
+                trigger ../../prepare/all/t850 eq complete
+                family 120_240
+                  edit STEPS '120 240'
+                  task t850
+                    event 1 
+                endfamily
+                family 120_168
+                  trigger ./120_240/t850:1 or ./120_240 eq complete
+                  edit STEPS '120 168'
+                  task t850
+                    event 1 
+                endfamily
+                family 168_240
+                  trigger ./120_240/t850:1 or ./120_240 eq complete
+                  edit STEPS '168 240'
+                  task t850
+                    event 1 
+                endfamily
+              endfamily
+              task rain
+              task ff
+            endfamily
+            family 12
+              edit STEP1 '12'
+              edit STEP2 '228'
+              edit BY '24'
+              task t850
+                trigger ../../prepare/all/t850 eq complete
+              task rain
+              task ff
+            endfamily
+            task 2t
+            task swh
+            task mwp
+            task 10fg
+              trigger ../dp eq complete
+            task prob_fdb
+              trigger ./2t eq complete and swh eq complete and mwp eq complete and ./10fg eq complete and ./12 eq complete and ./24 eq complete
+          endfamily
+          family tc
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger ../fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/tc'
+            edit TCINIEXPVER '0046'
+            family obsdata
+              trigger ( /emc_36r1/main/12/legA/fc/pf eq complete and /emc_36r1/main/12/legA/fc/cf eq complete)
+              task retrieve
+                late -c +00:10
+                trigger ( /emc_36r1/main/12/sv/targets eq complete or /emc_36r1/main/12/sv/targets:sv)
+                label info ""
+                event notc
+              task obs
+                trigger retrieve eq complete
+            endfamily
+            family stage
+              trigger ( /emc_36r1/main/12/legA/fc eq complete)
+              task an
+              task fc
+              task pf
+              task cf
+            endfamily
+            family tracking
+              trigger obsdata/obs eq complete and stage eq complete
+              inlimit /emc_36r1/limits:tc
+              family 1
+                edit MEMBER '1'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 2
+                edit MEMBER '2'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 3
+                edit MEMBER '3'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 4
+                edit MEMBER '4'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 5
+                edit MEMBER '5'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 6
+                edit MEMBER '6'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 7
+                edit MEMBER '7'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 8
+                edit MEMBER '8'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 9
+                edit MEMBER '9'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 10
+                edit MEMBER '10'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 11
+                edit MEMBER '11'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 12
+                edit MEMBER '12'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 13
+                edit MEMBER '13'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 14
+                edit MEMBER '14'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 15
+                edit MEMBER '15'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 16
+                edit MEMBER '16'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 17
+                edit MEMBER '17'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 18
+                edit MEMBER '18'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 19
+                edit MEMBER '19'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 20
+                edit MEMBER '20'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 21
+                edit MEMBER '21'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 22
+                edit MEMBER '22'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 23
+                edit MEMBER '23'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 24
+                edit MEMBER '24'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 25
+                edit MEMBER '25'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 26
+                edit MEMBER '26'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 27
+                edit MEMBER '27'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 28
+                edit MEMBER '28'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 29
+                edit MEMBER '29'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 30
+                edit MEMBER '30'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 31
+                edit MEMBER '31'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 32
+                edit MEMBER '32'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 33
+                edit MEMBER '33'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 34
+                edit MEMBER '34'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 35
+                edit MEMBER '35'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 36
+                edit MEMBER '36'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 37
+                edit MEMBER '37'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 38
+                edit MEMBER '38'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 39
+                edit MEMBER '39'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 40
+                edit MEMBER '40'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 41
+                edit MEMBER '41'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 42
+                edit MEMBER '42'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 43
+                edit MEMBER '43'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 44
+                edit MEMBER '44'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 45
+                edit MEMBER '45'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 46
+                edit MEMBER '46'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 47
+                edit MEMBER '47'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 48
+                edit MEMBER '48'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 49
+                edit MEMBER '49'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 50
+                edit MEMBER '50'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family cf
+                edit MEMBER '51'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family oper
+                edit MEMBER '52'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+            endfamily
+            family post_process
+              task to_bufr
+                trigger ../tracking eq complete
+            endfamily
+          endfamily
+          family calibrate
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger /emc_36r1/main/12/ref/an eq complete and ../fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/calibrate'
+            family onsc
+              edit QUEUE 'ns'
+              edit QUEUE_EPILOG 'ns'
+              edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+              edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+              inlimit /limits:c1b
+              task feedupcal
+              task upcal
+                trigger feedupcal eq complete
+                edit Z500_EXPVER '0001'
+                edit METVIEW 'metview'
+              task revertupcal
+            endfamily
+          endfamily
+          family clusters
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger ./calibrate/onsc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/clusters'
+            edit USER_PRIORITY '81'
+            edit QUEUE 'ns'
+            edit QUEUE_EPILOG 'ns'
+            edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+            edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+            inlimit /limits:c1b
+            task cthresh
+            task cluster
+              trigger cthresh eq complete and /emc_36r1/main/12/ref/model eq complete
+              edit USER_PRIORITY '76'
+            task tubcon
+              trigger /emc_36r1/main/12/ref/model eq complete
+            task tubgen
+              late -c +00:20
+              trigger tubcon eq complete
+          endfamily
+          family efi
+            complete ( /emc_36r1/main/ref/12/events:cf) or ( /emc_36r1/main/ref/12/events:noefi)
+            trigger /emc_36r1/main/12/legA/postproc/dp eq complete
+            edit HC_VERSION '0046'
+            edit HC_EXPVER '0046'
+            edit REF_VERSION '0046'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            edit NC_DAYS '31'
+            edit EPSLEG '1'
+            inlimit /emc_36r1/limits:efi
+            task stage
+              edit NC_DAYS '31'
+            family 000_120
+              trigger ./stage eq complete
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 024_144
+              trigger ./stage eq complete
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 000_240
+              trigger ./stage eq complete
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 012_036
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 036_060
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 060_084
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 084_108
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 108_132
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+          endfamily
+          task efi2fdb
+            complete ( /emc_36r1/main/ref/12/events:cf) or ( /emc_36r1/main/ref/12/events:noefi)
+            trigger ./efi eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            inlimit /emc_36r1/main/ref:mutex
+            event none
+          family dp
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '0:144:3 144:240:6'
+            inlimit /emc_36r1/limits:dp
+            family cf
+              trigger ../../fc/cf eq complete
+              edit EMOS_TYPE 'cf'
+              task derived_param
+                edit MEMBER 'off'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/12/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                trigger ../../../fc/pf/01 eq complete
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task derived_param
+              endfamily
+              family 02
+                trigger ../../../fc/pf/02 eq complete
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task derived_param
+              endfamily
+              family 03
+                trigger ../../../fc/pf/03 eq complete
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task derived_param
+              endfamily
+              family 04
+                trigger ../../../fc/pf/04 eq complete
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task derived_param
+              endfamily
+              family 05
+                trigger ../../../fc/pf/05 eq complete
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task derived_param
+              endfamily
+              family 06
+                trigger ../../../fc/pf/06 eq complete
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task derived_param
+              endfamily
+              family 07
+                trigger ../../../fc/pf/07 eq complete
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task derived_param
+              endfamily
+              family 08
+                trigger ../../../fc/pf/08 eq complete
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task derived_param
+              endfamily
+              family 09
+                trigger ../../../fc/pf/09 eq complete
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task derived_param
+              endfamily
+              family 10
+                trigger ../../../fc/pf/10 eq complete
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task derived_param
+              endfamily
+              family 11
+                trigger ../../../fc/pf/11 eq complete
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task derived_param
+              endfamily
+              family 12
+                trigger ../../../fc/pf/12 eq complete
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task derived_param
+              endfamily
+              family 13
+                trigger ../../../fc/pf/13 eq complete
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task derived_param
+              endfamily
+              family 14
+                trigger ../../../fc/pf/14 eq complete
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task derived_param
+              endfamily
+              family 15
+                trigger ../../../fc/pf/15 eq complete
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task derived_param
+              endfamily
+              family 16
+                trigger ../../../fc/pf/16 eq complete
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task derived_param
+              endfamily
+              family 17
+                trigger ../../../fc/pf/17 eq complete
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task derived_param
+              endfamily
+              family 18
+                trigger ../../../fc/pf/18 eq complete
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task derived_param
+              endfamily
+              family 19
+                trigger ../../../fc/pf/19 eq complete
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task derived_param
+              endfamily
+              family 20
+                trigger ../../../fc/pf/20 eq complete
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task derived_param
+              endfamily
+              family 21
+                trigger ../../../fc/pf/21 eq complete
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task derived_param
+              endfamily
+              family 22
+                trigger ../../../fc/pf/22 eq complete
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task derived_param
+              endfamily
+              family 23
+                trigger ../../../fc/pf/23 eq complete
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task derived_param
+              endfamily
+              family 24
+                trigger ../../../fc/pf/24 eq complete
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task derived_param
+              endfamily
+              family 25
+                trigger ../../../fc/pf/25 eq complete
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task derived_param
+              endfamily
+              family 26
+                trigger ../../../fc/pf/26 eq complete
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task derived_param
+              endfamily
+              family 27
+                trigger ../../../fc/pf/27 eq complete
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task derived_param
+              endfamily
+              family 28
+                trigger ../../../fc/pf/28 eq complete
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task derived_param
+              endfamily
+              family 29
+                trigger ../../../fc/pf/29 eq complete
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task derived_param
+              endfamily
+              family 30
+                trigger ../../../fc/pf/30 eq complete
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task derived_param
+              endfamily
+              family 31
+                trigger ../../../fc/pf/31 eq complete
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task derived_param
+              endfamily
+              family 32
+                trigger ../../../fc/pf/32 eq complete
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task derived_param
+              endfamily
+              family 33
+                trigger ../../../fc/pf/33 eq complete
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task derived_param
+              endfamily
+              family 34
+                trigger ../../../fc/pf/34 eq complete
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task derived_param
+              endfamily
+              family 35
+                trigger ../../../fc/pf/35 eq complete
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task derived_param
+              endfamily
+              family 36
+                trigger ../../../fc/pf/36 eq complete
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task derived_param
+              endfamily
+              family 37
+                trigger ../../../fc/pf/37 eq complete
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task derived_param
+              endfamily
+              family 38
+                trigger ../../../fc/pf/38 eq complete
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task derived_param
+              endfamily
+              family 39
+                trigger ../../../fc/pf/39 eq complete
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task derived_param
+              endfamily
+              family 40
+                trigger ../../../fc/pf/40 eq complete
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task derived_param
+              endfamily
+              family 41
+                trigger ../../../fc/pf/41 eq complete
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task derived_param
+              endfamily
+              family 42
+                trigger ../../../fc/pf/42 eq complete
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task derived_param
+              endfamily
+              family 43
+                trigger ../../../fc/pf/43 eq complete
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task derived_param
+              endfamily
+              family 44
+                trigger ../../../fc/pf/44 eq complete
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task derived_param
+              endfamily
+              family 45
+                trigger ../../../fc/pf/45 eq complete
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task derived_param
+              endfamily
+              family 46
+                trigger ../../../fc/pf/46 eq complete
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task derived_param
+              endfamily
+              family 47
+                trigger ../../../fc/pf/47 eq complete
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task derived_param
+              endfamily
+              family 48
+                trigger ../../../fc/pf/48 eq complete
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task derived_param
+              endfamily
+              family 49
+                trigger ../../../fc/pf/49 eq complete
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task derived_param
+              endfamily
+              family 50
+                trigger ../../../fc/pf/50 eq complete
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task derived_param
+              endfamily
+            endfamily
+          endfamily
+          family extra
+            trigger ./dp eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '0:144:3 144:240:6'
+            inlimit /emc_36r1/limits:extra
+            family cf
+              edit EMOS_TYPE 'cf'
+              task extrafields
+                edit EPSFCRES '639'
+                edit FCLENGTH '240'
+                edit FCLENGTH0 '0'
+                edit RUNVARFC '1'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/12/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 05
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 06
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 07
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 08
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 09
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 10
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 11
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 12
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 13
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 14
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 15
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 16
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 17
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 18
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 19
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 20
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 21
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 22
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 23
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 24
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 25
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 26
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 27
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 28
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 29
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 30
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 31
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 32
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 33
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 34
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 35
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 36
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 37
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 38
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 39
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 40
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 41
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 42
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 43
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 44
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 45
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 46
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 47
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 48
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 49
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 50
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family prod
+          edit MEM '3000'
+          edit ACCOUNT 'oeenfopg'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'cp'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '90'
+          edit SMSURLBASE 'http://intra.ecmwf.int/plots/d/intra/'
+          edit SMSURL 'sub=fixed/'
+          inlimit /limits:prod
+          family eps
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            inlimit /emc_36r1/limits:prodeps
+            family 0000
+              edit EMOS_TIME_STEP_H '0000'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0003
+              edit EMOS_TIME_STEP_H '0003'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0006
+              edit EMOS_TIME_STEP_H '0006'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0009
+              edit EMOS_TIME_STEP_H '0009'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0012
+              edit EMOS_TIME_STEP_H '0012'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0015
+              edit EMOS_TIME_STEP_H '0015'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0018
+              edit EMOS_TIME_STEP_H '0018'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0021
+              edit EMOS_TIME_STEP_H '0021'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0024
+              edit EMOS_TIME_STEP_H '0024'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0027
+              edit EMOS_TIME_STEP_H '0027'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0030
+              edit EMOS_TIME_STEP_H '0030'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0033
+              edit EMOS_TIME_STEP_H '0033'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0036
+              edit EMOS_TIME_STEP_H '0036'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0039
+              edit EMOS_TIME_STEP_H '0039'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0042
+              edit EMOS_TIME_STEP_H '0042'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0045
+              edit EMOS_TIME_STEP_H '0045'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0048
+              edit EMOS_TIME_STEP_H '0048'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0051
+              edit EMOS_TIME_STEP_H '0051'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0054
+              edit EMOS_TIME_STEP_H '0054'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0057
+              edit EMOS_TIME_STEP_H '0057'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0060
+              edit EMOS_TIME_STEP_H '0060'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0063
+              edit EMOS_TIME_STEP_H '0063'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0066
+              edit EMOS_TIME_STEP_H '0066'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0069
+              edit EMOS_TIME_STEP_H '0069'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0072
+              edit EMOS_TIME_STEP_H '0072'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0075
+              edit EMOS_TIME_STEP_H '0075'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0078
+              edit EMOS_TIME_STEP_H '0078'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0081
+              edit EMOS_TIME_STEP_H '0081'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0084
+              edit EMOS_TIME_STEP_H '0084'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0087
+              edit EMOS_TIME_STEP_H '0087'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0090
+              edit EMOS_TIME_STEP_H '0090'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0093
+              edit EMOS_TIME_STEP_H '0093'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0096
+              edit EMOS_TIME_STEP_H '0096'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0099
+              edit EMOS_TIME_STEP_H '0099'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0102
+              edit EMOS_TIME_STEP_H '0102'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0105
+              edit EMOS_TIME_STEP_H '0105'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0108
+              edit EMOS_TIME_STEP_H '0108'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0111
+              edit EMOS_TIME_STEP_H '0111'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0114
+              edit EMOS_TIME_STEP_H '0114'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0117
+              edit EMOS_TIME_STEP_H '0117'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0120
+              edit EMOS_TIME_STEP_H '0120'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0123
+              edit EMOS_TIME_STEP_H '0123'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0126
+              edit EMOS_TIME_STEP_H '0126'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0129
+              edit EMOS_TIME_STEP_H '0129'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0132
+              edit EMOS_TIME_STEP_H '0132'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0135
+              edit EMOS_TIME_STEP_H '0135'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0138
+              edit EMOS_TIME_STEP_H '0138'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0141
+              edit EMOS_TIME_STEP_H '0141'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0144
+              edit EMOS_TIME_STEP_H '0144'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0150
+              edit EMOS_TIME_STEP_H '0150'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0156
+              edit EMOS_TIME_STEP_H '0156'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0162
+              edit EMOS_TIME_STEP_H '0162'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0168
+              edit EMOS_TIME_STEP_H '0168'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0174
+              edit EMOS_TIME_STEP_H '0174'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0180
+              edit EMOS_TIME_STEP_H '0180'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0186
+              edit EMOS_TIME_STEP_H '0186'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0192
+              edit EMOS_TIME_STEP_H '0192'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0198
+              edit EMOS_TIME_STEP_H '0198'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0204
+              edit EMOS_TIME_STEP_H '0204'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0210
+              edit EMOS_TIME_STEP_H '0210'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0216
+              edit EMOS_TIME_STEP_H '0216'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0222
+              edit EMOS_TIME_STEP_H '0222'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0228
+              edit EMOS_TIME_STEP_H '0228'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0234
+              edit EMOS_TIME_STEP_H '0234'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0240
+              edit EMOS_TIME_STEP_H '0240'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+          endfamily
+          family wave
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            edit PGNPES '2'
+            edit URL 'GWAEF/12'
+            inlimit /emc_36r1/limits:prodwave
+            family 0000
+              edit EMOS_TIME_STEP_H '0000'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0003
+              edit EMOS_TIME_STEP_H '0003'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0006
+              edit EMOS_TIME_STEP_H '0006'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0009
+              edit EMOS_TIME_STEP_H '0009'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0012
+              edit EMOS_TIME_STEP_H '0012'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0015
+              edit EMOS_TIME_STEP_H '0015'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0018
+              edit EMOS_TIME_STEP_H '0018'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0021
+              edit EMOS_TIME_STEP_H '0021'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0024
+              edit EMOS_TIME_STEP_H '0024'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0027
+              edit EMOS_TIME_STEP_H '0027'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0030
+              edit EMOS_TIME_STEP_H '0030'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0033
+              edit EMOS_TIME_STEP_H '0033'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0036
+              edit EMOS_TIME_STEP_H '0036'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0039
+              edit EMOS_TIME_STEP_H '0039'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0042
+              edit EMOS_TIME_STEP_H '0042'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0045
+              edit EMOS_TIME_STEP_H '0045'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0048
+              edit EMOS_TIME_STEP_H '0048'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0051
+              edit EMOS_TIME_STEP_H '0051'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0054
+              edit EMOS_TIME_STEP_H '0054'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0057
+              edit EMOS_TIME_STEP_H '0057'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0060
+              edit EMOS_TIME_STEP_H '0060'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0063
+              edit EMOS_TIME_STEP_H '0063'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0066
+              edit EMOS_TIME_STEP_H '0066'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0069
+              edit EMOS_TIME_STEP_H '0069'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0072
+              edit EMOS_TIME_STEP_H '0072'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0075
+              edit EMOS_TIME_STEP_H '0075'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0078
+              edit EMOS_TIME_STEP_H '0078'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0081
+              edit EMOS_TIME_STEP_H '0081'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0084
+              edit EMOS_TIME_STEP_H '0084'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0087
+              edit EMOS_TIME_STEP_H '0087'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0090
+              edit EMOS_TIME_STEP_H '0090'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0093
+              edit EMOS_TIME_STEP_H '0093'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0096
+              edit EMOS_TIME_STEP_H '0096'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0099
+              edit EMOS_TIME_STEP_H '0099'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0102
+              edit EMOS_TIME_STEP_H '0102'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0105
+              edit EMOS_TIME_STEP_H '0105'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0108
+              edit EMOS_TIME_STEP_H '0108'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0111
+              edit EMOS_TIME_STEP_H '0111'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0114
+              edit EMOS_TIME_STEP_H '0114'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0117
+              edit EMOS_TIME_STEP_H '0117'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0120
+              edit EMOS_TIME_STEP_H '0120'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0123
+              edit EMOS_TIME_STEP_H '0123'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0126
+              edit EMOS_TIME_STEP_H '0126'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0129
+              edit EMOS_TIME_STEP_H '0129'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0132
+              edit EMOS_TIME_STEP_H '0132'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0135
+              edit EMOS_TIME_STEP_H '0135'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0138
+              edit EMOS_TIME_STEP_H '0138'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0141
+              edit EMOS_TIME_STEP_H '0141'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0144
+              edit EMOS_TIME_STEP_H '0144'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0150
+              edit EMOS_TIME_STEP_H '0150'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0156
+              edit EMOS_TIME_STEP_H '0156'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0162
+              edit EMOS_TIME_STEP_H '0162'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0168
+              edit EMOS_TIME_STEP_H '0168'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0174
+              edit EMOS_TIME_STEP_H '0174'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0180
+              edit EMOS_TIME_STEP_H '0180'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0186
+              edit EMOS_TIME_STEP_H '0186'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0192
+              edit EMOS_TIME_STEP_H '0192'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0198
+              edit EMOS_TIME_STEP_H '0198'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0204
+              edit EMOS_TIME_STEP_H '0204'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0210
+              edit EMOS_TIME_STEP_H '0210'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0216
+              edit EMOS_TIME_STEP_H '0216'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0222
+              edit EMOS_TIME_STEP_H '0222'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0228
+              edit EMOS_TIME_STEP_H '0228'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0234
+              edit EMOS_TIME_STEP_H '0234'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0240
+              edit EMOS_TIME_STEP_H '0240'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+          endfamily
+          family getreq
+            trigger ../fc/pf eq active or ../fc/pf/01 eq complete
+            edit EMOS_TYPE 'cm'
+            edit EMOS_DOMAIN 'G'
+            edit EMOS_PROJECT '12'
+            edit PROD_TASK '1'
+            edit SMSTRIES '1'
+            edit EMOS_STREAM 'ENFO'
+            task collectreq
+              edit QUEUE 'diss'
+              edit USER 'emos'
+              edit WSHOST 'diss'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit LOGDIR '/diss/log'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit EMOS_BASE '12'
+            task eps
+              late -s +00:03 -c +00:10
+              trigger collectreq eq complete
+              label info ""
+              event 1 
+            task collectwave
+              trigger collectreq eq complete
+              edit QUEUE 'diss'
+              edit USER 'emos'
+              edit WSHOST 'diss'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit LOGDIR '/diss/log'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit EMOS_STREAM 'WAEF'
+              edit EMOS_BASE '12'
+            task wave_eps
+              late -s +00:03 -c +00:10
+              trigger collectwave eq complete
+              edit EMOS_STREAM 'WAEF'
+              edit USER_PRIORITY '89'
+              label info ""
+              event 1 
+            task collectbitmap
+              trigger collectwave eq complete
+              edit QUEUE 'diss'
+              edit USER 'emos'
+              edit WSHOST 'diss'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit LOGDIR '/diss/log'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit SMSOUT '/vol/emos_nc/output'
+            task bitmap
+              late -s +00:03 -c +00:10
+              trigger collectbitmap eq complete and ( eps:001 or eps eq complete)
+              event 1 
+          endfamily
+          task enfo_tc
+            late -s +00:05 -c +00:15
+            trigger ( ./getreq/eps:001 or ./getreq/eps eq complete) and ../postproc/tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TYPE 'tf'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '1'
+          task oper_tc
+            late -s +00:05 -c +00:15
+            trigger ./enfo_tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TYPE 'tf'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '1'
+            edit EMOS_STREAM 'OPER'
+          task prod_wparam
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ../postproc/dp eq complete and /e_36r1/main/12/prod/240/prod_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TYPE 'wp'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '52'
+          task enfo_postproc
+            late -s +00:05 -c +00:15
+            trigger ../postproc eq complete and ( ../../legA/prod/getreq/eps eq complete) and ../../legA/postproc/efi eq complete and ../../legA/postproc/clusters eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'ep'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '21'
+          task waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ../postproc/prob eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '1'
+        endfamily
+        family prod2diss
+          edit USER_PRIORITY '90'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'ef'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+          edit SMSURL 'GENFO/12'
+          task operation_is_late
+            event yes
+          family eps
+            family 0000
+              edit EMOS_TIME_STEP_H '0000'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0000/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0003
+              edit EMOS_TIME_STEP_H '0003'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0003/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0000/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0006
+              edit EMOS_TIME_STEP_H '0006'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0006/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0003/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0009
+              edit EMOS_TIME_STEP_H '0009'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0009/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0006/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0012
+              edit EMOS_TIME_STEP_H '0012'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0012/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0009/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0015
+              edit EMOS_TIME_STEP_H '0015'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0015/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0012/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0018
+              edit EMOS_TIME_STEP_H '0018'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0018/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0015/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0021
+              edit EMOS_TIME_STEP_H '0021'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0021/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0018/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0024
+              edit EMOS_TIME_STEP_H '0024'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0024/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0021/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0027
+              edit EMOS_TIME_STEP_H '0027'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0027/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0024/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0030
+              edit EMOS_TIME_STEP_H '0030'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0030/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0027/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0033
+              edit EMOS_TIME_STEP_H '0033'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0033/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0030/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0036
+              edit EMOS_TIME_STEP_H '0036'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0036/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0033/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0039
+              edit EMOS_TIME_STEP_H '0039'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0039/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0036/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0042
+              edit EMOS_TIME_STEP_H '0042'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0042/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0039/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0045
+              edit EMOS_TIME_STEP_H '0045'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0045/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0042/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0048
+              edit EMOS_TIME_STEP_H '0048'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0048/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0045/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0051
+              edit EMOS_TIME_STEP_H '0051'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0051/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0048/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0054
+              edit EMOS_TIME_STEP_H '0054'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0054/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0051/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0057
+              edit EMOS_TIME_STEP_H '0057'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0057/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0054/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0060
+              edit EMOS_TIME_STEP_H '0060'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0060/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0057/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0063
+              edit EMOS_TIME_STEP_H '0063'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0063/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0060/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0066
+              edit EMOS_TIME_STEP_H '0066'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0066/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0063/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0069
+              edit EMOS_TIME_STEP_H '0069'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0069/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0066/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0072
+              edit EMOS_TIME_STEP_H '0072'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0072/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0069/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0075
+              edit EMOS_TIME_STEP_H '0075'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0075/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0072/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0078
+              edit EMOS_TIME_STEP_H '0078'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0078/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0075/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0081
+              edit EMOS_TIME_STEP_H '0081'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0081/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0078/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0084
+              edit EMOS_TIME_STEP_H '0084'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0084/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0081/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0087
+              edit EMOS_TIME_STEP_H '0087'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0087/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0084/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0090
+              edit EMOS_TIME_STEP_H '0090'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0090/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0087/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0093
+              edit EMOS_TIME_STEP_H '0093'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0093/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0090/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0096
+              edit EMOS_TIME_STEP_H '0096'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0096/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0093/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0099
+              edit EMOS_TIME_STEP_H '0099'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0099/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0096/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0102
+              edit EMOS_TIME_STEP_H '0102'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0102/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0099/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0105
+              edit EMOS_TIME_STEP_H '0105'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0105/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0102/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0108
+              edit EMOS_TIME_STEP_H '0108'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0108/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0105/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0111
+              edit EMOS_TIME_STEP_H '0111'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0111/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0108/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0114
+              edit EMOS_TIME_STEP_H '0114'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0114/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0111/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0117
+              edit EMOS_TIME_STEP_H '0117'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0117/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0114/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0120
+              edit EMOS_TIME_STEP_H '0120'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0120/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0117/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0123
+              edit EMOS_TIME_STEP_H '0123'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0123/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0120/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0126
+              edit EMOS_TIME_STEP_H '0126'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0126/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0123/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0129
+              edit EMOS_TIME_STEP_H '0129'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0129/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0126/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0132
+              edit EMOS_TIME_STEP_H '0132'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0132/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0129/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0135
+              edit EMOS_TIME_STEP_H '0135'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0135/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0132/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0138
+              edit EMOS_TIME_STEP_H '0138'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0138/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0135/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0141
+              edit EMOS_TIME_STEP_H '0141'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0141/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0138/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0144
+              edit EMOS_TIME_STEP_H '0144'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0144/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0141/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0150
+              edit EMOS_TIME_STEP_H '0150'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0150/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0144/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0156
+              edit EMOS_TIME_STEP_H '0156'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0156/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0150/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0162
+              edit EMOS_TIME_STEP_H '0162'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0162/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0156/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0168
+              edit EMOS_TIME_STEP_H '0168'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0168/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0162/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0174
+              edit EMOS_TIME_STEP_H '0174'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0174/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0168/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0180
+              edit EMOS_TIME_STEP_H '0180'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0180/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0174/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0186
+              edit EMOS_TIME_STEP_H '0186'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0186/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0180/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0192
+              edit EMOS_TIME_STEP_H '0192'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0192/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0186/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0198
+              edit EMOS_TIME_STEP_H '0198'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0198/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0192/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0204
+              edit EMOS_TIME_STEP_H '0204'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0204/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0198/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0210
+              edit EMOS_TIME_STEP_H '0210'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0210/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0204/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0216
+              edit EMOS_TIME_STEP_H '0216'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0216/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0210/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0222
+              edit EMOS_TIME_STEP_H '0222'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0222/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0216/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0228
+              edit EMOS_TIME_STEP_H '0228'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0228/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0222/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0234
+              edit EMOS_TIME_STEP_H '0234'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0234/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0228/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0240
+              edit EMOS_TIME_STEP_H '0240'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0240/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0234/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            task check
+              trigger ./0240 eq complete
+          endfamily
+          family wave
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TYPE 'we'
+            edit SMSURL 'GWAEF/12'
+            family 0000
+              trigger ../../prod/wave/0000/prodwave eq complete
+              edit EMOS_TIME_STEP_H '0000'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0003
+              trigger ../../prod/wave/0003/prodwave eq complete and ( ./0000 eq complete)
+              edit EMOS_TIME_STEP_H '0003'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0006
+              trigger ../../prod/wave/0006/prodwave eq complete and ( ./0003 eq complete)
+              edit EMOS_TIME_STEP_H '0006'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0009
+              trigger ../../prod/wave/0009/prodwave eq complete and ( ./0006 eq complete)
+              edit EMOS_TIME_STEP_H '0009'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0012
+              trigger ../../prod/wave/0012/prodwave eq complete and ( ./0009 eq complete)
+              edit EMOS_TIME_STEP_H '0012'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0015
+              trigger ../../prod/wave/0015/prodwave eq complete and ( ./0012 eq complete)
+              edit EMOS_TIME_STEP_H '0015'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0018
+              trigger ../../prod/wave/0018/prodwave eq complete and ( ./0015 eq complete)
+              edit EMOS_TIME_STEP_H '0018'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0021
+              trigger ../../prod/wave/0021/prodwave eq complete and ( ./0018 eq complete)
+              edit EMOS_TIME_STEP_H '0021'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0024
+              trigger ../../prod/wave/0024/prodwave eq complete and ( ./0021 eq complete)
+              edit EMOS_TIME_STEP_H '0024'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0027
+              trigger ../../prod/wave/0027/prodwave eq complete and ( ./0024 eq complete)
+              edit EMOS_TIME_STEP_H '0027'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0030
+              trigger ../../prod/wave/0030/prodwave eq complete and ( ./0027 eq complete)
+              edit EMOS_TIME_STEP_H '0030'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0033
+              trigger ../../prod/wave/0033/prodwave eq complete and ( ./0030 eq complete)
+              edit EMOS_TIME_STEP_H '0033'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0036
+              trigger ../../prod/wave/0036/prodwave eq complete and ( ./0033 eq complete)
+              edit EMOS_TIME_STEP_H '0036'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0039
+              trigger ../../prod/wave/0039/prodwave eq complete and ( ./0036 eq complete)
+              edit EMOS_TIME_STEP_H '0039'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0042
+              trigger ../../prod/wave/0042/prodwave eq complete and ( ./0039 eq complete)
+              edit EMOS_TIME_STEP_H '0042'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0045
+              trigger ../../prod/wave/0045/prodwave eq complete and ( ./0042 eq complete)
+              edit EMOS_TIME_STEP_H '0045'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0048
+              trigger ../../prod/wave/0048/prodwave eq complete and ( ./0045 eq complete)
+              edit EMOS_TIME_STEP_H '0048'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0051
+              trigger ../../prod/wave/0051/prodwave eq complete and ( ./0048 eq complete)
+              edit EMOS_TIME_STEP_H '0051'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0054
+              trigger ../../prod/wave/0054/prodwave eq complete and ( ./0051 eq complete)
+              edit EMOS_TIME_STEP_H '0054'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0057
+              trigger ../../prod/wave/0057/prodwave eq complete and ( ./0054 eq complete)
+              edit EMOS_TIME_STEP_H '0057'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0060
+              trigger ../../prod/wave/0060/prodwave eq complete and ( ./0057 eq complete)
+              edit EMOS_TIME_STEP_H '0060'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0063
+              trigger ../../prod/wave/0063/prodwave eq complete and ( ./0060 eq complete)
+              edit EMOS_TIME_STEP_H '0063'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0066
+              trigger ../../prod/wave/0066/prodwave eq complete and ( ./0063 eq complete)
+              edit EMOS_TIME_STEP_H '0066'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0069
+              trigger ../../prod/wave/0069/prodwave eq complete and ( ./0066 eq complete)
+              edit EMOS_TIME_STEP_H '0069'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0072
+              trigger ../../prod/wave/0072/prodwave eq complete and ( ./0069 eq complete)
+              edit EMOS_TIME_STEP_H '0072'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0075
+              trigger ../../prod/wave/0075/prodwave eq complete and ( ./0072 eq complete)
+              edit EMOS_TIME_STEP_H '0075'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0078
+              trigger ../../prod/wave/0078/prodwave eq complete and ( ./0075 eq complete)
+              edit EMOS_TIME_STEP_H '0078'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0081
+              trigger ../../prod/wave/0081/prodwave eq complete and ( ./0078 eq complete)
+              edit EMOS_TIME_STEP_H '0081'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0084
+              trigger ../../prod/wave/0084/prodwave eq complete and ( ./0081 eq complete)
+              edit EMOS_TIME_STEP_H '0084'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0087
+              trigger ../../prod/wave/0087/prodwave eq complete and ( ./0084 eq complete)
+              edit EMOS_TIME_STEP_H '0087'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0090
+              trigger ../../prod/wave/0090/prodwave eq complete and ( ./0087 eq complete)
+              edit EMOS_TIME_STEP_H '0090'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0093
+              trigger ../../prod/wave/0093/prodwave eq complete and ( ./0090 eq complete)
+              edit EMOS_TIME_STEP_H '0093'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0096
+              trigger ../../prod/wave/0096/prodwave eq complete and ( ./0093 eq complete)
+              edit EMOS_TIME_STEP_H '0096'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0099
+              trigger ../../prod/wave/0099/prodwave eq complete and ( ./0096 eq complete)
+              edit EMOS_TIME_STEP_H '0099'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0102
+              trigger ../../prod/wave/0102/prodwave eq complete and ( ./0099 eq complete)
+              edit EMOS_TIME_STEP_H '0102'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0105
+              trigger ../../prod/wave/0105/prodwave eq complete and ( ./0102 eq complete)
+              edit EMOS_TIME_STEP_H '0105'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0108
+              trigger ../../prod/wave/0108/prodwave eq complete and ( ./0105 eq complete)
+              edit EMOS_TIME_STEP_H '0108'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0111
+              trigger ../../prod/wave/0111/prodwave eq complete and ( ./0108 eq complete)
+              edit EMOS_TIME_STEP_H '0111'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0114
+              trigger ../../prod/wave/0114/prodwave eq complete and ( ./0111 eq complete)
+              edit EMOS_TIME_STEP_H '0114'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0117
+              trigger ../../prod/wave/0117/prodwave eq complete and ( ./0114 eq complete)
+              edit EMOS_TIME_STEP_H '0117'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0120
+              trigger ../../prod/wave/0120/prodwave eq complete and ( ./0117 eq complete)
+              edit EMOS_TIME_STEP_H '0120'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0123
+              trigger ../../prod/wave/0123/prodwave eq complete and ( ./0120 eq complete)
+              edit EMOS_TIME_STEP_H '0123'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0126
+              trigger ../../prod/wave/0126/prodwave eq complete and ( ./0123 eq complete)
+              edit EMOS_TIME_STEP_H '0126'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0129
+              trigger ../../prod/wave/0129/prodwave eq complete and ( ./0126 eq complete)
+              edit EMOS_TIME_STEP_H '0129'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0132
+              trigger ../../prod/wave/0132/prodwave eq complete and ( ./0129 eq complete)
+              edit EMOS_TIME_STEP_H '0132'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0135
+              trigger ../../prod/wave/0135/prodwave eq complete and ( ./0132 eq complete)
+              edit EMOS_TIME_STEP_H '0135'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0138
+              trigger ../../prod/wave/0138/prodwave eq complete and ( ./0135 eq complete)
+              edit EMOS_TIME_STEP_H '0138'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0141
+              trigger ../../prod/wave/0141/prodwave eq complete and ( ./0138 eq complete)
+              edit EMOS_TIME_STEP_H '0141'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0144
+              trigger ../../prod/wave/0144/prodwave eq complete and ( ./0141 eq complete)
+              edit EMOS_TIME_STEP_H '0144'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0150
+              trigger ../../prod/wave/0150/prodwave eq complete and ( ./0144 eq complete)
+              edit EMOS_TIME_STEP_H '0150'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0156
+              trigger ../../prod/wave/0156/prodwave eq complete and ( ./0150 eq complete)
+              edit EMOS_TIME_STEP_H '0156'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0162
+              trigger ../../prod/wave/0162/prodwave eq complete and ( ./0156 eq complete)
+              edit EMOS_TIME_STEP_H '0162'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0168
+              trigger ../../prod/wave/0168/prodwave eq complete and ( ./0162 eq complete)
+              edit EMOS_TIME_STEP_H '0168'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0174
+              trigger ../../prod/wave/0174/prodwave eq complete and ( ./0168 eq complete)
+              edit EMOS_TIME_STEP_H '0174'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0180
+              trigger ../../prod/wave/0180/prodwave eq complete and ( ./0174 eq complete)
+              edit EMOS_TIME_STEP_H '0180'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0186
+              trigger ../../prod/wave/0186/prodwave eq complete and ( ./0180 eq complete)
+              edit EMOS_TIME_STEP_H '0186'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0192
+              trigger ../../prod/wave/0192/prodwave eq complete and ( ./0186 eq complete)
+              edit EMOS_TIME_STEP_H '0192'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0198
+              trigger ../../prod/wave/0198/prodwave eq complete and ( ./0192 eq complete)
+              edit EMOS_TIME_STEP_H '0198'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0204
+              trigger ../../prod/wave/0204/prodwave eq complete and ( ./0198 eq complete)
+              edit EMOS_TIME_STEP_H '0204'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0210
+              trigger ../../prod/wave/0210/prodwave eq complete and ( ./0204 eq complete)
+              edit EMOS_TIME_STEP_H '0210'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0216
+              trigger ../../prod/wave/0216/prodwave eq complete and ( ./0210 eq complete)
+              edit EMOS_TIME_STEP_H '0216'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0222
+              trigger ../../prod/wave/0222/prodwave eq complete and ( ./0216 eq complete)
+              edit EMOS_TIME_STEP_H '0222'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0228
+              trigger ../../prod/wave/0228/prodwave eq complete and ( ./0222 eq complete)
+              edit EMOS_TIME_STEP_H '0228'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0234
+              trigger ../../prod/wave/0234/prodwave eq complete and ( ./0228 eq complete)
+              edit EMOS_TIME_STEP_H '0234'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0240
+              trigger ../../prod/wave/0240/prodwave eq complete and ( ./0234 eq complete)
+              edit EMOS_TIME_STEP_H '0240'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            task check
+              trigger ./0240 eq complete
+          endfamily
+          task diss_wparam
+            late -s +00:05 -c +00:15
+            trigger ../prod/prod_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'wp'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/waef_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/enfo_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'ep'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_enfotc
+            late -s +00:05 -c +00:15
+            trigger ../prod/enfo_tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'tf'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_opertc
+            late -s +00:05 -c +00:15
+            trigger ../prod/oper_tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'tf'
+            edit EMOS_STREAM 'DA'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+        endfamily
+      endfamily
+      family legB
+        complete /emc_36r1/main/ref/12/events:240
+        edit EPSLEG '2'
+        family fc
+          edit FCMEM '2240'
+          edit FCSTACK '700'
+          edit FCMRFS '0'
+          edit PRIORITY '71'
+          edit USER_PRIORITY '71'
+          edit N_PERT_AN '10'
+          edit SSTLEN '144'
+          edit EPSINISTEP_PREVIOUS '216'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          edit TSTEP '2700'
+          edit EPSFCRES '639'
+          edit RESOL '639'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit CPUTIME '1000'
+          edit MEM '960'
+          edit THREADS '8'
+          edit NPES '8'
+          edit EPSLEG '2'
+          edit PERSST 'true'
+          edit SSTINT '1'
+          task wavfcdata
+            trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+            edit EPSCOUPLE '1'
+          task getpersSST
+            trigger ../../legA/fc/inidata eq complete and ../../legA/fc/getpersSST eq complete
+            edit EPSCOUPLE '1'
+            edit EPS_INI_STREAM 'DA'
+            edit EPSFCRES '319'
+            edit RESOL '319'
+          family pf
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger ./getpersSST eq complete and ./wavfcdata eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTYPE 'pf'
+            edit EMOS_TYPE 'pf'
+            edit USER_PRIORITY '71'
+            edit PRIORITY '71'
+            edit FCNPES '32'
+            edit FCCHUNK '1'
+            edit OCTOTAL '5'
+            edit FCTOTAL '51'
+            edit FCLENGTH1 '216'
+            edit DAILY '0'
+            edit RUNVARFC '1'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSFCRES '319'
+            edit EPSWAMRESOL 'global50'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit EPSINISTEP '360'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '2'
+            edit CLASS 'od'
+            edit THREADS '2'
+            inlimit /emc_36r1/limits:pftotal
+            meter step -1 144 144
+            family 01
+              trigger ../../../legA/fc/pf/01 eq complete
+              edit EPSMEMBER '1'
+              edit MEMBER '1'
+              edit SUBFSFAMILY '/pf001'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 02
+              trigger ../../../legA/fc/pf/02 eq complete
+              edit EPSMEMBER '2'
+              edit MEMBER '2'
+              edit SUBFSFAMILY '/pf002'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 03
+              trigger ../../../legA/fc/pf/03 eq complete
+              edit EPSMEMBER '3'
+              edit MEMBER '3'
+              edit SUBFSFAMILY '/pf003'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 04
+              trigger ../../../legA/fc/pf/04 eq complete
+              edit EPSMEMBER '4'
+              edit MEMBER '4'
+              edit SUBFSFAMILY '/pf004'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 05
+              trigger ../../../legA/fc/pf/05 eq complete
+              edit EPSMEMBER '5'
+              edit MEMBER '5'
+              edit SUBFSFAMILY '/pf005'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 06
+              trigger ../../../legA/fc/pf/06 eq complete
+              edit EPSMEMBER '6'
+              edit MEMBER '6'
+              edit SUBFSFAMILY '/pf006'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 07
+              trigger ../../../legA/fc/pf/07 eq complete
+              edit EPSMEMBER '7'
+              edit MEMBER '7'
+              edit SUBFSFAMILY '/pf007'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 08
+              trigger ../../../legA/fc/pf/08 eq complete
+              edit EPSMEMBER '8'
+              edit MEMBER '8'
+              edit SUBFSFAMILY '/pf008'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 09
+              trigger ../../../legA/fc/pf/09 eq complete
+              edit EPSMEMBER '9'
+              edit MEMBER '9'
+              edit SUBFSFAMILY '/pf009'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 10
+              trigger ../../../legA/fc/pf/10 eq complete
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              edit SUBFSFAMILY '/pf010'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 11
+              trigger ../../../legA/fc/pf/11 eq complete
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              edit SUBFSFAMILY '/pf011'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 12
+              trigger ../../../legA/fc/pf/12 eq complete
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              edit SUBFSFAMILY '/pf012'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 13
+              trigger ../../../legA/fc/pf/13 eq complete
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              edit SUBFSFAMILY '/pf013'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 14
+              trigger ../../../legA/fc/pf/14 eq complete
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              edit SUBFSFAMILY '/pf014'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 15
+              trigger ../../../legA/fc/pf/15 eq complete
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              edit SUBFSFAMILY '/pf015'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 16
+              trigger ../../../legA/fc/pf/16 eq complete
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              edit SUBFSFAMILY '/pf016'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 17
+              trigger ../../../legA/fc/pf/17 eq complete
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              edit SUBFSFAMILY '/pf017'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 18
+              trigger ../../../legA/fc/pf/18 eq complete
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              edit SUBFSFAMILY '/pf018'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 19
+              trigger ../../../legA/fc/pf/19 eq complete
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              edit SUBFSFAMILY '/pf019'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 20
+              trigger ../../../legA/fc/pf/20 eq complete
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              edit SUBFSFAMILY '/pf020'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 21
+              trigger ../../../legA/fc/pf/21 eq complete
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              edit SUBFSFAMILY '/pf021'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 22
+              trigger ../../../legA/fc/pf/22 eq complete
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              edit SUBFSFAMILY '/pf022'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 23
+              trigger ../../../legA/fc/pf/23 eq complete
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              edit SUBFSFAMILY '/pf023'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 24
+              trigger ../../../legA/fc/pf/24 eq complete
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              edit SUBFSFAMILY '/pf024'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 25
+              trigger ../../../legA/fc/pf/25 eq complete
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              edit SUBFSFAMILY '/pf025'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 26
+              trigger ../../../legA/fc/pf/26 eq complete
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              edit SUBFSFAMILY '/pf026'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 27
+              trigger ../../../legA/fc/pf/27 eq complete
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              edit SUBFSFAMILY '/pf027'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 28
+              trigger ../../../legA/fc/pf/28 eq complete
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              edit SUBFSFAMILY '/pf028'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 29
+              trigger ../../../legA/fc/pf/29 eq complete
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              edit SUBFSFAMILY '/pf029'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 30
+              trigger ../../../legA/fc/pf/30 eq complete
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              edit SUBFSFAMILY '/pf030'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 31
+              trigger ../../../legA/fc/pf/31 eq complete
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              edit SUBFSFAMILY '/pf031'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 32
+              trigger ../../../legA/fc/pf/32 eq complete
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              edit SUBFSFAMILY '/pf032'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 33
+              trigger ../../../legA/fc/pf/33 eq complete
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              edit SUBFSFAMILY '/pf033'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 34
+              trigger ../../../legA/fc/pf/34 eq complete
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              edit SUBFSFAMILY '/pf034'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 35
+              trigger ../../../legA/fc/pf/35 eq complete
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              edit SUBFSFAMILY '/pf035'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 36
+              trigger ../../../legA/fc/pf/36 eq complete
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              edit SUBFSFAMILY '/pf036'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 37
+              trigger ../../../legA/fc/pf/37 eq complete
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              edit SUBFSFAMILY '/pf037'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 38
+              trigger ../../../legA/fc/pf/38 eq complete
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              edit SUBFSFAMILY '/pf038'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 39
+              trigger ../../../legA/fc/pf/39 eq complete
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              edit SUBFSFAMILY '/pf039'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 40
+              trigger ../../../legA/fc/pf/40 eq complete
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              edit SUBFSFAMILY '/pf040'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 41
+              trigger ../../../legA/fc/pf/41 eq complete
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              edit SUBFSFAMILY '/pf041'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 42
+              trigger ../../../legA/fc/pf/42 eq complete
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              edit SUBFSFAMILY '/pf042'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 43
+              trigger ../../../legA/fc/pf/43 eq complete
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              edit SUBFSFAMILY '/pf043'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 44
+              trigger ../../../legA/fc/pf/44 eq complete
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              edit SUBFSFAMILY '/pf044'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 45
+              trigger ../../../legA/fc/pf/45 eq complete
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              edit SUBFSFAMILY '/pf045'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 46
+              trigger ../../../legA/fc/pf/46 eq complete
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              edit SUBFSFAMILY '/pf046'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 47
+              trigger ../../../legA/fc/pf/47 eq complete
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              edit SUBFSFAMILY '/pf047'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 48
+              trigger ../../../legA/fc/pf/48 eq complete
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              edit SUBFSFAMILY '/pf048'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 49
+              trigger ../../../legA/fc/pf/49 eq complete
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              edit SUBFSFAMILY '/pf049'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 50
+              trigger ../../../legA/fc/pf/50 eq complete
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              edit SUBFSFAMILY '/pf050'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+          endfamily
+          family cf
+            trigger ../../legA/fc/cf eq complete and not /emc_36r1/main/ref/12/events:cpl and ./getpersSST eq complete and ./wavfcdata eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit MEMBER '0'
+            edit EPSMEMBER '0'
+            edit SUBFSFAMILY '/cf000'
+            edit EPSTYPE 'cf'
+            edit EMOS_TYPE 'cf'
+            edit USER_PRIORITY '72'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSFCRES '319'
+            edit EPSWAMRESOL 'global50'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit EPSINISTEP '360'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '2'
+            edit CLASS 'od'
+            edit SMSTRIES '1'
+            edit RUNCOUPLE '0'
+            task getvarepsdata
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '2700'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSLEG '2'
+              edit EPSINISTEP '216'
+              edit EPSFCRES '639'
+              edit EPSFCRESN '319'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '2700'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '216'
+              edit EPSFCRES '319'
+              edit NPES '24'
+              edit FCNPES '24'
+              edit THREADS '2'
+              edit CLASS 'od'
+            task modeleps
+              trigger intHtoL eq complete and getvarepsdata eq complete
+              edit FCNPES '32'
+              edit THREADS '4'
+              edit SMSTRIES '1'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSLEG '2'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '144'
+              edit EPSINISTEP_PREVIOUS '216'
+              edit FCLENGTH '144'
+              edit TSTEP '2700'
+              edit CLASS 'od'
+              meter step -1 144 144
+          endfamily
+          family reservation
+            trigger ./pf/46/intHtoL eq complete and ./pf/47/intHtoL eq complete and ./pf/48/intHtoL eq complete and ./pf/49/intHtoL eq complete and ./pf/50/intHtoL eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reset_class
+              late -s +00:02 -c +00:02
+              edit RESERVATION_DEFINITION 'default'
+              label info ""
+            task reset_cpu
+              late -s +00:02 -c +00:02
+              edit RESERVED_CPUS '0'
+              label info ""
+          endfamily
+        endfamily
+        family postproc
+          trigger ./fc/pf eq complete and ./fc/cf eq complete
+          edit STEPS '252/360/12/24 360/360/12/120'
+          inlimit /emc_36r1/limits:postproc
+          family ensms
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger ../fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            family limits
+              limit fdb 1
+              limit gen 8
+            endfamily
+            task ensms
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit ENS_MARS 'false'
+              event stage
+            family 300
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '246'
+              edit STEP2 '300'
+              edit BY '6'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 360
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '306'
+              edit STEP2 '360'
+              edit BY '6'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+          endfamily
+          family prob
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger ( /emc_36r1/main/12/legB/fc eq complete) and ( /emc_36r1/main/12/legA/postproc/prob eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            edit STEP1 '252'
+            edit STEP2 '360'
+            edit BY '12'
+            family 24
+              edit STEP1 '240'
+              edit STEP2 '360'
+              edit BY '24'
+              task t850
+              task rain
+              task ff
+            endfamily
+            family 12
+              edit STEP1 '252'
+              edit STEP2 '348'
+              edit BY '24'
+              task t850
+              task rain
+              task ff
+            endfamily
+            task 2t
+            task swh
+            task mwp
+            task 10fg
+              trigger ../dp eq complete
+            task prob_fdb
+              trigger ./2t eq complete and swh eq complete and mwp eq complete and ./10fg eq complete and ./12 eq complete and ./24 eq complete
+          endfamily
+          family dp
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '246:360:6'
+            inlimit /emc_36r1/limits:dp
+            family dp
+              trigger ./cf eq complete and ./pf eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit OVERLAP '1'
+              edit STEPS '216:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                complete /emc_36r1/main/ref/12/events:cf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+                family 05
+                  edit EPSMEMBER '5'
+                  edit MEMBER '5'
+                  edit SUBFSFAMILY '/pf005'
+                  task derived_param
+                endfamily
+                family 06
+                  edit EPSMEMBER '6'
+                  edit MEMBER '6'
+                  edit SUBFSFAMILY '/pf006'
+                  task derived_param
+                endfamily
+                family 07
+                  edit EPSMEMBER '7'
+                  edit MEMBER '7'
+                  edit SUBFSFAMILY '/pf007'
+                  task derived_param
+                endfamily
+                family 08
+                  edit EPSMEMBER '8'
+                  edit MEMBER '8'
+                  edit SUBFSFAMILY '/pf008'
+                  task derived_param
+                endfamily
+                family 09
+                  edit EPSMEMBER '9'
+                  edit MEMBER '9'
+                  edit SUBFSFAMILY '/pf009'
+                  task derived_param
+                endfamily
+                family 10
+                  edit EPSMEMBER '10'
+                  edit MEMBER '10'
+                  edit SUBFSFAMILY '/pf010'
+                  task derived_param
+                endfamily
+                family 11
+                  edit EPSMEMBER '11'
+                  edit MEMBER '11'
+                  edit SUBFSFAMILY '/pf011'
+                  task derived_param
+                endfamily
+                family 12
+                  edit EPSMEMBER '12'
+                  edit MEMBER '12'
+                  edit SUBFSFAMILY '/pf012'
+                  task derived_param
+                endfamily
+                family 13
+                  edit EPSMEMBER '13'
+                  edit MEMBER '13'
+                  edit SUBFSFAMILY '/pf013'
+                  task derived_param
+                endfamily
+                family 14
+                  edit EPSMEMBER '14'
+                  edit MEMBER '14'
+                  edit SUBFSFAMILY '/pf014'
+                  task derived_param
+                endfamily
+                family 15
+                  edit EPSMEMBER '15'
+                  edit MEMBER '15'
+                  edit SUBFSFAMILY '/pf015'
+                  task derived_param
+                endfamily
+                family 16
+                  edit EPSMEMBER '16'
+                  edit MEMBER '16'
+                  edit SUBFSFAMILY '/pf016'
+                  task derived_param
+                endfamily
+                family 17
+                  edit EPSMEMBER '17'
+                  edit MEMBER '17'
+                  edit SUBFSFAMILY '/pf017'
+                  task derived_param
+                endfamily
+                family 18
+                  edit EPSMEMBER '18'
+                  edit MEMBER '18'
+                  edit SUBFSFAMILY '/pf018'
+                  task derived_param
+                endfamily
+                family 19
+                  edit EPSMEMBER '19'
+                  edit MEMBER '19'
+                  edit SUBFSFAMILY '/pf019'
+                  task derived_param
+                endfamily
+                family 20
+                  edit EPSMEMBER '20'
+                  edit MEMBER '20'
+                  edit SUBFSFAMILY '/pf020'
+                  task derived_param
+                endfamily
+                family 21
+                  edit EPSMEMBER '21'
+                  edit MEMBER '21'
+                  edit SUBFSFAMILY '/pf021'
+                  task derived_param
+                endfamily
+                family 22
+                  edit EPSMEMBER '22'
+                  edit MEMBER '22'
+                  edit SUBFSFAMILY '/pf022'
+                  task derived_param
+                endfamily
+                family 23
+                  edit EPSMEMBER '23'
+                  edit MEMBER '23'
+                  edit SUBFSFAMILY '/pf023'
+                  task derived_param
+                endfamily
+                family 24
+                  edit EPSMEMBER '24'
+                  edit MEMBER '24'
+                  edit SUBFSFAMILY '/pf024'
+                  task derived_param
+                endfamily
+                family 25
+                  edit EPSMEMBER '25'
+                  edit MEMBER '25'
+                  edit SUBFSFAMILY '/pf025'
+                  task derived_param
+                endfamily
+                family 26
+                  edit EPSMEMBER '26'
+                  edit MEMBER '26'
+                  edit SUBFSFAMILY '/pf026'
+                  task derived_param
+                endfamily
+                family 27
+                  edit EPSMEMBER '27'
+                  edit MEMBER '27'
+                  edit SUBFSFAMILY '/pf027'
+                  task derived_param
+                endfamily
+                family 28
+                  edit EPSMEMBER '28'
+                  edit MEMBER '28'
+                  edit SUBFSFAMILY '/pf028'
+                  task derived_param
+                endfamily
+                family 29
+                  edit EPSMEMBER '29'
+                  edit MEMBER '29'
+                  edit SUBFSFAMILY '/pf029'
+                  task derived_param
+                endfamily
+                family 30
+                  edit EPSMEMBER '30'
+                  edit MEMBER '30'
+                  edit SUBFSFAMILY '/pf030'
+                  task derived_param
+                endfamily
+                family 31
+                  edit EPSMEMBER '31'
+                  edit MEMBER '31'
+                  edit SUBFSFAMILY '/pf031'
+                  task derived_param
+                endfamily
+                family 32
+                  edit EPSMEMBER '32'
+                  edit MEMBER '32'
+                  edit SUBFSFAMILY '/pf032'
+                  task derived_param
+                endfamily
+                family 33
+                  edit EPSMEMBER '33'
+                  edit MEMBER '33'
+                  edit SUBFSFAMILY '/pf033'
+                  task derived_param
+                endfamily
+                family 34
+                  edit EPSMEMBER '34'
+                  edit MEMBER '34'
+                  edit SUBFSFAMILY '/pf034'
+                  task derived_param
+                endfamily
+                family 35
+                  edit EPSMEMBER '35'
+                  edit MEMBER '35'
+                  edit SUBFSFAMILY '/pf035'
+                  task derived_param
+                endfamily
+                family 36
+                  edit EPSMEMBER '36'
+                  edit MEMBER '36'
+                  edit SUBFSFAMILY '/pf036'
+                  task derived_param
+                endfamily
+                family 37
+                  edit EPSMEMBER '37'
+                  edit MEMBER '37'
+                  edit SUBFSFAMILY '/pf037'
+                  task derived_param
+                endfamily
+                family 38
+                  edit EPSMEMBER '38'
+                  edit MEMBER '38'
+                  edit SUBFSFAMILY '/pf038'
+                  task derived_param
+                endfamily
+                family 39
+                  edit EPSMEMBER '39'
+                  edit MEMBER '39'
+                  edit SUBFSFAMILY '/pf039'
+                  task derived_param
+                endfamily
+                family 40
+                  edit EPSMEMBER '40'
+                  edit MEMBER '40'
+                  edit SUBFSFAMILY '/pf040'
+                  task derived_param
+                endfamily
+                family 41
+                  edit EPSMEMBER '41'
+                  edit MEMBER '41'
+                  edit SUBFSFAMILY '/pf041'
+                  task derived_param
+                endfamily
+                family 42
+                  edit EPSMEMBER '42'
+                  edit MEMBER '42'
+                  edit SUBFSFAMILY '/pf042'
+                  task derived_param
+                endfamily
+                family 43
+                  edit EPSMEMBER '43'
+                  edit MEMBER '43'
+                  edit SUBFSFAMILY '/pf043'
+                  task derived_param
+                endfamily
+                family 44
+                  edit EPSMEMBER '44'
+                  edit MEMBER '44'
+                  edit SUBFSFAMILY '/pf044'
+                  task derived_param
+                endfamily
+                family 45
+                  edit EPSMEMBER '45'
+                  edit MEMBER '45'
+                  edit SUBFSFAMILY '/pf045'
+                  task derived_param
+                endfamily
+                family 46
+                  edit EPSMEMBER '46'
+                  edit MEMBER '46'
+                  edit SUBFSFAMILY '/pf046'
+                  task derived_param
+                endfamily
+                family 47
+                  edit EPSMEMBER '47'
+                  edit MEMBER '47'
+                  edit SUBFSFAMILY '/pf047'
+                  task derived_param
+                endfamily
+                family 48
+                  edit EPSMEMBER '48'
+                  edit MEMBER '48'
+                  edit SUBFSFAMILY '/pf048'
+                  task derived_param
+                endfamily
+                family 49
+                  edit EPSMEMBER '49'
+                  edit MEMBER '49'
+                  edit SUBFSFAMILY '/pf049'
+                  task derived_param
+                endfamily
+                family 50
+                  edit EPSMEMBER '50'
+                  edit MEMBER '50'
+                  edit SUBFSFAMILY '/pf050'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family cf
+              trigger ../../fc/cf eq complete
+              edit EMOS_TYPE 'cf'
+              task derived_param
+                edit MEMBER 'off'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/12/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                trigger ../../../fc/pf/01 eq complete
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task derived_param
+              endfamily
+              family 02
+                trigger ../../../fc/pf/02 eq complete
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task derived_param
+              endfamily
+              family 03
+                trigger ../../../fc/pf/03 eq complete
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task derived_param
+              endfamily
+              family 04
+                trigger ../../../fc/pf/04 eq complete
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task derived_param
+              endfamily
+              family 05
+                trigger ../../../fc/pf/05 eq complete
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task derived_param
+              endfamily
+              family 06
+                trigger ../../../fc/pf/06 eq complete
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task derived_param
+              endfamily
+              family 07
+                trigger ../../../fc/pf/07 eq complete
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task derived_param
+              endfamily
+              family 08
+                trigger ../../../fc/pf/08 eq complete
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task derived_param
+              endfamily
+              family 09
+                trigger ../../../fc/pf/09 eq complete
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task derived_param
+              endfamily
+              family 10
+                trigger ../../../fc/pf/10 eq complete
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task derived_param
+              endfamily
+              family 11
+                trigger ../../../fc/pf/11 eq complete
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task derived_param
+              endfamily
+              family 12
+                trigger ../../../fc/pf/12 eq complete
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task derived_param
+              endfamily
+              family 13
+                trigger ../../../fc/pf/13 eq complete
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task derived_param
+              endfamily
+              family 14
+                trigger ../../../fc/pf/14 eq complete
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task derived_param
+              endfamily
+              family 15
+                trigger ../../../fc/pf/15 eq complete
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task derived_param
+              endfamily
+              family 16
+                trigger ../../../fc/pf/16 eq complete
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task derived_param
+              endfamily
+              family 17
+                trigger ../../../fc/pf/17 eq complete
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task derived_param
+              endfamily
+              family 18
+                trigger ../../../fc/pf/18 eq complete
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task derived_param
+              endfamily
+              family 19
+                trigger ../../../fc/pf/19 eq complete
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task derived_param
+              endfamily
+              family 20
+                trigger ../../../fc/pf/20 eq complete
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task derived_param
+              endfamily
+              family 21
+                trigger ../../../fc/pf/21 eq complete
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task derived_param
+              endfamily
+              family 22
+                trigger ../../../fc/pf/22 eq complete
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task derived_param
+              endfamily
+              family 23
+                trigger ../../../fc/pf/23 eq complete
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task derived_param
+              endfamily
+              family 24
+                trigger ../../../fc/pf/24 eq complete
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task derived_param
+              endfamily
+              family 25
+                trigger ../../../fc/pf/25 eq complete
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task derived_param
+              endfamily
+              family 26
+                trigger ../../../fc/pf/26 eq complete
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task derived_param
+              endfamily
+              family 27
+                trigger ../../../fc/pf/27 eq complete
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task derived_param
+              endfamily
+              family 28
+                trigger ../../../fc/pf/28 eq complete
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task derived_param
+              endfamily
+              family 29
+                trigger ../../../fc/pf/29 eq complete
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task derived_param
+              endfamily
+              family 30
+                trigger ../../../fc/pf/30 eq complete
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task derived_param
+              endfamily
+              family 31
+                trigger ../../../fc/pf/31 eq complete
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task derived_param
+              endfamily
+              family 32
+                trigger ../../../fc/pf/32 eq complete
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task derived_param
+              endfamily
+              family 33
+                trigger ../../../fc/pf/33 eq complete
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task derived_param
+              endfamily
+              family 34
+                trigger ../../../fc/pf/34 eq complete
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task derived_param
+              endfamily
+              family 35
+                trigger ../../../fc/pf/35 eq complete
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task derived_param
+              endfamily
+              family 36
+                trigger ../../../fc/pf/36 eq complete
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task derived_param
+              endfamily
+              family 37
+                trigger ../../../fc/pf/37 eq complete
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task derived_param
+              endfamily
+              family 38
+                trigger ../../../fc/pf/38 eq complete
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task derived_param
+              endfamily
+              family 39
+                trigger ../../../fc/pf/39 eq complete
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task derived_param
+              endfamily
+              family 40
+                trigger ../../../fc/pf/40 eq complete
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task derived_param
+              endfamily
+              family 41
+                trigger ../../../fc/pf/41 eq complete
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task derived_param
+              endfamily
+              family 42
+                trigger ../../../fc/pf/42 eq complete
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task derived_param
+              endfamily
+              family 43
+                trigger ../../../fc/pf/43 eq complete
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task derived_param
+              endfamily
+              family 44
+                trigger ../../../fc/pf/44 eq complete
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task derived_param
+              endfamily
+              family 45
+                trigger ../../../fc/pf/45 eq complete
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task derived_param
+              endfamily
+              family 46
+                trigger ../../../fc/pf/46 eq complete
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task derived_param
+              endfamily
+              family 47
+                trigger ../../../fc/pf/47 eq complete
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task derived_param
+              endfamily
+              family 48
+                trigger ../../../fc/pf/48 eq complete
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task derived_param
+              endfamily
+              family 49
+                trigger ../../../fc/pf/49 eq complete
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task derived_param
+              endfamily
+              family 50
+                trigger ../../../fc/pf/50 eq complete
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task derived_param
+              endfamily
+            endfamily
+          endfamily
+          family extra
+            trigger ./dp eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '246:360:6'
+            inlimit /emc_36r1/limits:extra
+            family cf
+              edit EMOS_TYPE 'cf'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '360'
+                edit FCLENGTH0 '240'
+                edit RUNVARFC '1'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/12/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 05
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 06
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 07
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 08
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 09
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 10
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 11
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 12
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 13
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 14
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 15
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 16
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 17
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 18
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 19
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 20
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 21
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 22
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 23
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 24
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 25
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 26
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 27
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 28
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 29
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 30
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 31
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 32
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 33
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 34
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 35
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 36
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 37
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 38
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 39
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 40
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 41
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 42
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 43
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 44
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 45
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 46
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 47
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 48
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 49
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 50
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+            endfamily
+          endfamily
+          family calibrate
+            complete /emc_36r1/main/ref/12/events:cf
+            trigger /emc_36r1/main/12/ref/an eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/calibrate'
+            family onws
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              inlimit /limits:linux_cluster
+              task feedupcal
+              task upcal
+                trigger feedupcal eq complete
+              task revertupcal
+            endfamily
+          endfamily
+          family efi
+            complete ( /emc_36r1/main/ref/12/events:cf) or ( /emc_36r1/main/ref/12/events:noefi)
+            trigger /emc_36r1/main/12/legB/postproc/dp eq complete
+            edit HC_VERSION '0046'
+            edit HC_EXPVER '0046'
+            edit REF_VERSION '0046'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            edit NC_DAYS '31'
+            edit EPSLEG '2'
+            inlimit /emc_36r1/limits:efi
+            task stage
+              edit NC_DAYS '31'
+            family 228_324
+              trigger ./stage eq complete
+              edit ACC '96'
+              edit EFI_STEP1 '228'
+              edit EFI_STEP2 '324'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 168_336
+              trigger ./stage eq complete
+              edit ACC '168'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '336'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 000_024
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 024_048
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 048_072
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 072_096
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 096_120
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 120_144
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 108_156
+              trigger ./stage eq complete
+              edit ACC '48'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '156'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 156_228
+              trigger ./stage eq complete
+              edit ACC '72'
+              edit EFI_STEP1 '156'
+              edit EFI_STEP2 '228'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 000_168
+              trigger ./stage eq complete
+              edit ACC '168'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 012_036
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 036_060
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 060_084
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 084_108
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 108_132
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+          endfamily
+          task efi2fdb
+            complete ( /emc_36r1/main/ref/12/events:cf) or ( /emc_36r1/main/ref/12/events:noefi)
+            trigger ./efi eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            inlimit /emc_36r1/main/ref:mutex
+            event none
+        endfamily
+        family prod
+          edit MEM '3000'
+          edit ACCOUNT 'oeenfopg'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'cp'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '90'
+          edit SMSURLBASE 'http://intra.ecmwf.int/plots/d/intra/'
+          edit SMSURL 'sub=fixed/'
+          inlimit /limits:prod
+          family eps
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            inlimit /emc_36r1/limits:prodeps
+            family 0246
+              edit EMOS_TIME_STEP_H '0246'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0252
+              edit EMOS_TIME_STEP_H '0252'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0258
+              edit EMOS_TIME_STEP_H '0258'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0264
+              edit EMOS_TIME_STEP_H '0264'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0270
+              edit EMOS_TIME_STEP_H '0270'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0276
+              edit EMOS_TIME_STEP_H '0276'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0282
+              edit EMOS_TIME_STEP_H '0282'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0288
+              edit EMOS_TIME_STEP_H '0288'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0294
+              edit EMOS_TIME_STEP_H '0294'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0300
+              edit EMOS_TIME_STEP_H '0300'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0306
+              edit EMOS_TIME_STEP_H '0306'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0312
+              edit EMOS_TIME_STEP_H '0312'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0318
+              edit EMOS_TIME_STEP_H '0318'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0324
+              edit EMOS_TIME_STEP_H '0324'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0330
+              edit EMOS_TIME_STEP_H '0330'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0336
+              edit EMOS_TIME_STEP_H '0336'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0342
+              edit EMOS_TIME_STEP_H '0342'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0348
+              edit EMOS_TIME_STEP_H '0348'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0354
+              edit EMOS_TIME_STEP_H '0354'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0360
+              edit EMOS_TIME_STEP_H '0360'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+          endfamily
+          family wave
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            edit PGNPES '2'
+            edit URL 'GWAEF/12'
+            inlimit /emc_36r1/limits:prodwave
+            family 0246
+              edit EMOS_TIME_STEP_H '0246'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0252
+              edit EMOS_TIME_STEP_H '0252'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0258
+              edit EMOS_TIME_STEP_H '0258'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0264
+              edit EMOS_TIME_STEP_H '0264'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0270
+              edit EMOS_TIME_STEP_H '0270'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0276
+              edit EMOS_TIME_STEP_H '0276'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0282
+              edit EMOS_TIME_STEP_H '0282'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0288
+              edit EMOS_TIME_STEP_H '0288'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0294
+              edit EMOS_TIME_STEP_H '0294'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0300
+              edit EMOS_TIME_STEP_H '0300'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0306
+              edit EMOS_TIME_STEP_H '0306'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0312
+              edit EMOS_TIME_STEP_H '0312'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0318
+              edit EMOS_TIME_STEP_H '0318'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0324
+              edit EMOS_TIME_STEP_H '0324'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0330
+              edit EMOS_TIME_STEP_H '0330'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0336
+              edit EMOS_TIME_STEP_H '0336'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0342
+              edit EMOS_TIME_STEP_H '0342'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0348
+              edit EMOS_TIME_STEP_H '0348'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0354
+              edit EMOS_TIME_STEP_H '0354'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0360
+              edit EMOS_TIME_STEP_H '0360'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+          endfamily
+          task prod_wparam
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ../postproc/dp eq complete and ../../legA/prod/prod_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TYPE 'wp'
+            edit EMOS_TIME_STEP_H '0360'
+            edit PGNPES '52'
+          task enfo_postproc
+            late -s +00:05 -c +00:15
+            trigger ../postproc/prob eq complete and ../postproc/ensms eq complete and ( ../../legA/prod/getreq/eps eq complete)
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'ep'
+            edit EMOS_TIME_STEP_H '0360'
+            edit PGNPES '21'
+          task waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ../postproc/prob eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TIME_STEP_H '0360'
+            edit PGNPES '1'
+        endfamily
+        family prod2diss
+          edit USER_PRIORITY '90'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'ef'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+          edit SMSURL 'GENFO/12'
+          family eps
+            family 0246
+              edit EMOS_TIME_STEP_H '0246'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0246/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../../../../legA/prod2diss/eps//0240/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0252
+              edit EMOS_TIME_STEP_H '0252'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0252/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0246/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0258
+              edit EMOS_TIME_STEP_H '0258'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0258/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0252/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0264
+              edit EMOS_TIME_STEP_H '0264'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0264/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0258/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0270
+              edit EMOS_TIME_STEP_H '0270'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0270/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0264/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0276
+              edit EMOS_TIME_STEP_H '0276'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0276/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0270/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0282
+              edit EMOS_TIME_STEP_H '0282'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0282/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0276/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0288
+              edit EMOS_TIME_STEP_H '0288'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0288/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0282/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0294
+              edit EMOS_TIME_STEP_H '0294'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0294/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0288/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0300
+              edit EMOS_TIME_STEP_H '0300'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0300/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0294/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0306
+              edit EMOS_TIME_STEP_H '0306'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0306/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0300/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0312
+              edit EMOS_TIME_STEP_H '0312'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0312/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0306/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0318
+              edit EMOS_TIME_STEP_H '0318'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0318/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0312/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0324
+              edit EMOS_TIME_STEP_H '0324'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0324/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0318/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0330
+              edit EMOS_TIME_STEP_H '0330'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0330/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0324/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0336
+              edit EMOS_TIME_STEP_H '0336'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0336/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0330/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0342
+              edit EMOS_TIME_STEP_H '0342'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0342/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0336/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0348
+              edit EMOS_TIME_STEP_H '0348'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0348/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0342/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0354
+              edit EMOS_TIME_STEP_H '0354'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0354/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0348/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0360
+              edit EMOS_TIME_STEP_H '0360'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0360/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0354/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            task check
+              trigger ./0360 eq complete
+          endfamily
+          family wave
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TYPE 'we'
+            edit SMSURL 'GWAEF/12'
+            family 0246
+              trigger ../../prod/wave/0246/prodwave eq complete and ( ../../../legA/prod2diss/wave/0240 eq complete)
+              edit EMOS_TIME_STEP_H '0246'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0252
+              trigger ../../prod/wave/0252/prodwave eq complete and ( ./0246 eq complete)
+              edit EMOS_TIME_STEP_H '0252'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0258
+              trigger ../../prod/wave/0258/prodwave eq complete and ( ./0252 eq complete)
+              edit EMOS_TIME_STEP_H '0258'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0264
+              trigger ../../prod/wave/0264/prodwave eq complete and ( ./0258 eq complete)
+              edit EMOS_TIME_STEP_H '0264'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0270
+              trigger ../../prod/wave/0270/prodwave eq complete and ( ./0264 eq complete)
+              edit EMOS_TIME_STEP_H '0270'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0276
+              trigger ../../prod/wave/0276/prodwave eq complete and ( ./0270 eq complete)
+              edit EMOS_TIME_STEP_H '0276'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0282
+              trigger ../../prod/wave/0282/prodwave eq complete and ( ./0276 eq complete)
+              edit EMOS_TIME_STEP_H '0282'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0288
+              trigger ../../prod/wave/0288/prodwave eq complete and ( ./0282 eq complete)
+              edit EMOS_TIME_STEP_H '0288'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0294
+              trigger ../../prod/wave/0294/prodwave eq complete and ( ./0288 eq complete)
+              edit EMOS_TIME_STEP_H '0294'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0300
+              trigger ../../prod/wave/0300/prodwave eq complete and ( ./0294 eq complete)
+              edit EMOS_TIME_STEP_H '0300'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0306
+              trigger ../../prod/wave/0306/prodwave eq complete and ( ./0300 eq complete)
+              edit EMOS_TIME_STEP_H '0306'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0312
+              trigger ../../prod/wave/0312/prodwave eq complete and ( ./0306 eq complete)
+              edit EMOS_TIME_STEP_H '0312'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0318
+              trigger ../../prod/wave/0318/prodwave eq complete and ( ./0312 eq complete)
+              edit EMOS_TIME_STEP_H '0318'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0324
+              trigger ../../prod/wave/0324/prodwave eq complete and ( ./0318 eq complete)
+              edit EMOS_TIME_STEP_H '0324'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0330
+              trigger ../../prod/wave/0330/prodwave eq complete and ( ./0324 eq complete)
+              edit EMOS_TIME_STEP_H '0330'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0336
+              trigger ../../prod/wave/0336/prodwave eq complete and ( ./0330 eq complete)
+              edit EMOS_TIME_STEP_H '0336'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0342
+              trigger ../../prod/wave/0342/prodwave eq complete and ( ./0336 eq complete)
+              edit EMOS_TIME_STEP_H '0342'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0348
+              trigger ../../prod/wave/0348/prodwave eq complete and ( ./0342 eq complete)
+              edit EMOS_TIME_STEP_H '0348'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0354
+              trigger ../../prod/wave/0354/prodwave eq complete and ( ./0348 eq complete)
+              edit EMOS_TIME_STEP_H '0354'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0360
+              trigger ../../prod/wave/0360/prodwave eq complete and ( ./0354 eq complete)
+              edit EMOS_TIME_STEP_H '0360'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            task check
+              trigger ./0360 eq complete
+          endfamily
+          task diss_wparam
+            late -s +00:05 -c +00:15
+            trigger ../prod/prod_wparam eq complete and ../../legA/prod2diss/diss_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TIME_STEP_H '0360'
+            edit EMOS_TYPE 'wp'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/waef_postproc eq complete and ../../legA/prod2diss/diss_waef_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0360'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/enfo_postproc eq complete and ../../legA/prod2diss/diss_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0360'
+            edit EMOS_TYPE 'ep'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+        endfamily
+      endfamily
+    endfamily
+    family 00
+      trigger ( ./make eq complete) and ( ./inistage eq complete)
+      edit DELTA_DAY '1'
+      edit EMOS_BASE '00'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+      family ref
+        trigger ../make eq complete and ( /emc_36r1/main:YMD le /e_36r1/main:YMD)
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit QUEUE 'emos-exp'
+        limit mutex 1
+        task an
+          trigger /e_36r1/main/00/an eq complete
+        task anfc
+          complete ( ( /e_36r1/main/00/an/surf_anal/slwet eq complete and ( /e_36r1/main/00/an/4dvar/ifstraj:finalwave or /e_36r1/main/00/an/4dvar eq complete)) or /e_36r1/main/00/an eq complete)
+          trigger 0 eq 1
+        task model_active
+          trigger /e_36r1/main/00/fc/model eq active or /e_36r1/main/00/fc/model eq complete
+        task an_active
+          trigger /e_36r1/main/00/an/4dvar/uptraj_0 eq active or /e_36r1/main/00/an/4dvar/uptraj_0 eq complete
+        task model
+          trigger /e_36r1/main/00/fc/model eq complete
+        family oceini
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+          inlimit /emc_36r1/limits:marsret
+          time 23:45
+          task dummy
+        endfamily
+        task dc
+          trigger /e_36r1/main/12dc/fc/model:step ge 12 or /e_36r1/main/12dc/fc/model eq complete
+        task obs
+          trigger /e_36r1/main/00/obs/get/get_stor eq complete
+      endfamily
+      family sv
+        trigger ./ref/dc eq complete and ./ref/an_active eq complete
+        edit EVOLVE 'no'
+        edit FASTEX 'no'
+        edit EPSTYPE 'sv'
+        edit FCMEM '2000'
+        edit FCSTACK '400'
+        edit FCMRFS '100'
+        edit FCLENGTH '48'
+        edit EPSSVTCSUB '1'
+        edit EPSSVOP '1'
+        edit NPES '16'
+        edit EPSSVTSTEP '900'
+        task getini
+          edit LINIENDA '0'
+          edit INIDATEENDA '0'
+          edit EPSCOUPLE '0'
+          edit N_PERT_AN '10'
+          edit EPSCOUPL_A '0'
+          edit EPSCOUPL_B '0'
+          edit EPSCOUPL_C '0'
+        task inidata_sv
+          trigger getini eq complete
+          edit THREADS '8'
+        task targets
+          late -s +00:03 -c +00:10
+          trigger ../ref/obs eq complete
+          edit EPSTCBB '1'
+          label da_info ""
+          label dcda_info ""
+          event sv
+        task svsh
+          trigger inidata_sv eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit THREADS '8'
+          edit USER_PRIORITY '73'
+        task svnh
+          trigger inidata_sv eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit THREADS '8'
+          edit USER_PRIORITY '74'
+        task subspace
+          trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+        task sv1
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '1'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+          edit USER_PRIORITY '72'
+        task sv2
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '2'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+          edit USER_PRIORITY '71'
+        task sv3
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '3'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task sv4
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '4'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task sv5
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '5'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task sv6
+          trigger ( targets eq complete or targets:sv) and subspace eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          edit MEMBER '6'
+          edit EPSTROP '1'
+          edit EPSSVDIAB 'true'
+          edit THREADS '8'
+        task getsvevo
+          event ecfs
+        task getsvs
+          trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit EPSTROP '1'
+        task sv_value
+          trigger getsvs eq complete
+          inlimit /emc_36r1/main/ref:mutex
+        task svnhevo
+          trigger svnh eq complete and ../legA/fc eq complete
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit STACK '350'
+          edit HEMISPHERE 'n'
+          edit EVOLVE 'yes'
+          edit ANNPES '8'
+          edit CPUTIME '120000'
+        task svshevo
+          trigger svsh eq complete and ../legA/fc eq complete
+          edit NPES '24'
+          edit THREADS '8'
+          edit MEM '1300'
+          edit MRF '10'
+          edit STACK '450'
+          edit EVOLVE 'yes'
+          edit ANNPES '8'
+          edit CPUTIME '120000'
+        task clean
+          trigger ../legA/fc eq complete and svnhevo eq complete and svshevo eq complete
+        task dcopy
+          trigger clean eq complete
+          edit SMSFILES '/home/ma/emos/def/o/system'
+      endfamily
+      family legA
+        edit EPSLEG '1'
+        family fc
+          trigger /emc_36r1/main/00/ref/anfc eq complete
+          edit FCMEM '2240'
+          edit FCSTACK '700'
+          edit FCMRFS '0'
+          edit PRIORITY '72'
+          edit USER_PRIORITY '72'
+          edit N_PERT_AN '10'
+          edit SSTLEN '240'
+          edit EPSINISTEP_PREVIOUS '0'
+          edit EPSWAMNFRE '30'
+          edit EPSWAMNANG '24'
+          edit TSTEP '1200'
+          edit EPSFCRES '639'
+          edit RESOL '639'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit CPUTIME '1000'
+          edit MEM '960'
+          edit THREADS '8'
+          edit NPES '8'
+          edit EPSLEG '1'
+          edit PERSST 'true'
+          edit SSTINT '1'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata
+            trigger getini eq complete
+            edit THREADS '8'
+          task getae
+            event 1 
+          task rot
+            trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+            edit EPSTROP '1'
+          family pert_ic
+            trigger rot eq complete and inidata eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+            inlimit /emc_36r1/limits:pertic
+            family 00
+              task pertinic
+                edit MEMBER '0'
+            endfamily
+            family 01
+              task pertinic
+                edit MEMBER '1'
+            endfamily
+            family 02
+              task pertinic
+                edit MEMBER '2'
+            endfamily
+            family 03
+              task pertinic
+                edit MEMBER '3'
+            endfamily
+            family 04
+              task pertinic
+                edit MEMBER '4'
+            endfamily
+            family 05
+              task pertinic
+                edit MEMBER '5'
+            endfamily
+            family 06
+              task pertinic
+                edit MEMBER '6'
+            endfamily
+            family 07
+              task pertinic
+                edit MEMBER '7'
+            endfamily
+            family 08
+              task pertinic
+                edit MEMBER '8'
+            endfamily
+            family 09
+              task pertinic
+                edit MEMBER '9'
+            endfamily
+            family 10
+              task pertinic
+                edit MEMBER '10'
+            endfamily
+            family 11
+              task pertinic
+                edit MEMBER '11'
+            endfamily
+            family 12
+              task pertinic
+                edit MEMBER '12'
+            endfamily
+            family 13
+              task pertinic
+                edit MEMBER '13'
+            endfamily
+            family 14
+              task pertinic
+                edit MEMBER '14'
+            endfamily
+            family 15
+              task pertinic
+                edit MEMBER '15'
+            endfamily
+            family 16
+              task pertinic
+                edit MEMBER '16'
+            endfamily
+            family 17
+              task pertinic
+                edit MEMBER '17'
+            endfamily
+            family 18
+              task pertinic
+                edit MEMBER '18'
+            endfamily
+            family 19
+              task pertinic
+                edit MEMBER '19'
+            endfamily
+            family 20
+              task pertinic
+                edit MEMBER '20'
+            endfamily
+            family 21
+              task pertinic
+                edit MEMBER '21'
+            endfamily
+            family 22
+              task pertinic
+                edit MEMBER '22'
+            endfamily
+            family 23
+              task pertinic
+                edit MEMBER '23'
+            endfamily
+            family 24
+              task pertinic
+                edit MEMBER '24'
+            endfamily
+            family 25
+              task pertinic
+                edit MEMBER '25'
+            endfamily
+            family 26
+              task pertinic
+                edit MEMBER '26'
+            endfamily
+            family 27
+              task pertinic
+                edit MEMBER '27'
+            endfamily
+            family 28
+              task pertinic
+                edit MEMBER '28'
+            endfamily
+            family 29
+              task pertinic
+                edit MEMBER '29'
+            endfamily
+            family 30
+              task pertinic
+                edit MEMBER '30'
+            endfamily
+            family 31
+              task pertinic
+                edit MEMBER '31'
+            endfamily
+            family 32
+              task pertinic
+                edit MEMBER '32'
+            endfamily
+            family 33
+              task pertinic
+                edit MEMBER '33'
+            endfamily
+            family 34
+              task pertinic
+                edit MEMBER '34'
+            endfamily
+            family 35
+              task pertinic
+                edit MEMBER '35'
+            endfamily
+            family 36
+              task pertinic
+                edit MEMBER '36'
+            endfamily
+            family 37
+              task pertinic
+                edit MEMBER '37'
+            endfamily
+            family 38
+              task pertinic
+                edit MEMBER '38'
+            endfamily
+            family 39
+              task pertinic
+                edit MEMBER '39'
+            endfamily
+            family 40
+              task pertinic
+                edit MEMBER '40'
+            endfamily
+            family 41
+              task pertinic
+                edit MEMBER '41'
+            endfamily
+            family 42
+              task pertinic
+                edit MEMBER '42'
+            endfamily
+            family 43
+              task pertinic
+                edit MEMBER '43'
+            endfamily
+            family 44
+              task pertinic
+                edit MEMBER '44'
+            endfamily
+            family 45
+              task pertinic
+                edit MEMBER '45'
+            endfamily
+            family 46
+              task pertinic
+                edit MEMBER '46'
+            endfamily
+            family 47
+              task pertinic
+                edit MEMBER '47'
+            endfamily
+            family 48
+              task pertinic
+                edit MEMBER '48'
+            endfamily
+            family 49
+              task pertinic
+                edit MEMBER '49'
+            endfamily
+            family 50
+              task pertinic
+                edit MEMBER '50'
+            endfamily
+          endfamily
+          task cp_pert
+            trigger pert_ic eq complete
+            event 1 
+          task wavini
+            trigger /emc_36r1/main/00/ref/an eq complete
+            edit FSFAMILY 'mc'
+          family cv
+            trigger ./pert_ic/00 eq complete and ./inidata eq complete and ./wavini eq complete and /emc_36r1/main/00/ref/model_active eq complete
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit EPSFCRES '639'
+            edit TSTEP '1200'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit CLASS 'od'
+            edit PERSST 'no'
+            edit EPSTYPE 'cv'
+            edit EMOS_TYPE 'cv'
+            edit EPSNLEGS '1'
+            edit EPSLEG '1'
+            edit EPSINISTEP '360'
+            edit FCLENGTH '360'
+            edit USER_PRIORITY '73'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            inlimit /emc_36r1/limits:pftotal
+            family control_1
+              edit MEMBER '1'
+              edit EPSMEMBER '1'
+              edit SUBFSFAMILY '/cv001'
+              task getiniLeg
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit FCNPES '32'
+                edit THREADS '4'
+                meter step -1 360 360
+              task derived_param
+                trigger modeleps eq complete
+                edit STEPS '0:144:3 144:360:6'
+            endfamily
+            family control_2
+              edit MEMBER '2'
+              edit EPSMEMBER '2'
+              edit SUBFSFAMILY '/cv002'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              task getiniLeg
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task intHtoL
+                trigger getiniLeg eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '1200'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                meter step -1 360 360
+              task derived_param
+                trigger modeleps eq complete
+                edit STEPS '0:144:3 144:360:6'
+            endfamily
+          endfamily
+          task wavfcdata
+            trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+            edit EPSCOUPLE '1'
+          task getpersSST
+            trigger ./inidata eq complete
+            edit EPSCOUPLE '1'
+            edit EPS_INI_STREAM 'DA'
+            edit EPSFCRES '639'
+          family pf
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete and ../../ref/model_active eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTYPE 'pf'
+            edit EMOS_TYPE 'pf'
+            edit USER_PRIORITY '72'
+            edit PRIORITY '72'
+            edit FCNPES '64'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit EPSFCRES '639'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit EPSINISTEP '216'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '1'
+            edit CLASS 'od'
+            inlimit /emc_36r1/limits:pftotal
+            meter step -1 240 240
+            family 01
+              edit EPSMEMBER '1'
+              edit MEMBER '1'
+              edit SUBFSFAMILY '/pf001'
+              task getiniLeg
+                trigger ../../pert_ic/01/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 02
+              edit EPSMEMBER '2'
+              edit MEMBER '2'
+              edit SUBFSFAMILY '/pf002'
+              task getiniLeg
+                trigger ../../pert_ic/02/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 03
+              edit EPSMEMBER '3'
+              edit MEMBER '3'
+              edit SUBFSFAMILY '/pf003'
+              task getiniLeg
+                trigger ../../pert_ic/03/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 04
+              edit EPSMEMBER '4'
+              edit MEMBER '4'
+              edit SUBFSFAMILY '/pf004'
+              task getiniLeg
+                trigger ../../pert_ic/04/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 05
+              edit EPSMEMBER '5'
+              edit MEMBER '5'
+              edit SUBFSFAMILY '/pf005'
+              task getiniLeg
+                trigger ../../pert_ic/05/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 06
+              edit EPSMEMBER '6'
+              edit MEMBER '6'
+              edit SUBFSFAMILY '/pf006'
+              task getiniLeg
+                trigger ../../pert_ic/06/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 07
+              edit EPSMEMBER '7'
+              edit MEMBER '7'
+              edit SUBFSFAMILY '/pf007'
+              task getiniLeg
+                trigger ../../pert_ic/07/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 08
+              edit EPSMEMBER '8'
+              edit MEMBER '8'
+              edit SUBFSFAMILY '/pf008'
+              task getiniLeg
+                trigger ../../pert_ic/08/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 09
+              edit EPSMEMBER '9'
+              edit MEMBER '9'
+              edit SUBFSFAMILY '/pf009'
+              task getiniLeg
+                trigger ../../pert_ic/09/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 10
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              edit SUBFSFAMILY '/pf010'
+              task getiniLeg
+                trigger ../../pert_ic/10/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 11
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              edit SUBFSFAMILY '/pf011'
+              task getiniLeg
+                trigger ../../pert_ic/11/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 12
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              edit SUBFSFAMILY '/pf012'
+              task getiniLeg
+                trigger ../../pert_ic/12/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 13
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              edit SUBFSFAMILY '/pf013'
+              task getiniLeg
+                trigger ../../pert_ic/13/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 14
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              edit SUBFSFAMILY '/pf014'
+              task getiniLeg
+                trigger ../../pert_ic/14/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 15
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              edit SUBFSFAMILY '/pf015'
+              task getiniLeg
+                trigger ../../pert_ic/15/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 16
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              edit SUBFSFAMILY '/pf016'
+              task getiniLeg
+                trigger ../../pert_ic/16/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 17
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              edit SUBFSFAMILY '/pf017'
+              task getiniLeg
+                trigger ../../pert_ic/17/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 18
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              edit SUBFSFAMILY '/pf018'
+              task getiniLeg
+                trigger ../../pert_ic/18/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 19
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              edit SUBFSFAMILY '/pf019'
+              task getiniLeg
+                trigger ../../pert_ic/19/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 20
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              edit SUBFSFAMILY '/pf020'
+              task getiniLeg
+                trigger ../../pert_ic/20/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 21
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              edit SUBFSFAMILY '/pf021'
+              task getiniLeg
+                trigger ../../pert_ic/21/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 22
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              edit SUBFSFAMILY '/pf022'
+              task getiniLeg
+                trigger ../../pert_ic/22/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 23
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              edit SUBFSFAMILY '/pf023'
+              task getiniLeg
+                trigger ../../pert_ic/23/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 24
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              edit SUBFSFAMILY '/pf024'
+              task getiniLeg
+                trigger ../../pert_ic/24/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 25
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              edit SUBFSFAMILY '/pf025'
+              task getiniLeg
+                trigger ../../pert_ic/25/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 26
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              edit SUBFSFAMILY '/pf026'
+              task getiniLeg
+                trigger ../../pert_ic/26/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 27
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              edit SUBFSFAMILY '/pf027'
+              task getiniLeg
+                trigger ../../pert_ic/27/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 28
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              edit SUBFSFAMILY '/pf028'
+              task getiniLeg
+                trigger ../../pert_ic/28/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 29
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              edit SUBFSFAMILY '/pf029'
+              task getiniLeg
+                trigger ../../pert_ic/29/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 30
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              edit SUBFSFAMILY '/pf030'
+              task getiniLeg
+                trigger ../../pert_ic/30/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 31
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              edit SUBFSFAMILY '/pf031'
+              task getiniLeg
+                trigger ../../pert_ic/31/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 32
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              edit SUBFSFAMILY '/pf032'
+              task getiniLeg
+                trigger ../../pert_ic/32/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 33
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              edit SUBFSFAMILY '/pf033'
+              task getiniLeg
+                trigger ../../pert_ic/33/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 34
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              edit SUBFSFAMILY '/pf034'
+              task getiniLeg
+                trigger ../../pert_ic/34/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 35
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              edit SUBFSFAMILY '/pf035'
+              task getiniLeg
+                trigger ../../pert_ic/35/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 36
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              edit SUBFSFAMILY '/pf036'
+              task getiniLeg
+                trigger ../../pert_ic/36/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 37
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              edit SUBFSFAMILY '/pf037'
+              task getiniLeg
+                trigger ../../pert_ic/37/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 38
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              edit SUBFSFAMILY '/pf038'
+              task getiniLeg
+                trigger ../../pert_ic/38/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 39
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              edit SUBFSFAMILY '/pf039'
+              task getiniLeg
+                trigger ../../pert_ic/39/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 40
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              edit SUBFSFAMILY '/pf040'
+              task getiniLeg
+                trigger ../../pert_ic/40/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 41
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              edit SUBFSFAMILY '/pf041'
+              task getiniLeg
+                trigger ../../pert_ic/41/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 42
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              edit SUBFSFAMILY '/pf042'
+              task getiniLeg
+                trigger ../../pert_ic/42/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 43
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              edit SUBFSFAMILY '/pf043'
+              task getiniLeg
+                trigger ../../pert_ic/43/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 44
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              edit SUBFSFAMILY '/pf044'
+              task getiniLeg
+                trigger ../../pert_ic/44/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 45
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              edit SUBFSFAMILY '/pf045'
+              task getiniLeg
+                trigger ../../pert_ic/45/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 46
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              edit SUBFSFAMILY '/pf046'
+              task getiniLeg
+                trigger ../../pert_ic/46/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 47
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              edit SUBFSFAMILY '/pf047'
+              task getiniLeg
+                trigger ../../pert_ic/47/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 48
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              edit SUBFSFAMILY '/pf048'
+              task getiniLeg
+                trigger ../../pert_ic/48/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 49
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              edit SUBFSFAMILY '/pf049'
+              task getiniLeg
+                trigger ../../pert_ic/49/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+            family 50
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              edit SUBFSFAMILY '/pf050'
+              task getiniLeg
+                trigger ../../pert_ic/50/pertinic eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:modelepsA
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family cf
+            trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete and /emc_36r1/main/00/ref/model_active eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit MEMBER '0'
+            edit EPSMEMBER '0'
+            edit SUBFSFAMILY '/cf000'
+            edit EPSTYPE 'cf'
+            edit EMOS_TYPE 'cf'
+            edit USER_PRIORITY '73'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMRESOL 'global50'
+            edit EPSFCRES '639'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit EPSINISTEP '216'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '1'
+            edit CLASS 'od'
+            task getiniLeg
+              trigger ../inidata eq complete and ../wavini eq complete
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task modeleps
+              trigger getiniLeg eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSLEG '1'
+              edit EPSFCRES '639'
+              edit EPSINISTEP '216'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit CLASS 'od'
+              edit FCNPES '32'
+              edit THREADS '4'
+              meter step -1 240 240
+          endfamily
+          family reservation1
+            trigger ./pf/01/modeleps eq active or ./pf/01/modeleps eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reserve_cpu
+              late -s +00:02 -c +00:02
+              edit RESERVED_CPUS '10880'
+              edit RESERVE_FOR '40'
+              label info ""
+            task rm_res
+              late -s +00:02 -c +00:02
+              trigger ./reserve_cpu eq complete
+              edit RESERVATION_LABEL 'emos00'
+              label info ""
+          endfamily
+          family reservation2
+            trigger ( ./pf/46/modeleps eq active or ./pf/46/modeleps eq complete) and ( ./pf/47/modeleps eq active or ./pf/47/modeleps eq complete) and ( ./pf/48/modeleps eq active or ./pf/48/modeleps eq complete) and ( ./pf/49/modeleps eq active or ./pf/49/modeleps eq complete) and ( ./pf/50/modeleps eq active or ./pf/50/modeleps eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reset_class
+              late -s +00:02 -c +00:02
+              edit RESERVATION_DEFINITION 'default'
+              label info ""
+            task ms_cpu
+              late -s +00:02 -c +00:02
+              edit MS_CPUS '$((64*80))'
+              label info ""
+            task reserve_cpu
+              late -s +00:02 -c +00:02
+              complete /emc_36r1/main/ref/00/events:768
+              edit RESERVED_CPUS '6400'
+              edit RESERVE_FOR '40'
+              label info ""
+            task reserve_cpu1
+              late -s +00:02 -c +00:02
+              complete ( /emc_36r1/main/ref/00/events eq complete) and ( not /emc_36r1/main/ref/00/events:768)
+              edit RESERVED_CPUS '6400'
+              edit RESERVE_FOR '100'
+              label info ""
+          endfamily
+          family reservation3
+            trigger ( ./pf eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reserve_cpu
+              late -s +00:02 -c +00:02
+              complete /emc_36r1/main/ref/00/events:768
+              edit RESERVED_CPUS '3200'
+              edit RESERVE_FOR '30'
+              label info ""
+            task reserve_cpu1
+              late -s +00:02 -c +00:02
+              complete ( /emc_36r1/main/ref/00/events eq complete) and ( not /emc_36r1/main/ref/00/events:768)
+              edit RESERVED_CPUS '3200'
+              edit RESERVE_FOR '80'
+              label info ""
+          endfamily
+        endfamily
+        family fax
+          trigger /emc_36r1/main/00/ref/an eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+          task ena4
+            trigger ../postproc/clusters eq complete and ../postproc/ensms eq complete
+            edit ANALYSIS 'NO'
+          task plume
+            trigger ../postproc/prob eq complete and /emc_36r1/main/00/ref/model eq complete
+            edit ANALYSIS 'YES'
+          task fax
+            trigger plume eq complete and ena4 eq complete
+            edit SMSTRIES '1'
+          task manfax
+            trigger plume eq complete and ena4 eq complete
+            edit SMSTRIES '1'
+            edit COUNTRY ''
+          task faxcheck
+            trigger fax eq complete
+          task faxcheck2
+            trigger fax eq complete
+            time 08:00
+        endfamily
+        family postproc
+          trigger ./fc ne queued
+          edit STEPS '24/240/12/24 168/168/12/48 240/240/12/72 240/240/12/120'
+          inlimit /emc_36r1/limits:postproc
+          family prepare
+            complete /emc_36r1/main/ref/00/events:cf
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            family all
+              complete ../../fc eq complete and ./query eq active
+              trigger ../../fc eq complete and ( ./query eq queued or ./query eq complete)
+              edit KIND 'all'
+              edit STEP '-1'
+              family t850
+                edit PARAM 'T'
+                edit LEVEL '850'
+                task pp_prep
+              endfamily
+              family t500
+                edit PARAM 'T'
+                edit LEVEL '500'
+                task pp_prep
+              endfamily
+              family z1000
+                edit PARAM 'Z'
+                edit LEVEL '1000'
+                task pp_prep
+              endfamily
+              family z500
+                edit PARAM 'Z'
+                edit LEVEL '500'
+                task pp_prep
+              endfamily
+            endfamily
+            family query
+              complete ../../fc eq complete and ../../fc/pf:step le 0
+              trigger ( ( ../../fc/pf:step ge 0) and ( ../../fc/cf/modeleps:step ge 0)) or ( ../../fc/pf eq complete and ../../fc/cf eq complete)
+              edit KIND 'query'
+              family t850
+                edit PARAM 'T'
+                edit LEVEL '850'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+              family t500
+                edit PARAM 'T'
+                edit LEVEL '500'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+              family z1000
+                edit PARAM 'Z'
+                edit LEVEL '1000'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+              family z500
+                edit PARAM 'Z'
+                edit LEVEL '500'
+                task pp_prep
+                  meter step -1 240 240
+              endfamily
+            endfamily
+          endfamily
+          family ensms
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger ( ../fc eq complete) and ( ./prepare eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            family limits
+              limit fdb 1
+              limit gen 8
+            endfamily
+            task ensms
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit ENS_MARS 'false'
+              event stage
+            family 048
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '003'
+              edit STEP2 '048'
+              edit BY '3'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 096
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '051'
+              edit STEP2 '096'
+              edit BY '3'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 144
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '099'
+              edit STEP2 '144'
+              edit BY '3'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 240
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '150'
+              edit STEP2 '240'
+              edit BY '6'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+          endfamily
+          family prob
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger /emc_36r1/main/00/legA/fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            edit STEP1 '12'
+            edit STEP2 '240'
+            edit BY '12'
+            family 24
+              edit STEP1 '24'
+              edit STEP2 '240'
+              edit BY '24'
+              family t850
+                trigger ../../prepare/all/t850 eq complete
+                family 120_240
+                  edit STEPS '120 240'
+                  task t850
+                    event 1 
+                endfamily
+                family 120_168
+                  trigger ./120_240/t850:1 or ./120_240 eq complete
+                  edit STEPS '120 168'
+                  task t850
+                    event 1 
+                endfamily
+                family 168_240
+                  trigger ./120_240/t850:1 or ./120_240 eq complete
+                  edit STEPS '168 240'
+                  task t850
+                    event 1 
+                endfamily
+              endfamily
+              task rain
+              task ff
+            endfamily
+            family 12
+              edit STEP1 '12'
+              edit STEP2 '228'
+              edit BY '24'
+              task t850
+                trigger ../../prepare/all/t850 eq complete
+              task rain
+              task ff
+            endfamily
+            task 2t
+            task swh
+            task mwp
+            task 10fg
+              trigger ../dp eq complete
+            task prob_fdb
+              trigger ./2t eq complete and swh eq complete and mwp eq complete and ./10fg eq complete and ./12 eq complete and ./24 eq complete
+          endfamily
+          family tc
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger ../fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/tc'
+            edit TCINIEXPVER '0046'
+            family obsdata
+              trigger ( /emc_36r1/main/00/legA/fc/pf eq complete and /emc_36r1/main/00/legA/fc/cf eq complete)
+              task retrieve
+                late -c +00:10
+                trigger ( /emc_36r1/main/00/sv/targets eq complete or /emc_36r1/main/00/sv/targets:sv)
+                label info ""
+                event notc
+              task obs
+                trigger retrieve eq complete
+            endfamily
+            family stage
+              trigger ( /emc_36r1/main/00/legA/fc eq complete)
+              task an
+              task fc
+              task pf
+              task cf
+            endfamily
+            family tracking
+              trigger obsdata/obs eq complete and stage eq complete
+              inlimit /emc_36r1/limits:tc
+              family 1
+                edit MEMBER '1'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 2
+                edit MEMBER '2'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 3
+                edit MEMBER '3'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 4
+                edit MEMBER '4'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 5
+                edit MEMBER '5'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 6
+                edit MEMBER '6'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 7
+                edit MEMBER '7'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 8
+                edit MEMBER '8'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 9
+                edit MEMBER '9'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 10
+                edit MEMBER '10'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 11
+                edit MEMBER '11'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 12
+                edit MEMBER '12'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 13
+                edit MEMBER '13'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 14
+                edit MEMBER '14'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 15
+                edit MEMBER '15'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 16
+                edit MEMBER '16'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 17
+                edit MEMBER '17'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 18
+                edit MEMBER '18'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 19
+                edit MEMBER '19'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 20
+                edit MEMBER '20'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 21
+                edit MEMBER '21'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 22
+                edit MEMBER '22'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 23
+                edit MEMBER '23'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 24
+                edit MEMBER '24'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 25
+                edit MEMBER '25'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 26
+                edit MEMBER '26'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 27
+                edit MEMBER '27'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 28
+                edit MEMBER '28'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 29
+                edit MEMBER '29'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 30
+                edit MEMBER '30'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 31
+                edit MEMBER '31'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 32
+                edit MEMBER '32'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 33
+                edit MEMBER '33'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 34
+                edit MEMBER '34'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 35
+                edit MEMBER '35'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 36
+                edit MEMBER '36'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 37
+                edit MEMBER '37'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 38
+                edit MEMBER '38'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 39
+                edit MEMBER '39'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 40
+                edit MEMBER '40'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 41
+                edit MEMBER '41'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 42
+                edit MEMBER '42'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 43
+                edit MEMBER '43'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 44
+                edit MEMBER '44'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 45
+                edit MEMBER '45'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 46
+                edit MEMBER '46'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 47
+                edit MEMBER '47'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 48
+                edit MEMBER '48'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 49
+                edit MEMBER '49'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family 50
+                edit MEMBER '50'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family cf
+                edit MEMBER '51'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+              family oper
+                edit MEMBER '52'
+                edit SLEEP '1'
+                task get_data
+                task hilo
+                  trigger get_data eq complete
+                task tracking
+                  trigger hilo eq complete
+              endfamily
+            endfamily
+            family post_process
+              task to_bufr
+                trigger ../tracking eq complete
+            endfamily
+          endfamily
+          family calibrate
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger /emc_36r1/main/00/ref/an eq complete and ../fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/calibrate'
+            family onsc
+              edit QUEUE 'ns'
+              edit QUEUE_EPILOG 'ns'
+              edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+              edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+              inlimit /limits:c1b
+              task feedupcal
+              task upcal
+                trigger feedupcal eq complete
+                edit Z500_EXPVER '0001'
+                edit METVIEW 'metview'
+              task revertupcal
+            endfamily
+          endfamily
+          family clusters
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger ./calibrate/onsc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/clusters'
+            edit USER_PRIORITY '81'
+            edit QUEUE 'ns'
+            edit QUEUE_EPILOG 'ns'
+            edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+            edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+            inlimit /limits:c1b
+            task cthresh
+            task cluster
+              trigger cthresh eq complete and /emc_36r1/main/00/ref/model eq complete
+              edit USER_PRIORITY '76'
+            task tubcon
+              trigger /emc_36r1/main/00/ref/model eq complete
+            task tubgen
+              late -c +00:20
+              trigger tubcon eq complete
+          endfamily
+          family efi
+            complete ( /emc_36r1/main/ref/00/events:cf) or ( /emc_36r1/main/ref/00/events:noefi)
+            trigger /emc_36r1/main/00/legA/postproc/dp eq complete
+            edit HC_VERSION '0046'
+            edit HC_EXPVER '0046'
+            edit REF_VERSION '0046'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            edit NC_DAYS '31'
+            edit EPSLEG '1'
+            inlimit /emc_36r1/limits:efi
+            task stage
+              edit NC_DAYS '31'
+            family 000_120
+              trigger ./stage eq complete
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 024_144
+              trigger ./stage eq complete
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 000_240
+              trigger ./stage eq complete
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 000_024
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 024_048
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 048_072
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 072_096
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+            family 096_120
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+            endfamily
+          endfamily
+          task efi2fdb
+            complete ( /emc_36r1/main/ref/00/events:cf) or ( /emc_36r1/main/ref/00/events:noefi)
+            trigger ./efi eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            inlimit /emc_36r1/main/ref:mutex
+            event none
+          family dp
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '0:144:3 144:240:6'
+            inlimit /emc_36r1/limits:dp
+            family cf
+              trigger ../../fc/cf eq complete
+              edit EMOS_TYPE 'cf'
+              task derived_param
+                edit MEMBER 'off'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/00/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                trigger ../../../fc/pf/01 eq complete
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task derived_param
+              endfamily
+              family 02
+                trigger ../../../fc/pf/02 eq complete
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task derived_param
+              endfamily
+              family 03
+                trigger ../../../fc/pf/03 eq complete
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task derived_param
+              endfamily
+              family 04
+                trigger ../../../fc/pf/04 eq complete
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task derived_param
+              endfamily
+              family 05
+                trigger ../../../fc/pf/05 eq complete
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task derived_param
+              endfamily
+              family 06
+                trigger ../../../fc/pf/06 eq complete
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task derived_param
+              endfamily
+              family 07
+                trigger ../../../fc/pf/07 eq complete
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task derived_param
+              endfamily
+              family 08
+                trigger ../../../fc/pf/08 eq complete
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task derived_param
+              endfamily
+              family 09
+                trigger ../../../fc/pf/09 eq complete
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task derived_param
+              endfamily
+              family 10
+                trigger ../../../fc/pf/10 eq complete
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task derived_param
+              endfamily
+              family 11
+                trigger ../../../fc/pf/11 eq complete
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task derived_param
+              endfamily
+              family 12
+                trigger ../../../fc/pf/12 eq complete
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task derived_param
+              endfamily
+              family 13
+                trigger ../../../fc/pf/13 eq complete
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task derived_param
+              endfamily
+              family 14
+                trigger ../../../fc/pf/14 eq complete
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task derived_param
+              endfamily
+              family 15
+                trigger ../../../fc/pf/15 eq complete
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task derived_param
+              endfamily
+              family 16
+                trigger ../../../fc/pf/16 eq complete
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task derived_param
+              endfamily
+              family 17
+                trigger ../../../fc/pf/17 eq complete
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task derived_param
+              endfamily
+              family 18
+                trigger ../../../fc/pf/18 eq complete
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task derived_param
+              endfamily
+              family 19
+                trigger ../../../fc/pf/19 eq complete
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task derived_param
+              endfamily
+              family 20
+                trigger ../../../fc/pf/20 eq complete
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task derived_param
+              endfamily
+              family 21
+                trigger ../../../fc/pf/21 eq complete
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task derived_param
+              endfamily
+              family 22
+                trigger ../../../fc/pf/22 eq complete
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task derived_param
+              endfamily
+              family 23
+                trigger ../../../fc/pf/23 eq complete
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task derived_param
+              endfamily
+              family 24
+                trigger ../../../fc/pf/24 eq complete
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task derived_param
+              endfamily
+              family 25
+                trigger ../../../fc/pf/25 eq complete
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task derived_param
+              endfamily
+              family 26
+                trigger ../../../fc/pf/26 eq complete
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task derived_param
+              endfamily
+              family 27
+                trigger ../../../fc/pf/27 eq complete
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task derived_param
+              endfamily
+              family 28
+                trigger ../../../fc/pf/28 eq complete
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task derived_param
+              endfamily
+              family 29
+                trigger ../../../fc/pf/29 eq complete
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task derived_param
+              endfamily
+              family 30
+                trigger ../../../fc/pf/30 eq complete
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task derived_param
+              endfamily
+              family 31
+                trigger ../../../fc/pf/31 eq complete
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task derived_param
+              endfamily
+              family 32
+                trigger ../../../fc/pf/32 eq complete
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task derived_param
+              endfamily
+              family 33
+                trigger ../../../fc/pf/33 eq complete
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task derived_param
+              endfamily
+              family 34
+                trigger ../../../fc/pf/34 eq complete
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task derived_param
+              endfamily
+              family 35
+                trigger ../../../fc/pf/35 eq complete
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task derived_param
+              endfamily
+              family 36
+                trigger ../../../fc/pf/36 eq complete
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task derived_param
+              endfamily
+              family 37
+                trigger ../../../fc/pf/37 eq complete
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task derived_param
+              endfamily
+              family 38
+                trigger ../../../fc/pf/38 eq complete
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task derived_param
+              endfamily
+              family 39
+                trigger ../../../fc/pf/39 eq complete
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task derived_param
+              endfamily
+              family 40
+                trigger ../../../fc/pf/40 eq complete
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task derived_param
+              endfamily
+              family 41
+                trigger ../../../fc/pf/41 eq complete
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task derived_param
+              endfamily
+              family 42
+                trigger ../../../fc/pf/42 eq complete
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task derived_param
+              endfamily
+              family 43
+                trigger ../../../fc/pf/43 eq complete
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task derived_param
+              endfamily
+              family 44
+                trigger ../../../fc/pf/44 eq complete
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task derived_param
+              endfamily
+              family 45
+                trigger ../../../fc/pf/45 eq complete
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task derived_param
+              endfamily
+              family 46
+                trigger ../../../fc/pf/46 eq complete
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task derived_param
+              endfamily
+              family 47
+                trigger ../../../fc/pf/47 eq complete
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task derived_param
+              endfamily
+              family 48
+                trigger ../../../fc/pf/48 eq complete
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task derived_param
+              endfamily
+              family 49
+                trigger ../../../fc/pf/49 eq complete
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task derived_param
+              endfamily
+              family 50
+                trigger ../../../fc/pf/50 eq complete
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task derived_param
+              endfamily
+            endfamily
+          endfamily
+          family extra
+            trigger ./dp eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '0:144:3 144:240:6'
+            inlimit /emc_36r1/limits:extra
+            family cf
+              edit EMOS_TYPE 'cf'
+              task extrafields
+                edit EPSFCRES '639'
+                edit FCLENGTH '240'
+                edit FCLENGTH0 '0'
+                edit RUNVARFC '1'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/00/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 05
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 06
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 07
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 08
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 09
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 10
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 11
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 12
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 13
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 14
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 15
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 16
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 17
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 18
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 19
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 20
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 21
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 22
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 23
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 24
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 25
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 26
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 27
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 28
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 29
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 30
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 31
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 32
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 33
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 34
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 35
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 36
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 37
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 38
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 39
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 40
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 41
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 42
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 43
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 44
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 45
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 46
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 47
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 48
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 49
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family 50
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family prod
+          edit MEM '3000'
+          edit ACCOUNT 'oeenfopg'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'cp'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '90'
+          edit SMSURLBASE 'http://intra.ecmwf.int/plots/d/intra/'
+          edit SMSURL 'sub=fixed/'
+          inlimit /limits:prod
+          family eps
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            inlimit /emc_36r1/limits:prodeps
+            family 0000
+              edit EMOS_TIME_STEP_H '0000'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0003
+              edit EMOS_TIME_STEP_H '0003'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0006
+              edit EMOS_TIME_STEP_H '0006'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0009
+              edit EMOS_TIME_STEP_H '0009'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0012
+              edit EMOS_TIME_STEP_H '0012'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0015
+              edit EMOS_TIME_STEP_H '0015'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0018
+              edit EMOS_TIME_STEP_H '0018'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0021
+              edit EMOS_TIME_STEP_H '0021'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0024
+              edit EMOS_TIME_STEP_H '0024'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0027
+              edit EMOS_TIME_STEP_H '0027'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0030
+              edit EMOS_TIME_STEP_H '0030'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0033
+              edit EMOS_TIME_STEP_H '0033'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0036
+              edit EMOS_TIME_STEP_H '0036'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0039
+              edit EMOS_TIME_STEP_H '0039'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0042
+              edit EMOS_TIME_STEP_H '0042'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0045
+              edit EMOS_TIME_STEP_H '0045'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0048
+              edit EMOS_TIME_STEP_H '0048'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0051
+              edit EMOS_TIME_STEP_H '0051'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0054
+              edit EMOS_TIME_STEP_H '0054'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0057
+              edit EMOS_TIME_STEP_H '0057'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0060
+              edit EMOS_TIME_STEP_H '0060'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0063
+              edit EMOS_TIME_STEP_H '0063'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0066
+              edit EMOS_TIME_STEP_H '0066'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0069
+              edit EMOS_TIME_STEP_H '0069'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0072
+              edit EMOS_TIME_STEP_H '0072'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0075
+              edit EMOS_TIME_STEP_H '0075'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0078
+              edit EMOS_TIME_STEP_H '0078'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0081
+              edit EMOS_TIME_STEP_H '0081'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0084
+              edit EMOS_TIME_STEP_H '0084'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0087
+              edit EMOS_TIME_STEP_H '0087'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0090
+              edit EMOS_TIME_STEP_H '0090'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0093
+              edit EMOS_TIME_STEP_H '0093'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0096
+              edit EMOS_TIME_STEP_H '0096'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0099
+              edit EMOS_TIME_STEP_H '0099'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0102
+              edit EMOS_TIME_STEP_H '0102'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0105
+              edit EMOS_TIME_STEP_H '0105'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0108
+              edit EMOS_TIME_STEP_H '0108'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0111
+              edit EMOS_TIME_STEP_H '0111'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0114
+              edit EMOS_TIME_STEP_H '0114'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0117
+              edit EMOS_TIME_STEP_H '0117'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0120
+              edit EMOS_TIME_STEP_H '0120'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0123
+              edit EMOS_TIME_STEP_H '0123'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0126
+              edit EMOS_TIME_STEP_H '0126'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0129
+              edit EMOS_TIME_STEP_H '0129'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0132
+              edit EMOS_TIME_STEP_H '0132'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0135
+              edit EMOS_TIME_STEP_H '0135'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0138
+              edit EMOS_TIME_STEP_H '0138'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0141
+              edit EMOS_TIME_STEP_H '0141'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0144
+              edit EMOS_TIME_STEP_H '0144'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0150
+              edit EMOS_TIME_STEP_H '0150'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0156
+              edit EMOS_TIME_STEP_H '0156'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0162
+              edit EMOS_TIME_STEP_H '0162'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0168
+              edit EMOS_TIME_STEP_H '0168'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0174
+              edit EMOS_TIME_STEP_H '0174'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0180
+              edit EMOS_TIME_STEP_H '0180'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0186
+              edit EMOS_TIME_STEP_H '0186'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0192
+              edit EMOS_TIME_STEP_H '0192'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0198
+              edit EMOS_TIME_STEP_H '0198'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0204
+              edit EMOS_TIME_STEP_H '0204'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0210
+              edit EMOS_TIME_STEP_H '0210'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0216
+              edit EMOS_TIME_STEP_H '0216'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0222
+              edit EMOS_TIME_STEP_H '0222'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0228
+              edit EMOS_TIME_STEP_H '0228'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0234
+              edit EMOS_TIME_STEP_H '0234'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0240
+              edit EMOS_TIME_STEP_H '0240'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+          endfamily
+          family wave
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            edit PGNPES '2'
+            edit URL 'GWAEF/00'
+            inlimit /emc_36r1/limits:prodwave
+            family 0000
+              edit EMOS_TIME_STEP_H '0000'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0003
+              edit EMOS_TIME_STEP_H '0003'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0006
+              edit EMOS_TIME_STEP_H '0006'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0009
+              edit EMOS_TIME_STEP_H '0009'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0012
+              edit EMOS_TIME_STEP_H '0012'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0015
+              edit EMOS_TIME_STEP_H '0015'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0018
+              edit EMOS_TIME_STEP_H '0018'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0021
+              edit EMOS_TIME_STEP_H '0021'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0024
+              edit EMOS_TIME_STEP_H '0024'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0027
+              edit EMOS_TIME_STEP_H '0027'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0030
+              edit EMOS_TIME_STEP_H '0030'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0033
+              edit EMOS_TIME_STEP_H '0033'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0036
+              edit EMOS_TIME_STEP_H '0036'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0039
+              edit EMOS_TIME_STEP_H '0039'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0042
+              edit EMOS_TIME_STEP_H '0042'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0045
+              edit EMOS_TIME_STEP_H '0045'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0048
+              edit EMOS_TIME_STEP_H '0048'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0051
+              edit EMOS_TIME_STEP_H '0051'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0054
+              edit EMOS_TIME_STEP_H '0054'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0057
+              edit EMOS_TIME_STEP_H '0057'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0060
+              edit EMOS_TIME_STEP_H '0060'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0063
+              edit EMOS_TIME_STEP_H '0063'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0066
+              edit EMOS_TIME_STEP_H '0066'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0069
+              edit EMOS_TIME_STEP_H '0069'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0072
+              edit EMOS_TIME_STEP_H '0072'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0075
+              edit EMOS_TIME_STEP_H '0075'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0078
+              edit EMOS_TIME_STEP_H '0078'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0081
+              edit EMOS_TIME_STEP_H '0081'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0084
+              edit EMOS_TIME_STEP_H '0084'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0087
+              edit EMOS_TIME_STEP_H '0087'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0090
+              edit EMOS_TIME_STEP_H '0090'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0093
+              edit EMOS_TIME_STEP_H '0093'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0096
+              edit EMOS_TIME_STEP_H '0096'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0099
+              edit EMOS_TIME_STEP_H '0099'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0102
+              edit EMOS_TIME_STEP_H '0102'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0105
+              edit EMOS_TIME_STEP_H '0105'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0108
+              edit EMOS_TIME_STEP_H '0108'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0111
+              edit EMOS_TIME_STEP_H '0111'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0114
+              edit EMOS_TIME_STEP_H '0114'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0117
+              edit EMOS_TIME_STEP_H '0117'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0120
+              edit EMOS_TIME_STEP_H '0120'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0123
+              edit EMOS_TIME_STEP_H '0123'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0126
+              edit EMOS_TIME_STEP_H '0126'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0129
+              edit EMOS_TIME_STEP_H '0129'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0132
+              edit EMOS_TIME_STEP_H '0132'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0135
+              edit EMOS_TIME_STEP_H '0135'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0138
+              edit EMOS_TIME_STEP_H '0138'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0141
+              edit EMOS_TIME_STEP_H '0141'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0144
+              edit EMOS_TIME_STEP_H '0144'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0150
+              edit EMOS_TIME_STEP_H '0150'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0156
+              edit EMOS_TIME_STEP_H '0156'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0162
+              edit EMOS_TIME_STEP_H '0162'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0168
+              edit EMOS_TIME_STEP_H '0168'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0174
+              edit EMOS_TIME_STEP_H '0174'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0180
+              edit EMOS_TIME_STEP_H '0180'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0186
+              edit EMOS_TIME_STEP_H '0186'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0192
+              edit EMOS_TIME_STEP_H '0192'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0198
+              edit EMOS_TIME_STEP_H '0198'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0204
+              edit EMOS_TIME_STEP_H '0204'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0210
+              edit EMOS_TIME_STEP_H '0210'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0216
+              edit EMOS_TIME_STEP_H '0216'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0222
+              edit EMOS_TIME_STEP_H '0222'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0228
+              edit EMOS_TIME_STEP_H '0228'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0234
+              edit EMOS_TIME_STEP_H '0234'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0240
+              edit EMOS_TIME_STEP_H '0240'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+          endfamily
+          family getreq
+            trigger ../fc/pf eq active or ../fc/pf/01 eq complete
+            edit EMOS_TYPE 'cm'
+            edit EMOS_DOMAIN 'G'
+            edit EMOS_PROJECT '12'
+            edit PROD_TASK '1'
+            edit SMSTRIES '1'
+            edit EMOS_STREAM 'ENFO'
+            task collectreq
+              edit QUEUE 'diss'
+              edit USER 'emos'
+              edit WSHOST 'diss'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit LOGDIR '/diss/log'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit EMOS_BASE '00'
+            task eps
+              late -s +00:03 -c +00:10
+              trigger collectreq eq complete
+              label info ""
+              event 1 
+            task collectwave
+              trigger collectreq eq complete
+              edit QUEUE 'diss'
+              edit USER 'emos'
+              edit WSHOST 'diss'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit LOGDIR '/diss/log'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit EMOS_STREAM 'WAEF'
+              edit EMOS_BASE '00'
+            task wave_eps
+              late -s +00:03 -c +00:10
+              trigger collectwave eq complete
+              edit EMOS_STREAM 'WAEF'
+              edit USER_PRIORITY '89'
+              label info ""
+              event 1 
+            task collectbitmap
+              trigger collectwave eq complete
+              edit QUEUE 'diss'
+              edit USER 'emos'
+              edit WSHOST 'diss'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit LOGDIR '/diss/log'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit SMSOUT '/vol/emos_nc/output'
+            task bitmap
+              late -s +00:03 -c +00:10
+              trigger collectbitmap eq complete and ( eps:001 or eps eq complete)
+              event 1 
+          endfamily
+          task enfo_tc
+            late -s +00:05 -c +00:15
+            trigger ( ./getreq/eps:001 or ./getreq/eps eq complete) and ../postproc/tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TYPE 'tf'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '1'
+          task oper_tc
+            late -s +00:05 -c +00:15
+            trigger ./enfo_tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TYPE 'tf'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '1'
+            edit EMOS_STREAM 'OPER'
+          task prod_wparam
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ../postproc/dp eq complete and /e_36r1/main/00/prod/240/prod_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TYPE 'wp'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '52'
+          task enfo_postproc
+            late -s +00:05 -c +00:15
+            trigger ../postproc eq complete and ( ../../legA/prod/getreq/eps eq complete) and ../../legA/postproc/efi eq complete and ../../legA/postproc/clusters eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'ep'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '21'
+          task waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ../postproc/prob eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TIME_STEP_H '0240'
+            edit PGNPES '1'
+        endfamily
+        family prod2diss
+          edit USER_PRIORITY '90'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'ef'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+          edit SMSURL 'GENFO/00'
+          task operation_is_late
+            event yes
+          family eps
+            family 0000
+              edit EMOS_TIME_STEP_H '0000'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0000/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0003
+              edit EMOS_TIME_STEP_H '0003'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0003/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0000/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0006
+              edit EMOS_TIME_STEP_H '0006'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0006/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0003/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0009
+              edit EMOS_TIME_STEP_H '0009'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0009/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0006/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0012
+              edit EMOS_TIME_STEP_H '0012'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0012/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0009/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0015
+              edit EMOS_TIME_STEP_H '0015'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0015/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0012/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0018
+              edit EMOS_TIME_STEP_H '0018'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0018/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0015/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0021
+              edit EMOS_TIME_STEP_H '0021'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0021/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0018/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0024
+              edit EMOS_TIME_STEP_H '0024'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0024/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0021/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0027
+              edit EMOS_TIME_STEP_H '0027'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0027/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0024/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0030
+              edit EMOS_TIME_STEP_H '0030'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0030/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0027/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0033
+              edit EMOS_TIME_STEP_H '0033'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0033/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0030/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0036
+              edit EMOS_TIME_STEP_H '0036'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0036/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0033/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0039
+              edit EMOS_TIME_STEP_H '0039'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0039/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0036/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0042
+              edit EMOS_TIME_STEP_H '0042'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0042/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0039/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0045
+              edit EMOS_TIME_STEP_H '0045'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0045/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0042/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0048
+              edit EMOS_TIME_STEP_H '0048'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0048/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0045/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0051
+              edit EMOS_TIME_STEP_H '0051'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0051/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0048/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0054
+              edit EMOS_TIME_STEP_H '0054'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0054/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0051/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0057
+              edit EMOS_TIME_STEP_H '0057'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0057/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0054/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0060
+              edit EMOS_TIME_STEP_H '0060'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0060/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0057/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0063
+              edit EMOS_TIME_STEP_H '0063'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0063/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0060/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0066
+              edit EMOS_TIME_STEP_H '0066'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0066/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0063/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0069
+              edit EMOS_TIME_STEP_H '0069'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0069/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0066/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0072
+              edit EMOS_TIME_STEP_H '0072'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0072/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0069/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0075
+              edit EMOS_TIME_STEP_H '0075'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0075/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0072/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0078
+              edit EMOS_TIME_STEP_H '0078'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0078/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0075/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0081
+              edit EMOS_TIME_STEP_H '0081'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0081/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0078/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0084
+              edit EMOS_TIME_STEP_H '0084'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0084/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0081/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0087
+              edit EMOS_TIME_STEP_H '0087'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0087/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0084/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0090
+              edit EMOS_TIME_STEP_H '0090'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0090/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0087/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0093
+              edit EMOS_TIME_STEP_H '0093'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0093/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0090/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0096
+              edit EMOS_TIME_STEP_H '0096'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0096/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0093/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0099
+              edit EMOS_TIME_STEP_H '0099'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0099/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0096/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0102
+              edit EMOS_TIME_STEP_H '0102'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0102/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0099/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0105
+              edit EMOS_TIME_STEP_H '0105'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0105/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0102/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0108
+              edit EMOS_TIME_STEP_H '0108'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0108/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0105/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0111
+              edit EMOS_TIME_STEP_H '0111'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0111/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0108/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0114
+              edit EMOS_TIME_STEP_H '0114'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0114/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0111/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0117
+              edit EMOS_TIME_STEP_H '0117'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0117/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0114/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0120
+              edit EMOS_TIME_STEP_H '0120'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0120/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0117/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0123
+              edit EMOS_TIME_STEP_H '0123'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0123/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0120/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0126
+              edit EMOS_TIME_STEP_H '0126'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0126/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0123/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0129
+              edit EMOS_TIME_STEP_H '0129'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0129/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0126/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0132
+              edit EMOS_TIME_STEP_H '0132'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0132/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0129/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0135
+              edit EMOS_TIME_STEP_H '0135'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0135/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0132/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0138
+              edit EMOS_TIME_STEP_H '0138'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0138/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0135/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0141
+              edit EMOS_TIME_STEP_H '0141'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0141/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0138/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0144
+              edit EMOS_TIME_STEP_H '0144'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0144/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0141/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0150
+              edit EMOS_TIME_STEP_H '0150'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0150/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0144/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0156
+              edit EMOS_TIME_STEP_H '0156'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0156/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0150/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0162
+              edit EMOS_TIME_STEP_H '0162'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0162/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0156/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0168
+              edit EMOS_TIME_STEP_H '0168'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0168/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0162/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0174
+              edit EMOS_TIME_STEP_H '0174'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0174/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0168/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0180
+              edit EMOS_TIME_STEP_H '0180'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0180/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0174/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0186
+              edit EMOS_TIME_STEP_H '0186'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0186/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0180/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0192
+              edit EMOS_TIME_STEP_H '0192'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0192/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0186/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0198
+              edit EMOS_TIME_STEP_H '0198'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0198/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0192/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0204
+              edit EMOS_TIME_STEP_H '0204'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0204/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0198/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0210
+              edit EMOS_TIME_STEP_H '0210'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0210/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0204/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0216
+              edit EMOS_TIME_STEP_H '0216'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0216/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0210/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0222
+              edit EMOS_TIME_STEP_H '0222'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0222/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0216/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0228
+              edit EMOS_TIME_STEP_H '0228'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0228/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0222/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0234
+              edit EMOS_TIME_STEP_H '0234'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0234/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0228/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0240
+              edit EMOS_TIME_STEP_H '0240'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0240/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0234/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            task check
+              trigger ./0240 eq complete
+          endfamily
+          family wave
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TYPE 'we'
+            edit SMSURL 'GWAEF/00'
+            family 0000
+              trigger ../../prod/wave/0000/prodwave eq complete
+              edit EMOS_TIME_STEP_H '0000'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0003
+              trigger ../../prod/wave/0003/prodwave eq complete and ( ./0000 eq complete)
+              edit EMOS_TIME_STEP_H '0003'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0006
+              trigger ../../prod/wave/0006/prodwave eq complete and ( ./0003 eq complete)
+              edit EMOS_TIME_STEP_H '0006'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0009
+              trigger ../../prod/wave/0009/prodwave eq complete and ( ./0006 eq complete)
+              edit EMOS_TIME_STEP_H '0009'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0012
+              trigger ../../prod/wave/0012/prodwave eq complete and ( ./0009 eq complete)
+              edit EMOS_TIME_STEP_H '0012'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0015
+              trigger ../../prod/wave/0015/prodwave eq complete and ( ./0012 eq complete)
+              edit EMOS_TIME_STEP_H '0015'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0018
+              trigger ../../prod/wave/0018/prodwave eq complete and ( ./0015 eq complete)
+              edit EMOS_TIME_STEP_H '0018'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0021
+              trigger ../../prod/wave/0021/prodwave eq complete and ( ./0018 eq complete)
+              edit EMOS_TIME_STEP_H '0021'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0024
+              trigger ../../prod/wave/0024/prodwave eq complete and ( ./0021 eq complete)
+              edit EMOS_TIME_STEP_H '0024'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0027
+              trigger ../../prod/wave/0027/prodwave eq complete and ( ./0024 eq complete)
+              edit EMOS_TIME_STEP_H '0027'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0030
+              trigger ../../prod/wave/0030/prodwave eq complete and ( ./0027 eq complete)
+              edit EMOS_TIME_STEP_H '0030'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0033
+              trigger ../../prod/wave/0033/prodwave eq complete and ( ./0030 eq complete)
+              edit EMOS_TIME_STEP_H '0033'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0036
+              trigger ../../prod/wave/0036/prodwave eq complete and ( ./0033 eq complete)
+              edit EMOS_TIME_STEP_H '0036'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0039
+              trigger ../../prod/wave/0039/prodwave eq complete and ( ./0036 eq complete)
+              edit EMOS_TIME_STEP_H '0039'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0042
+              trigger ../../prod/wave/0042/prodwave eq complete and ( ./0039 eq complete)
+              edit EMOS_TIME_STEP_H '0042'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0045
+              trigger ../../prod/wave/0045/prodwave eq complete and ( ./0042 eq complete)
+              edit EMOS_TIME_STEP_H '0045'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0048
+              trigger ../../prod/wave/0048/prodwave eq complete and ( ./0045 eq complete)
+              edit EMOS_TIME_STEP_H '0048'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0051
+              trigger ../../prod/wave/0051/prodwave eq complete and ( ./0048 eq complete)
+              edit EMOS_TIME_STEP_H '0051'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0054
+              trigger ../../prod/wave/0054/prodwave eq complete and ( ./0051 eq complete)
+              edit EMOS_TIME_STEP_H '0054'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0057
+              trigger ../../prod/wave/0057/prodwave eq complete and ( ./0054 eq complete)
+              edit EMOS_TIME_STEP_H '0057'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0060
+              trigger ../../prod/wave/0060/prodwave eq complete and ( ./0057 eq complete)
+              edit EMOS_TIME_STEP_H '0060'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0063
+              trigger ../../prod/wave/0063/prodwave eq complete and ( ./0060 eq complete)
+              edit EMOS_TIME_STEP_H '0063'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0066
+              trigger ../../prod/wave/0066/prodwave eq complete and ( ./0063 eq complete)
+              edit EMOS_TIME_STEP_H '0066'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0069
+              trigger ../../prod/wave/0069/prodwave eq complete and ( ./0066 eq complete)
+              edit EMOS_TIME_STEP_H '0069'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0072
+              trigger ../../prod/wave/0072/prodwave eq complete and ( ./0069 eq complete)
+              edit EMOS_TIME_STEP_H '0072'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0075
+              trigger ../../prod/wave/0075/prodwave eq complete and ( ./0072 eq complete)
+              edit EMOS_TIME_STEP_H '0075'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0078
+              trigger ../../prod/wave/0078/prodwave eq complete and ( ./0075 eq complete)
+              edit EMOS_TIME_STEP_H '0078'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0081
+              trigger ../../prod/wave/0081/prodwave eq complete and ( ./0078 eq complete)
+              edit EMOS_TIME_STEP_H '0081'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0084
+              trigger ../../prod/wave/0084/prodwave eq complete and ( ./0081 eq complete)
+              edit EMOS_TIME_STEP_H '0084'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0087
+              trigger ../../prod/wave/0087/prodwave eq complete and ( ./0084 eq complete)
+              edit EMOS_TIME_STEP_H '0087'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0090
+              trigger ../../prod/wave/0090/prodwave eq complete and ( ./0087 eq complete)
+              edit EMOS_TIME_STEP_H '0090'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0093
+              trigger ../../prod/wave/0093/prodwave eq complete and ( ./0090 eq complete)
+              edit EMOS_TIME_STEP_H '0093'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0096
+              trigger ../../prod/wave/0096/prodwave eq complete and ( ./0093 eq complete)
+              edit EMOS_TIME_STEP_H '0096'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0099
+              trigger ../../prod/wave/0099/prodwave eq complete and ( ./0096 eq complete)
+              edit EMOS_TIME_STEP_H '0099'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0102
+              trigger ../../prod/wave/0102/prodwave eq complete and ( ./0099 eq complete)
+              edit EMOS_TIME_STEP_H '0102'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0105
+              trigger ../../prod/wave/0105/prodwave eq complete and ( ./0102 eq complete)
+              edit EMOS_TIME_STEP_H '0105'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0108
+              trigger ../../prod/wave/0108/prodwave eq complete and ( ./0105 eq complete)
+              edit EMOS_TIME_STEP_H '0108'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0111
+              trigger ../../prod/wave/0111/prodwave eq complete and ( ./0108 eq complete)
+              edit EMOS_TIME_STEP_H '0111'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0114
+              trigger ../../prod/wave/0114/prodwave eq complete and ( ./0111 eq complete)
+              edit EMOS_TIME_STEP_H '0114'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0117
+              trigger ../../prod/wave/0117/prodwave eq complete and ( ./0114 eq complete)
+              edit EMOS_TIME_STEP_H '0117'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0120
+              trigger ../../prod/wave/0120/prodwave eq complete and ( ./0117 eq complete)
+              edit EMOS_TIME_STEP_H '0120'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0123
+              trigger ../../prod/wave/0123/prodwave eq complete and ( ./0120 eq complete)
+              edit EMOS_TIME_STEP_H '0123'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0126
+              trigger ../../prod/wave/0126/prodwave eq complete and ( ./0123 eq complete)
+              edit EMOS_TIME_STEP_H '0126'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0129
+              trigger ../../prod/wave/0129/prodwave eq complete and ( ./0126 eq complete)
+              edit EMOS_TIME_STEP_H '0129'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0132
+              trigger ../../prod/wave/0132/prodwave eq complete and ( ./0129 eq complete)
+              edit EMOS_TIME_STEP_H '0132'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0135
+              trigger ../../prod/wave/0135/prodwave eq complete and ( ./0132 eq complete)
+              edit EMOS_TIME_STEP_H '0135'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0138
+              trigger ../../prod/wave/0138/prodwave eq complete and ( ./0135 eq complete)
+              edit EMOS_TIME_STEP_H '0138'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0141
+              trigger ../../prod/wave/0141/prodwave eq complete and ( ./0138 eq complete)
+              edit EMOS_TIME_STEP_H '0141'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0144
+              trigger ../../prod/wave/0144/prodwave eq complete and ( ./0141 eq complete)
+              edit EMOS_TIME_STEP_H '0144'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0150
+              trigger ../../prod/wave/0150/prodwave eq complete and ( ./0144 eq complete)
+              edit EMOS_TIME_STEP_H '0150'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0156
+              trigger ../../prod/wave/0156/prodwave eq complete and ( ./0150 eq complete)
+              edit EMOS_TIME_STEP_H '0156'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0162
+              trigger ../../prod/wave/0162/prodwave eq complete and ( ./0156 eq complete)
+              edit EMOS_TIME_STEP_H '0162'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0168
+              trigger ../../prod/wave/0168/prodwave eq complete and ( ./0162 eq complete)
+              edit EMOS_TIME_STEP_H '0168'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0174
+              trigger ../../prod/wave/0174/prodwave eq complete and ( ./0168 eq complete)
+              edit EMOS_TIME_STEP_H '0174'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0180
+              trigger ../../prod/wave/0180/prodwave eq complete and ( ./0174 eq complete)
+              edit EMOS_TIME_STEP_H '0180'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0186
+              trigger ../../prod/wave/0186/prodwave eq complete and ( ./0180 eq complete)
+              edit EMOS_TIME_STEP_H '0186'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0192
+              trigger ../../prod/wave/0192/prodwave eq complete and ( ./0186 eq complete)
+              edit EMOS_TIME_STEP_H '0192'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0198
+              trigger ../../prod/wave/0198/prodwave eq complete and ( ./0192 eq complete)
+              edit EMOS_TIME_STEP_H '0198'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0204
+              trigger ../../prod/wave/0204/prodwave eq complete and ( ./0198 eq complete)
+              edit EMOS_TIME_STEP_H '0204'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0210
+              trigger ../../prod/wave/0210/prodwave eq complete and ( ./0204 eq complete)
+              edit EMOS_TIME_STEP_H '0210'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0216
+              trigger ../../prod/wave/0216/prodwave eq complete and ( ./0210 eq complete)
+              edit EMOS_TIME_STEP_H '0216'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0222
+              trigger ../../prod/wave/0222/prodwave eq complete and ( ./0216 eq complete)
+              edit EMOS_TIME_STEP_H '0222'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0228
+              trigger ../../prod/wave/0228/prodwave eq complete and ( ./0222 eq complete)
+              edit EMOS_TIME_STEP_H '0228'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0234
+              trigger ../../prod/wave/0234/prodwave eq complete and ( ./0228 eq complete)
+              edit EMOS_TIME_STEP_H '0234'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0240
+              trigger ../../prod/wave/0240/prodwave eq complete and ( ./0234 eq complete)
+              edit EMOS_TIME_STEP_H '0240'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            task check
+              trigger ./0240 eq complete
+          endfamily
+          task diss_wparam
+            late -s +00:05 -c +00:15
+            trigger ../prod/prod_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'wp'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/waef_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/enfo_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'ep'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_enfotc
+            late -s +00:05 -c +00:15
+            trigger ../prod/enfo_tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'tf'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_opertc
+            late -s +00:05 -c +00:15
+            trigger ../prod/oper_tc eq complete
+            edit PROD_TASK 't'
+            edit EMOS_TIME_STEP_H '0240'
+            edit EMOS_TYPE 'tf'
+            edit EMOS_STREAM 'DA'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+        endfamily
+      endfamily
+      family legB
+        complete /emc_36r1/main/ref/00/events:240
+        edit EPSLEG '2'
+        family fc
+          complete /emc_36r1/main/ref/00/events:cpl and /emc_36r1/main/00/legBcpl/fc eq complete
+          trigger /emc_36r1/main/ref/00/events eq complete and not /emc_36r1/main/ref/00/events:cpl
+          edit FCMEM '2240'
+          edit FCSTACK '700'
+          edit FCMRFS '0'
+          edit PRIORITY '71'
+          edit USER_PRIORITY '71'
+          edit N_PERT_AN '10'
+          edit SSTLEN '144'
+          edit EPSINISTEP_PREVIOUS '216'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          edit TSTEP '2700'
+          edit EPSFCRES '639'
+          edit RESOL '639'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit CPUTIME '1000'
+          edit MEM '960'
+          edit THREADS '8'
+          edit NPES '8'
+          edit EPSLEG '2'
+          edit PERSST 'true'
+          edit SSTINT '1'
+          task wavfcdata
+            trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+            edit EPSCOUPLE '1'
+          task getpersSST
+            trigger ../../legA/fc/inidata eq complete and ../../legA/fc/getpersSST eq complete
+            edit EPSCOUPLE '1'
+            edit EPS_INI_STREAM 'DA'
+            edit EPSFCRES '319'
+            edit RESOL '319'
+          family pf
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger ./getpersSST eq complete and ./wavfcdata eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTYPE 'pf'
+            edit EMOS_TYPE 'pf'
+            edit USER_PRIORITY '71'
+            edit PRIORITY '71'
+            edit FCNPES '32'
+            edit FCCHUNK '1'
+            edit OCTOTAL '5'
+            edit FCTOTAL '51'
+            edit FCLENGTH1 '216'
+            edit DAILY '0'
+            edit RUNVARFC '1'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSFCRES '319'
+            edit EPSWAMRESOL 'global50'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit EPSINISTEP '360'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '2'
+            edit CLASS 'od'
+            edit THREADS '2'
+            inlimit /emc_36r1/limits:pftotal
+            meter step -1 144 144
+            family 01
+              trigger ../../../legA/fc/pf/01 eq complete
+              edit EPSMEMBER '1'
+              edit MEMBER '1'
+              edit SUBFSFAMILY '/pf001'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 02
+              trigger ../../../legA/fc/pf/02 eq complete
+              edit EPSMEMBER '2'
+              edit MEMBER '2'
+              edit SUBFSFAMILY '/pf002'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 03
+              trigger ../../../legA/fc/pf/03 eq complete
+              edit EPSMEMBER '3'
+              edit MEMBER '3'
+              edit SUBFSFAMILY '/pf003'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 04
+              trigger ../../../legA/fc/pf/04 eq complete
+              edit EPSMEMBER '4'
+              edit MEMBER '4'
+              edit SUBFSFAMILY '/pf004'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 05
+              trigger ../../../legA/fc/pf/05 eq complete
+              edit EPSMEMBER '5'
+              edit MEMBER '5'
+              edit SUBFSFAMILY '/pf005'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 06
+              trigger ../../../legA/fc/pf/06 eq complete
+              edit EPSMEMBER '6'
+              edit MEMBER '6'
+              edit SUBFSFAMILY '/pf006'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 07
+              trigger ../../../legA/fc/pf/07 eq complete
+              edit EPSMEMBER '7'
+              edit MEMBER '7'
+              edit SUBFSFAMILY '/pf007'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 08
+              trigger ../../../legA/fc/pf/08 eq complete
+              edit EPSMEMBER '8'
+              edit MEMBER '8'
+              edit SUBFSFAMILY '/pf008'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 09
+              trigger ../../../legA/fc/pf/09 eq complete
+              edit EPSMEMBER '9'
+              edit MEMBER '9'
+              edit SUBFSFAMILY '/pf009'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 10
+              trigger ../../../legA/fc/pf/10 eq complete
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              edit SUBFSFAMILY '/pf010'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 11
+              trigger ../../../legA/fc/pf/11 eq complete
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              edit SUBFSFAMILY '/pf011'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 12
+              trigger ../../../legA/fc/pf/12 eq complete
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              edit SUBFSFAMILY '/pf012'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 13
+              trigger ../../../legA/fc/pf/13 eq complete
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              edit SUBFSFAMILY '/pf013'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 14
+              trigger ../../../legA/fc/pf/14 eq complete
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              edit SUBFSFAMILY '/pf014'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 15
+              trigger ../../../legA/fc/pf/15 eq complete
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              edit SUBFSFAMILY '/pf015'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 16
+              trigger ../../../legA/fc/pf/16 eq complete
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              edit SUBFSFAMILY '/pf016'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 17
+              trigger ../../../legA/fc/pf/17 eq complete
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              edit SUBFSFAMILY '/pf017'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 18
+              trigger ../../../legA/fc/pf/18 eq complete
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              edit SUBFSFAMILY '/pf018'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 19
+              trigger ../../../legA/fc/pf/19 eq complete
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              edit SUBFSFAMILY '/pf019'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 20
+              trigger ../../../legA/fc/pf/20 eq complete
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              edit SUBFSFAMILY '/pf020'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 21
+              trigger ../../../legA/fc/pf/21 eq complete
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              edit SUBFSFAMILY '/pf021'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 22
+              trigger ../../../legA/fc/pf/22 eq complete
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              edit SUBFSFAMILY '/pf022'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 23
+              trigger ../../../legA/fc/pf/23 eq complete
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              edit SUBFSFAMILY '/pf023'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 24
+              trigger ../../../legA/fc/pf/24 eq complete
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              edit SUBFSFAMILY '/pf024'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 25
+              trigger ../../../legA/fc/pf/25 eq complete
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              edit SUBFSFAMILY '/pf025'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 26
+              trigger ../../../legA/fc/pf/26 eq complete
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              edit SUBFSFAMILY '/pf026'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 27
+              trigger ../../../legA/fc/pf/27 eq complete
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              edit SUBFSFAMILY '/pf027'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 28
+              trigger ../../../legA/fc/pf/28 eq complete
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              edit SUBFSFAMILY '/pf028'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 29
+              trigger ../../../legA/fc/pf/29 eq complete
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              edit SUBFSFAMILY '/pf029'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 30
+              trigger ../../../legA/fc/pf/30 eq complete
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              edit SUBFSFAMILY '/pf030'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 31
+              trigger ../../../legA/fc/pf/31 eq complete
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              edit SUBFSFAMILY '/pf031'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 32
+              trigger ../../../legA/fc/pf/32 eq complete
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              edit SUBFSFAMILY '/pf032'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 33
+              trigger ../../../legA/fc/pf/33 eq complete
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              edit SUBFSFAMILY '/pf033'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 34
+              trigger ../../../legA/fc/pf/34 eq complete
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              edit SUBFSFAMILY '/pf034'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 35
+              trigger ../../../legA/fc/pf/35 eq complete
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              edit SUBFSFAMILY '/pf035'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 36
+              trigger ../../../legA/fc/pf/36 eq complete
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              edit SUBFSFAMILY '/pf036'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 37
+              trigger ../../../legA/fc/pf/37 eq complete
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              edit SUBFSFAMILY '/pf037'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 38
+              trigger ../../../legA/fc/pf/38 eq complete
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              edit SUBFSFAMILY '/pf038'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 39
+              trigger ../../../legA/fc/pf/39 eq complete
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              edit SUBFSFAMILY '/pf039'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 40
+              trigger ../../../legA/fc/pf/40 eq complete
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              edit SUBFSFAMILY '/pf040'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 41
+              trigger ../../../legA/fc/pf/41 eq complete
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              edit SUBFSFAMILY '/pf041'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 42
+              trigger ../../../legA/fc/pf/42 eq complete
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              edit SUBFSFAMILY '/pf042'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 43
+              trigger ../../../legA/fc/pf/43 eq complete
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              edit SUBFSFAMILY '/pf043'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 44
+              trigger ../../../legA/fc/pf/44 eq complete
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              edit SUBFSFAMILY '/pf044'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 45
+              trigger ../../../legA/fc/pf/45 eq complete
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              edit SUBFSFAMILY '/pf045'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 46
+              trigger ../../../legA/fc/pf/46 eq complete
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              edit SUBFSFAMILY '/pf046'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 47
+              trigger ../../../legA/fc/pf/47 eq complete
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              edit SUBFSFAMILY '/pf047'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 48
+              trigger ../../../legA/fc/pf/48 eq complete
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              edit SUBFSFAMILY '/pf048'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 49
+              trigger ../../../legA/fc/pf/49 eq complete
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              edit SUBFSFAMILY '/pf049'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 50
+              trigger ../../../legA/fc/pf/50 eq complete
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              edit SUBFSFAMILY '/pf050'
+              edit SMSTRIES '1'
+              task getvarepsdata
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger intHtoL eq complete and getvarepsdata eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '144'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+          endfamily
+          family cf
+            complete /emc_36r1/main/00/legBcpl/fc/cf/modeleps:step ge 144
+            trigger ../../legA/fc/cf eq complete and not /emc_36r1/main/ref/00/events:cpl and ./getpersSST eq complete and ./wavfcdata eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit MEMBER '0'
+            edit EPSMEMBER '0'
+            edit SUBFSFAMILY '/cf000'
+            edit EPSTYPE 'cf'
+            edit EMOS_TYPE 'cf'
+            edit USER_PRIORITY '72'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSFCRES '319'
+            edit EPSWAMRESOL 'global50'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit EPSINISTEP '360'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '2'
+            edit CLASS 'od'
+            edit SMSTRIES '1'
+            edit RUNCOUPLE '0'
+            task getvarepsdata
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '2700'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSLEG '2'
+              edit EPSINISTEP '216'
+              edit EPSFCRES '639'
+              edit EPSFCRESN '319'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '2700'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '216'
+              edit EPSFCRES '319'
+              edit NPES '24'
+              edit FCNPES '24'
+              edit THREADS '2'
+              edit CLASS 'od'
+            task modeleps
+              trigger intHtoL eq complete and getvarepsdata eq complete
+              edit FCNPES '32'
+              edit THREADS '4'
+              edit SMSTRIES '1'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSLEG '2'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '144'
+              edit EPSINISTEP_PREVIOUS '216'
+              edit FCLENGTH '144'
+              edit TSTEP '2700'
+              edit CLASS 'od'
+              meter step -1 144 144
+          endfamily
+        endfamily
+        family postproc
+          trigger ./fc/pf eq complete and ./fc/cf eq complete
+          edit STEPS '252/360/12/24 360/360/12/120'
+          inlimit /emc_36r1/limits:postproc
+          family ensms
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger ../fc eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            family limits
+              limit fdb 1
+              limit gen 8
+            endfamily
+            task ensms
+              edit ENS_M 'false'
+              edit ENS_S 'false'
+              edit ENS_MARS 'false'
+              event stage
+            family 300
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '246'
+              edit STEP2 '300'
+              edit BY '6'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+            family 360
+              trigger ./ensms:stage or ./ensms eq complete
+              edit STEP1 '306'
+              edit STEP2 '360'
+              edit BY '6'
+              edit STEPS '0'
+              family T
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'T'
+                inlimit ../limits:gen
+                family 850
+                  task ensms
+                    edit LIST_LEV '850'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              family Z
+                edit ENS_M 'false'
+                edit ENS_S 'false'
+                edit LIST_PARAM 'Z'
+                inlimit ../limits:gen
+                family 1000
+                  task ensms
+                    edit LIST_LEV '1000'
+                endfamily
+                family 500
+                  task ensms
+                    edit LIST_LEV '500'
+                endfamily
+              endfamily
+              task ensms
+                trigger T eq complete and Z eq complete
+                edit ENS_MARS 'false'
+                inlimit ../limits:fdb
+            endfamily
+          endfamily
+          family prob
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger ( /emc_36r1/main/00/legB/fc eq complete) and ( /emc_36r1/main/00/legA/postproc/prob eq complete)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            edit STEP1 '252'
+            edit STEP2 '360'
+            edit BY '12'
+            family 24
+              edit STEP1 '240'
+              edit STEP2 '360'
+              edit BY '24'
+              task t850
+              task rain
+              task ff
+            endfamily
+            family 12
+              edit STEP1 '252'
+              edit STEP2 '348'
+              edit BY '24'
+              task t850
+              task rain
+              task ff
+            endfamily
+            task 2t
+            task swh
+            task mwp
+            task 10fg
+              trigger ../dp eq complete
+            task prob_fdb
+              trigger ./2t eq complete and swh eq complete and mwp eq complete and ./10fg eq complete and ./12 eq complete and ./24 eq complete
+          endfamily
+          family dp
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '246:360:6'
+            inlimit /emc_36r1/limits:dp
+            family dp
+              trigger ./cf eq complete and ./pf eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit OVERLAP '1'
+              edit STEPS '216:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                complete /emc_36r1/main/ref/00/events:cf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+                family 05
+                  edit EPSMEMBER '5'
+                  edit MEMBER '5'
+                  edit SUBFSFAMILY '/pf005'
+                  task derived_param
+                endfamily
+                family 06
+                  edit EPSMEMBER '6'
+                  edit MEMBER '6'
+                  edit SUBFSFAMILY '/pf006'
+                  task derived_param
+                endfamily
+                family 07
+                  edit EPSMEMBER '7'
+                  edit MEMBER '7'
+                  edit SUBFSFAMILY '/pf007'
+                  task derived_param
+                endfamily
+                family 08
+                  edit EPSMEMBER '8'
+                  edit MEMBER '8'
+                  edit SUBFSFAMILY '/pf008'
+                  task derived_param
+                endfamily
+                family 09
+                  edit EPSMEMBER '9'
+                  edit MEMBER '9'
+                  edit SUBFSFAMILY '/pf009'
+                  task derived_param
+                endfamily
+                family 10
+                  edit EPSMEMBER '10'
+                  edit MEMBER '10'
+                  edit SUBFSFAMILY '/pf010'
+                  task derived_param
+                endfamily
+                family 11
+                  edit EPSMEMBER '11'
+                  edit MEMBER '11'
+                  edit SUBFSFAMILY '/pf011'
+                  task derived_param
+                endfamily
+                family 12
+                  edit EPSMEMBER '12'
+                  edit MEMBER '12'
+                  edit SUBFSFAMILY '/pf012'
+                  task derived_param
+                endfamily
+                family 13
+                  edit EPSMEMBER '13'
+                  edit MEMBER '13'
+                  edit SUBFSFAMILY '/pf013'
+                  task derived_param
+                endfamily
+                family 14
+                  edit EPSMEMBER '14'
+                  edit MEMBER '14'
+                  edit SUBFSFAMILY '/pf014'
+                  task derived_param
+                endfamily
+                family 15
+                  edit EPSMEMBER '15'
+                  edit MEMBER '15'
+                  edit SUBFSFAMILY '/pf015'
+                  task derived_param
+                endfamily
+                family 16
+                  edit EPSMEMBER '16'
+                  edit MEMBER '16'
+                  edit SUBFSFAMILY '/pf016'
+                  task derived_param
+                endfamily
+                family 17
+                  edit EPSMEMBER '17'
+                  edit MEMBER '17'
+                  edit SUBFSFAMILY '/pf017'
+                  task derived_param
+                endfamily
+                family 18
+                  edit EPSMEMBER '18'
+                  edit MEMBER '18'
+                  edit SUBFSFAMILY '/pf018'
+                  task derived_param
+                endfamily
+                family 19
+                  edit EPSMEMBER '19'
+                  edit MEMBER '19'
+                  edit SUBFSFAMILY '/pf019'
+                  task derived_param
+                endfamily
+                family 20
+                  edit EPSMEMBER '20'
+                  edit MEMBER '20'
+                  edit SUBFSFAMILY '/pf020'
+                  task derived_param
+                endfamily
+                family 21
+                  edit EPSMEMBER '21'
+                  edit MEMBER '21'
+                  edit SUBFSFAMILY '/pf021'
+                  task derived_param
+                endfamily
+                family 22
+                  edit EPSMEMBER '22'
+                  edit MEMBER '22'
+                  edit SUBFSFAMILY '/pf022'
+                  task derived_param
+                endfamily
+                family 23
+                  edit EPSMEMBER '23'
+                  edit MEMBER '23'
+                  edit SUBFSFAMILY '/pf023'
+                  task derived_param
+                endfamily
+                family 24
+                  edit EPSMEMBER '24'
+                  edit MEMBER '24'
+                  edit SUBFSFAMILY '/pf024'
+                  task derived_param
+                endfamily
+                family 25
+                  edit EPSMEMBER '25'
+                  edit MEMBER '25'
+                  edit SUBFSFAMILY '/pf025'
+                  task derived_param
+                endfamily
+                family 26
+                  edit EPSMEMBER '26'
+                  edit MEMBER '26'
+                  edit SUBFSFAMILY '/pf026'
+                  task derived_param
+                endfamily
+                family 27
+                  edit EPSMEMBER '27'
+                  edit MEMBER '27'
+                  edit SUBFSFAMILY '/pf027'
+                  task derived_param
+                endfamily
+                family 28
+                  edit EPSMEMBER '28'
+                  edit MEMBER '28'
+                  edit SUBFSFAMILY '/pf028'
+                  task derived_param
+                endfamily
+                family 29
+                  edit EPSMEMBER '29'
+                  edit MEMBER '29'
+                  edit SUBFSFAMILY '/pf029'
+                  task derived_param
+                endfamily
+                family 30
+                  edit EPSMEMBER '30'
+                  edit MEMBER '30'
+                  edit SUBFSFAMILY '/pf030'
+                  task derived_param
+                endfamily
+                family 31
+                  edit EPSMEMBER '31'
+                  edit MEMBER '31'
+                  edit SUBFSFAMILY '/pf031'
+                  task derived_param
+                endfamily
+                family 32
+                  edit EPSMEMBER '32'
+                  edit MEMBER '32'
+                  edit SUBFSFAMILY '/pf032'
+                  task derived_param
+                endfamily
+                family 33
+                  edit EPSMEMBER '33'
+                  edit MEMBER '33'
+                  edit SUBFSFAMILY '/pf033'
+                  task derived_param
+                endfamily
+                family 34
+                  edit EPSMEMBER '34'
+                  edit MEMBER '34'
+                  edit SUBFSFAMILY '/pf034'
+                  task derived_param
+                endfamily
+                family 35
+                  edit EPSMEMBER '35'
+                  edit MEMBER '35'
+                  edit SUBFSFAMILY '/pf035'
+                  task derived_param
+                endfamily
+                family 36
+                  edit EPSMEMBER '36'
+                  edit MEMBER '36'
+                  edit SUBFSFAMILY '/pf036'
+                  task derived_param
+                endfamily
+                family 37
+                  edit EPSMEMBER '37'
+                  edit MEMBER '37'
+                  edit SUBFSFAMILY '/pf037'
+                  task derived_param
+                endfamily
+                family 38
+                  edit EPSMEMBER '38'
+                  edit MEMBER '38'
+                  edit SUBFSFAMILY '/pf038'
+                  task derived_param
+                endfamily
+                family 39
+                  edit EPSMEMBER '39'
+                  edit MEMBER '39'
+                  edit SUBFSFAMILY '/pf039'
+                  task derived_param
+                endfamily
+                family 40
+                  edit EPSMEMBER '40'
+                  edit MEMBER '40'
+                  edit SUBFSFAMILY '/pf040'
+                  task derived_param
+                endfamily
+                family 41
+                  edit EPSMEMBER '41'
+                  edit MEMBER '41'
+                  edit SUBFSFAMILY '/pf041'
+                  task derived_param
+                endfamily
+                family 42
+                  edit EPSMEMBER '42'
+                  edit MEMBER '42'
+                  edit SUBFSFAMILY '/pf042'
+                  task derived_param
+                endfamily
+                family 43
+                  edit EPSMEMBER '43'
+                  edit MEMBER '43'
+                  edit SUBFSFAMILY '/pf043'
+                  task derived_param
+                endfamily
+                family 44
+                  edit EPSMEMBER '44'
+                  edit MEMBER '44'
+                  edit SUBFSFAMILY '/pf044'
+                  task derived_param
+                endfamily
+                family 45
+                  edit EPSMEMBER '45'
+                  edit MEMBER '45'
+                  edit SUBFSFAMILY '/pf045'
+                  task derived_param
+                endfamily
+                family 46
+                  edit EPSMEMBER '46'
+                  edit MEMBER '46'
+                  edit SUBFSFAMILY '/pf046'
+                  task derived_param
+                endfamily
+                family 47
+                  edit EPSMEMBER '47'
+                  edit MEMBER '47'
+                  edit SUBFSFAMILY '/pf047'
+                  task derived_param
+                endfamily
+                family 48
+                  edit EPSMEMBER '48'
+                  edit MEMBER '48'
+                  edit SUBFSFAMILY '/pf048'
+                  task derived_param
+                endfamily
+                family 49
+                  edit EPSMEMBER '49'
+                  edit MEMBER '49'
+                  edit SUBFSFAMILY '/pf049'
+                  task derived_param
+                endfamily
+                family 50
+                  edit EPSMEMBER '50'
+                  edit MEMBER '50'
+                  edit SUBFSFAMILY '/pf050'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family cf
+              trigger ../../fc/cf eq complete
+              edit EMOS_TYPE 'cf'
+              task derived_param
+                edit MEMBER 'off'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/00/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                trigger ../../../fc/pf/01 eq complete
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task derived_param
+              endfamily
+              family 02
+                trigger ../../../fc/pf/02 eq complete
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task derived_param
+              endfamily
+              family 03
+                trigger ../../../fc/pf/03 eq complete
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task derived_param
+              endfamily
+              family 04
+                trigger ../../../fc/pf/04 eq complete
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task derived_param
+              endfamily
+              family 05
+                trigger ../../../fc/pf/05 eq complete
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task derived_param
+              endfamily
+              family 06
+                trigger ../../../fc/pf/06 eq complete
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task derived_param
+              endfamily
+              family 07
+                trigger ../../../fc/pf/07 eq complete
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task derived_param
+              endfamily
+              family 08
+                trigger ../../../fc/pf/08 eq complete
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task derived_param
+              endfamily
+              family 09
+                trigger ../../../fc/pf/09 eq complete
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task derived_param
+              endfamily
+              family 10
+                trigger ../../../fc/pf/10 eq complete
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task derived_param
+              endfamily
+              family 11
+                trigger ../../../fc/pf/11 eq complete
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task derived_param
+              endfamily
+              family 12
+                trigger ../../../fc/pf/12 eq complete
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task derived_param
+              endfamily
+              family 13
+                trigger ../../../fc/pf/13 eq complete
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task derived_param
+              endfamily
+              family 14
+                trigger ../../../fc/pf/14 eq complete
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task derived_param
+              endfamily
+              family 15
+                trigger ../../../fc/pf/15 eq complete
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task derived_param
+              endfamily
+              family 16
+                trigger ../../../fc/pf/16 eq complete
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task derived_param
+              endfamily
+              family 17
+                trigger ../../../fc/pf/17 eq complete
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task derived_param
+              endfamily
+              family 18
+                trigger ../../../fc/pf/18 eq complete
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task derived_param
+              endfamily
+              family 19
+                trigger ../../../fc/pf/19 eq complete
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task derived_param
+              endfamily
+              family 20
+                trigger ../../../fc/pf/20 eq complete
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task derived_param
+              endfamily
+              family 21
+                trigger ../../../fc/pf/21 eq complete
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task derived_param
+              endfamily
+              family 22
+                trigger ../../../fc/pf/22 eq complete
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task derived_param
+              endfamily
+              family 23
+                trigger ../../../fc/pf/23 eq complete
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task derived_param
+              endfamily
+              family 24
+                trigger ../../../fc/pf/24 eq complete
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task derived_param
+              endfamily
+              family 25
+                trigger ../../../fc/pf/25 eq complete
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task derived_param
+              endfamily
+              family 26
+                trigger ../../../fc/pf/26 eq complete
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task derived_param
+              endfamily
+              family 27
+                trigger ../../../fc/pf/27 eq complete
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task derived_param
+              endfamily
+              family 28
+                trigger ../../../fc/pf/28 eq complete
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task derived_param
+              endfamily
+              family 29
+                trigger ../../../fc/pf/29 eq complete
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task derived_param
+              endfamily
+              family 30
+                trigger ../../../fc/pf/30 eq complete
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task derived_param
+              endfamily
+              family 31
+                trigger ../../../fc/pf/31 eq complete
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task derived_param
+              endfamily
+              family 32
+                trigger ../../../fc/pf/32 eq complete
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task derived_param
+              endfamily
+              family 33
+                trigger ../../../fc/pf/33 eq complete
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task derived_param
+              endfamily
+              family 34
+                trigger ../../../fc/pf/34 eq complete
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task derived_param
+              endfamily
+              family 35
+                trigger ../../../fc/pf/35 eq complete
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task derived_param
+              endfamily
+              family 36
+                trigger ../../../fc/pf/36 eq complete
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task derived_param
+              endfamily
+              family 37
+                trigger ../../../fc/pf/37 eq complete
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task derived_param
+              endfamily
+              family 38
+                trigger ../../../fc/pf/38 eq complete
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task derived_param
+              endfamily
+              family 39
+                trigger ../../../fc/pf/39 eq complete
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task derived_param
+              endfamily
+              family 40
+                trigger ../../../fc/pf/40 eq complete
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task derived_param
+              endfamily
+              family 41
+                trigger ../../../fc/pf/41 eq complete
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task derived_param
+              endfamily
+              family 42
+                trigger ../../../fc/pf/42 eq complete
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task derived_param
+              endfamily
+              family 43
+                trigger ../../../fc/pf/43 eq complete
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task derived_param
+              endfamily
+              family 44
+                trigger ../../../fc/pf/44 eq complete
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task derived_param
+              endfamily
+              family 45
+                trigger ../../../fc/pf/45 eq complete
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task derived_param
+              endfamily
+              family 46
+                trigger ../../../fc/pf/46 eq complete
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task derived_param
+              endfamily
+              family 47
+                trigger ../../../fc/pf/47 eq complete
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task derived_param
+              endfamily
+              family 48
+                trigger ../../../fc/pf/48 eq complete
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task derived_param
+              endfamily
+              family 49
+                trigger ../../../fc/pf/49 eq complete
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task derived_param
+              endfamily
+              family 50
+                trigger ../../../fc/pf/50 eq complete
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task derived_param
+              endfamily
+            endfamily
+          endfamily
+          family extra
+            trigger ./dp eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit STEPS '246:360:6'
+            inlimit /emc_36r1/limits:extra
+            family cf
+              edit EMOS_TYPE 'cf'
+              task extrafields
+                edit EPSFCRES '319'
+                edit FCLENGTH '360'
+                edit FCLENGTH0 '240'
+                edit RUNVARFC '1'
+            endfamily
+            family pf
+              complete /emc_36r1/main/ref/00/events:cf
+              edit EMOS_TYPE 'pf'
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 05
+                edit EPSMEMBER '5'
+                edit MEMBER '5'
+                edit SUBFSFAMILY '/pf005'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 06
+                edit EPSMEMBER '6'
+                edit MEMBER '6'
+                edit SUBFSFAMILY '/pf006'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 07
+                edit EPSMEMBER '7'
+                edit MEMBER '7'
+                edit SUBFSFAMILY '/pf007'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 08
+                edit EPSMEMBER '8'
+                edit MEMBER '8'
+                edit SUBFSFAMILY '/pf008'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 09
+                edit EPSMEMBER '9'
+                edit MEMBER '9'
+                edit SUBFSFAMILY '/pf009'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 10
+                edit EPSMEMBER '10'
+                edit MEMBER '10'
+                edit SUBFSFAMILY '/pf010'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 11
+                edit EPSMEMBER '11'
+                edit MEMBER '11'
+                edit SUBFSFAMILY '/pf011'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 12
+                edit EPSMEMBER '12'
+                edit MEMBER '12'
+                edit SUBFSFAMILY '/pf012'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 13
+                edit EPSMEMBER '13'
+                edit MEMBER '13'
+                edit SUBFSFAMILY '/pf013'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 14
+                edit EPSMEMBER '14'
+                edit MEMBER '14'
+                edit SUBFSFAMILY '/pf014'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 15
+                edit EPSMEMBER '15'
+                edit MEMBER '15'
+                edit SUBFSFAMILY '/pf015'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 16
+                edit EPSMEMBER '16'
+                edit MEMBER '16'
+                edit SUBFSFAMILY '/pf016'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 17
+                edit EPSMEMBER '17'
+                edit MEMBER '17'
+                edit SUBFSFAMILY '/pf017'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 18
+                edit EPSMEMBER '18'
+                edit MEMBER '18'
+                edit SUBFSFAMILY '/pf018'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 19
+                edit EPSMEMBER '19'
+                edit MEMBER '19'
+                edit SUBFSFAMILY '/pf019'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 20
+                edit EPSMEMBER '20'
+                edit MEMBER '20'
+                edit SUBFSFAMILY '/pf020'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 21
+                edit EPSMEMBER '21'
+                edit MEMBER '21'
+                edit SUBFSFAMILY '/pf021'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 22
+                edit EPSMEMBER '22'
+                edit MEMBER '22'
+                edit SUBFSFAMILY '/pf022'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 23
+                edit EPSMEMBER '23'
+                edit MEMBER '23'
+                edit SUBFSFAMILY '/pf023'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 24
+                edit EPSMEMBER '24'
+                edit MEMBER '24'
+                edit SUBFSFAMILY '/pf024'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 25
+                edit EPSMEMBER '25'
+                edit MEMBER '25'
+                edit SUBFSFAMILY '/pf025'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 26
+                edit EPSMEMBER '26'
+                edit MEMBER '26'
+                edit SUBFSFAMILY '/pf026'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 27
+                edit EPSMEMBER '27'
+                edit MEMBER '27'
+                edit SUBFSFAMILY '/pf027'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 28
+                edit EPSMEMBER '28'
+                edit MEMBER '28'
+                edit SUBFSFAMILY '/pf028'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 29
+                edit EPSMEMBER '29'
+                edit MEMBER '29'
+                edit SUBFSFAMILY '/pf029'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 30
+                edit EPSMEMBER '30'
+                edit MEMBER '30'
+                edit SUBFSFAMILY '/pf030'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 31
+                edit EPSMEMBER '31'
+                edit MEMBER '31'
+                edit SUBFSFAMILY '/pf031'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 32
+                edit EPSMEMBER '32'
+                edit MEMBER '32'
+                edit SUBFSFAMILY '/pf032'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 33
+                edit EPSMEMBER '33'
+                edit MEMBER '33'
+                edit SUBFSFAMILY '/pf033'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 34
+                edit EPSMEMBER '34'
+                edit MEMBER '34'
+                edit SUBFSFAMILY '/pf034'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 35
+                edit EPSMEMBER '35'
+                edit MEMBER '35'
+                edit SUBFSFAMILY '/pf035'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 36
+                edit EPSMEMBER '36'
+                edit MEMBER '36'
+                edit SUBFSFAMILY '/pf036'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 37
+                edit EPSMEMBER '37'
+                edit MEMBER '37'
+                edit SUBFSFAMILY '/pf037'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 38
+                edit EPSMEMBER '38'
+                edit MEMBER '38'
+                edit SUBFSFAMILY '/pf038'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 39
+                edit EPSMEMBER '39'
+                edit MEMBER '39'
+                edit SUBFSFAMILY '/pf039'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 40
+                edit EPSMEMBER '40'
+                edit MEMBER '40'
+                edit SUBFSFAMILY '/pf040'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 41
+                edit EPSMEMBER '41'
+                edit MEMBER '41'
+                edit SUBFSFAMILY '/pf041'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 42
+                edit EPSMEMBER '42'
+                edit MEMBER '42'
+                edit SUBFSFAMILY '/pf042'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 43
+                edit EPSMEMBER '43'
+                edit MEMBER '43'
+                edit SUBFSFAMILY '/pf043'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 44
+                edit EPSMEMBER '44'
+                edit MEMBER '44'
+                edit SUBFSFAMILY '/pf044'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 45
+                edit EPSMEMBER '45'
+                edit MEMBER '45'
+                edit SUBFSFAMILY '/pf045'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 46
+                edit EPSMEMBER '46'
+                edit MEMBER '46'
+                edit SUBFSFAMILY '/pf046'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 47
+                edit EPSMEMBER '47'
+                edit MEMBER '47'
+                edit SUBFSFAMILY '/pf047'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 48
+                edit EPSMEMBER '48'
+                edit MEMBER '48'
+                edit SUBFSFAMILY '/pf048'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 49
+                edit EPSMEMBER '49'
+                edit MEMBER '49'
+                edit SUBFSFAMILY '/pf049'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+              family 50
+                edit EPSMEMBER '50'
+                edit MEMBER '50'
+                edit SUBFSFAMILY '/pf050'
+                task extrafields
+                  edit EPSFCRES '319'
+                  edit FCLENGTH '360'
+                  edit FCLENGTH0 '240'
+                  edit RUNVARFC '1'
+              endfamily
+            endfamily
+          endfamily
+          family calibrate
+            complete /emc_36r1/main/ref/00/events:cf
+            trigger /emc_36r1/main/00/ref/an eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/calibrate'
+            family onws
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              inlimit /limits:linux_cluster
+              task feedupcal
+              task upcal
+                trigger feedupcal eq complete
+              task revertupcal
+            endfamily
+          endfamily
+          family efi
+            complete ( /emc_36r1/main/ref/00/events:cf) or ( /emc_36r1/main/ref/00/events:noefi)
+            trigger /emc_36r1/main/00/legB/postproc/dp eq complete
+            edit HC_VERSION '0046'
+            edit HC_EXPVER '0046'
+            edit REF_VERSION '0046'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            edit NC_DAYS '31'
+            edit EPSLEG '2'
+            inlimit /emc_36r1/limits:efi
+            task stage
+              edit NC_DAYS '31'
+            family 240_336
+              trigger ./stage eq complete
+              edit ACC '96'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '336'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 168_336
+              trigger ./stage eq complete
+              edit ACC '168'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '336'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 012_036
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 036_060
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 060_084
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 084_108
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 108_132
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 120_144
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 120_168
+              trigger ./stage eq complete
+              edit ACC '48'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 168_240
+              trigger ./stage eq complete
+              edit ACC '72'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 000_168
+              trigger ./stage eq complete
+              edit ACC '168'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task extindex
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task extindex
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task extindex
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task extindex
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 000_024
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 024_048
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 048_072
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 072_096
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+            family 096_120
+              trigger ./stage eq complete
+              edit ACC '24'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task extindex
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task extindex
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task extindex
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task extindex
+              endfamily
+            endfamily
+          endfamily
+          task efi2fdb
+            complete ( /emc_36r1/main/ref/00/events:cf) or ( /emc_36r1/main/ref/00/events:noefi)
+            trigger ./efi eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            inlimit /emc_36r1/main/ref:mutex
+            event none
+        endfamily
+        family prod
+          edit MEM '3000'
+          edit ACCOUNT 'oeenfopg'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'cp'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit USER_PRIORITY '90'
+          edit SMSURLBASE 'http://intra.ecmwf.int/plots/d/intra/'
+          edit SMSURL 'sub=fixed/'
+          inlimit /limits:prod
+          family eps
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            inlimit /emc_36r1/limits:prodeps
+            family 0246
+              edit EMOS_TIME_STEP_H '0246'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0252
+              edit EMOS_TIME_STEP_H '0252'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0258
+              edit EMOS_TIME_STEP_H '0258'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0264
+              edit EMOS_TIME_STEP_H '0264'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0270
+              edit EMOS_TIME_STEP_H '0270'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0276
+              edit EMOS_TIME_STEP_H '0276'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0282
+              edit EMOS_TIME_STEP_H '0282'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0288
+              edit EMOS_TIME_STEP_H '0288'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0294
+              edit EMOS_TIME_STEP_H '0294'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0300
+              edit EMOS_TIME_STEP_H '0300'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0306
+              edit EMOS_TIME_STEP_H '0306'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0312
+              edit EMOS_TIME_STEP_H '0312'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0318
+              edit EMOS_TIME_STEP_H '0318'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0324
+              edit EMOS_TIME_STEP_H '0324'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0330
+              edit EMOS_TIME_STEP_H '0330'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0336
+              edit EMOS_TIME_STEP_H '0336'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0342
+              edit EMOS_TIME_STEP_H '0342'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0348
+              edit EMOS_TIME_STEP_H '0348'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0354
+              edit EMOS_TIME_STEP_H '0354'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+            family 0360
+              edit EMOS_TIME_STEP_H '0360'
+              task prodgen
+                late -s +00:05 -c +00:15
+            endfamily
+          endfamily
+          family wave
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ( ../../legA/prod/getreq/bitmap:001 or ../../legA/prod/getreq/bitmap eq complete) and ../postproc/dp eq complete
+            edit PGNPES '2'
+            edit URL 'GWAEF/00'
+            inlimit /emc_36r1/limits:prodwave
+            family 0246
+              edit EMOS_TIME_STEP_H '0246'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0252
+              edit EMOS_TIME_STEP_H '0252'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0258
+              edit EMOS_TIME_STEP_H '0258'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0264
+              edit EMOS_TIME_STEP_H '0264'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0270
+              edit EMOS_TIME_STEP_H '0270'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0276
+              edit EMOS_TIME_STEP_H '0276'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0282
+              edit EMOS_TIME_STEP_H '0282'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0288
+              edit EMOS_TIME_STEP_H '0288'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0294
+              edit EMOS_TIME_STEP_H '0294'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0300
+              edit EMOS_TIME_STEP_H '0300'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0306
+              edit EMOS_TIME_STEP_H '0306'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0312
+              edit EMOS_TIME_STEP_H '0312'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0318
+              edit EMOS_TIME_STEP_H '0318'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0324
+              edit EMOS_TIME_STEP_H '0324'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0330
+              edit EMOS_TIME_STEP_H '0330'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0336
+              edit EMOS_TIME_STEP_H '0336'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0342
+              edit EMOS_TIME_STEP_H '0342'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0348
+              edit EMOS_TIME_STEP_H '0348'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0354
+              edit EMOS_TIME_STEP_H '0354'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+            family 0360
+              edit EMOS_TIME_STEP_H '0360'
+              task prodwave
+                late -s +00:05 -c +00:15
+                edit EMOS_STREAM 'WE'
+                edit EMOS_TYPE 'we'
+            endfamily
+          endfamily
+          task prod_wparam
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/eps eq complete) and ../postproc/dp eq complete and ../../legA/prod/prod_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TYPE 'wp'
+            edit EMOS_TIME_STEP_H '0360'
+            edit PGNPES '52'
+          task enfo_postproc
+            late -s +00:05 -c +00:15
+            trigger ../postproc/prob eq complete and ../postproc/ensms eq complete and ( ../../legA/prod/getreq/eps eq complete)
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'ep'
+            edit EMOS_TIME_STEP_H '0360'
+            edit PGNPES '21'
+          task waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ( ../../legA/prod/getreq/wave_eps:001 or ../../legA/prod/getreq/wave_eps eq complete) and ../postproc/prob eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TIME_STEP_H '0360'
+            edit PGNPES '1'
+        endfamily
+        family prod2diss
+          edit USER_PRIORITY '90'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/prod'
+          edit EMOS_DOMAIN 'G'
+          edit EMOS_TYPE 'ef'
+          edit EMOS_PROJECT '12'
+          edit PROD_TASK '1'
+          edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+          edit SMSURL 'GENFO/00'
+          family eps
+            family 0246
+              edit EMOS_TIME_STEP_H '0246'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0246/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../../../../legA/prod2diss/eps//0240/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0252
+              edit EMOS_TIME_STEP_H '0252'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0252/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0246/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0258
+              edit EMOS_TIME_STEP_H '0258'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0258/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0252/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0264
+              edit EMOS_TIME_STEP_H '0264'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0264/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0258/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0270
+              edit EMOS_TIME_STEP_H '0270'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0270/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0264/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0276
+              edit EMOS_TIME_STEP_H '0276'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0276/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0270/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0282
+              edit EMOS_TIME_STEP_H '0282'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0282/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0276/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0288
+              edit EMOS_TIME_STEP_H '0288'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0288/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0282/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0294
+              edit EMOS_TIME_STEP_H '0294'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0294/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0288/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0300
+              edit EMOS_TIME_STEP_H '0300'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0300/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0294/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0306
+              edit EMOS_TIME_STEP_H '0306'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0306/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0300/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0312
+              edit EMOS_TIME_STEP_H '0312'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0312/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0306/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0318
+              edit EMOS_TIME_STEP_H '0318'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0318/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0312/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0324
+              edit EMOS_TIME_STEP_H '0324'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0324/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0318/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0330
+              edit EMOS_TIME_STEP_H '0330'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0330/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0324/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0336
+              edit EMOS_TIME_STEP_H '0336'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0336/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0330/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0342
+              edit EMOS_TIME_STEP_H '0342'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0342/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0336/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0348
+              edit EMOS_TIME_STEP_H '0348'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0348/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0342/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0354
+              edit EMOS_TIME_STEP_H '0354'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0354/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0348/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            family 0360
+              edit EMOS_TIME_STEP_H '0360'
+              task pdb
+                late -s +00:05 -c +00:15
+                trigger ../../../prod/eps/0360/prodgen eq complete
+                inlimit /emc_36r1/limits:pdb
+                inlimit /limits:pdb
+                label info ""
+                event 1 
+              task q2diss
+                late -s +00:05 -c +00:15
+                trigger ./pdb eq complete and ( not ../../../../legA/prod2diss/operation_is_late:yes or ../0354/q2diss eq complete)
+                inlimit /emc_36r1/limits:q2diss
+                inlimit /limits:q2diss
+                label info ""
+                event 1 
+            endfamily
+            task check
+              trigger ./0360 eq complete
+          endfamily
+          family wave
+            edit EMOS_STREAM 'WE'
+            edit EMOS_TYPE 'we'
+            edit SMSURL 'GWAEF/00'
+            family 0246
+              trigger ../../prod/wave/0246/prodwave eq complete and ( ../../../legA/prod2diss/wave/0240 eq complete)
+              edit EMOS_TIME_STEP_H '0246'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0252
+              trigger ../../prod/wave/0252/prodwave eq complete and ( ./0246 eq complete)
+              edit EMOS_TIME_STEP_H '0252'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0258
+              trigger ../../prod/wave/0258/prodwave eq complete and ( ./0252 eq complete)
+              edit EMOS_TIME_STEP_H '0258'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0264
+              trigger ../../prod/wave/0264/prodwave eq complete and ( ./0258 eq complete)
+              edit EMOS_TIME_STEP_H '0264'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0270
+              trigger ../../prod/wave/0270/prodwave eq complete and ( ./0264 eq complete)
+              edit EMOS_TIME_STEP_H '0270'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0276
+              trigger ../../prod/wave/0276/prodwave eq complete and ( ./0270 eq complete)
+              edit EMOS_TIME_STEP_H '0276'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0282
+              trigger ../../prod/wave/0282/prodwave eq complete and ( ./0276 eq complete)
+              edit EMOS_TIME_STEP_H '0282'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0288
+              trigger ../../prod/wave/0288/prodwave eq complete and ( ./0282 eq complete)
+              edit EMOS_TIME_STEP_H '0288'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0294
+              trigger ../../prod/wave/0294/prodwave eq complete and ( ./0288 eq complete)
+              edit EMOS_TIME_STEP_H '0294'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0300
+              trigger ../../prod/wave/0300/prodwave eq complete and ( ./0294 eq complete)
+              edit EMOS_TIME_STEP_H '0300'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0306
+              trigger ../../prod/wave/0306/prodwave eq complete and ( ./0300 eq complete)
+              edit EMOS_TIME_STEP_H '0306'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0312
+              trigger ../../prod/wave/0312/prodwave eq complete and ( ./0306 eq complete)
+              edit EMOS_TIME_STEP_H '0312'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0318
+              trigger ../../prod/wave/0318/prodwave eq complete and ( ./0312 eq complete)
+              edit EMOS_TIME_STEP_H '0318'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0324
+              trigger ../../prod/wave/0324/prodwave eq complete and ( ./0318 eq complete)
+              edit EMOS_TIME_STEP_H '0324'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0330
+              trigger ../../prod/wave/0330/prodwave eq complete and ( ./0324 eq complete)
+              edit EMOS_TIME_STEP_H '0330'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0336
+              trigger ../../prod/wave/0336/prodwave eq complete and ( ./0330 eq complete)
+              edit EMOS_TIME_STEP_H '0336'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0342
+              trigger ../../prod/wave/0342/prodwave eq complete and ( ./0336 eq complete)
+              edit EMOS_TIME_STEP_H '0342'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0348
+              trigger ../../prod/wave/0348/prodwave eq complete and ( ./0342 eq complete)
+              edit EMOS_TIME_STEP_H '0348'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0354
+              trigger ../../prod/wave/0354/prodwave eq complete and ( ./0348 eq complete)
+              edit EMOS_TIME_STEP_H '0354'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            family 0360
+              trigger ../../prod/wave/0360/prodwave eq complete and ( ./0354 eq complete)
+              edit EMOS_TIME_STEP_H '0360'
+              task diss
+                late -s +00:05 -c +00:15
+                inlimit /emc_36r1/limits:w2diss
+                inlimit /limits:q2diss
+                label info ""
+                event pdb
+            endfamily
+            task check
+              trigger ./0360 eq complete
+          endfamily
+          task diss_wparam
+            late -s +00:05 -c +00:15
+            trigger ../prod/prod_wparam eq complete and ../../legA/prod2diss/diss_wparam eq complete
+            edit PROD_TASK 'w'
+            edit EMOS_TIME_STEP_H '0360'
+            edit EMOS_TYPE 'wp'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_waef_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/waef_postproc eq complete and ../../legA/prod2diss/diss_waef_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0360'
+            edit EMOS_TYPE 'pw'
+            edit EMOS_STREAM 'WE'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+          task diss_postproc
+            late -s +00:05 -c +00:15
+            trigger ../prod/enfo_postproc eq complete and ../../legA/prod2diss/diss_postproc eq complete
+            edit PROD_TASK 'p'
+            edit EMOS_TIME_STEP_H '0360'
+            edit EMOS_TYPE 'ep'
+            inlimit /emc_36r1/limits:q2diss
+            inlimit /limits:q2diss
+            label info ""
+            event pdb
+        endfamily
+      endfamily
+      family legBcpl
+        complete /emc_36r1/main/ref/00/events:240 or /emc_36r1/main/ref/00/events:360
+        trigger /emc_36r1/main/ref/00/events eq complete and /emc_36r1/main/ref/00/events:cpl and /emc_36r1/main/00/ref/oceini eq complete
+        edit EPSLEG '2'
+        edit EPSCOUPLE '1'
+        edit RUNCOUPLE '1'
+        edit OC_DELAY_START '0'
+        family fc
+          edit FCMEM '2240'
+          edit FCSTACK '700'
+          edit FCMRFS '0'
+          edit PRIORITY '71'
+          edit USER_PRIORITY '71'
+          edit N_PERT_AN '10'
+          edit SSTLEN '144'
+          edit EPSINISTEP_PREVIOUS '216'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          edit TSTEP '2700'
+          edit EPSFCRES '639'
+          edit RESOL '639'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+          edit CPUTIME '1000'
+          edit MEM '960'
+          edit THREADS '8'
+          edit NPES '8'
+          edit EPSLEG '2'
+          family pf
+            complete /emc_36r1/main/ref/00/events:cf
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTYPE 'pf'
+            edit EMOS_TYPE 'pf'
+            edit USER_PRIORITY '71'
+            edit PRIORITY '71'
+            edit FCNPES '32'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSFCRES '319'
+            edit EPSWAMRESOL 'global50'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit EPSINISTEP '360'
+            edit FCLENGTH '240'
+            edit TSTEP '1200'
+            edit EPSLEG '2'
+            edit CLASS 'od'
+            edit THREADS '2'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:pftotal
+            meter step -1 144 144
+            family 01
+              edit EPSMEMBER '1'
+              edit MEMBER '1'
+              edit SUBFSFAMILY '/pf001'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/01/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/01 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 02
+              edit EPSMEMBER '2'
+              edit MEMBER '2'
+              edit SUBFSFAMILY '/pf002'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/02/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/02 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 03
+              edit EPSMEMBER '3'
+              edit MEMBER '3'
+              edit SUBFSFAMILY '/pf003'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/03/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/03 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 04
+              edit EPSMEMBER '4'
+              edit MEMBER '4'
+              edit SUBFSFAMILY '/pf004'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/04/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/04 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 05
+              edit EPSMEMBER '5'
+              edit MEMBER '5'
+              edit SUBFSFAMILY '/pf005'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc1'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/05/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/05 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 06
+              edit EPSMEMBER '6'
+              edit MEMBER '6'
+              edit SUBFSFAMILY '/pf006'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc1'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/06/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/06 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 07
+              edit EPSMEMBER '7'
+              edit MEMBER '7'
+              edit SUBFSFAMILY '/pf007'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc1'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/07/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/07 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 08
+              edit EPSMEMBER '8'
+              edit MEMBER '8'
+              edit SUBFSFAMILY '/pf008'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc1'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/08/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/08 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 09
+              edit EPSMEMBER '9'
+              edit MEMBER '9'
+              edit SUBFSFAMILY '/pf009'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc1'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/09/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/09 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 10
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              edit SUBFSFAMILY '/pf010'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc2'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/10/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/10 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 11
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              edit SUBFSFAMILY '/pf011'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc2'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/11/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/11 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 12
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              edit SUBFSFAMILY '/pf012'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc2'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/12/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/12 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 13
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              edit SUBFSFAMILY '/pf013'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc2'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/13/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/13 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 14
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              edit SUBFSFAMILY '/pf014'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc2'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/14/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/14 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 15
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              edit SUBFSFAMILY '/pf015'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc3'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/15/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/15 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 16
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              edit SUBFSFAMILY '/pf016'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc3'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/16/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/16 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 17
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              edit SUBFSFAMILY '/pf017'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc3'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/17/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/17 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 18
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              edit SUBFSFAMILY '/pf018'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc3'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/18/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/18 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 19
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              edit SUBFSFAMILY '/pf019'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc3'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/19/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/19 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 20
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              edit SUBFSFAMILY '/pf020'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc4'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/20/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/20 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 21
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              edit SUBFSFAMILY '/pf021'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc4'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/21/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/21 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 22
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              edit SUBFSFAMILY '/pf022'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc4'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/22/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/22 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 23
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              edit SUBFSFAMILY '/pf023'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc4'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/23/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/23 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 24
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              edit SUBFSFAMILY '/pf024'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc4'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/24/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/24 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 25
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              edit SUBFSFAMILY '/pf025'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc5'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/25/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/25 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 26
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              edit SUBFSFAMILY '/pf026'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc5'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/26/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/26 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 27
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              edit SUBFSFAMILY '/pf027'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc5'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/27/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/27 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 28
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              edit SUBFSFAMILY '/pf028'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc5'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/28/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/28 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 29
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              edit SUBFSFAMILY '/pf029'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc5'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/29/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/29 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 30
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              edit SUBFSFAMILY '/pf030'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc6'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/30/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/30 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 31
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              edit SUBFSFAMILY '/pf031'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc6'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/31/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/31 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 32
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              edit SUBFSFAMILY '/pf032'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc6'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/32/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/32 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 33
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              edit SUBFSFAMILY '/pf033'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc6'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/33/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/33 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 34
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              edit SUBFSFAMILY '/pf034'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc6'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/34/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/34 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 35
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              edit SUBFSFAMILY '/pf035'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc7'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/35/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/35 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 36
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              edit SUBFSFAMILY '/pf036'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc7'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/36/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/36 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 37
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              edit SUBFSFAMILY '/pf037'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc7'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/37/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/37 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 38
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              edit SUBFSFAMILY '/pf038'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc7'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/38/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/38 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 39
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              edit SUBFSFAMILY '/pf039'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc7'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/39/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/39 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 40
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              edit SUBFSFAMILY '/pf040'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc8'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/40/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/40 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 41
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              edit SUBFSFAMILY '/pf041'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc8'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/41/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/41 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 42
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              edit SUBFSFAMILY '/pf042'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc8'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/42/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/42 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 43
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              edit SUBFSFAMILY '/pf043'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc8'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/43/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/43 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 44
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              edit SUBFSFAMILY '/pf044'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc8'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/44/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/44 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 45
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              edit SUBFSFAMILY '/pf045'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc9'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/45/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/45 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 46
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              edit SUBFSFAMILY '/pf046'
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc9'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/46/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/46 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 47
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              edit SUBFSFAMILY '/pf047'
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc9'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/47/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/47 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 48
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              edit SUBFSFAMILY '/pf048'
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc9'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/48/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/48 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 49
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              edit SUBFSFAMILY '/pf049'
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc9'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/49/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/49 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+            family 50
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              edit SUBFSFAMILY '/pf050'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc10'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger /emc_36r1/main/00/legA/fc/pf/50/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:modelepsB
+              endfamily
+              task getvarepsdata
+                trigger ../../../../legA/fc/pf/50 eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '144'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                edit SMSTRIES '1'
+                inlimit /emc_36r1/limits:modelepsB
+                meter step -1 144 144
+            endfamily
+          endfamily
+          family cf
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit MEMBER '0'
+            edit EPSMEMBER '0'
+            edit SUBFSFAMILY '/cf000'
+            edit EPSTYPE 'cf'
+            edit EMOS_TYPE 'cf'
+            edit USER_PRIORITY '72'
+            edit EPSNLEGS '3'
+            edit EPSFCLEV '62'
+            edit EPSWAMNSTPW '1'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSFCRES '319'
+            edit EPSWAMRESOL 'global50'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit EPSINISTEP '360'
+            edit TSTEP '1200'
+            edit EPSLEG '2'
+            edit CLASS 'od'
+            edit OCGROUP 'an0'
+            edit FCGROUP 'fc0'
+            edit FCCHUNK '1'
+            edit OCTOTAL '5'
+            edit FCTOTAL '51'
+            edit FCLENGTH '144'
+            edit FCLENGTH1 '216'
+            edit DAILY '0'
+            edit RUNVARFC '1'
+            family ocean
+              edit RUNACAN '0'
+              edit RUNVARFC '1'
+              edit RUNCOUPLE '0'
+              edit ACAN_LAG '-12'
+              edit EPSLEG '1'
+              task oceini
+                edit STREAM 'ocea'
+              task linkoce
+                trigger oceini eq complete
+              task addforce
+                trigger /emc_36r1/main/00/legA/fc/cf/modeleps eq complete
+              task runhope
+                trigger linkoce eq complete and addforce eq complete
+                edit FCLENGTH '216'
+                edit THREADS '16'
+                inlimit /emc_36r1/limits:modelepsB
+            endfamily
+            task getvarepsdata
+              trigger ../../../legA/fc/cf eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '2700'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSLEG '2'
+              edit EPSINISTEP '216'
+              edit EPSFCRES '639'
+              edit EPSFCRESN '319'
+              edit CLASS 'od'
+            task intHtoL
+              trigger getvarepsdata eq complete
+              edit MEM '1300'
+              edit MRF '10'
+              edit CPUTIME '1000'
+              edit STACK '450'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit TSTEP '2700'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '216'
+              edit EPSFCRES '319'
+              edit NPES '24'
+              edit FCNPES '24'
+              edit THREADS '2'
+              edit CLASS 'od'
+            task modeleps
+              trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSLEG '2'
+              edit EPSFCRES '319'
+              edit EPSINISTEP '360'
+              edit EPSINISTEP_PREVIOUS '216'
+              edit FCLENGTH '144'
+              edit EPSFCLENGTH_A '240'
+              edit MEM '3200'
+              edit MRF '10'
+              edit STACK '350'
+              edit FCCHUNK '1'
+              edit SMSTRIES '1'
+              edit NPES '1'
+              edit THREADS '64'
+              edit FCNPES '1'
+              edit TSTEP '2700'
+              edit CLASS 'od'
+              inlimit /emc_36r1/limits:modelepsB
+              meter step -1 144 144
+          endfamily
+          family reservation
+            trigger ./pf/46/intHtoL eq complete and ./pf/47/intHtoL eq complete and ./pf/48/intHtoL eq complete and ./pf/49/intHtoL eq complete and ./pf/50/intHtoL eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles'
+            inlimit /emc_36r1/limits:reservation
+            task reset_class
+              late -s +00:02 -c +00:02
+              edit RESERVATION_DEFINITION 'default'
+              label info ""
+            task reset_cpu
+              late -s +00:02 -c +00:02
+              complete /emc_36r1/main/ref/00/events:768
+              edit RESERVED_CPUS '0'
+              label info ""
+          endfamily
+        endfamily
+      endfamily
+      family legC
+        trigger /emc_36r1/main/ref/00/events eq complete and /emc_36r1/main/ref/00/events:768
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:35
+      trigger logfilestore eq complete and /emc_36r1/main/make eq complete and ./12 eq complete and ./00 eq complete and /emc_36r1/main/ref/dummy eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+  family hc2
+    repeat date YMD 20091008 20121212 7
+    edit ACCOUNT 'oeenfo'
+    edit LOGTASK 'hc2'
+    edit QUEUE 'ns'
+    edit QUEUE_EPILOG 'ns'
+    edit ENSEMBLES '4'
+    edit ENS_SIZE '4'
+    edit RUNHINDCAST '1'
+    edit STREAM 'ENFH'
+    edit EMOS_STREAM 'ENFH'
+    edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+    edit EMOS_BASE '00'
+    edit INICLASS 'EI'
+    edit INIEXPVER '0001'
+    edit INILEVELS '60'
+    edit DELETE_FAMILY 'true'
+    family back
+      trigger /emc_36r1/main/make eq complete
+      inlimit /emc_36r1/limits:hind
+      task stage_hc
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+      task rmfdb
+        trigger ./stage_hc eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+      task lock_fam
+        trigger 0 eq 1
+      task lock_1701
+        complete ./18 eq complete
+        trigger 0 eq 1
+      family 18
+        trigger ./rmfdb eq complete
+        edit DELTA_YEAR '-18'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                    edit SMSPASS 'stripped'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 17
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-17'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 16
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-16'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 15
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-15'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 14
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-14'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 13
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-13'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 12
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-12'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 11
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-11'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 10
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-10'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 09
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-09'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 08
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-08'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 07
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-07'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 06
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-06'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 05
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-05'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 04
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-04'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 03
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-03'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 02
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-02'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+      family 01
+        trigger ./lock_1701 eq complete and ./rmfdb eq complete
+        edit DELTA_YEAR '-01'
+        family m2
+          edit DELTA_DAY '-2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '3000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit FCNPES '16'
+          edit EPSSVTSTEP '900'
+          edit MEM '1600'
+          edit MRF '10'
+          edit NPES '16'
+          edit THREADS '4'
+          edit CPUTIME '12000'
+          edit STACK '350'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit CPUTIME '1000'
+            edit STACK '450'
+          task svsh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            edit MEMBER '0'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnhevo
+            trigger svnh eq complete
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit CPUTIME '120000'
+          task svshevo
+            trigger svsh eq complete
+            edit EVOLVE 'yes'
+          task svsave
+            trigger svshevo eq complete and svnhevo eq complete
+          task clean
+            trigger svnhevo eq complete and svshevo eq complete and svsave eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc'
+        endfamily
+        family sv
+          edit EVOLVE 'no'
+          edit FASTEX 'no'
+          edit EPSTYPE 'sv'
+          edit FCMEM '2000'
+          edit FCSTACK '400'
+          edit FCMRFS '100'
+          edit FCLENGTH '48'
+          edit EPSSVTCSUB '1'
+          edit EPSSVOP '1'
+          edit NPES '16'
+          edit EPSSVTSTEP '900'
+          task getini
+            edit LINIENDA '0'
+            edit INIDATEENDA '0'
+            edit EPSCOUPLE '0'
+            edit N_PERT_AN '10'
+            edit EPSCOUPL_A '0'
+            edit EPSCOUPL_B '0'
+            edit EPSCOUPL_C '0'
+          task inidata_sv
+            trigger getini eq complete
+            edit THREADS '8'
+          task targets
+            late -s +00:03 -c +00:10
+            edit EPSTCBB '1'
+            label da_info ""
+            label dcda_info ""
+            event sv
+          task svsh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '73'
+            inlimit /emc_36r1/limits:pesh 2
+          task svnh
+            trigger inidata_sv eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit THREADS '8'
+            edit USER_PRIORITY '74'
+            inlimit /emc_36r1/limits:pesh 2
+          task subspace
+            trigger svnh eq complete and svsh eq complete and ( targets eq complete or targets:sv)
+          task sv1
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '1'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '72'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv2
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '2'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            edit USER_PRIORITY '71'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv3
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '3'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv4
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '4'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv5
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '5'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task sv6
+            trigger ( targets eq complete or targets:sv) and subspace eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit CPUTIME '12000'
+            edit STACK '350'
+            edit MEMBER '6'
+            edit EPSTROP '1'
+            edit EPSSVDIAB 'true'
+            edit THREADS '8'
+            inlimit /emc_36r1/limits:pesh 2
+          task getsvevo
+            event ecfs
+          task getsvs
+            trigger getsvevo eq complete and svnh eq complete and svsh eq complete and sv1 eq complete and sv2 eq complete and sv3 eq complete and sv4 eq complete and sv5 eq complete and sv6 eq complete and ../m2 eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit EPSTROP '1'
+          task svnhevo
+            trigger svnh eq complete and ../legA/fc eq complete
+            edit MEM '1600'
+            edit MRF '10'
+            edit NPES '16'
+            edit THREADS '4'
+            edit STACK '350'
+            edit HEMISPHERE 'n'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+          task svshevo
+            trigger svsh eq complete and ../legA/fc eq complete
+            edit NPES '24'
+            edit THREADS '8'
+            edit MEM '1300'
+            edit MRF '10'
+            edit STACK '450'
+            edit EVOLVE 'yes'
+            edit ANNPES '8'
+            edit CPUTIME '120000'
+            inlimit /emc_36r1/limits:pesh 2
+        endfamily
+        family legA
+          family fc
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '240'
+            edit EPSINISTEP_PREVIOUS '0'
+            edit EPSWAMNFRE '30'
+            edit EPSWAMNANG '24'
+            edit TSTEP '1200'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '1'
+            task getini
+              edit LINIENDA '0'
+              edit INIDATEENDA '0'
+              edit EPSCOUPLE '0'
+              edit N_PERT_AN '10'
+              edit EPSCOUPL_A '0'
+              edit EPSCOUPL_B '0'
+              edit EPSCOUPL_C '0'
+            task inidata
+              trigger getini eq complete
+              edit THREADS '8'
+            task getae
+              event 1 
+            task rot
+              trigger ../../sv/getsvs eq complete and ( getae:1 or getae eq complete)
+              edit EPSTROP '1'
+            family pert_ic
+              trigger rot eq complete and inidata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTROP '1'
+              inlimit /emc_36r1/limits:pertic
+              family 00
+                task pertinic
+                  edit MEMBER '0'
+              endfamily
+              family 01
+                task pertinic
+                  edit MEMBER '1'
+              endfamily
+              family 02
+                task pertinic
+                  edit MEMBER '2'
+              endfamily
+              family 03
+                task pertinic
+                  edit MEMBER '3'
+              endfamily
+              family 04
+                task pertinic
+                  edit MEMBER '4'
+              endfamily
+            endfamily
+            task cp_pert
+              trigger pert_ic eq complete
+              event 1 
+            task wavini
+              edit FSFAMILY 'mc'
+              edit PERSST 'true'
+              edit SSTINT '1'
+            task wavfcdata
+              trigger ./getpersSST eq complete and ../../legA/fc/wavini eq complete
+              edit EPSCOUPLE '1'
+            task getpersSST
+              trigger ./inidata eq complete
+              edit EPSCOUPLE '1'
+              edit EPS_INI_STREAM 'DA'
+              edit EPSFCRES '639'
+            family pf
+              trigger ./getpersSST eq complete and ./wavfcdata eq complete and wavini eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              meter step -1 240 240
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                task getiniLeg
+                  trigger ../../pert_ic/01/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                task getiniLeg
+                  trigger ../../pert_ic/02/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                task getiniLeg
+                  trigger ../../pert_ic/03/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                task getiniLeg
+                  trigger ../../pert_ic/04/pertinic eq complete
+                  edit LINIENDA '0'
+                  edit INIDATEENDA '0'
+                  edit EPSCOUPLE '0'
+                  edit N_PERT_AN '10'
+                  edit EPSCOUPL_A '0'
+                  edit EPSCOUPL_B '0'
+                  edit EPSCOUPL_C '0'
+                task modeleps
+                  trigger getiniLeg eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '30'
+                  edit EPSWAMNANG '24'
+                  edit EPSLEG '1'
+                  edit EPSFCRES '639'
+                  edit EPSINISTEP '216'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit FCLENGTH '240'
+                  edit TSTEP '1200'
+                  edit CLASS 'od'
+                  edit THREADS '4'
+                  inlimit /emc_36r1/limits:pesh 6
+                  meter step -1 240 240
+              endfamily
+            endfamily
+            family cf
+              trigger ./pert_ic/00/pertinic eq complete and ./getpersSST eq complete and ./wavfcdata eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSWAMRESOL 'global50'
+              edit EPSFCRES '639'
+              edit EPSWAMNFRE '30'
+              edit EPSWAMNANG '24'
+              edit EPSINISTEP '216'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '1'
+              edit CLASS 'od'
+              task getiniLeg
+                trigger ../inidata eq complete and ../wavini eq complete
+                edit LINIENDA '0'
+                edit INIDATEENDA '0'
+                edit EPSCOUPLE '0'
+                edit N_PERT_AN '10'
+                edit EPSCOUPL_A '0'
+                edit EPSCOUPL_B '0'
+                edit EPSCOUPL_C '0'
+              task modeleps
+                trigger getiniLeg eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '30'
+                edit EPSWAMNANG '24'
+                edit EPSLEG '1'
+                edit EPSFCRES '639'
+                edit EPSINISTEP '216'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit FCLENGTH '240'
+                edit TSTEP '1200'
+                edit CLASS 'od'
+                edit FCNPES '32'
+                edit THREADS '4'
+                inlimit /emc_36r1/limits:pesh 6
+                meter step -1 240 240
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../fc eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:dp
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '0:240:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                task extrafields
+                  edit EPSFCRES '639'
+                  edit FCLENGTH '240'
+                  edit FCLENGTH0 '0'
+                  edit RUNVARFC '1'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task extrafields
+                    edit EPSFCRES '639'
+                    edit FCLENGTH '240'
+                    edit FCLENGTH0 '0'
+                    edit RUNVARFC '1'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family legBcpl
+          trigger ./legA eq complete
+          family fc
+            edit EPSCOUPLE '1'
+            edit FCMEM '2240'
+            edit FCSTACK '700'
+            edit FCMRFS '0'
+            edit PRIORITY '67'
+            edit USER_PRIORITY '67'
+            edit N_PERT_AN '10'
+            edit SSTLEN '144'
+            edit EPSINISTEP_PREVIOUS '216'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            edit TSTEP '2700'
+            edit EPSFCRES '639'
+            edit RESOL '639'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+            edit CPUTIME '1000'
+            edit MEM '960'
+            edit THREADS '8'
+            edit NPES '8'
+            edit EPSLEG '2'
+            family pf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit EPSTYPE 'pf'
+              edit EMOS_TYPE 'pf'
+              edit USER_PRIORITY '67'
+              edit PRIORITY '67'
+              edit FCNPES '32'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit FCLENGTH '240'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit THREADS '2'
+              edit RUNVARFC '1'
+              meter step -1 552 552
+              family 01
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                edit SUBFSFAMILY '/pf001'
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/01/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/01 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 02
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                edit SUBFSFAMILY '/pf002'
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/02/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/02 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 03
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                edit SUBFSFAMILY '/pf003'
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/03/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/03 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+              family 04
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                edit SUBFSFAMILY '/pf004'
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit FCLENGTH '144'
+                edit FCLENGTH1 '216'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                family ocean
+                  edit RUNACAN '0'
+                  edit RUNVARFC '1'
+                  edit RUNCOUPLE '0'
+                  edit ACAN_LAG '-12'
+                  edit EPSLEG '1'
+                  task oceini
+                    edit STREAM 'ocea'
+                  task linkoce
+                    trigger oceini eq complete
+                  task addforce
+                    trigger ../../../../../legA/fc/pf/04/modeleps eq complete
+                  task runhope
+                    trigger linkoce eq complete and addforce eq complete
+                    edit FCLENGTH '216'
+                    edit THREADS '16'
+                    inlimit /emc_36r1/limits:pesh
+                endfamily
+                task getvarepsdata
+                  trigger ../../../../legA/fc/pf/04 eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '639'
+                  edit EPSFCRESN '319'
+                  edit CLASS 'od'
+                task intHtoL
+                  trigger getvarepsdata eq complete
+                  edit MEM '1300'
+                  edit MRF '10'
+                  edit CPUTIME '1000'
+                  edit STACK '450'
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSINISTEP_PREVIOUS '0'
+                  edit EPSWAMRESOL 'global50'
+                  edit TSTEP '2700'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSINISTEP '216'
+                  edit EPSFCRES '319'
+                  edit NPES '24'
+                  edit FCNPES '24'
+                  edit THREADS '2'
+                  edit CLASS 'od'
+                task modeleps
+                  trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                  edit EPSNLEGS '3'
+                  edit EPSFCLEV '62'
+                  edit EPSWAMNSTPW '1'
+                  edit EPSWAMRESOL 'global50'
+                  edit EPSWAMNFRE '25'
+                  edit EPSWAMNANG '12'
+                  edit EPSLEG '2'
+                  edit EPSFCRES '319'
+                  edit EPSINISTEP '360'
+                  edit EPSINISTEP_PREVIOUS '216'
+                  edit FCLENGTH '552'
+                  edit EPSFCLENGTH_A '240'
+                  edit MEM '3200'
+                  edit MRF '10'
+                  edit STACK '350'
+                  edit FCCHUNK '1'
+                  edit NPES '1'
+                  edit THREADS '64'
+                  edit FCNPES '1'
+                  edit TSTEP '2700'
+                  edit CLASS 'od'
+                  edit SMSTRIES '1'
+                  inlimit /emc_36r1/limits:pesh
+                  meter step -1 552 552
+              endfamily
+            endfamily
+            family cf
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit MEMBER '0'
+              edit EPSMEMBER '0'
+              edit SUBFSFAMILY '/cf000'
+              edit EPSTYPE 'cf'
+              edit EMOS_TYPE 'cf'
+              edit USER_PRIORITY '78'
+              edit EPSNLEGS '3'
+              edit EPSFCLEV '62'
+              edit EPSWAMNSTPW '1'
+              edit EPSINISTEP_PREVIOUS '0'
+              edit EPSFCRES '319'
+              edit EPSWAMRESOL 'global50'
+              edit EPSWAMNFRE '25'
+              edit EPSWAMNANG '12'
+              edit EPSINISTEP '552'
+              edit TSTEP '1200'
+              edit EPSLEG '2'
+              edit CLASS 'od'
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit FCLENGTH '144'
+              edit FCLENGTH1 '216'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              family ocean
+                edit RUNACAN '0'
+                edit RUNVARFC '1'
+                edit RUNCOUPLE '0'
+                edit ACAN_LAG '-12'
+                edit EPSLEG '1'
+                task oceini
+                  edit STREAM 'ocea'
+                task linkoce
+                  trigger oceini eq complete
+                task addforce
+                  trigger ../../../../legA/fc/cf/modeleps eq complete
+                task runhope
+                  trigger linkoce eq complete and addforce eq complete
+                  edit FCLENGTH '216'
+                  edit THREADS '16'
+                  inlimit /emc_36r1/limits:pesh
+              endfamily
+              task getvarepsdata
+                trigger ../../../legA/fc/cf eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '639'
+                edit EPSFCRESN '319'
+                edit CLASS 'od'
+              task intHtoL
+                trigger getvarepsdata eq complete
+                edit MEM '1300'
+                edit MRF '10'
+                edit CPUTIME '1000'
+                edit STACK '450'
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSINISTEP_PREVIOUS '0'
+                edit EPSWAMRESOL 'global50'
+                edit TSTEP '2700'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSINISTEP '216'
+                edit EPSFCRES '319'
+                edit NPES '24'
+                edit FCNPES '24'
+                edit THREADS '2'
+                edit CLASS 'od'
+              task modeleps
+                trigger ./intHtoL eq complete and ./getvarepsdata eq complete and ./ocean eq complete
+                edit EPSNLEGS '3'
+                edit EPSFCLEV '62'
+                edit EPSWAMNSTPW '1'
+                edit EPSWAMRESOL 'global50'
+                edit EPSWAMNFRE '25'
+                edit EPSWAMNANG '12'
+                edit EPSLEG '2'
+                edit EPSFCRES '319'
+                edit EPSINISTEP '360'
+                edit EPSINISTEP_PREVIOUS '216'
+                edit FCLENGTH '552'
+                edit EPSFCLENGTH_A '240'
+                edit MEM '3200'
+                edit MRF '10'
+                edit STACK '350'
+                edit FCCHUNK '1'
+                edit SMSTRIES '1'
+                edit NPES '1'
+                edit THREADS '64'
+                edit FCNPES '1'
+                edit TSTEP '2700'
+                edit CLASS 'od'
+                inlimit /emc_36r1/limits:pesh
+                meter step -1 552 552
+            endfamily
+          endfamily
+          family postproc
+            trigger ./fc eq complete
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              trigger ../../legA/postproc/dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:dp
+              family dp
+                trigger ./cf eq complete and ./pf eq complete
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+                edit OVERLAP '1'
+                edit STEPS '216:240:6'
+                inlimit /emc_36r1/limits:dp
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derived_param
+                    edit MEMBER 'off'
+                endfamily
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 01
+                    edit EPSMEMBER '1'
+                    edit MEMBER '1'
+                    edit SUBFSFAMILY '/pf001'
+                    task derived_param
+                  endfamily
+                  family 02
+                    edit EPSMEMBER '2'
+                    edit MEMBER '2'
+                    edit SUBFSFAMILY '/pf002'
+                    task derived_param
+                  endfamily
+                  family 03
+                    edit EPSMEMBER '3'
+                    edit MEMBER '3'
+                    edit SUBFSFAMILY '/pf003'
+                    task derived_param
+                  endfamily
+                  family 04
+                    edit EPSMEMBER '4'
+                    edit MEMBER '4'
+                    edit SUBFSFAMILY '/pf004'
+                    task derived_param
+                  endfamily
+                endfamily
+              endfamily
+              family cf
+                trigger ../../fc/cf eq complete
+                edit EMOS_TYPE 'cf'
+                task derived_param
+                  edit MEMBER 'off'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  trigger ../../../fc/pf/01 eq complete
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  task derived_param
+                endfamily
+                family 02
+                  trigger ../../../fc/pf/02 eq complete
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  task derived_param
+                endfamily
+                family 03
+                  trigger ../../../fc/pf/03 eq complete
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  task derived_param
+                endfamily
+                family 04
+                  trigger ../../../fc/pf/04 eq complete
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  task derived_param
+                endfamily
+              endfamily
+            endfamily
+            family extra
+              trigger ./dp eq complete
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/fc'
+              edit STEPS '246:768:6'
+              inlimit /emc_36r1/limits:extra
+              family cf
+                edit EMOS_TYPE 'cf'
+                edit EPSFCRES '319'
+                task extrafields
+                  edit FCLENGTH '768'
+                  edit FCLENGTH0 '240'
+                task wm_sfc
+                  trigger extrafields eq complete
+                  edit FCLENGTH '768'
+                task wm_ua
+                  trigger extrafields eq complete and wm_sfc eq complete
+                  edit FCLENGTH '768'
+              endfamily
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 01
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  edit SUBFSFAMILY '/pf001'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 02
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  edit SUBFSFAMILY '/pf002'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 03
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  edit SUBFSFAMILY '/pf003'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+                family 04
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  edit SUBFSFAMILY '/pf004'
+                  edit EPSFCRES '319'
+                  task extrafields
+                    edit FCLENGTH '768'
+                    edit FCLENGTH0 '240'
+                  task wm_sfc
+                    trigger extrafields eq complete
+                    edit FCLENGTH '768'
+                  task wm_ua
+                    trigger extrafields eq complete and wm_sfc eq complete
+                    edit FCLENGTH '768'
+                endfamily
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        task save_logs
+          trigger m2 eq complete and sv eq complete and legA eq complete and legBcpl eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit SCHOST 'localhost'
+      endfamily
+    endfamily
+    family arch
+      edit EMOS_TYPE 'an'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+      edit FSFAMILY 'mars'
+      edit OVERLAP '0'
+      edit YMD '20100114'
+      limit mutex 1
+      inlimit /emc_36r1/limits:mars
+      inlimit /limits:mars
+      family 18
+        trigger ( ../back/18 eq complete)
+        edit DELTA_YEAR '-18'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/18/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 17
+        trigger ( ../back/17 eq complete)
+        edit DELTA_YEAR '-17'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/17/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 16
+        trigger ( ../back/16 eq complete)
+        edit DELTA_YEAR '-16'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/16/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 15
+        trigger ( ../back/15 eq complete)
+        edit DELTA_YEAR '-15'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/15/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 14
+        trigger ( ../back/14 eq complete)
+        edit DELTA_YEAR '-14'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/14/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 13
+        trigger ( ../back/13 eq complete)
+        edit DELTA_YEAR '-13'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/13/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 12
+        trigger ( ../back/12 eq complete)
+        edit DELTA_YEAR '-12'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/12/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 11
+        trigger ( ../back/11 eq complete)
+        edit DELTA_YEAR '-11'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/11/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 10
+        trigger ( ../back/10 eq complete)
+        edit DELTA_YEAR '-10'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/10/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 09
+        trigger ( ../back/09 eq complete)
+        edit DELTA_YEAR '-09'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/09/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 08
+        trigger ( ../back/08 eq complete)
+        edit DELTA_YEAR '-08'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/08/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 07
+        trigger ( ../back/07 eq complete)
+        edit DELTA_YEAR '-07'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/07/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 06
+        trigger ( ../back/06 eq complete)
+        edit DELTA_YEAR '-06'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/06/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 05
+        trigger ( ../back/05 eq complete)
+        edit DELTA_YEAR '-05'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/05/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 04
+        trigger ( ../back/04 eq complete)
+        edit DELTA_YEAR '-04'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/04/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 03
+        trigger ( ../back/03 eq complete)
+        edit DELTA_YEAR '-03'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/03/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 02
+        trigger ( ../back/02 eq complete)
+        edit DELTA_YEAR '-02'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/02/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+      family 01
+        trigger ( ../back/01 eq complete)
+        edit DELTA_YEAR '-01'
+        family legA
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf144
+              edit STEPS '0/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/144/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '150/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf072
+              edit STEPS '0/to/072/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                edit STEPS '006/to/072/by/6'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '078/to/144/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit RUNVARFC '1'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '006/to/144/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legB
+          edit EPSLEG '2'
+          edit EPSWAMNFRE '25'
+          edit EPSWAMNANG '12'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                edit EMOS_TYPE 'pf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 240
+                  edit STEPS '216/222/228/234/240'
+                  edit OVERLAP '1'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 360
+                  edit STEPS '246/to/360/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '240/to/360'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            task cfml
+              edit STEPS '216'
+            family cf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family pf240
+              edit STEPS '216/228/240'
+              edit OVERLAP '1'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf300
+              edit STEPS '246/to/300/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf360
+              edit STEPS '306/to/360/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            task pfml
+              edit STEPS '360'
+            task accum
+              edit STEPS '240'
+              edit OVERLAP '1'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family coupled
+            edit EPSLEG '2'
+            edit OCLEG '2'
+            edit OCEPS '2'
+            edit FCCHUNK '1'
+            edit FCLENGTH '360'
+            edit FCLENGTH0 '216'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+        endfamily
+        family legC
+          edit EPSLEG '3'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit EMOS_TYPE 'an'
+          edit EPSFCRES '255'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family cf
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            edit EMOS_TYPE 'pf'
+            family cf408
+              edit STEPS '366/to/408/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf480
+              edit STEPS '414/to/480/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf600
+              edit STEPS '486/to/600/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf768
+              edit STEPS '606/to/768/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'ENWH'
+                edit EMOS_STREAM 'ENWH'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family postproc
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            edit FCCHUNK '1'
+            edit FCLENGTH '768'
+            inlimit /emc_36r1/limits:postproc
+            family dp
+              edit RUNVARFC '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              edit EMOS_TYPE 'pf'
+              edit STEPS '366/to/768/by/6'
+              family cf
+                edit EMOS_TYPE 'cf'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+                task extra_arc
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit STEPS '360/to/768'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family extra
+              trigger /emc_36r1/hc2/back/01/legBcpl/postproc/extra eq complete
+              edit RUNVARFC '1'
+              task wm_sfc_arc
+                label files ""
+                label info ""
+                event fdb
+              task wm_ua_arc
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family nino
+              edit FCCHUNK '1'
+              edit OCTOTAL '5'
+              edit FCTOTAL '51'
+              edit DAILY '0'
+              edit RUNVARFC '1'
+              edit FCLENGTH1 '360'
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit FCLENGTH '768'
+              edit EPSCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              limit semaphore 10
+              inlimit /limits:linux_cluster
+              inlimit semaphore
+              family 00
+                edit OCGROUP 'an00'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '0'
+                edit MEMBER '0'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 01
+                edit OCGROUP 'an1'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '1'
+                edit MEMBER '1'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 02
+                edit OCGROUP 'an2'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '2'
+                edit MEMBER '2'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 03
+                edit OCGROUP 'an3'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '3'
+                edit MEMBER '3'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+              family 04
+                edit OCGROUP 'an4'
+                edit FCGROUP 'fc0'
+                edit EPSMEMBER '4'
+                edit MEMBER '4'
+                task nino_daily
+                task tcyc
+                  trigger nino_daily eq complete or nino_daily eq aborted
+              endfamily
+            endfamily
+            task tcyctoecfs
+              trigger nino eq complete
+              edit QUEUE 'emos-e'
+              edit QUEUE_EPILOG 'emos-exp'
+              edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+              edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+              edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+              edit LOGDIR '/vol/emos_nc/output'
+              edit SMSOUT '/vol/emos_nc/output'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit EPSCOUPLE '1'
+              edit FCLENGTH '768'
+              inlimit /limits:linux_cluster
+          endfamily
+        endfamily
+        task hc_clean
+          trigger legA eq complete and legB eq complete and legC eq complete
+        task save_logs
+          trigger legA eq complete and legB eq complete and legC eq complete and hc_clean eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+      endfamily
+    endfamily
+    family efi
+      trigger ./back eq complete
+      edit MAXDAY '15'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+      inlimit /emc_36r1/limits:efih
+      family stage
+        edit RETRIEVE 'stage'
+        edit RF_NAME 'all'
+        task prep
+      endfamily
+      family op
+        trigger ./stage eq complete
+        family prep
+          family stage
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit ACC '24'
+            edit EFI_STEP1 '00'
+            edit EFI_STEP2 '24'
+            edit RETRIEVE 'stage'
+            inlimit /limits:linux_cluster
+            family all
+              edit RF_NAME 'all'
+              task prep
+            endfamily
+          endfamily
+          family d0105_24
+            edit EFI_STEP1 '000 012 024 036 048 060 072 084 096'
+            edit EFI_STEP2 '024 036 048 060 072 084 096 108 120'
+            edit ACC '24'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family d0610_24
+            edit EFI_STEP1 '108 120 132 144 168 192 216'
+            edit EFI_STEP2 '132 144 156 168 192 216 240'
+            edit ACC '24'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family nop
+        trigger ./stage eq complete
+        family prep
+          family stage
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit ACC '24'
+            edit EFI_STEP1 '00'
+            edit EFI_STEP2 '24'
+            edit RETRIEVE 'stage'
+            inlimit /limits:linux_cluster
+            family all
+              edit RF_NAME 'all'
+              task prep
+            endfamily
+          endfamily
+          family d0105_24
+            edit EFI_STEP1 '000 012 024 036 048 060 072 084 096'
+            edit EFI_STEP2 '024 036 048 060 072 084 096 108 120'
+            edit ACC '24'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+          family d0610_24
+            edit EFI_STEP1 '108 120 132 144 168 192 216'
+            edit EFI_STEP2 '132 144 156 168 192 216 240'
+            edit ACC '24'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+          family d1115_24
+            edit EFI_STEP1 '240 264 288 312 336'
+            edit EFI_STEP2 '264 288 312 336 360'
+            edit ACC '24'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+          family d0102_06
+            edit EFI_STEP1 '006 012 018 024 030 036 042 048'
+            edit EFI_STEP2 '006 012 018 024 030 036 042 048'
+            edit ACC '0'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+          family d0304_06
+            edit EFI_STEP1 '054 060 066 072 078 084 090 096'
+            edit EFI_STEP2 '054 060 066 072 078 084 090 096'
+            edit ACC '0'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+          family d0506_06
+            edit EFI_STEP1 '102 108 114 120 126 132 138 144'
+            edit EFI_STEP2 '102 108 114 120 126 132 138 144'
+            edit ACC '0'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+          family d0708_06
+            edit EFI_STEP1 '150 156 162 168 174 180 186 192'
+            edit EFI_STEP2 '150 156 162 168 174 180 186 192'
+            edit ACC '0'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+          family d0910_06
+            edit EFI_STEP1 '198 204 210 216 222 228 234 240'
+            edit EFI_STEP2 '198 204 210 216 222 228 234 240'
+            edit ACC '0'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+    endfamily
+    family adm
+      task hindsync
+        trigger ../back eq complete and ../arch eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+        edit NH_WEEKS_KEPT '3'
+        edit BACKUP_HCFDB '0'
+      family fri
+        complete ./fri/compl eq complete and ./fri/dummy eq queued
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+        task dummy
+          cron -w 5 09:00
+        task compl
+          complete ./dummy eq active or ./dummy eq submitted
+          trigger 1 eq 0
+      endfamily
+      family 1to2
+        edit ORIG_FDB_ROOT 'undef'
+        edit DEST_FDB_ROOT 'undef'
+        edit SMSINCLUDE '/home/ma/emos/def/o/include'
+        family chver
+          repeat integer DELTA_YEAR -18 -1
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+          edit VERSION '9906'
+          edit VERSION_TO '9936'
+          edit CHVER_FDB_ROOT '/ma_fdb'
+          edit GENERAT '1'
+          edit CLEANER '0'
+          family enfh
+            edit CHVER_STREAM 'enfh'
+            family 0
+              edit CHVER_TYPE ':0000:[0:]:'
+              task chver
+                label info ""
+            endfamily
+            family 1
+              edit CHVER_TYPE ':0000:1:'
+              task chver
+                label info ""
+            endfamily
+            family 2
+              edit CHVER_TYPE ':0000:2:'
+              task chver
+                label info ""
+            endfamily
+            family 3
+              edit CHVER_TYPE ':0000:3:'
+              task chver
+                label info ""
+            endfamily
+            family 4
+              edit CHVER_TYPE ':0000:4:'
+              task chver
+                label info ""
+            endfamily
+          endfamily
+          family enwh
+            edit CHVER_STREAM 'enwh'
+            task chver
+              label info ""
+          endfamily
+          family efho
+            edit CHVER_STREAM 'efho'
+            task chver
+              label info ""
+          endfamily
+          family ewho
+            edit CHVER_STREAM 'ewho'
+            task chver
+              label info ""
+          endfamily
+          task save_logs
+            trigger enfh eq complete and enwh eq complete and efho eq complete and ewho eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1'
+            edit SCHOST 'localhost'
+        endfamily
+        family arch
+          trigger ./chver:DELTA_YEAR gt ./arch:DELTA_YEAR or ./chver eq complete
+          repeat integer DELTA_YEAR -18 -1
+          edit EMOS_TYPE 'an'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit VERSION '9936'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family legA
+            family cf
+              edit EMOS_TYPE 'cf'
+              edit NUMBER '0'
+              family cf144
+                edit STEPS '0/to/144/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  edit STEPS '006/to/144/by/6'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf240
+                edit STEPS '150/to/240/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family pf
+              edit EMOS_TYPE 'pf'
+              family pf072
+                edit STEPS '0/to/072/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  edit STEPS '006/to/072/by/6'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf144
+                edit STEPS '078/to/144/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf192
+                edit STEPS '150/to/192/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf240
+                edit STEPS '198/to/240/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfml
+                  edit STEPS '216'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family postproc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit RUNVARFC '1'
+              inlimit /emc_36r1/limits:postproc
+              family dp
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 144
+                    edit STEPS '006/to/144/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 240
+                    edit STEPS '150/to/240/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '0/to/240'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  family 144
+                    edit STEPS '006/to/144/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 240
+                    edit STEPS '150/to/240/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '0/to/240'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+              endfamily
+            endfamily
+            family coupled
+              trigger ./cf eq complete and ./pf eq complete
+              edit EPSLEG '1'
+              edit OCLEG '1'
+              edit OCEPS '1'
+              edit FCCHUNK '1'
+              edit FCLENGTH '240'
+              edit FCLENGTH0 '0'
+              edit OCEPSTOT '3'
+              edit FCTOTAL '51'
+              edit RUNVARFC '1'
+              edit EPSCOUPLE '1'
+              edit RUNCOUPLE '0'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              inlimit /emc_36r1/lag/ref/00:mutex
+              task preparcoce
+              task arcfc
+                trigger preparcoce eq complete
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family legB
+            edit EPSLEG '2'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            inlimit /emc_36r1/limits:mars
+            inlimit /limits:mars
+            family postproc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              inlimit /emc_36r1/limits:postproc
+              family dp
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 240
+                    edit STEPS '216/222/228/234/240'
+                    edit OVERLAP '1'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 360
+                    edit STEPS '246/to/360/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '240/to/360'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  family 240
+                    edit STEPS '216/222/228/234/240'
+                    edit OVERLAP '1'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 360
+                    edit STEPS '246/to/360/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '240/to/360'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+              endfamily
+            endfamily
+            family cf
+              edit EMOS_TYPE 'cf'
+              edit NUMBER '0'
+              task cfml
+                edit STEPS '216'
+              family cf240
+                edit STEPS '216/228/240'
+                edit OVERLAP '1'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf300
+                edit STEPS '246/to/300/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf360
+                edit STEPS '306/to/360/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task accum
+                edit STEPS '240'
+                edit OVERLAP '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf
+              edit EMOS_TYPE 'pf'
+              family pf240
+                edit STEPS '216/228/240'
+                edit OVERLAP '1'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf300
+                edit STEPS '246/to/300/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf360
+                edit STEPS '306/to/360/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task pfml
+                edit STEPS '360'
+              task accum
+                edit STEPS '240'
+                edit OVERLAP '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family coupled
+              edit EPSLEG '2'
+              edit OCLEG '2'
+              edit OCEPS '2'
+              edit FCCHUNK '1'
+              edit FCLENGTH '360'
+              edit FCLENGTH0 '216'
+              edit OCEPSTOT '3'
+              edit FCTOTAL '51'
+              edit RUNVARFC '1'
+              edit EPSCOUPLE '1'
+              edit RUNCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              inlimit /emc_36r1/lag/ref/00:mutex
+              task preparcoce
+              task arcfc
+                trigger preparcoce eq complete
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family legC
+            edit EPSLEG '3'
+            edit FSFAMILY 'mars'
+            edit OVERLAP '0'
+            edit EMOS_TYPE 'an'
+            edit EPSFCRES '255'
+            inlimit /emc_36r1/limits:mars
+            inlimit /limits:mars
+            family cf
+              edit EMOS_TYPE 'cf'
+              edit NUMBER '0'
+              family cf408
+                edit STEPS '366/to/408/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf480
+                edit STEPS '414/to/480/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf600
+                edit STEPS '486/to/600/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf768
+                edit STEPS '606/to/768/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family pf
+              edit EMOS_TYPE 'pf'
+              family cf408
+                edit STEPS '366/to/408/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf480
+                edit STEPS '414/to/480/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf600
+                edit STEPS '486/to/600/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf768
+                edit STEPS '606/to/768/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family postproc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit FCCHUNK '1'
+              edit FCLENGTH '768'
+              inlimit /emc_36r1/limits:postproc
+              family dp
+                trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+                edit RUNVARFC '1'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+                edit EMOS_TYPE 'pf'
+                edit STEPS '366/to/768/by/6'
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                  task extra_arc
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit STEPS '360/to/768'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family pf
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                  task extra_arc
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit STEPS '360/to/768'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+              endfamily
+              family extra
+                trigger /emc_36r1/hc2/back/01/legBcpl/postproc/extra eq complete
+                edit RUNVARFC '1'
+                task wm_sfc_arc
+                  label files ""
+                  label info ""
+                  event fdb
+                task wm_ua_arc
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family nino
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                edit FCLENGTH1 '360'
+                edit QUEUE 'emos-e'
+                edit QUEUE_EPILOG 'emos-exp'
+                edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+                edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+                edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+                edit LOGDIR '/vol/emos_nc/output'
+                edit SMSOUT '/vol/emos_nc/output'
+                edit FCLENGTH '768'
+                edit EPSCOUPLE '1'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                limit semaphore 10
+                inlimit /limits:linux_cluster
+                inlimit semaphore
+                family 00
+                  edit OCGROUP 'an00'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '0'
+                  edit MEMBER '0'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 01
+                  edit OCGROUP 'an1'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 02
+                  edit OCGROUP 'an2'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 03
+                  edit OCGROUP 'an3'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 04
+                  edit OCGROUP 'an4'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+              endfamily
+              task tcyctoecfs
+                trigger nino eq complete
+                edit QUEUE 'emos-e'
+                edit QUEUE_EPILOG 'emos-exp'
+                edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+                edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+                edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+                edit LOGDIR '/vol/emos_nc/output'
+                edit SMSOUT '/vol/emos_nc/output'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                edit EPSCOUPLE '1'
+                edit FCLENGTH '768'
+                inlimit /limits:linux_cluster
+            endfamily
+          endfamily
+          task save_logs
+            trigger legA eq complete and legB eq complete and legC eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1'
+            edit SCHOST 'localhost'
+        endfamily
+        family clean
+          task chver
+            trigger ../arch eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            edit GENERAT '0'
+            edit CLEANER '1'
+        endfamily
+      endfamily
+      family eto1
+        trigger ./1to2 eq complete
+        edit ORIG_FDB_ROOT 'undef'
+        edit DEST_FDB_ROOT 'undef'
+        family chver
+          repeat integer DELTA_YEAR -18 -1
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+          edit VERSION '0046'
+          edit VERSION_TO '9906'
+          edit CHVER_FDB_ROOT '/ma_fdb'
+          edit GENERAT '1'
+          edit CLEANER '0'
+          family enfh
+            edit CHVER_STREAM 'enfh'
+            family 0
+              edit CHVER_TYPE ':0000:[0:]:'
+              task chver
+                label info ""
+            endfamily
+            family 1
+              edit CHVER_TYPE ':0000:1:'
+              task chver
+                label info ""
+            endfamily
+            family 2
+              edit CHVER_TYPE ':0000:2:'
+              task chver
+                label info ""
+            endfamily
+            family 3
+              edit CHVER_TYPE ':0000:3:'
+              task chver
+                label info ""
+            endfamily
+            family 4
+              edit CHVER_TYPE ':0000:4:'
+              task chver
+                label info ""
+            endfamily
+          endfamily
+          family enwh
+            edit CHVER_STREAM 'enwh'
+            task chver
+              label info ""
+          endfamily
+          family efho
+            edit CHVER_STREAM 'efho'
+            task chver
+              label info ""
+          endfamily
+          family ewho
+            edit CHVER_STREAM 'ewho'
+            task chver
+              label info ""
+          endfamily
+          task save_logs
+            trigger enfh eq complete and enwh eq complete and efho eq complete and ewho eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1'
+            edit SCHOST 'localhost'
+        endfamily
+        family arch
+          trigger ./chver:DELTA_YEAR gt ./arch:DELTA_YEAR or ./chver eq complete
+          repeat integer DELTA_YEAR -18 -1
+          edit EMOS_TYPE 'an'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          edit FSFAMILY 'mars'
+          edit OVERLAP '0'
+          edit VERSION '9906'
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family legA
+            family cf
+              edit EMOS_TYPE 'cf'
+              edit NUMBER '0'
+              family cf144
+                edit STEPS '0/to/144/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  edit STEPS '006/to/144/by/6'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf240
+                edit STEPS '150/to/240/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family pf
+              edit EMOS_TYPE 'pf'
+              family pf072
+                edit STEPS '0/to/072/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  edit STEPS '006/to/072/by/6'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf144
+                edit STEPS '078/to/144/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf192
+                edit STEPS '150/to/192/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf240
+                edit STEPS '198/to/240/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfml
+                  edit STEPS '216'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family postproc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit RUNVARFC '1'
+              inlimit /emc_36r1/limits:postproc
+              family dp
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 144
+                    edit STEPS '006/to/144/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 240
+                    edit STEPS '150/to/240/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '0/to/240'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  family 144
+                    edit STEPS '006/to/144/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 240
+                    edit STEPS '150/to/240/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '0/to/240'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+              endfamily
+            endfamily
+            family coupled
+              trigger ./cf eq complete and ./pf eq complete
+              edit EPSLEG '1'
+              edit OCLEG '1'
+              edit OCEPS '1'
+              edit FCCHUNK '1'
+              edit FCLENGTH '240'
+              edit FCLENGTH0 '0'
+              edit OCEPSTOT '3'
+              edit FCTOTAL '51'
+              edit RUNVARFC '1'
+              edit EPSCOUPLE '1'
+              edit RUNCOUPLE '0'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              inlimit /emc_36r1/lag/ref/00:mutex
+              task preparcoce
+              task arcfc
+                trigger preparcoce eq complete
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family legB
+            edit EPSLEG '2'
+            edit EPSWAMNFRE '25'
+            edit EPSWAMNANG '12'
+            inlimit /emc_36r1/limits:mars
+            inlimit /limits:mars
+            family postproc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              inlimit /emc_36r1/limits:postproc
+              family dp
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+                family pf
+                  edit EMOS_TYPE 'pf'
+                  family 240
+                    edit STEPS '216/222/228/234/240'
+                    edit OVERLAP '1'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 360
+                    edit STEPS '246/to/360/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '240/to/360'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  family 240
+                    edit STEPS '216/222/228/234/240'
+                    edit OVERLAP '1'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  family 360
+                    edit STEPS '246/to/360/by/6'
+                    task derivedp
+                      label files ""
+                      label info ""
+                      event fdb
+                  endfamily
+                  task extra_arc
+                    edit STEPS '240/to/360'
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit RUNVARFC '1'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+              endfamily
+            endfamily
+            family cf
+              edit EMOS_TYPE 'cf'
+              edit NUMBER '0'
+              task cfml
+                edit STEPS '216'
+              family cf240
+                edit STEPS '216/228/240'
+                edit OVERLAP '1'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf300
+                edit STEPS '246/to/300/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf360
+                edit STEPS '306/to/360/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task accum
+                edit STEPS '240'
+                edit OVERLAP '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf
+              edit EMOS_TYPE 'pf'
+              family pf240
+                edit STEPS '216/228/240'
+                edit OVERLAP '1'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf300
+                edit STEPS '246/to/300/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf360
+                edit STEPS '306/to/360/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task pfml
+                edit STEPS '360'
+              task accum
+                edit STEPS '240'
+                edit OVERLAP '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family coupled
+              edit EPSLEG '2'
+              edit OCLEG '2'
+              edit OCEPS '2'
+              edit FCCHUNK '1'
+              edit FCLENGTH '360'
+              edit FCLENGTH0 '216'
+              edit OCEPSTOT '3'
+              edit FCTOTAL '51'
+              edit RUNVARFC '1'
+              edit EPSCOUPLE '1'
+              edit RUNCOUPLE '1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              inlimit /emc_36r1/lag/ref/00:mutex
+              task preparcoce
+              task arcfc
+                trigger preparcoce eq complete
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family legC
+            edit EPSLEG '3'
+            edit FSFAMILY 'mars'
+            edit OVERLAP '0'
+            edit EMOS_TYPE 'an'
+            edit EPSFCRES '255'
+            inlimit /emc_36r1/limits:mars
+            inlimit /limits:mars
+            family cf
+              edit EMOS_TYPE 'cf'
+              edit NUMBER '0'
+              family cf408
+                edit STEPS '366/to/408/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf480
+                edit STEPS '414/to/480/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf600
+                edit STEPS '486/to/600/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf768
+                edit STEPS '606/to/768/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family pf
+              edit EMOS_TYPE 'pf'
+              family cf408
+                edit STEPS '366/to/408/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf480
+                edit STEPS '414/to/480/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf600
+                edit STEPS '486/to/600/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family pf768
+                edit STEPS '606/to/768/by/6'
+                task pfpl
+                  inlimit /emc_36r1/limits:pl
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfsfc
+                  trigger ../../postproc/dp eq complete
+                  inlimit /emc_36r1/limits:sfc
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfil
+                  label files ""
+                  label info ""
+                  event fdb
+                task pfwv
+                  edit STREAM 'ENWH'
+                  edit EMOS_STREAM 'ENWH'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family postproc
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+              edit FCCHUNK '1'
+              edit FCLENGTH '768'
+              inlimit /emc_36r1/limits:postproc
+              family dp
+                trigger /emc_36r1/00/legC/postproc/dp eq complete and /emc_36r1/00/legC/postproc/extra eq complete
+                edit RUNVARFC '1'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+                edit EMOS_TYPE 'pf'
+                edit STEPS '366/to/768/by/6'
+                family cf
+                  edit EMOS_TYPE 'cf'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                  task extra_arc
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit STEPS '360/to/768'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family pf
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                  task extra_arc
+                    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                    edit STEPS '360/to/768'
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+              endfamily
+              family extra
+                trigger /emc_36r1/hc2/back/01/legBcpl/postproc/extra eq complete
+                edit RUNVARFC '1'
+                task wm_sfc_arc
+                  label files ""
+                  label info ""
+                  event fdb
+                task wm_ua_arc
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family nino
+                edit FCCHUNK '1'
+                edit OCTOTAL '5'
+                edit FCTOTAL '51'
+                edit DAILY '0'
+                edit RUNVARFC '1'
+                edit FCLENGTH1 '360'
+                edit QUEUE 'emos-e'
+                edit QUEUE_EPILOG 'emos-exp'
+                edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+                edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+                edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+                edit LOGDIR '/vol/emos_nc/output'
+                edit SMSOUT '/vol/emos_nc/output'
+                edit FCLENGTH '768'
+                edit EPSCOUPLE '1'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                limit semaphore 10
+                inlimit /limits:linux_cluster
+                inlimit semaphore
+                family 00
+                  edit OCGROUP 'an00'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '0'
+                  edit MEMBER '0'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 01
+                  edit OCGROUP 'an1'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '1'
+                  edit MEMBER '1'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 02
+                  edit OCGROUP 'an2'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '2'
+                  edit MEMBER '2'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 03
+                  edit OCGROUP 'an3'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '3'
+                  edit MEMBER '3'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+                family 04
+                  edit OCGROUP 'an4'
+                  edit FCGROUP 'fc0'
+                  edit EPSMEMBER '4'
+                  edit MEMBER '4'
+                  task nino_daily
+                  task tcyc
+                    trigger nino_daily eq complete or nino_daily eq aborted
+                endfamily
+              endfamily
+              task tcyctoecfs
+                trigger nino eq complete
+                edit QUEUE 'emos-e'
+                edit QUEUE_EPILOG 'emos-exp'
+                edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+                edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+                edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+                edit LOGDIR '/vol/emos_nc/output'
+                edit SMSOUT '/vol/emos_nc/output'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                edit EPSCOUPLE '1'
+                edit FCLENGTH '768'
+                inlimit /limits:linux_cluster
+            endfamily
+          endfamily
+          task save_logs
+            trigger legA eq complete and legB eq complete and legC eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1'
+            edit SCHOST 'localhost'
+        endfamily
+        family clean
+          task chver
+            trigger ../arch eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            edit GENERAT '0'
+            edit CLEANER '1'
+        endfamily
+      endfamily
+    endfamily
+    task stage_pp
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      late -s +00:05 -c +00:25
+      trigger logfilestore eq complete and back eq complete and arch eq complete and efi eq complete and adm eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+  family lag
+    repeat date YMD 20091003 20121212 1
+    edit EMOS_TYPE 'an'
+    edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+    edit FSFAMILY 'mars'
+    edit OVERLAP '0'
+    edit LOGTASK 'lag'
+    edit MARS_DB 'marsod'
+    family ref
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+      family 12
+        edit EMOS_BASE '12'
+        limit mutex 1
+        task events
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+          edit HINDCAST '1'
+          edit ONLY_CF '0'
+          event noefi
+          event 240 
+          event 360 
+          event cpl
+          event 768 
+          event cf
+      endfamily
+      family 00
+        edit DELTA_DAY '1'
+        edit EMOS_BASE '00'
+        limit mutex 1
+        task events
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+          edit HINDCAST '1'
+          edit ONLY_CF '0'
+          event noefi
+          event 240 
+          event 360 
+          event cpl
+          event 768 
+          event cf
+      endfamily
+      task smove
+        trigger /emc_36r1/lag/12 eq complete
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/system'
+      family loop
+        task dummy
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit WSHOST 'localhost'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          time 12:45
+      endfamily
+      family warn
+        trigger ./loop eq complete
+        task dummy
+          complete /emc_36r1/lag/logfiles eq complete
+          time 16:00
+      endfamily
+      task checkarchive
+        trigger /emc_36r1/main/make eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1'
+        edit FSFAMILY 'mars'
+        edit EMOS_TYPE 'an'
+        edit OSTREAM 'WEOV EFOV'
+        edit HSTREAM 'EFHO EFHS ENFH ENWH EWHO'
+        inlimit /limits:linux_cluster
+        label info "none"
+    endfamily
+    family 12
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD)
+      edit DELTA_DAY '0'
+      edit EMOS_BASE '12'
+      family legA
+        trigger /emc_36r1/lag/ref/12/events eq complete
+        edit EPSWAMNFRE '30'
+        edit EPSWAMNANG '24'
+        family init
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/ref/an eq complete)
+          edit FSFAMILY 'mc'
+          task rmfdb
+        endfamily
+        family tc
+          complete /emc_36r1/lag/ref/12/events:cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/postproc/tc eq complete)
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          edit FSFAMILY 'mc'
+          task clean
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/tc'
+          task to_ecfs
+            label files ""
+            label info ""
+            event fdb
+          task to_mars
+            trigger to_ecfs eq complete
+        endfamily
+        family archive
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/postproc eq complete) and /emc_36r1/lag/ref/12/events eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                complete /emc_36r1/lag/ref/12/events:cf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '0/to/144/by/3'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '0/to/144/by/3'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family cluster
+              complete /emc_36r1/lag/ref/12/events:cf
+              edit STEPS '72/84/96/108/120/132/144/156/168'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family a
+                edit DOMAIN 'a'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family b
+                trigger ./a eq complete
+                edit DOMAIN 'b'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family c
+                trigger ./b eq complete
+                edit DOMAIN 'c'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family d
+                trigger ./c eq complete
+                edit DOMAIN 'd'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family e
+                trigger ./d eq complete
+                edit DOMAIN 'e'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family ensms
+              complete /emc_36r1/lag/ref/12/events:cf
+              edit STEPS '3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/75/78/81/84/87/90/93/96/99/102/105/108/111/114/117/120/123/126/129/132/135/138/141/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+              task mean
+                edit TYPE 'em'
+                label files ""
+                label info ""
+                event fdb
+              task stdev
+                edit TYPE 'es'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family prob
+              complete /emc_36r1/lag/ref/12/events:cf
+              family 2t
+                edit PARAM '2t'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family swp_mwp
+                edit PARAM 'swp_mwp'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family 10fg
+                edit PARAM '10fg'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family ff
+                edit PARAM 'ff'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family rain
+                edit PARAM 'rain'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family t850
+                edit PARAM 't850'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family efi
+              complete ( /emc_36r1/main/ref/12/events:cf) or ( /emc_36r1/main/ref/12/events:noefi)
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/postproc eq complete)
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family 2t
+                edit RF_NAME '2t'
+                task efi
+                  label info ""
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task efi
+                  label info ""
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task efi
+                  label info ""
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task efi
+                  label info ""
+              endfamily
+            endfamily
+          endfamily
+          family cf
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/fc/cf eq complete)
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf036
+              edit STEPS '0/to/36/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf072
+              edit STEPS '39/to/72/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf108
+              edit STEPS '075/to/108/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf144
+              edit STEPS '111/to/144/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf180
+              edit STEPS '150/to/180/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '186/to/240/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family cv
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/fc/cv eq complete)
+            edit EMOS_TYPE 'cv'
+            edit NUMBER '1/2'
+            family cv036
+              edit STEPS '0/to/036/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv072
+              edit STEPS '039/to/072/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv108
+              edit STEPS '075/to/108/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv144
+              edit STEPS '111/to/144/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv180
+              edit STEPS '150/to/180/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv240
+              edit STEPS '186/to/240/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv300
+              edit STEPS '246/to/300/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv360
+              edit STEPS '306/to/360/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            complete /emc_36r1/lag/ref/12/events:cf
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/fc/pf eq complete and /emc_36r1/lag/ref/12/events eq complete)
+            edit EMOS_TYPE 'pf'
+            family pf024
+              edit STEPS '0/to/024/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf048
+              edit STEPS '027/to/048/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf072
+              edit STEPS '051/to/072/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf096
+              edit STEPS '075/to/096/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf120
+              edit STEPS '099/to/120/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '123/to/144/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family icp
+            complete /emc_36r1/lag/ref/12/events:cf
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/fc eq complete)
+            edit ARCHTYPE 'icp'
+            task ml
+              edit FCLENGTH '240'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          task flush
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legA/fc eq complete)
+            edit STREAM 'enfo'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family ecfs
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/sv eq complete and /emc_36r1/main/12/legA/fc eq complete)
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit FSFAMILY 'mc'
+          task svsave
+          task save
+        endfamily
+      endfamily
+      family legB
+        complete /emc_36r1/lag/ref/12/events:240
+        edit EPSLEG '2'
+        edit EPSWAMNFRE '25'
+        edit EPSWAMNANG '12'
+        inlimit /emc_36r1/limits:mars
+        inlimit /limits:mars
+        family postproc
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legB/postproc eq complete) and /emc_36r1/lag/ref/12/events eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+          inlimit /emc_36r1/limits:postproc
+          family ensms
+            complete /emc_36r1/lag/ref/12/events:cf
+            family 360
+              edit STEPS '246/to/360/by/6'
+              task mean
+                edit TYPE 'em'
+                label files ""
+                label info ""
+                event fdb
+              task stdev
+                edit TYPE 'es'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family prob
+            complete /emc_36r1/lag/ref/12/events:cf
+            family 2t
+              edit PARAM '2t'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family swp_mwp
+              edit PARAM 'swp_mwp'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family 10fg
+              edit PARAM '10fg'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family ff
+              edit PARAM 'ff'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family rain
+              edit PARAM 'rain'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family t850
+              edit PARAM 't850'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family dp
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+            family pf
+              complete /emc_36r1/lag/ref/12/events:cf
+              edit EMOS_TYPE 'pf'
+              family 240
+                edit STEPS '216/222/228/234/240'
+                edit OVERLAP '1'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family 360
+                edit STEPS '246/to/360/by/6'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task extra_arc
+                edit STEPS '240/to/360'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                edit RUNVARFC '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf
+              edit EMOS_TYPE 'cf'
+              family 240
+                edit STEPS '216/222/228/234/240'
+                edit OVERLAP '1'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family 360
+                edit STEPS '246/to/360/by/6'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task extra_arc
+                edit STEPS '240/to/360'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                edit RUNVARFC '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family efi
+            complete ( /emc_36r1/main/ref/12/events:cf) or ( /emc_36r1/main/ref/12/events:noefi)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+        endfamily
+        family cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legB/fc/cf eq complete)
+          edit EMOS_TYPE 'cf'
+          edit NUMBER '0'
+          family cf240
+            edit STEPS '216/228/240'
+            edit OVERLAP '1'
+            task cfml
+              label files ""
+              label info ""
+              event fdb
+            task cfpl
+              label files ""
+              label info ""
+              event fdb
+            task cfsfc
+              label files ""
+              label info ""
+              event fdb
+            task cfil
+              label files ""
+              label info ""
+              event fdb
+            task cfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family cf300
+            edit STEPS '246/to/300/by/6'
+            task cfml
+              label files ""
+              label info ""
+              event fdb
+            task cfpl
+              label files ""
+              label info ""
+              event fdb
+            task cfsfc
+              label files ""
+              label info ""
+              event fdb
+            task cfil
+              label files ""
+              label info ""
+              event fdb
+            task cfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family cf360
+            edit STEPS '306/to/360/by/6'
+            task cfml
+              label files ""
+              label info ""
+              event fdb
+            task cfpl
+              label files ""
+              label info ""
+              event fdb
+            task cfsfc
+              label files ""
+              label info ""
+              event fdb
+            task cfil
+              label files ""
+              label info ""
+              event fdb
+            task cfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          task accum
+            edit STEPS '240'
+            edit OVERLAP '1'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family pf
+          complete /emc_36r1/lag/ref/12/events:cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/12/legB/fc/pf eq complete and /emc_36r1/lag/ref/12/events eq complete)
+          edit EMOS_TYPE 'pf'
+          family pf240
+            edit STEPS '216/228/240'
+            edit OVERLAP '1'
+            task pfpl
+              inlimit /emc_36r1/limits:pl
+              label files ""
+              label info ""
+              event fdb
+            task pfsfc
+              trigger ../../postproc/dp eq complete
+              inlimit /emc_36r1/limits:sfc
+              label files ""
+              label info ""
+              event fdb
+            task pfil
+              label files ""
+              label info ""
+              event fdb
+            task pfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf300
+            edit STEPS '246/to/300/by/6'
+            task pfpl
+              inlimit /emc_36r1/limits:pl
+              label files ""
+              label info ""
+              event fdb
+            task pfsfc
+              trigger ../../postproc/dp eq complete
+              inlimit /emc_36r1/limits:sfc
+              label files ""
+              label info ""
+              event fdb
+            task pfil
+              label files ""
+              label info ""
+              event fdb
+            task pfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf360
+            edit STEPS '306/to/360/by/6'
+            task pfpl
+              inlimit /emc_36r1/limits:pl
+              label files ""
+              label info ""
+              event fdb
+            task pfsfc
+              trigger ../../postproc/dp eq complete
+              inlimit /emc_36r1/limits:sfc
+              label files ""
+              label info ""
+              event fdb
+            task pfil
+              label files ""
+              label info ""
+              event fdb
+            task pfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          task pfml
+            edit STEPS '360'
+          task accum
+            edit STEPS '240'
+            edit OVERLAP '1'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+      endfamily
+    endfamily
+    family 00
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD)
+      edit DELTA_DAY '1'
+      edit EMOS_BASE '00'
+      edit QUEUE 'os'
+      family legA
+        trigger /emc_36r1/lag/ref/00/events eq complete
+        edit EPSWAMNFRE '30'
+        edit EPSWAMNANG '24'
+        family init
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/ref/an eq complete)
+          edit FSFAMILY 'mc'
+          task rmfdb
+        endfamily
+        family tc
+          complete /emc_36r1/lag/ref/00/events:cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/postproc/tc eq complete)
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          edit FSFAMILY 'mc'
+          task clean
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/tc'
+          task to_ecfs
+            label files ""
+            label info ""
+            event fdb
+          task to_mars
+            trigger to_ecfs eq complete
+        endfamily
+        family archive
+          inlimit /emc_36r1/limits:mars
+          inlimit /limits:mars
+          family postproc
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/postproc eq complete) and /emc_36r1/lag/ref/00/events eq complete
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            family dp
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family pf
+                complete /emc_36r1/lag/ref/00/events:cf
+                edit EMOS_TYPE 'pf'
+                family 144
+                  edit STEPS '0/to/144/by/3'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family cf
+                edit EMOS_TYPE 'cf'
+                family 144
+                  edit STEPS '0/to/144/by/3'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                family 240
+                  edit STEPS '150/to/240/by/6'
+                  task derivedp
+                    label files ""
+                    label info ""
+                    event fdb
+                endfamily
+                task extra_arc
+                  edit STEPS '0/to/240'
+                  edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                  edit RUNVARFC '1'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family cluster
+              complete /emc_36r1/lag/ref/00/events:cf
+              edit STEPS '72/84/96/108/120/132/144/156/168'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family a
+                edit DOMAIN 'a'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family b
+                trigger ./a eq complete
+                edit DOMAIN 'b'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family c
+                trigger ./b eq complete
+                edit DOMAIN 'c'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family d
+                trigger ./c eq complete
+                edit DOMAIN 'd'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family e
+                trigger ./d eq complete
+                edit DOMAIN 'e'
+                task cmpl
+                  edit TYPE 'cm'
+                  label files ""
+                  label info ""
+                  event fdb
+                task cspl
+                  edit TYPE 'cs'
+                  label files ""
+                  label info ""
+                  event fdb
+                task tube
+                  edit STEPS '48/72/96/120/144/168/192/216/240'
+                  edit REFERENCE '96/144/168/192/240'
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family reord
+              complete /emc_36r1/lag/ref/00/events:cf
+              edit EPSCOUPLE '1'
+              edit EMOS_TYPE 'pf'
+              edit FCLENGTH0 '0'
+              edit FCLENGTH '240'
+              edit EPSFCRES '639'
+              edit FCCHUNK '1'
+              edit STEP1 '0'
+              edit STEP2 '240'
+              edit STEPS '-1'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+              limit reord 1
+              inlimit reord
+              label info ""
+              family 130
+                edit GENERATE '1'
+                edit ARCHIVE '0'
+                edit PARAMS '130.128'
+                task reord
+                  label info ""
+              endfamily
+              family 228
+                edit GENERATE '1'
+                edit ARCHIVE '0'
+                edit PARAMS '228.128'
+                task reord
+                  label info ""
+              endfamily
+              family 207
+                edit GENERATE '1'
+                edit ARCHIVE '0'
+                edit PARAMS '207.128'
+                task reord
+                  label info ""
+              endfamily
+              family 167
+                edit GENERATE '1'
+                edit ARCHIVE '0'
+                edit PARAMS '167.128'
+                task reord
+                  label info ""
+              endfamily
+              family 164
+                edit GENERATE '1'
+                edit ARCHIVE '0'
+                edit PARAMS '164.128'
+                task reord
+                  label info ""
+              endfamily
+              family arch
+                trigger ./130 eq complete and ./228 eq complete and ./207 eq complete and ./167 eq complete and ./164 eq complete
+                edit GENERATE '0'
+                edit ARCHIVE '1'
+                inlimit /emc_36r1/lag/ref/00:mutex
+                task reord
+                  label info ""
+              endfamily
+            endfamily
+            family ensms
+              complete /emc_36r1/lag/ref/00/events:cf
+              edit STEPS '3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/75/78/81/84/87/90/93/96/99/102/105/108/111/114/117/120/123/126/129/132/135/138/141/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+              task mean
+                edit TYPE 'em'
+                label files ""
+                label info ""
+                event fdb
+              task stdev
+                edit TYPE 'es'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family prob
+              complete /emc_36r1/lag/ref/00/events:cf
+              family 2t
+                edit PARAM '2t'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family swp_mwp
+                edit PARAM 'swp_mwp'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family 10fg
+                edit PARAM '10fg'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family ff
+                edit PARAM 'ff'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family rain
+                edit PARAM 'rain'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family t850
+                edit PARAM 't850'
+                task arc_prob
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+            endfamily
+            family efi
+              complete ( /emc_36r1/main/ref/00/events:cf) or ( /emc_36r1/main/ref/00/events:noefi)
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/postproc eq complete)
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+              family 2t
+                edit RF_NAME '2t'
+                task efi
+                  label info ""
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task efi
+                  label info ""
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task efi
+                  label info ""
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task efi
+                  label info ""
+              endfamily
+            endfamily
+          endfamily
+          family coupled
+            complete ( /emc_36r1/lag/ref/00/events:cf or /emc_36r1/lag/ref/00/events:360) or ( /emc_36r1/lag/ref/00/events eq complete and not /emc_36r1/lag/ref/00/events:cpl)
+            trigger ./cf eq complete and ./pf eq complete
+            edit EPSLEG '1'
+            edit OCLEG '1'
+            edit OCEPS '1'
+            edit FCCHUNK '1'
+            edit FCLENGTH '240'
+            edit FCLENGTH0 '0'
+            edit OCEPSTOT '3'
+            edit FCTOTAL '51'
+            edit RUNVARFC '1'
+            edit EPSCOUPLE '1'
+            edit RUNCOUPLE '0'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+            inlimit /emc_36r1/lag/ref/00:mutex
+            task preparcoce
+            task arcfc
+              trigger preparcoce eq complete
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family cf
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/fc/cf eq complete)
+            edit EMOS_TYPE 'cf'
+            edit NUMBER '0'
+            family cf036
+              edit STEPS '0/to/36/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf072
+              edit STEPS '39/to/72/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf108
+              edit STEPS '075/to/108/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf144
+              edit STEPS '111/to/144/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf180
+              edit STEPS '150/to/180/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf240
+              edit STEPS '186/to/240/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family cv
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/fc/cv eq complete)
+            edit EMOS_TYPE 'cv'
+            edit NUMBER '1/2'
+            family cv036
+              edit STEPS '0/to/036/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv072
+              edit STEPS '039/to/072/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv108
+              edit STEPS '075/to/108/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv144
+              edit STEPS '111/to/144/by/3'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv180
+              edit STEPS '150/to/180/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv240
+              edit STEPS '186/to/240/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv300
+              edit STEPS '246/to/300/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cv360
+              edit STEPS '306/to/360/by/6'
+              task cfml
+                label files ""
+                label info ""
+                event fdb
+              task cfpl
+                label files ""
+                label info ""
+                event fdb
+              task cfsfc
+                trigger ../../postproc/dp eq complete
+                label files ""
+                label info ""
+                event fdb
+              task cfil
+                label files ""
+                label info ""
+                event fdb
+              task cfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task derivedp
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family pf
+            complete /emc_36r1/lag/ref/00/events:cf
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/fc/pf eq complete and /emc_36r1/lag/ref/00/events eq complete)
+            edit EMOS_TYPE 'pf'
+            family pf024
+              edit STEPS '0/to/024/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf048
+              edit STEPS '027/to/048/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf072
+              edit STEPS '051/to/072/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf096
+              edit STEPS '075/to/096/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf120
+              edit STEPS '099/to/120/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf144
+              edit STEPS '123/to/144/by/3'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf192
+              edit STEPS '150/to/192/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family pf240
+              edit STEPS '198/to/240/by/6'
+              task pfpl
+                inlimit /emc_36r1/limits:pl
+                label files ""
+                label info ""
+                event fdb
+              task pfsfc
+                trigger ../../postproc/dp eq complete
+                inlimit /emc_36r1/limits:sfc
+                label files ""
+                label info ""
+                event fdb
+              task pfil
+                label files ""
+                label info ""
+                event fdb
+              task pfwv
+                edit STREAM 'WAEF'
+                edit EMOS_STREAM 'WAEF'
+                label files ""
+                label info ""
+                event fdb
+              task pfml
+                edit STEPS '216'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family icp
+            complete /emc_36r1/lag/ref/00/events:cf
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/fc eq complete)
+            edit ARCHTYPE 'icp'
+            task ml
+              edit FCLENGTH '240'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          task flush
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legA/fc eq complete)
+            edit STREAM 'enfo'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family ecfs
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/sv eq complete and /emc_36r1/main/00/legA/fc eq complete)
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/sv'
+          edit FSFAMILY 'mc'
+          task svsave
+          task save
+        endfamily
+      endfamily
+      family legB
+        complete /emc_36r1/lag/ref/00/events:240
+        edit EPSLEG '2'
+        edit EPSWAMNFRE '25'
+        edit EPSWAMNANG '12'
+        inlimit /emc_36r1/limits:mars
+        inlimit /limits:mars
+        family postproc
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legB/postproc eq complete) and /emc_36r1/lag/ref/00/events eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+          inlimit /emc_36r1/limits:postproc
+          family ensms
+            complete /emc_36r1/lag/ref/00/events:cf
+            family 360
+              edit STEPS '246/to/360/by/6'
+              task mean
+                edit TYPE 'em'
+                label files ""
+                label info ""
+                event fdb
+              task stdev
+                edit TYPE 'es'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family prob
+            complete /emc_36r1/lag/ref/00/events:cf
+            family 2t
+              edit PARAM '2t'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family swp_mwp
+              edit PARAM 'swp_mwp'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family 10fg
+              edit PARAM '10fg'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family ff
+              edit PARAM 'ff'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family rain
+              edit PARAM 'rain'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family t850
+              edit PARAM 't850'
+              task arc_prob
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family dp
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+            family pf
+              complete /emc_36r1/lag/ref/00/events:cf
+              edit EMOS_TYPE 'pf'
+              family 240
+                edit STEPS '216/222/228/234/240'
+                edit OVERLAP '1'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family 360
+                edit STEPS '246/to/360/by/6'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task extra_arc
+                edit STEPS '240/to/360'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                edit RUNVARFC '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+            family cf
+              edit EMOS_TYPE 'cf'
+              family 240
+                edit STEPS '216/222/228/234/240'
+                edit OVERLAP '1'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              family 360
+                edit STEPS '246/to/360/by/6'
+                task derivedp
+                  label files ""
+                  label info ""
+                  event fdb
+              endfamily
+              task extra_arc
+                edit STEPS '240/to/360'
+                edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+                edit RUNVARFC '1'
+                label files ""
+                label info ""
+                event fdb
+            endfamily
+          endfamily
+          family efi
+            complete ( /emc_36r1/main/ref/00/events:cf) or ( /emc_36r1/main/ref/00/events:noefi)
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+            family 2t
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task efi
+                label info ""
+            endfamily
+          endfamily
+          family reord
+            complete /emc_36r1/lag/ref/00/events:cf
+            edit EPSCOUPLE '1'
+            edit EMOS_TYPE 'pf'
+            edit FCLENGTH0 '240'
+            edit FCLENGTH '360'
+            edit EPSFCRES '639'
+            edit FCCHUNK '1'
+            edit STEP1 '240'
+            edit STEP2 '360'
+            edit STEPS '-1'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg'
+            limit reord 1
+            inlimit reord
+            label info ""
+            family 130
+              edit GENERATE '1'
+              edit ARCHIVE '0'
+              edit PARAMS '130.128'
+              task reord
+                label info ""
+            endfamily
+            family 228
+              edit GENERATE '1'
+              edit ARCHIVE '0'
+              edit PARAMS '228.128'
+              task reord
+                label info ""
+            endfamily
+            family 207
+              edit GENERATE '1'
+              edit ARCHIVE '0'
+              edit PARAMS '207.128'
+              task reord
+                label info ""
+            endfamily
+            family 167
+              edit GENERATE '1'
+              edit ARCHIVE '0'
+              edit PARAMS '167.128'
+              task reord
+                label info ""
+            endfamily
+            family 164
+              edit GENERATE '1'
+              edit ARCHIVE '0'
+              edit PARAMS '164.128'
+              task reord
+                label info ""
+            endfamily
+            family arch
+              trigger ./130 eq complete and ./228 eq complete and ./207 eq complete and ./167 eq complete and ./164 eq complete
+              edit GENERATE '0'
+              edit ARCHIVE '1'
+              inlimit /emc_36r1/lag/ref/00:mutex
+              task reord
+                label info ""
+            endfamily
+          endfamily
+        endfamily
+        family cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legB/fc/cf eq complete)
+          edit EMOS_TYPE 'cf'
+          edit NUMBER '0'
+          family cf240
+            edit STEPS '216/228/240'
+            edit OVERLAP '1'
+            task cfml
+              label files ""
+              label info ""
+              event fdb
+            task cfpl
+              label files ""
+              label info ""
+              event fdb
+            task cfsfc
+              label files ""
+              label info ""
+              event fdb
+            task cfil
+              label files ""
+              label info ""
+              event fdb
+            task cfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family cf300
+            edit STEPS '246/to/300/by/6'
+            task cfml
+              label files ""
+              label info ""
+              event fdb
+            task cfpl
+              label files ""
+              label info ""
+              event fdb
+            task cfsfc
+              label files ""
+              label info ""
+              event fdb
+            task cfil
+              label files ""
+              label info ""
+              event fdb
+            task cfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family cf360
+            edit STEPS '306/to/360/by/6'
+            task cfml
+              label files ""
+              label info ""
+              event fdb
+            task cfpl
+              label files ""
+              label info ""
+              event fdb
+            task cfsfc
+              label files ""
+              label info ""
+              event fdb
+            task cfil
+              label files ""
+              label info ""
+              event fdb
+            task cfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          task accum
+            edit STEPS '240'
+            edit OVERLAP '1'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family pf
+          complete /emc_36r1/lag/ref/00/events:cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/lag:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/lag:YMD and /emc_36r1/main/00/legB/fc/pf eq complete and /emc_36r1/lag/ref/00/events eq complete)
+          edit EMOS_TYPE 'pf'
+          family pf240
+            edit STEPS '216/228/240'
+            edit OVERLAP '1'
+            task pfpl
+              inlimit /emc_36r1/limits:pl
+              label files ""
+              label info ""
+              event fdb
+            task pfsfc
+              trigger ../../postproc/dp eq complete
+              inlimit /emc_36r1/limits:sfc
+              label files ""
+              label info ""
+              event fdb
+            task pfil
+              label files ""
+              label info ""
+              event fdb
+            task pfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf300
+            edit STEPS '246/to/300/by/6'
+            task pfpl
+              inlimit /emc_36r1/limits:pl
+              label files ""
+              label info ""
+              event fdb
+            task pfsfc
+              trigger ../../postproc/dp eq complete
+              inlimit /emc_36r1/limits:sfc
+              label files ""
+              label info ""
+              event fdb
+            task pfil
+              label files ""
+              label info ""
+              event fdb
+            task pfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          family pf360
+            edit STEPS '306/to/360/by/6'
+            task pfpl
+              inlimit /emc_36r1/limits:pl
+              label files ""
+              label info ""
+              event fdb
+            task pfsfc
+              trigger ../../postproc/dp eq complete
+              inlimit /emc_36r1/limits:sfc
+              label files ""
+              label info ""
+              event fdb
+            task pfil
+              label files ""
+              label info ""
+              event fdb
+            task pfwv
+              edit STREAM 'WAEF'
+              edit EMOS_STREAM 'WAEF'
+              label files ""
+              label info ""
+              event fdb
+          endfamily
+          task pfml
+            edit STEPS '360'
+          task accum
+            edit STEPS '240'
+            edit OVERLAP '1'
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+        family coupled
+          complete /emc_36r1/lag/ref/00/events:cf or /emc_36r1/lag/ref/00/events:360 or ( /emc_36r1/lag/ref/00/events eq complete and not /emc_36r1/lag/ref/00/events:cpl)
+          trigger /emc_36r1/lag/00/legA/archive/coupled eq complete
+          edit EPSLEG '2'
+          edit OCLEG '2'
+          edit OCEPS '2'
+          edit FCCHUNK '1'
+          edit FCLENGTH '360'
+          edit FCLENGTH0 '216'
+          edit OCEPSTOT '3'
+          edit FCTOTAL '51'
+          edit RUNVARFC '1'
+          edit EPSCOUPLE '1'
+          edit RUNCOUPLE '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+          inlimit /emc_36r1/lag/ref/00:mutex
+          task preparcoce
+          task arcfc
+            trigger preparcoce eq complete
+            label files ""
+            label info ""
+            event fdb
+        endfamily
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'lag'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1'
+    task logfiles
+      late -s +00:05 -c +00:35
+      trigger /emc_36r1/main/make eq complete and ./12 eq complete and ./00 eq complete and logfilestore eq complete and ./ref/loop eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'lag'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1'
+  endfamily
+  family pop
+    repeat date YMD 20091003 20121212 1
+    edit SMSURLBASE 'http://intra.ecmwf.int/plots/d/intra/'
+    edit SMSURL 'sub=fixed/'
+    edit VERSION '0046'
+    edit STREAM 'EF'
+    edit EMOS_STREAM 'EF'
+    edit SMSFILES '/home/ma/emos/def/emc_36r1'
+    edit LOGTASK 'pop'
+    edit SUITE_START '20091124'
+    family 12
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/fc/pf eq complete and /emc_36r1/main/12/ref/model eq complete)
+      edit DELTA_DAY '0'
+      edit EMOS_BASE '12'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/pop'
+      task events
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+        edit HINDCAST '1'
+        edit ONLY_CF '0'
+        event noefi
+        event 240 
+        event 360 
+        event cpl
+        event 768 
+        event cf
+      family data
+        trigger events eq complete
+        family metgram
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/fc/pf eq complete)
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit QUEUE 'emos'
+          edit SMSTRIES '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data/epsgrams/grams'
+          inlimit /limits:linux_cluster
+          family 240
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/fc/pf eq complete and /emc_36r1/main/12/legA/fc/cf eq complete)
+            edit KIND '10_days'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family 360
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legB/postproc eq complete and /emc_36r1/main/12/legA/postproc eq complete)
+            edit KIND '15_days'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family wave
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/fc/pf eq complete and /emc_36r1/main/12/legA/fc/cf eq complete)
+            edit KIND '10_days_wave'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family 15d
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legB/postproc eq complete and /emc_36r1/main/12/legA/postproc eq complete)
+            edit KIND '15_days_pf'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family efi
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legB/postproc eq complete and /emc_36r1/main/12/legA/postproc eq complete)
+            edit KIND 'efi'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '10'
+              edit REMOTE_KEEP_DAYS '10'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+        endfamily
+        family distribution
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data'
+          edit DISTRIB_FDB '/leda/fdb1'
+          inlimit /limits:linux_cluster
+          task ff
+            edit PARAMETER 'ff'
+            edit STEP_LIST '84 108 132 156 180'
+            edit RANK '9999'
+          task 2t
+            edit PARAMETER '2t'
+            edit STEP_LIST '84 108 132 156 180'
+            edit RANK '9998'
+          task tp
+            edit PARAMETER 'tp'
+            edit STEP_LIST '102 126 150 174 198'
+            edit RANK '9997'
+          task tp5
+            edit PARAMETER 'tp5'
+            edit STEP_LIST '174'
+            edit RANK '9996'
+          task tp10
+            edit PARAMETER 'tp10'
+            edit STEP_LIST '240'
+            edit RANK '9995'
+          task cleanup
+            trigger ff eq complete and ./2t eq complete and tp eq complete and tp5 eq complete and tp10 eq complete
+        endfamily
+        family fields
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legB/postproc eq complete and /emc_36r1/main/12/legA/postproc eq complete)
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data/fields'
+          inlimit /limits:linux_cluster
+          inlimit /emc_36r1/limits:webplots
+          task efi
+            complete ( /emc_36r1/pop/12/events:cf) or ( /emc_36r1/pop/12/events:noefi)
+            trigger /emc_36r1/pop/12/events eq complete
+            event none
+          task globalefi
+            complete ( /emc_36r1/pop/12/events:cf) or ( /emc_36r1/pop/12/events:noefi)
+            trigger /emc_36r1/pop/12/events eq complete
+            event none
+          family legA
+            task proba
+              complete /emc_36r1/pop/12/events:cf
+              trigger /emc_36r1/pop/12/events eq complete
+              edit RANGE 'legA'
+              edit PLOT_STEPS_RANGE '00-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156/144-168/156-180/168-192/180-204/192-216/204-228/216-240'
+              edit PLOT_STEPS '12/to/240/by/12'
+          endfamily
+          family legB
+            task proba
+              complete /emc_36r1/pop/12/events:cf
+              trigger /emc_36r1/pop/12/events eq complete
+              edit RANGE 'legB'
+              edit PLOT_STEPS '252/to/360/by/12'
+              edit PLOT_STEPS_RANGE '228-252/240-264/252-276/264-288/276-300/288-312/300-324/312-336/324-348/336-360'
+          endfamily
+          task proba_mean
+            complete /emc_36r1/pop/12/events:cf
+            trigger /emc_36r1/pop/12/events eq complete
+            edit PLOT_STEPS_MEAN '240-360'
+          task lsmoro
+            edit STEP_LIST '0/to/144/by/12'
+        endfamily
+        family tc
+          complete /emc_36r1/pop/12/events:cf
+          trigger ( /emc_36r1/pop/12/events eq complete) and ( ( /emc_36r1/lag:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/lag:YMD eq /emc_36r1/pop:YMD and /emc_36r1/lag/12/legA/tc eq complete))
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/tc'
+          inlimit /limits:linux_cluster
+          task cleanup
+          task check_data
+          family post_process
+            task strike_prob
+              trigger ../check_data eq complete
+          endfamily
+          family diagnostics
+            trigger post_process eq complete
+            task det_errors
+            task spreadskill
+            task reliability
+          endfamily
+          family store
+            trigger ( /emc_36r1/pop/12/data/tc/diagnostics eq complete)
+            task to_ecfs_pop
+          endfamily
+        endfamily
+        family tcyc
+          complete /emc_36r1/pop/12/events:cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legB/fc eq complete)
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FCCHUNK '1'
+          edit OCTOTAL '5'
+          edit FCTOTAL '51'
+          edit FCLENGTH1 '216'
+          edit DAILY '0'
+          edit RUNVARFC '1'
+          edit FCLENGTH '360'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+          edit EPSCOUPLE '1'
+          edit RADIUS '500'
+          limit semaphore 8
+          inlimit /limits:linux_cluster
+          inlimit semaphore
+          task genes_stage
+            edit DELTA_DAY '1'
+          family genesis
+            trigger genes_stage eq complete
+            family da
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER 'da'
+              edit MEMBER 'da'
+              task tcyc
+            endfamily
+            family 00
+              edit OCGROUP 'an00'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '00'
+              edit MEMBER '00'
+              task tcyc
+            endfamily
+            family 01
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '01'
+              edit MEMBER '01'
+              task tcyc
+            endfamily
+            family 02
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '02'
+              edit MEMBER '02'
+              task tcyc
+            endfamily
+            family 03
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '03'
+              edit MEMBER '03'
+              task tcyc
+            endfamily
+            family 04
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '04'
+              edit MEMBER '04'
+              task tcyc
+            endfamily
+            family 05
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '05'
+              edit MEMBER '05'
+              task tcyc
+            endfamily
+            family 06
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '06'
+              edit MEMBER '06'
+              task tcyc
+            endfamily
+            family 07
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '07'
+              edit MEMBER '07'
+              task tcyc
+            endfamily
+            family 08
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '08'
+              edit MEMBER '08'
+              task tcyc
+            endfamily
+            family 09
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '09'
+              edit MEMBER '09'
+              task tcyc
+            endfamily
+            family 10
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              task tcyc
+            endfamily
+            family 11
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              task tcyc
+            endfamily
+            family 12
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              task tcyc
+            endfamily
+            family 13
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              task tcyc
+            endfamily
+            family 14
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              task tcyc
+            endfamily
+            family 15
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              task tcyc
+            endfamily
+            family 16
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              task tcyc
+            endfamily
+            family 17
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              task tcyc
+            endfamily
+            family 18
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              task tcyc
+            endfamily
+            family 19
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              task tcyc
+            endfamily
+            family 20
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              task tcyc
+            endfamily
+            family 21
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              task tcyc
+            endfamily
+            family 22
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              task tcyc
+            endfamily
+            family 23
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              task tcyc
+            endfamily
+            family 24
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              task tcyc
+            endfamily
+            family 25
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              task tcyc
+            endfamily
+            family 26
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              task tcyc
+            endfamily
+            family 27
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              task tcyc
+            endfamily
+            family 28
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              task tcyc
+            endfamily
+            family 29
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              task tcyc
+            endfamily
+            family 30
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              task tcyc
+            endfamily
+            family 31
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              task tcyc
+            endfamily
+            family 32
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              task tcyc
+            endfamily
+            family 33
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              task tcyc
+            endfamily
+            family 34
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              task tcyc
+            endfamily
+            family 35
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              task tcyc
+            endfamily
+            family 36
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              task tcyc
+            endfamily
+            family 37
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              task tcyc
+            endfamily
+            family 38
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              task tcyc
+            endfamily
+            family 39
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              task tcyc
+            endfamily
+            family 40
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              task tcyc
+            endfamily
+            family 41
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              task tcyc
+            endfamily
+            family 42
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              task tcyc
+            endfamily
+            family 43
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              task tcyc
+            endfamily
+            family 44
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              task tcyc
+            endfamily
+            family 45
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              task tcyc
+            endfamily
+            family 46
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              task tcyc
+            endfamily
+            family 47
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              task tcyc
+            endfamily
+            family 48
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              task tcyc
+            endfamily
+            family 49
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              task tcyc
+            endfamily
+            family 50
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc10'
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              task tcyc
+            endfamily
+          endfamily
+          task tcyctoecfs
+            trigger genesis eq complete
+        endfamily
+      endfamily
+      family web
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web'
+        inlimit /limits:linux_cluster
+        inlimit /emc_36r1/limits:webplots
+        family pf
+          complete /emc_36r1/pop/12/events:cf
+          trigger /emc_36r1/pop/12/events eq complete
+          task plumes
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/fc/cf eq complete and /emc_36r1/main/12/legA/fc/pf eq complete)
+          family classic
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/postproc/clusters eq complete)
+            edit ANALYSIS 'NO'
+            task clplot
+            task pltube
+            task enplot
+              edit STEPS '12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192'
+              edit PRINTSTEPS '60 84 108 132 156 180'
+          endfamily
+          family efi
+            complete /emc_36r1/pop/12/events:noefi
+            trigger ../../data/fields eq complete
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web'
+            inlimit /limits:linux_cluster
+            inlimit /emc_36r1/limits:webplots
+            family efi_tpi
+              task w_efi
+                edit PARAMETER 'tpi'
+            endfamily
+            family efi_10wsi
+              task w_efi
+                edit PARAMETER '10wsi'
+            endfamily
+            family efi_2ti
+              task w_efi
+                edit PARAMETER '2ti'
+            endfamily
+            family efi_10fgi
+              task w_efi
+                edit PARAMETER '10fgi'
+            endfamily
+            task globalefi
+              edit UPDATE_WEB_NOW 'yes'
+          endfamily
+          family proba
+            trigger ../../data/fields eq complete
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web'
+            edit PLOT_AREAS 'Europe,North_America,Asia,South_Atlantic,South_Pacific,Australia,Africa,Global'
+            inlimit /limits:linux_cluster
+            inlimit /emc_36r1/limits:webplots
+            family members
+              family legA
+                edit PLOT_STEPS '12/to/240/by/12'
+                edit STEP_RANGE 'legA'
+                task pb_2t
+                task pb_ff
+                task pb_tp
+                  edit PLOT_STEPS '00-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156/144-168/156-180/168-192/180-204/192-216/204-228/216-240'
+                task w_proba_gusts
+                  edit PLOT_STEPS '00-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156/144-168/156-180/168-192/180-204/192-216/204-228/216-240'
+                task pb_tpr
+                task pb_mwp
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+                task pb_swh
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+              endfamily
+              family legB
+                trigger ( ./legA eq complete)
+                edit PLOT_STEPS '252/to/360/by/12'
+                edit STEP_RANGE 'legB'
+                edit UPDATE_WEB_NOW 'yes'
+                task pb_2t
+                task pb_ff
+                task pb_tp
+                  edit PLOT_STEPS '228-252/240-264/252-276/264-288/276-300/288-312/300-324/312-336/324-348/336-360'
+                task w_proba_gusts
+                  edit PLOT_STEPS '228-252/240-264/252-276/264-288/276-300/288-312/300-324/312-336/324-348/336-360'
+                task pb_mwp
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+                task pb_swh
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+              endfamily
+              family means
+                trigger ( ./legA eq complete)
+                edit UPDATE_WEB_NOW 'yes'
+                task long_pb_2t
+                task long_pb_tpr
+                task long_w_proba_gusts
+                task long_pb_mwp
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+                task long_pb_swh
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+              endfamily
+            endfamily
+            family additional
+              edit PLOT_STEPS '12/to/156/by/12'
+              edit STEP_RANGE 'legA'
+              task w_proba_rain
+              family wmo_waves
+                edit PLOT_STEPS '12/to/168/by/12'
+                edit PLOT_AREAS 'Global'
+                edit PLOT_GRID '2.5/2.5'
+                task pb_swh
+              endfamily
+            endfamily
+          endfamily
+          family ensm
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legB/postproc/ensms eq complete and /emc_36r1/main/12/legA/postproc/ensms eq complete)
+            task fields_ensm
+              event 30 
+            task plot_ensm_Z
+              complete fields_ensm eq complete and not fields_ensm:30
+              trigger fields_ensm eq complete and fields_ensm:30
+            task plot_ensm_T
+              complete fields_ensm eq complete and not fields_ensm:30
+              trigger fields_ensm eq complete and fields_ensm:30
+            task cleanup_ensm
+              trigger plot_ensm_Z eq complete and plot_ensm_T eq complete
+              edit SMSPASS 'stripped'
+          endfamily
+          family tc
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web/tc'
+            inlimit /limits:linux_cluster
+            family plotting
+              trigger ( /emc_36r1/pop/12/data/tc/post_process eq complete)
+              task spm
+              task epsgram
+              task tstorm
+              task tstorm_web
+                trigger tstorm eq complete
+            endfamily
+            task tc2web
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and ./plotting eq complete and /emc_36r1/pop/12/data/tc/diagnostics eq complete)
+              edit WSHOST 'linux_cluster'
+          endfamily
+          family special
+            family swdfp
+              edit WSHOST 'linux_cluster'
+              edit QUEUE 'serial'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web/swdfp'
+              edit PLOTDOM '-45/-10/6/62'
+              edit UPDATE_WEB_NOW 'yes'
+              time 01:30
+              family efi
+                trigger /emc_36r1/pop/12/data/fields eq complete
+                edit QUEUE 'emos-e'
+                edit QUEUE_EPILOG 'emos-exp'
+                edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+                edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+                edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+                edit LOGDIR '/vol/emos_nc/output'
+                edit SMSOUT '/vol/emos_nc/output'
+                inlimit /limits:linux_cluster
+                family swdfp_tpi
+                  task w_efi
+                    edit PARAMETER 'tpi'
+                endfamily
+                family swdfp_10wsi
+                  task w_efi
+                    edit PARAMETER '10wsi'
+                endfamily
+                family swdfp_2ti
+                  task w_efi
+                    edit PARAMETER '2ti'
+                endfamily
+                family swdfp_10fgi
+                  task w_efi
+                    edit PARAMETER '10fgi'
+                endfamily
+              endfamily
+              family proba
+                trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/postproc/prob eq complete)
+                edit PLOT_LOCATION '/webplots_e/data/swdfp/proba'
+                edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+                task swdfp_proba
+                task swdfp_tp
+                  trigger ./swdfp_proba eq complete
+                task swdfp_ff
+                  trigger ./swdfp_proba eq complete
+                task swdfp_tp24
+                  trigger ./swdfp_proba eq complete
+                  edit STEPS '24/48/72/96/120'
+                task swdfp_proba_clean
+                  trigger ./swdfp_tp eq complete and ./swdfp_ff eq complete and ./swdfp_tp24 eq complete
+              endfamily
+              task swdfp_epsgram
+                trigger /emc_36r1/pop/12/data/metgram eq complete
+            endfamily
+          endfamily
+        endfamily
+        family verification
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit DATEMASK '11.*.*'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web/verification'
+          inlimit /limits:linux_cluster
+          task w_probas
+          task w_costloss
+          task w_timeseries
+        endfamily
+        task web_update
+          trigger pf/proba/members/legA eq complete and pf/proba/additional eq complete and pf/plumes eq complete and pf/classic eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit PACKAGES 'esuite'
+          edit UPDATE_STREAM 'enfo'
+          inlimit /emc_36r1/limits:webplots
+      endfamily
+      family paper
+        trigger web/web_update eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/plot'
+        inlimit /limits:linux_cluster
+        task epsgram
+          trigger ../data/metgram eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/paper'
+        family enplot
+          complete /emc_36r1/pop/12/events:cf
+          trigger ( /emc_36r1/pop/12/events eq complete) and ( ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/postproc/clusters eq complete))
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit ANALYSIS 'NO'
+          task sthemi
+        endfamily
+        family tube
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/postproc/clusters eq complete)
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          inlimit /limits:linux_cluster
+          task ptubfr
+          task tubfrfax
+            trigger ptubfr eq complete
+            edit QUEUE 'emos'
+          task tubukfax
+            trigger ptubuk eq complete
+            edit QUEUE 'emos'
+          task ptubuk
+            trigger ptubfr eq complete
+        endfamily
+        family prob
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/12/legA/postproc/prob eq complete)
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit ANALYSIS 'YES'
+          inlimit /emc_36r1/limits:webplots
+          task clplot
+            trigger ../enplot eq complete
+          task s144
+            trigger clplot eq complete
+            edit STEPS '144'
+          task plumea
+          task pb
+        endfamily
+      endfamily
+      task cleanup
+        trigger paper eq complete and web eq complete
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        inlimit /limits:linux_cluster
+        inlimit /emc_36r1/limits:webplots
+    endfamily
+    family 00
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/fc/pf eq complete and /emc_36r1/main/00/ref/model eq complete)
+      edit DELTA_DAY '1'
+      edit EMOS_BASE '00'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/pop'
+      task events
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/ref'
+        edit HINDCAST '1'
+        edit ONLY_CF '0'
+        event noefi
+        event 240 
+        event 360 
+        event cpl
+        event 768 
+        event cf
+      family data
+        trigger events eq complete
+        family metgram
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/fc/pf eq complete)
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit QUEUE 'emos'
+          edit SMSTRIES '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data/epsgrams/grams'
+          inlimit /limits:linux_cluster
+          family 240
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/fc/pf eq complete and /emc_36r1/main/00/legA/fc/cf eq complete)
+            edit KIND '10_days'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family 360
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/postproc eq complete and /emc_36r1/main/00/legA/postproc eq complete)
+            edit KIND '15_days'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family wave
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/fc/pf eq complete and /emc_36r1/main/00/legA/fc/cf eq complete)
+            edit KIND '10_days_wave'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family 15d
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/postproc eq complete and /emc_36r1/main/00/legA/postproc eq complete)
+            edit KIND '15_days_pf'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family 15dclim
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/fc/pf eq complete and /emc_36r1/main/00/legB/fc/cf eq complete and /emc_36r1/00/efi/swarm/sync_climate eq complete)
+            edit KIND 'clim_15_days'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '2'
+              edit REMOTE_KEEP_DAYS '2'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+          family efi
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/postproc eq complete and /emc_36r1/main/00/legA/postproc eq complete)
+            edit KIND 'efi'
+            edit RHOST 'epsgrams'
+            edit RDIR '/webapps/epsgrams/data/'
+            task gclean
+              edit KEEP_DAYS '10'
+              edit REMOTE_KEEP_DAYS '10'
+            task gdb
+              trigger gclean eq complete
+              edit NEW_DAILY '1'
+              label files ""
+              label info ""
+              label local "-"
+              label remote "-"
+              event fdb
+              event 1 
+            task glink
+              trigger gdb eq complete
+          endfamily
+        endfamily
+        family distribution
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data'
+          edit DISTRIB_FDB '/leda/fdb1'
+          inlimit /limits:linux_cluster
+          task ff
+            edit PARAMETER 'ff'
+            edit STEP_LIST '84 108 132 156 180'
+            edit RANK '9999'
+          task 2t
+            edit PARAMETER '2t'
+            edit STEP_LIST '84 108 132 156 180'
+            edit RANK '9998'
+          task tp
+            edit PARAMETER 'tp'
+            edit STEP_LIST '102 126 150 174 198'
+            edit RANK '9997'
+          task tp5
+            edit PARAMETER 'tp5'
+            edit STEP_LIST '174'
+            edit RANK '9996'
+          task tp10
+            edit PARAMETER 'tp10'
+            edit STEP_LIST '240'
+            edit RANK '9995'
+          task cleanup
+            trigger ff eq complete and ./2t eq complete and tp eq complete and tp5 eq complete and tp10 eq complete
+        endfamily
+        family fields
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/postproc eq complete and /emc_36r1/main/00/legA/postproc eq complete)
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data/fields'
+          inlimit /limits:linux_cluster
+          inlimit /emc_36r1/limits:webplots
+          task efi
+            complete ( /emc_36r1/pop/00/events:cf) or ( /emc_36r1/pop/00/events:noefi)
+            trigger /emc_36r1/pop/00/events eq complete
+            event none
+          task globalefi
+            complete ( /emc_36r1/pop/00/events:cf) or ( /emc_36r1/pop/00/events:noefi)
+            trigger /emc_36r1/pop/00/events eq complete
+            event none
+          family legA
+            task proba
+              complete /emc_36r1/pop/00/events:cf
+              trigger /emc_36r1/pop/00/events eq complete
+              edit RANGE 'legA'
+              edit PLOT_STEPS_RANGE '00-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156/144-168/156-180/168-192/180-204/192-216/204-228/216-240'
+              edit PLOT_STEPS '12/to/240/by/12'
+          endfamily
+          family legB
+            task proba
+              complete /emc_36r1/pop/00/events:cf
+              trigger /emc_36r1/pop/00/events eq complete
+              edit RANGE 'legB'
+              edit PLOT_STEPS '252/to/360/by/12'
+              edit PLOT_STEPS_RANGE '228-252/240-264/252-276/264-288/276-300/288-312/300-324/312-336/324-348/336-360'
+          endfamily
+          task proba_mean
+            complete /emc_36r1/pop/00/events:cf
+            trigger /emc_36r1/pop/00/events eq complete
+            edit PLOT_STEPS_MEAN '240-360'
+          task lsmoro
+            edit STEP_LIST '0/to/144/by/12'
+        endfamily
+        family tc
+          complete /emc_36r1/pop/00/events:cf
+          trigger ( /emc_36r1/pop/00/events eq complete) and ( ( /emc_36r1/lag:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/lag:YMD eq /emc_36r1/pop:YMD and /emc_36r1/lag/00/legA/tc eq complete))
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/tc'
+          inlimit /limits:linux_cluster
+          task cleanup
+          task check_data
+            trigger /emc_36r1/pop/12/data/tc eq complete
+          family post_process
+            task strike_prob
+              trigger ../check_data eq complete
+          endfamily
+          family diagnostics
+            trigger post_process eq complete
+            task det_errors
+            task spreadskill
+            task reliability
+          endfamily
+          family store
+            trigger ( /emc_36r1/pop/00/data/tc/diagnostics eq complete)
+            task to_ecfs_pop
+          endfamily
+        endfamily
+        family tcyc
+          complete /emc_36r1/pop/00/events:cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/fc eq complete)
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FCCHUNK '1'
+          edit OCTOTAL '5'
+          edit FCTOTAL '51'
+          edit FCLENGTH1 '216'
+          edit DAILY '0'
+          edit RUNVARFC '1'
+          edit FCLENGTH '360'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive/leg'
+          edit EPSCOUPLE '1'
+          edit RADIUS '500'
+          limit semaphore 5
+          inlimit /limits:linux_cluster
+          inlimit semaphore
+          task genes_stage
+            edit DELTA_DAY '2'
+          family genesis
+            trigger genes_stage eq complete
+            family da
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER 'da'
+              edit MEMBER 'da'
+              task tcyc
+            endfamily
+            family 00
+              edit OCGROUP 'an00'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '00'
+              edit MEMBER '00'
+              task tcyc
+            endfamily
+            family 01
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '01'
+              edit MEMBER '01'
+              task tcyc
+            endfamily
+            family 02
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '02'
+              edit MEMBER '02'
+              task tcyc
+            endfamily
+            family 03
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '03'
+              edit MEMBER '03'
+              task tcyc
+            endfamily
+            family 04
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc0'
+              edit EPSMEMBER '04'
+              edit MEMBER '04'
+              task tcyc
+            endfamily
+            family 05
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '05'
+              edit MEMBER '05'
+              task tcyc
+            endfamily
+            family 06
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '06'
+              edit MEMBER '06'
+              task tcyc
+            endfamily
+            family 07
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '07'
+              edit MEMBER '07'
+              task tcyc
+            endfamily
+            family 08
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '08'
+              edit MEMBER '08'
+              task tcyc
+            endfamily
+            family 09
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc1'
+              edit EPSMEMBER '09'
+              edit MEMBER '09'
+              task tcyc
+            endfamily
+            family 10
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '10'
+              edit MEMBER '10'
+              task tcyc
+            endfamily
+            family 11
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '11'
+              edit MEMBER '11'
+              task tcyc
+            endfamily
+            family 12
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '12'
+              edit MEMBER '12'
+              task tcyc
+            endfamily
+            family 13
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '13'
+              edit MEMBER '13'
+              task tcyc
+            endfamily
+            family 14
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc2'
+              edit EPSMEMBER '14'
+              edit MEMBER '14'
+              task tcyc
+            endfamily
+            family 15
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '15'
+              edit MEMBER '15'
+              task tcyc
+            endfamily
+            family 16
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '16'
+              edit MEMBER '16'
+              task tcyc
+            endfamily
+            family 17
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '17'
+              edit MEMBER '17'
+              task tcyc
+            endfamily
+            family 18
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '18'
+              edit MEMBER '18'
+              task tcyc
+            endfamily
+            family 19
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc3'
+              edit EPSMEMBER '19'
+              edit MEMBER '19'
+              task tcyc
+            endfamily
+            family 20
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '20'
+              edit MEMBER '20'
+              task tcyc
+            endfamily
+            family 21
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '21'
+              edit MEMBER '21'
+              task tcyc
+            endfamily
+            family 22
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '22'
+              edit MEMBER '22'
+              task tcyc
+            endfamily
+            family 23
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '23'
+              edit MEMBER '23'
+              task tcyc
+            endfamily
+            family 24
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc4'
+              edit EPSMEMBER '24'
+              edit MEMBER '24'
+              task tcyc
+            endfamily
+            family 25
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '25'
+              edit MEMBER '25'
+              task tcyc
+            endfamily
+            family 26
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '26'
+              edit MEMBER '26'
+              task tcyc
+            endfamily
+            family 27
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '27'
+              edit MEMBER '27'
+              task tcyc
+            endfamily
+            family 28
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '28'
+              edit MEMBER '28'
+              task tcyc
+            endfamily
+            family 29
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc5'
+              edit EPSMEMBER '29'
+              edit MEMBER '29'
+              task tcyc
+            endfamily
+            family 30
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '30'
+              edit MEMBER '30'
+              task tcyc
+            endfamily
+            family 31
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '31'
+              edit MEMBER '31'
+              task tcyc
+            endfamily
+            family 32
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '32'
+              edit MEMBER '32'
+              task tcyc
+            endfamily
+            family 33
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '33'
+              edit MEMBER '33'
+              task tcyc
+            endfamily
+            family 34
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc6'
+              edit EPSMEMBER '34'
+              edit MEMBER '34'
+              task tcyc
+            endfamily
+            family 35
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '35'
+              edit MEMBER '35'
+              task tcyc
+            endfamily
+            family 36
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '36'
+              edit MEMBER '36'
+              task tcyc
+            endfamily
+            family 37
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '37'
+              edit MEMBER '37'
+              task tcyc
+            endfamily
+            family 38
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '38'
+              edit MEMBER '38'
+              task tcyc
+            endfamily
+            family 39
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc7'
+              edit EPSMEMBER '39'
+              edit MEMBER '39'
+              task tcyc
+            endfamily
+            family 40
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '40'
+              edit MEMBER '40'
+              task tcyc
+            endfamily
+            family 41
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '41'
+              edit MEMBER '41'
+              task tcyc
+            endfamily
+            family 42
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '42'
+              edit MEMBER '42'
+              task tcyc
+            endfamily
+            family 43
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '43'
+              edit MEMBER '43'
+              task tcyc
+            endfamily
+            family 44
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc8'
+              edit EPSMEMBER '44'
+              edit MEMBER '44'
+              task tcyc
+            endfamily
+            family 45
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '45'
+              edit MEMBER '45'
+              task tcyc
+            endfamily
+            family 46
+              edit OCGROUP 'an1'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '46'
+              edit MEMBER '46'
+              task tcyc
+            endfamily
+            family 47
+              edit OCGROUP 'an2'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '47'
+              edit MEMBER '47'
+              task tcyc
+            endfamily
+            family 48
+              edit OCGROUP 'an3'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '48'
+              edit MEMBER '48'
+              task tcyc
+            endfamily
+            family 49
+              edit OCGROUP 'an4'
+              edit FCGROUP 'fc9'
+              edit EPSMEMBER '49'
+              edit MEMBER '49'
+              task tcyc
+            endfamily
+            family 50
+              edit OCGROUP 'an0'
+              edit FCGROUP 'fc10'
+              edit EPSMEMBER '50'
+              edit MEMBER '50'
+              task tcyc
+            endfamily
+          endfamily
+          task tcyctoecfs
+            trigger genesis eq complete
+        endfamily
+        family mjo
+          complete /emc_36r1/lag/ref/00/events:cf
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/postproc eq complete)
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit FCLENGTH '360'
+          edit ERA40END '2002033000'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+          edit RUNVARFC '1'
+          inlimit /limits:linux_cluster
+          family stage
+            edit RETRIEVE 'stage'
+            edit DELTA_DAY '2'
+            task chi200
+            task olr
+            task u200
+            task u850
+          endfamily
+          family process
+            task chi200
+            task olr
+            task u850
+            task u200
+          endfamily
+          family ncep
+            trigger ./process eq complete
+            task olr_to_ncep
+            task u200_to_ncep
+            task u850_to_ncep
+          endfamily
+          task ncep_daily
+            trigger ./ncep eq complete
+          task ceof
+            trigger process eq complete
+          task mjo_migrate
+            complete /emc_36r1/pop/00/events:768
+            trigger process eq complete and ceof eq complete and ncep_daily eq complete
+          task mjo_clean
+            complete /emc_36r1/pop/00/events:768
+            trigger process eq complete and ncep eq complete and ncep_daily eq complete and ceof eq complete and mjo_migrate eq complete
+        endfamily
+      endfamily
+      family web
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web'
+        inlimit /limits:linux_cluster
+        inlimit /emc_36r1/limits:webplots
+        family pf
+          complete /emc_36r1/pop/00/events:cf
+          trigger /emc_36r1/pop/00/events eq complete
+          task plumes
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/fc/cf eq complete and /emc_36r1/main/00/legA/fc/pf eq complete)
+          family classic
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/postproc/clusters eq complete)
+            edit ANALYSIS 'NO'
+            task clplot
+            task pltube
+            task enplot
+              edit STEPS '12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192'
+              edit PRINTSTEPS '60 84 108 132 156 180'
+          endfamily
+          family efi
+            complete /emc_36r1/pop/00/events:noefi
+            trigger ../../data/fields eq complete
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web'
+            inlimit /limits:linux_cluster
+            inlimit /emc_36r1/limits:webplots
+            family efi_tpi
+              task w_efi
+                edit PARAMETER 'tpi'
+            endfamily
+            family efi_10wsi
+              task w_efi
+                edit PARAMETER '10wsi'
+            endfamily
+            family efi_2ti
+              task w_efi
+                edit PARAMETER '2ti'
+            endfamily
+            family efi_10fgi
+              task w_efi
+                edit PARAMETER '10fgi'
+            endfamily
+            task globalefi
+              edit UPDATE_WEB_NOW 'yes'
+          endfamily
+          family proba
+            trigger ../../data/fields eq complete
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'plots-medium'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web'
+            edit PLOT_AREAS 'Europe,North_America,Asia,South_Atlantic,South_Pacific,Australia,Africa,Global'
+            inlimit /limits:linux_cluster
+            inlimit /emc_36r1/limits:webplots
+            family members
+              family legA
+                edit PLOT_STEPS '12/to/240/by/12'
+                edit STEP_RANGE 'legA'
+                task pb_2t
+                task pb_ff
+                task pb_tp
+                  edit PLOT_STEPS '00-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156/144-168/156-180/168-192/180-204/192-216/204-228/216-240'
+                task w_proba_gusts
+                  edit PLOT_STEPS '00-24/12-36/24-48/36-60/48-72/60-84/72-96/84-108/96-120/108-132/120-144/132-156/144-168/156-180/168-192/180-204/192-216/204-228/216-240'
+                task pb_tpr
+                task pb_mwp
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+                task pb_swh
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+              endfamily
+              family legB
+                trigger ( ./legA eq complete)
+                edit PLOT_STEPS '252/to/360/by/12'
+                edit STEP_RANGE 'legB'
+                edit UPDATE_WEB_NOW 'yes'
+                task pb_2t
+                task pb_ff
+                task pb_tp
+                  edit PLOT_STEPS '228-252/240-264/252-276/264-288/276-300/288-312/300-324/312-336/324-348/336-360'
+                task w_proba_gusts
+                  edit PLOT_STEPS '228-252/240-264/252-276/264-288/276-300/288-312/300-324/312-336/324-348/336-360'
+                task pb_mwp
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+                task pb_swh
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+              endfamily
+              family means
+                trigger ( ./legA eq complete)
+                edit UPDATE_WEB_NOW 'yes'
+                task long_pb_2t
+                task long_pb_tpr
+                task long_w_proba_gusts
+                task long_pb_mwp
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+                task long_pb_swh
+                  edit PLOT_AREAS 'Global,Europe,Pacific,Indian,North_Atlantic,South_Atlantic'
+              endfamily
+            endfamily
+            family additional
+              edit PLOT_STEPS '12/to/156/by/12'
+              edit STEP_RANGE 'legA'
+              task w_proba_rain
+              family wmo_waves
+                edit PLOT_STEPS '12/to/168/by/12'
+                edit PLOT_AREAS 'Global'
+                edit PLOT_GRID '2.5/2.5'
+                task pb_swh
+              endfamily
+            endfamily
+          endfamily
+          family ensm
+            trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legB/postproc/ensms eq complete and /emc_36r1/main/00/legA/postproc/ensms eq complete)
+            task fields_ensm
+              event 30 
+            task plot_ensm_Z
+              complete fields_ensm eq complete and not fields_ensm:30
+              trigger fields_ensm eq complete and fields_ensm:30
+            task plot_ensm_T
+              complete fields_ensm eq complete and not fields_ensm:30
+              trigger fields_ensm eq complete and fields_ensm:30
+            task cleanup_ensm
+              trigger plot_ensm_Z eq complete and plot_ensm_T eq complete
+          endfamily
+          family tc
+            edit WSHOST 'linux_cluster'
+            edit QUEUE 'emos-e'
+            edit QUEUE_EPILOG 'emos-exp'
+            edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+            edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+            edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+            edit LOGDIR '/vol/emos_nc/output'
+            edit SMSOUT '/vol/emos_nc/output'
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web/tc'
+            inlimit /limits:linux_cluster
+            family plotting
+              trigger ( /emc_36r1/pop/00/data/tc/post_process eq complete)
+              task spm
+              task epsgram
+              task tstorm
+              task tstorm_web
+                trigger tstorm eq complete
+            endfamily
+            task tc2web
+              trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and ./plotting eq complete and /emc_36r1/pop/00/data/tc/diagnostics eq complete)
+              edit WSHOST 'linux_cluster'
+          endfamily
+          family special
+            family swdfp
+              edit WSHOST 'linux_cluster'
+              edit QUEUE 'serial'
+              edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web/swdfp'
+              edit PLOTDOM '-45/-10/6/62'
+              edit UPDATE_WEB_NOW 'yes'
+              time 10:30
+              family efi
+                trigger /emc_36r1/pop/00/data/fields eq complete
+                edit QUEUE 'emos-e'
+                edit QUEUE_EPILOG 'emos-exp'
+                edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+                edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+                edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+                edit LOGDIR '/vol/emos_nc/output'
+                edit SMSOUT '/vol/emos_nc/output'
+                inlimit /limits:linux_cluster
+                family swdfp_tpi
+                  task w_efi
+                    edit PARAMETER 'tpi'
+                endfamily
+                family swdfp_10wsi
+                  task w_efi
+                    edit PARAMETER '10wsi'
+                endfamily
+                family swdfp_2ti
+                  task w_efi
+                    edit PARAMETER '2ti'
+                endfamily
+                family swdfp_10fgi
+                  task w_efi
+                    edit PARAMETER '10fgi'
+                endfamily
+              endfamily
+              family proba
+                trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/postproc/prob eq complete)
+                edit PLOT_LOCATION '/webplots_e/data/swdfp/proba'
+                edit STEPS '06/12/18/24/30/36/42/48/54/60/66/72/84/96/108/120/132/144'
+                task swdfp_proba
+                task swdfp_tp
+                  trigger ./swdfp_proba eq complete
+                task swdfp_ff
+                  trigger ./swdfp_proba eq complete
+                task swdfp_tp24
+                  trigger ./swdfp_proba eq complete
+                  edit STEPS '24/48/72/96/120'
+                task swdfp_proba_clean
+                  trigger ./swdfp_tp eq complete and ./swdfp_ff eq complete and ./swdfp_tp24 eq complete
+              endfamily
+              task swdfp_epsgram
+                trigger /emc_36r1/pop/00/data/metgram eq complete
+            endfamily
+          endfamily
+        endfamily
+        family verification
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit DATEMASK '11.*.*'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/web/verification'
+          inlimit /limits:linux_cluster
+          task w_probas
+          task w_costloss
+          task w_timeseries
+        endfamily
+        task web_update
+          trigger pf/proba/members/legA eq complete and pf/proba/additional eq complete and pf/plumes eq complete and pf/classic eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit PACKAGES 'esuite'
+          edit UPDATE_STREAM 'enfo'
+          inlimit /emc_36r1/limits:webplots
+      endfamily
+      family paper
+        trigger web/web_update eq complete
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/plot'
+        inlimit /limits:linux_cluster
+        task epsgram
+          trigger ../data/metgram eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/paper'
+        family enplot
+          complete /emc_36r1/pop/00/events:cf
+          trigger ( /emc_36r1/pop/00/events eq complete) and ( ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/postproc/clusters eq complete))
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit ANALYSIS 'NO'
+          task sthemi
+        endfamily
+        family tube
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/postproc/clusters eq complete)
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          inlimit /limits:linux_cluster
+          task ptubfr
+          task tubfrfax
+            trigger ptubfr eq complete
+            edit QUEUE 'emos'
+          task tubukfax
+            trigger ptubuk eq complete
+            edit QUEUE 'emos'
+          task ptubuk
+            trigger ptubfr eq complete
+        endfamily
+        family prob
+          trigger ( /emc_36r1/main:YMD gt /emc_36r1/pop:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/pop:YMD and /emc_36r1/main/00/legA/postproc/prob eq complete)
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'plots-medium'
+          edit ANALYSIS 'YES'
+          inlimit /emc_36r1/limits:webplots
+          task clplot
+            trigger ../enplot eq complete
+          task s144
+            trigger clplot eq complete
+            edit STEPS '144'
+          task plumea
+          task pb
+        endfamily
+      endfamily
+      task cleanup
+        trigger paper eq complete and web eq complete
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'plots-medium'
+        inlimit /limits:linux_cluster
+        inlimit /emc_36r1/limits:webplots
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      trigger ../main/make eq complete and ./12 eq complete and ./00 eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1'
+  endfamily
+  family msjobs
+    complete ( /emc_36r1/msjobs:YMD le /emc_36r1/main:YMD) and /emc_36r1/main/logfiles eq active
+    repeat date YMD 20091003 20121212 1
+    edit QUEUE 'emos'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit WSHOST 'ecgate'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit SMSOUT '/vol/emos_nc/output'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit STREAM 'EF'
+    edit EMOS_STREAM 'EF'
+    edit SMSURLBASE 'http://ecgate.ecmwf.int:9080'
+    edit SMSURL 'do/events'
+    edit SMSFILES '/home/ma/emos/def/emc_36r1'
+    edit DELTA_DAY '-1'
+    edit LOGTASK 'msjobs'
+    family 12
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legA/fc eq complete and /emc_36r1/main/12/legA/postproc/clusters eq complete and /emc_36r1/main/12/ref/model eq complete)
+      edit EMOS_BASE '12'
+      edit DELTA_DAY '-1'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/msjobs'
+      edit SMSTRIES '1'
+      family ms036
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '036'
+        edit MSJ_DIR 'ef12h036'
+        task ms_ec
+      endfamily
+      family ms072
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '072'
+        edit MSJ_DIR 'ef12h072'
+        task ms_ec
+      endfamily
+      family ms120
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '120'
+        edit MSJ_DIR 'ef12h120'
+        task ms_ec
+      endfamily
+      family ms144
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '144'
+        edit MSJ_DIR 'ef12h144'
+        task ms_ec
+      endfamily
+      family ms240
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'ef12h240'
+        task ms_ec
+      endfamily
+      family ms360
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legB/fc eq complete)
+        edit EMOS_TIME_STEP_H '360'
+        edit MSJ_DIR 'ef12h360'
+        task ms_ec
+      endfamily
+      family ms240post
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'ef12h240post'
+        task ms_ec
+      endfamily
+      family ms360post
+        edit EMOS_TIME_STEP_H '360'
+        edit MSJ_DIR 'ef12h360post'
+        task ms_ec
+      endfamily
+      family ms240metgram
+        trigger ( /emc_36r1/pop:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/pop:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/pop/12/data/metgram/240/gdb eq complete)
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'ef12h240metgram'
+        task ms_ec
+      endfamily
+      family ms360metgram
+        trigger ( /emc_36r1/pop:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/pop:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/pop/12/data/metgram/15d/gdb eq complete)
+        edit EMOS_TIME_STEP_H '360'
+        edit MSJ_DIR 'ef12h360metgram'
+        task ms_ec
+      endfamily
+      family ems240
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/12/legA/prod2diss eq complete)
+        edit EMOS_TIME_STEP '240'
+        edit MSJ_DIR 'eef12h240'
+        task ms_ec
+      endfamily
+    endfamily
+    family 00
+      trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legA/fc eq complete and /emc_36r1/main/00/legA/postproc/clusters eq complete and /emc_36r1/main/00/ref/model eq complete)
+      edit EMOS_BASE '00'
+      edit DELTA_DAY '0'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1/msjobs'
+      edit SMSTRIES '1'
+      family ms036
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '036'
+        edit MSJ_DIR 'ef00h036'
+        task ms_ec
+      endfamily
+      family ms072
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '072'
+        edit MSJ_DIR 'ef00h072'
+        task ms_ec
+      endfamily
+      family ms120
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '120'
+        edit MSJ_DIR 'ef00h120'
+        task ms_ec
+      endfamily
+      family ms144
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '144'
+        edit MSJ_DIR 'ef00h144'
+        task ms_ec
+      endfamily
+      family ms240
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legA/fc eq complete)
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'ef00h240'
+        task ms_ec
+      endfamily
+      family ms360
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legB/fc eq complete)
+        edit EMOS_TIME_STEP_H '360'
+        edit MSJ_DIR 'ef00h360'
+        task ms_ec
+      endfamily
+      family ms240post
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'ef00h240post'
+        task ms_ec
+      endfamily
+      family ms360post
+        edit EMOS_TIME_STEP_H '360'
+        edit MSJ_DIR 'ef00h360post'
+        task ms_ec
+      endfamily
+      family ms240metgram
+        trigger ( /emc_36r1/pop:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/pop:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/pop/00/data/metgram/240/gdb eq complete)
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'ef00h240metgram'
+        task ms_ec
+      endfamily
+      family ms360metgram
+        trigger ( /emc_36r1/pop:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/pop:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/pop/00/data/metgram/15d/gdb eq complete)
+        edit EMOS_TIME_STEP_H '360'
+        edit MSJ_DIR 'ef00h360metgram'
+        task ms_ec
+      endfamily
+      family ems240
+        trigger ( /emc_36r1/main:YMD gt /emc_36r1/msjobs:YMD) or ( /emc_36r1/main:YMD eq /emc_36r1/msjobs:YMD and /emc_36r1/main/00/legA/prod2diss eq complete)
+        edit EMOS_TIME_STEP '240'
+        edit MSJ_DIR 'eef00h240'
+        task ms_ec
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      inlimit /limits:linux_cluster
+    task logfiles
+      trigger ./00 eq complete and ./12 eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      inlimit /limits:linux_cluster
+      time 13:15
+  endfamily
+  family verify
+    trigger ./00:YMD gt ./verify:YMD or ( ./00:YMD eq ./verify:YMD and ./00/ref/tue eq complete)
+    repeat date YMD 20091007 20121212 7
+    edit ACCOUNT 'oeenfo'
+    edit WSHOST 'linux_cluster'
+    edit UPDATE_WEB_NOW 'yes'
+    edit EMOS_BASE '00'
+    edit QUEUE 'emos-e'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit SMSOUT '/vol/emos_nc/output'
+    edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/leg/verify'
+    edit FSFAMILY 'assim'
+    edit FCTOTAL '51'
+    edit DELTA_DAY '-27'
+    edit RUNHINDCAST '1'
+    edit RUNVARFC '1'
+    edit EMOS_TYPE '00'
+    edit LOGTASK '00'
+    inlimit /limits:linux_cluster
+    family init
+      task list_verif
+      task getana
+        trigger list_verif eq complete
+      task getmofc
+        trigger getana eq complete
+    endfamily
+    family anomaly
+      trigger init eq complete
+      family temp
+        edit VAR 'TEMP'
+        task stats_verif
+        task plot_verif
+          trigger stats_verif eq complete
+      endfamily
+      family rain
+        trigger temp eq complete
+        edit VAR 'RAIN'
+        task stats_verif
+        task plot_verif
+          trigger stats_verif eq complete
+      endfamily
+      family mslp
+        trigger rain eq complete
+        edit VAR 'MSLP'
+        task stats_verif
+        task plot_verif
+          trigger stats_verif eq complete
+      endfamily
+      family 2mtm
+        trigger mslp eq complete
+        edit VAR '2MTM'
+        task stats_verif
+        task plot_verif
+          trigger stats_verif eq complete
+      endfamily
+      family z500
+        trigger ./2mtm eq complete
+        task flowz500_verif
+      endfamily
+      task webvanomaly
+        trigger ./z500 eq complete
+        edit FSFAMILY 'mofc'
+        edit QUEUE 'plots-medium'
+    endfamily
+    family scores
+      trigger anomaly eq complete
+      task mofcdaily_verif
+      task mofcweekly_verif
+        trigger mofcdaily_verif eq complete
+      task alldaily
+        trigger mofcweekly_verif eq complete
+      task allweekly
+        trigger alldaily eq complete
+      task sctoweb
+        trigger allweekly eq complete
+        edit FSFAMILY 'mofc'
+    endfamily
+    family probability
+      trigger scores eq complete
+      family rain
+        edit VAR 'RAIN'
+        task table
+        task stats
+          trigger ./table eq complete
+        task stats1
+          trigger ./stats eq complete
+        task plot_relia
+          trigger ./stats1 eq complete
+        task plot_roc
+          trigger ./plot_relia eq complete
+        task plot_rocmap
+          trigger ./plot_roc eq complete
+        task plot_rpssmap
+          trigger ./plot_rocmap eq complete
+        task plot_value
+          trigger ./plot_rpssmap eq complete
+      endfamily
+      family temp
+        trigger ./rain eq complete
+        edit VAR 'TEMP'
+        task table
+        task stats
+          trigger ./table eq complete
+        task stats1
+          trigger ./stats eq complete
+        task plot_relia
+          trigger ./stats1 eq complete
+        task plot_roc
+          trigger ./plot_relia eq complete
+        task plot_rocmap
+          trigger ./plot_roc eq complete
+        task plot_rpssmap
+          trigger ./plot_rocmap eq complete
+        task plot_value
+          trigger ./plot_rpssmap eq complete
+      endfamily
+      family mslp
+        trigger ./temp eq complete
+        edit VAR 'MSLP'
+        task table
+        task stats
+          trigger ./table eq complete
+        task stats1
+          trigger ./stats eq complete
+        task plot_relia
+          trigger ./stats1 eq complete
+        task plot_roc
+          trigger ./plot_relia eq complete
+        task plot_rocmap
+          trigger ./plot_roc eq complete
+        task plot_rpssmap
+          trigger ./plot_rocmap eq complete
+        task plot_value
+          trigger ./plot_rpssmap eq complete
+      endfamily
+      family 2mtm
+        trigger ./mslp eq complete
+        edit VAR '2MTM'
+        task table
+        task stats
+          trigger ./table eq complete
+        task stats1
+          trigger ./stats eq complete
+        task plot_relia
+          trigger ./stats1 eq complete
+        task plot_roc
+          trigger ./plot_relia eq complete
+        task plot_rocmap
+          trigger ./plot_roc eq complete
+        task plot_rpssmap
+          trigger ./plot_rocmap eq complete
+        task plot_value
+          trigger ./plot_rpssmap eq complete
+      endfamily
+      family pbtoweb
+        trigger ./2mtm eq complete
+        edit FSFAMILY 'mofc'
+        task reliability
+        task roc
+          trigger ./reliability eq complete
+        task rocmap
+          trigger ./roc eq complete
+        task rpssmap
+          trigger ./rocmap eq complete
+        task value
+          trigger ./rpssmap eq complete
+      endfamily
+    endfamily
+    task clean_verif
+      trigger init eq complete and anomaly eq complete and scores eq complete and probability eq complete
+      edit DELTA_DAY '-14'
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      edit FSFAMILY 'mc'
+    task logfiles
+      late -s +00:05 -c +00:35
+      trigger logfilestore eq complete and init eq complete and anomaly eq complete and scores eq complete and probability eq complete and clean_verif eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FSFAMILY 'mc'
+      edit SMSFILES '/home/ma/emos/def/emc_36r1'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+  family efi_next
+    edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi'
+    edit EVERSION '0046'
+    edit IMPL_DATE '2012121212'
+    edit EMOS_BASE '00'
+    edit MARS_DB 'marsod'
+    edit EMOS_TYPE 'undef'
+    edit EPS_VERSION '0046'
+    edit VERSION '9939'
+    edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+    edit SMSURL 'GENFO/00'
+    edit UPDATE_WEB_NOW 'yes'
+    edit MARS_NEW '0'
+    edit QUEUE 'ns'
+    edit QUEUE_EPILOG 'ns'
+    edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/s1b/emos_esuite/emos_data/9946/log'
+    edit SMSOUT '/s1b/emos_esuite/emos_data/9946/log'
+    limit ext 45
+    inlimit /limits:c1b
+    inlimit ext
+    family mn
+      trigger ./mn:YMD lt ./clim:YMD
+      repeat date YMD 20080221 20121212 1
+      family deps
+        edit SSMFILES '/home/ma/emos/def/emc_36r1'
+        family 00
+          trigger ( ( ( /emc_36r1/main/00/legA/postproc eq complete) and ( /emc_36r1/main/00/legB/postproc eq complete)) and ( /emc_36r1/main:YMD eq ../../mn:YMD)) or ( /emc_36r1/main:YMD gt ../../mn:YMD)
+          task dummy
+            complete 1 eq 1
+        endfamily
+        family 12
+          trigger ( ( ( /emc_36r1/main/12/legA/postproc eq complete) and ( /emc_36r1/main/12/legB/postproc eq complete)) and ( /emc_36r1/main:YMD eq ../../mn:YMD)) or ( /emc_36r1/main:YMD gt ../../mn:YMD)
+          task dummy
+            complete 1 eq 1
+        endfamily
+      endfamily
+      family 12
+        trigger ./deps/12 eq complete
+        edit EMOS_BASE '12'
+        family op
+          edit EPSLEG '1'
+          task stage
+          family 024
+            family 012_036
+              edit ACC '024'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_060
+              edit ACC '024'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_084
+              edit ACC '024'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_108
+              edit ACC '024'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_132
+              edit ACC '024'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '024'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '024'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '024'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            trigger ./024 eq complete
+            family 000_120
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_144
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            trigger ./024 eq complete
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family nop
+          edit EPSLEG '2'
+          task stage
+          family 024
+            family 012_036
+              edit ACC '024'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '036'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_060
+              edit ACC '024'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '060'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_084
+              edit ACC '024'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '084'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_108
+              edit ACC '024'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '108'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_132
+              edit ACC '024'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '132'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 132_156
+              edit ACC '024'
+              edit EFI_STEP1 '132'
+              edit EFI_STEP2 '156'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 156_180
+              edit ACC '024'
+              edit EFI_STEP1 '156'
+              edit EFI_STEP2 '180'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 180_204
+              edit ACC '024'
+              edit EFI_STEP1 '180'
+              edit EFI_STEP2 '204'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 204_228
+              edit ACC '024'
+              edit EFI_STEP1 '204'
+              edit EFI_STEP2 '228'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '24'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '24'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '24'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 240_264
+              edit ACC '24'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '264'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 264_288
+              edit ACC '24'
+              edit EFI_STEP1 '264'
+              edit EFI_STEP2 '288'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 288_312
+              edit ACC '24'
+              edit EFI_STEP1 '288'
+              edit EFI_STEP2 '312'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 312_336
+              edit ACC '24'
+              edit EFI_STEP1 '312'
+              edit EFI_STEP2 '336'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 336_360
+              edit ACC '24'
+              edit EFI_STEP1 '336'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 072
+            family 012_084
+              edit ACC '072'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '084'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_108
+              edit ACC '072'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '108'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_132
+              edit ACC '072'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '132'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_156
+              edit ACC '072'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '156'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_180
+              edit ACC '072'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '180'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 132_204
+              edit ACC '072'
+              edit EFI_STEP1 '132'
+              edit EFI_STEP2 '204'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 156_228
+              edit ACC '072'
+              edit EFI_STEP1 '156'
+              edit EFI_STEP2 '228'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            family 012_132
+              edit ACC '120'
+              edit EFI_STEP1 '012'
+              edit EFI_STEP2 '132'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 036_156
+              edit ACC '120'
+              edit EFI_STEP1 '036'
+              edit EFI_STEP2 '156'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 060_180
+              edit ACC '120'
+              edit EFI_STEP1 '060'
+              edit EFI_STEP2 '180'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 084_204
+              edit ACC '120'
+              edit EFI_STEP1 '084'
+              edit EFI_STEP2 '204'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 108_228
+              edit ACC '120'
+              edit EFI_STEP1 '108'
+              edit EFI_STEP2 '228'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 240_360
+              edit ACC '120'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 360
+            family 000_360
+              edit ACC '360'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_op
+          trigger op eq complete
+          edit EPSLEG '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_nop
+          trigger nop eq complete
+          edit EPSLEG '2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmin
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family ts
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family hsttmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'hsstmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family data
+          trigger arch_op eq complete and arch_nop eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efidata
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efidata
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efidata
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efidata
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efidata
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efidata
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efidata
+          endfamily
+          family hsstmax
+            edit PARAM 'hsstmax'
+            task efidata
+              edit PARAM 'hsttmax'
+          endfamily
+        endfamily
+        family plot
+          trigger data eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSURLBASE 'http://intra.ecmwf.int/plots'
+          edit SMSURL 'd/inspect/esuite/esuite_33r1/medium/eps/efi/'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+          edit METVIEW 'metview_new'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efiplot
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efiplot
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efiplot
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efiplot
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efiplot
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efiplot
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efiplot
+          endfamily
+          family hsstmax
+            edit PARAM 'hsstmax'
+            task efiplot
+              edit PARAM 'hsstmax'
+          endfamily
+          family hsttmax
+            edit PARAM 'hsttmax'
+            task efiplot
+          endfamily
+        endfamily
+      endfamily
+      family 00
+        trigger ( ./deps/00 eq complete or ./deps/00 eq unknown) and ( ./12 eq complete or ./12 eq unknown)
+        edit EMOS_BASE '00'
+        edit DELTA_DAY '1'
+        edit STEP1 '-1'
+        family op
+          edit EPSLEG '1'
+          task stage
+          family 024
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '024'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '024'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '024'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            trigger ./024 eq complete
+            family 000_120
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_144
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            trigger ./024 eq complete
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family nop
+          edit EPSLEG '2'
+          task stage
+          family 024
+            family 000_024
+              edit ACC '024'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '024'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_048
+              edit ACC '024'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '048'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_072
+              edit ACC '024'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '072'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_096
+              edit ACC '024'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '096'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_120
+              edit ACC '024'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '120'
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family reproc
+              family 120_144
+                edit ACC '024'
+                edit EFI_STEP1 '120'
+                edit EFI_STEP2 '144'
+                family tp
+                  edit RF_NAME 'tp'
+                  task extindex
+                endfamily
+              endfamily
+              family 144_168
+                edit ACC '024'
+                edit EFI_STEP1 '144'
+                edit EFI_STEP2 '168'
+                family tp
+                  edit RF_NAME 'tp'
+                  task extindex
+                endfamily
+              endfamily
+            endfamily
+            family 120_144
+              edit ACC '024'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 144_168
+              edit ACC '024'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '168'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10fg
+                edit RF_NAME '10fg'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmin
+                edit RF_NAME '2tmin'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2tmax
+                edit RF_NAME '2tmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family hsttmax
+                edit RF_NAME 'hsttmax'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family ts
+                edit RF_NAME 'ts'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 168_192
+              edit ACC '24'
+              edit EFI_STEP1 '168'
+              edit EFI_STEP2 '192'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 192_216
+              edit ACC '24'
+              edit EFI_STEP1 '192'
+              edit EFI_STEP2 '216'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 216_240
+              edit ACC '24'
+              edit EFI_STEP1 '216'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 240_264
+              edit ACC '24'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '264'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 264_288
+              edit ACC '24'
+              edit EFI_STEP1 '264'
+              edit EFI_STEP2 '288'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 288_312
+              edit ACC '24'
+              edit EFI_STEP1 '288'
+              edit EFI_STEP2 '312'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 312_336
+              edit ACC '24'
+              edit EFI_STEP1 '312'
+              edit EFI_STEP2 '336'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+            family 336_360
+              edit ACC '24'
+              edit EFI_STEP1 '336'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+              endfamily
+            endfamily
+          endfamily
+          family 072
+            family 000_072
+              edit ACC '072'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '072'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_096
+              edit ACC '072'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '096'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_120
+              edit ACC '072'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '120'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_144
+              edit ACC '072'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '144'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_168
+              edit ACC '072'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 120_192
+              edit ACC '072'
+              edit EFI_STEP1 '120'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 144_216
+              edit ACC '072'
+              edit EFI_STEP1 '144'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 120
+            family 000_120
+              edit ACC '120'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '120'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 024_144
+              edit ACC '120'
+              edit EFI_STEP1 '024'
+              edit EFI_STEP2 '144'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 048_168
+              edit ACC '120'
+              edit EFI_STEP1 '048'
+              edit EFI_STEP2 '168'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 072_192
+              edit ACC '120'
+              edit EFI_STEP1 '072'
+              edit EFI_STEP2 '192'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 096_216
+              edit ACC '120'
+              edit EFI_STEP1 '096'
+              edit EFI_STEP2 '216'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+            family 240_360
+              edit ACC '120'
+              edit EFI_STEP1 '240'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 240
+            family 000_240
+              edit ACC '240'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '240'
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+          family 360
+            family 000_360
+              edit ACC '360'
+              edit EFI_STEP1 '000'
+              edit EFI_STEP2 '360'
+              family tp
+                edit RF_NAME 'tp'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 2t
+                edit RF_NAME '2t'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+              family 10ff
+                edit RF_NAME '10ff'
+                task prepeps
+                task extindex
+                  trigger ./prepeps eq complete
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_op
+          trigger op eq complete
+          edit EPSLEG '1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family arch_nop
+          trigger nop eq complete
+          edit EPSLEG '2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+          task efi2fdb
+            edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+            event none
+          family arch
+            trigger ./efi2fdb eq complete
+            family 2t
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2t'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10ff
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10ff'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 10fg
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '10fg'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family tp
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'tp'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmin
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmin'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family 2tmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME '2tmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family ts
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'ts'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+            family hsttmax
+              edit step1 '24'
+              edit step2 '24'
+              edit RF_NAME 'hsstmax'
+              task efi
+                label info ""
+              family sot
+                edit EFI_TYPE 'sot'
+                task efi
+              endfamily
+            endfamily
+          endfamily
+        endfamily
+        family data
+          trigger arch_op eq complete and arch_nop eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efidata
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efidata
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efidata
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efidata
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efidata
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efidata
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efidata
+          endfamily
+          family hsstmax
+            edit PARAM 'hsstmax'
+            task efidata
+          endfamily
+        endfamily
+        family plot
+          trigger data eq complete
+          edit WSHOST 'linux_cluster'
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit SMSURLBASE 'http://intra.ecmwf.int/plots'
+          edit SMSURL 'd/inspect/esuite/esuite_33r1/medium/eps/efi/'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/smsfiles/web'
+          edit METVIEW 'metview_new'
+          inlimit /limits:linux_cluster
+          family 2t
+            edit PARAM '2t'
+            task efiplot
+          endfamily
+          family 2tmin
+            edit PARAM '2tmin'
+            task efiplot
+          endfamily
+          family 2tmax
+            edit PARAM '2tmax'
+            task efiplot
+          endfamily
+          family tp
+            edit PARAM 'tp'
+            task efiplot
+          endfamily
+          family 10ff
+            edit PARAM '10ff'
+            task efiplot
+          endfamily
+          family 10fg
+            edit PARAM '10fg'
+            task efiplot
+          endfamily
+          family sf
+            edit PARAM 'sf'
+            task efiplot
+          endfamily
+          family hsstmax
+            edit PARAM 'hsstmax'
+            task efiplot
+              edit PARAM 'hsttmax'
+          endfamily
+          family hsttmax
+            edit PARAM 'hsttmax'
+            task efiplot
+              edit PARAM 'hsstmax'
+          endfamily
+        endfamily
+      endfamily
+      task efi_cleaner
+        trigger ( ./12 eq complete or ./12 eq unknown) and ( ./00 eq complete or ./00 eq unknown)
+    endfamily
+    family hind
+      repeat date YMD 20080717 20121212 7
+      edit DELTA_DAY '0'
+      family stage
+        edit RF_NAME 'all'
+        edit RETRIEVE 'stage'
+        task prep
+      endfamily
+      family op
+        trigger ./stage eq complete
+        edit EPSLEG '1'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          trigger ./024 eq complete
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          trigger ./024 eq complete
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family nop
+        trigger ./stage eq complete
+        edit EPSLEG '2'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 240_264
+            edit ACC '024'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '264'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 264_288
+            edit ACC '024'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '288'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 288_312
+            edit ACC '024'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '312'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 312_336
+            edit ACC '024'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+          family 336_360
+            edit ACC '024'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '360'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 000
+          family 006_006
+            edit ACC '000'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '006'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 012_012
+            edit ACC '000'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '012'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 018_018
+            edit ACC '000'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '018'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 024_024
+            edit ACC '000'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '024'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 030_030
+            edit ACC '000'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '030'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 036_036
+            edit ACC '000'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '036'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 042_042
+            edit ACC '000'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '042'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 048_048
+            edit ACC '000'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '048'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 054_054
+            edit ACC '000'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '054'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 060_060
+            edit ACC '000'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '060'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 066_066
+            edit ACC '000'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '066'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 072_072
+            edit ACC '000'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '072'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 078_078
+            edit ACC '000'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '078'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 084_084
+            edit ACC '000'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '084'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 090_090
+            edit ACC '000'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '090'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 096_096
+            edit ACC '000'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '096'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 102_102
+            edit ACC '000'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '102'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 108_108
+            edit ACC '000'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '108'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 114_114
+            edit ACC '000'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '114'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_120
+            edit ACC '000'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '120'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 126_126
+            edit ACC '000'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '126'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 132_132
+            edit ACC '000'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '132'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 138_138
+            edit ACC '000'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '138'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 144_144
+            edit ACC '000'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '144'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 150_150
+            edit ACC '000'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '150'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 156_156
+            edit ACC '000'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '156'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 162_162
+            edit ACC '000'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '162'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 168_168
+            edit ACC '000'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '168'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 174_174
+            edit ACC '000'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '174'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 180_180
+            edit ACC '000'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '180'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 186_186
+            edit ACC '000'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '186'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 192_192
+            edit ACC '000'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '192'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 198_198
+            edit ACC '000'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '198'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 204_204
+            edit ACC '000'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '204'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 210_210
+            edit ACC '000'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '210'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 216_216
+            edit ACC '000'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '216'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 222_222
+            edit ACC '000'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '222'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 228_228
+            edit ACC '000'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '228'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 234_234
+            edit ACC '000'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '234'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 240_240
+            edit ACC '000'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '240'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 252_252
+            edit ACC '000'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '252'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 264_264
+            edit ACC '000'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '264'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 276_276
+            edit ACC '000'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '276'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 288_288
+            edit ACC '000'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '288'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 300_300
+            edit ACC '000'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '300'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 312_312
+            edit ACC '000'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '312'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 324_324
+            edit ACC '000'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '324'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 336_336
+            edit ACC '000'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '336'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 348_348
+            edit ACC '000'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '348'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+          family 360_360
+            edit ACC '000'
+            edit EFI_STEP1 '360'
+            edit EFI_STEP2 '360'
+            family 850t
+              edit RF_NAME '850t'
+              task prep
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 006
+          family 000_006
+            edit ACC '006'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '006'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 006_012
+            edit ACC '006'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 012_018
+            edit ACC '006'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '018'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 018_024
+            edit ACC '006'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 024_030
+            edit ACC '006'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '030'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 030_036
+            edit ACC '006'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 036_042
+            edit ACC '006'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '042'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 042_048
+            edit ACC '006'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 048_054
+            edit ACC '006'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '054'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 054_060
+            edit ACC '006'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 060_066
+            edit ACC '006'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '066'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 066_072
+            edit ACC '006'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 072_078
+            edit ACC '006'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '078'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 078_084
+            edit ACC '006'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 084_090
+            edit ACC '006'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '090'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 090_096
+            edit ACC '006'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 096_102
+            edit ACC '006'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '102'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 102_108
+            edit ACC '006'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 108_114
+            edit ACC '006'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '114'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 114_120
+            edit ACC '006'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 120_126
+            edit ACC '006'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '126'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 126_132
+            edit ACC '006'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 132_138
+            edit ACC '006'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '138'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 138_144
+            edit ACC '006'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 144_150
+            edit ACC '006'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '150'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 150_156
+            edit ACC '006'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 156_162
+            edit ACC '006'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '162'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 162_168
+            edit ACC '006'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 168_174
+            edit ACC '006'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '174'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 174_180
+            edit ACC '006'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 180_186
+            edit ACC '006'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '186'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 186_192
+            edit ACC '006'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 192_198
+            edit ACC '006'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '198'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 198_204
+            edit ACC '006'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 204_210
+            edit ACC '006'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '210'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 210_216
+            edit ACC '006'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 216_222
+            edit ACC '006'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '222'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 222_228
+            edit ACC '006'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 228_234
+            edit ACC '006'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '234'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+          family 234_240
+            edit ACC '006'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 012
+          family 000_012
+            edit ACC '012'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 012_024
+            edit ACC '012'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 024_036
+            edit ACC '012'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 036_048
+            edit ACC '012'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 048_060
+            edit ACC '012'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 060_072
+            edit ACC '012'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 072_084
+            edit ACC '012'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 084_096
+            edit ACC '012'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 096_108
+            edit ACC '012'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 108_120
+            edit ACC '012'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 120_132
+            edit ACC '012'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 132_144
+            edit ACC '012'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 144_156
+            edit ACC '012'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 156_168
+            edit ACC '012'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 168_180
+            edit ACC '012'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 180_192
+            edit ACC '012'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 192_204
+            edit ACC '012'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 204_216
+            edit ACC '012'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 216_228
+            edit ACC '012'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 228_240
+            edit ACC '012'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 240_252
+            edit ACC '012'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '252'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 252_264
+            edit ACC '012'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '264'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 264_276
+            edit ACC '012'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '276'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 276_288
+            edit ACC '012'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '288'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 288_300
+            edit ACC '012'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '300'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 300_312
+            edit ACC '012'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '312'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 312_324
+            edit ACC '012'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '324'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 324_336
+            edit ACC '012'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '336'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 336_348
+            edit ACC '012'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '348'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+          family 348_360
+            edit ACC '012'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 072
+          trigger ./024 eq complete
+          family 000_072
+            edit ACC '072'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 024_096
+            edit ACC '072'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 048_120
+            edit ACC '072'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 072_144
+            edit ACC '072'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 096_168
+            edit ACC '072'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_192
+            edit ACC '072'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 144_216
+            edit ACC '072'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 168_240
+            edit ACC '072'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          trigger ./024 eq complete
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 048_168
+            edit ACC '120'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 072_192
+            edit ACC '120'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 096_216
+            edit ACC '120'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_240
+            edit ACC '120'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 240_360
+            edit ACC '120'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          trigger ./024 eq complete
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+          family 120_360
+            edit ACC '240'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+        family 360
+          trigger ./024 eq complete
+          family 000_360
+            edit ACC '360'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family check_nrt
+        complete ./check_nrt/go eq complete
+        edit REFPATH '/mofc/hc2'
+        family catchup
+          task check_nrt
+            event ok
+        endfamily
+        family rt
+          trigger catchup eq complete
+          task check_nrt
+            event ok
+            cron -w 1 06:30
+        endfamily
+        task go
+          complete ./rt/check_nrt:ok or ./catchup/check_nrt:ok
+          trigger 0 eq 1
+      endfamily
+    endfamily
+    family clim
+      repeat date YMD 20080717 20121212 7
+      edit DELTA_DAY '-7'
+      family deps
+        trigger ../hind:YMD gt ../clim:YMD
+        task dummy
+          complete 1 eq 1
+      endfamily
+      family op
+        trigger deps eq complete
+        edit EPSLEG '1'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family op2fdb
+        trigger op eq complete
+        edit EPSLEG '1'
+        task efi2fdb
+          edit KIND 'clim1'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+      endfamily
+      family nop
+        trigger deps eq complete
+        edit EPSLEG '2'
+        family 024
+          family 000_024
+            edit ACC '024'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '024'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_036
+            edit ACC '024'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '036'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_048
+            edit ACC '024'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '048'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_060
+            edit ACC '024'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '060'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_072
+            edit ACC '024'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '072'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_084
+            edit ACC '024'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '084'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_096
+            edit ACC '024'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '096'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_108
+            edit ACC '024'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '108'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_120
+            edit ACC '024'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '120'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_132
+            edit ACC '024'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '132'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_144
+            edit ACC '024'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '144'
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_168
+            edit ACC '024'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '168'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_192
+            edit ACC '024'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '192'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_216
+            edit ACC '024'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '216'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_240
+            edit ACC '024'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_264
+            edit ACC '024'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '264'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 264_288
+            edit ACC '024'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '288'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 288_312
+            edit ACC '024'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '312'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 312_336
+            edit ACC '024'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '336'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+          family 336_360
+            edit ACC '024'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '360'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+            family hsttmax
+              edit RF_NAME 'hsttmax'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 000
+          family 006_006
+            edit ACC '000'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '006'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_012
+            edit ACC '000'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '012'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 018_018
+            edit ACC '000'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '018'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_024
+            edit ACC '000'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '024'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 030_030
+            edit ACC '000'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '030'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_036
+            edit ACC '000'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '036'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 042_042
+            edit ACC '000'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '042'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_048
+            edit ACC '000'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '048'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 054_054
+            edit ACC '000'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '054'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_060
+            edit ACC '000'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '060'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 066_066
+            edit ACC '000'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '066'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_072
+            edit ACC '000'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '072'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 078_078
+            edit ACC '000'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '078'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_084
+            edit ACC '000'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '084'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 090_090
+            edit ACC '000'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '090'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_096
+            edit ACC '000'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '096'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 102_102
+            edit ACC '000'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '102'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_108
+            edit ACC '000'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '108'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 114_114
+            edit ACC '000'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '114'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_120
+            edit ACC '000'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '120'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 126_126
+            edit ACC '000'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '126'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 132_132
+            edit ACC '000'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '132'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 138_138
+            edit ACC '000'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '138'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_144
+            edit ACC '000'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '144'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 150_150
+            edit ACC '000'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '150'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 156_156
+            edit ACC '000'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '156'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 162_162
+            edit ACC '000'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '162'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_168
+            edit ACC '000'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '168'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 174_174
+            edit ACC '000'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '174'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 180_180
+            edit ACC '000'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '180'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 186_186
+            edit ACC '000'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '186'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_192
+            edit ACC '000'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '192'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 198_198
+            edit ACC '000'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '198'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 204_204
+            edit ACC '000'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '204'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 210_210
+            edit ACC '000'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '210'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_216
+            edit ACC '000'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '216'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 222_222
+            edit ACC '000'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '222'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 228_228
+            edit ACC '000'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '228'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 234_234
+            edit ACC '000'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '234'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_240
+            edit ACC '000'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '240'
+            family 10dd
+              edit RF_NAME '10dd'
+              task prep_sort
+            endfamily
+            family tcc
+              edit RF_NAME 'tcc'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 252_252
+            edit ACC '000'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '252'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 264_264
+            edit ACC '000'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '264'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 276_276
+            edit ACC '000'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '276'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 288_288
+            edit ACC '000'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '288'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 300_300
+            edit ACC '000'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '300'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 312_312
+            edit ACC '000'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '312'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 324_324
+            edit ACC '000'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '324'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 336_336
+            edit ACC '000'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '336'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 348_348
+            edit ACC '000'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '348'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+          family 360_360
+            edit ACC '000'
+            edit EFI_STEP1 '360'
+            edit EFI_STEP2 '360'
+            family 850t
+              edit RF_NAME '850t'
+              task prep_sort
+            endfamily
+            family 500z
+              edit RF_NAME '500z'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 006
+          family 000_006
+            edit ACC '006'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '006'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 006_012
+            edit ACC '006'
+            edit EFI_STEP1 '006'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_018
+            edit ACC '006'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '018'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 018_024
+            edit ACC '006'
+            edit EFI_STEP1 '018'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_030
+            edit ACC '006'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '030'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 030_036
+            edit ACC '006'
+            edit EFI_STEP1 '030'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_042
+            edit ACC '006'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '042'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 042_048
+            edit ACC '006'
+            edit EFI_STEP1 '042'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_054
+            edit ACC '006'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '054'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 054_060
+            edit ACC '006'
+            edit EFI_STEP1 '054'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_066
+            edit ACC '006'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '066'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 066_072
+            edit ACC '006'
+            edit EFI_STEP1 '066'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_078
+            edit ACC '006'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '078'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 078_084
+            edit ACC '006'
+            edit EFI_STEP1 '078'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_090
+            edit ACC '006'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '090'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 090_096
+            edit ACC '006'
+            edit EFI_STEP1 '090'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_102
+            edit ACC '006'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '102'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 102_108
+            edit ACC '006'
+            edit EFI_STEP1 '102'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_114
+            edit ACC '006'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '114'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 114_120
+            edit ACC '006'
+            edit EFI_STEP1 '114'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_126
+            edit ACC '006'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '126'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 126_132
+            edit ACC '006'
+            edit EFI_STEP1 '126'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 132_138
+            edit ACC '006'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '138'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 138_144
+            edit ACC '006'
+            edit EFI_STEP1 '138'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_150
+            edit ACC '006'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '150'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 150_156
+            edit ACC '006'
+            edit EFI_STEP1 '150'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 156_162
+            edit ACC '006'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '162'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 162_168
+            edit ACC '006'
+            edit EFI_STEP1 '162'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_174
+            edit ACC '006'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '174'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 174_180
+            edit ACC '006'
+            edit EFI_STEP1 '174'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 180_186
+            edit ACC '006'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '186'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 186_192
+            edit ACC '006'
+            edit EFI_STEP1 '186'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_198
+            edit ACC '006'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '198'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 198_204
+            edit ACC '006'
+            edit EFI_STEP1 '198'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 204_210
+            edit ACC '006'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '210'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 210_216
+            edit ACC '006'
+            edit EFI_STEP1 '210'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_222
+            edit ACC '006'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '222'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 222_228
+            edit ACC '006'
+            edit EFI_STEP1 '222'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 228_234
+            edit ACC '006'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '234'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+          family 234_240
+            edit ACC '006'
+            edit EFI_STEP1 '234'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family ts
+              edit RF_NAME 'ts'
+              task prep_sort
+            endfamily
+            family 10fg
+              edit RF_NAME '10fg'
+              task prep_sort
+            endfamily
+            family 2tmin
+              edit RF_NAME '2tmin'
+              task prep_sort
+            endfamily
+            family 2tmax
+              edit RF_NAME '2tmax'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 012
+          family 000_012
+            edit ACC '012'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '012'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 012_024
+            edit ACC '012'
+            edit EFI_STEP1 '012'
+            edit EFI_STEP2 '024'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_036
+            edit ACC '012'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '036'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 036_048
+            edit ACC '012'
+            edit EFI_STEP1 '036'
+            edit EFI_STEP2 '048'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_060
+            edit ACC '012'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '060'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 060_072
+            edit ACC '012'
+            edit EFI_STEP1 '060'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_084
+            edit ACC '012'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '084'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 084_096
+            edit ACC '012'
+            edit EFI_STEP1 '084'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_108
+            edit ACC '012'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '108'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 108_120
+            edit ACC '012'
+            edit EFI_STEP1 '108'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_132
+            edit ACC '012'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '132'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 132_144
+            edit ACC '012'
+            edit EFI_STEP1 '132'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_156
+            edit ACC '012'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '156'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 156_168
+            edit ACC '012'
+            edit EFI_STEP1 '156'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_180
+            edit ACC '012'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '180'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 180_192
+            edit ACC '012'
+            edit EFI_STEP1 '180'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 192_204
+            edit ACC '012'
+            edit EFI_STEP1 '192'
+            edit EFI_STEP2 '204'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 204_216
+            edit ACC '012'
+            edit EFI_STEP1 '204'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 216_228
+            edit ACC '012'
+            edit EFI_STEP1 '216'
+            edit EFI_STEP2 '228'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 228_240
+            edit ACC '012'
+            edit EFI_STEP1 '228'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_252
+            edit ACC '012'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '252'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 252_264
+            edit ACC '012'
+            edit EFI_STEP1 '252'
+            edit EFI_STEP2 '264'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 264_276
+            edit ACC '012'
+            edit EFI_STEP1 '264'
+            edit EFI_STEP2 '276'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 276_288
+            edit ACC '012'
+            edit EFI_STEP1 '276'
+            edit EFI_STEP2 '288'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 288_300
+            edit ACC '012'
+            edit EFI_STEP1 '288'
+            edit EFI_STEP2 '300'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 300_312
+            edit ACC '012'
+            edit EFI_STEP1 '300'
+            edit EFI_STEP2 '312'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 312_324
+            edit ACC '012'
+            edit EFI_STEP1 '312'
+            edit EFI_STEP2 '324'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 324_336
+            edit ACC '012'
+            edit EFI_STEP1 '324'
+            edit EFI_STEP2 '336'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 336_348
+            edit ACC '012'
+            edit EFI_STEP1 '336'
+            edit EFI_STEP2 '348'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+          family 348_360
+            edit ACC '012'
+            edit EFI_STEP1 '348'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 072
+          family 000_072
+            edit ACC '072'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '072'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_096
+            edit ACC '072'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '096'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_120
+            edit ACC '072'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '120'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_144
+            edit ACC '072'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '144'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_168
+            edit ACC '072'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_192
+            edit ACC '072'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 144_216
+            edit ACC '072'
+            edit EFI_STEP1 '144'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 168_240
+            edit ACC '072'
+            edit EFI_STEP1 '168'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 120
+          family 000_120
+            edit ACC '120'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '120'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 024_144
+            edit ACC '120'
+            edit EFI_STEP1 '024'
+            edit EFI_STEP2 '144'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 048_168
+            edit ACC '120'
+            edit EFI_STEP1 '048'
+            edit EFI_STEP2 '168'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 072_192
+            edit ACC '120'
+            edit EFI_STEP1 '072'
+            edit EFI_STEP2 '192'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 096_216
+            edit ACC '120'
+            edit EFI_STEP1 '096'
+            edit EFI_STEP2 '216'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_240
+            edit ACC '120'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '240'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 240_360
+            edit ACC '120'
+            edit EFI_STEP1 '240'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 240
+          family 000_240
+            edit ACC '240'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '240'
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+          family 120_360
+            edit ACC '240'
+            edit EFI_STEP1 '120'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+        family 360
+          family 000_360
+            edit ACC '360'
+            edit EFI_STEP1 '000'
+            edit EFI_STEP2 '360'
+            family tp
+              edit RF_NAME 'tp'
+              task prep_sort
+            endfamily
+            family 2t
+              edit RF_NAME '2t'
+              task prep_sort
+            endfamily
+            family 10ff
+              edit RF_NAME '10ff'
+              task prep_sort
+            endfamily
+          endfamily
+        endfamily
+      endfamily
+      family nop2fdb
+        trigger nop eq complete and ./op2fdb eq complete
+        edit EPSLEG '2'
+        task efi2fdb
+          edit KIND 'clim2'
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/mc/efi_hdc'
+      endfamily
+      family arch_nop
+        trigger nop2fdb eq complete
+        edit EPSLEG '2'
+        edit SMSFILES '/home/ma/emos/def/emc_36r1/archive'
+        family 2t
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '2t'
+          task eficlim
+            label info ""
+        endfamily
+        family 10ff
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '10ff'
+          task eficlim
+            label info ""
+        endfamily
+        family 10fg
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '10fg'
+          task eficlim
+            label info ""
+        endfamily
+        family tp
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'tp'
+          task eficlim
+            label info ""
+        endfamily
+        family 2tmin
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '2tmin'
+          task eficlim
+            label info ""
+        endfamily
+        family 2tmax
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '2tmax'
+          task eficlim
+            label info ""
+        endfamily
+        family ts
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'ts'
+          task eficlim
+            label info ""
+        endfamily
+        family hsttmax
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'hsttmax'
+          task eficlim
+            label info ""
+        endfamily
+        family 10dd
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '10dd'
+          task eficlim
+            label info ""
+        endfamily
+        family 850t
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '850t'
+          task eficlim
+            label info ""
+        endfamily
+        family 500z
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME '500z'
+          task eficlim
+            label info ""
+        endfamily
+        family 2tmean
+          edit step2 '24'
+          edit RF_NAME '2t'
+          edit step1 '0'
+          task eficlim
+            label info ""
+        endfamily
+        family 10ffmean
+          edit step2 '24'
+          edit RF_NAME '10ff'
+          edit step1 '0'
+          task eficlim
+            label info ""
+        endfamily
+        family tcc
+          edit step1 '24'
+          edit step2 '24'
+          edit RF_NAME 'tcc'
+          task eficlim
+            label info ""
+        endfamily
+        family tccmean
+          edit step2 '24'
+          edit RF_NAME 'tcc'
+          edit step1 '0'
+          task eficlim
+            label info ""
+        endfamily
+      endfamily
+      family gdb
+        trigger ( op eq complete and nop eq complete) and ( arch_nop eq complete)
+        edit RHOST 'epsgrams'
+        edit RDIR '/webapps/epsgrams/data/'
+        edit KIND 'clim_15_days'
+        edit WSHOST 'linux_cluster'
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        inlimit /limits:linux_cluster
+        task sync_climate
+        task gclean
+          trigger sync_climate eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data/epsgrams/grams'
+          edit KEEP_DAYS '14'
+          edit REMOTE_KEEP_DAYS '14'
+        task gdb
+          trigger gclean eq complete and ( /emc_36r1/main:YMD ge /emc_36r1/efi_next/mn:YMD and /emc_36r1/main/00 eq complete)
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data/epsgrams/grams'
+          label files "="
+          label info "="
+          label local "="
+          label remote "="
+          event fdb
+          event 1 
+        task glink
+          trigger gdb eq complete
+          edit SMSFILES '/home/ma/emos/def/emc_36r1/pop/data/epsgrams/grams'
+      endfamily
+      family check_nrt
+        complete ./check_nrt/go eq complete
+        edit REFPATH '/mofc/hc2'
+        family catchup
+          task check_nrt
+            event ok
+        endfamily
+        family rt
+          trigger catchup eq complete
+          task check_nrt
+            event ok
+            cron -w 3 06:30
+        endfamily
+        task go
+          complete ./rt/check_nrt:ok or ./catchup/check_nrt:ok
+          trigger 0 eq 1
+      endfamily
+      task efi_cleaner
+        trigger ( arch_nop eq complete or arch_nop eq unknown) and ( op eq complete or op eq unknown) and ( nop eq complete or nop eq unknown) and ( op2fdb eq complete or op2fdb eq unknown) and ( nop2fdb eq complete or nop2fdb eq unknown)
+        edit DELTA_DAY '-43'
+    endfamily
+  endfamily
+endsuite
+suite elaw_36r1
+  edit SUITE_TYPE 'law'
+  edit USER 'emos'
+  edit SCHOST 'c1b'
+  edit STHOST '/s1b'
+  edit STHOST_BKUP '/s1a'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit VERSION '0046'
+  edit INIEXPVER '0001'
+  edit WVINIEXPVER 'false'
+  edit INIWDEXPVER '0046'
+  edit INIWDCLASS 'od'
+  edit FIRST_DAY '1'
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit REINITIALIZE 'false'
+  edit DATEMASK '*.*.*'
+  edit YMD '20091016'
+  edit USE_YMD 'true'
+  edit FSFAMILY 'euroshelf'
+  edit VERIF_WAIT '10'
+  edit MARS_DB 'marsod'
+  edit VERIFY 'verify'
+  edit SUITE_START '2009101612'
+  edit SMSTRIES '2'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/elaw_36r1'
+  edit SMSINCLUDE '/home/ma/emos/def/elaw_36r1/include'
+  edit RESERVATION_ON '1'
+  edit QUEUE 'os'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit.36r1 %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+  edit ANTIME '12'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '12'
+  edit EMOS_PROJECT '00'
+  edit EMOS_TIME_STEP_H '0000'
+  edit PGEN_BINDIR '/home/ma/emos/bin/diss'
+  edit PGEN_OBJDIR '/home/ma/emos/bin/diss'
+  edit DISS_REQDB_ROOT '/diss/requirements'
+  edit DISS_BINDIR '/diss/bin/DISS'
+  edit ANNPES '1'
+  edit FCNPES '128'
+  edit EMOS_DOMAIN 'M'
+  edit PROD_TASK '1'
+  edit EMOS_TYPE 'fc'
+  edit DATA_COV 'no'
+  edit EMOS_STREAM 'WV'
+  edit STREAM 'DA'
+  edit INISTREAM 'wave'
+  edit ACCOUNT 'oewave'
+  edit WAMLEN '10'
+  edit WAM1ST 'no'
+  edit GRID '0.25/0.25'
+  edit RET_GRID '1.5/1.5'
+  edit SMSLOGHOST 'c1b'
+  edit SMSLOGPORT '9316'
+  edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+  edit SLEEPTIME '1'
+  inlimit /limits:c1b
+  clock hybrid 
+  family limits
+    limit mars 2
+    limit prod 5
+    limit pdb 5
+    limit q2diss 5
+    limit prodcheck 1
+  endfamily
+  family main
+    trigger /elaw_36r1/main:YMD le /e_36r1/main:YMD
+    repeat date YMD 20091016 20121212 1
+    edit LOGTASK 'main'
+    family make
+      task setup
+      task wconst
+        trigger setup eq complete
+      task wavini
+        trigger wconst eq complete
+      family prod
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/prod/make'
+        edit EMOS_DOMAIN 'g'
+        edit EMOS_TYPE 'fc'
+        edit EMOS_STREAM 'OPER'
+        task wparam
+          edit EMOS_TYPE 'wp'
+        task tf
+          edit EMOS_TYPE 'tf'
+        task sortreq
+        task bitmap
+        task clima
+        task disssch
+        task tools
+        task oper
+        task wave
+          edit EMOS_STREAM 'WAVE'
+      endfamily
+    endfamily
+    family 12
+      trigger make eq complete
+      edit EMOS_BASE '12'
+      edit EMOS_PROJECT '12'
+      edit DELTA_DAY '0'
+      family ref
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        task model
+          trigger ( /e_36r1/main:YMD gt /elaw_36r1/main:YMD) or ( /e_36r1/main:YMD eq /elaw_36r1/main:YMD and /e_36r1/main/12/fc/model eq complete)
+        task prod
+          trigger ( /e_36r1/main:YMD gt /elaw_36r1/main:YMD) or ( /e_36r1/main:YMD eq /elaw_36r1/main:YMD and /e_36r1/main/12/getreq eq complete)
+        task sst
+          trigger ( /e_36r1/main:YMD gt /elaw_36r1/main:YMD) or ( /e_36r1/main:YMD eq /elaw_36r1/main:YMD and /e_36r1/main/12/an/surf_anal/sst eq complete)
+      endfamily
+      family euroshelf
+        trigger ref/model eq complete
+        edit EMOS_DOMAIN 'M'
+        edit GRID '0.25/0.25'
+        edit RET_GRID '0.25/0.25'
+        edit WAMLEN '5'
+        task wamobs
+        task wamwind
+        task wamwave
+          trigger /elaw_36r1/main/12/ref/sst eq complete
+        task wamrun
+          trigger wamobs eq complete and wamwind eq complete and wamwave eq complete
+          edit USER_PRIORITY '80'
+          edit SMSTRIES '1'
+          edit THREADS '2'
+      endfamily
+      family getreq
+        trigger ref/prod eq complete
+        edit EMOS_TYPE 'fc'
+        edit EMOS_DOMAIN 'M'
+        edit FSFAMILY 'ppdi'
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/prod'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'WAVE'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger req:001 or req eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete
+          label info ""
+          event 1 
+      endfamily
+      family prod
+        edit ACCOUNT 'oewavepg'
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit PGNPES '1'
+        edit EMOS_TIME_STEP_H '0000'
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSURL 'MWAVE/12'
+        edit DELTA_DAY '-1'
+        inlimit /limits:prod
+        inlimit /elaw_36r1/limits:prod
+        family 06
+          edit SMSURL 'MWAVE/06'
+          family an
+            trigger /elaw_36r1/main/12/euroshelf/wamrun eq complete and ( /elaw_36r1/main/12/getreq/bitmap:001 or /elaw_36r1/main/12/getreq/bitmap eq complete) and ( /elaw_36r1/main/12/getreq/req:001 or /elaw_36r1/main/12/getreq/req eq complete)
+            edit EMOS_TYPE 'an'
+            edit EMOS_BASE '06'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+        endfamily
+        family 12
+          edit EMOS_TYPE 'fc'
+          edit PROD_TASK '1'
+          edit DELTA_DAY '0'
+          family an
+            trigger /elaw_36r1/main/12/euroshelf/wamrun eq complete and /elaw_36r1/main/12/prod/06/an/prodgen eq complete
+            edit EMOS_TYPE 'an'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 003
+            trigger ../12/an/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0003'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 006
+            trigger ./003/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0006'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 009
+            trigger ./006/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0009'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 012
+            trigger ./009/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0012'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 015
+            trigger ./012/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0015'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 018
+            trigger ./015/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0018'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 021
+            trigger ./018/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0021'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 024
+            trigger ./021/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0024'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 027
+            trigger ./024/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0027'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 030
+            trigger ./027/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0030'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 033
+            trigger ./030/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0033'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 036
+            trigger ./033/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0036'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 039
+            trigger ./036/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0039'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 042
+            trigger ./039/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0042'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 045
+            trigger ./042/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0045'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 048
+            trigger ./045/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0048'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 051
+            trigger ./048/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0051'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 054
+            trigger ./051/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0054'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 057
+            trigger ./054/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0057'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 060
+            trigger ./057/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0060'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 063
+            trigger ./060/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0063'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 066
+            trigger ./063/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0066'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 069
+            trigger ./066/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0069'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 072
+            trigger ./069/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0072'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 075
+            trigger ./072/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0075'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 078
+            trigger ./075/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0078'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 081
+            trigger ./078/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0081'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 084
+            trigger ./081/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0084'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 087
+            trigger ./084/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0087'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 090
+            trigger ./087/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0090'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 093
+            trigger ./090/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0093'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 096
+            trigger ./093/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0096'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 099
+            trigger ./096/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0099'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 102
+            trigger ./099/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0102'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 105
+            trigger ./102/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0105'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 108
+            trigger ./105/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0108'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 111
+            trigger ./108/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0111'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 114
+            trigger ./111/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0114'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 117
+            trigger ./114/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0117'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 120
+            trigger ./117/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0120'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURL 'MWAVE/12'
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_TIME_STEP_H '0000'
+        inlimit /elaw_36r1/limits:pdb
+        inlimit /limits:pdb
+        family 06
+          edit EMOS_TYPE 'an'
+          edit SMSURL 'MWAVE/06'
+          family an
+            trigger /elaw_36r1/main/12/prod/06/an/prodgen eq complete
+            edit EMOS_TYPE 'an'
+            edit EMOS_BASE '06'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+        endfamily
+        family 12
+          edit EMOS_BASE '12'
+          edit EMOS_TYPE 'fc'
+          family an
+            trigger /elaw_36r1/main/12/prod/12/an/prodgen eq complete
+            edit EMOS_TYPE 'an'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 003
+            trigger /elaw_36r1/main/12/prod/12/003/prodgen eq complete and ( ./an/diss:pdb or ./an/diss eq complete)
+            edit EMOS_TIME_STEP_H '0003'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 006
+            trigger /elaw_36r1/main/12/prod/12/006/prodgen eq complete and ( ./003/diss:pdb or ./003/diss eq complete)
+            edit EMOS_TIME_STEP_H '0006'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 009
+            trigger /elaw_36r1/main/12/prod/12/009/prodgen eq complete and ( ./006/diss:pdb or ./006/diss eq complete)
+            edit EMOS_TIME_STEP_H '0009'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 012
+            trigger /elaw_36r1/main/12/prod/12/012/prodgen eq complete and ( ./009/diss:pdb or ./009/diss eq complete)
+            edit EMOS_TIME_STEP_H '0012'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 015
+            trigger /elaw_36r1/main/12/prod/12/015/prodgen eq complete and ( ./012/diss:pdb or ./012/diss eq complete)
+            edit EMOS_TIME_STEP_H '0015'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 018
+            trigger /elaw_36r1/main/12/prod/12/018/prodgen eq complete and ( ./015/diss:pdb or ./015/diss eq complete)
+            edit EMOS_TIME_STEP_H '0018'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 021
+            trigger /elaw_36r1/main/12/prod/12/021/prodgen eq complete and ( ./018/diss:pdb or ./018/diss eq complete)
+            edit EMOS_TIME_STEP_H '0021'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 024
+            trigger /elaw_36r1/main/12/prod/12/024/prodgen eq complete and ( ./021/diss:pdb or ./021/diss eq complete)
+            edit EMOS_TIME_STEP_H '0024'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 027
+            trigger /elaw_36r1/main/12/prod/12/027/prodgen eq complete and ( ./024/diss:pdb or ./024/diss eq complete)
+            edit EMOS_TIME_STEP_H '0027'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 030
+            trigger /elaw_36r1/main/12/prod/12/030/prodgen eq complete and ( ./027/diss:pdb or ./027/diss eq complete)
+            edit EMOS_TIME_STEP_H '0030'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 033
+            trigger /elaw_36r1/main/12/prod/12/033/prodgen eq complete and ( ./030/diss:pdb or ./030/diss eq complete)
+            edit EMOS_TIME_STEP_H '0033'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 036
+            trigger /elaw_36r1/main/12/prod/12/036/prodgen eq complete and ( ./033/diss:pdb or ./033/diss eq complete)
+            edit EMOS_TIME_STEP_H '0036'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 039
+            trigger /elaw_36r1/main/12/prod/12/039/prodgen eq complete and ( ./036/diss:pdb or ./036/diss eq complete)
+            edit EMOS_TIME_STEP_H '0039'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 042
+            trigger /elaw_36r1/main/12/prod/12/042/prodgen eq complete and ( ./039/diss:pdb or ./039/diss eq complete)
+            edit EMOS_TIME_STEP_H '0042'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 045
+            trigger /elaw_36r1/main/12/prod/12/045/prodgen eq complete and ( ./042/diss:pdb or ./042/diss eq complete)
+            edit EMOS_TIME_STEP_H '0045'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 048
+            trigger /elaw_36r1/main/12/prod/12/048/prodgen eq complete and ( ./045/diss:pdb or ./045/diss eq complete)
+            edit EMOS_TIME_STEP_H '0048'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 051
+            trigger /elaw_36r1/main/12/prod/12/051/prodgen eq complete and ( ./048/diss:pdb or ./048/diss eq complete)
+            edit EMOS_TIME_STEP_H '0051'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 054
+            trigger /elaw_36r1/main/12/prod/12/054/prodgen eq complete and ( ./051/diss:pdb or ./051/diss eq complete)
+            edit EMOS_TIME_STEP_H '0054'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 057
+            trigger /elaw_36r1/main/12/prod/12/057/prodgen eq complete and ( ./054/diss:pdb or ./054/diss eq complete)
+            edit EMOS_TIME_STEP_H '0057'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 060
+            trigger /elaw_36r1/main/12/prod/12/060/prodgen eq complete and ( ./057/diss:pdb or ./057/diss eq complete)
+            edit EMOS_TIME_STEP_H '0060'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 063
+            trigger /elaw_36r1/main/12/prod/12/063/prodgen eq complete and ( ./060/diss:pdb or ./060/diss eq complete)
+            edit EMOS_TIME_STEP_H '0063'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 066
+            trigger /elaw_36r1/main/12/prod/12/066/prodgen eq complete and ( ./063/diss:pdb or ./063/diss eq complete)
+            edit EMOS_TIME_STEP_H '0066'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 069
+            trigger /elaw_36r1/main/12/prod/12/069/prodgen eq complete and ( ./066/diss:pdb or ./066/diss eq complete)
+            edit EMOS_TIME_STEP_H '0069'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 072
+            trigger /elaw_36r1/main/12/prod/12/072/prodgen eq complete and ( ./069/diss:pdb or ./069/diss eq complete)
+            edit EMOS_TIME_STEP_H '0072'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 075
+            trigger /elaw_36r1/main/12/prod/12/075/prodgen eq complete and ( ./072/diss:pdb or ./072/diss eq complete)
+            edit EMOS_TIME_STEP_H '0075'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 078
+            trigger /elaw_36r1/main/12/prod/12/078/prodgen eq complete and ( ./075/diss:pdb or ./075/diss eq complete)
+            edit EMOS_TIME_STEP_H '0078'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 081
+            trigger /elaw_36r1/main/12/prod/12/081/prodgen eq complete and ( ./078/diss:pdb or ./078/diss eq complete)
+            edit EMOS_TIME_STEP_H '0081'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 084
+            trigger /elaw_36r1/main/12/prod/12/084/prodgen eq complete and ( ./081/diss:pdb or ./081/diss eq complete)
+            edit EMOS_TIME_STEP_H '0084'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 087
+            trigger /elaw_36r1/main/12/prod/12/087/prodgen eq complete and ( ./084/diss:pdb or ./084/diss eq complete)
+            edit EMOS_TIME_STEP_H '0087'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 090
+            trigger /elaw_36r1/main/12/prod/12/090/prodgen eq complete and ( ./087/diss:pdb or ./087/diss eq complete)
+            edit EMOS_TIME_STEP_H '0090'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 093
+            trigger /elaw_36r1/main/12/prod/12/093/prodgen eq complete and ( ./090/diss:pdb or ./090/diss eq complete)
+            edit EMOS_TIME_STEP_H '0093'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 096
+            trigger /elaw_36r1/main/12/prod/12/096/prodgen eq complete and ( ./093/diss:pdb or ./093/diss eq complete)
+            edit EMOS_TIME_STEP_H '0096'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 099
+            trigger /elaw_36r1/main/12/prod/12/099/prodgen eq complete and ( ./096/diss:pdb or ./096/diss eq complete)
+            edit EMOS_TIME_STEP_H '0099'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 102
+            trigger /elaw_36r1/main/12/prod/12/102/prodgen eq complete and ( ./099/diss:pdb or ./099/diss eq complete)
+            edit EMOS_TIME_STEP_H '0102'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 105
+            trigger /elaw_36r1/main/12/prod/12/105/prodgen eq complete and ( ./102/diss:pdb or ./102/diss eq complete)
+            edit EMOS_TIME_STEP_H '0105'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 108
+            trigger /elaw_36r1/main/12/prod/12/108/prodgen eq complete and ( ./105/diss:pdb or ./105/diss eq complete)
+            edit EMOS_TIME_STEP_H '0108'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 111
+            trigger /elaw_36r1/main/12/prod/12/111/prodgen eq complete and ( ./108/diss:pdb or ./108/diss eq complete)
+            edit EMOS_TIME_STEP_H '0111'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 114
+            trigger /elaw_36r1/main/12/prod/12/114/prodgen eq complete and ( ./111/diss:pdb or ./111/diss eq complete)
+            edit EMOS_TIME_STEP_H '0114'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 117
+            trigger /elaw_36r1/main/12/prod/12/117/prodgen eq complete and ( ./114/diss:pdb or ./114/diss eq complete)
+            edit EMOS_TIME_STEP_H '0117'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 120
+            trigger /elaw_36r1/main/12/prod/12/120/prodgen eq complete and ( ./117/diss:pdb or ./117/diss eq complete)
+            edit EMOS_TIME_STEP_H '0120'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+        endfamily
+        task check
+          trigger ./12 eq complete
+        family reservation
+          trigger ./12 eq complete
+          edit SMSFILES '/home/ma/emos/def/elaw_36r1/smsfiles'
+          task loadl_cycle_limit
+            edit LOADL_CYCLE '65'
+            label info ""
+        endfamily
+      endfamily
+    endfamily
+    family 00
+      trigger ./make eq complete and ./12 eq complete
+      edit EMOS_BASE '00'
+      edit EMOS_PROJECT '00'
+      edit DELTA_DAY '1'
+      edit RESERVATION_ON '1'
+      edit QUEUE 'os'
+      family ref
+        edit QUEUE 'emos-e'
+        edit QUEUE_EPILOG 'emos-exp'
+        edit WSHOST 'localhost'
+        edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+        edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+        edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+        edit LOGDIR '/vol/emos_nc/output'
+        edit SMSOUT '/vol/emos_nc/output'
+        task model
+          trigger ( /e_36r1/main:YMD gt /elaw_36r1/main:YMD) or ( /e_36r1/main:YMD eq /elaw_36r1/main:YMD and /e_36r1/main/00/fc/model eq complete)
+        task prod
+          trigger ( /e_36r1/main:YMD gt /elaw_36r1/main:YMD) or ( /e_36r1/main:YMD eq /elaw_36r1/main:YMD and /e_36r1/main/00/getreq eq complete)
+        task sst
+          trigger ( /e_36r1/main:YMD gt /elaw_36r1/main:YMD) or ( /e_36r1/main:YMD eq /elaw_36r1/main:YMD and /e_36r1/main/00/an/surf_anal/sst eq complete)
+      endfamily
+      family euroshelf
+        trigger ref/model eq complete
+        edit EMOS_DOMAIN 'M'
+        edit GRID '0.25/0.25'
+        edit RET_GRID '0.25/0.25'
+        edit WAMLEN '5'
+        task wamobs
+        task wamwind
+        task wamwave
+          trigger ( /elaw_36r1/main/00/ref/sst eq complete) and ( /elaw_36r1/main/12/euroshelf eq complete)
+        task wamrun
+          trigger wamobs eq complete and wamwind eq complete and wamwave eq complete
+          edit USER_PRIORITY '80'
+          edit SMSTRIES '1'
+          edit THREADS '2'
+      endfamily
+      family getreq
+        trigger ref/prod eq complete
+        edit EMOS_TYPE 'fc'
+        edit EMOS_DOMAIN 'M'
+        edit FSFAMILY 'ppdi'
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/prod'
+        edit SMSTRIES '1'
+        edit EMOS_STREAM 'WAVE'
+        task collectreq
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task req
+          late -s +00:03 -c +00:10
+          trigger collectreq eq complete
+          label info ""
+          event 1 
+        task collectbitmap
+          trigger req:001 or req eq complete
+          edit QUEUE 'diss'
+          edit USER 'emos'
+          edit WSHOST 'diss'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit LOGDIR '/diss/log'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit SMSOUT '/vol/emos_nc/output'
+        task bitmap
+          late -s +00:03 -c +00:10
+          trigger collectbitmap eq complete
+          label info ""
+          event 1 
+      endfamily
+      family prod
+        edit ACCOUNT 'oewavepg'
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit PROD_TASK '1'
+        edit PGNPES '1'
+        edit EMOS_TIME_STEP_H '0000'
+        edit USER_PRIORITY '90'
+        edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/summary'
+        edit SMSURL 'MWAVE/00'
+        inlimit /limits:prod
+        inlimit /elaw_36r1/limits:prod
+        family 18
+          edit DELTA_DAY '0'
+          edit SMSURL 'MWAVE/18'
+          family an
+            trigger /elaw_36r1/main/00/euroshelf/wamrun eq complete and ( /elaw_36r1/main/00/getreq/bitmap:001 or /elaw_36r1/main/00/getreq/bitmap eq complete) and ( /elaw_36r1/main/00/getreq/req:001 or /elaw_36r1/main/00/getreq/req eq complete)
+            edit EMOS_TYPE 'an'
+            edit EMOS_BASE '18'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+        endfamily
+        family 00
+          edit EMOS_TYPE 'fc'
+          edit PROD_TASK '1'
+          edit DELTA_DAY '1'
+          family an
+            trigger /elaw_36r1/main/00/euroshelf/wamrun eq complete and /elaw_36r1/main/00/prod/18/an/prodgen eq complete
+            edit EMOS_TYPE 'an'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 003
+            trigger ../00/an/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0003'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 006
+            trigger ./003/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0006'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 009
+            trigger ./006/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0009'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 012
+            trigger ./009/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0012'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 015
+            trigger ./012/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0015'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 018
+            trigger ./015/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0018'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 021
+            trigger ./018/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0021'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 024
+            trigger ./021/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0024'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 027
+            trigger ./024/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0027'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 030
+            trigger ./027/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0030'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 033
+            trigger ./030/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0033'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 036
+            trigger ./033/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0036'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 039
+            trigger ./036/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0039'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 042
+            trigger ./039/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0042'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 045
+            trigger ./042/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0045'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 048
+            trigger ./045/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0048'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 051
+            trigger ./048/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0051'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 054
+            trigger ./051/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0054'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 057
+            trigger ./054/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0057'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 060
+            trigger ./057/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0060'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 063
+            trigger ./060/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0063'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 066
+            trigger ./063/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0066'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 069
+            trigger ./066/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0069'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 072
+            trigger ./069/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0072'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 075
+            trigger ./072/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0075'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 078
+            trigger ./075/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0078'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 081
+            trigger ./078/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0081'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 084
+            trigger ./081/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0084'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 087
+            trigger ./084/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0087'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 090
+            trigger ./087/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0090'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 093
+            trigger ./090/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0093'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 096
+            trigger ./093/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0096'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 099
+            trigger ./096/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0099'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 102
+            trigger ./099/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0102'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 105
+            trigger ./102/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0105'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 108
+            trigger ./105/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0108'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 111
+            trigger ./108/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0111'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 114
+            trigger ./111/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0114'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 117
+            trigger ./114/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0117'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+          family 120
+            trigger ./117/prodgen eq complete
+            edit EMOS_TIME_STEP_H '0120'
+            task prodgen
+              late -s +00:05 -c +00:15
+          endfamily
+        endfamily
+      endfamily
+      family prod2diss
+        edit USER_PRIORITY '90'
+        edit SMSURL 'MWAVE/00'
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/prod'
+        edit EMOS_TYPE 'fc'
+        edit FSFAMILY 'ppdi'
+        edit EMOS_TIME_STEP_H '0000'
+        inlimit /elaw_36r1/limits:pdb
+        inlimit /limits:pdb
+        family 18
+          edit DELTA_DAY '0'
+          edit EMOS_TYPE 'an'
+          edit SMSURL 'MWAVE/18'
+          family an
+            trigger /elaw_36r1/main/00/prod/18/an/prodgen eq complete
+            edit EMOS_TYPE 'an'
+            edit EMOS_BASE '18'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+        endfamily
+        family 00
+          edit EMOS_BASE '00'
+          edit EMOS_TYPE 'fc'
+          family an
+            trigger /elaw_36r1/main/00/prod/00/an/prodgen eq complete
+            edit EMOS_TYPE 'an'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 003
+            trigger /elaw_36r1/main/00/prod/00/003/prodgen eq complete and ( ./an/diss:pdb or ./an/diss eq complete)
+            edit EMOS_TIME_STEP_H '0003'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 006
+            trigger /elaw_36r1/main/00/prod/00/006/prodgen eq complete and ( ./003/diss:pdb or ./003/diss eq complete)
+            edit EMOS_TIME_STEP_H '0006'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 009
+            trigger /elaw_36r1/main/00/prod/00/009/prodgen eq complete and ( ./006/diss:pdb or ./006/diss eq complete)
+            edit EMOS_TIME_STEP_H '0009'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 012
+            trigger /elaw_36r1/main/00/prod/00/012/prodgen eq complete and ( ./009/diss:pdb or ./009/diss eq complete)
+            edit EMOS_TIME_STEP_H '0012'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 015
+            trigger /elaw_36r1/main/00/prod/00/015/prodgen eq complete and ( ./012/diss:pdb or ./012/diss eq complete)
+            edit EMOS_TIME_STEP_H '0015'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 018
+            trigger /elaw_36r1/main/00/prod/00/018/prodgen eq complete and ( ./015/diss:pdb or ./015/diss eq complete)
+            edit EMOS_TIME_STEP_H '0018'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 021
+            trigger /elaw_36r1/main/00/prod/00/021/prodgen eq complete and ( ./018/diss:pdb or ./018/diss eq complete)
+            edit EMOS_TIME_STEP_H '0021'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 024
+            trigger /elaw_36r1/main/00/prod/00/024/prodgen eq complete and ( ./021/diss:pdb or ./021/diss eq complete)
+            edit EMOS_TIME_STEP_H '0024'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 027
+            trigger /elaw_36r1/main/00/prod/00/027/prodgen eq complete and ( ./024/diss:pdb or ./024/diss eq complete)
+            edit EMOS_TIME_STEP_H '0027'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 030
+            trigger /elaw_36r1/main/00/prod/00/030/prodgen eq complete and ( ./027/diss:pdb or ./027/diss eq complete)
+            edit EMOS_TIME_STEP_H '0030'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 033
+            trigger /elaw_36r1/main/00/prod/00/033/prodgen eq complete and ( ./030/diss:pdb or ./030/diss eq complete)
+            edit EMOS_TIME_STEP_H '0033'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 036
+            trigger /elaw_36r1/main/00/prod/00/036/prodgen eq complete and ( ./033/diss:pdb or ./033/diss eq complete)
+            edit EMOS_TIME_STEP_H '0036'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 039
+            trigger /elaw_36r1/main/00/prod/00/039/prodgen eq complete and ( ./036/diss:pdb or ./036/diss eq complete)
+            edit EMOS_TIME_STEP_H '0039'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 042
+            trigger /elaw_36r1/main/00/prod/00/042/prodgen eq complete and ( ./039/diss:pdb or ./039/diss eq complete)
+            edit EMOS_TIME_STEP_H '0042'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 045
+            trigger /elaw_36r1/main/00/prod/00/045/prodgen eq complete and ( ./042/diss:pdb or ./042/diss eq complete)
+            edit EMOS_TIME_STEP_H '0045'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 048
+            trigger /elaw_36r1/main/00/prod/00/048/prodgen eq complete and ( ./045/diss:pdb or ./045/diss eq complete)
+            edit EMOS_TIME_STEP_H '0048'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 051
+            trigger /elaw_36r1/main/00/prod/00/051/prodgen eq complete and ( ./048/diss:pdb or ./048/diss eq complete)
+            edit EMOS_TIME_STEP_H '0051'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 054
+            trigger /elaw_36r1/main/00/prod/00/054/prodgen eq complete and ( ./051/diss:pdb or ./051/diss eq complete)
+            edit EMOS_TIME_STEP_H '0054'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 057
+            trigger /elaw_36r1/main/00/prod/00/057/prodgen eq complete and ( ./054/diss:pdb or ./054/diss eq complete)
+            edit EMOS_TIME_STEP_H '0057'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 060
+            trigger /elaw_36r1/main/00/prod/00/060/prodgen eq complete and ( ./057/diss:pdb or ./057/diss eq complete)
+            edit EMOS_TIME_STEP_H '0060'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 063
+            trigger /elaw_36r1/main/00/prod/00/063/prodgen eq complete and ( ./060/diss:pdb or ./060/diss eq complete)
+            edit EMOS_TIME_STEP_H '0063'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 066
+            trigger /elaw_36r1/main/00/prod/00/066/prodgen eq complete and ( ./063/diss:pdb or ./063/diss eq complete)
+            edit EMOS_TIME_STEP_H '0066'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 069
+            trigger /elaw_36r1/main/00/prod/00/069/prodgen eq complete and ( ./066/diss:pdb or ./066/diss eq complete)
+            edit EMOS_TIME_STEP_H '0069'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 072
+            trigger /elaw_36r1/main/00/prod/00/072/prodgen eq complete and ( ./069/diss:pdb or ./069/diss eq complete)
+            edit EMOS_TIME_STEP_H '0072'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 075
+            trigger /elaw_36r1/main/00/prod/00/075/prodgen eq complete and ( ./072/diss:pdb or ./072/diss eq complete)
+            edit EMOS_TIME_STEP_H '0075'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 078
+            trigger /elaw_36r1/main/00/prod/00/078/prodgen eq complete and ( ./075/diss:pdb or ./075/diss eq complete)
+            edit EMOS_TIME_STEP_H '0078'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 081
+            trigger /elaw_36r1/main/00/prod/00/081/prodgen eq complete and ( ./078/diss:pdb or ./078/diss eq complete)
+            edit EMOS_TIME_STEP_H '0081'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 084
+            trigger /elaw_36r1/main/00/prod/00/084/prodgen eq complete and ( ./081/diss:pdb or ./081/diss eq complete)
+            edit EMOS_TIME_STEP_H '0084'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 087
+            trigger /elaw_36r1/main/00/prod/00/087/prodgen eq complete and ( ./084/diss:pdb or ./084/diss eq complete)
+            edit EMOS_TIME_STEP_H '0087'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 090
+            trigger /elaw_36r1/main/00/prod/00/090/prodgen eq complete and ( ./087/diss:pdb or ./087/diss eq complete)
+            edit EMOS_TIME_STEP_H '0090'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 093
+            trigger /elaw_36r1/main/00/prod/00/093/prodgen eq complete and ( ./090/diss:pdb or ./090/diss eq complete)
+            edit EMOS_TIME_STEP_H '0093'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 096
+            trigger /elaw_36r1/main/00/prod/00/096/prodgen eq complete and ( ./093/diss:pdb or ./093/diss eq complete)
+            edit EMOS_TIME_STEP_H '0096'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 099
+            trigger /elaw_36r1/main/00/prod/00/099/prodgen eq complete and ( ./096/diss:pdb or ./096/diss eq complete)
+            edit EMOS_TIME_STEP_H '0099'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 102
+            trigger /elaw_36r1/main/00/prod/00/102/prodgen eq complete and ( ./099/diss:pdb or ./099/diss eq complete)
+            edit EMOS_TIME_STEP_H '0102'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 105
+            trigger /elaw_36r1/main/00/prod/00/105/prodgen eq complete and ( ./102/diss:pdb or ./102/diss eq complete)
+            edit EMOS_TIME_STEP_H '0105'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 108
+            trigger /elaw_36r1/main/00/prod/00/108/prodgen eq complete and ( ./105/diss:pdb or ./105/diss eq complete)
+            edit EMOS_TIME_STEP_H '0108'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 111
+            trigger /elaw_36r1/main/00/prod/00/111/prodgen eq complete and ( ./108/diss:pdb or ./108/diss eq complete)
+            edit EMOS_TIME_STEP_H '0111'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 114
+            trigger /elaw_36r1/main/00/prod/00/114/prodgen eq complete and ( ./111/diss:pdb or ./111/diss eq complete)
+            edit EMOS_TIME_STEP_H '0114'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 117
+            trigger /elaw_36r1/main/00/prod/00/117/prodgen eq complete and ( ./114/diss:pdb or ./114/diss eq complete)
+            edit EMOS_TIME_STEP_H '0117'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+          family 120
+            trigger /elaw_36r1/main/00/prod/00/120/prodgen eq complete and ( ./117/diss:pdb or ./117/diss eq complete)
+            edit EMOS_TIME_STEP_H '0120'
+            task diss
+              late -s +00:05 -c +00:15
+              label info ""
+              event pdb
+          endfamily
+        endfamily
+        task check
+          trigger ./00 eq complete
+        family reservation
+          trigger ./00 eq complete
+          edit SMSFILES '/home/ma/emos/def/elaw_36r1/smsfiles'
+          task loadl_cycle_limit
+            edit LOADL_CYCLE '65'
+            label info ""
+        endfamily
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'main'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger make eq complete and ./12 eq complete and ./00 eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'main'
+      inlimit /limits:linux_cluster
+  endfamily
+  family lag
+    trigger /elaw_36r1/main/make eq complete
+    repeat date YMD 20091016 20121212 1
+    edit LOGTASK 'lag'
+    edit MARS_DB 'marsod'
+    family 12
+      edit EMOS_BASE '12'
+      edit EMOS_PROJECT '12'
+      edit DELTA_DAY '0'
+      task wavesave
+        trigger ( /elaw_36r1/main:YMD gt /elaw_36r1/lag:YMD) or ( /elaw_36r1/main:YMD eq /elaw_36r1/lag:YMD and /elaw_36r1/main/12/euroshelf/wamrun eq complete)
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/euroshelf'
+      family euroshelf
+        trigger ./wavesave eq complete
+        task buoycol
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task monthly
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit DATEMASK '04.*.*'
+          inlimit /limits:linux_cluster
+        task uracol
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task fc_plot
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task uraplot
+          trigger uracol eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task windplot
+          trigger uracol eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task uraesf
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task urascat
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit DATEMASK '03.*.*'
+          inlimit /limits:linux_cluster
+      endfamily
+      family archive
+        trigger ( /elaw_36r1/main:YMD gt /elaw_36r1/lag:YMD) or ( /elaw_36r1/main:YMD eq /elaw_36r1/lag:YMD and /elaw_36r1/main/12/euroshelf/wamrun eq complete)
+        edit FSFAMILY 'mars'
+        inlimit /elaw_36r1/limits:mars
+        inlimit /limits:mars
+        task medite_06
+          edit EMOS_BASE '06'
+          label files ""
+          label info ""
+          event fdb
+        task medite_12
+          edit EMOS_BASE '12'
+          label files ""
+          label info ""
+          event fdb
+        task fc12m
+          label files ""
+          label info ""
+          event fdb
+        task flush
+          edit STREAM 'wave'
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family clean
+        trigger /elaw_36r1/main/make eq complete and euroshelf eq complete and archive eq complete
+        task clold
+        task clean_ws
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+      endfamily
+    endfamily
+    family 00
+      edit EMOS_BASE '00'
+      edit EMOS_PROJECT '00'
+      edit DELTA_DAY '1'
+      edit QUEUE 'os'
+      task wavesave
+        trigger ( /elaw_36r1/main:YMD gt /elaw_36r1/lag:YMD) or ( /elaw_36r1/main:YMD eq /elaw_36r1/lag:YMD and /elaw_36r1/main/00/euroshelf/wamrun eq complete)
+        edit SMSFILES '/home/ma/emos/def/elaw_36r1/euroshelf'
+      family euroshelf
+        trigger ./wavesave eq complete
+        task buoycol
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task monthly
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit DATEMASK '04.*.*'
+          inlimit /limits:linux_cluster
+        task uracol
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task fc_plot
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task uraplot
+          trigger uracol eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task windplot
+          trigger uracol eq complete
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task uraesf
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+        task urascat
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          edit DATEMASK '03.*.*'
+          inlimit /limits:linux_cluster
+      endfamily
+      family archive
+        trigger ( /elaw_36r1/main:YMD gt /elaw_36r1/lag:YMD) or ( /elaw_36r1/main:YMD eq /elaw_36r1/lag:YMD and /elaw_36r1/main/00/euroshelf/wamrun eq complete)
+        edit FSFAMILY 'mars'
+        inlimit /elaw_36r1/limits:mars
+        inlimit /limits:mars
+        task medite_18
+          edit DELTA_DAY '0'
+          edit EMOS_BASE '18'
+          label files ""
+          label info ""
+          event fdb
+        task medite_00
+          edit EMOS_BASE '00'
+          label files ""
+          label info ""
+          event fdb
+        task fc12m
+          label files ""
+          label info ""
+          event fdb
+        task flush
+          edit STREAM 'wave'
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family clean
+        trigger /elaw_36r1/main/make eq complete and euroshelf eq complete and archive eq complete
+        task clold
+        task clean_ws
+          edit QUEUE 'emos-e'
+          edit QUEUE_EPILOG 'emos-exp'
+          edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+          edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+          edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+          edit LOGDIR '/vol/emos_nc/output'
+          edit SMSOUT '/vol/emos_nc/output'
+          inlimit /limits:linux_cluster
+      endfamily
+    endfamily
+    task checkarchive
+      trigger /elaw_36r1/main/make eq complete and ./12 eq complete and ./00 eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FSFAMILY 'mars'
+      edit EMOS_TYPE 'an'
+      inlimit /limits:linux_cluster
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+      edit LOGTASK 'lag'
+    task logfiles
+      late -s +00:05 -c +00:15
+      trigger /elaw_36r1/main/make eq complete and ./12 eq complete and ./00 eq complete and checkarchive eq complete and logfilestore eq complete
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      edit LOGTASK 'lag'
+      inlimit /limits:linux_cluster
+  endfamily
+endsuite
+suite ema_36r1
+  edit USER 'emos'
+  edit SCHOST 'c1b'
+  edit STHOST '/s1b'
+  edit STHOST_BKUP '/s1a'
+  edit SCHOST_BKP 'c1a'
+  edit WSHOST 'linux_cluster'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit SMSLOGHOST 'c1b'
+  edit SMSLOGPORT '9316'
+  edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+  edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+  edit SMSURL 'USA/GMAED/12'
+  edit VERSION '0046'
+  edit FIRST_DAY '1'
+  edit SMSTRIES '2'
+  edit DELTA_DAY '0'
+  edit EMOS_BASE '12'
+  edit EMOS_TIME_STEP_H '0000'
+  edit FSFAMILY ''
+  edit EPSTYPE 'fc'
+  edit MEMBER '0'
+  edit INIMA ''
+  edit INIMACONS '0'
+  edit INILEVELS '91'
+  edit VERIFY 'verify'
+  edit PERIOD_4D '12'
+  edit WINDOW_LENGTH_4D '12'
+  edit WINDOW_OFFSET_4D '9'
+  edit ANNPES '48'
+  edit ANMEM '3584'
+  edit ANSTACK '700'
+  edit ANMRFS '160'
+  edit FCNPES '92'
+  edit FCMEM '3584'
+  edit FCSTACK '690'
+  edit FCMRFS '32'
+  edit ININPES '48'
+  edit REINITIALIZE 'false'
+  edit DATEMASK '*.*.*'
+  edit YMD 'dummy'
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/ema_36r1'
+  edit SMSINCLUDE '/home/ma/emos/def/ema_36r1/include'
+  edit ACCOUNT 'oemaed'
+  edit STREAM 'MAED'
+  edit EMOS_STREAM 'MAED'
+  edit MARS_DB 'marsod'
+  edit SUITE_START '20040814'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit.36r1 %USER% %SCHOST% %SMSJOB% %SMSJOBOUT% '
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/s1b/emos_esuite/emos_data/0046/log'
+  edit SMSOUT '/s1b/emos_esuite/emos_data/0046/log'
+  edit INIEXPVER '0046'
+  edit SLEEPTIME '1'
+  inlimit /limits:c1b
+  clock hybrid -86400
+  family limits
+    limit inidata 1
+    limit mars 3
+    limit prod 5
+    limit pdb 5
+    limit q2diss 5
+  endfamily
+  family make
+    task setup
+    task links
+      trigger setup eq complete
+      edit FSFAMILY 'fc'
+      edit WSHOST 'bee01'
+    task datalinks
+      trigger setup eq complete and links eq complete
+      edit FSFAMILY 'fc'
+    task ifs
+      trigger links eq complete and datalinks eq complete
+      edit FSFAMILY 'fc'
+    task wamabs
+      trigger links eq complete and datalinks eq complete
+    task wconst
+      trigger wamabs eq complete
+    task ma_bin
+      trigger links eq complete and datalinks eq complete
+    task ma_tools
+      trigger links eq complete and datalinks eq complete
+    task prepdata
+      trigger links eq complete and datalinks eq complete
+  endfamily
+  family init
+    trigger /pp1/main/extractions/ma eq complete and make eq complete and /ema_36r1:ECF_DATE le /o/main:YMD
+    task ma_clean
+      edit FSFAMILY 'gfc'
+    task rmfdb
+      trigger ma_clean eq complete
+      edit FSFAMILY 'mars'
+    task flush
+      trigger ma_clean eq complete
+      edit STREAM 'MAED'
+      edit EMOS_TYPE 'an'
+      edit FSFAMILY 'mars'
+      edit SMSFILES '/home/ma/emos/def/ema_36r1/archive'
+      label files ""
+      label info ""
+      event fdb
+    task ma_stage
+      trigger ma_clean eq complete
+      edit DATEMASK '01.*.*'
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      inlimit /limits:linux_cluster
+    task ma_generate
+      trigger ma_stage eq complete and ma_clean eq complete
+    task getini
+      trigger ma_generate eq complete
+      edit INIMA 'mfr ncep ukm dwd '
+      edit FSFAMILY 'gfc'
+    task wavini
+      trigger ma_stage eq complete and ma_clean eq complete
+      edit FSFAMILY 'gfc'
+  endfamily
+  family dwd
+    trigger init/getini eq complete and init/wavini eq complete and /ema_36r1/make eq complete
+    edit INIMA 'dwd'
+    edit INIMACONS '0'
+    family fc
+      edit FCLENGTH '240'
+      edit FCMEM '2000'
+      edit FCSTACK '700'
+      edit FCMRFS '0'
+      edit FSFAMILY 'gfc'
+      task inidata
+        edit THREADS '4'
+        inlimit /ema_36r1/limits:inidata
+      task getfcdata
+        trigger inidata eq complete
+        edit FSFAMILY 'fc'
+      task getpersSST
+        trigger getfcdata eq complete
+        edit FSFAMILY 'fc'
+        edit SSTLEN '240'
+        edit SSTINT '1'
+        edit THREADS '2'
+        edit NPES '4'
+        edit MEM '1000'
+        edit CPUTIME '960'
+      task model
+        trigger getpersSST eq complete
+        edit PERSST 'true'
+        edit FSFAMILY 'fc'
+        edit FCLENGTH '240'
+        meter step -1 240 240
+    endfamily
+    family archive
+      trigger fc/inidata eq complete
+      edit SMSFILES '/home/ma/emos/def/ema_36r1/archive'
+      edit EMOS_TYPE 'an'
+      edit FSFAMILY 'mars'
+      task ma_anml
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+      task sp2fdb
+        trigger ../fc/model:step ge 0 or ../fc/model eq complete
+        edit EMOS_TYPE 'fc'
+        edit STEPS '0'
+        label files ""
+        label info ""
+        event fdb
+      family fc000
+        trigger sp2fdb eq complete and ( ../fc/model:step ge 0 or ../fc/model eq complete)
+        edit STEPS '0'
+        task fcml
+          label files ""
+          label info ""
+          event fdb
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc024
+        trigger ../fc/model:step ge 24 or ../fc/model eq complete
+        edit STEPS '3/6/9/12/15/18/21/24'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc036
+        trigger ../fc/model:step ge 36 or ../fc/model eq complete
+        edit STEPS '27/30/33/36'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc060
+        trigger ../fc/model:step ge 60 or ../fc/model eq complete
+        edit STEPS '39/42/45/48/51/54/57/60'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc072
+        trigger ../fc/model:step ge 72 or ../fc/model eq complete
+        edit STEPS '63/66/69/72'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc120
+        trigger ../fc/model:step ge 120 or ../fc/model eq complete
+        edit STEPS '78/84/90/96/102/108/114/120'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc180
+        trigger ../fc/model:step ge 180 or ../fc/model eq complete
+        edit STEPS '126/132/138/144/150/156/162/168/174/180'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc240
+        trigger ../fc/model:step ge 240 or ../fc/model eq complete
+        edit STEPS '186/192/198/204/210/216/222/228/234/240'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcextra
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      task fc12g
+        trigger ../fc/model eq complete
+        edit STREAM 'MAED'
+        edit STEPS '0/3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/78/84/90/96/102/108/114/120/126/132/138/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+        edit STEPS_SPECTRAL ''
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+    endfamily
+  endfamily
+  family ukm
+    trigger init/getini eq complete and init/wavini eq complete and /ema_36r1/make eq complete
+    edit INIMA 'ukm'
+    edit INIMACONS '0'
+    family fc
+      edit FCLENGTH '240'
+      edit FCMEM '2000'
+      edit FCSTACK '700'
+      edit FCMRFS '0'
+      edit FSFAMILY 'gfc'
+      task inidata
+        edit THREADS '4'
+        inlimit /ema_36r1/limits:inidata
+      task getfcdata
+        trigger inidata eq complete
+        edit FSFAMILY 'fc'
+      task getpersSST
+        trigger getfcdata eq complete
+        edit FSFAMILY 'fc'
+        edit SSTLEN '240'
+        edit SSTINT '1'
+        edit THREADS '2'
+        edit NPES '4'
+        edit MEM '1000'
+        edit CPUTIME '960'
+      task model
+        trigger getpersSST eq complete
+        edit PERSST 'true'
+        edit FSFAMILY 'fc'
+        edit FCLENGTH '240'
+        meter step -1 240 240
+    endfamily
+    family archive
+      trigger fc/inidata eq complete
+      edit SMSFILES '/home/ma/emos/def/ema_36r1/archive'
+      edit EMOS_TYPE 'an'
+      edit FSFAMILY 'mars'
+      task ma_anml
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+      task sp2fdb
+        trigger ../fc/model:step ge 0 or ../fc/model eq complete
+        edit EMOS_TYPE 'fc'
+        edit STEPS '0'
+        label files ""
+        label info ""
+        event fdb
+      family fc000
+        trigger sp2fdb eq complete and ( ../fc/model:step ge 0 or ../fc/model eq complete)
+        edit STEPS '0'
+        task fcml
+          label files ""
+          label info ""
+          event fdb
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc024
+        trigger ../fc/model:step ge 24 or ../fc/model eq complete
+        edit STEPS '3/6/9/12/15/18/21/24'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc036
+        trigger ../fc/model:step ge 36 or ../fc/model eq complete
+        edit STEPS '27/30/33/36'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc060
+        trigger ../fc/model:step ge 60 or ../fc/model eq complete
+        edit STEPS '39/42/45/48/51/54/57/60'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc072
+        trigger ../fc/model:step ge 72 or ../fc/model eq complete
+        edit STEPS '63/66/69/72'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc120
+        trigger ../fc/model:step ge 120 or ../fc/model eq complete
+        edit STEPS '78/84/90/96/102/108/114/120'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc180
+        trigger ../fc/model:step ge 180 or ../fc/model eq complete
+        edit STEPS '126/132/138/144/150/156/162/168/174/180'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc240
+        trigger ../fc/model:step ge 240 or ../fc/model eq complete
+        edit STEPS '186/192/198/204/210/216/222/228/234/240'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcextra
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      task fc12g
+        trigger ../fc/model eq complete
+        edit STREAM 'MAED'
+        edit STEPS '0/3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/78/84/90/96/102/108/114/120/126/132/138/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+        edit STEPS_SPECTRAL ''
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+    endfamily
+  endfamily
+  family ncep
+    trigger init/getini eq complete and init/wavini eq complete and /ema_36r1/make eq complete
+    edit INIMA 'ncep'
+    edit INIMACONS '0'
+    family fc
+      edit FCLENGTH '240'
+      edit FCMEM '2000'
+      edit FCSTACK '700'
+      edit FCMRFS '0'
+      edit FSFAMILY 'gfc'
+      task inidata
+        edit THREADS '4'
+        inlimit /ema_36r1/limits:inidata
+      task getfcdata
+        trigger inidata eq complete
+        edit FSFAMILY 'fc'
+      task getpersSST
+        trigger getfcdata eq complete
+        edit FSFAMILY 'fc'
+        edit SSTLEN '240'
+        edit SSTINT '1'
+        edit THREADS '2'
+        edit NPES '4'
+        edit MEM '1000'
+        edit CPUTIME '960'
+      task model
+        trigger getpersSST eq complete
+        edit PERSST 'true'
+        edit FSFAMILY 'fc'
+        edit FCLENGTH '240'
+        meter step -1 240 240
+      task derived_param
+        trigger model eq complete
+        edit MEMBER 'off'
+        edit SMSFILES '/home/ma/emos/def/ema_36r1/mc/fc'
+        edit STEPS '0/12/24/36/48/60/72/84/96/108/120/132/144/156/168/180/192/204/216/228/240'
+        edit EMOS_TYPE 'fc'
+    endfamily
+    family archive
+      trigger fc/inidata eq complete
+      edit SMSFILES '/home/ma/emos/def/ema_36r1/archive'
+      edit EMOS_TYPE 'an'
+      edit FSFAMILY 'mars'
+      task ma_anml
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+      task sp2fdb
+        trigger ../fc/model:step ge 0 or ../fc/model eq complete
+        edit EMOS_TYPE 'fc'
+        edit STEPS '0'
+        label files ""
+        label info ""
+        event fdb
+      family fc000
+        trigger sp2fdb eq complete and ( ../fc/model:step ge 0 or ../fc/model eq complete)
+        edit STEPS '0'
+        task fcml
+          label files ""
+          label info ""
+          event fdb
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc024
+        trigger ../fc/model:step ge 24 or ../fc/model eq complete
+        edit STEPS '3/6/9/12/15/18/21/24'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc036
+        trigger ../fc/model:step ge 36 or ../fc/model eq complete
+        edit STEPS '27/30/33/36'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc060
+        trigger ../fc/model:step ge 60 or ../fc/model eq complete
+        edit STEPS '39/42/45/48/51/54/57/60'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc072
+        trigger ../fc/model:step ge 72 or ../fc/model eq complete
+        edit STEPS '63/66/69/72'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc120
+        trigger ../fc/model:step ge 120 or ../fc/model eq complete
+        edit STEPS '78/84/90/96/102/108/114/120'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc180
+        trigger ../fc/model:step ge 180 or ../fc/model eq complete
+        edit STEPS '126/132/138/144/150/156/162/168/174/180'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc240
+        trigger ../fc/model:step ge 240 or ../fc/model eq complete
+        edit STEPS '186/192/198/204/210/216/222/228/234/240'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcextra
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      task fc12g
+        trigger ../fc/model eq complete
+        edit STREAM 'MAED'
+        edit STEPS '0/3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/78/84/90/96/102/108/114/120/126/132/138/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+        edit STEPS_SPECTRAL ''
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+    endfamily
+  endfamily
+  family mfr
+    trigger init/getini eq complete and init/wavini eq complete and /ema_36r1/make eq complete
+    edit INIMA 'mfr'
+    edit INIMACONS '0'
+    family fc
+      edit FCLENGTH '240'
+      edit FCMEM '2000'
+      edit FCSTACK '700'
+      edit FCMRFS '0'
+      edit FSFAMILY 'gfc'
+      task inidata
+        edit THREADS '4'
+        inlimit /ema_36r1/limits:inidata
+      task getfcdata
+        trigger inidata eq complete
+        edit FSFAMILY 'fc'
+      task getpersSST
+        trigger getfcdata eq complete
+        edit FSFAMILY 'fc'
+        edit SSTLEN '240'
+        edit SSTINT '1'
+        edit THREADS '2'
+        edit NPES '4'
+        edit MEM '1000'
+        edit CPUTIME '960'
+      task model
+        trigger getpersSST eq complete
+        edit PERSST 'true'
+        edit FSFAMILY 'fc'
+        edit FCLENGTH '240'
+        meter step -1 240 240
+    endfamily
+    family archive
+      trigger fc/inidata eq complete
+      edit SMSFILES '/home/ma/emos/def/ema_36r1/archive'
+      edit EMOS_TYPE 'an'
+      edit FSFAMILY 'mars'
+      task ma_anml
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+      task sp2fdb
+        trigger ../fc/model:step ge 0 or ../fc/model eq complete
+        edit EMOS_TYPE 'fc'
+        edit STEPS '0'
+        label files ""
+        label info ""
+        event fdb
+      family fc000
+        trigger sp2fdb eq complete and ( ../fc/model:step ge 0 or ../fc/model eq complete)
+        edit STEPS '0'
+        task fcml
+          label files ""
+          label info ""
+          event fdb
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc024
+        trigger ../fc/model:step ge 24 or ../fc/model eq complete
+        edit STEPS '3/6/9/12/15/18/21/24'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc036
+        trigger ../fc/model:step ge 36 or ../fc/model eq complete
+        edit STEPS '27/30/33/36'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc060
+        trigger ../fc/model:step ge 60 or ../fc/model eq complete
+        edit STEPS '39/42/45/48/51/54/57/60'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc072
+        trigger ../fc/model:step ge 72 or ../fc/model eq complete
+        edit STEPS '63/66/69/72'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc120
+        trigger ../fc/model:step ge 120 or ../fc/model eq complete
+        edit STEPS '78/84/90/96/102/108/114/120'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc180
+        trigger ../fc/model:step ge 180 or ../fc/model eq complete
+        edit STEPS '126/132/138/144/150/156/162/168/174/180'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc240
+        trigger ../fc/model:step ge 240 or ../fc/model eq complete
+        edit STEPS '186/192/198/204/210/216/222/228/234/240'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcextra
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      task fc12g
+        trigger ../fc/model eq complete
+        edit STREAM 'MAED'
+        edit STEPS '0/3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/78/84/90/96/102/108/114/120/126/132/138/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+        edit STEPS_SPECTRAL ''
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+    endfamily
+  endfamily
+  family consensus
+    trigger init/getini eq complete and init/wavini eq complete and /ema_36r1/make eq complete
+    edit INIMA 'mfr ncep ukm dwd '
+    edit INIMACONS '1'
+    family fc
+      edit FCLENGTH '240'
+      edit FCMEM '2000'
+      edit FCSTACK '700'
+      edit FCMRFS '0'
+      edit FSFAMILY 'gfc'
+      task inidata
+        edit THREADS '4'
+        inlimit /ema_36r1/limits:inidata
+      task getfcdata
+        trigger inidata eq complete
+        edit FSFAMILY 'fc'
+      task getpersSST
+        trigger getfcdata eq complete
+        edit FSFAMILY 'fc'
+        edit SSTLEN '240'
+        edit SSTINT '1'
+        edit THREADS '2'
+        edit NPES '4'
+        edit MEM '1000'
+        edit CPUTIME '960'
+      task model
+        trigger getpersSST eq complete
+        edit PERSST 'true'
+        edit FSFAMILY 'fc'
+        edit FCLENGTH '240'
+        meter step -1 240 240
+    endfamily
+    family archive
+      trigger fc/inidata eq complete
+      edit SMSFILES '/home/ma/emos/def/ema_36r1/archive'
+      edit EMOS_TYPE 'an'
+      edit FSFAMILY 'mars'
+      task ma_anml
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+      task sp2fdb
+        trigger ../fc/model:step ge 0 or ../fc/model eq complete
+        edit EMOS_TYPE 'fc'
+        edit STEPS '0'
+        label files ""
+        label info ""
+        event fdb
+      family fc000
+        trigger sp2fdb eq complete and ( ../fc/model:step ge 0 or ../fc/model eq complete)
+        edit STEPS '0'
+        task fcml
+          label files ""
+          label info ""
+          event fdb
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc024
+        trigger ../fc/model:step ge 24 or ../fc/model eq complete
+        edit STEPS '3/6/9/12/15/18/21/24'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc036
+        trigger ../fc/model:step ge 36 or ../fc/model eq complete
+        edit STEPS '27/30/33/36'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc060
+        trigger ../fc/model:step ge 60 or ../fc/model eq complete
+        edit STEPS '39/42/45/48/51/54/57/60'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc072
+        trigger ../fc/model:step ge 72 or ../fc/model eq complete
+        edit STEPS '63/66/69/72'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc120
+        trigger ../fc/model:step ge 120 or ../fc/model eq complete
+        edit STEPS '78/84/90/96/102/108/114/120'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc180
+        trigger ../fc/model:step ge 180 or ../fc/model eq complete
+        edit STEPS '126/132/138/144/150/156/162/168/174/180'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      family fc240
+        trigger ../fc/model:step ge 240 or ../fc/model eq complete
+        edit STEPS '186/192/198/204/210/216/222/228/234/240'
+        task fcsfc
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcpl
+          trigger fcsfc:fdb or fcsfc eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcil
+          trigger fcpl:fdb or fcpl eq complete
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+        task fcextra
+          inlimit /ema_36r1/limits:mars
+          inlimit /limits:mars
+          label files ""
+          label info ""
+          event fdb
+      endfamily
+      task fc12g
+        trigger ../fc/model eq complete
+        edit STREAM 'MAED'
+        edit STEPS '0/3/6/9/12/15/18/21/24/27/30/33/36/39/42/45/48/51/54/57/60/63/66/69/72/78/84/90/96/102/108/114/120/126/132/138/144/150/156/162/168/174/180/186/192/198/204/210/216/222/228/234/240'
+        edit STEPS_SPECTRAL ''
+        inlimit /ema_36r1/limits:mars
+        inlimit /limits:mars
+        label files ""
+        label info ""
+        event fdb
+    endfamily
+  endfamily
+  family verify
+    trigger dwd eq complete and ukm eq complete and ncep eq complete and mfr eq complete and consensus eq complete
+    edit QUEUE 'emos-e'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit SMSOUT '/vol/emos_nc/output'
+    edit SMSFILES '/home/ma/emos/def/ema_36r1/verif'
+    inlimit /limits:linux_cluster
+    task vmaprep
+    family washington
+      trigger vmaprep eq complete
+      edit CENTRE 'washington'
+      edit CENTRE_STREAM 'ma_washington_36r1'
+      task vmacrd
+        edit DATEMASK '28.*.*'
+      task vmali1
+      task vmali2
+      task vmaup1
+        trigger vmali1 eq complete
+      task vmaup2
+        trigger vmaup1 eq complete and vmali2 eq complete
+      task vmacrmv
+        edit DATEMASK '28.*.*'
+      task vmamemv
+        trigger vmaup2 eq complete
+        edit DATEMASK '01.*.*'
+      task vmaupmv
+        trigger vmamemv eq complete
+        edit DATEMASK '01.*.*'
+      task vmacrmb
+        edit DATEMASK '28.*.*'
+      task vmamemb
+        trigger vmaup2 eq complete
+        edit DATEMASK '10.*.*'
+      task vmaupmb
+        trigger vmamemb eq complete
+        edit DATEMASK '10.*.*'
+    endfamily
+    family bracknell
+      trigger vmaprep eq complete
+      edit CENTRE 'bracknell'
+      edit CENTRE_STREAM 'ma_bracknell_36r1'
+      task vmacrd
+        edit DATEMASK '28.*.*'
+      task vmali1
+      task vmali2
+      task vmaup1
+        trigger vmali1 eq complete
+      task vmaup2
+        trigger vmaup1 eq complete and vmali2 eq complete
+      task vmacrmv
+        edit DATEMASK '28.*.*'
+      task vmamemv
+        trigger vmaup2 eq complete
+        edit DATEMASK '01.*.*'
+      task vmaupmv
+        trigger vmamemv eq complete
+        edit DATEMASK '01.*.*'
+      task vmacrmb
+        edit DATEMASK '28.*.*'
+      task vmamemb
+        trigger vmaup2 eq complete
+        edit DATEMASK '10.*.*'
+      task vmaupmb
+        trigger vmamemb eq complete
+        edit DATEMASK '10.*.*'
+    endfamily
+    family offenbach
+      trigger vmaprep eq complete
+      edit CENTRE 'offenbach'
+      edit CENTRE_STREAM 'ma_offenbach_36r1'
+      task vmacrd
+        edit DATEMASK '28.*.*'
+      task vmali1
+      task vmali2
+      task vmaup1
+        trigger vmali1 eq complete
+      task vmaup2
+        trigger vmaup1 eq complete and vmali2 eq complete
+      task vmacrmv
+        edit DATEMASK '28.*.*'
+      task vmamemv
+        trigger vmaup2 eq complete
+        edit DATEMASK '01.*.*'
+      task vmaupmv
+        trigger vmamemv eq complete
+        edit DATEMASK '01.*.*'
+      task vmacrmb
+        edit DATEMASK '28.*.*'
+      task vmamemb
+        trigger vmaup2 eq complete
+        edit DATEMASK '10.*.*'
+      task vmaupmb
+        trigger vmamemb eq complete
+        edit DATEMASK '10.*.*'
+    endfamily
+    family toulouse
+      trigger vmaprep eq complete
+      edit CENTRE 'toulouse'
+      edit CENTRE_STREAM 'ma_toulouse_36r1'
+      task vmacrd
+        edit DATEMASK '28.*.*'
+      task vmali1
+      task vmali2
+      task vmaup1
+        trigger vmali1 eq complete
+      task vmaup2
+        trigger vmaup1 eq complete and vmali2 eq complete
+      task vmacrmv
+        edit DATEMASK '28.*.*'
+      task vmamemv
+        trigger vmaup2 eq complete
+        edit DATEMASK '01.*.*'
+      task vmaupmv
+        trigger vmamemv eq complete
+        edit DATEMASK '01.*.*'
+      task vmacrmb
+        edit DATEMASK '28.*.*'
+      task vmamemb
+        trigger vmaup2 eq complete
+        edit DATEMASK '10.*.*'
+      task vmaupmb
+        trigger vmamemb eq complete
+        edit DATEMASK '10.*.*'
+    endfamily
+    family consensus
+      trigger vmaprep eq complete
+      edit CENTRE 'consensus'
+      edit CENTRE_STREAM 'ma_consensus_36r1'
+      task vmacrd
+        edit DATEMASK '28.*.*'
+      task vmali1
+      task vmali2
+      task vmaup1
+        trigger vmali1 eq complete
+      task vmaup2
+        trigger vmaup1 eq complete and vmali2 eq complete
+      task vmacrmv
+        edit DATEMASK '28.*.*'
+      task vmamemv
+        trigger vmaup2 eq complete
+        edit DATEMASK '01.*.*'
+      task vmaupmv
+        trigger vmamemv eq complete
+        edit DATEMASK '01.*.*'
+      task vmacrmb
+        edit DATEMASK '28.*.*'
+      task vmamemb
+        trigger vmaup2 eq complete
+        edit DATEMASK '10.*.*'
+      task vmaupmb
+        trigger vmamemb eq complete
+        edit DATEMASK '10.*.*'
+    endfamily
+  endfamily
+  family trans
+    complete /ema_36r1/ncep eq complete and /ema_36r1/ncep/fc/model:step lt 240
+    trigger /ema_36r1/ncep/fc eq complete and /ema_36r1/consensus/fc eq complete
+    edit EMOS_TYPE 'fc'
+    edit SMSFILES '/home/ma/emos/def/ema_36r1/archive'
+    edit FSFAMILY 'ppdi'
+    edit SMSTRIES '1'
+    edit EMOS_STREAM 'MAED'
+    edit SMSURLBASE 'http://diss.ecmwf.int/do/monitoring/arrival'
+    edit SMSURL 'USA/GMAED/12'
+    edit SCHEDULE_DISS_TIME '0'
+    inlimit /ema_36r1/limits:prod
+    family 000
+      edit STEP '000'
+      task trans_ma
+    endfamily
+    family 012
+      trigger ./000 eq complete
+      edit STEP '012'
+      task trans_ma
+    endfamily
+    family 024
+      trigger ./012 eq complete
+      edit STEP '024'
+      task trans_ma
+    endfamily
+    family 036
+      trigger ./024 eq complete
+      edit STEP '036'
+      task trans_ma
+    endfamily
+    family 048
+      trigger ./036 eq complete
+      edit STEP '048'
+      task trans_ma
+    endfamily
+    family 060
+      trigger ./048 eq complete
+      edit STEP '060'
+      task trans_ma
+    endfamily
+    family 072
+      trigger ./060 eq complete
+      edit STEP '072'
+      task trans_ma
+    endfamily
+    family 084
+      trigger ./072 eq complete
+      edit STEP '084'
+      task trans_ma
+    endfamily
+    family 096
+      trigger ./084 eq complete
+      edit STEP '096'
+      task trans_ma
+    endfamily
+    family 108
+      trigger ./096 eq complete
+      edit STEP '108'
+      task trans_ma
+    endfamily
+    family 120
+      trigger ./108 eq complete
+      edit STEP '120'
+      task trans_ma
+    endfamily
+    family 132
+      trigger ./120 eq complete
+      edit STEP '132'
+      task trans_ma
+    endfamily
+    family 144
+      trigger ./132 eq complete
+      edit STEP '144'
+      task trans_ma
+    endfamily
+    family 156
+      trigger ./144 eq complete
+      edit STEP '156'
+      task trans_ma
+    endfamily
+    family 168
+      trigger ./156 eq complete
+      edit STEP '168'
+      task trans_ma
+    endfamily
+    family 180
+      trigger ./168 eq complete
+      edit STEP '180'
+      task trans_ma
+    endfamily
+    family 192
+      trigger ./180 eq complete
+      edit STEP '192'
+      task trans_ma
+    endfamily
+    family 204
+      trigger ./192 eq complete
+      edit STEP '204'
+      task trans_ma
+    endfamily
+    family 216
+      trigger ./204 eq complete
+      edit STEP '216'
+      task trans_ma
+    endfamily
+    family 228
+      trigger ./216 eq complete
+      edit STEP '228'
+      task trans_ma
+    endfamily
+    family 240
+      trigger ./228 eq complete
+      edit STEP '240'
+      task trans_ma
+    endfamily
+  endfamily
+  family pop
+    edit QUEUE 'emos-e'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit SMSOUT '/vol/emos_nc/output'
+    edit SMSFILES '/home/ma/emos/def/ema_36r1/plot'
+    inlimit /limits:linux_cluster
+    family 12
+      trigger /ema_36r1/dwd eq complete and /ema_36r1/ukm eq complete and /ema_36r1/ncep eq complete and /ema_36r1/mfr eq complete and /ema_36r1/consensus eq complete
+      edit EMOS_BASE '12'
+      family paper
+        task ma_plot
+      endfamily
+    endfamily
+  endfamily
+  family msjobs
+    edit QUEUE 'emos'
+    edit QUEUE_EPILOG 'emos-exp'
+    edit WSHOST 'ecgate'
+    edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+    edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+    edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+    edit SMSOUT '/vol/emos_nc/output'
+    edit LOGDIR '/vol/emos_nc/output'
+    edit VERSION '0046'
+    edit STREAM 'MA'
+    edit EMOS_STREAM 'MA'
+    edit SMSTRYNO '1'
+    edit SMSURLBASE 'http://ecgate.ecmwf.int:9080'
+    edit SMSURL 'do/events'
+    family 12
+      trigger ../trans eq complete
+      edit SMSFILES '/home/ma/emos/def/ema_36r1/msjobs'
+      family msma
+        edit EMOS_TIME_STEP_H '240'
+        edit MSJ_DIR 'ma12h240'
+        task ms_ec
+      endfamily
+    endfamily
+  endfamily
+  family check
+    task checkarchive
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit FSFAMILY 'mars'
+      edit EMOS_TYPE 'an'
+      inlimit /limits:linux_cluster
+      label info ""
+  endfamily
+  family save
+    edit SMSFILES '/home/ma/emos/def/ema_36r1/restart'
+    task logfilestore
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+  endfamily
+  family log
+    trigger make eq complete and init eq complete and dwd eq complete and ukm eq complete and ncep eq complete and mfr eq complete and consensus eq complete and verify eq complete and trans eq complete and pop eq complete and msjobs eq complete and check eq complete and save eq complete
+    edit SMSFILES '/home/ma/emos/def/ema_36r1/restart'
+    task logfiles
+      late -s +00:05 -c +00:15
+      edit QUEUE 'emos-e'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+      time 14:00
+  endfamily
+endsuite
+suite ejason2_val
+  edit SMSHOME '/vol/emos_nc/output'
+  edit SMSFILES '/home/ma/emos/def/ejason2_val/smsfiles'
+  edit SMSINCLUDE '/home/ma/emos/def/ejason2_val/include'
+  edit MEM '2500'
+  edit USER 'emos'
+  edit SCHOST 'c1b'
+  edit SCHOST_BKUP 'c1a'
+  edit WSHOST 'linux_cluster'
+  edit ACCOUNT 'oesu'
+  edit WSLOGDIR '/vol/emos_nc/output'
+  edit SCLOGDIR '/s1b/emos_esuite/emos_data/9002/log'
+  edit SMSLOGHOST 'c1b'
+  edit SMSLOGPORT '9316'
+  edit SMSURLCMD '${BROWSER:=firefox} -remote \'openURL(%SMSURLBASE%/%SMSURL%)\''
+  edit SMSURLBASE 'http://www.cnes.fr/web'
+  edit SMSURL '1441-jason.php'
+  edit QUEUE 'ns'
+  edit QUEUE_EPILOG 'ns'
+  edit SMSCMD 'smssubmit %USER% %SCHOST% %SMSJOB% %SMSJOBOUT%'
+  edit SMSKILL 'smskill %USER% %SCHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+  edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %SCHOST% %SMSRID% %SMSJOB%'
+  edit LOGDIR '/s1b/emos_esuite/emos_data/9002/log'
+  edit SMSOUT '/s1b/emos_esuite/emos_data/9002/log'
+  edit VERSION '5'
+  edit EXPVER '9002'
+  edit GRID '400'
+  edit HOMEDIR '/s1b/emos_esuite/emos_data/jasonII'
+  edit SLEEPTIME '1'
+  inlimit /limits:c1b
+  clock hybrid 
+  family limits
+    limit limiter 1
+    limit c1b 7
+    limit swarm 7
+  endfamily
+  family main
+    repeat date YMD 20071231 20091231 1
+    edit LOGTASK 'main'
+    edit CALL_ECPDS 'false'
+    edit DESTINATION 'EMI'
+    edit ECPDS_STREAM 'JSN2'
+    family make
+      task common
+      task local
+        trigger common eq complete
+      task purge
+    endfamily
+    task cleaner
+      trigger make eq complete
+      edit KEEP_DAYS '2'
+    task stage
+    family prod
+      trigger make eq complete
+      inlimit /ejason2_val/limits:limiter
+      family 15P
+        edit LABELS '15P'
+        edit EMOS_CYCLE '12'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/12/fc/model eq complete )
+      endfamily
+      family 18P
+        edit LABELS '18P'
+        edit EMOS_CYCLE '12'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/12/fc/model eq complete )
+      endfamily
+      family 21P
+        edit LABELS '21P'
+        edit EMOS_CYCLE '12'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/12/fc/model eq complete )
+      endfamily
+      family 24P
+        edit LABELS '24P'
+        edit EMOS_CYCLE '12'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/12/fc/model eq complete )
+      endfamily
+      family 03P
+        edit LABELS '03P'
+        edit DELTA_DAY '1'
+        edit EMOS_CYCLE '00'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/00/fc/model eq complete )
+      endfamily
+      family 06P
+        edit LABELS '06P'
+        edit DELTA_DAY '1'
+        edit EMOS_CYCLE '00'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/00/fc/model eq complete )
+      endfamily
+      family 09P
+        edit LABELS '09P'
+        edit DELTA_DAY '1'
+        edit EMOS_CYCLE '00'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/00/fc/model eq complete )
+      endfamily
+      family 12P
+        edit LABELS '12P'
+        edit DELTA_DAY '1'
+        edit EMOS_CYCLE '00'
+        task jason2_val
+          trigger ( /ejason2_val/main:YMD lt /o/main:YMD) or ( /ejason2_val/main:YMD eq /o/main:YMD and /o/main/00/fc/model eq complete )
+        task arch_val
+          trigger ( ./jason2_val eq complete) and ( ../03P eq complete) and ( ../06P eq complete) and ( ../09P eq complete) and ( ../24P eq complete) and ( ../15P eq complete) and ( ../18P eq complete) and ( ../21P eq complete)
+          edit DELTA_DAY '0'
+      endfamily
+    endfamily
+    task logfilestore
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit KEEPLOGS 'no'
+      edit LOGSTOECFS 'no'
+      edit MOVE_TO_ECFS 'yes'
+    task logfiles
+      trigger ( prod eq complete) and ( logfilestore eq complete)
+      edit QUEUE 'emos'
+      edit QUEUE_EPILOG 'emos-exp'
+      edit WSHOST 'localhost'
+      edit SMSCMD 'smssubmit %USER% %WSHOST% %SMSJOB% %SMSJOBOUT%'
+      edit SMSKILL 'smskill %USER% %WSHOST% %SMSRID% %SMSJOB% %SMSJOBOUT%'
+      edit SMSSTATUSCMD '/home/ma/emos/bin/smsstatus %USER% %WSHOST% %SMSRID% %SMSJOB%'
+      edit LOGDIR '/vol/emos_nc/output'
+      edit SMSOUT '/vol/emos_nc/output'
+      edit MOVE_TO_ECFS 'no'
+  endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/single_defs/test_auto_add_extern.def b/ecflow_4_0_7/AParser/test/data/single_defs/test_auto_add_extern.def
new file mode 100644
index 0000000..0a22f00
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/single_defs/test_auto_add_extern.def
@@ -0,0 +1,42 @@
+#
+# test auto add extern for triggers and inlimits
+#
+extern /a/b/c/d         
+extern /a/b/c/d/e:event        
+extern /a/b/c/d/e:meter       
+extern /made/up/redundant/extren     # REDUNDANT extern, should get removed after auto_add_extren(true)
+extern /made/up/redundant/extren     # Duplicates should be ignored.
+
+extern /limits:c1a
+extern /limits:c1a                   # Duplicates should be ignored
+extern fred
+extern limits:hpcd
+extern /suiteName:sg1
+extern /obs/limits:hpcd
+
+# Expect 9 unique externs
+# Also because we have defined externs , expect no warnings:
+
+suite extern
+   family f1
+      task p
+            trigger /a/b/c/d == complete          # extern path
+      task q
+            trigger /a/b/c/d/e:event == set       # extern event path
+      task r
+            trigger /a/b/c/d/e:meter le 30        # extern meter path   
+    endfamily
+    
+    
+    inlimit /limits:c1a
+    inlimit fred
+    family anon    
+         inlimit limits:hpcd       
+      task t1
+         inlimit /suiteName:sg1            
+      task t2
+            inlimit /obs/limits:hpcd       
+      task t3
+            inlimit /limits:c1a            
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/AParser/test/data/single_defs/test_complete.def b/ecflow_4_0_7/AParser/test/data/single_defs/test_complete.def
new file mode 100644
index 0000000..032bf1b
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/single_defs/test_complete.def
@@ -0,0 +1,16 @@
+   suite complete
+      edit SMSHOME data/SMSHOME
+      edit SMSINCLUDE $SMSHOME/includes
+      edit SLEEPTIME 1
+      family family
+         complete /complete/family/check:nofiles
+         repeat integer VAR 0 3
+         task check
+            event 1 nofiles
+         task t1
+            trigger check == complete
+        task t2
+            trigger t2 == complete
+      endfamily
+   endsuite
+
diff --git a/ecflow_4_0_7/AParser/test/data/single_defs/test_repeat.def b/ecflow_4_0_7/AParser/test/data/single_defs/test_repeat.def
new file mode 100644
index 0000000..ab9471d
--- /dev/null
+++ b/ecflow_4_0_7/AParser/test/data/single_defs/test_repeat.def
@@ -0,0 +1,8 @@
+suite s1
+  # clock real 300 -c 60
+  family daily
+    repeat date YMD 20101215 20101217 1
+    task t1
+      time 10:30
+  endfamily
+endsuite
diff --git a/ecflow_4_0_7/Base/CMakeLists.txt b/ecflow_4_0_7/Base/CMakeLists.txt
new file mode 100644
index 0000000..ac22bcb
--- /dev/null
+++ b/ecflow_4_0_7/Base/CMakeLists.txt
@@ -0,0 +1,108 @@
+ # =======================================================
+ # to list all sources to build use:
+ #    cd $WK/Base
+ #    find src -name \*.cpp >> CMakeLists.txt
+ # =======================================================
+ list( APPEND srcs
+ src/ZombieCtrl.cpp
+ src/Stats.cpp
+ src/Client.cpp
+ src/ServerReply.cpp
+ src/stc/DefsCmd.cpp
+ src/stc/PreAllocatedReply.cpp
+ src/stc/SStringVecCmd.cpp
+ src/stc/StcCmd.cpp
+ src/stc/SSuitesCmd.cpp
+ src/stc/SClientHandleCmd.cpp
+ src/stc/SStringCmd.cpp
+ src/stc/ServerToClientCmd.cpp
+ src/stc/SClientHandleSuitesCmd.cpp
+ src/stc/SServerLoadCmd.cpp
+ src/stc/SNodeCmd.cpp
+ src/stc/SStatsCmd.cpp
+ src/stc/SSyncCmd.cpp
+ src/stc/SNewsCmd.cpp
+ src/stc/ErrorCmd.cpp
+ src/stc/GroupSTCCmd.cpp
+ src/stc/ZombieGetCmd.cpp
+ src/ClientToServerRequest.cpp
+ src/Gnuplot.cpp
+ src/WhyCmd.cpp
+ src/ServerToClientResponse.cpp
+ src/cts/CSyncCmd.cpp
+ src/cts/ZombieCmd.cpp
+ src/cts/OrderNodeCmd.cpp
+ src/cts/CheckPtCmd.cpp
+ src/cts/CtsNodeCmd.cpp
+ src/cts/GroupCTSCmd.cpp
+ src/cts/UserCmd.cpp
+ src/cts/ClientHandleCmd.cpp
+ src/cts/PlugCmd.cpp
+ src/cts/ForceCmd.cpp
+ src/cts/LoadDefsCmd.cpp
+ src/cts/CFileCmd.cpp
+ src/cts/ShowCmd.cpp
+ src/cts/CtsCmd.cpp
+ src/cts/TaskApi.cpp
+ src/cts/EditScriptCmd.cpp
+ src/cts/FreeDepCmd.cpp
+ src/cts/PathsCmd.cpp
+ src/cts/EditHistoryMgr.cpp
+ src/cts/LogMessageCmd.cpp
+ src/cts/CtsApi.cpp
+ src/cts/ReplaceNodeCmd.cpp
+ src/cts/RequeueNodeCmd.cpp
+ src/cts/BeginCmd.cpp
+ src/cts/LogCmd.cpp
+ src/cts/AlterCmd.cpp
+ src/cts/TaskCmds.cpp
+ src/cts/CtsCmdRegistry.cpp
+ src/cts/RunNodeCmd.cpp
+ src/cts/ClientToServerCmd.cpp
+ src/cts/ServerVersionCmd.cpp
+)
+
+ecbuild_add_library( TARGET   base
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     LIBS     libparser node nodeattr core 
+                     INCLUDES src
+                              ../ACore/src 
+                              ../ANattr/src
+                              ../ANode/src
+                              ../AParser/src
+                              ../Base/src
+                              ../Base/src/cts
+                              ../Base/src/stc
+                     )
+
+# This ensures that for debug config, we only link with debug boost libs, for other configs, we link with optimised boost libs
+target_link_libraries(base debug ${Boost_PROGRAM_OPTIONS_LIBRARY_DEBUG}   ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE})
+ 
+list( APPEND test_srcs
+   test/TestAlterCmd.cpp
+   test/TestClientHandleCmd.cpp
+   test/TestCmd.cpp
+   test/TestDeleteNodeCmd.cpp
+   test/TestECFLOW-189.cpp
+   test/TestForceCmd.cpp
+   test/TestFreeDepCmd.cpp
+   test/TestLimit.cpp
+   test/TestMeterCmd.cpp
+   test/TestRequest.cpp
+   test/TestRequeueNodeCmd.cpp
+   test/TestResolveDependencies.cpp
+   test/TestSSyncCmd_CH1.cpp
+   test/TestSSyncCmd.cpp
+   test/TestSSyncCmdOrder.cpp
+)
+ecbuild_add_test( TARGET       u_base
+                  BOOST
+                  SOURCES      ${test_srcs}
+                  LIBS         base       
+                               pthread 
+                  INCLUDES     ../ANode/test
+                  TEST_DEPENDS u_aparser
+                  )
+                  
\ No newline at end of file
diff --git a/ecflow_4_0_7/Base/Jamfile.jam b/ecflow_4_0_7/Base/Jamfile.jam
new file mode 100644
index 0000000..c81830f
--- /dev/null
+++ b/ecflow_4_0_7/Base/Jamfile.jam
@@ -0,0 +1,70 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Base project
+#
+project theBase ;
+
+
+use-project theCore     : ../ACore ;
+use-project theNodeAttr : ../ANattr ;
+use-project theNode     : ../ANode ;
+use-project theParser   : ../AParser ;
+
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+#
+lib base : [ glob src/*.cpp ] [ glob src/cts/*.cpp ] [ glob src/stc/*.cpp ]
+         : <include>../ACore/src
+           <include>../ANattr/src
+           <include>../AParser/src 
+           <include>../ANode/src
+           <include>../Base/src
+           <include>../Base/src/cts
+           <include>../Base/src/stc
+           <link>static
+           <variant>debug:<define>DEBUG
+           <use>/theCore//core
+           <use>/theNodeAttr//nodeattr
+           <use>/theParser//libparser
+           <use>/theNode//node
+           <use>/site-config//boost_system
+           <use>/site-config//boost_serialization
+           <use>/site-config//boost_filesystem
+           <use>/site-config//boost_datetime
+           <use>/site-config//boost_program_options
+           <use>/site-config//boost_test
+         :
+         : <include>../Base/src  
+           <include>../Base/src/cts 
+           <include>../Base/src/stc     
+         ;  
+         
+#
+# This should be in the site-config.jam file as a project wide requirement
+# however if this is done, it will not link since, lpthread appears twice
+# on the link line
+#
+lib pthread ;
+
+exe u_base : [ glob test/*.cpp  ]
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           base
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_datetime
+           /site-config//boost_program_options
+           /site-config//boost_test
+           pthread
+         : <include>../ANode/test
+           <variant>debug:<define>DEBUG
+	     ;
diff --git a/ecflow_4_0_7/Base/src/AbstractClientEnv.hpp b/ecflow_4_0_7/Base/src/AbstractClientEnv.hpp
new file mode 100644
index 0000000..6af6499
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/AbstractClientEnv.hpp
@@ -0,0 +1,66 @@
+#ifndef ABSTRACT_CLIENT_ENV__HPP_
+#define ABSTRACT_CLIENT_ENV__HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used to represent the client environment to the cmds
+//
+// This abstraction ONLY covers aspects that are required, to _CREATE_
+// the client command/request that is to be sent to the server
+// The key theme is that we can define a new client to server command
+// in one place. i.e it allows the functionality, command line arguments,
+// parsing of the arguments, can all be done in the command class itself
+// If the command requires any additional arguments from the client environment
+// they should be added to this class, and the implementation in the derived class
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <string>
+#include <vector>
+
+class AbstractClientEnv : private boost::noncopyable {
+protected:
+ 	AbstractClientEnv() {}
+public:
+ 	virtual ~AbstractClientEnv() {}
+
+ 	/// For all tasks/child based commands we require taskPath and password and optional Remote ID
+ 	/// When the jobs use a queueing system the remote id (ECF_RID) is used to
+ 	/// aid killing of jobs.(typically zombies)
+ 	virtual bool checkTaskPathAndPassword(std::string& errorMsg) const = 0;
+	virtual const std::string& task_path() const  = 0;
+ 	virtual int task_try_no() const = 0;
+	virtual const std::string& jobs_password() const = 0;
+	virtual const std::string& process_or_remote_id() const = 0;
+
+	/// For test allow env variable to be set on defs, i.e. allow us to inject ECF_CLIENT to defs
+	virtual const std::vector<std::pair<std::string,std::string> >& env() const = 0;
+
+	/// Allow ping to set the host:port
+	virtual void set_host_port(const std::string& host, const std::string& port) = 0;
+
+   /// return the current host
+	virtual const std::string& host() const = 0;
+
+   /// returns the port number
+	virtual const std::string& port() const = 0;
+
+	/// debug client, when environment variable ECF_CLIENT_DEBUG is set.
+	virtual bool debug() const = 0 ;
+
+	/// Some commands work on construction. to avoid this under test. Call set_test
+	/// i.e Command like CtsCmd::SERVER_LOAD can be client side only, in which case
+	/// when testing the client interface we want to avoid opening the log file.
+	virtual void set_test() = 0;
+	virtual bool under_test() const = 0;
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/AbstractServer.hpp b/ecflow_4_0_7/Base/src/AbstractServer.hpp
new file mode 100644
index 0000000..51b9bba
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/AbstractServer.hpp
@@ -0,0 +1,193 @@
+#ifndef ABSTRACTSERVER_HPP_
+#define ABSTRACTSERVER_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #45 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "Stats.hpp"
+#include "ZombieCtrl.hpp"
+#include "SState.hpp"
+#include "CheckPt.hpp"
+
+class Defs;
+
+/// This class is provided so that the cmd can issue requests to the server
+/// without depending on the server implementation
+///
+class AbstractServer {
+public:
+	virtual ~AbstractServer() {}
+
+	/// returns the current state of the server
+	/// The following table shows the effect of state, on server behaviour:
+	///
+	///           User Request    Task Request   Job Scheduling   Check-pointing
+	/// RUNNING      yes               yes              yes            yes
+	/// SHUTDOWN     yes               yes              no             yes
+	/// HALTED       yes               no               no             no
+	virtual SState::State state() const = 0;
+
+	/// returns the server host and port number
+	virtual std::pair<std::string,std::string> hostPort() const = 0;
+
+	/// returns the defs held by the server. This should always exist. ECFLOW-182
+	virtual defs_ptr defs() const = 0;
+
+	/// Update the defs help by the server. This allows multiple suites to loaded
+	/// into the server. Note the input defs will be drained of its suites/externs as they
+	/// will get transferred to the server. If the server already has suites of the same
+	/// name, then an error message is created. This can be overridden with the force option
+	virtual void updateDefs(defs_ptr, bool force) = 0;
+
+	/// Remove all suites,externs,client handles, ready for a new start
+ 	virtual void clear_defs() = 0;
+
+ 	/// Forces the defs file in the server to be written to disk *IF* no args provided.
+ 	/// Otherwise updated mode OR check_pt interval OR check pt alarm
+ 	virtual void checkPtDefs(ecf::CheckPt::Mode m = ecf::CheckPt::UNDEFINED,
+ 	                            int check_pt_interval = 0,
+ 	                            int check_pt_save_time_alarm = 0) = 0;
+
+ 	/// Ask the server to restore the  defs from the checkpt file. If that fails the back check pt is tried
+ 	virtual void restore_defs_from_checkpt()  = 0;
+
+	/// This function should be called, when the node tree changes state
+	virtual void nodeTreeStateChanged() = 0;
+
+	/// returns true if the server allows task communication
+	/// Task-->server communication is stopped by halted()
+	virtual bool allowTaskCommunication() const = 0;
+
+	/// Stops job scheduling. Check point is enabled. (i,e if we were previously halted)
+	/// However any client request can still communicate with the server
+	/// Does NOT affect check pointing. Since any request can make changes to node tree
+   /// Places server in SHUTDOWN state.
+   ///           User Request    Task Request   Job Scheduling   Check-pointing
+   /// RUNNING      yes               yes              yes            yes
+   /// SHUTDOWN     yes               yes              no             yes
+   /// HALTED       yes               no               no             no
+	virtual void shutdown() = 0;
+
+   /// Stop job scheduling *AND*  task communication with server. Failed task request are logged
+	/// Hence nodes can be stuck in submitted/active states.
+	/// Task based command will continue attempting, communication with the server for up to 24hrs.
+	///
+   /// When the server is halted, we do *NOT* do any further check pointing
+   /// In a typical operational scenario where we have a home, and backup servers.
+   /// The checkpoint file is copied to the backup servers periodically (via a task)
+   /// hence we want to preserve the state of the last checkpoint. By prevent any state
+	/// changes to the node tree.
+	///
+   /// Hence halted(), will completely stop the server. Server will only respond
+	/// to user requests. (tasks requests are blocked)
+   /// Places server in HALTED state.
+   ///           User Request    Task Request   Job Scheduling   Check-pointing
+   /// RUNNING      yes               yes              yes            yes
+   /// SHUTDOWN     yes               yes              no             yes
+   /// HALTED       yes               no               no             no
+	virtual void halted() = 0;
+
+	/// Start scheduling tasks and respond to all requests. Check pointing is enabled
+	/// Places server in RUNNING state.
+   ///           User Request    Task Request   Job Scheduling   Check-pointing
+   /// RUNNING      yes               yes              yes            yes
+   /// SHUTDOWN     yes               yes              no             yes
+   /// HALTED       yes               no               no             no
+	virtual void restart() = 0;
+
+	/// Ask the server to reload file the hold list of users and their access rights
+	/// The white list file is specified by the environment variable ECF_LISTS
+	/// This allows/disallows user access on the live server
+	/// Return true if file is reloaded ok, else false and error message if:
+	/// 	a/ File does not exist
+	///  	b/ File is empty
+	///  	c/ Errors in parsing file
+	/// If errors arise the exist user still stay in affect
+	virtual bool reloadWhiteListFile(std::string& errorMsg)  = 0;
+
+	/// There are several kinds of authentifications:
+	///     a/ None
+	///     b/ List mode.   ASCII file based on ECF_LISTS is defined. referred as white list file
+	///     c/ Secure mode. binary file based ECF_PASSWD is defined. Referred to as black list file
+	/// At the moment we will only implement options a/ and b/
+	//
+	/// Returns true if the given user has access to the server, false otherwise
+	virtual bool authenticateUser(const std::string& user) = 0;
+
+	/// Returns true if user has matching write access privileges.
+	virtual bool authenticateWriteAccess(const std::string& user, bool client_request_can_change_server_state) = 0;
+
+	/// Shutdown the server and let 'user' has have exclusive lock on it.
+	/// If the lock succeeds return true, (This will end up calling the shutdown()
+	/// command on the server). If already locked does nothing and return's false
+ 	virtual bool lock(const std::string& user) = 0;
+
+	/// Unlock's the server., and restarts job scheduling
+	virtual void unlock() = 0;
+
+	/// Return the user that has exclusive lock, else an empty string
+	virtual const std::string& lockedUser() const = 0;
+
+	/// Return Controller for zombies
+	ZombieCtrl& zombie_ctrl() { return zombie_ctrl_; }
+
+	/// returns the statistical class
+	Stats& stats() { return stats_;}
+
+	/// Call to update the number of request, & returns stats
+	Stats& update_stats() { stats_.update(); return stats_; }
+
+	/// Update for number of requests per second
+	void update_stats(int poll_interval) { stats_.update_stats(poll_interval); }
+
+	// Instead of immediate node tree traversal at the end of child command
+	// we use 'increment_job_generation_count' to defer job generation to server
+	// The server will will check job generation count at poll time.
+	// This approach radically reduces the number of times we traverse the node tree
+	// and hence improves server throughput.
+	void increment_job_generation_count() { job_gen_count_++;}
+	void reset_job_generation_count() { job_gen_count_ = 0; }
+	int get_job_generation_count() const { return job_gen_count_; }
+
+	/// This job generation is special, in that it will time out, job generation time >= next poll.
+	/// This can be called at the end of a *USER* command(force,alter,requeue,etc), hence time_now may be >= next_poll_time
+	/// If this is the case, we will defer job generation
+	virtual void traverse_node_tree_and_job_generate(const boost::posix_time::ptime& time_now,bool user_cmd_context) const = 0;
+
+   /// returns the number of seconds at which we should check time dependencies
+   /// this includes evaluating trigger dependencies and submit the corresponding jobs.
+   /// This is set at 60 seconds. But will vary for debug/test purposes only.
+   /// For Testing the state change queued->submitted->active duration < submitJobsInterval
+   /// If this state change happens at the job submission boundary then
+   /// time series can get a skew.
+	virtual int poll_interval() const  = 0;
+
+	/// enable and disable debug output from the server
+	virtual void debug_server_on() = 0;
+	virtual void debug_server_off() = 0;
+	virtual bool debug() const = 0;
+
+protected:
+	AbstractServer() : job_gen_count_(0) {}
+
+private:
+	int job_gen_count_;
+	ZombieCtrl zombie_ctrl_;
+	Stats stats_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/Client.cpp b/ecflow_4_0_7/Base/src/Client.cpp
new file mode 100644
index 0000000..f8b7db0
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Client.cpp
@@ -0,0 +1,342 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Client
+// Author      : Avi
+// Revision    : $Revision: #33 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <assert.h>
+
+#include <boost/bind.hpp>
+
+#include "Client.hpp"
+#include "StcCmd.hpp"
+
+//#define DEBUG_CLIENT 1;
+
+#ifdef DEBUG_CLIENT
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib, for to_simple_string
+#endif
+
+/// The timeout will typically happen when the server has died, but socket is still open
+/// If we do not have a timeout, it will hang indefinitely
+
+/// Constructor starts the asynchronous connect operation.
+Client::Client( boost::asio::io_service& io_service,
+				Cmd_ptr cmd_ptr,
+				const std::string& host,
+				const std::string& port,
+				int timeout
+			  )
+: stopped_(false),host_( host ), port_( port ), connection_( io_service ),deadline_(io_service),timeout_(timeout)
+{
+	/// Avoid sending a NULL request to the server
+	if (!cmd_ptr.get())  throw std::runtime_error("Client::Client: No request specified !");
+
+	// The timeout can be set externally for testing, however when its not set the timeout is obtained from the command
+	// Vary the timeout, according to the command, hence loading the definition has longer timeout than ping
+	if (0 == timeout_) {
+	   timeout_ = cmd_ptr->timeout();
+	}
+
+#ifdef DEBUG_CLIENT
+   std::cout << "   Client::Client() timeout(" << timeout_ << ") " << host_ << ":" << port_ << " "; cmd_ptr->print(std::cout); std::cout << std::endl;
+#endif
+
+  	outbound_request_.set_cmd( cmd_ptr );
+
+  	// Host name resolution is performed using a resolver, where host and service
+  	// names(or ports) are looked up and converted into one or more end points
+ 	boost::asio::ip::tcp::resolver resolver( io_service );
+	boost::asio::ip::tcp::resolver::query query( host_, port_ );
+	boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve( query );
+
+	// The list of end points obtained could contain both IPv4 and IPv6 end points,
+	// so a program may try each of them until it finds one that works.
+	// This keeps the Client program independent of a specific IP version.
+	start(endpoint_iterator);
+}
+
+Client::~Client() {
+#ifdef DEBUG_CLIENT
+	std::cout << "   Client::~Client(): connection_.socket().is_open()=" << connection_.socket().is_open() << std::endl;
+#endif
+}
+
+/// Private ==============================================================================
+
+// This function terminates all the actors to shut down the connection. It
+// may be called by the user of the client class, or by the class itself in
+// response to graceful termination or an unrecoverable error.
+void Client::start(boost::asio::ip::tcp::resolver::iterator endpoint_iter)
+{
+   // Start the connect actor.
+   start_connect(endpoint_iter);
+
+   // Start the deadline actor. You will note that we're not setting any
+   // particular deadline here. Instead, the connect and input actors will
+   // update the deadline prior to each asynchronous operation.
+   deadline_.async_wait(boost::bind(&Client::check_deadline, this));
+}
+
+bool Client::start_connect(boost::asio::ip::tcp::resolver::iterator endpoint_iterator )
+{
+   if ( endpoint_iterator != boost::asio::ip::tcp::resolver::iterator() )
+   {
+#ifdef DEBUG_CLIENT
+      std::cout << "   Client::start_connect: Trying " << endpoint_iterator->endpoint() << "..." << std::endl;
+#endif
+
+      // expires_from_now cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled.
+      // If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed.
+      // If it returns 1 then the wait handler was successfully cancelled.
+
+      // Set a deadline for the connect operation.
+      deadline_.expires_from_now(boost::posix_time::seconds(timeout_));
+
+      boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;
+      connection_.socket().async_connect(
+               endpoint,
+               boost::bind(
+                        &Client::handle_connect,
+                        this,
+                        boost::asio::placeholders::error,
+                        endpoint_iterator ) );
+   }
+   else {
+      // ran out of end points
+      return false;
+   }
+   return true;
+}
+
+void Client::handle_connect(  const boost::system::error_code& e,
+                        boost::asio::ip::tcp::resolver::iterator endpoint_iterator )
+{
+#ifdef DEBUG_CLIENT
+   std::cout << "   Client::handle_connect stopped_=" << stopped_ << std::endl;
+#endif
+
+  if (stopped_)
+      return;
+
+  // The async_connect() function automatically opens the socket at the start
+  // of the asynchronous operation. If the socket is closed at this time then
+  // the timeout handler must have run first.
+  if (!connection_.socket().is_open())
+  {
+#ifdef DEBUG_CLIENT
+     std::cout << "   Client::handle_connect: *Connect timeout*:  Trying next end point" << std::endl;
+#endif
+     // Try the next available end point.
+     if (!start_connect( ++endpoint_iterator)) {
+        // Ran out of end points, An error occurred
+        stop();
+        std::stringstream ss;
+        if (e) ss << "Client::handle_connect: Ran out of end points : connection error( " << e.message() << " ) for request( " << outbound_request_ << " ) on " << host_ << ":" << port_;
+        else   ss << "Client::handle_connect: Ran out of end points : connection error for request( " << outbound_request_ << " ) on " << host_ << ":" << port_;
+        throw std::runtime_error(ss.str());
+     }
+  }
+  else if (e) {
+
+#ifdef DEBUG_CLIENT
+     std::cout << "   Client::handle_connect Connect error: " << e.message() << " . Trying next end point" << std::endl;
+#endif
+
+     // Some kind of error. We need to close the socket used in the previous connection attempt
+     // before starting a new one.
+     connection_.socket().close();
+
+     // Try the next end point.
+     if (!start_connect( ++endpoint_iterator)) {
+        // Ran out of end points. An error occurred.
+        stop();
+        std::stringstream ss; ss << "Client::handle_connect: Ran out of end points: connection error( " << e.message() << " ) for request( " << outbound_request_ << " ) on " << host_ << ":" << port_;
+        throw std::runtime_error(ss.str());
+     }
+  }
+  else {
+#ifdef DEBUG_CLIENT
+     std::cout << "   Client::handle_connect **Successfully** established connection to the server: Sending Out bound request = " << outbound_request_ << std::endl;
+#endif
+     // **Successfully** established connection to the server
+     // Start operation to *SEND* a request to the server
+     start_write();
+  }
+}
+
+void Client::start_write()
+{
+   // expires_from_now cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled.
+   // If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed.
+   // If it returns 1 then the wait handler was successfully cancelled.
+
+   // Set a deadline for the write operation.
+   deadline_.expires_from_now(boost::posix_time::seconds(timeout_));
+
+   connection_.async_write(
+                        outbound_request_,
+                        boost::bind(
+                                    &Client::handle_write,
+                                    this,
+                                    boost::asio::placeholders::error ) );
+}
+
+void Client::handle_write( const boost::system::error_code& e )
+{
+#ifdef DEBUG_CLIENT
+      std::cout << "   Client::handle_write stopped_ = " << stopped_ << std::endl;
+#endif
+   if (stopped_)
+       return;
+
+	if ( !e ) {
+
+#ifdef DEBUG_CLIENT
+		std::cout << "   Client::handle_write OK: Check for server reply" << std::endl;
+#endif
+		// Check to see if the server was happy with our request.
+		// If all is OK, the server may choose not to reply(cuts down on network traffic)
+		// In which case handle_read will get a End of File error.
+		start_read();
+	}
+	else {
+
+		// An error occurred.
+	   stop();
+
+		std::stringstream ss;  ss << "Client::handle_write: error (" << e.message() << " ) for request( " << outbound_request_ << " ) on " << host_ << ":" <<  port_;
+ 		throw std::runtime_error(ss.str());
+ 	}
+
+	// Nothing to do. The socket will be closed automatically when the last
+	// reference to the connection object goes away.
+}
+
+void Client::start_read()
+{
+   // expires_from_now cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled.
+   // If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed.
+   // If it returns 1 then the wait handler was successfully cancelled.
+
+   // Set a deadline for the read operation.
+   deadline_.expires_from_now(boost::posix_time::seconds(timeout_));
+
+   connection_.async_read(
+                     inbound_response_,
+                     boost::bind(
+                                 &Client::handle_read,
+                                 this,
+                                 boost::asio::placeholders::error ) );
+}
+
+
+void Client::handle_read( const boost::system::error_code& e )
+{
+#ifdef DEBUG_CLIENT
+      std::cout << "   Client::handle_read stopped_ = " << stopped_ << std::endl;
+#endif
+   if (stopped_)
+       return;
+
+   // close socket, & cancel timer.
+   stop();
+
+	if ( !e ) {
+#ifdef DEBUG_CLIENT
+		std::cout << "   Client::handle_read OK \n";
+		std::cout << "      outbound_request_ = " << outbound_request_ << "\n";
+		std::cout << "      inbound_response_ = " << inbound_response_ << "\n";
+#endif
+		/// ***********************************************************
+		/// ClientInvoker will call back, to handle_server_response.
+ 		/// ***********************************************************
+		// Successfully handled request
+	}
+	else {
+	   //
+		// A connection error occurred.
+		// In cases where ( to cut down network traffic), the server does a shutdown/closes
+	   // the socket without replying we will get End of File error.
+	   //
+		// i.e. client requests a response from the server, and it does not reply(or replies with shutdown/close)
+	   //
+
+	   // This code will handle  a no reply from the server & hence reduce network traffic
+	   // Server has shutdown and closed the socket.
+	   // See void Server::handle_read(...)
+		if (e.value() == boost::asio::error::eof) {
+			// Treat a  *no* reply as OK, so that handle_server_response() returns OK
+#ifdef DEBUG_CLIENT
+			std::cout << "   Client::handle_read: No reply from server: Treat as OK" << std::endl;
+#endif
+			inbound_response_.set_cmd( STC_Cmd_ptr(new StcCmd(StcCmd::OK)) );
+			return;
+ 		}
+
+		std::stringstream ss;
+		ss << "Client::handle_read: connection error( " << e.message() << " ) for request( " << outbound_request_ << " ) on " << host_ << ":" << port_;
+		throw std::runtime_error(ss.str());
+	}
+
+	// Since we are not starting a new operation the io_service will run out of
+	// work to do and the Client will exit.
+}
+
+void Client::stop()
+{
+   stopped_ = true;
+   connection_.socket().close();
+   deadline_.cancel();
+}
+
+/// Handle completion of a write operation.
+/// Handle completion of a read operation.
+bool Client::handle_server_response( ServerReply& server_reply, bool debug ) const
+{
+	if (debug) std::cout << "   Client::handle_server_response" << std::endl;
+	return inbound_response_.handle_server_response(server_reply, outbound_request_.get_cmd(), debug);
+}
+
+void Client::check_deadline()
+{
+#ifdef DEBUG_CLIENT
+      std::cout << "   Client::check_deadline stopped_=" << stopped_
+                << " expires(" << to_simple_string(deadline_.expires_at())
+                << ") time now(" << to_simple_string(boost::asio::deadline_timer::traits_type::now()) << ")" << std::endl;
+#endif
+   if (stopped_)
+      return;
+
+   // Check whether the deadline has passed. We compare the deadline against
+   // the current time since a new asynchronous operation may have moved the
+   // deadline before this actor had a chance to run.
+   if (deadline_.expires_at() <= boost::asio::deadline_timer::traits_type::now())
+   {
+#ifdef DEBUG_CLIENT
+      std::cout << "   Client::check_deadline timed out" << std::endl;
+#endif
+
+      // The deadline has passed. The socket is closed so that any outstanding
+      // asynchronous operations are cancelled.
+      stop();
+
+      std::stringstream ss;
+      ss << "Client::check_deadline: timed out after " << timeout_ << " seconds for request( " << outbound_request_ << " ) on " << host_ << ":" << port_;
+      throw std::runtime_error(ss.str());
+   }
+
+   // Put the actor back to sleep.
+   deadline_.async_wait(boost::bind(&Client::check_deadline, this));
+}
diff --git a/ecflow_4_0_7/Base/src/Client.hpp b/ecflow_4_0_7/Base/src/Client.hpp
new file mode 100644
index 0000000..80b97a2
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Client.hpp
@@ -0,0 +1,83 @@
+#ifndef CLIENT_HPP_
+#define CLIENT_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Client
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+// Client      : Acts as the client part. ( in client/server architecture)
+//               Note: The plug command can move a node to another server
+//               hence the server itself will NEED to ACT as a client.
+//               This is why client lives in Base and not the Client project
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/asio.hpp>
+
+#include "Connection.hpp" // Must come before boost/serialization headers.
+#include "ClientToServerRequest.hpp"
+#include "ServerToClientResponse.hpp"
+
+class Client {
+public:
+	/// Constructor starts the asynchronous connect operation.
+	Client( boost::asio::io_service& io_service, Cmd_ptr cmd_ptr, const std::string& host, const std::string& port , int timout = 0);
+	~Client();
+
+	/// Client side, get the server response, handles reply from server
+	/// Returns true if all is ok, else false if further client action is required
+	/// will throw std::runtime_error for errors
+	bool handle_server_response( ServerReply&,  bool debug ) const;
+
+
+   // support for forward compatibility, by changing boost archive version
+	// By default 0 means, and need to be explicitly enabled. The integer must correspond with
+	// the archive version of the old server. for boost 1.47 this was 9
+   // Chosen to change client side only
+   void allow_new_client_old_server(int f)  { connection_.allow_new_client_old_server(f);}
+
+private:
+
+	void start(boost::asio::ip::tcp::resolver::iterator);
+	void stop();
+	void check_deadline();
+
+	bool start_connect(boost::asio::ip::tcp::resolver::iterator);
+	void start_write();
+	void start_read();
+
+	/// Handle completion of a connect operation.
+	void handle_connect( const boost::system::error_code& e,
+			             boost::asio::ip::tcp::resolver::iterator endpoint_iterator );
+
+	/// Handle completion of a read operation.
+	void handle_read( const boost::system::error_code& e );
+
+	/// Handle completion of a write operation
+	void handle_write( const boost::system::error_code& e );
+
+private:
+	bool stopped_;
+	std::string             host_;             /// the servers name
+	std::string             port_;             /// the port on the server
+	connection              connection_;       /// The connection to the server.
+	ClientToServerRequest   outbound_request_; /// The request we will send to the server
+	ServerToClientResponse  inbound_response_; /// The response we get back from the server
+
+	std::string                 error_msg_;
+	boost::asio::deadline_timer deadline_;
+
+	//    connect        : timeout_ second
+	//    send request   : timeout_ second
+	//    receive reply  : timeout_ second
+	// Default value of 0 means take the timeout from the command
+	int                         timeout_;
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/ClientToServerRequest.cpp b/ecflow_4_0_7/Base/src/ClientToServerRequest.cpp
new file mode 100644
index 0000000..48c516d
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ClientToServerRequest.cpp
@@ -0,0 +1,58 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+#include <fstream>
+
+#include "ClientToServerRequest.hpp"
+#include "AbstractServer.hpp"
+
+using namespace std;
+
+STC_Cmd_ptr ClientToServerRequest::handleRequest(AbstractServer* as) const
+{
+	if (cmd_.get()) {
+		return cmd_->handleRequest(as);
+	}
+
+	/// means programming error somewhere
+ 	std::stringstream ss;
+	ss << "ClientToServerRequest::handleRequest: Can not send a NULL request to the server !";
+  	throw std::runtime_error(ss.str());
+}
+
+std::ostream& ClientToServerRequest::print( std::ostream& os ) const {
+	if (cmd_.get()) {
+		return cmd_->print(os);
+	}
+	return os << "NULL request";
+}
+
+bool ClientToServerRequest::operator==(const ClientToServerRequest& rhs) const
+{
+	if (!cmd_.get() && !rhs.cmd_.get()) {
+		return true;
+	}
+	if (cmd_.get() && !rhs.cmd_.get()) {
+		return false;
+	}
+	if (!cmd_.get() && rhs.cmd_.get()) {
+		return false;
+	}
+	return (cmd_->equals(rhs.cmd_.get()));
+}
+
+std::ostream& operator<<( std::ostream& os, const ClientToServerRequest& d ) {
+	return d.print( os );
+}
diff --git a/ecflow_4_0_7/Base/src/ClientToServerRequest.hpp b/ecflow_4_0_7/Base/src/ClientToServerRequest.hpp
new file mode 100644
index 0000000..f56f5f0
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ClientToServerRequest.hpp
@@ -0,0 +1,67 @@
+#ifndef CLIENT_TO_SERVER_REQUEST_HPP_
+#define CLIENT_TO_SERVER_REQUEST_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/tracking.hpp>
+#include "ClientToServerCmd.hpp"
+
+// Base class for client to server requesting.
+// This class is used in the IPC messaging from  client to server.
+class ClientToServerRequest : private boost::noncopyable {
+public:
+
+   ClientToServerRequest() {}
+   ClientToServerRequest(const Cmd_ptr& cmd) : cmd_(cmd) { cmd_->setup_user_authentification();}
+   ~ClientToServerRequest() {}
+
+   void set_cmd(const Cmd_ptr& cmd) { cmd_ = cmd; cmd_->setup_user_authentification(); }
+   Cmd_ptr get_cmd() const { return cmd_;}
+
+   /// This is called in the server only, to handle the quest.
+   STC_Cmd_ptr handleRequest(AbstractServer*) const;
+
+   std::ostream& print(std::ostream& os) const;
+
+   bool getRequest()  const { return (cmd_.get()) ? cmd_->get_cmd()  : false; }
+   bool terminateRequest() const { return (cmd_.get()) ? cmd_->terminate_cmd() : false;  }
+   bool groupRequest() const { return (cmd_.get()) ? cmd_->group_cmd() : false;  }
+
+   /// Used by boost test, to verify persistence
+   bool operator==(const ClientToServerRequest& rhs) const;
+
+private:
+   Cmd_ptr cmd_;
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & cmd_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const ClientToServerRequest& d);
+
+// Do NOT use
+//    BOOST_CLASS_IMPLEMENTATION(ClientToServerRequest, boost::serialization::object_serializable)
+//    i.e eliminate serialisation overhead at the cost of never being able to increase the version.
+// Since we may need use version ing in the future
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+//   Eliminate object tracking (even if serialised through a pointer)
+//   at the risk of a programming error creating duplicate objects.
+BOOST_CLASS_TRACKING(ClientToServerRequest,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/Cmd.hpp b/ecflow_4_0_7/Base/src/Cmd.hpp
new file mode 100644
index 0000000..bd7dd17
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Cmd.hpp
@@ -0,0 +1,27 @@
+#ifndef CMD_HPP_
+#define CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Cmd
+// Author      : Avi
+// Revision    : $Revision: #84 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/shared_ptr.hpp>
+
+class ClientToServerCmd;
+class ServerToClientCmd;
+class ServerReply;
+
+typedef boost::shared_ptr<ClientToServerCmd> Cmd_ptr;
+typedef boost::shared_ptr<ServerToClientCmd> STC_Cmd_ptr;
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/Connection.hpp b/ecflow_4_0_7/Base/src/Connection.hpp
new file mode 100644
index 0000000..ebe0c7d
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Connection.hpp
@@ -0,0 +1,315 @@
+#ifndef CONNECTION_HPP_
+#define CONNECTION_HPP_
+//============================================================================
+// Name        : Connection.cpp
+// Author      : Avi
+// Revision    : $Revision: #26 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Serves as the connection between client server
+//============================================================================
+
+#if defined(HPUX)
+#include <sys/select.h> // hp-ux uses pselect
+#endif
+
+#include <iomanip>
+#include <string>
+#include <sstream>
+#include <vector>
+
+#include <boost/asio.hpp>
+#include <boost/bind.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/tuple/tuple.hpp>
+
+#include "Log.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Serialization.hpp"
+
+#ifdef DEBUG
+//#define DEBUG_CONNECTION 1
+//#define DEBUG_CONNECTION_MEMORY 1
+#endif
+
+/// The connection class provides serialisation primitives on top of a socket.
+/// ISSUES
+/// ======
+/// When the test are run with different configuration
+/// TEXT,BINARY, PORTABLE_BINARY there was _no_ discernible difference in the
+/// run times? I would have expected client->server communication via binary
+/// to be faster. However the definition file we are using are relatively small!
+///
+/// See: ACore/src/boost_archive.hpp for details about serialisation migration issues
+///
+/**
+ * Each message sent using this class consists of:
+ * @li An 8-byte header containing the length of the serialized data in
+ * hexadecimal.
+ * @li The serialized data.
+ */
+class connection {
+public:
+	/// Allow tentative support for new client to talk to old server
+   /// by changing the boost serialisation archive version, hence tentative
+	connection(boost::asio::io_service& io_service)
+    : allow_new_client_old_server_(0),
+      allow_old_client_new_server_(0),
+      socket_(io_service)
+	{
+#ifdef DEBUG_CONNECTION
+		std::cout << "Connection::connection\n";
+#endif
+	}
+
+	~connection() {
+#ifdef DEBUG_CONNECTION
+		std::cout << "Connection::~connection  socket_.is_open() = " << socket_.is_open() << "\n\n";
+#endif
+	}
+
+	/// Get the underlying socket. Used for making a connection or for accepting
+	/// an incoming connection.
+	boost::asio::ip::tcp::socket& socket() {
+		return socket_;
+	}
+
+	// support for forward compatibility, by changing boost archive version, used in client context
+	// See: ACore/src/boost_archive.hpp for details about serialisation migration issues
+   void allow_new_client_old_server(int f)  { allow_new_client_old_server_ = f;}
+
+   // support for forward compatibility, by changing boost archive version, used in server context
+   void allow_old_client_new_server(int f)  { allow_old_client_new_server_ = f;}
+
+
+	/// Asynchronously write a data structure to the socket.
+	template<typename T, typename Handler>
+	void async_write(const T& t, Handler handler) {
+
+#ifdef DEBUG_CONNECTION
+		std::cout << "Connection::async_write, Serialise the data first so we know how large it is\n";
+#endif
+		// Serialise the data first so we know how large it is.
+		try {
+		   ecf::save_as_string(outbound_data_,t);
+
+         if (allow_new_client_old_server_ != 0 && !Ecf::server()) {
+            // Client context, forward compatibility, new client -> old server
+            ecf::boost_archive::replace_version(outbound_data_,allow_new_client_old_server_);
+         }
+
+         // Server context: To allow build of ecflow, i.e old clients 3.0.x, installed on machines hpux,aix,etc
+         // need to communicate to *new* server 4.0.0,  new server (boost 1.53:10) ) --> (old_client:boost_1.47:9)
+         // Note: the read below, will have determined the actual archive version used.
+         if (Ecf::server() && allow_old_client_new_server_ != 0 ) {
+            ecf::boost_archive::replace_version(outbound_data_,allow_old_client_new_server_);
+         }
+
+		} catch (const boost::archive::archive_exception& ae ) {
+		   // Unable to decode data. Something went wrong, inform the caller.
+		   log_archive_error("Connection::async_write, boost::archive::archive_exception ",ae);
+		   boost::system::error_code error(boost::asio::error::invalid_argument);
+		   socket_.get_io_service().post(boost::bind(handler, error));
+		   return;
+		}
+
+#ifdef DEBUG_CONNECTION
+		std::cout << "Connection::async_write Format the header \n";
+#endif
+		// Format the header.
+		std::ostringstream header_stream;
+		header_stream << std::setw(header_length) << std::hex << outbound_data_.size();
+		if (!header_stream || header_stream.str().size() != header_length) {
+			// Something went wrong, inform the caller.
+		   log_error("Connection::async_write, could not format header");
+			boost::system::error_code error(boost::asio::error::invalid_argument);
+			socket_.get_io_service().post(boost::bind(handler, error));
+			return;
+		}
+		outbound_header_ = header_stream.str();
+
+
+#ifdef DEBUG_CONNECTION_MEMORY
+		if (Ecf::server()) std::cout << "server::";
+		else               std::cout << "client::";
+   		std::cout << "async_write outbound_header_.size(" << outbound_header_.size() << ") outbound_data_.size(" << outbound_data_.size() << ")\n";
+#endif
+
+#ifdef DEBUG_CONNECTION
+		std::cout << "Connection::async_write Write the serialized data to the socket. \n";
+#endif
+		// Write the serialized data to the socket. We use "gather-write" to send
+		// both the header and the data in a single write operation.
+		std::vector<boost::asio::const_buffer> buffers; buffers.reserve(2);
+		buffers.push_back(boost::asio::buffer(outbound_header_));
+		buffers.push_back(boost::asio::buffer(outbound_data_));
+		boost::asio::async_write(socket_, buffers, handler);
+
+#ifdef DEBUG_CONNECTION
+		std::cout << "Connection::async_write END \n";
+#endif
+	}
+
+	/// Asynchronously read a data structure from the socket.
+	template<typename T, typename Handler>
+	void async_read(T& t, Handler handler) {
+
+#ifdef DEBUG_CONNECTION
+		std::cout << "Connection::async_read\n";
+#endif
+
+		// Issue a read operation to read exactly the number of bytes in a header.
+		void (connection::*f)(const boost::system::error_code&, T&,boost::tuple<Handler>)
+		= &connection::handle_read_header<T, Handler>;
+
+		boost::asio::async_read(socket_, boost::asio::buffer(inbound_header_),
+				boost::bind(f, this, boost::asio::placeholders::error,
+						boost::ref(t), boost::make_tuple(handler)));
+	}
+
+private:
+	/// Handle a completed read of a message header. The handler is passed using
+	/// a tuple since boost::bind seems to have trouble binding a function object
+	/// created using boost::bind as a parameter.
+	template<typename T, typename Handler>
+	void handle_read_header(const boost::system::error_code& e, T& t,boost::tuple<Handler> handler)
+	{
+		if (e) {
+			boost::get<0>(handler)(e);
+		} else {
+			// Determine the length of the serialized data.
+			std::istringstream is(std::string(inbound_header_, header_length));
+			std::size_t inbound_data_size = 0;
+			if (!(is >> std::hex >> inbound_data_size)) {
+
+				// Header doesn't seem to be valid. Inform the caller.
+				boost::system::error_code error(boost::asio::error::invalid_argument);
+				boost::get<0>(handler)(error);
+				return;
+			}
+
+			// Start an asynchronous call to receive the data.
+			inbound_data_.resize(inbound_data_size);
+			void (connection::*f)(const boost::system::error_code&, T&,boost::tuple<Handler>)
+			= &connection::handle_read_data<T, Handler>;
+
+			boost::asio::async_read(socket_,
+					boost::asio::buffer(inbound_data_), boost::bind(f, this,
+							boost::asio::placeholders::error, boost::ref(t),
+							handler));
+		}
+	}
+
+	/// Handle a completed read of message data.
+	template<typename T, typename Handler>
+	void handle_read_data(const boost::system::error_code& e, T& t, boost::tuple<Handler> handler)
+	{
+		if (e) {
+			boost::get<0>(handler)(e);
+		} else {
+			// Extract the data structure from the data just received.
+			try {
+				std::string archive_data(&inbound_data_[0], inbound_data_.size());
+
+#ifdef DEBUG_CONNECTION_MEMORY
+				if (Ecf::server()) std::cout << "server::";
+				else               std::cout << "client::";
+				std::cout << "handle_read_data inbound_data_.size(" << inbound_data_.size() << ")\n";
+#endif
+
+				ecf::restore_from_string(archive_data,t);
+
+	         // Server context: To allow build of ecflow, i.e old clients 3.0.x, installed on machines hpux,aix,etc
+	         // need to communicate to *new* server 4.0.0,   new server (boost 1.53:10) ) --> (old_client:boost_1.47:9)
+	         if (Ecf::server() && allow_old_client_new_server_ != 0 ) {
+	            // get the actual version used, and *re-use* when replying back to *old* client
+	            int archive_version_in_data = ecf::boost_archive::extract_version(archive_data);
+	            int current_archive_version = ecf::boost_archive::version();
+	            if ( current_archive_version != archive_version_in_data ) {
+	               allow_old_client_new_server_ = archive_version_in_data;
+	            }
+	            else {
+	               // compatible, don't bother changing the write format
+	               allow_old_client_new_server_ = 0;
+	            }
+ 	         }
+			}
+			catch (const boost::archive::archive_exception& ae ) {
+
+			   // Log anyway so we know client <--> server incompatible
+			   log_archive_error("Connection::handle_read_data, boost::archive::archive_exception ",ae);
+
+			   // two context, client code or server, before giving up, try
+			   // - Client context, new server  -> old client (* assumes old client updated, with this code *)
+			   // - Server context, new client  -> old server (* assumes old server updated, with this code *)
+            // Match up the boost archive version in the string archive_data with current version
+            std::string archive_data(&inbound_data_[0], inbound_data_.size());
+			   int current_archive_version = ecf::boost_archive::version();
+			   int archive_version_in_data = ecf::boost_archive::extract_version(archive_data);
+			   if (current_archive_version != archive_version_in_data ) {
+			      if (ecf::boost_archive::replace_version(archive_data,current_archive_version)) {
+
+			         try {
+			            ecf::restore_from_string(archive_data,t);
+			            // It worked
+			            boost::get<0>(handler)(e);
+			            return;
+			         }
+			         catch (...) {}  // fall through and return error code
+			      }
+			   }
+
+				// Unable to decode data.
+				boost::system::error_code error( boost::asio::error::invalid_argument);
+				boost::get<0>(handler)(error);
+				return;
+			}
+			catch (std::exception& ) {
+			   log_error("Connection::handle_read_data, Unable to decode data");
+ 				boost::system::error_code error( boost::asio::error::invalid_argument);
+				boost::get<0>(handler)(error);
+				return;
+			}
+
+			// Inform caller that data has been received ok.
+			boost::get<0>(handler)(e);
+		}
+	}
+
+private:
+
+	void log_error(const char* msg) {
+      const char* in_context = ", in client";
+      if (Ecf::server()) in_context = ", in server";
+      ecf::LogToCout logToCout;
+      LOG(ecf::Log::ERR, msg << in_context);
+	}
+
+   void log_archive_error(const char* msg,const boost::archive::archive_exception& ae) {
+      const char* in_context = ", in client";
+      if (Ecf::server()) in_context = ", in server";
+      ecf::LogToCout logToCout;
+      LOG(ecf::Log::ERR, msg << ae.what() << in_context);
+   }
+
+private:
+   int allow_new_client_old_server_;
+   int allow_old_client_new_server_;
+	boost::asio::ip::tcp::socket socket_;/// The underlying socket.
+	std::string outbound_header_;        /// Holds an out-bound header.
+	std::string outbound_data_;          /// Holds the out-bound data.
+	enum { header_length = 8 };          /// The size of a fixed length header.
+	char inbound_header_[header_length]; /// Holds an in-bound header.
+	std::vector<char> inbound_data_; 	 /// Holds the in-bound data.
+};
+
+typedef boost::shared_ptr<connection> connection_ptr;
+
+#endif /* CONNECTION_HPP_ */
diff --git a/ecflow_4_0_7/Base/src/Gnuplot.cpp b/ecflow_4_0_7/Base/src/Gnuplot.cpp
new file mode 100644
index 0000000..21ca8e9
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Gnuplot.cpp
@@ -0,0 +1,358 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Encompasses functionality for plotting server load
+//============================================================================
+#include <assert.h>
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <sys/stat.h> // for chmod
+#include <boost/bind.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "Gnuplot.hpp"
+#include "File_r.hpp"
+#include "Str.hpp"
+#include "NodePath.hpp"
+
+using namespace std;
+namespace fs = boost::filesystem;
+
+
+namespace ecf {
+
+void Gnuplot::show_server_load(const std::string& log_file,size_t no_of_suites_to_plot)
+{
+   if (!fs::exists(log_file)) {
+      std::stringstream ss;
+      ss << "Gnuplot::show_server_load: The log file " << log_file << " does not exist\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   // The vector index is the order in which suites are found, this will be used to place the suite in the correct column
+   std::vector<SuiteLoad> suite_vec;
+   std::string gnuplot_file = create_gnuplot_file(log_file,suite_vec);
+   std::string gnuplot_script = create_gnuplot_script(gnuplot_file,suite_vec,no_of_suites_to_plot);
+
+
+   // make the gnuplot_script file executable
+   if ( chmod( gnuplot_script.c_str(), 0755 ) != 0 ) {
+      std::stringstream ss;
+      ss << "Gnuplot::show_server_load: Could not make gnu script file " << gnuplot_script << "  executable by using chmod";
+      throw std::runtime_error(ss.str());
+   }
+
+   std::string execute_gnuplot = "gnuplot " + gnuplot_script;
+   ::system(execute_gnuplot.c_str());
+}
+
+
+std::string Gnuplot::create_gnuplot_file(
+         const std::string& the_log_file,
+         std::vector<SuiteLoad>& suite_vec,
+         const std::string& temp_file )
+{
+   /// Will read the log file and create a new file that can be used as input to gnuplot
+   /// We will collate each request/cmd to the server made over a second.
+   /// There are two kinds of commands:
+   ///   o User Commands: these start with --
+   ///   o Child Command: these start with chd:
+   /// All child commands specify a path and hence suite, whereas for user commands this is optional
+   /// We will trap all use of paths, so that we can show which suites are contributing to the server load
+   /// This will be done for 4 suites
+   ///
+   /// Will convert: FROM:
+   ///   XXX:[HH:MM:SS D.M.YYYY] chd:init [+additional information]
+   ///   XXX:[HH:MM:SS D.M.YYYY] --begin  [+additional information]
+   /// -------------: TO:
+   ///    1         2         3             4              5            6        7       8         9       10
+   ///  HH:MM:SS D.M.YYYY request/sec  child_request  users_requests  suite_0 suite_1  suite_2  suite_3  suite_n
+
+   /// The log file can be massive > 50Mb
+   File_r log_file( the_log_file);
+   if ( !log_file.ok() ) throw std::runtime_error( "Gnuplot::prepare_for_gnuplot: Could not open log file " + the_log_file );
+
+
+   /// Create a new file that can be used with gnuplot. This has to be column based
+   std::ofstream gnuplot_file( temp_file.c_str() );
+   if ( !gnuplot_file ) {
+       throw std::runtime_error( "Gnuplot::prepare_for_gnuplot: Could not open output file: " + temp_file);
+   }
+
+   gnuplot_file << "#time    date     total-request child user suite_0  suite_1 suite_2  suite_3  suite_n\n";
+
+   std::vector< std::string > new_time_stamp;
+   std::vector< std::string > old_time_stamp;
+   size_t child_requests_per_second = 0;
+   size_t user_request_per_second = 0;
+   unsigned int plot_data_line_number = 0;
+   string line;
+   while ( log_file.good() ) {
+      log_file.getline( line); // default delimiter is /n
+
+      // The log file format we are interested is :
+      // 0             1         2            3
+      // MSG:[HH:MM:SS D.M.YYYY] chd:fullname [path +additional information]
+      // MSG:[HH:MM:SS D.M.YYYY] --begin      [args | path(optional) ]    :<user>
+
+      /// We are only interested in Commands (i.e MSG:), and not state changes
+      if (line.empty())  continue;
+      if (line[0] != 'M')  continue;
+      std::string::size_type msg_pos = line.find("MSG:");
+      if (msg_pos != 0)  continue;
+
+      bool child_cmd = false;
+      bool user_cmd = false;
+      if (line.find(Str::CHILD_CMD()) != std::string::npos) child_cmd = true;
+      else if (line.find(Str::USER_CMD()) != std::string::npos)  user_cmd = true;
+      if (!child_cmd && !user_cmd) continue;
+
+      new_time_stamp.clear();
+      {
+         /// MSG:[HH:MM:SS D.M.YYYY] chd:fullname [+additional information] ---> HH:MM:SS D.M.YYYY
+         /// EXTRACT the date
+         string::size_type first_open_bracket = line.find('[');
+         if ( first_open_bracket == std::string::npos) { std::cout << line << "\n"; assert(false); continue;}
+         line.erase(0,first_open_bracket+1);
+
+         string::size_type first_closed_bracket = line.find(']');
+         if ( first_closed_bracket ==  std::string::npos) { std::cout << line << "\n"; assert(false); continue;}
+         std::string time_stamp = line.substr(0, first_closed_bracket);
+
+         Str::split(time_stamp, new_time_stamp);
+         if (new_time_stamp.size() != 2)  continue;
+
+         line.erase(0,first_closed_bracket+1);
+      }
+
+      // Should be just left with " chd:<child command> " or " --<user command>, since we have remove time stamp
+//#ifdef DEBUG
+//      std::cout << line << "\n";
+//#endif
+
+      if (old_time_stamp.empty()) {
+         if (child_cmd) child_requests_per_second++;
+         else           user_request_per_second++;
+
+         // Extract path if any, to determine the suite most contributing to server load
+         size_t column_index = 0;
+         bool suite_path_found = extract_suite_path(line,child_cmd,suite_vec,column_index);
+         if ( suite_path_found ) assert(suite_vec[column_index].request_per_second_ <= (child_requests_per_second + user_request_per_second) );
+      }
+      else if (old_time_stamp[0] == new_time_stamp[0]) { // HH:MM:SS == HH:MM:SS
+         if (child_cmd) child_requests_per_second++;
+         else           user_request_per_second++;
+
+         size_t column_index = 0;
+         bool suite_path_found = extract_suite_path(line,child_cmd,suite_vec,column_index);
+         if ( suite_path_found ) assert(suite_vec[column_index].request_per_second_ <= (child_requests_per_second + user_request_per_second) );
+      }
+      else {
+         /// Start of *NEW* time,
+         /// write the *OLD* time line should contain time date without []
+         ///    1         2         3             4              5            6        7      8       9       10
+         ///  HH:MM:SS D.M.YYYY total_request child_request  users_requests suite_0 suite_1 suite_2 suite_3 suite_n
+         plot_data_line_number++;
+         gnuplot_file << old_time_stamp[0] << " "
+                      << old_time_stamp[1] << " "
+                      << (child_requests_per_second + user_request_per_second) << " "
+                      << child_requests_per_second << " "
+                      << user_request_per_second << " ";
+         for(size_t i = 0; i < suite_vec.size(); i++) { gnuplot_file << suite_vec[i].request_per_second_ << " ";}
+         gnuplot_file << "\n";
+
+
+         // clear request per second
+         child_requests_per_second = 0;
+         user_request_per_second = 0;
+         for(size_t i= 0; i < suite_vec.size();i++) { suite_vec[i].request_per_second_ = 0; }
+
+         // start of *new* time
+         if (child_cmd) child_requests_per_second++;
+         else           user_request_per_second++;
+
+         size_t column_index = 0;
+         bool suite_path_found = extract_suite_path(line,child_cmd,suite_vec,column_index);
+         if ( suite_path_found ) assert(suite_vec[column_index].request_per_second_ <= (child_requests_per_second + user_request_per_second) );
+      }
+
+      old_time_stamp = new_time_stamp;
+   }
+
+   if (plot_data_line_number < 3) {
+      throw std::runtime_error( "Gnuplot::prepare_for_gnuplot: Log file empty or not enough data for plot\n");
+   }
+   return temp_file;
+}
+
+std::string Gnuplot::create_gnuplot_script(
+         const std::string& path_to_file,
+         const std::vector<SuiteLoad>& suite_vec,
+         size_t no_of_suites_to_plot,
+         const std::string& script)
+{
+   /// Create the gnuplot script file for rendering the graph
+   std::ofstream gnuplot_script( script.c_str() );
+   if ( !gnuplot_script ) {
+       throw std::runtime_error( "Gnuplot::create_gnuplot_script: Could not open output file: " + script);
+   }
+
+
+   gnuplot_script << "set autoscale                          # scale axes automatically\n";
+   gnuplot_script << "set xtic auto rotate                   # set xtics automatically\n";
+   gnuplot_script << "set ytic auto                          # set ytics automatically\n";
+//   gnuplot_script << "set origin 0,0.08                      # offset y, so that rotated xtics don't truncate, However cause title to disappear\n";
+   gnuplot_script << "set title \"Server request per second\"\n";
+   gnuplot_script << "set x2label \"time/min\" textcolor lt 3\n";
+   gnuplot_script << "set ylabel \"requests\"\n";
+   gnuplot_script << "set xdata time\n";
+   gnuplot_script << "set grid                             # show grid\n";
+   gnuplot_script << "set timefmt \"%H:%M:%S %d.%m.%Y\"\n";
+
+   //# LINE COLORS, STYLES
+   //# type 'test' to see the colors and point types available.
+   //# Differs from x11 to postscript
+   //# lt chooses a particular line type: -1=black 1=red 2=grn 3=blue 4=purple 5=aqua 6=brn 7=orange 8=light-brn
+   //# lt must be specified before pt for colored points
+   //# for postscipt -1=normal, 1=grey, 2=dashed, 3=hashed, 4=dot, 5=dot-dash
+   //# lw chooses a line width 1=normal, can use 0.8, 0.3, 1.5, 3, etc.
+   //# ls chooses a line style
+
+   ///    1         2         3             4              5            6        7       8         9       n
+   ///  HH:MM:SS D.M.YYYY total_request child_request  users_requests suite_0 suite_1  suite_2  suite_3  suite_n
+
+   // determine which suite columns to plot based on server load
+   std::vector<SuiteLoad> suite_vec_copy = suite_vec;
+
+//   cout << "sort vector according to load\n";
+   std::sort(suite_vec_copy.begin(),suite_vec_copy.end(),
+            boost::bind(std::greater<int>(),
+               boost::bind(&SuiteLoad::total_request_per_second_, _1),
+               boost::bind(&SuiteLoad::total_request_per_second_, _2)));
+//   for(size_t i = 0; i < suite_vec_copy.size(); i++) {
+//      cout << " " << suite_vec_copy[i].first << " " << suite_vec_copy[i].second << "\n";
+//   }
+
+//   cout << "get top loaded suites\n";
+   std::vector<std::string> suites;
+   for(size_t i = 0; i < suite_vec_copy.size() && i < no_of_suites_to_plot; i++) {
+      suites.push_back(suite_vec_copy[i].suite_name_);
+   }
+//   std::copy(suites.begin(), suites.end(), std::ostream_iterator <std::string> (std::cout, "\n"));
+
+
+//   cout << "now determine which columns the top suites belong to, **THIS** time <int> indicates column\n";
+   std::vector< std::pair<std::string,int> > ordered_suites;
+   for(size_t column = 0; column < suite_vec.size(); column++) {
+      for(size_t j = 0; j < suites.size(); j++) {
+         if (suites[j] == suite_vec[column].suite_name_) {
+            ordered_suites.push_back ( std::make_pair(suites[j], column));
+         }
+      }
+   }
+//   for(size_t i = 0; i < ordered_suites.size(); i++) {
+//      cout << " " << ordered_suites[i].first << " " << ordered_suites[i].second << "\n";
+//   }
+
+
+   gnuplot_script << "plot \""
+                  << path_to_file << "\" using 1:4 title \"child\" with lines, \""
+                  << path_to_file << "\" using 1:5 title \"user\" with lines, \""
+                  << path_to_file << "\" using 1:3 smooth bezier title \"total-load\" with lines lt 3";
+   if (!ordered_suites.empty()) gnuplot_script << ",";
+   else                         gnuplot_script << "\n";
+   for(size_t i = 0; i < ordered_suites.size(); i++) {
+      gnuplot_script << "\""
+                     << path_to_file
+                     << "\" using 1:" << (6 + ordered_suites[i].second)
+                     << " smooth bezier title \"" << ordered_suites[i].first << "\" with lines";
+      if (i == ordered_suites.size() -1) gnuplot_script << "\n";
+      else                               gnuplot_script << ",";
+   }
+
+   gnuplot_script << "pause -1 \"Hit any key to continue\"\n\n";
+
+   return script;
+}
+
+
+bool Gnuplot::extract_suite_path(
+         const std::string& line,
+         bool child_cmd,
+         std::vector<SuiteLoad>& suite_vec,
+         size_t& column_index   // 0 based
+         )
+{
+   // line should either
+   //  chd:<childcommand> path
+   //  --<user command)   path<optional> :<user>
+   size_t forward_slash = line.find('/');
+   if ( forward_slash != std::string::npos) {
+
+      std::string path;
+      if (child_cmd) {
+
+         // For labels ignore paths in the label part
+         // MSG:[14:55:04 17.10.2013] chd:label progress 'core/nodeattr/nodeAParser' /suite/build/cray/cray_gnu/build_release/test
+         if (line.find("chd:label") != std::string::npos) {
+            size_t last_tick = line.rfind("'");
+            if ( last_tick != std::string::npos ) {
+               size_t the_forward_slash = line.find('/',last_tick);
+               if (the_forward_slash != std::string::npos) {
+                  forward_slash = the_forward_slash;
+               }
+            }
+         }
+         path = line.substr(forward_slash);
+      }
+      else {
+         // Ignore the --news command, they dont have a path, hence i.e to ignore line like:
+         //  MSG:[09:36:05 22.10.2013] --news=1 36506 6  :ma0 [server handle(36508,7) server(36508,7)
+         //                     : *Large* scale changes (new handle or suites added/removed) :NEWS]
+         //   the /removed was being interpreted as a suite
+         if (line.find("--news") != std::string::npos) return false;
+      }
+
+      // find the space after the path
+      size_t space_pos = line.find(" ",forward_slash);
+      if (space_pos != std::string::npos &&  space_pos > forward_slash) {
+         path = line.substr(forward_slash,space_pos-forward_slash);
+      }
+
+      if (!path.empty()) {
+
+         std::vector<std::string> theNodeNames; theNodeNames.reserve(4);
+         NodePath::split(path,theNodeNames);
+         if (!theNodeNames.empty()) {
+            for(size_t n = 0; n < suite_vec.size(); n++) {
+               if (suite_vec[n].suite_name_ == theNodeNames[0] ) {
+                  suite_vec[n].request_per_second_++;
+                  suite_vec[n].total_request_per_second_++;
+                  column_index = n;
+                  return true;
+               }
+            }
+
+            suite_vec.push_back( SuiteLoad(theNodeNames[0]) );
+            column_index = suite_vec.size() - 1;
+            return true;
+         }
+      }
+   }
+   return false;
+}
+
+
+}
diff --git a/ecflow_4_0_7/Base/src/Gnuplot.hpp b/ecflow_4_0_7/Base/src/Gnuplot.hpp
new file mode 100644
index 0000000..2ea9dce
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Gnuplot.hpp
@@ -0,0 +1,69 @@
+#ifndef GNUPLOT_HPP_
+#define GNUPLOT_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Log
+// Author      : Avi
+// Revision    : $Revision: #2 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <boost/noncopyable.hpp>
+
+namespace ecf {
+
+class Gnuplot : private boost::noncopyable {
+public:
+
+   /// parse the log file and show gnuplot of server load
+   /// Include the suite most contributing to the load
+   /// Assumes that gnuplot is available on $PATH
+   static void show_server_load(const std::string& log_file, size_t no_of_suites_to_plot = 5);
+
+private:
+
+   struct SuiteLoad {
+      SuiteLoad(const std::string& name) : suite_name_(name),  request_per_second_(1), total_request_per_second_(1) {}
+
+      std::string suite_name_;
+      size_t      request_per_second_;
+      size_t      total_request_per_second_;
+   };
+
+   /// Returns that path to file created by this function.
+   /// The create file is to be used by gnuplot to show the server load.
+   ///  Can throw exceptions
+   static std::string create_gnuplot_file(
+            const std::string& log_file,
+            std::vector<SuiteLoad>& suite_vec,
+            const std::string& input_data = "gnuplot.dat");
+
+   /// returns the path to the gnuplot script
+   static std::string create_gnuplot_script(
+            const std::string& path_to_file,
+            const std::vector<SuiteLoad>& suite_vec,
+            size_t no_of_suites_to_plot,
+            const std::string& script = "gnuplot.script");
+
+   static bool extract_suite_path(
+            const std::string& line,
+            bool child_cmd,
+            std::vector<SuiteLoad>& suite_vec,
+            size_t& column_index   // 0 based
+            );
+
+private:
+
+   ~Gnuplot();
+   Gnuplot();
+};
+}
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/ServerReply.cpp b/ecflow_4_0_7/Base/src/ServerReply.cpp
new file mode 100644
index 0000000..d295e57
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ServerReply.cpp
@@ -0,0 +1,36 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+//#include <iostream>
+#include "ServerReply.hpp"
+
+/// *Note* server_reply_.client_handle_ is kept until the next call to register a new client_handle
+/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
+void ServerReply::clear_for_invoke(bool command_line_interface)
+{
+   //std::cout << "ServerReply::clear_for_invoke\n";
+	cli_ =  command_line_interface;
+	in_sync_ = false;
+	full_sync_ = false;
+	news_ = ServerReply::NO_NEWS;
+	block_client_on_home_server_ = false;
+	block_client_server_halted_ = false;
+	block_client_zombie_detected_ = false;
+	error_msg_.clear();
+	str_.clear();
+	zombies_.clear();
+	str_vec_.clear();
+	client_handle_suites_.clear();
+	changed_nodes_.clear();
+}
diff --git a/ecflow_4_0_7/Base/src/ServerReply.hpp b/ecflow_4_0_7/Base/src/ServerReply.hpp
new file mode 100644
index 0000000..d565b28
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ServerReply.hpp
@@ -0,0 +1,138 @@
+#ifndef SERVER_REPLY_HPP_
+#define SERVER_REPLY_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <vector>
+#include <boost/noncopyable.hpp>
+#include "NodeFwd.hpp"
+#include "Zombie.hpp"
+#include "Stats.hpp"
+
+/// This class is used to hold the replies back from the server
+/// *Note* server_reply_.client_handle_ is kept until the next call to register a new client_handle
+/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
+
+class ServerReply : private boost::noncopyable {
+public:
+   // After ECFLOW-182, NO_DEFS no longer used, however kept, to ensure client/server compatibility
+   // ie. for new client(viewer) must process this from old server, which could return NO_DEFS
+   enum News_t { NO_NEWS, NEWS, DO_FULL_SYNC, NO_DEFS };
+ 	ServerReply()
+ 	: cli_(false), in_sync_(false), full_sync_(false), news_(NO_NEWS),
+ 	  block_client_on_home_server_(false),block_client_server_halted_(false),block_client_zombie_detected_(false),
+ 	  client_handle_(0) {}
+
+	/// *Note* server_reply_.client_handle_ is kept until the next call to register a new client_handle
+	/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
+ 	/// and reset everything else
+	void clear_for_invoke(bool command_line_interface); // true if calling from command line
+
+ 	/// task based replies
+ 	bool block_client_on_home_server() const { return block_client_on_home_server_;}
+ 	void set_block_client_on_home_server() { block_client_on_home_server_ = true;}
+
+	bool block_client_server_halted() const { return block_client_server_halted_;}
+	void set_block_client_server_halted() { block_client_server_halted_ = true;}
+
+	bool block_client_zombie_detected() const { return block_client_zombie_detected_;}
+	void set_block_client_zombie_detected() { block_client_zombie_detected_ = true;}
+
+	bool client_request_failed() const { return !error_msg_.empty(); }
+	void set_error_msg(const std::string& e) { error_msg_ = e;}
+	const std::string& error_msg() const { return error_msg_; }
+	std::string& get_error_msg() { return error_msg_; }
+
+	const std::vector<Zombie>& zombies() const { return zombies_; }
+	void set_zombies( const std::vector<Zombie>& z) { zombies_ = z;}
+
+	/// For uses with the suites cmd, or any other command that needs a vector of strings form server
+   const std::vector<std::string>& get_string_vec() const { return str_vec_; }
+   void set_string_vec( const std::vector<std::string>& z) { str_vec_ = z;}
+
+   const std::vector<std::pair<unsigned int, std::vector<std::string> > >& get_client_handle_suites() const { return client_handle_suites_; }
+   void set_client_handle_suites(const std::vector<std::pair<unsigned int, std::vector<std::string> > >& s) { client_handle_suites_ = s; }
+
+	/// Only valid when the client requested the CFileCmd or log file from the server
+	/// Other times this will be empty.
+	const std::string& get_string() const { return str_; }
+	void set_string(  const std::string& f) { str_ = f;}
+
+	/// Only valid when Stats command called.
+   const Stats& stats() const { return stats_; }
+   void set_stats(  const Stats& s) { stats_ = s;}
+
+	/// Return true if client is using Command Level Interface. Set via clear_for_invoke()
+ 	bool cli() const { return cli_; }
+
+	/// Only valid after a call to sync()
+ 	/// in_sync() should be called after call to sync() Returns true if client defs is now in_sync with server
+ 	bool in_sync() const { return in_sync_;}
+ 	void set_sync(bool b) { in_sync_ = b;}
+
+ 	/// The SSyncCmd will set if we have a full sync(ie retrieved full node tree from server) or incremental sync
+ 	bool full_sync() const { return full_sync_; }
+ 	void set_full_sync(bool f) { full_sync_ =  f; }
+
+ 	/// Only valid after a call to news()
+ 	/// return true if the server has changed
+ 	News_t get_news() const { return news_; }
+	void set_news(News_t n) { news_ = n;}
+
+
+ 	/// Only valid when the client requested the defs node tree from the server
+	/// The defs *WILL* be retained until the next call to get the server defs
+	/// **Hence is NOT reset in clear_for_invoke()
+	defs_ptr client_defs() const { return client_defs_; }
+	void set_client_defs(defs_ptr d) { client_defs_ = d;}
+
+   /// Only valid when the client requested the node from the server
+   /// The node *WILL* be retained until the next call to get the node
+   /// **Hence is NOT reset in clear_for_invoke()
+   node_ptr client_node() const { return client_node_; }
+   void set_client_node(node_ptr d) { client_node_ = d;}
+
+	/// A client handle of value 0 is not valid. Created in the server
+	/// We should keep a reference to the client handle, for use with client handle commands
+	/// **Hence is NOT reset in clear_for_invoke()
+	void set_client_handle(int handle) { client_handle_ = handle;}
+	int client_handle() const { return client_handle_;}
+
+	// During incremental sync, record list of changed nodes, used by python api
+	std::vector<std::string>& changed_nodes() { return changed_nodes_; }
+
+private:
+	friend class SSyncCmd;
+	bool cli_;
+ 	bool in_sync_;                         // clear at the start of invoke
+ 	bool full_sync_;                       // clear at the start of invoke
+	News_t news_;                           // clear at the start of invoke
+	bool block_client_on_home_server_;     // clear at the start of invoke
+	bool block_client_server_halted_;      // clear at the start of invoke
+	bool block_client_zombie_detected_;    // clear at the start of invoke
+	std::string str_;                       // clear at the start of invoke
+	std::string error_msg_;                 // clear at the start of invoke
+   std::vector<Zombie> zombies_;           // clear at the start of invoke
+   std::vector<std::string> str_vec_;      // clear at the start of invoke
+   std::vector<std::string> changed_nodes_;// clear at the start of invoke
+   std::vector<std::pair<unsigned int, std::vector<std::string> > > client_handle_suites_; // clear at the start of invoke
+   Stats stats_;                        // Used for test only, ideally need to clear
+
+	int client_handle_;                  // set locally when suites are registered, and kept for reference
+   defs_ptr    client_defs_;            // server reply stored as the client side defs, kept locally
+   node_ptr    client_node_;            // server reply stored as the client side node, kept locally
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/ServerToClientResponse.cpp b/ecflow_4_0_7/Base/src/ServerToClientResponse.cpp
new file mode 100644
index 0000000..b530956
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ServerToClientResponse.cpp
@@ -0,0 +1,70 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <assert.h>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#include "ServerToClientResponse.hpp"
+#include "ClientToServerRequest.hpp" // for throw
+#include "AbstractServer.hpp"
+
+using namespace std;
+using namespace ecf;
+
+bool ServerToClientResponse::handle_server_response( ServerReply& r, Cmd_ptr cts_cmd, bool debug ) const
+{
+	/// Called in client context: see ClientInvoker
+	if (stc_cmd_.get()) {
+		return stc_cmd_->handle_server_response(r,cts_cmd,debug);
+ 	}
+
+    /// ClientToServerRequest::handleRequest returned a NULL pointer stc_cmd_.
+	std::stringstream ss;
+	ss << "ServerToClientResponse::handle_server_response: ";
+	if (cts_cmd.get()) {
+		ss << "Client request ";
+		cts_cmd->print(ss);
+		ss << " failed. ";
+	}
+	ss << "Server replied with a NULL message\n";
+ 	throw std::runtime_error(ss.str());
+}
+
+std::ostream& ServerToClientResponse::print( std::ostream& os ) const
+{
+	if (stc_cmd_.get()) {
+		return stc_cmd_->print(os);
+	}
+	return os << "NULL ServerToClientResponse";
+}
+
+bool ServerToClientResponse::operator==(const ServerToClientResponse& rhs) const
+{
+	if (!stc_cmd_.get() && !rhs.stc_cmd_.get()) {
+		return true;
+	}
+	if (stc_cmd_.get() && !rhs.stc_cmd_.get()) {
+		return false;
+	}
+	if (!stc_cmd_.get() && rhs.stc_cmd_.get()) {
+		return false;
+	}
+	return (stc_cmd_->equals(rhs.stc_cmd_.get()));
+}
+
+std::ostream& operator<<( std::ostream& os, const ServerToClientResponse& d ) {
+	return d.print( os );
+}
diff --git a/ecflow_4_0_7/Base/src/ServerToClientResponse.hpp b/ecflow_4_0_7/Base/src/ServerToClientResponse.hpp
new file mode 100644
index 0000000..2ed2e26
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ServerToClientResponse.hpp
@@ -0,0 +1,62 @@
+#ifndef SERVERTOCLIENTREQUEST_HPP_
+#define SERVERTOCLIENTREQUEST_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #30 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/tracking.hpp>
+#include "ServerToClientCmd.hpp"
+
+// Base class for server to client requesting. This class is used in the IPC messaging between
+// server and client
+class ServerToClientResponse : private boost::noncopyable {
+public:
+   ServerToClientResponse() {}
+   ServerToClientResponse(const STC_Cmd_ptr& cmd) : stc_cmd_(cmd) {}
+   ~ServerToClientResponse() {}
+
+   STC_Cmd_ptr get_cmd() const { return stc_cmd_; }
+   void set_cmd(const STC_Cmd_ptr& cmd) { stc_cmd_ = cmd;}
+
+   std::ostream& print(std::ostream& os) const;
+
+   /// Handle the response from the server. On the client side
+   /// return true IF and ONLY IF client response was ok, if further client action required return false
+   bool handle_server_response( ServerReply&, Cmd_ptr cts_cmd, bool debug ) const;
+
+   /// Used by boost test, to verify persistence
+   bool operator==(const ServerToClientResponse& rhs) const;
+
+private:
+   STC_Cmd_ptr stc_cmd_;
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/) {
+      ar & stc_cmd_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const ServerToClientResponse& d);
+
+// Do NOT use
+//    BOOST_CLASS_IMPLEMENTATION(ecf::ServerToClientResponse, boost::serialization::object_serializable)
+//    i.e eliminate serialisation overhead at the cost of never being able to increase the version.
+// Since we may need use version ing in the future
+
+// This should ONLY be added to objects that are *NOT* serialised through a pointer
+//   Eliminate object tracking (even if serialised through a pointer)
+//   at the risk of a programming error creating duplicate objects.
+BOOST_CLASS_TRACKING(ServerToClientResponse,boost::serialization::track_never);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/Stats.cpp b/ecflow_4_0_7/Base/src/Stats.cpp
new file mode 100644
index 0000000..b1ef076
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Stats.cpp
@@ -0,0 +1,333 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #35 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <iostream>
+#include <sstream>
+#include <iomanip>
+#include <string>
+#include "Stats.hpp"
+#include "SState.hpp"
+
+using namespace std;
+
+Stats::Stats() :
+
+	status_(0),
+	request_count_(0),
+	job_sub_interval_(0),
+   checkpt_interval_(0),
+   checkpt_save_time_alarm_(0),
+   checkpt_mode_(ecf::CheckPt::UNDEFINED),
+	no_of_suites_(0),
+
+	checkpt_(0),
+	restore_defs_from_checkpt_(0),
+
+   server_version_(0),
+   restart_server_(0),
+	shutdown_server_(0),
+	halt_server_(0),
+ 	reload_white_list_file_(0),
+   ping_(0),
+   debug_server_on_(0),
+   debug_server_off_(0),
+	get_defs_(0),
+	sync_(0),
+	news_(0),
+
+   node_job_gen_(0),
+   node_check_job_gen_only_(0),
+	node_delete_(0),
+	node_suspend_(0),
+	node_resume_(0),
+	node_kill_(0),
+	node_status_(0),
+	node_edit_history_(0),
+
+	log_cmd_(0),
+	log_msg_cmd_(0),
+	begin_cmd_(0),
+
+	task_init_(0),
+	task_complete_(0),
+	task_wait_(0),
+	task_abort_(0),
+	task_event_(0),
+	task_meter_(0),
+	task_label_(0),
+
+	zombie_fob_(0),
+	zombie_fail_(0),
+	zombie_adopt_(0),
+	zombie_remove_(0),
+	zombie_get_(0),
+   zombie_block_(0),
+   zombie_kill_(0),
+
+	requeue_node_(0),
+	order_node_(0),
+	run_node_(0),
+ 	load_defs_(0),
+	replace_(0),
+	force_(0),
+	free_dep_(0),
+	suites_(0),
+	edit_script_(0),
+
+   alter_cmd_(0),
+   ch_cmd_(0),
+	file_ecf_(0),
+	file_job_(0),
+   file_jobout_(0),
+   file_cmdout_(0),
+	file_manual_(0),
+
+	plug_(0),
+	move_(0),
+   group_cmd_(0),
+   server_load_cmd_(0),
+   stats_(0),
+   check_(0)
+{
+}
+
+void Stats::update_stats(int poll_interval)
+{
+   // Called at poll time, ie just before node tree traversal
+   request_vec_.push_back( std::make_pair(request_count_,poll_interval) );
+   request_count_ = 0;
+   request_stats_.clear();
+
+   // To stop excessive memory usage , we will only store, request per poll period, for 1 hour
+   if (request_vec_.size() > 60) {
+      request_vec_.pop_front();
+   }
+}
+
+void Stats::update_for_serialisation()
+{
+   /// This *ONLY* compute the data when this function is called
+   /// >>> Hence the server load is only valid for last hour <<<
+   no_of_suites_ = 0;
+   if (request_vec_.empty()) return;
+
+   std::stringstream ss;
+   int count = 0;
+   int request = 0;
+   int seconds = 0;
+   std::deque<std::pair<int,int> >::reverse_iterator rend = request_vec_.rend();
+   for(std::deque<std::pair<int,int> >::reverse_iterator i = request_vec_.rbegin(); i != rend; ++i) {
+      count++;
+      request += (*i).first;
+      seconds += (*i).second;
+      double request_per_second = (double)request/seconds;
+
+      if (count == 1) {
+         ss << setiosflags(ios::fixed) << setprecision(2) << request_per_second;
+      }
+      else if (count ==  5) {
+         ss << " " << request_per_second;
+      }
+      else if (count == 15) {
+         ss << " " << request_per_second;
+      }
+      else if (count == 30) {
+         ss << " " << request_per_second ;
+      }
+      else if (count == 60) {
+         ss << " " << request_per_second;
+      }
+   }
+   request_stats_ = ss.str();
+}
+
+void Stats::reset()
+{
+   checkpt_ = 0;
+   restore_defs_from_checkpt_ = 0;
+
+   server_version_ = 0;
+   restart_server_ = 0;
+   shutdown_server_ = 0;
+   halt_server_ = 0;
+   reload_white_list_file_ = 0;
+   ping_ = 0;
+   debug_server_on_ = 0;
+   debug_server_off_ = 0;
+   get_defs_ = 0;
+   sync_ = 0;
+   news_ = 0;
+
+   node_job_gen_ = 0;
+   node_check_job_gen_only_ = 0;
+   node_delete_ = 0;
+   node_suspend_ = 0;
+   node_resume_ = 0;
+   node_kill_ = 0;
+   node_status_ = 0;
+   node_edit_history_ = 0;
+
+   log_cmd_ = 0;
+   log_msg_cmd_ = 0;
+   begin_cmd_ = 0;
+
+   task_init_ = 0;
+   task_complete_ = 0;
+   task_wait_ = 0;
+   task_abort_ = 0;
+   task_event_ = 0;
+   task_meter_ = 0;
+   task_label_ = 0;
+
+   zombie_fob_ = 0;
+   zombie_fail_ = 0;
+   zombie_adopt_ = 0;
+   zombie_remove_ = 0;
+   zombie_get_ = 0;
+   zombie_block_ = 0;
+   zombie_kill_ = 0;
+
+   requeue_node_ = 0;
+   order_node_ = 0;
+   run_node_ = 0;
+   load_defs_ = 0;
+   replace_ = 0;
+   force_ = 0;
+   free_dep_ = 0;
+   suites_ = 0;
+   edit_script_ = 0;
+
+   alter_cmd_ = 0;
+   ch_cmd_ = 0;
+   file_ecf_ = 0;
+   file_job_ = 0;
+   file_jobout_ = 0;
+   file_cmdout_ = 0;
+   file_manual_ = 0;
+
+   plug_ = 0;
+   move_ = 0;
+   group_cmd_ = 0;
+   server_load_cmd_ = 0;
+   stats_ = 0;
+   check_ = 0;
+}
+
+static string show_checkpt_mode(ecf::CheckPt::Mode m){
+   switch (m) {
+      case ecf::CheckPt::NEVER: return "CHECK_NEVER"; break;
+      case ecf::CheckPt::ON_TIME: return "CHECK_ON_TIME"; break;
+      case ecf::CheckPt::ALWAYS: return "CHECK_ON_ALWAYS"; break;
+      case ecf::CheckPt::UNDEFINED: return "UNDEFINED"; break;
+   }
+   return std::string();
+}
+
+void Stats::show(std::ostream& os) const
+{
+   int width = 35;
+   os << "Server statistics\n";
+   os << left << setw(width) << "   Version " << version_ << "\n";
+   os << left << setw(width) << "   Status " << SState::to_string(status_) << "\n";
+   os << left << setw(width) << "   Host " << host_ << "\n";
+   os << left << setw(width) << "   Port " << port_ << "\n";
+   os << left << setw(width) << "   Up since " << up_since_ << "\n";
+   os << left << setw(width) << "   Job sub' interval " << job_sub_interval_ << "s\n";
+   os << left << setw(width) << "   ECF_HOME " <<   ECF_HOME_ << "\n";
+   os << left << setw(width) << "   ECF_LOG " <<   ECF_LOG_ << "\n";
+   os << left << setw(width) << "   ECF_CHECK " <<   ECF_CHECK_ << "\n";
+   os << left << setw(width) << "   Check pt interval " << checkpt_interval_ << "s\n";
+   os << left << setw(width) << "   Check pt mode " << show_checkpt_mode(checkpt_mode_) << "\n";
+   os << left << setw(width) << "   Check pt save time alarm " << checkpt_save_time_alarm_ << "s\n";
+   os << left << setw(width) << "   Number of Suites " << no_of_suites_ << "\n";
+   os << left << setw(width) << "   Request's per 1,5,15,30,60 min " <<  request_stats_ << "\n";
+
+   if (checkpt_ || restore_defs_from_checkpt_ || server_version_ || restart_server_ || shutdown_server_ || halt_server_ || 
+       ping_ || debug_server_on_ || debug_server_off_ || get_defs_ || sync_ || news_)  os << "\n";
+   if (!locked_by_user_.empty()) os << left << setw(width) << "   Locked by user " << locked_by_user_ << "\n";
+   if (checkpt_ != 0)                   os << left << setw(width) << "   Check points " << checkpt_ << "\n";
+   if (restore_defs_from_checkpt_ != 0) os << left << setw(width) << "   Restore from Check point " << restore_defs_from_checkpt_ << "\n";
+   if (restart_server_ != 0)   os << left << setw(width) << "   Restart server " << restart_server_ << "\n";
+   if (shutdown_server_ != 0)  os << left << setw(width) << "   Shutdown server " << shutdown_server_ << "\n";
+   if (halt_server_ != 0)      os << left << setw(width) << "   Halt server " << halt_server_ << "\n";
+   if (ping_ != 0)             os << left << setw(width) << "   Ping " << ping_ << "\n";
+   if (debug_server_on_ != 0)  os << left << setw(width) << "   debug server on " << debug_server_on_ << "\n";
+   if (debug_server_off_ != 0) os << left << setw(width) << "   debug server off " << debug_server_off_ << "\n";
+   if (get_defs_ != 0)         os << left << setw(width) << "   Get full definition " << get_defs_ << "\n";
+   if (server_version_ != 0)   os << left << setw(width) << "   Server version " << server_version_ << "\n";
+   if (sync_ != 0)             os << left << setw(width) << "   Sync " << sync_ << "\n";
+   if (news_ != 0)             os << left << setw(width) << "   News " << news_ << "\n";
+   
+   if (task_init_ || task_complete_ || task_wait_ || task_abort_ || task_event_ || task_meter_ || task_label_)  os << "\n";
+   if (task_init_ != 0)     os << left << setw(width) << "   Task init " << task_init_ << "\n";
+   if (task_complete_ != 0) os << left << setw(width) << "   Task complete " << task_complete_ << "\n";
+   if (task_wait_ != 0)     os << left << setw(width) << "   Task wait " << task_wait_ << "\n";
+   if (task_abort_ != 0)    os << left << setw(width) << "   Task abort " << task_abort_ << "\n";
+   if (task_event_ != 0)    os << left << setw(width) << "   Task event " << task_event_ << "\n";
+   if (task_meter_ != 0)    os << left << setw(width) << "   Task meter " << task_meter_ << "\n";
+   if (task_label_ != 0)    os << left << setw(width) << "   Task label " << task_label_ << "\n";
+   
+   if (zombie_fob_ || zombie_fail_ || zombie_adopt_ || zombie_remove_ || zombie_get_ || zombie_block_ || zombie_kill_)  os << "\n";
+   if (zombie_fob_ != 0)     os << left << setw(width) << "   Zombie fob " << zombie_fob_ << "\n";
+   if (zombie_fail_ != 0)    os << left << setw(width) << "   Zombie fail " << zombie_fail_ << "\n";
+   if (zombie_adopt_ != 0)   os << left << setw(width) << "   Zombie adopt " << zombie_adopt_ << "\n";
+   if (zombie_remove_ != 0)  os << left << setw(width) << "   Zombie remove " << zombie_remove_ << "\n";
+   if (zombie_get_ != 0)     os << left << setw(width) << "   Zombie get " << zombie_get_ << "\n";
+   if (zombie_block_ != 0)   os << left << setw(width) << "   Zombie block " << zombie_block_ << "\n";
+   if (zombie_kill_ != 0)    os << left << setw(width) << "   Zombie kill " << zombie_kill_ << "\n";
+   
+   if (load_defs_ || begin_cmd_ || requeue_node_ || node_job_gen_ || node_check_job_gen_only_ || node_delete_ || node_suspend_ ||
+       node_resume_ || node_kill_ || node_status_ || node_edit_history_ || log_cmd_ || log_msg_cmd_ || order_node_ || run_node_ || replace_ ||
+       force_ || free_dep_ || suites_ || edit_script_ || alter_cmd_ || ch_cmd_ || plug_ || move_ || group_cmd_ ||
+       reload_white_list_file_ || server_load_cmd_ ||  stats_ || check_
+       )  os << "\n";
+   if (load_defs_ != 0)         os << left << setw(width) << "   Load definition " << load_defs_ << "\n";
+   if (begin_cmd_ != 0)         os << left << setw(width) << "   Begin " << begin_cmd_ << "\n";
+   if (requeue_node_ != 0)      os << left << setw(width) << "   Requeue " << requeue_node_ << "\n";
+   if (node_job_gen_ != 0)      os << left << setw(width) << "   Job generation " << node_job_gen_ << "\n";
+   if (node_check_job_gen_only_ != 0) os << left << setw(width) << "   Check Job generation " << node_check_job_gen_only_ << "\n";
+   if (node_delete_ != 0)       os << left << setw(width) << "   Node delete " << node_delete_ << "\n";
+   if (node_suspend_ != 0)      os << left << setw(width) << "   Node suspend " << node_suspend_ << "\n";
+   if (node_resume_ != 0)       os << left << setw(width) << "   Node resume " << node_resume_ << "\n";
+   if (node_kill_ != 0)         os << left << setw(width) << "   Node kill " << node_kill_ << "\n";
+   if (node_status_ != 0)       os << left << setw(width) << "   Node status " << node_status_ << "\n";
+   if (node_edit_history_ != 0) os << left << setw(width) << "   Node edit history " << node_edit_history_ << "\n";
+   if (log_cmd_ != 0)           os << left << setw(width) << "   Log cmd " << log_cmd_ << "\n";
+   if (log_msg_cmd_ != 0)       os << left << setw(width) << "   Log message " << log_msg_cmd_ << "\n";
+   if (order_node_ != 0)        os << left << setw(width) << "   Order " << order_node_ << "\n";
+   if (run_node_ != 0)          os << left << setw(width) << "   Run " << run_node_ << "\n";
+   if (replace_ != 0)           os << left << setw(width) << "   Replace " << replace_ << "\n";
+   if (force_ != 0)             os << left << setw(width) << "   Force  " << force_ << "\n";
+   if (free_dep_ != 0)          os << left << setw(width) << "   Free dependencies " << free_dep_ << "\n";
+   if (suites_ != 0)            os << left << setw(width) << "   Suites " << suites_ << "\n";
+   if (edit_script_ != 0)       os << left << setw(width) << "   Edit script " << edit_script_ << "\n";
+   if (alter_cmd_ != 0)         os << left << setw(width) << "   Alter " << alter_cmd_ << "\n";
+   if (ch_cmd_ != 0)            os << left << setw(width) << "   Client handle " << ch_cmd_ << "\n";
+   if (plug_ != 0)              os << left << setw(width) << "   Plug " << plug_ << "\n";
+   if (move_ != 0)              os << left << setw(width) << "   Move " << move_ << "\n";
+   if (group_cmd_ != 0)         os << left << setw(width) << "   Group " << group_cmd_ << "\n";
+   if (server_load_cmd_ != 0)   os << left << setw(width) << "   Server load cmd " << server_load_cmd_ << "\n";
+   if (stats_ != 0)             os << left << setw(width) << "   stats cmd " << stats_ << "\n";
+   if (check_ != 0)             os << left << setw(width) << "   checks " << check_ << "\n";
+   if (reload_white_list_file_ != 0) os << left << setw(width) << "   Reload white list file " << reload_white_list_file_ << "\n";
+   
+   if (file_ecf_ || file_job_ || file_jobout_ || file_manual_ || file_cmdout_)  os << "\n";
+   if (file_ecf_ != 0)    os << left << setw(width) << "   File ECF " << file_ecf_ << "\n";
+   if (file_job_ != 0) os << left << setw(width) << "   File job " << file_job_ << "\n";
+   if (file_jobout_ != 0) os << left << setw(width) << "   File Job out " << file_jobout_ << "\n";
+   if (file_cmdout_ != 0) os << left << setw(width) << "   File Cmd out " << file_cmdout_ << "\n";
+   if (file_manual_ != 0) os << left << setw(width) << "   File manual " << file_manual_ << "\n";
+   os << flush;
+}
diff --git a/ecflow_4_0_7/Base/src/Stats.hpp b/ecflow_4_0_7/Base/src/Stats.hpp
new file mode 100644
index 0000000..6e3b4d0
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/Stats.hpp
@@ -0,0 +1,216 @@
+#ifndef STATS_HPP_
+#define STATS_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #31 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/serialization/serialization.hpp>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include "CheckPt.hpp"
+
+/// This class is used to store all statistical data about all the
+/// commands processed by the server. Uses default copy constructor
+struct Stats {
+
+	Stats();
+  void show(std::ostream& os = std::cout) const;
+
+   void update() { request_count_++; }
+   void update_stats(int poll_interval);
+   void update_for_serialisation();
+   void reset();
+
+	int status_;    // 0 HALTED, 1 SHUTDOWN, 2 RUNNING
+	std::string locked_by_user_;
+	std::string host_;
+	std::string port_;
+	std::string up_since_;
+	std::string version_;
+	std::string request_stats_;
+   std::string ECF_HOME_;
+   std::string ECF_CHECK_;
+   std::string ECF_LOG_;
+
+	int request_count_;
+	int job_sub_interval_;
+   int checkpt_interval_;
+   int checkpt_save_time_alarm_;
+   ecf::CheckPt::Mode checkpt_mode_;
+	int no_of_suites_;
+
+	unsigned int checkpt_;
+	unsigned int restore_defs_from_checkpt_;
+
+   unsigned int server_version_;
+   unsigned int restart_server_;
+	unsigned int shutdown_server_;
+	unsigned int halt_server_;
+ 	unsigned int reload_white_list_file_;
+   unsigned int ping_;
+   unsigned int debug_server_on_;
+   unsigned int debug_server_off_;
+	unsigned int get_defs_;
+	unsigned int sync_;
+	unsigned int news_;
+
+   unsigned int node_job_gen_;
+   unsigned int node_check_job_gen_only_;
+	unsigned int node_delete_;
+	unsigned int node_suspend_;
+	unsigned int node_resume_;
+	unsigned int node_kill_;
+   unsigned int node_status_;
+   unsigned int node_edit_history_;
+
+	unsigned int log_cmd_;
+	unsigned int log_msg_cmd_;
+	unsigned int begin_cmd_;
+
+	unsigned int task_init_;
+	unsigned int task_complete_;
+	unsigned int task_wait_;
+	unsigned int task_abort_;
+	unsigned int task_event_;
+	unsigned int task_meter_;
+	unsigned int task_label_;
+
+	unsigned int zombie_fob_;
+	unsigned int zombie_fail_;
+	unsigned int zombie_adopt_;
+	unsigned int zombie_remove_;
+	unsigned int zombie_get_;
+   unsigned int zombie_block_;
+   unsigned int zombie_kill_;
+
+	unsigned int requeue_node_;
+	unsigned int order_node_;
+	unsigned int run_node_;
+ 	unsigned int load_defs_;
+	unsigned int replace_;
+	unsigned int force_;
+	unsigned int free_dep_;
+	unsigned int suites_;
+	unsigned int edit_script_;
+
+	unsigned int alter_cmd_;
+   unsigned int ch_cmd_;
+	unsigned int file_ecf_;
+	unsigned int file_job_;
+   unsigned int file_jobout_;
+   unsigned int file_cmdout_;
+	unsigned int file_manual_;
+
+	unsigned int plug_;
+	unsigned int move_;
+   unsigned int group_cmd_;
+   unsigned int server_load_cmd_;
+   unsigned int stats_;
+   unsigned int check_;
+
+private:
+
+	std::deque< std::pair<int,int> > request_vec_; // pair.first =  number of requests, pair.second = poll interval
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+
+		ar & status_;
+		ar & locked_by_user_;
+		ar & host_;
+		ar & port_;
+		ar & up_since_;
+		ar & version_;
+		ar & job_sub_interval_;
+      ar & checkpt_interval_;
+      ar & checkpt_save_time_alarm_;
+      ar & checkpt_mode_;
+		ar & no_of_suites_;
+		ar & request_stats_;
+		ar & ECF_HOME_;
+		ar & ECF_CHECK_;
+		ar & ECF_LOG_;
+
+		ar & checkpt_;
+
+      ar & server_version_;
+      ar & restart_server_;
+		ar & shutdown_server_;
+		ar & halt_server_;
+ 		ar & reload_white_list_file_;
+ 		ar & ping_;
+ 	   ar & debug_server_on_;
+ 	   ar & debug_server_off_;
+
+		ar & get_defs_;
+		ar & sync_;
+		ar & news_;
+
+      ar & node_job_gen_;
+      ar & node_check_job_gen_only_;
+		ar & node_delete_;
+		ar & node_suspend_;
+		ar & node_resume_;
+		ar & node_kill_;
+		ar & node_status_;
+		ar & node_edit_history_;
+
+		ar & log_cmd_;
+		ar & log_msg_cmd_;
+		ar & begin_cmd_;
+
+		ar & task_init_;
+		ar & task_complete_;
+		ar & task_wait_;
+		ar & task_abort_;
+		ar & task_event_;
+		ar & task_meter_;
+		ar & task_label_;
+
+		ar & zombie_fob_;
+		ar & zombie_fail_;
+		ar & zombie_adopt_;
+		ar & zombie_remove_;
+		ar & zombie_get_;
+      ar & zombie_block_;
+      ar & zombie_kill_;
+
+		ar & requeue_node_;
+		ar & order_node_;
+		ar & run_node_;
+ 		ar & load_defs_;
+		ar & replace_;
+		ar & force_;
+		ar & free_dep_;
+		ar & suites_;
+		ar & edit_script_;
+
+      ar & alter_cmd_;
+      ar & ch_cmd_;
+		ar & file_ecf_;
+		ar & file_job_;
+      ar & file_jobout_;
+      ar & file_cmdout_;
+		ar & file_manual_;
+
+		ar & plug_;
+		ar & move_;
+		ar & group_cmd_;
+      ar & server_load_cmd_;
+      ar & stats_;
+      ar & check_;
+   }
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/WhyCmd.cpp b/ecflow_4_0_7/Base/src/WhyCmd.cpp
new file mode 100644
index 0000000..c06602d
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/WhyCmd.cpp
@@ -0,0 +1,58 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Client side command only.
+//               Placed in this category, since the server does not need to link
+//               with it.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/foreach.hpp>
+#include "WhyCmd.hpp"
+#include "Defs.hpp"
+#include "Node.hpp"
+
+WhyCmd::WhyCmd(defs_ptr defs, const std::string& absNodePath)
+: defs_(defs)
+{
+	if (!defs_.get()) {
+		throw std::runtime_error("WhyCmd: The definition parameter is empty");
+	}
+
+	if (! absNodePath.empty() ) {
+		node_ = defs_->findAbsNode(absNodePath);
+		if ( ! node_.get() ) {
+			std::string errorMsg = "WhyCmd: The node path parameter '";
+			errorMsg += absNodePath;
+			errorMsg += "' can not be found.";
+			throw std::runtime_error(errorMsg);
+		}
+	}
+}
+
+std::string WhyCmd::why() const
+{
+	std::vector<std::string> theReasonWhy;
+	if (node_.get()) {
+		node_->bottom_up_why(theReasonWhy);
+	}
+	else {
+		defs_->top_down_why(theReasonWhy);
+	}
+
+	// Don't add /n on very last item
+	std::string reason;
+	for(size_t i = 0; i < theReasonWhy.size(); ++i) {
+ 		reason += theReasonWhy[i];
+		if (i != theReasonWhy.size()-1)  reason += "\n";
+	}
+	return reason;
+}
+
diff --git a/ecflow_4_0_7/Base/src/WhyCmd.hpp b/ecflow_4_0_7/Base/src/WhyCmd.hpp
new file mode 100644
index 0000000..69ab13d
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/WhyCmd.hpp
@@ -0,0 +1,37 @@
+#ifndef WHY_CMD_HPP_
+#define WHY_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Client side command only.
+//               Placed in this category, since the server does not need to link
+//               with it.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <boost/noncopyable.hpp>
+#include "NodeFwd.hpp"
+
+class WhyCmd : private boost::noncopyable {
+public:
+	WhyCmd(defs_ptr defs, const std::string& absNodePath);
+
+	/// Why the node is not running
+	/// Return a '/n' separated string which lists the reasons why
+	/// the provided node is not active.
+	std::string why() const;
+
+private:
+	defs_ptr defs_;
+	node_ptr node_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/ZombieCtrl.cpp b/ecflow_4_0_7/Base/src/ZombieCtrl.cpp
new file mode 100644
index 0000000..0e43bfd
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ZombieCtrl.cpp
@@ -0,0 +1,772 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #41 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : manages the zombies
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ZombieCtrl.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Submittable.hpp"
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost::posix_time;
+
+//#define DEBUG_ZOMBIE  1
+
+/// Zombie creation:
+/// *** ECF  *** Zombies is created with: process(node path, password, pid/rid , try_no) ***
+/// *** PATH *** Zombies is created with: process(node path, password, pid/rid , try_no) ***
+/// *** USER *** Zombies is created with:    TASK(node path, password, pid/rid , try_no) ***
+///
+/// There are several places where we hold path,password,pid/rid,etc
+///                        Task Cmd/
+///            Node Tree   Process(n)   USER Zombie         PATH/ECF Zombie
+///  Path                               same as node tree   same as process
+///  password                           same as node tree   same as process
+///  pid/rid                            same as node tree   same as process
+///  try no                             same as node tree   same as process
+///    ^                    |
+///    | ----adopt-----------
+///
+/// Zombie Finding:
+/// For a given Task, we could have multiple zombie process, i.e. with different password/process id
+/// We can't assume that there is only one zombie process. Hence search/zombie matching
+/// should involve matching with password/process id first and then resort to path matching
+///
+/// Note: Only the init child command is required pass the process id. The other child command may
+//        or may *not* provide this. In the test scenario we do.
+static bool match(const Zombie& z, const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+
+
+bool ZombieCtrl::handle_path_zombie(
+         AbstractServer* as,
+         const TaskCmd* task_cmd,  // The child command
+         std::string& action_taken,
+         STC_Cmd_ptr& theReply     // Reply varies according to User Action
+)
+{
+#ifdef DEBUG_ZOMBIE
+	std::cout << "   ZombieCtrl::handle_path_zombie:";
+#endif
+	const std::string& path_to_task = task_cmd->path_to_node();
+	const std::string& jobs_password = task_cmd->jobs_password();
+	const std::string& process_or_remote_id = task_cmd->process_or_remote_id();
+
+
+	/// *** The ZombieAttr may have added/ deleted via AlterCmd. This allows for dynamic changes
+	/// *no* task, find the closest Zombie attribute up the Node tree, ie attribute could be on family/suite even though task has been deleted
+	/// If none found we resort to default behaviour
+	node_ptr closest_matching_node = as->defs()->find_closest_matching_node(path_to_task);
+#ifdef DEBUG_ZOMBIE
+	if (closest_matching_node.get()) std::cout << " closest node found: ";
+#endif
+
+
+#ifdef DEBUG_ZOMBIE
+   std::cout << " Searching for match over " << zombies_.size() << " zombies :";
+#endif
+	Zombie& theExistingZombie = find_zombie(path_to_task, process_or_remote_id, jobs_password );
+ 	if(!theExistingZombie.empty() ) {
+ 	   // When NULL is passed for task, we change existing zombie to be of type PATH
+ 		return handle_existing_zombie(theExistingZombie,NULL/*task*/,closest_matching_node,task_cmd,action_taken,theReply);
+ 	}
+
+	/// Create a zombie,
+   /// *** PATH *** Zombies is created with: process path, process password, and process id/rid , process try_no ***
+#ifdef DEBUG_ZOMBIE
+	std::cout << " No matching zombie fnd: Creating Path Zombie: ";
+#endif
+
+	ZombieAttr attr = ZombieAttr::get_default_attr(Child::PATH);
+	if (closest_matching_node.get()) {
+		closest_matching_node->findParentZombie(Child::PATH, attr ); // Override default from node tree
+	}
+
+	Zombie new_zombie(Child::PATH,task_cmd->child_type(),attr,path_to_task,jobs_password,process_or_remote_id,task_cmd->try_no());
+ 	zombies_.push_back( new_zombie );
+
+ 	/// The user action may end deleting the zombie just added. Depends on ZombieAttribute settings
+	return handle_user_actions(new_zombie,NULL /*task*/,task_cmd,action_taken,theReply);
+}
+
+
+bool ZombieCtrl::handle_zombie(
+                               Submittable* task,              // This NULL for path zombies
+                               const TaskCmd* task_cmd, // The child command
+                               std::string& action_taken,
+                               STC_Cmd_ptr& theReply    // Reply varies according to User Action
+)
+{
+#ifdef DEBUG_ZOMBIE
+	std::cout << "   ZombieCtrl::handle_zombie:";
+#endif
+	const std::string& path_to_task = task_cmd->path_to_node();
+	const std::string& jobs_password = task_cmd->jobs_password();
+	const std::string& process_or_remote_id = task_cmd->process_or_remote_id();
+
+	Zombie& theExistingZombie = find_zombie(path_to_task, process_or_remote_id, jobs_password );
+ 	if(!theExistingZombie.empty() ) {
+ 		return handle_existing_zombie(theExistingZombie,task,node_ptr(),task_cmd,action_taken,theReply);
+ 	}
+
+ 	/// Create Zombie:
+ 	/// *** ECF *** Zombies is created with: process path, process password, and process id/rid , process try_no ***
+	Child::ZombieType zombie_type = Child::ECF;
+	ZombieAttr attr = ZombieAttr::get_default_attr( zombie_type );
+
+	/// Look for any Zombie attribute up node tree, use this to construct & configure zombie
+	task->findParentZombie(zombie_type, attr );
+
+	/// Handle corner case ,where we have two jobs with different process id, but same password
+	/// Can happen if jobs is started externally, or via test, occasionally
+ 	ecf::Child::CmdType child_type = task_cmd->child_type();
+	if (child_type == Child::INIT && task->state() == NState::ACTIVE) {
+
+		/// Find zombie by path only, and remove it. Re-added again below. With updated, data<<<<
+#ifdef DEBUG_ZOMBIE
+		cout << " >TASK already active:< ";
+#endif
+		size_t zombieVecSize = zombies_.size();
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if (zombies_[i].path_to_task() == path_to_task) {
+				zombie_type = zombies_[i].type();     // recover the original zombie type
+				zombies_.erase( zombies_.begin() + i);
+#ifdef DEBUG_ZOMBIE
+				cout << " Removing: ";
+#endif
+				break;
+			}
+		}
+	}
+
+
+#ifdef DEBUG_ZOMBIE
+	std::cout << " Creating ECF Zombie:";
+#endif
+	Zombie new_zombie(zombie_type,child_type,attr,path_to_task,jobs_password,process_or_remote_id,task_cmd->try_no());
+	zombies_.push_back( new_zombie );
+
+	/// Mark task as zombie for xcdp
+	task->flag().set(ecf::Flag::ZOMBIE);
+
+	return handle_user_actions(new_zombie,task,task_cmd,action_taken,theReply);
+}
+
+bool ZombieCtrl::handle_existing_zombie(
+                   Zombie& theExistingZombie,      // The server already knows about the zombie
+                   Submittable* task,              // This NULL for path zombies
+                   node_ptr closest_matching_node, // only defined for path zombies
+                   const TaskCmd* task_cmd,        // The child command
+                   std::string& action_taken,      // User action taken
+                   STC_Cmd_ptr& theReply           // Reply varies according to User Action
+)
+{
+#ifdef DEBUG_ZOMBIE
+	std::cout << " handle_existing_zombie: Updating child_type: ";
+#endif
+	// If we have no task, then change the zombie type to PATH
+	if (!task) {
+#ifdef DEBUG_ZOMBIE
+	   std::cout << " : updating zombie type to PATH: ";
+#endif
+	   theExistingZombie.set_type( ecf::Child::PATH );
+	}
+
+	/// *** The ZombieAttr may have added/ deleted via AlterCmd. This allows for dynamic changes
+	ZombieAttr attr = ZombieAttr::get_default_attr(theExistingZombie.type());
+	if (closest_matching_node.get()) {
+#ifdef DEBUG_ZOMBIE
+	   cout << " Attr found for path zombie(" << attr.toString() << "): ";
+#endif
+		closest_matching_node->findParentZombie(theExistingZombie.type(), attr ); // Override default from node tree
+	}
+
+	if (task && task->findParentZombie(theExistingZombie.type(), attr )) {        // Override default from node tree
+#ifdef DEBUG_ZOMBIE
+		cout << " Attr found(" << attr.toString() << "): ";
+#endif
+	}
+	theExistingZombie.set_attr( attr );                            // Update attribute stored on the zombie
+	theExistingZombie.set_last_child_cmd( task_cmd->child_type() );// The zombie stores the last child command.
+	theExistingZombie.increment_calls();                           // record how times server handled with zombie
+
+
+	/// Update the process id, if it is empty on the existing zombie
+	/// *** NOTE**** can not update process id from task, as that could be an ID from a different JOB,
+	/// ************ Hence zombie matching resorts to path and password matching
+	const std::string& process_or_remote_id = task_cmd->process_or_remote_id();
+	if (theExistingZombie.process_or_remote_id().empty() && !process_or_remote_id.empty()) {
+#ifdef DEBUG_ZOMBIE
+		std::cout << "Updating process id(" << process_or_remote_id << "): ";
+#endif
+		theExistingZombie.set_process_or_remote_id( process_or_remote_id );
+	}
+
+	return handle_user_actions(theExistingZombie,task,task_cmd,action_taken,theReply);
+}
+
+bool ZombieCtrl::handle_user_actions(
+                   Zombie& theZombie,        // Existing or one we just created
+                   Submittable* task,        // This is NULL for path zombies
+                   const TaskCmd* task_cmd,  // The child command
+                   std::string& action_taken,// User action taken
+                   STC_Cmd_ptr& theReply     // Reply varies according to User Action
+)
+{
+	const std::string& path_to_task = task_cmd->path_to_node();
+	const std::string& process_password = task_cmd->jobs_password();
+	const std::string& process_or_remote_id = task_cmd->process_or_remote_id();
+
+	if (theZombie.manual_user_action()) action_taken = "manual-";
+	else action_taken = "automatic-";
+
+	// *ADOPT* If zombie is set to adopt, copy over password and carry on as >NORMAL< , i.e. we return true
+	if ( task && theZombie.adopt()) {
+
+	   action_taken += "adopt";
+		/// Zombie was marked to adopt. password copied over, and zombie removed
+		/// *MUST* use the password of the process, and *NOT* the zombie
+		/// Since next time process communicates, it will be *WITH* the process password
+		task->set_jobs_password( process_password );
+		task->set_process_or_remote_id( process_or_remote_id );
+
+		/// Remove the zombie, as its been adopted
+		/// matching by password/process id may fail, hence remove by path
+		bool remove_ok = remove(path_to_task, process_or_remote_id, process_password );
+		if (!remove_ok) {
+		   (void) remove_by_path(path_to_task);
+		}
+
+		/// Clear the zombie flag
+		task->flag().clear(ecf::Flag::ZOMBIE);
+
+#ifdef DEBUG_ZOMBIE
+		std::cout << " >>>ADOPT<<< then remove(" << remove_ok <<") ";
+		if (!remove_ok)  std::cout << " >>>ERROR<<<< Remove failed ";
+		std::cout << " zombies_.size(" << zombies_.size() << ")\n";
+#endif
+		return true;
+	}
+
+	// *FOB*
+	if (theZombie.fob()) {
+		/// Means return as if everything is OK. hence ClientInvoker will *NOT* block, and job can continue.
+      action_taken += "fob";
+
+		/// On the child COMPLETE/ABORT cmd, remove the zombie:
+      /// *****************************************************************************************
+	   /// Since we are returning false, The Task Cmd complete/abort **wont** be able to remove the zombie
+	   /// i.e since we want job to continue, *WITHOUT* invoking the dohandeRequest
+      /// *****************************************************************************************
+		if (task_cmd->child_type() == Child::COMPLETE || task_cmd->child_type() == Child::ABORT ) {
+
+			bool remove_ok = remove(path_to_task, process_or_remote_id, process_password );
+	      if (!remove_ok) {
+	         (void)remove_by_path(path_to_task);
+	      }
+
+			/// Clear the zombie flag
+			if (task) task->flag().clear(ecf::Flag::ZOMBIE);
+
+#ifdef DEBUG_ZOMBIE
+			std::cout << " child == COMPLETE remove zombie ";
+			if (!remove_ok)  std::cout << " >>>ERROR<<<< Remove failed ";
+#endif
+		}
+
+#ifdef DEBUG_ZOMBIE
+		std::cout << " >>>FOB<<< zombies_.size(" << zombies_.size() << ")\n";
+#endif
+		theReply = PreAllocatedReply::ok_cmd();
+		return false;
+	}
+
+	// *FAIL* Ask ClientInvoker *NOT* to block,  *fail* with an error.
+	if (theZombie.fail()) {
+#ifdef DEBUG_ZOMBIE
+		std::cout << " >>>FAIL<<< zombies_.size(" << zombies_.size() << ")\n";
+#endif
+      action_taken += "fail";
+		theReply = PreAllocatedReply::error_cmd("[ authentication failed ] Request set to FAIL via zombie setting");
+		return false;
+	}
+
+   // *KILL* Typically kill is immediate(i.e. via ZombieCmd), However this could have been set via ZombieAttribute
+   if (theZombie.kill()) {
+      // when a task a script is killed(i,e with kill -15), it will typically be trapped
+      // This will then typically call abort. We have a choice:
+      //    a/ If we remove the zombie, the action taken will be lost, when the abort arises, hence default action is block
+      //    b/ Change the action type to be fob, so that the abort does not block
+      //    c/ Continue killing until process terminate. Up to use to remove zombies
+      // Opted for option b/ however we do *NOT* change action type, we just fob
+      if (task) {
+         if (!task->flag().is_set(ecf::Flag::KILLED)) {
+
+            action_taken += "kill & fob";
+
+            // Kill the task, separate process, will typically send kill -15 to script.
+            task->kill(theZombie.process_or_remote_id());
+         }
+         else {
+            action_taken += "kill(already killed, fobing instead)";
+         }
+      }
+      else  {
+         action_taken += "kill(no task, fobing instead)";
+      }
+#ifdef DEBUG_ZOMBIE
+      std::cout << " >>>KILL<<< zombies_.size(" << zombies_.size() << ")\n";
+#endif
+      theReply = PreAllocatedReply::ok_cmd(); // do not block the script, fob
+      return false;
+   }
+
+	// *REMOVE* Typically Removal is immediate(i.e. via ZombieCmd), However this could have been set via ZombieAttribute
+	if (theZombie.remove()) {
+		/// Ask ClientInvoker to continue blocking, Zombie may re-appear
+      action_taken += "remove";
+		bool remove_ok = remove(path_to_task, process_or_remote_id, process_password);
+      if (!remove_ok)  (void)remove_by_path(path_to_task);
+
+#ifdef DEBUG_ZOMBIE
+		std::cout << " >>>REMOVE<<< zombies_.size(" << zombies_.size() << ") : BLOCKING ";
+		if (!remove_ok)  std::cout << " >>>ERROR<<<< Remove failed ";
+#endif
+	   theReply = PreAllocatedReply::block_client_zombie_cmd();
+	   return false;
+	}
+
+	// *DEFAULT*:
+	//       Label,event,meter       : fob
+	//       init,complete,abort,wait: block
+	if (task_cmd->child_type() == Child::LABEL ||
+	    task_cmd->child_type() == Child::EVENT ||
+	    task_cmd->child_type() == Child::METER) {
+
+      /// Means return as if everything is OK. hence ClientInvoker will *NOT* block, and job can continue.
+#ifdef DEBUG_ZOMBIE
+   std::cout << ": FOB\n";
+#endif
+	   action_taken += "fob";
+      theReply = PreAllocatedReply::ok_cmd();
+      return false;
+	}
+
+#ifdef DEBUG_ZOMBIE
+	std::cout << ": BLOCKING\n";
+#endif
+	// i.e it will make several attempts , and then start contacting servers in the hosts file.
+   action_taken += "block";
+	theReply = PreAllocatedReply::block_client_zombie_cmd();
+	return false;
+}
+
+
+void ZombieCtrl::do_add_user_zombies(const std::vector<Submittable*>& tasks)
+{
+ 	size_t taskVecSize = tasks.size();
+	for(size_t i = 0; i < taskVecSize; i++) {
+		Submittable* t = tasks[i];
+ 		if (t->state() == NState::ACTIVE || t->state() == NState::SUBMITTED) {
+
+ 			Zombie& theExistingZombie = find( t );
+  			if (theExistingZombie.empty() ) {
+
+#ifdef DEBUG_ZOMBIE
+  				std::cout << "   ZombieCtrl::do_add_user_zombies " << t->absNodePath() << " " << t->process_or_remote_id() << " " << t->jobsPassword() << "\n";
+#endif
+
+  				ZombieAttr attr = ZombieAttr::get_default_attr(Child::USER); // get the default USER zombie attribute
+  				t->findParentZombie(Child::USER, attr );                     // Override default from the node tree
+
+ 				zombies_.push_back(Zombie(Child::USER,Child::INIT,attr,t->absNodePath(),t->jobsPassword(),t->process_or_remote_id(),t->try_no()));
+
+ 		 	  	/// Mark task as zombie for xcdp
+ 		 	  	t->flag().set(ecf::Flag::ZOMBIE);
+ 			}
+		}
+	}
+}
+
+void ZombieCtrl::add_user_zombies( node_ptr node)
+{
+	if (!node.get()) return;
+	std::vector<Submittable*> tasks;
+	node->get_all_active_submittables(tasks);
+	do_add_user_zombies(tasks);
+}
+
+void ZombieCtrl::add_user_zombies( suite_ptr suite)
+{
+	if (!suite.get()) return;
+	std::vector<Submittable*> tasks;
+	suite->get_all_active_submittables(tasks);
+	do_add_user_zombies(tasks);
+}
+
+void ZombieCtrl::add_user_zombies( defs_ptr defs)
+{
+	if (!defs.get()) return;
+	std::vector<Submittable*> tasks;
+	defs->get_all_active_submittables(tasks);
+	do_add_user_zombies(tasks);
+}
+
+/// Returns the list of zombies, **updated** with seconds since creation
+void ZombieCtrl::get( std::vector< Zombie >& ret)   {
+
+	boost::posix_time::ptime time_now = Calendar::second_clock_time();
+
+	size_t zombieVecSize = zombies_.size(); ret.reserve(zombieVecSize);
+	for(size_t i = 0 ; i < zombieVecSize; i++) {
+
+		time_duration duration = time_now - zombies_[i].creation_time();
+		zombies_[i].set_duration( duration.total_seconds() );
+
+		ret.push_back(zombies_[i]);
+	}
+}
+
+void ZombieCtrl::remove_stale_zombies( const boost::posix_time::ptime& time_now )
+{
+	for(std::vector<Zombie>::iterator i = zombies_.begin(); i != zombies_.end(); ++i) {
+		time_duration duration = time_now - (*i).creation_time();
+		if ( duration.total_seconds() > (*i).allowed_age()) {
+#ifdef DEBUG_ZOMBIE
+			std::cout << "   ZombieCtrl::remove_stale_zombies " << (*i) << "\n";
+#endif
+			zombies_.erase(i--);
+		}
+ 	}
+}
+
+void ZombieCtrl::fob( const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password) {
+
+	Zombie& theExistingZombie = find_zombie(path_to_task, process_or_remote_id, password );
+	if( theExistingZombie.empty() ) return;
+	theExistingZombie.set_fob();
+}
+
+void ZombieCtrl::fobCli( const std::string& path_to_task,  Submittable* task) {
+
+	if (task) {
+		/// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
+		/// If zombie password does *NOT* match then this is the real zombie.
+		size_t zombieVecSize = zombies_.size();
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if (zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
+	  			zombies_[i].set_fob();
+	  			return;
+			}
+		}
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if (zombies_[i].path_to_task() == path_to_task && zombies_[i].process_or_remote_id() != task->process_or_remote_id()) {
+	  			zombies_[i].set_fob();
+	  			return;
+			}
+		}
+	}
+
+   /// The best we can do
+   Zombie& theExistingZombie = find_by_path( path_to_task );
+   if ( theExistingZombie.empty() )  return;
+   theExistingZombie.set_fob();
+}
+
+void ZombieCtrl::fail(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password) {
+
+	Zombie& theExistingZombie = find_zombie(path_to_task, process_or_remote_id, password );
+	if( theExistingZombie.empty() ) return;
+	theExistingZombie.set_fail();
+}
+
+void ZombieCtrl::failCli( const std::string& path_to_task,  Submittable* task) {
+
+	if (task) {
+		/// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
+		/// If zombie password does *NOT* match then this is the real zombie.
+		size_t zombieVecSize = zombies_.size();
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if (zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
+	  			zombies_[i].set_fail();
+	  			return;
+			}
+		}
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if (zombies_[i].path_to_task() == path_to_task && zombies_[i].process_or_remote_id() != task->process_or_remote_id()) {
+	  			zombies_[i].set_fail();
+	  			return;
+			}
+		}
+	}
+
+   /// The best we can do
+   Zombie& theExistingZombie = find_by_path( path_to_task );
+   if ( theExistingZombie.empty() )  return;
+   theExistingZombie.set_fail();
+}
+
+void ZombieCtrl::adopt( const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password ) {
+
+	Zombie& theExistingZombie = find_zombie(path_to_task, process_or_remote_id, password );
+	if ( theExistingZombie.empty() ) return;
+	theExistingZombie.set_adopt();
+}
+
+void ZombieCtrl::adoptCli( const std::string& path_to_task,  Submittable* task) {
+
+	if (!task) {
+		throw std::runtime_error("ZombieCtrl::adoptCli: Can't adopt zombie, there is no corresponding task!");
+	}
+
+	/// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
+	/// If zombie password does *NOT* match then this is the real zombie.
+	size_t zombieVecSize = zombies_.size();
+	for(size_t i = 0 ; i < zombieVecSize; i++) {
+	   if (zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
+	      zombies_[i].set_adopt();
+	      return;
+	   }
+	}
+
+   /// ***************************************************************************************
+   /// IMPORTANT: We should *NEVER* adopt a zombie, when the process id are different
+   /// This can end up, with two process running, Will mess up job output, as well as corruption caused
+	/// but running the same job twice. Better to kill both and re-queue.
+   /// Note: PBS can create two process, i.e same password, different PID's
+   /// ***************************************************************************************
+   for(size_t i = 0 ; i < zombieVecSize; i++) {
+      if (zombies_[i].path_to_task() == path_to_task && zombies_[i].process_or_remote_id() != task->process_or_remote_id()) {
+         std::stringstream ss;
+         ss << "ZombieCtrl::adoptCli: Can *not* adopt zombies, where process id are different. Task("
+            << task->process_or_remote_id() << ") zombie(" << zombies_[i].process_or_remote_id()
+            << "). Please kill both process, and re-queue";
+         throw std::runtime_error(ss.str());
+      }
+   }
+}
+
+void ZombieCtrl::block( const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password ) {
+
+	Zombie& theExistingZombie = find_zombie(path_to_task, process_or_remote_id, password );
+	if ( theExistingZombie.empty() ) return;
+	theExistingZombie.set_block();
+}
+
+void ZombieCtrl::blockCli( const std::string& path_to_task,  Submittable* task) {
+
+	if (!task) {
+		throw std::runtime_error("ZombieCtrl::blockCli: Can't block zombie, there is no corresponding task for path " + path_to_task );
+	}
+	else {
+		/// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
+		/// If zombie password does *NOT* match then this is the real zombie.
+		size_t zombieVecSize = zombies_.size();
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if (zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
+	  			zombies_[i].set_block();
+	  			return;
+			}
+		}
+	}
+}
+
+void ZombieCtrl::kill( const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password ) {
+
+   Zombie& theExistingZombie = find_zombie(path_to_task, process_or_remote_id, password );
+   if ( theExistingZombie.empty() ) return;
+   theExistingZombie.set_kill();
+}
+
+void ZombieCtrl::killCli( const std::string& path_to_task,  Submittable* task) {
+
+   if (!task) {
+      throw std::runtime_error("ZombieCtrl::killCli: Can't kill zombie, there is no corresponding task for path " + path_to_task );
+   }
+
+   /// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
+   /// If zombie password does *NOT* match then this is the real zombie.
+   size_t zombieVecSize = zombies_.size();
+   for(size_t i = 0 ; i < zombieVecSize; i++) {
+      if (zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
+         task->kill(zombies_[i].process_or_remote_id());
+         zombies_[i].set_kill();
+         return;
+      }
+   }
+   for(size_t i = 0 ; i < zombieVecSize; i++) {
+      if ( zombies_[i].path_to_task() == path_to_task && zombies_[i].process_or_remote_id() != task->process_or_remote_id()) {
+         task->kill(zombies_[i].process_or_remote_id());
+         zombies_[i].set_kill();
+         return ;
+      }
+   }
+   /// The best we can do
+   Zombie& theExistingZombie = find_by_path( path_to_task );
+   if ( theExistingZombie.empty() ) {
+      throw std::runtime_error("ZombieCtrl::killCli: Can't kill, could not locate zombie(and hence pid) for path: " + path_to_task );
+   }
+   task->kill(theExistingZombie.process_or_remote_id());
+   theExistingZombie.set_kill();
+   remove_by_path(path_to_task);
+}
+
+/// Called by the child commands, ie complete and abort
+/// Hence remove zombie with matching password/process id ?
+bool ZombieCtrl::remove( Submittable* t)
+{
+	if (t) {
+		return remove(t->absNodePath(), t->process_or_remote_id(), t->jobsPassword() );
+	}
+	return false;
+}
+
+bool ZombieCtrl::remove( const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password ) {
+
+	/// Note: Its possible for two separate jobs to have the same password. (submit 1, submit 2) before job1 active, password overridden by submit 2
+	/// Hence remove needs to at least match process_id
+	size_t zombieVecSize = zombies_.size();
+	for(size_t i = 0 ; i < zombieVecSize; i++) {
+		if (match(zombies_[i],path_to_task,process_or_remote_id,password)) {
+//#ifdef DEBUG_ZOMBIE
+//			std::cout << "   ZombieCtrl::remove " << zombies_[i] << " \n";
+//#endif
+			zombies_.erase( zombies_.begin() + i);
+			return true;
+		}
+	}
+   return false;
+}
+
+void ZombieCtrl::removeCli( const std::string& path_to_task,  Submittable* task) {
+
+	if (task) {
+		/// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
+		/// If zombie password does *NOT* match then this is the real zombie.
+	   size_t zombieVecSize = zombies_.size();
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if ( zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
+#ifdef DEBUG_ZOMBIE
+				std::cout << "   ZombieCtrl::removeCli " << zombies_[i] << " \n";
+#endif
+				zombies_.erase( zombies_.begin() + i);
+				return ;
+			}
+		}
+		for(size_t i = 0 ; i < zombieVecSize; i++) {
+			if ( zombies_[i].path_to_task() == path_to_task && zombies_[i].process_or_remote_id() != task->process_or_remote_id()) {
+#ifdef DEBUG_ZOMBIE
+			std::cout << "   ZombieCtrl::removeCli " << zombies_[i] << " \n";
+#endif
+				zombies_.erase( zombies_.begin() + i);
+				return ;
+			}
+		}
+	}
+
+   /// The best we can do
+   (void)remove_by_path(path_to_task);
+}
+
+bool ZombieCtrl::remove_by_path(const std::string& path_to_task)
+{
+   size_t zombieVecSize = zombies_.size();
+   for(size_t i = 0 ; i < zombieVecSize; i++) {
+      if ( zombies_[i].path_to_task() == path_to_task) {
+#ifdef DEBUG_ZOMBIE
+         std::cout << "   ZombieCtrl::remove_by_path : " << zombies_[i] << " \n";
+#endif
+         zombies_.erase( zombies_.begin() + i);
+         return true;
+      }
+   }
+   return false;
+}
+
+/// Query
+const Zombie& ZombieCtrl::find(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password) const
+{
+	size_t zombieVecSize = zombies_.size();
+	for(size_t i = 0 ; i < zombieVecSize; i++) {
+		if (match(zombies_[i],path_to_task,process_or_remote_id,password)) {
+ 			return zombies_[i];
+		}
+	}
+	return Zombie::EMPTY();
+}
+
+//================= private ===================================================================
+
+Zombie& ZombieCtrl::find(Submittable* task)
+{
+	if (task) return find_zombie(task->absNodePath(),task->process_or_remote_id(),task->jobsPassword());
+	return Zombie::EMPTY_();
+}
+
+const Zombie& ZombieCtrl::find(Submittable* task) const
+{
+	if (task) return find(task->absNodePath(),task->process_or_remote_id(),task->jobsPassword());
+	return Zombie::EMPTY();
+}
+
+Zombie& ZombieCtrl::find_zombie(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password)
+{
+	size_t zombieVecSize = zombies_.size();
+	for(size_t i = 0 ; i < zombieVecSize; i++) {
+		if (match(zombies_[i],path_to_task,process_or_remote_id,password)) {
+ 			return zombies_[i];
+ 		}
+	}
+	return find_by_path(path_to_task);
+}
+
+
+bool match(const Zombie& z, const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password)
+{
+	///  Process/remote id only created when task becomes active.
+	if (z.path_to_task() == path_to_task) {
+		if (process_or_remote_id.empty() || z.process_or_remote_id().empty()) {
+			if (z.jobs_password() == password) {
+				return true;
+			}
+		}
+		else  if ( z.process_or_remote_id() == process_or_remote_id ) {
+			return true;
+		}
+	}
+	return false;
+}
+
+Zombie& ZombieCtrl::find_by_path(const std::string& path_to_task)
+{
+	size_t zombieVecSize = zombies_.size();
+	for(size_t i = 0 ; i < zombieVecSize; i++) {
+		if (zombies_[i].path_to_task() == path_to_task) {
+  			return zombies_[i];
+		}
+	}
+	return Zombie::EMPTY_();
+}
+
+const Zombie& ZombieCtrl::find_by_path_only(const std::string& path_to_task) const
+{
+	size_t zombieVecSize = zombies_.size();
+	for(size_t i = 0 ; i < zombieVecSize; i++) {
+		if (zombies_[i].path_to_task() == path_to_task) {
+  			return zombies_[i];
+		}
+	}
+	return Zombie::EMPTY();
+}
diff --git a/ecflow_4_0_7/Base/src/ZombieCtrl.hpp b/ecflow_4_0_7/Base/src/ZombieCtrl.hpp
new file mode 100644
index 0000000..0c2d73c
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/ZombieCtrl.hpp
@@ -0,0 +1,142 @@
+#ifndef ZOMBIE_CTRL_HPP_
+#define ZOMBIE_CTRL_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : manages the zombies
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <vector>
+#include <boost/noncopyable.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include "Zombie.hpp"
+#include "NodeFwd.hpp"
+#include "Cmd.hpp"
+class TaskCmd;
+class AbstractServer;
+
+/// All zombies are auto deleted after a period of time. See Zombie::allowed_age()
+class ZombieCtrl : private boost::noncopyable {
+public:
+	ZombieCtrl() {}
+
+	/// Handle the zombie, and return back to the client
+	bool handle_zombie(
+	                   Submittable*,            // Must be NON NULL
+	                   const TaskCmd* task_cmd, // The child command
+	                   std::string& action_taken,// action taken
+	                   STC_Cmd_ptr& theReply    // Reply varies according to User Action
+	                   );
+
+	bool handle_path_zombie(
+	                   AbstractServer* as,       // Find closest matching node
+	                   const TaskCmd* task_cmd,  // The child command
+                      std::string& action_taken,// action taken
+	                   STC_Cmd_ptr& theReply     // Reply varies according to User Action
+	                   );
+
+
+	/// Find all *Tasks* beneath the input Node, that are in active or submitted states
+	/// We deliberately ignore aliases (This was requested by Axel)
+	/// Then add as 'USER' zombies. This should be called when commands like, delete, requeue,
+	/// run, are using the force option, and will create zombies.
+	void add_user_zombies(node_ptr);
+	void add_user_zombies(suite_ptr);
+	void add_user_zombies(defs_ptr);
+
+	/// Returns the list of zombies, **updated** with seconds since creation
+	/// To avoid sending attr to client, we copy over its setting, if in effect
+ 	void get(std::vector<Zombie>&)  ;
+
+
+	/// remove all zombies, older than their allowed age
+	void remove_stale_zombies(const boost::posix_time::ptime& time_now);
+
+
+	/// Will ask the child command to terminate, *without* the child command raising any errors
+	/// Since we can have many child commands(init,event,meter, label,complete) in a job
+	/// This fob must stay around, since we don't know how long the job will last for.
+	/// Will override, fail,recover,remove
+	/// For Command Line Interface only the task_path is provided. Just have to make do.
+	void fob(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+	void fobCli(const std::string& path_to_task, Submittable*);
+
+
+	/// Similar to a fob, But will ask the child command to terminate, with an error.
+	/// Typically this will raise a trap in the job file, and hence raise an abort
+	/// However the abort will also be a zombie, and will also be auto-terminated
+	/// Hence the job file must be careful to use 'set -e' to avoid infinite recursion
+	/// Since we can have many child commands(init,event,meter, label,complete) in a job
+	/// This fob must stay around, since we don't know how long the job will last for.
+	/// Will override, fob,recover,remove
+	/// For Command Line Interface only the task_path is provided. Just have to make do.
+	void fail( const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+	void failCli(const std::string& path_to_task, Submittable*);
+
+
+	/// Find the task node, corresponding to the zombie, and copy over
+	/// the password. Then remove the zombie. Next time the child commands
+	/// communicate with the server, all will be ok
+	/// Will override, fail,fob,remove
+	/// For Command Line Interface only the task_path is provided. Just have to make do.
+	void adopt(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+	void adoptCli(const std::string& path_to_task, Submittable*);
+	void block(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+	void blockCli(const std::string& path_to_task, Submittable*);
+   void kill(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+   void killCli(const std::string& path_to_task, Submittable*);
+
+
+	/// Remove the zombie corresponding to the Task path. Should only be one
+	/// Since we can have many child commands(init,event,meter, label,complete) in a job
+	/// the zombies may get re-added, should we rember this.
+	/// If path not found does nothing.
+	/// For Command Line Interface only the task_path is provided. Just have to make do.
+	bool remove(Submittable*);
+	bool remove(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+	void removeCli(const std::string& path_to_task, Submittable*);
+
+	/// Query
+ 	const Zombie& find(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password) const;
+	const Zombie& find_by_path_only(const std::string& path_to_task) const;
+
+private:
+
+	bool handle_existing_zombie(
+	                   Zombie &,                // The server already knows about the zombie
+	                   Submittable*,            // This NULL for path zombies
+	                   node_ptr closest_matching_node, // only set for path zombies
+	                   const TaskCmd* task_cmd, // The child command
+                      std::string& action_taken,// User action taken
+	                   STC_Cmd_ptr& theReply    // Reply varies according to User Action
+	                   );
+
+	bool handle_user_actions(
+	                   Zombie &,                 // The server already knows about the zombie
+	                   Submittable*,             // This NULL for path zombies
+	                   const TaskCmd* task_cmd,  // The child command
+                      std::string& action_taken,// User action taken
+	                   STC_Cmd_ptr& theReply     // Reply varies according to User Action
+	                   );
+
+	Zombie& find_zombie(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password);
+	Zombie& find(Submittable*);
+	const Zombie& find(Submittable*) const;
+	void do_add_user_zombies(const std::vector<Submittable*>& tasks);
+	Zombie& find_by_path(const std::string& path_to_task);
+
+	bool remove_by_path(const std::string& path_to_task);
+private:
+	std::vector<Zombie> zombies_;
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/cts/AlterCmd.cpp b/ecflow_4_0_7/Base/src/cts/AlterCmd.cpp
new file mode 100644
index 0000000..5d2386a
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/AlterCmd.cpp
@@ -0,0 +1,977 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #62 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/lexical_cast.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+#include "ExprAst.hpp"
+#include "SuiteChanged.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+static std::string dump_args(const std::vector<std::string>& options, const std::vector<std::string>& paths )
+{
+	std::string the_args;
+	for(size_t i = 0; i < options.size(); i++) {
+		the_args += options[i];
+		the_args += " ";
+	}
+	for(size_t i = 0; i < paths.size(); i++) {
+		the_args += paths[i];
+		the_args += " ";
+	}
+	return the_args;
+}
+
+static AlterCmd::Delete_attr_type deleteAttrType(const std::string& s)
+{
+	if (s == "variable") return AlterCmd::DEL_VARIABLE;
+	if (s == "time") return AlterCmd::DEL_TIME;
+	if (s == "today") return AlterCmd::DEL_TODAY;
+	if (s == "date") return AlterCmd::DEL_DATE;
+	if (s == "day") return AlterCmd::DEL_DAY;
+	if (s == "cron") return AlterCmd::DEL_CRON;
+	if (s == "event") return AlterCmd::DEL_EVENT;
+	if (s == "meter") return AlterCmd::DEL_METER;
+	if (s == "label") return AlterCmd::DEL_LABEL;
+	if (s == "trigger") return AlterCmd::DEL_TRIGGER;
+	if (s == "complete") return AlterCmd::DEL_COMPLETE;
+	if (s == "repeat") return AlterCmd::DEL_REPEAT;
+	if (s == "limit") return AlterCmd::DEL_LIMIT;
+	if (s == "limit_path") return AlterCmd::DEL_LIMIT_PATH;
+	if (s == "inlimit") return AlterCmd::DEL_INLIMIT;
+	if (s == "zombie") return AlterCmd::DEL_ZOMBIE;
+	return AlterCmd::DELETE_ATTR_ND;
+}
+static std::string to_string(AlterCmd::Delete_attr_type d)
+{
+	switch (d) {
+	case AlterCmd::DEL_VARIABLE:  return "variable"; break;
+	case AlterCmd::DEL_TIME:      return "time"; break;
+	case AlterCmd::DEL_TODAY:     return "today"; break;
+	case AlterCmd::DEL_DATE:      return "date"; break;
+	case AlterCmd::DEL_DAY:       return "day"; break;
+	case AlterCmd::DEL_CRON:      return "cron"; break;
+	case AlterCmd::DEL_EVENT:     return "event"; break;
+	case AlterCmd::DEL_METER:     return "meter"; break;
+	case AlterCmd::DEL_LABEL:     return "label"; break;
+	case AlterCmd::DEL_TRIGGER:   return "trigger"; break;
+	case AlterCmd::DEL_COMPLETE:  return "complete";  break;
+	case AlterCmd::DEL_REPEAT:    return "repeat";  break;
+	case AlterCmd::DEL_LIMIT:     return "limit"; break;
+	case AlterCmd::DEL_LIMIT_PATH:return "limit_path"; break;
+	case AlterCmd::DEL_INLIMIT:   return "inlimit";  break;
+	case AlterCmd::DEL_ZOMBIE:    return "zombie";  break;
+	case AlterCmd::DELETE_ATTR_ND: break;
+	default: break;
+	}
+	return string();
+}
+static void validDeleteAttr(std::vector<std::string>& vec)
+{
+	vec.reserve(16);
+	vec.push_back("variable");
+	vec.push_back("time");
+	vec.push_back("today");
+	vec.push_back("date");
+	vec.push_back("day");
+	vec.push_back("cron");
+	vec.push_back("event");
+	vec.push_back("meter");
+	vec.push_back("label");
+	vec.push_back("trigger");
+	vec.push_back("complete");
+	vec.push_back("repeat");
+	vec.push_back("limit");
+	vec.push_back("limit_path");
+	vec.push_back("inlimit");
+	vec.push_back("zombie");
+}
+
+
+static AlterCmd::Add_attr_type addAttrType(const std::string& s)
+{
+	if (s == "time") return AlterCmd::ADD_TIME;
+	if (s == "today") return AlterCmd::ADD_TODAY;
+	if (s == "date") return AlterCmd::ADD_DATE;
+	if (s == "day") return AlterCmd::ADD_DAY;
+	if (s == "zombie") return AlterCmd::ADD_ZOMBIE;
+	if (s == "variable") return AlterCmd::ADD_VARIABLE;
+	return AlterCmd::ADD_ATTR_ND;
+}
+static std::string to_string(AlterCmd::Add_attr_type a) {
+	switch (a) {
+	case AlterCmd::ADD_TIME:    return "time;"; break;
+	case AlterCmd::ADD_TODAY:   return "today"; break;
+	case AlterCmd::ADD_DATE:    return "date"; break;
+	case AlterCmd::ADD_DAY:     return "day"; break;
+	case AlterCmd::ADD_ZOMBIE:  return "zombie"; break;
+	case AlterCmd::ADD_VARIABLE:return "variable"; break;
+	case AlterCmd::ADD_ATTR_ND:  break;
+	}
+	return string();
+}
+static void validAddAttr(std::vector<std::string>& vec)
+{
+	vec.reserve(6);
+	vec.push_back("time");
+	vec.push_back("today");
+	vec.push_back("date");
+	vec.push_back("day");
+	vec.push_back("zombie");
+	vec.push_back("variable");
+}
+
+
+static AlterCmd::Change_attr_type changeAttrType(const std::string& s)
+{
+	if (s == "variable") return AlterCmd::VARIABLE;
+	if (s == "clock_type") return AlterCmd::CLOCK_TYPE;
+	if (s == "clock_date") return AlterCmd::CLOCK_DATE;
+	if (s == "clock_gain") return AlterCmd::CLOCK_GAIN;
+	if (s == "clock_sync") return AlterCmd::CLOCK_SYNC;
+	if (s == "event") return AlterCmd::EVENT;
+	if (s == "meter") return AlterCmd::METER;
+	if (s == "label") return AlterCmd::LABEL;
+	if (s == "trigger") return AlterCmd::TRIGGER;
+	if (s == "complete") return AlterCmd::COMPLETE;
+	if (s == "repeat") return AlterCmd::REPEAT;
+	if (s == "limit_max") return AlterCmd::LIMIT_MAX;
+	if (s == "limit_value") return AlterCmd::LIMIT_VAL;
+	if (s == "defstatus") return AlterCmd::DEFSTATUS;
+	return AlterCmd::CHANGE_ATTR_ND;
+}
+static std::string to_string(AlterCmd::Change_attr_type c)
+{
+	switch (c) {
+	case AlterCmd::VARIABLE:     return "variable"; break;
+	case AlterCmd::CLOCK_TYPE:   return "clock_type"; break;
+	case AlterCmd::CLOCK_DATE:   return "clock_date"; break;
+	case AlterCmd::CLOCK_GAIN:   return "clock_gain"; break;
+	case AlterCmd::CLOCK_SYNC:   return "clock_sync"; break;
+	case AlterCmd::EVENT:        return "event"; break;
+	case AlterCmd::METER:        return "meter"; break;
+	case AlterCmd::LABEL:        return "label"; break;
+	case AlterCmd::TRIGGER:      return "trigger";  break;
+	case AlterCmd::COMPLETE:     return "complete";  break;
+	case AlterCmd::REPEAT:       return "repeat"; break;
+	case AlterCmd::LIMIT_MAX:    return "limit_max"; break;
+	case AlterCmd::LIMIT_VAL:    return "limit_value"; break;
+	case AlterCmd::DEFSTATUS:    return "defstatus";  break;
+	case AlterCmd::CHANGE_ATTR_ND: break;
+	default: break;
+	}
+	return string();
+}
+static void validChangeAttr(std::vector<std::string>& vec)
+{
+	vec.reserve(15);
+	vec.push_back("variable");
+	vec.push_back("clock_type");
+	vec.push_back("clock_gain");
+	vec.push_back("clock_date");
+	vec.push_back("clock_sync");
+	vec.push_back("event");
+	vec.push_back("meter");
+	vec.push_back("label");
+	vec.push_back("trigger");
+	vec.push_back("complete");
+	vec.push_back("repeat");
+	vec.push_back("limit_max");
+	vec.push_back("limit_value");
+	vec.push_back("defstatus");
+	vec.push_back("free_password");
+}
+
+//=======================================================================================
+
+bool AlterCmd::equals(ClientToServerCmd* rhs) const
+{
+	AlterCmd* the_rhs = dynamic_cast<AlterCmd*>(rhs);
+	if (!the_rhs)  return false;
+	if ( paths_             != the_rhs->paths())      { return false; }
+	if ( name_              != the_rhs->name())       { return false; }
+	if ( value_             != the_rhs->value())      { return false; }
+	if ( del_attr_type_     != the_rhs->delete_attr_type()) { return false; }
+	if ( change_attr_type_  != the_rhs->change_attr_type()) { return false; }
+	if ( add_attr_type_     != the_rhs->add_attr_type())    { return false; }
+	if ( flag_type_         != the_rhs->flag_type())        { return false; }
+	if ( flag_              != the_rhs->flag())             { return false; }
+	return UserCmd::equals(rhs);
+}
+
+std::ostream& AlterCmd::print(std::ostream& os) const
+{
+	std::string alter_type,attr_type;
+	if (del_attr_type_ != AlterCmd::DELETE_ATTR_ND) {
+		alter_type = "delete";
+		attr_type = to_string(del_attr_type_);
+	}
+	else if (change_attr_type_ != AlterCmd::CHANGE_ATTR_ND) {
+		alter_type = "change";
+		attr_type = to_string(change_attr_type_);
+	}
+	else if (add_attr_type_ != AlterCmd::ADD_ATTR_ND) {
+		alter_type = "add";
+		attr_type = to_string(add_attr_type_);
+	}
+	else if (flag_type_ != Flag::NOT_SET) {
+		if (flag_) alter_type = "set_flag";
+		else       alter_type = "clear_flag";
+		attr_type = Flag::enum_to_string(flag_type_);
+	}
+
+	return user_cmd(os,CtsApi::to_string(CtsApi::alter(paths_,alter_type,attr_type,name_,value_)));
+}
+
+STC_Cmd_ptr AlterCmd::alter_server_state(AbstractServer* as) const
+{
+	if ( del_attr_type_ == AlterCmd::DEL_VARIABLE) {
+		as->defs()->set_server().delete_user_variable(name_);
+	}
+	else if ( change_attr_type_ == AlterCmd::VARIABLE ) {
+		as->defs()->set_server().add_or_update_user_variables(name_,value_);
+	}
+	else if (add_attr_type_ == AlterCmd::ADD_VARIABLE) {
+		as->defs()->set_server().add_or_update_user_variables(name_,value_);
+	}
+
+	// Update defs flag state
+	if (flag_type_ != Flag::NOT_SET) {
+		if (flag_) as->defs()->flag().set(flag_type_);
+		else       as->defs()->flag().clear(flag_type_);
+	}
+
+	return doJobSubmission( as );
+}
+
+
+STC_Cmd_ptr AlterCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().alter_cmd_++;
+
+	std::stringstream ss;
+	size_t vec_size = paths_.size();
+	for(size_t i= 0; i < vec_size; i++) {
+
+		/// For root node user means to change server state
+		if (paths_[i] == "/") {
+			return alter_server_state(as);
+		}
+
+		node_ptr node = find_node_for_edit_no_throw(as,paths_[i]);
+		if (!node.get()) {
+			ss << "AlterCmd: Could not find node at path " << paths_[i] << "\n";
+			LOG(Log::ERR,"AlterCmd: Failed: Could not find node at path " << paths_[i]);
+			continue;
+		}
+
+		SuiteChanged0 changed(node);
+		try {
+			switch (del_attr_type_) {
+			case AlterCmd::DEL_VARIABLE:  node->deleteVariable(name_); break;
+			case AlterCmd::DEL_TIME:      node->deleteTime(name_); break;
+			case AlterCmd::DEL_TODAY:     node->deleteToday(name_); break;
+			case AlterCmd::DEL_DATE:      node->deleteDate(name_); break;
+			case AlterCmd::DEL_DAY:       node->deleteDay(name_);break;
+			case AlterCmd::DEL_CRON:      node->deleteCron(name_);break;
+			case AlterCmd::DEL_EVENT:     node->deleteEvent(name_);break;
+			case AlterCmd::DEL_METER:     node->deleteMeter(name_); break;
+			case AlterCmd::DEL_LABEL:     node->deleteLabel(name_); break;
+			case AlterCmd::DEL_TRIGGER:   node->deleteTrigger();  break;
+			case AlterCmd::DEL_COMPLETE:  node->deleteComplete();  break;
+			case AlterCmd::DEL_REPEAT:    node->deleteRepeat(); break;
+			case AlterCmd::DEL_LIMIT:     node->deleteLimit(name_);break;
+			case AlterCmd::DEL_LIMIT_PATH:node->delete_limit_path(name_,value_);break;
+			case AlterCmd::DEL_INLIMIT:   node->deleteInlimit(name_); break;
+			case AlterCmd::DEL_ZOMBIE:    node->deleteZombie(name_); break;
+			case AlterCmd::DELETE_ATTR_ND: break;
+			default: break;
+			}
+		}
+		catch ( std::exception& e) {
+			ss << "Alter (delete) failed for " << paths_[i] << " : " << e.what() << "\n";
+		}
+
+		try {
+			switch (change_attr_type_) {
+			case AlterCmd::VARIABLE:    node->changeVariable(name_,value_); break;
+			case AlterCmd::CLOCK_TYPE:  node->suite()->changeClockType(name_); break;  // node must be a suite, value must [hybrid|real| virtual]
+			case AlterCmd::CLOCK_DATE:  node->suite()->changeClockDate(name_); break;  // Expecting day.month.year: node must be a suite, value must [hybrid|real| virtual]
+			case AlterCmd::CLOCK_GAIN:  node->suite()->changeClockGain(name_); break;  // node must be a suite, value must be int
+			case AlterCmd::CLOCK_SYNC:  node->suite()->changeClockSync(); break;       // node must be a suite, sync clock with computer
+			case AlterCmd::EVENT:       node->changeEvent(name_,value_);break;  // if value is empty just set, [1|0] or name [set | clear]
+			case AlterCmd::METER:       node->changeMeter(name_,value_); break;
+			case AlterCmd::LABEL:       node->changeLabel(name_,value_); break;
+			case AlterCmd::TRIGGER:     node->changeTrigger(name_);  break;          // expression must parse
+			case AlterCmd::COMPLETE:    node->changeComplete(name_);  break;         // expression must parse
+			case AlterCmd::REPEAT:      node->changeRepeat(name_); break;            //
+			case AlterCmd::LIMIT_MAX:   node->changeLimitMax(name_,value_);break;    // value must be convertible to int
+			case AlterCmd::LIMIT_VAL:   node->changeLimitValue(name_,value_); break; // value < limit max, & value must be convertible to an int
+			case AlterCmd::DEFSTATUS:   node->changeDefstatus(name_);  break;        // must be a valid state
+			case AlterCmd::CHANGE_ATTR_ND: break;
+			default: break;
+			}
+		}
+		catch ( std::exception& e) {
+			ss << "Alter (change) failed for " << paths_[i] << " : " << e.what() << "\n";
+		}
+
+		try {
+			switch (add_attr_type_) {
+			case AlterCmd::ADD_TIME:    node->addTime( TimeSeries::create(name_ ) ); break;
+			case AlterCmd::ADD_TODAY:   node->addToday( TimeSeries::create(name_) ); break;
+			case AlterCmd::ADD_DATE:    node->addDate( DateAttr::create(name_) ); break;
+			case AlterCmd::ADD_DAY:     node->addDay( DayAttr::create(name_) ); break;
+			case AlterCmd::ADD_ZOMBIE:  node->addZombie( ZombieAttr::create(name_) ); break;
+			case AlterCmd::ADD_VARIABLE:node->add_variable( name_, value_); break;
+			case AlterCmd::ADD_ATTR_ND:  break;
+			}
+		}
+		catch ( std::exception& e) {
+			ss << "Alter (add) failed for " << paths_[i] << ": Could not parse " << name_ << " : " << e.what() << "\n";
+		}
+
+		// Change flags
+		if (flag_type_ != Flag::NOT_SET) {
+			if (flag_) node->flag().set(flag_type_);
+			else       node->flag().clear(flag_type_);
+		}
+	}
+
+	// Clear up memory allocated to path.
+	// When dealing with several thousands paths, this makes a *HUGE* difference
+	vector<string>().swap(paths_); // clear paths_ and minimise its capacity
+
+	std::string error_msg = ss.str();
+	if (!error_msg.empty()) {
+		throw std::runtime_error( error_msg ) ;
+	}
+
+	return doJobSubmission( as );
+}
+
+const char* AlterCmd::arg()  { return CtsApi::alterArg();}
+const char* AlterCmd::desc() {
+	/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+	return  "Alter the node according to the options.\n"
+			"To add/delete/change server variables use '/' for the path.\n"
+			"  arg1 = [ delete | change | add | set_flag | clear_flag]\n"
+			"           one option must be specified\n"
+			"  arg2 = For delete:\n"
+			"           [ variable | time | today | date  | day | cron | event | meter |\n"
+			"             label | trigger | complete | repeat | limit | inlimit | limit_path | zombie ]\n"
+			"         For change:\n"
+			"           [ variable | clock_type | clock_gain | clock_date | clock_sync  | event | meter | label |\n"
+			"             trigger  | complete   | repeat     | limit_max  | limit_value | defstatus ]\n"
+			"             *NOTE* If the clock is changed, then the suite will need to be re-queued in order for\n"
+			"             the change to take effect fully.\n"
+			"         For add:\n"
+			"           [ variable | time | today | date | day | zombie ]\n"
+			"         For set_flag and clear_flag:\n"
+			"           [ force_aborted | user_edit | task_aborted | edit_failed |\n"
+			"             ecfcmd_failed | no_script | killed | migrated | late |\n"
+			"             message | complete | queue_limit | task_waiting | locked | zombie ]\n"
+			"  arg3 = name/value\n"
+			"         when changing, attributes like variable,meter,event,label,limits\n"
+			"         we expect arguments to be quoted\n"
+			"  arg4 = new_value\n"
+			"         specifies the new value only used for 'change'\n"
+			"         values with spaces must be quoted\n"
+			"  arg5 = paths : At lease one path required. The paths must start with a leading '/' character\n\n"
+			;
+}
+
+void AlterCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( AlterCmd::arg(),po::value< vector<string> >()->multitoken(), AlterCmd::desc() );
+}
+void AlterCmd::create( 	Cmd_ptr& cmd,
+		boost::program_options::variables_map& vm,
+		AbstractClientEnv* ac) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+
+	if (ac->debug()) dumpVecArgs(AlterCmd::arg(),args);
+
+	std::vector<std::string> options,paths;
+	split_args_to_options_and_paths(args,options,paths); // relative order is still preserved
+	if (paths.empty()) {
+		std::stringstream ss;
+		ss << "AlterCmd: No paths specified. Paths must begin with a leading '/' character\n" << dump_args(options,paths) << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+	if (options.empty()) {
+		std::stringstream ss;
+		ss << "AlterCmd: Invalid argument list:\n" << dump_args(options,paths)  << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+	if (options.size() < 2 ) {
+		std::stringstream ss;
+		ss << "Alter: At least three arguments expected. Found " << args.size() << "\n" << dump_args(options,paths) << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+	// arg[0] should one of [ add | delete | change | set_flag | clear_flag  ]
+	std::string alterType = options[0];
+
+	if ( alterType == "add") {
+
+		createAdd(cmd,options,paths);
+		return;
+	}
+	else if ( alterType == "change") {
+
+		createChange(cmd,options,paths);
+		return;
+	}
+	else if ( alterType == "delete") {
+
+		createDelete(cmd,options,paths);
+		return;
+	}
+	else if ( alterType == "set_flag") {
+
+		create_flag(cmd,options,paths, true /*set */);
+		return;
+	}
+	else if ( alterType == "clear_flag") {
+
+		create_flag(cmd,options,paths, false /*clear */);
+		return;
+	}
+
+	std::stringstream ss;
+	ss << "Alter: The first argument must be one of [ change | delete | add | set_flag | clear_flag ] but found '"
+			<< alterType << "'\n" << dump_args(options,paths)  << "\n";
+	throw std::runtime_error( ss.str() );
+}
+
+void AlterCmd::createAdd( Cmd_ptr& cmd, std::vector<std::string>& options, std::vector<std::string>& paths ) const
+{
+	// options[0]  - add
+	// options[1]  - [ time | date | day | zombie | variable ]
+	// options[2]  - [ time_string | date_string | day_string | zombie_string | variable_name ]
+	// options[3]  - variable_value
+	std::stringstream ss;
+
+	AlterCmd::Add_attr_type theAttrType = addAttrType(options[1]);
+	if (theAttrType == AlterCmd::ADD_ATTR_ND) {
+		ss << "AlterCmd: add: The second argument must be one of [ ";
+		std::vector<std::string> valid;
+		validAddAttr(valid);
+		for(size_t i = 0; i < valid.size(); ++i) {
+			if (i != 0) ss << " | ";
+			ss << valid[i];
+		}
+		ss << "] but found " << options[1] << "\n" << AlterCmd::desc();
+		throw std::runtime_error( ss.str() );
+	}
+
+	if (options.size() < 3 ) {
+		ss << "AlterCmd: add: At least four arguments expected. Found " << (options.size() + paths.size()) << "\n" << dump_args(options,paths) << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+	// **** parse and check format, expect this argument to be single or double tick quoted ****
+	// **** for time,date,day or zombie
+	std::string name = options[2];
+	std::string value;
+	try {
+		switch (theAttrType) {
+		case AlterCmd::ADD_TIME:  (void) TimeSeries::create(name); break;
+		case AlterCmd::ADD_TODAY: (void) TimeSeries::create(name); break;
+		case AlterCmd::ADD_DATE:  (void) DateAttr::create(name); break;
+		case AlterCmd::ADD_DAY:   (void) DayAttr::create(name); break;
+		case AlterCmd::ADD_ZOMBIE:(void) ZombieAttr::create(name); break;
+		case AlterCmd::ADD_VARIABLE: {
+			if (options.size() == 3 && paths.size() > 1) {
+				// variable value may be a path, hence it will be in the paths parameter
+				options.push_back(paths[0] );
+				paths.erase( paths.begin() );
+			}
+			if (options.size() < 4 ) {
+				ss << "AlterCmd: add: Expected 'add variable <name> <value> <paths>. Not enough arguments\n" << dump_args(options,paths) << "\n";
+				throw std::runtime_error( ss.str() );
+			}
+			value = options[3];
+
+			// Create a Variable to check valid names
+			Variable check(name,value);
+			break;
+		}
+		case AlterCmd::ADD_ATTR_ND:break;
+		}
+	}
+	catch ( std::exception& e) {
+		ss << "AlterCmd: add: Could not parse " << name << ". Error: " << e.what()
+				<< "\n for time,today and date the new value should be a quoted string "
+				<< "\n for add expected: --alter add variable <name> <value> <paths>\n" << dump_args(options,paths) << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+	cmd = Cmd_ptr( new AlterCmd(paths,theAttrType, name, value) );
+}
+
+
+void AlterCmd::createDelete( Cmd_ptr& cmd, const std::vector<std::string>& options, const std::vector<std::string>& paths) const
+{
+	// options[0] = delete
+	// options[1] = variable | time | today | date | day | cron | event | meter | label | trigger | complete | repeat | limit | limit_path | inlimit | zombie
+	// options[2] = name ( of object to be delete ) optional
+	// options[3] = limit_path (optional *ONLY* applicable for limit_path, specifies the path to be deleted
+	AlterCmd::Delete_attr_type theAttrType = deleteAttrType(options[1]);
+	if (theAttrType == AlterCmd::DELETE_ATTR_ND) {
+		std::stringstream ss;
+		ss << "Alter: delete: The second argument must be one of [ ";
+		std::vector<std::string> valid;
+		validDeleteAttr(valid);
+		for(size_t i = 0; i < valid.size(); ++i) {
+			if (i != 0) ss << " | ";
+			ss << valid[i];
+		}
+		ss << "] but found " << options[1] << "\n" << AlterCmd::desc();
+		throw std::runtime_error( ss.str() );
+	}
+
+	// Generally an empty third argument means delete all attributes, otherwise delete the specific one.
+	std::string name;
+	if (options.size() >= 3 )  name = options[2];
+
+	// Deleting the limit path requires an additional arg
+	std::string path_value;
+
+	// if specified make sure its parses
+	try {
+		switch (theAttrType) {
+		case AlterCmd::DEL_VARIABLE:  {
+			if (!name.empty()) Variable check(name,""); // Create a Variable to check valid names
+			break;
+		}
+		case AlterCmd::DEL_TIME: {
+			if (!name.empty())  (void) TimeSeries::create(name) ; // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_TODAY: {
+			if (!name.empty()) (void) TimeSeries::create(name) ; // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_DATE: {
+			if (!name.empty()) (void) DateAttr::create(name); // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_DAY:  {
+			if (!name.empty())  (void)DayAttr::create(name); // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_CRON:{
+			if (!name.empty()) {
+				CronAttr parsedCron = CronAttr::create(name); // will throw if not valid
+
+				// additional check since parsing is very forgiving. if parsed string is same as default
+				// then no cron was specified.
+				CronAttr emptyCron;
+				if ( emptyCron.structureEquals(parsedCron)) {
+					throw std::runtime_error("Delete cron Attribute failed. Check cron " + name);
+				}
+			}
+			break;
+		}
+		case AlterCmd::DEL_EVENT:    {
+			if (!name.empty()) {
+				Event check(name);  // will throw if not valid
+			}
+			break;
+		}
+		case AlterCmd::DEL_METER:    {
+			if (!name.empty()) Meter check(name,0,100);  // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_LABEL:    {
+			if (!name.empty()) Label check(name,"value");  // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_TRIGGER:  break; // there can only be on trigger per node, so we delete by path
+		case AlterCmd::DEL_COMPLETE: break; // there can only be on complete per node, so we delete by path
+		case AlterCmd::DEL_REPEAT:   break; // there can only be on repeat per node, so we delete by path
+		case AlterCmd::DEL_LIMIT:    {
+			if (!name.empty()) Limit check(name,10);  // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_INLIMIT:  {
+			if (!name.empty()) InLimit check(name);  // will throw if not valid
+			break;
+		}
+		case AlterCmd::DEL_ZOMBIE:  {
+			if (!Child::valid_zombie_type(name)) {
+				throw std::runtime_error("Delete Zombie Attribute failed. Expected one of [ ecf | path | user ] but found " + name);
+			}
+			break;
+		}
+		case AlterCmd::DEL_LIMIT_PATH: {
+			if (name.empty()) {
+				std::stringstream ss;
+				ss << "Delete limit_path failed. No limit name provided. Expected 5 args: delete limit_path <limit_name> <path-to-limit> <path_to_node>\n";
+				ss << dump_args(options,paths) << "\n";
+				throw std::runtime_error(ss.str());
+			}
+
+			std::vector<std::string> altered_path = paths;
+			if (options.size() == 4) {
+				// User has provide a limit path which does not start with '/'. Go with flow
+				path_value = options[3];
+			}
+			else {
+				// Since we have a limit path(i.e begins with'/') it will appear in the paths, as the first path
+				if (paths.size() <= 1) {
+					std::stringstream ss;
+					ss << "Delete limit_path failed: No path to limit provided. Expected 5 args: delete limit_path <limit_name> <path-to-limit> <path_to_node>\n"
+							<< dump_args(options,paths) << "\n";
+					throw std::runtime_error(ss.str());
+				}
+				path_value = paths[0];
+
+				// Change paths to remove the limit path.
+				altered_path.erase(altered_path.begin());
+			}
+			cmd = Cmd_ptr( new AlterCmd(altered_path,theAttrType, name, path_value  ) );
+			return;
+		}
+		case AlterCmd::DELETE_ATTR_ND: break;
+		}
+	}
+	catch ( std::exception& e) {
+		std::stringstream ss;
+		ss << "AlterCmd: delete: Could not parse " << name << ". Error: " << e.what()
+				<< "\n for time,today and date the new value should be a quoted string\n" << dump_args(options,paths) << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+	cmd = Cmd_ptr( new AlterCmd(paths,theAttrType, name, path_value  ) );
+}
+
+void AlterCmd::createChange( Cmd_ptr& cmd, std::vector<std::string>& options, std::vector<std::string>& paths) const
+{
+	// options[0] = change
+	// options[1] = variable | clock_type | clock_gain | clock_date | clock_sync | event | meter | label | trigger | complete | repeat | limit_max | limit_value | defstatus  ]
+	// options[2] = name
+	// options[3] = value
+
+	std::stringstream ss;
+
+	AlterCmd::Change_attr_type theAttrType = changeAttrType(options[1]);
+	if (theAttrType == AlterCmd::CHANGE_ATTR_ND) {
+		ss << "AlterCmd: change: The third argument(" << options[1] << ") must be one of [ ";
+		std::vector<std::string> valid;
+		validChangeAttr(valid);
+		for(size_t i = 0; i < valid.size(); ++i) {
+			if (i != 0) ss << " | ";
+			ss << valid[i];
+		}
+		ss << "]\n" <<  AlterCmd::desc();
+		throw std::runtime_error( ss.str() );
+	}
+
+	std::string name, value;
+	switch (theAttrType) {
+	case AlterCmd::VARIABLE: {
+		if (options.size() == 3 && paths.size() > 1) {
+			// The variable value may be a path, and hence it will be paths and not options parameter
+			options.push_back(paths[0]);
+			paths.erase(paths.begin()); // remove first path, since it has been added to options
+		}
+		if (options.size() != 4 ) {
+			ss << "AlterCmd: change: expected 5 args : change variable <variable_name> <new_value> <path_to_node>";
+			ss << " but found only " << (options.size() + paths.size()) << " arguments. The value should be quoted if there are spaces\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		value = options[3];
+		break;}
+
+	case AlterCmd::CLOCK_TYPE: {
+		if (options.size() != 3) {
+			ss << "AlterCmd: change: expected at least four args i.e. change clock_type [ hybrid | real ] <path_to_suite>";
+			ss << " but found only " << (options.size() + paths.size()) << " arguments\n"
+					<< dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		if (name != "hybrid" && name != "real") {
+			ss << "AlterCmd: change clock_type: expected third argument to be one of [ hybrid | real ]";
+			ss << " but found " << name << "\n" << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		break;}
+
+	case AlterCmd::CLOCK_DATE: {
+		if (options.size() != 3) {
+			ss << "AlterCmd: change clock_date : expected at least four args :  change clock_date day.month.year <path_to_suite>";
+			ss << " but found only " << (options.size() + paths.size()) << " arguments\n" << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+
+		// Check date is in correct format:
+		try {
+			int day,month,year;
+			DateAttr::getDate(name,day,month,year);
+			DateAttr::checkDate(day,month,year,false /* for clocks we don't allow wild carding */);
+		}
+		catch ( std::exception& e) {
+			ss << "AlterCmd:change  clock_date " << name << " is not valid. " << e.what();
+			throw std::runtime_error( ss.str() );
+		}
+		break;}
+
+	case AlterCmd::CLOCK_GAIN: {
+		if (options.size() != 3) {
+			ss << "AlterCmd: change clock_gain : expected four args i.e. change clock_gain <int> <path_to_suite> ";
+			ss << " but found " << (options.size() + paths.size()) << " arguments. The actual gain must be convertible to an integer\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		try { boost::lexical_cast< int >( name ); }
+		catch ( boost::bad_lexical_cast& ) {
+			ss << "AlterCmd: " << options[0] << " " << options[1] << " " << options[2] << " " << paths[0];
+			ss << " expected '" << name << "' to be convertible to an integer\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		break; }
+
+	case AlterCmd::CLOCK_SYNC: {
+		if (options.size() != 2) {
+			ss << "AlterCmd: change clock_sync : expected three args i.e. change clock_sync  <path_to_suite> ";
+			ss << " but found " << (options.size() + paths.size()) << " arguments.\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		break; }
+
+	case AlterCmd::EVENT: {
+		if (options.size() != 3 && options.size() != 4) {
+			ss << "AlterCmd: Change event : expected four/five args:  change event <name_or_number> <[set | clear | <nothing>]> <path_to_node>";
+			ss << " but found only " << (options.size() + paths.size()) << " arguments\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		if ( options.size() == 4) {
+			value =  options[3];
+			if (value != Event::SET() && value != Event::CLEAR()) {
+				ss << "AlterCmd: Change event : expected four/five args:  change event <name_or_number> <[set | clear | <nothing>]> <path_to_node>";
+				ss << " but found only " << (options.size() + paths.size()) << " arguments\n";
+				ss << dump_args(options,paths) << "\n";
+				throw std::runtime_error( ss.str() );
+			}
+		}
+		// The name could be an integer
+		try { boost::lexical_cast< int >( name ); }
+		catch ( boost::bad_lexical_cast& ) {
+			// name is not an integer, check name is valid
+			Event check_name(name); // will throw if name is not valid
+		}
+		break; }
+
+	case AlterCmd::METER: {
+		if (options.size() != 4) {
+			ss << "AlterCmd: change: expected five args: change meter meter_name meter_value  <path_to_node>";
+			ss << " but found only " << (options.size() + paths.size()) << " arguments. The meter value must be convertible to an integer\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		Meter check(name,0,100); // Check meter name , by creating a meter
+
+		value = options[3];
+		try { boost::lexical_cast< int >( value );}
+		catch ( boost::bad_lexical_cast& ) {
+			ss << "AlterCmd: " << options[0] << " " << options[1] << " " << options[2] << " " << options[3] << " " << paths[0]
+			                                                                                                                << " expected " << value << " to be convertible to an integer\n";
+			throw std::runtime_error( ss.str() );
+		}
+
+		break; }
+
+	case AlterCmd::LABEL: {
+		if (options.size() != 4) {
+			ss << "AlterCmd: change label expected at least five args : change label <label_name> <value> <path_to_node> ";
+			ss << " but found  " << (options.size() + paths.size()) << " arguments. the label value should be quoted\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		value = options[3];
+		Label check(name,value); // Check name , by creating
+		break; }
+
+	case AlterCmd::TRIGGER: {
+		// ECFLOW-137, if the expression contains a leading '/' and *no* spaces,
+		//             then it will get treated as a path and not an option
+		// i.e     change trigger 'expression'    <path_to_node>
+		//         change trigger "/suite/task:a" /path/to/a/node
+		// Note boost program options will remove the quotes around the expression
+		//      hence its difficult to say what is an option and what is a path.
+		//      However since we expect 3 options, work around the problem
+		if (options.size() == 2 && paths.size() == 2) {
+			options.push_back(paths[0]);
+			paths.erase(paths.begin()); // remove first path, since it has been added to options
+		}
+		if (options.size() != 3) {
+			ss << "AlterCmd: change: expected four args : change trigger 'expression' <path_to_node>";
+			ss << " but found " << (options.size() + paths.size()) << " arguments. The trigger expression must be quoted\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+
+		// Parse the expression
+		PartExpression exp(name);
+		string parseErrorMsg;
+		std::auto_ptr<AstTop> ast = exp.parseExpressions( parseErrorMsg );
+		if (!ast.get()) {
+			ss << "AlterCmd: change trigger: Failed to parse expression '" << name << "'.  " << parseErrorMsg << "\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		break; }
+
+	case AlterCmd::COMPLETE: {
+		if (options.size() == 2 && paths.size() == 2) {
+			options.push_back(paths[0]);
+			paths.erase(paths.begin()); // remove first path, since it has been added to options
+		}
+		if (options.size() != 3) {
+			ss << "AlterCmd: change complete: expected four args: change complete 'expression'  <path_to_node> ";
+			ss << " but found " << (options.size() + paths.size()) << " arguments. The expression must be quoted\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+
+		// Parse the expression
+		PartExpression exp(name);
+		string parseErrorMsg;
+		std::auto_ptr<AstTop> ast = exp.parseExpressions( parseErrorMsg );
+		if (!ast.get()) {
+			ss << "AlterCmd: change complete: Failed to parse expression '" << name << "'.  " << parseErrorMsg << "\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		break;}
+
+	case AlterCmd::REPEAT: {
+		// *NOTE* a Node can only have *ONE* repeat, hence no need to provide name
+		if (options.size() != 3) {
+			ss << "AlterCmd: change repeat: expected four arg's : change repeat [ integer | string ] <path_to_node>";
+			ss << " but found only " << (options.size() + paths.size()) << " arguments.\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		break; }
+
+	case AlterCmd::LIMIT_MAX: {
+		if (options.size() != 4) {
+			ss << "AlterCmd: change: limit_max: : expected five arguments : change limit_max <limit_name> <int> <path_to_node>";
+			ss << " but found  " << (options.size() + paths.size()) << " arguments.\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		value = options[3];
+		int limit = 0;
+		try { limit = boost::lexical_cast< int >( value );}
+		catch ( boost::bad_lexical_cast& ) {
+			ss << "AlterCmd: change: limit-max: " << options[0] << " " << options[1] << " " << options[2] << " " << options[3] << " " << paths[0]
+			                                                                                                                                   << " expected " <<  value << " to be convertible to an integer\n";
+			throw std::runtime_error( ss.str() );
+		}
+		Limit check(name,limit); // Check name , by creating
+		break; }
+
+	case AlterCmd::LIMIT_VAL: {
+		if (options.size() != 4) {
+			ss << "AlterCmd: change: limit-value: expected five arguments : change limit_value <limit_name> <int> <path_to_node>";
+			ss << " but found  " << (options.size() + paths.size()) << " arguments.\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		value = options[3];
+		try { boost::lexical_cast< int >( value );}
+		catch ( boost::bad_lexical_cast& ) {
+			ss << "AlterCmd: change: limit_value: " << options[0] << " " << options[1] << " " << options[2] << " " << options[3] << " " << paths[0]
+			                                                                                                                                     << " expected " <<  value << " to be convertible to an integer\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		Limit check(name,10); // Check name, by creating
+		break;}
+
+	case AlterCmd::DEFSTATUS: {
+		if (options.size() != 3) {
+			ss << "AlterCmd: change defstatus expected four args : change defstatus [ queued | complete | unknown | aborted | suspended ] <path_to_node>";
+			ss << " but found  " << (options.size() + paths.size()) << " arguments.\n";
+			ss << dump_args(options,paths) << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+		name = options[2];
+		if (!DState::isValid(name)) {
+			ss << "AlterCmd: " << options[0] << " " << options[1] << " " << options[2] << " " << paths[0]
+			                                                                                           << "an expected " <<  name << " to be a valid state,  i.e one of [ queued | complete | unknown | aborted | suspended ]\n";
+			throw std::runtime_error( ss.str() );
+		}
+		break; }
+
+	case AlterCmd::CHANGE_ATTR_ND:    break;
+	default: break;
+	}
+
+	cmd = Cmd_ptr( new AlterCmd(paths,theAttrType, name, value  ) );
+}
+
+void AlterCmd::create_flag( Cmd_ptr& cmd, const std::vector<std::string>& options, const std::vector<std::string>& paths, bool flag) const
+{
+	// options[0] = set_flag | clear_flag
+	// options[1] = [ force_aborted | user_edit | task_aborted | edit_failed | ecfcmd_failed | no_script | killed | migrated | late | message | complete | queue_limit | task_waiting | locked | zombie ]
+
+	Flag::Type theFlagType = Flag::string_to_flag_type(options[1]);
+	if (theFlagType == Flag::NOT_SET) {
+		std::stringstream ss;
+		ss << "AlterCmd: set/clear_flag: The second argument(" << options[1] << ") must be one of [ ";
+		std::vector<std::string> valid;
+		Flag::valid_flag_type(valid);
+		for(size_t i = 0; i < valid.size(); ++i) { if (i != 0) ss << " | "; ss << valid[i]; }
+		ss << "]\n" <<  AlterCmd::desc();
+		throw std::runtime_error( ss.str() );
+	}
+
+	cmd = Cmd_ptr( new AlterCmd(paths,theFlagType, flag  ) );
+}
+
+std::ostream& operator<<(std::ostream& os, const AlterCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/BeginCmd.cpp b/ecflow_4_0_7/Base/src/cts/BeginCmd.cpp
new file mode 100644
index 0000000..313a0f1
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/BeginCmd.cpp
@@ -0,0 +1,177 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "CtsApi.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+
+BeginCmd::BeginCmd(const std::string& suiteName, bool force)
+: suiteName_(suiteName), force_(force)
+{
+   // The begin command actually requires the suite name without the lead '/'
+   // i.e if we provide /suite --> change to suite
+   if (!suiteName_.empty() && suiteName_[0] == '/') {
+      suiteName_.erase(0,1); // delete first character
+   }
+}
+
+std::ostream& BeginCmd::print(std::ostream& os) const
+{
+   return user_cmd(os,CtsApi::begin(suiteName_,force_));
+}
+
+bool BeginCmd::equals(ClientToServerCmd* rhs) const
+{
+	BeginCmd* the_rhs = dynamic_cast< BeginCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (suiteName_ != the_rhs->suiteName()) return false;
+	if (force_ != the_rhs->force()) return false;
+	return UserCmd::equals(rhs);
+}
+
+STC_Cmd_ptr BeginCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().begin_cmd_++;
+	defs_ptr defs = as->defs();
+
+	// If no suite name begin all suites, else begin the the specific suite
+	if ( suiteName_.empty()) {
+
+		const std::vector<suite_ptr>& suiteVec = defs->suiteVec();
+		size_t theSuiteVecSize = suiteVec.size();
+		if (!force_) {
+			for(size_t s = 0; s < theSuiteVecSize; s++) {
+				/// check_suite_can_begin will throw if suite can't begin
+				defs->check_suite_can_begin(suiteVec[s]);
+			}
+		}
+		else {
+			for(size_t s = 0; s < theSuiteVecSize; s++) {
+				as->zombie_ctrl().add_user_zombies(suiteVec[s]);
+			}
+
+			// Force should *only* be used for test
+			defs->reset_begin();
+		}
+
+		defs->beginAll();
+	}
+	else {
+
+		suite_ptr suite = defs->findSuite(suiteName_);
+		if (!suite.get()) {
+		    std::stringstream ss;
+		    ss << "BeginCmd::doHandleRequest:  Begin failed as suite '"  << suiteName_ << "' is not loaded.\n";
+		    throw std::runtime_error( ss.str() );
+	 	}
+
+		/// check_suite_can_begin will throw if suite can't begin
+ 		if (!force_) defs->check_suite_can_begin(suite);
+		else  {
+		   as->zombie_ctrl().add_user_zombies(suite);
+
+         // Force should *only* be used for test
+		   suite->reset_begin();
+		}
+
+
+ 		defs->beginSuite(suite);
+	}
+
+	// After begin do the first Job submission. This will kick of those
+	// jobs that have no dependencies, or relative time of +00:00
+	return doJobSubmission(as);
+}
+
+const char* BeginCmd::arg() { return CtsApi::beginArg();}
+const char* BeginCmd::desc() {
+	         /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   return
+            "Begin playing the definition in the server.\n"
+            "Expects zero or a single quoted string.\n"
+            "  arg1 = suite-name | Nothing | force\n"
+            "         play the chosen suite, if no arg specified, play all suites, in the definition\n"
+            "         force means reset the begin status on the suites and bypass checks.\n"
+            "         This is only required if suite-name is provide as the first argument\n"
+            "         Using force can cause the creation of zombies\n"
+            "Usage:\n"
+            "--begin                     # will begin all suites\n"
+            "--begin=\"--force\"         # reset and then begin all suites, bypassing any checks. Note: string must be quoted\n"
+            "--begin=\"mySuite\"         # begin playing suite of name 'mySuite'\n"
+            "--begin=\"mySuite --force\" # reset and begin playing suite 'mySuite', bypass check"
+	;
+}
+
+void BeginCmd::addOption(boost::program_options::options_description& desc) const
+{
+	// allow options like
+	// client --begin=suitename       // begin <suitename>
+	// client --begin                 // means begin all suites
+	desc.add_options()( BeginCmd::arg(),po::value< string >()->implicit_value( string("") ), BeginCmd::desc() );
+}
+void BeginCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* ace ) const
+{
+	std::string beginArg = vm[ arg() ].as< std::string > ();
+
+	if (ace->debug()) {
+		cout << "  BeginCmd::create arg = " << beginArg << "\n";
+ 	}
+
+	std::string suiteName;
+	bool force = false;
+
+	if (!beginArg.empty()) {
+		std::vector< std::string > lineTokens;
+		Str::split(beginArg,lineTokens);
+		if (lineTokens.size() == 1) {
+			if (lineTokens[0] == "--force") force = true;
+			else suiteName = lineTokens[0];
+		}
+		else if (lineTokens.size() == 2) {
+			suiteName = lineTokens[0];
+			if (lineTokens[1] != "--force") {
+				std::stringstream ss;
+				ss << "BeginCmd: Expected second argument to be '--force' but found " << lineTokens[1] << "\n";
+				throw std::runtime_error( ss.str() );
+			}
+			force = true;
+		}
+		else {
+			std::stringstream ss;
+			ss << "BeginCmd: Expect zero, one or 2 arguments, but found " << lineTokens.size() << " arguments\n" << BeginCmd::desc() << "\n";
+			throw std::runtime_error( ss.str() );
+		}
+	}
+
+   if (ace->debug()) {
+      std::cout << "  BeginCmd::create suiteName = " << suiteName << "\n";
+      std::cout << "  BeginCmd::create force = " << force << "\n";
+   }
+
+	cmd = Cmd_ptr(new BeginCmd( suiteName, force ));
+}
+
+std::ostream& operator<<(std::ostream& os, const BeginCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/CFileCmd.cpp b/ecflow_4_0_7/Base/src/cts/CFileCmd.cpp
new file mode 100644
index 0000000..9596021
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CFileCmd.cpp
@@ -0,0 +1,309 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #42 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <sstream>
+#include "boost/filesystem/operations.hpp"
+#include <boost/lexical_cast.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "File.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "EcfFile.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+namespace fs = boost::filesystem;
+
+CFileCmd::CFileCmd(const std::string& pathToNode, const std::string& file_type, const std::string& input_max_lines)
+: file_(ECF), pathToNode_(pathToNode), max_lines_(File::MAX_LINES())
+{
+   // std::cout << "CFileCmd::CFileCmd the_max_lines " << the_max_lines << "\n";
+
+   if (file_type == "script") file_ = CFileCmd::ECF;
+   else if (file_type == "job") file_ = CFileCmd::JOB;
+   else if (file_type == "jobout") file_ = CFileCmd::JOBOUT;
+   else if (file_type == "manual") file_ = CFileCmd::MANUAL;
+   else if (file_type == "kill") file_ = CFileCmd::KILL;
+   else if (file_type == "stat") file_ = CFileCmd::STAT;
+   else {
+      std::stringstream ss;
+      ss << "CFileCmd::CFileCmd: Unrecognised file type " << file_type << " expected one of [script | job | jobout | manual | kill | stat] \n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   if (!input_max_lines.empty()){
+      try {
+         // Note: max_lines_ if type size_t, hence we cast to int to check for negative numbers
+         int the_max_lines =  boost::lexical_cast<int>( input_max_lines );
+         if (the_max_lines <= 0)  the_max_lines = File::MAX_LINES();
+         max_lines_ = the_max_lines;
+      }
+      catch ( boost::bad_lexical_cast& e) {
+         std::stringstream ss;
+         ss << "CFileCmd::CFileCmd: The third argument(" << input_max_lines << ") must be convertible to an integer\n";
+         throw std::runtime_error(ss.str());
+      }
+   }
+}
+
+
+std::vector<CFileCmd::File_t>  CFileCmd::fileTypesVec()
+{
+	std::vector<CFileCmd::File_t> vec; vec.reserve(5);
+	vec.push_back(CFileCmd::ECF);
+	vec.push_back(CFileCmd::JOB);
+	vec.push_back(CFileCmd::JOBOUT);
+   vec.push_back(CFileCmd::MANUAL);
+   vec.push_back(CFileCmd::KILL);
+   vec.push_back(CFileCmd::STAT);
+	return vec;
+}
+
+std::string CFileCmd::toString(CFileCmd::File_t ft)
+{
+	switch (ft) {
+		case CFileCmd::ECF:    return "script"; break;
+		case CFileCmd::MANUAL: return "manual"; break;
+		case CFileCmd::JOB:    return "job"; break;
+      case CFileCmd::JOBOUT: return "jobout"; break;
+      case CFileCmd::KILL:   return "kill"; break;
+      case CFileCmd::STAT:   return "stat"; break;
+		default : break;
+	}
+	return "script";
+}
+
+bool CFileCmd::equals(ClientToServerCmd* rhs) const
+{
+	CFileCmd* the_rhs = dynamic_cast<CFileCmd*>(rhs);
+	if (!the_rhs)  return false;
+	if ( file_       != the_rhs->fileType())   { return false; }
+	if ( max_lines_  != the_rhs->max_lines())  { return false; }
+	if ( pathToNode_ != the_rhs->pathToNode()) { return false; }
+	return UserCmd::equals(rhs);
+}
+
+std::ostream& CFileCmd::print(std::ostream& os) const
+{
+	return user_cmd(os,CtsApi::to_string(CtsApi::file(pathToNode_,toString(file_),boost::lexical_cast<std::string>(max_lines_))));
+}
+
+STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
+{
+	// cout << "CFileCmd::doHandleRequest " << toString(file_) << " =======================================\n";
+	switch (file_) {
+		case CFileCmd::ECF:    as->update_stats().file_ecf_++;    break;
+		case CFileCmd::MANUAL: as->update_stats().file_manual_++; break;
+		case CFileCmd::JOB:    as->update_stats().file_job_++;    break;
+      case CFileCmd::JOBOUT: as->update_stats().file_jobout_++; break;
+      case CFileCmd::KILL:   as->update_stats().file_cmdout_++; break;
+      case CFileCmd::STAT:   as->update_stats().file_cmdout_++; break;
+	}
+
+ 	node_ptr node = find_node(as,pathToNode_); // will throw if defs not defined, or node not found
+
+	std::string fileContents;
+	Submittable* submittable = node->isSubmittable();
+	if ( submittable ) {
+
+ 		switch (file_) {
+			case CFileCmd::ECF: {
+ 				EcfFile ecf_file = submittable->locatedEcfFile(); // will throw std::runtime_error for errors
+				ecf_file.script(fileContents);                    // will throw std::runtime_error for errors
+				break;}
+
+			case CFileCmd::MANUAL: {
+				EcfFile ecf_file = submittable->locatedEcfFile(); // will throw std::runtime_error for errors
+ 				ecf_file.manual(fileContents);                    // will throw std::runtime_error for errors
+ 				break;}
+
+			case CFileCmd::JOB: {
+		      std::string ecf_job_file;
+		      submittable->findParentVariableValue(Str::ECF_JOB(), ecf_job_file);
+				if (!File::open(ecf_job_file,fileContents)) {
+					std::stringstream ss;
+					ss << "CFileCmd::doHandleRequest: Failed to open the job file('" << ecf_job_file << "') for task " << pathToNode_;
+					throw std::runtime_error( ss.str() ) ;
+ 				}
+				break;}
+
+			case CFileCmd::JOBOUT: {
+
+			   // ECF_JOBOUT is either constructed from ECF_OUT *OR* ECF_HOME/ECF_NAME.ECF_TRYNO
+			   // See: Submittable.cpp: SubGenVariables::update_generated_variables()
+			   //
+			   // Typically if ECF_OUT is specified, we should only look at that location
+			   // however SMS also looked at the alternate location (and RD relied on this ECFLOW-177 )
+
+				const Variable& ecf_jobout_gen_var = submittable->findGenVariable(Str::ECF_JOBOUT());
+				if (!File::open(ecf_jobout_gen_var.theValue(),fileContents)) {
+
+				   // If that fails as a backup, look under ECF_HOME/ECF_NAME.ECF_TRYNO,   ECFLOW-177 preserve old SMS behaviour
+				   std::string backup_jobout;
+				   submittable->findParentUserVariableValue(Str::ECF_HOME(), backup_jobout);
+				   backup_jobout += submittable->absNodePath();
+				   backup_jobout += ".";
+				   backup_jobout += submittable->tryNo();
+
+				   if ( backup_jobout != ecf_jobout_gen_var.theValue()) {
+				      // Implies ECF_OUT was specified, hence *ALSO* look in ECF_HOME/ECF_NAME.ECF_TRYNO
+				      if (!File::open(backup_jobout,fileContents)) {
+				         std::stringstream ss;
+				         ss << "CFileCmd::doHandleRequest: Failed to open the job-out(ECF_JOBOUT=ECF_OUT/ECF_NAME.ECF_TRYNO) file('"
+				               << ecf_jobout_gen_var.theValue() << "') *AND* at location (ECF_JOBOUT=ECF_HOME/ECF_NAME.ECF_TRYNO)('"
+				               << backup_jobout << "') for task " << pathToNode_;
+				         throw std::runtime_error( ss.str() ) ;
+				      }
+				   }
+				   else {
+				      // ECF_OUT *not* specified implies ECF_JOBOUT = ECF_HOME/ECF_NAME.ECF_TRYNO
+                  std::stringstream ss;
+                  ss << "CFileCmd::doHandleRequest: Failed to open the job-out(ECF_JOBOUT=ECF_HOME/ECF_NAME.ECF_TRYNO) file('"
+                        << ecf_jobout_gen_var.theValue() << "') for task " << pathToNode_;
+                  throw std::runtime_error( ss.str() ) ;
+				   }
+				}
+
+				break; }
+
+         case CFileCmd::KILL: {
+            std::string ecf_job_file;
+            submittable->findParentVariableValue(Str::ECF_JOB(), ecf_job_file);
+            std::string file = ecf_job_file + ".kill";
+            if (!File::open(file,fileContents)) {
+               std::stringstream ss;
+               ss << "CFileCmd::doHandleRequest: Failed to open the kill output file('" << file << "') for task " << pathToNode_;
+               throw std::runtime_error( ss.str() ) ;
+            }
+            break; }
+
+         case CFileCmd::STAT: {
+            std::string ecf_job_file;
+            submittable->findParentVariableValue(Str::ECF_JOB(), ecf_job_file);
+            std::string file = ecf_job_file + ".stat";
+            if (!File::open(file,fileContents)) {
+               std::stringstream ss;
+               ss << "CFileCmd::doHandleRequest: Failed to open the status output file('" << file << "') for task " << pathToNode_;
+               throw std::runtime_error( ss.str() ) ;
+            }
+            break; }
+
+			default : assert(false); break;
+ 		}
+	}
+	else {
+
+		if (file_ == CFileCmd::MANUAL) {
+			// The only valid option for Suite or Family is Manual
+
+		   // First look for .man files in ECF_FILES and then ECF_HOME
+         std::string ecf_files;
+         node->findParentUserVariableValue( Str::ECF_FILES(), ecf_files);
+         if ( !ecf_files.empty() && fs::exists( ecf_files ) && fs::is_directory( ecf_files ) ) {
+
+            std::string manFile = File::backwardSearch( ecf_files, node->absNodePath(), File::MAN_EXTN());
+            if (!manFile.empty()) {
+               EcfFile the_file(node.get(), manFile);
+               the_file.manual(fileContents); // pre-process & extract manual: will throw std::runtime_error for errors
+            }
+         }
+
+         if ( fileContents.empty() ) {
+            // Try under ECF_HOME
+            std::string ecf_home;
+            node->findParentUserVariableValue( Str::ECF_HOME(), ecf_home);
+            if ( !ecf_home.empty() && fs::exists( ecf_home ) && fs::is_directory( ecf_home ) ) {
+
+               std::string manFile = File::backwardSearch( ecf_home, node->absNodePath(), File::MAN_EXTN());
+               EcfFile the_file(node.get(), manFile);
+               the_file.manual(fileContents); // pre-process & extract manual: will throw std::runtime_error for errors
+            }
+            else {
+               std::string errorMsg = "Failed to find the manual for Suite/Family  "; errorMsg += pathToNode_;
+               errorMsg += " ECF_HOME directory does not exist and/or ECF_FILES not defined or directory does not exist.";
+               throw std::runtime_error( errorMsg ) ;
+            }
+         }
+		}
+		else {
+			std::stringstream ss; ss << "Option " << CFileCmd::toString(file_) << " is only valid for tasks. ";
+			throw std::runtime_error( ss.str() ) ;
+  		}
+	}
+
+	/// The file could get very large, hence truncate at the start
+	if (Str::truncate_at_start(fileContents, max_lines_)) {
+		std::stringstream ss;
+		ss << "\n# >>>>>>>> File truncated down to " << max_lines_ << ". Truncated from the start <<<<<<<<<\n";
+		fileContents += ss.str();
+	}
+
+	return PreAllocatedReply::string_cmd(fileContents);
+}
+
+const char* CFileCmd::arg()  { return CtsApi::fileArg();}
+const char* CFileCmd::desc() {
+	        /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   return   "Return the chosen file. Select from [ script<default> | job | jobout | manual | kill | stat ]\n"
+            "By default will return the script.\n"
+            "  arg1 = path to node\n"
+            "  arg2 = (optional) [ script<default> | job | jobout | manual | kill | stat ]\n"
+            "         kill will attempt to return output of ECF_KILL_CMD, i.e the file %ECF_JOB%.kill\n"
+            "         stat will attempt to return output of ECF_STATUS_CMD, i.e the file %ECF_JOB%.stat\n"
+            "  arg3 = (optional) max_lines = 10000 <default>"
+            ;
+}
+
+void CFileCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( CFileCmd::arg(),po::value< vector<string> >()->multitoken(), CFileCmd::desc() );
+}
+void CFileCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* ac) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+
+	if (ac->debug()) dumpVecArgs(CFileCmd::arg(),args);
+
+	if (args.size() < 1 ) {
+		std::stringstream ss;
+		ss << "CFileCmd: At least one arguments expected for File. Found " << args.size() << "\n" << CFileCmd::desc() << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+	std::string pathToNode = args[0];
+
+	std::string file_type = "script";
+	if (args.size() >= 2) {
+	   file_type = args[1];
+	}
+
+	std::string max_lines;
+	if (args.size() == 3) {
+	   max_lines = args[2];
+	}
+
+	cmd = Cmd_ptr( new CFileCmd(pathToNode, file_type, max_lines) );
+}
+
+std::ostream& operator<<(std::ostream& os, const CFileCmd& c) { return c.print(os); }
+
diff --git a/ecflow_4_0_7/Base/src/cts/CSyncCmd.cpp b/ecflow_4_0_7/Base/src/cts/CSyncCmd.cpp
new file mode 100644
index 0000000..2112d4f
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CSyncCmd.cpp
@@ -0,0 +1,156 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "Ecf.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+std::ostream& CSyncCmd::print(std::ostream& os) const
+{
+   /// Note: Be careful how the *debug* output is interpreted, since the:
+   /// client_handle_  > 0  state/modify numbers will be for a set of registered suites,
+   /// client_handle_ == 0  state/modify numbers is global i.e. for all suites.
+   std::stringstream ss;
+   if (api_ == CSyncCmd::NEWS) {
+      ss << CtsApi::to_string(CtsApi::news(client_handle_,client_state_change_no_,client_modify_change_no_));
+      return user_cmd(os,ss.str());
+   }
+
+	if (api_ == CSyncCmd::SYNC) {
+	   ss << CtsApi::to_string(CtsApi::sync(client_handle_,client_state_change_no_,client_modify_change_no_));
+	   return user_cmd(os,ss.str());
+ 	}
+
+	ss <<  CtsApi::sync_full(client_handle_);
+	return user_cmd(os,ss.str());
+}
+
+bool CSyncCmd::equals(ClientToServerCmd* rhs) const
+{
+	CSyncCmd* the_rhs = dynamic_cast< CSyncCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (api_ != the_rhs->api()) return false;
+	if (client_handle_ != the_rhs->client_handle()) return false;
+	if (client_state_change_no_ != the_rhs->client_state_change_no()) return false;
+	if (client_modify_change_no_ != the_rhs->client_modify_change_no()) return false;
+	return UserCmd::equals(rhs);
+}
+
+const char* CSyncCmd::theArg() const
+{
+   if (api_ == CSyncCmd::NEWS) return CtsApi::newsArg();
+   if (api_ == CSyncCmd::SYNC) return CtsApi::syncArg();
+	return CtsApi::sync_full_arg();
+}
+
+int CSyncCmd::timeout() const
+{
+   if (api_ == CSyncCmd::SYNC || api_ == CSyncCmd::SYNC_FULL) {
+      return time_out_for_load_sync_and_get();
+   }
+   return 20; // CSyncCmd::NEWS
+}
+
+void CSyncCmd::do_log() const
+{
+   if (api_ == CSyncCmd::NEWS)  {
+
+      /// Log without adding a new line, to the log file
+      /// The SNewsCmd will append additional debug and then add new line
+      std::stringstream ss;
+      print(ss);                         // Populate the stream with command details:
+      log_no_newline(Log::MSG,ss.str()); // log command without adding newline
+      return;
+   }
+
+   ClientToServerCmd::do_log();
+}
+
+STC_Cmd_ptr CSyncCmd::doHandleRequest(AbstractServer* as) const
+{
+	// If no defs not loaded, SSyncCmd and SNewsCmd do nothing. This is a valid state, hence don't error for this request
+	if (api_ == CSyncCmd::NEWS)  {
+	   as->update_stats().news_++;
+	   return PreAllocatedReply::news_cmd(client_handle_, client_state_change_no_, client_modify_change_no_,as);
+ 	}
+	if (api_ == CSyncCmd::SYNC) {
+      as->update_stats().sync_++;
+		return PreAllocatedReply::sync_cmd(client_handle_, client_state_change_no_, client_modify_change_no_,as);
+	}
+   as->update_stats().sync_++;
+   return PreAllocatedReply::sync_full_cmd(client_handle_,as);
+}
+
+void CSyncCmd::addOption(boost::program_options::options_description& desc) const
+{
+   if (api_ == CSyncCmd::NEWS)  {
+      desc.add_options()(CtsApi::newsArg(),po::value< vector<unsigned int> >()->multitoken(),
+               "Returns true if state of server definition changed.\n"
+               "*Important* for use with c++/python interface only.\n"
+               "Requires Given a client handle, change and modify number determine if server changed since last call\n"
+               "This relies on user calling sync after news to update the locally stored modify and change numbers.\n"
+               "These numbers are then used in the next call to news."
+      );
+      return;
+   }
+
+   if (api_ == CSyncCmd::SYNC)  {
+      desc.add_options()(CtsApi::syncArg(),po::value< vector<unsigned int> >()->multitoken(),
+               "Incrementally synchronise the local definition with the one in the server.\n"
+               "*Important* for use with c++/python interface only.\n"
+               "Preference should be given to this method as only the changes are returned.\n"
+               "This reduces the network bandwidth required to keep in sync with the server\n"
+               "Requires a client handle, change and modify number, to get the incremental changes from server.\n"
+               "The change in server state is then and merged with the client definition."
+      );
+      return;
+   }
+
+   desc.add_options()(CtsApi::sync_full_arg(),po::value<  unsigned int >(),
+            "Returns the full definition from the server.\n"
+            "*Important* for use with c++/python interface only.\n"
+            "Requires a client_handle. The returned definition is stored on the client."
+    );
+}
+
+void CSyncCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv*  ac ) const
+{
+	if (ac->debug()) cout << "CSyncCmd::create api = '" << api_ << "'.\n";
+
+	if (api_ == CSyncCmd::NEWS || api_ == CSyncCmd::SYNC){
+	   vector<unsigned int> args = vm[ theArg() ].as< vector<unsigned int> >();
+	   if (args.size() != 3) throw std::runtime_error("CSyncCmd::create(SYNC/NEWS) expects 3 integer arguments, Client handle, state change number, and modify change number");
+	   unsigned int client_handle    = args[0];
+	   unsigned int state_change_no  = args[1];
+	   unsigned int modify_change_no = args[2];
+	   cmd = Cmd_ptr(new CSyncCmd( api_,client_handle,state_change_no,modify_change_no));
+	   return;
+	}
+
+   unsigned int client_handle = vm[ theArg() ].as< unsigned int >();
+   cmd = Cmd_ptr(new CSyncCmd(client_handle)); // FULL_SYNC
+}
+
+std::ostream& operator<<(std::ostream& os, const CSyncCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/CheckPtCmd.cpp b/ecflow_4_0_7/Base/src/cts/CheckPtCmd.cpp
new file mode 100644
index 0000000..9050681
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CheckPtCmd.cpp
@@ -0,0 +1,202 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/lexical_cast.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+std::ostream& CheckPtCmd::print(std::ostream& os) const
+{
+   return user_cmd(os,CtsApi::checkPtDefs(mode_,check_pt_interval_,check_pt_save_time_alarm_));
+}
+
+bool CheckPtCmd::equals(ClientToServerCmd* rhs) const
+{
+   CheckPtCmd* the_rhs = dynamic_cast< CheckPtCmd* > ( rhs );
+   if ( !the_rhs ) return false;
+   if (mode_ != the_rhs->mode()) return false;
+   if (check_pt_interval_ != the_rhs->check_pt_interval()) return false;
+   if (check_pt_save_time_alarm_ != the_rhs->check_pt_save_time_alarm()) return false;
+   return UserCmd::equals(rhs);
+}
+
+bool CheckPtCmd::isWrite() const
+{
+   if (mode_ != ecf::CheckPt::UNDEFINED) return true;
+   if (check_pt_interval_ != 0) return true;
+   if (check_pt_save_time_alarm_ != 0) return true;
+   return false;
+}
+
+const char* CheckPtCmd::theArg() const
+{
+   return CtsApi::checkPtDefsArg();
+}
+
+STC_Cmd_ptr CheckPtCmd::doHandleRequest(AbstractServer* as) const
+{
+   // Placed here rather than in server. Since we want to record explicit request to check pt
+   // The update_stats() is used to record the number of requests per second, hence we do not
+   // want to skew this, and hence we ignore implicit request's via signal handling,
+   // or when server terminates( does implicit check pt also)
+   as->update_stats().checkpt_++;
+   as->checkPtDefs(mode_,check_pt_interval_,check_pt_save_time_alarm_);
+   return PreAllocatedReply::ok_cmd();
+}
+
+static const char* arg_desc()
+{
+            /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+   return
+            "Forces the definition file in the server to be written to disk *or* allow mode,\n"
+            "interval and alarm to be changed.\n"
+            "Whenever the check pt file is written to disk, it is measured.\n"
+            "If the time to save to disk is greater than the default of 30 seconds,\n"
+            "then an alarm is raised. This can be seen in the GUI as a late flag on the server.\n"
+            "Once the late flag has been set it will need to manually cleared in the GUI\n"
+            "or by using --alter functionality\n"
+            "Note excessive save times can interfere with job scheduling.\n"
+            "The alarm threshold can be changed. See below.\n"
+              "   arg1 = (optional) mode [ never | on_time | on_time:<integer> | always | <integer>]\n"
+            "     never     : Never check point the definition in the server\n"
+            "     on_time   : Turn on automatic check pointing at interval stored on server\n"
+            "     on_time<integer> : Turn on automatic check point, with the specified interval in seconds\n"
+            "     alarm<integer>   : Modify the alarm notification time for check pt saving to disk\n"
+            "     always    : Check point at any change in node tree, *NOT* recommended for large definitions\n"
+            "     <integer> : This specifies the interval in seconds when server should automatically check pt.\n"
+            "                 This will only take effect of mode is on_time/CHECK_ON_TIME\n"
+            "                 Should ideally be a value greater than 60 seconds, default is 120 seconds\n"
+            "Usage:\n"
+            "  --check_pt\n"
+            "    Immediately check point the definition held in the server\n"
+            "  --check_pt never\n"
+            "    Switch off check pointing\n"
+            "  --check_pt on_time\n"
+            "    Start automatic check pointing at the interval stored in the server\n"
+            "  --check_pt 180\n"
+            "    Change the check pt interval to 180 seconds\n"
+            "  --check_pt on_time:90\n"
+            "    Change mode and interval, to automatic check pointing every 90 seconds\n"
+            "  --check_pt alarm:35\n"
+            "    Change the alarm time for check pt saves. i.e if saving the check pt takes longer than 35 seconds\n"
+            "    set the late flag on the server."
+            ;
+}
+
+void CheckPtCmd::addOption(boost::program_options::options_description& desc) const
+{
+   desc.add_options()(CtsApi::checkPtDefsArg(),po::value< string >()->implicit_value( string("") ),arg_desc());
+}
+
+static int parse_check_pt_interval( const std::string& the_arg)
+{
+   int check_pt_interval = 0;
+   try { check_pt_interval = boost::lexical_cast<int>(the_arg); }
+   catch (...) {
+      std::stringstream ss;
+      ss << "check_pt: Illegal argument(" << the_arg << "), expected [ never | on_time | on_time:<integer> | always | <integer>]\n" << arg_desc();
+      throw std::runtime_error(ss.str());
+   }
+   if (check_pt_interval <= 0) {
+       std::stringstream ss;
+       ss << "check_pt: interval(" << check_pt_interval << ") must be greater than zero :\n" << arg_desc();
+       throw std::runtime_error(ss.str());
+   }
+   return check_pt_interval;
+}
+
+static int parse_check_pt_alarm_time( const std::string& the_arg, int colon_pos)
+{
+   std::string alarm_time = the_arg.substr(colon_pos+1);
+
+   int check_pt_alarm_time = 0;
+   try { check_pt_alarm_time = boost::lexical_cast<int>(alarm_time); }
+   catch (...) {
+      std::stringstream ss;
+      ss << "check_pt: Illegal argument(" << the_arg << "), expected [ never | on_time | on_time:<integer> | alarm::integer> | always | <integer>]\n" << arg_desc();
+      throw std::runtime_error(ss.str());
+   }
+   if (check_pt_alarm_time <= 0) {
+       std::stringstream ss;
+       ss << "check_pt: alarm time(" << check_pt_alarm_time << ") must be greater than zero :\n" << arg_desc();
+       throw std::runtime_error(ss.str());
+   }
+   return check_pt_alarm_time;
+}
+
+
+void CheckPtCmd::create(    Cmd_ptr& cmd,
+         boost::program_options::variables_map& vm,
+         AbstractClientEnv*  ace ) const
+{
+   if (ace->debug()) cout << "CheckPtCmd::create\n";
+
+   std::string the_arg = vm[ theArg() ].as< std::string > ();
+
+   if (ace->debug())  cout << "  CheckPtCmd::create arg = " << the_arg << "\n";
+
+   ecf::CheckPt::Mode m = ecf::CheckPt::UNDEFINED;
+   int check_pt_interval = 0;
+   int check_pt_save_time_alarm = 0;
+
+   if (!the_arg.empty()) {
+      size_t colon_pos = the_arg.find(":");
+      if (colon_pos != std::string::npos) {
+         // could be mode:interval or alarm:integer
+         if (the_arg.find("alarm") != std::string::npos) {
+            check_pt_save_time_alarm = parse_check_pt_alarm_time(the_arg,colon_pos);
+         }
+         else {
+            std::string mode = the_arg.substr(0,colon_pos);
+            std::string interval = the_arg.substr(colon_pos+1);
+
+            if (mode == "never")        m = ecf::CheckPt::NEVER;
+            else if (mode == "on_time") m = ecf::CheckPt::ON_TIME;
+            else if (mode == "always")  m = ecf::CheckPt::ALWAYS;
+            else {
+               std::stringstream ss;
+               ss << "check_pt: Illegal argument(" << the_arg << "), expected [ never | on_time | on_time:<integer> | alarm:<integer> | always | <integer>]\n" << arg_desc();
+               throw std::runtime_error(ss.str());
+            }
+            check_pt_interval = parse_check_pt_interval(interval);
+         }
+      }
+      else {
+         if (the_arg == "never")        m = ecf::CheckPt::NEVER;
+         else if (the_arg == "on_time") m = ecf::CheckPt::ON_TIME;
+         else if (the_arg == "always")  m = ecf::CheckPt::ALWAYS;
+         else {
+            check_pt_interval = parse_check_pt_interval(the_arg);
+         }
+      }
+   }
+
+   // testing client interface
+   if (ace->under_test())  return;
+
+   if (ace->debug())  cout << "  CheckPtCmd::create mode = " << m << " check_pt_interval = " << check_pt_interval << "\n";
+
+   cmd = Cmd_ptr(new CheckPtCmd(m,check_pt_interval,check_pt_save_time_alarm));
+}
+
+std::ostream& operator<<(std::ostream& os, const CheckPtCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/ClientHandleCmd.cpp b/ecflow_4_0_7/Base/src/cts/ClientHandleCmd.cpp
new file mode 100644
index 0000000..1603f06
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ClientHandleCmd.cpp
@@ -0,0 +1,336 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #31 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/lexical_cast.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "Ecf.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+/// *****************************************************************************
+/// Note: The Client Handle commands, change the server,
+///       However the changes cant really be considered as incremental
+///       Hence for all handle command, we will do a FULL SYNC
+///       Relying on the modify_change_no is to CRUDE, as it affects all handles
+///       Instead we will use a simple flag to indicate that a FULL sync is required
+/// *****************************************************************************
+
+std::ostream& ClientHandleCmd::print(std::ostream& os) const
+{
+	switch (api_) {
+		case ClientHandleCmd::REGISTER: return user_cmd(os,CtsApi::to_string(CtsApi::ch_register(auto_add_new_suites_,suites_))); break;
+      case ClientHandleCmd::DROP:     return user_cmd(os,CtsApi::ch_drop(client_handle_)); break;
+      case ClientHandleCmd::DROP_USER:{
+         if (drop_user_.empty()) return user_cmd(os,CtsApi::ch_drop_user(user()));
+         return user_cmd(os,CtsApi::ch_drop_user(drop_user_));
+         break;
+      }
+		case ClientHandleCmd::ADD:      return user_cmd(os,CtsApi::to_string(CtsApi::ch_add(client_handle_,suites_))); break;
+		case ClientHandleCmd::REMOVE:   return user_cmd(os,CtsApi::to_string(CtsApi::ch_remove(client_handle_,suites_))); break;
+      case ClientHandleCmd::AUTO_ADD: return user_cmd(os,CtsApi::to_string(CtsApi::ch_auto_add(client_handle_,auto_add_new_suites_))); break;
+      case ClientHandleCmd::SUITES:     return user_cmd(os,CtsApi::ch_suites()); break;
+		default: assert(false); break;
+ 	}
+  	return os;
+}
+
+bool ClientHandleCmd::equals(ClientToServerCmd* rhs) const
+{
+	ClientHandleCmd* the_rhs = dynamic_cast< ClientHandleCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+   if (api_ != the_rhs->api()) return false;
+   if (drop_user_ != the_rhs->drop_user()) return false;
+ 	return UserCmd::equals(rhs);
+}
+
+const char* ClientHandleCmd::theArg() const
+{
+	switch (api_) {
+		case ClientHandleCmd::REGISTER:  return CtsApi::ch_register_arg(); break;
+      case ClientHandleCmd::DROP:      return CtsApi::ch_drop_arg(); break;
+      case ClientHandleCmd::DROP_USER: return CtsApi::ch_drop_user_arg(); break;
+		case ClientHandleCmd::ADD:       return CtsApi::ch_add_arg(); break;
+		case ClientHandleCmd::REMOVE:    return CtsApi::ch_remove_arg(); break;
+      case ClientHandleCmd::AUTO_ADD:  return CtsApi::ch_auto_add_arg(); break;
+      case ClientHandleCmd::SUITES:    return CtsApi::ch_suites_arg(); break;
+ 	}
+	assert(false);
+	return NULL;
+}
+
+bool ClientHandleCmd::isWrite() const {
+   if (api_ == ClientHandleCmd::SUITES) return false;
+   return true;
+}
+
+STC_Cmd_ptr ClientHandleCmd::doHandleRequest(AbstractServer* as) const
+{
+   as->update_stats().ch_cmd_++;
+
+	switch (api_) {
+		case ClientHandleCmd::REGISTER:  {
+
+ 			unsigned int client_handle = as->defs()->client_suite_mgr().create_client_suite(auto_add_new_suites_,suites_,user());
+//#ifdef DEBUG
+// 	      LOG(Log::DBG,as->defs()->client_suite_mgr().dump_max_change_no());
+//#endif
+			// return the handle to the client
+		 	return PreAllocatedReply::client_handle_cmd(client_handle) ;
+		}
+
+		case ClientHandleCmd::DROP: {
+		   as->defs()->client_suite_mgr().remove_client_suite(client_handle_); // will throw if handle not found
+
+		   // return the 0 handle to the client. The client stores the handle locally. Reset to zero.
+		   return PreAllocatedReply::client_handle_cmd(0) ;
+		}
+
+		case ClientHandleCmd::DROP_USER: {
+		   // will throw if no users handles dropped
+		   if (drop_user_.empty()) as->defs()->client_suite_mgr().remove_client_suites(user());
+		   else                    as->defs()->client_suite_mgr().remove_client_suites(drop_user_);
+
+		   if (drop_user_.empty() || drop_user_ == user()) {
+		      // return the 0 handle to the client. The client stores the handle locally. Reset to zero.
+		      return PreAllocatedReply::client_handle_cmd(0) ;
+		   }
+		   break;
+		}
+
+		case ClientHandleCmd::ADD:  {
+		   as->defs()->client_suite_mgr().add_suites(client_handle_,suites_);  // will throw if handle not found
+ 			break;
+		}
+
+		case ClientHandleCmd::REMOVE:  {
+		   as->defs()->client_suite_mgr().remove_suites(client_handle_,suites_);  // will throw if handle not found
+  			break;
+		}
+
+		case ClientHandleCmd::AUTO_ADD: {
+		   as->defs()->client_suite_mgr().auto_add_new_suites(client_handle_,auto_add_new_suites_);  // will throw if handle not found
+			break;
+		}
+
+      case ClientHandleCmd::SUITES: {
+         return PreAllocatedReply::client_handle_suites_cmd(as) ;
+         break;
+      }
+
+		default: assert(false); break;
+
+ 	}
+	return PreAllocatedReply::ok_cmd();
+}
+
+void ClientHandleCmd::addOption(boost::program_options::options_description& desc) const
+{
+	switch (api_) {
+		case ClientHandleCmd::REGISTER:{
+			desc.add_options()(CtsApi::ch_register_arg(), po::value< vector<string> >()->multitoken(),
+			         "Register interest in a set of suites.\n"
+			         "If a definition has lots of suites, but the client. is only interested in a small subset,\n"
+			         "Then using this command can reduce network bandwidth and synchronisation will be quicker.\n"
+			         "This command will create a client handle, which must be used for any other changes.\n"
+			         "The newly created handle can be shown with the --suites command\n"
+			         "Deleted suites will stay registered, and must be explicitly removed/dropped.\n"
+			         "Note: Suites can be registered before they are loaded into the server\n"
+			         "This option affects news() and sync() commands\n"
+			         "   arg1 = true | false           # true means add new suites to my list, when they are created\n"
+			         "   arg2 = names                  # should be a list of suite names, names not in the definition are ignored\n"
+			         "Usage:\n"
+			         "   --ch_register=true s1 s2 s3   # register interest in suites s1,s2,s3 and any new suites\n"
+			         "   --ch_register=false s1 s2 s3  # register interest in suites s1,s2,s3 only\n"
+			         "   --ch_register=false           # register handle, suites will be added later on\n"
+			         "To list all suites and handles use --suites"
+ 			);
+			break;
+		}
+
+		case ClientHandleCmd::DROP:{
+			desc.add_options()(CtsApi::ch_drop_arg(), po::value< int >(),
+			         "Drop/de-register the client handle.\n"
+			         "Un-used handle should be dropped otherwise they will stay, in the server.\n"
+			         "   arg1 = handle(integer)  # The handle must be an integer that is > 0\n"
+			         "Usage:\n"
+			         "   --ch_drop=10            # drop the client handle 10\n"
+			         "An error is returned if the handle had not previously been registered\n"
+			         "The handle stored on the local client is set to zero\n"
+			         "To list all suites and handles use --suites"
+ 			);
+			break;
+		}
+
+      case ClientHandleCmd::DROP_USER:{
+         desc.add_options()(CtsApi::ch_drop_user_arg(), po::value<std::string >()->implicit_value( string("")),
+                  "Drop/de-register all handles associated with the given user.\n"
+                  "If no user provided will drop for current user. Client must ensure un-used handle are dropped\n"
+                  "otherwise they will stay, in the server.\n"
+                  "   arg1 = user           # The user to be drooped, if left empty drop current user \n"
+                  "Usage:\n"
+                  "   --ch_drop_user=ma0    # drop all handles associated with user ma0\n"
+                  "   --ch_drop_user        # drop all handles associated with current user\n"
+                  "An error is returned if no registered handles\n"
+                  "To list all suites and handles use --suites"
+         );
+         break;
+      }
+
+		case ClientHandleCmd::ADD:{
+			desc.add_options()( CtsApi::ch_add_arg(), po::value< vector<string> >()->multitoken(),
+					"Add a set of suites, to an existing handle.\n"
+					"   arg1 = handle(integer)  # The handle must be an integer that is > 0\n"
+ 					"   arg2 = names            # should be a list of suite names, names not in the definition are ignored\n"
+					"Usage:\n"
+					"   --ch_add=10 s2 s3 s4    # add suites s2 s3,s4 to  handle 10\n"
+					"An error is returned if the handle had not previously been registered\n"
+					"The handle is created with --ch_register command\n"
+					"To list all suites and handles use --suites"
+			);
+			break;
+		}
+
+		case ClientHandleCmd::REMOVE:{
+			desc.add_options()( CtsApi::ch_remove_arg(), po::value< vector<string> >()->multitoken(),
+					"Remove a set of suites, from an existing handle.\n"
+					"   arg1 = handle(integer)   # The handle must be an integer that is > 0\n"
+					"   arg2 = names             # should be a list of suite names, names not in the definition are ignored\n"
+					"Usage:\n"
+					"   --ch_rem=10 s2 s3 s4     # remove suites s2 s3,s4 from handle 10\n"
+					"The handle is created with --ch_register command\n"
+					"To list all suites and handles use --suites"
+			);
+ 			break;
+		}
+
+		case ClientHandleCmd::AUTO_ADD: {
+			desc.add_options()( CtsApi::ch_auto_add_arg(), po::value< vector<string> >()->multitoken(),
+					"Change an existing handle so that new suites can be added automatically.\n"
+					"   arg1 = handle(integer)  # The handle must be an integer that is > 0\n"
+					"   arg2 = true | false     # true means add new suites to my list, when they are created\n"
+					"Usage:\n"
+					" --ch_auto_add=10 true     # modify handle 10 so that new suites, get added automatically to it\n"
+					" --ch_auto_add=10 false    # modify handle 10 so that no new suites are added\n"
+					"The handle is created with --ch_register command\n"
+					"To list all suites and handles use --suites"
+			);
+			break;
+		}
+
+      case ClientHandleCmd::SUITES:{
+         desc.add_options()(CtsApi::ch_suites_arg(),
+                  "Shows all the client handles, and the suites they reference"
+          );
+         break;
+      }
+		default: assert(false); break;
+ 	}
+}
+
+void ClientHandleCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv*  ac ) const
+{
+	if (ac->debug()) cout << "ClientHandleCmd::create api = '" << api_ << "'.\n";
+
+	switch (api_) {
+
+		case ClientHandleCmd::REGISTER:  {
+			vector<string> args = vm[  theArg() ].as< vector<string> >();
+			// args can be empty, otherwise first arg must be bool, true or false, subsequent args represent suite names
+			bool auto_add_new_suites = false;
+			std::vector<std::string> suite_names; suite_names.reserve( args.size() );
+			if (!args.empty()) {
+				if (args[0] == "true") auto_add_new_suites = true;
+				else if (args[0] == "false") auto_add_new_suites = false;
+				else throw std::runtime_error("ClientHandleCmd::create: First argument should be true | false. See help");
+				for(size_t i = 1; i < args.size(); i++) { suite_names.push_back( args[i] ); }
+			}
+		 	cmd = Cmd_ptr(new ClientHandleCmd( suite_names, auto_add_new_suites ));
+			break;
+		}
+
+ 		case ClientHandleCmd::DROP:  {
+			int client_handle = vm[  theArg() ].as< int >();
+			if ( 0 == client_handle) throw std::runtime_error("ClientHandleCmd::create: handles must have a value > 0");
+		 	cmd = Cmd_ptr(new ClientHandleCmd( client_handle ));
+ 			break;
+ 		}
+
+      case ClientHandleCmd::DROP_USER:  {
+         std::string the_user_to_drop = vm[  theArg() ].as< std::string >();
+         cmd = Cmd_ptr(new ClientHandleCmd( the_user_to_drop ));
+         break;
+      }
+
+		case ClientHandleCmd::ADD:   {
+			vector<string> args = vm[  theArg() ].as< vector<string> >();
+ 			if (args.size() < 2) throw std::runtime_error("To few arguments. First arg should be a integer handle, then a list of suite names. See help");
+ 			int client_handle = 0;
+ 			try { client_handle = boost::lexical_cast<int>( args[0]); }
+ 			catch (std::exception& ) { throw std::runtime_error("The first argument must be an integer. See help"); }
+			if (0 == client_handle) throw std::runtime_error("ClientHandleCmd::create: handles must have a value > 0");
+ 			std::vector<std::string> suite_names; suite_names.reserve( args.size() );
+			for(size_t i = 1; i < args.size(); i++) { suite_names.push_back( args[i] ); }
+		 	cmd = Cmd_ptr(new ClientHandleCmd(client_handle, suite_names, ClientHandleCmd::ADD ));
+			break;
+		}
+
+		case ClientHandleCmd::REMOVE:  {
+			vector<string> args = vm[  theArg() ].as< vector<string> >();
+ 			if (args.size() < 2) throw std::runtime_error("To few arguments. First arg should be a integer handle, then a list of suite names. See help");
+ 			int client_handle = 0;
+ 			try { client_handle = boost::lexical_cast<int>( args[0]); }
+ 			catch (std::exception& ) { throw std::runtime_error("ClientHandleCmd::create: The first argument must be an integer. See help"); }
+			if ( 0 == client_handle ) throw std::runtime_error("ClientHandleCmd::create: handles must have a value > 0");
+ 			std::vector<std::string> suite_names; suite_names.reserve( args.size() );
+			for(size_t i = 1; i < args.size(); i++) { suite_names.push_back( args[i] ); }
+		 	cmd = Cmd_ptr(new ClientHandleCmd(client_handle, suite_names, ClientHandleCmd::REMOVE ));
+			break;
+		}
+
+ 		case ClientHandleCmd::AUTO_ADD:  {
+			vector<string> args = vm[  theArg() ].as< vector<string> >();
+ 			if (args.size() != 2) throw std::runtime_error("Two argument expected. First arg should be a integer handle, second should be true or false. See help");
+ 			int client_handle = 0;
+ 			try { client_handle = boost::lexical_cast<int>( args[0]); }
+ 			catch (std::exception& ) { throw std::runtime_error("ClientHandleCmd::create: The first argument must be an integer. See help"); }
+			if ( 0 == client_handle ) throw std::runtime_error("ClientHandleCmd::create: handles must have a value > 0");
+			bool auto_add_new_suites =  false;
+			if (args[1] == "true") auto_add_new_suites = true;
+			else if (args[1] == "false") auto_add_new_suites = false;
+			else throw std::runtime_error("ClientHandleCmd::create: First argument should be true | false. See help");
+		 	cmd = Cmd_ptr(new ClientHandleCmd(client_handle, auto_add_new_suites ));
+ 			break;
+ 		}
+
+      case ClientHandleCmd::SUITES:  {
+         cmd = Cmd_ptr(new ClientHandleCmd( ClientHandleCmd::SUITES ));
+         break;
+      }
+
+		default: assert(false); break;
+ 	}
+}
+
+std::ostream& operator<<(std::ostream& os, const ClientHandleCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/ClientToServerCmd.cpp b/ecflow_4_0_7/Base/src/cts/ClientToServerCmd.cpp
new file mode 100644
index 0000000..a436142
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ClientToServerCmd.cpp
@@ -0,0 +1,194 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #67 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <sstream>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "AbstractServer.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+#include "CmdContext.hpp"
+#include "EditHistoryMgr.hpp"
+
+using namespace std;
+using namespace boost;
+using namespace ecf;
+
+//#define DEBUG_INVARIANTS 1
+
+ClientToServerCmd::~ClientToServerCmd(){}
+
+STC_Cmd_ptr ClientToServerCmd::handleRequest(AbstractServer* as) const
+{
+   // Allow creating of new time stamp, when *not* in a command. i.e during node tree traversal in server
+   CmdContext cmdContext;
+
+   // Create the log time stamp once for a given request
+   if (Log::instance()) Log::instance()->cache_time_stamp();
+
+   // LOG the command, *BEFORE* invoking it. (i.e in case server hangs/crashes)
+   // Allow override in the rare cases, where we want to output additional debug
+   do_log();
+
+#ifdef DEBUG_INVARIANTS
+   LOG_ASSERT( as->defs() , "ClientToServerCmd::handleRequest: Start:  No defs? ");
+   std::string errmsg;
+   if (!as->defs()->checkInvariants(errmsg)) {
+      LOG(Log::ERR,"ClientToServerCmd::handleRequest: PreCondition: Failed invariant checking:" << errmsg);
+   }
+#endif
+
+
+   STC_Cmd_ptr halted;
+   if (! authenticate(as,halted)) {
+      assert (halted.get());
+      return halted;
+   }
+
+   // mark edited nodes, with edit history
+   EditHistoryMgr edit_history_mgr(this,as);
+
+   // Handle the request, and return the reply back to the client
+   STC_Cmd_ptr server_to_client_ptr = doHandleRequest(as);
+   if ( isWrite() && server_to_client_ptr->ok()) {
+
+      // This can end up, check pointing the defs file
+      as->nodeTreeStateChanged();
+   }
+
+#ifdef DEBUG_INVARIANTS
+   LOG_ASSERT( as->defs() , "ClientToServerCmd::handleRequest: End:  No defs? ");
+   std::string errmsg;
+   if (!as->defs()->checkInvariants(errmsg)) {
+      LOG(Log::ERR,"ClientToServerCmd::handleRequest: PostCondition: Failed invariant checking:" << errmsg);
+   }
+#endif
+
+   return server_to_client_ptr;
+}
+
+void ClientToServerCmd::do_log() const
+{
+   std::stringstream ss;
+   print(ss);                 // Populate the stream with command details:
+   log(Log::MSG,ss.str());    // will automatically add end of line
+}
+
+STC_Cmd_ptr ClientToServerCmd::doJobSubmission(AbstractServer* as)
+{
+   // This function could be called at the end of *USER* command that can change state.
+   //
+   // We could have other tasks/jobs dependent on the state change. i.e end of time series
+   // This will traverse the node tree and resolve dependencies and may force
+   // Other jobs to be generated, due to the state change.
+   // However *** errors in job submission ***, should *NOT* typically abort the command.
+   // Since we will typically just set task to aborted state
+
+   // This job generation will timeout if job generation takes longer than next poll time.
+   as->traverse_node_tree_and_job_generate(Calendar::second_clock_time(), true /* user cmd context */);
+
+   return PreAllocatedReply::ok_cmd();
+}
+
+node_ptr ClientToServerCmd::find_node(AbstractServer* as, const std::string& absNodepath) const
+{
+   node_ptr theNode =  as->defs()->findAbsNode(absNodepath);
+   if ( !theNode.get() ) {
+
+      std::stringstream ss;
+      print(ss);
+
+      std::string errorMsg = "Can not find node at path '";
+      errorMsg += absNodepath;
+      errorMsg += "' ";
+      errorMsg += ss.str();
+      errorMsg += " failed";
+      throw std::runtime_error( errorMsg) ;
+   }
+   return theNode;
+}
+
+
+void ClientToServerCmd::dumpVecArgs(const char* argOption, const std::vector<std::string>& args) {
+   cout << argOption;
+   for(size_t i= 0; i < args.size(); i++)  { cout << " args[" << i << "]='" << args[i] << "'";} cout << "\n";
+}
+
+node_ptr ClientToServerCmd::find_node_for_edit(AbstractServer* as, const std::string& absNodepath) const
+{
+   node_ptr theNode = find_node(as, absNodepath);
+   add_node_for_edit_history(theNode);
+   return theNode;
+}
+
+node_ptr ClientToServerCmd::find_node_for_edit_no_throw(AbstractServer* as, const std::string& absNodepath) const
+{
+   node_ptr theNode = as->defs()->findAbsNode(absNodepath);
+   add_node_for_edit_history(theNode);
+   return theNode;
+}
+
+void ClientToServerCmd::add_node_for_edit_history(AbstractServer* as,const std::string& absNodepath) const
+{
+    add_node_for_edit_history(as->defs()->findAbsNode(absNodepath));
+}
+
+void ClientToServerCmd::add_node_for_edit_history(node_ptr the_node) const
+{
+   if (the_node.get()) edit_history_nodes_.push_back(the_node);
+}
+
+BOOST_CLASS_EXPORT_IMPLEMENT(ServerVersionCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(CtsCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(CSyncCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(ClientHandleCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(CtsNodeCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(PathsCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(CheckPtCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(LoadDefsCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(LogCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(LogMessageCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(BeginCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(ZombieCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(InitCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(EventCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(MeterCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(LabelCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(AbortCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(CtsWaitCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(CompleteCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(RequeueNodeCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(OrderNodeCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(RunNodeCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(ReplaceNodeCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(ForceCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(FreeDepCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(CFileCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(EditScriptCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(PlugCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(AlterCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(MoveCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(GroupCTSCmd)
+BOOST_CLASS_EXPORT_IMPLEMENT(ShowCmd)
diff --git a/ecflow_4_0_7/Base/src/cts/ClientToServerCmd.hpp b/ecflow_4_0_7/Base/src/cts/ClientToServerCmd.hpp
new file mode 100644
index 0000000..5cbb820
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ClientToServerCmd.hpp
@@ -0,0 +1,1828 @@
+#ifndef CLIENT_TO_SERVER_CMD_HPP_
+#define CLIENT_TO_SERVER_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Cmd
+// Author      : Avi
+// Revision    : $Revision: #143 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <vector>
+
+#include <boost/program_options.hpp>
+#include <boost/serialization/base_object.hpp>      // base class serialization
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/assume_abstract.hpp>
+#include <boost/serialization/shared_ptr.hpp>
+#include <boost/serialization/export.hpp>   // explicit code for exports (place last) , needed for BOOST_CLASS_EXPORT
+
+#include "PrintStyle.hpp"
+#include "Cmd.hpp"
+#include "NodeFwd.hpp"
+#include "NOrder.hpp"
+#include "Zombie.hpp"
+#include "Flag.hpp"
+#include "Child.hpp"
+#include "CheckPt.hpp"
+#include "PreAllocatedReply.hpp"
+
+#if defined(_AIX) && !defined(DEBUG)
+// Required for MoveCmd for release mode of v11.1 compiler
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#endif
+
+class AbstractServer;
+class AbstractClientEnv;
+
+///////////////////////////////////////////////////////////////////////////////////
+// Client->Server cmd's
+///////////////////////////////////////////////////////////////////////////////////
+class ClientToServerCmd  {
+public:
+   virtual ~ClientToServerCmd();
+
+   virtual std::ostream& print(std::ostream& os) const = 0;
+   virtual bool equals(ClientToServerCmd* rhs) const = 0;
+
+   /// Called by the _server_ to service the client depending on the Command
+   /// The server will pass itself down via the AbstractServer
+   /// The returned Server to Client  command is sent back to the client
+   /// Uses template pattern, it first authenticates request and then calls
+   /// doHandleRequest. This function can throw exceptions. std::runtime_error
+   STC_Cmd_ptr handleRequest(AbstractServer*) const;
+
+   /// Returns true if handleRequest is testable. Only used in TEST
+   virtual bool handleRequestIsTestable() const { return true ;}
+
+   /// How long in seconds the client to attempt to send request and get a reply back
+   /// before the request fails. This timeout affects the wait for the outward request
+   /// and inward reply.
+   ///
+   /// The timeout feature allow the client to fail gracefully in the case
+   /// where the server has died/crashed. The timeout will ensure the socket is closed.
+   /// allowing the server to be restarted without getting the address is use error.
+   ///
+   /// NOTE: We also have a timeout in ClientInvoker/ClientEnvironment, *that* is different,
+   ///       as that applies to CHILD/task commands, and control how long we continue
+   ///       to iterate over the hosts files
+   virtual int timeout() const { return 60; }
+
+   /// A command can be read only command or write only command
+   /// A read only command will not change the state of the suites in the server
+   /// A write only command can modify the statue of suite in the server
+   /// Used by the server for authentication since only write only users are allowed to edit.
+   virtual bool isWrite() const { return false; /* returning false means read only */ }
+
+   /// This Must be called for client->server commands.As this is required
+   /// for authentication. *However* task based commands have their own authentication
+   /// mechanism, and don't need setup_user_authentification().
+   virtual void setup_user_authentification() = 0;
+
+   /// Allow control over connection to different servers/hosts if the main server is down
+   /// i.e for a getCmd, we do not want to wait 24 hours, trying all the servers
+   /// However for Task based commands like , init,abort,event, meter,complete we
+   /// want this behaviour as it can alter Node tree state and thus affect dependent nodes
+   virtual bool connect_to_different_servers() const { return false; }
+
+   /// The show occurs on the client side
+   virtual PrintStyle::Type_t show_style() const { return PrintStyle::NOTHING;}
+
+   // Other commands
+   virtual bool get_cmd() const { return false; }
+   virtual bool task_cmd() const { return false; }
+   virtual bool terminate_cmd() const { return false; }
+   virtual bool group_cmd() const { return false; }
+   virtual bool ping_cmd() const { return false;}
+   virtual bool why_cmd( std::string& ) const { return false;}
+   virtual bool show_cmd() const { return false ;}
+   virtual bool delete_all_cmd() const { return false ;}
+
+   // CLIENT side Parse and command construction, create can throw std::runtime_error for errors
+   virtual const char* theArg() const = 0;  // used for argument parsing
+   virtual void addOption(boost::program_options::options_description& desc) const = 0;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv) const = 0;
+protected:
+   ClientToServerCmd() {}
+
+   /// called by handleRequest, part of the template pattern
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const = 0;
+
+   /// return true if authentication succeeds, false and STC_Cmd_ptr to return otherwise
+   /// This function is called from doHandleRequest and hence is called
+   /// from within the server. The default implementation will get the current
+   /// user and authenticate with reference to the white list file
+   virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const = 0;
+
+   /// Log the command. Must typically be done before call doHandleRequest(), in case of crash/exception
+   /// In rare case allow override. (i.e for additional debug)
+   /// called by handleRequest, part of the template pattern
+   virtual void do_log() const;
+
+   /// Some commands which cause a change in state, should force an immediate job submission.
+   /// Providing the server is *NOT* shutdown
+   static STC_Cmd_ptr doJobSubmission(AbstractServer* as);
+
+   static void dumpVecArgs(const char* argOption, const std::vector<std::string>& args);
+
+   /// Find the node otherwise throw std:::runtime_error
+   node_ptr find_node(AbstractServer* as, const std::string& absNodepath) const;
+
+   /// Find The node for edit, otherwise throw std:::runtime_error
+   /// Will add the node edit history collection
+   node_ptr find_node_for_edit(AbstractServer* as, const std::string& absNodepath) const;
+
+   /// Find The node for edit, otherwise return a NULL pointer
+   /// Will add the node edit history collection
+   node_ptr find_node_for_edit_no_throw(AbstractServer* as, const std::string& absNodepath) const;
+
+   /// finds the associated node and adds to edit history nodes
+   void add_node_for_edit_history(AbstractServer* as, const std::string& absNodepath) const;
+   void add_node_for_edit_history(node_ptr) const;
+
+private:
+   friend class GroupCTSCmd;
+   friend class EditHistoryMgr;
+   mutable std::vector<weak_node_ptr> edit_history_nodes_;  // NOT persisted
+
+private:
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize(Archive &ar, const unsigned int /*version*/) {}
+};
+BOOST_SERIALIZATION_ASSUME_ABSTRACT(ClientToServerCmd)
+
+//=================================================================================
+// Task Commands
+// ================================================================================
+class TaskCmd : public ClientToServerCmd {
+protected:
+   TaskCmd( const std::string& pathToSubmittable,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            int try_no)
+   : submittable_(0),path_to_submittable_(pathToSubmittable),
+     jobs_password_(jobsPassword),process_or_remote_id_(process_or_remote_id), try_no_(try_no){}
+   TaskCmd() : submittable_(0),try_no_(0) {}
+public:
+
+   virtual bool isWrite() const { return true; }
+   virtual int timeout() const { return 190; }  // ECFLOW-157 80 -> 190
+
+   const std::string& path_to_node() const { return path_to_submittable_;}
+   const std::string& jobs_password() const { return jobs_password_;}
+   const std::string& process_or_remote_id() const { return process_or_remote_id_;}
+   int try_no() const { return try_no_;}
+   virtual ecf::Child::CmdType child_type() const = 0;
+
+   virtual bool equals(ClientToServerCmd*) const;
+   virtual bool task_cmd() const { return true; }
+   virtual bool connect_to_different_servers() const { return true; }
+
+protected:
+   /// Overridden to do nothing since Task based commands don't need _user_
+   /// based authentification
+   virtual void setup_user_authentification(){}
+   virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const; /// Task have their own mechanism,can throw std::runtime_error
+   Submittable* get_submittable(AbstractServer* as) const ; // can throw std::runtime_error
+
+protected:
+   mutable Submittable* submittable_; // stored during authentication and re-used handle request, not persisted, server side only
+
+private:
+   std::string path_to_submittable_;
+   std::string jobs_password_;
+   std::string process_or_remote_id_;
+   int try_no_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ClientToServerCmd >( *this );
+      ar & path_to_submittable_;
+      ar & jobs_password_;
+      ar & process_or_remote_id_;
+      ar & try_no_;
+   }
+};
+
+class InitCmd : public TaskCmd {
+public:
+   InitCmd(const std::string& pathToTask,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            int try_no )
+   : TaskCmd(pathToTask,jobsPassword,process_or_remote_id,try_no) {}
+
+   InitCmd() : TaskCmd()  {}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   virtual ecf::Child::CmdType child_type() const { return ecf::Child::INIT; }
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< TaskCmd >( *this );
+   }
+};
+
+class CompleteCmd : public TaskCmd {
+public:
+   CompleteCmd(const std::string& pathToTask,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id = "",
+            int try_no  = 1)
+   : TaskCmd(pathToTask,jobsPassword,process_or_remote_id,try_no) {}
+   CompleteCmd() : TaskCmd() {}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   virtual ecf::Child::CmdType child_type() const { return ecf::Child::COMPLETE; }
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< TaskCmd >( *this );
+   }
+};
+
+/// A child command that evaluates a expression. If the expression is false.
+/// Then client invoker will block.
+class CtsWaitCmd : public TaskCmd {
+public:
+   CtsWaitCmd(const std::string& pathToTask,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            int try_no,
+            const std::string& expression);
+   CtsWaitCmd() : TaskCmd()  {}
+
+   const std::string& expression() const { return expression_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   virtual ecf::Child::CmdType child_type() const { return ecf::Child::WAIT; }
+
+   std::string expression_;
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< TaskCmd >( *this );
+      ar & expression_;
+   }
+};
+
+class AbortCmd : public TaskCmd {
+public:
+   AbortCmd(const std::string& pathToTask,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            int try_no = 1,
+            const std::string& reason = "");
+   AbortCmd() : TaskCmd() {}
+
+   const std::string& reason() const {return reason_; }
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   virtual ecf::Child::CmdType child_type() const { return ecf::Child::ABORT; }
+
+   std::string reason_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< TaskCmd >( *this );
+      ar & reason_;
+   }
+};
+
+class EventCmd : public TaskCmd {
+public:
+   EventCmd(const std::string& pathToTask,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            int try_no,
+            const std::string& eventName )
+   : TaskCmd(pathToTask,jobsPassword,process_or_remote_id,try_no), name_(eventName) {}
+   EventCmd() : TaskCmd() {}
+
+   const std::string& name() const { return name_; }
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   virtual ecf::Child::CmdType child_type() const { return ecf::Child::EVENT; }
+
+private:
+   std::string name_; // the events name
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< TaskCmd >( *this );
+      ar & name_;
+   }
+};
+
+class MeterCmd : public TaskCmd {
+public:
+   MeterCmd(const std::string& pathToTask,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            int try_no,
+            const std::string& meterName,
+            int meterValue)
+   : TaskCmd(pathToTask,jobsPassword,process_or_remote_id,try_no), name_(meterName), value_(meterValue) {}
+   MeterCmd() : TaskCmd(), value_(0) {}
+
+   const std::string& name() const { return name_; }
+   int value() const { return value_; }
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   virtual ecf::Child::CmdType child_type() const { return ecf::Child::METER; }
+
+private:
+   std::string name_;  // the meters name
+   int value_;         // the meters value
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< TaskCmd >( *this );
+      ar & name_;
+      ar & value_;
+   }
+};
+
+class LabelCmd : public TaskCmd {
+public:
+   LabelCmd(const std::string& pathToTask,
+            const std::string& jobsPassword,
+            const std::string& process_or_remote_id,
+            int try_no,
+            const std::string& name,
+            const std::string& label)
+   : TaskCmd(pathToTask,jobsPassword,process_or_remote_id,try_no), name_(name), label_(label) {}
+   LabelCmd() : TaskCmd() {}
+
+   const std::string& name() const { return name_; }
+   const std::string& label() const { return label_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void  create(   Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   virtual ecf::Child::CmdType child_type() const { return ecf::Child::LABEL; }
+
+private:
+   std::string name_;   // the label name
+   std::string label_;  // a single label, or multi-line label
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< TaskCmd >( *this );
+      ar & name_;
+      ar & label_;
+   }
+};
+
+//=================================================================================
+// User Commands
+// ================================================================================
+class UserCmd : public ClientToServerCmd {
+public:
+   UserCmd(){}
+
+   const std::string& user() const { return user_;}
+   virtual void setup_user_authentification();
+
+protected:
+
+   virtual bool equals(ClientToServerCmd*) const;
+   virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+
+   /// Prompt the user for confirmation: If user responds with no, will exit client
+   static void prompt_for_confirmation(const std::string& prompt);
+
+   /// All user commands will be pre_fixed with "--" and post_fixed with :user.
+   std::ostream& user_cmd(std::ostream& os, const std::string& the_cmd) const;
+
+   static int time_out_for_load_sync_and_get();
+
+   // The order is preserved during the split. Paths assumed to start with '/' char
+   static void split_args_to_options_and_paths(
+            const std::vector<std::string>& args,
+            std::vector<std::string>& options,
+            std::vector<std::string>& paths);
+
+
+private:
+   std::string user_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ClientToServerCmd >( *this );
+      ar & user_;
+   }
+};
+
+
+// ========================================================================
+// This Command should NEVER be changed
+// This will allow new client to ask OLD server about its version
+// ========================================================================
+class ServerVersionCmd : public UserCmd {
+public:
+   ServerVersionCmd(){}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+                           boost::program_options::variables_map& vm,
+                           AbstractClientEnv* clientEnv ) const;
+private:
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+   }
+};
+
+
+// This command is used to encapsulate all commands that are
+// simple signals to the server. This helps to cut down on the
+// number of global symbols used by boost serialisation.
+// =========================================================================
+// *** IMPORTANT ***: If any of these commands in the future need arguments,
+// *** then ensure to place a DUMMY enum in its place.
+// *** This will allow a *newer* development client to still send message to a older server.
+// *** i.e like terminating the server
+// *** IMPORTANT: For any new commands, must be added to the end.
+// *** - STATS_RESET was introduced in release 4.0.5
+// =========================================================================
+class CtsCmd : public UserCmd {
+public:
+   enum Api { NO_CMD, RESTORE_DEFS_FROM_CHECKPT,
+      RESTART_SERVER, SHUTDOWN_SERVER, HALT_SERVER, TERMINATE_SERVER,
+      RELOAD_WHITE_LIST_FILE,
+      FORCE_DEP_EVAL,
+      PING, GET_ZOMBIES, STATS, SUITES,
+      DEBUG_SERVER_ON, DEBUG_SERVER_OFF,
+      SERVER_LOAD, STATS_RESET
+     };
+
+   CtsCmd(Api a) : api_(a) {}
+   CtsCmd() : api_(NO_CMD) {}
+
+   Api api() const { return api_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual bool isWrite() const;
+   virtual bool terminate_cmd() const { return api_ == TERMINATE_SERVER; }
+   virtual bool ping_cmd() const { return api_ == PING; }
+   virtual int timeout() const;
+
+   virtual bool handleRequestIsTestable() const;
+
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   Api api_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & api_;
+   }
+};
+
+class CheckPtCmd : public UserCmd {
+public:
+   CheckPtCmd(ecf::CheckPt::Mode m, int interval,int checkpt_save_time_alarm)
+   :  mode_(m), check_pt_interval_(interval),check_pt_save_time_alarm_(checkpt_save_time_alarm) {}
+   CheckPtCmd() : mode_(ecf::CheckPt::UNDEFINED), check_pt_interval_(0),check_pt_save_time_alarm_(0) {}
+
+   ecf::CheckPt::Mode mode() const { return mode_;}
+   int check_pt_interval() const { return check_pt_interval_;}
+   int check_pt_save_time_alarm() const { return check_pt_save_time_alarm_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+   virtual bool isWrite() const;
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   ecf::CheckPt::Mode mode_;
+   int check_pt_interval_;
+   int check_pt_save_time_alarm_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & mode_;
+      ar & check_pt_interval_;
+      ar & check_pt_save_time_alarm_;
+   }
+};
+
+
+// Client---(CSyncCmd::SYNC_FULL)---->Server-----(SSyncCmd)--->client:
+// Client---(CSyncCmd::SYNC)--------->Server-----(SSyncCmd)--->client:
+// Client---(CSyncCmd::NEWS)--------->Server-----(SNewsCmd)--->client:
+class CSyncCmd : public UserCmd {
+public:
+   enum Api { NEWS, SYNC , SYNC_FULL};
+
+   CSyncCmd(Api a, unsigned int client_handle,unsigned int client_state_change_no, unsigned int client_modify_change_no)
+   : api_(a),
+     client_handle_(client_handle),
+     client_state_change_no_(client_state_change_no),
+     client_modify_change_no_(client_modify_change_no) {}
+   CSyncCmd(unsigned int client_handle)
+   : api_(SYNC_FULL),
+     client_handle_(client_handle),
+     client_state_change_no_(0),
+     client_modify_change_no_(0) {}
+   CSyncCmd()
+   : api_(SYNC),
+     client_handle_(0),
+     client_state_change_no_(0),
+     client_modify_change_no_(0) {}
+
+   Api api() const { return api_;}
+   int client_state_change_no() const { return client_state_change_no_;}
+   int client_modify_change_no() const { return client_modify_change_no_;}
+   int client_handle() const { return client_handle_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+   virtual int timeout() const;
+
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+
+   /// Custom handling of command logging to add additional debug on same line
+   /// makes it easier to debug errors in syncing.
+   virtual void do_log() const;
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   Api api_;
+   int client_handle_;
+   int client_state_change_no_;
+   int client_modify_change_no_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & api_;
+      ar & client_handle_;
+      ar & client_state_change_no_;
+      ar & client_modify_change_no_;
+   }
+};
+
+class ClientHandleCmd : public UserCmd {
+public:
+   enum Api { REGISTER, DROP, DROP_USER, ADD, REMOVE, AUTO_ADD , SUITES };
+
+   ClientHandleCmd(Api api = AUTO_ADD)
+   : api_(api),
+     client_handle_(0),
+     auto_add_new_suites_(false) {}
+
+   ClientHandleCmd(const std::vector<std::string>& suites, bool add_add_new_suites)
+   : api_(REGISTER),
+     client_handle_(0),
+     auto_add_new_suites_(add_add_new_suites),
+     suites_(suites)  {}
+
+   ClientHandleCmd(int client_handle)
+   : api_(DROP),
+     client_handle_(client_handle),
+     auto_add_new_suites_(false) {}
+
+   ClientHandleCmd(const std::string& drop_user)
+    : api_(DROP_USER),
+      client_handle_(0),
+      auto_add_new_suites_(false),
+      drop_user_(drop_user){}
+
+   ClientHandleCmd(int client_handle, const std::vector<std::string>& suites, Api api)
+   : api_(api),  // Must be ADD or REMOVE
+     client_handle_(client_handle),
+     auto_add_new_suites_(false),
+     suites_(suites){}
+
+   ClientHandleCmd(int client_handle, bool add_add_new_suites)
+   : api_(AUTO_ADD),
+     client_handle_(client_handle),
+     auto_add_new_suites_(add_add_new_suites) {}
+
+   Api api() const { return api_;}
+   const std::string& drop_user() const { return drop_user_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+   virtual bool isWrite() const;
+
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   Api api_;
+   int client_handle_;
+   bool auto_add_new_suites_;
+   std::string drop_user_;
+   std::vector<std::string> suites_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & api_;
+      ar & client_handle_;
+      ar & auto_add_new_suites_;
+      ar & drop_user_;
+      ar & suites_;
+   }
+};
+
+// Collection of commands, that all take a abs node path as their only arg
+// Reduce number of global symbols caused by boost serialisation
+// Previously they were all separate commands
+//
+// Client---(CtsNodeCmd(GET))---->Server-----(DefsCmd | SNodeCmd )--->client:
+// When doHandleRequest is called in the server it will return DefsCmd
+// The DefsCmd is used to transport the node tree hierarchy to/from the server
+//
+// CHECK_JOB_GEN_ONLY command will traverse hierarchically from the given node path
+// and force generation of jobs. (i.e independently of dependencies).
+// This is used in *testing* only, so that we can compare/test/verify
+// job generation with the old version.
+// if absNodepath is empty we will generate jobs for all tasks
+class CtsNodeCmd : public UserCmd {
+public:
+   enum Api { NO_CMD, JOB_GEN, CHECK_JOB_GEN_ONLY, GET, WHY, GET_STATE, MIGRATE };
+   CtsNodeCmd(Api a, const std::string& absNodePath) : api_(a),absNodePath_(absNodePath) {}
+   CtsNodeCmd(Api a) : api_(a) { assert(a != NO_CMD); }
+   CtsNodeCmd() : api_(NO_CMD) {}
+
+   Api api() const { return api_;}
+   const std::string& absNodePath() const { return absNodePath_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual PrintStyle::Type_t show_style() const;
+
+   virtual int timeout() const;
+   virtual bool isWrite() const;
+   virtual bool handleRequestIsTestable() const { return !terminate_cmd();}
+   virtual bool why_cmd( std::string& nodePath) const;
+   virtual bool get_cmd() const { return api_ ==  GET; }
+
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+private:
+   Api api_;
+   std::string absNodePath_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & api_;
+      ar & absNodePath_;
+   }
+};
+
+// DELETE If paths_ empty will delete all suites (beware) else will delete the chosen nodes.
+class PathsCmd : public UserCmd {
+public:
+   enum Api { NO_CMD,  DELETE, SUSPEND, RESUME, KILL, STATUS, CHECK, EDIT_HISTORY };
+
+   PathsCmd(Api api,const std::vector<std::string>& paths, bool force = false)
+   : api_(api),force_(force),paths_(paths){}
+   PathsCmd(Api api,const std::string& absNodePath, bool force = false);
+   PathsCmd(Api api)
+   : api_(api), force_(false) { assert(api != NO_CMD); }
+   PathsCmd()
+   : api_(NO_CMD),force_(false) {}
+
+   Api api() const { return api_; }
+   const std::vector<std::string>& paths() const { return paths_;}
+   bool force() const { return force_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+   virtual bool isWrite() const;
+   virtual bool delete_all_cmd() const;
+
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create(    Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+private:
+   Api api_;
+   bool force_;
+   mutable std::vector<std::string> paths_; // mutable to allow swap to clear & reclaim memory, as soon as possible
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & api_;
+      ar & force_;
+      ar & paths_;
+   }
+};
+
+
+/// The LogCmd is paired with SStringCmd
+/// Client---(LogCmd)---->Server-----(SStringCmd)--->client:
+/// When doHandleRequest is called in the server it will return SStringCmd
+/// The SStringCmd is used to transport the log file contents to the client
+class LogCmd : public UserCmd {
+public:
+   enum LogApi { GET, CLEAR, FLUSH, NEW , PATH};
+   LogCmd(LogApi a, int get_last_n_lines = 0); // for zero we take default from log. Avoid adding dependency on log.hpp
+   LogCmd(const std::string& path); // NEW
+   LogCmd();
+
+   LogApi api() const { return api_;}
+   int get_last_n_lines() const { return get_last_n_lines_;}
+   const std::string& new_path() const { return new_path_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   LogApi api_;
+   int get_last_n_lines_; // default to 100 -> ECFLOW-174
+   std::string new_path_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & api_;
+      ar & get_last_n_lines_;
+      ar & new_path_;
+   }
+};
+
+/// Simply writes the message to the log file
+class LogMessageCmd : public UserCmd {
+public:
+   LogMessageCmd(const std::string& msg) : msg_(msg) {}
+   LogMessageCmd() {}
+
+   const std::string& msg() const { return msg_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   std::string msg_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & msg_;
+   }
+};
+
+
+// class Begin:  if suiteName is empty we will begin all suites
+class BeginCmd : public UserCmd {
+public:
+   BeginCmd(const std::string& suiteName, bool force = false);
+   BeginCmd() : force_(false) {}
+
+   const std::string& suiteName() const { return suiteName_;}
+   bool force() const { return force_;}
+
+   virtual int timeout() const { return 80; }
+
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   std::string suiteName_;
+   bool        force_;      // reset begin status on suites & bypass checks, can create zombies, used in test only
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & suiteName_;
+      ar & force_;
+   }
+};
+
+class ZombieCmd : public UserCmd {
+public:
+   ZombieCmd(ecf::User::Action uc, const std::string& path, const std::string& process_id, const std::string& password)
+   : user_action_(uc), path_(path), process_id_(process_id), password_(password) {}
+   ZombieCmd(ecf::User::Action uc = ecf::User::BLOCK) : user_action_(uc) {}
+
+   const std::string& path_to_task() const { return path_;}
+   const std::string& process_or_remote_id() const { return process_id_;}
+   const std::string& password() const { return password_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const;
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   ecf::User::Action user_action_;
+   std::string path_;
+   std::string process_id_;
+   std::string password_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & user_action_;
+      ar & path_;
+      ar & process_id_;
+      ar & password_;
+   }
+};
+
+class RequeueNodeCmd : public UserCmd {
+public:
+   enum Option { NO_OPTION, ABORT, FORCE };
+
+   RequeueNodeCmd(const std::vector<std::string>& paths, Option op = NO_OPTION)
+   : paths_(paths), option_(op) {}
+
+   RequeueNodeCmd(const std::string& absNodepath, Option op = NO_OPTION)
+   : paths_(std::vector<std::string>(1,absNodepath)), option_(op) {}
+
+   RequeueNodeCmd() : option_(NO_OPTION) {}
+
+   const std::vector<std::string>& paths() const { return paths_;}
+   Option option() const { return option_;}
+
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+private:
+   mutable std::vector<std::string>  paths_;  // mutable to allow swap to clear & reclaim memory, as soon as possible
+   Option                    option_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & paths_;
+      ar & option_;
+   }
+};
+
+class OrderNodeCmd : public UserCmd {
+public:
+   OrderNodeCmd(const std::string& absNodepath, NOrder::Order op)
+   : absNodepath_(absNodepath), option_(op) {}
+   OrderNodeCmd() : option_(NOrder::TOP) {}
+
+   const std::string& absNodepath() const { return absNodepath_;}
+   NOrder::Order option() const { return option_;}
+
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   std::string   absNodepath_;
+   NOrder::Order      option_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & absNodepath_;
+      ar & option_;
+   }
+};
+
+
+// The absNodepath must be provided
+class RunNodeCmd : public UserCmd {
+public:
+   RunNodeCmd(const std::string& absNodepath, bool force, bool test = false)
+   : paths_(std::vector<std::string>(1,absNodepath)), force_(force), test_(test) {}
+
+   RunNodeCmd(const std::vector<std::string>& paths, bool force, bool test = false)
+   : paths_(paths), force_(force), test_(test) {}
+
+   RunNodeCmd() : force_(false), test_(false) {}
+
+   const std::vector<std::string>& paths() const { return paths_;}
+   bool force() const { return force_;}
+
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+private:
+   mutable std::vector<std::string> paths_; // mutable to allow swap to clear & reclaim memory, as soon as possible
+   bool        force_;
+   bool        test_;   // only for test, hence we don't serialise this
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & paths_;
+      ar & force_;
+   }
+};
+
+
+// Does Nothing in the server, however allows client code to display the
+// returned Defs in different showStyles
+// This class has no need for persistence, i.e client side only
+class ShowCmd : public UserCmd {
+public:
+   ShowCmd(PrintStyle::Type_t s = PrintStyle::DEFS) : style_(s) {}
+
+   // returns the showStyle
+   virtual bool show_cmd() const { return true ;}
+   virtual PrintStyle::Type_t show_style() const { return style_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   // The Show Cmd is processed on the client side,
+   // Likewise the doHandleRequest does nothing,
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   PrintStyle::Type_t style_;
+
+   // Persistence is still required since show command can be *USED* in a *GROUP* command
+   // However its ONLY used on the client side, hence no need to serialise data members
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+   }
+};
+
+// Will *load* the suites, into the server.
+// Additionally the server will try to resolve extern's. The extern are references
+// to Node, events, meters, limits, variables defined on another suite.
+class LoadDefsCmd : public UserCmd {
+public:
+   LoadDefsCmd(const std::string& defs_filename, bool force = false);
+
+   LoadDefsCmd(const defs_ptr& defs, bool force = false)
+   : force_(force), defs_(defs) {}
+
+   LoadDefsCmd() : force_(false) {}
+
+   // Uses by equals only
+   const defs_ptr& theDefs() const { return defs_; }
+
+   virtual bool isWrite() const { return true; }
+   virtual int timeout() const { return time_out_for_load_sync_and_get(); }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+   static Cmd_ptr create(const std::string& defs_filename, bool force, bool check_only, AbstractClientEnv* clientEnv);
+
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the command as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   bool        force_;
+   defs_ptr    defs_;
+   std::string defs_filename_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & force_;
+      ar & defs_;
+      ar & defs_filename_;
+   }
+};
+
+class ReplaceNodeCmd : public UserCmd {
+public:
+   ReplaceNodeCmd(const std::string& node_path, bool createNodesAsNeeded, defs_ptr defs, bool force );
+   ReplaceNodeCmd(const std::string& node_path, bool createNodesAsNeeded, const std::string& path_to_defs, bool force );
+   ReplaceNodeCmd() : createNodesAsNeeded_(false), force_(false) {}
+
+   defs_ptr theDefs() const  { return clientDefs_; }
+   const std::string& pathToNode() const { return pathToNode_; }
+   const std::string& path_to_defs() const { return path_to_defs_;}
+   bool createNodesAsNeeded() const { return createNodesAsNeeded_;}
+   bool force() const { return force_;}
+
+   virtual bool isWrite() const { return true; }
+   virtual int timeout() const { return 300; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   bool        createNodesAsNeeded_;
+   bool        force_;
+   std::string pathToNode_;
+   std::string path_to_defs_; // Can be empty if defs loaded in memory via python api
+   defs_ptr    clientDefs_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & createNodesAsNeeded_;
+      ar & force_;
+      ar & pathToNode_;
+      ar & path_to_defs_;
+      ar & clientDefs_;
+   }
+};
+
+// Set the state on the affected node ONLY.
+// If recursive is used set the state, on node and  _ALL_ nodes _beneath
+// setRepeatToLastValue set, only make sense when used with recursive.
+// stateOrEvent, string is one of:
+// < unknown | suspended | complete | queued | submitted | active | aborted | clear | set >
+class ForceCmd : public UserCmd {
+public:
+   ForceCmd(const std::vector<std::string>& paths,
+            const std::string& stateOrEvent,
+            bool recursive,
+            bool setRepeatToLastValue)
+   : paths_(paths), stateOrEvent_(stateOrEvent),
+     recursive_(recursive), setRepeatToLastValue_(setRepeatToLastValue) {}
+   ForceCmd(const std::string& path,
+            const std::string& stateOrEvent,
+            bool recursive,
+            bool setRepeatToLastValue)
+   : paths_(std::vector<std::string>(1,path)), stateOrEvent_(stateOrEvent),
+     recursive_(recursive), setRepeatToLastValue_(setRepeatToLastValue) {}
+   ForceCmd() : recursive_(false), setRepeatToLastValue_(false) {}
+
+   // Uses by equals only
+   const std::vector<std::string> paths() const { return paths_; }
+   const std::string& stateOrEvent() const { return stateOrEvent_;}
+   bool recursive() const { return recursive_;}
+   bool setRepeatToLastValue() const { return setRepeatToLastValue_;}
+
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+private:
+   mutable std::vector<std::string> paths_; // mutable to allow swap to clear & reclaim memory, as soon as possible
+   std::string              stateOrEvent_;
+   bool                     recursive_;
+   bool                     setRepeatToLastValue_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & paths_;
+      ar & stateOrEvent_;
+      ar & recursive_;
+      ar & setRepeatToLastValue_;
+   }
+};
+
+// Free Dependencies
+class FreeDepCmd : public UserCmd {
+public:
+   FreeDepCmd(const std::vector<std::string>& paths,
+            bool trigger = true,
+            bool all = false, // day, date, time, today, trigger, cron
+            bool date = false,
+            bool time =  false // includes time, day, date, today, cron
+   )
+   : paths_(paths), trigger_(trigger), all_(all), date_(date), time_(time) {}
+
+   FreeDepCmd(const std::string& path,
+            bool trigger = true,
+            bool all = false, // day, date, time, today, trigger, cron
+            bool date = false,
+            bool time =  false // includes time, day, date, today, cron
+   )
+   : paths_(std::vector<std::string>(1,path)), trigger_(trigger), all_(all), date_(date), time_(time) {}
+
+   FreeDepCmd() : trigger_(true), all_(false), date_(false), time_(false){}
+
+   // Uses by equals only
+   const std::vector<std::string>& paths() const { return paths_; }
+   bool trigger() const { return trigger_;}
+   bool all() const     { return all_;}
+   bool date() const    { return date_;}
+   bool time() const    { return time_;}
+
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+private:
+   mutable std::vector<std::string> paths_; // mutable to allow swap to clear & reclaim memory, as soon as possible
+   bool          trigger_;
+   bool          all_;
+   bool          date_;
+   bool          time_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & paths_;
+      ar & trigger_;
+      ar & all_;
+      ar & date_;
+      ar & time_;
+   }
+};
+
+class AlterCmd : public UserCmd {
+public:
+   enum Delete_attr_type  { DEL_VARIABLE, DEL_TIME, DEL_TODAY, DEL_DATE, DEL_DAY,
+      DEL_CRON, DEL_EVENT, DEL_METER, DEL_LABEL,
+      DEL_TRIGGER, DEL_COMPLETE, DEL_REPEAT, DEL_LIMIT, DEL_LIMIT_PATH,
+      DEL_INLIMIT, DEL_ZOMBIE, DELETE_ATTR_ND };
+
+   enum Change_attr_type  { VARIABLE, CLOCK_TYPE, CLOCK_DATE, CLOCK_GAIN,  EVENT, METER, LABEL,
+      TRIGGER, COMPLETE, REPEAT, LIMIT_MAX, LIMIT_VAL, DEFSTATUS, CHANGE_ATTR_ND, CLOCK_SYNC };
+
+   enum Add_attr_type  {  ADD_TIME, ADD_TODAY, ADD_DATE, ADD_DAY, ADD_ZOMBIE, ADD_VARIABLE, ADD_ATTR_ND };
+
+   AlterCmd(const std::string& path, Add_attr_type  attr,  const std::string& name, const std::string& value = "" )
+   : paths_(std::vector<std::string>(1,path)), name_(name), value_(value), add_attr_type_(attr),
+     del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+   AlterCmd(const std::vector<std::string>& paths, Add_attr_type  attr,  const std::string& name, const std::string& value = "" )
+   : paths_(paths), name_(name), value_(value), add_attr_type_(attr),
+     del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+
+   AlterCmd(const std::string& path,  Delete_attr_type  del, const std::string& name = "" , const std::string& value = "")
+   : paths_(std::vector<std::string>(1,path)), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
+     del_attr_type_(del), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+   AlterCmd(const std::vector<std::string>& paths,  Delete_attr_type  del, const std::string& name = "" , const std::string& value = "")
+   : paths_(paths), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
+     del_attr_type_(del), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+
+   AlterCmd(const std::string& path, Change_attr_type  attr, const std::string& name, const std::string& value = "")
+   : paths_(std::vector<std::string>(1,path)), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
+     del_attr_type_(DELETE_ATTR_ND), change_attr_type_(attr),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+   AlterCmd(const std::vector<std::string>& paths, Change_attr_type  attr, const std::string& name, const std::string& value = "")
+   : paths_(paths), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
+     del_attr_type_(DELETE_ATTR_ND), change_attr_type_(attr),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+
+   AlterCmd(const std::string& path, ecf::Flag::Type ft,  bool flag)
+   : paths_(std::vector<std::string>(1,path)), add_attr_type_(ADD_ATTR_ND),
+     del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ft), flag_(flag) {}
+   AlterCmd(const std::vector<std::string>& paths, ecf::Flag::Type ft,  bool flag)
+   : paths_(paths), add_attr_type_(ADD_ATTR_ND),
+     del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ft), flag_(flag) {}
+
+   AlterCmd()
+   : add_attr_type_(ADD_ATTR_ND), del_attr_type_(DELETE_ATTR_ND),
+     change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+
+   // Uses by equals only
+   const std::vector<std::string>& paths() const { return paths_; }
+   const std::string& name() const { return name_; }
+   const std::string& value() const { return value_; }
+   Delete_attr_type delete_attr_type() const { return del_attr_type_;}
+   Change_attr_type change_attr_type() const { return change_attr_type_;}
+   Add_attr_type add_attr_type() const { return add_attr_type_;}
+   ecf::Flag::Type flag_type() const { return flag_type_;}
+   bool flag() const { return flag_;}
+
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+   STC_Cmd_ptr alter_server_state(AbstractServer*) const;
+
+   void createAdd(    Cmd_ptr& cmd,       std::vector<std::string>& options,       std::vector<std::string>& paths) const;
+   void createDelete( Cmd_ptr& cmd, const std::vector<std::string>& options, const std::vector<std::string>& paths) const;
+   void createChange( Cmd_ptr& cmd,       std::vector<std::string>& options,       std::vector<std::string>& paths) const;
+   void create_flag(  Cmd_ptr& cmd, const std::vector<std::string>& options, const std::vector<std::string>& paths, bool flag) const;
+
+private:
+   mutable std::vector<std::string> paths_; // mutable to allow swap to clear & reclaim memory, as soon as possible
+   std::string              name_;
+   std::string              value_;
+   Add_attr_type            add_attr_type_;
+   Delete_attr_type         del_attr_type_;
+   Change_attr_type         change_attr_type_;
+   ecf::Flag::Type          flag_type_;
+   bool                     flag_; // true means set false means clear
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & paths_;
+      ar & name_;
+      ar & value_;
+      ar & add_attr_type_;
+      ar & del_attr_type_;
+      ar & change_attr_type_;
+      ar & flag_type_;
+      ar & flag_;
+   }
+};
+
+//================================================================================
+// Paired with SStringCmd
+// Client---(CFileCmd)---->Server-----(SStringCmd)--->client:
+//================================================================================
+class CFileCmd : public UserCmd {
+public:
+   enum File_t { ECF, JOB, JOBOUT, MANUAL, KILL, STAT };
+   CFileCmd(const std::string& pathToNode, File_t file, size_t max_lines)
+   : file_(file),  pathToNode_(pathToNode), max_lines_(max_lines) {}
+   CFileCmd(const std::string& pathToNode, const std::string& file_type, const std::string& max_lines);
+
+   CFileCmd() : file_(ECF),max_lines_(0) {}
+
+   // Uses by equals only
+   const std::string& pathToNode() const { return pathToNode_; }
+   File_t fileType() const { return file_;}
+   size_t max_lines() const { return max_lines_;}
+
+   static std::vector<CFileCmd::File_t>  fileTypesVec();
+   static std::string toString(File_t);
+
+   virtual bool handleRequestIsTestable() const { return false ;}
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   File_t        file_;
+   std::string   pathToNode_;
+   size_t        max_lines_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & file_;
+      ar & pathToNode_;
+      ar & max_lines_;
+   }
+};
+
+//================================================================================
+// Paired with SStringCmd
+// Client---(EditScriptCmd)---->Server-----(SStringCmd)--->client:
+//================================================================================
+class EditScriptCmd : public UserCmd {
+public:
+   enum EditType { EDIT, PREPROCESS, SUBMIT,  PREPROCESS_USER_FILE, SUBMIT_USER_FILE  };
+   EditScriptCmd(const std::string& path_to_node,EditType et) // EDIT or PREPROCESS
+   :  edit_type_(et), path_to_node_(path_to_node),
+      alias_(false),run_(false)
+   {}
+
+   EditScriptCmd(const std::string& path_to_node, const NameValueVec& user_variables)
+   :  edit_type_(SUBMIT), path_to_node_(path_to_node), user_variables_(user_variables),
+      alias_(false),run_(false)
+   {}
+
+   EditScriptCmd(const std::string& path_to_node, const std::vector<std::string>& user_file_contents)
+   :  edit_type_(PREPROCESS_USER_FILE), path_to_node_(path_to_node), user_file_contents_(user_file_contents),
+      alias_(false),run_(false)
+   {}
+
+   EditScriptCmd( const std::string& path_to_node,
+                  const NameValueVec& user_variables,
+                  const std::vector<std::string>& user_file_contents,
+                  bool create_alias,
+                  bool run_alias
+   )
+   :  edit_type_(SUBMIT_USER_FILE), path_to_node_(path_to_node), user_file_contents_(user_file_contents),user_variables_(user_variables),
+      alias_(create_alias),run_(run_alias)
+   {}
+
+   EditScriptCmd() : edit_type_(EDIT),alias_(false),run_(false) {}
+
+   // Uses by equals only
+   const std::string& path_to_node() const { return path_to_node_; }
+   EditType edit_type() const { return edit_type_;}
+   bool alias() const { return alias_;}
+   bool run() const { return run_;}
+
+   virtual bool handleRequestIsTestable() const { return false ;}
+   virtual bool isWrite() const;
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   EditType      edit_type_;
+   std::string   path_to_node_;
+   mutable std::vector<std::string>  user_file_contents_;
+   NameValueVec user_variables_;
+   bool alias_;
+   bool run_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & edit_type_;
+      ar & path_to_node_;
+      ar & user_file_contents_;
+      ar & user_variables_;
+      ar & alias_;
+      ar & run_;
+   }
+};
+
+class PlugCmd : public UserCmd {
+public:
+   PlugCmd(const std::string& source, const std::string& dest) : source_(source), dest_(dest) {}
+   PlugCmd() {}
+
+   // Uses by equals only
+   const std::string& source() const { return source_; }
+   const std::string& dest() const { return dest_; }
+
+   virtual int timeout() const { return 120; }
+   virtual bool handleRequestIsTestable() const { return false ;}
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+private:
+   std::string source_;
+   std::string dest_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & source_;
+      ar & dest_;
+   }
+};
+
+class MoveCmd : public UserCmd {
+public:
+   MoveCmd(const std::pair<std::string,std::string>& host_port, Node* src, const std::string& dest);
+   MoveCmd();
+   virtual ~MoveCmd();
+
+   Node* source() const;
+   const std::string& dest() const { return dest_; }
+
+   virtual bool handleRequestIsTestable() const { return false ;}
+   virtual bool isWrite() const { return true; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   bool check_source() const;
+
+private:
+   mutable Suite*  sourceSuite_; // only one is set, gets round un-registered class exception
+   mutable Family* sourceFamily_;// only one is set, gets round un-registered class exception
+   mutable Task*   sourceTask_;  // only one is set, gets round un-registered class exception
+   std::string src_host_;
+   std::string src_port_;
+   std::string src_path_;
+   std::string dest_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & sourceSuite_;  // only one is serialised
+      ar & sourceFamily_; // only one is serialised
+      ar & sourceTask_;   // only one is serialised
+      ar & src_host_;
+      ar & src_port_;
+      ar & src_path_;
+      ar & dest_;
+   }
+};
+
+// The group command allows a series of commands to be be executed:
+//
+// Client---(GroupCTSCmd)---->Server-----(GroupSTCCmd | StcCmd(OK) | Error )--->client:
+//
+// If client->server contains GetDefs cmd and log file commands, then a group
+// command will be created for returning to the client
+//
+// If group command contains multiple [ CtsNodeCmd(GET) | LogCmd --get ] commands then
+// all the results are returned back to the client, HOWEVER when client calls
+// Cmd::defs() | Cmd::get_string() only the first data is returned.
+//
+class GroupCTSCmd : public UserCmd {
+public:
+   GroupCTSCmd(const std::string& list_of_commands,AbstractClientEnv* clientEnv);
+   GroupCTSCmd(){}
+
+   virtual bool isWrite() const;
+   virtual PrintStyle::Type_t show_style() const;
+   virtual bool get_cmd() const;
+   virtual bool task_cmd() const;
+   virtual bool terminate_cmd() const;
+   virtual bool why_cmd( std::string& ) const;
+   virtual bool group_cmd() const { return true; }
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ClientToServerCmd*) const;
+
+   void addChild(Cmd_ptr childCmd);
+   const std::vector<Cmd_ptr>& cmdVec() const { return cmdVec_;}
+
+   virtual const char* theArg() const { return arg();}
+   virtual void addOption(boost::program_options::options_description& desc) const;
+   virtual void create( 	Cmd_ptr& cmd,
+            boost::program_options::variables_map& vm,
+            AbstractClientEnv* clientEnv ) const;
+private:
+   static const char* arg();  // used for argument parsing
+   static const char* desc(); // The description of the argument as provided to user
+
+   virtual void setup_user_authentification();
+   virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
+
+   std::vector<Cmd_ptr> cmdVec_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< UserCmd >( *this );
+      ar & cmdVec_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const ServerVersionCmd&);
+std::ostream& operator<<(std::ostream& os, const CtsCmd&);
+std::ostream& operator<<(std::ostream& os, const CtsNodeCmd&);
+std::ostream& operator<<(std::ostream& os, const PathsCmd&);
+std::ostream& operator<<(std::ostream& os, const CheckPtCmd&);
+std::ostream& operator<<(std::ostream& os, const LoadDefsCmd&);
+std::ostream& operator<<(std::ostream& os, const LogCmd&);
+std::ostream& operator<<(std::ostream& os, const LogMessageCmd&);
+std::ostream& operator<<(std::ostream& os, const BeginCmd&);
+std::ostream& operator<<(std::ostream& os, const ZombieCmd&);
+std::ostream& operator<<(std::ostream& os, const InitCmd&);
+std::ostream& operator<<(std::ostream& os, const EventCmd&);
+std::ostream& operator<<(std::ostream& os, const MeterCmd&);
+std::ostream& operator<<(std::ostream& os, const LabelCmd&);
+std::ostream& operator<<(std::ostream& os, const CompleteCmd&);
+std::ostream& operator<<(std::ostream& os, const CtsWaitCmd&);
+std::ostream& operator<<(std::ostream& os, const AbortCmd&);
+std::ostream& operator<<(std::ostream& os, const RequeueNodeCmd&);
+std::ostream& operator<<(std::ostream& os, const OrderNodeCmd&);
+std::ostream& operator<<(std::ostream& os, const RunNodeCmd&);
+std::ostream& operator<<(std::ostream& os, const ReplaceNodeCmd&);
+std::ostream& operator<<(std::ostream& os, const ForceCmd&);
+std::ostream& operator<<(std::ostream& os, const FreeDepCmd&);
+std::ostream& operator<<(std::ostream& os, const CFileCmd&);
+std::ostream& operator<<(std::ostream& os, const PlugCmd&);
+std::ostream& operator<<(std::ostream& os, const AlterCmd&);
+std::ostream& operator<<(std::ostream& os, const MoveCmd&);
+std::ostream& operator<<(std::ostream& os, const GroupCTSCmd&);
+
+BOOST_CLASS_EXPORT_KEY(ServerVersionCmd)
+BOOST_CLASS_EXPORT_KEY(CtsCmd)
+BOOST_CLASS_EXPORT_KEY(CSyncCmd)
+BOOST_CLASS_EXPORT_KEY(ClientHandleCmd)
+BOOST_CLASS_EXPORT_KEY(CtsNodeCmd)
+BOOST_CLASS_EXPORT_KEY(PathsCmd)
+BOOST_CLASS_EXPORT_KEY(CheckPtCmd)
+BOOST_CLASS_EXPORT_KEY(LoadDefsCmd)
+BOOST_CLASS_EXPORT_KEY(LogCmd)
+BOOST_CLASS_EXPORT_KEY(LogMessageCmd)
+BOOST_CLASS_EXPORT_KEY(BeginCmd)
+BOOST_CLASS_EXPORT_KEY(ZombieCmd)
+BOOST_CLASS_EXPORT_KEY(InitCmd)
+BOOST_CLASS_EXPORT_KEY(EventCmd)
+BOOST_CLASS_EXPORT_KEY(MeterCmd)
+BOOST_CLASS_EXPORT_KEY(LabelCmd)
+BOOST_CLASS_EXPORT_KEY(AbortCmd)
+BOOST_CLASS_EXPORT_KEY(CtsWaitCmd)
+BOOST_CLASS_EXPORT_KEY(CompleteCmd)
+BOOST_CLASS_EXPORT_KEY(RequeueNodeCmd)
+BOOST_CLASS_EXPORT_KEY(OrderNodeCmd)
+BOOST_CLASS_EXPORT_KEY(RunNodeCmd)
+BOOST_CLASS_EXPORT_KEY(ReplaceNodeCmd)
+BOOST_CLASS_EXPORT_KEY(ForceCmd)
+BOOST_CLASS_EXPORT_KEY(FreeDepCmd)
+BOOST_CLASS_EXPORT_KEY(CFileCmd)
+BOOST_CLASS_EXPORT_KEY(EditScriptCmd)
+BOOST_CLASS_EXPORT_KEY(PlugCmd)
+BOOST_CLASS_EXPORT_KEY(AlterCmd)
+BOOST_CLASS_EXPORT_KEY(MoveCmd)
+BOOST_CLASS_EXPORT_KEY(GroupCTSCmd)
+BOOST_CLASS_EXPORT_KEY(ShowCmd)
+#endif
diff --git a/ecflow_4_0_7/Base/src/cts/CtsApi.cpp b/ecflow_4_0_7/Base/src/cts/CtsApi.cpp
new file mode 100644
index 0000000..7b19272
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CtsApi.cpp
@@ -0,0 +1,710 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #76 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : (C)lient (t)o (s)erver API
+//============================================================================
+
+#include <sstream>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "CtsApi.hpp"
+
+std::string CtsApi::to_string(const std::vector<std::string>& vec) {
+   std::string ret;
+   for(size_t i = 0; i < vec.size(); i++) { ret += vec[i]; ret += " "; }
+   return ret;
+}
+
+std::string CtsApi::server_version() { return std::string("--server_version");}
+const char* CtsApi::server_version_arg() { return "server_version"; }
+
+std::string CtsApi::get(const std::string& absNodePath) {
+   std::string ret = "--get";
+   if (!absNodePath.empty()) {
+      ret += "=";
+      ret += absNodePath;
+   }
+   return ret;
+}
+const char* CtsApi::getArg() { return "get"; }
+
+std::string CtsApi::get_state(const std::string& absNodePath) {
+   std::string ret = "--get_state";
+   if (!absNodePath.empty()) {
+      ret += "=";
+      ret += absNodePath;
+   }
+   return ret;
+}
+const char* CtsApi::get_state_arg() { return "get_state"; }
+
+std::string CtsApi::migrate(const std::string& absNodePath) {
+   std::string ret = "--migrate";
+   if (!absNodePath.empty()) {
+      ret += "=";
+      ret += absNodePath;
+   }
+   return ret;
+}
+const char* CtsApi::migrate_arg() { return "migrate"; }
+
+std::string CtsApi::stats()     { return "--stats"; }
+const char* CtsApi::statsArg()  { return "stats"; }
+
+std::string CtsApi::stats_reset()     { return "--stats_reset"; }
+const char* CtsApi::stats_reset_arg()  { return "stats_reset"; }
+
+
+std::string CtsApi::suites()    { return "--suites"; }
+const char* CtsApi::suitesArg() { return "suites"; }
+
+std::vector<std::string> CtsApi::ch_register( bool auto_add_new_suites , const std::vector<std::string>& suites )
+{
+   std::vector<std::string> retVec; retVec.reserve(suites.size() +1);
+   std::string ret = "--ch_register=";
+   if ( auto_add_new_suites ) ret += "true";
+   else                       ret += "false";
+   retVec.push_back(ret);
+   for(size_t i = 0; i < suites.size(); i++) { retVec.push_back(suites[i]);}
+   return retVec;
+}
+const char* CtsApi::ch_register_arg() { return "ch_register"; }
+
+std::string CtsApi::ch_suites() { return "--ch_suites";}
+const char* CtsApi::ch_suites_arg() { return "ch_suites"; }
+
+std::string CtsApi::ch_drop(int client_handle)
+{
+   std::string ret = "--ch_drop=";
+   ret += boost::lexical_cast<std::string>(client_handle);
+   return ret;
+}
+const char* CtsApi::ch_drop_arg() { return "ch_drop"; }
+
+std::string CtsApi::ch_drop_user(const std::string& user)
+{
+   std::string ret = "--ch_drop_user";
+   if (!user.empty()) {
+      ret += "=";
+      ret += user;
+   }
+   return ret;
+}
+const char* CtsApi::ch_drop_user_arg() { return "ch_drop_user"; }
+
+std::vector<std::string> CtsApi::ch_add( int client_handle, const std::vector<std::string>& suites )
+{
+   std::vector<std::string> retVec; retVec.reserve(suites.size() +1);
+   std::string ret = "--ch_add=";
+   ret += boost::lexical_cast<std::string>(client_handle);
+   retVec.push_back(ret);
+   for(size_t i = 0; i < suites.size(); i++) { retVec.push_back(suites[i]);}
+   return retVec;
+}
+const char* CtsApi::ch_add_arg() { return "ch_add"; }
+
+std::vector<std::string> CtsApi::ch_remove( int client_handle, const std::vector<std::string>& suites )
+{
+   std::vector<std::string> retVec; retVec.reserve(suites.size() +1);
+   std::string ret = "--ch_rem=";
+   ret += boost::lexical_cast<std::string>(client_handle);
+   retVec.push_back(ret);
+   for(size_t i = 0; i < suites.size(); i++) { retVec.push_back(suites[i]); }
+   return retVec;
+}
+const char* CtsApi::ch_remove_arg() { return "ch_rem"; }
+
+std::vector<std::string> CtsApi::ch_auto_add( int client_handle, bool auto_add_new_suites )
+{
+   std::vector<std::string> retVec; retVec.reserve(2);
+   std::string ret = "--ch_auto_add=";
+   ret += boost::lexical_cast<std::string>(client_handle);
+   retVec.push_back(ret);
+   if ( auto_add_new_suites ) retVec.push_back("true");
+   else                       retVec.push_back("false");
+   return retVec;
+}
+const char* CtsApi::ch_auto_add_arg() { return "ch_auto_add"; }
+
+
+std::vector<std::string> CtsApi::sync(unsigned int client_handle,unsigned int state_change_no, unsigned int modify_change_no )
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--sync=";
+   ret += boost::lexical_cast<std::string>( client_handle );
+   retVec.push_back(ret);
+   retVec.push_back(boost::lexical_cast<std::string>( state_change_no ));
+   retVec.push_back(boost::lexical_cast<std::string>( modify_change_no ));
+   return retVec;
+}
+const char* CtsApi::syncArg()  { return "sync"; }
+
+std::string CtsApi::sync_full(unsigned int client_handle) {
+   std::string ret = "--sync_full=";
+   ret += boost::lexical_cast<std::string>( client_handle );
+   return ret;
+}
+const char* CtsApi::sync_full_arg() { return "sync_full";}
+
+std::vector<std::string> CtsApi::news(unsigned int client_handle, unsigned int state_change_no, unsigned int modify_change_no )
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--news=";
+   ret += boost::lexical_cast<std::string>( client_handle );
+   retVec.push_back(ret);
+   retVec.push_back(boost::lexical_cast<std::string>( state_change_no ));
+   retVec.push_back(boost::lexical_cast<std::string>( modify_change_no ));
+   return retVec;
+}
+const char* CtsApi::newsArg()  { return "news"; }
+
+std::vector<std::string> CtsApi::loadDefs(const std::string& filePath, bool force, bool check_only) {
+
+   std::string ret = "--load="; ret += filePath;
+
+   std::vector<std::string> retVec; retVec.reserve(3);
+   retVec.push_back(ret);
+   if (force) retVec.push_back("force");
+   if (check_only) retVec.push_back("check_only");
+   return retVec;
+}
+const char* CtsApi::loadDefsArg() { return "load"; }
+
+std::string CtsApi::restartServer()       { return "--restart";}
+const char* CtsApi::restartServerArg()    { return "restart";}
+
+std::string CtsApi::haltServer(bool auto_confirm) { return (auto_confirm) ? "--halt=yes" : "--halt"; }
+const char* CtsApi::haltServerArg()       { return "halt"; }
+
+std::string CtsApi::shutdownServer(bool auto_confirm) { return (auto_confirm) ? "--shutdown=yes" : "--shutdown"; }
+const char* CtsApi::shutdownServerArg()   { return "shutdown"; }
+
+std::string CtsApi::terminateServer(bool auto_confirm) { return (auto_confirm) ? "--terminate=yes" : "--terminate";}
+const char* CtsApi::terminateServerArg() { return "terminate";}
+
+std::string CtsApi::pingServer()          { return "--ping"; }
+const char* CtsApi::pingServerArg()       { return "ping"; }
+
+std::string CtsApi::server_load(const std::string& path_to_log_file)
+{
+   std::string ret = "--server_load";
+   if (!path_to_log_file.empty()) {
+      ret += "=";
+      ret += path_to_log_file;
+   }
+   return ret;
+}
+const char* CtsApi::server_load_arg()       { return "server_load"; }
+
+
+std::string CtsApi::debug_server_on()      { return "--debug_server_on"; }
+const char* CtsApi::debug_server_on_arg()  { return "debug_server_on"; }
+std::string CtsApi::debug_server_off()     { return "--debug_server_off"; }
+const char* CtsApi::debug_server_off_arg() { return "debug_server_off"; }
+
+
+std::string CtsApi::begin(const std::string& suiteName, bool force) {
+
+   // *both* are optional
+   std::string ret = "--begin";
+   if (suiteName.empty() && !force) {
+      return ret;
+   }
+   if (!suiteName.empty()) {
+      ret += "=";
+      ret += suiteName;
+   }
+   if (force) {
+      if (suiteName.empty()) {
+         ret += "=--force";
+      }
+      else {
+         ret += " --force"; // note the space separator
+      }
+   }
+   return ret;
+}
+const char* CtsApi::beginArg() { return "begin"; }
+
+
+std::string CtsApi::checkJobGenOnly(const std::string& absNodePath)
+{
+   std::string ret = "--checkJobGenOnly";
+   if (!absNodePath.empty()) {
+      ret += "=";
+      ret += absNodePath;
+   }
+   return ret;
+}
+const char* CtsApi::checkJobGenOnlyArg() { return "checkJobGenOnly";}
+
+
+std::string CtsApi::job_gen(const std::string& absNodePath)
+{
+   std::string ret = "--job_gen";
+   if (!absNodePath.empty()) {
+      ret += "=";
+      ret += absNodePath;
+   }
+   return ret;
+}
+const char* CtsApi::job_genArg() { return "job_gen";}
+
+
+std::vector<std::string> CtsApi::check(const std::vector<std::string>& paths)
+{
+   std::vector<std::string> retVec; retVec.reserve(2 + paths.size());
+   retVec.push_back("--check");
+   if (paths.empty()) retVec.push_back("_all_");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::check(const std::string& path)
+{
+   if (path.empty()) {
+      return CtsApi::check(std::vector<std::string>());
+   }
+   return CtsApi::check(std::vector<std::string>(1,path));
+}
+const char* CtsApi::check_arg() { return "check";}
+
+std::vector<std::string> CtsApi::delete_node(const std::vector<std::string>& paths, bool force, bool auto_confirm )
+{
+   std::vector<std::string> retVec; retVec.reserve(4 + paths.size());
+   retVec.push_back("--delete");
+   if (paths.empty()) {
+      retVec.push_back("_all_");
+   }
+   if (force)        {
+      retVec.push_back("force");
+   }
+   if (auto_confirm) {          // By default delete prompts
+      retVec.push_back("yes");  // yes means we don't prompt, and have automatically confirmed the delete
+   }
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::delete_node(const std::string& absNodePath, bool force, bool auto_confirm )
+{
+   if (absNodePath.empty()) return CtsApi::delete_node(std::vector<std::string>(),force,auto_confirm);
+   return CtsApi::delete_node(std::vector<std::string>(1,absNodePath),force,auto_confirm);
+}
+const char* CtsApi::delete_node_arg() { return "delete";}
+
+
+std::vector<std::string> CtsApi::suspend(const std::vector<std::string>& paths)
+{
+   std::vector<std::string> retVec; retVec.reserve(1 + paths.size());
+   retVec.push_back("--suspend");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::suspend(const std::string& path)
+{
+   return CtsApi::suspend(std::vector<std::string>(1,path));
+}
+const char* CtsApi::suspend_arg() { return "suspend";}
+
+
+std::vector<std::string> CtsApi::resume(const std::vector<std::string>& paths)
+{
+   std::vector<std::string> retVec; retVec.reserve(1 + paths.size());
+   retVec.push_back("--resume");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::resume(const std::string& path)
+{
+   return CtsApi::resume(std::vector<std::string>(1,path));
+}
+const char* CtsApi::resume_arg() { return "resume";}
+
+
+std::vector<std::string> CtsApi::kill(const std::vector<std::string>& paths)
+{
+   std::vector<std::string> retVec; retVec.reserve(1 + paths.size());
+   retVec.push_back("--kill");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::kill(const std::string& path)
+{
+   return CtsApi::kill(std::vector<std::string>(1,path));
+}
+const char* CtsApi::kill_arg() { return "kill";}
+
+
+std::vector<std::string> CtsApi::status(const std::vector<std::string>& paths)
+{
+   std::vector<std::string> retVec; retVec.reserve(1 + paths.size());
+   retVec.push_back("--status");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::status(const std::string& path)
+{
+   return CtsApi::status(std::vector<std::string>(1,path));
+}
+const char* CtsApi::statusArg() { return "status";}
+
+
+std::vector<std::string> CtsApi::edit_history(const std::vector<std::string>& paths)
+{
+   std::vector<std::string> retVec; retVec.reserve(1 + paths.size());
+   retVec.push_back("--edit_history");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::edit_history(const std::string& path)
+{
+   return CtsApi::edit_history(std::vector<std::string>(1,path));
+}
+const char* CtsApi::edit_history_arg() { return "edit_history";}
+
+
+std::string CtsApi::why(const std::string& absNodePath)
+{
+   if ( absNodePath.empty()) return "--why";
+   std::string ret = "--why=";
+   ret += absNodePath;
+   return ret;
+}
+const char* CtsApi::whyArg() { return "why";}
+
+std::string CtsApi::zombieGet()    { return "--zombie_get"; }
+const char* CtsApi::zombieGetArg() { return "zombie_get"; }
+
+std::vector<std::string> CtsApi::zombieFob(const std::string& task_path,const std::string& process_id, const std::string& password)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--zombie_fob="; ret += task_path;
+   retVec.push_back(ret);
+   retVec.push_back(process_id); // Note: order is important, even if empty
+   retVec.push_back(password);   // Note: order is important, even if empty
+   return retVec;
+}
+std::string CtsApi::zombieFobCli(const std::string& path) { std::string ret = "--zombie_fob="; ret += path; return ret;}
+const char* CtsApi::zombieFobArg() { return "zombie_fob";}
+
+std::vector<std::string> CtsApi::zombieFail(const std::string& task_path,const std::string& process_id, const std::string& password)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--zombie_fail="; ret += task_path;
+   retVec.push_back(ret);
+   retVec.push_back(process_id);  // Note: order is important, even if empty
+   retVec.push_back(password);    // Note: order is important, even if empty
+   return retVec;
+}
+std::string CtsApi::zombieFailCli(const std::string& path) { std::string ret = "--zombie_fail="; ret += path; return ret;}
+const char* CtsApi::zombieFailArg() { return "zombie_fail";}
+
+std::vector<std::string> CtsApi::zombieAdopt(const std::string& task_path,const std::string& process_id, const std::string& password)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--zombie_adopt="; ret += task_path;
+   retVec.push_back(ret);
+   retVec.push_back(process_id);  // Note: order is important, even if empty
+   retVec.push_back(password);    // Note: order is important, even if empty
+   return retVec;
+}
+std::string CtsApi::zombieAdoptCli(const std::string& path) { std::string ret = "--zombie_adopt="; ret += path; return ret;}
+const char* CtsApi::zombieAdoptArg() { return "zombie_adopt";}
+
+std::vector<std::string> CtsApi::zombieRemove(const std::string& task_path,const std::string& process_id, const std::string& password)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--zombie_remove="; ret += task_path;
+   retVec.push_back(ret);
+   retVec.push_back(process_id); // Note: order is important, even if empty
+   retVec.push_back(password);   // Note: order is important, even if empty
+   return retVec;
+}
+std::string CtsApi::zombieRemoveCli(const std::string& path) { std::string ret = "--zombie_remove="; ret += path; return ret;}
+const char* CtsApi::zombieRemoveArg() { return "zombie_remove";}
+
+std::vector<std::string> CtsApi::zombieBlock(const std::string& task_path,const std::string& process_id, const std::string& password)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--zombie_block="; ret += task_path;
+   retVec.push_back(ret);
+   retVec.push_back(process_id); // Note: order is important, even if empty
+   retVec.push_back(password);   // Note: order is important, even if empty
+   return retVec;
+}
+std::string CtsApi::zombieBlockCli(const std::string& path) { std::string ret = "--zombie_block="; ret += path; return ret;}
+const char* CtsApi::zombieBlockArg() { return "zombie_block";}
+
+
+std::vector<std::string> CtsApi::zombieKill(const std::string& task_path,const std::string& process_id, const std::string& password)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--zombie_kill="; ret += task_path;
+   retVec.push_back(ret);
+   retVec.push_back(process_id);  // Note: order is important, even if empty
+   retVec.push_back(password);    // Note: order is important, even if empty
+   return retVec;
+}
+std::string CtsApi::zombieKillCli(const std::string& path) { std::string ret = "--zombie_kill="; ret += path; return ret;}
+const char* CtsApi::zombieKillArg() { return "zombie_kill";}
+
+
+std::vector<std::string> CtsApi::requeue(const std::vector<std::string>& paths, const std::string& option)
+{
+   std::vector<std::string> retVec; retVec.reserve(2 + paths.size());
+   retVec.push_back("--requeue");
+   if (!option.empty()) retVec.push_back(option);
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::requeue(const std::string& absNodePath, const std::string& option)
+{
+   return CtsApi::requeue(std::vector<std::string>(1,absNodePath),option);
+}
+const char* CtsApi::requeueArg() { return "requeue"; }
+
+std::vector<std::string> CtsApi::run(const std::vector<std::string>& paths, bool force)
+{
+   std::vector<std::string> retVec; retVec.reserve(paths.size()+2);
+   retVec.push_back("--run");
+   if (force) retVec.push_back("force");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::run(const std::string& absNodePath, bool force)
+{
+   return CtsApi::run(std::vector<std::string>(1,absNodePath),force);
+}
+const char* CtsApi::runArg() { return "run"; }
+
+
+std::vector<std::string> CtsApi::order(const std::string& absNodePath,const std::string& orderType)
+{
+   std::vector<std::string> retVec; retVec.reserve(2);
+   std::string ret = "--order="; ret += absNodePath;
+   retVec.push_back(ret);
+   retVec.push_back(orderType);
+   return retVec;
+}
+const char* CtsApi::orderArg() { return "order"; }
+
+
+std::vector<std::string> CtsApi::replace(  const std::string& absNodePath,
+         const std::string& path_to_client_defs,
+         bool create_parents_as_required,
+         bool force)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+
+   std::string ret = "--replace="; ret += absNodePath;
+   retVec.push_back(ret);
+   retVec.push_back(path_to_client_defs);
+   if (create_parents_as_required) retVec.push_back("parent");
+   if (force) retVec.push_back("force");
+
+   return retVec;
+}
+const char* CtsApi::replace_arg()     { return "replace"; }
+
+
+std::string CtsApi::checkPtDefs(ecf::CheckPt::Mode m, int check_pt_interval, int check_pt_save_time_alarm)
+{
+    std::string ret = "--check_pt";
+    if (m != ecf::CheckPt::UNDEFINED || check_pt_interval != 0 || check_pt_save_time_alarm != 0) ret += "=";
+
+    switch (m) {
+       case ecf::CheckPt::NEVER:   ret += "never"; break;
+       case ecf::CheckPt::ON_TIME: ret += "on_time"; break;
+       case ecf::CheckPt::ALWAYS:  ret += "always"; break;
+       case ecf::CheckPt::UNDEFINED:   break; // leave empty
+       default: assert(false); break;
+    }
+
+    if (check_pt_interval != 0) {
+       if (m != ecf::CheckPt::UNDEFINED) ret += ":";
+       ret += boost::lexical_cast<std::string>(check_pt_interval);
+    }
+    else {
+       if (m == ecf::CheckPt::UNDEFINED && check_pt_save_time_alarm != 0) {
+          ret += "alarm:";
+          ret += boost::lexical_cast<std::string>(check_pt_save_time_alarm);
+       }
+    }
+    return ret;
+}
+const char* CtsApi::checkPtDefsArg()     { return "check_pt"; }
+
+std::string CtsApi::restoreDefsFromCheckPt()   { return "--restore_from_checkpt"; }
+const char* CtsApi::restoreDefsFromCheckPtArg(){ return "restore_from_checkpt"; }
+
+
+std::string CtsApi::logMsg(const std::string& theMsgToLog) {
+   std::string ret =  "--msg=";
+   ret += theMsgToLog;
+   return ret;
+}
+const char* CtsApi::logMsgArg() { return "msg"; }
+
+
+std::vector<std::string> CtsApi::force( const std::vector<std::string>& paths,
+         const std::string& state_or_event,
+         bool recursive,
+         bool set_repeats_to_last_value)
+{
+   std::vector<std::string> retVec; retVec.reserve(paths.size() + 3);
+
+   std::string ret = "--force="; ret += state_or_event;
+   retVec.push_back(ret);
+   if (recursive)                 retVec.push_back("recursive");
+   if (set_repeats_to_last_value) retVec.push_back("full");
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+
+std::vector<std::string> CtsApi::force( const std::string& path,
+         const std::string& state_or_event,
+         bool recursive,
+         bool set_repeats_to_last_value)
+{
+   return CtsApi::force(std::vector<std::string>(1,path),state_or_event,recursive,set_repeats_to_last_value);
+}
+const char* CtsApi::forceArg()  { return "force"; }
+
+
+std::vector<std::string> CtsApi::freeDep(const std::vector<std::string>& paths,bool trigger, bool all, bool date, bool time) {
+
+   std::vector<std::string> retVec; retVec.reserve(paths.size() + 4);
+
+   retVec.push_back("--free-dep");
+   if (all)        retVec.push_back("all");
+   else {
+      if (trigger) retVec.push_back("trigger");
+      if (date)    retVec.push_back("date");
+      if (time)    retVec.push_back("time");
+   }
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::freeDep(const std::string& path,bool trigger, bool all, bool date, bool time) {
+
+   return CtsApi::freeDep(std::vector<std::string>(1,path),trigger,all,date,time);
+}
+const char* CtsApi::freeDepArg()  { return "free-dep"; }
+
+
+std::vector<std::string> CtsApi::file(const std::string& absNodePath, const std::string& fileType, const std::string& max_lines)
+{
+   std::vector<std::string> retVec; retVec.reserve(3);
+   std::string ret = "--file="; ret += absNodePath;
+   retVec.push_back(ret);
+   retVec.push_back(fileType);
+   retVec.push_back(max_lines);
+   return retVec;
+}
+const char* CtsApi::fileArg()  { return "file"; }
+
+
+std::vector<std::string> CtsApi::plug(const std::string& sourcePath, const std::string& destPath)
+{
+   std::vector<std::string> retVec; retVec.reserve(2);
+
+   std::string ret = "--plug="; ret += sourcePath;
+   retVec.push_back(ret);
+   retVec.push_back(destPath);
+
+   return retVec;
+}
+const char* CtsApi::plugArg()     { return "plug"; }
+
+std::vector<std::string> CtsApi::alter(
+         const std::vector<std::string>& paths,
+         const std::string& alterType,
+         const std::string& attrType,
+         const std::string& name,
+         const std::string& value)
+{
+   std::vector<std::string> retVec; retVec.reserve(5 + paths.size());
+
+   retVec.push_back("--alter");
+   retVec.push_back(alterType);
+   retVec.push_back(attrType);
+   if ( !name.empty() )  retVec.push_back(name);
+   if ( !value.empty() ) retVec.push_back(value);
+   std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+   return retVec;
+}
+std::vector<std::string> CtsApi::alter(
+         const std::string& path,
+         const std::string& alterType,
+         const std::string& attrType,
+         const std::string& name,
+         const std::string& value)
+{
+   return CtsApi::alter(std::vector<std::string>(1,path),alterType,attrType,name,value);
+}
+const char* CtsApi::alterArg() { return "alter"; }
+
+
+std::string CtsApi::reloadwsfile()     { return "--reloadwsfile"; }
+const char* CtsApi::reloadwsfileArg()  { return "reloadwsfile"; }
+
+std::string CtsApi::group(const std::string& cmds) {
+   std::string ret = "--group=";
+   ret += cmds;
+   return ret;
+}
+const char* CtsApi::groupArg()  { return "group"; }
+
+std::vector<std::string> CtsApi::getLog(int lastLine) {
+   std::vector<std::string> retVec; retVec.reserve(2);
+   retVec.push_back("--log=get");
+   if (lastLine != 0) {
+      std::stringstream ss; ss << lastLine;
+      retVec.push_back(ss.str());
+   }
+   return retVec;
+}
+std::vector<std::string> CtsApi::new_log(const std::string& new_path) {
+   std::vector<std::string> retVec; retVec.reserve(2);
+   retVec.push_back("--log=new");
+   if (!new_path.empty()) retVec.push_back(new_path);
+   return retVec;
+}
+std::string CtsApi::clearLog()     { return "--log=clear"; }
+std::string CtsApi::flushLog()     { return "--log=flush"; }
+std::string CtsApi::get_log_path() { return "--log=path"; }
+
+
+std::string CtsApi::forceDependencyEval() { return "--force-dep-eval";}
+const char* CtsApi::forceDependencyEvalArg() { return "force-dep-eval";}
+
+
+std::vector<std::string> CtsApi::edit_script(
+         const std::string& path_to_task,
+         const std::string& edit_type,
+         const std::string& path_to_script,
+         bool create_alias,
+         bool run
+         )
+{
+   std::vector<std::string> retVec;
+   std::string ret =  "--edit_script=";
+   ret += path_to_task;
+   retVec.push_back(ret);
+   retVec.push_back(edit_type);
+   if (!path_to_script.empty()) retVec.push_back(path_to_script);
+   if (create_alias) retVec.push_back("create_alias");
+   if (!run) retVec.push_back("no_run");
+   return retVec;
+}
+const char* CtsApi::edit_script_arg() { return "edit_script";}
+
diff --git a/ecflow_4_0_7/Base/src/cts/CtsApi.hpp b/ecflow_4_0_7/Base/src/cts/CtsApi.hpp
new file mode 100644
index 0000000..d6c5c00
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CtsApi.hpp
@@ -0,0 +1,216 @@
+#ifndef CTS_API_HPP_
+#define CTS_API_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #74 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : (C)lient (t)o (s)erver API
+//============================================================================
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <vector>
+#include "NodeFwd.hpp"
+#include "CheckPt.hpp"
+
+// The two variant api must correspond i.e '--get' and 'get' since this is used by boost program options
+// *************************************************************************************
+// Note:: if the api requires multiple parameters it must return a std::vector<std::string>
+// ***************************************************************************************
+class CtsApi : private boost::noncopyable  {
+public:
+	static std::string to_string(const std::vector<std::string>& );
+
+   static std::string server_version();
+
+	// For python
+	static defs_ptr load( defs_ptr defs) { return defs;}
+	static std::vector<std::string> loadDefs(const std::string& filePath,bool force,bool check_only);
+   static std::string get(const std::string& absNodePath = "");
+   static std::string get_state(const std::string& absNodePath = "");
+   static std::string migrate(const std::string& absNodePath = "");
+   static std::vector<std::string> sync(unsigned int client_handle, unsigned int state_change_no, unsigned int modify_change_no );
+   static std::string sync_full(unsigned int client_handle);
+	static std::vector<std::string> news(unsigned int client_handle, unsigned int state_change_no, unsigned int modify_change_no );
+
+	static std::vector<std::string> ch_register(  bool auto_add_new_suites, const std::vector<std::string>& suites);
+   static std::string ch_suites();
+   static std::string ch_drop(int client_handle);
+   static std::string ch_drop_user(const std::string& user);
+	static std::vector<std::string> ch_add(int client_handle, const std::vector<std::string>& suites);
+	static std::vector<std::string> ch_remove(int client_handle, const std::vector<std::string>& suites);
+	static std::vector<std::string> ch_auto_add(int client_handle,  bool auto_add_new_suites);
+	static std::string suites(); // returns list if all suites, and client handles.
+
+	static std::string restartServer();
+	static std::string haltServer(bool auto_confirm = true);
+	static std::string shutdownServer(bool auto_confirm = true);
+	static std::string terminateServer(bool auto_confirm = true);
+   static std::string pingServer();
+   static std::string server_load(const std::string& path_to_log_file);
+   static std::string debug_server_on();
+   static std::string debug_server_off();
+
+	// odd one out, take multi-args but expects string
+	static std::string begin(const std::string& suiteName = "", bool force = false); // no suite begins all suites
+
+   static std::string job_gen(const std::string& absNodePath = "");
+   static std::string checkJobGenOnly(const std::string& absNodePath = "");
+
+   static std::vector<std::string> check(const std::string& absNodePath = "");
+   static std::vector<std::string> check(const std::vector<std::string>& paths);
+   static std::vector<std::string> delete_node(const std::vector<std::string>& paths, bool force = false, bool auto_confirm = true); // no paths specified ,delete all suites, for test
+   static std::vector<std::string> delete_node(const std::string& absNodePath = "", bool force = false, bool auto_confirm = true); // no node specified ,delete all suites, for test
+   static std::vector<std::string> suspend(const std::string& absNodePath);
+   static std::vector<std::string> suspend(const std::vector<std::string>& paths);
+	static std::vector<std::string> resume(const std::string& absNodePath);
+   static std::vector<std::string> resume(const std::vector<std::string>& paths);
+	static std::vector<std::string> kill(const std::string& absNodePath);
+   static std::vector<std::string> kill(const std::vector<std::string>& paths);
+   static std::vector<std::string> status(const std::string& absNodePath);
+   static std::vector<std::string> status(const std::vector<std::string>& paths);
+   static std::vector<std::string> edit_history(const std::vector<std::string>& paths);
+   static std::vector<std::string> edit_history(const std::string& absNodePath);
+
+	static std::string why(const std::string& absNodePath);
+	static std::string zombieGet();
+	static std::vector<std::string> zombieFob(const std::string& task_path,const std::string& process_id, const std::string& password);
+	static std::vector<std::string> zombieFail(const std::string& task_path,const std::string& process_id, const std::string& password);
+	static std::vector<std::string> zombieAdopt(const std::string& task_path,const std::string& process_id, const std::string& password);
+	static std::vector<std::string> zombieRemove(const std::string& task_path,const std::string& process_id, const std::string& password);
+   static std::vector<std::string> zombieBlock(const std::string& task_path,const std::string& process_id, const std::string& password);
+   static std::vector<std::string> zombieKill(const std::string& task_path,const std::string& process_id, const std::string& password);
+	static std::string zombieFobCli(const std::string& task_path);
+	static std::string zombieFailCli(const std::string& task_path);
+	static std::string zombieAdoptCli(const std::string& task_path);
+	static std::string zombieRemoveCli(const std::string& task_path);
+   static std::string zombieBlockCli(const std::string& task_path);
+   static std::string zombieKillCli(const std::string& task_path);
+
+	static std::vector<std::string> replace(  const std::string& absNodePath,
+	                                              const std::string& path_to_client_defs,
+	                                              bool create_parents_as_required = true,
+	                                              bool force = false);
+   static std::vector<std::string> requeue(const std::vector<std::string>& paths, const std::string& option/* [ "" | "force" | "abort" ] */);
+   static std::vector<std::string> requeue(const std::string& absNodePath, const std::string& option/* [ "" | "force" | "abort" ] */);
+   static std::vector<std::string> run(const std::vector<std::string>& paths,bool force = false);
+   static std::vector<std::string> run(const std::string& absNodePath,bool force = false);
+	static std::vector<std::string> order(const std::string& absNodePath,const std::string& orderType);
+
+	static std::string checkPtDefs(ecf::CheckPt::Mode m = ecf::CheckPt::UNDEFINED, int check_pt_interval = 0, int check_pt_save_time_alarm = 0);
+	static std::string restoreDefsFromCheckPt();
+
+	static std::vector<std::string> force(const std::vector<std::string>& paths,const std::string& state_or_event,bool recursive = false,bool set_repeats_to_last_value = false);
+   static std::vector<std::string> force(const std::string& path,const std::string& state_or_event,bool recursive = false,bool set_repeats_to_last_value = false);
+
+   static std::vector<std::string> freeDep(const std::vector<std::string>& paths,bool trigger = true, bool all = false, bool date = false, bool time = false);
+   static std::vector<std::string> freeDep(const std::string& absNodePath,bool trigger = true, bool all = false, bool date = false, bool time = false);
+
+	static std::vector<std::string> file(const std::string& absNodePath, const std::string& fileType, const std::string& max_lines);
+	static std::vector<std::string> plug(const std::string& sourcePath, const std::string& destPath);
+
+	static std::vector<std::string> alter(const std::string& path,
+	                                      const std::string& alterType, /* one of [ 'add' | 'change' | 'delete' | 'set_flag' | 'clear_flag' ] */
+	                                      const std::string& attrType,
+	                                      const std::string& name = "",
+	                                      const std::string& value = "");
+   static std::vector<std::string> alter(const std::vector<std::string>& paths,
+                                         const std::string& alterType, /* one of [ 'add' | 'change' | 'delete' | 'set_flag' | 'clear_flag' ] */
+                                         const std::string& attrType,
+                                         const std::string& name = "",
+                                         const std::string& value = "");
+
+	static std::string reloadwsfile();
+
+	// "expect string of the form "shutdown; get" must be ';' separated
+	static std::string group(const std::string& cmds);
+
+	static std::string logMsg(const std::string& theMsgToLog);
+	static std::vector<std::string> getLog(int lastLines  = 0);
+	static std::vector<std::string> new_log(const std::string& new_path);
+   static std::string get_log_path();
+   static std::string clearLog();
+	static std::string flushLog();
+	static std::string forceDependencyEval();
+
+   static std::string stats();
+   static std::string stats_reset();
+ 	static std::vector<std::string> edit_script(const std::string& path_to_task,
+ 	                                            const std::string& edit_type,
+ 	                                            const std::string& path_to_script = "",
+ 	                                            bool create_alias = false,
+ 	                                            bool run = true);
+
+ 	// Only to be used in Cmd
+   static const char* server_version_arg();
+   static const char* statsArg();
+   static const char* stats_reset_arg();
+	static const char* suitesArg();
+	static const char* ch_register_arg();
+   static const char* ch_drop_arg();
+   static const char* ch_suites_arg();
+   static const char* ch_drop_user_arg();
+	static const char* ch_add_arg();
+	static const char* ch_remove_arg();
+	static const char* ch_auto_add_arg();
+
+	static const char* terminateServerArg();
+	static const char* restartServerArg();
+	static const char* haltServerArg();
+	static const char* shutdownServerArg();
+   static const char* pingServerArg();
+   static const char* server_load_arg();
+   static const char* debug_server_on_arg();
+   static const char* debug_server_off_arg();
+
+   static const char* getArg();
+   static const char* get_state_arg();
+   static const char* migrate_arg();
+   static const char* syncArg();
+   static const char* sync_full_arg();
+	static const char* newsArg();
+	static const char* loadDefsArg();
+	static const char* beginArg();
+   static const char* job_genArg();
+   static const char* check_arg();
+   static const char* checkJobGenOnlyArg();
+	static const char* delete_node_arg();
+	static const char* suspend_arg();
+	static const char* resume_arg();
+	static const char* kill_arg();
+   static const char* statusArg();
+   static const char* edit_history_arg();
+	static const char* whyArg();
+	static const char* zombieGetArg();
+	static const char* zombieFobArg();
+	static const char* zombieFailArg();
+	static const char* zombieAdoptArg();
+	static const char* zombieRemoveArg();
+   static const char* zombieBlockArg();
+   static const char* zombieKillArg();
+	static const char* replace_arg();
+	static const char* requeueArg();
+	static const char* runArg();
+	static const char* orderArg();
+	static const char* checkPtDefsArg();
+	static const char* restoreDefsFromCheckPtArg();
+	static const char* logMsgArg();
+	static const char* forceArg();
+	static const char* freeDepArg();
+	static const char* fileArg();
+	static const char* plugArg();
+	static const char* reloadwsfileArg();
+	static const char* groupArg();
+	static const char* forceDependencyEvalArg();
+	static const char* alterArg();
+	static const char* edit_script_arg();
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/cts/CtsCmd.cpp b/ecflow_4_0_7/Base/src/cts/CtsCmd.cpp
new file mode 100644
index 0000000..3be6910
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CtsCmd.cpp
@@ -0,0 +1,390 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #81 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/lexical_cast.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Jobs.hpp"
+#include "JobsParam.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "Ecf.hpp"
+#include "Gnuplot.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+// *IMPORTANT*: STATS_RESET was introduced in release 4.0.5
+
+std::ostream& CtsCmd::print(std::ostream& os) const
+{
+   switch (api_) {
+      case CtsCmd::GET_ZOMBIES:                return user_cmd(os,CtsApi::zombieGet()); break;
+      case CtsCmd::RESTORE_DEFS_FROM_CHECKPT:  return user_cmd(os,CtsApi::restoreDefsFromCheckPt()); break;
+      case CtsCmd::RESTART_SERVER:             return user_cmd(os,CtsApi::restartServer()); break;
+      case CtsCmd::SHUTDOWN_SERVER:            return user_cmd(os,CtsApi::shutdownServer()); break;
+      case CtsCmd::HALT_SERVER:                return user_cmd(os,CtsApi::haltServer()); break;
+      case CtsCmd::TERMINATE_SERVER:           return user_cmd(os,CtsApi::terminateServer()); break;
+      case CtsCmd::RELOAD_WHITE_LIST_FILE:     return user_cmd(os,CtsApi::reloadwsfile()); break;
+      case CtsCmd::FORCE_DEP_EVAL:             return user_cmd(os,CtsApi::forceDependencyEval()); break;
+      case CtsCmd::PING:                       return user_cmd(os,CtsApi::pingServer()); break;
+      case CtsCmd::STATS:                      return user_cmd(os,CtsApi::stats()); break;
+      case CtsCmd::STATS_RESET:                return user_cmd(os,CtsApi::stats_reset()); break;
+      case CtsCmd::SUITES:                     return user_cmd(os,CtsApi::suites()); break;
+      case CtsCmd::DEBUG_SERVER_ON:            return user_cmd(os,CtsApi::debug_server_on()); break;
+      case CtsCmd::DEBUG_SERVER_OFF:           return user_cmd(os,CtsApi::debug_server_off()); break;
+      case CtsCmd::SERVER_LOAD:                return user_cmd(os,CtsApi::server_load("")); break;
+      case CtsCmd::NO_CMD:                     assert(false); break;
+      default: assert(false); break;
+   }
+   return os;
+}
+
+bool CtsCmd::equals(ClientToServerCmd* rhs) const
+{
+   CtsCmd* the_rhs = dynamic_cast< CtsCmd* > ( rhs );
+   if ( !the_rhs ) return false;
+   if (api_ != the_rhs->api()) return false;
+   return UserCmd::equals(rhs);
+}
+
+bool CtsCmd::isWrite() const
+{
+   switch (api_) {
+      case CtsCmd::GET_ZOMBIES:      return false; break; // read only
+      case CtsCmd::RESTORE_DEFS_FROM_CHECKPT: return true; break;  // requires write privilege
+      case CtsCmd::RESTART_SERVER:   return true; break;  // requires write privilege
+      case CtsCmd::SHUTDOWN_SERVER:  return true; break;  // requires write privilege
+      case CtsCmd::HALT_SERVER:      return true; break;  // requires write privilege
+      case CtsCmd::TERMINATE_SERVER: return true; break;  // requires write privilege
+      case CtsCmd::RELOAD_WHITE_LIST_FILE:return true; break;  // requires write privilege
+      case CtsCmd::FORCE_DEP_EVAL:   return true; break;       // requires write privilege
+      case CtsCmd::PING:             return false; break;      // read only
+      case CtsCmd::STATS:            return false; break;      // read only
+      case CtsCmd::STATS_RESET:      return true; break;       // requires write privilege
+      case CtsCmd::SUITES:           return false; break;      // read only
+      case CtsCmd::DEBUG_SERVER_ON:  return false; break;      // read only
+      case CtsCmd::DEBUG_SERVER_OFF: return false; break;      // read only
+      case CtsCmd::SERVER_LOAD:      return false; break;      // read only
+      case CtsCmd::NO_CMD:           assert(false); break;
+      default: assert(false); break;
+   }
+   assert(false);
+   return false;
+}
+
+int CtsCmd::timeout() const
+{
+   if (api_ == CtsCmd::PING) return 10;
+   return ClientToServerCmd::timeout();
+}
+
+const char* CtsCmd::theArg() const
+{
+   switch (api_) {
+      case CtsCmd::GET_ZOMBIES:      return CtsApi::zombieGetArg(); break;
+      case CtsCmd::RESTORE_DEFS_FROM_CHECKPT:  return CtsApi::restoreDefsFromCheckPtArg(); break;
+      case CtsCmd::RESTART_SERVER:   return CtsApi::restartServerArg(); break;
+      case CtsCmd::SHUTDOWN_SERVER:  return CtsApi::shutdownServerArg(); break;
+      case CtsCmd::HALT_SERVER:      return CtsApi::haltServerArg(); break;
+      case CtsCmd::TERMINATE_SERVER: return CtsApi::terminateServerArg(); break;
+      case CtsCmd::RELOAD_WHITE_LIST_FILE:return CtsApi::reloadwsfileArg(); break;
+      case CtsCmd::FORCE_DEP_EVAL:   return CtsApi::forceDependencyEvalArg(); break;
+      case CtsCmd::PING:             return CtsApi::pingServerArg(); break;
+      case CtsCmd::STATS:            return CtsApi::statsArg(); break;
+      case CtsCmd::STATS_RESET:      return CtsApi::stats_reset_arg(); break;
+      case CtsCmd::SUITES:           return CtsApi::suitesArg(); break;
+      case CtsCmd::DEBUG_SERVER_ON:  return CtsApi::debug_server_on_arg(); break;
+      case CtsCmd::DEBUG_SERVER_OFF: return CtsApi::debug_server_off_arg(); break;
+      case CtsCmd::SERVER_LOAD:      return CtsApi::server_load_arg(); break;
+      case CtsCmd::NO_CMD:           assert(false); break;
+      default: assert(false); break;
+   }
+   assert(false);
+   return NULL;
+}
+
+STC_Cmd_ptr CtsCmd::doHandleRequest(AbstractServer* as) const
+{
+   switch (api_) {
+      case CtsCmd::GET_ZOMBIES: {
+         as->update_stats().zombie_get_++;
+         return PreAllocatedReply::zombie_get_cmd( as );
+      }
+
+      case CtsCmd::RESTORE_DEFS_FROM_CHECKPT: {
+         as->update_stats().restore_defs_from_checkpt_++;
+         as->restore_defs_from_checkpt(); // this can throw, i.e. if server not halted, or defs has suites, etc
+         break;
+      }
+
+      case CtsCmd::RESTART_SERVER: {
+         as->update_stats().restart_server_++;
+         as->restart();
+         return doJobSubmission( as );
+      }
+      case CtsCmd::SHUTDOWN_SERVER:  as->update_stats().shutdown_server_++; as->shutdown();  break;
+      case CtsCmd::HALT_SERVER:      as->update_stats().halt_server_++;     as->halted();   break;
+      case CtsCmd::TERMINATE_SERVER: as->checkPtDefs();  break;
+      case CtsCmd::RELOAD_WHITE_LIST_FILE: {
+         as->update_stats().reload_white_list_file_++;
+         std::string errorMsg;
+         if (!as->reloadWhiteListFile(errorMsg)) {
+            throw std::runtime_error( errorMsg ) ;
+         }
+         break;
+      }
+      case CtsCmd::FORCE_DEP_EVAL: {
+         // The Default JobsParam does *not* allow Job creation, & hence => does not submit jobs
+         // The default does *not* allow job spawning
+         Jobs jobs(as->defs());
+         JobsParam jobsParam;  // create jobs =  false, spawn_jobs = false
+         if (!jobs.generate(jobsParam)) throw std::runtime_error( jobsParam.getErrorMsg() ) ;
+         break;
+      }
+      case CtsCmd::PING:         as->update_stats().ping_++; break;
+      case CtsCmd::STATS:        as->update_stats().stats_++;  return PreAllocatedReply::stats_cmd( as ); break;
+      case CtsCmd::STATS_RESET:  as->update_stats().reset(); break; // we could have done as->update_stats().stats_++, to honor reset, we dont
+      case CtsCmd::SUITES: as->update_stats().suites_++; return PreAllocatedReply::suites_cmd( as ); break;
+      case CtsCmd::DEBUG_SERVER_ON:  as->update_stats().debug_server_on_++;  as->debug_server_on(); break;
+      case CtsCmd::DEBUG_SERVER_OFF: as->update_stats().debug_server_off_++; as->debug_server_off(); break;
+      case CtsCmd::SERVER_LOAD: {    as->update_stats().server_load_cmd_++;
+         if (Log::instance()) {
+            return PreAllocatedReply::server_load_cmd(  Log::instance()->path() );
+         }
+         break;
+      }
+      case CtsCmd::NO_CMD: assert(false); break;
+      default: assert(false); break;
+   }
+
+   return PreAllocatedReply::ok_cmd();
+}
+
+static const char* server_load_desc() {
+   /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   return
+            "Shows the server load graphically, by parsing the log file.\n"
+            "If no log file is provided, then the log file path is obtained from\n"
+            "the server. *If* this file is accessible from the client, then a\n"
+            "graphical view of the server load is shown.\n"
+            "This command assumes that gnuplot is available on $PATH. This command\n"
+            "produces two files in the CWD 'gnuplot.dat' and 'gnuplot.script'.\n"
+            "This generated script can be manually changed, to see different rendering\n"
+            "effects. i.e. just run 'gnuplot gnuplot.script'\n\n"
+            "  arg1 = <optional> path to log file\n"
+            "If the path to log file is known, it is *preferable* to use this,\n"
+            "rather than requesting the log path from the server.\n"
+            "Usage:\n"
+            "   --server_load=/path/to_log_file  # parses log and shows a gnuplot window\n"
+            "   --server_load                    # log file path is requested from server\n"
+            "                                    # which is then used to produce gnuplot window\n"
+            "                                    # *AVOID* if log file path is accessible"
+            ;
+}
+
+void CtsCmd::addOption(boost::program_options::options_description& desc) const
+{
+   switch (api_) {
+      case CtsCmd::GET_ZOMBIES:{
+         desc.add_options()(CtsApi::zombieGetArg(),
+                  "Returns the list of zombies from the server.\n"
+                  "Results reported to standard output."
+         );
+         break;
+      }
+      case CtsCmd::RESTORE_DEFS_FROM_CHECKPT:{
+         desc.add_options()(CtsApi::restoreDefsFromCheckPtArg(),
+                  "Ask the server to load the definition from an check pt file.\n"
+                  "The server must be halted and the definition in the server must be deleted\n"
+                  "first, otherwise an error is returned"
+         );
+         break;
+      }
+      case CtsCmd::RESTART_SERVER:{
+         desc.add_options()( CtsApi::restartServerArg(),
+                  "Start job scheduling, communication with jobs, and respond to all requests.\n"
+                  "The following table shows server behaviour in the different states.\n"
+                  "|----------------------------------------------------------------------------------|\n"
+                  "| Server State | User Request | Task Request |Job Scheduling | Auto-Check-pointing |\n"
+                  "|--------------|--------------|--------------|---------------|---------------------|\n"
+                  "|     RUNNING  |    yes       |      yes     |      yes      |      yes            |\n"
+                  "|    SHUTDOWN  |    yes       |      yes     |      no       |      yes            |\n"
+                  "|      HALTED  |    yes       |      no      |      no       |      no             |\n"
+                  "|--------------|--------------|--------------|---------------|---------------------|"
+         );
+         break;
+      }
+      case CtsCmd::SHUTDOWN_SERVER: {
+         desc.add_options()( CtsApi::shutdownServerArg(),po::value< string >()->implicit_value( string("") ),
+                  "Stop server from scheduling new jobs.\n"
+                  "  arg1 = yes(optional) # use to bypass confirmation prompt\n"
+                  "The following table shows server behaviour in the different states.\n"
+                  "|----------------------------------------------------------------------------------|\n"
+                  "| Server State | User Request | Task Request |Job Scheduling | Auto-Check-pointing |\n"
+                  "|--------------|--------------|--------------|---------------|---------------------|\n"
+                  "|     RUNNING  |    yes       |      yes     |      yes      |      yes            |\n"
+                  "|    SHUTDOWN  |    yes       |      yes     |      no       |      yes            |\n"
+                  "|      HALTED  |    yes       |      no      |      no       |      no             |\n"
+                  "|--------------|--------------|--------------|---------------|---------------------|"
+         );
+         break;
+      }
+      case CtsCmd::HALT_SERVER: {
+         desc.add_options()( CtsApi::haltServerArg(),po::value< string >()->implicit_value( string("") ),
+                  "Stop server communication with jobs, and new job scheduling.\n"
+                  "Also stops automatic check pointing\n"
+                  "  arg1 = yes(optional) # use to bypass confirmation prompt\n"
+                  "The following table shows server behaviour in the different states.\n"
+                  "|----------------------------------------------------------------------------------|\n"
+                  "| Server State | User Request | Task Request |Job Scheduling | Auto-Check-pointing |\n"
+                  "|--------------|--------------|--------------|---------------|---------------------|\n"
+                  "|     RUNNING  |    yes       |      yes     |      yes      |      yes            |\n"
+                  "|    SHUTDOWN  |    yes       |      yes     |      no       |      yes            |\n"
+                  "|      HALTED  |    yes       |      no      |      no       |      no             |\n"
+                  "|--------------|--------------|--------------|---------------|---------------------|"
+         );
+         break;
+      }
+      case CtsCmd::TERMINATE_SERVER:{
+         desc.add_options()( CtsApi::terminateServerArg(),po::value< string >()->implicit_value( string("") ),
+                  "Terminate the server.\n"
+                  "  arg1 = yes(optional) # use to bypass confirmation prompt"
+         );
+         break;
+      }
+      case CtsCmd::RELOAD_WHITE_LIST_FILE:{
+         desc.add_options()( CtsApi::reloadwsfileArg(),
+                  "Reload the white list file.\n"
+                  "The white list file is used to authenticate 'user' commands.\n"
+                  "Raises an error if file does not exist, or fails to parse\n"
+                  "Expected format for this file is:\n\n"
+                  "# comment\n"
+                  "4.4.14  # version number\n\n"
+                  "# Users with read/write access\n"
+                  "user1   # comment\n"
+                  "user2   # comment\n\n"
+                  "# Users with read  access, must have - before user name\n"
+                  "-user3  # comment\n"
+                  "-user4"
+         );
+         break;
+      }
+      case CtsCmd::FORCE_DEP_EVAL:{
+         desc.add_options()( CtsApi::forceDependencyEvalArg(),
+                  "Force dependency evaluation. Used for DEBUG only."
+         );
+         break;
+      }
+      case CtsCmd::PING:{
+         desc.add_options()( CtsApi::pingServerArg(),
+                  "Check if server is running on given host/port. Result reported to standard output.\n"
+                  "Usage:\n"
+                  "  --ping --host=mach --port=3144 # Check if server alive on host mach & port 3144\n"
+                  "  --ping --host=fred              # Check if server alive on host fred and port ECF_PORT,\n"
+                  "                                  # otherwise default port of 3141\n"
+                  "  --ping                          # Check if server alive by using environment variables\n"
+                  "                                  # ECF_NODE and ECF_PORT\n"
+                  "If ECF_NODE not defined uses 'localhost', if ECF_PORT not defined assumes 3141"
+         );
+         break;
+      }
+      case CtsCmd::STATS:{
+         desc.add_options()( CtsApi::statsArg(),
+                  "Returns the server statistics."
+         );
+         break;
+      }
+      case CtsCmd::STATS_RESET:{
+         desc.add_options()( CtsApi::stats_reset_arg(),
+                  "Resets the server statistics."
+         );
+         break;
+      }
+      case CtsCmd::SUITES:{
+         desc.add_options()( CtsApi::suitesArg(),
+                  "Returns the list of suites, in the order defined in the server."
+         );
+         break;
+      }
+      case CtsCmd::DEBUG_SERVER_ON:   {
+         desc.add_options()( CtsApi::debug_server_on_arg(),
+                  "Enables debug output from the server"
+         );
+         break;
+      }
+      case CtsCmd::DEBUG_SERVER_OFF:  {
+         desc.add_options()( CtsApi::debug_server_off_arg(),
+                  "Disables debug output from the server"
+         );
+         break;
+      }
+      case CtsCmd::SERVER_LOAD:  {
+         desc.add_options()( CtsApi::server_load_arg(),po::value< std::string >()->implicit_value( string("") ), server_load_desc() );
+         break;
+      }
+      case CtsCmd::NO_CMD: assert(false); break;
+      default: assert(false); break;
+   }
+}
+
+bool CtsCmd::handleRequestIsTestable() const {
+   if (api_ == CtsCmd::TERMINATE_SERVER) return false;
+   if (api_ == CtsCmd::RESTORE_DEFS_FROM_CHECKPT) return false;
+   return true;
+}
+
+void CtsCmd::create( 	Cmd_ptr& cmd,
+         boost::program_options::variables_map& vm,
+         AbstractClientEnv*  ac ) const
+{
+   if (ac->debug()) cout << "CtsCmd::create api = '" << api_ << "'.\n";
+
+   assert( api_ != CtsCmd::NO_CMD);
+
+   if (api_ == CtsCmd::HALT_SERVER || api_ == CtsCmd::SHUTDOWN_SERVER || api_ == CtsCmd::TERMINATE_SERVER) {
+
+      std::string do_prompt = vm[ theArg() ].as< std::string > ();
+      if (do_prompt.empty()) {
+         if (api_ == CtsCmd::HALT_SERVER)          prompt_for_confirmation("Are you sure you want to halt the server ? ");
+         else if (api_ == CtsCmd::SHUTDOWN_SERVER) prompt_for_confirmation("Are you sure you want to shut down the server ? ");
+         else                                      prompt_for_confirmation("Are you sure you want to terminate the server ? ");
+      }
+      else if ( do_prompt != "yes" )
+         throw std::runtime_error("Halt, shutdown and terminate expected 'yes' as the only argument to bypass the confirmation prompt");
+   }
+   else if ( api_ == CtsCmd::SERVER_LOAD) {
+
+      std::string log_file = vm[ theArg() ].as< std::string > ();
+      if (ac->debug()) std::cout << "   CtsCmd::create CtsCmd::SERVER_LOAD " << log_file << "\n";
+
+      if (!log_file.empty()) {
+
+         // testing client interface
+         if (ac->under_test())  return;
+
+         // No need to call server. Parse the log file to create gnu_plot file.
+         Gnuplot::show_server_load(log_file);
+         return; // Don't create command, since with log file, it is client specific only
+      }
+   }
+   cmd = Cmd_ptr(new CtsCmd( api_ ));
+}
+
+std::ostream& operator<<(std::ostream& os, const CtsCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.cpp b/ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.cpp
new file mode 100644
index 0000000..aa5f779
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.cpp
@@ -0,0 +1,145 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #52 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/make_shared.hpp>
+#include "CtsCmdRegistry.hpp"
+#include "ClientToServerCmd.hpp"
+#include "AbstractClientEnv.hpp"
+namespace po = boost::program_options;
+
+
+CtsCmdRegistry::CtsCmdRegistry(bool addGroupCmd)
+{
+	// If a new client to server command is added. Make sure to add it here.
+	// Could have used static initialisation' but this is less problematic.
+
+   /// The order dictates how the --help is shown *BUT* Since we traverse this list.
+   /// Place the command which require the fastest response first.
+   vec_.reserve(70);
+
+	vec_.push_back( boost::make_shared<CSyncCmd>(CSyncCmd::NEWS,0,0,0));
+   vec_.push_back( boost::make_shared<CSyncCmd>(CSyncCmd::SYNC,0,0,0));
+   vec_.push_back( boost::make_shared<CSyncCmd>(0)); // SYNC_FULL
+   vec_.push_back( boost::make_shared<CtsNodeCmd>(CtsNodeCmd::GET));
+   vec_.push_back( boost::make_shared<CtsNodeCmd>(CtsNodeCmd::GET_STATE));
+   vec_.push_back( boost::make_shared<CtsNodeCmd>(CtsNodeCmd::MIGRATE));
+   vec_.push_back( boost::make_shared<CheckPtCmd>());
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::PING));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::RESTORE_DEFS_FROM_CHECKPT));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::RESTART_SERVER));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::HALT_SERVER));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::SHUTDOWN_SERVER));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::TERMINATE_SERVER));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::RELOAD_WHITE_LIST_FILE));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::FORCE_DEP_EVAL));
+   vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::STATS));
+   vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::STATS_RESET));
+   vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::DEBUG_SERVER_ON));
+   vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::DEBUG_SERVER_OFF));
+   vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::SERVER_LOAD));
+   vec_.push_back( boost::make_shared<CtsNodeCmd>(CtsNodeCmd::JOB_GEN));
+   vec_.push_back( boost::make_shared<CtsNodeCmd>(CtsNodeCmd::CHECK_JOB_GEN_ONLY));
+   vec_.push_back( boost::make_shared<PathsCmd>(PathsCmd::DELETE));
+   vec_.push_back( boost::make_shared<PathsCmd>(PathsCmd::SUSPEND));
+   vec_.push_back( boost::make_shared<PathsCmd>(PathsCmd::RESUME));
+   vec_.push_back( boost::make_shared<PathsCmd>(PathsCmd::KILL));
+   vec_.push_back( boost::make_shared<PathsCmd>(PathsCmd::STATUS));
+   vec_.push_back( boost::make_shared<PathsCmd>(PathsCmd::CHECK));
+   vec_.push_back( boost::make_shared<PathsCmd>(PathsCmd::EDIT_HISTORY));
+	vec_.push_back( boost::make_shared<ZombieCmd>(ecf::User::FOB));
+	vec_.push_back( boost::make_shared<ZombieCmd>(ecf::User::FAIL));
+	vec_.push_back( boost::make_shared<ZombieCmd>(ecf::User::ADOPT));
+	vec_.push_back( boost::make_shared<ZombieCmd>(ecf::User::BLOCK));
+   vec_.push_back( boost::make_shared<ZombieCmd>(ecf::User::REMOVE));
+   vec_.push_back( boost::make_shared<ZombieCmd>(ecf::User::KILL));
+	vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::GET_ZOMBIES));
+   vec_.push_back( boost::make_shared<CtsCmd>(CtsCmd::SUITES));
+	vec_.push_back( boost::make_shared<ClientHandleCmd>(ClientHandleCmd::REGISTER));
+   vec_.push_back( boost::make_shared<ClientHandleCmd>(ClientHandleCmd::DROP));
+   vec_.push_back( boost::make_shared<ClientHandleCmd>(ClientHandleCmd::DROP_USER));
+	vec_.push_back( boost::make_shared<ClientHandleCmd>(ClientHandleCmd::ADD));
+	vec_.push_back( boost::make_shared<ClientHandleCmd>(ClientHandleCmd::REMOVE));
+   vec_.push_back( boost::make_shared<ClientHandleCmd>(ClientHandleCmd::AUTO_ADD));
+   vec_.push_back( boost::make_shared<ClientHandleCmd>(ClientHandleCmd::SUITES));
+   vec_.push_back( boost::make_shared<LogCmd>());
+   vec_.push_back( boost::make_shared<ServerVersionCmd>());
+	vec_.push_back( boost::make_shared<LogMessageCmd>());
+	vec_.push_back( boost::make_shared<BeginCmd>());
+	vec_.push_back( boost::make_shared<InitCmd>());
+	vec_.push_back( boost::make_shared<CompleteCmd>());
+	vec_.push_back( boost::make_shared<AbortCmd>());
+	vec_.push_back( boost::make_shared<CtsWaitCmd>());
+	vec_.push_back( boost::make_shared<EventCmd>());
+	vec_.push_back( boost::make_shared<MeterCmd>());
+	vec_.push_back( boost::make_shared<LabelCmd>());
+	vec_.push_back( boost::make_shared<RequeueNodeCmd>());
+	vec_.push_back( boost::make_shared<OrderNodeCmd>());
+	vec_.push_back( boost::make_shared<RunNodeCmd>());
+	vec_.push_back( boost::make_shared<ForceCmd>());
+	vec_.push_back( boost::make_shared<FreeDepCmd>());
+	vec_.push_back( boost::make_shared<LoadDefsCmd>());
+	vec_.push_back( boost::make_shared<ReplaceNodeCmd>());
+	vec_.push_back( boost::make_shared<CFileCmd>());
+	vec_.push_back( boost::make_shared<EditScriptCmd>());
+	vec_.push_back( boost::make_shared<AlterCmd>());
+	vec_.push_back( boost::make_shared<PlugCmd>());
+	// Note: we deliberately do not add MoveCmd, as it should not appear in the public api
+	//       It is created on the fly by the PlugCmd
+
+	/// Command that can *ONLY* be used in a group command
+	vec_.push_back( boost::make_shared<CtsNodeCmd>(CtsNodeCmd::WHY));
+	vec_.push_back( boost::make_shared<ShowCmd>());
+	if (addGroupCmd) vec_.push_back( boost::make_shared<GroupCTSCmd>());
+}
+
+bool CtsCmdRegistry::parse(Cmd_ptr& cmd,
+                           boost::program_options::variables_map& vm,
+                           AbstractClientEnv* clientEnv ) const
+{
+	size_t vec_size = vec_.size();
+	for(size_t i = 0; i < vec_size; i++) {
+
+		if ( vm.count( vec_[i]->theArg() ) ) {
+
+			if (clientEnv->debug()) std::cout << "CtsCmdRegistry::parse matched with registered command " << vec_[i]->theArg() << "\n";
+
+			vec_[i]->create(cmd,vm,clientEnv);
+			return true;
+		}
+	}
+	return false;
+}
+
+void CtsCmdRegistry::addAllOptions(boost::program_options::options_description& desc) const
+{
+	addCmdOptions(desc);
+	addHelpOption(desc);
+}
+
+void CtsCmdRegistry::addCmdOptions(boost::program_options::options_description& desc) const
+{
+   size_t vec_size = vec_.size();
+ 	for(size_t i = 0; i < vec_size; i++) {
+		vec_[i]->addOption(desc);
+	}
+}
+
+void CtsCmdRegistry::addHelpOption(boost::program_options::options_description& desc) const
+{
+	/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   desc.add_options() ("help,h",po::value< std::string >()->implicit_value( std::string("") ), "Produce help message");
+   desc.add_options() ("version,v", "Show ecflow client version number, and version of the boost library used" );
+	desc.add_options() ("debug,d",
+			"Dump out client environment settings for debug\n"
+			"Set environment variable ECF_DEBUG_CLIENT for additional debug" );
+}
diff --git a/ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.hpp b/ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.hpp
new file mode 100644
index 0000000..b703b36
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CtsCmdRegistry.hpp
@@ -0,0 +1,56 @@
+#ifndef CTS_CMD_REGISTRY_HPP_
+#define CTS_CMD_REGISTRY_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Registration of all the client to server commands
+//               This allows us to parse the arg associated with
+//               commands in this category. The idea being to keep
+//               new commands functionality in one place.
+//               Any new client to server commands that are created
+//               must be added to this class.
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <boost/program_options.hpp>
+#include <vector>
+#include "Cmd.hpp"
+
+class AbstractClientEnv;
+
+class CtsCmdRegistry : private boost::noncopyable  {
+public:
+	CtsCmdRegistry(bool addGroupCmd = true );
+
+	/// These option describe the arguments for each of the commands
+	/// They also can be presented to the user via --help option.
+	void addAllOptions(boost::program_options::options_description& desc) const;
+	void addCmdOptions(boost::program_options::options_description& desc) const;
+
+	/// Parse arguments given in 'vm' and use that to create a command
+	/// that will be sent to the server. Will throw std::runtime_error for errors
+	/// Returns true if command line argument specified via 'vm', matches one of the
+	/// registered command.
+	/// *** This allows us to distinguish between where we match with a registered
+	/// *** command, but do *NOT* set Cmd_ptr, ie since its a client specific command
+	/// *** i.e there is no need to send it to the server
+	bool parse( Cmd_ptr& cmd,
+				   boost::program_options::variables_map& vm,
+				   AbstractClientEnv* clientEnv ) const;
+
+private:
+	std::vector<Cmd_ptr > vec_;
+
+	void addHelpOption(boost::program_options::options_description& desc) const;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/cts/CtsNodeCmd.cpp b/ecflow_4_0_7/Base/src/cts/CtsNodeCmd.cpp
new file mode 100644
index 0000000..f56b0cb
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/CtsNodeCmd.cpp
@@ -0,0 +1,338 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #70 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/make_shared.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "JobCreationCtrl.hpp"
+#include "Ecf.hpp"
+#include "Jobs.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+bool CtsNodeCmd::why_cmd( std::string& nodePath) const
+{
+   if (api_ == CtsNodeCmd::WHY) {
+      nodePath = absNodePath_;
+      return true;
+   }
+   return false;
+}
+
+std::ostream& CtsNodeCmd::print(std::ostream& os) const
+{
+   switch (api_) {
+      case CtsNodeCmd::GET: {
+         std::stringstream ss;
+         ss << CtsApi::get(absNodePath_);
+#ifdef DEBUG
+         if (Ecf::server()) ss << " [server(" << Ecf::state_change_no() << " " << Ecf::modify_change_no() << ")]";
+#endif
+         return user_cmd(os,ss.str());
+      }
+      case CtsNodeCmd::GET_STATE:          return user_cmd(os,CtsApi::get_state(absNodePath_)); break;
+      case CtsNodeCmd::MIGRATE:            return user_cmd(os,CtsApi::migrate(absNodePath_)); break;
+      case CtsNodeCmd::JOB_GEN:            return user_cmd(os,CtsApi::job_gen(absNodePath_)); break;
+      case CtsNodeCmd::CHECK_JOB_GEN_ONLY: return user_cmd(os,CtsApi::checkJobGenOnly(absNodePath_)); break;
+      case CtsNodeCmd::WHY:                return user_cmd(os,CtsApi::why(absNodePath_)); break;
+      case CtsNodeCmd::NO_CMD:       break;
+      default: throw std::runtime_error("CtsNodeCmd::print: Unrecognised command");break;
+   }
+   return os;
+}
+
+bool CtsNodeCmd::equals(ClientToServerCmd* rhs) const
+{
+   CtsNodeCmd* the_rhs = dynamic_cast< CtsNodeCmd* > ( rhs );
+   if ( !the_rhs ) return false;
+   if (api_ != the_rhs->api()) return false;
+   if (absNodePath_ != the_rhs->absNodePath()) return false;
+   return UserCmd::equals(rhs);
+}
+
+bool CtsNodeCmd::isWrite() const
+{
+   switch (api_) {
+      case CtsNodeCmd::GET:               return false; break; // read only
+      case CtsNodeCmd::GET_STATE:         return false; break; // read only
+      case CtsNodeCmd::MIGRATE:           return false; break; // read only
+      case CtsNodeCmd::JOB_GEN:           return true;  break; // requires write privilege
+      case CtsNodeCmd::CHECK_JOB_GEN_ONLY:return false; break; // read only
+      case CtsNodeCmd::WHY:               return false; break; // read only
+      case CtsNodeCmd::NO_CMD: break;
+      default: throw std::runtime_error("CtsNodeCmd::isWrite: Unrecognised command");break;
+   }
+   assert(false);
+   return false;
+}
+
+const char* CtsNodeCmd::theArg() const
+{
+   switch (api_) {
+      case CtsNodeCmd::GET:                return CtsApi::getArg(); break;
+      case CtsNodeCmd::GET_STATE:          return CtsApi::get_state_arg(); break;
+      case CtsNodeCmd::MIGRATE:            return CtsApi::migrate_arg(); break;
+      case CtsNodeCmd::JOB_GEN:            return CtsApi::job_genArg(); break;
+      case CtsNodeCmd::CHECK_JOB_GEN_ONLY: return CtsApi::checkJobGenOnlyArg(); break;
+      case CtsNodeCmd::WHY:                return CtsApi::whyArg(); break;
+      case CtsNodeCmd::NO_CMD: break;
+      default: throw std::runtime_error("CtsNodeCmd::theArg: Unrecognised command");break;
+   }
+   assert(false);
+   return NULL;
+}
+
+PrintStyle::Type_t CtsNodeCmd::show_style() const
+{
+   if (api_ == CtsNodeCmd::GET) return PrintStyle::DEFS;
+   else if (api_ == CtsNodeCmd::GET_STATE) return PrintStyle::STATE;
+   else if (api_ == CtsNodeCmd::MIGRATE) return PrintStyle::MIGRATE;
+   return ClientToServerCmd::show_style();
+}
+
+
+int CtsNodeCmd::timeout() const
+{
+   if (api_ == CtsNodeCmd::GET) {
+      return time_out_for_load_sync_and_get();
+   }
+   return ClientToServerCmd::timeout();
+}
+
+STC_Cmd_ptr CtsNodeCmd::doHandleRequest(AbstractServer* as) const
+{
+   switch (api_) {
+
+      case CtsNodeCmd::GET:
+      case CtsNodeCmd::MIGRATE:
+      case CtsNodeCmd::GET_STATE:  {
+         // The client will configure the output display
+         as->update_stats().get_defs_++;
+         if (  absNodePath_.empty() ) {
+            // with migrate we need to get edit history.
+            return PreAllocatedReply::defs_cmd(as,(api_ == MIGRATE));
+         }
+         // however request for a particular node, thats not there, treated as an error
+         node_ptr theNodeToReturn = find_node(as,absNodePath_);
+         return PreAllocatedReply::node_cmd(as,theNodeToReturn);
+      }
+
+      case CtsNodeCmd::CHECK_JOB_GEN_ONLY:  {
+         as->update_stats().node_check_job_gen_only_++;
+         job_creation_ctrl_ptr jobCtrl = boost::make_shared<JobCreationCtrl>();
+         jobCtrl->set_node_path(absNodePath_);
+         as->defs()->check_job_creation(jobCtrl);
+         if (! jobCtrl->get_error_msg().empty() ) {
+            throw std::runtime_error( jobCtrl->get_error_msg() ) ;
+         }
+         break;
+      }
+
+      case CtsNodeCmd::JOB_GEN:  {
+         as->update_stats().node_job_gen_++;
+
+         if (as->state() == SState::RUNNING) {
+
+            if (  absNodePath_.empty() ) {
+               // If no path specified do a full job generation over all suites
+               return doJobSubmission( as );
+            }
+
+            // Generate jobs for the given node, downwards
+            node_ptr theNode = find_node_for_edit(as,absNodePath_);
+            Jobs jobs(theNode.get());
+            jobs.generate();
+         }
+         break;
+      }
+
+      case CtsNodeCmd::WHY: {
+         /// Why is actually invoked on client side.
+         /// Added as a command because:
+         ///    o documentation
+         ///    o allows use with group command, without any other changes
+         break;
+      }
+
+      case CtsNodeCmd::NO_CMD:
+      default: throw std::runtime_error("CtsNodeCmd::doHandleRequest: Unrecognised command");break;
+   }
+
+   return PreAllocatedReply::ok_cmd();
+}
+
+static const char* job_gen_only_desc() {
+   return
+            "Test hierarchical Job generation only, for chosen Node.\n"
+            "The jobs are generated independent of the dependencies\n"
+            "This will generate the jobs *only*, i.e. no job submission. Used for checking job generation only\n"
+            "  arg = node path | arg = NULL\n"
+            "     If no node path specified generates for all Tasks in the definition. For Test only"
+            ;
+}
+
+static const char* job_gen_desc() {  // dependency_dependent_job_submission
+   return
+            "Job submission for chosen Node *based* on dependencies.\n"
+            "The server traverses the node tree every 60 seconds, and if the dependencies are free\n"
+            "does job generation and submission. Sometimes the user may free time/date dependencies\n"
+            "to avoid waiting for the server poll, this commands allows early job generation\n"
+            "  arg = node path | arg = NULL\n"
+            "     If no node path specified generates for full definition."
+            ;
+}
+
+static const char* why_desc() {
+   return
+            "Show the reason why a node is not running.\n"
+            "Can only be used with the group command. The group command must include a \n"
+            "'get' command(i.e returns the server defs)\n"
+            "The why command take a optional string argument representing a node path\n"
+            "Will return reason why the node is holding and for all its children.\n"
+            "If no arguments supplied will report on all nodes\n"
+            "  arg = node path | arg = NULL\n"
+            "Usage:\n"
+            "  --group=\"get; why\"               # returns why for all holding nodes\n"
+            "  --group=\"get; why /suite/family\" # returns why for a specific node"
+            ;
+}
+
+static const char* get_desc() {
+   return
+            "Get the suite definition or node tree in form that is re-parse able\n"
+            "Get all suite node tree's from the server and write to standard out.\n"
+            "The output is parse-able, and can be used to re-load the definition\n"
+            "  arg = NULL | arg = node path\n"
+            "Usage:\n"
+            "  --get     # gets the definition from the server,and writes to standard out\n"
+            "  --get /s1 # gets the suite from the server,and writes to standard out"
+            ;
+}
+
+static const char* get_state_desc() {
+   return
+            "Get state data. For the whole suite definition or individual nodes.\n"
+            "This will include event, meter, node state, trigger and time state.\n"
+            "The output is written to standard out.\n"
+            "  arg = NULL | arg = node path\n"
+            "Usage:\n"
+            "  --get_state     # gets the definition from the server,and writes to standard out\n"
+            "  --get_state /s1 # gets the suite from the server,and writes to standard out"
+            ;
+}
+
+const char* migrate_desc() {
+   return   "Used to print state of the definition returned from the server to standard output.\n"
+            "The node state is shown in the comments.\n"
+            "This format allows the definition to be migrated to future version of ecflow.\n"
+            "The output includes edit history but excludes externs.\n"
+            "When the definition is reloaded *NO* checking is done.\n"
+            "\n"
+            "The following shows a summary of the features associated with each choice:\n"
+            "                       --get  --get_state  --migrate\n"
+            "Auto generate externs    Yes    Yes          No\n"
+            "Checking on reload       Yes    Yes          No\n"
+            "Edit History             No     No           Yes\n"
+            "Show trigger AST         No     Yes          No\n"
+            "\n\n"
+            "Migration is required when the release number changes:\n"
+            "   <release-number>.<major>.<minor>\n"
+            "   6.1.7   ->  7.0.0\n"
+            "as the checkpoint files are not compatible.\n\n"
+            "To actually migrate to a newer version of ecflow, follow these steps:\n\n"
+            " Steps for Old server:\n"
+            "   o shutdown\n"
+            "       # ecflow_client --shutdown\n"
+            "   o suspend all suites\n"
+            "       # CL=\"ecflow_client --port 32222 --host vsms1\"\n"
+            "       # for s in $($CL --suites); do $CL --suspend /$s; done\n"
+            "   o wait for active/submitted tasks to complete\n"
+            "   o halt the server\n"
+            "       # ecflow_client --halt\n"
+            "   o Use --migrate to dump state and structure to a file\n"
+            "       # ecflow_client --migrate > all_suites.def\n"
+            "   o terminate server *or* leave server running but start new server on different machine\n"
+            "     to avoid port number clash.\n"
+            "   o remove checkpt and backup checkpt files, to prevent new server from loading them\n"
+            "     *Only* applicable if starting new server on same machine\n\n"
+            " Steps for New server:\n"
+            "   o start server\n"
+            "   o load the migration file\n"
+            "       # ecflow_client --load all_suites.def\n"
+            "   o set server running:\n"
+            "       # ecflow_client --restart\n"
+            "   o resume suspended suites\n"
+            "       # CL=\"ecflow_client --port 32222 --host vsms1\"\n"
+            "       # for s in $($CL --suites); do $CL --resume /$s; done\n\n"
+            "Usage:\n"
+            "    --migrate         # show all suites\n"
+            "    --migrate=/s1     # show state for suite s1\n"
+   ;
+}
+
+
+void CtsNodeCmd::addOption(boost::program_options::options_description& desc) const
+{
+   switch (api_) {
+      case CtsNodeCmd::GET:{
+         desc.add_options()(CtsApi::getArg(),po::value< string >()->implicit_value(string()),get_desc());
+         break;
+      }
+      case CtsNodeCmd::GET_STATE:{
+          desc.add_options()(CtsApi::get_state_arg(),po::value< string >()->implicit_value(string()),get_state_desc());
+          break;
+      }
+      case CtsNodeCmd::MIGRATE:{
+          desc.add_options()(CtsApi::migrate_arg(),po::value< string >()->implicit_value(string()),migrate_desc());
+          break;
+      }
+      case CtsNodeCmd::JOB_GEN:{
+         desc.add_options()( CtsApi::job_genArg(), po::value< string >()->implicit_value(string()), job_gen_desc() );
+         break;
+      }
+      case CtsNodeCmd::CHECK_JOB_GEN_ONLY:{
+         desc.add_options()( CtsApi::checkJobGenOnlyArg(), po::value< string >()->implicit_value(string()), job_gen_only_desc() );
+         break;
+      }
+      case CtsNodeCmd::WHY: {
+         desc.add_options()( CtsApi::whyArg(), po::value< string >()->implicit_value(string()),why_desc());
+         break;
+      }
+      case CtsNodeCmd::NO_CMD:  assert(false); break;
+      default: assert(false); break;
+   }
+}
+
+void CtsNodeCmd::create(   Cmd_ptr& cmd,
+                           boost::program_options::variables_map& vm,
+                           AbstractClientEnv* ac ) const
+{
+   assert( api_ != CtsNodeCmd::NO_CMD);
+
+   if (ac->debug()) cout << "CtsNodeCmd::create = '" << theArg() << "'.\n";
+
+   std::string absNodePath = vm[ theArg() ].as< std::string > ();
+
+   cmd = Cmd_ptr(new CtsNodeCmd( api_ , absNodePath));
+}
+
+std::ostream& operator<<(std::ostream& os, const CtsNodeCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/EditHistoryMgr.cpp b/ecflow_4_0_7/Base/src/cts/EditHistoryMgr.cpp
new file mode 100644
index 0000000..351c5a9
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/EditHistoryMgr.cpp
@@ -0,0 +1,88 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #72 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "EditHistoryMgr.hpp"
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "Node.hpp"
+#include "SuiteChanged.hpp"
+#include "Ecf.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace boost;
+using namespace ecf;
+
+EditHistoryMgr::EditHistoryMgr(const ClientToServerCmd* c,AbstractServer* a)
+: cts_cmd_(c),
+  as_(a),
+  state_change_no_(Ecf::state_change_no()),
+  modify_change_no_(Ecf::modify_change_no())
+{
+   assert(cts_cmd_->edit_history_nodes_.empty());
+}
+
+EditHistoryMgr::~EditHistoryMgr()
+{
+   // check if state changed
+   if (state_change_no_ != Ecf::state_change_no() || modify_change_no_ != Ecf::modify_change_no()) {
+
+      // Ignore child commands for edit history, where only interested in user commands
+      if (!cts_cmd_->task_cmd() && as_->defs()) {
+
+         // *ONLY* record edit history to commands that change the data model
+         // Otherwise we will end up making a data model change for read only commands
+         // If there has been a change in defs state then the command must return true from isWrite
+         if (cts_cmd_->isWrite()) {
+            if (cts_cmd_->edit_history_nodes_.empty()) {
+
+               as_->defs()->flag().set(Flag::MESSAGE);
+               add_edit_history(Str::ROOT_PATH());
+            }
+            else {
+               size_t the_size = cts_cmd_->edit_history_nodes_.size();
+               for(size_t i = 0; i < the_size; i++) {
+                  node_ptr edited_node = cts_cmd_->edit_history_nodes_[i].lock();
+                  if (edited_node.get()) {
+                     // Setting the flag will make a state change. But its OK command allows it.
+                     SuiteChanged0 suiteChanged(edited_node);
+                     edited_node->flag().set(Flag::MESSAGE);  // trap state change in suite for sync
+                     add_edit_history(edited_node->absNodePath());
+                  }
+               }
+            }
+         }
+         else {
+            // Read only command, that is making data model changes, oops ?
+            std::stringstream ss;
+            cts_cmd_->print(ss);
+            cout << "cmd " << ss.str() << " should return true from isWrite() ******************\n";
+            cout << "Read only command is making data changes to defs.?????\n";
+         }
+      }
+   }
+
+   // Clear edit history nodes;
+   cts_cmd_->edit_history_nodes_.clear();
+}
+
+void EditHistoryMgr::add_edit_history(const std::string& path) const
+{
+   // record all the user edits to the node. Reuse the time stamp cache created in handleRequest()
+   std::stringstream ss;
+   ss << "MSG:";
+   if (Log::instance()) ss << Log::instance()->get_cached_time_stamp();
+   cts_cmd_->print(ss);
+   as_->defs()->add_edit_history(path,ss.str());
+}
diff --git a/ecflow_4_0_7/Base/src/cts/EditHistoryMgr.hpp b/ecflow_4_0_7/Base/src/cts/EditHistoryMgr.hpp
new file mode 100644
index 0000000..8391a55
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/EditHistoryMgr.hpp
@@ -0,0 +1,41 @@
+#ifndef EDIT_HISTORY_MGR_HPP_
+#define EDIT_HISTORY_MGR_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #72 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// This class manages the edit history, for the commands.
+// It determines if there was a state change, if there was, it adds edit
+// history to the stored nodes.
+// Additionally we check that if there was an edit then the command must
+// return ClientToServerCmd::isWrite() true.
+//============================================================================
+#include <boost/noncopyable.hpp>
+#include <string>
+
+class ClientToServerCmd;
+class AbstractServer;
+
+class EditHistoryMgr : private boost::noncopyable  {
+public:
+   EditHistoryMgr(const ClientToServerCmd*,AbstractServer*);
+   ~EditHistoryMgr();
+
+private:
+   void add_edit_history(const std::string& path) const;
+
+private:
+   const ClientToServerCmd* cts_cmd_;
+   AbstractServer* as_;
+   mutable unsigned int state_change_no_;        // detect state change in defs
+   mutable unsigned int modify_change_no_;       // detect state change in defs
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/cts/EditScriptCmd.cpp b/ecflow_4_0_7/Base/src/cts/EditScriptCmd.cpp
new file mode 100644
index 0000000..a9dee37
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/EditScriptCmd.cpp
@@ -0,0 +1,400 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #37 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "boost/filesystem/operations.hpp"
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "File.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+#include "Suite.hpp"
+#include "EcfFile.hpp"
+#include "JobsParam.hpp"
+#include "SuiteChanged.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+namespace fs = boost::filesystem;
+
+bool EditScriptCmd::equals(ClientToServerCmd* rhs) const
+{
+	EditScriptCmd* the_rhs = dynamic_cast<EditScriptCmd*>(rhs);
+	if (!the_rhs)  return false;
+	if ( path_to_node_ != the_rhs->path_to_node()) { return false; }
+   if ( edit_type_    != the_rhs->edit_type())    { return false; }
+   if ( alias_        != the_rhs->alias())        { return false; }
+   if ( run_          != the_rhs->run())          { return false; }
+	return UserCmd::equals(rhs);
+}
+
+static std::string to_string(EditScriptCmd::EditType et) {
+	switch (et) {
+		case EditScriptCmd::EDIT:                return "edit"; break;
+		case EditScriptCmd::PREPROCESS:          return "pre_process"; break;
+      case EditScriptCmd::SUBMIT:              return "submit"; break;
+      case EditScriptCmd::PREPROCESS_USER_FILE:return "pre_process_file"; break;
+      case EditScriptCmd::SUBMIT_USER_FILE:    return "submit_file"; break;
+ 		default : assert(false); break;
+	}
+	return "edit";
+}
+static std::vector<std::string> valid_edit_types() {
+   std::vector<std::string> edit_types; edit_types.reserve(5);
+   edit_types.push_back("edit");
+   edit_types.push_back("pre_process");
+   edit_types.push_back("submit");
+   edit_types.push_back("pre_process_file");
+   edit_types.push_back("submit_file");
+   return edit_types;
+}
+
+
+std::ostream& EditScriptCmd::print(std::ostream& os) const
+{
+	return user_cmd(os,CtsApi::to_string(CtsApi::edit_script(path_to_node_,to_string(edit_type()),"",alias_,run_)));
+}
+
+bool EditScriptCmd::isWrite() const
+{
+   switch (edit_type_) {
+      case EditScriptCmd::EDIT:                return false; break;
+      case EditScriptCmd::PREPROCESS:          return false; break;
+      case EditScriptCmd::PREPROCESS_USER_FILE:return false; break;
+      case EditScriptCmd::SUBMIT:              return true; break;
+      case EditScriptCmd::SUBMIT_USER_FILE:    return true; break;
+      default : assert(false); break;
+   }
+   return false;
+}
+
+
+STC_Cmd_ptr EditScriptCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().edit_script_++;
+
+   node_ptr node = find_node_for_edit(as,path_to_node_); // will throw if defs not defined, or node not found
+	Submittable* submittable = node->isSubmittable();
+	if (!submittable)  throw std::runtime_error( "EditScriptCmd failed. Can not locate task or alias at path " + path_to_node_ ) ;
+
+	/// record any changes made to suite. Needed for incremental updates
+   SuiteChanged0 changed(node);
+
+	switch (edit_type_) {
+		case EditScriptCmd::EDIT: {
+
+			/// Find all the used variable in the script, i.e 'ecf file'
+ 			EcfFile ecf_file = submittable->locatedEcfFile(); // will throw std::runtime_error for errors
+
+			/// This will throw std::runtime_error  for parse errors
+			/// Returns the script with the used variables added at the front of the file
+ 	      // **********************************************************************
+ 			// Custom handling of dynamic variables, i.e ECF_TRYNO, ECF_PASS and
+ 			// any variable that embeds a try number, i.e. ECF_JOB, ECF_JOBOUT
+ 	      // This is required since the try number is *always* incremented *before* job submission,
+ 			// hence the value extracted from the job file will not be accurate, hence we exclude it.
+ 	      // This way at job submission we use the latest/correct value, which is in-sync with JOB OUTPUT
+ 	      // Note: Otherwise the job output will not be in sync
+ 			//
+ 	      // Custom handling of ECF_PORT,ECF_NODE,ECF_NAME do not show these variables, these veriables
+ 	      // including ECF_PASS appear in the script. If the user accidentally edits them,
+ 	      // Child communication with the server will be broken. Hence not shown
+ 			//
+ 			// This special handling is done in: EcfFile::get_used_variables
+ 	      // **********************************************************************
+			std::string ret_file_contents;
+			ecf_file.edit_used_variables(ret_file_contents);
+			return PreAllocatedReply::string_cmd(ret_file_contents);
+ 		}
+
+
+		case EditScriptCmd::PREPROCESS: {
+
+			/// PRE_PROCESS the ecf file accessible by the server
+ 			EcfFile ecf_file = submittable->locatedEcfFile(); // will throw std::runtime_error for errors
+
+			/// This function can throw std::runtime error if pre_processing fails
+			/// This *WILL* also include the used variables
+  			std::string ret_file_contents ;
+ 			ecf_file.pre_process(ret_file_contents);
+			return PreAllocatedReply::string_cmd(ret_file_contents);
+  		}
+
+
+		case EditScriptCmd::PREPROCESS_USER_FILE: {
+
+			/// The file contents('user_file_contents_') here could have been edited by the user on the client side.
+ 			EcfFile ecf_file = submittable->locatedEcfFile(); // will throw std::runtime_error for errors
+
+			/// This function can throw std::runtime error if pre_processing fails
+  			std::string ret_file_contents ;
+ 			ecf_file.pre_process(user_file_contents_,ret_file_contents);
+ 		   vector<string>().swap(user_file_contents_); // clear user_file_contents_ and minimise its capacity
+			return PreAllocatedReply::string_cmd(ret_file_contents);
+  		}
+
+
+		case EditScriptCmd::SUBMIT: {
+
+		   if (submittable->state() == NState::ACTIVE  || submittable->state() == NState::SUBMITTED ) {
+		      std::stringstream ss;
+		      ss << "Node " << path_to_node_ << " is already " << NState::toString(submittable->state()) << " : ";
+            throw std::runtime_error("EditScriptCmd:: failed for submit: " + ss.str() );
+		   }
+
+			/// Using the User edited variables, generate the job using the ECF/USR file accessible from the server
+			/// Convert from vector to map
+			NameValueMap user_variables_map;
+			for(size_t i = 0; i < user_variables_.size(); i++) {
+				user_variables_map.insert( std::make_pair(user_variables_[i].first, user_variables_[i].second ));
+			}
+
+			/// Do job submission, but creating .usr file first
+			/// This will *NOT* timeout, unlike server Job generation
+			JobsParam jobsParam(as->poll_interval(),true /* create jobs */); // spawn_jobs = true
+			jobsParam.set_user_edit_variables( user_variables_map );
+
+	      // Custom handling of dynamic variables, i.e ECF_TRYNO, ECF_PASS and
+	      // any variable that embeds a try number, i.e. ECF_JOB, ECF_JOBOUT
+	      // This is required since the try number is *always* incremented *before* job submission,
+	      // hence the value extracted from the job file will *not* be accurate, hence we exclude it form user variables
+			if (!submittable->submitJob(jobsParam)) {
+				throw std::runtime_error("EditScriptCmd:: failed for submit: " + jobsParam.getErrorMsg());
+			}
+			submittable->flag().set(ecf::Flag::USER_EDIT);
+ 			break; }
+
+
+		case EditScriptCmd::SUBMIT_USER_FILE: {
+			/// The file contents('user_file_contents_') here could have been edited by the user on the client side. ECF_HOME
+		   /// If the selected node is an Alias, Just submit it. Since aliases can *NOT* have other aliases as children
+		   if (!alias_ || submittable->isAlias()) {
+		      if (submittable->state() == NState::ACTIVE  || submittable->state() == NState::SUBMITTED ) {
+		         std::stringstream ss;
+		         ss << "Node " << path_to_node_ << " is already " << NState::toString(submittable->state()) << " : ";
+		         throw std::runtime_error("EditScriptCmd:: failed for submit: " + ss.str() );
+		      }
+
+		      /// Convert from vector to map
+		      NameValueMap user_variables_map;
+		      for(size_t i = 0; i < user_variables_.size(); i++) {
+		         user_variables_map.insert( std::make_pair(user_variables_[i].first, user_variables_[i].second ));
+		      }
+
+		      /// Do job submission, *USING* the user supplied file , will create .usr file
+	         /// This will *NOT* timeout, unlike server Job generation
+		      JobsParam jobsParam(as->poll_interval(),true /* create jobs */);  //  spawn_jobs = true
+		      jobsParam.set_user_edit_variables( user_variables_map );
+		      jobsParam.set_user_edit_file( user_file_contents_);
+
+		      if (!submittable->submitJob(jobsParam)) {
+               vector<string>().swap(user_file_contents_); // clear user_file_contents_ and minimise its capacity
+		         throw std::runtime_error("EditScriptCmd::SUBMIT_USER_FILE: failed : " + jobsParam.getErrorMsg());
+		      }
+		      submittable->flag().set(ecf::Flag::USER_EDIT);
+		   }
+		   else {
+		      // CREATE a Child Alias. The create alias and parent it to the Task., and choose to run or not.
+		      Task* task = submittable->isTask();
+		      if (!task) {
+		         vector<string>().swap(user_file_contents_); // clear user_file_contents_ and minimise its capacity
+		         throw std::runtime_error("EditScriptCmd::SUBMIT_USER_FILE: Aliases can only be created for a task. Selected path is a Alias. Please select a Task path");
+		      }
+		      alias_ptr alias = task->add_alias(user_file_contents_,user_variables_);
+
+		      if (run_) {
+		         /// This will *NOT* timeout, unlike server Job generation
+		         JobsParam jobsParam(as->poll_interval(),true /* create jobs */); // spawn jobs = true
+		         if (!alias->submitJob(jobsParam)) {
+		            vector<string>().swap(user_file_contents_); // clear user_file_contents_ and minimise its capacity
+		            throw std::runtime_error("EditScriptCmd::SUBMIT_USER_FILE: failed for Alias : " + jobsParam.getErrorMsg());
+		         }
+		         alias->flag().set(ecf::Flag::USER_EDIT);
+		      }
+		   }
+ 			break; }
+
+		default : assert(false); break;
+	}
+
+
+   // Clear up memory allocated *ASAP*
+   // When dealing with several thousands strings, this makes a *HUGE* difference
+   vector<string>().swap(user_file_contents_); // clear user_file_contents_ and minimise its capacity
+
+	return PreAllocatedReply::ok_cmd();
+}
+
+const char* EditScriptCmd::arg()  { return CtsApi::edit_script_arg();}
+const char* EditScriptCmd::desc() {
+	/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   return "Allows user to edit, pre-process and submit the script.\n"
+            "  arg1 = path to task  # The path to the task/alias\n"
+            "  arg2 = [ edit | pre_process | submit | pre_process_file | submit_file ]\n"
+            "       edit : will return the script file to standard out. The script will\n"
+            "              include used variables enclosed between %comment/%end at the\n"
+            "              start of the file\n"
+            "       pre_process: Will return the script file to standard out.The script will\n"
+            "              include used variables enclosed between %comment/%end at the\n"
+            "              start of the file and with all %include expanded\n"
+            "       submit: Will extract the used variables from the supplied file, i.e \n"
+            "               between the %comment/%end and use these them to generate the\n"
+            "               job using the ecf file accessible from the server\n"
+            "       pre_process_file: Will pre process the user supplied file\n"
+            "       submit_file: Like submit, but the supplied file, is submitted by the server\n"
+            "               The last 2 options allow complete freedom to debug the script file\n"
+            "  arg3 = [ path_to_script_file ]\n"
+            "       needed for option [  pre_process_file | submit_file ]\n"
+            "  arg4 = create_alias (optional) default value is false, for use with 'submit_file' option\n"
+            "  arg5 = no_run (optional) default value is false, i.e immediately run the alias\n"
+            "         is no_run is specified the alias in only created\n"
+            "Usage:\n"
+            "--edit_script /path/to/task edit > script_file\n"
+            "   server returns script with the used variables to standard out\n"
+            "   The user can choose to edit this file\n"
+            "--edit_script /path/to/task pre_process > pre_processed_script_file\n"
+            "  server will pre process the ecf file accessible from the server\n"
+            "  (i.e expand all %includes) and return the file to standard out\n"
+            "--edit_script /path/to/task submit script_file\n"
+            "  Will extract the used variables in the 'script_file' and will uses these\n"
+            "  variables during variable substitution of the ecf file accessible by the\n"
+            "  server. This is then submitted as a job\n"
+            "--edit_script /path/to/task pre_process_file file_to_pre_process\n"
+            "  The server will pre-process the user supplied file and return the contents\n"
+            "  to standard out\n"
+            "--edit_script /path/to/task submit_file file_to_submit\n"
+            "  Will extract the used variables in the 'file_to_submit' and will uses these\n"
+            "  variables during variable substitution, the file is then submitted for job\n"
+            "  generation by the server\n"
+            "--edit_script /path/to/task submit_file file_to_submit create_alias\n"
+            "  Like the the previous example but will create and run as an alias"
+            ;
+}
+
+void EditScriptCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( EditScriptCmd::arg(),po::value< vector<string> >()->multitoken(), EditScriptCmd::desc() );
+}
+
+void EditScriptCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* ac) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+
+	if (ac->debug()) dumpVecArgs(EditScriptCmd::arg(),args);
+
+	std::stringstream ss;
+	if (args.size() < 2) {
+	   ss << "EditScriptCmd:At least 2 arguments required:\n" << EditScriptCmd::desc();
+		throw std::runtime_error(ss.str());
+	}
+
+	string path_to_task = args[0];
+	string edit_type_str = args[1];
+	EditScriptCmd::EditType edit_type = EditScriptCmd::EDIT;
+
+	/// Check edit_type is valid
+	bool ok = false;
+	std::vector<std::string> edit_types = valid_edit_types();
+	for(size_t i = 0; i < edit_types.size(); i++) {
+		if (edit_type_str == edit_types[i]) {
+			if (edit_type_str == "edit")                  edit_type =  EditScriptCmd::EDIT;
+			else if (edit_type_str == "pre_process")      edit_type =  EditScriptCmd::PREPROCESS;
+			else if (edit_type_str == "submit")           edit_type =  EditScriptCmd::SUBMIT;
+			else if (edit_type_str == "pre_process_file") edit_type =  EditScriptCmd::PREPROCESS_USER_FILE;
+         else if (edit_type_str == "submit_file")      edit_type =  EditScriptCmd::SUBMIT_USER_FILE;
+			else { assert(false); }
+			ok = true; break;
+		}
+	}
+
+	if (!ok) {
+		ss << "The second argument(" << args[1] << ") to edit_script must be one of [ ";
+ 		for(size_t i = 0; i < edit_types.size(); ++i) { if (i != 0) ss << " | "; ss << edit_types[i];}
+		ss << "]\n" <<  EditScriptCmd::desc();
+		throw std::runtime_error( ss.str() );
+	}
+
+	if (args.size() == 2) {
+		if (edit_type == EditScriptCmd::EDIT || edit_type == EditScriptCmd::PREPROCESS) {
+			cmd = Cmd_ptr( new EditScriptCmd( path_to_task, edit_type) );
+			return;
+		}
+		else {
+ 			ss << "When two arguments specified, the second argument must be one of [ edit | pre_process ]\n" << EditScriptCmd::desc();
+ 			throw ss.str();
+		}
+	}
+
+   bool create_alias = false; // for use with "submit_file" option only
+   bool run_alias = true;     // for use with "submit_file" option only
+   for(size_t i = 0; i < args.size(); i++) {
+      if (i > 2 && args[i] == "create_alias") create_alias =  true;
+      if (i > 2 && args[i] == "no_run") run_alias =  false;
+   }
+   if ( ( create_alias || !run_alias) && edit_type != EditScriptCmd::SUBMIT_USER_FILE  ) {
+      ss << "The create_alias option is only valid when the second argument is 'submit_file' \n" << EditScriptCmd::desc();
+      throw ss.str();
+   }
+
+
+	if (args.size() >= 3 && args.size() <= 5) {
+		string path_to_script = args[2];
+		std::vector<std::string> script_lines;
+
+ 		if (!fs::exists(path_to_script)) {
+ 			ss << "The script file specified '" << path_to_script << "' does not exist\n";
+			throw std::runtime_error(ss.str());
+		}
+	 	if (!File::splitFileIntoLines(path_to_script, script_lines)) {
+ 			ss << "Could not open script file " << path_to_script;
+			throw std::runtime_error(ss.str());
+	 	}
+
+	 	if (edit_type == EditScriptCmd::SUBMIT || EditScriptCmd::SUBMIT_USER_FILE) {
+	 		// extract the Used variables from the script file
+	 		NameValueMap used_variables_as_map;
+	 		EcfFile::extract_used_variables(used_variables_as_map,script_lines);
+
+	 		// Convert MAP to Vec
+	 		NameValueVec used_variables_as_vec;
+	 		std::pair<std::string, std::string> pair;
+	 		BOOST_FOREACH(pair, used_variables_as_map) { used_variables_as_vec.push_back( std::make_pair(pair.first,pair.second) ); }
+
+	 		if (edit_type == EditScriptCmd::SUBMIT) {
+	 			cmd = Cmd_ptr( new EditScriptCmd( path_to_task, used_variables_as_vec ) ); //SUMBIT
+	 			return;
+	 		}
+
+ 			cmd = Cmd_ptr( new EditScriptCmd( path_to_task, used_variables_as_vec, script_lines, create_alias, run_alias ) ); // SUBMIT_USER_FILE
+ 			return;
+	 	}
+	 	else if (edit_type == EditScriptCmd::PREPROCESS_USER_FILE ) {
+
+ 			cmd = Cmd_ptr( new EditScriptCmd( path_to_task, script_lines ) );
+ 			return;
+	 	}
+	}
+
+	ss << "Wrong number of arguments specified\n" << EditScriptCmd::desc();
+	throw std::runtime_error(ss.str());
+}
+
+std::ostream& operator<<(std::ostream& os, const EditScriptCmd& c)       { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/ForceCmd.cpp b/ecflow_4_0_7/Base/src/cts/ForceCmd.cpp
new file mode 100644
index 0000000..49d5800
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ForceCmd.cpp
@@ -0,0 +1,259 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #36 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Node.hpp"
+#include "Str.hpp"
+#include "SuiteChanged.hpp"
+#include "Extract.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+// ===================================================================================
+
+bool ForceCmd::equals(ClientToServerCmd* rhs) const
+{
+	ForceCmd* the_rhs = dynamic_cast<ForceCmd*>(rhs);
+	if (!the_rhs)  return false;
+	if ( paths_                != the_rhs->paths()) { return false;}
+	if ( stateOrEvent_         != the_rhs->stateOrEvent()) { return false; }
+	if ( recursive_            != the_rhs->recursive()) { return false; }
+	if ( setRepeatToLastValue_ != the_rhs->setRepeatToLastValue()) { return false; }
+	return UserCmd::equals(rhs);
+}
+
+std::ostream& ForceCmd::print(std::ostream& os) const
+{
+   return user_cmd(os,CtsApi::to_string(CtsApi::force(paths_,stateOrEvent_,recursive_,setRepeatToLastValue_)));
+}
+
+STC_Cmd_ptr ForceCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().force_++;
+
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+
+   bool is_event_state = Event::isValidState(stateOrEvent_);
+   bool is_node_state = NState::isValid(stateOrEvent_);
+ 	if (!is_node_state && !is_event_state) {
+		std::stringstream ss;
+		ss << "ForceCmd: failed. Invalid node state or event " << stateOrEvent_ << " expected one of "
+		   << "[ unknown | complete | queued | submitted | active | aborted | clear | set]";
+ 		throw std::runtime_error( ss.str() ) ;
+ 	}
+
+   std::stringstream error_ss;
+ 	size_t vec_size = paths_.size();
+ 	for(size_t i = 0; i < vec_size; i++) {
+
+ 	   string the_path = paths_[i];
+ 	   string the_event;
+ 	   if ( is_event_state ) {
+ 	      Extract::pathAndName(paths_[i],the_path, the_event);
+ 	      if ( the_path.empty() || the_event.empty() ) {
+ 	         std::stringstream ss;
+ 	         ss << "ForceCmd: When 'set' or 'clear' is specified the path needs to include name of the event i.e --force=/path/to_task:event_name set";
+ 	         std::string error_msg = ss.str();
+ 	         ecf::log(Log::ERR, error_msg);
+ 	         error_ss << error_msg << "\n";
+ 	         continue;
+ 	      }
+ 	   }
+
+ 	   node_ptr node = find_node_for_edit_no_throw(as,the_path);
+ 	   if (!node.get()) {
+ 	      std::stringstream ss;
+         ss << "ForceCmd: Could not find node at path " << the_path;
+         std::string error_msg = ss.str();
+         ecf::log(Log::ERR, error_msg);
+         error_ss << error_msg << "\n";
+ 	      continue;
+ 	   }
+ 	   SuiteChanged0 changed(node); // Cater for suites in handles
+
+ 	   if (is_node_state) {
+ 	      /// We want this to have side effects. i.e bubble up state and re-queue if complete and has repeat's
+ 	      /// **** However if state is SET to complete, we want to MISS the next time slot.
+ 	      /// **** we need to mark the time dependency as *expired*, otherwise, it will be automatically reset to QUEUED state
+ 	      NState::State new_state = NState::toState(stateOrEvent_);
+ 	      if (new_state == NState::COMPLETE)  {
+ 	         node->miss_next_time_slot();
+ 	      }
+
+ 	      if (recursive_) node->set_state_hierarchically( new_state, true /* force */ );
+ 	      else            node->set_state( new_state, true /* force */  );
+ 	   }
+ 	   else {
+ 	      // The recursive option is *NOT* applicable to events, hence ignore. According to Axel !!!!
+ 	      if ( stateOrEvent_ == Event::SET() )  {
+ 	         if (!node->set_event(the_event)) {
+ 	            std::stringstream ss;
+ 	            ss << "ForceCmd: force set: failed for node(" << node->absNodePath() << ") can not find event(" << the_event << ")";
+ 	            std::string error_msg = ss.str();
+ 	            ecf::log(Log::ERR, error_msg);
+ 	            error_ss << error_msg << "\n";
+	            continue;
+ 	         }
+ 	      }
+ 	      else if ( stateOrEvent_ == Event::CLEAR() ) {
+ 	         if (!node->clear_event(the_event)) {
+ 	            std::stringstream ss;
+ 	            ss << "ForceCmd: force clear: failed for node(" << node->absNodePath() << ") can not find event(" << the_event << ")";
+               std::string error_msg = ss.str();
+               ecf::log(Log::ERR, error_msg);
+               error_ss << error_msg << "\n";
+ 	            continue;
+ 	         }
+ 	      }
+ 	      else  throw std::runtime_error("ForceCmd: Invalid parameter") ;
+ 	   }
+
+ 	   if ( recursive_ && setRepeatToLastValue_) {
+ 	      node->setRepeatToLastValueHierarchically();
+ 	   }
+ 	}
+
+   // Clear up memory allocated to path. *ASAP*
+ 	// When paths is very large, freeing memory has big impact on performance
+ 	// i.e comment this out and run Client/test/TestSinglePerf.cpp  -> ecflow test_performance to see the effect
+ 	// Commands run after this are considerably slower.Looks like it still retained in memory dues to shared ptr, slightly longer
+   // When dealing with several thousands paths, this makes a *HUGE* difference
+   vector<string>().swap(paths_); // clear paths_ and minimise its capacity *ASAP*
+
+   std::string error_msg = error_ss.str();
+   if (!error_msg.empty()) {
+      throw std::runtime_error( error_msg ) ;
+   }
+
+	/// Change of state, do immediate job generation
+   return doJobSubmission( as );
+}
+
+const char* ForceCmd::arg()  { return CtsApi::forceArg();}
+const char* ForceCmd::desc() {
+            /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   return
+            "Force a node to a given state, or set its event.\n"
+            "When a task is set to complete, it may be automatically re-queued if it has\n"
+            "multiple future time dependencies. However each time we force a complete it will\n"
+            "expire any time based attribute on that node. When the last time based attribute\n"
+            "expires, the node will stay in a complete state.\n"
+            "This behaviour allow Repeat values to be incremented interactively.\n"
+            "A repeat attribute is incremented when all the child nodes are complete\n"
+            "in this case the child nodes are automatically re-queued.\n"
+            "  arg1 = [ unknown | complete | queued | submitted | active | aborted | clear | set ]\n"
+            "  arg2 = (optional) recursive\n"
+            "         Applies state to node and recursively to all its children\n"
+            "  arg3 = (optional) full\n"
+            "         Set repeat variables to last value, only works in conjunction\n"
+            "         with recursive option\n"
+            "  arg4 = path_to_node or path_to_node:<event>: paths must begin with '/'\n"
+            "Usage:\n"
+            "  --force=complete /suite/t1 /suite/t2   # Set task t1 & t2 to complete\n"
+            "  --force=clear /suite/task:ev           # Clear the event 'ev' on task /suite/task\n"
+            "  --force=complete recursive /suite/f1   # Recursively set complete all children of /suite/f1\n"
+            "Effect:\n"
+            "  Consider the effect of forcing complete when the current time is at 09:00\n"
+            "  suite s1\n"
+            "     task t1; time 12:00             # will complete straight away\n"
+            "     task t2; time 10:00 13:00 01:00 # will complete on fourth attempt\n\n"
+            "  --force=complete /s1/t1 /s1/t2\n"
+            "  When we have a time range(i.e as shown with task t2), it is re-queued and the\n"
+            "  next time slot is incremented for each complete, until it expires, and the task completes.\n"
+            "  Use the Why command, to show next run time (i.e. next time slot)"
+            ;
+}
+
+void ForceCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( ForceCmd::arg(),po::value< vector<string> >()->multitoken(), ForceCmd::desc() );
+}
+void ForceCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv*  ac) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+
+	if (ac->debug()) dumpVecArgs(ForceCmd::arg(),args);
+
+	if (args.size() < 2 ) {
+		std::stringstream ss;
+		ss << "ForceCmd: At least two arguments expected for Force. Found " << args.size() << "\n"
+		   << ForceCmd::desc() << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+	std::vector<std::string> options,paths;
+   split_args_to_options_and_paths(args,options,paths); // relative order is still preserved
+   if (paths.empty()) {
+      std::stringstream ss;
+      ss << "ForceCmd: No paths specified. Paths must begin with a leading '/' character\n" << ForceCmd::desc() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+   if (options.empty()) {
+      std::stringstream ss;
+      ss << "ForceCmd: Invalid argument list. Expected of:\n"
+         << "[ unknown | complete | queued | submitted | active | aborted | clear | set]\n" << ForceCmd::desc() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   bool is_valid_state = false;
+   bool is_valid_event_state = false;
+   bool setRepeatToLastValue = false;
+   bool recursive = false;
+   std::string stateOrEvent;
+   size_t vec_size = options.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      if (Str::caseInsCompare(options[i],"recursive"))  recursive = true;
+      else if (Str::caseInsCompare( options[i],"full"))  setRepeatToLastValue = true;
+      else if (NState::isValid(options[i])) { is_valid_state = true; stateOrEvent = options[i];}
+      else if (Event::isValidState(options[i])) { is_valid_event_state = true;  stateOrEvent = options[i];}
+      else {
+         std::stringstream ss; ss << "ForceCmd: Invalid argument \n" << ForceCmd::desc() << "\n";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+
+ 	if (!is_valid_state && !is_valid_event_state) {
+		std::stringstream ss;
+		ss << "ForceCmd: Invalid node state or event expected one of:\n"
+		   << "[ unknown | complete | queued | submitted | active | aborted | clear | set]\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+ 	if ( is_valid_event_state ) {
+ 		// When set or clear used the path needs to include the name of the event:
+ 	   size_t vec_size = paths.size();
+ 	   for(size_t i = 0; i < vec_size; i++) {
+ 	      string the_event,the_path;
+  	      Extract::pathAndName(paths[i],the_path, the_event);
+  	      if ( the_path.empty() || the_event.empty() ) {
+  	         std::stringstream ss;
+  	         ss << "ForceCmd: When 'set' or 'clear' is specified the path needs to include name of the event i.e\n";
+  	         ss << " --force=/path/to_task:event_name set\n";
+  	         throw std::runtime_error( ss.str() );
+  	      }
+ 	   }
+ 	}
+	cmd = Cmd_ptr( new ForceCmd(paths, stateOrEvent, recursive, setRepeatToLastValue  ) );
+}
+
+std::ostream& operator<<(std::ostream& os, const ForceCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/FreeDepCmd.cpp b/ecflow_4_0_7/Base/src/cts/FreeDepCmd.cpp
new file mode 100644
index 0000000..4276286
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/FreeDepCmd.cpp
@@ -0,0 +1,154 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #28 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Node.hpp"
+#include "SuiteChanged.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+//=======================================================================================
+
+bool FreeDepCmd::equals(ClientToServerCmd* rhs) const
+{
+	FreeDepCmd* the_rhs = dynamic_cast<FreeDepCmd*>(rhs);
+	if (!the_rhs)  return false;
+	if ( paths_   != the_rhs->paths())   { return false;}
+	if ( all_     != the_rhs->all())     { return false; }
+	if ( trigger_ != the_rhs->trigger()) { return false; }
+	if ( date_    != the_rhs->date())    { return false; }
+	if ( time_    != the_rhs->time())    { return false; }
+	return UserCmd::equals(rhs);
+}
+
+std::ostream& FreeDepCmd::print(std::ostream& os) const
+{
+	return user_cmd(os,CtsApi::to_string(CtsApi::freeDep(paths_,trigger_,all_,date_,time_)));
+}
+
+STC_Cmd_ptr FreeDepCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().free_dep_++;
+
+   std::stringstream ss;
+	size_t vec_size = paths_.size();
+	for(size_t i = 0; i < vec_size; i++) {
+
+	   node_ptr node = find_node_for_edit_no_throw(as,paths_[i]);
+      if (!node.get()) {
+         ss << "FreeDepCmd: Could not find node at path " << paths_[i] << "\n";
+         LOG(Log::ERR,"FreeDepCmd: Could not find node at path " << paths_[i]);
+         continue;
+      }
+
+	   SuiteChanged0 changed(node);
+	   if (all_) {
+	      node->freeTrigger();
+	      node->freeHoldingDateDependencies();
+	      node->freeHoldingTimeDependencies();
+	   }
+	   else {
+	      if (trigger_) node->freeTrigger();
+	      if (date_)    node->freeHoldingDateDependencies();
+	      if (time_)    node->freeHoldingTimeDependencies();
+	   }
+	}
+
+   // Clear up memory allocated to path *ASAP*
+   // When dealing with several thousands paths, this makes a *HUGE* difference
+   vector<string>().swap(paths_); // clear paths_ and minimise its capacity
+
+   std::string error_msg = ss.str();
+   if (!error_msg.empty()) {
+      throw std::runtime_error( error_msg ) ;
+   }
+
+   return doJobSubmission( as );
+}
+
+const char* FreeDepCmd::arg()  { return CtsApi::freeDepArg();}
+const char* FreeDepCmd::desc() {
+   return
+            "Free dependencies for a node. Defaults to triggers\n"
+            "After freeing the time related dependencies (i.e time,today,cron)\n"
+            "the next time slot will be missed.\n"
+            "  arg1 = (optional) trigger\n"
+            "  arg2 = (optional) all\n"
+            "         Free trigger, date and all time dependencies\n"
+            "  arg3 = (optional) date\n"
+            "         Free date dependencies\n"
+            "  arg4 = (optional) time\n"
+            "         Free all time dependencies i.e time, day, today, cron\n"
+            "  arg5 = List of paths. At least one required. Must start with a leading '/'\n"
+            "Usage:\n"
+            "  --free-dep=/s1/t1 /s2/t2   # free trigger dependencies for task's t1,t2\n"
+            "  --free-dep=all /s1/f1/t1   # free all dependencies of /s1/f1/t1\n"
+            "  --free-dep=date /s1/f1     # free holding date dependencies of /s1/f1"
+            ;
+}
+
+void FreeDepCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( FreeDepCmd::arg(),po::value< vector<string> >()->multitoken(), FreeDepCmd::desc() );
+}
+void FreeDepCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv*  ac) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+
+	if (ac->debug()) dumpVecArgs(FreeDepCmd::arg(),args);
+
+	if (args.size() < 1 ) {
+		std::stringstream ss;
+		ss << "FreeDepCmd: At least one arguments expected for Free dependencies. Found " << args.size() << "\n" << FreeDepCmd::desc() << "\n";
+		throw std::runtime_error( ss.str() );
+	}
+
+   std::vector<std::string> options,paths;
+   split_args_to_options_and_paths(args,options,paths); // relative order is still preserved
+   if (paths.empty()) {
+      std::stringstream ss;
+      ss << "FreeDepCmd: No paths specified. Paths must begin with a leading '/' character\n" << FreeDepCmd::desc() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+	bool trigger = options.empty(); // If no options default to freeing trigger dependencies
+	bool all = false;
+	bool date = false;
+	bool time = false;
+   size_t vec_size = options.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      if (options[i] == "trigger")    trigger = true;
+      else if ( options[i] == "all")  all  = true;
+      else if ( options[i] == "date") date = true;
+      else if ( options[i] == "time") time = true;
+      else {
+         std::stringstream ss;
+         ss << "FreeDepCmd: Invalid argument(" << options[i] << ")\n" << FreeDepCmd::desc() << "\n";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+   assert(trigger || all || date ||  time); // at least one must be true
+	cmd = Cmd_ptr( new FreeDepCmd(paths, trigger, all, date , time) );
+}
+
+std::ostream& operator<<(std::ostream& os, const FreeDepCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/GroupCTSCmd.cpp b/ecflow_4_0_7/Base/src/cts/GroupCTSCmd.cpp
new file mode 100644
index 0000000..ccff662
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/GroupCTSCmd.cpp
@@ -0,0 +1,293 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #29 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/make_shared.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "GroupSTCCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Str.hpp"
+#include "CtsApi.hpp"
+#include "CtsCmdRegistry.hpp"
+#include "ArgvCreator.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+//#define DEBUG_GROUP_CMD 1
+
+//======================================================================================
+
+GroupCTSCmd::GroupCTSCmd(const std::string& cmdSeries,AbstractClientEnv* clientEnv)
+{
+   std::vector<std::string> individualCmdVec;
+   Str::split(cmdSeries,individualCmdVec,";");
+   if ( individualCmdVec.empty())  throw std::runtime_error("GroupCTSCmd::GroupCTSCmd: Please provide a list of ';' separated commands\n" );
+   if (clientEnv->debug()){
+      for(size_t i=0; i < individualCmdVec.size(); i++) { cout << "   CHILD COMMAND = " << individualCmdVec[i] << "\n";}
+   }
+
+
+   // Create a list of allowable commands for a group. i.e excludes help, group
+   po::options_description desc( "Allowed group options" );
+   CtsCmdRegistry cmdRegistry( false /* don't add group option */);
+   cmdRegistry.addCmdOptions(desc);
+
+
+   for(size_t i=0; i < individualCmdVec.size(); i++){
+      // massage the commands so that, we add -- at the start of each command. This is required
+      // by the boost program options.
+      std::string aCmd = individualCmdVec[i];
+      boost::algorithm::trim(aCmd);
+
+      std::string subCmd;
+      if (aCmd.find("--") == std::string::npos)  subCmd = "--";
+      subCmd += aCmd;
+
+      // Each sub command can have, many args
+      std::vector<std::string> subCmdArgs;
+      Str::split(subCmd,subCmdArgs);
+
+      /// Hack because we *can't* create program option with vector of strings, which can be empty
+      /// Hence if command is just show, add a dummy arg.
+      //if (aCmd == "show")  subCmdArgs.push_back("<dummy_arg>");
+
+      std::vector<std::string> theArgs;  theArgs.push_back("ClientInvoker");
+      std::copy( subCmdArgs.begin(), subCmdArgs.end(), std::back_inserter(theArgs));
+
+      // Create a Argv array from a vector of strings
+      ArgvCreator argvCreator(theArgs);
+
+      if (clientEnv->debug()) {
+         cout << "   PROCESSING COMMAND = '" << subCmd << "' argc(" << argvCreator.argc() << ")";
+         cout << argvCreator.toString() << "\n";
+      }
+
+      // Treat each sub command  separately
+      boost::program_options::variables_map group_vm;
+      po::store( po::parse_command_line( argvCreator.argc(), argvCreator.argv(), desc ), group_vm );
+      po::notify( group_vm );
+
+      Cmd_ptr childCmd;
+      cmdRegistry.parse( childCmd,group_vm,clientEnv);
+      addChild( childCmd );
+   }
+}
+
+
+bool GroupCTSCmd::isWrite() const
+{
+ 	BOOST_FOREACH(Cmd_ptr subCmd, cmdVec_) { if (subCmd->isWrite()) return true; }
+ 	return false;
+}
+
+bool GroupCTSCmd::get_cmd() const
+{
+ 	BOOST_FOREACH(Cmd_ptr subCmd, cmdVec_) { if (subCmd->get_cmd()) return true; }
+ 	return false;
+}
+
+PrintStyle::Type_t GroupCTSCmd::show_style() const
+{
+   // Only return non default style( PrintStyle::NOTHING ) if sub command
+   // contains a show cmd
+ 	BOOST_FOREACH(Cmd_ptr subCmd, cmdVec_) {
+ 	   if ( subCmd->show_cmd() ) return subCmd->show_style();
+ 	}
+ 	return PrintStyle::NOTHING;
+}
+
+bool GroupCTSCmd::task_cmd() const
+{
+ 	BOOST_FOREACH(Cmd_ptr subCmd, cmdVec_) { if (subCmd->task_cmd()) return true; }
+ 	return false;
+}
+
+bool GroupCTSCmd::terminate_cmd() const
+{
+ 	BOOST_FOREACH(Cmd_ptr subCmd, cmdVec_) { if (subCmd->terminate_cmd()) return true; }
+ 	return false;
+}
+
+bool GroupCTSCmd::why_cmd( std::string& nodePath) const
+{
+ 	BOOST_FOREACH(Cmd_ptr subCmd, cmdVec_) { if (subCmd->why_cmd(nodePath)) return true; }
+ 	return false;
+}
+
+std::ostream& GroupCTSCmd::print(std::ostream& os) const
+{
+   std::stringstream ss;
+   size_t the_size = cmdVec_.size();
+	for(size_t i = 0; i < the_size; i++) {
+ 		cmdVec_[i]->print(ss);
+ 		ss <<"; ";
+ 	}
+	return user_cmd(os,CtsApi::group(ss.str()));
+}
+
+bool GroupCTSCmd::equals(ClientToServerCmd* rhs) const
+{
+	GroupCTSCmd* the_rhs = dynamic_cast< GroupCTSCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+
+ 	const std::vector<Cmd_ptr>& rhsCmdVec = the_rhs->cmdVec();
+	if (cmdVec_.size() != rhsCmdVec.size()) return false;
+
+	for(size_t i = 0; i < cmdVec_.size(); i++) {
+		if ( !cmdVec_[i]->equals( rhsCmdVec[i].get() ) ) {
+			return false;
+		}
+	}
+
+	return UserCmd::equals(rhs);
+}
+
+void GroupCTSCmd::addChild(Cmd_ptr childCmd)
+{
+	assert(childCmd.get()); // Dont add NULL children
+	cmdVec_.push_back(childCmd);
+}
+
+void GroupCTSCmd::setup_user_authentification()
+{
+   UserCmd::setup_user_authentification();
+ 	for(size_t i = 0; i < cmdVec_.size(); i++) {
+ 		cmdVec_[i]->setup_user_authentification();
+ 	}
+}
+
+bool GroupCTSCmd::authenticate(AbstractServer* as, STC_Cmd_ptr& errorMsg) const
+{
+	// Can only run Group cmd if all child commands authenticate
+   size_t cmd_vec_size = cmdVec_.size();
+ 	for(size_t i = 0; i < cmd_vec_size; i++) {
+ 		if (!cmdVec_[i]->authenticate(as,errorMsg)) {
+
+ 		   // Log authentication failure:
+ 		   std::stringstream ss;
+ 		   ss << "GroupCTSCmd::authenticate failed: for ";
+ 		   cmdVec_[i]->print(ss);
+ 		   ss << errorMsg;
+ 		   log(Log::ERR,ss.str());    // will automatically add end of line
+
+#ifdef	DEBUG_GROUP_CMD
+ 			std::cout << "GroupCTSCmd::authenticate failed for "; cmdVec_[i]->print(std::cout); std::cout << errorMsg << "\n";
+#endif
+ 			return false;
+ 		}
+ 	}
+ 	return true;
+}
+
+STC_Cmd_ptr GroupCTSCmd::doHandleRequest(AbstractServer* as) const
+{
+#ifdef	DEBUG_GROUP_CMD
+	std::cout << "GroupCTSCmd::doHandleRequest cmdVec_.size() = " << cmdVec_.size() << "\n";
+#endif
+
+	as->update_stats().group_cmd_++;
+
+	boost::shared_ptr<GroupSTCCmd> theReturnedGroupCmd = boost::make_shared<GroupSTCCmd>();
+
+	// For the command to succeed all children MUST succeed
+   size_t cmd_vec_size = cmdVec_.size();
+	for(size_t i = 0; i < cmd_vec_size; i++) {
+#ifdef	DEBUG_GROUP_CMD
+		std::cout << "  GroupCTSCmd::doHandleRequest calling "; cmdVec_[i]->print(std::cout);  // std::cout << "\n";
+#endif
+
+		STC_Cmd_ptr theReturnCmd  = cmdVec_[i]->doHandleRequest(as);
+
+#ifdef DEBUG_GROUP_CMD
+		std::cout << " return Cmd = "; theReturnCmd->print(std::cout);  std::cout << "\n";
+#endif
+
+		if ( !theReturnCmd->ok() ) {
+			return theReturnCmd; // The Error Command
+		}
+
+		if ( !theReturnCmd->get_string().empty() ) {
+#ifdef	DEBUG_GROUP_CMD
+			std::cout << "  GroupCTSCmd::doHandleRequest returning Cmd = "; theReturnCmd->print(std::cout); std::cout << "  to client\n";
+#endif
+			theReturnedGroupCmd->addChild( theReturnCmd );
+			continue;
+		}
+
+		if ( theReturnCmd->hasDefs() ) {
+#ifdef	DEBUG_GROUP_CMD
+			std::cout << "  GroupCTSCmd::doHandleRequest returning Cmd = "; theReturnCmd->print(std::cout); std::cout << "  to client\n";
+#endif
+			theReturnedGroupCmd->addChild( theReturnCmd );
+         continue;
+		}
+
+      if ( theReturnCmd->hasNode() ) {
+#ifdef   DEBUG_GROUP_CMD
+         std::cout << "  GroupCTSCmd::doHandleRequest returning Cmd = "; theReturnCmd->print(std::cout); std::cout << "  to client\n";
+#endif
+         theReturnedGroupCmd->addChild( theReturnCmd );
+      }
+	}
+
+	if ( theReturnedGroupCmd->cmdVec().empty() ) {
+		// Nothing to return, i.e. no Defs, Node or Log file
+		return PreAllocatedReply::ok_cmd();
+	}
+
+	return theReturnedGroupCmd ;
+}
+
+const char* GroupCTSCmd::arg() { return CtsApi::groupArg() ;}
+const char* GroupCTSCmd::desc() {
+   return
+            "Allows a series of ';' separated commands to be grouped and executed as one.\n"
+            "Some commands like halt, shutdown and terminate will prompt the user. To bypass the prompt\n"
+            "provide 'yes' as an additional parameter. See example below.\n"
+            "  arg = string\n"
+            "Usage:\n"
+            "   --group=\"halt yes; reloadwsfile; restart;\"\n"
+            "                                 # halt server,bypass the confirmation prompt,\n"
+            "                                 # reload white list file, restart server\n"
+            "   --group=\"get; show\"           # get server defs, and write to standard output\n"
+            "   --group=\"get /s1; show state\" # get suite 's1', and write state to standard output"
+            ;
+}
+
+void GroupCTSCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( GroupCTSCmd::arg(),	po::value< string >(), GroupCTSCmd::desc() );
+}
+
+void GroupCTSCmd::create( 	Cmd_ptr& cmd,
+							boost::program_options::variables_map& vm,
+							AbstractClientEnv* clientEnv ) const
+{
+   if (clientEnv->debug()) cout <<  arg() << ": Group Cmd '" << vm[ arg() ].as< std::string > ()  << "'\n";
+
+   // Parse and split commands and then parse individually. Assumes commands are separated by ';'
+   std::string cmdSeries = vm[GroupCTSCmd::arg()].as< std::string > ();
+
+   cmd = Cmd_ptr( new GroupCTSCmd(cmdSeries,clientEnv) );
+}
+
+std::ostream& operator<<(std::ostream& os, const GroupCTSCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/LoadDefsCmd.cpp b/ecflow_4_0_7/Base/src/cts/LoadDefsCmd.cpp
new file mode 100644
index 0000000..10d9f95
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/LoadDefsCmd.cpp
@@ -0,0 +1,154 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #43 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/make_shared.hpp>
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Str.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+LoadDefsCmd::LoadDefsCmd(const std::string& defs_filename, bool force)
+: force_(force), defs_(Defs::create()), defs_filename_(defs_filename)
+{
+   if (defs_filename_.empty()) {
+      std::stringstream ss;
+      ss << "LoadDefsCmd::LoadDefsCmd: The pathname to the definition file must be provided\n" << LoadDefsCmd::desc();
+      throw std::runtime_error(ss.str());
+   }
+
+   // At the end of the parse check the trigger/complete expressions and resolve in-limits
+   DefsStructureParser checkPtParser( defs_.get(), defs_filename_ );
+   std::string errMsg, warningMsg;
+   if ( checkPtParser.doParse( errMsg , warningMsg) ) {
+      // Dump out the in memory Node tree
+      // std::cout << defs_.get();
+
+      // Out put any warning to standard output
+      cout << warningMsg;
+   }
+   else {
+      std::stringstream ss; ss << "\nLoadDefsCmd::LoadDefsCmd.  Failed to parse file " << defs_filename_ << "\n";
+      ss << errMsg;
+      throw std::runtime_error( ss.str() );
+   }
+}
+
+bool LoadDefsCmd::equals(ClientToServerCmd* rhs) const
+{
+	LoadDefsCmd* the_rhs = dynamic_cast<LoadDefsCmd*>(rhs);
+	if (!the_rhs)  return false;
+
+	if (!UserCmd::equals(rhs))  return false;
+
+	if (defs_ == NULL && the_rhs->theDefs() == NULL) return true;
+	if (defs_ == NULL && the_rhs->theDefs() != NULL) return false;
+	if (defs_ != NULL && the_rhs->theDefs() == NULL) return false;
+
+	return (*defs_ == *(the_rhs->theDefs()));
+}
+
+STC_Cmd_ptr LoadDefsCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().load_defs_++;
+
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+	if (defs_) {
+
+		// After the updateDefs, defs_ will be left with NO suites.
+		// Can't really used defs_ after this point
+	   // *NOTE* Externs are not persisted. Hence calling check() will report
+	   // all errors, references are not resolved.
+		as->updateDefs(defs_,force_);
+ 	}
+
+	return PreAllocatedReply::ok_cmd();
+}
+
+std::ostream& LoadDefsCmd::print(std::ostream& os) const
+{
+   /// If defs_filename_ is empty, the Defs was a in memory defs.
+   if (defs_filename_.empty()) {
+      return user_cmd(os,CtsApi::to_string(CtsApi::loadDefs("<in-memory-defs>",force_,false/*check_only*/)));
+   }
+   return user_cmd(os,CtsApi::to_string(CtsApi::loadDefs(defs_filename_,force_,false/*check_only*/)));
+}
+
+const char* LoadDefsCmd::arg()  { return CtsApi::loadDefsArg();}
+const char* LoadDefsCmd::desc() {
+   return   "Check and load definition file into server.\n"
+            "The loaded definition will be checked for valid trigger and complete expressions,\n"
+            "additionally in-limit references to limits will be validated.\n"
+            "If the server already has the 'suites' of the same name, then a error message is issued.\n"
+            "The suite's can be overwritten if the force option is used.\n"
+            "To just check the definition and not send to server, use 'check_only'\n"
+            "  arg1 = path to the definition file\n"
+            "  arg2 = (optional) [ force | check_only ]   # default = false for both\n"
+            "Usage:\n"
+            "--load=/my/home/exotic.def             # will error if suites of same name exists\n"
+            "--load=/my/home/exotic.def force       # overwrite suite's of same name\n"
+            "--load=/my/home/exotic.def check_only  # Just check, don't send to server"
+            ;
+}
+
+void LoadDefsCmd::addOption(boost::program_options::options_description& desc) const{
+	desc.add_options()( LoadDefsCmd::arg(),  po::value< vector<string> >()->multitoken(),  LoadDefsCmd:: desc() );
+}
+
+void LoadDefsCmd::create( 	Cmd_ptr& cmd,
+							boost::program_options::variables_map& vm,
+							AbstractClientEnv* clientEnv ) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+	if (clientEnv->debug()) dumpVecArgs(LoadDefsCmd::arg(),args);
+
+	bool check_only = false;
+	bool force =  false;
+	std::string defs_filename;
+	for(size_t i = 0; i < args.size(); i++) {
+		if (args[i] == "force") force = true;
+		else if (args[i] == "check_only") check_only = true;
+		else defs_filename = args[i];
+	}
+	if (clientEnv->debug())  cout <<  "LoadDefsCmd::create:  Defs file '" <<  defs_filename << "'.\n";
+
+	cmd = LoadDefsCmd::create(defs_filename,force, check_only,clientEnv );
+}
+
+Cmd_ptr LoadDefsCmd::create(const std::string& defs_filename, bool force, bool check_only, AbstractClientEnv* clientEnv)
+{
+   // The constructor can throw if parsing of defs_filename fail's
+   boost::shared_ptr<LoadDefsCmd> load_cmd = boost::make_shared<LoadDefsCmd>(defs_filename,force);
+
+   // Don't send to server if checking, i.e cmd not set
+   if (check_only) return Cmd_ptr();
+
+   // For test allow the server environment to be changed, i.e. allow us to inject ECF_CLIENT
+   // The server will also update the env on the defs, server will override client env, where they clash
+   load_cmd->theDefs()->set_server().add_or_update_user_variables( clientEnv->env() );
+
+   return load_cmd;
+}
+
+
+std::ostream& operator<<(std::ostream& os, const LoadDefsCmd& c)  { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/LogCmd.cpp b/ecflow_4_0_7/Base/src/cts/LogCmd.cpp
new file mode 100644
index 0000000..39f8171
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/LogCmd.cpp
@@ -0,0 +1,234 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #30 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "boost/filesystem/path.hpp"
+#include "boost/filesystem/operations.hpp"
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Log.hpp"
+#include "CtsApi.hpp"
+#include "Str.hpp"
+#include "Defs.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+namespace fs = boost::filesystem;
+
+
+LogCmd::LogCmd(LogApi a, int get_last_n_lines)
+: api_(a), get_last_n_lines_(get_last_n_lines)
+{
+   if (get_last_n_lines_ == 0) get_last_n_lines_ = Log::get_last_n_lines_default();
+}
+
+
+LogCmd::LogCmd()
+: api_(LogCmd::GET),get_last_n_lines_(Log::get_last_n_lines_default()) {}
+
+
+LogCmd::LogCmd(const std::string& path)
+: api_(NEW),get_last_n_lines_(Log::get_last_n_lines_default()),new_path_(path)
+{
+   // ECFLOW-154, If path to new log file is specified, it should only be checked by the server,
+   //             as that could be on a different machine.
+   // ECFLOW-174, Never get the full log, as this can make server consume to much memory
+   //             default taken from get_last_n_lines_default
+}
+
+std::ostream& LogCmd::print(std::ostream& os) const
+{
+    switch (api_) {
+      case LogCmd::GET:   return user_cmd(os,CtsApi::to_string(CtsApi::getLog(get_last_n_lines_)));  break;
+      case LogCmd::CLEAR: return user_cmd(os,CtsApi::clearLog()); break;
+      case LogCmd::FLUSH: return user_cmd(os,CtsApi::flushLog()); break;
+      case LogCmd::NEW:   return user_cmd(os,CtsApi::to_string(CtsApi::new_log(new_path_)));  break;
+      case LogCmd::PATH:  return user_cmd(os,CtsApi::get_log_path()); break;
+      default : throw std::runtime_error( "LogCmd::print: Unrecognised log api command,") ;
+   }
+   return os;
+}
+
+bool LogCmd::equals(ClientToServerCmd* rhs) const
+{
+	LogCmd* the_rhs = dynamic_cast< LogCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (api_ != the_rhs->api()) return false;
+	if (get_last_n_lines_ != the_rhs->get_last_n_lines()) return false;
+	if (new_path_ != the_rhs->new_path()) return false;
+	return UserCmd::equals(rhs);
+}
+
+STC_Cmd_ptr LogCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().log_cmd_++;
+
+	if (Log::instance()) {
+		switch (api_) {
+			case LogCmd::GET:   return PreAllocatedReply::string_cmd( Log::instance()->contents(get_last_n_lines_) ); break;
+			case LogCmd::CLEAR: Log::instance()->clear(); break;
+			case LogCmd::FLUSH: Log::instance()->flush(); break;
+         case LogCmd::NEW:   {
+            if (!new_path_.empty()) {
+               Log::instance()->new_path(new_path_); // will throw for errors
+
+               // Update the corresponding server variable
+               NameValueVec vec;
+               vec.push_back(std::make_pair(Str::ECF_LOG(),Log::instance()->path()));
+               as->defs()->set_server().add_or_update_server_variables(vec);
+            }
+            else {
+               // User could have overridden ECF_LOG variable
+               const std::string& log_file_name = as->defs()->server().find_variable(Str::ECF_LOG());
+               Log::instance()->new_path(log_file_name);  // will throw for errors
+            }
+
+            as->stats().ECF_LOG_ = Log::instance()->path();  // do NOT update number of requests
+            break;
+         }
+         case LogCmd::PATH:  return PreAllocatedReply::string_cmd(  Log::instance()->path() ); break;
+			default : throw std::runtime_error( "Unrecognised log api command,") ;
+		}
+	}
+	return PreAllocatedReply::ok_cmd();
+}
+
+const char* LogCmd::arg() { return "log";}
+const char* LogCmd::desc() {
+   return  "Get,clear,flush or create a new log file.\n"
+            "The user must ensure that a valid path is specified.\n"
+            "Specifying '--log=get' with a large number of lines from the server,\n"
+            "can consume a lot of **memory**. The log file can be a very large file,\n"
+            "hence we use a default of 100 lines, optionally the number of lines can be specified.\n"
+            "  arg1 = [ get | clear | flush | new | path ]\n"
+            "         get   -  Outputs the log file to standard out.\n"
+            "                  defaults to return the last 100 lines\n"
+            "                  The second argument can specify how many lines to return\n"
+            "         clear -  Clear the log file of its contents.\n"
+            "         flush -  Flush and close the log file. (only temporary) next time\n"
+            "                  server writes to log, it will be opened again. Hence it best\n"
+            "                  to halt the server first\n"
+            "         new   -  Flush and close the existing log file, and start using the\n"
+            "                  the path defined for ECF_LOG. By changing this variable\n"
+            "                  a new log file path can be used\n"
+            "                  Alternatively an explicit path can also be provided\n"
+            "                  in which case ECF_LOG is also updated\n"
+            "         path  -  Returns the path name to the existing log file\n"
+            "  arg2 = [ new_path | optional last n lines ]\n"
+            "         if get specified can specify lines to get. Value must be convertible to an integer\n"
+            "         Otherwise if arg1 is 'new' then the second argument must be a path\n"
+            "Usage:\n"
+            "  --log=get                        # Write the last 100 lines of the log file to standard out\n"
+            "  --log=get 200                    # Write the last 200 lines of the log file to standard out\n"
+            "  --log=clear                      # Clear the log file. The log is now empty\n"
+            "  --log=flush                      # Flush and close log file, next request will re-open log file\n"
+            "  --log=new /path/to/new/log/file  # Close and flush log file, and create a new log file, updates ECF_LOG\n"
+            "  --log=new                        # Close and flush log file, and create a new log file using ECF_LOG variable"
+            ;
+}
+
+void LogCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( LogCmd::arg(), po::value< vector<string> >()->multitoken(), LogCmd::desc() );
+}
+
+void LogCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* ac) const
+{
+	vector<string> args = vm[ arg() ].as< vector<string> >();
+
+	if (ac->debug())   dumpVecArgs(LogCmd::arg(),args);
+
+	if (!args.empty() && args[0] == "get")  {
+
+		if ( args.size() != 1 && args.size() != 2) {
+			std::stringstream ss;
+			ss << "LogCmd: Please use '--log==get 100' to get the log file contents from the server\n";
+			ss << "optionally an integer can be provide to specify the last number of lines\n";
+			throw std::runtime_error( ss.str() );
+		}
+
+		if (args.size() == 1 ) {
+			// This will retrieve Log::get_last_n_lines_default() lines from the log file.
+			cmd = Cmd_ptr( new LogCmd( LogCmd::GET , Log::get_last_n_lines_default() ) );
+			return;
+		}
+
+ 		int value = Log::get_last_n_lines_default();
+ 		if (args.size() == 2) {
+ 			try { value = boost::lexical_cast<int>(args[1]); }
+ 			catch (boost::bad_lexical_cast& e) {
+ 				throw std::runtime_error( "LogCmd: Second argument must be a integer, i.e. --log get 100\n" );
+ 			}
+ 		}
+
+	 	cmd = Cmd_ptr( new LogCmd( LogCmd::GET, value ) );
+	 	return ;
+	}
+
+ 	if (!args.empty() && args[0] == "clear")   {
+
+		if (args.size() != 1 ) {
+			std::stringstream ss;
+			ss << "LogCmd: Too many arguments. Please use " << CtsApi::clearLog() << " to clear the log file\n";
+ 			throw std::runtime_error( ss.str() );
+		}
+ 		cmd = Cmd_ptr( new LogCmd( LogCmd::CLEAR ) );
+ 		return;
+ 	}
+ 	if (!args.empty() && args[0] == "flush")   {
+
+		if (args.size() != 1 ) {
+			std::stringstream ss;
+			ss << "LogCmd: Too many arguments. Please use " << CtsApi::flushLog() << " to flush the log file\n";
+ 			throw std::runtime_error( ss.str() );
+		}
+ 		cmd = Cmd_ptr( new LogCmd( LogCmd::FLUSH ) );
+ 		return;
+ 	}
+   if (!args.empty() && args[0] == "path")   {
+
+      if (args.size() != 1 ) {
+         std::stringstream ss;
+         ss << "LogCmd: Too many arguments. Please use " << CtsApi::get_log_path() << " to get the log file path\n";
+         throw std::runtime_error( ss.str() );
+      }
+      cmd = Cmd_ptr( new LogCmd( LogCmd::PATH ) );
+      return;
+   }
+
+   if (!args.empty() && args[0] == "new")   {
+
+      if (args.size() > 2 ) {
+         std::stringstream ss;
+         ss << "LogCmd: Too many arguments.  Expected --log=new   OR   --log=new /path/to/newlog/file\n";
+         throw std::runtime_error( ss.str() );
+      }
+      std::string path;
+      if ( args.size() == 2 ) {
+         path = args[1];
+      }
+      cmd = Cmd_ptr( new LogCmd( path ) );
+      return;
+   }
+
+ 	std::stringstream ss;
+ 	ss << "LogCmd: The arguments have not been specified correctly\n" << LogCmd::desc();
+   throw std::runtime_error( ss.str() );
+}
+
+std::ostream& operator<<(std::ostream& os, const LogCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/LogMessageCmd.cpp b/ecflow_4_0_7/Base/src/cts/LogMessageCmd.cpp
new file mode 100644
index 0000000..0486f2d
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/LogMessageCmd.cpp
@@ -0,0 +1,72 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Log.hpp"
+#include "Stats.hpp"
+#include "CtsApi.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+std::ostream& LogMessageCmd::print(std::ostream& os) const
+{
+	return user_cmd(os,CtsApi::logMsg(msg_));
+}
+
+bool LogMessageCmd::equals(ClientToServerCmd* rhs) const
+{
+	LogMessageCmd* the_rhs = dynamic_cast< LogMessageCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (msg_ != the_rhs->msg()) return false;
+ 	return UserCmd::equals(rhs);
+}
+
+STC_Cmd_ptr LogMessageCmd::doHandleRequest(AbstractServer* as) const
+{
+	// ***** No need to log message here, already done via print, in base ****
+	as->update_stats().log_msg_cmd_++;
+	return PreAllocatedReply::ok_cmd();
+}
+
+const char* LogMessageCmd::arg() { return CtsApi::logMsgArg();}
+const char* LogMessageCmd::desc() {
+	return
+	         "Writes the input string to the log file.\n"
+	         "  arg1 = string\n"
+	         "Usage:\n"
+	         "  --msg=\"place me in the log file\""
+	         ;
+}
+
+void LogMessageCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( LogMessageCmd::arg(), po::value< string >(), LogMessageCmd::desc() );
+}
+
+void LogMessageCmd::create( Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* ace) const
+{
+	string msg = vm[ arg() ].as< string >();
+	if (ace->debug()) { cout << "  LogMessageCmd::create arg = " << msg << "\n";}
+	cmd = Cmd_ptr( new LogMessageCmd( msg ) );
+}
+
+std::ostream& operator<<(std::ostream& os, const LogMessageCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/OrderNodeCmd.cpp b/ecflow_4_0_7/Base/src/cts/OrderNodeCmd.cpp
new file mode 100644
index 0000000..b6f28b3
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/OrderNodeCmd.cpp
@@ -0,0 +1,110 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #21 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+bool OrderNodeCmd::equals(ClientToServerCmd* rhs) const
+{
+	OrderNodeCmd* the_rhs = dynamic_cast< OrderNodeCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (absNodepath_ != the_rhs->absNodepath()) return false;
+	if (option_ != the_rhs->option()) return false;
+	return UserCmd::equals(rhs);
+}
+
+std::ostream& OrderNodeCmd::print(std::ostream& os) const
+{
+ 	return user_cmd(os,CtsApi::to_string(CtsApi::order(absNodepath_,NOrder::toString(option_))));
+}
+
+STC_Cmd_ptr OrderNodeCmd::doHandleRequest(AbstractServer* as) const
+{
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+
+	as->update_stats().order_node_++;
+
+	node_ptr theNode = find_node_for_edit(as,absNodepath_);
+
+	Node* theParent = theNode->parent();
+	if ( theParent ) theParent->order(theNode.get(), option_);
+	else             as->defs()->order(theNode.get(), option_);
+
+   return doJobSubmission( as );
+}
+
+const char* OrderNodeCmd::arg()  { return CtsApi::orderArg();}
+const char* OrderNodeCmd::desc() {
+   return
+            "Re-orders the nodes held by the server\n"
+            "  arg1 = node path\n"
+            "  arg2 = [ top | bottom | alpha | order | up | down ]\n"
+            "It should be noted that in the absence of triggers and time/date dependencies,\n"
+            "the tasks are submitted in order.\n"
+            "This changes the order and hence affects the submission order::\n\n"
+            "   o top     raises the node within its parent, so that it is first\n"
+            "   o bottom  lowers the node within its parent, so that it is last\n"
+            "   o alpha   Arranges for all the peers of selected note to be sorted alphabetically (case-insensitive)\n"
+            "   o order   Arranges for all the peers of selected note to be sorted in reverse alphabet(case-insensitive)\n"
+            "   o up      Moves the selected node up one place amongst its peers\n"
+            "   o down    Moves the selected node down one place amongst its peers\n\n"
+            "This command can fail because:\n"
+            "- The node path does not exist in the server\n"
+            "- The order_type is not does not match one of arg2\n"
+            "Usage:\n"
+            "  --order=/suite/f1 top  # move node f1 to the top"
+            ;
+}
+
+void OrderNodeCmd::addOption(boost::program_options::options_description& desc) const{
+	desc.add_options()( OrderNodeCmd::arg(), po::value< vector<string> >()->multitoken(), OrderNodeCmd::desc() );
+}
+void OrderNodeCmd::create( 	Cmd_ptr& cmd,
+								boost::program_options::variables_map& vm,
+								AbstractClientEnv* ac) const
+{
+	vector<string> args = vm[ OrderNodeCmd::arg() ].as< vector<string> >();
+
+	if (ac->debug()) dumpVecArgs(OrderNodeCmd::arg(),args);
+
+	if (args.size() != 2 ) {
+		std::stringstream ss;
+		ss << "OrderNodeCmd: Two arguments expected. Please specify one of:\n";
+ 		ss << OrderNodeCmd::arg() << " pathToNode top\n";
+		ss << OrderNodeCmd::arg() << " pathToNode bottom\n";
+		ss << OrderNodeCmd::arg() << " pathToNode alpha\n";
+		ss << OrderNodeCmd::arg() << " pathToNode order\n";
+		ss << OrderNodeCmd::arg() << " pathToNode up\n";
+		ss << OrderNodeCmd::arg() << " pathToNode down\n";
+	 	throw std::runtime_error( ss.str() );
+	}
+
+	if (!NOrder::isValid(args[1])) {
+ 	 	throw std::runtime_error( "OrderNodeCmd: Invalid second option: please specify one of [ top, bottom, alpha, order, up, down ]\n");
+ 	}
+
+ 	cmd = Cmd_ptr(new OrderNodeCmd( args[0],NOrder::toOrder(args[1])));
+}
+
+std::ostream& operator<<(std::ostream& os, const OrderNodeCmd& c) { return c.print(os); }
+
diff --git a/ecflow_4_0_7/Base/src/cts/PathsCmd.cpp b/ecflow_4_0_7/Base/src/cts/PathsCmd.cpp
new file mode 100644
index 0000000..2ad9fdb
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/PathsCmd.cpp
@@ -0,0 +1,505 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <algorithm>
+#include <boost/make_shared.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "Suite.hpp"
+#include "SuiteChanged.hpp"
+#include "Ecf.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+// forward declare static functions
+static void check_for_active_or_submitted_tasks(AbstractServer* as,node_ptr theNodeToDelete);
+
+
+PathsCmd::PathsCmd(Api api,const std::string& absNodePath, bool force)
+: api_(api),force_(force)
+{
+   if (!absNodePath.empty()) paths_.push_back(absNodePath);
+}
+
+std::ostream& PathsCmd::print(std::ostream& os) const
+{
+   switch (api_) {
+      case PathsCmd::DELETE:             return user_cmd(os,CtsApi::to_string(CtsApi::delete_node(paths_,force_))); break;
+      case PathsCmd::SUSPEND:            return user_cmd(os,CtsApi::to_string(CtsApi::suspend(paths_))); break;
+      case PathsCmd::RESUME:             return user_cmd(os,CtsApi::to_string(CtsApi::resume(paths_))); break;
+      case PathsCmd::KILL:               return user_cmd(os,CtsApi::to_string(CtsApi::kill(paths_))); break;
+      case PathsCmd::STATUS:             return user_cmd(os,CtsApi::to_string(CtsApi::status(paths_))); break;
+      case PathsCmd::CHECK:              return user_cmd(os,CtsApi::to_string(CtsApi::check(paths_))); break;
+      case PathsCmd::EDIT_HISTORY:       return user_cmd(os,CtsApi::to_string(CtsApi::edit_history(paths_))); break;
+      case PathsCmd::NO_CMD:       break;
+      default: assert(false);break;
+   }
+   return os;
+}
+
+bool PathsCmd::equals(ClientToServerCmd* rhs) const
+{
+   PathsCmd* the_rhs = dynamic_cast< PathsCmd* > ( rhs );
+   if ( !the_rhs ) return false;
+   if (api_ != the_rhs->api()) return false;
+   if (paths_ != the_rhs->paths()) return false;
+   if (force_ != the_rhs->force()) return false;
+   return UserCmd::equals(rhs);
+}
+
+bool PathsCmd::isWrite() const
+{
+   switch (api_) {
+      case PathsCmd::DELETE:            return true;  break; // requires write privilege
+      case PathsCmd::SUSPEND:           return true;  break; // requires write privilege
+      case PathsCmd::RESUME:            return true;  break; // requires write privilege
+      case PathsCmd::KILL:              return true;  break; // requires write privilege
+      case PathsCmd::STATUS:            return false; break; // read only
+      case PathsCmd::CHECK:             return false; break; // read only
+      case PathsCmd::EDIT_HISTORY:      return false; break; // read only
+      case PathsCmd::NO_CMD: break;
+      default: break;
+   }
+   assert(false);
+   return false;
+}
+
+const char* PathsCmd::theArg() const
+{
+   switch (api_) {
+      case PathsCmd::DELETE:             return CtsApi::delete_node_arg(); break;
+      case PathsCmd::SUSPEND:            return CtsApi::suspend_arg(); break;
+      case PathsCmd::RESUME:             return CtsApi::resume_arg(); break;
+      case PathsCmd::KILL:               return CtsApi::kill_arg(); break;
+      case PathsCmd::STATUS:             return CtsApi::statusArg(); break;
+      case PathsCmd::CHECK:              return CtsApi::check_arg(); break;
+      case PathsCmd::EDIT_HISTORY:       return CtsApi::edit_history_arg(); break;
+      case PathsCmd::NO_CMD: break;
+      default: break;
+   }
+   assert(false);
+   return NULL;
+}
+
+bool PathsCmd::delete_all_cmd() const
+{
+   if (api_ == PathsCmd::DELETE && paths_.empty()) {
+      return true;
+   }
+   return false ;
+}
+
+STC_Cmd_ptr PathsCmd::doHandleRequest(AbstractServer* as) const
+{
+   std::stringstream ss;
+   switch (api_) {
+
+      case PathsCmd::CHECK:  {
+         as->update_stats().check_++;
+
+         if (  paths_.empty() ) {
+            // check all the defs,
+            std::string error_msg,warning_msg;
+            if (!as->defs()->check(error_msg,warning_msg)) {
+               error_msg += "\n";
+               error_msg += warning_msg;
+               return PreAllocatedReply::string_cmd(error_msg);
+            }
+            return PreAllocatedReply::string_cmd(warning_msg); // can be empty
+         }
+         else {
+            std::string acc_warning_msg;
+            size_t vec_size = paths_.size();
+            for(size_t i = 0; i < vec_size; i++) {
+
+               node_ptr theNodeToCheck =  as->defs()->findAbsNode(paths_[i]);
+               if (!theNodeToCheck.get()) {
+                  ss << "PathsCmd:Check: Could not find node at path '" << paths_[i] << "'\n";
+                  LOG(Log::ERR,"Check: Could not find node at path " << paths_[i]);
+                  continue;
+               }
+
+               std::string error_msg,warning_msg;
+               if (!theNodeToCheck->check(error_msg,warning_msg)) {
+                  error_msg += "\n";
+                  error_msg += warning_msg;
+                  return PreAllocatedReply::string_cmd(error_msg);
+               }
+               acc_warning_msg += warning_msg;
+            }
+            std::string paths_not_fnd_error_msg = ss.str();
+            if (!paths_not_fnd_error_msg.empty()) throw std::runtime_error( paths_not_fnd_error_msg );
+            return PreAllocatedReply::string_cmd(acc_warning_msg);
+         }
+         break;
+      }
+
+      case PathsCmd::DELETE: {
+         as->update_stats().node_delete_++;
+
+         if ( paths_.empty() ) {
+            if (!force_) check_for_active_or_submitted_tasks(as,node_ptr());
+            else         as->zombie_ctrl().add_user_zombies(as->defs());
+            as->clear_defs();
+         }
+         else {
+
+            size_t vec_size = paths_.size();
+            for(size_t i = 0; i < vec_size; i++) {
+
+               node_ptr theNodeToDelete =  as->defs()->findAbsNode(paths_[i]);
+               if (!theNodeToDelete.get()) {
+                  ss << "PathsCmd:Delete: Could not find node at path '" << paths_[i] << "'\n";
+                  LOG(Log::ERR,"Delete: Could not find node at path " << paths_[i]);
+                  continue;
+               }
+
+               if (!force_) check_for_active_or_submitted_tasks(as,theNodeToDelete);
+               else         as->zombie_ctrl().add_user_zombies(theNodeToDelete);
+
+               if (!as->defs()->deleteChild( theNodeToDelete.get() )) {
+                  std::string errorMsg = "Delete: Can not delete node " + theNodeToDelete->debugNodePath();
+                  throw std::runtime_error( errorMsg ) ;
+               }
+            }
+         }
+         break;
+      }
+
+      case PathsCmd::SUSPEND: {
+         as->update_stats().node_suspend_++;
+         size_t vec_size = paths_.size();
+         for(size_t i = 0; i < vec_size; i++) {
+            node_ptr theNode = find_node_for_edit_no_throw(as,paths_[i]);
+            if (!theNode.get()) {
+               ss << "PathsCmd:Suspend: Could not find node at path '" << paths_[i] << "'\n";
+               LOG(Log::ERR,"Suspend: Could not find node at path " << paths_[i]);
+               continue;
+            }
+            SuiteChanged0 changed(theNode);
+            theNode->suspend();
+         }
+         break;
+      }
+
+      case PathsCmd::RESUME: {
+
+         // At the end of resume, we need to traverse node tree, and do job submission
+         as->update_stats().node_resume_++;
+         size_t vec_size = paths_.size();
+         for(size_t i = 0; i < vec_size; i++) {
+            node_ptr theNode = find_node_for_edit_no_throw(as,paths_[i]);
+            if (!theNode.get()) {
+               ss << "PathsCmd:Resume: Could not find node at path '" << paths_[i] << "'\n";
+               LOG(Log::ERR,"Resume: Could not find path " << paths_[i]);
+               continue;
+            }
+            SuiteChanged0 changed(theNode);
+            theNode->resume();
+            as->increment_job_generation_count(); // in case we throw below
+         }
+         break;
+      }
+
+      case PathsCmd::KILL: {
+         as->update_stats().node_kill_++;
+         size_t vec_size = paths_.size();
+         for(size_t i = 0; i < vec_size; i++) {
+            node_ptr theNode = find_node_for_edit_no_throw(as,paths_[i]);
+            if (!theNode.get()) {
+               ss << "PathsCmd:Kill: Could not find node at path '" << paths_[i] << "'\n";
+               LOG(Log::ERR,"Kill: Could not find node at path " << paths_[i]);
+               continue;
+            }
+            SuiteChanged0 changed(theNode);
+            theNode->kill();  // this can throw std::runtime_error
+         }
+         break;
+      }
+
+      case PathsCmd::STATUS: {
+         as->update_stats().node_status_++;
+         size_t vec_size = paths_.size();
+         for(size_t i = 0; i < vec_size; i++) {
+            node_ptr theNode = find_node_for_edit_no_throw(as,paths_[i]);
+            if (!theNode.get()) {
+               ss << "PathsCmd:Status: Could not find node at path '" << paths_[i] << "'\n";
+               LOG(Log::ERR,"Status: Could not find node at path " << paths_[i]);
+               continue;
+            }
+            if (!theNode->suite()->begun()) {
+               std::stringstream ss;
+               ss << "Status failed. For " << paths_[i] << " The suite " << theNode->suite()->name() << " must be 'begun' first\n";
+               throw std::runtime_error( ss.str() ) ;
+            }
+            SuiteChanged0 changed(theNode);
+            theNode->status();   // this can throw std::runtime_error
+         }
+         break;
+      }
+
+      case PathsCmd::EDIT_HISTORY: {
+         as->update_stats().node_edit_history_++;
+         if (paths_.empty()) throw std::runtime_error( "No paths specified for edit history") ;
+         // Only first path used
+         const std::deque<std::string>& edit_history = as->defs()->get_edit_history(paths_[0]);
+         std::vector<std::string> vec; vec.reserve(edit_history.size());
+         std::copy(edit_history.begin(),edit_history.end(),std::back_inserter(vec));
+         return PreAllocatedReply::string_vec_cmd(vec);
+      }
+
+      case PathsCmd::NO_CMD: assert(false); break;
+
+      default: assert(false); break;
+   }
+
+   // Clear up memory allocated to path.
+   // When dealing with several thousands paths, this makes a *HUGE* difference
+   vector<string>().swap(paths_); // clear paths_ and minimise its capacity
+
+   std::string error_msg = ss.str();
+   if (!error_msg.empty()) {
+      throw std::runtime_error( error_msg ) ;
+   }
+
+   if ( PathsCmd::RESUME  == api_) {
+      // After resume we need to do job submission.
+      return doJobSubmission(as);
+   }
+
+   return PreAllocatedReply::ok_cmd();
+}
+
+static void check_for_active_or_submitted_tasks(AbstractServer* as,node_ptr theNodeToDelete)
+{
+   vector<Task*> taskVec;
+   if ( theNodeToDelete.get() ) {
+      theNodeToDelete->getAllTasks(taskVec);
+   }
+   else {
+      as->defs()->getAllTasks(taskVec);
+   }
+
+   vector<Task*> activeVec,submittedVec;
+   BOOST_FOREACH(Task* t, taskVec) {
+      if (t->state() == NState::ACTIVE)  activeVec.push_back(t);
+      if (t->state() == NState::SUBMITTED)  submittedVec.push_back(t);
+   }
+   if (!activeVec.empty() || !submittedVec.empty()) {
+      std::stringstream ss;
+      if (theNodeToDelete.get()) ss << "Can not delete node " << theNodeToDelete->debugNodePath() << "\n";
+      else                       ss << "Can not delete all nodes.\n";
+      if (!activeVec.empty() ) {
+         ss << " There are " << activeVec.size() << " active tasks. First : " << activeVec.front()->absNodePath() << "\n";
+      }
+      if (!submittedVec.empty() ) {
+         ss << " There are " << submittedVec.size() << " submitted tasks. First : " << submittedVec.front()->absNodePath() << "\n";
+      }
+      ss << "Please use the 'force' option to bypass this check, at the expense of creating zombies\n";
+      throw std::runtime_error( ss.str() ) ;
+   }
+}
+
+static const char* delete_node_desc() {
+   return
+            "Deletes the specified node(s) or _ALL_ existing definitions( i.e delete all suites) in the server.\n"
+            "  arg1 = [ force | yes ](optional)  # Use this parameter to bypass checks, i.e. for active or submitted tasks\n"
+            "  arg2 = yes(optional)              # Use 'yes' to bypass the confirmation prompt\n"
+            "  arg3 = node paths | _all_         # _all_ means delete all suites\n"
+            "                                    # node paths must start with a leading '/'\n"
+            "Usage:\n"
+            "  --delete=_all_                    # Delete all suites in server. Use with care.\n"
+            "  --delete=/suite/f1/t1             # Delete node at /suite/f1/t1. This will prompt\n"
+            "  --delete=force /suite/f1/t1       # Delete node at /suite/f1/t1 even if active or submitted\n"
+            "  --delete=force yes /s1 /s2        # Delete suites s1,s2 even if active or submitted, bypassing prompt"
+            ;
+}
+
+static const char* get_check_desc() {
+   return
+            "Checks the expression and limits in the server. Will also check trigger references.\n"
+            "Trigger expressions that reference paths that don't exist, will be reported as errors.\n"
+            "(Note: On the client side unresolved paths in trigger expressions must\n"
+            "have an associated 'extern' specified)\n"
+            "  arg = [ _all_ | list of node paths ]\n"
+            "Usage:\n"
+            "  --check=_all_           # Checks the whole suite\n"
+            "  --check /s1 /s2/f1/t1   # Check suite /s1 and task t1"
+            ;
+}
+
+static const char* get_kill_desc() {
+   return
+            "Kills the job associated with the node.\n"
+            "If a family or suite is selected, will kill hierarchically.\n"
+            "Kill uses the ECF_KILL_CMD variable. After variable substitution it is invoked as a command.\n"
+            "The command should be written in such a way that the output is written to %ECF_JOB%.kill\n"
+            "as this allow the --file command to report the output: .e.e.\n"
+            " /home/ma/emos/bin/ecfkill %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.kill 2>&1::\n"
+            "Usage::\n"
+            "   --kill /s1/f1/t1 /s1/f2/t2 # kill the jobs for tasks t1 and t2\n"
+            "   --file /s1/f1/t1 kill      # write to standard out the '.kill' file for task /s1/f1/t1"
+            ;
+}
+const char*  get_status_desc(){
+   return
+            "Shows the status of a job associated with a task.\n"
+            "If a family or suite is selected, will invoke status command hierarchically.\n"
+            "Status uses the ECF_STATUS_CMD variable. After variable substitution it is invoked as a command.\n"
+            "The command should be written in such a way that the output is written to %ECF_JOB%.stat\n"
+            "This will allow the output of status command to be shown by the --file command\n"
+            "i.e /home/ma/emos/bin/ecfstatus  %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.stat 2>&1::\n"
+            "Usage::\n"
+            "   --status /s1/f1/t1 /s1/f2/t2\n"
+            "   --file /s1/f1/t1 stat  # write to standard out the '.stat' file"
+            ;
+}
+const char* get_edit_history_desc(){
+   return
+            "Returns the edit history associated with a Node.\n"
+             "Usage::\n"
+            "   --edit_history /s1/f1/t1\n"
+            ;
+}
+const char* suspend_desc(){
+   return
+            "Suspend the given node. This prevents job generation for the given node, or any child node.\n"
+            "Usage::\n"
+            "   --suspend /s1/f1/t1   # suspend task s1/f1/t1\n"
+            "   --suspend /s1 /s2     # suspend suites /s1 and /s2\n"
+            ;
+}
+const char* resume_desc(){
+   return
+            "Resume the given node. This allows job generation for the given node, or any child node.\n"
+            "Usage::\n"
+            "   --resume /s1/f1/t1   # resume task s1/f1/t1\n"
+            "   --resume /s1 /s2     # resume suites /s1 and /s2\n"
+            ;
+}
+
+void PathsCmd::addOption(boost::program_options::options_description& desc) const
+{
+   switch (api_) {
+      case PathsCmd::CHECK:{
+         desc.add_options()(CtsApi::check_arg(),po::value< vector<string> >()->multitoken(),get_check_desc());
+         break;
+      }
+      case PathsCmd::DELETE:{
+         desc.add_options()( CtsApi::delete_node_arg(), po::value< vector<string> >()->multitoken(), delete_node_desc() );
+         break;
+      }
+      case PathsCmd::SUSPEND:{
+         desc.add_options()( CtsApi::suspend_arg(), po::value< vector<string> >()->multitoken(),suspend_desc());
+         break;
+      }
+      case PathsCmd::RESUME: {
+         desc.add_options()( CtsApi::resume_arg(), po::value< vector<string> >()->multitoken(),resume_desc());
+         break;
+      }
+      case PathsCmd::KILL: {
+         desc.add_options()( CtsApi::kill_arg(), po::value< vector<string> >()->multitoken(),get_kill_desc());
+         break;
+      }
+      case PathsCmd::STATUS: {
+         desc.add_options()( CtsApi::statusArg(), po::value< vector<string> >()->multitoken(), get_status_desc());
+         break;
+      }
+      case PathsCmd::EDIT_HISTORY: {
+         desc.add_options()( CtsApi::edit_history_arg(), po::value< vector<string> >()->multitoken(), get_edit_history_desc());
+         break;
+      }
+      case PathsCmd::NO_CMD:  assert(false); break;
+      default: assert(false); break;
+   }
+}
+
+void PathsCmd::create(   Cmd_ptr& cmd,
+         boost::program_options::variables_map& vm,
+         AbstractClientEnv* ac ) const
+{
+   assert( api_ != PathsCmd::NO_CMD);
+
+   vector<string> args = vm[  theArg() ].as< vector<string> >();
+   if (ac->debug()) dumpVecArgs( theArg(), args);
+
+   std::vector<std::string> options,paths;
+   split_args_to_options_and_paths(args,options,paths); // relative order is still preserved
+
+   bool force = false;
+   if (api_ == PathsCmd::DELETE) {
+      bool all = false;
+      bool do_prompt = true;
+      size_t vec_size = options.size();
+      for(size_t i = 0; i < vec_size; i++) {
+         if (args[i] == "_all_") all = true;
+         if (args[i] == "force") force = true;
+         if (args[i] == "yes")   do_prompt = false;
+      }
+
+      if (!all && paths.empty()) {
+         std::stringstream ss;
+         ss << "Delete: No paths specified. Paths must begin with a leading '/' character\n";
+         throw std::runtime_error( ss.str() );
+      }
+
+      if (do_prompt) {
+         std::string confirm;
+         if (paths.empty()) confirm = "Are you sure you want to delete all the suites ? ";
+         else {
+            confirm = "Are you sure want to delete nodes at paths:\n";
+            size_t vec_size = paths.size();
+            for(size_t i = 0; i < vec_size; i++) {
+               confirm += "  " + paths[i];
+               if ( i == vec_size -1) confirm += " ? ";
+               else                   confirm += "\n";
+            }
+         }
+         prompt_for_confirmation(confirm);
+      }
+   }
+   else if (api_ == PathsCmd::CHECK) {
+
+      bool all = false;
+      size_t vec_size = options.size();
+      for(size_t i = 0; i < vec_size; i++) {
+         if (args[i] == "_all_") all = true;
+      }
+      if (!all && paths.empty()) {
+         std::stringstream ss;
+         ss << "Check: Please specify '_all_' or a list of paths. Paths must begin with a leading '/' character\n";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+   else {
+      if (paths.empty()) {
+         std::stringstream ss;
+         ss << theArg() << ":  No paths specified. Paths must begin with a leading '/' character\n";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+
+   cmd = Cmd_ptr(new PathsCmd( api_ , paths, force));
+}
+
+std::ostream& operator<<(std::ostream& os, const PathsCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/PlugCmd.cpp b/ecflow_4_0_7/Base/src/cts/PlugCmd.cpp
new file mode 100644
index 0000000..c108725
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/PlugCmd.cpp
@@ -0,0 +1,392 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/make_shared.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Str.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "NodePath.hpp"
+#include "Client.hpp"
+#include "SuiteChanged.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+//=======================================================================================
+
+bool PlugCmd::equals(ClientToServerCmd* rhs) const
+{
+   PlugCmd* the_rhs = dynamic_cast<PlugCmd*>(rhs);
+   if (!the_rhs)  return false;
+   if ( source_ != the_rhs->source()) { return false; }
+   if ( dest_   != the_rhs->dest())   { return false; }
+   return UserCmd::equals(rhs);
+}
+
+std::ostream& PlugCmd::print(std::ostream& os) const
+{
+   return user_cmd(os,CtsApi::to_string(CtsApi::plug(source_,dest_)));
+}
+
+/// Class to manage locking: Only unlock if acquired the lock,
+class Lock {
+public:
+   Lock(const std::string& user, AbstractServer* as) : as_(as) { ok_ = as->lock(user); }
+   ~Lock() { if (ok_) as_->unlock(); }
+   bool ok() const { return ok_;}
+private:
+   bool ok_;
+   AbstractServer* as_;
+};
+
+STC_Cmd_ptr PlugCmd::doHandleRequest(AbstractServer* as) const
+{
+   as->update_stats().plug_++;
+
+   Lock lock(user(),as);
+   if (!lock.ok()) {
+      std::string errorMsg = "Plug command failed. User "; errorMsg += as->lockedUser();
+      errorMsg += " already has an exclusive lock";
+      throw std::runtime_error( errorMsg ) ;
+   }
+
+   node_ptr sourceNode = as->defs()->findAbsNode(source_);
+   if (!sourceNode.get()) throw std::runtime_error( "Plug command failed. Could not find source path " + source_  ) ;
+
+   // Moving a node which is active, or submitted, will lead to zombie's. hence prevent
+   if (sourceNode->state() == NState::ACTIVE || sourceNode->state() == NState::SUBMITTED) {
+      std::string errorMsg = "Plug command failed. The source node "; errorMsg += source_;
+      errorMsg += " is ";
+      errorMsg += NState::toString(sourceNode->state());
+      throw std::runtime_error( errorMsg ) ;
+   }
+
+   if (sourceNode->isAlias()) {
+       std::string errorMsg = "Plug command failed. The source node "; errorMsg += source_;
+       errorMsg += " is a Alias. Alias can not be moved";
+       throw std::runtime_error( errorMsg ) ;
+   }
+
+
+   // Check to see if dest node is on the same server
+   std::string host,port,destPath;
+   node_ptr destNode =  as->defs()->findAbsNode(dest_);
+   if (!destNode.get()) {
+
+      // Dest could still be on the same server. Extract host and port
+      // expect: host:port/suite/family/node
+      if (!NodePath::extractHostPort(dest_,host,port)) {
+         std::string errorMsg = "Plug command failed. The destination path "; errorMsg += dest_;
+         errorMsg += " does not exist on server, and could not extract host/port from the destination path";
+         throw std::runtime_error( errorMsg ) ;
+      }
+
+      // Remove the host:port from the path
+      destPath = NodePath::removeHostPortFromPath(dest_);
+
+      std::pair<std::string,std::string> hostPortPair = as->hostPort();
+      if ( hostPortPair.first == host  && hostPortPair.second == port) {
+
+         // Matches local server, try to find dest node again.
+         destNode =  as->defs()->findAbsNode(destPath);
+         if (!destNode) {
+            std::string errorMsg = "Plug command failed. The destination path "; errorMsg += dest_;
+            errorMsg += " does not exist on server "; errorMsg += hostPortPair.first;
+            throw std::runtime_error( errorMsg ) ;
+         }
+      }
+      // dest_ is on another server.
+   }
+
+   if (!destNode.get()) {
+
+      // Since host/port does not match local server, move source node to remote server
+      try {
+         if (destPath.empty()) {
+            // Note destPath can be empty, when moving a suite
+            if (!sourceNode->isSuite()) {
+               throw std::runtime_error( "Destination path can only be empty when moving a whole suite to a new server" ) ;
+            }
+         }
+
+         {
+            // Server is acting like a client, Send MoveCmd to another server
+            // The source should end up being copied, when sent to remote server
+            boost::asio::io_service io_service;
+            Client theClient( io_service, Cmd_ptr( new MoveCmd(as->hostPort(),sourceNode.get(), destPath) ),  host, port  );
+            io_service.run();
+
+            ServerReply server_reply;
+            theClient.handle_server_response( server_reply, false /* debug */ );
+            if (server_reply.client_request_failed()) {
+               throw std::runtime_error( server_reply.error_msg() ) ;
+            }
+         }
+
+         // The move command was ok, remove the source node, and delete its memory
+         sourceNode->remove();
+
+         // Updated defs state
+         as->defs()->set_most_significant_state();
+
+         return PreAllocatedReply::ok_cmd();
+      }
+      catch (std::exception& e) {
+         std::stringstream ss; ss << "MoveCmd Failed for " << host << ":" << port << "  " << e.what() << "\n";
+         throw std::runtime_error( ss.str() ) ;
+      }
+   }
+
+   // source and destination on same defs file
+
+   // If the destination is task, replace with its parent
+
+   Node* theDestNode = destNode.get();
+   if (theDestNode->isTask()) theDestNode = theDestNode->parent();
+
+   // Before we do remove the source node, check its ok to add it as a child
+   std::string errorMsg;
+   if (!theDestNode->isAddChildOk(sourceNode.get(),errorMsg) ) {
+      throw std::runtime_error(  "Plug command failed. " +  errorMsg ) ;
+   }
+
+   if (!theDestNode->addChild(  sourceNode->remove()  ) ) {
+      // This should never fail !!!! else we have lost/ and leaked source node !!!!
+      throw std::runtime_error("Fatal error plug command failed.") ;
+   }
+
+   add_node_for_edit_history(destNode);
+
+   // Updated defs state
+   as->defs()->set_most_significant_state();
+
+   return PreAllocatedReply::ok_cmd();
+}
+
+const char* PlugCmd::arg()  { return CtsApi::plugArg();}
+const char* PlugCmd::desc() {
+   return
+            "Plug command is used to move nodes.\n"
+            "The destination node can be on another server In which case the destination\n"
+            "path should be of the form '<host>:<port>/suite/family/task\n"
+            "  arg1 = path to source node\n"
+            "  arg2 = path to the destination node\n"
+            "This command can fail because:\n"
+            "- Source node is in a 'active' or 'submitted' state\n"
+            "- Another user already has an lock\n"
+            "- source/destination paths do not exist on the corresponding servers\n"
+            "- If the destination node path is empty, i.e. only host:port is specified,\n"
+            "  then the source node must correspond to a suite.\n"
+            "- If the source node is added as a child, then its name must be unique\n"
+            "  amongst its peers\n"
+            "Usage:\n"
+            "  --plug=/suite macX:3141  # move the suite to ecFlow server on host(macX) and port(3141)"
+            ;
+}
+
+void PlugCmd::addOption(boost::program_options::options_description& desc) const {
+   desc.add_options()( PlugCmd::arg(),po::value< vector<string> >()->multitoken(), PlugCmd::desc() );
+}
+
+void PlugCmd::create( 	Cmd_ptr& cmd,
+         boost::program_options::variables_map& vm,
+         AbstractClientEnv* ace) const
+{
+   vector<string> args = vm[  arg() ].as< vector<string> >();
+
+   if (ace->debug())  dumpVecArgs(PlugCmd::arg(),args);
+
+   if (args.size() != 2 ) {
+      std::stringstream ss;
+      ss << "PlugCmd: Two arguments are expected, found " << args.size() << "\n" << PlugCmd::desc() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   std::string sourceNode = args[0];
+   std::string destNode = args[1];
+
+   cmd = Cmd_ptr( new PlugCmd(sourceNode, destNode) );
+}
+
+// ===================================================================================
+
+MoveCmd::MoveCmd(const std::pair<std::string,std::string>& host_port, Node* src, const std::string& dest)
+ : sourceSuite_(src->isSuite()),
+   sourceFamily_(src->isFamily()),
+   sourceTask_(src->isTask()),
+   src_host_(host_port.first),
+   src_port_(host_port.second),
+   src_path_(src->absNodePath()),
+   dest_(dest) {}
+
+MoveCmd::MoveCmd()
+: sourceSuite_(NULL),
+  sourceFamily_(NULL),
+  sourceTask_(NULL) {}
+
+MoveCmd::~MoveCmd(){}
+
+bool MoveCmd::equals(ClientToServerCmd* rhs) const
+{
+   MoveCmd* the_rhs = dynamic_cast<MoveCmd*>(rhs);
+   if (!the_rhs) return false;
+   if (dest_   != the_rhs->dest())   { return false; }
+
+   Node* theSource  = source();
+   if (theSource == NULL && the_rhs->source())         { return false; }
+   if (theSource         && the_rhs->source() == NULL) { return false; }
+   if (theSource == NULL && the_rhs->source() == NULL) { return true; }
+   if (theSource->absNodePath() != the_rhs->source()->absNodePath()) { return false; }
+   return UserCmd::equals(rhs);
+}
+
+std::ostream& MoveCmd::print(std::ostream& os) const
+{
+   std::stringstream ss;
+   ss << "Plug(Move) source(" << src_host_ << ":" << src_port_ << ":" << src_path_ << ") destination(" << dest_ << ")";
+   return user_cmd(os,ss.str());
+}
+
+Node* MoveCmd::source() const
+{
+   if ( sourceSuite_ ) return  sourceSuite_ ;
+   if ( sourceFamily_ ) return  sourceFamily_;
+   if ( sourceTask_ ) return  sourceTask_;
+   return NULL;
+}
+
+bool MoveCmd::check_source() const
+{
+   if ( sourceSuite_ || sourceFamily_ || sourceTask_ ) return  true ;
+   return false;
+}
+
+STC_Cmd_ptr MoveCmd::doHandleRequest(AbstractServer* as) const
+{
+   Lock lock(user(),as);
+   if (!lock.ok()) {
+      std::string errorMsg = "Plug(Move) command failed. User "; errorMsg += as->lockedUser();
+      errorMsg += " already has an exclusive lock";
+      throw std::runtime_error( errorMsg);
+   }
+
+   if (!check_source()) {
+      throw std::runtime_error("Plug(Move) command failed. No source specified");
+   }
+
+   // destNode can be NULL when we are moving a suite
+   node_ptr destNode;
+   if (!dest_.empty()) {
+
+      if (!as->defs())  throw std::runtime_error( "No definition in server");
+
+      destNode =  as->defs()->findAbsNode(dest_);
+      if (!destNode.get()) {
+         std::string errorMsg = "Plug(Move) command failed. The destination path "; errorMsg += dest_;
+         errorMsg += " does not exist on server";
+         throw std::runtime_error( errorMsg);
+      }
+   }
+   else {
+      if (!source()->isSuite()) {
+         throw std::runtime_error("::Destination path can only be empty when moving a whole suite to a new server");
+      }
+   }
+
+   if (destNode.get()) {
+
+      // The destNode containing suite may be in a handle
+      SuiteChanged0 suiteChanged(destNode);
+
+      // If the destination is task, replace with its parent
+      Node* thedestNode = destNode.get();
+      if (thedestNode->isTask()) thedestNode = thedestNode->parent();
+
+      // check its ok to add
+      std::string errorMsg;
+      if (!thedestNode->isAddChildOk(source(),errorMsg) ) {
+         std::string msg = "Plug(Move) command failed. "; msg += errorMsg;
+         throw std::runtime_error( msg) ;
+      }
+
+      // pass ownership
+      if (!thedestNode->addChild( node_ptr( source() ) )) {
+         // This should never fail !!!! else we have lost/ and leaked source node !!!!
+         throw std::runtime_error("Fatal error plug(move) command failed.") ;
+      }
+
+      add_node_for_edit_history(destNode);
+   }
+   else {
+
+      if (!sourceSuite_)  throw std::runtime_error("Source node was expected to be a suite");
+
+      suite_ptr the_source_suite(sourceSuite_);        // pass ownership to suite_ptr
+
+      // The sourceSuite may be in a handle or pre-registered suite
+      SuiteChanged suiteChanged(the_source_suite);
+
+      if (!as->defs()) {
+         defs_ptr newDefs = Defs::create();
+         newDefs->addSuite( the_source_suite );
+         as->updateDefs( newDefs, true /*force*/ );    // force is mute, since we adding a new defs in the server
+      }
+      else {
+
+         if (as->defs()->findSuite(the_source_suite->name())) {
+            std::stringstream ss; ss << "Suite of name " <<  the_source_suite->name() << " already exists\n";
+            throw std::runtime_error( ss.str() );
+         }
+
+         as->defs()->addSuite( the_source_suite ) ;
+      }
+
+      /// A bit of hack, since need a way of getting a node_ptr from a Node*
+      add_node_for_edit_history(as,the_source_suite->absNodePath());
+   }
+
+   // Updated defs state
+   if (as->defs()) as->defs()->set_most_significant_state();
+
+   // Ownership for sourceSuite_ has been passed on.
+   sourceSuite_ = NULL;
+   sourceFamily_ = NULL;
+   sourceTask_ =  NULL;
+
+   return PreAllocatedReply::ok_cmd();
+}
+
+const char* MoveCmd::arg()  { return "move";}
+const char* MoveCmd::desc() { return "The move command is an internal cmd, Called by the plug cmd. Does not appear on public api.";}
+
+void MoveCmd::addOption(boost::program_options::options_description& desc) const {
+   desc.add_options()( MoveCmd::arg(),po::value< vector<string> >()->multitoken(), MoveCmd::desc() );
+}
+
+void MoveCmd::create(Cmd_ptr&, boost::program_options::variables_map&, AbstractClientEnv* ) const
+{
+   assert(false);
+}
+
+std::ostream& operator<<(std::ostream& os, const PlugCmd& c) { return c.print(os); }
+std::ostream& operator<<(std::ostream& os, const MoveCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/ReplaceNodeCmd.cpp b/ecflow_4_0_7/Base/src/cts/ReplaceNodeCmd.cpp
new file mode 100644
index 0000000..cc93e76
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ReplaceNodeCmd.cpp
@@ -0,0 +1,203 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #37 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/make_shared.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "DefsStructureParser.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+ReplaceNodeCmd::ReplaceNodeCmd(const std::string& node_path, bool createNodesAsNeeded, defs_ptr defs, bool force )
+: createNodesAsNeeded_(createNodesAsNeeded), force_(force), pathToNode_(node_path), clientDefs_(defs)
+{
+   if (!clientDefs_.get()) {
+      throw std::runtime_error( "ReplaceNodeCmd::ReplaceNodeCmd: client definition is empty"  );
+   }
+
+   // Client defs has been created in memory.
+   // warn about naff expression and unresolved in-limit references to Limit's
+   std::string errMsg, warningMsg;
+   if (!clientDefs_->check(errMsg, warningMsg)) {
+      throw std::runtime_error(errMsg);
+   }
+
+   // Make sure pathToNode exists in the client defs
+   node_ptr nodeToReplace = clientDefs_->findAbsNode( node_path );
+   if (! nodeToReplace.get() ) {
+      std::stringstream ss;
+      ss << "ReplaceNodeCmd::ReplaceNodeCmd: Can not replace child since path " << node_path;
+      ss << " does not exist in the client definition ";
+      throw std::runtime_error( ss.str() );
+   }
+
+   // Out put any warning's to standard output
+   cout << warningMsg;
+}
+
+ReplaceNodeCmd::ReplaceNodeCmd(const std::string& node_path, bool createNodesAsNeeded, const std::string& path_to_defs, bool force )
+: createNodesAsNeeded_(createNodesAsNeeded),
+  force_(force),
+  pathToNode_(node_path),
+  path_to_defs_(path_to_defs),
+  clientDefs_(Defs::create())
+{
+   // Parse the file and load the defs file into memory.
+   DefsStructureParser checkPtParser( clientDefs_.get(), path_to_defs );
+   std::string errMsg, warningMsg;
+   if ( ! checkPtParser.doParse( errMsg , warningMsg) ) {
+      std::stringstream ss;
+      ss << "ReplaceNodeCmd::ReplaceNodeCmd: Could not parse file " << path_to_defs << " : " << errMsg;
+      throw std::runtime_error( ss.str() );
+   }
+
+   // Make sure pathToNode exists in the client defs
+   node_ptr nodeToReplace = clientDefs_->findAbsNode( node_path );
+   if (! nodeToReplace.get() ) {
+      std::stringstream ss;
+      ss << "ReplaceNodeCmd::ReplaceNodeCmd: Can not replace child since path " << node_path;
+      ss << ", does not exist in the client definition " << path_to_defs;
+      throw std::runtime_error( ss.str() );
+   }
+
+   // Out put any warning's to standard output
+   cout << warningMsg;
+}
+
+bool ReplaceNodeCmd::equals(ClientToServerCmd* rhs) const
+{
+	ReplaceNodeCmd* the_rhs = dynamic_cast<ReplaceNodeCmd*>(rhs);
+	if (!the_rhs)  return false;
+
+	if (!UserCmd::equals(rhs))  return false;
+
+	if (createNodesAsNeeded_ != the_rhs->createNodesAsNeeded()) { return false; }
+	if (force_        != the_rhs->force())        return false;
+   if (pathToNode_   != the_rhs->pathToNode())   return false;
+   if (path_to_defs_ != the_rhs->path_to_defs()) return false;
+
+	if (clientDefs_ == NULL && the_rhs->theDefs() == NULL) return true;
+	if (clientDefs_ == NULL && the_rhs->theDefs() != NULL) return false;
+	if (clientDefs_ != NULL && the_rhs->theDefs() == NULL) return false;
+
+	return (*clientDefs_ == *(the_rhs->theDefs()));
+}
+
+STC_Cmd_ptr ReplaceNodeCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().replace_++;
+
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+	if (clientDefs_) {
+
+	   if (as->defs().get() == clientDefs_.get()) {
+	      /// Typically will only happen with test environment
+	      throw std::runtime_error("ReplaceNodeCmd::doHandleRequest: The definition in the server is the same as the client provided definition??");
+	   }
+
+	   if (force_) {
+	      as->zombie_ctrl().add_user_zombies( as->defs()->findAbsNode( pathToNode_ ) );
+	   }
+
+	   std::string errorMsg;
+	   if (!as->defs()->replaceChild(pathToNode_, clientDefs_, createNodesAsNeeded_, force_, errorMsg)) {
+	      throw std::runtime_error(errorMsg);
+	   }
+
+	   add_node_for_edit_history(as,pathToNode_);
+ 	}
+   return doJobSubmission( as );
+}
+
+std::ostream& ReplaceNodeCmd::print(std::ostream& os) const
+{
+   std::string path_to_client_defs = path_to_defs_;
+   if (path_to_client_defs.empty()) path_to_client_defs = "<empty>"; // defs must have bee loaded in memory via python api
+	return user_cmd(os,CtsApi::to_string(CtsApi::replace(pathToNode_,path_to_client_defs,createNodesAsNeeded_,force_)));
+}
+
+const char* ReplaceNodeCmd::arg()  { return CtsApi::replace_arg();}
+const char* ReplaceNodeCmd::desc() {
+            /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   return
+            "Replaces a node in the server, with the given path\n"
+            "Can also be used to add nodes in the server\n"
+            "  arg1 = path to node\n"
+            "         must exist in the client defs(arg2). This is also the node we want to\n"
+            "         replace in the server\n"
+            "  arg2 = path to client definition file\n"
+            "         provides the definition of the new node\n"
+            "  arg3 = (optional) [ parent | false ] (default = parent)\n"
+            "         create parent families or suite as needed, when arg1 does not\n"
+            "         exist in the server\n"
+            "  arg4 = (optional) force (default = false) \n"
+            "         Force the replacement even if it causes zombies to be created\n"
+            "Replace can fail if:\n"
+            "- The node path(arg1) does not exist in the provided client definition(arg2)\n"
+            "- The client definition(arg2) must be free of errors\n"
+            "- If the third argument is not provided, then node path(arg1) must exist in the server\n"
+            "- Nodes to be replaced are in active/submitted state, in which case arg4(force) can be used\n\n"
+            "After replace is done, we check trigger expressions. These are reported to standard output.\n"
+            "It is up to the user to correct invalid trigger expressions, otherwise the tasks will *not* run.\n"
+            "Please note, you can use --check to check trigger expression and limits in the server.\n"
+            "For more information use --help check.\n\n"
+            "Usage:\n"
+            "  --replace=/suite/f1/t1 /tmp/client.def  parent      # Add/replace node tree /suite/f1/t1\n"
+            "  --replace=/suite/f1/t1 /tmp/client.def  false force # replace t1 even if its active or submitted";
+}
+
+void ReplaceNodeCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( ReplaceNodeCmd::arg(),po::value< vector<string> >()->multitoken(), ReplaceNodeCmd::desc() );
+}
+void ReplaceNodeCmd::create( 	Cmd_ptr& cmd,
+                             	boost::program_options::variables_map& vm,
+                             	AbstractClientEnv* clientEnv ) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+
+	if (clientEnv->debug())  dumpVecArgs(ReplaceNodeCmd::arg(),args);
+
+	if (args.size() < 2 ) {
+		std::stringstream ss;
+		ss << "ReplaceNodeCmd: At least two arguments expected, found " << args.size()
+		   << " Please specify <path-to-Node>  <defs files> parent(optional) force(optional), i.e\n"
+		   << "--" <<  arg() << "=/suite/fa/t AdefsFile.def  parent force\n";
+	 	throw std::runtime_error( ss.str() );
+	}
+
+	std::string pathToNode     = args[0];
+	std::string pathToDefsFile = args[1];
+	bool createNodesAsNeeded = true; // parent arg
+	bool force = false;
+	if ( args.size() == 3 && args[2] == "false") createNodesAsNeeded = false;
+	if ( args.size() == 4 && args[3] == "force") force = true;
+
+	/// If path to file does not parse, we will throw an exception
+	ReplaceNodeCmd* replace_cmd = new ReplaceNodeCmd(pathToNode,createNodesAsNeeded, pathToDefsFile , force);
+
+	// For test allow the defs environment to changed, i.e. allow us to inject  ECF_CLIENT
+	replace_cmd->theDefs()->set_server().add_or_update_user_variables( clientEnv->env() );
+
+	cmd = Cmd_ptr( replace_cmd  );
+}
+
+std::ostream& operator<<(std::ostream& os, const ReplaceNodeCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/RequeueNodeCmd.cpp b/ecflow_4_0_7/Base/src/cts/RequeueNodeCmd.cpp
new file mode 100644
index 0000000..4e115e5
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/RequeueNodeCmd.cpp
@@ -0,0 +1,219 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "SuiteChanged.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+
+bool RequeueNodeCmd::equals(ClientToServerCmd* rhs) const
+{
+	RequeueNodeCmd* the_rhs = dynamic_cast< RequeueNodeCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (paths_ != the_rhs->paths()) return false;
+	if (option_ != the_rhs->option()) return false;
+	return UserCmd::equals(rhs);
+}
+
+static std::string to_string(RequeueNodeCmd::Option option) {
+   switch (option) {
+      case RequeueNodeCmd::NO_OPTION: return string();
+      case RequeueNodeCmd::FORCE: return "force";
+      case RequeueNodeCmd::ABORT: return "abort";
+      default: assert(false); break;
+   }
+   return string();
+}
+
+std::ostream& RequeueNodeCmd::print(std::ostream& os) const
+{
+ 	return user_cmd(os,CtsApi::to_string(CtsApi::requeue(paths_,to_string(option_))));
+}
+
+STC_Cmd_ptr RequeueNodeCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().requeue_node_++;
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+
+	// This is *only* incremented for child nodes. Hence we only clear suspended for child nodes.
+	int clear_suspended_in_child_nodes = 0;
+
+   std::stringstream ss;
+	size_t vec_size = paths_.size();
+	for(size_t i = 0; i < vec_size; i++) {
+
+	   node_ptr theNodeToRequeue = find_node_for_edit_no_throw(as,paths_[i]);
+      if (!theNodeToRequeue.get()) {
+         ss << "RequeueNodeCmd: Could not find node at path " << paths_[i] << "\n";
+         LOG(Log::ERR,"RequeueNodeCmd: Could not find node at path " << paths_[i]);
+         continue;
+      }
+
+      if (!theNodeToRequeue->suite()->begun()) {
+         std::stringstream ss;
+         ss << "RequeueNodeCmd::doHandleRequest: For node " << paths_[i] << ". The suite " << theNodeToRequeue->suite()->name() << " must be 'begun' first\n";
+         throw std::runtime_error( ss.str() ) ;
+      }
+
+	   SuiteChanged0 changed(theNodeToRequeue);
+
+	   if (option_ == RequeueNodeCmd::ABORT) {
+	      // ONLY Re-queue the aborted tasks
+	      std::vector<Task*> taskVec;
+	      theNodeToRequeue->getAllTasks(taskVec);
+	      for(size_t i=0; i < taskVec.size(); i++) {
+	         if (taskVec[i]->state() == NState::ABORTED) {
+	            taskVec[i]->requeue( true /* reset repeats */,
+	                                 clear_suspended_in_child_nodes,
+	                                 true /* reset_next_time_slot */);
+	            taskVec[i]->set_most_significant_state_up_node_tree(); // can be waste full
+	         }
+	      }
+	   }
+	   else if ( option_ == RequeueNodeCmd::NO_OPTION) {
+	      // ONLY Re-queue if there no tasks in submitted or active states
+	      std::vector<Task*> taskVec;
+	      theNodeToRequeue->getAllTasks(taskVec);
+	      for(size_t i=0; i < taskVec.size(); i++) {
+	         if (taskVec[i]->state() == NState::SUBMITTED || taskVec[i]->state() == NState::ACTIVE) {
+	            return PreAllocatedReply::ok_cmd();
+	         }
+	      }
+
+	      // The NO_REQUE_IF_SINGLE_TIME_DEP is typically cleared at the *end* requeue, however there are cases
+	      // where we need to reset it *BEFORE* re-queue. Since it is tied to missing the next time slot
+	      // i.e take this case:
+	      //     time 10:00  15:00 00:30
+	      // If we force complete, we set NO_REQUE_IF_SINGLE_TIME_DEP, which is used to advance next valid time slot
+	      // (i.e no reset), however when we reach the *end* time i.e 15:00
+	      // calling force complete now leaves node in a complete state and with NO_REQUE_IF_SINGLE_TIME_DEP set.
+	      // Therefore *any* *MANUAL* re-queue afterward will NOT reset the next valid time slot.
+	      // To overcome this manual re-queue will always clear NO_REQUE_IF_SINGLE_TIME_DEP and hence reset next valid time slot
+	      theNodeToRequeue->requeue( true /* reset repeats */,
+	                                 clear_suspended_in_child_nodes,
+	                                 true /* reset_next_time_slot */ );
+	      theNodeToRequeue->set_most_significant_state_up_node_tree();
+	   }
+	   else if ( option_ == RequeueNodeCmd::FORCE) {
+
+	      as->zombie_ctrl().add_user_zombies(theNodeToRequeue);
+
+	      // Please note: that if any tasks under theNodeToRequeue are in
+	      // active or submitted states, then we will have created zombie jobs
+	      // The GUI: that calls this command should call a separate request
+	      // the returns the active/submitted tasks first. This can then be
+	      // presented to the user, who can elect to kill them if required.
+	      theNodeToRequeue->requeue(  true /* reset repeats */,
+	                                  clear_suspended_in_child_nodes,
+	                                  true /* reset_next_time_slot */ );
+	      theNodeToRequeue->set_most_significant_state_up_node_tree();
+	   }
+	}
+
+   // Clear up memory allocated to path *ASAP*
+   // When dealing with several thousands paths, this makes a *HUGE* difference
+   vector<string>().swap(paths_); // clear paths_ and minimise its capacity
+
+   std::string error_msg = ss.str();
+   if (!error_msg.empty()) {
+      throw std::runtime_error( error_msg ) ;
+   }
+
+   // Do an immediate job submission, so that any re-queued tasks are submitted
+   return doJobSubmission(as);
+}
+
+const char* RequeueNodeCmd::arg()  { return CtsApi::requeueArg();}
+const char* RequeueNodeCmd::desc() {
+   return
+            "Re queues the specified node(s)\n"
+            "  If any child of the specified node(s) is in a suspended state, this state is cleared\n"
+            "  arg1 = (optional) [ abort | force ]\n"
+            "         abort  = re-queue only aborted tasks below node\n"
+            "         force  = Force the re-queueing even if there are nodes that are active or submitted\n"
+            "         <null> = Checks if any tasks are in submitted or active states below the node\n"
+            "                  if so does nothing. Otherwise re-queues the node.\n"
+            "  arg2 = list of node paths. The node paths must begin with a leading '/' character\n\n"
+            "Usage:\n"
+            "  --requeue=abort /suite/f1  # re-queue all aborted children of /suite/f1\n"
+            "  --requeue=force /suite/f1  # forcibly re-queue /suite/f1 and all its children.May cause zombies.\n"
+            "  --requeue=/s1/f1/t1 /s1/t2 # Re-queue node '/suite/f1/t1' and '/s1/t2'"
+            ;
+}
+
+void RequeueNodeCmd::addOption(boost::program_options::options_description& desc) const{
+	desc.add_options()( RequeueNodeCmd::arg(), po::value< vector<string> >()->multitoken(), RequeueNodeCmd::desc() );
+}
+void RequeueNodeCmd::create( 	Cmd_ptr& cmd,
+								boost::program_options::variables_map& vm,
+								AbstractClientEnv* ac) const
+{
+	vector<string> args = vm[ RequeueNodeCmd::arg() ].as< vector<string> >();
+
+	if (ac->debug()) dumpVecArgs(RequeueNodeCmd::arg(),args);
+
+	if (args.size() < 1 ) {
+		std::stringstream ss;
+		ss << "RequeueNodeCmd: At least 1 argument(path to node) expected. Please specify one of:\n";
+		ss << RequeueNodeCmd::arg() << " pathToNode\n";
+		ss << RequeueNodeCmd::arg() << " abort pathToNode\n";
+		ss << RequeueNodeCmd::arg() << " force pathToNode\n";
+	 	throw std::runtime_error( ss.str() );
+	}
+
+   std::vector<std::string> options,paths;
+   split_args_to_options_and_paths(args,options,paths); // relative order is still preserved
+   if (paths.empty()) {
+      std::stringstream ss;
+      ss << "RequeueNodeCmd: No paths specified. At least one path expected. Paths must begin with a leading '/' character\n" << RequeueNodeCmd::desc() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+   RequeueNodeCmd::Option option = RequeueNodeCmd::NO_OPTION;
+   size_t vec_size = options.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      if (options[i] == "abort") {
+         option = RequeueNodeCmd::ABORT;
+         if (ac->debug()) cout << "ABORT selected\n";
+      }
+      else if (options[i] == "force") {
+         option = RequeueNodeCmd::FORCE;
+         if (ac->debug())  cout << "FORCE selected\n";
+      }
+      else {
+         std::stringstream ss;
+         ss << "RequeueNodeCmd: RequeueNodeCmd: Expected : [force | abort ] paths.\n" << RequeueNodeCmd::desc() << "\n";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+   if (options.size() > 1) {
+      std::stringstream ss;
+      ss << "RequeueNodeCmd: Expected only a single option i.e [ force | abort ]\n" << RequeueNodeCmd::desc() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+ 	cmd = Cmd_ptr(new RequeueNodeCmd(paths,option));
+}
+
+std::ostream& operator<<(std::ostream& os, const RequeueNodeCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/RunNodeCmd.cpp b/ecflow_4_0_7/Base/src/cts/RunNodeCmd.cpp
new file mode 100644
index 0000000..7d52a2b
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/RunNodeCmd.cpp
@@ -0,0 +1,170 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #34 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Str.hpp"
+#include "CtsApi.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "JobsParam.hpp"
+#include "SuiteChanged.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+bool RunNodeCmd::equals(ClientToServerCmd* rhs) const
+{
+	RunNodeCmd* the_rhs = dynamic_cast< RunNodeCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (paths_ != the_rhs->paths()) return false;
+	if (force_ != the_rhs->force()) return false;
+	return UserCmd::equals(rhs);
+}
+
+std::ostream& RunNodeCmd::print(std::ostream& os) const
+{
+ 	return user_cmd(os,CtsApi::to_string(CtsApi::run(paths_,force_)));
+}
+
+STC_Cmd_ptr RunNodeCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().run_node_++;
+
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+
+   std::stringstream ss;
+	size_t vec_size = paths_.size();
+	for(size_t i = 0; i < vec_size; i++) {
+	   node_ptr node = find_node_for_edit_no_throw(as,paths_[i]);
+	   if (!node.get()) {
+         ss << "RunNodeCmd: Could not find node at path " << paths_[i] << "\n";
+	      LOG(Log::ERR,"RunNodeCmd: Could not find node at path " << paths_[i]);
+	      continue;
+	   }
+
+	   if (!node->suite()->begun()) {
+	      std::stringstream ss;
+	      ss << "RunNodeCmd failed: For " << paths_[i] << ". The suite " << node->suite()->name() << " must be 'begun' first\n";
+	      throw std::runtime_error( ss.str() ) ;
+	   }
+
+	   SuiteChanged0 changed(node);
+
+	   // Please note: that if any tasks under theNode are in
+	   // active or submitted states, then we will have created zombies jobs
+	   // The GUI: that calls this command should call a separate request
+	   // the returns the active/submitted tasks first. This can then be
+	   // presented to the user, who can elect to kill them if required.
+	   bool createJobs = true;
+	   if (test_) createJobs = false;
+
+      /// This will *NOT* timeout, unlike server Job generation
+	   JobsParam jobsParam(as->poll_interval(), createJobs );  // default here is to spawn jobs , spawn jobs = true
+	                                                           // At the task level, if create jobs is false, we will not spawn jobs
+#ifdef DEBUG_JOB_SUBMISSION
+	   jobsParam.logDebugMessage(" from RunNodeCmd::doHandleRequest");
+#endif
+
+	   if (force_) as->zombie_ctrl().add_user_zombies(node);
+
+	   // Avoid re-running the task again on the same time slot
+      node->miss_next_time_slot();
+
+	   if (!node->run(jobsParam, force_)) {
+         LOG(Log::ERR,"RunNodeCmd: Failed for " << paths_[i] << " : " << jobsParam.getErrorMsg());
+ 	   }
+	}
+
+   // Clear up memory allocated to path *ASAP*
+   // When dealing with several thousands paths, this makes a *HUGE* difference
+   vector<string>().swap(paths_); // clear paths_ and minimise its capacity
+
+   std::string error_msg = ss.str();
+   if (!error_msg.empty()) {
+      throw std::runtime_error( error_msg ) ;
+   }
+
+	return PreAllocatedReply::ok_cmd();
+}
+
+const char* RunNodeCmd::arg()  { return CtsApi::runArg();}
+const char* RunNodeCmd::desc() {
+   return  "Ignore triggers, limits, time or date dependencies, just run the Task.\n"
+            "When a job completes, it may be automatically re-queued if it has a cron\n"
+            "or multiple time dependencies. If we have multiple time based attributes,\n"
+            "then each run, will expire the time.\n"
+            "When we run before the time, we want to avoid re-running the task then\n"
+            "a flag is set, so that it is not automatically re-queued.\n"
+            "A repeat attribute is incremented when all the child nodes are complete\n"
+            "in this case the child nodes are automatically re-queued.\n"
+            "Hence this command can be aid, in allowing a Repeat attribute to be incremented\n"
+            "  arg1 = (optional)force\n"
+            "         Forcibly run, even if there are nodes that are active or submitted\n"
+            "         This can result in zombie creation\n"
+            "  arg2 = node path(s). The paths must begin with a leading '/' character.\n"
+            "         If the path is /suite/family will recursively run all tasks\n"
+            "         When providing multiple paths avoid running the same task twice\n"
+            "Example:\n"
+            "  --run /suite/t1                    # run task t1\n"
+            "Effect:\n"
+            "     task t1; time 12:00             # will complete if run manually\n"
+            "     task t2; time 10:00 13:00 01:00 # will run 4 times before completing\n"
+            " When we have a time range(i.e as shown with task t2), then next time slot\n"
+            " is incremented for each run, until it expires, and the task completes.\n"
+            " Use the Why command, to show next run time (i.e. next time slot)"
+            ;
+}
+
+void RunNodeCmd::addOption(boost::program_options::options_description& desc) const{
+	desc.add_options()( RunNodeCmd::arg(), po::value< vector<string> >()->multitoken(), RunNodeCmd::desc() );
+}
+void RunNodeCmd::create( 	Cmd_ptr& cmd,
+							boost::program_options::variables_map& vm,
+							AbstractClientEnv* ace) const
+{
+	vector<string> args = vm[ RunNodeCmd::arg() ].as< vector<string> >();
+
+	if (ace->debug())  dumpVecArgs(RunNodeCmd::arg(),args);
+
+   std::vector<std::string> options,paths;
+   split_args_to_options_and_paths(args,options,paths); // relative order is still preserved
+   if (paths.empty()) {
+      std::stringstream ss;
+      ss << "RunNodeCmd: No paths specified. Paths must begin with a leading '/' character\n" << RunNodeCmd::desc() << "\n";
+      throw std::runtime_error( ss.str() );
+   }
+
+	bool force = false;
+   if (!options.empty()) {
+      if (options.size() != 1) {
+         std::stringstream ss;
+         ss << "RunNodeCmd: Invalid arguments. Expected a single optional 'force'\n" << RunNodeCmd::desc() << "\n";
+         throw std::runtime_error( ss.str() );
+      }
+ 		if (options[0].find("force") !=  std::string::npos)  force = true;
+		else {
+		   std::stringstream ss;
+		   ss << "RunNodeCmd: Expected force <path(s)>\n" << RunNodeCmd::desc() << "\n";
+		   throw std::runtime_error( ss.str() );
+ 		}
+	}
+ 	cmd = Cmd_ptr(new RunNodeCmd(paths,force));
+}
+
+std::ostream& operator<<(std::ostream& os, const RunNodeCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/ServerVersionCmd.cpp b/ecflow_4_0_7/Base/src/cts/ServerVersionCmd.cpp
new file mode 100644
index 0000000..3cd9c03
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ServerVersionCmd.cpp
@@ -0,0 +1,80 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : returns the server version.
+//               This command should not be changed
+//                It will allow new clients to ask OLD server their version numbers
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "CtsApi.hpp"
+#include "Version.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+std::ostream& ServerVersionCmd::print(std::ostream& os) const
+{
+   return user_cmd(os,CtsApi::server_version());
+}
+
+bool ServerVersionCmd::equals(ClientToServerCmd* rhs) const
+{
+   ServerVersionCmd* the_rhs = dynamic_cast< ServerVersionCmd* > ( rhs );
+   if ( !the_rhs ) return false;
+   return UserCmd::equals(rhs);
+}
+
+const char* ServerVersionCmd::theArg() const
+{
+   return CtsApi::server_version_arg();
+}
+
+STC_Cmd_ptr ServerVersionCmd::doHandleRequest(AbstractServer* as) const
+{
+   as->update_stats().server_version_++;
+   return PreAllocatedReply::string_cmd(Version::raw());
+}
+
+static const char* arg_desc()
+{
+            /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+   return
+            "Returns the version number of the server\n"
+            "Usage:\n"
+            "  --server_version\n"
+            "    Writes the version to standard output\n"
+            ;
+}
+
+void ServerVersionCmd::addOption(boost::program_options::options_description& desc) const
+{
+   desc.add_options()(CtsApi::server_version_arg(),arg_desc());
+}
+
+void ServerVersionCmd::create(    Cmd_ptr& cmd,
+         boost::program_options::variables_map& vm,
+         AbstractClientEnv*  ace ) const
+{
+   if (ace->debug()) cout << "ServerVersionCmd::create\n";
+
+   // testing client interface
+   if (ace->under_test())  return;
+
+   cmd = Cmd_ptr(new ServerVersionCmd());
+}
+
+std::ostream& operator<<(std::ostream& os, const ServerVersionCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/ShowCmd.cpp b/ecflow_4_0_7/Base/src/cts/ShowCmd.cpp
new file mode 100644
index 0000000..648087a
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ShowCmd.cpp
@@ -0,0 +1,104 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #20 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "Str.hpp"
+#include "CtsApi.hpp"
+#include "AbstractClientEnv.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool ShowCmd::equals(ClientToServerCmd* rhs) const
+{
+	return (dynamic_cast<ShowCmd*>(rhs)) ?  UserCmd::equals(rhs) : false;
+}
+
+std::ostream& ShowCmd::print(std::ostream& os) const
+{
+	return user_cmd(os,"show");
+}
+
+STC_Cmd_ptr ShowCmd::doHandleRequest(AbstractServer* as) const
+{
+	/// Should never get called since, show command is only called on client side.
+	return PreAllocatedReply::ok_cmd();
+}
+
+const char* ShowCmd::arg()  { return "show";}
+const char* ShowCmd::desc() {
+   return   "Used to print state of the definition returned from the server to standard output.\n"
+	         "This command can *only* be used in a group command, and will only work if it is\n"
+	         "preceded with a get command. See examples below.\n"
+	         "   arg1 = [ defs | state | migrate ] \n"
+	         "The output of show has several options: i.e\n"
+	         "  o no arguments: With no arguments, print the definition structure to standard output\n"
+            "    Extern's are automatically added, allowing the output to be reloaded into the server\n"
+	         "    i.e --group=\"get ; show\"\n"
+	         "  o state:\n"
+	         "    This will output definition structure along with all the state information.\n"
+            "    This will include the trigger expressions, abstract syntax tree as comments.\n"
+            "    Excludes the edit history\n"
+            "  o migrate:\n"
+            "    This will output definition structure along with all the state information.\n"
+            "    The node state is shown in the comments.\n"
+            "    This format allows the definition to be migrated to future version of ecflow.\n"
+            "    The output includes edit history but excludes externs.\n"
+            "    When the definition is reloaded *NO* checking is done.\n"
+            "\n"
+            "The following shows a summary of the features associated with each choice\n"
+            "                        DEFS          STATE      MIGRATE\n"
+            "Auto generate externs   Yes           Yes        No\n"
+            "Checking on reload      Yes           Yes        No\n"
+            "Edit History            No            No         Yes\n"
+            "trigger AST             No            Yes        No\n"
+            "\n"
+            "Usage:\n"
+            "    --group=\"get ; show\"\n"
+            "    --group=\"get ; show defs\"    # same as the previous example\n"
+            "    --group=\"get ; show state\"   # Show all state for the node tree\n"
+            "    --group=\"get ; show migrate\" # Shows state and allows migration\n"
+	         "    --group=\"get /s1; show\"      # show state for the node only\n"
+	         "    --group=\"get /s1; show state\""
+	;
+}
+
+void ShowCmd::addOption(boost::program_options::options_description& desc) const {
+ 	desc.add_options()( ShowCmd::arg(), po::value< string >()->implicit_value(string()), ShowCmd::desc() );
+}
+void ShowCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* ac ) const
+{
+   std::string show_state = vm[ ShowCmd::arg() ].as< std::string > ();
+
+   if (ac->debug()) cout << "ShowCmd::create api = '" << show_state << "'.\n";
+
+	PrintStyle::Type_t style = PrintStyle::DEFS;
+	if (!show_state.empty()) {
+	   if (show_state == "state")  style = PrintStyle::STATE;
+	   else if (show_state == "migrate" ) style = PrintStyle::MIGRATE;
+	   else if (show_state == "defs" ) style = PrintStyle::DEFS;
+	   else throw std::runtime_error("ShowCmd::create invalid show option expected one of [ defs | state | migrate ] but found " + show_state);
+	}
+ 	cmd = Cmd_ptr( new ShowCmd( style ) );
+}
+
+std::ostream& operator<<(std::ostream& os, const ShowCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/TaskApi.cpp b/ecflow_4_0_7/Base/src/cts/TaskApi.cpp
new file mode 100644
index 0000000..f3c23db
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/TaskApi.cpp
@@ -0,0 +1,80 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/algorithm/string/trim.hpp>
+#include "TaskApi.hpp"
+
+std::string TaskApi::init(const std::string& process_id)
+{
+   std::string ret = "--init=";
+   ret += process_id;
+   return ret;
+}
+const char* TaskApi::initArg()      { return "init"; }
+
+
+std::string TaskApi::abort(const std::string& reason)
+{
+   if (reason.empty()) return "--abort";
+   std::string ret = "--abort=";
+   ret += reason;
+   return ret;
+}
+const char* TaskApi::abortArg()     { return "abort"; }
+
+
+std::string TaskApi::event(const std::string& eventName) {
+   std::string ret = "--event=";
+   ret += eventName;
+   return ret;
+}
+const char* TaskApi::eventArg()     { return "event"; }
+
+
+std::vector<std::string> TaskApi::meter(const std::string& meterName,const std::string& new_meter_value)
+{
+   std::vector<std::string> retVec; retVec.reserve(2);
+   std::string ret = "--meter=";ret += meterName;
+   retVec.push_back(ret);
+   retVec.push_back(new_meter_value);
+   return retVec;
+}
+const char* TaskApi::meterArg()     { return "meter"; }
+
+
+std::vector<std::string> TaskApi::label(const std::string& label_name, const std::vector<std::string>& labels )
+{
+   std::vector<std::string> retVec; retVec.reserve(labels.size() +1);
+   std::string ret = "--label=";
+   ret += label_name;
+   retVec.push_back(ret);
+   for(size_t i = 0; i < labels.size(); i++) { retVec.push_back(labels[i]);}
+   return retVec;
+}
+const char* TaskApi::labelArg()     { return "label"; }
+
+
+std::string TaskApi::complete()     { return "--complete"; }
+const char* TaskApi::completeArg()  { return "complete"; }
+
+
+std::string TaskApi::wait(const std::string& expression)
+{
+   std::string ret = "--wait=";
+   ret += expression;
+   return ret;
+}
+const char* TaskApi::waitArg()      { return "wait"; }
+
+
diff --git a/ecflow_4_0_7/Base/src/cts/TaskApi.hpp b/ecflow_4_0_7/Base/src/cts/TaskApi.hpp
new file mode 100644
index 0000000..0289e78
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/TaskApi.hpp
@@ -0,0 +1,43 @@
+#ifndef TASK_API_HPP_
+#define TASK_API_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Task api. i.e the child commands, typically called from the jobs files
+//               The two variant api must correspond i.e '--get' and 'get'
+//               since this is used by boost program options
+//============================================================================
+#include <boost/noncopyable.hpp>
+#include <string>
+#include <vector>
+
+class TaskApi : private boost::noncopyable  {
+public:
+   /// Used to construct arguments, for argc,argv
+	static std::string init(const std::string& process_id);
+	static std::string abort(const std::string& reason = "");
+	static std::string event(const std::string& eventName);
+	static std::vector<std::string> meter(const std::string& meterName,const std::string& metervalue);
+	static std::vector<std::string> label(const std::string& label_name, const std::vector<std::string>& labels );
+	static std::string complete();
+	static std::string wait(const std::string& expression);
+
+ 	// Only to be used in Cmd
+ 	static const char* initArg();
+	static const char* abortArg();
+	static const char* eventArg();
+	static const char* meterArg();
+	static const char* labelArg();
+	static const char* completeArg();
+	static const char* waitArg();
+};
+#endif
diff --git a/ecflow_4_0_7/Base/src/cts/TaskCmds.cpp b/ecflow_4_0_7/Base/src/cts/TaskCmds.cpp
new file mode 100644
index 0000000..c3f6a80
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/TaskCmds.cpp
@@ -0,0 +1,923 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #91 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "AbstractClientEnv.hpp"
+#include "TaskApi.hpp"
+#include "ExprAst.hpp"
+#include "ExprAstVisitor.hpp"
+
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "SuiteChanged.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+//#define DEBUG_ZOMBIE 1
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+bool TaskCmd::equals(ClientToServerCmd* rhs) const
+{
+	TaskCmd* the_rhs = dynamic_cast<TaskCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (path_to_submittable_ !=  the_rhs->path_to_node()) return false;
+	if (jobs_password_ !=  the_rhs->jobs_password()) return false;
+	if (process_or_remote_id_ !=  the_rhs->process_or_remote_id()) return false;
+	if (try_no_ !=  the_rhs->try_no()) return false;
+
+	// avoid calling base equals, as task cmd's don't use User(user_) variables.
+	return true;
+}
+
+// **********************************************************************************
+// IMPORTANT: In the current SMS/ECF only the init child command, passes the
+// process_or_remote_id_, for *ALL* other child commands this is empty.
+// The Automated tests get round this via setting ECF_RID in the header/tail job includes
+// However since this may not be in .sms/.ecf files, we can not rely on it
+// Hence we need to be able to handle *EMPTY* process_or_remote_id_ for child commands
+// ************************************************************************************
+bool TaskCmd::authenticate(AbstractServer* as, STC_Cmd_ptr& theReply) const
+{
+#ifdef DEBUG_ZOMBIE
+	std::cout << "   TaskCmd::authenticate " << Child::to_string(child_type());
+ 	std::cout << " " << path_to_submittable_ << " " << process_or_remote_id_  << " " << jobs_password_ << " " << try_no_;
+ 	const Zombie& zombie = as->zombie_ctrl().find(path_to_submittable_,process_or_remote_id_,jobs_password_);
+ 	if (!zombie.empty()) std::cout << "  " << zombie;
+ 	else {
+ 	 	const Zombie& zombie = as->zombie_ctrl().find_by_path_only(path_to_submittable_);
+ 	 	if (!zombie.empty()) std::cout << "  find_by_path_only: " << zombie;
+ 	}
+#endif
+	/// ***************************************************************************
+	/// Task based cmd have their own authentication mechanism, hence we
+	/// Don't need to call the base class authenticate
+	/// **************************************************************************
+
+	if (!as->allowTaskCommunication()) {
+  		// This is not an Error, hence we don't throw exception
+		theReply = PreAllocatedReply::block_client_server_halted_cmd();
+		return false;
+	}
+
+ 	submittable_ = get_submittable(as);
+	if (!submittable_) {
+#ifdef DEBUG_ZOMBIE
+	   std::cout << ": PATH Zombie\n";
+#endif
+		// Create path zombie, if not already created:
+	   std::string action_taken;
+		(void)as->zombie_ctrl().handle_path_zombie(as,this,action_taken,theReply);
+
+		// distinguish output by using *path*
+      std::stringstream ss; ss << " zombie(*path*) : " << process_or_remote_id_ << " : " << jobs_password_ << " : action taken(" << action_taken << ")";
+		log(Log::ERR,ss.str());
+		return false;
+	}
+
+	// If the CMD *WAS* created with Submittable::DUMMY_JOBS_PASSWORD then we were testing
+	// This will be copied from client to server, hence we want to avoid same check in the
+	// server. when handleRequest is called()
+	// DO NOT place #ifdef DEBUG otherwise test will start failing for the release build
+	if ( jobs_password_ == Submittable::DUMMY_JOBS_PASSWORD()) {
+		return true;
+	}
+
+   SuiteChanged1 changed(submittable_->suite());
+
+	/// Check if User wants to explicitly bypass password checking
+	/// This can be done via AlterCmd by adding a variable on the task,  ECF_PASS with value Submittable::FREE_JOBS_PASSWORD
+	/// Note: this *does not* look for the variable up the node tree, only on the task.
+	std::string ecf_pass_value;
+	if (submittable_->findVariableValue(Str::ECF_PASS(), ecf_pass_value)) {
+
+	   if ( ecf_pass_value == Submittable::FREE_JOBS_PASSWORD()) {
+	      submittable_->flag().clear(ecf::Flag::ZOMBIE);
+	      return true;
+	   }
+	}
+
+  	/// Handle corner case ,where we have two jobs with different process id, but same password
+  	/// Can happen if jobs is started externally,
+	/// or via test(i.e submit 1,submit 2(force)) before job1 active its password is overridden
+   bool submittable_allready_aborted = false;
+   bool submittable_allready_active = false;
+   bool submittable_allready_complete = false;
+   bool password_missmatch = false;
+   bool pid_missmatch = false;
+
+   if ( submittable_->jobsPassword() != jobs_password_) {
+#ifdef DEBUG_ZOMBIE
+      std::cout << ": submittable pass(" << submittable_->jobsPassword() << ") != jobs_password_(" << jobs_password_ << ")";
+#endif
+      password_missmatch = true;
+   }
+
+   /// *** See Note above: Not all child commands pass a process_id. ***
+   /// *** Hence this test for zombies is ONLY valid if process sets the process_or_remote_id_ ****
+   /// *** User should really set ECF_RID in the scripts
+   if (!submittable_->process_or_remote_id().empty() && !process_or_remote_id_.empty() && submittable_->process_or_remote_id() != process_or_remote_id_) {
+#ifdef DEBUG_ZOMBIE
+      std::cout << ":task pid(" << submittable_->process_or_remote_id() << ") != process pid(" << process_or_remote_id_ << ")";
+#endif
+      pid_missmatch = true;
+   }
+
+   if ((child_type() == Child::INIT) && (submittable_->state() == NState::ACTIVE)) {
+#ifdef DEBUG_ZOMBIE
+      std::cout << ":(child_type() == Child::INIT) && submittable_->state() == NState::ACTIVE)";
+#endif
+
+      // If ECF_NONSTRICT_ZOMBIES be more forgiving
+      if (!password_missmatch && !pid_missmatch ) {
+         if (submittable_->user_variable_exists("ECF_NONSTRICT_ZOMBIES")) {
+            std::stringstream ss; ss <<  " zombie(ECF_NONSTRICT_ZOMBIES) : " << path_to_submittable_ << " : already active : action taken( fob )";
+            log(Log::WAR, ss.str() );
+            theReply = PreAllocatedReply::ok_cmd();
+            return false;
+         }
+      }
+
+      submittable_allready_active = true;
+   }
+
+   if ( submittable_->state() == NState::COMPLETE) {
+#ifdef DEBUG_ZOMBIE
+      std::cout << ": submittable_->state() == NState::COMPLETE)";
+#endif
+
+      // If ECF_NONSTRICT_ZOMBIES be more forgiving
+      if (child_type() == Child::COMPLETE) {
+         if (submittable_->user_variable_exists("ECF_NONSTRICT_ZOMBIES")) {
+            std::stringstream ss; ss <<  " zombie(ECF_NONSTRICT_ZOMBIES) : " << path_to_submittable_ ;
+            if (password_missmatch) ss << " : password miss-match[ task:"<< submittable_->jobsPassword()<<" child:" << jobs_password_ << " ]";
+            if (pid_missmatch)      ss << " : pid miss-match[ task:"<< submittable_->process_or_remote_id()<<" child:" << process_or_remote_id_ << " ]";
+            ss << " : already complete : action taken( fob )";
+            log(Log::WAR, ss.str() );
+            theReply = PreAllocatedReply::ok_cmd();
+            return false;
+         }
+      }
+
+      // If Task state is complete, and we receive **any** child command then it is a zombie
+      submittable_allready_complete = true;
+   }
+
+   if ( submittable_->state() == NState::ABORTED) {
+#ifdef DEBUG_ZOMBIE
+      std::cout << ": submittable_->state() == NState::ABORTED)";
+#endif
+
+      // If ECF_NONSTRICT_ZOMBIES be more forgiving
+      if (child_type() == Child::ABORT) {
+         if (submittable_->user_variable_exists("ECF_NONSTRICT_ZOMBIES")) {
+            std::stringstream ss; ss <<  " zombie(ECF_NONSTRICT_ZOMBIES) : " << path_to_submittable_ ;
+            if (password_missmatch) ss << " : password miss-match[ task:"<< submittable_->jobsPassword() << " child:" << jobs_password_ << " ]";
+            if (pid_missmatch)      ss << " : pid miss-match[ task:"<< submittable_->process_or_remote_id() << " child:" << process_or_remote_id_ << " ]";
+            ss << " : already aborted : action taken( fob )";
+            log(Log::WAR, ss.str() );
+            theReply = PreAllocatedReply::ok_cmd();
+            return false;
+         }
+      }
+
+      // If Task state is aborted, and we receive **any** child command then it is a zombie
+      submittable_allready_aborted = true;
+   }
+
+#ifdef DEBUG_ZOMBIE
+    std::cout << "\n";
+#endif
+
+  	if (password_missmatch || pid_missmatch || submittable_allready_active || submittable_allready_complete || submittable_allready_aborted){
+		/// If the task has adopted we return true, and carry on as normal
+      std::string action_taken;
+  		if (!as->zombie_ctrl().handle_zombie(submittable_,this,action_taken,theReply)) {
+
+  		   // LOG failure: Include type of zombie.
+  		   // ** NOTE **: the zombie may have been removed by user actions. i.e if fob and child cmd is abort | complete, etc
+  		   std::stringstream ss;    ss << " zombie";
+  		   const Zombie& theZombie = as->zombie_ctrl().find(path_to_submittable_, process_or_remote_id_, jobs_password_ );
+  		   if (!theZombie.empty() ) ss << "(" << theZombie.type_str() << ")";
+
+         ss << " : " << path_to_submittable_ << " : " << process_or_remote_id_ << " : " << jobs_password_;
+         if (submittable_allready_active)   ss << " : already active";
+         if (submittable_allready_complete) ss << " : already complete";
+         if (submittable_allready_aborted)  ss << " : already aborted";
+         if (password_missmatch) ss << " : password miss-match[ task:"<< submittable_->jobsPassword()<<" child:" << jobs_password_ << " ]";
+         if (pid_missmatch)      ss << " : pid miss-match[ task:"<< submittable_->process_or_remote_id()<<" child:" << process_or_remote_id_ << " ]";
+         ss << " : action taken(" << action_taken << ")";
+         log(Log::ERR,ss.str());
+  			return false;
+  		}
+  	}
+	return true;
+}
+
+Submittable* TaskCmd::get_submittable(AbstractServer* as) const
+{
+	node_ptr node = as->defs()->findAbsNode(path_to_submittable_);
+	if (!node.get()) {
+		return NULL;
+ 	}
+
+	return node->isSubmittable();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+std::ostream& InitCmd::print(std::ostream& os) const
+{
+   return os << Str::CHILD_CMD() << "init " << path_to_node();
+}
+
+bool InitCmd::equals(ClientToServerCmd* rhs) const
+{
+	InitCmd* the_rhs = dynamic_cast<InitCmd*>(rhs);
+	if (!the_rhs) return false;
+	return TaskCmd::equals(rhs);
+}
+
+STC_Cmd_ptr InitCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().task_init_++;
+
+	{   // update suite change numbers before job submission. submittable_ setup during authentication
+		SuiteChanged1 changed(submittable_->suite());
+		submittable_->init(process_or_remote_id());    // will set task->set_state(NState::ACTIVE);
+	}
+
+	// Do job submission in case any triggers dependent on NState::ACTIVE
+	as->increment_job_generation_count();
+   return PreAllocatedReply::ok_cmd();
+}
+
+const char* InitCmd::arg() { return TaskApi::initArg();}
+const char* InitCmd::desc() {
+   return
+            "Mark task as started(active). For use in the '.ecf' script file *only*\n"
+            "Hence the context is supplied via environment variables.\n"
+            "  arg = process_or_remote_id. The process id of the job or remote_id\n"
+            "                              Using remote id allows the jobs to be killed\n\n"
+            "If this child command is a zombie, then the default action will be to *block*.\n"
+            "The default can be overridden by using zombie attributes.\n"
+            "Otherwise the blocking period is defined by ECF_TIMEOUT.\n\n"
+            "Usage:\n"
+            "  ecflow_client --init=$$"
+ 	;
+}
+
+void InitCmd::addOption(boost::program_options::options_description& desc) const{
+	desc.add_options()( InitCmd::arg(), po::value< string >(), InitCmd::desc() );
+}
+
+void InitCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* clientEnv ) const
+{
+	std::string process_or_remote_id = vm[ arg() ].as< std::string > ();
+
+	if (clientEnv->debug())
+		cout << "InitCmd::create " << InitCmd::arg()
+		<< "  clientEnv->task_path(" << clientEnv->task_path()
+		<< ") clientEnv->jobs_password(" << clientEnv->jobs_password()
+		<< ") clientEnv->process_or_remote_id(" << clientEnv->process_or_remote_id()
+		<< ") clientEnv->task_try_no(" << clientEnv->task_try_no()
+      << ") process_or_remote_id(" << process_or_remote_id
+      << ") clientEnv->under_test(" << clientEnv->under_test()
+		<< ")\n";
+
+	std::string errorMsg;
+	if ( !clientEnv->checkTaskPathAndPassword(errorMsg) ) {
+	 	throw std::runtime_error( "InitCmd: " + errorMsg );
+	}
+
+	/// if ECF_RID is specified then it *MUST* be the same as input argument
+	/// On cca we ECF_RID can be specified under test, and therefore fail this check, hence we use clientEnv->under_test()
+ 	if (!clientEnv->under_test() && !clientEnv->process_or_remote_id().empty() && clientEnv->process_or_remote_id() != process_or_remote_id) {
+ 		std::stringstream ss;
+ 		ss << "remote id(" << process_or_remote_id << ") passed as an argument, not the same the client environment ECF_RID(" << clientEnv->process_or_remote_id() << ")";
+		throw std::runtime_error(ss.str());
+	}
+
+	cmd = Cmd_ptr( new InitCmd( clientEnv->task_path(),
+	                            clientEnv->jobs_password(),
+	                            process_or_remote_id,
+	                            clientEnv->task_try_no()
+	                          )
+	             );
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+std::ostream& CompleteCmd::print(std::ostream& os) const
+{
+   return os << Str::CHILD_CMD() << "complete " << path_to_node();
+}
+
+bool CompleteCmd::equals(ClientToServerCmd* rhs) const
+{
+	CompleteCmd* the_rhs = dynamic_cast<CompleteCmd*>(rhs);
+	if (!the_rhs) return false;
+ 	return TaskCmd::equals(rhs);
+}
+
+STC_Cmd_ptr CompleteCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().task_complete_++;
+
+	{
+      /// If there is an associated zombie, remove from the list. Must match,
+	   /// Do this before task->complete(), since that clears password & process id
+	   /// remove(..) uses password/ process id to match the right zombie
+      as->zombie_ctrl().remove( submittable_ );
+
+      // update suite change numbers before job submission, submittable_ setup during authentication
+		SuiteChanged1 changed(submittable_->suite());
+		submittable_->complete();          // will set task->set_state(NState::COMPLETE);
+	}
+
+	// Do job submission in case any triggers dependent on NState::COMPLETE
+   as->increment_job_generation_count();
+   return PreAllocatedReply::ok_cmd();
+}
+
+const char* CompleteCmd::arg() { return TaskApi::completeArg();}
+const char* CompleteCmd::desc()
+{
+	return
+	         "Mark task as complete. For use in the '.ecf' script file *only*\n"
+	         "Hence the context is supplied via environment variables\n\n"
+	         "If this child command is a zombie, then the default action will be to *block*.\n"
+	         "The default can be overridden by using zombie attributes.\n"
+	         "Otherwise the blocking period is defined by ECF_TIMEOUT.\n\n"
+	         "Usage:\n"
+	         "  ecflow_client --complete"
+	         ;
+}
+
+void CompleteCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( CompleteCmd::arg(), CompleteCmd::desc() );
+}
+void CompleteCmd::create( 	Cmd_ptr& cmd,
+							boost::program_options::variables_map& vm,
+							AbstractClientEnv* clientEnv ) const
+{
+	if (clientEnv->debug())
+		cout << "CompleteCmd::create " << CompleteCmd::arg()
+		<< " task_path(" << clientEnv->task_path()
+		<< ") password(" << clientEnv->jobs_password()
+		<< ") remote_id(" << clientEnv->process_or_remote_id()
+		<< ") try_no(" << clientEnv->task_try_no()
+		<< ")\n";
+
+
+	std::string errorMsg;
+	if ( !clientEnv->checkTaskPathAndPassword(errorMsg) ) {
+	 	throw std::runtime_error( "CompleteCmd: " + errorMsg );
+	}
+
+	cmd = Cmd_ptr( new CompleteCmd( clientEnv->task_path(),
+	                                clientEnv->jobs_password(),
+	                                clientEnv->process_or_remote_id(),
+	                                clientEnv->task_try_no()) );
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+CtsWaitCmd::CtsWaitCmd(const std::string& pathToTask,
+          const std::string& jobsPassword,
+          const std::string& process_or_remote_id,
+          int try_no,
+          const std::string& expression)
+ : TaskCmd(pathToTask,jobsPassword,process_or_remote_id,try_no), expression_(expression)
+{
+   // Parse expression to make sure its valid
+   PartExpression exp(expression);
+   string parseErrorMsg;
+   std::auto_ptr<AstTop> ast = exp.parseExpressions( parseErrorMsg );
+   if (!ast.get()) {
+
+      assert( !parseErrorMsg.empty() );
+      std::stringstream ss; ss << "CtsWaitCmd: Failed to parse expression '" << expression << "'.  " << parseErrorMsg;
+      throw std::runtime_error( ss.str() );
+   }
+}
+
+std::ostream& CtsWaitCmd::print(std::ostream& os) const
+{
+	return os << Str::CHILD_CMD() << "wait " << expression_ << " " << path_to_node();
+}
+
+bool CtsWaitCmd::equals(ClientToServerCmd* rhs) const
+{
+	CtsWaitCmd* the_rhs = dynamic_cast< CtsWaitCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+ 	if (expression_ != the_rhs->expression()) return false;
+	return TaskCmd::equals(rhs);
+}
+
+STC_Cmd_ptr CtsWaitCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().task_wait_++;
+
+	SuiteChanged1 changed(submittable_->suite());
+
+	// Parse the expression
+	PartExpression exp(expression_);
+ 	string parseErrorMsg;
+	std::auto_ptr<AstTop> ast = exp.parseExpressions( parseErrorMsg );
+	if (!ast.get()) {
+		// should NOT really, since client did check
+		std::stringstream ss; ss << "CtsWaitCmd: Failed to parse expression '" << expression_ << "'.  " << parseErrorMsg;
+		throw std::runtime_error( ss.str() ) ;
+	}
+
+	// The complete expression have been parsed and we have created the abstract syntax tree
+	// We now need CHECK the AST for path nodes, event and meter. repeats,etc.
+	// *** This will also set the Node pointers ***
+	AstResolveVisitor astVisitor(submittable_);
+	ast->accept(astVisitor);
+
+	// If the expression references paths that don't exist throw an error
+	// This be captured in the ecf script, which should then abort the task
+	// Otherwise we will end up blocking indefinitely
+	if ( !astVisitor.errorMsg().empty() ) {
+		std::stringstream ss;
+		ss << "CtsWaitCmd: AST node tree references failed for " << expression_;
+		ss <<  " at " <<  submittable_->debugNodePath() << " : " <<  astVisitor.errorMsg();
+      throw std::runtime_error( ss.str() ) ;
+	}
+
+	// Evaluate the expression
+	if ( ast->evaluate() ) {
+
+		submittable_->flag().clear(ecf::Flag::WAIT);
+
+		// expression evaluates, return OK
+		return PreAllocatedReply::ok_cmd();
+	}
+
+	submittable_->flag().set(ecf::Flag::WAIT);
+
+	// Block/wait while expression is false
+	return PreAllocatedReply::block_client_on_home_server_cmd();
+}
+
+const char* CtsWaitCmd::arg()  { return TaskApi::waitArg();}
+const char* CtsWaitCmd::desc() {
+	return
+	         "Evaluates an expression, and block while the expression is false.\n"
+	         "For use in the '.ecf' file *only*, hence the context is supplied via environment variables\n"
+	         "  arg1 = string(expression)\n"
+	         "Usage:\n"
+	         "  ecflow_client --wait=\"/suite/taskx == complete\""
+	;
+}
+
+void CtsWaitCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( CtsWaitCmd::arg(), po::value< string >(),  CtsWaitCmd::desc() );
+}
+void CtsWaitCmd::create( 	Cmd_ptr& cmd,
+							boost::program_options::variables_map& vm,
+							AbstractClientEnv* clientEnv ) const
+{
+	std::string expression = vm[ arg() ].as< std::string > ();
+
+	if (clientEnv->debug())
+		cout << "CtsWaitCmd::create " << CtsWaitCmd::arg()
+		<< " task_path(" << clientEnv->task_path()
+		<< ") password(" << clientEnv->jobs_password()
+		<< ") remote_id(" << clientEnv->process_or_remote_id()
+		<< ") try_no(" << clientEnv->task_try_no()
+		<< ") expression(" << expression << ")\n";
+
+	std::string errorMsg;
+	if ( !clientEnv->checkTaskPathAndPassword(errorMsg) ) {
+	 	throw std::runtime_error( "CtsWaitCmd: " + errorMsg );
+	}
+
+	cmd = Cmd_ptr( new CtsWaitCmd( clientEnv->task_path(),
+	                               clientEnv->jobs_password(),
+	                               clientEnv->process_or_remote_id(),
+	                               clientEnv->task_try_no(),
+	                               expression) );
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+AbortCmd::AbortCmd(const std::string& pathToTask,
+         const std::string& jobsPassword,
+         const std::string& process_or_remote_id,
+         int try_no,
+         const std::string& reason)
+:TaskCmd(pathToTask,jobsPassword,process_or_remote_id,try_no), reason_(reason)
+{
+   if (!reason_.empty()) {
+      // Do not use "\n" | ';' in abortedReason_, as this can mess up, --migrate output
+      // Which would then affect --load.
+      Str::replace(reason_,"\n","");
+      Str::replace(reason_,";"," ");
+   }
+}
+
+std::ostream& AbortCmd::print(std::ostream& os) const
+{
+   return os << Str::CHILD_CMD() << "abort " << path_to_node() << "  " << reason_;
+}
+
+bool AbortCmd::equals(ClientToServerCmd* rhs) const
+{
+	AbortCmd* the_rhs = dynamic_cast<AbortCmd*>(rhs);
+	if (!the_rhs) return false;
+ 	if (reason_ != the_rhs->reason()) return false;
+ 	return TaskCmd::equals(rhs);
+}
+
+STC_Cmd_ptr AbortCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().task_abort_++;
+
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+
+	{
+      /// If there is an associated zombie, remove from the list
+      as->zombie_ctrl().remove( submittable_ );
+
+	   // update suite change numbers before job submission, submittable_ setup during authentication
+		SuiteChanged1 changed(submittable_->suite());
+
+		string theReason = reason_;
+		if ( theReason.empty() ) theReason = "Trap raised in job file";
+
+		submittable_->aborted(theReason);  // will set task->set_state(NState::ABORTED);
+	}
+
+	// Do job submission in case any triggers dependent on NState::ABORTED
+	// If task try number is less than ECF_TRIES we attempt to re-submit the job.(ie if still in limit)
+   as->increment_job_generation_count();
+   return PreAllocatedReply::ok_cmd();
+}
+
+const char* AbortCmd::arg()  { return TaskApi::abortArg();}
+const char* AbortCmd::desc() {
+   return
+            "Mark task as aborted. For use in the '.ecf' script file *only*\n"
+            "Hence the context is supplied via environment variables\n"
+            "  arg1 = (optional) string(reason)\n"
+            "         Optionally provide a reason why the abort was raised\n\n"
+            "If this child command is a zombie, then the default action will be to *block*.\n"
+            "The default can be overridden by using zombie attributes.\n"
+            "Otherwise the blocking period is defined by ECF_TIMEOUT.\n\n"
+            "Usage:\n"
+            "  ecflow_client --abort=reasonX"
+            ;
+}
+
+void AbortCmd::addOption(boost::program_options::options_description& desc) const{
+	desc.add_options()( AbortCmd::arg(), po::value< string >()->implicit_value(string()), AbortCmd::desc() );
+}
+void AbortCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* clientEnv ) const
+{
+	std::string reason = vm[ arg() ].as< std::string > ();
+
+	if (clientEnv->debug())
+		cout << "AbortCmd::create " << AbortCmd::arg()
+		<< " task_path(" << clientEnv->task_path()
+		<< ") password(" << clientEnv->jobs_password()
+		<< ") remote_id(" << clientEnv->process_or_remote_id()
+		<< ") try_no(" << clientEnv->task_try_no()
+		<< ") reason(" << reason << ")\n";
+
+
+	std::string errorMsg;
+	if ( !clientEnv->checkTaskPathAndPassword(errorMsg) ) {
+	 	throw std::runtime_error( "AbortCmd: " + errorMsg );
+	}
+
+	cmd = Cmd_ptr(new AbortCmd( clientEnv->task_path(),
+ 	                            clientEnv->jobs_password(),
+ 	                            clientEnv->process_or_remote_id(),
+ 	                            clientEnv->task_try_no(),
+ 	                            reason));
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool EventCmd::equals(ClientToServerCmd* rhs) const
+{
+	EventCmd* the_rhs = dynamic_cast<EventCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (name_ != the_rhs->name()) return false;
+  	return TaskCmd::equals(rhs);
+}
+
+std::ostream& EventCmd::print(std::ostream& os) const
+{
+ 	return os << Str::CHILD_CMD() << "event " << name_ << " " << path_to_node();
+}
+
+STC_Cmd_ptr EventCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().task_event_++;
+
+	{   // update suite change numbers before job submission,  task_ setup during authentication
+		SuiteChanged1 changed(submittable_->suite());
+
+		// The name could either be "string" or an integer either way it should be unique
+		if (!submittable_->set_event(name_,true)) {
+			std::string ss; ss = "Event request failed as event '"; ss += name_; ss += "' does not exist on task "; ss += path_to_node();
+			ecf::log(Log::ERR,ss);
+			return PreAllocatedReply::ok_cmd();
+		}
+	}
+
+ 	// Do job submission in case any triggers dependent on events
+   as->increment_job_generation_count();
+   return PreAllocatedReply::ok_cmd();
+}
+
+const char* EventCmd::arg()  { return TaskApi::eventArg();}
+const char* EventCmd::desc() {
+   return
+            "Change event. For use in the '.ecf' script file *only*\n"
+            "Hence the context is supplied via environment variables\n"
+            "  arg1(string | int) = event-name\n\n"
+            "If this child command is a zombie, then the default action will be to *fob*,\n"
+            "i.e allow the ecflow client command to complete without an error\n"
+            "The default can be overridden by using zombie attributes.\n\n"
+            "Usage:\n"
+            "  ecflow_client --event=ev"
+            ;
+}
+
+void EventCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( EventCmd::arg(), po::value< string >(), EventCmd::desc() );
+}
+void EventCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* clientEnv ) const
+{
+	std::string event = vm[ arg() ].as< std::string > ();
+
+	if (clientEnv->debug())
+		cout << "EventCmd::create " << EventCmd::arg()
+		<< " task_path(" << clientEnv->task_path()
+		<< ") password(" << clientEnv->jobs_password()
+		<< ") remote_id(" << clientEnv->process_or_remote_id()
+		<< ") try_no(" << clientEnv->task_try_no()
+		<< ") event(" << event << ")\n";
+
+
+	std::string errorMsg;
+	if ( !clientEnv->checkTaskPathAndPassword(errorMsg) ) {
+	 	throw std::runtime_error( "EventCmd: " + errorMsg );
+	}
+
+  	cmd = Cmd_ptr(new EventCmd( clientEnv->task_path(),
+  	                            clientEnv->jobs_password(),
+  	                            clientEnv->process_or_remote_id(),
+  	                            clientEnv->task_try_no(),
+  	                            event ));
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool MeterCmd::equals(ClientToServerCmd* rhs) const
+{
+	MeterCmd* the_rhs = dynamic_cast<MeterCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (name_ != the_rhs->name()) return false;
+	if (value_ != the_rhs->value()) return false;
+ 	return TaskCmd::equals(rhs);
+}
+
+std::ostream& MeterCmd::print(std::ostream& os) const
+{
+	return os << Str::CHILD_CMD() << "meter " << name_ << " " << value_ << " " << path_to_node();
+}
+
+STC_Cmd_ptr MeterCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().task_meter_++;
+
+	{  // Added scope for SuiteChanged1 changed: i.e update suite change numbers before job submission
+		// submittable_ setup during authentication
+		SuiteChanged1 changed(submittable_->suite());
+
+		/// Allow meter to set any valid value that is in range because:
+		///   - When we have a network failure, and restoration. The meter tasks, will come in random, order.
+		///   - When task is executed without a requee the meter value will less than maximum
+		///
+		/// This has *IMPLICATION*, if the meter is used in a trigger, using a equality
+		/// operator, then the trigger will always hold.  hence suite designers need to
+		/// aware of this.
+		try {
+
+	      Meter& the_meter = submittable_->find_meter(name_);
+	      if (the_meter.empty()) {
+	         LOG(Log::ERR,"MeterCmd::doHandleRequest: failed as meter '"  << name_ << "' does not exist on task " << path_to_node());
+	         return PreAllocatedReply::ok_cmd();
+	      }
+
+		   /// Invalid meter values(out or range) will raise exceptions.
+	      /// Just ignore the request rather than failing client cmd
+		   the_meter.set_value(value_);
+		}
+		catch (std::exception& e) {
+         LOG(Log::ERR,"MeterCmd::doHandleRequest: failed for task " << path_to_node() << ". " << e.what());
+         return PreAllocatedReply::ok_cmd();
+		}
+	}
+
+ 	// Do job submission in case any triggers dependent on meters
+   as->increment_job_generation_count();
+   return PreAllocatedReply::ok_cmd();
+}
+
+const char* MeterCmd::arg()  { return TaskApi::meterArg();}
+const char* MeterCmd::desc() {
+   return
+            "Change meter. For use in the '.ecf' script file *only*\n"
+            "Hence the context is supplied via environment variables\n"
+            "  arg1(string) = meter-name\n"
+            "  arg2(int)    = the new meter value\n\n"
+            "If this child command is a zombie, then the default action will be to *fob*,\n"
+            "i.e allow the ecflow client command to complete without an error\n"
+            "The default can be overridden by using zombie attributes.\n\n"
+            "Usage:\n"
+            "  ecflow_client --meter=my_meter 20"
+            ;
+}
+
+void MeterCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( MeterCmd::arg(), po::value< vector<string> >()->multitoken(), MeterCmd::desc() );
+}
+void MeterCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* clientEnv ) const
+{
+	vector<string> args = vm[ arg() ].as< vector<string> >();
+
+	if (clientEnv->debug()) {
+		dumpVecArgs(MeterCmd::arg(),args);
+		cout << "MeterCmd::create " << MeterCmd::arg()
+		<< " task_path(" << clientEnv->task_path()
+		<< ") password(" << clientEnv->jobs_password()
+		<< ") remote_id(" << clientEnv->process_or_remote_id()
+		<< ") try_no(" << clientEnv->task_try_no()
+		<< ")\n";
+	}
+
+	if (args.size() != 2 ) {
+		std::stringstream ss;
+		ss << "MeterCmd: Two arguments expected, found " << args.size()
+		   << " Please specify <meter-name> <meter-value>, ie --meter=name 100\n";
+		throw std::runtime_error( ss.str() );
+ 	}
+
+	int value = 0;
+	try {
+		std::string strVal = args[1];
+		value = boost::lexical_cast<int>(strVal);
+	}
+	catch (boost::bad_lexical_cast& e) {
+ 		throw std::runtime_error( "MeterCmd: Second argument must be a integer, i.e. --meter name 100\n" );
+ 	}
+
+	std::string errorMsg;
+	if ( !clientEnv->checkTaskPathAndPassword(errorMsg) ) {
+	 	throw std::runtime_error( "MeterCmd: " + errorMsg );
+	}
+
+	cmd = Cmd_ptr(new MeterCmd( clientEnv->task_path(),
+	                            clientEnv->jobs_password(),
+	                            clientEnv->process_or_remote_id(),
+	                            clientEnv->task_try_no(),
+	                            args[0],
+	                            value ));
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool LabelCmd::equals(ClientToServerCmd* rhs) const
+{
+	LabelCmd* the_rhs = dynamic_cast<LabelCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (name_ != the_rhs->name()) return false;
+	if (label_ != the_rhs->label()) return false;
+  	return TaskCmd::equals(rhs);
+}
+
+std::ostream& LabelCmd::print(std::ostream& os) const
+{
+	return os << Str::CHILD_CMD() << "label " << name_ << " '" << label_  << "' " << path_to_node();
+}
+
+STC_Cmd_ptr LabelCmd::doHandleRequest(AbstractServer* as) const
+{
+	as->update_stats().task_label_++;
+
+	assert(isWrite()); // isWrite used in handleRequest() to control check pointing
+
+	// submittable_ setup during authentication
+	if (submittable_->findLabel(name_)) {
+
+	   SuiteChanged1 changed(submittable_->suite());
+	   submittable_->changeLabel(name_,label_);
+	}
+	// else {
+	//   // ECFLOW-175, avoid filling up log file. Can get thousands of these messages, especially form MARS
+	//   std::string ss;
+	//   ss = "Label request failed as label '"; ss += name_; ss += "' does not exist on task "; ss += path_to_node();
+	//	  ecf::log(Log::ERR,ss);
+	//}
+
+	// Note: reclaiming memory for label_ earlier make *no* difference to performance of server
+
+	return PreAllocatedReply::ok_cmd();
+}
+
+const char* LabelCmd::arg()  { return TaskApi::labelArg();}
+const char* LabelCmd::desc() {
+   return
+            "Change Label. For use in the '.ecf' script file *only*\n"
+            "Hence the context is supplied via environment variables\n"
+            "  arg1 = label-name\n"
+            "  arg2 = The new label value\n"
+            "         The labels values can be single or multi-line(space separated quoted strings)\n\n"
+            "If this child command is a zombie, then the default action will be to *fob*,\n"
+            "i.e allow the ecflow client command to complete without an error\n"
+            "The default can be overridden by using zombie attributes.\n\n"
+            "Usage:\n"
+            "  ecflow_client --label=progressed merlin"
+            ;
+}
+
+void LabelCmd::addOption(boost::program_options::options_description& desc) const {
+	desc.add_options()( LabelCmd::arg(), po::value< vector<string> >()->multitoken(), LabelCmd::desc() );
+}
+void LabelCmd::create( 	Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* clientEnv ) const
+{
+	vector<string> args = vm[  arg() ].as< vector<string> >();
+
+	if (clientEnv->debug()) {
+		dumpVecArgs(LabelCmd::arg(),args);
+		cout << "LabelCmd::create " << LabelCmd::arg()
+		<< " task_path(" << clientEnv->task_path()
+		<< ") password(" << clientEnv->jobs_password()
+		<< ") remote_id(" << clientEnv->process_or_remote_id()
+		<< ") try_no(" << clientEnv->task_try_no()
+		<< ")\n";
+	}
+
+	if (args.size() < 2 ) {
+		std::stringstream ss;
+		ss << "LabelCmd: At least 2 arguments expected. Please specify <label-name> <string1> <string2>\n";
+		throw std::runtime_error( ss.str() );
+ 	}
+
+	std::string labelName = args[0];
+	args.erase(args.begin()); // remove name from vector of strings
+	std::string labelValue;
+	for(size_t i =0; i < args.size(); i++) {
+		if (i != 0) labelValue += " ";
+		labelValue += args[i];
+	}
+
+	std::string errorMsg;
+	if ( !clientEnv->checkTaskPathAndPassword(errorMsg) ) {
+	 	throw std::runtime_error( "LabelCmd: " + errorMsg );
+	}
+
+	cmd = Cmd_ptr(new LabelCmd( clientEnv->task_path(),
+	                            clientEnv->jobs_password(),
+	                            clientEnv->process_or_remote_id(),
+	                            clientEnv->task_try_no(),
+	                            labelName,
+	                            labelValue));
+}
+
+std::ostream& operator<<(std::ostream& os, const InitCmd& c)        { return c.print(os); }
+std::ostream& operator<<(std::ostream& os, const EventCmd& c)       { return c.print(os); }
+std::ostream& operator<<(std::ostream& os, const MeterCmd& c)       { return c.print(os); }
+std::ostream& operator<<(std::ostream& os, const LabelCmd& c)       { return c.print(os); }
+std::ostream& operator<<(std::ostream& os, const AbortCmd& c)       { return c.print(os); }
+std::ostream& operator<<(std::ostream& os, const CompleteCmd& c)    { return c.print(os); }
+std::ostream& operator<<(std::ostream& os, const CtsWaitCmd& c)     { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/cts/UserCmd.cpp b/ecflow_4_0_7/Base/src/cts/UserCmd.cpp
new file mode 100644
index 0000000..4014788
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/UserCmd.cpp
@@ -0,0 +1,126 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #65 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+#include <pwd.h>       /* getpwuid */
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>      /* tolower */
+
+#include "ClientToServerCmd.hpp"
+
+#include "AbstractServer.hpp"
+#include "Log.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace boost;
+using namespace ecf;
+
+bool UserCmd::equals(ClientToServerCmd* rhs) const
+{
+   UserCmd* the_rhs = dynamic_cast< UserCmd* > ( rhs );
+   if ( !the_rhs ) return false;
+   return user_ == the_rhs->user();
+}
+
+bool UserCmd::authenticate(AbstractServer* as, STC_Cmd_ptr& ) const
+{
+   LOG_ASSERT(!user().empty(),"");
+
+   // get the current user. This should have been set by the client
+   if (as->authenticateUser(user())) {
+      if (as->authenticateWriteAccess(user(),isWrite())) {
+         return true;
+      }
+
+      std::string msg = "[ authentication failed ] User ";
+      msg += user();
+      msg += " has no write access. Please see your administrator.";
+      throw std::runtime_error( msg );
+   }
+
+   std::string msg = "[ authentication failed ] User ";
+   msg += user();
+   msg += " is not allowed any access.";
+   throw std::runtime_error( msg );
+
+   return false;
+}
+
+void UserCmd::setup_user_authentification()
+{
+   // Minimise system calls by using static.
+   static std::string the_user_name;
+   if (the_user_name.empty()) {
+      // Get the uid of the running process and use it to get a record from /etc/passwd */
+      struct passwd * thePassWord = getpwuid ( getuid() );
+      the_user_name = thePassWord->pw_name;  // equivalent to the login name
+   }
+
+   user_ = the_user_name;
+}
+
+void UserCmd::prompt_for_confirmation(const std::string& prompt)
+{
+   cout << prompt;
+   char reply[256];
+   cin.getline (reply,256);
+   if (reply[0] != 'y' && reply[0] != 'Y') {
+      exit(1);
+   }
+}
+
+std::ostream& UserCmd::user_cmd(std::ostream& os, const std::string& the_cmd) const
+{
+   return os << the_cmd << " :" << user();
+}
+
+//#define DEBUG_ME 1
+
+void UserCmd::split_args_to_options_and_paths(
+          const std::vector<std::string>& args,
+          std::vector<std::string>& options,
+          std::vector<std::string>& paths)
+{
+   // ** ECFLOW-137 **, if the trigger expression have a leading '/' then it gets parsed into the paths
+   //                   vector and not options
+   // This is because boost program options does *NOT* seem to preserve the leading quotes around the
+   // trigger/complete expression,  i.e "/suite/t2 == complete"   is read as /suite/t2 == complete
+   // However in paths  we do expect to see any spaces
+
+   size_t vec_size = args.size();
+   for(size_t i = 0; i < vec_size; i++) {
+      if (args[i].empty()) continue;
+      if (args[i][0] == '/' && args[i].find(" ") == std::string::npos) {
+         paths.push_back(args[i]);
+      }
+      else {
+         options.push_back(args[i]);
+      }
+   }
+
+#ifdef DEBUG_ME
+   std::cout << "split_args_to_options_and_paths\n";
+   for(size_t i = 0; i < args.size(); ++i) { std::cout << "args[" << i << "]=" <<args[i] << "\n"; }
+   for(size_t i = 0; i < options.size(); ++i) { std::cout << "options[" << i << "]=" << options[i] << "\n"; }
+   for(size_t i = 0; i < paths.size(); ++i) { std::cout << "paths[" << i << "]=" << paths[i] << "\n"; }
+#endif
+}
+
+int UserCmd::time_out_for_load_sync_and_get() { return 600; }
+
diff --git a/ecflow_4_0_7/Base/src/cts/ZombieCmd.cpp b/ecflow_4_0_7/Base/src/cts/ZombieCmd.cpp
new file mode 100644
index 0000000..7f7b167
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/cts/ZombieCmd.cpp
@@ -0,0 +1,226 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ClientToServerCmd.hpp"
+#include "AbstractServer.hpp"
+#include "CtsApi.hpp"
+#include "AbstractClientEnv.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+
+std::ostream& ZombieCmd::print(std::ostream& os) const
+{
+	switch (user_action_) {
+      case User::FOB:    return user_cmd(os,CtsApi::to_string(CtsApi::zombieFob(path_,process_id_,password_))); break;
+      case User::FAIL:   return user_cmd(os,CtsApi::to_string(CtsApi::zombieFail(path_,process_id_,password_))); break;
+      case User::ADOPT:  return user_cmd(os,CtsApi::to_string(CtsApi::zombieAdopt(path_,process_id_,password_))); break;
+      case User::REMOVE: return user_cmd(os,CtsApi::to_string(CtsApi::zombieRemove(path_,process_id_,password_))); break;
+      case User::BLOCK:  return user_cmd(os,CtsApi::to_string(CtsApi::zombieBlock(path_,process_id_,password_))); break;
+      case User::KILL:   return user_cmd(os,CtsApi::to_string(CtsApi::zombieKill(path_,process_id_,password_))); break;
+      default: break;
+ 	}
+	return os;
+}
+
+bool ZombieCmd::equals(ClientToServerCmd* rhs) const
+{
+	ZombieCmd* the_rhs = dynamic_cast< ZombieCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+	if (path_ != the_rhs->path_to_task()) return false;
+	if (process_id_ != the_rhs->process_or_remote_id()) return false;
+	if (password_ != the_rhs->password()) return false;
+	return UserCmd::equals(rhs);
+}
+
+STC_Cmd_ptr ZombieCmd::doHandleRequest(AbstractServer* as) const
+{
+	// To uniquely identify a zombie we need path to task and remote_id, This information
+	// is available from the zombie class via get command. However we do not want to
+	// expose the password.
+	// Hence the Command level interface  will make do with just the path to the task.
+	// The first zombie whose corresponding task where password does *NOT* match is acted upon
+	Task* task = NULL;
+	if ( process_id_.empty() && password_.empty()) {
+	   node_ptr node = as->defs()->findAbsNode(path_);
+	   if (node.get()) task = node->isTask();
+	}
+
+	switch (user_action_) {
+
+		case User::FOB:     {
+			as->update_stats().zombie_fob_++;
+			if ( process_id_.empty() && password_.empty())  as->zombie_ctrl().fobCli(path_,task);
+			else                                            as->zombie_ctrl().fob(path_,process_id_,password_);
+			break;
+		}
+
+		case User::FAIL:    {
+			as->update_stats().zombie_fail_++;
+			if ( process_id_.empty() && password_.empty()) as->zombie_ctrl().failCli(path_,task);
+			else                                           as->zombie_ctrl().fail(path_,process_id_,password_);
+			break;
+		}
+
+		case User::ADOPT:   {
+			as->update_stats().zombie_adopt_++;
+			if ( process_id_.empty() && password_.empty())  as->zombie_ctrl().adoptCli(path_,task);
+			else                                            as->zombie_ctrl().adopt(path_,process_id_,password_);
+			break;
+		}
+
+		case User::REMOVE:  {
+			as->update_stats().zombie_remove_++;
+			if ( process_id_.empty() && password_.empty())  as->zombie_ctrl().removeCli(path_,task);
+			else                                            as->zombie_ctrl().remove(path_,process_id_,password_);
+			break;
+		}
+
+		case User::BLOCK: {
+			as->update_stats().zombie_block_++;
+			if ( process_id_.empty() && password_.empty())  as->zombie_ctrl().blockCli(path_,task);
+			else                                            as->zombie_ctrl().block(path_,process_id_,password_);
+			break;
+		}
+
+      case User::KILL: {
+         as->update_stats().zombie_kill_++;
+         if ( process_id_.empty() && password_.empty())  as->zombie_ctrl().killCli(path_,task);
+         else                                            as->zombie_ctrl().kill(path_,process_id_,password_);
+         break;
+      }
+	}
+
+	return PreAllocatedReply::ok_cmd();
+}
+
+const char* ZombieCmd::theArg() const {
+
+	switch (user_action_) {
+		case User::FOB:    return CtsApi::zombieFobArg(); break;
+		case User::FAIL:   return CtsApi::zombieFailArg(); break;
+		case User::ADOPT:  return CtsApi::zombieAdoptArg(); break;
+		case User::REMOVE: return CtsApi::zombieRemoveArg(); break;
+      case User::BLOCK:  return CtsApi::zombieBlockArg(); break;
+      case User::KILL:   return CtsApi::zombieKillArg(); break;
+		default: break;
+ 	}
+	assert(false);
+	return NULL;
+}
+
+void ZombieCmd::addOption(boost::program_options::options_description& desc) const
+{
+	switch (user_action_) {
+
+		case User::FOB:     {
+			desc.add_options()( CtsApi::zombieFobArg(), po::value< vector<string> >()->multitoken(),
+			         "Locates the task in the zombie list, and sets to fob.\n"
+			         "Next time the child commands (init,event,meter,label,abort,complete) communicate\n"
+			         "with the server, they will complete successfully (but without updating the node tree)\n"
+			         "allowing the job to finish.\n"
+			         "The server zombie is automatically deleted after 1 hour\n"
+			         "  arg = path to task"
+			);
+			break;
+		}
+		case User::FAIL:    {
+			desc.add_options()( CtsApi::zombieFailArg(), po::value< vector<string> >()->multitoken(),
+			         "Locates the task in the zombie list, and sets to fail.\n"
+			         "Next time the child commands (init,event,meter,label,abort,complete) communicate\n"
+			         "with the server, they will be set to fail. Depending on the job setup this may\n"
+			         "force a abort, the abort will also fail.\n"
+			         "Hence job structure should use 'set -e' in the error trapping functions to prevent\n"
+			         "infinite recursion. The server zombie is automatically deleted after 1 hour\n"
+			         "  arg = path to task"
+			);
+			break;
+		}
+		case User::ADOPT: {
+			desc.add_options()( CtsApi::zombieAdoptArg(), po::value< vector<string> >()->multitoken(),
+			         "Locates the task in the zombie list, and sets to adopt.\n"
+			         "Next time the child commands (init,event,meter,label,abort,complete) communicate\n"
+			         "with the server, the password on the zombie is adopted by the task.\n"
+			         "The zombie is then deleted.\n"
+			         "  arg = path to task"
+			);
+			break;
+		}
+		case User::REMOVE:  {
+			desc.add_options()( CtsApi::zombieRemoveArg(), po::value< vector<string> >()->multitoken(),
+			         "Locates the task in the zombie list, and removes it.\n"
+			         "Since a job typically has many child commands(i.e init, complete, event, meter, label)\n"
+			         "the zombie may reappear\n"
+			         "  arg = path to task"
+			);
+			break;
+		}
+		case User::BLOCK: {
+			desc.add_options()( CtsApi::zombieBlockArg(), po::value< vector<string> >()->multitoken(),
+			         "Locates the task in the zombie list, and blocks it.\n"
+			         "This is default behaviour of the child commands(init,event,meter,label,abort,complete)\n"
+			         "when the server can not match the passwords. Each child commands will continue\n"
+			         "attempting to connect to the server for 24 hours, and will then return an error.\n"
+			         "The connection timeout can be configured with environment ECF_TIMEOUT\n"
+			         "  arg = path to task"
+			);
+			break;
+		}
+      case User::KILL: {
+         desc.add_options()( CtsApi::zombieKillArg(), po::value< vector<string> >()->multitoken(),
+                  "Locates the task in the zombie list, and kills the associated job.\n"
+                  "The kill is done using ECF_KILL_CMD, but using the process_id from the zombie\n"
+                  "The job is allowed to continue until the kill is received\n"
+                  "Can only kill zombies that have an associated Task, hence path zombies\n"
+                  "must be killed manually.\n"
+                  "  arg = path to task"
+         );
+         break;
+      }
+		default: assert(false); break;
+ 	}
+}
+
+void ZombieCmd::create( Cmd_ptr& cmd,
+						boost::program_options::variables_map& vm,
+						AbstractClientEnv* ace ) const
+{
+ 	vector<string> args = vm[  theArg() ].as< vector<string> >();
+	if (ace->debug()) dumpVecArgs( theArg(), args);
+
+	// For Command Line Interface only the task_path is provided. Just have to make do.
+	// arg1 = task_path
+	// arg2 = process_or_remote_id ( empty for CLI)
+	// arg3 = password             ( empty for CLI)
+	std::string path;
+	std::string process_or_remote_id;
+	std::string password;
+	for(size_t i = 0; i < args.size(); i++) {
+		if (i == 0 ) path =  args[i];
+		if (i == 1 ) process_or_remote_id =  args[i];
+		if (i == 2 ) password =  args[i];
+	}
+	if (path.empty()) {
+		throw std::runtime_error("ZombieCmd::create: expects at least one argument. path to task");
+	}
+
+	cmd = Cmd_ptr(new ZombieCmd(user_action_, path, process_or_remote_id, password ));
+}
+
+std::ostream& operator<<(std::ostream& os, const ZombieCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/DefsCmd.cpp b/ecflow_4_0_7/Base/src/stc/DefsCmd.cpp
new file mode 100644
index 0000000..15361b5
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/DefsCmd.cpp
@@ -0,0 +1,99 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Cmd
+// Author      : Avi
+// Revision    : $Revision: #27 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+
+#include "DefsCmd.hpp"
+#include "ClientToServerCmd.hpp"
+#include "Defs.hpp"
+#include "Ecf.hpp"
+#include "AbstractServer.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace boost;
+
+//=====================================================================================
+// The defs command returns the full definition back to the client
+
+DefsCmd::DefsCmd(AbstractServer* as,bool save_edit_history)
+{
+	init(as,save_edit_history);
+}
+
+void DefsCmd::init(AbstractServer* as,bool save_edit_history)
+{
+   defs_ = as->defs();
+   /// Return the current value of the state change no. So the that
+   /// the next call to get the SSYncCmd , we need only return what's changed
+   defs_->set_state_change_no( Ecf::state_change_no() );
+   defs_->set_modify_change_no( Ecf::modify_change_no() );
+   defs_->save_edit_history(save_edit_history);
+}
+
+bool DefsCmd::equals(ServerToClientCmd* rhs) const
+{
+	DefsCmd* the_rhs = dynamic_cast<DefsCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (!ServerToClientCmd::equals(rhs)) return false;
+
+	if (defs_ == NULL && the_rhs->defs() == NULL) return true;
+	if (defs_ == NULL && the_rhs->defs() != NULL) return false;
+	if (defs_ != NULL && the_rhs->defs() == NULL) return false;
+	return (*defs_ == *(the_rhs->defs()));
+}
+
+std::ostream& DefsCmd::print(std::ostream& os) const
+{
+	os << "cmd:DefsCmd [ defs ]";
+	return os;
+}
+
+// Called in client
+bool DefsCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd,  bool debug ) const
+{
+	if (debug) std::cout << "DefsCmd::handle_server_response show_state = " << PrintStyle::to_string(cts_cmd->show_style()) << "\n";
+
+	// If we asked for the defs node tree from the server, then this is what we should have got back.
+	// ** Keep existing defs in memory, until a new one is requested. This allows clients
+	// ** to continue using this defs, in between other api calls, until a new defs is requested.
+
+	if ( !defs_.get() ) {
+		std::stringstream ss;
+		ss << "DefsCmd::handle_server_response: Error Node tree could not be retrieved from server. Request "; cts_cmd->print(ss); ss << " failed.\n";
+		throw std::runtime_error(ss.str());
+ 	}
+
+	if (server_reply.cli() && !cts_cmd->group_cmd()) {
+		/// This Could be part of a group command, hence ONLY show defs if NOT group command
+	   PrintStyle style(cts_cmd->show_style());
+
+	   if (cts_cmd->show_style() != PrintStyle::MIGRATE) {
+	      /// Auto generate externs, before writing to standard out. This can be expensive since
+	      /// All the trigger references need to to be resolved. & AST need to be created first
+	      /// The old spirit based parsing, horrendously, slow. Can't use Spirit QI, till IBM pull support it
+	      defs_->auto_add_externs();
+	   }
+		std::cout << *defs_;
+	}
+	else {
+		server_reply.set_sync( true );         // always in sync when getting the full defs
+		server_reply.set_full_sync( true );    // Done a full sync, as opposed to incremental
+		server_reply.set_client_defs( defs_ );
+	}
+	return true;
+}
+
+
+std::ostream& operator<<(std::ostream& os, const DefsCmd& c)       { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/DefsCmd.hpp b/ecflow_4_0_7/Base/src/stc/DefsCmd.hpp
new file mode 100644
index 0000000..06c5499
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/DefsCmd.hpp
@@ -0,0 +1,52 @@
+#ifndef DEFS_CMD_HPP_
+#define DEFS_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+class AbstractServer;
+
+//================================================================================
+// Paired with CtsNodeCmd(GET)
+// Client---CtsNodeCmd(GET)---->Server-----(DefsCmd | SNodeCmd)--->client:
+//================================================================================
+class DefsCmd : public ServerToClientCmd {
+public:
+  	DefsCmd(AbstractServer* as, bool save_edit_history = false);
+	DefsCmd() {}
+
+	void init(AbstractServer* as, bool save_edit_history);
+
+   defs_ptr defs() const { return defs_; }
+
+  	virtual bool hasDefs() const { return defs_.get() != NULL; }
+  	virtual bool handle_server_response( ServerReply&, Cmd_ptr cts_cmd, bool debug ) const;
+  	virtual std::ostream& print(std::ostream& os) const;
+	virtual bool equals(ServerToClientCmd*) const;
+
+private:
+ 	defs_ptr defs_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+ 		ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & defs_;
+  	}
+};
+
+std::ostream& operator<<(std::ostream& os, const DefsCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/ErrorCmd.cpp b/ecflow_4_0_7/Base/src/stc/ErrorCmd.cpp
new file mode 100644
index 0000000..1327974
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/ErrorCmd.cpp
@@ -0,0 +1,63 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include "ErrorCmd.hpp"
+#include "ClientToServerCmd.hpp"
+#include "Log.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+ErrorCmd::ErrorCmd(const std::string& errorMsg)
+{
+	init(errorMsg);
+}
+
+void ErrorCmd::init( const std::string& errorMsg)
+{
+//#ifdef DEBUG
+//	std::cout << ErrorCmd::init " << errorMsg << "\n";
+//	LogToCout toCoutAsWell;
+//#endif
+
+	LOG_ASSERT(!errorMsg.empty(),"");
+	error_msg_ = errorMsg;
+
+	// Log the error, Remove any "/n" as the log file will add this automatically
+	size_t pos = error_msg_.rfind("\n");
+	if (pos != string::npos)  error_msg_.erase(error_msg_.begin() + pos);
+	ecf::log(Log::ERR,error_msg_); // will automatically add end of line
+}
+
+std::ostream& ErrorCmd::print(std::ostream& os) const { return os << "cmd:Error [ " << error_msg_ << " ]";}
+
+bool ErrorCmd::equals(ServerToClientCmd* rhs) const
+{
+	return (dynamic_cast<ErrorCmd*>(rhs)) ? ServerToClientCmd::equals(rhs) : false;
+}
+
+bool ErrorCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+	if (debug) std::cout << "ErrorCmd::handle_server_response " << error_msg_ << "\n";
+
+	std::stringstream ss;
+	ss << "Error: request( "; cts_cmd->print(ss); ss << " ) failed!  Server replied with: '" <<  error_msg_ << "'\n";
+	server_reply.set_error_msg(ss.str());
+	return false;
+}
+
+std::ostream& operator<<(std::ostream& os, const ErrorCmd& c) { return c.print(os); }
+
diff --git a/ecflow_4_0_7/Base/src/stc/ErrorCmd.hpp b/ecflow_4_0_7/Base/src/stc/ErrorCmd.hpp
new file mode 100644
index 0000000..4b3ee5f
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/ErrorCmd.hpp
@@ -0,0 +1,45 @@
+#ifndef ERROR_CMD_HPP_
+#define ERROR_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ServerToClientCmd.hpp"
+
+class ErrorCmd : public ServerToClientCmd {
+public:
+	ErrorCmd(const std::string& errorMsg);
+	ErrorCmd() : ServerToClientCmd() {}
+
+	void init( const std::string& errorMsg);
+	virtual std::ostream& print(std::ostream& os) const;
+	virtual bool equals(ServerToClientCmd*) const;
+  	virtual bool handle_server_response( ServerReply&, Cmd_ptr cts_cmd, bool debug ) const;
+
+ 	virtual std::string error() const { return error_msg_;}  /// Used by test
+	virtual bool ok() const { return false; }                /// Used by group command
+
+private:
+ 	std::string error_msg_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+ 		ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+ 		ar & error_msg_;
+  	}
+};
+
+std::ostream& operator<<(std::ostream& os, const ErrorCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/GroupSTCCmd.cpp b/ecflow_4_0_7/Base/src/stc/GroupSTCCmd.cpp
new file mode 100644
index 0000000..983723d
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/GroupSTCCmd.cpp
@@ -0,0 +1,124 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/foreach.hpp>
+#include "GroupSTCCmd.hpp"
+#include "ClientToServerCmd.hpp"
+#include "Str.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "PrintStyle.hpp"
+#include "WhyCmd.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "Suite.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+std::ostream& GroupSTCCmd::print(std::ostream& os) const
+{
+ 	return os << "cmd:GroupSTCCmd";
+}
+
+bool GroupSTCCmd::equals(ServerToClientCmd* rhs) const
+{
+	GroupSTCCmd* the_rhs = dynamic_cast< GroupSTCCmd* > ( rhs );
+	if ( !the_rhs ) return false;
+
+ 	const std::vector<STC_Cmd_ptr>& rhsCmdVec = the_rhs->cmdVec();
+	if (cmdVec_.size() != rhsCmdVec.size()) return false;
+
+	for(size_t i = 0; i < cmdVec_.size(); i++) {
+		if ( !cmdVec_[i]->equals( rhsCmdVec[i].get() ) ) {
+			return false;
+		}
+	}
+
+	return ServerToClientCmd::equals(rhs);
+}
+
+bool GroupSTCCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+	if (debug) std::cout << "GroupSTCCmd::handle_server_response\n";
+
+	BOOST_FOREACH(STC_Cmd_ptr subCmd, cmdVec_) {
+		(void)subCmd->handle_server_response(server_reply, cts_cmd, debug);
+  	}
+
+	/// This assumes the DefsCmd::handle_server_response() | SNodeCmd::handle_server_response has been called
+	/// this will populate ServerReply with the defs/node returned from the server
+   defs_ptr defs = server_reply.client_defs();
+   node_ptr node = server_reply.client_node();
+
+	if ( cts_cmd->get_cmd() && (defs.get() || node.get())) {
+		if (debug) std::cout << "   GroupSTCCmd::handle_server_response *get* was called\n";
+
+		/// client --group="get; show"         # where get will call DefsCmd will return defs, from the server
+      /// client --group="get; show state"   # where get will call DefsCmd will return defs, from the server
+      /// client --group="get /s1; show state"   # where get will call DefsCmd will return defs, from the server
+
+		// Print out the data that was received from server. as a part of get request.
+		// The server can not do a show, it MUST be done at the Client side
+		// The show request is only valid if the out bound request to the server
+		PrintStyle::Type_t style = cts_cmd->show_style();
+		if ( style != PrintStyle::NOTHING ) {
+			if (debug) std::cout << "   GroupSTCCmd::handle_server_response *show* was called " << PrintStyle::to_string(style) << "\n";
+			PrintStyle::setStyle(style);
+			if (defs.get()) {
+
+		      /// Auto generate externs, before writing to standard out. This can be expensive since
+		      /// All the trigger references need to to be resolved. & AST need to be created first
+		      /// The old spirit based parsing is horrendously, slow. Can't use Spirit QI, till IBM support it
+		      if (cts_cmd->show_style() != PrintStyle::MIGRATE) {
+ 		         defs->auto_add_externs();
+		      }
+
+			   std::cout << *defs.get();
+			}
+			else   {
+             if (node.get()) {
+               Suite* suite = node->isSuite();
+               if (suite) std::cout << *suite << "\n";
+               Family* fam = node->isFamily();
+               if (fam) std::cout << *fam << "\n";
+               Task* task = node->isTask();
+               if (task) std::cout << *task << "\n";
+            }
+			}
+		}
+	}
+
+	std::string nodePath;
+	if (cts_cmd->why_cmd(nodePath) && defs.get()) {
+		if (debug) std::cout << "   GroupSTCCmd::handle_server_response *why* was called\n";
+
+		/// client --group="get; why"          # where get will call DefsCmd will return defs, from the server
+		/// client --group="get; why <path>"   # where get will call DefsCmd will return defs, from the server
+		WhyCmd cmd(defs, nodePath);
+		std::cout << cmd.why() << "\n";
+ 	}
+
+	return true;
+}
+
+void GroupSTCCmd::addChild(STC_Cmd_ptr childCmd)
+{
+	LOG_ASSERT(childCmd.get(),""); // Dont add NULL children
+	cmdVec_.push_back(childCmd);
+}
+
+std::ostream& operator<<(std::ostream& os, const GroupSTCCmd& c)   { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/GroupSTCCmd.hpp b/ecflow_4_0_7/Base/src/stc/GroupSTCCmd.hpp
new file mode 100644
index 0000000..cdad074
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/GroupSTCCmd.hpp
@@ -0,0 +1,44 @@
+#ifndef GROUP_STC_CMD_HPP_
+#define GROUP_STC_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+
+class GroupSTCCmd : public ServerToClientCmd {
+public:
+	GroupSTCCmd() : ServerToClientCmd() {}
+
+ 	virtual std::ostream& print(std::ostream& os) const;
+  	virtual bool equals(ServerToClientCmd*) const;
+  	virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+   void addChild(STC_Cmd_ptr childCmd);
+ 	const std::vector<STC_Cmd_ptr>& cmdVec() const { return cmdVec_;}
+
+private:
+ 	std::vector<STC_Cmd_ptr> cmdVec_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+ 		ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+ 		ar & cmdVec_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const GroupSTCCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/PreAllocatedReply.cpp b/ecflow_4_0_7/Base/src/stc/PreAllocatedReply.cpp
new file mode 100644
index 0000000..0607ccf
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/PreAllocatedReply.cpp
@@ -0,0 +1,201 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "PreAllocatedReply.hpp"
+
+#include "StcCmd.hpp"
+#include "DefsCmd.hpp"
+#include "SNodeCmd.hpp"
+#include "SStringCmd.hpp"
+#include "SStringVecCmd.hpp"
+#include "SServerLoadCmd.hpp"
+#include "GroupSTCCmd.hpp"
+#include "ErrorCmd.hpp"
+#include "SNewsCmd.hpp"
+#include "SSyncCmd.hpp"
+#include "SStatsCmd.hpp"
+#include "SSuitesCmd.hpp"
+#include "SClientHandleCmd.hpp"
+#include "SClientHandleSuitesCmd.hpp"
+#include "ZombieGetCmd.hpp"
+
+STC_Cmd_ptr PreAllocatedReply::stc_cmd_                  = STC_Cmd_ptr( new StcCmd() );
+STC_Cmd_ptr PreAllocatedReply::defs_cmd_                 = STC_Cmd_ptr( new DefsCmd() );
+STC_Cmd_ptr PreAllocatedReply::node_cmd_                 = STC_Cmd_ptr( new SNodeCmd() );
+STC_Cmd_ptr PreAllocatedReply::stats_cmd_                = STC_Cmd_ptr( new SStatsCmd() );
+STC_Cmd_ptr PreAllocatedReply::suites_cmd_               = STC_Cmd_ptr( new SSuitesCmd() );
+STC_Cmd_ptr PreAllocatedReply::zombie_get_cmd_           = STC_Cmd_ptr( new ZombieGetCmd() );
+STC_Cmd_ptr PreAllocatedReply::error_cmd_                = STC_Cmd_ptr( new ErrorCmd() );
+STC_Cmd_ptr PreAllocatedReply::client_handle_cmd_        = STC_Cmd_ptr( new SClientHandleCmd() );
+STC_Cmd_ptr PreAllocatedReply::client_handle_suites_cmd_ = STC_Cmd_ptr( new SClientHandleSuitesCmd() );
+STC_Cmd_ptr PreAllocatedReply::string_cmd_               = STC_Cmd_ptr( new SStringCmd() );
+STC_Cmd_ptr PreAllocatedReply::string_vec_cmd_           = STC_Cmd_ptr( new SStringVecCmd() );
+STC_Cmd_ptr PreAllocatedReply::server_load_cmd_          = STC_Cmd_ptr( new SServerLoadCmd() );
+STC_Cmd_ptr PreAllocatedReply::news_cmd_                 = STC_Cmd_ptr( new SNewsCmd() );
+STC_Cmd_ptr PreAllocatedReply::sync_cmd_                 = STC_Cmd_ptr( new SSyncCmd() );
+
+STC_Cmd_ptr PreAllocatedReply::ok_cmd()
+{
+	StcCmd* cmd = dynamic_cast<StcCmd*>(stc_cmd_.get());
+	cmd->init(StcCmd::OK);
+	return stc_cmd_;
+}
+STC_Cmd_ptr PreAllocatedReply::block_client_server_halted_cmd()
+{
+	StcCmd* cmd = dynamic_cast<StcCmd*>(stc_cmd_.get());
+	cmd->init(StcCmd::BLOCK_CLIENT_SERVER_HALTED);
+	return stc_cmd_;
+}
+STC_Cmd_ptr PreAllocatedReply::block_client_on_home_server_cmd()
+{
+	StcCmd* cmd = dynamic_cast<StcCmd*>(stc_cmd_.get());
+	cmd->init(StcCmd::BLOCK_CLIENT_ON_HOME_SERVER);
+	return stc_cmd_;
+}
+STC_Cmd_ptr PreAllocatedReply::block_client_zombie_cmd()
+{
+	StcCmd* cmd = dynamic_cast<StcCmd*>(stc_cmd_.get());
+	cmd->init(StcCmd::BLOCK_CLIENT_ZOMBIE);
+	return stc_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::defs_cmd(AbstractServer* as,bool save_edit_history)
+{
+	DefsCmd* cmd = dynamic_cast<DefsCmd*>(defs_cmd_.get());
+	cmd->init(as,save_edit_history);
+	return defs_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::node_cmd(AbstractServer* as,node_ptr node)
+{
+   SNodeCmd* cmd = dynamic_cast<SNodeCmd*>(node_cmd_.get());
+   cmd->init(as,node);
+   return node_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::stats_cmd(AbstractServer* as)
+{
+	SStatsCmd* cmd = dynamic_cast<SStatsCmd*>(stats_cmd_.get());
+	cmd->init(as);
+	return stats_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::suites_cmd(AbstractServer* as)
+{
+	SSuitesCmd* cmd = dynamic_cast<SSuitesCmd*>(suites_cmd_.get());
+	cmd->init(as);
+	return suites_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::zombie_get_cmd(AbstractServer* as)
+{
+	ZombieGetCmd* cmd = dynamic_cast<ZombieGetCmd*>(zombie_get_cmd_.get());
+	cmd->init(as);
+	return zombie_get_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::error_cmd(const std::string& error_msg)
+{
+	ErrorCmd* cmd = dynamic_cast<ErrorCmd*>(error_cmd_.get());
+	cmd->init(error_msg);
+	return error_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::client_handle_cmd(int handle)
+{
+	SClientHandleCmd* cmd = dynamic_cast<SClientHandleCmd*>(client_handle_cmd_.get());
+	cmd->init(handle);
+	return client_handle_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::client_handle_suites_cmd(AbstractServer* as)
+{
+   SClientHandleSuitesCmd* cmd = dynamic_cast<SClientHandleSuitesCmd*>(client_handle_suites_cmd_.get());
+   cmd->init(as);
+   return client_handle_suites_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::string_cmd(const std::string& any_string)
+{
+   SStringCmd* cmd = dynamic_cast<SStringCmd*>(string_cmd_.get());
+	cmd->init(any_string);
+	return string_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::string_vec_cmd(const std::vector<std::string>& vec)
+{
+   SStringVecCmd* cmd = dynamic_cast<SStringVecCmd*>(string_vec_cmd_.get());
+   cmd->init(vec);
+   return string_vec_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::server_load_cmd(const std::string& log_file_path)
+{
+   SServerLoadCmd* cmd = dynamic_cast<SServerLoadCmd*>(server_load_cmd_.get());
+   cmd->init(log_file_path);
+   return server_load_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::news_cmd(unsigned int client_handle,
+										unsigned int client_state_change_no,
+										unsigned int client_modify_change_no,
+										AbstractServer* as)
+{
+	SNewsCmd* cmd = dynamic_cast<SNewsCmd*>(news_cmd_.get());
+	cmd->init(client_handle,client_state_change_no,client_modify_change_no,as);
+	return news_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::sync_cmd(unsigned int client_handle,
+										unsigned int client_state_change_no,
+										unsigned int client_modify_change_no,
+										AbstractServer* as)
+{
+	SSyncCmd* cmd = dynamic_cast<SSyncCmd*>(sync_cmd_.get());
+	cmd->init(client_handle,client_state_change_no,client_modify_change_no,false,as);
+	return sync_cmd_;
+}
+
+STC_Cmd_ptr PreAllocatedReply::sync_full_cmd(unsigned int client_handle,AbstractServer* as)
+{
+   SSyncCmd* cmd = dynamic_cast<SSyncCmd*>(sync_cmd_.get()); // can reuse the same command
+   cmd->init(client_handle,0,0,true,as);
+   return sync_cmd_;
+}
+
+// ==============================================================================
+// Serialisation export
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "boost_archive.hpp"
+
+#include <boost/serialization/export.hpp>   // explicit code for exports (place last) , needed for BOOST_CLASS_EXPORT
+BOOST_CLASS_EXPORT(DefsCmd)
+BOOST_CLASS_EXPORT(SNodeCmd)
+BOOST_CLASS_EXPORT(SStringCmd)
+BOOST_CLASS_EXPORT(SStringVecCmd)
+BOOST_CLASS_EXPORT(SServerLoadCmd)
+BOOST_CLASS_EXPORT(GroupSTCCmd)
+BOOST_CLASS_EXPORT(ErrorCmd)
+BOOST_CLASS_EXPORT(StcCmd)
+BOOST_CLASS_EXPORT(SSyncCmd)
+BOOST_CLASS_EXPORT(SNewsCmd)
+BOOST_CLASS_EXPORT(SStatsCmd)
+BOOST_CLASS_EXPORT(SSuitesCmd)
+BOOST_CLASS_EXPORT(SClientHandleCmd)
+BOOST_CLASS_EXPORT(SClientHandleSuitesCmd)
+BOOST_CLASS_EXPORT(ZombieGetCmd)
diff --git a/ecflow_4_0_7/Base/src/stc/PreAllocatedReply.hpp b/ecflow_4_0_7/Base/src/stc/PreAllocatedReply.hpp
new file mode 100644
index 0000000..13da996
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/PreAllocatedReply.hpp
@@ -0,0 +1,71 @@
+#ifndef PRE_ALLOCATED_REPLY_HPP_
+#define PRE_ALLOCATED_REPLY_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <boost/noncopyable.hpp>
+#include "Cmd.hpp"
+#include "NodeFwd.hpp"
+class AbstractServer;
+
+// class PreAllocatedReply:
+// This class pre allocates the replies back to the client
+// This will help to reduce memory fragmentation.
+// Since the commands are re-used those commands with state,
+// should be cleared first
+class PreAllocatedReply : private boost::noncopyable {
+public:
+ 	static STC_Cmd_ptr ok_cmd();
+ 	static STC_Cmd_ptr block_client_server_halted_cmd();
+ 	static STC_Cmd_ptr block_client_on_home_server_cmd();
+ 	static STC_Cmd_ptr block_client_zombie_cmd();
+
+   static STC_Cmd_ptr defs_cmd(AbstractServer*, bool save_edit_history);
+   static STC_Cmd_ptr node_cmd(AbstractServer*,node_ptr);
+	static STC_Cmd_ptr stats_cmd(AbstractServer*);
+	static STC_Cmd_ptr suites_cmd(AbstractServer*);
+	static STC_Cmd_ptr zombie_get_cmd(AbstractServer*);
+	static STC_Cmd_ptr error_cmd(const std::string& error_msg);
+   static STC_Cmd_ptr client_handle_cmd(int handle);
+   static STC_Cmd_ptr client_handle_suites_cmd(AbstractServer*);
+   static STC_Cmd_ptr string_cmd(const std::string& any_string);
+   static STC_Cmd_ptr string_vec_cmd(const std::vector<std::string>&);
+   static STC_Cmd_ptr server_load_cmd(const std::string& any_string);
+	static STC_Cmd_ptr news_cmd(unsigned int client_handle,
+							          unsigned int client_state_change_no,
+			                      unsigned int client_modify_change_no, AbstractServer* as);
+	static STC_Cmd_ptr sync_cmd(unsigned int client_handle,
+							          unsigned int client_state_change_no,
+			                      unsigned int client_modify_change_no, AbstractServer* as);
+   static STC_Cmd_ptr sync_full_cmd(unsigned int client_handle,AbstractServer* as);
+private:
+
+	static STC_Cmd_ptr stc_cmd_;
+   static STC_Cmd_ptr defs_cmd_;
+   static STC_Cmd_ptr node_cmd_;
+	static STC_Cmd_ptr stats_cmd_;
+	static STC_Cmd_ptr suites_cmd_;
+	static STC_Cmd_ptr zombie_get_cmd_;
+	static STC_Cmd_ptr error_cmd_;
+   static STC_Cmd_ptr client_handle_cmd_;
+   static STC_Cmd_ptr client_handle_suites_cmd_;
+   static STC_Cmd_ptr string_cmd_;
+   static STC_Cmd_ptr string_vec_cmd_;
+   static STC_Cmd_ptr server_load_cmd_;
+	static STC_Cmd_ptr news_cmd_;
+	static STC_Cmd_ptr sync_cmd_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SClientHandleCmd.cpp b/ecflow_4_0_7/Base/src/stc/SClientHandleCmd.cpp
new file mode 100644
index 0000000..875d70d
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SClientHandleCmd.cpp
@@ -0,0 +1,34 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include "SClientHandleCmd.hpp"
+
+using namespace ecf;
+using namespace std;
+
+bool SClientHandleCmd::equals(ServerToClientCmd* rhs) const
+{
+	return (dynamic_cast<SClientHandleCmd*>(rhs)) ? ServerToClientCmd::equals(rhs) : false;
+}
+
+bool SClientHandleCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+	if (debug) cout << "SClientHandleCmd::handle_server_response handle_ = " << handle_ << "\n";
+	server_reply.set_client_handle( handle_ );
+	return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SClientHandleCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SClientHandleCmd.hpp b/ecflow_4_0_7/Base/src/stc/SClientHandleCmd.hpp
new file mode 100644
index 0000000..f21d48c
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SClientHandleCmd.hpp
@@ -0,0 +1,42 @@
+#ifndef SCLIENT_HANDLE_CMD_HPP_
+#define SCLIENT_HANDLE_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "ServerToClientCmd.hpp"
+
+class SClientHandleCmd : public ServerToClientCmd {
+public:
+	SClientHandleCmd(int handle) : handle_(handle) {}
+	SClientHandleCmd() : ServerToClientCmd() , handle_(0) {}
+
+	void init(int handle) { handle_ = handle; }
+	virtual std::ostream& print(std::ostream& os) const { return os << "cmd:SClientHandleCmd [ " << handle_ << " ]";}
+	virtual bool equals(ServerToClientCmd*) const;
+  	virtual bool handle_server_response( ServerReply&, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+ 	int handle_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+ 		ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+ 		ar & handle_;
+  	}
+};
+
+std::ostream& operator<<(std::ostream& os, const SClientHandleCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SClientHandleSuitesCmd.cpp b/ecflow_4_0_7/Base/src/stc/SClientHandleSuitesCmd.cpp
new file mode 100644
index 0000000..25faab2
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SClientHandleSuitesCmd.cpp
@@ -0,0 +1,118 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include "SClientHandleSuitesCmd.hpp"
+#include "AbstractServer.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "ClientSuiteMgr.hpp"
+#include "ClientToServerCmd.hpp"
+
+using namespace std;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+SClientHandleSuitesCmd::SClientHandleSuitesCmd(AbstractServer* as )
+{
+   init(as);
+}
+
+void SClientHandleSuitesCmd::init(AbstractServer* as)
+{
+   // This command can be re-used hence clear existing data members
+   users_.clear();
+   client_handles_.clear();
+
+   ClientSuiteMgr& client_suite_mgr = as->defs()->client_suite_mgr();
+   const std::vector<ecf::ClientSuites>& clientSuites = client_suite_mgr.clientSuites();
+
+   size_t client_suites_size = clientSuites.size();
+   client_handles_.reserve(client_suites_size);
+   for(size_t c = 0; c < client_suites_size; c++) {
+
+      // The handle suites are already ordered same as Defs suites
+      std::vector<std::string> suite_names;
+      clientSuites[c].suites( suite_names );
+
+      client_handles_.push_back( std::make_pair(clientSuites[c].handle(), suite_names) );
+
+      // Create user, and his list of handles
+      bool fnd_user = false;
+      for(size_t u = 0; u < users_.size(); u++) {
+         if (users_[u].first == clientSuites[c].user()) {
+            users_[u].second.push_back(clientSuites[c].handle());
+            fnd_user = true;
+            break;
+         }
+      }
+      if (!fnd_user) {
+         std::vector<unsigned int> handles;  handles.push_back(clientSuites[c].handle());
+         users_.push_back( std::make_pair(clientSuites[c].user(),handles) );
+      }
+   }
+}
+
+bool SClientHandleSuitesCmd::equals(ServerToClientCmd* rhs) const
+{
+   SClientHandleSuitesCmd* the_rhs = dynamic_cast<SClientHandleSuitesCmd*>(rhs);
+   if (!the_rhs) return false;
+   return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SClientHandleSuitesCmd::print(std::ostream& os) const
+{
+   os << "cmd:SClientHandleSuitesCmd ";
+   return os;
+}
+
+bool SClientHandleSuitesCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+   if (debug) std::cout << "SClientHandleSuitesCmd::handle_server_response\n";
+
+   if (server_reply.cli() && !cts_cmd->group_cmd()) {
+      /// This Could be part of a group command, hence ONLY if NOT group command
+
+      // print out:
+      // user  handle suites
+      // user1 1 s1 s2 s3
+      //       2 s1 s2
+      // user2 1 s1 s2 s3
+      //       2 s1 s2
+      for(size_t u = 0; u < users_.size(); u++) {
+         if (u == 0) {
+            cout << "\n";
+            cout << left << setw(10) << "User" << setw(6) << "handle" << "  suites\n";
+         }
+         cout << left << setw(10) << users_[u].first;
+         for(size_t h = 0; h < users_[u].second.size(); h++) {
+            unsigned int handle = users_[u].second[h];
+            for( size_t c = 0; c < client_handles_.size(); c++) {
+               if (handle == client_handles_[c].first) {
+                  if (h != 0) cout << "          "; // 10 spaces to align handles
+                  cout << right << setw(6) << handle << "  ";
+                  const std::vector<std::string>& suites = client_handles_[c].second;
+                  for(size_t i = 0; i < suites.size(); i++) { cout << suites[i] << "  "; }
+                  cout << "\n";
+               }
+            }
+         }
+      }
+   }
+   else {
+      server_reply.set_client_handle_suites(client_handles_);
+   }
+   return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SClientHandleSuitesCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SClientHandleSuitesCmd.hpp b/ecflow_4_0_7/Base/src/stc/SClientHandleSuitesCmd.hpp
new file mode 100644
index 0000000..57d5f95
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SClientHandleSuitesCmd.hpp
@@ -0,0 +1,47 @@
+#ifndef SCLIENT_HANDLE_SUITES_CMD_HPP_
+#define SCLIENT_HANDLE_SUITES_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+class AbstractServer;
+
+//================================================================================
+class SClientHandleSuitesCmd : public ServerToClientCmd {
+public:
+   SClientHandleSuitesCmd(AbstractServer* as );
+   SClientHandleSuitesCmd() : ServerToClientCmd() {}
+
+   void init(AbstractServer* as);
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+   virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+   std::vector<std::pair<std::string,  std::vector<unsigned int> > > users_;          // users , list of handles
+   std::vector<std::pair<unsigned int, std::vector<std::string> > >  client_handles_; // handle, list of suites
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & users_;
+      ar & client_handles_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SClientHandleSuitesCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SNewsCmd.cpp b/ecflow_4_0_7/Base/src/stc/SNewsCmd.cpp
new file mode 100644
index 0000000..076e9f6
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SNewsCmd.cpp
@@ -0,0 +1,262 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #31 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include "SNewsCmd.hpp"
+#include "Defs.hpp"
+#include "Ecf.hpp"
+#include "AbstractServer.hpp"
+#include "Log.hpp"
+
+using namespace std;
+using namespace ecf;
+
+/// Custom handling of command logging so that we can add additional debug.
+/// Rely's on CSyncCmd not adding newline when logging the command
+#define DEBUG_NEWS 1
+
+
+SNewsCmd::SNewsCmd( unsigned int client_handle,
+                    unsigned int client_state_change_no,
+                    unsigned int client_modify_change_no,
+                    AbstractServer* as)
+: news_(ServerReply::NO_NEWS)
+{
+   init(client_handle,client_state_change_no,client_modify_change_no,as);
+}
+
+/// Called in the server
+void SNewsCmd::init(
+		unsigned int client_handle, // a reference to a set of suites used by client
+		unsigned int client_state_change_no,
+		unsigned int client_modify_change_no, AbstractServer* as)
+{
+	news_ = ServerReply::NO_NEWS;
+
+	// After ECFLOW-182 server will always have a defs, hence we should never return ServerReply::NO_DEFS
+	// However keep as an enum, to allow new client(ecflowview) deal with reply from old server
+	//   defs_ptr server_defs = as->defs();
+	//   if ( ! server_defs.get() ) {
+	//
+	//      news_ = ServerReply::NO_DEFS;
+	//#if DEBUG_NEWS
+	//      log_append(" [:NO_DEFS]");
+	//#else
+	//      log_append("");
+	//#endif
+	//      return;
+	//   }
+
+
+ 	// =====================================================================================
+ 	// The code to determine changes here must also relate to SSyncCmd
+ 	// ======================================================================================
+
+	if (client_handle == 0) {
+
+		// Here Ecf::modify_change_no() and  Ecf::state_change_no() represent the max change numbers over *all* the suites
+
+	   /// *** The client_modify_change_no and client_state_change_no should always be trailing the server
+	   /// *** i.e the value should be less or equal to server. However if::
+	   /// ***   o/ Server **dies** we can get the case, where client numbers are greater than server numbers.
+	   /// ***   o/ Server changes number overflows, since it unsigned, and re-start's with 0
+	   /// *** When no handle are involved, we can get by with a full sync
+	   /// *** Note: whenever the server starts, the state and modify numbers start from zero
+	   if ( (client_modify_change_no > Ecf::modify_change_no()) || (client_state_change_no > Ecf::state_change_no())) {
+
+         news_ = ServerReply::DO_FULL_SYNC;
+
+#if DEBUG_NEWS
+	      std::stringstream ss;
+	      ss << " [server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no() << ") : client no > server no ! :DO_FULL_SYNC]";
+	      log_append(ss.str());
+#else
+	      log_append("");
+#endif
+         return;
+	   }
+
+		if ( client_modify_change_no < Ecf::modify_change_no()) {
+
+		   news_ = ServerReply::NEWS;
+
+#if DEBUG_NEWS
+         std::stringstream ss;
+         ss << " [server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no() << ") : *Large* scale changes :NEWS]";
+         log_append(ss.str());
+#else
+         log_append("");
+#endif
+			return;
+		}
+
+		if ( client_state_change_no < Ecf::state_change_no() ) {
+
+		   news_ = ServerReply::NEWS;
+
+#if DEBUG_NEWS
+         std::stringstream ss;
+         ss << " [server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no() << ") : *Small* scale changes :NEWS]";
+         log_append( ss.str());
+#else
+         log_append("");
+#endif
+         return;
+		}
+
+
+#if DEBUG_NEWS
+   log_append(" [:NO_NEWS]");
+#else
+   log_append("");
+#endif
+		return;
+	}
+
+	// =============================================================================================
+	// Handle used: Determine the max modify and state change no, for suites in our handle
+	// =============================================================================================
+
+	/// *** If we can't find the handle, then it may be that the server died ?
+	/// *** It is up to the client to do a full sync *including* re-registering suites
+	ClientSuiteMgr& client_suite_mgr = as->defs()->client_suite_mgr();
+	if ( ! client_suite_mgr.valid_handle(client_handle)) {
+
+	   news_ = ServerReply::DO_FULL_SYNC;
+
+#if DEBUG_NEWS
+      std::stringstream ss;
+      ss << " [server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no() << ") : Can not find handle(" << client_handle << ") :DO_FULL_SYNC]";
+      log_append(ss.str());
+#else
+      log_append("");
+#endif
+
+	   return;
+	}
+
+	/// *** The client_modify_change_no and client_state_change_no should always be trailing the server
+	/// *** i.e the value should be less or equal to server. However if
+   /// ***   o/ Server **dies** we can get the case, where client numbers are greater than server numbers.
+   /// ***   o/ Server changes number overflows, since it unsigned, and re-start's with 0
+	/// *** we can get the case, where client numbers are greater than server numbers and also the
+	/// *** handle will not exist in the server,
+	/// *** It is up to the client to do a full sync *including* re-registering suites
+	/// *** Note: whenever the server starts, the state and modify numbers start from zero
+	unsigned int max_client_handle_modify_change_no = 0;
+	unsigned int max_client_handle_state_change_no = 0;
+	client_suite_mgr.max_change_no( client_handle,max_client_handle_state_change_no,max_client_handle_modify_change_no);
+
+	if ((client_modify_change_no > max_client_handle_modify_change_no) || (client_state_change_no > max_client_handle_state_change_no)) {
+
+	   news_ = ServerReply::DO_FULL_SYNC;
+
+#if DEBUG_NEWS
+      std::stringstream ss;
+      ss << " [server handle(" << max_client_handle_state_change_no << ","
+         << max_client_handle_modify_change_no << ")  server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no()
+         << ") : client no > server no ! :DO_FULL_SYNC]";
+      log_append(ss.str());
+#else
+      log_append("");
+#endif
+
+	   return;
+	}
+
+	/// Changes where user adds a new handle/auto adds/removes require a full update, but only for changed handle
+	if (client_suite_mgr.handle_changed( client_handle )) {
+
+	   news_ = ServerReply::NEWS;
+
+#if DEBUG_NEWS
+      std::stringstream ss;
+      ss << " [server handle(" << max_client_handle_state_change_no << ","
+         << max_client_handle_modify_change_no << ") server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no()
+         << ") : *Large* scale changes (new handle or suites added or removed) :NEWS]";
+      log_append(ss.str());
+#else
+      log_append("");
+#endif
+
+	   return;
+	}
+
+	// The client handle represents a subset of the suites.
+	if ( client_modify_change_no < max_client_handle_modify_change_no) {
+
+  	   news_ = ServerReply::NEWS;
+
+#if DEBUG_NEWS
+      std::stringstream ss;
+      ss << " [server handle(" << max_client_handle_state_change_no << ","
+         << max_client_handle_modify_change_no << ") server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no()
+         << ") : *Large* scale changes :NEWS]";
+      log_append( ss.str());
+#else
+      log_append("");
+#endif
+
+	   return;
+	}
+
+	// This should also reflect changes made just to the defs(state/suspended) and also the server state
+	if ( client_state_change_no < max_client_handle_state_change_no ) {
+
+	   news_ = ServerReply::NEWS;
+
+#if DEBUG_NEWS
+      std::stringstream ss;
+      ss << " [server handle(" << max_client_handle_state_change_no << ","
+         << max_client_handle_modify_change_no << ") server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no()
+         << ") : *Small* scale changes :NEWS]";
+      log_append(ss.str());
+#else
+      log_append("");
+#endif
+
+      return;
+	}
+
+#if DEBUG_NEWS
+   log_append(" [:NO_NEWS]");
+#else
+   log_append("");
+#endif
+}
+
+
+/// Called in the client
+bool SNewsCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr /*cts_cmd*/, bool debug ) const
+{
+	if (debug) std::cout << "SNewsCmd::handle_server_response news_ = " << news_ << "\n";
+	server_reply.set_news( news_);
+	return true;
+}
+
+bool SNewsCmd::equals(ServerToClientCmd* rhs) const
+{
+	SNewsCmd* the_rhs = dynamic_cast<SNewsCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (news_ != the_rhs->news()) return false;
+	return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SNewsCmd::print(std::ostream& os) const
+{
+	os << "cmd:SNewsCmd [ " << news_ << " ] ";
+ 	return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const SNewsCmd& c)  { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SNewsCmd.hpp b/ecflow_4_0_7/Base/src/stc/SNewsCmd.hpp
new file mode 100644
index 0000000..e33dd99
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SNewsCmd.hpp
@@ -0,0 +1,63 @@
+#ifndef SNEWS_CMD_HPP_
+#define SNEWS_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : class SNewsCmd:  Used to determine any change in the server
+//
+// The *client_state_change_no* was passed from the client to the server
+// The *client_modify_change_no* was passed from the client to the server
+//
+// The code here needs to coordinate with SSyncCmd
+//
+// Paired with CtsCmd(NEWS)
+// Client---CtsCmd(NEWS)---->Server-----(SNewsCmd)--->client:
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+
+class SNewsCmd : public ServerToClientCmd {
+public:
+   // The constructor is *called* in the server.
+   SNewsCmd(unsigned int client_handle, // a reference to a set of suites used by client
+            unsigned int client_state_change_no,
+            unsigned int client_modify_change_no,
+            AbstractServer* as);
+   SNewsCmd() : ServerToClientCmd(), news_(ServerReply::NO_NEWS) {}
+
+   void init(unsigned int client_handle, // a reference to a set of suites used by client
+            unsigned int client_state_change_no,
+            unsigned int client_modify_change_no,
+            AbstractServer* as);
+
+   ServerReply::News_t news() const { return news_;} // used by equals only
+   bool get_news() const { return ( news_ != ServerReply::NO_NEWS); }
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+   virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+   // After ECFLOW-182, ServerReply::NO_DEFS no longer used, however kept, to ensure client/server compatibility
+   // ie. for new client(viewer) must process this from old server, which could return NO_DEFS
+   ServerReply::News_t news_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & news_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SNewsCmd&);
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SNodeCmd.cpp b/ecflow_4_0_7/Base/src/stc/SNodeCmd.cpp
new file mode 100644
index 0000000..98ace43
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SNodeCmd.cpp
@@ -0,0 +1,144 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Cmd
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+
+#include "SNodeCmd.hpp"
+#include "ClientToServerCmd.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Alias.hpp"
+#include "AbstractServer.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace boost;
+
+//=====================================================================================
+// This command returns the requested node back to the client
+// Note: In the case where defs has not been loaded, it can be NULL
+
+SNodeCmd::SNodeCmd(AbstractServer* as,node_ptr node)
+{
+   init(as,node);
+}
+
+void SNodeCmd::init(AbstractServer* as, node_ptr node)
+{
+   suite_.reset();
+   family_.reset();
+   task_.reset();
+   alias_.reset();
+
+   if (node.get()) {
+      if (node->isSuite()) {
+         suite_ = boost::dynamic_pointer_cast<Suite>(node);
+      }
+      else if (node->isFamily()) {
+         family_ = boost::dynamic_pointer_cast<Family>(node);
+      }
+      else if (node->isTask()) {
+         task_ = boost::dynamic_pointer_cast<Task>(node);
+      }
+      else if (node->isAlias()) {
+         alias_ = boost::dynamic_pointer_cast<Alias>(node);
+      }
+   }
+}
+
+node_ptr SNodeCmd::get_node_ptr() const
+{
+   if (suite_.get()) {
+      return boost::dynamic_pointer_cast<Node>(suite_);
+   }
+   else if (family_.get()) {
+      return boost::dynamic_pointer_cast<Node>(family_);
+   }
+   else if (task_.get()) {
+      return boost::dynamic_pointer_cast<Node>(task_);
+   }
+   else if (alias_.get()) {
+      return boost::dynamic_pointer_cast<Node>(alias_);
+   }
+   return node_ptr();
+}
+
+bool SNodeCmd::equals(ServerToClientCmd* rhs) const
+{
+   SNodeCmd* the_rhs = dynamic_cast<SNodeCmd*>(rhs);
+   if (!the_rhs) return false;
+   if (!ServerToClientCmd::equals(rhs)) return false;
+   return true;
+}
+
+std::ostream& SNodeCmd::print(std::ostream& os) const
+{
+   os << "cmd:SNodeCmd [ ";
+   node_ptr node = get_node_ptr();
+   if (node.get()) os << node->absNodePath();
+   else       os << "node == NULL";
+   os << " ]";
+   return os;
+}
+
+// Called in client
+bool SNodeCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd,  bool debug ) const
+{
+   if (debug) std::cout << "SNodeCmd::handle_server_response\n";
+
+   node_ptr node = get_node_ptr();
+   if ( !node.get() ) {
+      std::stringstream ss;
+      ss << "SNodeCmd::handle_server_response: Error Node could not be retrieved from server. Request "; cts_cmd->print(ss); ss << " failed.\n";
+      throw std::runtime_error(ss.str());
+   }
+
+
+   if (server_reply.cli() && !cts_cmd->group_cmd()) {
+      /// This Could be part of a group command, hence ONLY show Node if NOT group command
+      PrintStyle style(cts_cmd->show_style());
+
+      Suite* suite = node->isSuite();
+      if (suite) {
+         if (cts_cmd->show_style() != PrintStyle::MIGRATE) {
+            /// Auto generate externs, before writing to standard out. This can be expensive since
+            /// All the trigger references need to to be resolved. & AST need to be created first
+            /// The old spirit based parsing, horrendously, slow. Can't use Spirit QI, till IBM pull support it
+            ///
+            /// We need a fabricate a defs to show the externs, used by the suite
+            Defs defs;
+            defs.addSuite(boost::dynamic_pointer_cast<Suite>( node ));
+            defs.auto_add_externs();
+            std::cout << defs;
+            return true;
+         }
+         std::cout << *suite << "\n";
+         return true;
+      }
+      Family* fam = node->isFamily();
+      if (fam) std::cout << *fam << "\n";
+      Task* task = node->isTask();
+      if (task) std::cout << *task << "\n";
+      Alias* alias = node->isAlias();
+      if (alias) std::cout << *alias << "\n";
+   }
+   else {
+      server_reply.set_client_node( node );
+   }
+   return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SNodeCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SNodeCmd.hpp b/ecflow_4_0_7/Base/src/stc/SNodeCmd.hpp
new file mode 100644
index 0000000..ac57463
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SNodeCmd.hpp
@@ -0,0 +1,58 @@
+#ifndef SNODE_CMD_HPP_
+#define SNODE_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+class AbstractServer;
+
+//================================================================================
+// Paired with CtsNodeCmd(Get)
+// Client---CtsNodeCmd(GET)---->Server-----(SNodeCmd | SNodeCmd)--->client:
+//================================================================================
+class SNodeCmd : public ServerToClientCmd {
+public:
+   SNodeCmd(AbstractServer* as,node_ptr node);
+   SNodeCmd() {}
+
+   void init(AbstractServer* as, node_ptr node);
+
+   virtual bool handle_server_response( ServerReply&, Cmd_ptr cts_cmd, bool debug ) const;
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+   virtual bool hasNode() const { return true; }             /// used by group command
+
+private:
+   node_ptr get_node_ptr() const;
+
+   suite_ptr suite_;
+   family_ptr family_;
+   task_ptr task_;
+   alias_ptr alias_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & suite_;
+      ar & family_;
+      ar & task_;
+      ar & alias_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SNodeCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SServerLoadCmd.cpp b/ecflow_4_0_7/Base/src/stc/SServerLoadCmd.cpp
new file mode 100644
index 0000000..29c5cbe
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SServerLoadCmd.cpp
@@ -0,0 +1,45 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include "SServerLoadCmd.hpp"
+#include "Gnuplot.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+bool SServerLoadCmd::equals(ServerToClientCmd* rhs) const
+{
+   SServerLoadCmd* the_rhs = dynamic_cast<SServerLoadCmd*>(rhs);
+   if (!the_rhs) return false;
+   if (log_file_path_ != the_rhs->log_file_path()) return false;
+   return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SServerLoadCmd::print(std::ostream& os) const
+{
+   os << "cmd:SServerLoadCmd [ " << log_file_path_ << " ]";
+   return os;
+}
+
+bool SServerLoadCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+   if (debug) cout << "SServerLoadCmd::handle_server_response log_file_path = " << log_file_path() << "\n";
+   Gnuplot::show_server_load(log_file_path());
+   return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SServerLoadCmd& c)      { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SServerLoadCmd.hpp b/ecflow_4_0_7/Base/src/stc/SServerLoadCmd.hpp
new file mode 100644
index 0000000..a1d08a7
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SServerLoadCmd.hpp
@@ -0,0 +1,48 @@
+#ifndef SSERVER_LOAD_CMD_HPP_
+#define SSERVER_LOAD_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+
+///================================================================================
+/// Paired with CtsCmd::SERVER_LOAD
+/// Client---(CtsCmd::SERVER_LOAD)---->Server-----(SServerLoadCmd)--->client:
+///================================================================================
+class SServerLoadCmd : public ServerToClientCmd {
+public:
+   SServerLoadCmd(const std::string& log_file_path) : log_file_path_(log_file_path) {}
+   SServerLoadCmd() : ServerToClientCmd() {}
+
+   void init(const std::string& s) { log_file_path_ = s;}
+   const std::string& log_file_path() const { return log_file_path_; }
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+   virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+   std::string log_file_path_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & log_file_path_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SServerLoadCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SStatsCmd.cpp b/ecflow_4_0_7/Base/src/stc/SStatsCmd.cpp
new file mode 100644
index 0000000..d31f09e
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SStatsCmd.cpp
@@ -0,0 +1,57 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "SStatsCmd.hpp"
+#include "AbstractServer.hpp"
+#include "Defs.hpp"
+
+using namespace std;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+SStatsCmd::SStatsCmd(AbstractServer* as )
+{
+	init(as);
+}
+
+void SStatsCmd::init(AbstractServer* as)
+{
+   as->stats().update_for_serialisation();
+	stats_ = as->stats();
+ 	stats_.no_of_suites_ = as->defs()->suiteVec().size();
+}
+
+bool SStatsCmd::equals(ServerToClientCmd* rhs) const
+{
+	SStatsCmd* the_rhs = dynamic_cast<SStatsCmd*>(rhs);
+	if (!the_rhs) return false;
+	return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SStatsCmd::print(std::ostream& os) const
+{
+	os << "cmd:SStatsCmd ";
+	return os;
+}
+
+bool SStatsCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr /*cts_cmd*/, bool debug ) const
+{
+	if (debug) std::cout << "SStatsCmd::handle_server_response\n";
+   if (server_reply.cli())  stats_.show();
+   else server_reply.set_stats( stats_ );
+	return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SStatsCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SStatsCmd.hpp b/ecflow_4_0_7/Base/src/stc/SStatsCmd.hpp
new file mode 100644
index 0000000..fa2017a
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SStatsCmd.hpp
@@ -0,0 +1,50 @@
+#ifndef SSTATS_CMD_HPP_
+#define SSTATS_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+#include "Stats.hpp"
+class AbstractServer;
+
+//================================================================================
+// Paired with CtsCmd(STATS)
+// Client---(CtsCmd(STATS))---->Server-----(SStatsCmd)--->client:
+//================================================================================
+class SStatsCmd : public ServerToClientCmd {
+public:
+	SStatsCmd(AbstractServer* as );
+	SStatsCmd() : ServerToClientCmd() {}
+
+	void init(AbstractServer* as);
+
+	virtual std::ostream& print(std::ostream& os) const;
+	virtual bool equals(ServerToClientCmd*) const;
+	virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+ 	Stats stats_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+ 		ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+ 		ar & stats_;
+  	}
+};
+
+std::ostream& operator<<(std::ostream& os, const SStatsCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SStringCmd.cpp b/ecflow_4_0_7/Base/src/stc/SStringCmd.cpp
new file mode 100644
index 0000000..6b9525b
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SStringCmd.cpp
@@ -0,0 +1,46 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include "SStringCmd.hpp"
+
+using namespace std;
+using namespace boost;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool SStringCmd::equals(ServerToClientCmd* rhs) const
+{
+	SStringCmd* the_rhs = dynamic_cast<SStringCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (str_ != the_rhs->get_string()) return false;
+	return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SStringCmd::print(std::ostream& os) const
+{
+	os << "cmd:SStringCmd ";
+	return os;
+}
+
+bool SStringCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+	if (debug) cout << "SStringCmd::handle_server_response str.size()= " << str_.size() << "\n";
+	if (server_reply.cli())  std::cout << str_ << "\n";
+	else server_reply.set_string( str_ );
+	return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SStringCmd& c)      { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SStringCmd.hpp b/ecflow_4_0_7/Base/src/stc/SStringCmd.hpp
new file mode 100644
index 0000000..56bc215
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SStringCmd.hpp
@@ -0,0 +1,54 @@
+#ifndef SSTRING_CMD_HPP_
+#define SSTRING_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+
+///================================================================================
+/// Paired with CFileCmd
+/// Client---(CFileCmd)---->Server-----(SStringCmd)--->client:
+/// Only valid when the clients request a CFileCmd *OR* Log file
+/// Other times this will be empty.
+/// CFileCmd:: The file Contents(script,job,jobout,manual)
+/// 	Can be potentially very large
+/// LogCmd: The log file Can be potentially very large
+///     Only really valid if the out bound request was a LogCmd(LogCmd::GET)
+///================================================================================
+class SStringCmd : public ServerToClientCmd {
+public:
+   SStringCmd(const std::string& s) : str_(s) {}
+   SStringCmd() : ServerToClientCmd() {}
+
+   void init(const std::string& s) { str_ = s;}
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+   virtual const std::string& get_string() const { return str_;} // used by group command
+   virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+   std::string str_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & str_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SStringCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SStringVecCmd.cpp b/ecflow_4_0_7/Base/src/stc/SStringVecCmd.cpp
new file mode 100644
index 0000000..6e3efd9
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SStringVecCmd.cpp
@@ -0,0 +1,50 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include "SStringVecCmd.hpp"
+
+using namespace std;
+using namespace boost;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool SStringVecCmd::equals(ServerToClientCmd* rhs) const
+{
+   SStringVecCmd* the_rhs = dynamic_cast<SStringVecCmd*>(rhs);
+   if (!the_rhs) return false;
+   if (vec_ != the_rhs->get_string_vec()) return false;
+   return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SStringVecCmd::print(std::ostream& os) const
+{
+   os << "cmd:SStringVecCmd ";
+   return os;
+}
+
+bool SStringVecCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+   if (debug) cout << "SStringVecCmd::handle_server_response str.size()= " << vec_.size() << "\n";
+   if (server_reply.cli())  {
+      for(size_t i = 0; i < vec_.size(); i++) {
+         std::cout << vec_[i] << "\n";
+      }
+   }
+   else server_reply.set_string_vec( vec_ );
+   return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SStringVecCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SStringVecCmd.hpp b/ecflow_4_0_7/Base/src/stc/SStringVecCmd.hpp
new file mode 100644
index 0000000..b9b092e
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SStringVecCmd.hpp
@@ -0,0 +1,46 @@
+#ifndef SSTRING_VEC_CMD_HPP_
+#define SSTRING_VEC_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+
+///================================================================================
+class SStringVecCmd : public ServerToClientCmd {
+public:
+   SStringVecCmd(const std::vector<std::string>& s) : vec_(s) {}
+   SStringVecCmd() : ServerToClientCmd() {}
+
+   void init(const std::vector<std::string>& s) { vec_ = s;}
+   const std::vector<std::string>& get_string_vec() const { return vec_;}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+   virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+   std::vector<std::string> vec_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & vec_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SStringVecCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SSuitesCmd.cpp b/ecflow_4_0_7/Base/src/stc/SSuitesCmd.cpp
new file mode 100644
index 0000000..ec312e6
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SSuitesCmd.cpp
@@ -0,0 +1,86 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "SSuitesCmd.hpp"
+#include "AbstractServer.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "ClientSuiteMgr.hpp"
+#include "ClientToServerCmd.hpp"
+
+using namespace std;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+SSuitesCmd::SSuitesCmd(AbstractServer* as )
+{
+	init(as);
+}
+
+void SSuitesCmd::init(AbstractServer* as)
+{
+	// This command can be re-used hence clear existing data members
+	suites_.clear();
+
+	const std::vector<suite_ptr>& suiteVec = as->defs()->suiteVec();
+	size_t suite_vec_size = suiteVec.size();
+ 	suites_.reserve(suite_vec_size);
+	for(size_t i = 0; i < suite_vec_size; i++) {
+		suites_.push_back( suiteVec[i]->name() );
+ 	}
+}
+
+bool SSuitesCmd::equals(ServerToClientCmd* rhs) const
+{
+	SSuitesCmd* the_rhs = dynamic_cast<SSuitesCmd*>(rhs);
+	if (!the_rhs) return false;
+ 	return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SSuitesCmd::print(std::ostream& os) const
+{
+	os << "cmd:SSuitesCmd ";
+	return os;
+}
+
+bool SSuitesCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+	if (debug) std::cout << "SSuitesCmd::handle_server_response\n";
+
+	if (server_reply.cli() && !cts_cmd->group_cmd()) {
+	   /// This Could be part of a group command, hence ONLY if NOT group command
+
+	   if (suites_.empty()) {
+	      cout << "No suites\n";
+	   }
+
+	   int newline_at = 4;
+	   size_t the_size = suites_.size();
+	   for(size_t i = 0; i < the_size; i++) {
+	      cout << left << setw(20) << suites_[i];
+	      if (i != 0 && (i % newline_at) == 0) {
+	         cout << "\n";
+	         newline_at += 5;
+	      }
+	   }
+	   cout << "\n";
+	}
+	else {
+      server_reply.set_string_vec(suites_);
+	}
+	return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const SSuitesCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SSuitesCmd.hpp b/ecflow_4_0_7/Base/src/stc/SSuitesCmd.hpp
new file mode 100644
index 0000000..e73095e
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SSuitesCmd.hpp
@@ -0,0 +1,48 @@
+#ifndef SSUITES_CMD_HPP_
+#define SSUITES_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+class AbstractServer;
+
+//================================================================================
+// Paired with CtsCmd(SUITES)
+// Client---(CtsCmd(SUITES))---->Server-----(SSuitesCmd)--->client:
+//================================================================================
+class SSuitesCmd : public ServerToClientCmd {
+public:
+   SSuitesCmd(AbstractServer* as );
+   SSuitesCmd() : ServerToClientCmd() {}
+
+   void init(AbstractServer* as);
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+   virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+private:
+   std::vector<std::string> suites_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & suites_;
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SSuitesCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/SSyncCmd.cpp b/ecflow_4_0_7/Base/src/stc/SSyncCmd.cpp
new file mode 100644
index 0000000..40fa43c
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SSyncCmd.cpp
@@ -0,0 +1,466 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #55 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+
+#include "SSyncCmd.hpp"
+#include "Defs.hpp"
+#include "Ecf.hpp"
+#include "Log.hpp"
+#include "AbstractServer.hpp"
+#include "boost_archive.hpp" // collates boost archive includes
+
+using namespace std;
+using namespace boost;
+
+// =====================================================================================================
+//#define DEBUG_SERVER_SYNC 1
+//#define DEBUG_CLIENT_SYNC 1
+
+// ===========================================================================================
+// CACHE: the deserialization costs, so that if multiple clients request the full defs
+//        we can improve the performance, by only performing that once for each state change.
+std::string FullServerDefsCache::full_server_defs_as_string_ = "";
+unsigned int FullServerDefsCache::state_change_no_ = 0;
+unsigned int FullServerDefsCache::modify_change_no_= 0;
+
+void FullServerDefsCache::update_cache_if_state_changed(defs_ptr defs)
+{
+   // See if there was a state change *OR* if cache is empty
+   if (state_change_no_ != Ecf::state_change_no() ||
+       modify_change_no_ != Ecf::modify_change_no() ||
+       full_server_defs_as_string_.empty()
+      )
+   {
+      try {
+#ifdef DEBUG_SERVER_SYNC
+         cout << ": *updating* cache";
+#endif
+         // Update cache
+         std::ostringstream archive_stream;
+
+#if defined(BINARY_ARCHIVE)
+         boost::archive::binary_oarchive archive( archive_stream );
+         archive << defs;
+         full_server_defs_as_string_ = archive_stream.str();
+         // std::cout << "async_write BINARY " << outbound_data_ << "\n";
+
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+         portable_binary_oarchive archive( archive_stream );
+         archive << defs;
+         full_server_defs_as_string_ = archive_stream.str();
+         // std::cout << "async_write PORTABLE_BINARY " << outbound_data_ << "\n";
+
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+         eos::portable_oarchive archive( archive_stream );
+         archive << defs;
+         full_server_defs_as_string_ = archive_stream.str();
+         // std::cout << "async_write EOS_PORTABLE_BINARY " << outbound_data_ << "\n";
+#else
+         boost::archive::text_oarchive archive( archive_stream );
+         archive << defs;
+         full_server_defs_as_string_ = archive_stream.str();
+         // std::cout << "async_write TEXT " << outbound_data_ << "\n";
+#endif
+      }
+      catch (const boost::archive::archive_exception& ae ) {
+         // Unable to decode data. Something went wrong, inform the caller.
+         ecf::LogToCout logToCout;
+         LOG(ecf::Log::ERR,"FullServerDefsCache::update_cache_if_state_changed boost::archive::archive_exception " << ae.what());
+         throw;
+      }
+
+      state_change_no_ = Ecf::state_change_no();
+      modify_change_no_ =  Ecf::modify_change_no();
+   }
+#ifdef DEBUG_SERVER_SYNC
+   else {
+      cout << ": *cache* up to date";
+   }
+#endif
+}
+
+defs_ptr FullServerDefsCache::restore_defs_from_string(const std::string& archive_data)
+{
+#ifdef DEBUG_CLIENT_SYNC
+   cout << ": FullServerDefsCache::restore_defs_from_string: archive_data.size(" << archive_data.size() << ")";
+#endif
+   defs_ptr defs;
+   try {
+      std::istringstream archive_stream(archive_data);
+
+#if defined(BINARY_ARCHIVE)
+      // std::cout << "handle_read_data Archive BINARY\n";
+      boost::archive::binary_iarchive archive( archive_stream );
+      archive >> defs;
+
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+      // std::cout << "handle_read_data Archive PORTABLE_BINARY\n";
+      portable_binary_iarchive archive( archive_stream );
+      archive >> defs;
+
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+      // std::cout << "handle_read_data Archive EOS_PORTABLE_BINARY\n";
+      eos::portable_iarchive archive( archive_stream );
+      archive >> defs;
+
+#else
+       // std::cout << "handle_read_data Archive TEXT\n";
+      boost::archive::text_iarchive archive( archive_stream );
+      archive >> defs;
+#endif
+   } catch (const boost::archive::archive_exception& ae ) {
+      // Unable to decode data.
+      ecf::LogToCout logToCout;
+      LOG(ecf::Log::ERR,"FullServerDefsCache::restore_defs_from_string: boost::archive::archive_exception " << ae.what());
+      throw;
+   } catch (std::exception& e) {
+      // Unable to decode data.
+      ecf::LogToCout logToCout;
+      LOG(ecf::Log::ERR,"FullServerDefsCache::restore_defs_from_string " << e.what());
+      throw;
+   }
+
+#ifdef DEBUG_CLIENT_SYNC
+   if (defs.get()) cout << ": valid defs";
+   else            cout << ": *empty* defs?";
+#endif
+   return defs;
+}
+
+defs_ptr FullServerDefsCache::restore_defs_from_string()
+{
+   // Used in Test when no client/server
+   return restore_defs_from_string(full_server_defs_as_string_);
+}
+
+
+SSyncCmd::SSyncCmd(
+         unsigned int client_handle,
+         unsigned int client_state_change_no,
+         unsigned int client_modify_change_no,
+         AbstractServer* as
+)
+: full_defs_(false),no_defs_(false),
+  incremental_changes_(client_state_change_no)
+{
+   init(client_handle, client_state_change_no, client_modify_change_no, false, as);
+}
+
+void SSyncCmd::reset_data_members(unsigned int client_state_change_no)
+{
+   full_defs_ = false;
+   no_defs_ = false;
+   incremental_changes_.init(client_state_change_no); // persisted, used for returning INCREMENTAL changes
+   server_defs_ = defs_ptr();                         // persisted, used for returning FULL definition
+   full_server_defs_as_string_.clear();               // semi-persisted, i.e on load & not on saving
+}
+
+void SSyncCmd::init(
+   unsigned int    client_handle,           // a reference to a set of suites used by client
+   unsigned int    client_state_change_no,
+   unsigned int    client_modify_change_no,
+   bool            do_full_sync,
+   AbstractServer* as
+)
+{
+   // ********************************************************
+   // This is called in the server
+   // ********************************************************
+#ifdef DEBUG_SERVER_SYNC
+      cout << "SSyncCmd::init: client(" << client_state_change_no << "," << client_modify_change_no << ") server(" << Ecf::state_change_no() << "," << Ecf::modify_change_no() << ")";
+#endif
+
+   // Reset all data members since this command can be re-used
+   reset_data_members(client_state_change_no);
+
+   // After ECFLOW-182 server will always have a defs, hence we should never return ServerReply::NO_DEFS
+   // We have kept no_defs_ to allow compatibility. To allow new client(ecflowview) deal with reply from old server
+   // Hence from release >= 4.0.7 no_defs_ will always be false
+   //   if ( ! as->defs().get() ) {
+   //#ifdef DEBUG_SERVER_SYNC
+   //      cout << ": *NO* defs\n";
+   //#endif
+   //      no_defs_ = true;
+   //      return;
+   //   }
+
+   // explicit request
+   if (do_full_sync) {
+#ifdef DEBUG_SERVER_SYNC
+      cout << ": *Flag do_full_sync set* ";
+#endif
+      full_sync(client_handle,as);
+      return;
+   }
+
+   if (client_handle == 0) {
+#ifdef DEBUG_SERVER_SYNC
+      cout << ": No *handle* ";
+#endif
+
+      /// *** The client_modify_change_no and client_state_change_no should always be trailing the server
+      /// *** i.e the value should be less or equal to server. However if the server **dies** we can
+      /// *** get the case, where client numbers are greater than server numbers.
+      /// *** When no handle are involved, we get by with a full sync
+      /// *** Note: whenever the server starts, the state and modify numbers start from zero
+      if ( client_modify_change_no > Ecf::modify_change_no() || client_state_change_no > Ecf::state_change_no()) {
+#ifdef DEBUG_SERVER_SYNC
+         cout << ": client modify no > server modify no: Server died/restored? ";
+#endif
+         full_sync(client_handle,as);
+         return;
+      }
+
+      if ( client_modify_change_no < Ecf::modify_change_no()) {
+#ifdef DEBUG_SERVER_SYNC
+         cout << ": *Large* scale changes: modify numbers not in sync ";
+#endif
+         full_sync(client_handle,as);
+         return;
+      }
+
+      // small scale changes. Collate changes over *defs* and all suites.
+      // Suite stores the maximum state change, over *all* its children, this is used by client handle mechanism
+      // and here to avoid traversing down the hierarchy.
+      // ******** We must trap all child changes under the suite. See class SuiteChanged
+      // ******** otherwise some attribute sync's will be missed
+      as->defs()->collateChanges(client_handle,incremental_changes_);
+      incremental_changes_.set_server_state_change_no(Ecf::state_change_no());
+      incremental_changes_.set_server_modify_change_no(Ecf::modify_change_no());
+#ifdef DEBUG_SERVER_SYNC
+      if (incremental_changes_.size()) cout << ":*small* scale changes: no of changes(" << incremental_changes_.size() << ")\n";
+      else cout << ": *No changes*\n";
+#endif
+      return;
+   }
+
+
+   //==========================================================================================
+   // Handle used
+   //==========================================================================================
+   ClientSuiteMgr& client_suite_mgr = as->defs()->client_suite_mgr();
+#ifdef DEBUG_SERVER_SYNC
+   cout << ": *handle* used " << client_handle << " : ";
+   std::vector<string> suites; client_suite_mgr.suites(client_handle,suites);
+   BOOST_FOREACH(const std::string& name, suites) { std::cout << name << " "; }
+#endif
+
+   /// *** The client_modify_change_no and client_state_change_no should always be trailing the server
+   /// *** i.e the value should be less or equal to server. However if the server **dies** we can
+   /// *** get the case, where client numbers are greater than server numbers. In this case we do a full sync
+   /// *** It is up to the client to catch the exception. and do a full sync *including* re-registering suites
+   /// *** Note: whenever the server starts, the state and modify numbers start from zero
+   unsigned int max_client_handle_modify_change_no = 0;
+   unsigned int max_client_handle_state_change_no = 0;
+   client_suite_mgr.max_change_no( client_handle, max_client_handle_state_change_no,max_client_handle_modify_change_no);
+#ifdef DEBUG_SERVER_SYNC
+   cout << ": server_handle(" << max_client_handle_state_change_no << "," << max_client_handle_modify_change_no << ")";
+#endif
+
+
+   if (client_modify_change_no > max_client_handle_modify_change_no || client_state_change_no > max_client_handle_state_change_no) {
+#ifdef DEBUG_SERVER_SYNC
+      cout << ": client no > server no: Server died/restored?";
+#endif
+      full_sync(client_handle,as);
+      return;
+   }
+
+   if ( client_modify_change_no < max_client_handle_modify_change_no) {
+#ifdef DEBUG_SERVER_SYNC
+      cout << ": *Large* scale changes : modify numbers not in sync";
+#endif
+      full_sync(client_handle,as);
+      return;
+   }
+
+   if (client_suite_mgr.handle_changed( client_handle )) {
+      // *Large* scale handle changes, i.e. created handle/ added or removed suites
+#ifdef DEBUG_SERVER_SYNC
+   cout << ": *Large* scale changes: added/removed suites to handle";
+#endif
+      full_sync(client_handle,as);
+      return;
+   }
+
+   // small scale changes
+   as->defs()->collateChanges(client_handle,incremental_changes_);
+   incremental_changes_.set_server_state_change_no(max_client_handle_state_change_no);
+   incremental_changes_.set_server_modify_change_no(max_client_handle_modify_change_no);
+#ifdef DEBUG_SERVER_SYNC
+   if (incremental_changes_.size()) cout << ": *small* scale changes: no of changes(" << incremental_changes_.size() << ")\n";
+   else cout << ": *No changes*\n";
+#endif
+}
+
+
+void SSyncCmd::full_sync(unsigned int client_handle, AbstractServer* as)
+{
+   if ( 0 == client_handle ) {
+      // Have already checked for no defs.
+      as->defs()->set_state_change_no( Ecf::state_change_no() );
+      as->defs()->set_modify_change_no( Ecf::modify_change_no() );
+
+      FullServerDefsCache::update_cache_if_state_changed(as->defs());
+      full_defs_ = true;
+#ifdef DEBUG_SERVER_SYNC
+      cout << ": *no handle* returning FULL defs(*cached* string, size(" << FullServerDefsCache::full_server_defs_as_string_.size() << "))" << endl;
+#endif
+      return;
+   }
+
+
+#ifdef DEBUG_SERVER_SYNC
+   cout << ": returning handle based FULL defs";
+#endif
+   // Only return the defs state and suites that the client has registered in the client handle
+   // *HOWEVER* if the client has registered *ALL* the suites, just return the server defs
+   //           *with* the updated change numbers
+   //
+   // *OTHERWISE* this compute the **maximum** state and modify change numbers over
+   // the suites managed by the client handle and then set it on the newly created defs file.
+   // **** It also takes special precaution *NOT* to change Ecf::state_change_no() and Ecf::modify_change_no()
+   // **** so that we avoid changing max modify no for suites not in our handle
+   // **** Will clear the handle_changed flag
+   //
+   // **** Although we create a new defs, we use the same suites. This presents
+   // **** a problem with the suites defs() pointer. To avoid corrupting the server defs
+   // **** we set the suite defs ptr to the the real server defs.
+   // **** --> The defs serialisation will setup the suite defs pointers. <---
+   // **** An alternative would be to clone the entire suites, since this can have
+   // **** hundreds of tasks. It would be very expensive.
+   // **** This means that server_defs_ will fail invarint_checking before serialisation
+   defs_ptr the_server_defs = as->defs()->client_suite_mgr().create_defs( client_handle, as->defs() );
+   if ( the_server_defs.get() == as->defs().get()) {
+      FullServerDefsCache::update_cache_if_state_changed(as->defs());
+      full_defs_ = true;
+#ifdef DEBUG_SERVER_SYNC
+      cout << ": The handle has *ALL* the suites: return the FULL defs(*cached* string, size(" << FullServerDefsCache::full_server_defs_as_string_.size() << "))";
+#endif
+   }
+   else {
+      server_defs_ = the_server_defs;
+   }
+
+#ifdef DEBUG_SERVER_SYNC
+   if (server_defs_) cout << ": no of suites(" << server_defs_->suiteVec().size() << ")" << endl;
+   else              cout << ": NULL defs!" << endl;
+#endif
+}
+
+bool SSyncCmd::equals(ServerToClientCmd* rhs) const
+{
+   SSyncCmd* the_rhs = dynamic_cast<SSyncCmd*>(rhs);
+   if (!the_rhs) return false;
+   return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& SSyncCmd::print(std::ostream& os) const
+{
+   os << "cmd:SSyncCmd";
+   return os;
+}
+
+bool SSyncCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr /*cts_cmd*/, bool debug ) const
+{
+   // Update server_reply.client_defs_, with the changes returned from the server
+   do_sync( server_reply, debug );
+
+   return true;
+}
+
+bool SSyncCmd::do_sync( ServerReply& server_reply, bool debug) const
+{
+   // ****************************************************
+   // On the client side
+   // ****************************************************
+   if (no_defs_) {
+#ifdef DEBUG_CLIENT_SYNC
+      std::cout << "SSyncCmd::do_sync: No defs in the server. Reset client caches\n";
+#endif
+      if (debug) std::cout << "SSyncCmd::do_sync:: No defs in the server. Reset client caches\n";
+      server_reply.client_handle_ = 0;
+      server_reply.client_defs_ = defs_ptr();
+      server_reply.client_node_ = node_ptr();
+      server_reply.set_sync( true );
+      server_reply.set_full_sync( true );
+      return true;
+   }
+
+   if (server_defs_.get()) {
+       // *FULL* sync
+       // to keep pace with the state changes. Passed back later on, get further changes
+       // If non zero handle will contain suites specified in the client handle, including their max change numbers
+       server_reply.client_defs_ = server_defs_;
+       server_reply.set_sync( true );
+       server_reply.set_full_sync( true );
+       if (debug) cout << "SSyncCmd::do_sync::*FULL sync*, client side state/modify numbers(" << server_defs_->state_change_no() << "," << server_defs_->modify_change_no() << ")\n";
+#ifdef DEBUG_CLIENT_SYNC
+       cout << "SSyncCmd::do_sync: defs *FULL sync*, client side state/modify numbers(" << server_defs_->state_change_no() << "," << server_defs_->modify_change_no() << ")\n";
+#endif
+       return true;
+    }
+
+   if (full_defs_) {
+      if (full_server_defs_as_string_.empty()) {
+         // TEST path.(i.e no client server): re-use static string
+#ifdef DEBUG_CLIENT_SYNC
+       cout << "SSyncCmd::do_sync: TEST PATH: *FULL CACHE sync* : using static cache";
+#endif
+         server_reply.client_defs_ = FullServerDefsCache::restore_defs_from_string();
+      }
+      else {
+#ifdef DEBUG_CLIENT_SYNC
+       cout << "SSyncCmd::do_sync: *FULL CACHE sync* : using cache returned from server: cache_size(" << full_server_defs_as_string_.size() << ")";
+#endif
+         server_reply.client_defs_ = FullServerDefsCache::restore_defs_from_string(full_server_defs_as_string_);
+      }
+      server_reply.set_sync( true );
+      server_reply.set_full_sync( true );
+      if (debug) cout << "SSyncCmd::do_sync::*FULL CACHE sync*, client side state/modify numbers(" << server_reply.client_defs_->state_change_no() << "," << server_reply.client_defs_->modify_change_no() << ")\n";
+#ifdef DEBUG_CLIENT_SYNC
+      cout << ": client side state/modify numbers(" << server_reply.client_defs_->state_change_no() << "," << server_reply.client_defs_->modify_change_no() << ")\n";
+#endif
+      return true;
+   }
+
+   // Can only sync, *if* we have definition on the client side
+   if (server_reply.client_defs_.get() ) {
+      // *INCREMENTAL* sync
+      // Apply mementos to the client side defs, to bring in sync with server defs
+      // If *no* server loaded, then no changes applied
+      // Returns true if are any memento's, i.e. server changed.
+      server_reply.set_full_sync( false );
+      bool changes_made_to_client = incremental_changes_.incremental_sync(server_reply.client_defs_,server_reply.changed_nodes());
+      server_reply.set_sync( changes_made_to_client );
+
+      if (debug) cout << "SSyncCmd::do_sync::*INCREMENTAL sync*, client side state/modify numbers("
+                      << incremental_changes_.get_server_state_change_no() << ","
+                      << incremental_changes_.get_server_modify_change_no() << ") changes_made_to_client("
+                      << changes_made_to_client << ")\n";
+
+#ifdef DEBUG_CLIENT_SYNC
+      cout << "SSyncCmd::do_sync::*INCREMENTAL sync*, client side state/modify numbers("
+                            << incremental_changes_.get_server_state_change_no() << ","
+                            << incremental_changes_.get_server_modify_change_no() << ") changes_made_to_client("
+                            << changes_made_to_client << "), changed_node_paths("
+                            << server_reply.changed_nodes().size() << ")\n";
+#endif
+      return changes_made_to_client;
+   }
+   return false;
+}
+
+std::ostream& operator<<(std::ostream& os, const SSyncCmd& c)  { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/SSyncCmd.hpp b/ecflow_4_0_7/Base/src/stc/SSyncCmd.hpp
new file mode 100644
index 0000000..c474bfe
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/SSyncCmd.hpp
@@ -0,0 +1,160 @@
+#ifndef SSYNC_CMD_HPP_
+#define SSYNC_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #25 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+
+#include "ServerToClientCmd.hpp"
+#include "DefsDelta.hpp"
+
+//================================================================================
+// Cache the de-serialisation cost, in the *SERVER* when returning the FULL definition
+// When there are no state changes, we can just return the cache string for other clients
+// Thereby saving time in the server and client for de-serialisation.
+// Here we are trading memory for speed:
+//
+//  Current for each client request we have:
+//      client1:  --------------> get---------------> Server
+//                serialise---------<----de-serialize
+//
+//      client2:  --------------> get---------------> Server
+//                serialise---------<----de-serialize
+//
+//      client3:  --------------> get---------------> Server
+//                serialise---------<----de-serialize
+//
+// By caching the de-serialisation process, we can speed up the downloads.
+// However whenever there is a state change we need to update the cache
+//
+//      client1:  --------------> get---------------> Server
+//                serialise------<----de-serialisation
+//
+//      client2:  --------------> get---------------> Server
+//                serialise---------<----return cache
+//
+//      client3:  --------------> get---------------> Server
+//                serialise---------<----return cache
+//================================================================================
+class FullServerDefsCache : private boost::noncopyable {
+public:
+   // Server side
+   static void update_cache_if_state_changed(defs_ptr defs);
+
+   // Client side
+   static defs_ptr restore_defs_from_string(const std::string&);
+   static defs_ptr restore_defs_from_string(); // used in test
+
+private:
+   friend class SSyncCmd;
+
+   FullServerDefsCache();
+   ~FullServerDefsCache();
+   static std::string full_server_defs_as_string_;
+   static unsigned int state_change_no_;        // detect state change in defs across clients
+   static unsigned int modify_change_no_;       // detect state change in defs across clients
+};
+
+//================================================================================
+// class SSyncCmd: Used to transfer changes made in the server to the client
+//                 The client can then apply the changes to the client side defs.
+//
+// *** This class should be used in conjunction with the news command.
+// *** i.e The news command is used to test for server changes. This command
+// *** will then get those changes and merge them with client side defs, bringing
+// *** client and server defs in sync.
+//
+// The *client_state_change_no* was passed from the client to the server
+// The *client_modify_change_no* was passed from the client to the server
+//
+// This class make use of FullServerDefsCache as a performance optimisation.
+//================================================================================
+class SSyncCmd : public ServerToClientCmd {
+public:
+   // The constructor is *called* in the server.
+   // This will collate the incremental changes made so far relative to the client_state_change_no.
+   // For large scale change we use client_modify_change_no this will require a full update
+   // *THIS* constructor is used for *TEST* only
+   SSyncCmd(unsigned int client_handle,           // a reference to a set of suites used by client
+            unsigned int client_state_change_no,
+            unsigned int client_modify_change_no,
+            AbstractServer* as);
+
+   SSyncCmd() : ServerToClientCmd(), full_defs_(false), no_defs_(false), incremental_changes_(0) {}
+
+   virtual std::ostream& print(std::ostream& os) const;
+   virtual bool equals(ServerToClientCmd*) const;
+
+   // Client side functions:
+   virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+   /// do_sync() is invoked on the *client side*, Can throw std::runtime_error
+   /// Either does a *FULL* or *INCREMENTAL sync depending on the
+   /// changes in the server. Returns true if client defs changed.
+   bool do_sync( ServerReply& server_reply, bool debug = false) const;
+
+private:
+
+   friend class PreAllocatedReply;
+   void init(unsigned int client_handle,          // a reference to a set of suites used by client
+            unsigned int client_state_change_no,
+            unsigned int client_modify_change_no,
+            bool full_sync,
+            AbstractServer* as);
+
+   /// For use when doing a full sync
+   void init(unsigned int client_handle,AbstractServer* as);
+
+   void reset_data_members(unsigned int client_state_change_no);
+   void full_sync(unsigned int client_handle,AbstractServer* as);
+
+private:
+
+   bool      full_defs_;
+   bool      no_defs_;
+   DefsDelta incremental_changes_;
+   defs_ptr  server_defs_;         // for returning a subset of the suites
+   std::string full_server_defs_as_string_;
+
+   friend class boost::serialization::access;
+   template<class Archive>
+   void serialize( Archive & ar, const unsigned int /*version*/ ) {
+      ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+      ar & no_defs_;                 // inform user defs does not exist.
+      ar & full_defs_;               // returning full defs as a string
+      ar & incremental_changes_;     // state changes, small scale changes
+
+      /// When the server_defs_ was created the def's pointer on the suites was reset back to real server defs
+      /// This is not correct for server_defs_, since we use the *same* suites
+      /// **** This is OK since by default the Defs serialisation will fix up the suite's def's pointers ***
+      /// The alternative is to clone all the suites, which is very expensive
+      ar & server_defs_;  // large scale changes, if non zero handle, a small subset of the suites
+
+      // when full_defs_ is set server_defs_ will be empty.
+      if (Archive::is_saving::value) {
+         // Avoid copying the string. As this could be very large  > 60MB
+         if (full_defs_) {
+            ar & FullServerDefsCache::full_server_defs_as_string_;
+         }
+         else ar & full_server_defs_as_string_;
+      }
+      else {
+         ar & full_server_defs_as_string_;
+      }
+   }
+};
+
+std::ostream& operator<<(std::ostream& os, const SSyncCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/ServerToClientCmd.cpp b/ecflow_4_0_7/Base/src/stc/ServerToClientCmd.cpp
new file mode 100644
index 0000000..cb0a07e
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/ServerToClientCmd.cpp
@@ -0,0 +1,26 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+#include "Str.hpp"
+
+using namespace ecf;
+
+ServerToClientCmd::~ServerToClientCmd() {}
+
+const std::string& ServerToClientCmd::get_string() const
+{
+	return Str::EMPTY();
+}
diff --git a/ecflow_4_0_7/Base/src/stc/ServerToClientCmd.hpp b/ecflow_4_0_7/Base/src/stc/ServerToClientCmd.hpp
new file mode 100644
index 0000000..3f520a8
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/ServerToClientCmd.hpp
@@ -0,0 +1,62 @@
+#ifndef SERVER_TO_CLIENT_CMD_HPP_
+#define SERVER_TO_CLIENT_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #19 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <vector>
+
+#include <boost/serialization/base_object.hpp>      // base class serialization
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/assume_abstract.hpp>
+#include <boost/serialization/shared_ptr.hpp>
+
+#include "Cmd.hpp"
+#include "NodeFwd.hpp"
+#include "ServerReply.hpp"
+class AbstractServer;
+
+//================================================================================
+// Start of Server->client
+//================================================================================
+class ServerToClientCmd {
+public:
+	virtual ~ServerToClientCmd();
+
+	virtual std::ostream& print(std::ostream& os) const = 0;
+	virtual bool equals(ServerToClientCmd*) const { return true;}
+
+	virtual const std::string& get_string() const;             /// Used by group command, can return any string, including file contents
+	virtual bool ok() const { return true;}                    /// Used by group command
+   virtual bool hasDefs() const { return false; }             /// used by group command
+   virtual bool hasNode() const { return false; }             /// used by group command
+	virtual std::string error() const { return std::string();} /// Used by test
+	virtual bool isOkCmd() const { return false; }             /// Used by server, to not respond back, client assumes OK
+
+  	// Called in client, if any data to be returned , the set on class ServerReply
+	// Cmd_ptr cts_cmd  can used for additional context.
+	// return true, if client should exit, returns false, if further work required, ie blocking, errors, etc
+  	virtual bool handle_server_response( ServerReply&, Cmd_ptr cts_cmd, bool debug ) const = 0;
+
+protected:
+	ServerToClientCmd(){}
+private:
+    friend class boost::serialization::access;
+    template<class Archive>
+    void serialize(Archive &ar, const unsigned int /*version*/) {}
+};
+BOOST_SERIALIZATION_ASSUME_ABSTRACT(ServerToClientCmd)
+
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/StcCmd.cpp b/ecflow_4_0_7/Base/src/stc/StcCmd.cpp
new file mode 100644
index 0000000..95f7629
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/StcCmd.cpp
@@ -0,0 +1,69 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Cmd
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include "StcCmd.hpp"
+
+std::ostream& StcCmd::print(std::ostream& os) const
+{
+	switch (api_) {
+		case StcCmd::OK:                          return os << "cmd:Ok"; break;
+		case StcCmd::BLOCK_CLIENT_SERVER_HALTED:  return os << "cmd:Server_halted"; break;
+		case StcCmd::BLOCK_CLIENT_ON_HOME_SERVER: return os << "cmd:Wait"; break;
+		case StcCmd::BLOCK_CLIENT_ZOMBIE:         return os << "cmd:Zombie"; break;
+		default: assert(false); break;
+ 	}
+	assert(false); // unknown command
+	return os << "cmd:Unknown??";
+}
+
+// Client context
+bool StcCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const
+{
+	bool ret = false;
+	switch (api_) {
+		case StcCmd::OK: {
+			if (debug) std::cout << "StcCmd::handle_server_response OK\n";
+			ret = true;
+			break;
+		}
+ 		case StcCmd::BLOCK_CLIENT_SERVER_HALTED: {
+			if (debug) std::cout << "StcCmd::handle_server_response BLOCK_CLIENT_SERVER_HALTED\n";
+			server_reply.set_block_client_server_halted(); // requires further work, by ClientInvoker
+			break;
+ 		}
+		case StcCmd::BLOCK_CLIENT_ON_HOME_SERVER: {
+			if (debug) std::cout << "StcCmd::handle_server_response BLOCK_CLIENT_ON_HOME_SERVER\n";
+			server_reply.set_block_client_on_home_server(); // requires further work, by ClientInvoker
+			break;
+ 		}
+		case StcCmd::BLOCK_CLIENT_ZOMBIE: {
+			if (debug) std::cout << "StcCmd::handle_server_response BLOCK_CLIENT_ZOMBIE\n";
+			server_reply.set_block_client_zombie_detected(); // requires further work, by ClientInvoker
+			break;
+ 		}
+		default: assert(false); break;
+ 	}
+	return ret;
+}
+
+bool StcCmd::equals(ServerToClientCmd* rhs) const
+{
+	StcCmd* the_rhs = dynamic_cast<StcCmd*>(rhs);
+	if (!the_rhs) return false;
+	if (api_ != the_rhs->api()) return false;
+	return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const StcCmd& c)   { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/StcCmd.hpp b/ecflow_4_0_7/Base/src/stc/StcCmd.hpp
new file mode 100644
index 0000000..1fff2af
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/StcCmd.hpp
@@ -0,0 +1,57 @@
+#ifndef STC_CMD_HPP_
+#define STC_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+
+// Command that are simple replies to the client.
+// Originally we had separate commands. However this lead
+// TOC overflow on the AIX. Hence in order to minimise global
+// symbols due to use of boost serialisation, will use a single command
+class StcCmd : public ServerToClientCmd {
+public:
+	enum Api { OK,
+		       BLOCK_CLIENT_SERVER_HALTED,
+		       BLOCK_CLIENT_ON_HOME_SERVER,
+		       BLOCK_CLIENT_ZOMBIE
+		     };
+	StcCmd(Api a) :  api_(a) {}
+	StcCmd() :  api_(OK) {}
+
+	void init(Api a) { api_ = a;}
+	Api api() const { return api_;}
+
+	virtual std::ostream& print(std::ostream& os) const;
+	virtual bool equals(ServerToClientCmd*) const;
+   	virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
+
+	/// Other legitimate ServerToClientCmd commands also return ok() as true
+	/// Hence must still have isOkCmd()
+	virtual bool ok() const { return api_ == OK; }      // used by group command
+	virtual bool isOkCmd() const { return api_ == OK; } // Used if no reply back from server
+
+private:
+	Api api_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+ 		ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+ 		ar & api_;
+   	}
+};
+std::ostream& operator<<(std::ostream& os, const StcCmd&);
+#endif
diff --git a/ecflow_4_0_7/Base/src/stc/ZombieGetCmd.cpp b/ecflow_4_0_7/Base/src/stc/ZombieGetCmd.cpp
new file mode 100644
index 0000000..e1dfef3
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/ZombieGetCmd.cpp
@@ -0,0 +1,66 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include "ZombieGetCmd.hpp"
+#include "AbstractServer.hpp"
+
+using namespace std;
+using namespace boost;
+
+ZombieGetCmd::ZombieGetCmd(AbstractServer* as)
+{
+	init(as);
+}
+
+// called in the server
+void ZombieGetCmd::init(AbstractServer* as)
+{
+	zombies_.clear();
+	as->zombie_ctrl().get(zombies_);
+}
+
+bool ZombieGetCmd::equals(ServerToClientCmd* rhs) const
+{
+	ZombieGetCmd* the_rhs = dynamic_cast<ZombieGetCmd*>(rhs);
+	if (!the_rhs) return false;
+	return ServerToClientCmd::equals(rhs);
+}
+
+std::ostream& ZombieGetCmd::print(std::ostream& os) const
+{
+	os << "cmd:ZombieGetCmd [ " << zombies_.size() << " ]";
+	return os;
+}
+
+// Called in client
+bool ZombieGetCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd,  bool debug ) const
+{
+	if (debug) {
+		std::cout << "ZombieGetCmd::handle_server_response zombies.size() = " << zombies_.size() << "\n";
+	}
+
+	if (server_reply.cli()) {
+      std::cout << Zombie::pretty_print(zombies_);
+	}
+	else {
+	   if (debug) {
+	      std::cout << Zombie::pretty_print(zombies_);
+	   }
+		server_reply.set_zombies( zombies_);
+	}
+	return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const ZombieGetCmd& c) { return c.print(os); }
diff --git a/ecflow_4_0_7/Base/src/stc/ZombieGetCmd.hpp b/ecflow_4_0_7/Base/src/stc/ZombieGetCmd.hpp
new file mode 100644
index 0000000..680fb08
--- /dev/null
+++ b/ecflow_4_0_7/Base/src/stc/ZombieGetCmd.hpp
@@ -0,0 +1,49 @@
+#ifndef ZOMBIE_GET_CMD_HPP_
+#define ZOMBIE_GET_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ServerToClientCmd.hpp"
+#include "Zombie.hpp"
+class AbstractServer;
+
+//================================================================================
+// Paired with CtsCmd(GET_ZOMBIES)
+// Client---CtsCmd(GET_ZOMBIES)---->Server-----(ZombieGetCmd)--->client:
+//================================================================================
+class ZombieGetCmd : public ServerToClientCmd {
+public:
+	ZombieGetCmd(AbstractServer*);
+	ZombieGetCmd() : ServerToClientCmd() {}
+
+	void init(AbstractServer*);
+  	virtual bool handle_server_response( ServerReply&, Cmd_ptr cts_cmd, bool debug ) const;
+  	virtual std::ostream& print(std::ostream& os) const;
+	virtual bool equals(ServerToClientCmd*) const;
+
+private:
+	std::vector<Zombie> zombies_;
+
+	friend class boost::serialization::access;
+	template<class Archive>
+	void serialize( Archive & ar, const unsigned int /*version*/ ) {
+ 		ar & boost::serialization::base_object< ServerToClientCmd >( *this );
+ 		ar & zombies_;
+  	}
+};
+
+std::ostream& operator<<(std::ostream& os, const ZombieGetCmd&);
+
+#endif
diff --git a/ecflow_4_0_7/Base/test/MockServer.hpp b/ecflow_4_0_7/Base/test/MockServer.hpp
new file mode 100644
index 0000000..3c34436
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/MockServer.hpp
@@ -0,0 +1,98 @@
+#ifndef MOCK_SERVER_HPP_
+#define MOCK_SERVER_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #26 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <assert.h>
+#include "Defs.hpp"
+#include "SuiteChanged.hpp"
+#include "AbstractServer.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "Log.hpp"
+#include "Ecf.hpp"  // In server we increment modify and state change numbers,
+
+/// Act as stand in for a server since Request require at least a AbstractServer
+class MockServer : public AbstractServer {
+public:
+	// For the MockServer don't delete the Defs. since we past in a fixture defs
+	struct null_deleter {
+	    void operator()(void const *) const{}
+	};
+
+	// Only in server side do we increment state/modify numbers, controlled by: Ecf::set_server(true)
+	MockServer(Defs* defs) : defs_(defs_ptr(defs,MockServer::null_deleter())) { Ecf::set_server(true); }
+	MockServer(defs_ptr defs) : defs_(defs)                                   { Ecf::set_server(true); }
+	~MockServer() { Ecf::set_server(false); }
+
+	virtual SState::State state() const { return  SState::RUNNING;}
+	virtual std::pair<std::string,std::string> hostPort() const { assert(defs_.get()); return defs_->server().hostPort(); }
+	virtual defs_ptr defs() const { return defs_;}
+	virtual void updateDefs(defs_ptr d, bool force) { assert(defs_.get()); defs_->absorb(d.get(),force); }
+ 	virtual void clear_defs() { if (defs_.get()) defs_->clear(); } // dont delete since we pass in Fixture defs. Otherwise it will crash
+   virtual void checkPtDefs(ecf::CheckPt::Mode m = ecf::CheckPt::UNDEFINED,
+                               int check_pt_interval = 0,
+                               int check_pt_save_time_alarm = 0) {}
+ 	virtual void restore_defs_from_checkpt() {}
+	virtual void nodeTreeStateChanged() {}
+	virtual bool allowTaskCommunication() const { return true;}
+ 	virtual void shutdown() {}
+ 	virtual void halted() {}
+ 	virtual void restart() {}
+	virtual bool reloadWhiteListFile(std::string&) { return true;}
+ 	virtual bool authenticateUser(const std::string& ) { return true;}
+ 	virtual bool authenticateWriteAccess(const std::string& , bool ) { return true;}
+ 	virtual bool lock(const std::string& user) {
+ 		if (userWhoHasLock_.empty()) {
+ 			userWhoHasLock_ = user;
+ 			shutdown();
+ 			return true;
+ 		}
+ 		return false;
+ 	}
+ 	virtual void unlock() { userWhoHasLock_.clear(); restart(); }
+ 	virtual const std::string& lockedUser() const { return userWhoHasLock_;}
+   virtual void traverse_node_tree_and_job_generate(const boost::posix_time::ptime& time_now,bool user_cmd_context) const {
+      if (state() == SState::RUNNING && defs_.get()) {
+          JobsParam jobsParam(poll_interval(), false /* as->allow_job_creation_during_tree_walk() */ );
+          Jobs jobs(defs_);
+          if (!jobs.generate(jobsParam))  ecf::log(ecf::Log::ERR,jobsParam.getErrorMsg());    // will automatically add end of line
+       }
+   }
+   virtual int poll_interval() const { return 60; }
+ 	virtual void debug_server_on(){}
+ 	virtual void debug_server_off(){}
+   virtual bool debug() const { return true; }
+
+private:
+	defs_ptr defs_;
+ 	std::string userWhoHasLock_;
+};
+
+/// This class is used to create a Mock Server, so that we can make direct
+/// data model changes without using commands.
+/// In particular it will:
+///   o Ecf::set_server(true): This controls incrementing of state/modify change numbers
+///                            which should *only* be done on the server side
+///   o Update Suite state/modify change number
+class MockSuiteChangedServer  : private boost::noncopyable {
+public:
+	MockSuiteChangedServer(suite_ptr suite) : suiteChanged_(suite) { Ecf::set_server(true);}
+	~MockSuiteChangedServer() { Ecf::set_server(false); }
+private:
+	ecf::SuiteChanged suiteChanged_;
+};
+#endif
+
diff --git a/ecflow_4_0_7/Base/test/TestAlterCmd.cpp b/ecflow_4_0_7/Base/test/TestAlterCmd.cpp
new file mode 100644
index 0000000..240bcee
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestAlterCmd.cpp
@@ -0,0 +1,780 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #48 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MyDefsFixture.hpp"
+#include "TestHelper.hpp"
+#include "Str.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+class TestStateChanged {
+public:
+   TestStateChanged(suite_ptr s)
+   : suite_(s),
+     initial_suite_state_change_no_(s->state_change_no()),
+     initial_suite_modify_change_no_(s->modify_change_no()) { Ecf::set_server(true);}
+
+   ~TestStateChanged() {
+      Ecf::set_server(false);
+      BOOST_CHECK_MESSAGE(suite_->state_change_no() != initial_suite_state_change_no_ ||
+                          suite_->modify_change_no()	!= initial_suite_modify_change_no_,
+                          "Suite " << suite_->name() << " has no change in attributes. Forget to increment change no?"
+                          << " suite_->state_change_no(" << suite_->state_change_no()<< ")-"
+                          << "-initial_suite_state_change_no_(" << initial_suite_state_change_no_ << ") "
+                          << " suite_->modify_change_no(" << suite_->modify_change_no() << ")-"
+                          << "-initial_suite_modify_change_no_(" << initial_suite_modify_change_no_ << ")"
+      );
+   }
+private:
+   suite_ptr suite_;
+   unsigned int initial_suite_state_change_no_;
+   unsigned int initial_suite_modify_change_no_;
+};
+
+
+class TestDefsStateChanged {
+public:
+   TestDefsStateChanged(Defs* s)
+   : defs_(s),
+     initial_state_change_no_(s->defs_only_max_state_change_no()) {}
+
+   ~TestDefsStateChanged() {
+      Ecf::set_server(false);
+      BOOST_CHECK_MESSAGE(defs_->defs_only_max_state_change_no() != initial_state_change_no_,
+                          "Defs has no change in attributes. Forget to increment change no?"
+      );
+   }
+private:
+   Defs* defs_;
+   unsigned int initial_state_change_no_;
+};
+
+
+BOOST_AUTO_TEST_CASE( test_alter_cmd_for_clock_type_hybrid )
+{
+   cout << "Base:: ...test_alter_cmd_for_clock_type_hybrid\n";
+
+   // In this test the suite has NO Clock attribute. It should get added automatically
+   // when a new clock is added, we should sync with the computer clock
+   Defs defs;
+   suite_ptr s = Suite::create("suite");
+   defs.addSuite( s );
+
+   BOOST_CHECK_MESSAGE( !s->clockAttr(), "Expected no clock");
+   std::string error_msg;
+   BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+
+   {  // Change clock type =====================================================================================================
+      defs.beginAll();
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_TYPE,"hybrid","")));
+      clock_ptr v = s->clockAttr();
+      BOOST_CHECK_MESSAGE( v && v->hybrid() , "expected clock to be added and be hybrid");
+
+      // Altering the suite clock attributes, should force suite calendar to  align to todays date and time
+      boost::posix_time::ptime date_now = Calendar::second_clock_time();
+      int day_of_month = date_now.date().day();
+      int month        = date_now.date().month();
+      int year         = date_now.date().year();
+      BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == day_of_month, "Calendar should be updated after re-queue/begin. Expected " << day_of_month << " but found " << s->calendar().day_of_month());
+      BOOST_CHECK_MESSAGE( s->calendar().month() == month, "Calendar should be updated after re-queue/begin. Expected " << month << " but found " << s->calendar().month());
+      BOOST_CHECK_MESSAGE( s->calendar().year() == year, "Calendar should be updated after re-queued/begin");
+      BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_cmd_for_clock_type_real )
+{
+   cout << "Base:: ...test_alter_cmd_for_clock_type_real\n";
+
+   // In this test the suite has NO Clock attribute. It should get added automatically
+   // when a new clock is added, we should sync with the computer clock
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+
+   BOOST_CHECK_MESSAGE( !s->clockAttr(), "Expected no clock");
+   std::string error_msg; BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+
+   {  // Change clock type =====================================================================================================
+      defs.beginAll();
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_TYPE,"real","")));
+      clock_ptr v = s->clockAttr();
+      BOOST_CHECK_MESSAGE( v && !v->hybrid() , "expected clock to be added and be real");
+
+      // Altering the suite clock attributes, should force suite calendar to  align to todays date and time
+      boost::posix_time::ptime date_now = Calendar::second_clock_time();
+      int day_of_month = date_now.date().day();
+      int month        = date_now.date().month();
+      int year         = date_now.date().year();
+      BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == day_of_month, "Calendar should be updated after re-queue/begin. Expected " << day_of_month << " but found " << s->calendar().day_of_month());
+      BOOST_CHECK_MESSAGE( s->calendar().month() == month, "Calendar should be updated after re-queue/begin. Expected " << month << " but found " << s->calendar().month());
+      BOOST_CHECK_MESSAGE( s->calendar().year() == year, "Calendar should be updated after re-queued/begin");
+      BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_cmd_for_clock_sync )
+{
+   cout << "Base:: ...test_alter_cmd_for_clock_sync\n";
+
+   // Add a suite with a hybrid clock set to the past, on switch to real time, should have todays date
+   // Since the clock exists on the suite, with another date, we must explicitly sync with computer
+   // alternatively user can change clock date and clock gain to align with computer
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+   ClockAttr clockAttr(true); // add hybrid clock
+   clockAttr.date(1,1,2009);
+   s->addClock( clockAttr );
+
+   BOOST_REQUIRE_MESSAGE( s->clockAttr(), "Expected clock");
+   BOOST_REQUIRE_MESSAGE( s->clockAttr()->hybrid(), "Expected hybrid clock");
+   std::string error_msg; BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+
+   {  // Change clock type =====================================================================================================
+      defs.beginAll();
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_TYPE,"real","")));
+      clock_ptr v = s->clockAttr();
+      BOOST_CHECK_MESSAGE( v && !v->hybrid() , "expected clock to be added and be real");
+
+      // When we reque, the date should be unchanged
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new RequeueNodeCmd("/" + s->name())));
+      BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == 1, "Calendar should be updated after re-queue/begin. Expected day of month " << 1 << " but found " << s->calendar().day_of_month());
+      BOOST_CHECK_MESSAGE( s->calendar().month() == 1, "Calendar should be updated after re-queue/begin. Expected month " << 1 << " but found " << s->calendar().month());
+      BOOST_CHECK_MESSAGE( s->calendar().year() == 2009, "Calendar should be updated after re-queued/begin, Expected year " << 2009 << " but found " << s->calendar().year());
+      BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+
+      // After a clk sync, data should match computer
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_SYNC,"","")));
+
+      boost::posix_time::ptime date_now = Calendar::second_clock_time();
+      int day_of_month = date_now.date().day();
+      int month        = date_now.date().month();
+      int year         = date_now.date().year();
+      BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == day_of_month, "Calendar should be updated after re-queue/begin. Expected " << day_of_month << " but found " << s->calendar().day_of_month());
+      BOOST_CHECK_MESSAGE( s->calendar().month() == month, "Calendar should be updated after re-queue/begin. Expected " << month << " but found " << s->calendar().month());
+      BOOST_CHECK_MESSAGE( s->calendar().year() == year, "Calendar should be updated after re-queued/begin");
+      BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_cmd_for_clock_date )
+{
+   cout << "Base:: ...test_alter_cmd_for_clock_date\n";
+
+   // In this test the suite has NO Clock attribute. It should get added automatically
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+   BOOST_CHECK_MESSAGE( !s->clockAttr(), "Expected no clock");
+   std::string error_msg; BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+
+   // Change clock date =====================================================================================================
+   TestStateChanged changed(s);
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_DATE,"12.12.2012","")));
+   clock_ptr v = s->clockAttr();
+   BOOST_CHECK_MESSAGE( v.get(), "expected clock to be added");
+
+   // Check that calendar is updated  by the Alter
+   {
+      BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == 12, "Calendar should be updated");
+      BOOST_CHECK_MESSAGE( s->calendar().month() == 12, "Calendar should be updated");
+      BOOST_CHECK_MESSAGE( s->calendar().year() == 2012, "Calendar should be updated");
+
+      defs.beginAll();
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new RequeueNodeCmd(s->absNodePath())));
+      BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == 12, "Calendar should be updated after re-queued");
+      BOOST_CHECK_MESSAGE( s->calendar().month() == 12, "Calendar should be updated after re-queued");
+      BOOST_CHECK_MESSAGE( s->calendar().year() == 2012, "Calendar should be updated after re-queued");
+
+      // Now re sync with the computers clock, the suite calendar should align to todays date and time
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_SYNC,"","")));
+
+      boost::posix_time::ptime date_now = Calendar::second_clock_time();
+      int day_of_month = date_now.date().day();
+      int month        = date_now.date().month();
+      int year         = date_now.date().year();
+      BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == day_of_month, "Calendar should be updated after re-queue/begin. Expected " << day_of_month << " but found " << s->calendar().day_of_month());
+      BOOST_CHECK_MESSAGE( s->calendar().month() == month, "Calendar should be updated after re-queue/begin. Expected " << month << " but found " << s->calendar().month());
+      BOOST_CHECK_MESSAGE( s->calendar().year() == year, "Calendar should be updated after re-queued/begin");
+      BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_cmd_for_clock_gain )
+{
+   cout << "Base:: ...test_alter_cmd_for_clock_gain\n";
+
+   // In this test the suite has NO Clock attribute. It should get added automatically
+   Defs defs;
+   std::string suitename = "suite";
+   suite_ptr s = defs.add_suite(suitename);
+   BOOST_CHECK_MESSAGE( !s->clockAttr(), "Expected no clock");
+   std::string error_msg; BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+
+   {  // Change clock gain  =====================================================================================================
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(suitename,AlterCmd::CLOCK_GAIN,"86400",""))); // add 24 hours in seconds
+      clock_ptr v = s->clockAttr();
+      BOOST_CHECK_MESSAGE( v.get(), "expected clock to be added");
+      BOOST_CHECK_MESSAGE( v && v->gain() == 86400 , "expected clock gain to be 86400 but found " << v->gain());
+
+      // Check that calendar is updated by the alter
+      {
+         // add one day, to current date, to simulate a gain of 24 hours
+         boost::posix_time::ptime date_now = Calendar::second_clock_time();
+         boost::gregorian::date newDate = date_now.date();
+         boost::gregorian::date_duration one_day(1);
+         newDate += one_day;
+         int day_of_month = newDate.day();
+         int month        = newDate.month();
+         int year         = newDate.year();
+         BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == day_of_month, "Calendar should be updated after alter. Expected " << day_of_month << " but found " << s->calendar().day_of_month());
+         BOOST_CHECK_MESSAGE( s->calendar().month() == month, "Calendar should be updated after alter. Expected " << month << " but found " << s->calendar().month());
+         BOOST_CHECK_MESSAGE( s->calendar().year() == year, "Calendar should be updated after alter");
+
+         // This should init calendar with todays date + 86400 seconds. i.e +1 day.
+         defs.beginAll();
+         TestHelper::invokeRequest(&defs,Cmd_ptr( new RequeueNodeCmd("/" + suitename)));
+         BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == day_of_month, "Calendar should be updated after re-queue/begin. Expected " << day_of_month << " but found " << s->calendar().day_of_month());
+         BOOST_CHECK_MESSAGE( s->calendar().month() == month, "Calendar should be updated after re-queue/begin. Expected " << month << " but found " << s->calendar().month());
+         BOOST_CHECK_MESSAGE( s->calendar().year() == year, "Calendar should be updated after re-queued/begin");
+
+         // Now re sync with the computers clock,When we reque, the suite calendar should align to todays date and time
+         TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_SYNC,"","")));
+         day_of_month = date_now.date().day();
+         month        = date_now.date().month();
+         year         = date_now.date().year();
+         BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == day_of_month, "Calendar should be updated after re-queue/begin. Expected " << day_of_month << " but found " << s->calendar().day_of_month());
+         BOOST_CHECK_MESSAGE( s->calendar().month() == month, "Calendar should be updated after re-queue/begin. Expected " << month << " but found " << s->calendar().month());
+         BOOST_CHECK_MESSAGE( s->calendar().year() == year, "Calendar should be updated after re-queued/begin");
+         BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+      }
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_cmd )
+{
+   cout << "Base:: ...test_alter_cmd\n";
+
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+   task_ptr task = s->add_task("t1");
+   {
+      ClockAttr clockAttr(false); // real clock
+      clockAttr.date(1,1,2009);
+      clockAttr.set_gain_in_seconds(3600);
+      clockAttr.startStopWithServer(true);
+      s->addClock( clockAttr );
+      s->addDefStatus(DState::SUSPENDED); // avoid AlterCmd from job submission
+   }
+
+   std::string error_msg; BOOST_CHECK_MESSAGE(defs.checkInvariants(error_msg),"checkInvariants failed " << error_msg);
+
+   { // Change server state. This will cause Flag::MESSAGE to be set on the defs
+      TestDefsStateChanged chenged(&defs);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/",AlterCmd::ADD_VARIABLE,"_fred_","value")));
+      BOOST_CHECK_MESSAGE( defs.server().find_variable("_fred_") == "value" , "expected to find value");
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/",AlterCmd::VARIABLE,"_fred_","_value_")));
+      BOOST_CHECK_MESSAGE( defs.server().find_variable("_fred_") == "_value_" , "expected to find _value_");
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/",AlterCmd::DEL_VARIABLE,"_fred_")));
+      BOOST_CHECK_MESSAGE( defs.server().find_variable("_fred_") == "" , "expected to find empty string");
+
+      BOOST_CHECK_MESSAGE( defs.get_edit_history("/").size() == 3,
+                           "expected edit_history of 3 to be added but found " <<  defs.get_edit_history("/").size());
+
+      {
+         // test set and clear flags of the definition
+         // Note: we can not really test Flag::Message clear, since that act of clearing, sets the message
+         std::vector<Flag::Type> flag_list = Flag::list();
+         for(size_t i =0; i < flag_list.size(); ++i) {
+            // When any user command(including setting flags) invoked, we set Flag::MESSAGE on the defs.
+            // Hence setting flag Flag::MESSAGE has no effect. Likewise clearing has no affect since it get set
+            if ( flag_list[i] == Flag::MESSAGE)  continue;
+
+            TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/",flag_list[i],true)));
+            BOOST_CHECK_MESSAGE( defs.flag().is_set(flag_list[i]), "Expected flag " << flag_list[i] << " to be set ");
+
+            TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/",flag_list[i],false)));
+            BOOST_CHECK_MESSAGE( ! defs.flag().is_set(flag_list[i]), "Expected flag " << flag_list[i] << " to be clear ");
+         }
+      }
+   }
+
+   {  // Change clock type =====================================================================================================
+      defs.beginAll();
+      BOOST_CHECK_MESSAGE( s->calendar().hybrid() == false, "expected calendar to be real after begin");
+      BOOST_CHECK_MESSAGE( s->calendar().hybrid() == s->clockAttr()->hybrid(), "Calendar and Clock attribute must be in sync after begin");
+
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_TYPE,"hybrid","")));
+      clock_ptr v = s->clockAttr();
+      BOOST_CHECK_MESSAGE( v && v->hybrid() , "expected clock to be hybrid");
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(s->absNodePath()).size() == 1,
+                           "expected edit_history of 1 to be added but found " <<  defs.get_edit_history(s->absNodePath()).size());
+
+      // Check that calendar is in sync with clock attribute after the alter
+      {
+         BOOST_CHECK_MESSAGE( s->calendar().hybrid() == s->clockAttr()->hybrid(), "Calendar and Clock attribute must be in sync after alter");
+         BOOST_CHECK_MESSAGE( s->calendar().hybrid() == true, "expected calendar to be re-initialised to be hybrid after alter");
+      }
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_TYPE,"real","")));
+      BOOST_CHECK_MESSAGE( v && !v->hybrid() , "expected clock to be real");
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(s->absNodePath()).size() == 2,
+                           "expected edit_history of 2 to be added but found " <<  defs.get_edit_history(s->absNodePath()).size());
+
+      // Check that calendar is in sync with clock attribute after the alter
+      {
+         BOOST_CHECK_MESSAGE( s->calendar().hybrid() == s->clockAttr()->hybrid(), "Calendar and Clock attribute must be in sync after alter");
+         BOOST_CHECK_MESSAGE( s->calendar().hybrid() == false, "expected calendar to be re-initialised to be real after alter");
+      }
+   }
+
+   {  // Change clock date =====================================================================================================
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_DATE,"12.12.2012","")));
+      clock_ptr v = s->clockAttr();
+      BOOST_CHECK_MESSAGE( (v->day() == 12 && v->month() == 12 && v->year() == 2012) , "expected clock date to be 12.12.2012 but found " << v->toString());
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(s->absNodePath()).size() == 3,
+                           "expected edit_history of 3 to be added but found " <<  defs.get_edit_history(s->absNodePath()).size());
+
+      // Check that calendar is updated after alter
+      {
+         BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == 12, "Calendar should be updated after re-queued");
+         BOOST_CHECK_MESSAGE( s->calendar().month() == 12, "Calendar should be updated after re-queued");
+         BOOST_CHECK_MESSAGE( s->calendar().year() == 2012, "Calendar should be updated after re-queued");
+      }
+   }
+
+   {  // Change clock gain  =====================================================================================================
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::CLOCK_GAIN,"86400",""))); // add 24 hours in seconds
+      clock_ptr v = s->clockAttr();
+      BOOST_CHECK_MESSAGE( v && v->gain() == 86400 , "expected clock gain to be 3333 but found " << v->gain());
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(s->absNodePath()).size() == 4,
+                           "expected edit_history of 4 to be added but found " <<  defs.get_edit_history(s->absNodePath()).size());
+
+      // Check that calendar is updated after the alter
+      {
+         BOOST_CHECK_MESSAGE( s->calendar().day_of_month() == 13, "Calendar should be updated after re-queued");
+         BOOST_CHECK_MESSAGE( s->calendar().month() == 12, "Calendar should be updated after re-queued");
+         BOOST_CHECK_MESSAGE( s->calendar().year() == 2012, "Calendar should be updated after re-queued");
+      }
+   }
+
+   // test add, the deleting of a specific attribute
+   {
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DATE,"12.12.2010")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DAY,"sunday")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_TIME,"23:00")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_TODAY,"23:00")));
+      BOOST_CHECK_MESSAGE( task->dates().size() == 1, "expected 1 date to be added but found " <<  s->dates().size());
+      BOOST_CHECK_MESSAGE( task->days().size() == 1, "expected 1 day to be added but found " <<  s->days().size());
+      BOOST_CHECK_MESSAGE( task->timeVec().size() == 1, "expected 1 time to be added but found " <<  s->timeVec().size());
+      BOOST_CHECK_MESSAGE( task->todayVec().size() == 1, "expected 1 today attr, to be added but found " <<  s->todayVec().size());
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(task->absNodePath()).size() == 4, "expected edit_history of 4 to be added but found " <<  defs.get_edit_history(task->absNodePath()).size());
+   }
+   {
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_DATE,"12.12.2010")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_DAY,"sunday")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_TIME,"23:00")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_TODAY,"23:00")));
+      BOOST_CHECK_MESSAGE( task->dates().size() == 0, "expected 0 dates,   but found " <<  s->dates().size());
+      BOOST_CHECK_MESSAGE( task->days().size() == 0, "expected 0 day       but found " <<  s->days().size());
+      BOOST_CHECK_MESSAGE( task->timeVec().size() == 0, "expected 0 time   but found " <<  s->timeVec().size());
+      BOOST_CHECK_MESSAGE( task->todayVec().size() == 0, "expected 0 today but found " <<  s->todayVec().size());
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(task->absNodePath()).size() == 8, "expected edit_history of 8 to be added but found " <<  defs.get_edit_history(task->absNodePath()).size());
+   }
+
+   {   // test delete all
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DATE,"12.12.2010")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DATE,"12.*.2010")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DATE,"8.*.2010")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DAY,"sunday")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DAY,"monday")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_DAY,"tuesday")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_TIME,"09:00")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_TIME,"22:00")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_TIME,"23:00")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_TODAY,"02:00")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_TODAY,"03:00")));
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(task->absNodePath()).size() == 19, "expected edit_history of 19 to be added but found " <<  defs.get_edit_history(task->absNodePath()).size());
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_DATE)));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_DAY)));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_TIME)));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_TODAY)));
+      BOOST_CHECK_MESSAGE( task->dates().size() == 0, "expected 0 dates,   but found " <<  s->dates().size());
+      BOOST_CHECK_MESSAGE( task->days().size() == 0, "expected 0 day       but found " <<  s->days().size());
+      BOOST_CHECK_MESSAGE( task->timeVec().size() == 0, "expected 0 time   but found " <<  s->timeVec().size());
+      BOOST_CHECK_MESSAGE( task->todayVec().size() == 0, "expected 0 today but found " <<  s->todayVec().size());
+
+      /// Edit history should be truncated to max of 20
+      BOOST_CHECK_MESSAGE( defs.get_edit_history(task->absNodePath()).size() == 20, "expected edit_history to be truncated to 20, but found " <<  defs.get_edit_history(task->absNodePath()).size());
+   }
+
+   {   // test add variables
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_VARIABLE,"FRED1","_val_")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_VARIABLE,"FRED2","_val_")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_VARIABLE,"FRED3","_val_")));
+      BOOST_CHECK_MESSAGE( s->variables().size() == 3, "expected 3 variable but found " <<  s->variables().size());
+
+      // test delete variables
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_VARIABLE,"FRED1")));
+      BOOST_CHECK_MESSAGE( s->variables().size() == 2, "expected 2 variable but found " <<  s->variables().size());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_VARIABLE)));
+      BOOST_CHECK_MESSAGE( s->variables().size() == 0, "expected 0 variable but found " <<  s->variables().size());
+
+      // test change variable
+      s->add_variable("FRED1","BILL");
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::VARIABLE,"FRED1","BILL1")));
+      const Variable& v = s->findVariable("FRED1");
+      BOOST_CHECK_MESSAGE( !v.empty() && v.theValue() == "BILL1", "expected to find variable FRED1, with value BILL1");
+   }
+
+   {   // test add event
+      TestStateChanged changed(s);
+      s->addEvent( Event(1,"event1") );
+      s->addEvent( Event(2,"event2") );
+      s->addEvent( Event(3,"event3") );
+      BOOST_CHECK_MESSAGE( s->events().size() == 3, "expected 3  but found " <<  s->events().size());
+
+      // test delete event
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_EVENT,"event1")));
+      BOOST_CHECK_MESSAGE( s->events().size() == 2, "expected 2  but found " <<  s->events().size());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_EVENT)));
+      BOOST_CHECK_MESSAGE( s->events().size() == 0, "expected 0  but found " <<  s->events().size());
+
+      // test change event
+      s->addEvent( Event(1,"event1") );
+      s->addEvent( Event(2,"event2") );
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::EVENT,"event1",Event::SET())));
+      {const Event& v = s->findEventByNameOrNumber("event1");
+      BOOST_CHECK_MESSAGE( v.value() == 1, "expected to find  event with value set");}
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::EVENT,"event1",Event::CLEAR())));
+      {const Event& v = s->findEventByNameOrNumber("event1");
+      BOOST_CHECK_MESSAGE( !v.empty() && v.value() == 0, "expected to find  event with value cleared");}
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::EVENT,"event1","")));
+      {const Event& v = s->findEventByNameOrNumber("event1");
+      BOOST_CHECK_MESSAGE( v.value() == 1, "expected to find  event with value set");}
+   }
+
+   {   // test add meter
+      TestStateChanged changed(s);
+      s->addMeter( Meter("meter",0,100,100) );
+      s->addMeter( Meter("meter1",0,100,100) );
+      s->addMeter( Meter("meter2",0,100,100) );
+      BOOST_CHECK_MESSAGE( s->meters().size() == 3, "expected 3  but found " <<  s->meters().size());
+
+      // test delete meter
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_METER,"meter")));
+      BOOST_CHECK_MESSAGE( s->meters().size() == 2, "expected 2  but found " <<  s->meters().size());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_METER)));
+      BOOST_CHECK_MESSAGE( s->meters().size() == 0, "expected 0  but found " <<  s->meters().size());
+
+      // test change meter value
+      s->addMeter( Meter("meter",0,100,100) );
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::METER,"meter","10")));
+      const Meter& v = s->findMeter("meter");
+      BOOST_CHECK_MESSAGE( v.value() == 10, "expected to find meter with value 10");
+   }
+
+   {   // test add label
+      TestStateChanged changed(s);
+      s->addLabel( Label("label","labelValue") );
+      s->addLabel( Label("label1","\"labelValue\"") );
+      s->addLabel( Label("label2","\"labelValue\"") );
+      BOOST_CHECK_MESSAGE( s->labels().size() == 3, "expected 3  but found " <<  s->labels().size());
+
+      // test delete label
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_LABEL,"label")));
+      BOOST_CHECK_MESSAGE( s->labels().size() == 2, "expected 2  but found " <<  s->labels().size());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_LABEL)));
+      BOOST_CHECK_MESSAGE( s->labels().size() == 0, "expected 0  but found " <<  s->labels().size());
+
+      // test change label value
+      s->addLabel( Label("label","labelValue") );
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::LABEL,"label","--fred--")));
+      std::string label_value;
+      BOOST_CHECK_MESSAGE(s->getLabelValue("label",label_value ),"Expected to find label");
+      BOOST_CHECK_MESSAGE( label_value == "--fred--", "expected to find label with value --fred--");
+   }
+
+   {   // test add Trigger
+      TestStateChanged changed(s);
+      s->add_trigger( "t1 == complete");
+      BOOST_CHECK_MESSAGE( s->get_trigger(), "expected  trigger to be added");
+
+      // test delete trigger
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_TRIGGER)));
+      BOOST_CHECK_MESSAGE( !s->get_trigger(), "expected  trigger to be deleted");
+
+      // test change trigger expression
+      s->add_trigger( "t1 == complete" );
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::TRIGGER,"x == complete","")));
+      BOOST_CHECK_MESSAGE( s->triggerExpression() == "trigger x == complete", "expected trigger to be changed found " << s->triggerExpression());
+   }
+
+   {   // test add complete expression
+      TestStateChanged changed(s);
+      s->add_complete( "t1 == complete" );
+      BOOST_CHECK_MESSAGE( s->get_complete(), "expected complete to be added");
+
+      // test delete complete
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_COMPLETE)));
+      BOOST_CHECK_MESSAGE( !s->get_complete(), "expected complete to be deleted");
+
+      // test change complete expression
+      s->add_complete(  "t1 == complete" );
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::COMPLETE,"x == complete","")));
+      BOOST_CHECK_MESSAGE( s->completeExpression() == "complete x == complete", "expected complete expression to be changed found " << s->completeExpression() );
+   }
+
+   {   // test add limit
+      TestStateChanged changed(s);
+      s->addLimit( Limit("limit",10) );
+      s->addLimit( Limit("limit1",10) );
+      s->addLimit( Limit("limit2",10) );
+      BOOST_CHECK_MESSAGE( s->limits().size() == 3, "expected 3  but found " <<  s->limits().size());
+
+      // test delete limit
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_LIMIT,"limit2")));
+      BOOST_CHECK_MESSAGE( s->limits().size() == 2, "expected 2  but found " <<  s->limits().size());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_LIMIT)));
+      BOOST_CHECK_MESSAGE( s->limits().size() == 0, "expected 0  but found " <<  s->limits().size());
+
+      // test change limit max value
+      s->addLimit( Limit("limit",10) );
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::LIMIT_MAX,"limit","90")));
+      limit_ptr v = s->find_limit("limit");
+      BOOST_CHECK_MESSAGE( v.get() && v->theLimit() == 90, "expected to find limit with max value of 90");
+
+      // test change limit value
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::LIMIT_VAL,"limit","33")));
+      BOOST_CHECK_MESSAGE( v.get() && v->value() == 33, "expected to find limit with value of 33");
+
+      // Test delete limit path
+      std::set<std::string> paths; paths.insert("made_up_path");
+      Limit limit_path("limit_name",10);
+      limit_path.set_paths(paths);
+
+      s->addLimit( limit_path );
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_LIMIT_PATH,"limit_name","made_up_path")));
+      limit_ptr lm = s->find_limit("limit_name");
+      BOOST_CHECK_MESSAGE( lm.get() && lm->paths().empty(), "Expected no paths but found " << lm->paths().size());
+   }
+
+   {   // test add repeat
+      TestStateChanged changed(s);
+      s->addRepeat( RepeatDate("YMD",20090916,20090930,1));
+      BOOST_CHECK_MESSAGE( !s->repeat().empty(), "expected repeat to be added");
+
+      // test delete repeat
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_REPEAT)));
+      BOOST_CHECK_MESSAGE( s->repeat().empty(), "expected repeat to be deleted");
+
+      // test change repeat value
+      s->addRepeat( RepeatDate("YMD",20090916,20090930,1));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::REPEAT,"20090917","")));
+      BOOST_CHECK_MESSAGE( s->repeat().valueAsString() == "20090917", "expected 20090917 but found " << s->repeat().valueAsString());
+   }
+   {
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_REPEAT))); // delete previous repeat
+
+      std::vector<std::string> stringList; stringList.reserve(3);
+      stringList.push_back("a");
+      stringList.push_back("b");
+      stringList.push_back("c");
+
+      s->addRepeat( RepeatEnumerated("AEnum",stringList));
+      BOOST_CHECK_MESSAGE( !s->repeat().empty(), "expected repeat to be added");
+
+      // test delete repeat
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_REPEAT)));
+      BOOST_CHECK_MESSAGE( s->repeat().empty(), "expected repeat to be deleted");
+
+      // test change repeat value
+      s->addRepeat( RepeatEnumerated("AEnum",stringList));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::REPEAT,"1","")));
+      BOOST_CHECK_MESSAGE( s->repeat().valueAsString() == "b", "expected 'b' but found " << s->repeat().valueAsString());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::REPEAT,"c","")));
+      BOOST_CHECK_MESSAGE( s->repeat().valueAsString() == "c", "expected 'c' but found " << s->repeat().valueAsString());
+   }
+   {
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_REPEAT))); // delete previous repeat
+
+      std::vector<std::string> stringList; stringList.reserve(3);
+      stringList.push_back("a");
+      stringList.push_back("b");
+      stringList.push_back("c");
+
+      s->addRepeat( RepeatString("RepeatString",stringList));
+      BOOST_CHECK_MESSAGE( !s->repeat().empty(), "expected repeat to be added");
+
+      // test delete repeat
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_REPEAT)));
+      BOOST_CHECK_MESSAGE( s->repeat().empty(), "expected repeat to be deleted");
+
+      // test change repeat value
+      s->addRepeat( RepeatString("RepeatString",stringList));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::REPEAT,"1","")));
+      BOOST_CHECK_MESSAGE( s->repeat().valueAsString() == "b", "expected 'b' but found " << s->repeat().valueAsString());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::REPEAT,"c","")));
+      BOOST_CHECK_MESSAGE( s->repeat().valueAsString() == "c", "expected 'c' but found " << s->repeat().valueAsString());
+   }
+
+   {
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_REPEAT))); // delete previous repeat
+
+      std::vector<std::string> stringList; stringList.reserve(3);
+      stringList.push_back("a");
+      stringList.push_back("b");
+      stringList.push_back("c");
+
+      s->addRepeat( RepeatInteger("rep",0,100,1));
+      BOOST_CHECK_MESSAGE( !s->repeat().empty(), "expected repeat to be added");
+
+      // test delete repeat
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_REPEAT)));
+      BOOST_CHECK_MESSAGE( s->repeat().empty(), "expected repeat to be deleted");
+
+      // test change repeat value
+      s->addRepeat( RepeatInteger("rep",0,100,1));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::REPEAT,"22","")));
+      BOOST_CHECK_MESSAGE( s->repeat().valueAsString() == "22", "expected '22' but found " << s->repeat().valueAsString());
+   }
+
+   {    // add cron
+      TestStateChanged changed(s);
+      ecf::CronAttr cronAttr;
+      ecf::TimeSlot start( 0, 0 );
+      ecf::TimeSlot finish( 10, 0 );
+      ecf::TimeSlot incr( 0, 5 );
+      std::vector<int> weekdays;   for(int i=0;i<7;++i) weekdays.push_back(i);
+      std::vector<int> daysOfMonth;for(int i=1;i<32;++i) daysOfMonth.push_back(i);
+      std::vector<int> months;     for(int i=1;i<13;++i) months.push_back(i);
+      cronAttr.addTimeSeries(start,finish,incr);
+      cronAttr.addWeekDays( weekdays  );
+      cronAttr.addDaysOfMonth(daysOfMonth);
+      cronAttr.addMonths(  months );
+      task->addCron( cronAttr  );
+
+      BOOST_CHECK_MESSAGE( task->crons().size() == 1, "expected cron to be added");
+
+      // test delete cron
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::DEL_CRON)));
+      BOOST_CHECK_MESSAGE( task->crons().size() == 0, "expected cron to be delete");
+   }
+
+   {   // test suite changed
+      TestStateChanged changed(s);
+
+      // test add zombie
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_ZOMBIE,"user:fob:init:300")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_ZOMBIE,"path:fob:init:300")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_ZOMBIE,"ecf:fob:init:300")));
+      BOOST_CHECK_MESSAGE( s->zombies().size() == 3, "expected 3  but found " <<  s->zombies().size());
+
+      // test delete zombie
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_ZOMBIE,"ecf")));
+      BOOST_CHECK_MESSAGE( s->zombies().size() == 2, "expected 2  but found " <<  s->zombies().size());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_ZOMBIE,"path")));
+      BOOST_CHECK_MESSAGE( s->zombies().size() == 1, "expected 1  but found " <<  s->zombies().size());
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_ZOMBIE,"user")));
+      BOOST_CHECK_MESSAGE( s->zombies().size() == 0, "expected 0  but found " <<  s->zombies().size());
+   }
+
+   {    // free password
+      TestStateChanged changed(s);
+      std::string returnedValue;
+      BOOST_CHECK_MESSAGE( !task->findVariableValue(Str::ECF_PASS(),returnedValue), "Expected no variable of name ECF_PASS");
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(task->absNodePath(),AlterCmd::ADD_VARIABLE,Str::ECF_PASS(),Submittable::FREE_JOBS_PASSWORD())));
+
+      BOOST_CHECK_MESSAGE( task->findVariableValue(Str::ECF_PASS(),returnedValue), "Expected to find variable ECF_PASS on the task");
+      BOOST_CHECK_MESSAGE( returnedValue == Submittable::FREE_JOBS_PASSWORD(), "Expected variable value of name " << Submittable::FREE_JOBS_PASSWORD() << " but found " << returnedValue);
+   }
+
+   {
+      // test set and clear flags
+      // Note: we can not really test Flag::Message clear, since that act of clearing, sets the message
+      std::vector<Flag::Type> flag_list = Flag::list();
+      for(size_t i =0; i < flag_list.size(); ++i) {
+         // When any user command(including setting flags) invoked, we set Flag::MESSAGE on the defs.
+         // Hence setting flag Flag::MESSAGE has no effect. Likewise clearing has no affect since it get set
+         if ( flag_list[i] == Flag::MESSAGE)  continue;
+
+         TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),flag_list[i],true)));
+         BOOST_CHECK_MESSAGE( s->flag().is_set(flag_list[i]), "Expected flag " << flag_list[i] << " to be set ");
+
+         TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),flag_list[i],false)));
+         BOOST_CHECK_MESSAGE( ! s->flag().is_set(flag_list[i]), "Expected flag " << flag_list[i] << " to be clear ");
+      }
+   }
+
+   BOOST_CHECK_MESSAGE( defs.get_edit_history(s->absNodePath()).size() == 20, "expected edit_history to be truncated to 20, but found " <<  defs.get_edit_history(s->absNodePath()).size());
+
+   {  // Change suite def status =====================================================================================================
+      TestStateChanged changed(s);
+      std::vector<std::string> dstates = DState::allStates();
+      for(size_t i = 0; i < dstates.size(); i++) {
+         TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEFSTATUS,dstates[i])));
+      }
+      // reset back to suspended
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEFSTATUS,"suspended")));
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_cmd_errors )
+{
+   cout << "Base:: ...test_alter_cmd_errors\n";
+
+   Defs defs;
+   suite_ptr s = defs.add_suite("suite");
+   s->add_task("t1");
+
+   {   // test add variables
+      TestStateChanged changed(s);
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_VARIABLE,"FRED1","_val_")));
+      BOOST_CHECK_MESSAGE( s->variables().size() == 1, "expected 1 variable but found " <<  s->variables().size());
+
+      // test delete variables, with a non existent path
+      TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd("/idont/exist",AlterCmd::DEL_VARIABLE,"FRED1")));
+   }
+
+   /// Destroy singleton's to avoid valgrind from complaining
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Base/test/TestClientHandleCmd.cpp b/ecflow_4_0_7/Base/test/TestClientHandleCmd.cpp
new file mode 100644
index 0000000..b827a41
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestClientHandleCmd.cpp
@@ -0,0 +1,260 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "TestHelper.hpp"
+#include "Suite.hpp"
+
+using namespace std;
+using namespace ecf;
+
+// The client handle commands do not change state & modify change number, hence need to bypass these checks
+static bool bypass_state_modify_change_check = false;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_client_handle_cmd_empty_server )
+{
+   cout << "Base:: ...test_client_handle_cmd_empty_server\n";
+
+   std::vector<std::string> suite_names; suite_names.reserve(5);
+   for(int i=0; i < 5; i++)  suite_names.push_back( "s" + boost::lexical_cast<std::string>(i) );
+
+   defs_ptr new_defs = Defs::create();
+
+   // Register new handle on an EMPTY server. register the suite
+   for(size_t j = 0; j < suite_names.size(); j++)  {
+      std::vector<std::string> names; names.push_back(suite_names[j]);
+      TestHelper::invokeRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(names,false)),bypass_state_modify_change_check);
+   }
+
+   // We should have 5 handle, 1,2,3,4,5
+
+   //std::cout << "   expect failure when dropping(DROP_USER) on handle that does not exist, handle 6" << endl;
+   TestHelper::invokeFailureRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(6)));
+
+   //std::cout << "   expect failure for auto add,on handle that does not exist, handle 6" << endl;
+   TestHelper::invokeFailureRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(6,true /* auto add */)));
+
+   //std::cout << "   expect failure for ADD,on handle that does not exist, handle 6" << endl;
+   TestHelper::invokeFailureRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(6,suite_names,ClientHandleCmd::ADD)));
+
+   //std::cout << "   expect failure for REMOVE, on handle that does not exist, handle 6" << endl;
+   TestHelper::invokeFailureRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(6,suite_names,ClientHandleCmd::REMOVE)));
+
+   for(int handle=1; handle < 6; handle++) {
+
+      //std::cout << "   expect success for dropping handle " << handle << endl;
+      TestHelper::invokeRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(handle)),bypass_state_modify_change_check);
+
+      //std::cout << "   expect failure for auto add,on handle that does not exist, handle " << handle << endl;
+      TestHelper::invokeFailureRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(6,true /* auto add */)));
+
+      //std::cout << "   expect failure for ADD,on handle that does not exist, handle " << handle <<endl;
+      TestHelper::invokeFailureRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(6,suite_names,ClientHandleCmd::ADD)));
+
+      //std::cout << "   expect failure for REMOVE, on handle that does not exist, handle " << handle << "\n" << endl;
+      TestHelper::invokeFailureRequest(new_defs.get(),Cmd_ptr( new ClientHandleCmd(6,suite_names,ClientHandleCmd::REMOVE)));
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_client_handle_cmd_register_and_drop )
+{
+	cout << "Base:: ...test_client_handle_cmd_register_and_drop\n";
+
+	std::vector<std::string> suite_names; suite_names.reserve(6);
+	for(int i=0; i < 5; i++)  suite_names.push_back( "s" + boost::lexical_cast<std::string>(i) );
+
+	Defs defs;
+	for(size_t j = 0; j < suite_names.size(); j++)  defs.addSuite( Suite::create(suite_names[j]) );
+
+	// Register new handle
+	for(size_t j = 0; j < suite_names.size(); j++)  {
+		std::vector<std::string> names; names.push_back(suite_names[j]);
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd(names,false)),bypass_state_modify_change_check);
+		BOOST_CHECK_MESSAGE(defs.client_suite_mgr().clientSuites().size() == j+1,"Expected " << j+1 << " Client suites but found " << defs.client_suite_mgr().clientSuites().size());
+	}
+
+	// Drop the handles. take a copy, since we about to delete clientSuites
+	std::vector<ecf::ClientSuites> clientSuites = defs.client_suite_mgr().clientSuites();
+	for(size_t k =0; k< clientSuites.size(); k++) {
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd( clientSuites[k].handle() )),bypass_state_modify_change_check);
+	}
+	BOOST_CHECK_MESSAGE(defs.client_suite_mgr().clientSuites().empty(),"Expected  no client handles, but found " << defs.client_suite_mgr().clientSuites().size());
+}
+
+
+BOOST_AUTO_TEST_CASE( test_client_handle_cmd_auto_add )
+{
+	cout << "Base:: ...test_client_handle_cmd_auto_add\n";
+
+	std::vector<std::string> suite_names; suite_names.reserve(6);
+	for(int i=0; i < 5; i++)  suite_names.push_back( "s" + boost::lexical_cast<std::string>(i) );
+
+	Defs defs;
+	for(size_t j = 0; j < suite_names.size(); j++)  defs.addSuite( Suite::create(suite_names[j]) );
+
+	// Register new handle, with no suites, but with auto add new suites
+	std::vector<std::string> names;
+	TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd(names,false/* auto_add */)),bypass_state_modify_change_check);
+	BOOST_CHECK_MESSAGE(defs.client_suite_mgr().clientSuites().size() == 1,"Expected 1 Client suites but found " << defs.client_suite_mgr().clientSuites().size());
+	BOOST_CHECK_MESSAGE(defs.client_suite_mgr().clientSuites().front().auto_add_new_suites() == false,"Expected auto add to be disabled");
+
+	// Now enable auto add
+	TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd(defs.client_suite_mgr().clientSuites().front().handle(),true /* auto add */)),bypass_state_modify_change_check);
+	BOOST_CHECK_MESSAGE(defs.client_suite_mgr().clientSuites().front().auto_add_new_suites(),"Expected auto add to be enabled");
+
+	// now add new suite, they should get added to the new client handles
+	names.clear();
+	for(int i=5; i < 10; i++)  names.push_back( "s" + boost::lexical_cast<std::string>(i) );
+	for(size_t j = 0; j < names.size(); j++)  defs.addSuite( Suite::create(names[j]) );
+
+	std::vector<ecf::ClientSuites> clientSuites = defs.client_suite_mgr().clientSuites();
+	std::vector<std::string> handle_suites;
+	clientSuites[0].suites(handle_suites);
+	BOOST_CHECK_MESSAGE(handle_suites == names ,"Expected suites to be automatically added to our handle");
+
+	// Delete the suite s5,s6,s7,s8,s9
+	for(int i=5; i < 10; i++)  {
+		suite_ptr suite = defs.findSuite("s" + boost::lexical_cast<std::string>(i));
+		BOOST_CHECK_MESSAGE(suite.get(),"Failed to find suite s" << i);
+		suite->remove();
+	}
+
+	{  // Even when suites have been removed, we still keep registered suite
+	   // These have to be explicitly deleted by the user
+		std::vector<ecf::ClientSuites> clientSuites = defs.client_suite_mgr().clientSuites();
+		std::vector<std::string> handle_suites;
+		clientSuites[0].suites(handle_suites);
+		BOOST_CHECK_MESSAGE(handle_suites.size() == 5,"Expected handle to have 5 suites but found" << handle_suites.size());
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_client_handle_cmd_add_remove )
+{
+	cout << "Base:: ...test_client_handle_cmd_add_remove\n";
+
+	std::vector<std::string> suite_names; suite_names.reserve(6);
+	for(int i=0; i < 5; i++)  suite_names.push_back( "s" + boost::lexical_cast<std::string>(i) );
+
+	defs_ptr defs =  Defs::create();
+	for(size_t j = 0; j < suite_names.size(); j++)  defs->addSuite( Suite::create(suite_names[j]) );
+	std::vector<std::string> empty_vec;
+
+	// Register new handle, with no suites,
+	{
+	   TestHelper::invokeRequest(defs.get(),Cmd_ptr( new ClientHandleCmd(empty_vec,false)),bypass_state_modify_change_check);
+	   BOOST_CHECK_MESSAGE(defs->client_suite_mgr().clientSuites().size() == 1,"Expected 1 Client suites but found " << defs->client_suite_mgr().clientSuites().size());
+	   BOOST_CHECK_MESSAGE(!defs->client_suite_mgr().handle_changed(1),"Expected No handle change, when no real suites added");
+
+	   defs_ptr created_defs = defs->client_suite_mgr().create_defs(1,defs); // clear the handle change
+	   BOOST_CHECK_MESSAGE(created_defs,"Expected defs to be created");
+	   BOOST_CHECK_MESSAGE(created_defs->suiteVec().empty(),"Expected no suites");
+	   BOOST_CHECK_MESSAGE(!defs->client_suite_mgr().handle_changed(1),"Expected handle changed to be cleared after create_defs()");
+	}
+
+   // Now add suites to the existing handle, then check they match.
+	std::vector<std::string> handle_suites;
+   {
+      TestHelper::invokeRequest(defs.get(),Cmd_ptr( new ClientHandleCmd(defs->client_suite_mgr().clientSuites().front().handle(),suite_names,ClientHandleCmd::ADD)),bypass_state_modify_change_check);
+      defs->client_suite_mgr().clientSuites().front().suites(handle_suites);
+      BOOST_CHECK_MESSAGE(handle_suites == suite_names ,"Expected suites to be added to our handle");
+      BOOST_CHECK_MESSAGE(defs->client_suite_mgr().handle_changed(1),"Expected handle changed when adding new suites to our handle");
+
+      defs_ptr created_defs = defs->client_suite_mgr().create_defs(1,defs); // clear the handle change
+      BOOST_CHECK_MESSAGE(created_defs,"Expected defs to be created");
+      BOOST_CHECK_MESSAGE(created_defs.get() == defs.get(),"When *ALL* suites registered, the returned defs should be the same");
+      BOOST_CHECK_MESSAGE(created_defs->suiteVec().size() == suite_names.size(),"Not all suites created");
+   }
+
+   // Now remove the suites from the handle
+   {
+      TestHelper::invokeRequest(defs.get(),Cmd_ptr( new ClientHandleCmd(defs->client_suite_mgr().clientSuites().front().handle(),suite_names,ClientHandleCmd::REMOVE)),bypass_state_modify_change_check);
+      handle_suites.clear();
+      defs->client_suite_mgr().clientSuites().front().suites(handle_suites);
+      BOOST_CHECK_MESSAGE(handle_suites == empty_vec ,"Expected no suites in our handle but found " << handle_suites.size());
+      BOOST_CHECK_MESSAGE(defs->client_suite_mgr().handle_changed(1),"Expected handle changed when adding new removing suites");
+
+      defs_ptr created_defs = defs->client_suite_mgr().create_defs(1,defs); // clear the handle change
+      BOOST_CHECK_MESSAGE(created_defs,"Expected defs to be created");
+      BOOST_CHECK_MESSAGE(created_defs->suiteVec().empty(),"Expected no suites");
+      BOOST_CHECK_MESSAGE(!defs->client_suite_mgr().handle_changed(1),"Expected handle changed to be cleared after create_defs()");
+   }
+}
+
+static bool check_ordering(Defs& defs)
+{
+   // make sure order of suites in handles is the same as server order
+   const std::vector<suite_ptr>& suite_vec = defs.suiteVec();
+   std::vector<std::string> suite_names;
+   for(size_t i = 0; i <  suite_vec.size(); i++) suite_names.push_back(suite_vec[i]->name());
+
+   // Drop the handles. take a copy, since we about to delete clientSuites
+   std::vector<ecf::ClientSuites> clientSuites = defs.client_suite_mgr().clientSuites();
+   for(size_t k =0; k< clientSuites.size(); k++) {
+      std::vector<std::string> names; names.reserve(6);
+      clientSuites[k].suites(names);
+      if (names != suite_names) return false;
+   }
+   return true;
+}
+
+BOOST_AUTO_TEST_CASE( test_client_handle_suite_ordering )
+{
+   cout << "Base:: ...test_client_handle_suite_ordering\n";
+   // ensure order of suites in a handle is the same as server suites
+
+   std::vector<std::string> suite_names; suite_names.reserve(6);
+   for(int i=0; i < 5; i++)  suite_names.push_back( "s" + boost::lexical_cast<std::string>(i) );
+
+   Defs defs;
+   for(size_t j = 0; j < suite_names.size(); j++)  defs.addSuite( Suite::create(suite_names[j]) );
+
+   // Register 3 new handle
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd(suite_names,true)),bypass_state_modify_change_check);
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd(suite_names,true)),bypass_state_modify_change_check);
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd(suite_names,true)),bypass_state_modify_change_check);
+   BOOST_CHECK_MESSAGE(defs.client_suite_mgr().clientSuites().size() == 3,"Expected 3 Client suites but found " << defs.client_suite_mgr().clientSuites().size());
+
+   // After registration make sure ordering is the same
+   BOOST_CHECK_MESSAGE(check_ordering(defs),"Ordering not preserved after registration of handles");
+
+
+   // Check ordering after OrderNodeCmd
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new OrderNodeCmd("/s0",NOrder::DOWN)));
+   BOOST_CHECK_MESSAGE(check_ordering(defs),"Ordering not preserved after NOrder::DOWN");
+
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new OrderNodeCmd("/s0",NOrder::UP)));
+   BOOST_CHECK_MESSAGE(check_ordering(defs),"Ordering not preserved after NOrder::UP");
+
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new OrderNodeCmd("/s0",NOrder::BOTTOM)));
+   BOOST_CHECK_MESSAGE(check_ordering(defs),"Ordering not preserved after NOrder::BOTTOM");
+
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new OrderNodeCmd("/s0",NOrder::TOP)));
+   BOOST_CHECK_MESSAGE(check_ordering(defs),"Ordering not preserved after NOrder::TOP");
+
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new OrderNodeCmd("/s0",NOrder::ALPHA)));
+   BOOST_CHECK_MESSAGE(check_ordering(defs),"Ordering not preserved after NOrder::ALPHA");
+
+
+   // check ordering after adding new suites, notice we auto add new suites to all our handles
+   defs.add_suite("sxx");
+   BOOST_CHECK_MESSAGE(check_ordering(defs),"Ordering not preserved after adding a new suite");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Base/test/TestCmd.cpp b/ecflow_4_0_7/Base/test/TestCmd.cpp
new file mode 100644
index 0000000..6bb841d
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestCmd.cpp
@@ -0,0 +1,109 @@
+ //============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestHelper.hpp"
+#include "System.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_simple_cmd )
+{
+	cout << "Base:: ...test_simple_cmd\n";
+	// Create the defs file. Note that the default ECF_TRIES = 3
+	//	suite suite
+ 	//	   family f
+ 	//	   		task t1
+ 	//	   		task t2
+ 	//	   endfamily
+	//	endsuite
+	Defs defs;
+	string suite_f_t1 = "suite/f/t1";
+ 	std::string suitename = "suite";
+	family_ptr f = Family::create("f");
+	task_ptr t1 = Task::create("t1");
+	task_ptr t2 = Task::create("t2");
+	suite_ptr s = Suite::create(suitename);
+ 	{
+		f->addTask( t1 );
+		f->addTask( t2 );
+ 		s->addFamily(f);
+		defs.addSuite( s );
+	}
+
+	// ***********************************************************************
+	// Create a request to begin suite
+	// make sure chosen suite can begin to resolve dependencies.
+	// beginning the suite will:
+  	//     1/ set all children to the QUEUED state
+  	//     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+ 	{
+ 		TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd(suitename,false)));
+ 	 	BOOST_CHECK_MESSAGE( s->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s->state()));
+	 	BOOST_CHECK_MESSAGE( f->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f->state()));
+		BOOST_CHECK_MESSAGE( t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(t1->state()));
+		BOOST_CHECK_MESSAGE( t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(t2->state()));
+  	}
+
+
+ 	// ***********************************************************************
+	// Create a request to abort  Node: suite1/f/t1, Since the default ECF_TRIES is > 0, the aborted tasks
+ 	// should be re-submitted, until the task try number > ECF_TRIES
+ 	{
+ 		std::string varValue;
+		if (t1->findParentUserVariableValue( Str::ECF_TRIES(), varValue ))  {
+			int ecf_tries = boost::lexical_cast< int > (varValue);
+			while (1) {
+            TestHelper::invokeRequest(&defs,Cmd_ptr( new AbortCmd(suite_f_t1,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1)));
+            TestHelper::invokeRequest(&defs,Cmd_ptr( new CtsCmd( CtsCmd::FORCE_DEP_EVAL)));
+				BOOST_CHECK_MESSAGE( t1->state() == NState::ACTIVE,  "expected state NState::ACTIVE, but found to be " << NState::toString(t1->state()));
+				BOOST_CHECK_MESSAGE( f->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f->state()));
+				BOOST_CHECK_MESSAGE( s->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s->state()));
+			    //std::cout << "tryNo = " << t1->try_no() << " ECF_TRIES = " <<  ecf_tries << "\n";
+				if ( t1->try_no() == ecf_tries) break;
+			}
+
+			/// Since we have exceeded the try number, abort should mean abort
+			TestHelper::invokeRequest(&defs,Cmd_ptr( new AbortCmd(suite_f_t1,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1)));
+         TestHelper::invokeRequest(&defs,Cmd_ptr( new CtsCmd( CtsCmd::FORCE_DEP_EVAL)),false);
+			BOOST_CHECK_MESSAGE( t1->state() == NState::ABORTED,  "expected state NState::ABORTED, but found to be " << NState::toString(t1->state()));
+			BOOST_CHECK_MESSAGE( f->state() == NState::ABORTED, "expected state NState::ABORTED, but found to be " << NState::toString(f->state()));
+			BOOST_CHECK_MESSAGE( s->state() == NState::ABORTED, "expected state NState::ABORTED, but found to be " << NState::toString(s->state()));
+		}
+ 	}
+
+ 	{
+ 		std::string errorMsg;
+ 		BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg), errorMsg);
+ 	}
+
+	/// Destroy System singleton to avoid valgrind from complaining
+	System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Base/test/TestDeleteNodeCmd.cpp b/ecflow_4_0_7/Base/test/TestDeleteNodeCmd.cpp
new file mode 100644
index 0000000..863d21c
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestDeleteNodeCmd.cpp
@@ -0,0 +1,163 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #16 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MyDefsFixture.hpp"
+#include "TestHelper.hpp"
+#include "DefsStructureParser.hpp"
+#include "DurationTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_delete_node_cmd )
+{
+	cout << "Base:: ...test_delete_node_cmd\n";
+
+	MyDefsFixture fixtureDef;
+	MockServer mockServer(&fixtureDef.defsfile_);
+
+	// IMPORTANT: ******************************************************************************
+	// If the PathsCmd is given a EMPTY list of paths, it will delete *EVERYTHING*
+	// *****************************************************************************************
+
+   // Delete all Aliases
+   {
+      std::vector<alias_ptr> vec;
+      fixtureDef.defsfile_.get_all_aliases(vec);
+      BOOST_CHECK_MESSAGE( vec.size() > 0,"Expected > 0 aliases but found " << vec.size());
+
+      std::vector<std::string> paths; paths.reserve(vec.size());
+      BOOST_FOREACH(alias_ptr t, vec) { paths.push_back(t->absNodePath()); }
+
+      BOOST_CHECK_MESSAGE( !paths.empty(),"Expected paths to be specified, *OTHERWISE* we delete all nodes");
+      PathsCmd cmd(PathsCmd::DELETE,paths);
+      cmd.setup_user_authentification();
+      STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+      BOOST_CHECK_MESSAGE(returnCmd->ok(),"Failed to delete aliases");
+
+      std::vector<alias_ptr> afterDeleteVec;
+      fixtureDef.defsfile_.get_all_aliases(afterDeleteVec);
+      BOOST_REQUIRE_MESSAGE( afterDeleteVec.empty(),"Expected all aliases to be deleted but found " << afterDeleteVec.size());
+   }
+
+	// Delete all tasks
+	{
+		std::vector<Task*> vec;
+		fixtureDef.defsfile_.getAllTasks(vec);
+		BOOST_CHECK_MESSAGE( vec.size() > 0,"Expected > 0 tasks but found " << vec.size());
+
+	   std::vector<std::string> paths; paths.reserve(vec.size());
+	   BOOST_FOREACH(Task* t, vec) { paths.push_back(t->absNodePath()); }
+
+      BOOST_CHECK_MESSAGE( !paths.empty(),"Expected paths to be specified, *OTHERWISE* we delete all nodes");
+      PathsCmd cmd(PathsCmd::DELETE,paths);
+	   cmd.setup_user_authentification();
+	   STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+	   BOOST_CHECK_MESSAGE(returnCmd->ok(),"Failed to delete tasks");
+
+		std::vector<Task*> afterDeleteVec;
+		fixtureDef.defsfile_.getAllTasks(afterDeleteVec);
+		BOOST_REQUIRE_MESSAGE( afterDeleteVec.empty(),"Expected all tasks to be deleted but found " << afterDeleteVec.size());
+	}
+
+	// Delete all Families
+	{
+		// DONT use getAllFamilies as this will return hierarchical families
+		// we don't want to delete families twice
+		//		std::vector<Family*> vec;
+		//		fixtureDef.defsfile_.getAllFamilies(vec);
+ 	}
+
+	// Delete all Suites
+	{
+		std::vector<suite_ptr> vec =  fixtureDef.defsfile_.suiteVec();
+		BOOST_CHECK_MESSAGE( vec.size() > 0,"Expected > 0 Suites but found " << vec.size());
+		BOOST_FOREACH(suite_ptr s, vec) {
+		   {
+		      // Delete all Families
+            // *********************************************************************************************
+            // **EXPLICITLY** check for empty paths otherwise we can end up deleting ALL suites accidentally
+            // if PathsCmd is given an empty list, we will delete all nodes including the suites
+            // *********************************************************************************************
+		      std::vector<family_ptr> familyVec = s->familyVec();
+		      // 	DONT USE:
+		      //        BOOST_FOREACH(family_ptr f, s->familyVec()) {
+		      //  As with this will invalidate the iterators.
+		      std::vector<std::string> paths; paths.reserve(vec.size());
+		      BOOST_FOREACH(family_ptr f, familyVec) { paths.push_back(f->absNodePath()); }
+
+		      if (!paths.empty()) {
+		         PathsCmd cmd(PathsCmd::DELETE,paths);
+		         cmd.setup_user_authentification();
+		         STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+		         BOOST_CHECK_MESSAGE(returnCmd->ok(),"Failed to delete families");
+		         BOOST_REQUIRE_MESSAGE( s->familyVec().empty(),"Expected all Families to be deleted but found " << s->familyVec().size());
+		      }
+		   }
+
+			// delete the suite
+			std::string absNodePath = s->absNodePath();
+	      PathsCmd cmd(PathsCmd::DELETE,absNodePath);
+			cmd.setup_user_authentification();
+			STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+			BOOST_CHECK_MESSAGE(returnCmd->ok(),"Failed to delete suite at path " << absNodePath);
+		}
+
+		BOOST_REQUIRE_MESSAGE( fixtureDef.defsfile_.suiteVec().empty(),"Expected all Suites to be deleted but found " << fixtureDef.defsfile_.suiteVec().size());
+	}
+}
+
+// Will break for valgrind hence commented out
+//BOOST_AUTO_TEST_CASE( test_delete_cmd_for_defs )
+//{
+//   std::string path_to_very_large_defs_file = "/var/tmp/ma0/BIG_DEFS/3199.def";
+//   cout << "Base:: ...test_delete_cmd_for_defs " << path_to_very_large_defs_file;
+//
+//   // Ok will only run locally, so don't fail, for other platforms
+//   if (!fs::exists(path_to_very_large_defs_file))  cout << " ... missing test\n";
+//   else {
+//      Defs defs;
+//      {
+//         DurationTimer duration_timer;
+//         DefsStructureParser checkPtParser( &defs, path_to_very_large_defs_file);
+//         std::string errorMsg,warningMsg;
+//         BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),"failed to parse 3199.def");
+//         cout << " ...Loading took " << duration_timer.duration();
+//         BOOST_CHECK_MESSAGE( duration_timer.duration() < 20,"Loading defs "
+//                              << path_to_very_large_defs_file << " took " << duration_timer.duration() << " Expected to take < 20 seconds");
+//      }
+//
+//      DurationTimer duration_timer;
+//      MockServer mockServer(&defs);
+//      PathsCmd cmd(PathsCmd::DELETE,"",true);
+//      cmd.setup_user_authentification();
+//      STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+//      BOOST_CHECK_MESSAGE(returnCmd->ok(),"Failed to delete defs");
+//      cout << " ...Deleting took " << duration_timer.duration() << "\n";
+//      BOOST_CHECK_MESSAGE( duration_timer.duration() < 2,"Deleting defs "
+//                           << path_to_very_large_defs_file << " took " << duration_timer.duration() << " Expected to take < 2 seconds");
+//   }
+//}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Base/test/TestECFLOW-189.cpp b/ecflow_4_0_7/Base/test/TestECFLOW-189.cpp
new file mode 100644
index 0000000..44cd048
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestECFLOW-189.cpp
@@ -0,0 +1,87 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MyDefsFixture.hpp"
+#include "MockServer.hpp"
+#include "TestHelper.hpp"
+#include "System.hpp"
+#include "PrintStyle.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "Defs.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+static defs_ptr create_defs()
+{
+   // suite s1
+   //   family f1
+   //     trigger f2 == complete
+   //     task t1
+   //     task t2
+   //   endfamily
+   //   family f2
+   //     task t1
+   //     task t2
+   //   endfamily
+   // endsuite
+   defs_ptr theDefs = Defs::create();
+   suite_ptr suite = theDefs->add_suite( "s1" ) ;
+   family_ptr f1  = suite->add_family( "f1" ) ;
+   family_ptr f2  = suite->add_family( "f2" ) ;
+   f1->add_trigger("f2 == complete");
+   f1->add_task("t1");
+   f1->add_task("t2");
+   f2->add_task("t1");
+   f2->add_task("t2");
+
+   return theDefs;
+}
+
+BOOST_AUTO_TEST_CASE( test_ECFLOW_189 )
+{
+   cout << "Base:: ...test_ECFLOW_189\n";
+   defs_ptr the_defs = create_defs();
+   the_defs->beginAll();
+   node_ptr s1 = the_defs->findAbsNode("/s1");
+   node_ptr f1 = the_defs->findAbsNode("/s1/f1");
+   node_ptr t1 = the_defs->findAbsNode("/s1/f1/t1");
+   node_ptr t2 = the_defs->findAbsNode("/s1/f1/t2");
+
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND, t1->absNodePath())));
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND, t2->absNodePath())));
+
+   TestHelper::test_state(t1,DState::SUSPENDED);
+   TestHelper::test_state(t2,DState::SUSPENDED);
+
+   // Now resume /s1/f1/t1 and /s1/f1/t2
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::RESUME, t1->absNodePath())));
+
+   // We expect state to be queued since the trigger on /s1/f1 should prevent jobs from running
+   // If we find submitted or aborted(i.e it was free to run, but could not generate the jobs), then its an error
+   TestHelper::test_state(t1,NState::QUEUED);
+   TestHelper::test_state(t2,NState::QUEUED);
+
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
+   ChangeMgrSingleton::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Base/test/TestForceCmd.cpp b/ecflow_4_0_7/Base/test/TestForceCmd.cpp
new file mode 100644
index 0000000..320b62e
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestForceCmd.cpp
@@ -0,0 +1,922 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MyDefsFixture.hpp"
+#include "MockServer.hpp"
+#include "TestHelper.hpp"
+#include "System.hpp"
+#include "PrintStyle.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+static defs_ptr create_defs()
+{
+   defs_ptr theDefs = Defs::create();
+   suite_ptr suite = theDefs->add_suite( "s1" ) ;
+   family_ptr f1  = suite->add_family( "f1" ) ;
+   task_ptr t1 = f1->add_task("t1");
+   t1->addTime( TimeAttr(10,30));
+   t1->add_alias_only();
+   task_ptr t2 = f1->add_task("t2");
+   t2->add_alias_only();
+   return theDefs;
+}
+
+BOOST_AUTO_TEST_CASE( test_force_cmd )
+{
+   cout << "Base:: ...test_force_cmd\n";
+   defs_ptr the_defs = create_defs();
+   the_defs->beginAll();
+   node_ptr s1 = the_defs->findAbsNode("/s1");
+   node_ptr f1 = the_defs->findAbsNode("/s1/f1");
+   node_ptr t1 = the_defs->findAbsNode("/s1/f1/t1");
+   node_ptr t2 = the_defs->findAbsNode("/s1/f1/t2");
+
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE(t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+   BOOST_CHECK_MESSAGE(!f1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be NOT set");
+   BOOST_CHECK_MESSAGE(!s1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be NOT set");
+
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(t2->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t2,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE(!t2->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be NOT set since there are NO time depedencies");
+   BOOST_CHECK_MESSAGE(!f1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be NOT set");
+   BOOST_CHECK_MESSAGE(!s1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be NOT set");
+
+
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(s1->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(s1,NState::COMPLETE);
+   TestHelper::test_state(f1,NState::COMPLETE);
+   TestHelper::test_state(t1,NState::COMPLETE);
+
+   int clear_suspended_in_child_nodes = 0;
+   s1->requeue(true,clear_suspended_in_child_nodes,false);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear after requeue");
+   BOOST_CHECK_MESSAGE(!t2->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear after requeue");
+   BOOST_CHECK_MESSAGE(!f1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear after requeue");
+   BOOST_CHECK_MESSAGE(!s1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear after requeue");
+
+   node_ptr alias = the_defs->findAbsNode("/s1/f1/t1/alias0");
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(alias->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(alias,NState::COMPLETE);
+}
+
+
+static void doForce(MockServer& mockServer,
+         Node* node,
+         const std::string& stateOrEvent,
+         const std::vector<Node*>& nodes)
+{
+   ForceCmd cmd(node->absNodePath(), stateOrEvent, true /*recursive */, true /* set Repeat to last value */);
+   cmd.setup_user_authentification();
+   STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+   BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to force for node " << node->debugNodePath());
+
+   for(size_t i = 0; i < nodes.size(); i++) {
+      if (NState::isValid(stateOrEvent)) {
+         NState::State state = NState::toState(stateOrEvent);
+
+         // Force Cmd recursive does **NOT** apply to aliases.
+         if (nodes[i]->isAlias()) {
+            // The alias should still be in default QUEUED state
+            BOOST_CHECK_MESSAGE( nodes[i]->state() == NState::QUEUED, "Expected state NState::QUEUED for alias but found " << NState::toString(nodes[i]->state()) << " for alias " << nodes[i]->debugNodePath());
+         }
+         else {
+            BOOST_CHECK_MESSAGE( nodes[i]->state() == state, "Expected state " << NState::toString(state) << " but found " << NState::toString(nodes[i]->state()) << " for node " << nodes[i]->debugNodePath());
+         }
+      }
+      else  BOOST_CHECK_MESSAGE(false, "oops");
+
+      if (!(nodes[i]->repeat().empty())) {
+         BOOST_CHECK_MESSAGE( !nodes[i]->repeat().valid(), "Expected repeat to be set to last value. ie in valid");
+      }
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_force_cmd_recursive )
+{
+   cout << "Base:: ...test_force_cmd_recursive\n";
+
+   defs_ptr the_defs = create_defs();
+   node_ptr suite = the_defs->findAbsNode("/s1");
+   std::vector<Node*> nodes;
+   suite->getAllNodes(nodes);
+
+   MockServer mockServer(the_defs);
+   std::vector< std::string > all_states = NState::allStates();
+   BOOST_FOREACH(const std::string& state, all_states) {
+      doForce(mockServer,suite.get(),state,nodes);
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_force_cmd_bubbles_up_state_changes )
+{
+   cout << "Base:: ...test_force_cmd_bubbles_up_state_changes\n";
+
+   defs_ptr the_defs = create_defs();
+   std::vector<Node*> nodes;
+   std::vector<Task*> tasks;
+   the_defs->getAllNodes(nodes);
+   the_defs->getAllTasks(tasks);
+   node_ptr suite = the_defs->findAbsNode("/s1");
+
+   MockServer mockServer(the_defs);
+
+   std::vector< std::string > all_states = NState::allStates();
+   BOOST_FOREACH(const std::string& state, all_states) {
+
+      // 		cout << "Setting all tasks to state " << state << "\n";
+      BOOST_FOREACH(Task* task, tasks) {
+         ForceCmd cmd(task->absNodePath(), state, false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+         BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to force for node " << task->debugNodePath());
+      }
+
+      // Check that state change set on task has bubbled up to the suite.
+      // Since the state has been set on *all* tasks
+      // 		cout << "Suite state = " << NState::toString(suite->state()) << "\n";
+      NState::State expected_state = NState::toState(state);
+      BOOST_CHECK_MESSAGE( suite->state() == expected_state, "Expected state " << NState::toString(expected_state) << " but found " << NState::toString(suite->state()) << " for suite " << suite->debugNodePath());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_force_cmd_alias_does_not_bubble_up_state_changes )
+{
+   cout << "Base:: ...test_force_cmd_alias_does_not_bubble_up_state_changes\n";
+
+   defs_ptr the_defs = create_defs();
+   std::vector<Node*> nodes;
+   std::vector<alias_ptr> aliases;
+   the_defs->getAllNodes(nodes);
+   the_defs->get_all_aliases(aliases);
+   node_ptr suite = the_defs->findAbsNode("/s1");
+
+   // initialize by setting all nodes to state QUEUED
+   BOOST_FOREACH(Node* n, nodes) { n->set_state(NState::QUEUED); }
+
+   MockServer mockServer(the_defs);
+   std::vector< std::string > all_states = NState::allStates();
+   BOOST_FOREACH(const std::string& state, all_states) {
+
+      BOOST_FOREACH(alias_ptr alias, aliases) {
+         ForceCmd cmd(alias->absNodePath(), state, false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+         BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to force for alias " << alias->debugNodePath());
+      }
+
+      // Check that state change set on alias has *NOT* bubbled up to the suite.
+      BOOST_CHECK_MESSAGE( suite->state() == NState::QUEUED, "Expected suite to have state QUEUED but found " << NState::toString(suite->state()));
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_force_events )
+{
+   cout << "Base:: ...test_force_events\n";
+
+   MyDefsFixture fixtureDef;
+   MockServer mockServer(&fixtureDef.defsfile_);
+
+   node_ptr suite = fixtureDef.fixtureDefsFile().findAbsNode("/suiteName");
+   BOOST_REQUIRE_MESSAGE( suite.get(), "Could not find suite");
+   std::vector<Node*> nodes;
+   suite->getAllNodes(nodes);
+
+   /// Set and clear events
+   BOOST_FOREACH(Node* node, nodes) {
+      BOOST_FOREACH(const Event& e, node->events()) {
+         std::string path = node->absNodePath() + ":" + e.name_or_number();
+         ForceCmd cmd(path, Event::SET(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+         BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to force event for node " << node->debugNodePath());
+      }
+      BOOST_FOREACH(const Event& e, node->events()) {
+         BOOST_CHECK_MESSAGE(e.value(), "Event not set as expected for node " << node->debugNodePath());
+      }
+   }
+   BOOST_FOREACH(Node* node, nodes) {
+      BOOST_FOREACH(const Event& e, node->events()) {
+         std::string path = node->absNodePath() + ":" + e.name_or_number();
+         ForceCmd cmd(path, Event::CLEAR(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+         BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to force event for node " << node->debugNodePath());
+      }
+      BOOST_FOREACH(const Event& e, node->events()) {
+         BOOST_CHECK_MESSAGE(!e.value(), "Event not cleared as expected for node " << node->debugNodePath());
+      }
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_force_events_errors )
+{
+   cout << "Base:: ...test_force_events_errors\n";
+
+   MyDefsFixture fixtureDef;
+   MockServer mockServer(&fixtureDef.defsfile_);
+
+   node_ptr suite = fixtureDef.fixtureDefsFile().findAbsNode("/suiteName");
+   BOOST_REQUIRE_MESSAGE( suite.get(), "Could not find suite");
+   std::vector<Node*> nodes;
+   suite->getAllNodes(nodes);
+
+   /// Make a path that does not exist
+   BOOST_FOREACH(Node* node, nodes) {
+      BOOST_FOREACH(const Event& e, node->events()) {
+         std::string path = node->absNodePath() + "/path/doesnot/exist" + ":" + e.name_or_number();
+         ForceCmd cmd(path, Event::SET(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         BOOST_REQUIRE_THROW(cmd.handleRequest( &mockServer ) , std::runtime_error);
+      }
+   }
+   BOOST_FOREACH(Node* node, nodes) {
+      BOOST_FOREACH(const Event& e, node->events()) {
+         std::string path = node->absNodePath() + "/path/doesnot/exist" + ":" + e.name_or_number();
+         ForceCmd cmd(path, Event::CLEAR(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         BOOST_REQUIRE_THROW(cmd.handleRequest( &mockServer ) , std::runtime_error);
+      }
+   }
+
+   /// Make path that does not contain a event
+   BOOST_FOREACH(Node* node, nodes) {
+      if (node->events().empty()) {
+         std::string path = node->absNodePath() ;
+         ForceCmd cmd(path, Event::SET(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         BOOST_REQUIRE_THROW(cmd.handleRequest( &mockServer ) , std::runtime_error);
+      }
+   }
+   BOOST_FOREACH(Node* node, nodes) {
+      if (node->events().empty()) {
+         std::string path = node->absNodePath();
+         ForceCmd cmd(path, Event::CLEAR(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         BOOST_REQUIRE_THROW(cmd.handleRequest( &mockServer ) , std::runtime_error);
+      }
+   }
+
+   /// Make a event that does not exist
+   BOOST_FOREACH(Node* node, nodes) {
+      BOOST_FOREACH(const Event& e, node->events()) {
+         std::string path = node->absNodePath() +  ":" + e.name_or_number() + "made_up";
+         ForceCmd cmd(path, Event::SET(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         BOOST_REQUIRE_THROW(cmd.handleRequest( &mockServer ) , std::runtime_error);
+      }
+   }
+   BOOST_FOREACH(Node* node, nodes) {
+      BOOST_FOREACH(const Event& e, node->events()) {
+         std::string path = node->absNodePath() + ":" + e.name_or_number() + "made_up";
+         ForceCmd cmd(path, Event::CLEAR(), false /*recursive */, false /* set Repeat to last value */);
+         cmd.setup_user_authentification();
+         BOOST_REQUIRE_THROW(cmd.handleRequest( &mockServer ) , std::runtime_error);
+      }
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_force_interactive )
+{
+   // This test is custom. When the user interactively forces a node to the
+   // complete state, and that node has pending time activities. The default
+   // behaviour, is the node is re-queued again, and hence the propagation up the
+   // node tree does not happen. This is test checks that the node does *not* exhibit
+   // this functionality. What we want is that task is set to complete, without
+   // forcing a re-queue, this is then propagated up the node tree. Which forces the
+   // family to complete, and hence update the repeat variable.
+   cout << "Base:: ...test_force_interactive\n";
+
+   //   suite s1
+   //     family daily
+   //       repeat date YMD 20101215 20101217 1
+   //       task t1
+   //         time 11:30
+   //     endfamily
+   //   endsuite
+   // make sure time is set *before* 11:30, so that time dependency holds the task
+   defs_ptr the_defs = Defs::create();
+   suite_ptr suite = Suite::create( "s1" ) ;
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(1/*hour*/,0/*minutes*/);
+   suite->addClock( clockAttr );
+   family_ptr f1  = Family::create( "daily" ) ;
+   f1->addRepeat( RepeatDate("date", 20101215, 20101217) );
+   task_ptr t1 = Task::create("t1" );
+   t1->addTime( ecf::TimeAttr(ecf::TimeSlot(11,30)) );
+   f1->addTask( t1 );
+   suite->addFamily( f1 );
+   the_defs->addSuite( suite );
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+   BOOST_CHECK_MESSAGE(!f1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, before test");
+   BOOST_CHECK_MESSAGE(!suite->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_REQUIRE_MESSAGE(f1->repeat().value() == 20101215,"Repeat value expected is 20101215 but found " << f1->repeat().value());
+
+
+   // Force the task t1 to complete state.
+   // Since task t1 is complete, the family 'daily' should complete.
+   // This will cause the repeat to take the next value anf forcing a requeue
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_REQUIRE_MESSAGE(f1->repeat().value() == 20101216,"Repeat value expected is 20101216 but found " << f1->repeat().value());
+
+   // Reque should mean flag was cleared + on suite should never get set, since flag is stopped at repeat
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, since task was REQUED");
+   BOOST_CHECK_MESSAGE(!f1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, since family was REQUED");
+   BOOST_CHECK_MESSAGE(!suite->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, since repeat should stop flag propagation up node tree");
+
+   // Force the task t1 to complete again
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_REQUIRE_MESSAGE(f1->repeat().value() == 20101217,"Repeat value expected is 20101217 but found " << f1->repeat().value());
+
+   // Do for the last time,
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   TestHelper::test_state(f1,NState::COMPLETE);
+   TestHelper::test_state(suite,NState::COMPLETE);
+
+   // Since we completed, without a requeue, we should expect flag to stay set.
+   BOOST_CHECK_MESSAGE(t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set, since there was no reque");
+
+   // Flag propagation should stop at the repeat
+   BOOST_CHECK_MESSAGE(!suite->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP *NOT* to be set");
+}
+
+BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot )
+{
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user has a single time slot. We should stay complete and NOT requee
+   //
+   cout << "Base:: ...test_force_interactive_next_time_slot\n";
+
+   //   suite s1
+   //       task t1
+   //          time 10:00
+   //   endsuite
+   // make sure time is set *before* 10:00, so that time dependency holds the task
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   task_ptr t1 = suite->add_task("t1");
+   t1->addTime( TimeAttr(10,0) );
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // start at 09:30
+   suite->addClock( clockAttr );
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   cout << the_defs << "\n";
+
+   // since we started at 09:30 the next time slot should be 10:00
+   const TimeSlot& next_time_slot  = t1->timeVec().back().time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(10,0),"Expected next time slot of 10:00 but found " << next_time_slot.toString());
+
+   // Force the task t1 to complete state. Since we had ONLY a SINGLE time dependency we should stay complete
+   // It should also advance the next time slot
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE( !t1->timeVec().back().time_series().is_valid(),"Expected 10:00 time slot to have expired");
+   BOOST_CHECK_MESSAGE( t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+
+   // call again should, should be do difference
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE( !t1->timeVec().back().time_series().is_valid(),"Expected 10:00 time slot to have expired");
+   BOOST_CHECK_MESSAGE( t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+
+   /// we will now Re-queue, Since the time is still 09:30, we expect next_time slot to be 10:00
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new RequeueNodeCmd(t1->absNodePath())));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(10,0),"After Re-queue, Expected next time slot of 10:00 but found " << next_time_slot.toString());
+}
+
+
+BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_1 )
+{
+   // Start TIME at 9:30
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user set of time slots. In this case the node should complete and then
+   // requee and miss the next time. If this is repeated, eventually we should reach the
+   // end of the time slot. In which case the node should *not* re-queue and stay complete
+   //
+   // When the node is then re-queued check that the time has been correctly reset.
+   cout << "Base:: ...test_force_interactive_next_time_slot_1\n";
+
+   //   suite s1
+   //       task t1
+   //          time 10:00
+   //          time 11:00
+   //          time 12:00
+   //          time 13:00
+   //   endsuite
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   task_ptr t1 = suite->add_task("t1");
+   t1->addTime( TimeAttr(10,0) );
+   t1->addTime( TimeAttr(11,0) );
+   t1->addTime( TimeAttr(12,0) );
+   t1->addTime( TimeAttr(13,0) );
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // *start* at 9:30
+   suite->addClock( clockAttr );
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   cout << the_defs << "\n";
+
+   // get all the time attributes
+   const TimeSeries& ts_10 = t1->timeVec()[0].time_series();
+   const TimeSeries& ts_11 = t1->timeVec()[1].time_series();
+   const TimeSeries& ts_12 = t1->timeVec()[2].time_series();
+   const TimeSeries& ts_13 = t1->timeVec()[3].time_series();
+   BOOST_CHECK_MESSAGE( ts_10.is_valid(),  "Expected time 10 to be valid since we started at 9:30 ");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid since we started at 9:30");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid since we started at 9:30");
+
+   const TimeSlot& time_10 = t1->timeVec()[0].time_series().get_next_time_slot();
+   const TimeSlot& time_11 = t1->timeVec()[1].time_series().get_next_time_slot();
+   const TimeSlot& time_12 = t1->timeVec()[2].time_series().get_next_time_slot();
+   const TimeSlot& time_13 = t1->timeVec()[3].time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( time_10 == TimeSlot(10,0),"Expected next time slot of 10:00 but found " << time_10.toString());
+   BOOST_CHECK_MESSAGE( time_11 == TimeSlot(11,0),"Expected next time slot of 11:00 but found " << time_11.toString());
+   BOOST_CHECK_MESSAGE( time_12 == TimeSlot(12,0),"Expected next time slot of 12:00 but found " << time_12.toString());
+   BOOST_CHECK_MESSAGE( time_13 == TimeSlot(13,0),"Expected next time slot of 13:00 but found " << time_13.toString());
+
+
+   // Force the task t1 to complete state. Since we have a future time dependency, we should get re-queued again
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired  ");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid.");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid");
+
+   // Repeat
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid");
+
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_12.is_valid(), "Expected time 12 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid");
+
+
+   // Repeat *last* time, since all times have expired, we expect task to stay complete.
+   // Addtionally since we have *not* re-queued the flag NO_REQUE_IF_SINGLE_TIME_DEP should have remained set
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE( t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired since we started clock at 10:30 ");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_12.is_valid(), "Expected time 12 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_13.is_valid(), "Expected time 13 to be expired due to force cmd");
+
+   /// we will now Re-queue, Since the time is still 10:30, we expect valid from 11:00 and not 10:00
+   /// We should also have cleared NO_REQUE_IF_SINGLE_TIME_DEP
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new RequeueNodeCmd(t1->absNodePath())));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( ts_10.is_valid(),  "Expected time 10 to be in valid since we started clock at 9:30 ");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid");
+}
+
+BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_2 )
+{
+   // Start TIME at 9:30
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user has a time range. In this case the node should complete and then
+   // requee and miss the next time slot. If this is repeated, eventually we should reach the
+   // end of the time slot. In which case the node should *not* reque and stay complete
+   //
+   // When the node is then requeed check that the next time slot has been correctly reset.
+   cout << "Base:: ...test_force_interactive_next_time_slot_2\n";
+
+   //   suite s1
+   //       task t1
+   //          time 10:00 14:00 01:00
+   //   endsuite
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   task_ptr t1 = suite->add_task("t1");
+   t1->addTime( TimeAttr(TimeSlot(10,0),TimeSlot(14,0),TimeSlot(1,0)) );
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // start at 99:30
+   suite->addClock( clockAttr );
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   cout << the_defs << "\n";
+
+   // since we started at 09:30 the next time slot should be 10:00
+   const TimeSlot& next_time_slot  = t1->timeVec().back().time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(10,0),"Expected next time slot of 10:00 but found " << next_time_slot.toString());
+
+   // Force the task t1 to complete state. Since we have a future time dependency, we should get re-queued again
+   // It should also advance the next time slot
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(11,0),"Expected next time slot of 11:00 but found " << next_time_slot.toString());
+
+   // Repeat, to make sure next_time_slot is advanced
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(12,0),"Expected next time slot of 12:00 but found " << next_time_slot.toString());
+
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(13,0),"Expected next time slot of 13:00 but found " << next_time_slot.toString());
+
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(14,0),"Expected next time slot of 14:00 but found " << next_time_slot.toString());
+
+   // Repeat, ** THIS time we have *exceeded* the time range, it should no longer requeue, and should stay complete
+   //         Additionally since there is no reque we expect NO_REQUE_IF_SINGLE_TIME_DEP to remain set
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE(t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(15,0),"Expected next time slot of 15:00 but found " << next_time_slot.toString());
+
+   /// we will now Re-queue, Since the time is still 10:30, we expect next_time slot to be 11:00 and not 10:00
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new RequeueNodeCmd(t1->absNodePath())));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(10,0),"After Re-queue, Expected next time slot of 10:00 but found " << next_time_slot.toString());
+}
+
+
+BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_3 )
+{
+   // Start TIME at 10:30
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user set of time slots. In this case the node should complete and then
+   // requee and miss the next time. If this is repeated, eventually we should reach the
+   // end of the time slot. In which case the node should *not* re-queue and stay complete
+   //
+   // When the node is then re-queued check that the time has been correctly reset.
+   cout << "Base:: ...test_force_interactive_next_time_slot_3\n";
+
+   //   suite s1
+   //       task t1
+   //          time 10:00
+   //          time 11:00
+   //          time 12:00
+   //          time 13:00
+   //   endsuite
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   task_ptr t1 = suite->add_task("t1");
+   t1->addTime( TimeAttr(10,0) );
+   t1->addTime( TimeAttr(11,0) );
+   t1->addTime( TimeAttr(12,0) );
+   t1->addTime( TimeAttr(13,0) );
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(10/*hour*/,30/*minutes*/); // *start* at 10:30
+   suite->addClock( clockAttr );
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   cout << the_defs << "\n";
+
+   // get all the time attributes
+   const TimeSeries& ts_10 = t1->timeVec()[0].time_series();
+   const TimeSeries& ts_11 = t1->timeVec()[1].time_series();
+   const TimeSeries& ts_12 = t1->timeVec()[2].time_series();
+   const TimeSeries& ts_13 = t1->timeVec()[3].time_series();
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be in-valid since we started clock at 10:30 ");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid since we started at 10:30");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid since we started at 10:30");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid since we started at 10:30");
+
+   const TimeSlot& time_10 = t1->timeVec()[0].time_series().get_next_time_slot();
+   const TimeSlot& time_11 = t1->timeVec()[1].time_series().get_next_time_slot();
+   const TimeSlot& time_12 = t1->timeVec()[2].time_series().get_next_time_slot();
+   const TimeSlot& time_13 = t1->timeVec()[3].time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( time_10 == TimeSlot(10,0),"Expected next time slot of 10:00 but found " << time_10.toString());
+   BOOST_CHECK_MESSAGE( time_11 == TimeSlot(11,0),"Expected next time slot of 11:00 but found " << time_11.toString());
+   BOOST_CHECK_MESSAGE( time_12 == TimeSlot(12,0),"Expected next time slot of 12:00 but found " << time_12.toString());
+   BOOST_CHECK_MESSAGE( time_13 == TimeSlot(13,0),"Expected next time slot of 13:00 but found " << time_13.toString());
+
+
+   // Force the task t1 to complete state. Since we have a future time dependency, we should get re-queued again
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired since we started clock at 10:30 ");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired, since we just completed.");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid");
+
+   // Repeat
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired since we started clock at 10:30 ");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_12.is_valid(), "Expected time 12 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid");
+
+   // Repeat *last* time, since all times have expired, we expect task to complete.
+   // Addtionally since we have *not* re-queued the flag NO_REQUE_IF_SINGLE_TIME_DEP should have remained set
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE( t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be expired since we started clock at 10:30 ");
+   BOOST_CHECK_MESSAGE( !ts_11.is_valid(), "Expected time 11 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_12.is_valid(), "Expected time 12 to be expired due to force cmd");
+   BOOST_CHECK_MESSAGE( !ts_13.is_valid(), "Expected time 13 to be expired due to force cmd");
+
+   /// we will now Re-queue, Since the time is still 10:30, we expect valid from 11:00 and not 10:00
+   /// We should also have cleared NO_REQUE_IF_SINGLE_TIME_DEP
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new RequeueNodeCmd(t1->absNodePath())));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( !ts_10.is_valid(), "Expected time 10 to be in valid since we started clock at 10:30 ");
+   BOOST_CHECK_MESSAGE( ts_11.is_valid(),  "Expected time 11 to be valid");
+   BOOST_CHECK_MESSAGE( ts_12.is_valid(),  "Expected time 12 to be valid");
+   BOOST_CHECK_MESSAGE( ts_13.is_valid(),  "Expected time 13 to be valid");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_4 )
+{
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user has a time range. In this case the node should complete and then
+   // requee and miss the next time slot. If this is repeated, eventually we should reach the
+   // end of the time slot. In which case the node should *not* reque and stay complete
+   //
+   // When the node is then requeed check that the next time slot has been correctly reset.
+   cout << "Base:: ...test_force_interactive_next_time_slot_4\n";
+
+   //   suite s1
+   //       task t1
+   //          time 10:00 14:00 01:00
+   //   endsuite
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   task_ptr t1 = suite->add_task("t1");
+   t1->addTime( TimeAttr(TimeSlot(10,0),TimeSlot(14,0),TimeSlot(1,0)) );
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(10/*hour*/,30/*minutes*/); // start at 10:30
+   suite->addClock( clockAttr );
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   cout << the_defs << "\n";
+
+   // since we started at 10:30 the next time slot should be 11:00
+   const TimeSlot& next_time_slot  = t1->timeVec().back().time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(11,0),"Expected next time slot of 11:00 but found " << next_time_slot.toString());
+
+   // Force the task t1 to complete state. Since we have a future time dependency, we should get re-queued again
+   // It should also advance the next time slot
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(12,0),"Expected next time slot of 12:00 but found " << next_time_slot.toString());
+
+   // Repeat, to make sure next_time_slot is advanced
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(13,0),"Expected next time slot of 13:00 but found " << next_time_slot.toString());
+
+   // Repeat, to make sure next_time_slot is advanced
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(14,0),"Expected next time slot of 14:00 but found " << next_time_slot.toString());
+
+   // Repeat, ** THIS time we have *exceeded* the time range, it should no longer requeue, and should stay complete
+   //         Additionally since there is no reque we expect NO_REQUE_IF_SINGLE_TIME_DEP to remain set
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE(t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(15,0),"Expected next time slot of 15:00 but found " << next_time_slot.toString());
+
+   /// we will now Re-queue, Since the time is still 10:30, we expect next_time slot to be 11:00 and not 10:00
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new RequeueNodeCmd(t1->absNodePath())));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(11,0),"After Re-queue, Expected next time slot of 11:00 but found " << next_time_slot.toString());
+}
+
+
+BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_for_cron )
+{
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user has a time range. In this case the node should complete and then
+   // requee and miss the next time slot. If this is repeated, eventually we should reach the
+   // end of the time slot.
+   //
+   // When the node is then requeed check that the next time slot has been correctly reset.
+   cout << "Base:: ...test_force_interactive_next_time_slot_for_cron\n";
+
+   //   suite s1
+   //       task t1
+   //          cron 10:00 13:00 01:00
+   //   endsuite
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // start at 09:30
+   suite->addClock( clockAttr );
+
+   task_ptr t1 = suite->add_task("t1");
+   ecf::CronAttr cronAttr;
+   cronAttr.addTimeSeries(TimeSlot(10,0),TimeSlot(13,0),TimeSlot(1,0));
+   t1->addCron(cronAttr);
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   cout << the_defs << "\n";
+
+   // since we started at 09:30 the next time slot should be 10:00
+   const TimeSlot& next_time_slot  = t1->crons().back().time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(10,0),"Expected next time slot of 10:00 but found " << next_time_slot.toString());
+
+   // Force the task t1 to complete state. Since we have a future time dependency, we should get re-queued again
+   // It should also advance the next time slot
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(11,0),"Expected next time slot of 11:00 but found " << next_time_slot.toString());
+
+   // Repeat, to make sure next_time_slot is advanced
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(12,0),"Expected next time slot of 12:00 but found " << next_time_slot.toString());
+
+   // Repeat, to make sure next_time_slot is advanced
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(13,0),"Expected next time slot of 13:00 but found " << next_time_slot.toString());
+
+   // Repeat, ** THIS time we have *exceeded* the time range, However the cron *ALWAYS* re-queues
+   //         Additionally since there is no reque we expect NO_REQUE_IF_SINGLE_TIME_DEP to remain set
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear, after a requeue");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(14,0),"Expected next time slot of 14:00 but found " << next_time_slot.toString());
+
+   /// we will now Re-queue, Since the time is still 09:30, we expect next_time slot to be 10:00 and not 14:00
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new RequeueNodeCmd(t1->absNodePath())));
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE( next_time_slot == TimeSlot(10,0),"After Re-queue, Expected next time slot of 10:00 but found " << next_time_slot.toString());
+}
+
+
+BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_for_cron_on_family )
+{
+   // This test is custom. When the user interactively forces a node to the complete state,
+   // But where the user has a time range. In this case the node should complete and then
+   // requee and miss the next time slot. If this is repeated, eventually we should reach the
+   // end of the time slot.
+   //
+   // When the node is then requeed check that the next time slot has been correctly reset.
+   cout << "Base:: ...test_force_interactive_next_time_slot_for_cron_on_family\n";
+
+   //   suite s1
+   //     family
+   //       cron 10:00 13:00 01:00
+   //       task t1
+   //          time 11:00
+   //       task t2
+   //          time 12:00
+   //   endsuite
+   Defs the_defs;
+   suite_ptr suite = the_defs.add_suite("s1");
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // start at 09:30
+   suite->addClock( clockAttr );
+
+   family_ptr f1 = suite->add_family("f1");
+   ecf::CronAttr cronAttr;
+   cronAttr.addTimeSeries(TimeSlot(10,0),TimeSlot(13,0),TimeSlot(1,0));
+   f1->addCron(cronAttr);
+
+   task_ptr t1 = f1->add_task("t1");
+   t1->addTime( TimeAttr(11,0) );
+
+   task_ptr t2 = f1->add_task("t2");
+   t2->addTime( TimeAttr(12,0) );
+
+   // before test flags should be clear
+   BOOST_CHECK_MESSAGE(!f1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+   BOOST_CHECK_MESSAGE(!t2->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear,before test");
+
+   /// begin the suite
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new BeginCmd("s1",false)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   TestHelper::test_state(t2,NState::QUEUED);
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   cout << the_defs << "\n";
+
+   // since we started at 09:30 the next time slot should be 11:00
+   const TimeSlot& t1_next_time_slot  = t1->timeVec().back().time_series().get_next_time_slot();
+   const TimeSlot& t2_next_time_slot  = t2->timeVec().back().time_series().get_next_time_slot();
+   BOOST_CHECK_MESSAGE( t1_next_time_slot == TimeSlot(11,0),"Expected next time slot of 11:00 but found " << t1_next_time_slot.toString());
+   BOOST_CHECK_MESSAGE( t2_next_time_slot == TimeSlot(12,0),"Expected next time slot of 12:00 but found " << t2_next_time_slot.toString());
+
+   // Force the task t1 & t2 to complete state. Since we only have a single time dependency it should expire
+   // It should also advance the next time slot
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   TestHelper::test_state(t2,NState::QUEUED);
+   BOOST_CHECK_MESSAGE( ! t1->timeVec().back().time_series().is_valid(),"Expected 11:00 time slot to be expired ");
+
+   // Forcing t2 to complete as well should, end up requeueing t1,t2 due to parent cron
+   TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t2->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::QUEUED);
+   TestHelper::test_state(t2,NState::QUEUED);
+   BOOST_CHECK_MESSAGE( t1->timeVec().back().time_series().is_valid(),"Expected 11:00 time slot to be valid ");
+   BOOST_CHECK_MESSAGE( t2->timeVec().back().time_series().is_valid(),"Expected 12:00 time slot to be valid ");
+   BOOST_CHECK_MESSAGE(!t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+   BOOST_CHECK_MESSAGE(!t2->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
+   ChangeMgrSingleton::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Base/test/TestFreeDepCmd.cpp b/ecflow_4_0_7/Base/test/TestFreeDepCmd.cpp
new file mode 100644
index 0000000..cccb9cb
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestFreeDepCmd.cpp
@@ -0,0 +1,304 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include <boost/test/unit_test.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "Defs.hpp"
+#include "ExprAst.hpp"
+#include "MockServer.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_free_dep_cmd )
+{
+   cout << "Base:: ...test_free_dep_cmd\n";
+
+   // Create a test and add the date and time dependencies
+   ptime theLocalTime(date(2011,Nov,4),  time_duration(9,30,0));
+   ptime time_plus_hour   =  theLocalTime +  hours(1);
+   ptime time_plus_2_hour =  theLocalTime +  hours(2);
+   date todaysDate = theLocalTime.date();
+   date tomorrows_date   = todaysDate + date_duration(1);
+   date tomorrows_date_1 = todaysDate + date_duration(2);
+
+   // Get tomorrow as a day so that isFree fails.
+   tm day_1 = to_tm(tomorrows_date);
+   tm day_2 = to_tm(tomorrows_date_1);
+
+   suite_ptr suite;
+   task_ptr task;
+   Defs theDefs; {
+      suite = theDefs.add_suite( "test_time" );
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task = fam->add_task( "t" );
+      task->addTime( ecf::TimeAttr( TimeSlot(time_plus_hour.time_of_day()) ) );
+      task->addTime( ecf::TimeAttr( TimeSlot(time_plus_2_hour.time_of_day()) ) );
+      task->addTime( ecf::TimeAttr( ecf::TimeSlot(1,1), ecf::TimeSlot(1,3), ecf::TimeSlot(0,1),
+               true /*relative to suite start*/
+      ));
+      task->addToday( ecf::TodayAttr( TimeSlot(time_plus_hour.time_of_day()) ) );
+      task->addToday( ecf::TodayAttr( TimeSlot(time_plus_2_hour.time_of_day()) ) );
+      task->addDate( DateAttr(tomorrows_date.day(),tomorrows_date.month(),tomorrows_date.year()) );
+      task->addDate( DateAttr(tomorrows_date_1.day(),tomorrows_date_1.month(),tomorrows_date_1.year()) );
+      task->addDay( DayAttr(static_cast<DayAttr::Day_t>(day_1.tm_wday) ));
+      task->addDay( DayAttr(static_cast<DayAttr::Day_t>(day_2.tm_wday) ));
+      task->add_trigger( "t2 == complete" );
+
+      CronAttr cronAttr;
+      cronAttr.addTimeSeries( ecf::TimeSlot(time_plus_hour.time_of_day()),
+               ecf::TimeSlot(time_plus_2_hour.time_of_day()),
+               ecf::TimeSlot(0,1)  );
+      task->addCron( cronAttr );
+
+      fam->add_task( "t2" );
+      //  	cout << theDefs << "\n";
+   }
+   std::vector<task_ptr> vec;
+   theDefs.get_all_tasks(vec);
+   BOOST_REQUIRE_MESSAGE(vec.size() == 2,"Error in number of tasks");
+
+   // This will initialise the calendar from the Clock attribute
+   theDefs.beginAll();
+
+   // First all trigger should fail to evaluate AND all dependencies should NOT be free
+   BOOST_REQUIRE_MESSAGE(task->triggerAst(),"Expected trigger abstract syntax tree for task " << task->absNodePath());
+   BOOST_REQUIRE_MESSAGE(!task->triggerAst()->evaluate(),"Trigger should not evaluate");
+
+   const Calendar& cal = suite->calendar();
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal)," Time should not be free");
+   }
+   BOOST_FOREACH(const ecf::TodayAttr&  attr, task->todayVec()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal)," Today should not be free");
+   }
+   BOOST_FOREACH(const ecf::CronAttr&  attr, task->crons()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal)," Cron should not be free");
+   }
+   BOOST_FOREACH(const DateAttr&  attr, task->dates()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal)," Date should not be free");
+   }
+   BOOST_FOREACH(const DayAttr&  attr, task->days()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal),"Day should not be free");
+   }
+
+
+   // Invoke the FreeDepCmd
+   MockServer mockServer(&theDefs);
+
+   FreeDepCmd cmd(task->absNodePath(),true/*trigger*/,true/* all */);
+   cmd.setup_user_authentification();
+   STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+   BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to for FreeDepCmd");
+
+
+   // Dependencies should now all be free now.
+   BOOST_REQUIRE_MESSAGE(task->get_trigger()->isFree(),"Trigger should evaluate");
+   bool at_least_one_free = false;
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Time should be free");
+
+   at_least_one_free = false;
+   BOOST_FOREACH(const ecf::TodayAttr&  attr, task->todayVec()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Today should be free");
+
+   at_least_one_free = false;
+   BOOST_FOREACH(const ecf::CronAttr&  attr, task->crons()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Cron should be free");
+
+   at_least_one_free = false;
+   BOOST_FOREACH(const DateAttr&  attr, task->dates()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Date should be free");
+
+   at_least_one_free = false;
+   BOOST_FOREACH(const DayAttr&  attr, task->days()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Day should be free");
+}
+
+BOOST_AUTO_TEST_CASE( test_free_dep_cmd_single_time_slot )
+{
+   cout << "Base:: ...test_free_dep_cmd_single_time_slot\n";
+
+   // We add a time dependency *AFTER* the suite/calendar time
+   // This checks that we DO NOT re-queue a task with a future time dependency
+   // when a time dependency has been freed
+   ptime theLocalTime(date(2011,Nov,4),  time_duration(9,30,0));
+   ptime time_plus_2minute =  theLocalTime + minutes(2);
+
+   suite_ptr suite;
+   task_ptr task;
+   Defs theDefs; {
+      suite = theDefs.add_suite( "test_time" );
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite->addClock( clockAttr );
+      task = suite->add_task( "t" );
+      task->addTime( ecf::TimeAttr( TimeSlot(time_plus_2minute.time_of_day()) ) );
+   }
+
+   // This will initialise the calendar from the Clock attribute
+   theDefs.beginAll();
+
+   // expect task to be holding at 9:30
+   const Calendar& cal = suite->calendar();
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal)," Time should not be free");
+   }
+
+   // Invoke the FreeDepCmd
+   MockServer mockServer(&theDefs);
+   FreeDepCmd cmd(task->absNodePath(),true/*trigger*/,true/* all */);
+   cmd.setup_user_authentification();
+   STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+   BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to for FreeDepCmd");
+
+   // expect task to be free
+   bool at_least_one_free = false;
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Time should be free");
+
+   // The crux of the test. Should not requeue.
+   BOOST_CHECK_MESSAGE(task->state() == NState::ACTIVE,"Free dependency should have done an immediate job submission. Expected active state");
+   task->complete();
+   BOOST_CHECK_MESSAGE(task->state() == NState::COMPLETE,"Expected Complete but found " << NState::toString(task->state()) << ", free dependency should avoid re-queue for a future single time dependency.");
+}
+
+BOOST_AUTO_TEST_CASE( test_free_dep_cmd_with_time_series )
+{
+   cout << "Base:: ...test_free_dep_cmd_with_time_series\n";
+
+   // We start the suite *IN BETWEEN* a time series, and the force free dependency
+   // This checks that we DO NOT re-queue a task with a future time dependency
+   // when a time dependency has been freed
+   ptime theLocalTime(date(2011,Nov,4),  time_duration(9,29,0));
+   suite_ptr suite;
+   task_ptr task;
+   Defs theDefs; {
+      suite = theDefs.add_suite( "test_time" );
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite->addClock( clockAttr );
+      task = suite->add_task( "t" );
+      task->addTime( ecf::TimeAttr( ecf::TimeSlot(9,28), ecf::TimeSlot(9,30), ecf::TimeSlot(0,2),
+               false /*relative to suite start*/
+      ));
+   }
+
+   // This will initialise the calendar from the Clock attribute
+   theDefs.beginAll();
+
+   // expect task to be holding, at 9:29
+   const Calendar& cal = suite->calendar();
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal)," Time should not be free");
+   }
+
+   // Invoke the FreeDepCmd
+   MockServer mockServer(&theDefs);
+   FreeDepCmd cmd(task->absNodePath(),true/*trigger*/,true/* all */);
+   cmd.setup_user_authentification();
+   STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+   BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to for FreeDepCmd");
+
+   // expect task to be free
+   bool at_least_one_free = false;
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Time should be free");
+
+   // The crux of the test. Should not requeue, as we should have advanced the time slot beyond the END point
+   // i.e FreeDepCmd will advance the time slot, beyond end time
+   BOOST_CHECK_MESSAGE(task->state() == NState::ACTIVE,"Free dependency should have done an immediate job submission. Expected active state");
+   task->complete();
+   BOOST_CHECK_MESSAGE(task->state() == NState::COMPLETE,"Expected Complete but found " << NState::toString(task->state()) << ", free dependency should avoid re-queue for a future single time dependency.");
+}
+
+BOOST_AUTO_TEST_CASE( test_free_dep_cmd_with_time_series_2 )
+{
+   cout << "Base:: ...test_free_dep_cmd_with_time_series_2\n";
+
+   // We start the suite *IN BETWEEN* a time series, and the force free dependency
+   // This time we have a larger range, and *SHOULD* re-queue, even if we miss a time slot
+   ptime theLocalTime(date(2011,Nov,4),  time_duration(9,29,0));
+   suite_ptr suite;
+   task_ptr task;
+   Defs theDefs; {
+      suite = theDefs.add_suite( "test_time" );
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite->addClock( clockAttr );
+      task = suite->add_task( "t" );
+      task->addTime( ecf::TimeAttr( ecf::TimeSlot(9,28), ecf::TimeSlot(9,34), ecf::TimeSlot(0,2),
+               false /*relative to suite start*/
+      ));
+   }
+
+   // This will initialise the calendar from the Clock attribute
+   // Will initialise  nextTimeSlot=09:30
+   theDefs.beginAll();
+
+   // expect task to be holding, at 9:29
+   const Calendar& cal = suite->calendar();
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      BOOST_CHECK_MESSAGE(!attr.isFree(cal)," Time should not be free");
+   }
+
+   // Invoke the FreeDepCmd. This will update next nextTimeSlot to 09:32
+   MockServer mockServer(&theDefs);
+   FreeDepCmd cmd(task->absNodePath(),true/*trigger*/,true/* all */);
+   cmd.setup_user_authentification();
+   STC_Cmd_ptr returnCmd  = cmd.handleRequest( &mockServer );
+   BOOST_REQUIRE_MESSAGE(returnCmd->ok(),"Failed to for FreeDepCmd");
+
+   // expect task to be free
+   bool at_least_one_free = false;
+   BOOST_FOREACH(const ecf::TimeAttr&  attr, task->timeVec()) {
+      if (attr.isFree(cal)) { at_least_one_free = true; break;}
+   }
+   BOOST_CHECK_MESSAGE(at_least_one_free,"At least one Time should be free");
+
+   // The crux of the test. Even if we advance the time slot we should *STILL* be in range
+   BOOST_CHECK_MESSAGE(task->state() == NState::ACTIVE,"Free dependency should have done an immediate job submission. Expected active state");
+   task->complete();
+   BOOST_CHECK_MESSAGE(task->state() == NState::QUEUED,"Expected QUEUED but found " << NState::toString(task->state()) << ", free dependency should avoid re-queue for a future single time dependency.");
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Base/test/TestHelper.hpp b/ecflow_4_0_7/Base/test/TestHelper.hpp
new file mode 100644
index 0000000..371d4f0
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestHelper.hpp
@@ -0,0 +1,90 @@
+#ifndef TESTHELPER_HPP_
+#define TESTHELPER_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #33 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/test/test_tools.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "ClientToServerRequest.hpp"
+#include "MockServer.hpp"
+#include "Node.hpp"
+
+// defines statics utility functions used by more than one test
+class TestHelper {
+public:
+	static void invokeRequest( Defs* defs, Cmd_ptr theCmd, bool check_change_numbers = true ) {
+
+	   // Check that state change happens
+	   unsigned int state_change_no = Ecf::state_change_no();
+	   unsigned int modify_change_no = Ecf::modify_change_no();
+
+	   // Setup command for invocation
+		ClientToServerRequest cmd_request;
+		cmd_request.set_cmd( theCmd );
+	 	// std::cout << cmd_request << "\n";
+
+ 		MockServer server(defs);
+		STC_Cmd_ptr result = cmd_request.handleRequest(&server);
+		BOOST_CHECK_MESSAGE( result, "ClientToServerRequest " << cmd_request << " returned NULL\n");
+		BOOST_CHECK_MESSAGE( result->error().empty(), cmd_request << " " << result->error());
+		if (check_change_numbers) {
+		   BOOST_CHECK_MESSAGE( state_change_no != Ecf::state_change_no() ||  modify_change_no != Ecf::modify_change_no(),
+		                        "State & modify change numbers unaltered by command " << cmd_request);
+
+		   // Some tests(TestSSyncCmd_CH1.cpp), create defs where invariants like change numbers are deliberately different
+		   std::string error_msg;
+	      BOOST_CHECK_MESSAGE(defs->checkInvariants(error_msg),"invokeRequest checkInvariants failed " << error_msg << " for cmd " << cmd_request );
+		}
+	}
+
+	static void invokeFailureRequest( Defs* defs, Cmd_ptr theCmd ) {
+
+		ClientToServerRequest cmd_request;
+		cmd_request.set_cmd( theCmd );
+
+  		MockServer server(defs);
+
+  		// We expect this to fail
+  		BOOST_CHECK_THROW(cmd_request.handleRequest(&server), std::runtime_error );
+   	}
+
+	static void invokeFailureRequest(MockServer& server,  Cmd_ptr theCmd ) {
+
+		ClientToServerRequest cmd_request;
+		cmd_request.set_cmd( theCmd );
+
+  		BOOST_CHECK_THROW(cmd_request.handleRequest(&server), std::runtime_error );
+
+//		STC_Cmd_ptr result = cmd_request.handleRequest(&server);
+//		BOOST_CHECK_MESSAGE( !result->ok(), "ClientToServerRequest " << cmd_request << " was expected to fail \n");
+ 	}
+
+	static void test_state(node_ptr n,NState::State expected)
+	{
+	   BOOST_REQUIRE_MESSAGE(n->state() == expected,"Expected state " << NState::toString(expected) << " but found " << NState::toString(n->state()) << " for " << n->debugNodePath());
+	}
+
+   static void test_state(node_ptr n,DState::State expected)
+   {
+      BOOST_REQUIRE_MESSAGE(n->dstate() == expected,"Expected state " << DState::toString(expected) << " but found " << DState::toString(n->dstate()) << " for " << n->debugNodePath());
+   }
+
+private:
+	TestHelper() {}
+};
+#endif /* TESTHELPER_HPP_ */
+
diff --git a/ecflow_4_0_7/Base/test/TestLimit.cpp b/ecflow_4_0_7/Base/test/TestLimit.cpp
new file mode 100644
index 0000000..ddfb500
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestLimit.cpp
@@ -0,0 +1,669 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestHelper.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_add_limit )
+{
+	cout << "Base:: ...test_add_limit\n";
+	suite_ptr suite = Suite::create("suite");
+	suite->addLimit(Limit("fast",1)) ;        // " Adding limit first time should be ok");
+	BOOST_REQUIRE_THROW(suite->addLimit(Limit("fast",1)), std::runtime_error); //" Adding same limit second time should fail");
+
+	suite->addInLimit(InLimit("fast","/suite")); //" Adding in-limit first time should be ok");
+ 	BOOST_REQUIRE_THROW(suite->addInLimit(InLimit("fast","/suite")), std::runtime_error); // " Adding in-limit second time should fail");
+}
+
+BOOST_AUTO_TEST_CASE( test_limit_increment )
+{
+   cout << "Base:: ...test_limit_increment\n";
+
+   // Test than when a job is submitted multiple times, it should only consume 1 token
+   //
+   // Create the defs file
+   // suite suite
+   //     limit fast 10
+   //    family f
+   //          inlimit /suite:fast
+   //          task t1
+   //    endfamily
+   // endsuite
+   Defs defs;
+   std::string limitName = "fast";
+   std::string pathToLimit = "/suite";
+   std::string suitename = "suite";
+   suite_ptr s = defs.add_suite(suitename);
+   family_ptr f = s->add_family("f");
+   task_ptr  t1 = f->add_task("t1");
+   {
+      f->addInLimit(InLimit(limitName,pathToLimit));
+      s->addLimit(Limit(limitName,10));
+   }
+   // cerr << defs << "\n";
+
+
+   {
+      // Resolve dependencies:: BEFORE calling beginCmd, should be a NO OP
+      JobsParam jobsParam; // create jobs = false, spawn jobs = false
+      Jobs jobs(&defs);
+      BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+      BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 tasks to submit but found " << jobsParam.submitted().size());
+   }
+
+   {
+      // Create a request to begin suite
+      // make sure chosen suite can begin to resolve dependencies.
+      // beginning the suite will:
+      //     1/ set all children to the QUEUED state
+      //     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+      //
+      //  Resolve dependencies. Only one task should be submitted due to Limit
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd(suitename)));
+      BOOST_CHECK_MESSAGE( s->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s->state()));
+      BOOST_CHECK_MESSAGE( f->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f->state()));
+      BOOST_CHECK_MESSAGE( t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(t1->state()));
+   }
+
+   {
+      // Resolve dependencies. No task should submit since we have reached the limit
+      JobsParam jobsParam;  // create jobs = false, spawn jobs = false
+      Jobs jobs(&defs);
+      BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+      BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 task to submit but found " << jobsParam.submitted().size());
+   }
+
+   {
+      // Try resubmitting the an active task, it should still only consume 1 token in the limit
+      BOOST_CHECK_MESSAGE( t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(t1->state()));
+
+      // Hack the state, to allow job to re- resubmitted
+      t1->setStateOnly(NState::QUEUED);
+
+      JobsParam jobsParam;  // create jobs = false, spawn jobs = false
+      Jobs jobs(&defs);
+      BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+      BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 1, "Expected 1 task to submit but found " << jobsParam.submitted().size());
+
+      // Limit should still have only consumed one token
+      limit_ptr limit = s->find_limit(limitName);
+      BOOST_CHECK_MESSAGE( limit.get(), "Limit not found");
+      BOOST_CHECK_MESSAGE( limit->value() == 1, "Expected limit of value 1, but found " << limit->value());
+      BOOST_CHECK_MESSAGE( limit->paths().size() == 1, "Expected Only 1 task path in limit but found " << limit->paths().size());
+   }
+}
+
+
+//===============================================================================
+// This TEST is used to test limit and inLimit.
+// Both examples taken from the documentation
+BOOST_AUTO_TEST_CASE( test_limit )
+{
+	cout << "Base:: ...test_limit\n";
+
+	///////////////////////////////////////////////////////////////////////////
+	// Create the defs file
+	//	suite suite
+	//     limit fast 1
+	//	   family f
+	//          inlimit /suite:fast
+	//	   		task t1
+ 	//	   		task t2
+ 	//	   endfamily
+	//	endsuite
+	Defs defs;
+ 	std::string limitName = "fast";
+ 	std::string pathToLimit = "/suite";
+	std::string suitename = "suite";
+ 	family_ptr f = Family::create("f");
+	task_ptr  t1 = Task::create("t1");
+	task_ptr  t2 = Task::create("t2");
+	suite_ptr s = Suite::create(suitename);
+ 	{
+ 		f->addTask(  t1 );
+		f->addTask(  t2);
+		f->addInLimit(InLimit(limitName,pathToLimit));
+
+ 		s->addFamily(f);
+		s->addLimit(Limit(limitName,1));
+
+		defs.addSuite( s );
+	}
+  	// cerr << defs << "\n";
+
+
+	//*******************************************************************************
+	// Resolve dependencies:: BEFORE calling beginCmd, should be a NO OP
+  	{
+		JobsParam jobsParam; // create jobs = false, spawn jobs = false
+		Jobs jobs(&defs);
+ 		BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+  	 	BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 tasks to submit but found " << jobsParam.submitted().size());
+   	}
+
+	// ***********************************************************************
+	// Create a request to begin suite
+	// make sure chosen suite can begin to resolve dependencies.
+	// beginning the suite will:
+  	//     1/ set all children to the QUEUED state
+  	//     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+  	//
+	//  Resolve dependencies. Only one task should be submitted due to Limit
+  	//
+ 	{
+ 		TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd(suitename)));
+ 	 	BOOST_CHECK_MESSAGE( s->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s->state()));
+	 	BOOST_CHECK_MESSAGE( f->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f->state()));
+		BOOST_CHECK_MESSAGE( t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(t1->state()));
+		BOOST_CHECK_MESSAGE( t2->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(t2->state()));
+  	}
+
+	//*******************************************************************************
+	// Resolve dependencies. No task should submit since we have reached the limit
+	{
+		JobsParam jobsParam; // create jobs = false, spawn jobs = false
+		Jobs jobs(&defs);
+ 		BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+ 		BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 task to submit but found " << jobsParam.submitted().size());
+ 	}
+
+ 	{
+		std::string errorMsg;
+		BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg), errorMsg);
+ 	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_limit1 )
+{
+	cout << "Base:: ...test_limit1\n";
+	////////////////////////////////////////////////////////////////////////////////////////////////////
+	// Create the defs file
+	//	suite suite
+	//     limit disk 50
+	//	   family f
+	//          inlimit /suite:disk 20
+	//	   		task t1
+ 	//	   		task t2
+ 	//	   		task t3
+ 	//	   endfamily
+	//	endsuite
+	//
+	//  Test that only 2 Tasks can run
+	Defs defs;
+ 	std::string limitName = "disk";
+ 	std::string pathToLimit = "/suite";
+	std::string suitename = "suite";
+ 	family_ptr f = Family::create("f");
+	task_ptr  t1 = Task::create("t1");
+	task_ptr  t2 = Task::create("t2");
+	task_ptr  t3 = Task::create("t3");
+	suite_ptr s =  Suite::create(suitename);
+ 	{
+ 		f->addTask(  t1 );
+		f->addTask(  t2 );
+		f->addTask(  t3 );
+		f->addInLimit(InLimit(limitName,pathToLimit,20));
+
+ 		s->addFamily(f);
+		s->addLimit(Limit(limitName,50));
+
+		defs.addSuite( s );
+	}
+ 	// cerr << defs << "\n";
+
+	//*******************************************************************************
+	// Resolve dependencies:: BEFORE calling beginCmd, should be a NO OP
+  	{
+		JobsParam jobsParam; // create jobs = false, spawn jobs = false
+		Jobs jobs(&defs);
+ 		BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+ 	 	BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 tasks to submit but found " << jobsParam.submitted().size());
+   	}
+
+	// ***********************************************************************
+	// Create a request to begin suite
+	// make sure chosen suite can begin to resolve dependencies.
+	// beginning the suite will:
+  	//     1/ set all children to the QUEUED state
+  	//     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+  	//
+	//  Resolve dependencies. Only TWO task should be active due to Limit
+ 	{
+ 		TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd(suitename)));
+ 	 	BOOST_CHECK_MESSAGE( s->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s->state()));
+	 	BOOST_CHECK_MESSAGE( f->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f->state()));
+		BOOST_CHECK_MESSAGE( t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(t1->state()));
+		BOOST_CHECK_MESSAGE( t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(t2->state()));
+		BOOST_CHECK_MESSAGE( t3->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(t3->state()));
+  	}
+
+	//*******************************************************************************
+	// Resolve dependencies. No task should submit since we have reached the limit
+	{
+		JobsParam jobsParam; // create jobs = false, spawn jobs = false
+		Jobs jobs(&defs);
+ 		BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+ 		BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 task to submit but found " << jobsParam.submitted().size());
+		if (jobsParam.submitted().size() != 0 ) {
+			BOOST_FOREACH(Submittable* t, jobsParam.submitted()) { cerr << "Submittable " << t->absNodePath() << "\n";}
+		}
+ 	}
+
+ 	{
+		std::string errorMsg;
+		BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg), errorMsg);
+ 	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_limit_references_after_delete )
+{
+	/// In-limit have a reference to a limit. This limit can be on another node. If that node is deleted
+	/// The limits are also deleted, hence we need to ensure in-limit reference to limits that are being
+	/// deleted are cleared. Currently we use shared_ptr to achieve this
+ 	cout << "Base:: ...test_limit_references_after_delete\n";
+
+	////////////////////////////////////////////////////////////////////////////////////////////////////
+	//  Create the defs file
+	//	suite suiteLimits    # the limit we want delete
+	//     limit limit1  1
+	//     limit limit2  1
+	//     limit limit3  1
+	//	endsuite
+	//
+	//	suite suite
+ 	//	   family f
+	//          inlimit /suiteLimits:limit1    # check limits references cleared after suiteLimits is deleted
+	//	   		task t1
+  	//	   endfamily
+	//	   family f1
+	//          inlimit /suiteLimits:limit2
+	//	   		task t1
+  	//	   endfamily
+	//	   family f2
+	//          inlimit /suiteLimits:limit3
+	//	   		task t1
+  	//	   endfamily
+	//	endsuite
+	//
+	// In this test case we will delete the suiteLimits, and then test to ensure the the in-limits
+	// in suite have been reset.
+	Defs defs;
+	{
+		suite_ptr suite = Suite::create("suiteLimits" );
+ 		suite->addLimit(Limit("limit1",1));
+ 		suite->addLimit(Limit("limit2",1));
+ 		suite->addLimit(Limit("limit3",1));
+		defs.addSuite( suite );
+	}
+
+	InLimit in_limit1("limit1","/suiteLimits");
+	InLimit in_limit2("limit2","/suiteLimits");
+	InLimit in_limit3("limit3","/suiteLimits");
+	{
+		suite_ptr suite = Suite::create("suite");
+
+		family_ptr fam = Family::create("f");
+		fam->addTask( Task::create("t1") );
+  		fam->addInLimit(in_limit1);
+		suite->addFamily(fam);
+
+		family_ptr fam2 = Family::create("f1");
+		fam2->addTask(  Task::create("t1") );
+ 		fam2->addInLimit(in_limit2);
+		suite->addFamily(fam2);
+
+		family_ptr fam3 = Family::create("f2");
+		fam3->addTask(  Task::create("t1") );
+  		fam3->addInLimit(in_limit3);
+		suite->addFamily(fam3);
+
+ 		defs.addSuite( suite );
+	}
+
+
+	// First check that in-limit reference have been setup
+	node_ptr f = defs.findAbsNode("/suite/f");
+	node_ptr f1 = defs.findAbsNode("/suite/f1");
+	node_ptr f2 = defs.findAbsNode("/suite/f2");
+	BOOST_REQUIRE_MESSAGE( f.get() && f1.get() && f2.get(), "Failed to find family than contain the inlimits");
+
+
+	BOOST_REQUIRE_MESSAGE( f->findInLimitByNameAndPath(in_limit1) &&
+	                       f1->findInLimitByNameAndPath(in_limit2) &&
+	                       f2->findInLimitByNameAndPath(in_limit3) , "Failed to find in-limits on the families" << defs);
+
+	// Now check they all reference the limits
+	BOOST_REQUIRE_MESSAGE( f->findLimitViaInLimit(in_limit1), "Inlimit does not reference its limit. Post process failed ?");
+	BOOST_REQUIRE_MESSAGE( f1->findLimitViaInLimit(in_limit2), "Inlimit does not reference its limit. Post process failed ?");
+	BOOST_REQUIRE_MESSAGE( f2->findLimitViaInLimit(in_limit3), "Inlimit does not reference its limit. Post process failed ?");
+
+	// Ok Now delete suiteLimits, as this is where the limits reside
+	// *** It is extremely important that shared_ptr for '/suiteLimit' is in its own
+	// *** scope, otherwise it will keep the 'suite' live, and NOT delete the limits
+	{
+		node_ptr suiteLimits =  defs.findAbsNode("/suiteLimits");
+		BOOST_REQUIRE_MESSAGE( suiteLimits.get(), "Could not find the suite we want to delete?");
+		BOOST_REQUIRE_MESSAGE( defs.deleteChild(suiteLimits.get()), "Deletion failed?");
+		BOOST_REQUIRE_MESSAGE( !defs.findAbsNode("/suiteLimits").get(), "Deletion failed?");
+	}
+
+	BOOST_REQUIRE_MESSAGE( !f->findLimitViaInLimit(in_limit1), "In-limit still references limit that has been deleted?");
+	BOOST_REQUIRE_MESSAGE( !f1->findLimitViaInLimit(in_limit2), "In-limit still references limit that has been deleted?");
+	BOOST_REQUIRE_MESSAGE( !f2->findLimitViaInLimit(in_limit3), "In-limit still references limit that has been deleted?");
+}
+
+BOOST_AUTO_TEST_CASE( test_limits_after_force_cmd )
+{
+   cout << "Base:: ...test_limits_after_force_cmd\n";
+
+   // Create the following defs
+   // suite s1
+   //   limit A 10
+   //   family f1
+   //     inlimit A
+   //     task t1
+   //     task t2
+   //   family f2
+   //     inlimit A
+   //     task t1
+   //     task t2
+
+   // When all the tasks are running/submitted state, limit A should have consumed 4 tokens
+   // However if we how force family f2 to be complete, then the limit should be reset back to 2 tokens.
+   // Repeating for family f1, should result with a Limit with no tokens
+   Defs defs;
+   suite_ptr s1 =  defs.add_suite("s1");
+   s1->addLimit(Limit("A",10));
+   family_ptr f1 = s1->add_family("f1");
+   f1->addInLimit( InLimit("A","/s1"));
+   task_ptr f1_t1 = f1->add_task("t1");
+   task_ptr f1_t2 = f1->add_task("t2");
+   family_ptr f2 = s1->add_family("f2");
+   f2->addInLimit( InLimit("A","/s1"));
+   task_ptr f2_t1 = f2->add_task("t1");
+   task_ptr f2_t2 = f2->add_task("t2");
+   //cout << defs;
+
+   // Create a request to begin suite
+   // make sure chosen suite can begin to resolve dependencies.
+   // beginning the suite will:
+   //     1/ set all children to the QUEUED state
+   //     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+   //
+   //  Resolve dependencies. All tasks are within the limit and hence should start
+   {
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd("/s1")));
+      BOOST_CHECK_MESSAGE( s1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s1->state()));
+      BOOST_CHECK_MESSAGE( f1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1->state()));
+      BOOST_CHECK_MESSAGE( f1_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t1->state()));
+      BOOST_CHECK_MESSAGE( f1_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t2->state()));
+      BOOST_CHECK_MESSAGE( f2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2->state()));
+      BOOST_CHECK_MESSAGE( f2_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2_t1->state()));
+      BOOST_CHECK_MESSAGE( f2_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2_t2->state()));
+
+      limit_ptr the_limit = s1->find_limit("A");
+      BOOST_CHECK_MESSAGE( the_limit, "Could not find limit");
+      BOOST_CHECK_MESSAGE( the_limit->value() == 4,"Expected limit value to be 4 but found " << the_limit->value());
+   }
+
+   {
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new ForceCmd(f2->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+
+      BOOST_CHECK_MESSAGE( s1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s1->state()));
+      BOOST_CHECK_MESSAGE( f1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1->state()));
+      BOOST_CHECK_MESSAGE( f1_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t1->state()));
+      BOOST_CHECK_MESSAGE( f1_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t2->state()));
+      BOOST_CHECK_MESSAGE( f2->state() == NState::COMPLETE, "expected state NState::COMPLETE, but found to be " << NState::toString(f2->state()));
+      BOOST_CHECK_MESSAGE( f2_t1->state() == NState::COMPLETE, "expected state NState::COMPLETE, but found to be " << NState::toString(f2_t1->state()));
+      BOOST_CHECK_MESSAGE( f2_t2->state() == NState::COMPLETE, "expected state NState::COMPLETE, but found to be " << NState::toString(f2_t2->state()));
+
+      limit_ptr the_limit = s1->find_limit("A");
+      BOOST_CHECK_MESSAGE( the_limit, "Could not find limit");
+      BOOST_CHECK_MESSAGE( the_limit->value() == 2,"Expected limit value to be 2 but found " << the_limit->value());
+   }
+
+   {
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new ForceCmd(f1->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+
+      BOOST_CHECK_MESSAGE( s1->state() == NState::COMPLETE, "expected state NState::ACTIVE, but found to be " << NState::toString(s1->state()));
+      BOOST_CHECK_MESSAGE( f1->state() == NState::COMPLETE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1->state()));
+      BOOST_CHECK_MESSAGE( f1_t1->state() == NState::COMPLETE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t1->state()));
+      BOOST_CHECK_MESSAGE( f1_t2->state() == NState::COMPLETE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t2->state()));
+      BOOST_CHECK_MESSAGE( f2->state() == NState::COMPLETE, "expected state NState::COMPLETE, but found to be " << NState::toString(f2->state()));
+      BOOST_CHECK_MESSAGE( f2_t1->state() == NState::COMPLETE, "expected state NState::COMPLETE, but found to be " << NState::toString(f2_t1->state()));
+      BOOST_CHECK_MESSAGE( f2_t2->state() == NState::COMPLETE, "expected state NState::COMPLETE, but found to be " << NState::toString(f2_t2->state()));
+
+      limit_ptr the_limit = s1->find_limit("A");
+      BOOST_CHECK_MESSAGE( the_limit, "Could not find limit");
+      BOOST_CHECK_MESSAGE( the_limit->value() == 0,"Expected limit value to be 0 but found " << the_limit->value());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_limits_after_requeue_family_ECFLOW_196 )
+{
+   cout << "Base:: ...test_limits_after_requeue_family_ECFLOW_196\n";
+
+   // This test is used to ensure that, requeue causes node to release tokens held by the Limits
+
+   // Create the following defs
+   // suite s1
+   //   limit A 10
+   //   family f1
+   //     inlimit A
+   //     task t1
+   //     task t2
+   //   family f2
+   //     inlimit A
+   //     task t1
+   //     task t2
+
+   // When all the tasks are running/submitted state, limit A should have consumed 4 tokens
+   // However if we how force family f2 to be requeud, then the limit should be reset back to 2 tokens.
+   Defs defs;
+   suite_ptr s1 =  defs.add_suite("s1");
+   s1->addLimit(Limit("A",10));
+   family_ptr f1 = s1->add_family("f1");
+   f1->addInLimit( InLimit("A","/s1"));
+   task_ptr f1_t1 = f1->add_task("t1");
+   task_ptr f1_t2 = f1->add_task("t2");
+   family_ptr f2 = s1->add_family("f2");
+   f2->addInLimit( InLimit("A","/s1"));
+   task_ptr f2_t1 = f2->add_task("t1");
+   task_ptr f2_t2 = f2->add_task("t2");
+   //cout << defs;
+
+
+   // Create a request to begin suite
+   // make sure chosen suite can begin to resolve dependencies.
+   // beginning the suite will:
+   //     1/ set all children to the QUEUED state
+   //     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+   //
+   //  Resolve dependencies. All tasks are within the limit and hence should start
+   int expected_limit_value = 4;
+   limit_ptr the_limit = s1->find_limit("A");
+   BOOST_CHECK_MESSAGE( the_limit, "Could not find limit");
+   {
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd("/s1")));
+      BOOST_CHECK_MESSAGE( s1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s1->state()));
+      BOOST_CHECK_MESSAGE( f1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1->state()));
+      BOOST_CHECK_MESSAGE( f1_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t1->state()));
+      BOOST_CHECK_MESSAGE( f1_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t2->state()));
+      BOOST_CHECK_MESSAGE( f2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2->state()));
+      BOOST_CHECK_MESSAGE( f2_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2_t1->state()));
+      BOOST_CHECK_MESSAGE( f2_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2_t2->state()));
+
+      BOOST_CHECK_MESSAGE( the_limit->value() == expected_limit_value,"Expected limit value to be 4 but found " << the_limit->value());
+   }
+
+   {
+      expected_limit_value = 2;
+      // We now want to re-queue node f2, and check to see that limit tokens are released after the re-queue
+      // However, the Mock server, will call resolve dependencies after re-queue command , and place nodes *back* into active
+      // state, to *STOP* this, we will add a trigger, so that the dependencies will not resolve, and hence nodes stay queued
+      f2->add_trigger("1 == 0");
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new RequeueNodeCmd(f2->absNodePath(),RequeueNodeCmd::FORCE)));
+
+      BOOST_CHECK_MESSAGE( s1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s1->state()));
+      BOOST_CHECK_MESSAGE( f1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1->state()));
+      BOOST_CHECK_MESSAGE( f1_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t1->state()));
+      BOOST_CHECK_MESSAGE( f1_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t2->state()));
+      BOOST_CHECK_MESSAGE( f2->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(f2->state()));
+      BOOST_CHECK_MESSAGE( f2_t1->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(f2_t1->state()));
+      BOOST_CHECK_MESSAGE( f2_t2->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(f2_t2->state()));
+
+      BOOST_CHECK_MESSAGE( the_limit->value() == expected_limit_value,"Expected limit value to be 2 but found " << the_limit->value());
+   }
+
+   {
+      expected_limit_value = 0;
+      // We now want to re-queue node f1, and check to see that limit tokens are released after the re-queue
+      // However, the Mock server, will call resolve dependencies after re-queue command , and place nodes *back* into active
+      // state, to *STOP* this, we will add a trigger, so that the dependencies will not resolve, and hence nodes stay queued
+      f1->add_trigger("1 == 0");
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new RequeueNodeCmd(f1->absNodePath(),RequeueNodeCmd::FORCE)));
+
+      BOOST_CHECK_MESSAGE( s1->state() == NState::QUEUED, "expected state NState::ACTIVE, but found to be " << NState::toString(s1->state()));
+      BOOST_CHECK_MESSAGE( f1->state() == NState::QUEUED, "expected state NState::ACTIVE, but found to be " << NState::toString(f1->state()));
+      BOOST_CHECK_MESSAGE( f1_t1->state() == NState::QUEUED, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t1->state()));
+      BOOST_CHECK_MESSAGE( f1_t2->state() == NState::QUEUED, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t2->state()));
+      BOOST_CHECK_MESSAGE( f2->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(f2->state()));
+      BOOST_CHECK_MESSAGE( f2_t1->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(f2_t1->state()));
+      BOOST_CHECK_MESSAGE( f2_t2->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(f2_t2->state()));
+
+      BOOST_CHECK_MESSAGE( the_limit->value() == expected_limit_value,"Expected limit value to be 0 but found " << the_limit->value());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_limits_after_requeue_task_ECFLOW_196 )
+{
+   cout << "Base:: ...test_limits_after_requeue_task_ECFLOW_196\n";
+
+   // This test is used to ensure that, requeue causes node to release tokens held by the Limits
+
+   // Create the following def, i.e using internal and external limits
+   // suite s0
+   //   limit X 5
+   // suite s1
+   //   limit A 10
+   //   limit B 5
+   //   family f1
+   //     inlimit A
+   //     inlimit B
+   //     inlimit X /s0/
+   //     task t1
+   //     task t2
+   //   family f2
+   //     inlimit A
+   //     inlimit B
+   //     inlimit X /s0/
+   //     task t1
+   //     task t2
+
+   // When all the tasks are running/submitted state, limit A should have consumed 4 tokens
+   // However if we how force task to reque, then the token should be released
+   Defs defs;
+   suite_ptr s0 =  defs.add_suite("s0");
+   s0->addLimit(Limit("X",10));
+
+   suite_ptr s1 =  defs.add_suite("s1");
+   s1->addLimit(Limit("A",10));
+   s1->addLimit(Limit("B",5));
+   family_ptr f1 = s1->add_family("f1");
+   f1->addInLimit( InLimit("A","/s1"));
+   f1->addInLimit( InLimit("B","/s1"));
+   f1->addInLimit( InLimit("X","/s0"));
+   task_ptr f1_t1 = f1->add_task("t1");
+   task_ptr f1_t2 = f1->add_task("t2");
+   family_ptr f2 = s1->add_family("f2");
+   f2->addInLimit( InLimit("A","/s1"));
+   f2->addInLimit( InLimit("B","/s1"));
+   f2->addInLimit( InLimit("X","/s0"));
+   task_ptr f2_t1 = f2->add_task("t1");
+   task_ptr f2_t2 = f2->add_task("t2");
+
+   std::vector<task_ptr> tasks;
+   tasks.push_back(f1_t1); tasks.push_back(f1_t2);
+   tasks.push_back(f2_t1); tasks.push_back(f2_t2);
+   //cout << defs;
+
+   limit_ptr the_A_limit = s1->find_limit("A");
+   limit_ptr the_B_limit = s1->find_limit("B");
+   limit_ptr the_X_limit = s0->find_limit("X");
+   BOOST_CHECK_MESSAGE( the_A_limit && the_B_limit && the_X_limit, "Could not find limits");
+
+   // Create a request to begin suite
+   // make sure chosen suite can begin to resolve dependencies.
+   // beginning the suite will:
+   //     1/ set all children to the QUEUED state
+   //     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+   //
+   //  Resolve dependencies. All tasks are within the limit and hence should start
+   int expected_limit_value = 4;
+   {
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd("/s1")));
+      BOOST_CHECK_MESSAGE( s1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(s1->state()));
+      BOOST_CHECK_MESSAGE( f1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1->state()));
+      BOOST_CHECK_MESSAGE( f1_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t1->state()));
+      BOOST_CHECK_MESSAGE( f1_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f1_t2->state()));
+      BOOST_CHECK_MESSAGE( f2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2->state()));
+      BOOST_CHECK_MESSAGE( f2_t1->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2_t1->state()));
+      BOOST_CHECK_MESSAGE( f2_t2->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(f2_t2->state()));
+
+      BOOST_CHECK_MESSAGE( the_A_limit->value() == expected_limit_value,"Expected limit value to be " << expected_limit_value << " but found " << the_A_limit->value());
+      BOOST_CHECK_MESSAGE( the_B_limit->value() == expected_limit_value,"Expected limit value to be " << expected_limit_value << " but found " << the_B_limit->value());
+      BOOST_CHECK_MESSAGE( the_X_limit->value() == expected_limit_value,"Expected limit value to be " << expected_limit_value << " but found " << the_X_limit->value());
+   }
+
+   {
+      // We now want to re-queue node tasks, and check to see that limit tokens are released after the re-queue
+      // However, the Mock server, will call resolve dependencies after re-queue command , and place nodes *back* into active
+      // state, to *STOP* this, we will add a trigger, so that the dependencies will not resolve, and hence nodes stay queued
+      f1->add_trigger("1 == 0");
+      f2->add_trigger("1 == 0");
+
+      for(size_t i =0; i < tasks.size(); i++) {
+         TestHelper::invokeRequest(&defs,Cmd_ptr( new RequeueNodeCmd(tasks[i]->absNodePath(),RequeueNodeCmd::FORCE)));
+         expected_limit_value--;
+         BOOST_CHECK_MESSAGE( the_A_limit->value() == expected_limit_value,"Expected limit value " << expected_limit_value << " but found " << the_A_limit->value());
+         BOOST_CHECK_MESSAGE( the_B_limit->value() == expected_limit_value,"Expected limit value " << expected_limit_value << " but found " << the_B_limit->value());
+         BOOST_CHECK_MESSAGE( the_X_limit->value() == expected_limit_value,"Expected limit value " << expected_limit_value << " but found " << the_X_limit->value());
+      }
+   }
+
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Base/test/TestMeterCmd.cpp b/ecflow_4_0_7/Base/test/TestMeterCmd.cpp
new file mode 100644
index 0000000..f7860e1
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestMeterCmd.cpp
@@ -0,0 +1,96 @@
+ //============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestHelper.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_meter_cmd )
+{
+   cout << "Base:: ...test_meter_cmd\n";
+   // Create the defs file.
+   // suite suite
+   //    family f
+   //          task t1
+   //              meter m 0 100 100
+   //    endfamily
+   // endsuite
+   Defs defs;
+   string suite_f_t1 = "suite/f/t1";
+   task_ptr t1 = Task::create("t1");
+   std::string meter_name = "m";
+   {
+      t1->addMeter( Meter(meter_name,0,100,100));
+      suite_ptr s = Suite::create("suite");
+      family_ptr f = Family::create("f");
+      f->addTask( t1 );
+      s->addFamily(f);
+      defs.addSuite( s );
+   }
+
+   // Meter which doesn't exist should be silently ignore
+   int meter_value = 10;
+   TestHelper::invokeRequest(&defs,
+                             Cmd_ptr( new MeterCmd(suite_f_t1,
+                                                   Submittable::DUMMY_JOBS_PASSWORD(),
+                                                   Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),
+                                                   1,"FRED",meter_value)),
+                             false  /* expect change number not to change */
+   );
+
+   /// Test setting meter value
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new MeterCmd(suite_f_t1,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,meter_name,meter_value)));
+   const Meter& the_meter = t1->findMeter(meter_name);
+   BOOST_CHECK_MESSAGE( !the_meter.empty(),  "Meter not found");
+   BOOST_CHECK_MESSAGE( the_meter.value() == meter_value,  "Expected meter value " << meter_value << " but found " << the_meter.value());
+
+
+   /// Set a meter value less than the current value.
+   meter_value = 9;
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new MeterCmd(suite_f_t1,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,meter_name,meter_value)));
+   BOOST_CHECK_MESSAGE( the_meter.value() == meter_value,  "Expected meter value " << meter_value << " but found " << the_meter.value());
+
+   /// Set a meter value greater than max meter, this should be ignored
+   /// Avoid failing task, if meter,  value is out of range. Just log a warning message
+   meter_value = 2000;
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new MeterCmd(suite_f_t1,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,meter_name,meter_value))
+                             ,false  /* expect change number not to change */);
+   BOOST_CHECK_MESSAGE( the_meter.value() == 9,  "Expected meter value 9 but found " << the_meter.value());
+
+
+   /// Set to valid value
+   meter_value = 20;
+   TestHelper::invokeRequest(&defs,Cmd_ptr( new MeterCmd(suite_f_t1,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,meter_name,meter_value)));
+   BOOST_CHECK_MESSAGE( the_meter.value() == meter_value,  "Expected meter value " << meter_value << " but found " << the_meter.value());
+
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Base/test/TestRequest.cpp b/ecflow_4_0_7/Base/test/TestRequest.cpp
new file mode 100644
index 0000000..16b6b50
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestRequest.cpp
@@ -0,0 +1,316 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #128 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/make_shared.hpp"
+
+#include "MyDefsFixture.hpp"
+#include "ServerToClientResponse.hpp"
+#include "TestHelper.hpp"
+#include "SerializationTest.hpp"
+#include "DefsCmd.hpp"
+#include "SNodeCmd.hpp"
+#include "ErrorCmd.hpp"
+#include "StcCmd.hpp"
+#include "SStringCmd.hpp"
+#include "SServerLoadCmd.hpp"
+#include "GroupSTCCmd.hpp"
+#include "SSyncCmd.hpp"
+#include "SNewsCmd.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+
+BOOST_FIXTURE_TEST_SUITE( BaseTestSuite, MyDefsFixture )
+
+// Can't delete the fixture defs, hence use a NULL deleter to avoid freeing memory twice.
+// Required since DefsCmd and LoadDefsCmd requires a shared_ptr.
+struct null_deleter { void operator()(void const *) const{} };
+
+
+static void populateCmdVec(std::vector<Cmd_ptr>& cmd_vec, std::vector<STC_Cmd_ptr>& stc_cmd_vec, MockServer* mock_server)
+{
+	std::vector<std::string> suite_names; suite_names.push_back("suiteName");
+   MyDefsFixture fixture;
+   defs_ptr client_defs = fixture.create_defs();
+
+	// Client --> Server commands
+	// make sure begin cmd is first. As this will init calendar. + other commands rely on it
+	// i.e RequeueNodeCmd assumes calendar has been initialized
+   cmd_vec.push_back( Cmd_ptr( new ShowCmd()));
+   cmd_vec.push_back( Cmd_ptr( new ServerVersionCmd()));
+   cmd_vec.push_back( Cmd_ptr( new BeginCmd("suiteName"))); // must be first
+   cmd_vec.push_back( Cmd_ptr( new BeginCmd("EmptySuite"))); // must be first
+	cmd_vec.push_back( Cmd_ptr( new ReplaceNodeCmd("suiteName",false,client_defs, true)));
+	cmd_vec.push_back( Cmd_ptr( new LoadDefsCmd(mock_server->defs(),true/*force*/)));
+	cmd_vec.push_back( Cmd_ptr( new LogMessageCmd("LogMessageCmd"))  );
+	cmd_vec.push_back( Cmd_ptr( new LogCmd(LogCmd::CLEAR)));    // server replies back OK/Error Cmd
+   cmd_vec.push_back( Cmd_ptr( new LogCmd(LogCmd::GET)));      // server replies back OK/Error | SStringCmd
+   cmd_vec.push_back( Cmd_ptr( new LogCmd(LogCmd::PATH)));     // server replies back Error |SStringCmd
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::RESTORE_DEFS_FROM_CHECKPT)));
+   cmd_vec.push_back( Cmd_ptr( new CheckPtCmd()));
+   cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::PING)));
+   cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::DEBUG_SERVER_ON)));
+   cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::DEBUG_SERVER_OFF)));
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::RESTART_SERVER)));
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::SHUTDOWN_SERVER)));
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::HALT_SERVER)));
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::TERMINATE_SERVER)));
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::RELOAD_WHITE_LIST_FILE)));
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::FORCE_DEP_EVAL)));
+   cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::STATS)));
+   cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::STATS_RESET)));
+	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::SUITES)));
+	cmd_vec.push_back( Cmd_ptr( new CSyncCmd(CSyncCmd::NEWS,0,0,0)));
+   cmd_vec.push_back( Cmd_ptr( new CSyncCmd(CSyncCmd::SYNC,0,0,0)));
+   cmd_vec.push_back( Cmd_ptr( new CSyncCmd(0))); // SYNC_FULL
+	cmd_vec.push_back( Cmd_ptr( new RequeueNodeCmd("/suiteName",RequeueNodeCmd::NO_OPTION)));
+	cmd_vec.push_back( Cmd_ptr( new OrderNodeCmd("/suiteName",NOrder::ALPHA)));
+	cmd_vec.push_back( Cmd_ptr( new RunNodeCmd("/suiteName", true/* force for test */, true /* for test */)));
+	cmd_vec.push_back( Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND,"EmptySuite")));
+	cmd_vec.push_back( Cmd_ptr( new PathsCmd(PathsCmd::RESUME,"EmptySuite")));
+	cmd_vec.push_back( Cmd_ptr( new PathsCmd(PathsCmd::KILL,"EmptySuite")));
+	cmd_vec.push_back( Cmd_ptr( new PathsCmd(PathsCmd::STATUS,"EmptySuite")));
+   cmd_vec.push_back( Cmd_ptr( new PathsCmd(PathsCmd::CHECK,"/suiteName")));
+   cmd_vec.push_back( Cmd_ptr( new PathsCmd(PathsCmd::CHECK,"")));  // check the full defs
+   cmd_vec.push_back( Cmd_ptr( new PathsCmd(PathsCmd::EDIT_HISTORY,"/suiteName")));  // check the full defs
+   cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::WHY,"/suiteName")));
+   cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET,"/suiteName")));
+   cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET_STATE,"/suiteName")));
+   cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::MIGRATE,"/suiteName")));
+ 	cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::CHECK_JOB_GEN_ONLY,"EmptySuite"))); // will *reset* begin
+   cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET,"")));  // return the full defs
+   cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET_STATE,"")));
+   cmd_vec.push_back( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::MIGRATE,"")));
+	cmd_vec.push_back( Cmd_ptr( new ZombieCmd(ecf::User::FOB,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+	cmd_vec.push_back( Cmd_ptr( new ZombieCmd(ecf::User::FAIL,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+	cmd_vec.push_back( Cmd_ptr( new ZombieCmd(ecf::User::ADOPT,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+   cmd_vec.push_back( Cmd_ptr( new ZombieCmd(ecf::User::REMOVE,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+   cmd_vec.push_back( Cmd_ptr( new ZombieCmd(ecf::User::KILL,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+	cmd_vec.push_back( Cmd_ptr( new ClientHandleCmd(suite_names,true)));                      // register
+	cmd_vec.push_back( Cmd_ptr( new ClientHandleCmd(1,suite_names,ClientHandleCmd::ADD)));    // add
+	cmd_vec.push_back( Cmd_ptr( new ClientHandleCmd(1,suite_names,ClientHandleCmd::REMOVE))); // remove
+	cmd_vec.push_back( Cmd_ptr( new ClientHandleCmd(1, true)));                               // auto_add new suites
+	cmd_vec.push_back( Cmd_ptr( new ClientHandleCmd(1)));                                     // de-register/drop
+	cmd_vec.push_back( Cmd_ptr( new InitCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1)));
+	cmd_vec.push_back( Cmd_ptr( new EventCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,"eventName")));
+	cmd_vec.push_back( Cmd_ptr( new MeterCmd("suiteName/familyName/heir_familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,"myMeter",100)));
+	cmd_vec.push_back( Cmd_ptr( new CompleteCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1)));
+	cmd_vec.push_back( Cmd_ptr( new AbortCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1)));
+	cmd_vec.push_back( Cmd_ptr( new CtsWaitCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,"1 eq 1")));
+	cmd_vec.push_back( Cmd_ptr( new LabelCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,"labelName","label value")));
+	cmd_vec.push_back( Cmd_ptr( new ForceCmd("/suiteName","complete",true,true)));
+	cmd_vec.push_back( Cmd_ptr( new FreeDepCmd("/suiteName")));
+	cmd_vec.push_back( Cmd_ptr( new CFileCmd("/suiteName",CFileCmd::ECF, 10)));
+	cmd_vec.push_back( Cmd_ptr( new CFileCmd("/suiteName",CFileCmd::JOB,100)));
+	cmd_vec.push_back( Cmd_ptr( new CFileCmd("/suiteName",CFileCmd::JOBOUT,100)));
+	cmd_vec.push_back( Cmd_ptr( new CFileCmd("/suiteName",CFileCmd::MANUAL,100)));
+   cmd_vec.push_back( Cmd_ptr( new EditScriptCmd()));
+	cmd_vec.push_back( Cmd_ptr( new AlterCmd("/suiteName/t1",AlterCmd::ADD_DATE,"12.*.*")));
+	cmd_vec.push_back( Cmd_ptr( new AlterCmd("/suiteName/t1",AlterCmd::ADD_DAY,"sunday")));
+	cmd_vec.push_back( Cmd_ptr( new AlterCmd("/suiteName/t1",AlterCmd::ADD_TIME,"+12:00")));
+	cmd_vec.push_back( Cmd_ptr( new AlterCmd("/suiteName/t1",AlterCmd::ADD_TIME,"+10:00 20:00 00:30")));
+	cmd_vec.push_back( Cmd_ptr( new AlterCmd("/suiteName/t1",AlterCmd::ADD_TODAY,"10:00 20:00 00:30")));
+	cmd_vec.push_back( Cmd_ptr( new PlugCmd()));
+
+	boost::shared_ptr<GroupCTSCmd>  theGroupCmd = boost::make_shared<GroupCTSCmd>();
+   theGroupCmd->addChild(  Cmd_ptr( new BeginCmd("suiteName"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new BeginCmd("EmptySuite"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new ServerVersionCmd())  );
+ 	theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::PING))  );
+	theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::RESTART_SERVER))  );
+	theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::SHUTDOWN_SERVER))  );
+	theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::HALT_SERVER))  );
+	theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::TERMINATE_SERVER))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::RELOAD_WHITE_LIST_FILE))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::SERVER_LOAD))  );
+	theGroupCmd->addChild(  Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND,"EmptySuite"))  );
+	theGroupCmd->addChild(  Cmd_ptr( new PathsCmd(PathsCmd::RESUME,"EmptySuite"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new PathsCmd(PathsCmd::KILL,"EmptySuite"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET,"EmptySuite"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET_STATE,"EmptySuite"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::MIGRATE,"EmptySuite"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new ShowCmd()));
+	theGroupCmd->addChild(  Cmd_ptr( new ZombieCmd(ecf::User::FOB,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+	theGroupCmd->addChild(  Cmd_ptr( new ZombieCmd(ecf::User::FAIL,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+	theGroupCmd->addChild(  Cmd_ptr( new ZombieCmd(ecf::User::ADOPT,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+	theGroupCmd->addChild(  Cmd_ptr( new ZombieCmd(ecf::User::REMOVE,"suiteName/familyName/taskName",Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),Submittable::DUMMY_JOBS_PASSWORD())));
+	theGroupCmd->addChild(  Cmd_ptr( new RequeueNodeCmd("/suiteName",RequeueNodeCmd::NO_OPTION))  );
+	theGroupCmd->addChild(  Cmd_ptr( new OrderNodeCmd("/suiteName",NOrder::ALPHA))  );
+	theGroupCmd->addChild(  Cmd_ptr( new RunNodeCmd("/suiteName",true/*force for test*/, true /* for test */))  );
+   theGroupCmd->addChild(  Cmd_ptr( new InitCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1))  );
+	theGroupCmd->addChild(  Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::CHECK_JOB_GEN_ONLY,"EmptySuite"))  ); // will *reset* begin
+	theGroupCmd->addChild(  Cmd_ptr( new EventCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,"eventName"))  );
+	theGroupCmd->addChild(  Cmd_ptr( new MeterCmd("suiteName/familyName/heir_familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,"myMeter",100))  );
+	theGroupCmd->addChild(  Cmd_ptr( new CompleteCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1))  );
+	theGroupCmd->addChild(  Cmd_ptr( new AbortCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET_STATE))  );
+   theGroupCmd->addChild(  Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::MIGRATE))  );
+	theGroupCmd->addChild(  Cmd_ptr( new CtsCmd(CtsCmd::FORCE_DEP_EVAL))  ); // will force deletion of any Node which has autocomplete
+ 	theGroupCmd->addChild(  Cmd_ptr( new LoadDefsCmd(mock_server->defs(), true/*force*/))  );
+	theGroupCmd->addChild(  Cmd_ptr( new LogCmd(LogCmd::GET))  );
+	theGroupCmd->addChild(  Cmd_ptr( new LogCmd(LogCmd::CLEAR))  );
+	theGroupCmd->addChild(  Cmd_ptr( new LogMessageCmd("LogMessageCmd"))  );
+ 	theGroupCmd->addChild(  Cmd_ptr( new ForceCmd("/suiteName","complete",true,true)) );
+ 	theGroupCmd->addChild(  Cmd_ptr( new FreeDepCmd("/suiteName",false,true)) );
+
+	BOOST_CHECK_MESSAGE(theGroupCmd->isWrite(),"Expected isWrite() to return true");
+	BOOST_CHECK_MESSAGE(theGroupCmd->get_cmd(),"Expected get_cmd() to return true");
+ 	BOOST_CHECK_MESSAGE(theGroupCmd->task_cmd(),"Expected task_cmd() to return true");
+	BOOST_CHECK_MESSAGE(theGroupCmd->terminate_cmd(),"Expected terminate_cmd() to return true");
+	BOOST_CHECK_MESSAGE(theGroupCmd->group_cmd(),"Expected group_cmd() to return true");
+	cmd_vec.push_back( theGroupCmd );
+
+
+	// Server --> Client commands
+	stc_cmd_vec.push_back( STC_Cmd_ptr( new ErrorCmd("The error")));
+ 	stc_cmd_vec.push_back( STC_Cmd_ptr( new StcCmd(StcCmd::OK)));
+ 	stc_cmd_vec.push_back( STC_Cmd_ptr( new StcCmd(StcCmd::BLOCK_CLIENT_SERVER_HALTED)));
+ 	stc_cmd_vec.push_back( STC_Cmd_ptr( new StcCmd(StcCmd::BLOCK_CLIENT_ON_HOME_SERVER)));
+   stc_cmd_vec.push_back( STC_Cmd_ptr( new SStringCmd("Dummy contents")));
+   stc_cmd_vec.push_back( STC_Cmd_ptr( new SServerLoadCmd("/path/to/log_file")));
+ 	stc_cmd_vec.push_back( STC_Cmd_ptr( new SSyncCmd(0,0,0,mock_server )));
+ 	stc_cmd_vec.push_back( STC_Cmd_ptr( new SNewsCmd(0,0,0,mock_server)));
+   stc_cmd_vec.push_back( STC_Cmd_ptr( new DefsCmd(mock_server)));
+   stc_cmd_vec.push_back( STC_Cmd_ptr( new SNodeCmd(mock_server,node_ptr()) ));
+
+	boost::shared_ptr<GroupSTCCmd>  theSTCGroupCmd = boost::make_shared<GroupSTCCmd>() ;
+	theSTCGroupCmd->addChild(  STC_Cmd_ptr( new ErrorCmd())  );
+	theSTCGroupCmd->addChild(  STC_Cmd_ptr( new StcCmd(StcCmd::OK))  );
+	theSTCGroupCmd->addChild(  STC_Cmd_ptr( new StcCmd(StcCmd::BLOCK_CLIENT_SERVER_HALTED))  );
+	theSTCGroupCmd->addChild(  STC_Cmd_ptr( new StcCmd(StcCmd::BLOCK_CLIENT_ON_HOME_SERVER))  );
+   theSTCGroupCmd->addChild(  STC_Cmd_ptr( new SStringCmd())  );
+   theSTCGroupCmd->addChild(  STC_Cmd_ptr( new SServerLoadCmd())  );
+   theSTCGroupCmd->addChild(  STC_Cmd_ptr( new DefsCmd(mock_server)));
+   theSTCGroupCmd->addChild(  STC_Cmd_ptr( new SNodeCmd(mock_server,node_ptr())));
+	stc_cmd_vec.push_back( theSTCGroupCmd );
+}
+
+static void test_persistence(const Defs& theFixtureDefs )
+{
+	Defs* fixtureDefs = const_cast<Defs*>(&theFixtureDefs);
+	MockServer mockServer(fixtureDefs); // creates shared ptr with a NULL deleter
+
+	std::vector<Cmd_ptr> cmd_vec;
+	std::vector<STC_Cmd_ptr> stc_cmd_vec;
+	populateCmdVec(cmd_vec, stc_cmd_vec, &mockServer);
+
+	int getRequest = 0;
+	int terminateRequest = 0;
+	int groupRequest = 0;
+	BOOST_FOREACH(const Cmd_ptr& theCmd, cmd_vec) {
+
+		// std::cout << "TheCmd "; theCmd->print(std::cout); std::cout << "\n";
+		if (theCmd->connect_to_different_servers()) {
+			BOOST_CHECK_MESSAGE(theCmd->task_cmd(),"Currently only tasks commands, are allowed to connect to different servers");
+		}
+
+		const ClientToServerRequest cmd_request(theCmd); // MUST be const to avoid AIX compiler warning
+		{
+			if (theCmd.get()->handleRequestIsTestable()) {
+				// test handleRequest while were at it.
+ 				// Avoid TERMINATE_SERVER cmd as this will prematurely cause an exit, wont appear as an error
+				// cerr << "cmd_request = " << cmd_request << "\n";
+			   try {
+			      STC_Cmd_ptr ok_or_error_cmd = cmd_request.handleRequest(&mockServer);
+			      if (ok_or_error_cmd) {
+			         // Commands like ErrorCmd, OkCmd don't return a cmd_ptr from handleRequest
+			         // those that do, check OkCmd returned, else if ErrorCmd show the error
+			         BOOST_CHECK_MESSAGE(ok_or_error_cmd->ok(),"Request '" << cmd_request << "' returned " << ok_or_error_cmd->error());
+			      }
+			   }
+			   catch (std::exception& e ) {
+			      BOOST_CHECK_MESSAGE(false,"Unexpected exception : " <<  e.what() << " : " << cmd_request ) ;
+			   }
+			}
+		}
+
+		BOOST_REQUIRE_NO_THROW(ecf::save("request.txt",cmd_request));
+
+		ClientToServerRequest restoredRequest;
+		BOOST_REQUIRE_NO_THROW(ecf::restore("request.txt", restoredRequest));
+		BOOST_REQUIRE_MESSAGE(restoredRequest == cmd_request, "restoredRequest " << restoredRequest << " cmd_request " << cmd_request);
+
+		if (restoredRequest.getRequest()) getRequest++;
+		if (restoredRequest.terminateRequest()) terminateRequest++;
+		if (restoredRequest.groupRequest())   groupRequest++;
+		fs::remove("request.txt");
+	}
+
+	BOOST_CHECK_MESSAGE(getRequest ==3," expected 3 get Request  but found " << getRequest );
+	BOOST_CHECK_MESSAGE(terminateRequest ==2," expected 2 terminate Request but found " << terminateRequest );
+	BOOST_CHECK_MESSAGE(groupRequest ==1," expected 1 group Request but found " << groupRequest );
+
+
+	BOOST_FOREACH(const STC_Cmd_ptr& theCmd, stc_cmd_vec) {
+//		std::cout << "TheCmd "; theCmd->print(std::cout); std::cout << "\n";
+
+		const ServerToClientResponse cmd_request(theCmd); // MUST be const to avoid AIX compiler warning
+		BOOST_REQUIRE_NO_THROW(ecf::save("request.txt",cmd_request));
+
+		ServerToClientResponse restoredRequest;
+		BOOST_REQUIRE_NO_THROW(ecf::restore("request.txt", restoredRequest));
+ 		BOOST_REQUIRE_MESSAGE(restoredRequest == cmd_request, "restoredRequest " << restoredRequest << " cmd_request " << cmd_request);
+ 		fs::remove("request.txt");
+	}
+}
+
+#if defined(BINARY_ARCHIVE)
+BOOST_AUTO_TEST_CASE( test_all_request_persistence_binary )
+{
+	cout << "Base:: ...test_all_request_persistence_binary\n";
+	test_persistence( fixtureDefsFile());
+}
+#elif defined(PORTABLE_BINARY_ARCHIVE)
+BOOST_AUTO_TEST_CASE( test_all_request_persistence_portable_binary )
+{
+	cout << "Base:: ...test_all_request_persistence_portable_binary\n";
+	test_persistence( fixtureDefsFile() );
+}
+#elif defined(EOS_PORTABLE_BINARY_ARCHIVE)
+BOOST_AUTO_TEST_CASE( test_all_request_persistence_eos_portable_binary )
+{
+   cout << "Base:: ...test_all_request_persistence_eos_portable_binary\n";
+   test_persistence( fixtureDefsFile() );
+}
+#else
+BOOST_AUTO_TEST_CASE( test_all_request_persistence_text )
+{
+   cout << "Base:: ...test_all_request_persistence_text\n";
+   test_persistence( fixtureDefsFile());
+}
+#endif
+
+BOOST_AUTO_TEST_CASE( test_request_authenticate )
+{
+	cout << "Base:: ...test_request_authenticate\n";
+
+	// the path "suiteName0/familyName0/taskName0" must exist in the defsfile_ fixture
+ 	Cmd_ptr cmd_ptr(new InitCmd("suiteName/familyName/taskName",Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1));
+
+	// The invokeRequest will return check if the path and password exist in the Node tree
+	TestHelper::invokeRequest(&defsfile_, cmd_ptr);
+
+	/// Destroy System singleton to avoid valgrind from complaining
+	System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Base/test/TestRequeueNodeCmd.cpp b/ecflow_4_0_7/Base/test/TestRequeueNodeCmd.cpp
new file mode 100644
index 0000000..4bb5e92
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestRequeueNodeCmd.cpp
@@ -0,0 +1,150 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "TestHelper.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_requeue_with_suspend )
+{
+   cout << "Base:: ...test_requeue_with_suspend\n";
+
+   defs_ptr the_defs = Defs::create();
+   suite_ptr s1 = the_defs->add_suite( "s1" ) ;
+   family_ptr f1  = s1->add_family( "f1" ) ;
+   task_ptr t1 = f1->add_task("t1");
+   task_ptr t2 = f1->add_task("t2");
+   task_ptr t3 = f1->add_task("t3");
+   t3->addDefStatus(DState::SUSPENDED);
+
+   the_defs->beginAll();
+
+   // After begin/requeue we must honour defs status
+   BOOST_CHECK_MESSAGE(t3->isSuspended(),"Expected node to be suspended");
+
+   // Suspend all nodes
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND,s1->absNodePath())));
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND,f1->absNodePath())));
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND,t1->absNodePath())));
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::SUSPEND,t2->absNodePath())));
+   BOOST_CHECK_MESSAGE(s1->isSuspended(),"Expected node to be suspended");
+   BOOST_CHECK_MESSAGE(f1->isSuspended(),"Expected node to be suspended");
+   BOOST_CHECK_MESSAGE(t1->isSuspended(),"Expected node to be suspended");
+   BOOST_CHECK_MESSAGE(t2->isSuspended(),"Expected node to be suspended");
+
+   // Re-queue of the nodes, that are suspended, they should *stay* suspended
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new RequeueNodeCmd(t1->absNodePath())));
+   BOOST_CHECK_MESSAGE(t1->isSuspended(),"Expected node to stay suspended");
+
+   // Now re-queue the top level suite, this is suspended.
+   // This should stay suspended *BUT* child nodes which are suspend should be cleared
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new RequeueNodeCmd(s1->absNodePath())));
+   BOOST_CHECK_MESSAGE(s1->isSuspended(),"Suite should stay suspend");
+   BOOST_CHECK_MESSAGE(!f1->isSuspended(),"Expected child nodes to be un-suspended");
+   BOOST_CHECK_MESSAGE(!t1->isSuspended(),"Expected child nodes to be un-suspended");
+   BOOST_CHECK_MESSAGE(!t2->isSuspended(),"Expected child nodes to be un-suspended");
+   BOOST_CHECK_MESSAGE(t3->isSuspended(), "Requeue must honour def status");
+}
+
+BOOST_AUTO_TEST_CASE( test_requeue_family_clears_children_SUP_909 )
+{
+   cout << "Base:: ...test_requeue_family_clears_children_SUP_909\n";
+
+   //   suite s1
+   //    family f1
+   //       task t1
+   //          time 23:30
+   //     endFamily
+   //   endsuite
+   // make sure time is set *before* 23:30, so that time dependency holds the task
+
+   defs_ptr the_defs = Defs::create();
+   suite_ptr suite = the_defs->add_suite( "s1" ) ;
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // start at 09:30
+   suite->addClock( clockAttr );
+
+   family_ptr f1  = suite->add_family( "f1" ) ;
+   task_ptr t1 = f1->add_task("t1");
+   t1->addTime( TimeAttr(23,30));
+
+   const TimeSeries& theTime = t1->timeVec().back().time_series();
+
+   the_defs->beginAll();
+
+   BOOST_CHECK_MESSAGE(theTime.is_valid(), "Expected time to be holding");
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+   TestHelper::test_state(t1,NState::COMPLETE);
+   BOOST_CHECK_MESSAGE( !theTime.is_valid(), "Expected time to have expired");
+   BOOST_CHECK_MESSAGE( t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
+
+   // Now reque the family, this should clear the time, so that it now holding again
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new RequeueNodeCmd(f1->absNodePath())));
+   TestHelper::test_state(f1,NState::QUEUED);
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE( theTime.is_valid(), "Expected time to be reset");
+   BOOST_CHECK_MESSAGE( !t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_based_requeue_clears_children )
+{
+   cout << "Base:: ...test_repeat_based_requeue_clears_children\n";
+
+   //   suite s1
+   //    repeat day 1
+   //    family f1
+   //       task t1
+   //          time 23:30
+   //     endfamily
+   //   endsuite
+   // make sure time is set *before* 23:30, so that time dependency holds the task
+
+   defs_ptr the_defs = Defs::create();
+   suite_ptr suite = the_defs->add_suite( "s1" ) ;
+   ClockAttr clockAttr(15,12,2010,false);
+   clockAttr.set_gain(9/*hour*/,30/*minutes*/); // start at 09:30
+   suite->addClock( clockAttr );
+
+   suite->addRepeat( RepeatDay(1) );
+
+   family_ptr f1  = suite->add_family( "f1" ) ;
+   task_ptr t1 = f1->add_task("t1");
+   t1->addTime( TimeAttr(23,30));
+
+   const TimeSeries& theTime = t1->timeVec().back().time_series();
+
+   the_defs->beginAll();
+
+   BOOST_CHECK_MESSAGE(theTime.is_valid(), "Expected time to be holding");
+
+   // Forcing task t1 to complete, should cause the top, level repeat to REQEUE
+   TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
+
+   TestHelper::test_state(t1,NState::QUEUED);
+   BOOST_CHECK_MESSAGE( theTime.is_valid(), "Expected time to be holding");
+   BOOST_CHECK_MESSAGE( !t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be clear");
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Base/test/TestResolveDependencies.cpp b/ecflow_4_0_7/Base/test/TestResolveDependencies.cpp
new file mode 100644
index 0000000..737900d
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestResolveDependencies.cpp
@@ -0,0 +1,277 @@
+#define BOOST_TEST_MODULE TestBase
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #37 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "ExprAst.hpp"
+#include "TestHelper.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_resolve_dependencies )
+{
+	cout << "Base:: ...test_resolve_dependencies\n";
+
+	////////////////////////////////////////////////////////////////////////////////////////////////////
+	// Create the defs file
+	//	suite suite
+	//	   family f
+	//	   		task t
+	//	   			meter step 0 240 120
+	//	   		task tt
+	//	   			complete t:step ge 120
+	//	   			trigger t == complete
+	//	   endfamily
+	//	endsuite
+	Defs defs;
+	std::string metername = "step";
+	std::string suitename = "suite";
+	std::string familyname = "f";
+	{
+		suite_ptr suite = defs.add_suite( suitename );
+      family_ptr fam = suite->add_family( familyname );
+
+		task_ptr task = fam->add_task( "t" );
+		task->addMeter( Meter(metername,0,240,120) );
+
+      task_ptr task_tt = fam->add_task( "tt" );
+		task_tt->add_complete(  "t:step ge 120");
+		task_tt->add_trigger(   "t == complete" );
+
+		std::string errorMsg;
+		BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg), errorMsg);
+	}
+
+
+	// Ensure initial state is unknown
+	string suite_f_t = "/suite/f/t";
+	string suite_f_tt = "/suite/f/tt";
+	node_ptr node_t = defs.findAbsNode(suite_f_t);
+	node_ptr node_tt = defs.findAbsNode(suite_f_tt);
+	suite_ptr suite = defs.findSuite(suitename);
+	family_ptr fam = suite->findFamily(familyname);
+ 	BOOST_CHECK_MESSAGE( suite->state() == NState::UNKNOWN, "expected state NState::UNKNOWN, but found to be " << NState::toString(suite->state()));
+	BOOST_CHECK_MESSAGE( node_t->state() == NState::UNKNOWN, "expected state NState::UNKNOWN, but found to be " << NState::toString(node_t->state()));
+	BOOST_CHECK_MESSAGE( node_tt->state() == NState::UNKNOWN, "expected state NState::UNKNOWN, but found to be " << NState::toString(node_tt->state()));
+ 	BOOST_CHECK_MESSAGE( fam->state() == NState::UNKNOWN, "expected state NState::UNKNOWN, but found to be " << NState::toString(fam->state()));
+
+
+	// ***********************************************************************
+	// Create a request to begin suite
+	// make sure chosen suite can begin to resolve dependencies.
+	// beginning the suite will :
+ 	//     1/ set all children to the QUEUED state
+  	//     2/ Begin job submission, and hence changes state to ACTIVE for submitted jobs
+  	{
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd(suitename)));
+ 	 	BOOST_CHECK_MESSAGE( suite->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(suite->state()));
+	 	BOOST_CHECK_MESSAGE( fam->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(fam->state()));
+		BOOST_CHECK_MESSAGE( node_t->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(node_t->state()));
+		BOOST_CHECK_MESSAGE( node_tt->state() == NState::QUEUED, "expected state NState::QUEUED, but found to be " << NState::toString(node_tt->state()));
+  	}
+
+	//*******************************************************************************
+	// Resolve dependencies.
+ 	//	   		task t
+	//	   			meter step 0 240 120       EXPECTED to be sumbitted
+ 	//
+	//	   		task tt
+	//	   			complete t:step ge 120     Expected to HOLD, since we ain't done nothing yet
+	//	   			trigger t == complete
+	{
+		JobsParam jobsParam; // create jobs = false, spawn jobs = false
+		Jobs jobs(&defs);
+ 		BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+ 		BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 task to submit but found " << jobsParam.submitted().size());
+		BOOST_CHECK_MESSAGE( node_t->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(node_t->state()));
+ 		BOOST_CHECK_MESSAGE( node_tt->state() == NState::QUEUED,"expected state NState::QUEUED, but found to be " << NState::toString(node_tt->state()));
+	}
+
+	//**********************************************************************
+	// Create a request to set the Meter node t. This should force node tt
+	// to complete immediately
+	{
+		int meterValue = 120;
+		TestHelper::invokeRequest(&defs, Cmd_ptr( new MeterCmd(suite_f_t,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,metername,meterValue)));
+      TestHelper::invokeRequest(&defs, Cmd_ptr( new CtsCmd( CtsCmd::FORCE_DEP_EVAL)));
+		const Meter& theMeter = node_t->findMeter(metername);
+		BOOST_CHECK_MESSAGE( !theMeter.empty(), "Could not find the meter ");
+		BOOST_CHECK_MESSAGE( theMeter.value() == meterValue , "Meter value not set");
+
+		BOOST_CHECK_MESSAGE( node_t->state() == NState::ACTIVE, "expected state NState::ACTIVE, but found to be " << NState::toString(node_t->state()));
+ 		BOOST_CHECK_MESSAGE( node_tt->state() == NState::COMPLETE,"expected state NState::COMPLETE, but found to be " << NState::toString(node_tt->state()));
+
+	}
+
+	{
+		std::string errorMsg;
+		BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg), errorMsg);
+	}
+
+	/// Destroy System singleton to avoid valgrind from complaining
+	System::destroy();
+}
+
+BOOST_AUTO_TEST_CASE( test_trigger_after_delete )
+{
+  	cout << "Base:: ...test_trigger_after_delete\n";
+	////////////////////////////////////////////////////////////////////////////////////////////////////
+	//  Create the defs file
+	//	suite suite1    # the limit we want delete
+	//     family f
+	//     		task t0
+  	//          	defstatus complete
+	//     		task t1
+  	//             event event
+  	//          task t2
+  	//             meter meter 0 100 100
+  	//          task t3
+  	//             edit user_var 1
+ 	//          task t4
+  	//             repeat integer repeat_var 0 10 2
+	//     endfamily
+	//	endsuite
+	//	suite suite2
+ 	//	   family f
+ 	//	   		task t0
+  	//				trigger /suite1/f/t0 == complete
+	//	   		task t1
+  	//				trigger /suite1/f/t1:event == set
+	//	   		task t2
+  	//				trigger /suite1/f/t2:meter == 10
+	//	   		task t3
+  	//				trigger /suite1/f/t2:user_var == 1
+	//	   		task t4
+  	//				trigger /suite1/f/t2:repeat_var == 2
+    //	   endfamily
+	//	endsuite
+	//
+	// In this test case all triggers in suite2 will evalate true, we then delete suite1 and
+  	// all the triggers should evaluate false; This is used to test the shared ptr in
+  	// the expression, which hold the reference nodes. When the reference nodes are deleted
+  	// then the expression should not evaluate
+ 	Defs defs;
+	{
+		suite_ptr suite = Suite::create("suite1" );
+		family_ptr f = Family::create("f" );
+		task_ptr t0 = Task::create("t0" );
+		task_ptr t1 = Task::create("t1" );
+		task_ptr t2 = Task::create("t2" );
+		task_ptr t3 = Task::create("t3" );
+		task_ptr t4 = Task::create("t4" );
+		t0->addDefStatus(DState::COMPLETE);
+		t1->addEvent(Event(0,"event"));
+		t2->addMeter(Meter("meter",0,100,100));
+		t3->addVariable(Variable("user_var","1"));
+		t4->addRepeat(RepeatInteger("repeat_var",0,10,2));
+
+		f->addTask(t0);
+		f->addTask(t1);
+		f->addTask(t2);
+		f->addTask(t3);
+		f->addTask(t4);
+		suite->addFamily(f);
+		defs.addSuite( suite );
+	}
+ 	{
+		suite_ptr suite = Suite::create("suite2" );
+		family_ptr f = Family::create("f" );
+		task_ptr t0 = Task::create("t0" );
+		task_ptr t1 = Task::create("t1" );
+		task_ptr t2 = Task::create("t2" );
+		task_ptr t3 = Task::create("t3" );
+		task_ptr t4 = Task::create("t4" );
+		t0->add_trigger("/suite1/f/t0 == complete");
+		t1->add_trigger("/suite1/f/t1:event == set");
+		t2->add_trigger("/suite1/f/t2:meter == 10");
+		t3->add_trigger("/suite1/f/t3:user_var == 1");
+		t4->add_trigger("/suite1/f/t4:repeat_var == 2");
+
+		f->addTask(t0);
+		f->addTask(t1);
+		f->addTask(t2);
+		f->addTask(t3);
+		f->addTask(t4);
+		suite->addFamily(f);
+		defs.addSuite( suite );
+	}
+
+ 	// begin. This will reset all attributes
+ 	defs.beginAll();
+
+ 	// setup attrbutes in suite1 so that evalaution will succeed in suite 2
+ 	// *** this must be in its own scope otherwise the shared_ptr will keep the node alive
+ 	{
+ 		node_ptr t1 =  defs.findAbsNode("/suite1/f/t1"); t1->changeEvent("event","set");
+ 		node_ptr t2 =  defs.findAbsNode("/suite1/f/t2"); t2->changeMeter("meter",10);
+ 		node_ptr t4 =  defs.findAbsNode("/suite1/f/t4"); t4->changeRepeat("2");
+ 		// cout << defs;
+ 	}
+
+ 	// evalate the triggers in suite2
+ 	{
+		node_ptr suite2 =  defs.findAbsNode("/suite2");
+		std::vector<task_ptr> suite2_tasks;
+		suite2->get_all_tasks(suite2_tasks);
+		BOOST_REQUIRE_MESSAGE(suite2_tasks.size() == 5, "Expected 5 tasks on suite2 but found " << suite2_tasks.size());
+
+		for(size_t i = 0; i < suite2_tasks.size(); i++) {
+			BOOST_REQUIRE_MESSAGE( suite2_tasks[i]->triggerAst()->evaluate(), "Expected task " << suite2_tasks[i]->absNodePath() << " to evaluate");
+		}
+ 	}
+
+
+	// Ok Now delete suite1,
+	// *** It is extremely important that shared_ptr for '/suite1' is in its own
+	// *** scope, otherwise it will keep the 'suite' live, and NOT delete the limits
+	{
+		node_ptr suite1 =  defs.findAbsNode("/suite1");
+		BOOST_REQUIRE_MESSAGE( suite1.get(), "Could not find the suite we want to delete?");
+		BOOST_REQUIRE_MESSAGE( defs.deleteChild(suite1.get()), "Deletion failed?");
+		BOOST_REQUIRE_MESSAGE( !defs.findAbsNode("/suite1").get(), "Deletion failed?");
+	}
+
+	// revaluate the triggers in suite2. This should fail, since we have delete suite1
+ 	{
+		node_ptr suite2 =  defs.findAbsNode("/suite2");
+		std::vector<task_ptr> suite2_tasks;
+		suite2->get_all_tasks(suite2_tasks);
+		BOOST_REQUIRE_MESSAGE(suite2_tasks.size() == 5, "Expected 5 tasks on suite2 but found " << suite2_tasks.size());
+
+		for(size_t i = 0; i < suite2_tasks.size(); i++) {
+			BOOST_REQUIRE_MESSAGE( !suite2_tasks[i]->triggerAst()->evaluate(), "Expected task " << suite2_tasks[i]->absNodePath() << " to fail evaluation");
+		}
+ 	}
+
+	/// Destroy System singleton to avoid valgrind from complaining
+	System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Base/test/TestSSyncCmd.cpp b/ecflow_4_0_7/Base/test/TestSSyncCmd.cpp
new file mode 100644
index 0000000..2bb6988
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestSSyncCmd.cpp
@@ -0,0 +1,383 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #40 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <boost/function.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MyDefsFixture.hpp"
+#include "MockServer.hpp"
+#include "TestHelper.hpp"
+#include "SSyncCmd.hpp"
+#include "SNewsCmd.hpp"
+#include "Ecf.hpp"
+#include "NodeFwd.hpp"
+#include "SuiteChanged.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "CalendarUpdateParams.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+/// define a function which returns nothing, and takes a defs_ptr parameter
+typedef boost::function<void (defs_ptr)> defs_change_cmd;
+
+/// Re-use the same test scaffold to modify and then resync, by passing
+/// in a function that will modify the defs
+static void test_sync_scaffold(
+         defs_change_cmd the_defs_change_command,
+         const std::string& test_name,
+         bool full_sync = false,
+         bool start_with_begin = false)
+{
+	MyDefsFixture clientFixture;
+	MyDefsFixture serverFixture;
+	defs_ptr server_defs = serverFixture.create_defs();
+	if ( start_with_begin ) server_defs->beginAll();
+	server_defs->set_server().set_state( SState::HALTED);  // if defs default state is RUNNING, whereas for server it is HALTED
+
+ 	ServerReply server_reply;
+   defs_ptr client_defs = clientFixture.create_defs();
+   if ( start_with_begin ) client_defs->beginAll();
+   client_defs->set_server().set_state( SState::HALTED); // if defs default state is RUNNING, whereas for server it is HALTED
+	server_reply.set_client_defs(  client_defs );
+
+
+	Ecf::set_debug_equality(true); // only has affect in DEBUG build
+	BOOST_CHECK_MESSAGE( *server_defs == *server_reply.client_defs(),"Test:" << test_name << ": Starting point client and server defs should be the same");
+	Ecf::set_debug_equality(false);
+
+	// Get change number before any changes
+	unsigned int client_state_change_no = Ecf::state_change_no();
+	unsigned int client_modify_change_no = Ecf::modify_change_no();
+
+	// make some change to the server
+	{
+		Ecf::set_server(true);
+
+		the_defs_change_command(server_defs);
+
+      std::string error_msg;
+      BOOST_REQUIRE_MESSAGE( server_defs->checkInvariants(error_msg),"Test:" << test_name << ": Invariants failed: " << error_msg);
+      BOOST_REQUIRE_MESSAGE( !(*server_reply.client_defs() == *server_defs),"Test:" << test_name << ": Expected client and server defs to differ\n" << *server_reply.client_defs() << "\n" << "server defs   = " << *server_defs);
+		Ecf::set_server(false);
+	}
+
+	MockServer mock_server(server_defs);
+	unsigned int client_handle = 0;
+   SNewsCmd news_cmd(client_handle, client_state_change_no,  client_modify_change_no, &mock_server );
+   SSyncCmd cmd(client_handle, client_state_change_no,  client_modify_change_no, &mock_server );
+
+   std::string error_msg;
+   BOOST_REQUIRE_MESSAGE( server_defs->checkInvariants(error_msg),"Test:" << test_name << ": Invariants failed: " << error_msg);
+   BOOST_CHECK_MESSAGE( news_cmd.get_news(), "Test:" << test_name << ": Expected server to change");
+   BOOST_CHECK_MESSAGE( cmd.do_sync( server_reply ),"Test:" << test_name << ": Expected server to change");
+	BOOST_CHECK_MESSAGE( server_reply.in_sync(),     "Test:" << test_name << ": Expected server to change");
+	BOOST_CHECK_MESSAGE( server_reply.full_sync() == full_sync,"Test:" << test_name << ": Expected sync not as expected");
+
+	error_msg.clear();
+   BOOST_REQUIRE_MESSAGE( server_reply.client_defs()->checkInvariants(error_msg),"Test:" << test_name << ": Invariants failed: " << error_msg);
+
+	Ecf::set_debug_equality(true);
+	BOOST_CHECK_MESSAGE( *server_defs == *server_reply.client_defs(),"Test:" << test_name << ": Server and client should be same after sync" );
+	Ecf::set_debug_equality(false);
+}
+
+// The modifiers
+void delete_some_attributes(defs_ptr defs)
+{
+	std::vector<Task*> tasks;
+	defs->getAllTasks(tasks);
+	BOOST_FOREACH(Task* task, tasks) {
+
+		SuiteChanged1 changed(task->suite());
+
+		/// Take a copy, of the objects we want to delete. since there are returned by reference
+		std::vector<Event> events = task->events();
+		std::vector<Meter> meters = task->meters();
+		std::vector<Label> labels = task->labels();
+
+		BOOST_FOREACH(const Event& e, events) { task->deleteEvent( e.name_or_number() );}
+		BOOST_FOREACH(const Meter& m, meters) { task->deleteMeter( m.name() ); }
+		BOOST_FOREACH(const Label& l, labels) { task->deleteLabel( l.name() ); }
+
+		BOOST_REQUIRE_MESSAGE( task->events().empty(),"Expected all events to be deleted");
+		BOOST_REQUIRE_MESSAGE( task->meters().empty(),"Expected all meters to be deleted");
+		BOOST_REQUIRE_MESSAGE( task->labels().empty(),"Expected all labels to be deleted");
+	}
+}
+
+void add_some_attributes(defs_ptr defs) {
+	std::vector<task_ptr> tasks;
+	defs->get_all_tasks(tasks);
+	BOOST_FOREACH(task_ptr task, tasks) { SuiteChanged1 changed(task->suite()); task->addDay( DayAttr(DayAttr::TUESDAY) );}
+}
+
+void begin(defs_ptr defs) { defs->beginAll();} // reset all attributes
+
+void add_alias(defs_ptr defs) {
+
+   std::vector<task_ptr> tasks;
+   defs->get_all_tasks(tasks);
+   BOOST_REQUIRE_MESSAGE( !tasks.empty(), "Expected at least one task");
+
+   SuiteChanged1 changed(tasks[0]->suite());
+   tasks[0]->add_alias_only();
+}
+
+void remove_all_aliases(defs_ptr defs) {
+
+   std::vector<alias_ptr> aliases;
+   defs->get_all_aliases(aliases);
+   BOOST_REQUIRE_MESSAGE( !aliases.empty(), "Expected at least one alias");
+
+   BOOST_FOREACH(alias_ptr alias, aliases) {
+      TestHelper::invokeRequest(defs.get(),Cmd_ptr( new PathsCmd(PathsCmd::DELETE,alias->absNodePath())));
+   }
+
+   aliases.clear();
+   defs->get_all_aliases(aliases);
+   BOOST_REQUIRE_MESSAGE( aliases.empty(), "Expected at no  alias");
+}
+
+void remove_all_tasks(defs_ptr defs) {
+
+	// Remove tasks should force a incremental sync
+	std::vector<task_ptr> tasks;
+	defs->get_all_tasks(tasks);
+	BOOST_FOREACH(task_ptr task, tasks) { SuiteChanged1 changed(task->suite()); task->remove() ;}
+
+	tasks.clear();
+	defs->get_all_tasks(tasks);
+	BOOST_REQUIRE_MESSAGE( tasks.empty(), "Failed to delete tasks");
+}
+
+void remove_a_family(defs_ptr defs) {
+
+   // Remove tasks should force a incremental sync
+   std::vector<Family*> vec;
+   defs->getAllFamilies(vec);
+   size_t family_size = vec.size();
+   BOOST_REQUIRE_MESSAGE( !vec.empty(), "Expected at least one family");
+   if (!vec.empty()) {
+      SuiteChanged1 changed(vec[0]->suite());
+      vec[0]->remove();
+   }
+
+   vec.clear();
+   defs->getAllFamilies(vec);
+   BOOST_REQUIRE_MESSAGE( vec.size() < family_size, "Failed to delete family");
+}
+
+
+void change_clock_gain(defs_ptr defs) {
+  	BOOST_FOREACH(suite_ptr suite, defs->suiteVec()) {
+		if (suite->clockAttr().get()) {
+			SuiteChanged changed(suite);
+ 			suite->changeClockGain("100001");
+		}
+ 	}
+}
+void change_clock_type_to_real(defs_ptr defs) {
+
+   BOOST_FOREACH(suite_ptr suite, defs->suiteVec()) {
+      if (suite->clockAttr().get()) {
+         SuiteChanged changed(suite);
+         suite->changeClockType("real");
+      }
+   }
+}
+void change_clock_type_to_hybrid(defs_ptr defs) {
+
+   BOOST_FOREACH(suite_ptr suite, defs->suiteVec()) {
+      if (suite->clockAttr().get()) {
+         SuiteChanged changed(suite);
+         suite->changeClockType("hybrid");
+      }
+   }
+}
+void change_clock_date(defs_ptr defs) {
+
+   BOOST_FOREACH(suite_ptr suite, defs->suiteVec()) {
+      if (suite->clockAttr().get()) {
+         SuiteChanged changed(suite);
+         suite->changeClockDate("1.1.2001");
+      }
+   }
+}
+void change_clock_sync(defs_ptr defs) {
+
+   BOOST_FOREACH(suite_ptr suite, defs->suiteVec()) {
+      if (suite->clockAttr().get()) {
+         SuiteChanged changed(suite);
+         suite->changeClockSync();
+      }
+   }
+}
+
+
+/// This has been split into two functions, as changing both together could mask an error
+/// i.e found bug where we forgot to update state_change number when changing the limit
+/// max value, however because we had, changed value as well it got masked.
+void change_limit_max(defs_ptr defs) {
+
+   BOOST_FOREACH(suite_ptr s, defs->suiteVec()) {
+      std::vector<limit_ptr> theLimits =  s->limits();
+      BOOST_FOREACH(limit_ptr l, theLimits) {
+         //std::cout << "found " << l->toString() << "\n";
+         TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::LIMIT_MAX,l->name(),"90")));
+         limit_ptr v = s->find_limit(l->name());
+         BOOST_CHECK_MESSAGE( v.get() && v->theLimit() == 90, "expected to find limit with max value of 90");
+      }
+   }
+}
+void change_limit_value(defs_ptr defs) {
+
+   BOOST_FOREACH(suite_ptr s, defs->suiteVec()) {
+      std::vector<limit_ptr> theLimits =  s->limits();
+      BOOST_FOREACH(limit_ptr l, theLimits) {
+         TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::LIMIT_VAL,l->name(),"33")));
+         limit_ptr v = s->find_limit(l->name());
+         BOOST_CHECK_MESSAGE( v.get() && v->value() == 33, "expected to find limit with value of 33");
+      }
+   }
+}
+
+
+void update_repeat(defs_ptr defs) {
+
+   std::vector<Node*> nodes;
+   defs->getAllNodes(nodes);
+
+   BOOST_FOREACH(Node* n, nodes) {
+      if (!n->repeat().empty()) {
+         SuiteChanged1 changed(n->suite());
+         n->increment_repeat();
+      }
+   }
+}
+
+void update_calendar(defs_ptr defs) {
+
+   // The calendar is *only* updated if the suite have been begun. Hence make sure this test scaffold
+   // starts the test, with all the suites in a begun state
+   CalendarUpdateParams p( Calendar::second_clock_time(), minutes(1), true /* server running */, false/* for Test*/ );
+   defs->updateCalendar(p);
+
+   // Currently updating the calendar, does not cause change, Hence force a change
+   BOOST_FOREACH(suite_ptr suite, defs->suiteVec()) {
+      SuiteChanged changed(suite);
+      suite->add_variable("name","value");
+   }
+
+   // Note: In the real server, persisting that calendar, the clock type is not persisted.
+   //       i.e when we have hybrid calendar, when restored on the client side it will be 'real' clock since
+   //       that is the default now. This is not correct and will fail invariant checking.
+   //       however the memento should reset clock type on the calenadar form the clok attribute.
+}
+
+
+void delete_suite(defs_ptr defs) {
+   std::vector<suite_ptr> vec =  defs->suiteVec();
+   BOOST_REQUIRE_MESSAGE(!vec.empty(),"Expected suites");
+   vec[0]->remove();
+}
+
+void set_server_state_shutdown(defs_ptr defs) {
+   defs->set_server().set_state( SState::SHUTDOWN );
+}
+void set_server_state_running(defs_ptr defs) {
+   defs->set_server().set_state( SState::RUNNING );
+}
+
+void add_server_variable(defs_ptr defs) {
+   TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd("/",AlterCmd::ADD_VARIABLE,"_fred_","value")));
+}
+void change_server_variable(defs_ptr defs) {
+   // Because the scaffold create client/server defs each time.
+   // To test change/delete variables we modify the default set
+   TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd("/",AlterCmd::VARIABLE,"ECF_TRIES","4")));
+}
+void delete_server_variable(defs_ptr defs) {
+   // Because the scaffold create client/server defs each time.
+   // To test change/delete variables we modify the default set
+   // ***NOTE*** we can not delete server variables like ECF_TRIES, can only change them
+   // However we can delete user variables added to the server
+   TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd("/",AlterCmd::DEL_VARIABLE,"MyDefsFixture_user_variable")));
+}
+
+void reorder_suites(defs_ptr defs) {
+   std::vector<suite_ptr> suiteVec =  defs->suiteVec();
+   BOOST_REQUIRE_MESSAGE(!suiteVec.empty(),"Expected suites");
+   std::string path = "/" + suiteVec[0]->name();
+   TestHelper::invokeRequest(defs.get(),Cmd_ptr( new OrderNodeCmd(path,NOrder::ALPHA)));
+}
+
+void set_defs_flag(defs_ptr defs) {
+   defs->flag().set(ecf::Flag::MESSAGE);
+}
+
+void set_defs_state(defs_ptr defs) {
+   defs->set_state(NState::ABORTED);
+}
+
+BOOST_AUTO_TEST_CASE( test_ssync_cmd  )
+{
+	// To DEBUG: enable the defines in Memento.hpp
+	cout << "Base:: ...test_ssync_cmd\n";
+   test_sync_scaffold(update_repeat,"update_repeat");
+   test_sync_scaffold(delete_some_attributes,"delete_some_attributes");
+	test_sync_scaffold(add_some_attributes,"add_some_attributes");
+   test_sync_scaffold(begin,"begin",true /* expect full_sync */);
+   test_sync_scaffold(add_alias,"add_alias");
+   test_sync_scaffold(remove_all_aliases,"remove_all_aliases");
+   test_sync_scaffold(remove_all_tasks,"remove_all_tasks");
+   test_sync_scaffold(remove_a_family,"remove_a_family");
+   test_sync_scaffold(change_clock_gain,"change_clock_gain", true  /* expect full_sync */);
+   test_sync_scaffold(change_clock_type_to_real,"change_clock_type_to_real", true  /* expect full_sync */);
+   test_sync_scaffold(change_clock_type_to_hybrid,"change_clock_type_to_hybrid", true  /* expect full_sync */);
+   test_sync_scaffold(change_clock_date,"change_clock_date", true  /* expect full_sync */);
+   test_sync_scaffold(change_clock_sync,"change_clock_sync", true  /* expect full_sync */);
+   test_sync_scaffold(update_calendar,"update_calendar", false/* expect full_sync */, true /* start test with begin */ );
+   test_sync_scaffold(change_limit_max,"change_limit_max");
+   test_sync_scaffold(change_limit_value,"change_limit_value");
+   test_sync_scaffold(delete_suite,"delete_suite", true /* expect full_sync */);
+
+   // Test Changes in Defs
+   // The default server state is HALTED, hence setting to halted will not show a change
+   test_sync_scaffold(set_server_state_shutdown,"set_server_state_shutdown");
+   test_sync_scaffold(set_server_state_running,"set_server_state_running");
+
+   test_sync_scaffold(add_server_variable,"add_server_variable");
+   test_sync_scaffold(change_server_variable,"change_server_variable");
+   test_sync_scaffold(delete_server_variable,"delete_server_variable");
+
+   test_sync_scaffold(reorder_suites,"reorder_suites");
+
+   test_sync_scaffold(set_defs_flag,"set_defs_flag");
+   test_sync_scaffold(set_defs_state,"set_defs_state");
+
+	/// Keep valgrind happy
+	ChangeMgrSingleton::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+
diff --git a/ecflow_4_0_7/Base/test/TestSSyncCmdOrder.cpp b/ecflow_4_0_7/Base/test/TestSSyncCmdOrder.cpp
new file mode 100644
index 0000000..06d91d4
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestSSyncCmdOrder.cpp
@@ -0,0 +1,233 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <boost/function.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MyDefsFixture.hpp"
+#include "MockServer.hpp"
+#include "TestHelper.hpp"
+#include "SSyncCmd.hpp"
+#include "Ecf.hpp"
+#include "NodeFwd.hpp"
+#include "SuiteChanged.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+
+// The client handle commands do not change state & modify change number, hence need to bypass these checks
+static bool bypass_state_modify_change_check = false;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+/// define a function which returns nothing, and takes a defs_ptr parameter
+typedef boost::function<void (defs_ptr)> defs_change_cmd;
+
+template <typename T>
+static std::vector<std::string> toStrVec(const std::vector<T>& vec)
+{
+   std::vector<std::string> retVec; retVec.reserve(vec.size());
+   BOOST_FOREACH(T s, vec) { retVec.push_back(s->name()); }
+   return retVec;
+}
+
+static std::string toString(const std::vector<std::string>& c)
+{
+   std::stringstream ss;
+   std::copy (c.begin(), c.end(), std::ostream_iterator <std::string> (ss, ", "));
+   return ss.str();
+}
+
+static std::vector<std::string> vector_abcd() {
+    std::vector<std::string> names; names.reserve(4);
+    names.push_back("a"); names.push_back("b"); names.push_back("c"); names.push_back("d");
+    return names;
+}
+static std::vector<std::string> vector_dcba() {
+    std::vector<std::string> names; names.reserve(4);
+    names.push_back("d"); names.push_back("c"); names.push_back("b"); names.push_back("a");
+    return names;
+}
+
+static defs_ptr create_defs()
+{
+   std::vector<std::string> names = vector_dcba();
+   defs_ptr defs =  Defs::create();
+   for(size_t j = 0; j <names.size(); j++)  {
+      suite_ptr s = defs->add_suite( names[j] );
+      if ( 0 == j) { // only add family to first suite
+         for(size_t k = 0; k <names.size(); k++)  {
+            family_ptr f = s->add_family(names[k]);
+            for(size_t l = 0; l <names.size(); l++)  {
+               task_ptr t = f->add_task(names[l]);
+//               t->add_alias_only(); // alias0
+//               t->add_alias_only(); // alias1
+//               t->add_alias_only(); // alias2
+            }
+         }
+      }
+   }
+   return defs;
+}
+
+
+/// Re-use the same test scaffold to modify and then resync, by passing in a function that will modify the defs
+static void test_sync_scaffold( defs_change_cmd the_defs_change_command,
+                               unsigned int test_equality,  /*0 means test equality, any other number test size*/
+                               bool full_sync, unsigned int client_handle)
+{
+   defs_ptr server_defs = create_defs();
+   ServerReply server_reply;
+   server_reply.set_client_defs( create_defs() );
+
+
+   Ecf::set_debug_equality(true); // only has affect in DEBUG build
+   BOOST_CHECK_MESSAGE( *server_defs == *server_reply.client_defs(), "Starting point client and server defs should be the same");
+   Ecf::set_debug_equality(false);
+
+   // Get change number before any changes
+   Ecf::set_state_change_no(0);
+   Ecf::set_modify_change_no(0);
+   unsigned int client_state_change_no = Ecf::state_change_no();
+   unsigned int client_modify_change_no = Ecf::modify_change_no();
+
+   // make some change to the server
+   {
+      Ecf::set_server(true);
+
+      the_defs_change_command(server_defs);
+      std::string errorMsg;
+      BOOST_REQUIRE_MESSAGE( server_defs->checkInvariants(errorMsg),"Invariants failed " << errorMsg);
+      BOOST_REQUIRE_MESSAGE( !(*server_reply.client_defs() == *server_defs), "Expected client and server defs to differ " << *server_reply.client_defs() << "\n" << "server defs   = " << *server_defs);
+      Ecf::set_server(false);
+   }
+
+//   cout << "test_sync_scaffold AFTER Command before SYNC: Server:\n" << *server_defs << "\n";
+//   cout << "test_sync_scaffold AFTER Command before SYNC: Client:\n" << *server_reply.client_defs() << "\n";
+
+   MockServer mock_server(server_defs);
+   SSyncCmd cmd(client_handle, client_state_change_no,  client_modify_change_no, &mock_server );
+   string error_msg;BOOST_REQUIRE_MESSAGE(mock_server.defs()->checkInvariants(error_msg), error_msg);
+   BOOST_CHECK_MESSAGE( cmd.do_sync( server_reply ), "Expected server to change");
+   BOOST_CHECK_MESSAGE( server_reply.in_sync(),      "Expected to be in sync");
+   BOOST_CHECK_MESSAGE( server_reply.full_sync() == full_sync, "Expected full sync");
+
+   if (0 == test_equality) {
+      Ecf::set_debug_equality(true);
+      BOOST_CHECK_MESSAGE( *server_defs == *server_reply.client_defs(), "Server and client should be same after sync" );
+      Ecf::set_debug_equality(false);
+   }
+   else {
+      BOOST_CHECK_MESSAGE( server_reply.client_defs()->suiteVec().size() == test_equality, "Expected suite of size " << test_equality << " but found " <<  server_reply.client_defs()->suiteVec().size());
+   }
+}
+
+static void reorder_suites(defs_ptr theDefs) {
+
+   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new OrderNodeCmd("/a",NOrder::ALPHA)));
+   BOOST_REQUIRE_MESSAGE( toStrVec(theDefs->suiteVec()) == vector_abcd(),"NOrder::ALPHA expected " << toString(vector_abcd())<< " but found: " << toString(toStrVec(theDefs->suiteVec())));
+}
+
+static void reorder_family(defs_ptr theDefs) {
+//   std::cout << "reorder_family\n" << *theDefs << "\n";
+
+   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new OrderNodeCmd("/d/d",NOrder::ALPHA)));
+
+   std::vector<Family*> families;
+   theDefs->findSuite("d")->getAllFamilies(families);
+   BOOST_REQUIRE_MESSAGE( toStrVec(families) == vector_abcd(),"NOrder::ALPHA  expected " << toString(vector_abcd())<< " but found: " << toString(toStrVec(families)));
+}
+
+static void reorder_task(defs_ptr theDefs) {
+   //std::cout << "reorder_task\n" << *theDefs << "\n";
+
+   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new OrderNodeCmd("/d/d/d",NOrder::ALPHA)));
+
+   std::vector<Task*> tasks;
+   theDefs->findAbsNode("/d/d")->getAllTasks(tasks);
+   BOOST_REQUIRE_MESSAGE( toStrVec(tasks) == vector_abcd(),"NOrder::ALPHA  expected " << toString(vector_abcd())<< " but found: " << toString(toStrVec(tasks)));
+}
+
+//static void reorder_alias(defs_ptr theDefs) {
+//   //std::cout << "reorder_task\n" << *theDefs << "\n";
+//
+//   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new OrderNodeCmd("/d/d/d/alias0",NOrder::ALPHA)));
+//
+//   std::vector<alias_ptr> aliases;
+//   theDefs->findAbsNode("/d/d/d")->get_all_aliases(aliases);
+//   BOOST_REQUIRE_MESSAGE( toStrVec(aliases) == vector_abcd(),"NOrder::ALPHA  expected " << toString(vector_abcd())<< " but found: " << toString(toStrVec(tasks)));
+//}
+
+
+static void reorder_suites_using_handles(defs_ptr theDefs) {
+
+   // *** NOTE ****: Whenever we register a handle, we get a *FULL* sync
+
+   // create client handle which references all the suites
+   // It should be noted that invokeRequest, uses a MockServer, which set/unsets
+   // Hence after this call Ecf::server_ is false. Hence we need to ensure that following
+   // commands/ DM function set Ecf::server_ to true.
+   std::vector<std::string> suite_names = vector_abcd();
+   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new ClientHandleCmd(suite_names,false)),bypass_state_modify_change_check);
+   BOOST_CHECK_MESSAGE(theDefs->client_suite_mgr().clientSuites().size() == 1,"Expected 1 Client suites but found " << theDefs->client_suite_mgr().clientSuites().size());
+
+   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new OrderNodeCmd("/a",NOrder::ALPHA)));
+   BOOST_REQUIRE_MESSAGE( toStrVec(theDefs->suiteVec()) == vector_abcd(),"NOrder::ALPHA  expected " << toString(vector_abcd())<< " but found: " << toString(toStrVec(theDefs->suiteVec())));
+}
+
+static void reorder_family_using_handles(defs_ptr theDefs) {
+
+   // *** NOTE ****: Whenever we register a handle, we get a *FULL* sync
+
+   // create client handle which references all the suites
+   // It should be noted that invokeRequest, uses a MockServer, which set/unsets
+   // Hence after this call Ecf::server_ is false. Hence we need to ensure that following
+   // commands/ DM function set Ecf::server_ to true.
+   std::vector<std::string> suite_names ; suite_names.push_back("d"); // clinet handle for suite 'd' ONLY
+   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new ClientHandleCmd(suite_names,false)),bypass_state_modify_change_check);
+   BOOST_CHECK_MESSAGE(theDefs->client_suite_mgr().clientSuites().size() == 1,"Expected 1 Client suites but found " << theDefs->client_suite_mgr().clientSuites().size());
+
+   /// Don't call, data model function directly, since Ecf::server_ is false. *here*
+   /// The suite should stay the same, only suite d's family should change
+   TestHelper::invokeRequest(theDefs.get(),Cmd_ptr( new OrderNodeCmd("/d/d",NOrder::ALPHA)));
+   BOOST_REQUIRE_MESSAGE( toStrVec(theDefs->suiteVec()) == vector_dcba(),"expected " << toString(vector_dcba())<< " but found: " << toString(toStrVec(theDefs->suiteVec())));
+
+   suite_ptr suite_a = theDefs->findSuite("d");
+   std::vector<Family*> families;  suite_a->getAllFamilies(families);
+   BOOST_REQUIRE_MESSAGE( toStrVec(families) == vector_abcd(),"NOrder::ALPHA  expected " << toString(vector_abcd())<< " but found: " << toString(toStrVec(families)));
+}
+
+
+BOOST_AUTO_TEST_CASE( test_ssync_cmd_test_order  )
+{
+   cout << "Base:: ...test_ssync_cmd_test_order\n";
+   test_sync_scaffold(reorder_suites, 0 /* test equality */, false /* expect full_sync */, 0);
+   test_sync_scaffold(reorder_family, 0 /* test equality */, false /* expect full_sync */, 0);
+   test_sync_scaffold(reorder_task,   0 /* test equality */, false /* expect full_sync */, 0);
+//   test_sync_scaffold(reorder_alias,  0 /* test equality */, false /* expect full_sync */, 0);
+
+   test_sync_scaffold(reorder_suites_using_handles,  0 /* test equality */, true /* expect full_sync */, 1 /* client handle */);
+   test_sync_scaffold(reorder_family_using_handles,  1 /* test size     */, true /* expect full_sync */, 1 /* client handle */);
+
+   /// Keep valgrind happy
+   ChangeMgrSingleton::destroy();
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Base/test/TestSSyncCmd_CH1.cpp b/ecflow_4_0_7/Base/test/TestSSyncCmd_CH1.cpp
new file mode 100644
index 0000000..058cdf9
--- /dev/null
+++ b/ecflow_4_0_7/Base/test/TestSSyncCmd_CH1.cpp
@@ -0,0 +1,678 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <boost/function.hpp>
+
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MyDefsFixture.hpp"
+#include "MockServer.hpp"
+#include "TestHelper.hpp"
+#include "SSyncCmd.hpp"
+#include "SNewsCmd.hpp"
+#include "Ecf.hpp"
+#include "NodeFwd.hpp"
+#include "SuiteChanged.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+using namespace std;
+using namespace ecf;
+
+/// This test, is used to check sync with the client handles.
+/// The client handles will register interest in a set of suites
+/// When calling sync, check will only receive notification on our
+/// our suites
+// In particular when a set of suites are registered to a handle
+// and we add/delete/check point/order the server passes back to the client
+// the a *new* defs with all the suites corresponding to the handle
+// There is a complication however, the suite are not copied/cloned
+// This causes a problem, since if we create a new defs, and add
+// the suites, the suite defs pointer is *NOW* corrupted, as it will point
+// to the new defs. This is not an issue in real apps, since searisation
+// fixes up these ptrs.
+
+// The client handle commands do not change state & modify change number, hence need to bypass these checks
+static bool bypass_state_modify_change_check = false;
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+static defs_ptr create_client_defs(defs_ptr defs)
+{
+   for(size_t j = 0; j < 5; j++)  {
+      suite_ptr suite = defs->add_suite( "s" + boost::lexical_cast<std::string>(j) );
+      family_ptr f = suite->add_family("f");
+      f->add_task("t");
+      if (j == 0) {
+         suite->addLimit( Limit("suiteLimit",10) );
+         suite->addRepeat( RepeatDate("YMD",20090916,20090916,1) );
+      }
+   }
+   return defs;
+}
+
+static defs_ptr create_server_defs()
+{
+   defs_ptr defs = Defs::create();
+
+   // Create server defs, with a port other than default.
+   // This allows additional testing. i.e server variables
+   std::vector<Variable>  server_variables;
+   ServerState::setup_default_server_variables(server_variables,"4000");
+   defs->set_server().set_server_variables(server_variables);
+
+   // ensure client/server start out the same
+   return create_client_defs(defs);
+}
+
+/// define a function which returns nothing, and takes a defs_ptr parameter
+typedef boost::function<bool (defs_ptr)> defs_change_cmd;
+
+/// Re-use the same test scaffold to modify and then resync, by passing
+/// in a function that will modify the defs
+void test_sync_scaffold( defs_change_cmd the_defs_change_command, const std::string& test_name, bool full_sync = false)
+{
+   // Create the defs
+   defs_ptr server_defs = create_server_defs();
+   ServerReply server_reply;
+   server_reply.set_client_defs( create_client_defs(Defs::create()) );
+
+   Ecf::set_debug_equality(true); // only has affect in DEBUG build
+   BOOST_CHECK_MESSAGE( *server_defs == *server_reply.client_defs(),
+                        test_name << ": Starting point client and server defs should be the same : "
+                        << "SERVER\n" << server_defs
+                        << "CLIENT\n" << server_reply.client_defs());
+   Ecf::set_debug_equality(false);
+
+   // set handle and change numbers, before any changes
+   Ecf::set_state_change_no(0);
+   Ecf::set_modify_change_no(0);
+   unsigned int client_state_change_no = Ecf::state_change_no();
+   unsigned int client_modify_change_no = Ecf::modify_change_no();
+   unsigned int client_handle = 0;
+
+   bool expected_change;
+
+   // make some change to the server
+   {
+      /// create client handle which references suites s0 and s4, in the server defs
+      /// Registering suites should change handle_changed boolean
+      std::vector<std::string> suite_names; suite_names.push_back("s0"); suite_names.push_back("s4");
+      TestHelper::invokeRequest(server_defs.get(),Cmd_ptr( new ClientHandleCmd(suite_names,false)),bypass_state_modify_change_check);
+
+      BOOST_CHECK_MESSAGE(server_defs->client_suite_mgr().clientSuites().size() == 1,test_name << ": Expected 1 Client suites but found " <<server_defs->client_suite_mgr().clientSuites().size());
+      client_handle = server_defs->client_suite_mgr().clientSuites().front().handle();
+      BOOST_CHECK_MESSAGE( client_handle == 1,"" );
+
+      /// Check that handle_changed set, required for syncing, i.e needed for full sync , without change state/modify numbers
+      BOOST_CHECK_MESSAGE(server_defs->client_suite_mgr().handle_changed(client_handle) == true,"Expected handle_changed to be set when suites are registered ");
+
+      /// called create Defs should clear the flag. make sure server state, is synced
+      defs_ptr the_client_defs = server_defs->client_suite_mgr().create_defs(client_handle,server_defs);
+      BOOST_CHECK_MESSAGE(the_client_defs->suiteVec().size() == 2  ,test_name << ": Expected 2 suites");
+      BOOST_CHECK_MESSAGE(server_defs->client_suite_mgr().handle_changed(client_handle) == false,test_name << ": Expected handle_changed to be cleared after create_defs()");
+      Ecf::set_debug_equality(true);
+      BOOST_CHECK_MESSAGE( server_defs->server().compare(the_client_defs->server() ), test_name << ": Server state does not match");
+      Ecf::set_debug_equality(false);
+
+      Ecf::set_server(true);
+      expected_change = the_defs_change_command(server_defs);
+      std::string error_msg;
+      BOOST_REQUIRE_MESSAGE( server_defs->checkInvariants(error_msg) , test_name << ": Invariants failed: " << error_msg);
+      Ecf::set_server(false);
+
+      /// Call create defs again, after change in server defs, check server state is synced
+      the_client_defs = server_defs->client_suite_mgr().create_defs(client_handle,server_defs);
+      Ecf::set_debug_equality(true);
+      BOOST_CHECK_MESSAGE( server_defs->server().compare(the_client_defs->server() ), test_name << ": Server state does not match");
+      Ecf::set_debug_equality(false);
+   }
+
+   MockServer mock_server(server_defs);
+   SNewsCmd news_cmd(client_handle, client_state_change_no,  client_modify_change_no, &mock_server );
+   SSyncCmd cmd(client_handle, client_state_change_no,  client_modify_change_no, &mock_server );
+
+   if ( expected_change ) {
+      BOOST_CHECK_MESSAGE( news_cmd.get_news(),         test_name << " : get_news : Expected server to change");
+      BOOST_CHECK_MESSAGE( cmd.do_sync( server_reply ), test_name << " : do_sync : Expected server to change");
+      BOOST_CHECK_MESSAGE( server_reply.in_sync(),      test_name << " : in_sync : Expected client server to be in sync");
+      BOOST_CHECK_MESSAGE( server_reply.full_sync() == full_sync,test_name << ": Expected sync not as expected. client: " << server_reply.full_sync() << " full_sync: " << full_sync);
+      BOOST_CHECK_MESSAGE( server_defs->state() == server_reply.client_defs()->state(),test_name << ": Expected server State(" << NState::toString(server_defs->state()) << ") to be same as client state(" << NState::toString(server_reply.client_defs()->state()) << ")");
+      if (full_sync) {
+         Ecf::set_debug_equality(true);
+         BOOST_CHECK_MESSAGE( server_defs->server().compare(server_reply.client_defs()->server()),test_name << ": Server state does not match");
+         Ecf::set_debug_equality(false);
+      }
+      else {
+      }
+
+      // * Note we expect client defs to fail invariant checking when doing a full sync with handles
+      // * Under real server this should be ok since, we fix up the defs ptr, during serialisation
+
+      // * note. We can't really compare server and client defs, since when we sync with
+      // * with handles, we only return a sub set of the suites, in our handle
+
+      // DO a sync again. hence we should expect no changes
+      server_reply.clear_for_invoke(false);
+      Ecf::set_server(true);
+      /* server side */ SNewsCmd news_cmd1(client_handle, server_reply.client_defs()->state_change_no(),  server_reply.client_defs()->modify_change_no(), &mock_server );
+      /* server side */ SSyncCmd cmd1(client_handle, server_reply.client_defs()->state_change_no(),  server_reply.client_defs()->modify_change_no(), &mock_server );
+      Ecf::set_server(false);
+      /* client side */ BOOST_CHECK_MESSAGE( !news_cmd1.get_news(),         test_name << ": Expected no changes to client, we should be in sync");
+      /* client side */ BOOST_CHECK_MESSAGE( !cmd1.do_sync( server_reply ), test_name << ": Expected no changes to client, we should be in sync");
+   }
+   else {
+
+      BOOST_CHECK_MESSAGE( !news_cmd.get_news(), test_name << ": Expected no change");
+      BOOST_CHECK_MESSAGE( !cmd.do_sync( server_reply ), test_name << ": Expected no change");
+      BOOST_CHECK_MESSAGE( !server_reply.in_sync(),      test_name << ": Expected no change");
+      BOOST_CHECK_MESSAGE( !(*server_defs == *server_reply.client_defs()), test_name << ": Server and client defs expected to differ" );
+   }
+}
+
+
+static bool set_server_state_shutdown(defs_ptr defs) {
+   defs->set_server().set_state( SState::SHUTDOWN );
+   return true; // expect changes
+}
+static bool set_server_state_running(defs_ptr defs) {
+   defs->set_server().set_state( SState::RUNNING );
+   return true; // expect changes
+}
+
+static bool change_suites_s3_outside_of_handle(defs_ptr defs)
+{
+   /// Make a state change to suites s3, in the server. This is *not* in the client handle
+   /// Note: we do *NOT* make a state change as this will be propagated to the defs, and hence will be synced
+   /// We *NEED* MockSuiteChangedServer, so that change is propagated to the suite.
+   MockSuiteChangedServer mockServer(defs->findSuite("s3")); // Increment suite state/modify change number
+   defs->findSuite("s3")->suspend();  // small scale state change
+   return false;                    // expect no changes
+}
+
+static bool change_suites_s3_outside_of_handle_add_variable(defs_ptr defs)
+{
+   /// make a state change to suites s3, in the server. This is *not* in the client handle
+   /// We *NEED* MockSuiteChangedServer, so that change is propagated to the suite.
+   MockSuiteChangedServer mockServer(defs->findSuite("s3")); // Increment suite state/modify change number
+   defs->findSuite("s3")->add_variable("Var","value");       // small scale state change
+   return false;                                             // expect no changes in sync
+}
+
+static bool add_task_to_suite_s3(defs_ptr defs)
+{
+   /// make a modify change to suites s3, in the server. This is *not* in the client handle
+   MockSuiteChangedServer mockServer(defs->findSuite("s3")); // Increment suite state/modify change number
+   defs->findSuite("s3")->addTask( Task::create("s3_task")); // small scale change
+   return false;                                             //  expect no changes, since suite s3 not in handle
+}
+
+static bool delete_task_on_suite_s3(defs_ptr defs)
+{
+   /// make a modify change to suites s3, in the server. This is *not* in the client handle
+   MockSuiteChangedServer mockServer(defs->findSuite("s3")); // Increment suite state/modify change number
+   defs->findAbsNode("/s3/f/t")->remove(); // small scale change
+   return false;                           // expect no changes, since suite s3 not in handle
+}
+static bool delete_family_on_suite_s3(defs_ptr defs)
+{
+   /// make a modify change to suites s3, in the server. This is *not* in the client handle
+   MockSuiteChangedServer mockServer(defs->findSuite("s3")); // Increment suite state/modify change number
+   defs->findAbsNode("/s3/f")->remove(); // small scale change
+   return false;                         // expect no changes, since suite s3 not in handle
+}
+
+static bool change_state_of_s4(defs_ptr defs)
+{
+   /// Ok now make state change to s4, which **is** in the handle
+   /// We need MockSuiteChangedServer, so that change is propagated to the suite.
+   MockSuiteChangedServer mockServer(defs->findSuite("s4")); // Increment suite state/modify change number
+   defs->findSuite("s4")->set_state(NState::SUBMITTED);      // small scale change
+   return true;                                             // expect changes
+}
+
+static bool add_variable_to_suite_s4(defs_ptr defs)
+{
+   /// Ok now make state change to s4, which **is** in the handle
+   /// We need MockSuiteChangedServer, so that change is propagated to the suite.
+   MockSuiteChangedServer mockServer(defs->findSuite("s4")); // Increment suite state/modify change number
+   defs->findSuite("s4")->add_variable("Var","value");       // small scale state change
+   return true;                                             // expect changes
+}
+
+static bool add_server_user_variables(defs_ptr defs)
+{
+   // Change server. This is outside of any suites
+   std::vector<Variable> user_variables;
+   user_variables.push_back(Variable("a","b"));
+   user_variables.push_back(Variable("c","d"));
+   defs->set_server().set_user_variables(user_variables);
+   return true; // expect change
+}
+
+static bool add_task_to_suite_s4(defs_ptr defs)
+{
+   /// Ok now make modify change to s4, which **is** in the handle
+   MockSuiteChangedServer mockServer(defs->findSuite("s4")); // Increment suite state/modify change number
+   defs->findSuite("s4")->addTask( Task::create("s4_task")); // small scale change
+   return true;                                             // expect changes
+}
+
+static bool delete_task_on_suite_s4(defs_ptr defs)
+{
+   /// Ok now make modify change to s4, which **is** in the handle
+   MockSuiteChangedServer mockServer(defs->findSuite("s4")); // Increment suite state/modify change number
+   defs->findAbsNode("/s4/f/t")->remove();                   // small scale change
+   return true;                                             // expect changes, since suite s4 is in handle
+}
+
+static bool delete_family_on_suite_s4(defs_ptr defs)
+{
+   /// Ok now make modify change to s4, which **is** in the handle
+   MockSuiteChangedServer mockServer(defs->findSuite("s4")); // Increment suite state/modify change number
+   defs->findAbsNode("/s4/f")->remove();                     // small scale change
+   return true;                                             // expect changes, since suite s4 is in handle
+}
+
+static bool change_order_of_s4_top(defs_ptr defs) {
+   /// Ok make modify change to s4, which **is** in the handle
+   suite_ptr s4 = defs->findSuite("s4");
+   MockSuiteChangedServer mockServer(s4); // Increment suite state/modify change number
+   defs->order(s4.get(),NOrder::TOP) ;    // small scale scale change
+   return true;
+}
+
+static bool change_order_of_s4_bottom(defs_ptr defs) {
+   /// Ok make modify change to s4, which **is** in the handle
+   suite_ptr s4 = defs->findSuite("s4");
+   MockSuiteChangedServer mockServer(s4);   // Increment suite state/modify change number
+   defs->order(s4.get(),NOrder::BOTTOM) ;   // small scale change
+   return true;
+}
+
+static bool delete_suite_s4(defs_ptr defs)
+{
+   /// Ok now make delete s4 which, which **is** in the handle
+   MockSuiteChangedServer mockServer(defs->findSuite("s4")); // Increment suite state/modify change number
+   defs->findSuite("s4")->remove();            // large scale change
+   return true;                                // expect changes
+}
+
+static bool set_defs_state(defs_ptr defs)
+{
+   defs->set_state( NState::ABORTED );         // changes the defs state
+   return true;                               // expect changes
+}
+
+static bool set_defs_state_2(defs_ptr defs)
+{
+   defs->set_state( NState::ABORTED );         // changes the defs state
+   return delete_suite_s4( defs );            // large scale change
+}
+
+static bool add_server_variable(defs_ptr defs) {
+   // Change defs server state. small scale change
+   TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd("/",AlterCmd::ADD_VARIABLE,"_fred_","value")));
+   return true;
+}
+
+static bool change_server_variable(defs_ptr defs) {
+   // Because the scaffold create client/server defs each time.
+   // To test change/delete variables we modify the default set
+   TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd("/",AlterCmd::VARIABLE,"ECF_TRIES","4")));
+   return true;
+}
+
+// ===============================================================================
+// The modifiers, do this for suite s0 which is in a handle
+// ===============================================================================
+static bool s0_delete_some_attributes(defs_ptr defs) {
+
+   /// Ok now make state change to s4, which **is** in the handle
+   /// We need MockSuiteChangedServer, so that change is propagated to the suite.
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   std::vector<Task*> tasks;
+   suite->getAllTasks(tasks);
+   BOOST_REQUIRE_MESSAGE( !tasks.empty(), "Expected at least one task");
+
+   BOOST_FOREACH(Task* task, tasks) {
+      SuiteChanged1 changed(task->suite());
+      task->addMeter(Meter("meter",0,100));
+   }
+   return true;
+}
+
+static bool s0_add_some_attributes(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   std::vector<task_ptr> tasks;
+   suite->get_all_tasks(tasks);
+   BOOST_REQUIRE_MESSAGE( !tasks.empty(), "Expected at least one task");
+
+   BOOST_FOREACH(task_ptr task, tasks) { SuiteChanged1 changed(suite.get()); task->addDay( DayAttr(DayAttr::TUESDAY) );}
+   return true;
+}
+
+static bool s0_begin(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   suite->begin();
+   return true;
+}
+
+static bool s0_add_alias(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   std::vector<task_ptr> tasks;
+   suite->get_all_tasks(tasks);
+   BOOST_REQUIRE_MESSAGE( !tasks.empty(), "Expected at least one task");
+
+   SuiteChanged1 changed(tasks[0]->suite());
+   tasks[0]->add_alias_only();
+   return true;
+}
+
+static bool s0_remove_all_tasks(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+
+   // Remove tasks should force a incremental sync
+   std::vector<task_ptr> tasks;
+   suite->get_all_tasks(tasks);
+   BOOST_REQUIRE_MESSAGE( !tasks.empty(), "Expected at least one task");
+   BOOST_FOREACH(task_ptr task, tasks) { SuiteChanged1 changed(task->suite()); task->remove() ;}
+
+   tasks.clear();
+   suite->get_all_tasks(tasks);
+   BOOST_REQUIRE_MESSAGE( tasks.empty(), "Failed to delete tasks");
+   return true;
+}
+
+static bool s0_remove_a_family(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   std::vector<Family*> vec;
+   suite->getAllFamilies(vec);
+   size_t family_size = vec.size();
+   BOOST_REQUIRE_MESSAGE( !vec.empty(), "Expected at least one family");
+   if (!vec.empty()) {
+      SuiteChanged1 changed(vec[0]->suite());
+      vec[0]->remove();
+   }
+
+   vec.clear();
+   suite->getAllFamilies(vec);
+   BOOST_REQUIRE_MESSAGE( vec.size() < family_size, "Failed to delete family");
+   return true;
+}
+
+
+static bool s0_change_clock_gain(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   suite->changeClockGain("100001");
+   return true;
+}
+
+static bool s0_change_clock_type_to_real(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   suite->changeClockType("hybrid");
+   return true;
+}
+
+static bool s0_change_clock_date(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+
+   suite->changeClockDate("1.1.2001");
+   return true;
+}
+
+static bool s0_change_clock_sync(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+   suite->changeClockSync();
+   return true;
+}
+
+/// This has been split into two functions, as changing both together could mask an error
+/// i.e found bug where we forgot to update state_change number when changing the limit
+/// max value, however because we had, changed value as well it got masked.
+static bool s0_change_limit_max(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   // Note: we ONLY* need MockSuiteChangedServer, when we make changes via functions and not commands
+
+   std::vector<limit_ptr> theLimits =  suite->limits();
+   BOOST_REQUIRE_MESSAGE( !theLimits.empty(),"The limit are empty on suite s0 " << defs);
+   BOOST_FOREACH(limit_ptr l, theLimits) {
+      //std::cout << "found " << l->toString() << "\n";
+      TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd(suite->absNodePath(),AlterCmd::LIMIT_MAX,l->name(),"90")));
+      limit_ptr v = suite->find_limit(l->name());
+      BOOST_CHECK_MESSAGE( v.get() && v->theLimit() == 90, "expected to find limit with max value of 90");
+   }
+   return true;
+}
+
+static bool s0_change_limit_value(defs_ptr defs) {
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   // Note: we ONLY* need MockSuiteChangedServer, when we make changes via functions and not commands
+
+   std::vector<limit_ptr> theLimits =  suite->limits();
+   BOOST_FOREACH(limit_ptr l, theLimits) {
+      TestHelper::invokeRequest(defs.get(),Cmd_ptr( new AlterCmd(suite->absNodePath(),AlterCmd::LIMIT_VAL,l->name(),"33")));
+      limit_ptr v = suite->find_limit(l->name());
+      BOOST_CHECK_MESSAGE( v.get() && v->value() == 33, "expected to find limit with value of 33");
+   }
+   return true;
+}
+
+static bool s0_update_repeat(defs_ptr defs) {
+
+   suite_ptr suite = defs->findSuite("s0");
+   BOOST_REQUIRE_MESSAGE( suite,"Could not find suite");
+   MockSuiteChangedServer mockServer(suite); // Increment suite state/modify change number
+
+
+   SuiteChanged1 changed(suite.get());
+   suite->increment_repeat();
+   return true;
+}
+
+// ===============================================
+
+BOOST_AUTO_TEST_CASE( test_ssync_using_handle  )
+{
+   cout << "Base:: ...test_ssync_using_handle\n";
+
+   // =======================================================================================
+   // Note: where we update Suite::modify_change_no()  we should *EXPECT* a full sync
+   // =======================================================================================
+
+   // test_sync_scaffold will created 5 suites  s0,s1,s2,s3,s4,s5 and add suites s0 & s4 to a handle
+   // The following test will perform changes in/out of handles
+
+   {  // Change defs state in the presence of handles. These should sync regardless of handles
+      // The default server state is HALTED, hence setting to halted will not show a change
+      test_sync_scaffold(set_server_state_shutdown,"set_server_state_shutdown");
+      test_sync_scaffold(set_server_state_running,"set_server_state_running");
+
+      test_sync_scaffold(add_server_variable,"add_server_variable");
+      test_sync_scaffold(change_server_variable,"change_server_variable");
+
+      test_sync_scaffold(set_defs_state,"set_defs_state");
+      test_sync_scaffold(set_defs_state_2,"set_defs_state_2",true /* expect a full sync */);
+   }
+
+   test_sync_scaffold(change_suites_s3_outside_of_handle,"change_suites_s3_outside_of_handle");
+   test_sync_scaffold(change_suites_s3_outside_of_handle_add_variable,"change_suites_s3_outside_of_handle_add_variable");
+   test_sync_scaffold(add_task_to_suite_s3,"add_task_to_suite_s3");
+   test_sync_scaffold(delete_task_on_suite_s3,"delete_task_on_suite_s3");
+   test_sync_scaffold(delete_family_on_suite_s3,"delete_family_on_suite_s3");
+
+   test_sync_scaffold(change_order_of_s4_top,"change_order_of_s4_top");    // change order is an incremental sync
+   test_sync_scaffold(change_order_of_s4_bottom,"change_order_of_s4_bottom"); // change order is an incremental sync
+
+   test_sync_scaffold(change_state_of_s4,"change_state_of_s4");
+   test_sync_scaffold(add_variable_to_suite_s4,"add_variable_to_suite_s4");
+   test_sync_scaffold(add_server_user_variables,"add_server_user_variables");
+   test_sync_scaffold(add_task_to_suite_s4,"add_task_to_suite_s4");
+   test_sync_scaffold(delete_task_on_suite_s4,"delete_task_on_suite_s4");
+   test_sync_scaffold(delete_family_on_suite_s4,"delete_family_on_suite_s4");
+   test_sync_scaffold(delete_suite_s4,"delete_suite_s4", true /* expect a full sync */);
+
+
+   test_sync_scaffold(s0_delete_some_attributes,"s0_delete_some_attributes");
+   test_sync_scaffold(s0_add_some_attributes,"s0_add_some_attributes");
+   test_sync_scaffold(s0_add_alias,"s0_add_alias");
+   test_sync_scaffold(s0_update_repeat,"s0_update_repeat");
+   test_sync_scaffold(s0_change_limit_max,"s0_change_limit_max");
+   test_sync_scaffold(s0_change_limit_value,"s0_change_limit_value");
+   test_sync_scaffold(s0_begin,"s0_begin", true/* expect a full sync */);
+
+   test_sync_scaffold(s0_remove_all_tasks,"s0_remove_all_tasks" );
+   test_sync_scaffold(s0_remove_a_family,"s0_remove_a_family");
+
+   test_sync_scaffold(s0_change_clock_gain,"s0_change_clock_gain", true/* expect a full sync */);
+   test_sync_scaffold(s0_change_clock_type_to_real,"s0_change_clock_type_to_real", true/* expect a full sync */);
+   test_sync_scaffold(s0_change_clock_date,"s0_change_clock_date", true/* expect a full sync */);
+   test_sync_scaffold(s0_change_clock_sync,"s0_change_clock_sync", true/* expect a full sync */);
+
+   /// Keep valgrind happy
+   ChangeMgrSingleton::destroy();
+}
+
+
+
+static defs_ptr create_the_server_defs()
+{
+   defs_ptr defs = create_server_defs();
+   std::vector<suite_ptr> suite_vec =  defs->suiteVec();
+   for(size_t j = 0; j < suite_vec.size(); j++)  {
+      suite_vec[j]->set_state_change_no(j);
+      suite_vec[j]->set_modify_change_no(j);
+   }
+   return defs;
+}
+
+BOOST_AUTO_TEST_CASE( test_ssync_full_sync_using_handle  )
+{
+   /// This test checks that when user has registered with all the suites.
+   /// Syncing should use the global change numbers
+   /// **ADDITIONALLY* the newsCmd  must reflect this.
+   /// This is handled in ClientSuites::create_defs, in that we *MUST* update the
+   /// local change numbers to be the same as the global change numbers
+   /// This is important since the NewsCmd must be in *SYNC* with SYNCCmd
+
+   cout << "Base:: ...test_ssync_full_sync_using_handle\n";
+   // Create the server defs with some changes, in state & modify numbers
+   defs_ptr server_defs = create_the_server_defs();
+
+   // Create Client defs, without any changes
+   ServerReply server_reply;
+   server_reply.set_client_defs( create_client_defs(Defs::create()) );
+
+   // Server & client should be the same, since we ignore change numbers in the comparison
+   Ecf::set_debug_equality(true); // only has affect in DEBUG build
+   BOOST_CHECK_MESSAGE( *server_defs == *server_reply.client_defs(), "Starting point client and server defs should be the same"
+                        << "SERVER\n" << server_defs
+                        << "CLIENT\n" << server_reply.client_defs());
+   Ecf::set_debug_equality(false);
+
+   /// register interest in **ALL** the suites
+   std::vector<std::string> suite_names;
+   suite_names.push_back("s0");
+   suite_names.push_back("s1");
+   suite_names.push_back("s2");
+   suite_names.push_back("s3");
+   suite_names.push_back("s4");
+   TestHelper::invokeRequest(server_defs.get(),Cmd_ptr( new ClientHandleCmd(suite_names,false)),bypass_state_modify_change_check);
+
+   /// make sure handle created.
+   BOOST_CHECK_MESSAGE(server_defs->client_suite_mgr().clientSuites().size() == 1,"Expected 1 Client suites but found " <<server_defs->client_suite_mgr().clientSuites().size());
+   unsigned int client_handle = server_defs->client_suite_mgr().clientSuites().front().handle();
+   BOOST_CHECK_MESSAGE( client_handle == 1,"" );
+
+   // make sure server suites have different state/modify numbers from the client
+   {
+      unsigned int server_state_change_no = 0;
+      unsigned int server_modify_change_no = 0;
+      server_defs->client_suite_mgr().max_change_no(client_handle,server_state_change_no, server_modify_change_no);
+      BOOST_CHECK_MESSAGE(server_state_change_no == 4,"" );
+      BOOST_CHECK_MESSAGE(server_modify_change_no == 4,"" );
+
+      // *MAKE* sure global change numbers are different to handle suite change numbers
+      // This is the key part of this test.
+      // Since syncing should transfer these change numbers to the client
+      Ecf::set_state_change_no(server_state_change_no+10);
+      Ecf::set_modify_change_no(server_modify_change_no+20);
+   }
+
+   // Now sync from server
+   Ecf::set_server(true);
+   MockServer mock_server(server_defs);
+   /* server side */ SNewsCmd news_cmd(client_handle, server_reply.client_defs()->state_change_no(),  server_reply.client_defs()->modify_change_no(), &mock_server );
+   /* server side */ SSyncCmd cmd(client_handle, server_reply.client_defs()->state_change_no(),  server_reply.client_defs()->modify_change_no(), &mock_server );
+   Ecf::set_server(false);
+
+   // make sure SSyncCmd updated the server change numbers, to use global change numbers
+   unsigned int server_state_change_no = 0;
+   unsigned int server_modify_change_no = 0;
+   {
+      server_defs->client_suite_mgr().max_change_no(client_handle,server_state_change_no, server_modify_change_no);
+      BOOST_CHECK_MESSAGE(server_state_change_no == 14,"" );
+      BOOST_CHECK_MESSAGE(server_modify_change_no == 24,"" );
+   }
+
+   // SYNC the client, via do_sync( this should transfer change numbers to the client )
+   BOOST_CHECK_MESSAGE( news_cmd.get_news(), "Expected server to change");
+   BOOST_CHECK_MESSAGE( cmd.do_sync( server_reply ), "Expected server to change");
+   BOOST_CHECK_MESSAGE( server_reply.in_sync(),      "Expected server to change");
+   BOOST_CHECK_MESSAGE( server_defs->state() == server_reply.client_defs()->state(),"Expected server State(" << NState::toString(server_defs->state()) << ") to be same as client state(" << NState::toString(server_reply.client_defs()->state()) << ")");
+
+   // After do_sync client and server change number should be in sync
+   BOOST_CHECK_MESSAGE(server_reply.client_defs()->state_change_no() == server_state_change_no,"Expected " << server_reply.client_defs()->state_change_no() << " state change number but found " << server_state_change_no);
+   BOOST_CHECK_MESSAGE(server_reply.client_defs()->modify_change_no() == server_modify_change_no,"Expected " << server_reply.client_defs()->modify_change_no() << " modify change number but found " << server_modify_change_no);
+
+   // Do final sync, there should not be ANY changes
+   Ecf::set_server(true);
+   /* server side */ SNewsCmd news_cmd1(client_handle, server_reply.client_defs()->state_change_no(),  server_reply.client_defs()->modify_change_no(), &mock_server );
+   /* server side */ SSyncCmd cmd1(client_handle, server_reply.client_defs()->state_change_no(),  server_reply.client_defs()->modify_change_no(), &mock_server );
+   Ecf::set_server(false);
+   /* client side */ BOOST_CHECK_MESSAGE( !news_cmd1.get_news(),         "Expected no changes to client, we should be in sync");
+   /* client side */ BOOST_CHECK_MESSAGE( !cmd1.do_sync( server_reply ), "Expected no changes to client, we should be in sync");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/CMAKE_failed_tests.txt b/ecflow_4_0_7/CMAKE_failed_tests.txt
new file mode 100644
index 0000000..0331220
--- /dev/null
+++ b/ecflow_4_0_7/CMAKE_failed_tests.txt
@@ -0,0 +1,22 @@
+# Creates a file 'FailedTests.log', with all the failed tests
+#
+#    > cmake -P CMAKE_failed_tests.txt
+#
+# To rerun only the failed test
+# 
+#    > ctest -I FailedTests.log
+#
+set(FailedFileName FailedTests.log)
+if(EXISTS "Testing/Temporary/LastTestsFailed.log")
+  file(STRINGS "Testing/Temporary/LastTestsFailed.log" FailedTests)
+  string(REGEX REPLACE "([0-9]+):[^;]*" "\\1" FailedTests "${FailedTests}")
+  list(SORT FailedTests)
+  list(GET FailedTests 0 FirstTest)
+  set(FailedTests "${FirstTest};${FirstTest};;${FailedTests};")
+  string(REPLACE ";" "," FailedTests "${FailedTests}")
+  file(WRITE ${FailedFileName} ${FailedTests})
+else()
+  file(WRITE ${FailedFileName} "")
+endif()
+
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/CMakeLists.txt b/ecflow_4_0_7/CMakeLists.txt
new file mode 100644
index 0000000..b75fb3e
--- /dev/null
+++ b/ecflow_4_0_7/CMakeLists.txt
@@ -0,0 +1,191 @@
+############################################################################################
+# cmake options:
+#
+#       -DCMAKE_BUILD_TYPE=Debug|RelWithDebInfo|Release|Production
+#       -DCMAKE_INSTALL_PREFIX=/path/to/install
+#
+#       -DCMAKE_MODULE_PATH=/path/to/ecbuild/cmake
+#
+#       -DCMAKE_C_COMPILER=gcc
+#       -DCMAKE_C_COMPILER=g++
+#
+#       -DCMAKE_PREFIX_PATH=/path/to/jasper:/path/to/any/package/out/of/place
+#       -DBUILD_SHARED_LIBS=OFF
+# =========================================================================================
+# Usage instructions:
+#
+# cd $WK
+# release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+# major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+# minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+#
+# mkdir ecbuild
+# cd ecbuild
+# mkdir debug
+# mkdir release
+# cd debug
+#
+#/usr/local/apps/cmake/current/bin/cmake ../../  \
+#         -DCMAKE_BUILD_TYPE=Debug \
+#         -DCMAKE_MODULE_PATH=/usr/local/apps/ecbuild/current/share/ecbuild/cmake \
+#         -DPYTHON_LIBRARY=/usr/local/apps/python/current/lib/libpython2.7.a \
+#         -DPYTHON_INCLUDE_DIR=/usr/local/apps/python/current/include/python2.7 \
+#         -DPYTHON_EXECUTABLE=/usr/local/apps/python/current/bin/python2.7 \
+#         -DCMAKE_INSTALL_PREFIX=/usr/local/apps/ecflow/$release.$major.$minor
+#
+#         -DCMAKE_INSTALL_PREFIX=/var/tmp/ma0/cmake/ecflow/4.0.1
+#
+#############################################################
+
+cmake_minimum_required( VERSION 2.8.4 FATAL_ERROR )
+
+project( ecflow CXX )
+
+set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../ecbuild/cmake")
+# message( STATUS "CMAKE_MODULE_PATH    : ${CMAKE_MODULE_PATH}")
+
+include( ecbuild_system )
+
+ecbuild_requires_macro_version( 1.3 )
+
+###############################################################################
+# local project
+
+ecbuild_declare_project()
+
+# =========================================================================================
+# VERSION  
+# Get the ecflow version specified in 'VERSION.cmake'. This is only accessible after ecbuild_declare_project()
+# The ecflow version config is done in ACore directory
+# =========================================================================================
+
+message( STATUS "CMAKE_INSTALL_PREFIX : ${CMAKE_INSTALL_PREFIX}" )
+message( STATUS "ECFLOW_RELEASE       : ${ECFLOW_RELEASE}" )
+message( STATUS "ECFLOW_MAJOR         : ${ECFLOW_MAJOR}" )
+message( STATUS "ECFLOW_MINOR         : ${ECFLOW_MINOR}" )
+message( STATUS "ECFLOW_VERSION       : ${ECFLOW_VERSION_STR}" )
+
+# =========================================================================================
+# Python  
+# =========================================================================================
+# some variables of this project
+
+option( ENABLE_PYTHON         "enable python interface"   ON  )
+
+if(ENABLE_PYTHON)
+   ecbuild_find_python( VERSION 2.7 REQUIRED )
+   debug_var(PYTHON_LIBRARIES)
+   debug_var(PYTHON_INCLUDE_DIR)
+else() 
+   ecbuild_find_python( VERSION 2.7 )
+endif()
+
+# =========================================================================================
+# Boost
+# Jira ISSUE:   ECBUILD-40 ecbuild 1.3.2 ignores -DBOOST_ROOT
+#     setting  -DBOOST_ROOT=/var/tmp/ma0/boost/boost_1_53_0
+#     Does not appear to be honored. ?
+#     It always seem to use boost in /usr/local/apps
+# =========================================================================================
+
+ecbuild_add_extra_search_paths( boost ) # also respects BOOST_ROOT
+
+# Ecflow test require statics libs, otherwise get double free, error.
+# To use static boost python ensure that Boost_USE_STATIC_LIBS is set on.
+# See: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html
+set(Boost_USE_STATIC_LIBS        ON)
+set(Boost_USE_MULTITHREADED      ON)
+set(Boost_NO_SYSTEM_PATHS        ON)
+set(Boost_DETAILED_FAILURE_MSG   ON)
+set(Boost_DEBUG                  ON)
+
+find_package( Boost 1.53.0 REQUIRED COMPONENTS python serialization system thread unit_test_framework test_exec_monitor filesystem program_options date_time )
+#
+# Available boost lib should be referenced as:
+#
+#    ${Boost_SYSTEM_LIBRARY}
+#    ${Boost_SERIALIZATION_LIBRARY}
+#    ${Boost_THREAD_LIBRARY}
+#    ${Boost_FILESYSTEM_LIBRARY}
+#    ${Boost_PROGRAM_OPTIONS_LIBRARY}
+#    ${Boost_DATE_TIME_LIBRARY}
+#
+#    ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} 
+#    ${Boost_TEST_EXEC_MONITOR_LIBRARY} 
+
+message( STATUS "Boost_LIBRARIES     : ${Boost_LIBRARIES}" )
+
+
+# =========================================================================================
+# debug
+# =========================================================================================
+if( CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]" )
+
+	message( STATUS "INFO: DEBUG BUILD" )
+
+    # for debug type builds, turn on verbose makefiles
+    # set(CMAKE_VERBOSE_MAKEFILE ON)
+
+    # Tell other CMake files that we're doing a debug build
+	# set( DEBUG_BUILD 1 ) -- not used anymore
+
+    # Tell C/C++ that we're doing a debug build
+    add_definitions( -DDEBUG )
+
+endif()
+
+
+# =========================================================================================
+# build source code
+# =========================================================================================
+
+add_subdirectory( ACore )
+add_subdirectory( ANattr )
+add_subdirectory( ANode )
+add_subdirectory( AParser )
+add_subdirectory( Base )
+add_subdirectory( Client )
+add_subdirectory( CSim )
+add_subdirectory( Server )
+add_subdirectory( Test )
+add_subdirectory( Pyext )
+add_subdirectory( view )
+
+# Directories not need in the distribution tar ball!
+ecbuild_add_resources( TARGET build_nightly DONT_PACK_DIRS build/nightly)
+ecbuild_add_resources( TARGET SCRATCH DONT_PACK_DIRS SCRATCH)
+ecbuild_add_resources( TARGET Doc DONT_PACK_DIRS Doc/func_spec Doc/misc Doc/New_viewer Doc/newsletter Doc/online Doc/presentations Doc/tac)
+
+# =========================================================================================
+# install 
+# =========================================================================================
+# install scripts
+install( FILES
+            ${CMAKE_SOURCE_DIR}/tools/ecflow_logsvr.pl
+            ${CMAKE_SOURCE_DIR}/tools/ecflow_logsvr.sh
+            ${CMAKE_SOURCE_DIR}/tools/ecflow_start.sh
+            ${CMAKE_SOURCE_DIR}/tools/ecflow_stop.sh
+            ${CMAKE_SOURCE_DIR}/tools/noconnect.sh
+            ${CMAKE_SOURCE_DIR}/Pyext/migrate/ecflow_migrate.py
+         DESTINATION bin
+         PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE
+        )
+
+# install documentation         
+install( FILES
+            ${CMAKE_SOURCE_DIR}/Doc/user-manual/client_options.docx  
+            ${CMAKE_SOURCE_DIR}/Doc/user-manual/user_manual.docx    
+            ${CMAKE_SOURCE_DIR}/Doc/user-manual/user_manual.pdf    
+         DESTINATION doc/ecflow
+         PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE
+        )
+        
+# =========================================================================================
+# final
+# =========================================================================================
+
+# prepares a tar.gz of your sources and/or binaries
+ecbuild_install_project( NAME ecFlow )
+
+# print the summary of the configuration
+ecbuild_print_summary()
diff --git a/ecflow_4_0_7/COPYING b/ecflow_4_0_7/COPYING
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/ecflow_4_0_7/COPYING
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/ecflow_4_0_7/CSim/CMakeLists.txt b/ecflow_4_0_7/CSim/CMakeLists.txt
new file mode 100644
index 0000000..d5ad142
--- /dev/null
+++ b/ecflow_4_0_7/CSim/CMakeLists.txt
@@ -0,0 +1,50 @@
+list( APPEND srcs
+   src/Analyser.cpp
+   src/AstAnalyserVisitor.cpp
+   src/DefsAnalyserVisitor.cpp
+   src/FlatAnalyserVisitor.cpp
+   src/Simulator.cpp
+   src/SimulatorVisitor.cpp
+)
+ecbuild_add_library( TARGET libsimu
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     LIBS     libparser node nodeattr core    
+                     INCLUDES src
+                              ../ACore/src 
+                              ../ANattr/src
+                              ../ANode/src
+                              ../AParser/src
+                              ../Base/src
+                    )
+
+
+list( APPEND test_srcs
+   test/TestMeter.cpp
+   test/TestTime.cpp
+   test/TestUtil.cpp
+   test/TestSimulator.cpp
+   test/TestAutoCancel.cpp
+   test/TestRepeat.cpp
+   test/TestToday.cpp
+   test/TestAnalysis.cpp
+)
+ecbuild_add_test( TARGET   c_csim
+                  BOOST
+                  SOURCES  ${test_srcs}
+                  LIBS     libsimu        
+                           pthread 
+                  INCLUDES ../ANode/test
+                  TEST_DEPENDS u_base
+                 )
+
+ecbuild_add_test( TARGET    c_csim_single
+                  BOOST
+                  SOURCES   test/TestSingleSimulator.cpp test/TestUtil.cpp
+                  LIBS      libsimu   
+                            pthread 
+                  INCLUDES  ../ANode/test
+                  TEST_DEPENDS u_base
+                 )
+                   
\ No newline at end of file
diff --git a/ecflow_4_0_7/CSim/jamfile.jam b/ecflow_4_0_7/CSim/jamfile.jam
new file mode 100644
index 0000000..4418317
--- /dev/null
+++ b/ecflow_4_0_7/CSim/jamfile.jam
@@ -0,0 +1,95 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Simulator. Standalone exe that can:
+#            1/ Check structure of the definition file
+#            2/ Simulate the definition
+#               allow checking for dead locks, etc
+project theSimulator ;
+
+#
+# IMPORTANT: Simulator *MUST* not link with server or any of its source code
+#
+use-project theCore     : ../ACore ;
+use-project theNodeAttr : ../ANattr ;
+use-project theNode     : ../ANode ;
+use-project theParser   : ../AParser ;
+use-project theBase     : ../Base ;
+
+lib pthread ;
+
+#
+# Split into library, so that testing can use library, and hence same compiler option
+#
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+#
+lib libsimu : [ glob src/*.cpp ]
+              : <include>../ACore/src
+                <include>../ANattr/src 
+                <include>../ANode/src 
+                <include>../AParser/src 
+                <include>../Base/src 
+                <variant>debug:<define>DEBUG
+                <link>static
+                <use>/theCore//core
+                <use>/theNodeAttr//nodeattr
+                <use>/theNode//node
+                <use>/theBase//base
+                <use>/theParser//libparser
+            	<use>/site-config//boost_system
+             	<use>/site-config//boost_serialization
+             	<use>/site-config//boost_filesystem
+             	<use>/site-config//boost_program_options
+             	<use>/site-config//boost_datetime
+       	      :
+              : <include>../CSim/src         
+              ;
+            
+
+#
+# Test for simulator
+# IMPORTANT: server *MUST* not link with client or include any of the client code
+#
+exe c_csim : [ glob test/*.cpp : test/TestSingleSimulator.cpp ]
+ 	         pthread
+             /theCore//core
+             /theNodeAttr//nodeattr
+             /theNode//node
+             /theParser//libparser
+             /theBase//base
+             libsimu
+             /site-config//boost_system
+             /site-config//boost_serialization
+             /site-config//boost_filesystem
+             /site-config//boost_datetime
+             /site-config//boost_program_options
+             /site-config//boost_test
+           : <variant>debug:<define>DEBUG
+           ;
+           
+#
+# Test for single simulator. Use for developing the tests
+# IMPORTANT: server *MUST* not link with client or include any of the client code
+#
+exe c_csim_single : [ glob test/TestSingleSimulator.cpp test/TestUtil.cpp ]
+ 	         pthread
+             /theCore//core
+             /theNodeAttr//nodeattr
+             /theNode//node
+             /theParser//libparser
+             /theBase//base
+             libsimu
+             /site-config//boost_system
+             /site-config//boost_serialization
+             /site-config//boost_filesystem
+             /site-config//boost_datetime
+             /site-config//boost_program_options
+             /site-config//boost_test
+           : <variant>debug:<define>DEBUG
+           ;
diff --git a/ecflow_4_0_7/CSim/src/Analyser.cpp b/ecflow_4_0_7/CSim/src/Analyser.cpp
new file mode 100644
index 0000000..6f8febf
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/Analyser.cpp
@@ -0,0 +1,57 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "Analyser.hpp"
+#include "DefsAnalyserVisitor.hpp"
+#include "FlatAnalyserVisitor.hpp"
+#include "Defs.hpp"
+#include "File.hpp"
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+namespace ecf {
+
+Analyser::Analyser() {}
+
+void Analyser::run(Defs& theDefs)
+{
+	// Run flat analysis
+	{
+		FlatAnalyserVisitor visitor;
+		theDefs.acceptVisitTraversor(visitor);
+
+		std::string fileName = "defs.flat";
+
+		std::ofstream file(fileName.c_str());
+		file <<  visitor.report();
+	}
+
+	// run depth first analysis
+	{
+		DefsAnalyserVisitor visitor;
+		theDefs.acceptVisitTraversor(visitor);
+
+		std::string fileName = "defs.depth";
+
+		std::ofstream file(fileName.c_str(),ios::out);
+		file <<  visitor.report();
+		file.close();
+	}
+}
+
+}
+
diff --git a/ecflow_4_0_7/CSim/src/Analyser.hpp b/ecflow_4_0_7/CSim/src/Analyser.hpp
new file mode 100644
index 0000000..c223180
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/Analyser.hpp
@@ -0,0 +1,31 @@
+#ifndef ANALYSER_HPP_
+#define ANALYSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+class Defs;
+
+namespace ecf {
+
+class Analyser  {
+public:
+	Analyser();
+
+	static void run(Defs& theDefs);
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/CSim/src/AstAnalyserVisitor.cpp b/ecflow_4_0_7/CSim/src/AstAnalyserVisitor.cpp
new file mode 100644
index 0000000..c56f592
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/AstAnalyserVisitor.cpp
@@ -0,0 +1,58 @@
+ //============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "AstAnalyserVisitor.hpp"
+#include "ExprAst.hpp"
+#include "Defs.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+AstAnalyserVisitor::AstAnalyserVisitor()  {}
+AstAnalyserVisitor::~AstAnalyserVisitor() {}
+
+void AstAnalyserVisitor::visitTop(AstTop*) {}
+void AstAnalyserVisitor::visitRoot(AstRoot*) {}
+void AstAnalyserVisitor::visitAnd(AstAnd*) {}
+void AstAnalyserVisitor::visitNot(AstNot*) {}
+void AstAnalyserVisitor::visitPlus(AstPlus*) {}
+void AstAnalyserVisitor::visitMinus(AstMinus*) {}
+void AstAnalyserVisitor::visitDivide(AstDivide*) {}
+void AstAnalyserVisitor::visitMultiply(AstMultiply*) {}
+void AstAnalyserVisitor::visitModulo(AstModulo*) {}
+void AstAnalyserVisitor::visitOr(AstOr*) {}
+void AstAnalyserVisitor::visitEqual(AstEqual*) {}
+void AstAnalyserVisitor::visitNotEqual(AstNotEqual*) {}
+void AstAnalyserVisitor::visitLessEqual(AstLessEqual*) {}
+void AstAnalyserVisitor::visitGreaterEqual(AstGreaterEqual*) {}
+void AstAnalyserVisitor::visitGreaterThan(AstGreaterThan*) {}
+void AstAnalyserVisitor::visitLessThan(AstLessThan*) {}
+void AstAnalyserVisitor::visitLeaf(AstLeaf*) {}
+void AstAnalyserVisitor::visitInteger(AstInteger*) {}
+void AstAnalyserVisitor::visitString(AstString*) {}
+void AstAnalyserVisitor::visitNodeState(AstNodeState*) {}
+void AstAnalyserVisitor::visitEventState(AstEventState*) {}
+
+void AstAnalyserVisitor::visitNode(AstNode* astNode)
+{
+	Node* refNode = astNode->referencedNode();
+ 	if ( refNode )  dependentNodes_.insert( refNode);
+ 	else            dependentNodePaths_.insert(astNode->nodePath());
+}
+
+void AstAnalyserVisitor::visitVariable(AstVariable* astVar){}
+
+}
diff --git a/ecflow_4_0_7/CSim/src/AstAnalyserVisitor.hpp b/ecflow_4_0_7/CSim/src/AstAnalyserVisitor.hpp
new file mode 100644
index 0000000..216f52f
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/AstAnalyserVisitor.hpp
@@ -0,0 +1,64 @@
+#ifndef ASTANALYSERVISITOR_HPP_
+#define ASTANALYSERVISITOR_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "ExprAstVisitor.hpp"
+#include <iostream>
+#include <sstream>
+#include <set>
+class Node;
+
+namespace ecf {
+
+class AstAnalyserVisitor : public ExprAstVisitor {
+public:
+	AstAnalyserVisitor();
+	virtual ~AstAnalyserVisitor();
+
+	const std::set<Node*>& dependentNodes() const { return dependentNodes_;}
+	const std::set<std::string>& dependentNodePaths() const { return dependentNodePaths_;}
+
+  	virtual void visitTop(AstTop*);
+ 	virtual void visitRoot(AstRoot*);
+ 	virtual void visitAnd(AstAnd*);
+ 	virtual void visitNot(AstNot*);
+ 	virtual void visitPlus(AstPlus*);
+ 	virtual void visitMinus(AstMinus*);
+ 	virtual void visitDivide(AstDivide*);
+   virtual void visitMultiply(AstMultiply*);
+   virtual void visitModulo(AstModulo*);
+ 	virtual void visitOr(AstOr*);
+ 	virtual void visitEqual(AstEqual*);
+ 	virtual void visitNotEqual(AstNotEqual*);
+ 	virtual void visitLessEqual(AstLessEqual*);
+ 	virtual void visitGreaterEqual(AstGreaterEqual*);
+ 	virtual void visitGreaterThan(AstGreaterThan*);
+ 	virtual void visitLessThan(AstLessThan*);
+ 	virtual void visitLeaf(AstLeaf*);
+ 	virtual void visitInteger(AstInteger*);
+ 	virtual void visitString(AstString*);
+ 	virtual void visitNodeState(AstNodeState*);
+ 	virtual void visitEventState(AstEventState*);
+ 	virtual void visitNode(AstNode*);
+  	virtual void visitVariable(AstVariable*);
+
+private:
+	std::set<Node*> dependentNodes_;
+	std::set<std::string> dependentNodePaths_;
+};
+}
+#endif
diff --git a/ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.cpp b/ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.cpp
new file mode 100644
index 0000000..dcd5d3b
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.cpp
@@ -0,0 +1,167 @@
+ //============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "DefsAnalyserVisitor.hpp"
+#include "AstAnalyserVisitor.hpp"
+#include "ExprAst.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Indentor.hpp"
+#include "Str.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+///////////////////////////////////////////////////////////////////////////////
+DefsAnalyserVisitor::DefsAnalyserVisitor() {}
+
+void DefsAnalyserVisitor::visitDefs( Defs* d) {
+	BOOST_FOREACH(suite_ptr s, d->suiteVec()) { s->acceptVisitTraversor(*this); }
+}
+
+void DefsAnalyserVisitor::visitSuite( Suite* s)   { visitNodeContainer(s);}
+void DefsAnalyserVisitor::visitFamily( Family* f) { visitNodeContainer(f);}
+
+void DefsAnalyserVisitor::visitNodeContainer(NodeContainer* nc)
+{
+ 	std::set<Node*> dependentNodes;
+	analyse(nc,dependentNodes);
+
+	BOOST_FOREACH(node_ptr t, nc->nodeVec())       { t->acceptVisitTraversor(*this);}
+}
+
+void DefsAnalyserVisitor::visitTask( Task* t)
+{
+ 	std::set<Node*> dependentNodes;
+	analyse(t,dependentNodes);
+}
+
+void DefsAnalyserVisitor::analyse(Node* node,std::set<Node*>& dependentNodes, bool dependent)
+{
+	// ***************************************************************
+	// Do a depth first search to find the root cause of the blockage
+	// ***************************************************************
+//#ifdef DEBUG
+//	if (dependent)  {
+//		ss_ << "DefsAnalyserVisitor::analyse " << node->debugType() << Str::COLON() << node->absNodePath();
+//		ss_ << " state(" << NState::toString(node->state()) << ")\n";
+//	}
+//#endif
+	if (analysedNodes_.find(node) != analysedNodes_.end()) return;
+	analysedNodes_.insert( node );
+	if (node->state() == NState::COMPLETE ) return;
+
+	if (node->state() == NState::QUEUED) {
+		std::vector<std::string> theReasonWhy;
+		node->why(theReasonWhy);
+		for(size_t i = 0; i < theReasonWhy.size(); ++i) {
+			Indentor::indent(ss_) << "Reason: " << theReasonWhy[i] << "\n";
+		}
+	}
+
+
+ 	/// Note a complete expression that does not evaluate, does *NOT* hold the node
+ 	/// It merly sets node to complete.
+ 	if ( node->completeAst() && !node->evaluateComplete()) {
+ 		// Follow nodes referenced in the complete expressions
+ 		analyseExpressions(node,dependentNodes,false,dependent);
+
+ 		// follow child nodes
+  		NodeContainer* nc =  dynamic_cast<NodeContainer*>(node);
+ 		if (nc) {
+ 			  BOOST_FOREACH(node_ptr t, nc->nodeVec())       { t->acceptVisitTraversor(*this);}
+ 		}
+	}
+
+
+  	if ( node->triggerAst() && !node->evaluateTrigger()  ) {
+ 		// Follow nodes referenced in the trigger expressions
+ 		analyseExpressions(node,dependentNodes,true,dependent);
+
+		// follow child nodes
+ 		NodeContainer* nc =  dynamic_cast<NodeContainer*>(node);
+ 		if (nc) {
+ 			BOOST_FOREACH(node_ptr t, nc->nodeVec())       { t->acceptVisitTraversor(*this);}
+  		}
+  	}
+}
+
+void DefsAnalyserVisitor::analyseExpressions(Node* node,std::set<Node*>& dependentNodes, bool trigger, bool dependent)
+{
+ 	Indentor in; Indentor::indent(ss_);
+	if ( dependent ) ss_ << "DEPENDENT ";
+	if (trigger) {
+		ss_ << node->debugNodePath() << " holding on trigger expression '" << node->triggerExpression() << "'\n";
+	}
+	else {
+		ss_ << node->debugNodePath() << " holding on complete expression '" << node->completeExpression() << "'\n";
+	}
+
+
+	AstAnalyserVisitor astVisitor;
+	if ( trigger ) {
+		node->triggerAst()->accept(astVisitor);
+		ss_ << *node->triggerAst();
+	}
+ 	else  {
+ 		node->completeAst()->accept(astVisitor);
+ 		ss_ << *node->completeAst();
+ 	}
+
+	// Warn about NULL node references in the trigger expressions
+	BOOST_FOREACH(const string& nodePath, astVisitor.dependentNodePaths()) {
+		Indentor in; Indentor::indent(ss_) << "'" << nodePath << "' is not defined in the expression\n";
+	}
+
+	// **** NOTE: Currently for COMPLETE expression will only follow trigger expressions
+	BOOST_FOREACH(Node* triggerNode, astVisitor.dependentNodes()) {
+
+
+		Indentor in; Indentor::indent(ss_) << "EXPRESSION NODE " << triggerNode->debugNodePath();
+		ss_ << " state(" << NState::toString(triggerNode->state()) << ")";
+		if (triggerNode->triggerAst()) ss_ << " trigger(evaluation = " << triggerNode->evaluateTrigger() << "))";
+		if (analysedNodes_.find(triggerNode) != analysedNodes_.end()) ss_ << " analysed ";
+		if (dependentNodes.find(triggerNode) != dependentNodes.end()) ss_ << " ** ";
+		ss_ << "\n";
+
+		if ( dependentNodes.find(triggerNode) != dependentNodes.end()) {
+ 			// possible deadlock make sure
+			if (triggerNode->triggerAst()) {
+ 				AstAnalyserVisitor visitor;
+				triggerNode->triggerAst()->accept(visitor);
+
+//				cerr << "Node = " << node->absNodePath() << "\n";
+//				cerr << "triggerNode = " << triggerNode->absNodePath() << "\n";
+//				BOOST_FOREACH(Node* n,visitor.dependentNodes() ) {
+//					cerr << "triggerNode Node dependents = " << n->absNodePath() << "\n";
+//				}
+
+				if (visitor.dependentNodes().find(node) !=  visitor.dependentNodes().end()) {
+					Indentor in;  Indentor::indent(ss_) << "Deadlock detected between:\n";
+					Indentor in2; Indentor::indent(ss_) << node->debugNodePath() << "\n";
+	 			                  Indentor::indent(ss_) << triggerNode->debugNodePath() << "\n";
+				}
+			}
+	 		continue;
+		}
+		dependentNodes.insert( triggerNode );
+		analyse(triggerNode,dependentNodes,true);
+	}
+}
+
+}
diff --git a/ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.hpp b/ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.hpp
new file mode 100644
index 0000000..bf9b33e
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/DefsAnalyserVisitor.hpp
@@ -0,0 +1,47 @@
+#ifndef DEFSANALYSERVISITOR_HPP_
+#define DEFSANALYSERVISITOR_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "NodeTreeVisitor.hpp"
+#include <sstream>
+#include <set>
+#include <vector>
+class Node;
+
+namespace ecf {
+
+class DefsAnalyserVisitor : public NodeTreeVisitor {
+public:
+	DefsAnalyserVisitor();
+	std::string report() const { return ss_.str();}
+
+	virtual bool traverseObjectStructureViaVisitors() const { return true;}
+	virtual void visitDefs(Defs*);
+	virtual void visitSuite(Suite*);
+	virtual void visitFamily(Family*);
+	virtual void visitNodeContainer(NodeContainer*);
+	virtual void visitTask(Task*);
+
+private:
+	void analyse(Node* n,std::set<Node*>& dependentNodes, bool dependent =  false);
+	void analyseExpressions(Node* node,std::set<Node*>& dependentNodes, bool trigger, bool dependent);
+
+  	std::stringstream ss_;
+  	std::set<Node*> analysedNodes_;  // The node we  analysed
+};
+}
+#endif
diff --git a/ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.cpp b/ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.cpp
new file mode 100644
index 0000000..f89391e
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.cpp
@@ -0,0 +1,111 @@
+ //============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "FlatAnalyserVisitor.hpp"
+#include "AstAnalyserVisitor.hpp"
+#include "ExprAst.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Indentor.hpp"
+#include "Str.hpp"
+
+using namespace std;
+
+namespace ecf {
+
+///////////////////////////////////////////////////////////////////////////////
+FlatAnalyserVisitor::FlatAnalyserVisitor() {}
+
+void FlatAnalyserVisitor::visitDefs( Defs* d) {
+	BOOST_FOREACH(suite_ptr s, d->suiteVec()) { s->acceptVisitTraversor(*this); }
+}
+
+void FlatAnalyserVisitor::visitSuite( Suite* s)   { visitNodeContainer(s);}
+void FlatAnalyserVisitor::visitFamily( Family* f) { visitNodeContainer(f);}
+
+void FlatAnalyserVisitor::visitNodeContainer(NodeContainer* nc)
+{
+	if (nc->state() == NState::COMPLETE )  return;
+
+ 	Indentor in;
+ 	bool traverseChildren = analyse(nc);
+
+ 	// Dont bother traversing children if parent is holding on trigger/complete expression
+ 	if (traverseChildren) {
+ 		BOOST_FOREACH(node_ptr t, nc->nodeVec())       { t->acceptVisitTraversor(*this);}
+ 	}
+}
+
+void FlatAnalyserVisitor::visitTask( Task* t)
+{
+ 	Indentor in;
+ 	analyse(t);
+}
+
+bool FlatAnalyserVisitor::analyse(Node* node)
+{
+	bool traverseChildren = true;
+
+	Indentor::indent(ss_) << node->debugType() << Str::COLON() << node->name() << " state(" << NState::toString(node->state()) << ")";
+	if (node->state() != NState::COMPLETE ) {
+
+		if (node->repeat().isInfinite()) {
+			ss_ << " may **NEVER** complete due to " << node->repeat().toString();
+		}
+		ss_ << "\n";
+
+		if (node->state() == NState::QUEUED) {
+			std::vector<std::string> theReasonWhy;
+			node->why(theReasonWhy);
+ 			for(size_t i = 0; i < theReasonWhy.size(); ++i) {
+ 				Indentor::indent(ss_) << "Reason: " << theReasonWhy[i] << "\n";
+ 			}
+ 		}
+
+	   /// Note a complete expression that does not evaluate, does *NOT* hold the node
+	   /// It merly sets node to complete.
+		if ( node->completeAst() && !node->evaluateComplete()) {
+			Indentor::indent(ss_) << "holding on complete expression '" << node->completeExpression() << "'\n";
+
+			AstAnalyserVisitor astVisitor;
+	 		node->completeAst()->accept(astVisitor);
+	 		BOOST_FOREACH(const string& nodePath, astVisitor.dependentNodePaths()) {
+	 			Indentor in; Indentor::indent(ss_) << "'" << nodePath << "' is not defined in the expression\n";
+	 		}
+	 		ss_ << *node->completeAst();
+
+			traverseChildren = false;
+		}
+
+		if ( node->triggerAst() && !node->evaluateTrigger() ) {
+			Indentor::indent(ss_) << "holding on trigger expression '" << node->triggerExpression() << "'\n";
+
+			AstAnalyserVisitor astVisitor;
+			node->triggerAst()->accept(astVisitor);
+	 		BOOST_FOREACH(const string& nodePath, astVisitor.dependentNodePaths()) {
+	 			Indentor in; Indentor::indent(ss_) << "'" << nodePath << "' is not defined in the expression\n";
+	 		}
+			ss_ << *node->triggerAst();
+
+			traverseChildren = false;
+		}
+	}
+  	ss_ << "\n";
+  	return traverseChildren;
+}
+
+}
diff --git a/ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.hpp b/ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.hpp
new file mode 100644
index 0000000..3f4daf1
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/FlatAnalyserVisitor.hpp
@@ -0,0 +1,43 @@
+#ifndef FLATANALYSERVISITOR_HPP_
+#define FLATANALYSERVISITOR_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "NodeTreeVisitor.hpp"
+#include <sstream>
+class Node;
+
+namespace ecf {
+
+class FlatAnalyserVisitor : public NodeTreeVisitor {
+public:
+	FlatAnalyserVisitor();
+	std::string report() const { return ss_.str();}
+
+	virtual bool traverseObjectStructureViaVisitors() const { return true;}
+	virtual void visitDefs(Defs*);
+	virtual void visitSuite(Suite*);
+	virtual void visitFamily(Family*);
+	virtual void visitNodeContainer(NodeContainer*);
+	virtual void visitTask(Task*);
+
+private:
+	bool analyse(Node* n);
+  	std::stringstream ss_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/CSim/src/Simulator.cpp b/ecflow_4_0_7/CSim/src/Simulator.cpp
new file mode 100644
index 0000000..30ca4bf
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/Simulator.cpp
@@ -0,0 +1,360 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib
+
+#include "Simulator.hpp"
+#include "Analyser.hpp"
+#include "SimulatorVisitor.hpp"
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Log.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "CalendarUpdateParams.hpp"
+#include "CmdContext.hpp"
+
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+//#define DEBUG_LONG_RUNNING_SUITES 1
+
+namespace ecf {
+
+/// Class that allows multiple log files.
+class LogDestroyer {
+public:
+	LogDestroyer() {}
+	~LogDestroyer() { Log::destroy(); }
+};
+
+Simulator::Simulator(const boost::posix_time::time_duration& period)
+: max_simulation_period_(period),
+  truncateLongRepeatsTo_(0),
+  level_(0),
+  foundCrons_(false)
+{
+#ifdef DEBUG_LONG_RUNNING_SUITES
+	std::cout << "Simulator::Simulator max_simulation_period_ " << to_simple_string(max_simulation_period_) << endl;
+#endif
+}
+
+bool Simulator::run(Defs& theDefs, const std::string& defs_filename,  std::string& errorMsg, bool do_checks) const
+{
+   CmdContext cmd_context;
+
+#ifdef DEBUG_LONG_RUNNING_SUITES
+	std::cout << "Simulator::run " << defs_filename << endl;
+#endif
+	// ****:NOTE:******
+	// ** This simulator relies on the defs checking to set event and meter usedInTrigger()
+	// ** to speed up simulator. However this is done in AstResolveVisitor.
+	// ** Which is called during checking:
+	// ** By default checking in done when reading a defs file from disk:
+	// ** However many test create Defs on the fly. These may not do_checks.
+	// ** Hence we do it here, since it is simulator specific.
+	if (do_checks) {
+	   std::string warningMsg;
+	   if (!theDefs.check(errorMsg,warningMsg)) {
+	      return false;
+	   }
+	}
+
+
+	// Allow new log to be created each time, by destroying the old log.
+	LogDestroyer destroyLog;
+
+ 	// Initialise the Log file, and destroy when done. This
+	// allows new log file to be created named after the definition file
+	std::string logFileName = defs_filename + ".log";
+	fs::remove(logFileName);
+ 	Log::create(logFileName);
+ 	//cout << "defs_filename " << defs_filename << "\n";
+	//cout << "***** after Log::create(logFileName)\n";
+
+	// Do the following:
+	// o call begin() for each suite
+	// o determine calendar increment. If no time dependencies use an hour increment
+	// o determine max simulation period. ie looks at size of repeats
+	// o If multiple suites and some suites have no tasks, mark them as complete, these may have server limits
+	// o If no tasks at all, no point in simulating
+ 	// **** Need a better mechanism of handling long repeats, the old way of changing repeat
+ 	// **** attributes is not acceptable.(i.e user could save in python after simulation
+ 	// **** and there defs would be corrupted
+	SimulatorVisitor simiVisitor(truncateLongRepeatsTo_ /* NOT USED */);
+	theDefs.acceptVisitTraversor(simiVisitor);
+	foundCrons_ = simiVisitor.foundCrons();
+
+	if (!simiVisitor.foundTasks()) {
+		errorMsg += "The defs file ";
+		errorMsg += defs_filename;
+		errorMsg +=  " has no tasks, can not simulate\n";
+ 		return false;
+	}
+
+	// Let visitor determine calendar increment. i.e if no time dependencies we will use 1 hour increment
+	// Default max_simulation_period_ is 1 year, however some operation suites run for many years
+	// Analyse the repeats to determine max simulation period
+ 	time_duration calendarIncrement =  simiVisitor.calendarIncrement();
+ 	boost::posix_time::time_duration max_simulation_period = simiVisitor.maxSimulationPeriod();
+ 	if ( max_simulation_period > max_simulation_period_) max_simulation_period_ = max_simulation_period;
+
+#ifdef DEBUG_LONG_RUNNING_SUITES
+ 	cout << defs_filename << " time dependency = " <<  simiVisitor.hasTimeDependencies()
+		<< " max_simulation_period_=" << to_simple_string(max_simulation_period_)
+		<< " calendarIncrement=" << to_simple_string(calendarIncrement)
+ 	    << endl;
+#endif
+
+ 	CalendarUpdateParams calUpdateParams( calendarIncrement );
+
+	// Start simulation ...
+	boost::posix_time::time_duration duration(0,0,0,0);
+ 	while (1) {
+
+// 		cout << "duration = " << to_simple_string(duration) << endl;
+
+ 		// Resolve dependencies and submit jobs
+ 		if (!doJobSubmission(theDefs,errorMsg)) return false;
+
+ 		// Determine termination criteria. If all suite complete, exit,
+ 		// Let simulation termination take autocancel into account. i.e we extend simulation even though
+ 		// suite may have completed, to allow autocancel to take effect.
+ 		// Hence if a suite has complete, but has autocancel we continue simulation
+ 		// Note: should also handle case of autocancel which remove all suites
+		size_t completeSuiteCnt = 0;
+		int hasAutoCancel = 0;
+		BOOST_FOREACH(suite_ptr s, theDefs.suiteVec()) {
+			if (s->state() == NState::COMPLETE) completeSuiteCnt++;
+			if (s->hasAutoCancel()) hasAutoCancel++;
+		}
+		if ( (theDefs.suiteVec().size() == completeSuiteCnt) && (hasAutoCancel == 0)) {
+ 			LOG(Log::MSG, "Simulation complete in " << to_simple_string(duration) );
+
+ 			if ( !theDefs.checkInvariants(errorMsg) )  break;
+
+			// Run verification on the completed suite
+  			return theDefs.verification(errorMsg);
+		}
+
+		// crons run for ever. To terminate, we rely on test to have Verify attributes
+		// The verify attributes should *only* be on the task. (i.e task auto-reques
+		// hance parent is never complete, and hence no point in having verify attributes
+		if (foundCrons_) {
+		   std::string msg;
+		   if (theDefs.verification(msg)) {
+		      return true;
+		   }
+		}
+
+		// if simulation runs to long bomb out.,  then Analyse the defs,
+		// to determine why the simulation would not complete
+		if (abortSimulation(simiVisitor, duration, errorMsg) ) {
+
+ 			if ( !theDefs.checkInvariants(errorMsg) )  break;
+
+ 			if ( (theDefs.suiteVec().size() == completeSuiteCnt) && (hasAutoCancel != 0)) {
+ 				errorMsg += "All suites have completed, but autocancel has not taken effect?\n";
+ 			}
+
+ 			if (foundCrons_) {
+ 			   std::string msg;
+ 			   if (!theDefs.verification(msg)) {
+ 			      errorMsg += msg;
+ 			      errorMsg += "\n";
+ 			   }
+ 			}
+
+  			Analyser analyser;
+  			analyser.run(theDefs);
+  			errorMsg += "Please see files .flat and .depth for analysis\n";
+
+  			PrintStyle::setStyle(PrintStyle::MIGRATE);
+  			std::stringstream ss;
+  			ss << theDefs;
+  			errorMsg += ss.str();
+			return false;
+		}
+
+		// Increment calendar.
+		theDefs.updateCalendar( calUpdateParams );
+		duration += calendarIncrement;
+  	}
+
+ 	return false;
+}
+
+
+bool Simulator::run(const std::string& theDefsFile,std::string& errorMsg) const
+{
+#ifdef DEBUG_LONG_RUNNING_SUITES
+ 	cout << "Simulator::run parsing file " << theDefsFile << endl;
+#endif
+
+ 	Defs theDefs;
+	DefsStructureParser checkPtParser( &theDefs , theDefsFile );
+	std::string warningMsg;
+ 	if (!checkPtParser.doParse(errorMsg,warningMsg))  return false;
+
+ 	return run(theDefs,theDefsFile,errorMsg, false /* don't do check, allready done */);
+}
+
+//---------------------------------------------------------------------------------------
+
+bool Simulator::abortSimulation( const SimulatorVisitor& simiVisitor,
+                                 const boost::posix_time::time_duration& duration,
+                                 std::string& errorMsg) const
+{
+#ifdef DEBUG_LONG_RUNNING_SUITES
+ 	cout << " duration = " << to_simple_string(duration)
+		 << " max_simulation_period_=" << to_simple_string(max_simulation_period_)
+  	     << "\n";
+#endif
+	if (duration > max_simulation_period_) {
+
+		errorMsg = "\nTimed out after ";
+		errorMsg += to_simple_string(max_simulation_period_);
+		errorMsg += " hours of simulation.\n";
+
+		if (!simiVisitor.hasTimeDependencies())  errorMsg += "The definition has no time dependencies.\n";
+		return true;
+	}
+
+	return false;
+}
+
+
+bool Simulator::doJobSubmission(Defs& theDefs, std::string& errorMsg) const
+{
+	// For the simulation we ensure job submission takes less than 2 seconds
+	int submitJobsInterval = 10;
+
+	// Resolve dependencies and submit jobs
+	JobsParam jobsParam(submitJobsInterval, false /*create jobs*/); // spawn jobs *will* be set to false
+	Jobs jobs(&theDefs);
+	if (!jobs.generate(jobsParam)) {
+		ecf::log(Log::ERR, jobsParam.getErrorMsg());
+		assert(false);
+		return false;
+	}
+
+//#ifdef DEBUG_LONG_RUNNING_SUITES
+//	cout << "Simulator::doJobSubmission jobsParam.submitted().size() " << jobsParam.submitted().size() << " level = " << level_ << endl;
+//#endif
+	level_++;
+
+	// For those jobs that were submitted, Simulate client by going
+	// through the task events and meters and updating them and then
+	// re-checking for job submission. Finally mark task as complete
+	// This is important as there may be other task dependent on this.
+	BOOST_FOREACH(Submittable* t, jobsParam.submitted()) {
+
+#ifdef DEBUG_LONG_RUNNING_SUITES
+		// If task repeating themselves, determine what is causing this:
+		std::map<Task*,int>::iterator i = taskIntMap_.find(t);
+		if (i == taskIntMap_.end())  taskIntMap_.insert( std::make_pair(t,1));
+		else {
+			(*i).second++;
+			// Find top most node that has a repeat, check if its incrementing:
+ 			Node*   nodeWithRepeat = NULL;
+			Node* theParent = t->parent();
+			while (theParent) {
+				if (!theParent->repeat().empty())  nodeWithRepeat = theParent;
+				theParent = theParent->parent();
+			}
+			//cout << t->suite()->calendar().toString();
+			if ( nodeWithRepeat) {
+				cout << " level " << level_ << " submitted task " << t->debugNodePath() << " count = " << (*i).second
+				     << " HAS parent Repeating node " << nodeWithRepeat->debugNodePath()
+				     << " " << nodeWithRepeat->repeat().dump() << endl;
+			}
+			else {  // cound be a cron
+				cout << " level " << level_ << " submitted task " << t->debugNodePath() << " count = " << (*i).second  << endl;
+			}
+		}
+#endif
+
+		// If the task has any event used in the trigger expressions, then update event.
+ 		BOOST_FOREACH(Event& event, t->ref_events()) {
+
+ 			if (event.usedInTrigger()) { // event used in triger/complete expression
+ 				event.set_value(true);
+  				if (!doJobSubmission(theDefs,errorMsg))  {
+  					level_--;
+  					return false;
+  				}
+ 			}
+ 			else {
+ 				// warn about events not used in any trigger or complete expressions
+// 				cout << "submitted task " << t->debugNodePath() << " UN-USED event " << event.toString() << "\n";
+ 			}
+  		}
+
+		// if the task has any meters used in trigger expressions, then increment meters
+ 		BOOST_FOREACH(Meter& meter, t->ref_meters()) {
+
+ 			if (meter.usedInTrigger()) { // meter used in trigger/complete expression
+ 				while (meter.value() < meter.max()) {
+ 					meter.set_value(meter.value()+1);
+  					if (!doJobSubmission(theDefs,errorMsg)) {
+  						level_--;
+  						return false;
+  					}
+ 				}
+ 			}
+ 			else {
+ 				// Meters that are not used in trigger are usually used to indicate progress.
+				meter.set_value(meter.max());
+ 			}
+		}
+
+ 		// any state change should be followed with a job submission
+ 		t->complete();  // Finally mark task as complete
+
+ 		// crons run for ever. To terminate, we rely on test to have Verify attributes
+ 		if (foundCrons_) {
+ 		   std::string msg;
+ 		   t->verification(msg);
+ 		   if (msg.empty()) {
+ 		      return true;
+ 		   }
+ 		}
+
+#ifdef DEBUG_LONG_RUNNING_SUITES
+		cout << t->debugNodePath() << " completes at " << t->suite()->calendar().toString() << " level " << level_ << endl;
+#endif
+		if (!doJobSubmission(theDefs,errorMsg)) {
+			level_--;
+			return false;
+		}
+	}
+
+	level_--;
+	return true;
+}
+
+}
diff --git a/ecflow_4_0_7/CSim/src/Simulator.hpp b/ecflow_4_0_7/CSim/src/Simulator.hpp
new file mode 100644
index 0000000..d1540be
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/Simulator.hpp
@@ -0,0 +1,61 @@
+#ifndef SIMULATOR_HPP_
+#define SIMULATOR_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <string>
+#include <map>
+class Defs;
+class Task;
+namespace ecf { class SimulatorVisitor;}
+
+namespace ecf {
+
+/// This class is used to simulate a definition file. This is use full
+/// because:
+//       a/ Save time over involving server and asking client to play definition file
+//       b/ Tells you of any parser errors in the definition file
+//       c/ Tells you about any deadlocks, ie if suite does not complete
+//       d/ Will simulate for both real and hybrid clocks
+//       e/ Simulation will by default run for a year.
+class Simulator : private boost::noncopyable {
+public:
+	// default to run simulation for 1 year, or until suites complete if there are time dependencies 8784 =  366 X 24
+	// Otherwise will simulate for 24 hours
+ 	Simulator(const boost::posix_time::time_duration& period = boost::posix_time::time_duration(8784,0,0,0));
+
+ 	/// Some definition file will run forever. **NOT USED ***, kept for reference. Need a better mechanism
+  	void truncateLongRepeats(int truncateTo) { truncateLongRepeatsTo_ = truncateTo ;}
+
+ 	/// return true if all ok else returns false;
+	bool run(Defs&, const std::string& defs_filename, std::string& errorMsg, bool do_checks = true) const;
+	bool run(const std::string& theDefsFile, std::string& errorMsg) const;
+
+private:
+
+	bool abortSimulation(const ecf::SimulatorVisitor&, const boost::posix_time::time_duration& duration,std::string& message) const;
+	bool doJobSubmission(Defs&, std::string& errorMsg) const;
+
+	mutable boost::posix_time::time_duration max_simulation_period_;
+	mutable std::map<Task*,int> taskIntMap_;
+	int truncateLongRepeatsTo_;
+	mutable int level_;
+	mutable bool foundCrons_;
+};
+}
+#endif /* SIMULATOR_HPP_ */
diff --git a/ecflow_4_0_7/CSim/src/SimulatorVisitor.cpp b/ecflow_4_0_7/CSim/src/SimulatorVisitor.cpp
new file mode 100644
index 0000000..65479d1
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/SimulatorVisitor.cpp
@@ -0,0 +1,148 @@
+ //============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <iostream>
+#include "SimulatorVisitor.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "Indentor.hpp"
+
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+//#define DEBUG_VISITOR 1
+
+namespace ecf {
+
+///////////////////////////////////////////////////////////////////////////////
+SimulatorVisitor::SimulatorVisitor(int /* truncateRepeats */)
+: /* truncateRepeats_(truncateRepeats), */
+  foundTasks_(false),
+  foundCrons_(false),
+  hasTimeDependencies_(false),
+  max_length_(0),
+  ci_(hours(1))
+  {}
+
+void SimulatorVisitor::visitDefs( Defs* d) {
+	BOOST_FOREACH(suite_ptr s, d->suiteVec()) { s->acceptVisitTraversor(*this); }
+}
+
+void SimulatorVisitor::visitSuite( Suite* s)   {
+
+#ifdef DEBUG_VISITOR
+	cout << "SimulatorVisitor::visitSuite " << s->debugNodePath() << "\n";
+#endif
+
+	/// begin , will cause creation of generated variables. The generated variables
+	/// are use in client scripts and used to locate the sms files.
+	s->begin();
+
+	// IF the suite has no task  (i.e could consist of just limits, set suite to complete
+	// Since we rely on it for termination of tests
+	// make setting NState::COMPLETE is after begin(), which will set Node into the queued state
+  	std::vector<Task*> theTasks;
+	s->getAllTasks(theTasks);
+	if (theTasks.empty()) {
+		s->set_state(NState::COMPLETE);
+		return;
+ 	}
+	foundTasks_ = true;
+
+	// Found time dependencies use calendar increment of one minute
+	if (s->hasTimeDependencies()) {
+		hasTimeDependencies_ = true;
+		ci_ = minutes(1);
+	}
+
+	// If suite has repeat day attribute( a infinite repeat), it will run forever, hence disable this for simulation purposes
+	/// reset will clear the invalid flag., when doing a real job submission.
+	/// *** this must be placed after begin() since begin() will reset all attributes() *****
+	if (s->ref_repeat().makeInfiniteInValid()) {
+		cout << "Disabling '" << s->repeat().dump() << "' attribute of " << s->debugNodePath() << ". This will allow simulation to complete earlier.\n";
+	}
+
+	if (!s->crons().empty()) {
+	   foundCrons_ = true;
+	   //cout << "Found crons on Suite\n";
+	}
+
+ 	visitNodeContainer(s);
+}
+
+void SimulatorVisitor::visitFamily( Family* f) { visitNodeContainer(f);}
+
+void SimulatorVisitor::visitNodeContainer(NodeContainer* nc)
+{
+   if (!nc->crons().empty()) {
+      foundCrons_ = true;
+      cout << "Found crons on NodeContainer\n";
+   }
+
+//	analyse(nc);
+	BOOST_FOREACH(node_ptr t, nc->nodeVec()) { t->acceptVisitTraversor(*this);}
+}
+
+void SimulatorVisitor::visitTask( Task* t )
+{
+   if (!t->crons().empty()) {
+      foundCrons_ = true;
+      // cout << "Found crons on task\n";
+   }
+//   analyse(t);
+}
+
+boost::posix_time::time_duration SimulatorVisitor::maxSimulationPeriod() const
+{
+	if ( hasTimeDependencies_)  return hours(max_length_);
+	return  hours(24);
+}
+
+/// Commented out, since we need to find a better mechanism of truncating long repeats
+/// without change repeat structure/attributes. (i.e need a simulation mode, with a max length
+/// that is ignored in the server.
+//void SimulatorVisitor::analyse(Node* node)
+//{
+//	if (!node->repeat().empty()) {
+//		int lengthInDays = node->repeat().length();
+//
+//#ifdef DEBUG_VISITOR
+//		cout << "SimulatorVisitor::analyse " << node->debugNodePath() << " " << node->repeat().dump() << " length = " << lengthInDays << "\n";
+//#endif
+//
+//		// **************************************************************************
+//		// ****** CAUTION: Truncate make a change to defs structure. Use with care
+//		// **************************************************************************
+//		if (truncateRepeats_ != 0  && lengthInDays > truncateRepeats_) {
+//			node->repeat_.truncate(truncateRepeats_);
+//			lengthInDays = node->repeat().length();
+//		}
+//
+//		lengthInDays *= 24; // convert to hours Day of month value
+//
+//		if ( lengthInDays > max_length_) {
+//			max_length_ = lengthInDays;
+//
+//#ifdef DEBUG_VISITOR
+//			cout << "max_length_ = " << max_length_ << " hours \n";
+//#endif
+//		}
+//	}
+//}
+
+}
diff --git a/ecflow_4_0_7/CSim/src/SimulatorVisitor.hpp b/ecflow_4_0_7/CSim/src/SimulatorVisitor.hpp
new file mode 100644
index 0000000..ee6ea4d
--- /dev/null
+++ b/ecflow_4_0_7/CSim/src/SimulatorVisitor.hpp
@@ -0,0 +1,73 @@
+#ifndef SIMULATORVISITOR_HPP_
+#define SIMULATORVISITOR_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "NodeTreeVisitor.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <iostream>
+#include <sstream>
+#include <set>
+#include <vector>
+class Node;
+
+namespace ecf {
+
+class SimulatorVisitor : public NodeTreeVisitor {
+public:
+	SimulatorVisitor(int truncateRepeats);
+
+	/// If the definition file has suites with no tasks, ie they could have server limits
+	/// then for simulation purposes(i.e when all suites complete we terminate simulation)
+ 	/// mark these as complete. Must be done *AFTER* beginAll() which sets all nodes to queued state
+ 	bool foundTasks() const { return foundTasks_;}
+
+ 	/// Crons run for ever. Detect them so that we can abort early
+   bool foundCrons() const { return foundCrons_;}
+
+ 	/// returns true if defs has time,date,today, date time based attributes
+ 	bool hasTimeDependencies() const { return hasTimeDependencies_;}
+
+ 	/// Determine the max simulation period in hours. We will default to a years 8784 =  366 X 24
+ 	/// However by going through and looking at the repeats, we can get a better idea
+ 	boost::posix_time::time_duration maxSimulationPeriod() const;
+
+  	// default calendar increment is one minute, however if we have no time dependencies,
+ 	// then simulation can be speeded up, ie by using hour increment
+ 	const boost::posix_time::time_duration& calendarIncrement() const { return ci_;}
+
+	virtual bool traverseObjectStructureViaVisitors() const { return true;}
+	virtual void visitDefs(Defs*);
+	virtual void visitSuite(Suite*);
+	virtual void visitFamily(Family*);
+	virtual void visitNodeContainer(NodeContainer*);
+	virtual void visitTask(Task*);
+
+private:
+	/// Commented out since, we need to find a way of truncating lon repeats
+	/// without changing repeat structure.
+//	void analyse(Node* node);
+//	int truncateRepeats_;  // allow for simulation to complete earlier. ***NOT USED, kept for reference *****
+
+	bool foundTasks_;
+	bool foundCrons_;
+	bool hasTimeDependencies_;
+	int  max_length_;
+ 	boost::posix_time::time_duration ci_;
+};
+
+}
+#endif
diff --git a/ecflow_4_0_7/CSim/test/TestAnalysis.cpp b/ecflow_4_0_7/CSim/test/TestAnalysis.cpp
new file mode 100644
index 0000000..02102b7
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestAnalysis.cpp
@@ -0,0 +1,82 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+
+#include "Simulator.hpp"
+
+#include "File.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestUtil.hpp"
+#include "System.hpp"
+
+using namespace std;
+using namespace ecf;
+
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+/// Use this class to test single simulation of definition file that we want to add
+/// to Test Simulator. This is a separate exe
+
+BOOST_AUTO_TEST_CASE( test_analysys )
+{
+   cout << "Simulator:: ...test_analysys\n";
+   //suite suite
+   //	family family
+   //   	task t1
+   //          trigger t2 == complete
+   //   	task t2
+   //          trigger t1 == complete
+   //  	endfamily
+   //endsuite
+
+   // This simulation is expected to fail, since we have a deadlock/ race condition
+   // It will prodice a defs.depth and defs.flat files. Make sure to remove them
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_analysys");
+      family_ptr fam = suite->add_family("family");
+
+      task_ptr task1 = fam->add_task("t1");
+      task1->add_trigger( "t2 == complete" );
+
+      task_ptr task2 = fam->add_task("t2");
+      task2->add_trigger( "t1 == complete" );
+
+      //		cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(!simulator.run(theDefs, TestUtil::testDataLocation("test_analysys.def") , errorMsg),errorMsg);
+
+   //	cout << theDefs << "\n";
+   boost::filesystem::remove("defs.depth");
+   boost::filesystem::remove("defs.flat");
+
+   /// Destroy singleton's to avoid valgrind from complaining
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/CSim/test/TestAutoCancel.cpp b/ecflow_4_0_7/CSim/test/TestAutoCancel.cpp
new file mode 100644
index 0000000..f971cc4
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestAutoCancel.cpp
@@ -0,0 +1,271 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "Simulator.hpp"
+#include "File.hpp"
+#include "Log.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestUtil.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace fs = boost::filesystem;
+
+/// Simulate definition files that are created on then fly. This us to validate
+/// Defs file, to check for correctness
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_autocancel_ast_node_reset )
+{
+   cout << "Simulator:: ...test_autocancel_ast_node_reset\n";
+
+   // ****: Since we have no time dependencies the simulator calendar increment
+   // ****: is in hours. Hence autocancel at hour resolution
+   Defs theDefs;
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("s1");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->add_trigger( "/s2/family/t == complete" );
+
+      task_ptr task2 = fam->add_task("t2");
+      task2->add_trigger( "/s3/family/t == complete" );
+      task2->add_complete( "/s2/family == complete" );
+
+      task_ptr task3 = fam->add_task("t3");
+      task3->add_trigger( "/s3 == complete" );
+      task3->add_complete( "/s2 == complete");
+      //		cout << theDefs << "\n";
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+
+      suite_ptr suite = theDefs.add_suite("s2");
+      suite->addClock( clockAttr );
+      suite->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(1,0), false));
+
+      family_ptr fam = suite->add_family("family");
+      fam->add_task("t");
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("s3");
+      suite->addClock( clockAttr );
+      suite->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(1,0), false));
+
+      family_ptr fam = suite->add_family("family");
+      fam->add_task("t");
+   }
+
+   // Check number of AST nodes. The AST should be created on the fly
+   std::set<Node*> theSet;
+   theDefs.getAllAstNodes(theSet);
+   BOOST_CHECK_MESSAGE(theSet.size() == 5,"Expected to have 5 AST nodes in trigger/complete expressions but found " << theSet.size());
+
+   // Run the simulator
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_autocancel_ast_node_reset.def"), errorMsg),errorMsg);
+
+   // Auto cancel should delete suite s2 and s3, leaving one suite i.e s1
+   BOOST_CHECK_MESSAGE(theDefs.suiteVec().size() == 1,"Expected to have 1 suites but found " << theDefs.suiteVec().size());
+
+   // The references to nodes in suites s2, s3 should have been cleared in suite s1
+   {
+      std::set<Node*> theSet;
+      theDefs.getAllAstNodes(theSet);
+      BOOST_CHECK_MESSAGE(theSet.empty(),"Expected to have 0 AST nodes in trigger/complete expressions but found " << theSet.size());
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_autocancel_suite )
+{
+   cout << "Simulator:: ...test_autocancel_suite\n";
+
+   // ****: Since we have no time dependencies the simulator calendar increment
+   // ****: is in hours. Hence autocancel at hour resolution
+   Defs theDefs;
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_10_hours_relative");
+      suite->addClock( clockAttr );
+      suite->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(10,0), true));
+      family_ptr fam = suite->add_family("family");
+      fam->add_task("t");
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_1_hours_real");
+      suite->addClock( clockAttr );
+      suite->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(1,0), false));
+      family_ptr fam = suite->add_family("family");
+      fam->add_task("t");
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_1_day_relative");
+      suite->addClock( clockAttr );
+      suite->addAutoCancel( ecf::AutoCancelAttr(1) );
+      family_ptr fam = suite->add_family("family");
+      fam->add_task("t");
+      //    	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_autocancel_suite.def"), errorMsg),errorMsg);
+
+   // make sure autocancel deletes the suite.
+   BOOST_CHECK_MESSAGE(theDefs.suiteVec().size() == 0,"Expected to have 0 suites but found " << theDefs.suiteVec().size());
+}
+
+BOOST_AUTO_TEST_CASE( test_autocancel_family_and_task )
+{
+   cout << "Simulator:: ...test_autocancel_family_and_task\n";
+
+   // ****: Since we have no time dependencies the simulator calendar increment
+   // ****: is in hours. Hence autocancel at hour resolution
+   Defs theDefs;
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_9_10_hours_relative");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      fam->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(10,0), true));
+
+      task_ptr task = fam->add_task("t");
+      task->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(9,0), true));
+
+      //		cout << theDefs << "\n";
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_1_2_hours_real");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      fam->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(2,0), false));
+
+      task_ptr task = fam->add_task("t");
+      task->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(1,0), false));
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_1_2_day_relative");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      fam->addAutoCancel( ecf::AutoCancelAttr(2) );
+
+      task_ptr task = fam->add_task("t");
+      task->addAutoCancel( ecf::AutoCancelAttr(1) );
+      //    	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_autocancel_family_and_task.def"), errorMsg),errorMsg);
+
+   // make sure autocancel deletes the families.
+   std::vector<Family*> famVec;
+   theDefs.getAllFamilies(famVec);
+   BOOST_CHECK_MESSAGE(famVec.size() == 0,"Expected to have 0 families but found " << famVec.size());
+}
+
+BOOST_AUTO_TEST_CASE( test_autocancel_task )
+{
+   cout << "Simulator:: ...test_autocancel_task\n";
+
+   // ****: Since we have no time dependencies the simulator calendar increment
+   // ****: is in hours. Hence autocancel at hour resolution
+   Defs theDefs;
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_10_hours_relative");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(10,0), true));
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_1_hours_real");
+      suite->addClock( clockAttr );
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addAutoCancel( ecf::AutoCancelAttr( ecf::TimeSlot(1,0), false));
+   }
+   {
+      ClockAttr clockAttr(true);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_autocancel_1_day_relative");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addAutoCancel( ecf::AutoCancelAttr(1) );
+      //    	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_autocancel_task.def"), errorMsg),errorMsg);
+
+   // make sure autocancel deletes the tasks and leaves families intact.
+   std::vector<task_ptr> task_vec;
+   theDefs.get_all_tasks(task_vec);
+
+   std::vector<Family*> famVec;
+   theDefs.getAllFamilies(famVec);
+
+   BOOST_CHECK_MESSAGE(famVec.size() == 3,"Expected to have 3 families but found " << famVec.size());
+   BOOST_CHECK_MESSAGE(task_vec.size() == 0,"Expected to have 0 tasks but found " << task_vec.size());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/CSim/test/TestMeter.cpp b/ecflow_4_0_7/CSim/test/TestMeter.cpp
new file mode 100644
index 0000000..05fe771
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestMeter.cpp
@@ -0,0 +1,108 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "Simulator.hpp"
+#include "File.hpp"
+#include "Log.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestUtil.hpp"
+#include "System.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace fs = boost::filesystem;
+
+/// Simulate definition files that are created on then fly. This us to validate
+/// Defs file, to check for correctness
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_meter )
+{
+	cout << "Simulator:: ...test_meter\n";
+
+	//suite suite
+	// clock real <todays date>
+	//	family family
+	//   	task fc
+	//         meter hour 0 240
+	//      task half
+	//         trigger fc:hour >= 120
+	//  	endfamily
+	//endsuite
+
+	// Initialise clock with todays date  then create a time attribute + minutes
+	// such that the task should only run once, in the next minute
+ 	boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+
+ 	Defs theDefs;
+ 	{
+ 	   ClockAttr clockAttr(theLocalTime );
+ 	   suite_ptr suite = theDefs.add_suite("test_meter");
+ 	   suite->addClock( clockAttr );
+ 	   suite->addVerify( VerifyAttr(NState::COMPLETE,1) );
+
+ 	   family_ptr fam = suite->add_family("family");
+ 	   fam->addVerify( VerifyAttr(NState::COMPLETE,1) );
+
+ 	   task_ptr fc = fam->add_task("fc");
+ 	   fc->addMeter( Meter("hour",0,240,240) );
+ 	   fc->addVerify( VerifyAttr(NState::COMPLETE,1) );
+
+      task_ptr half = fam->add_task("half");
+ 	   half->add_trigger( "fc:hour >= 120" );
+ 	   half->addVerify( VerifyAttr(NState::COMPLETE,1) );
+//  	cout << theDefs << "\n";
+ 	}
+
+   Simulator simulator;
+	std::string errorMsg;
+	BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_meter.def"), errorMsg),errorMsg);
+
+	// The simulator will set all the meter values, so final value must be the max value.
+	bool found_task = false;
+	std::vector<Task*> theServerTasks;
+	theDefs.getAllTasks(theServerTasks);
+	BOOST_FOREACH(Task* t, theServerTasks) {
+		if (t->name() == "fc") {
+			found_task = true;
+	  		const std::vector<Meter>& meters = t->meters();
+			BOOST_REQUIRE_MESSAGE(meters.size() == 1,"Expected one meter but found " <<  meters.size());
+			BOOST_CHECK_MESSAGE(meters[0].value() == meters[0].max(),"Expected meter to have value of " << meters[0].max() << " but found " << meters[0].value() );
+		}
+	}
+	BOOST_REQUIRE_MESSAGE(found_task ,"Failed to find task fc ");
+
+	/// Destroy System singleton to avoid valgrind from complaining
+	System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/CSim/test/TestRepeat.cpp b/ecflow_4_0_7/CSim/test/TestRepeat.cpp
new file mode 100644
index 0000000..a6163d0
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestRepeat.cpp
@@ -0,0 +1,412 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "Simulator.hpp"
+#include "File.hpp"
+#include "Log.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestUtil.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace fs = boost::filesystem;
+
+/// Simulate definition files that are created on then fly. This us to validate
+/// Defs file, to check for correctness
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_repeat_integer  )
+{
+ 	cout << "Simulator:: ...test_repeat_integer\n";
+
+ 	//suite suite
+	//	repeat integer VAR 0 1 1          # run at 0, 1    2 times
+	//	edit SLEEPTIME 1
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//	    repeat integer VAR 0 1 1     # run at 0, 1     2 times
+	//   	task t<n>
+	//      ....
+ 	//  	endfamily
+	//endsuite
+
+	// Each task/job should be run *4* times, according to the repeats
+	// Mimics nested loops
+ 	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite("suite");
+ 	   suite->addRepeat( RepeatInteger("VAR",0,1,1));      // repeat contents 2 times
+ 	   suite->addVerify( VerifyAttr(NState::COMPLETE,2) );
+      family_ptr fam = suite->add_family( "family" );
+ 	   fam->addRepeat( RepeatInteger("VAR",0,1,1));    // repeat contents 2 times
+ 	   fam->addVerify( VerifyAttr(NState::COMPLETE,4) ); // verify family repeats 2 times
+ 	   int taskSize = 2;
+ 	   for(int i=0; i < taskSize; i++) {
+ 	      task_ptr t = fam->add_task( "t" + boost::lexical_cast<std::string>(i) );
+ 	      t->addVerify( VerifyAttr(NState::COMPLETE,4) ); // Each task should run 4 times
+ 	   }
+ 	   //		cout << theDefs << "\n";
+ 	}
+
+ 	Simulator simulator;
+ 	std::string errorMsg;
+ 	BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_repeat_integer.def"),errorMsg),errorMsg);
+//	cout << theDefs << "\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_integer_relative  )
+{
+ 	cout << "Simulator:: ...test_repeat_integer_relative\n";
+
+ 	//suite suite
+	//	repeat integer VAR 0 1 1          # run at 0, 1    2 times
+	//	edit SLEEPTIME 1
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//	    repeat integer VAR 0 1 1     # run at 0, 1     2 times
+	//   	task t1
+	//      	time +0;02
+ 	//  	endfamily
+	//endsuite
+
+	// Each task/job should be run *4* times relative to Node times, according to the repeats
+	// Mimics nested loops
+    Defs theDefs;
+ 	{
+		ClockAttr clockAttr(true/*false means use hybrid clock*/);
+		clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_repeat_integer_relative");
+  		suite->addClock( clockAttr );
+ 		suite->addRepeat( RepeatInteger("VAR",0,1,1));      // repeat contents 2 times
+ 		suite->addVerify( VerifyAttr(NState::COMPLETE,2) );
+
+      family_ptr fam = suite->add_family( "family" );
+ 		fam->addRepeat( RepeatInteger("VAR",0,1,1));      // repeat contents 2 times
+ 		fam->addVerify( VerifyAttr(NState::COMPLETE,4) );
+
+ 		task_ptr t = fam->add_task("t1");
+ 		t->addTime( ecf::TimeAttr( TimeSlot(0,2), true /*relative*/ ) );
+  		t->addVerify( VerifyAttr(NState::COMPLETE,4) ); // Each task should run 4 times
+
+//		cout << theDefs << "\n";
+ 	}
+
+   Simulator simulator;
+	std::string errorMsg;
+	BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_repeat_integer_relative.def"),errorMsg),errorMsg);
+//	cout << theDefs << "\n";
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_date  )
+{
+ 	cout << "Simulator:: ...test_repeat_date\n";
+ 	//suite suite
+ 	// clock real <fixed date + time>
+ 	//	family family
+	//	   repeat date YMD 20091001  20091015 1  # yyyymmdd
+	//   	task t
+	//      	time 10:00
+ 	//  	endfamily
+	//endsuite
+
+	// Each task should be run 15 times, ie every day at 10.00 am from  1st Oct->15 October 15 times
+   Defs theDefs;
+ 	{
+      ClockAttr clockAttr;
+      clockAttr.date(1,10,2009);
+   	suite_ptr suite = theDefs.add_suite("test_repeat_date");
+		suite->addVerify( VerifyAttr(NState::COMPLETE,1) );
+  		suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+ 		fam->addRepeat( RepeatDate("YMD",20091001,20091015,1));  // repeat contents 15 times
+		fam->addVerify( VerifyAttr(NState::COMPLETE,15) );
+
+      task_ptr task = fam->add_task("t");
+		task->addTime( ecf::TimeAttr( TimeSlot(10,0) ) );
+		task->addVerify( VerifyAttr(NState::COMPLETE,15) );      // task should complete 15 times
+
+//		cout << theDefs << "\n";
+ 	}
+
+   Simulator simulator;
+	std::string errorMsg;
+	BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_repeat_date.def"), errorMsg),errorMsg);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_date_for_loop  )
+{
+ 	cout << "Simulator:: ...test_repeat_date_for_loop\n";
+
+ 	//suite suite
+ 	// clock real <todays date>
+	//	repeat date YMD 20091001  20091005 1  # yyyymmdd
+ 	//	family family
+	//	    repeat date YMD 20091001  20091005 1  # yyyymmdd
+	//   	task t
+	//      	time 10:00
+ 	//  	endfamily
+	//endsuite
+
+	// Each task should be run 5 * 5= 25 times, ie every day from from 1st Oct -> 5 Oct 5*5 times
+   Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite("test_repeat_date_for_loop");
+		suite->addRepeat( RepeatDate("YMD",20091001,20091005,1));  // repeat contents 5 times
+		suite->addVerify( VerifyAttr(NState::COMPLETE,5) );
+
+      // start at specific time other wise time dependent checks will not verify
+		ClockAttr clockAttr;
+		clockAttr.date(1,10,2009);
+  		suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+ 		fam->addRepeat( RepeatDate("YMD",20091001,20091005,1));  // repeat contents 5 times
+		fam->addVerify( VerifyAttr(NState::COMPLETE,25) );
+
+      task_ptr task = fam->add_task("t");
+		task->addTime( ecf::TimeAttr( TimeSlot(10,0) ) );
+		task->addVerify( VerifyAttr(NState::COMPLETE,25) );      // task should complete 25 times
+
+//		cout << theDefs << "\n";
+ 	}
+
+   Simulator simulator;
+	std::string errorMsg;
+	BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_repeat_date_for_loop.def"), errorMsg),errorMsg);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_date_for_loop2  )
+{
+   cout << "Simulator:: ...test_repeat_date_for_loop2\n";
+
+   //suite suite
+   // clock real <todays date>
+   // repeat date YMD 20091001  20091005 1  # yyyymmdd
+   // family family
+   //     repeat date YMD 20091001  20091005 1  # yyyymmdd
+   //    task t
+   //       time 10:00
+   //       time 11:00
+   //    endfamily
+   //endsuite
+
+   // Each task should be run 5 * 5 * 2 = 50 times, ie every day from from 1st Oct -> 5 Oct 5*5 times * 2 time slots
+   Defs theDefs;
+   {
+      // start at specific time other wise time dependent checks will not verify
+      suite_ptr suite = theDefs.add_suite("test_repeat_date_for_loop2");
+      suite->addRepeat( RepeatDate("YMD",20091001,20091005,1));  // repeat contents 5 times
+      suite->addVerify( VerifyAttr(NState::COMPLETE,5) );
+
+      ClockAttr clockAttr;
+      clockAttr.date(1,10,2009);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      fam->addRepeat( RepeatDate("YMD",20091001,20091005,1));  // repeat contents 5 times
+      fam->addVerify( VerifyAttr(NState::COMPLETE,25) );
+
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr( TimeSlot(10,0) ) );
+      task->addTime( ecf::TimeAttr( TimeSlot(11,0) ) );
+      task->addVerify( VerifyAttr(NState::COMPLETE,50) );     // task should complete 50 times
+
+      // cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_repeat_date_for_loop2.def"), errorMsg),errorMsg);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_with_cron  )
+{
+ 	cout << "Simulator:: ...test_repeat_with_cron\n";
+// 	suite s
+//    clock real <today date>
+// 	  family f
+//	     repeat date YMD 20091001  20091004 1  # yyyymmdd
+// 		family plot
+// 			complete plot/finish == complete
+//
+// 			task finish
+// 				trigger 1 == 0    # stops task from running
+// 				complete checkdata::done or checkdata == complete
+//
+// 			task checkdata
+// 				event done
+// 				cron <today date> + 2 minutes     # cron that run forever
+//      endfamily
+//   endfamily
+// endsuite
+
+   Defs theDefs;
+ 	{
+ 	 	boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+  	 	boost::posix_time::ptime   time_plus_2_minute =  theLocalTime +  minutes(2);
+		ClockAttr clockAttr(theLocalTime, false/* real clock*/);
+
+      suite_ptr suite = theDefs.add_suite("test_repeat_with_cron");
+  		suite->addClock( clockAttr );
+
+      family_ptr f = suite->add_family( "f" );
+ 		f->addRepeat( RepeatDate("YMD",20091001,20091004,1));  // repeat contents 4 times
+ 		f->addVerify( VerifyAttr(NState::COMPLETE,4) );
+
+      family_ptr family_plot = f->add_family( "plot" );
+ 		family_plot->add_complete(  "plot/finish ==  complete");
+ 		family_plot->addVerify( VerifyAttr(NState::COMPLETE,4) );
+
+
+      task_ptr task_finish = family_plot->add_task("finish");
+		task_finish->add_trigger(  "1 == 0");
+		task_finish->add_complete( "checkdata:done or checkdata == complete" );
+		task_finish->addVerify( VerifyAttr(NState::COMPLETE,8) );
+
+      task_ptr task_checkdata = family_plot->add_task("checkdata");
+		task_checkdata->addEvent( Event(1,"done"));
+
+ 		CronAttr cronAttr;
+ 		cronAttr.addTimeSeries( ecf::TimeSlot(time_plus_2_minute.time_of_day()) );
+		task_checkdata->addCron( cronAttr  );
+		task_checkdata->addVerify( VerifyAttr(NState::COMPLETE,8) );
+
+//		cout << theDefs << "\n";
+ 	}
+
+   Simulator simulator;
+	std::string errorMsg;
+	BOOST_REQUIRE_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_repeat_with_cron.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_enumerated )
+{
+   cout << "Simulator:: ...test_repeat_enumerated\n";
+   //suite suite
+   //	family family
+   //	    repeat enumerated ENUM "hello" "there" "bill" # run 3 times
+   //   	task t1
+   //  endfamily
+   //endsuite
+
+   // Each task/job should be run 3 according to the repeats
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_repeat_enumerated");
+
+      std::vector<std::string> theEnums;
+      theEnums.push_back("hello");  // index 0
+      theEnums.push_back("there");  // index 1
+      theEnums.push_back("bill");   // index 2
+
+      family_ptr fam = suite->add_family( "family" );
+      fam->addRepeat( RepeatEnumerated("ENUM",theEnums));  // repeat contents 3 times
+      fam->addVerify( VerifyAttr(NState::COMPLETE,3) );
+
+      task_ptr task = fam->add_task("t1");
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );
+
+      //		cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_repeat_enumerated.def"), errorMsg),errorMsg);
+   //	cout << theDefs << "\n";
+
+
+   std::vector<Task*> theServerTasks;
+   theDefs.getAllTasks(theServerTasks);
+   BOOST_FOREACH(Task* t, theServerTasks) {
+      // verify repeat has the last value
+      Family* family = dynamic_cast<Family*>(t->parent());
+      const Repeat& repeat = family->findRepeat("ENUM");
+      BOOST_REQUIRE_MESSAGE(!repeat.empty(),"Expected to find repeat on family " << family->absNodePath() );
+      BOOST_REQUIRE_MESSAGE(!repeat.valid(),"Expected invalid repeat");
+      BOOST_REQUIRE_MESSAGE(repeat.value() == 3,"Expected to find repeat with value 3 but found " << repeat.value() );
+      BOOST_REQUIRE_MESSAGE(repeat.last_valid_value() == 2,"Expected to find repeat with last valid value 2 but found " << repeat.last_valid_value() );
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_string )
+{
+ 	cout << "Simulator:: ...test_repeat_string\n";
+ 	//suite suite
+ 	//	family family
+	//	    repeat string STRING "hello" "there" # run 2 times
+	//   	task t1
+  	//  endfamily
+	//endsuite
+
+ 	// Each task/job should be run 3 according to the repeats
+ 	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite("test_repeat_string");
+
+ 	   std::vector<std::string> theStrings;
+ 	   theStrings.push_back("hello");  // index 0
+ 	   theStrings.push_back("there");  // index 1
+
+      family_ptr fam = suite->add_family( "family" );
+ 	   fam->addRepeat( RepeatString("STRING",theStrings));  // repeat contents 2 times
+ 	   fam->addVerify( VerifyAttr(NState::COMPLETE,2) );
+
+      task_ptr task = fam->add_task("t1");
+ 	   task->addVerify( VerifyAttr(NState::COMPLETE,2) );
+
+ 	   //		cout << theDefs << "\n";
+ 	}
+
+ 	Simulator simulator;
+ 	std::string errorMsg;
+ 	BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_repeat_string.def"), errorMsg),errorMsg);
+ 	//	cout << theDefs << "\n";
+
+ 	std::vector<Task*> theServerTasks;
+ 	theDefs.getAllTasks(theServerTasks);
+ 	BOOST_FOREACH(Task* t, theServerTasks) {
+ 	   // verify repeat has the last value
+ 	   Family* family = dynamic_cast<Family*>(t->parent());
+ 	   const Repeat& repeat = family->findRepeat("STRING");
+ 	   BOOST_REQUIRE_MESSAGE(!repeat.empty(),"Expected to find repeat on family " << family->absNodePath() );
+ 	   BOOST_REQUIRE_MESSAGE(!repeat.valid(),"Expected invalid repeat");
+ 	   BOOST_REQUIRE_MESSAGE(repeat.value() == 2,"Expected to find repeat with value 2 but found " << repeat.value() );
+      BOOST_REQUIRE_MESSAGE(repeat.last_valid_value() == 1,"Expected to find repeat with last valid value 1 but found " << repeat.last_valid_value() );
+ 	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/CSim/test/TestSimulator.cpp b/ecflow_4_0_7/CSim/test/TestSimulator.cpp
new file mode 100644
index 0000000..1e04edb
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestSimulator.cpp
@@ -0,0 +1,135 @@
+#define BOOST_TEST_MODULE TestSimulator
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+
+#include "System.hpp"
+#include "Simulator.hpp"
+#include "File.hpp"
+#include "LogVerification.hpp"
+
+namespace fs = boost::filesystem;
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+void simulate(const std::string& directory, bool pass)
+{
+	fs::path full_path( fs::initial_path<fs::path>() );
+	full_path = fs::system_complete( fs::path( directory ) );
+
+	BOOST_CHECK(fs::exists( full_path ));
+	BOOST_CHECK(fs::is_directory( full_path ));
+
+	//std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
+	fs::directory_iterator end_iter;
+	for ( fs::directory_iterator dir_itr( full_path ); dir_itr != end_iter; ++dir_itr ) {
+
+		try {
+         fs::path relPath(directory + "/" + dir_itr->path().filename().string());
+
+ 			// recurse down directories
+		    if ( is_directory(dir_itr->status()) )  {
+		    	simulate(relPath.string(),pass);
+		    	continue;
+		    }
+
+		    // Only simulate file with .def file extension, i.e. ignore log files.
+// 			cout << "path = " << relPath << "\n";
+          if (File::getExt(relPath.filename().string()) != "def" && File::getExt(relPath.filename().string()) != "got") continue;
+
+//			std::cout << "...............Simulating file " << relPath.string() << "\n";
+		    Simulator simulator;
+ 			std::string errorMsg;
+			bool simPass = simulator.run(relPath.string(), errorMsg);
+			if (pass) {
+				// Test expected to pass
+				BOOST_CHECK_MESSAGE(simPass,"Simulator expected to pass for " << relPath << "\n" << errorMsg);
+
+				// Compare/ create log files
+				if (simPass) {
+ 					std::string logFileName = relPath.string() + ".log";
+					std::string goldenFileName = relPath.string() + ".glog";
+					BOOST_CHECK_MESSAGE(fs::exists(logFileName),"Log file " << logFileName << " should have been created");
+					if (fs::exists(goldenFileName) ) {
+
+						ofstream my_file(goldenFileName.c_str());
+						if (!my_file.good()) {
+							// read able file
+//							cout << "file " << goldenFileName << " is readable \n";
+							std::string errorMessage;
+							BOOST_CHECK_MESSAGE(LogVerification::compareNodeStates(logFileName,goldenFileName,errorMessage),
+							                    "Log file comparison failed for " << relPath.string() << "\n" << errorMessage);
+ 						}
+						else {
+							// writable file, overwrite
+//							cout << "Golden file " << goldenFileName << " is writeable, overwriting\n";
+							fs::remove(goldenFileName);
+							fs::copy_file(logFileName,goldenFileName);
+						}
+					}
+					else {
+						// Create golden log file so that it can be compared next time
+						// fs::copy_file(logFileName,goldenFileName);
+					}
+				}
+ 			}
+			else {
+				// test expected to fail
+				BOOST_CHECK_MESSAGE(!simPass,"Simulator expected to fail for " << relPath << "\n" << errorMsg);
+ 			}
+		}
+		catch ( const std::exception & ex )
+		{
+ 			std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
+		}
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_simulate_good_defs )
+{
+	cout << "Simulator:: ...test_simulate_good_defs\n";
+
+   std::string path = File::test_data("CSim/test/data/good_defs","CSim");
+
+	// All the defs in this directory are expected to pass
+	simulate(path, true);
+}
+
+BOOST_AUTO_TEST_CASE( test_simulate_bad_defs )
+{
+	cout << "Simulator:: ...test_simulate_bad_defs\n";
+
+   std::string path = File::test_data("CSim/test/data/bad_defs","CSim");
+
+	// All the defs in this directory are expected to fail
+	simulate(path, false);
+
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/CSim/test/TestSingleSimulator.cpp b/ecflow_4_0_7/CSim/test/TestSingleSimulator.cpp
new file mode 100644
index 0000000..e225217
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestSingleSimulator.cpp
@@ -0,0 +1,107 @@
+#define BOOST_TEST_MODULE TestSingleSimulator
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/// Use this class to test single simulation of definition file that we want to add
+/// to Test Simulator. This is a separate exe
+//============================================================================
+#include "Simulator.hpp"
+
+#include "File.hpp"
+#include "Log.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestUtil.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_repeat_date_for_loop2  )
+{
+   cout << "Simulator:: ...test_repeat_date_for_loop2\n";
+
+   //suite suite
+   // clock real <todays date>
+   // repeat date YMD 20091001  20091005 1  # yyyymmdd
+   // family family
+   //     repeat date YMD 20091001  20091005 1  # yyyymmdd
+   //    task t
+   //       time 10:00
+   //       time 11:00
+   //    endfamily
+   //endsuite
+
+   // Each task should be run 5 * 5 * 2 = 50 times, ie every day from from 1st Oct -> 5 Oct 5*5 times * 2 time slots
+   Defs theDefs;
+   {
+      // start at specific time other wise time dependent checks will not verify
+      suite_ptr suite = theDefs.add_suite("test_repeat_date_for_loop2");
+      suite->addRepeat( RepeatDate("YMD",20091001,20091005,1));  // repeat contents 5 times
+      suite->addVerify( VerifyAttr(NState::COMPLETE,5) );
+
+      ClockAttr clockAttr;
+      clockAttr.date(1,10,2009);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      fam->addRepeat( RepeatDate("YMD",20091001,20091005,1));  // repeat contents 5 times
+      fam->addVerify( VerifyAttr(NState::COMPLETE,25) );
+
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr( TimeSlot(10,0) ) );
+      task->addTime( ecf::TimeAttr( TimeSlot(11,0) ) );
+      task->addVerify( VerifyAttr(NState::COMPLETE,50) );     // task should complete 50 times
+
+      // cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_repeat_date_for_loop2.def"), errorMsg),errorMsg);
+}
+
+
+//BOOST_AUTO_TEST_CASE( test_single_from_file  )
+//{
+//   cout << "Simulator:: ...test_single_from_file\n";
+//
+////std::string path = File::test_data("CSim/test/data/good_defs/operations/loop.def","CSim");
+//   std::string path = File::test_data("CSim/test/data/good_defs/ECFLOW-130/radarlvl2.def","CSim");
+//
+//   Simulator simulator;
+//   std::string errorMsg;
+//   bool passed = simulator.run(path, errorMsg);
+//
+//   BOOST_REQUIRE_MESSAGE(passed, path << " failed simulation \n" << errorMsg);
+//}
+
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/CSim/test/TestTime.cpp b/ecflow_4_0_7/CSim/test/TestTime.cpp
new file mode 100644
index 0000000..62bcef6
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestTime.cpp
@@ -0,0 +1,380 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "Simulator.hpp"
+#include "File.hpp"
+#include "Log.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestUtil.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace fs = boost::filesystem;
+
+/// Simulate definition files that are created on then fly. This allows us to create
+/// tests with todays date/time this speeds up the testr, we can also validate
+/// Defs file, to check for correctness
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_time )
+{
+   cout << "Simulator:: ...test_time\n";
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite suite
+   //  clock real <todays date>
+   //	family family
+   //   	task t1
+   //      time <start>
+   //   endfamily
+   //endsuite
+
+   // Initialise clock with todays date  then create a time attribute + minutes
+   // such that the task should only run once, in the next minute
+   boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+   boost::posix_time::ptime   time_plus_minute =  theLocalTime +  minutes(1);
+
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_time");
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
+      task->addVerify( VerifyAttr(NState::COMPLETE,1) );  // expect task to complete 1 time
+
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_time.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_time_series )
+{
+   cout << "Simulator:: ...test_time_series\n";
+
+   //suite suite
+   //  clock real <sunday>
+   //	family family
+   //   	task t1
+   //       time 00:30 23:59 04:00  # should run 6 times 00:30 4:30 8:30 12:30 16:30 20:30
+   //  	endfamily
+   //endsuite
+
+   // Initialise real clock on a Moday, such that task should _only_ run
+   // on Monday since we are using a hybrid clock
+   Defs theDefs;
+   {
+      ClockAttr clockAttr(true/*false means use hybrid clock*/);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_time_series");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task = fam->add_task("t");
+      TimeSeries timeSeries(TimeSlot(00,30), TimeSlot(23,59), TimeSlot(4,0), false/* relative */);
+
+      task->addTime( TimeAttr( timeSeries ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,6) );  // expect task to complete 6 times
+
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_time_series.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_time_and_date )
+{
+   cout << "Simulator:: ...test_time_and_date\n";
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite suite
+   //  clock real <todays date>
+   //	family family
+   //   	task t1
+   //       date  <today date>
+   //       time <start>
+   //  	endfamily
+   //endsuite
+
+
+   Defs theDefs;
+   {
+      // Initialise clock with todays date  then create a time attribute + minutes
+      // such that the task should only run once, in the next minute
+      boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+      boost::gregorian::date todaysDate = theLocalTime.date();
+      boost::posix_time::ptime   time_plus_minute =  theLocalTime +  minutes(1);
+
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite_ptr suite = theDefs.add_suite("test_time_and_date");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task = fam->add_task("t");
+      task->addDate( DateAttr(todaysDate.day(),todaysDate.month(),todaysDate.year()) );
+      task->addTime( ecf::TimeAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
+      task->addVerify( VerifyAttr(NState::COMPLETE,1) );  // expect task to complete 1 time
+
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_time_and_date.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_time_and_tomorrows_date )
+{
+   cout << "Simulator:: ...test_time_and_tomorrows_date\n";
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite suite
+   //  clock real <tomorrows date>
+   // family family
+   //    task t1
+   //       date  <tomorrows date>
+   //       time <start>
+   //    endfamily
+   //endsuite
+
+
+   Defs theDefs;
+   {
+      // Initialise clock with todays date  then create a time attribute + minutes
+      // such that the task should only run once, in the next minute
+      boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+      boost::gregorian::date tomorrows_date = theLocalTime.date();
+      tomorrows_date += days(1);
+      boost::posix_time::ptime   time_plus_minute =  theLocalTime +  minutes(1);
+
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite_ptr suite = theDefs.add_suite("test_time_and_tomorrows_date");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task = fam->add_task("t");
+      task->addDate( DateAttr(tomorrows_date.day(),tomorrows_date.month(),tomorrows_date.year()) );
+      task->addTime( ecf::TimeAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
+      task->addVerify( VerifyAttr(NState::COMPLETE,1) );  // expect task to complete 1 time
+
+      //    cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_time_and_tomorrows_date.def"), errorMsg),errorMsg);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_multiple_times_and_dates )
+{
+   cout << "Simulator:: ...test_multiple_times_and_dates\n";
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite suite
+   //  clock real <todays date>
+   //	family family
+   //    repeat integer 0 1 1  # repeat twice
+   //   	task t1
+   //       date  <today date>
+   //       date  <tomrrows date>
+   //       time <start>
+   //       time <start>
+   //  	endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with todays date  then create a time attribute + minutes
+      // Note: we don't use:
+      //    boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+      // because if run at late we can end up with illegal for the hour, ie. > 24
+
+      boost::gregorian::date todaysDate(2009,2,10);
+      ptime theLocalTime(todaysDate, hours(3));
+      boost::gregorian::date tomarrows_date =  todaysDate + date_duration(1);
+      boost::posix_time::time_duration td_plus_minute  =  theLocalTime.time_of_day() +  minutes(1);
+      boost::posix_time::time_duration td_plus_hour    =  theLocalTime.time_of_day() +  hours(1);
+
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite_ptr suite = theDefs.add_suite("test_multiple_times_and_dates");
+      suite->addClock( clockAttr );
+
+
+      family_ptr fam = suite->add_family( "family" );
+      //fam->addRepeat( RepeatInteger("rep",0,1,1) );
+      task_ptr task = fam->add_task("t");
+      task->addDate( DateAttr(todaysDate.day(),todaysDate.month(),todaysDate.year()) );
+      task->addDate( DateAttr(tomarrows_date.day(),tomarrows_date.month(),tomarrows_date.year()) );
+      task->addTime( TimeAttr( TimeSlot(td_plus_minute) ));
+      task->addTime( TimeAttr( TimeSlot(td_plus_hour) ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,4) );  // expect task to complete 4 time
+
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_multiple_times_and_dates.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_multiple_times_and_dates_hybrid )
+{
+   cout << "Simulator:: ...test_multiple_times_and_dates_hybrid\n";
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite suite
+   //  clock hybrid <todays date>
+   //	family family
+   //   	task t1
+   //       date  <today date>
+   //       date  <tomrrows date>
+   //       time <start>
+   //       time <start>
+   //  	endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with todays date  then create a time attribute + minutes
+      // such that the task should only run once, in the next minute
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2012,2,22),time_duration(10,20,0));
+      boost::gregorian::date todaysDate = theLocalTime.date();
+      boost::gregorian::date tomorrows_date =  todaysDate + date_duration(1);
+      boost::posix_time::time_duration td_plus_minute  =  theLocalTime.time_of_day() +  minutes(1);
+      boost::posix_time::time_duration td_plus_10_minute  =  theLocalTime.time_of_day() +  minutes(10);
+
+      suite_ptr suite = theDefs.add_suite("test_multiple_times_and_dates_hybrid");
+      suite->addClock( ClockAttr(theLocalTime,true) ); // true means use hybrid clock
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addDate( DateAttr(todaysDate.day(),todaysDate.month(),todaysDate.year()) );
+      task->addDate( DateAttr(tomorrows_date.day(),tomorrows_date.month(),tomorrows_date.year()) );
+      task->addTime( TimeAttr( TimeSlot(td_plus_minute) ));
+      task->addTime( TimeAttr( TimeSlot(td_plus_10_minute) ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,2) );  // expect task to complete 2 time
+      //cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_multiple_times_and_dates_hybrid.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_multiple_times_and_days )
+{
+   cout << "Simulator:: ...test_multiple_times_and_days\n";
+
+   //suite suite
+   //  clock real <sunday>
+   //	family family
+   //    rep integer 0 1 1 # repeat twice
+   //   	task t1
+   //       day  monday
+   //       day  tuesday
+   //       time <start>
+   //       time <start>
+   //  	endfamily
+   //endsuite
+
+   // Initialise real clock on a sunday, such that task should run on Monday & tuesday twice
+   Defs theDefs;
+   {
+      ClockAttr clockAttr(false/*false means use real clock*/);
+      clockAttr.date(11,10,2009); // 11 October 2009 was a sunday
+      suite_ptr suite = theDefs.add_suite("test_multiple_times_and_days");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      //fam->addRepeat( RepeatInteger("rep",0,1,1) );
+      task_ptr task = fam->add_task("t");
+      task->addDay( DayAttr(DayAttr::MONDAY) );
+      task->addDay( DayAttr(DayAttr::TUESDAY) );
+      task->addTime( TimeAttr( TimeSlot(10,0) ));
+      task->addTime( TimeAttr( TimeSlot(20,0) ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,4) );  // expect task to complete 4 time
+
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_multiple_times_and_days.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_multiple_times_and_days_hybrid )
+{
+   cout << "Simulator:: ...test_multiple_times_and_days_hybrid\n";
+
+   //suite suite
+   //  clock real <sunday>
+   //	family family
+   //   	task t1
+   //       day  monday
+   //       day  tuesday
+   //       time <start>
+   //       time <start>
+   //  	endfamily
+   //endsuite
+
+   // Initialise real clock on a Monday, such that task should _only_ run
+   // on Monday since we are using a hybrid clock
+   Defs theDefs;
+   {
+      ClockAttr clockAttr(true/*false means use hybrid clock*/);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite_ptr suite = theDefs.add_suite("test_multiple_times_and_days_hybrid");
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addDay( DayAttr(DayAttr::MONDAY) );
+      task->addDay( DayAttr(DayAttr::TUESDAY) );
+      task->addTime( TimeAttr( TimeSlot(10,0) ));
+      task->addTime( TimeAttr( TimeSlot(11,0) ));
+      task->addTime( TimeAttr( TimeSlot(20,0) ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );  // expect task to complete 3 times
+
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_multiple_times_and_days_hybrid.def"), errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/CSim/test/TestToday.cpp b/ecflow_4_0_7/CSim/test/TestToday.cpp
new file mode 100644
index 0000000..186f62a
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestToday.cpp
@@ -0,0 +1,158 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "Simulator.hpp"
+#include "File.hpp"
+#include "Log.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestUtil.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace fs = boost::filesystem;
+
+/// Simulate definition files that are created on then fly. This allows us to create
+/// tests with todays date/time this speeds up the testr, we can also validate
+/// Defs file, to check for correctness
+
+BOOST_AUTO_TEST_SUITE( SimulatorTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_today )
+{
+   cout << "Simulator:: ...test_today\n";
+
+   //suite suite
+   //  clock real <fixed date>
+   //	family family
+   //   	task t1
+   //      	today <start>  # +1 minute
+   //      	today <start>  # +2 minute
+   //   endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock   then create a today attribute + minutes
+      // such that the task should only run once, in the next minute
+      ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(1,2,0));
+      boost::posix_time::ptime time_plus_minute =  theLocalTime +  minutes(1);
+      boost::posix_time::ptime time_plus_10_minute =  theLocalTime +  minutes(10);
+
+      suite_ptr suite =  theDefs.add_suite( "test_today" );
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task = fam->add_task( "t" );
+      task->addToday( ecf::TodayAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
+      task->addToday( ecf::TodayAttr( TimeSlot(time_plus_10_minute.time_of_day()) ) );
+      task->addVerify( VerifyAttr(NState::COMPLETE,2) );  // expect task to complete 2 time
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   bool result = simulator.run(theDefs, TestUtil::testDataLocation("test_today.def"), errorMsg);
+
+   BOOST_CHECK_MESSAGE(result,errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_today_time_series )
+{
+   cout << "Simulator:: ...test_today_time_series\n";
+
+   //suite suite
+   //  clock real <monday>
+   //	family family
+   //   	task t1
+   //         today 00:30 18:59 04:00  # should run 5 times 00:30 4:30 8:30 12:30 16:30
+   //   endfamily
+   //endsuite
+
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite( "test_today_time_series" );
+      ClockAttr clockAttr(true/*false means use hybrid clock*/);
+      clockAttr.date(12,10,2009); // 12 October 2009 was a Monday
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task =  fam->add_task( "t" );
+      TimeSeries timeSeries(TimeSlot(00,30), TimeSlot(18,59), TimeSlot(4,0), false/* relative */);
+
+      task->addToday( TodayAttr( timeSeries ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,5) );
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs, TestUtil::testDataLocation("test_today_time_series.def") , errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_today_time_and_date )
+{
+   cout << "Simulator:: ...test_today_time_and_date\n";
+
+   //suite suite
+   //  clock real <todays date>
+   //	family family
+   //   	task t1
+   //       date  <today date>
+   //       time  <start>
+   //       today <start>
+   //   endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Task will only run if all time dependencies are satisfied
+      boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+      boost::gregorian::date todaysDate = theLocalTime.date();
+      boost::posix_time::ptime   time_plus_minute =  theLocalTime +  minutes(1);
+
+      suite_ptr suite = theDefs.add_suite( "test_today_time_and_date" );
+      ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task = fam->add_task( "t" );
+      task->addDate( DateAttr(todaysDate.day(),todaysDate.month(),todaysDate.year()) );
+      task->addTime( ecf::TimeAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
+      task->addToday( ecf::TodayAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
+
+      task->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      //  	cout << theDefs << "\n";
+   }
+
+   Simulator simulator;
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_today_time_and_date.def"),errorMsg),errorMsg);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/CSim/test/TestUtil.cpp b/ecflow_4_0_7/CSim/test/TestUtil.cpp
new file mode 100644
index 0000000..66f746a
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestUtil.cpp
@@ -0,0 +1,28 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "TestUtil.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+
+std::string TestUtil::testDataLocation( const std::string& defsFile)
+{
+   std::string testData = File::test_data("CSim/test/data","CSim");
+
+	testData += "/";
+	testData += defsFile;
+	return testData;
+}
diff --git a/ecflow_4_0_7/CSim/test/TestUtil.hpp b/ecflow_4_0_7/CSim/test/TestUtil.hpp
new file mode 100644
index 0000000..92d222e
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/TestUtil.hpp
@@ -0,0 +1,36 @@
+#ifndef TESTUTIL_HPP_
+#define TESTUTIL_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <string>
+#include <map>
+#include "Defs.hpp"
+
+// This class provides a test harness for running defs file in a client server environment
+// To avoid Address in use errors, we can have client/server use a different port number
+// This is more important when doing instrumentation in HP-UX, as that can take a long time.
+//
+class TestUtil : private boost::noncopyable {
+public:
+
+
+	/// Returns the location of the defs file, such thats it in the test data area
+	static std::string testDataLocation( const std::string& defsFile);
+
+};
+#endif /* TESTUTIL_HPP_ */
diff --git a/ecflow_4_0_7/CSim/test/data/bad_defs/today.def b/ecflow_4_0_7/CSim/test/data/bad_defs/today.def
new file mode 100644
index 0000000..983487e
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/bad_defs/today.def
@@ -0,0 +1,6 @@
+suite suiteName
+   family familyName0
+   		today 15:00
+   		today 23:59 00:00  00:30     # start should be less than finish
+    endfamily
+endsuite
diff --git a/ecflow_4_0_7/CSim/test/data/bad_defs/xde.def b/ecflow_4_0_7/CSim/test/data/bad_defs/xde.def
new file mode 100644
index 0000000..a2dba98
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/bad_defs/xde.def
@@ -0,0 +1,8 @@
+#============================================================
+suite dfo
+  clock hybrid 0 # 09.10.2009 16:54
+endsuite
+suite dfi
+  clock hybrid 0 # 09.10.2009 16:54
+endsuite
+#============================================================
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/ECFLOW-130/radarlvl2.def b/ecflow_4_0_7/CSim/test/data/good_defs/ECFLOW-130/radarlvl2.def
new file mode 100644
index 0000000..06c5574
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/ECFLOW-130/radarlvl2.def
@@ -0,0 +1,24 @@
+# 4.0.3
+suite radarlvl2
+  clock real 1.1.2014  # need to define a date otherwise log file/verify content varies according to the time 
+  # repeat day 1
+  family prod
+    task jradar_level2_cleanup
+      time 00:10 21:10 03:00
+      verify complete:8
+    task jradar_reflectivity_mosaic
+      event release_mosaic
+      time 00:20 23:20 01:00
+      verify complete:24
+    task jradar_reflectivity_ref2grb
+      trigger /radarlvl2/prod/jradar_reflectivity_mosaic:release_mosaic
+      verify complete:24
+      time 00:20 23:20 01:00
+    task jradar_canrad
+      time 00:05 23:55 00:10
+      verify complete:144
+    task jradar_level2
+      time 00:10 23:55 00:15
+      verify complete:96
+  endfamily
+endsuite
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/SingleDefsTest/test.def b/ecflow_4_0_7/CSim/test/data/good_defs/SingleDefsTest/test.def
new file mode 100644
index 0000000..88fd4f8
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/SingleDefsTest/test.def
@@ -0,0 +1,8 @@
+   suite suite
+      clock hybrid 6.11.2009 +54190
+      family family
+         task t
+            verify complete:3
+            time +00:01 00:03 00:01
+      endfamily
+   endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron.def b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron.def
new file mode 100644
index 0000000..6e11493
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron.def
@@ -0,0 +1,10 @@
+suite cron
+                         # use real clock otherwise the date wont change
+   clock real 1.1.2006  # need to define a date otherwise log file content varies according to the time 
+   family cronFamily
+		task t
+  			 cron 10:00 20:00 01:00  
+  			 verify complete:11       # verify tasks complete 11 times. 		
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron2.def b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron2.def
new file mode 100644
index 0000000..2af3889
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron2.def
@@ -0,0 +1,10 @@
+suite cron2
+                         # use real clock otherwise the date wont change
+   clock real 1.10.2009  # need to define a date otherwise log file content varies according to the time 
+   family cronFamily
+		task t
+  			 cron -w 0,1 10:00  11:00 01:00          # run every Sunday & Monday at 10 and 11 am	
+  			 verify complete:4                      # task should complete 16 times	
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron3.def b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron3.def
new file mode 100644
index 0000000..85641e5
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron3.def
@@ -0,0 +1,10 @@
+suite cron3
+                         # use real clock otherwise the date wont change
+   clock real 1.1.2006  # need to define a date otherwise log file content varies according to the time 
+   family cronFamily
+		task t
+  			 cron -d 10,11,12   10:00 11:00 01:00   # run  10,11,12 of the month at 10am and 11 am		
+          verify complete:6                      # task should complete 16 times 
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron4.def b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron4.def
new file mode 100644
index 0000000..629f978
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron4.def
@@ -0,0 +1,10 @@
+suite cron4
+                         # use real clock otherwise the date wont change
+   clock real 1.1.2006  # need to define a date otherwise log file content varies according to the time 
+   family cronFamily
+		task t
+  			 cron -m 1   10:00 11:00 01:00   # run every day at 10 and 11 for Jan	
+  			 verify complete:62              # Jan has 31 days hence expect task completeion 62 times
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron5.def b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron5.def
new file mode 100644
index 0000000..6dc63d5
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron5.def
@@ -0,0 +1,10 @@
+suite cron5
+                         # use real clock otherwise the date wont change
+   clock real 1.10.2009  # need to define a date otherwise log file content varies according to the time 
+   family cronFamily
+		task t
+  			 cron -w 0  -m 10   10:00 11:00 01:00   # run every sunday in October at 10 and 11am
+  			 verify complete:8		                # 4 sundays in october hence expect 8 task completions
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron6.def b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron6.def
new file mode 100644
index 0000000..2dd3604
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron6.def
@@ -0,0 +1,10 @@
+suite cron6
+                         # use real clock otherwise the date wont change
+   clock real 1.1.2006  # need to define a date otherwise log file content varies according to the time 
+   family cronFamily
+		task t
+  			 cron -d 15,16  -m 1   10:00 11:00 01:00   # run 15,16 January at 10 and 11am	
+  			 verify complete:4	
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron7.def b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron7.def
new file mode 100644
index 0000000..8e47380
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/cron/cron7.def
@@ -0,0 +1,10 @@
+suite cron7
+                        # use real clock otherwise the date wont change
+   clock real 1.1.2013  # need to define a date otherwise log file content varies according to the time 
+   family cronFamily
+      task t
+          cron -d 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31  -m 1,2,3,4,5,6,7,8,9,10,11,12   10:00    # run every day for a year
+          verify complete:364  
+   endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/day/day.def b/ecflow_4_0_7/CSim/test/data/good_defs/day/day.def
new file mode 100644
index 0000000..a82f164
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/day/day.def
@@ -0,0 +1,12 @@
+suite suite
+ 	clock real 11.10.2009             # 11 october 2009 was a sunday, task x should hold for a day
+ 	family family
+ 	    verify complete:1        # family should complete once
+ 	   	task y
+ 	   	task x
+	  		trigger ./y == complete
+	  		time 01:00
+ 	        day monday
+ 	        verify complete:1        # task should complete once
+ 	endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/day/hybrid_day.def b/ecflow_4_0_7/CSim/test/data/good_defs/day/hybrid_day.def
new file mode 100644
index 0000000..de8904e
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/day/hybrid_day.def
@@ -0,0 +1,12 @@
+suite suite
+ 	clock hybrid 11.10.2009             # 11 october 2009 was a sunday, task x should complete on begin
+ 	family family
+ 	   	verify complete:1
+ 	   	task y
+ 	   		verify complete:1
+ 	   	task x
+	  		trigger ./y == complete
+ 	        day monday
+ 	   		verify complete:1
+ 	endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/today/today.def b/ecflow_4_0_7/CSim/test/data/good_defs/today/today.def
new file mode 100644
index 0000000..044ca11
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/today/today.def
@@ -0,0 +1,6 @@
+suite suiteName
+   clock real 1.10.2009  # need to define a date , otherwise we start at current time, and hence test will vary
+   task t1
+      today 15:00                   
+      verify complete:1  
+endsuite
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/today/today2.def b/ecflow_4_0_7/CSim/test/data/good_defs/today/today2.def
new file mode 100644
index 0000000..48d1891
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/today/today2.def
@@ -0,0 +1,15 @@
+suite s1
+   clock real 1.10.2009  # need to define a date , otherwise we start at current time, and hence test will vary
+   task t1                   
+      today 20:00                         
+      verify complete:1
+   task t2
+      today 15:00            
+      today 16:00                         
+      today 17:00                         
+      today 18:00                         
+      today 19:00                         
+      today 20:00                         
+      verify complete:6
+endsuite
+
diff --git a/ecflow_4_0_7/CSim/test/data/good_defs/today/today_range.def b/ecflow_4_0_7/CSim/test/data/good_defs/today/today_range.def
new file mode 100644
index 0000000..313f19a
--- /dev/null
+++ b/ecflow_4_0_7/CSim/test/data/good_defs/today/today_range.def
@@ -0,0 +1,13 @@
+suite suiteName
+   clock real 1.10.2009  # need to define a date , otherwise we start at current time, and hence test will vary
+   task t1
+      today 10:00 11:00 01:00
+      verify complete:2     
+   task t2
+      today 10:00 11:00 00:30
+      verify complete:3    
+   task t3
+      today 09:00
+      today 10:00 11:00 00:30
+      verify complete:4   
+endsuite
diff --git a/ecflow_4_0_7/Client/.gitignore b/ecflow_4_0_7/Client/.gitignore
new file mode 100644
index 0000000..51790cb
--- /dev/null
+++ b/ecflow_4_0_7/Client/.gitignore
@@ -0,0 +1 @@
+/gnuplot.script
diff --git a/ecflow_4_0_7/Client/CMakeLists.txt b/ecflow_4_0_7/Client/CMakeLists.txt
new file mode 100644
index 0000000..288cc3e
--- /dev/null
+++ b/ecflow_4_0_7/Client/CMakeLists.txt
@@ -0,0 +1,125 @@
+ # =======================================================
+ # LIB
+ # to list all sources to build use:
+ #    cd $WK/Base
+ #    find src -name \*.cpp --print
+ # =======================================================
+ 
+ # Excludes src/ClientMain.cpp
+list( APPEND srcs
+   src/Rtt.cpp
+   src/ClientEnvironment.cpp
+   src/ClientInvoker.cpp
+   src/Rtt.cpp
+   src/ClientOptions.cpp
+   src/UrlCmd.cpp
+)
+ecbuild_add_library( TARGET libclient
+                     NOINSTALL
+                   TYPE     STATIC
+                   SOURCES  ${srcs}
+                   LIBS     base libparser node nodeattr core 
+                            pthread
+                   INCLUDES src
+                            ../ACore/src 
+                            ../ANattr/src
+                            ../ANode/src
+                            ../AParser/src
+                            ../Base/src
+                            ../Base/src/cts
+                            ../Base/src/stc
+                )
+
+# ========================================================================
+# EXE ecflow_client
+ecbuild_add_executable( TARGET   ecflow_client
+                        SOURCES  src/ClientMain.cpp
+                        LIBS     libclient 
+                        INCLUDES ${Boost_INCLUDE_DIRS} 
+                      )
+   
+# Override default behaviour that add RPATHS during install
+# The only thing that seem to work is set INSTALL_RPATH to ""
+# Using SKIP_BUILD_RPATH,BUILD_WITH_INSTALL_RPATH,INSTALL_RPATH_USE_LINK_PATH
+# had no effect
+#          
+SET_TARGET_PROPERTIES(ecflow_client PROPERTIES 
+                                    INSTALL_RPATH ""
+                     )
+                         
+# use, i.e. don't skip the full RPATH for the build tree
+#SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
+
+# when building, don't use the install RPATH already
+# (but later on when installing)
+#SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
+
+# the RPATH to be used when installing
+#SET(CMAKE_INSTALL_RPATH "")
+
+# don't add the automatically determined parts of the RPATH
+# which point to directories outside the build tree to the install RPATH
+#SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
+
+
+# ================================================================================                         
+# TEST
+# Use following to populate list: 
+#  cd $WK/Client                            
+#  find test -name \*.cpp | sort                   
+list( APPEND test_srcs
+ test/SCPort.cpp
+ test/TestCheckPtDefsCmd.cpp
+ test/TestClientEnvironment.cpp
+ test/TestClientInterface.cpp
+ test/TestClientInvoker.cpp
+ test/TestClientTimeout.cpp
+ test/TestGroupCmd.cpp
+ test/TestJobGenOnly.cpp
+ test/TestLifeCycle.cpp
+ test/TestLoadDefsCmd.cpp
+ test/TestPlugCmd.cpp
+ test/TestRtt.cpp
+ test/TestServer.cpp
+ test/TestServerAndLifeCycle.cpp
+ test/TestSignalSIGTERM.cpp
+ test/TestUrlCmd.cpp
+ test/TestWhiteListFile.cpp
+)
+ecbuild_add_test( TARGET    s_client
+                  BOOST
+                  SOURCES   ${test_srcs}
+                  LIBS      libclient 
+                  INCLUDES  ../ANode/test
+                            ../Base/test 
+                  TEST_DEPENDS u_base
+                 )
+
+# 
+# Simple stand alone test
+#
+ecbuild_add_test( TARGET   perf_test_large_defs 
+                  BOOST
+                  SOURCES  test/TestSinglePerf.cpp test/SCPort.cpp
+                  LIBS     libclient 
+                  INCLUDES ../ANode/test
+                           ../Base/test 
+                  TEST_DEPENDS u_base
+                )
+               
+# 
+# test migration
+#
+ecbuild_add_test( TARGET test_migration
+                  BOOST
+                  SOURCES  test/TestMigration.cpp test/SCPort.cpp
+                  LIBS     libclient 
+                  INCLUDES ../ANode/test
+                           ../Base/test 
+                  TEST_DEPENDS u_base
+                )
+
+# ===================================================================
+# install
+# ===================================================================
+install (TARGETS ecflow_client DESTINATION bin)
diff --git a/ecflow_4_0_7/Client/Jamfile.jam b/ecflow_4_0_7/Client/Jamfile.jam
new file mode 100644
index 0000000..a20261d
--- /dev/null
+++ b/ecflow_4_0_7/Client/Jamfile.jam
@@ -0,0 +1,137 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Client
+#
+project theClient ;
+
+use-project theCore      : ../ACore ;
+use-project theNodeAttr  : ../ANattr ;
+use-project theNode      : ../ANode ;
+use-project theParser    : ../AParser ;
+use-project theBase      : ../Base ;
+
+#
+# This should be in the site-config.jam file as a project wide requirement
+# however if this is done, it will not link since, lpthread appears twice
+# on the link line
+#
+lib pthread  ;
+
+#
+# define DEBUG_CLIENT for additional debug
+#
+# Having a library avoid compile objects shared between client and test having
+# differing compilation properties
+#
+# Exclude ClientMain.cpp from the library.
+#
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+#
+lib libclient : [ glob src/*.cpp : src/*Main.cpp ]
+              : <include>../ACore/src
+                <include>../ANattr/src 
+                <include>../ANode/src 
+                <include>../Base/src 
+                <include>../AParser/src 
+                <include>../Client/src
+                <variant>debug:<define>DEBUG
+                <link>static
+                <use>/theCore//core
+                <use>/theNode//node
+                <use>/theParser//libparser
+                <use>/theBase//base
+            	<use>/site-config//boost_system
+             	<use>/site-config//boost_serialization
+             	<use>/site-config//boost_filesystem
+             	<use>/site-config//boost_program_options
+             	<use>/site-config//boost_datetime
+         :  
+         : <include>../Client/src         
+         ;               
+         
+#
+# client. This Just pulls in src/ClientMain.cpp
+#
+exe ecflow_client : [ glob src/*Main.cpp ]
+             /theCore//core
+             /theNodeAttr//nodeattr
+             /theNode//node
+             /theParser//libparser
+             /theBase//base
+             libclient
+             /site-config//boost_system
+             /site-config//boost_serialization
+             /site-config//boost_filesystem
+             /site-config//boost_program_options
+             /site-config//boost_datetime
+	         pthread
+           : <variant>debug:<define>DEBUG
+           ;
+ 
+#
+# Tests for client. All test source code, by pulling in libclient we avoid 
+# linking with ClientMain.cpp
+#
+exe s_client : [ glob test/*.cpp : test/TestSinglePerf.cpp test/TestMigration.cpp ]  
+	       pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           /theBase//base
+           libclient
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_program_options
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../ANode/test 
+           <include>../Base/test 
+           <variant>debug:<define>DEBUG
+	     ;
+	     
+exe perf_test_large_defs : [ glob test/TestSinglePerf.cpp  ]   [ glob test/SCPort.cpp  ]
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           /theBase//base
+           libclient
+           pthread
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_program_options
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../ANode/test 
+           <include>../Base/test 
+           <variant>debug:<define>DEBUG
+         ;
+         
+exe test_migration : [ glob test/TestMigration.cpp  ]   [ glob test/SCPort.cpp  ]
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           /theBase//base
+           libclient
+           pthread
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_program_options
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../ANode/test 
+           <include>../Base/test 
+           <variant>debug:<define>DEBUG
+         ;
\ No newline at end of file
diff --git a/ecflow_4_0_7/Client/doc/config_file.doc b/ecflow_4_0_7/Client/doc/config_file.doc
new file mode 100644
index 0000000..fbbfd35
--- /dev/null
+++ b/ecflow_4_0_7/Client/doc/config_file.doc
@@ -0,0 +1,63 @@
+// This file gives an example of how to load
+// a config file using boost program options.
+// This was originally use in test, without having to
+// specify enviroment variables.
+
+
+#include <boost/program_options.hpp>
+namespace po = boost::program_options;
+
+void ClientEnvironment::read_config_file()
+{
+#ifdef DEBUG_ENVIRONMENT
+   std::cout << "ClientEnvironment::read_config_file() no_ecf_ = " << no_ecf_ << "\n";
+#endif
+
+   try {
+      std::string host,port,constructor_supplied_host_file;
+      // use config to discover, the hosts file, otherwise use the host file provided in the constructor
+      if (!host_file_.empty()) {
+         constructor_supplied_host_file = host_file_;
+      }
+
+      // read the environment from the config file
+      po::options_description config_file_options("Configuration");
+      config_file_options.add_options()
+      ("ECF_NODE", po::value<std::string>(&host)->default_value(Str::LOCALHOST()), "The host name")
+      ("ECF_NAME", po::value<std::string>(&task_path_) ,       "Full name of task")
+      ("ECF_PASS", po::value<std::string>(&jobs_password_)->default_value(""),    "The jobs password")
+      ("ECF_TRYNO", po::value<int>(&task_try_num_), "The task try number")
+      ("ECF_HOSTFILE", po::value<std::string>(&host_file_), "File that lists alternate hosts")
+      ("ECF_TIMEOUT", po::value<long>(&timeout_)->default_value(MIN_TIMEOUT), "Max time in seconds for client to deliver message")
+      ("ECF_DENIED", po::value<bool>(&denied_)->default_value(false) , "If set ECF denies access, client will exit with failure")
+      ("ECF_PORT", po::value<std::string>(&port)->default_value(Str::DEFAULT_PORT_NUMBER()), "The TCP/IP port to call")
+      ("NO_ECF", po::value<bool>(&no_ecf_)->default_value("false"), " if defined then abort cmd")
+        ;
+
+      std::string path = File::test_data("environment.cfg","Client");
+
+
+      ifstream ifs(path.c_str());
+      if (ifs) {
+         po::variables_map vm;
+         po::store(parse_config_file(ifs, config_file_options), vm);
+         po::notify( vm);
+      }
+
+      /// Overwrite the host file read from the config file, since we need to use
+      /// host file supplied via the constructor
+      if (!constructor_supplied_host_file.empty()) {
+         host_file_ = constructor_supplied_host_file;
+      }
+
+      // Add the ECF_NODE host into list of hosts
+      if (!host.empty()) {
+         if (port.empty()) host_vec_.push_back(std::make_pair(host,Str::DEFAULT_PORT_NUMBER()));
+         else              host_vec_.push_back(std::make_pair(host,port));
+      }
+   }
+    catch(std::exception& e)
+    {
+         cerr << "ClientEnvironment::read_config_file() " <<  e.what() << "\n";
+    }
+}
\ No newline at end of file
diff --git a/ecflow_4_0_7/Client/doc/environment.cfg b/ecflow_4_0_7/Client/doc/environment.cfg
new file mode 100644
index 0000000..6f49158
--- /dev/null
+++ b/ecflow_4_0_7/Client/doc/environment.cfg
@@ -0,0 +1,68 @@
+#
+# This file acts as a stand in for the client enviroment
+# In a real client we will obtain the environment via  Enviroment variables
+# how for testing puposes we will define here.
+#
+
+#
+# The name of machine on which the ECF server is running. It was *this* server that
+# sent the job.
+#
+ECF_NODE = localhost
+
+
+#
+# The path name to the node in the server.
+# **********************************************************************************
+# For Test purposes if this does not correspond to the loaded Defs tree it will fail.
+# ***********************************************************************************
+#
+ECF_NAME = /aSuit/aFam/aTask
+
+#
+# When a server submits a task, it generates a unique password. This is
+# used by the client to authenticate any messaged sent back to the server
+# For the moment we will just choose a name like process.
+# **********************************************************************
+# For *test* purposes this should be same as Submittable::DUMMY_JOBS_PASSWORD
+# If this variable is NOT set we ignore the request. 
+# Shorted from DummyJobsPassword to _DJP_ to save on bytes
+# ***********************************************************************
+#
+ECF_PASS = _DJP_ 
+
+#
+#  The number of times we should submitted a job, if it is aborted.
+#
+ECF_TRYNO = 3
+
+#
+# This file lists all the alternate host names, that should be tried if client can not
+# communicate with ECF_NODE host. If the files does exist or can not be opened we continue
+# connection to ECF_NODE. The port number must be the same as the job supplied port number
+#
+ECF_HOSTFILE = ecf_hostsfile
+
+#
+# This variable controls for how long child commands continue trying to connect to Server before failing.
+# Maximum time in seconds for client to deliver message to server/servers. This is
+# typically 24 hours in a real environment. It is this long to allow operators to
+# recover from any crashes.
+#
+ECF_TIMEOUT = 20
+
+#
+# If set to 1 and ECF denies access, the client will exit with failure
+#
+ECF_DENIED = 0
+
+#
+# The TCP/IP port on the server to call
+#
+ECF_PORT = 3141
+
+#
+# If this value is set we abort immediately with a valid return
+#
+NO_ECF = 0
+
diff --git a/ecflow_4_0_7/Client/ecf_hostsfile b/ecflow_4_0_7/Client/ecf_hostsfile
new file mode 100644
index 0000000..ce03e0b
--- /dev/null
+++ b/ecflow_4_0_7/Client/ecf_hostsfile
@@ -0,0 +1,9 @@
+
+host1:3142
+host2:3143
+
+host3
+
+host4:3147
+
+host5
diff --git a/ecflow_4_0_7/Client/src/ClientEnvironment.cpp b/ecflow_4_0_7/Client/src/ClientEnvironment.cpp
new file mode 100644
index 0000000..8884522
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/ClientEnvironment.cpp
@@ -0,0 +1,391 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : ClientEnvironment
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <stdlib.h> // for getenv()
+
+#include "boost/foreach.hpp"
+
+#include "ClientEnvironment.hpp"
+#include "ClientToServerCmd.hpp"
+#include "File.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "boost_archive.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+
+// Provide upper and lower bounds for timeouts
+/// The timeout is used control for how long we continue to iterate over the hosts
+/// attempting to connect to the servers.
+#ifdef DEBUG
+#define MAX_TIMEOUT        120     // Max time in seconds for client to deliver message
+#define MIN_TIMEOUT          5     // Some reasonable value
+#else
+#define MAX_TIMEOUT    24*3600     // We don't try forever, only 24 hours
+#define MIN_TIMEOUT      10*60     // Some reasonable value
+#endif
+
+//#define DEBUG_ENVIRONMENT 1
+
+template<class T>
+ostream& operator<<(ostream& os, const vector<T>& v)
+{
+    copy(v.begin(), v.end(), ostream_iterator<T>(cout, "\n"));
+    return os;
+}
+
+
+ClientEnvironment::ClientEnvironment()
+: AbstractClientEnv(),
+  task_try_num_(1),timeout_(MAX_TIMEOUT),connect_timeout_(0),
+  denied_(false),no_ecf_(false), debug_(false),under_test_(false),
+  host_file_read_(false),
+  host_vec_index_(0),
+  allow_new_client_old_server_(0)
+{
+	init();
+}
+
+// test constructor
+ClientEnvironment::ClientEnvironment(const std::string& hostFile, const std::string& host, const std::string& port)
+: AbstractClientEnv(),
+  task_try_num_(1),timeout_(MAX_TIMEOUT),connect_timeout_(0),
+  denied_(false),no_ecf_(false), debug_(false),under_test_(false),
+  host_file_read_(false),
+  host_vec_index_(0),
+  allow_new_client_old_server_(0)
+{
+	init();
+
+	/// The host file passed in takes *precedence* over ECF_HOSTFILE environment variable read in init()
+	host_file_ = hostFile;
+
+	/// Override config, and environment.
+	if (!host.empty()) {
+	   host_vec_.clear();
+	   host_vec_.push_back(std::make_pair(host,port));
+	}
+}
+
+void ClientEnvironment::init()
+{
+	read_environment_variables();
+#ifdef DEBUG_ENVIRONMENT
+	std::cout << toString() << std::endl;
+#endif
+
+	// If no host specified default to local host and default port number
+	if (host_vec_.empty())
+		host_vec_.push_back(std::make_pair(Str::LOCALHOST(),Str::DEFAULT_PORT_NUMBER()));
+
+	// Program option are read in last, and will override any previous setting
+	// However program option are delayed until later. See notes in header
+	if (debug_) std::cout << toString() << "\n";
+}
+
+bool ClientEnvironment::get_next_host(std::string& errorMsg)
+{
+	if (debug_) cout << "ClientEnvironment::get_next_host() host_file_read_ = " << host_file_read_ << " host_file_ = " << host_file_ << "\n";
+	if (!host_file_read_ && !host_file_.empty()) {
+
+		if (!parseHostsFile(errorMsg)) {
+			return false;
+		}
+		host_file_read_ = true;
+		// SKIP OVER THE FIRST HOST, hence both paths need to increment host_vec_index_
+	}
+
+ 	host_vec_index_++;
+	if (host_vec_index_ >= static_cast<int>(host_vec_.size())) {
+		host_vec_index_ = 0;
+	}
+
+	return true;
+}
+
+// AbstractClientEnv functions: ============================================================================
+const std::string& ClientEnvironment::host() const
+{
+#ifdef DEBUG_ENVIRONMENT
+// cout << "ClientEnvironment::host()  host_vec_index_ = " << host_vec_index_
+//      << " host_vec_[host_vec_index_] = " << host_vec_[host_vec_index_] << "\n";
+#endif
+   assert( host_vec_index_ >=0 && host_vec_index_ <  static_cast<int>(host_vec_.size()));
+   return host_vec_[host_vec_index_].first;
+}
+
+const std::string& ClientEnvironment::port() const
+{
+   assert( host_vec_index_ >=0 && host_vec_index_ <  static_cast<int>(host_vec_.size()));
+   return host_vec_[host_vec_index_].second;
+}
+
+void ClientEnvironment::set_host_port(const std::string& the_host, const std::string& the_port)
+{
+   if (the_host.empty()) throw std::runtime_error("ClientEnvironment::set_host_port: Empty host specified ?");
+   if (the_port.empty()) throw std::runtime_error("ClientEnvironment::set_host_port: Empty port specified ?");
+   try { boost::lexical_cast<int>(the_port); }
+   catch ( boost::bad_lexical_cast& e) {
+      throw std::runtime_error("ClientEnvironment::set_host_port: Invalid port number " + the_port);
+   }
+
+   // Override default
+   host_vec_.clear();
+
+   // make sure there only one host:port in host_vec_
+   host_vec_.push_back(std::make_pair(the_host,the_port));
+
+   // Make sure we don't look in hosts file.
+   // When there is only one host:port in host_vec_, calling get_next_host() will always return host_vec_[0]
+   host_file_read_ = true;
+
+   // Update 'int allow_new_client_old_server_' *IF* ECF_ALLOW_NEW_CLIENT_OLD_SERVER set, and matches input host/port
+   update_allow_new_client_old_server(the_host,the_port);
+}
+
+bool ClientEnvironment::checkTaskPathAndPassword(std::string& errorMsg) const
+{
+	if ( task_path_.empty() ) {
+		errorMsg =  "No task path specified for ECF_NAME \n";
+		return false;
+	}
+	if ( jobs_password_.empty() ) {
+		errorMsg = "No jobs password specified for ECF_PASS \n";
+		return false;
+	}
+	return true;
+}
+
+std::string ClientEnvironment::toString() const
+{
+	std::stringstream ss;
+	if (host_vec_.empty()) ss << "\n   ECF_NODE =\n   ";
+	else  {
+		ss << "\n   ECF_NODE : host_vec_index_ = " << host_vec_index_ << " host_vec_.size() = " << host_vec_.size() << "\n";
+		std::pair<std::string,std::string> i;
+		BOOST_FOREACH(i, host_vec_) { ss << "   " << i.first << Str::COLON() << i.second << "\n";}
+  	}
+	ss << "   ECF_NAME = " << task_path_ << "\n";
+	ss << "   ECF_PASS = " << jobs_password_ << "\n";
+	ss << "   ECF_RID = " << remote_id_ << "\n";
+ 	ss << "   ECF_TRYNO = " << task_try_num_ << "\n";
+	ss << "   ECF_HOSTFILE = " << host_file_ << "\n";
+   ss << "   ECF_TIMEOUT = " << timeout_ << "\n";
+   ss << "   ECF_CONNECT_TIMEOUT = " << connect_timeout_ << "\n";
+	ss << "   ECF_DENIED = " << denied_ << "\n";
+	assert( host_vec_index_ >=0 && host_vec_index_ <  static_cast<int>(host_vec_.size()));
+	if (host_vec_.empty())  ss << "   ECF_PORT =  \n";
+	else                    ss << "   ECF_PORT = " <<  host_vec_[host_vec_index_].second << "\n";
+	ss << "   NO_ECF = " << no_ecf_ << "\n";
+	for(size_t i = 0; i < env_.size(); i++) {
+		ss << "   " << env_[i].first << " = " << env_[i].second << "\n";
+	}
+   ss << "   ECF_ALLOW_NEW_CLIENT_OLD_SERVER = " << env_ecf_new_client_old_server_ << "\n";
+   ss << "   allow_new_client_old_server_ = " << allow_new_client_old_server_ << "\n";
+
+   ss << "   ECF_DEBUG_CLIENT = " << debug_ << "\n";
+	return ss.str();
+}
+
+std::string ClientEnvironment::hostSpecified()
+{
+	char* theEnv = getenv(Str::ECF_NODE().c_str());
+	if (theEnv) {
+		return std::string(theEnv);
+ 	}
+	return std::string();
+}
+
+std::string ClientEnvironment::portSpecified()
+{
+	char* theEnv = getenv(Str::ECF_PORT().c_str());
+	if (theEnv) {
+		return std::string(theEnv);
+ 	}
+	return Str::DEFAULT_PORT_NUMBER();
+}
+
+
+void ClientEnvironment::read_environment_variables()
+{
+#ifdef DEBUG_ENVIRONMENT
+	std::cout << "ClientEnvironment::read_environment_variables()\n";
+#endif
+
+	if (getenv(Str::ECF_NAME().c_str())) task_path_ = getenv(Str::ECF_NAME().c_str());
+	if (getenv(Str::ECF_PASS().c_str())) jobs_password_ = getenv(Str::ECF_PASS().c_str());
+ 	if (getenv(Str::ECF_TRYNO().c_str()))  task_try_num_ = atoi(getenv(Str::ECF_TRYNO().c_str()));
+	if (getenv("ECF_HOSTFILE")) host_file_ = getenv("ECF_HOSTFILE");
+	if (getenv(Str::ECF_RID().c_str())) remote_id_ = getenv(Str::ECF_RID().c_str());
+
+	if (getenv("ECF_TIMEOUT"))  timeout_ = atoi(getenv("ECF_TIMEOUT"));  // host file timeout
+	if( timeout_ > MAX_TIMEOUT ) timeout_ = MAX_TIMEOUT;
+	if( timeout_ < MIN_TIMEOUT )  timeout_ = MIN_TIMEOUT;
+
+   if (getenv("ECF_CONNECT_TIMEOUT"))  connect_timeout_ = atoi(getenv("ECF_CONNECT_TIMEOUT")); // for test only
+
+	if (getenv("ECF_DENIED")) denied_ = true;
+	if (getenv("NO_ECF")) no_ecf_ = true;
+	if (getenv("ECF_DEBUG_CLIENT")) debug_ = true;
+
+   char *debug_level = getenv("ECF_DEBUG_LEVEL");
+   if (debug_level) {
+      try { Ecf::set_debug_level(boost::lexical_cast<unsigned int>(debug_level)); }
+      catch (...) { throw std::runtime_error("The environment variable ECF_DEBUG_LEVEL must be an unsigned integer."); }
+   }
+
+	/// Override the config settings *IF* any
+ 	std::string port = Str::DEFAULT_PORT_NUMBER();
+ 	std::string host = Str::LOCALHOST();
+ 	if (!host_vec_.empty()) {
+		host = host_vec_[0].first;  //  first entry is the config host
+		port = host_vec_[0].second; //  first entry is the config port
+ 	}
+
+  	if (getenv(Str::ECF_PORT().c_str())) {
+		port = getenv(Str::ECF_PORT().c_str());
+		host_vec_.clear(); // remove config settings, net effect is overriding
+ 		host_vec_.push_back(std::make_pair(host,port));
+	}
+
+	// Add the ECF_NODE host into list of hosts. Make sure its first in host_vec_
+	// as we want environment setting to take priority.
+ 	string env_host = hostSpecified();
+	if (!env_host.empty()) {
+	   host = env_host;
+		host_vec_.clear(); // remove previous setting if any
+ 		host_vec_.push_back(std::make_pair(host,port));
+	}
+
+	if (getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")) {
+	   env_ecf_new_client_old_server_ = getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER");
+	   update_allow_new_client_old_server(host,port);
+	}
+}
+
+
+static std::string ecf_allow_new_client_old_server_error_msg(const std::string& env)
+{
+   int current_archive_version = ecf::boost_archive::version();
+   int previous_archive_version = current_archive_version -1;
+   std::stringstream ss;
+   ss << "\nFound environment variable ECF_ALLOW_NEW_CLIENT_OLD_SERVER=" << env << "\n";
+   ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER must have one of the formats:\n";
+   ss << "   ECF_ALLOW_NEW_CLIENT_OLD_SERVER=<int>\n";
+   ss << "   ECF_ALLOW_NEW_CLIENT_OLD_SERVER=<host>:<port>:<int>,<host>:<port>:<int>,<host>:<port>:<int>\n";
+   ss << "Where <int> represents the archive version of the server. i.e the old server\n";
+   ss << "i.e. export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=" << previous_archive_version << "\n";
+   ss << "or   export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=host1:3142:" << previous_archive_version << ",localhost:3142:" << previous_archive_version << "\n";
+   ss << "Please ensure host/port of the server you want connect too, is on the list";
+   return ss.str();
+}
+
+void ClientEnvironment::update_allow_new_client_old_server(const std::string& host, const std::string& port)
+{
+   // If we update host/port via command line, we need to update this again.
+   // cout << "ClientEnvironment::update_allow_new_client_old_server:  host:" << host << " port:" << port << " env=" << env_ecf_new_client_old_server_ << "\n";
+
+   // In the viewer context, we can have multiple clients, some where client <-> server is compatible , others which are not:
+   // To allow for this, we expect following syntax:
+   //    option 1/ export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=<int>
+   //    option 2/ export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=<host>:<port>:<int>,<host>:<port>:<int>,<host>:<port>:<int>
+   // Where <int> represents the archive version of the server. i.e the old server.
+   // Only if the host/port matches in in our list do we update allow_new_client_old_server_
+   //
+   if (!env_ecf_new_client_old_server_.empty()) {
+      try {
+         // option 1:
+         allow_new_client_old_server_ = boost::lexical_cast<int>(env_ecf_new_client_old_server_);
+      }
+      catch (...) {
+         // cout << "option 2: Match the archive referring to *this* host/port specified.\n";
+         std::vector<std::string> list;
+         Str::split(env_ecf_new_client_old_server_,list,",");
+         if (list.empty())  throw std::runtime_error(ecf_allow_new_client_old_server_error_msg(env_ecf_new_client_old_server_));
+         // Find our host/port in the list:
+         for(size_t i = 0; i < list.size(); ++i) {
+            std::vector<std::string> host_port_archive;
+            Str::split( list[i], host_port_archive, ":");
+            if (host_port_archive.size() == 3) {
+               // cout << host_port_archive[0] << ":" << host_port_archive[1] << ":" << host_port_archive[2] << "\n";
+               if (host_port_archive[0] == host && host_port_archive[1] == port) {
+                  try { allow_new_client_old_server_ = boost::lexical_cast<int>(host_port_archive[2]); break;}
+                  catch (...) { throw std::runtime_error(ecf_allow_new_client_old_server_error_msg(env_ecf_new_client_old_server_));}
+               }
+            }
+            else { throw std::runtime_error(ecf_allow_new_client_old_server_error_msg(env_ecf_new_client_old_server_));}
+         }
+      }
+   }
+}
+
+
+bool ClientEnvironment::parseHostsFile(std::string& errorMsg)
+{
+	std::vector<std::string> lines;
+	if (!File::splitFileIntoLines(host_file_,lines,true /*IGNORE EMPTY LINES*/)) {
+		std::stringstream ss; ss << "ClientEnvironment:: Could not open the hosts file " << host_file_;
+		errorMsg += ss.str();
+		return false;
+	}
+
+	// The Home server and port should be at index 0.
+	std::string job_supplied_port = Str::DEFAULT_PORT_NUMBER();
+	if ( !host_vec_.empty() ) job_supplied_port =  host_vec_[0].second;
+
+	// Each line should have the format: We only read in the first token.
+	//       host        # comment
+	//       host:port   # another comment
+	// If no port is specified we default to port read in from the environment
+	// if that was not specified we default to Str::DEFAULT_PORT_NUMBER()
+	std::vector<std::string>::iterator theEnd = lines.end();
+	for(std::vector<std::string>::iterator i = lines.begin(); i!= theEnd; ++i) {
+
+		std::vector< std::string > tokens;
+		Str::split((*i),tokens);
+		if (tokens.empty()) continue;
+ 		if (tokens[0][0] == '#') {
+//			std::cout << "Ignoring line:'" << *i << "'\n";
+ 			continue;
+ 		}
+
+ 		std::string theBackupHost;
+	 	std::string thePort;
+
+		size_t colonPos = tokens[0].find_first_of(':');
+		if (colonPos == string::npos) {
+		   // When the port is *NOT* specified, we must use the job supplied port.
+		   // i.e. the one read in from the environment
+			theBackupHost = tokens[0];
+		 	thePort = job_supplied_port;
+//			std::cout << "Host = " << theBackupHost << " Port is  " << thePort << "\n";
+ 		}
+		else {
+			theBackupHost = tokens[0].substr(0,colonPos);
+			thePort = tokens[0].substr(colonPos+1);
+//			std::cout << "Host = " << theBackupHost << " Port is specified " << thePort << "\n";
+		}
+
+		// std::cout << "Host = " << theBackupHost << "  " << thePort << "\n";
+		host_vec_.push_back(std::make_pair(theBackupHost,thePort));
+	}
+
+	return true;
+}
diff --git a/ecflow_4_0_7/Client/src/ClientEnvironment.hpp b/ecflow_4_0_7/Client/src/ClientEnvironment.hpp
new file mode 100644
index 0000000..b2bb070
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/ClientEnvironment.hpp
@@ -0,0 +1,150 @@
+#ifndef CLIENT_ENVIRONMENT_HPP_
+#define CLIENT_ENVIRONMENT_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : ClientEnvironment
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "AbstractClientEnv.hpp"
+
+class ClientEnvironment : public AbstractClientEnv {
+public:
+	/// The constructor will load the environment
+	ClientEnvironment();
+
+	/// This constructor is only used in Test environment, as it allow the host file to be set
+	ClientEnvironment(const std::string& hostFile, const std::string& host = "", const std::string& port = "");
+
+	/// Forward compatibility allow new client to talk to old server
+	/// Only applies when return value is non zero, in which case, it will return
+	/// the boost archive version of the old server
+	/// For the command line this is read from ECF_ALLOW_NEW_CLIENT_OLD_SERVER
+	int allow_new_client_old_server() const { return allow_new_client_old_server_;}
+	void allow_new_client_old_server(int boost_archive_version) { allow_new_client_old_server_ = boost_archive_version;}
+
+   /// This controls for how long child commands continue trying to connect to Server before failing.
+	/// Maximum time in seconds for client to deliver message to server/servers. This is
+	/// typically 24 hours in a real environment. It is this long to allow operators to
+	/// recover from any crashes.
+	/// for the CHILD/task commands *ONLY*
+	/// Can be overriden by  changing environment variable ECF_TIMEOUT
+	long max_child_cmd_timeout() const  { return timeout_; }
+
+	/// Allow pur python jobs to override the ECF_TIMEOUT
+	void set_child_cmd_timeout(unsigned int t) { timeout_ = t; }
+
+   /// The timeout feature allow the client to fail gracefully in the case
+   /// where the server has died/crashed. The timeout will ensure the socket is closed.
+   /// allowing the server to be restarted without getting the address is use error.
+   /// Set the timeout for each client->server communication:
+   //    connect        : timeout_ second
+   //    send request   : timeout_ second
+   //    receive reply  : timeout_ second
+   // default is 0 second, which means take the timeout from the command/request
+	// The default can be overridden with ECF_CONNECT_TIMEOUT.
+	// This is useful when running valgrind --tool=callgrind which leads to
+	// massive slow down and disconnection from the client, when the server is still
+	// running.
+   // used for **test only**
+   int connect_timeout() const { return connect_timeout_;}
+
+	/// When called will demand load the ecf host file, and read the hosts.
+	/// Will then iterate over the host, when the end is reached will start over
+	/// If host can not be opened or errors occur returns false;
+	bool get_next_host(std::string& errorMsg);
+
+	/// If server denies client communication and this flag is set, exit with an error
+	/// Avoids 24hr hour connection attempt to server. Aids zombie control.
+	bool denied() const { return denied_;}
+
+	/// if NO_ECF is set then abort client immediately.  Client should return success
+	/// useful when we want to test jobs stand-alone
+	bool no_ecf() const { return no_ecf_;}
+
+	/// for debug
+	std::string toString() const;
+
+	/// Return contents of ECF_NODE environment variable, Otherwise an EMPTY string
+	static std::string hostSpecified();
+
+	/// Returns of ECF_PORT,environment variable, otherwise returns Str::DEFAULT_PORT_NUMBER
+	static std::string portSpecified();
+
+   // Set the rid. Only needed to override in regression test, to avoid interference
+   // May be need a better name, is really the process id of running job.
+   // Needs to be the same value as supplied to child command init
+   void set_remote_id(const std::string& rid) { remote_id_ = rid; }
+
+// AbstractClientEnv functions:
+ 	virtual bool checkTaskPathAndPassword(std::string& errorMsg) const;
+ 	virtual const std::string& task_path() const { return task_path_; }
+ 	virtual int task_try_no() const { return task_try_num_; }
+	virtual const std::string& jobs_password() const { return jobs_password_ ;}
+	virtual const std::string& process_or_remote_id() const { return remote_id_; }
+   virtual void set_host_port(const std::string& host, const std::string& port);
+   virtual const std::string& host() const;
+   virtual const std::string& port() const;
+	virtual const std::vector<std::pair<std::string,std::string> >& env() const { return env_;}
+	virtual bool debug() const { return debug_;} //enabled if ECF_DEBUG_CLIENT set
+   virtual void set_test() { under_test_ = true; }
+   virtual bool under_test() const { return under_test_; }
+
+private:
+
+ 	std::string task_path_;             // ECF_NAME = /aSuit/aFam/aTask
+	std::string jobs_password_;         // ECF_PASS jobs password
+	std::string remote_id_;             // ECF_RID process id of running job
+ 	int task_try_num_;                  // ECF_TRYNO. The task try number. The number of times we should submitted a job, if it is aborted
+	std::string host_file_;             // ECF_HOSTFILE. File that lists the backup hosts, port numbers must match
+	long timeout_;                      // ECF_TIMEOUT. Host file iteration time out
+	int  connect_timeout_;              // default 0, ECF_CONNECT_TIMEOUT, connection timeout
+	bool denied_;                       // ECF_DENIED. If set ECF denies access, client will exit with failure")
+ 	bool no_ecf_;                       // NO_ECF. if defined then abort cmd immediately. useful when test jobs stand-alone
+
+	bool debug_;                        // For live debug, enabled by env variable ECF_CLIENT_DEBUG
+	bool under_test_;                   // Used in testing client interface
+	std::vector<std::pair<std::string,std::string> > env_; // For test allow env variable to be set on defs
+
+	bool host_file_read_;               // to ensure we read host file only once
+	std::vector<std::pair<std::string, std::string> > host_vec_; // The list of host:port pairs
+	int  host_vec_index_;               // index into host_vec;
+	int allow_new_client_old_server_;   // the boost archive version of old server, allow new client--> old server communication
+	std::string env_ecf_new_client_old_server_;
+
+	/// The option read from the command line.
+ 	friend class ClientOptions;
+
+	// Allow testing to override the task path set in the environment. In this constructor
+	friend class ClientInvoker;
+
+private:
+
+   void init();
+
+   void read_environment_variables();  /// Get the standard environment variables
+
+   void update_allow_new_client_old_server(const std::string& host, const std::string& port);
+
+   void taskPath(const std::string& s) { task_path_ = s;}
+   void set_jobs_password(const std::string& s) { jobs_password_ = s;}
+   void set_connect_timeout(int t) { connect_timeout_ = t;}
+
+   // Allow testing to add or update the environment in the Defs file
+   // Each pair is ( variable name, variable value )
+   void setEnv( const std::vector<std::pair<std::string,std::string> >& e) { env_= e;}
+
+	bool parseHostsFile(std::string& errorMsg);
+};
+
+#endif
diff --git a/ecflow_4_0_7/Client/src/ClientInvoker.cpp b/ecflow_4_0_7/Client/src/ClientInvoker.cpp
new file mode 100644
index 0000000..76a0742
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/ClientInvoker.cpp
@@ -0,0 +1,1321 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <iterator>
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib
+
+#include "ClientInvoker.hpp"
+#include "Client.hpp"
+#include "ClientEnvironment.hpp"
+#include "ClientOptions.hpp"
+#include "Defs.hpp"
+#include "ArgvCreator.hpp"
+#include "Str.hpp"
+#include "ClientToServerCmd.hpp"
+#include "Rtt.hpp"
+#include "Ecf.hpp"
+#include "DurationTimer.hpp"
+#include "ChangeMgrSingleton.hpp"
+#include "TimeStamp.hpp"
+#include "Log.hpp"
+
+#ifdef DEBUG
+
+#if defined(HPUX) || defined(_AIX)
+#define RETRY_CONNECTION_PERIOD 2
+#define NEXT_HOST_POLL_PERIOD 2
+#else
+#define RETRY_CONNECTION_PERIOD 1
+#define NEXT_HOST_POLL_PERIOD 1
+#endif
+
+#else
+#define RETRY_CONNECTION_PERIOD 10
+#define NEXT_HOST_POLL_PERIOD 30
+#endif
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+
+// ==================================================================================
+// class ClientInvoker
+ClientInvoker::ClientInvoker()
+: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
+{
+	if (clientEnv_.debug()) cout << "\nClientInvoker::ClientInvoker():============================start============================================\n";
+}
+
+ClientInvoker::ClientInvoker(const std::string& host_port)
+: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
+{
+   if (clientEnv_.debug()) cout << "\nClientInvoker::ClientInvoker():============================start============================================\n";
+   // assume format <host>:<port>
+   size_t colonPos = host_port.find_first_of(':');
+   if (colonPos == string::npos)  throw std::runtime_error("ClientInvoker::ClientInvoker: expected <host>:<port> : no ':' found in " + host_port);
+   std::string host = host_port.substr(0,colonPos);
+   std::string port = host_port.substr(colonPos+1);
+   set_host_port(host,port);
+}
+
+ClientInvoker::ClientInvoker(const std::string& host, const std::string& port)
+: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD)
+{
+   if (clientEnv_.debug()) cout << "\nClientInvoker::ClientInvoker():============================start============================================\n";
+   set_host_port(host,port);
+}
+
+ClientInvoker::ClientInvoker(const std::string& host, int port)
+: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD)
+{
+   if (clientEnv_.debug()) cout << "\nClientInvoker::ClientInvoker():============================start============================================\n";
+   set_host_port(host, boost::lexical_cast<std::string>(port));
+}
+
+void ClientInvoker::set_host_port(const std::string& host, const std::string& port)
+{
+	// Allow host and port to be overridden.
+   // o Override environment setting
+   // o For child commands will override opening of ecf_hosts file
+	clientEnv_.set_host_port(host,port);
+}
+
+const std::string& ClientInvoker::host() const
+{
+   return clientEnv_.host();
+}
+const std::string& ClientInvoker::port() const
+{
+   return clientEnv_.port();
+}
+
+void ClientInvoker::allow_new_client_old_server(int archive_version_of_old_server)
+{
+   clientEnv_.allow_new_client_old_server(archive_version_of_old_server);
+}
+
+int ClientInvoker::allow_new_client_old_server() const
+{
+   return clientEnv_.allow_new_client_old_server();
+}
+
+void ClientInvoker::taskPath(const std::string& s) {
+	assert(!s.empty());
+	test_ = true;
+	clientEnv_.taskPath(s);
+}
+void ClientInvoker::set_jobs_password(const std::string& djp)
+{
+    test_ = true;
+    clientEnv_.set_jobs_password(djp);
+}
+
+void ClientInvoker::setEnv( const std::vector<std::pair<std::string,std::string> >& e) {
+	assert(!e.empty());
+	test_ = true;
+	clientEnv_.setEnv(e); // For test allow env variable to be set on defs
+}
+
+void ClientInvoker::testInterface() {
+   testInterface_ = true;
+   clientEnv_.set_test();
+}
+
+const std::string& ClientInvoker::process_or_remote_id() const
+{
+   return clientEnv_.process_or_remote_id();
+}
+
+void ClientInvoker::enable_logging(const std::string& log_file_name)
+{
+   Rtt::create(log_file_name);
+}
+
+void ClientInvoker::disable_logging()
+{
+   Rtt::destroy();
+}
+
+void ClientInvoker::set_connect_timeout(int t)
+{
+   clientEnv_.set_connect_timeout(t);
+}
+
+void ClientInvoker::set_connection_attempts( unsigned int attempts)
+{
+   connection_attempts_ = attempts;
+   if ( connection_attempts_ < 1 ) connection_attempts_ = 1;
+}
+
+int ClientInvoker::invoke(int argc, char* argv[]) const
+{
+   // Allow request to logged & allow logging of round trip time, Hence must be placed *before* RoundTripRecorder
+   RequestLogger request_logger(this);
+
+   // initialise start_time_ and rtt_,
+   RoundTripRecorder round_trip_recorder(this);
+
+	/// If NO_ECF set then abort immediately. returning success. Useful in testing  jobs stand-alone.
+	if (clientEnv_.no_ecf())  return 0; // success
+
+	// Clear error message. For test. Don't keep previous error.
+	// i.e If next test passes when it shouldn't the wrong message is output
+	server_reply_.get_error_msg().clear();
+
+	Cmd_ptr cts_cmd;
+ 	try {
+		// read in program option, and construct the client to server commands from them.
+		// This will extract host/port from the environment/ args
+		// This will throw std::runtime_error for invalid arguments or options
+		cts_cmd = args_.parse(argc,argv,&clientEnv_);
+
+		// For --help and --debug, --load defs check_only no command is created
+		// When testInterface avoid writing to standard out.
+		if (!cts_cmd.get()) {
+			if (!testInterface_ && clientEnv_.debug()) {
+				cout << "args: "; for ( int x=0; x< argc; x++) cout << argv[x] << " "; cout << "\n";
+			}
+			return 0;
+		}
+	}
+	catch ( std::exception& e ) {
+		stringstream ss;
+		if (argc == 1) {
+		   ss << Ecf::CLIENT_NAME() << ": No options specified\n";
+		   ss << "Usage: " << Ecf::CLIENT_NAME() << " [OPTION]...\n";
+		   ss << "Try '" << Ecf::CLIENT_NAME() << " --help' for list of options\n";
+		}
+		else {
+		   ss << Ecf::CLIENT_NAME() << ": Caught exception whilst parsing arguments:\n" << e.what() << "\n";
+		   ss << "args: "; for ( int x=0; x< argc; x++) ss << argv[x] << " "; ss << "\n";
+		}
+		server_reply_.set_error_msg(ss.str());
+ 		if (on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+		return 1;
+	}
+	catch ( ... ) {
+		server_reply_.set_error_msg("ecflow:ClientInvoker: caught exception: Parsing arguments: unknown type!\n");
+ 		if (on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+		return 1;
+	}
+
+   // Under debug we display round trip time for each request
+	request_logger.set_cts_cmd(cts_cmd);
+
+	int res = do_invoke_cmd( cts_cmd );
+	if (res == 1 && on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+	return res;
+}
+
+int ClientInvoker::invoke( const std::string& arg ) const
+{
+	int argc = 2;
+	char* argv[] = { const_cast<char*>("ClientInvoker"),  const_cast<char*>(arg.c_str()) };
+ 	return invoke(argc,argv);
+}
+
+int ClientInvoker::invoke( const std::vector<std::string>& args ) const
+{
+	std::vector<std::string> theArgs;
+	theArgs.push_back("ClientInvoker");
+	std::copy( args.begin(), args.end(), std::back_inserter(theArgs) );
+	ArgvCreator argvCreator( theArgs );
+	return invoke(argvCreator.argc(),argvCreator.argv());
+}
+
+int ClientInvoker::invoke(Cmd_ptr cts_cmd) const
+{
+   // assumes clients of Cmd_ptr constructor has caught exceptions
+
+   // Allow request to be logged & allow logging of round trip time, Hence must be placed *before* RoundTripRecorder
+   RequestLogger request_logger(this);
+
+   // initialise start_time_ and rtt_,
+   RoundTripRecorder round_trip_recorder(this);
+
+   // allow display of round trip time for each request
+   request_logger.set_cts_cmd(cts_cmd);
+
+   int res = do_invoke_cmd( cts_cmd );
+   if (res == 1 && on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+   return res;
+}
+
+
+int ClientInvoker::do_invoke_cmd(Cmd_ptr cts_cmd) const
+{
+	if (clientEnv_.debug()) cout << "\necflow:ClientInvoker::do_invoke_cmd on_error_throw_exception_(" << on_error_throw_exception_ << ")================================" << std::endl;
+	if (clientEnv_.no_ecf())  return 0; // success If NO_ECF set then abort immediately. returning success. Useful in testing  jobs stand-alone.
+	if (testInterface_) return 0;       // The testInterface_ flag allows testing of client interface, parsing of args, without needing to contact server
+	assert(!clientEnv_.host().empty()); // make sure host is NOT empty.
+
+   if (ChangeMgrSingleton::exists() && ChangeMgrSingleton::instance()->in_notification()) {
+      // place break point here, Change mgr observers, calling *ANOTHER* client->server command, in a middle of update to observers
+      std::cout << "***********************************************************\n";
+      std::cout << "ecflow:ClientInvoker::do_invoke_cmd() "; cts_cmd->print(cout); std::cout << " called in the middle of ChangeMgrSingleton::notification. !!!!!!!!\n";
+      std::cout << "***********************************************************\n";
+   }
+
+	/// retry_connection_period_ specifies the time to wait, before retrying to connect to server.
+	/// Added to get round glitches in the network.
+	/// However for ping() always default to 1 second. This avoids 10 second wait in release mode.
+	/// We do this both for the CLI(command level interface) and python api
+	unsigned int retry_connection_period = retry_connection_period_;
+	if (cts_cmd->ping_cmd()) retry_connection_period = 1;
+
+	try {
+	   /// report this message at least once. So client has a clue what's going on
+	   bool report_block_client_on_home_server = false;
+	   bool report_block_client_server_halted = false;
+	   bool report_block_client_zombie_detected = false;
+
+		// We do not want to loop over the sms host list indefinitely hence we use a timer.
+		// The time out period is supplied via ClientEnvironment
+		bool never_polled = true; // don't wait for the first host only subsequent ones
+
+		while ( true ) {
+
+			// for each host try connecting several times. To compensate for network glitches.
+ 			int no_of_tries = connection_attempts_;
+			while ( no_of_tries > 0 ) {
+				try {
+					if (clientEnv_.debug()) { cout << "ClientInvoker: >>> About to invoke "; cts_cmd->print(cout); cout << " on " << client_env_host_port() << " : retry_connection_period(" << retry_connection_period << ") no_of_tries(" << no_of_tries << ") cmd_connect_timeout(" << cts_cmd->timeout() << ") ECF_CONNECT_TIMEOUT(" << clientEnv_.connect_timeout() << ")<<<" << endl;}
+
+					/// *** Each call to io_service.run(); is a *REQUEST* to the server ***
+					/// *** Hence we *MUST* clear the server_reply before each call *******
+					/// *** Found during zombie test. i.e when blocking, we were responding to previous, reply, since server_reply was not being reset
+					/// *Note* server_reply_.client_handle_ is kept until the next call to register a new client_handle
+					/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
+					/// However this is only done, if we are not using the Command Level Interface(cli)
+					server_reply_.clear_for_invoke(cli_);
+
+					boost::asio::io_service io_service;
+					Client theClient( io_service, cts_cmd , clientEnv_.host(), clientEnv_.port(), clientEnv_.connect_timeout() );
+					if (clientEnv_.allow_new_client_old_server() != 0) theClient.allow_new_client_old_server(clientEnv_.allow_new_client_old_server());
+					io_service.run();
+					if (clientEnv_.debug()) cout << "ClientInvoker: >>> After: io_service.run() <<<" << endl;;
+
+					/// Let see how the server responded if at all.
+					try {
+						/// will return false if further action required
+						if (theClient.handle_server_response( server_reply_, clientEnv_.debug() )) {
+							// The normal response.  RoundTriprecorder will record in rtt_
+
+						   // If the command was a delete_all command, reset client_handle
+						   if (cts_cmd->delete_all_cmd()) {
+						      ClientInvoker* non_const_this = const_cast<ClientInvoker*>(this);
+						      non_const_this->reset();
+						   }
+							return 0; // the normal exit path
+						}
+					}
+					catch (std::exception& e) {
+ 						server_reply_.set_error_msg( e.what() );
+						return 1;
+					}
+
+					if ( server_reply_.block_client_on_home_server()) {
+						// Valid reply from server. Typically waiting on a expression
+						// Ok _Block_ on _current_ server, and continue waiting, until server reply is ok
+						if (!report_block_client_on_home_server || clientEnv_.debug()) { cout << TimeStamp::now() << "ecflow:ClientInvoker: "; cts_cmd->print(cout); cout << " : " << client_env_host_port() << " : WAITING on home server, continue waiting\n";report_block_client_on_home_server = true;}
+						no_of_tries++;
+ 					}
+					else if (server_reply_.block_client_server_halted()) {
+						// Valid reply from server.
+					   // fall through try again, then try other hosts
+						if (!report_block_client_server_halted || clientEnv_.debug()){ cout << TimeStamp::now() << "ecflow:ClientInvoker: "; cts_cmd->print(cout); cout << " : " << client_env_host_port() << " : blocking : server is HALTED, continue waiting\n";report_block_client_server_halted = true;}
+  					}
+					else if (server_reply_.block_client_zombie_detected()) {
+						// Valid reply from server.
+					   // fall through try again, then try other hosts
+						if (!report_block_client_zombie_detected || clientEnv_.debug()){ cout << TimeStamp::now() << "ecflow:ClientInvoker: "; cts_cmd->print(cout); cout << " : " << client_env_host_port() << " : blocking : zombie detected, continue waiting\n";report_block_client_zombie_detected = true;}
+  					}
+					else  if (server_reply_.client_request_failed()) {
+						// Valid reply from server
+						// This error is ONLY valid if we got a real reply from the server
+						// as opposed to some kind of connection errors. For connections errors
+						// we fall through and try again.
+						if (clientEnv_.debug()) {cout << "ecflow:ClientInvoker:"; cts_cmd->print(cout); cout << " failed : " << client_env_host_port() << " : " << server_reply_.error_msg() << "\n";}
+						return 1;
+					}
+					else {
+						std::cout << TimeStamp::now() << "ecflow:ClientInvoker: missed response? for request "; cts_cmd->print(cout); std::cout << " oops" << endl;
+					}
+ 				}
+				catch (std::exception& e) {
+					// *Some kind of connection error*: fall through and try again. Avoid this message when pinging, i.e to see if server is alive.
+				   if (clientEnv_.debug()) { cerr << "ecflow:ClientInvoker: Connection error: (" << e.what() <<  ")" << endl; }
+				   if (!cts_cmd->ping_cmd()) {
+				      cerr << TimeStamp::now() << "ecflow:ClientInvoker: Connection error: (" << e.what() <<  ")" << endl;
+				   }
+ 				}
+
+				// Wait a bit before trying to connect again, but only if no_of_tries > 0
+				no_of_tries--;
+ 				if (no_of_tries > 0) sleep( retry_connection_period );
+			}
+
+			// Don't bother with other hosts when:
+			//  1/ Testing
+ 			//  2/ ping-ing
+			//  3/ ECF_DENIED has been set
+			//  4/ Dealing with non tasks based request
+			if (!cts_cmd->connect_to_different_servers() || test_ || cts_cmd->ping_cmd() || clientEnv_.denied() ) {
+				std::stringstream ss;
+ 				ss << TimeStamp::now() << "Request( "; cts_cmd->print(ss) << " )";
+ 				if (clientEnv_.denied()) ss << " ECF_DENIED ";
+ 				ss << ", Failed to connect to "  << client_env_host_port()
+ 				   << ". After " << connection_attempts_ << " attempts. Is the server running ?\n";
+ 				// Only print client environment if not pinging
+            if (!cts_cmd->ping_cmd())  ss << "Client environment:\n" << clientEnv_.toString() << endl;
+ 				server_reply_.set_error_msg(ss.str());
+ 				return 1;
+			}
+
+			boost::posix_time::time_duration duration = microsec_clock::universal_time() - start_time_;
+			if (clientEnv_.debug()) { cout << "ClientInvoker: Time duration = " << duration.total_seconds() << " clientEnv_.max_child_cmd_timeout() = " << clientEnv_.max_child_cmd_timeout() << endl;}
+
+			if ( duration.total_seconds() >= clientEnv_.max_child_cmd_timeout() ) {
+				std::stringstream ss; ss << TimeStamp::now() << "ecflow:ClientInvoker: Timed out after " << clientEnv_.max_child_cmd_timeout() << " seconds : for " << client_env_host_port() << "\n";
+ 				std::string msg = ss.str();
+ 				cout << msg;
+				server_reply_.set_error_msg(msg);
+				return 1;
+			}
+
+			// The host is not playing ball, try the next host, will *restart* with home server, if end reached
+			// *get_next_host* *only* returns false if host exists, and parsing it fails
+			std::string current_host_port = client_env_host_port();
+
+			std::string local_error_msg;
+			if (!clientEnv_.get_next_host(local_error_msg)) {
+			   /// Instead of exiting, Just spit out a warning
+			   cout << TimeStamp::now() << "ecflow:ClientInvoker: "; cts_cmd->print(cout); cout << " get next host failed because: " << local_error_msg  << endl;
+			}
+
+			cout << TimeStamp::now() << "ecflow:ClientInvoker: "; cts_cmd->print(cout); cout << " current host(" << current_host_port << ") trying next host(" << client_env_host_port() << ")" << endl;
+
+			if( never_polled ) never_polled = false; // To avoid the first wait
+			else               sleep(NEXT_HOST_POLL_PERIOD);
+		}
+	}
+	catch ( std::exception& e ) {
+		stringstream ss; ss << TimeStamp::now() << "ecflow:ClientInvoker: caught exception: " << e.what() << "\n";
+ 		server_reply_.set_error_msg(ss.str());
+	}
+	catch ( ... ) {
+      stringstream ss; ss << TimeStamp::now() << "ecflow:ClientInvoker: Caught Exception of unknown type!\n";
+		server_reply_.set_error_msg(ss.str());
+	}
+	return 1;
+}
+
+
+void ClientInvoker::reset()
+{
+   server_reply_.set_client_defs( defs_ptr() );
+   server_reply_.set_client_node( node_ptr() );
+   server_reply_.set_client_handle( 0 );
+}
+
+//=====================================================================================
+// By using the command directly, it is a lot faster than using argc/argv
+// preserve old method to test api/command level interface.
+
+int ClientInvoker::getDefs() const
+{
+   if (testInterface_) return invoke(CtsApi::get());
+   return invoke( Cmd_ptr( new CtsNodeCmd( CtsNodeCmd::GET) ) );
+}
+
+int ClientInvoker::loadDefs(
+         const std::string& filePath,
+         bool force,     /* true means overwrite suite of same name */
+         bool check_only /* true means don't send to server, just check only */
+) const
+{
+   if (testInterface_) return invoke(CtsApi::loadDefs(filePath,force,check_only));
+   Cmd_ptr cmd = LoadDefsCmd::create(filePath,force,check_only,&clientEnv_);
+   if (cmd) return invoke(cmd); // If check_only cmd will be empty
+   return 0;
+}
+
+int ClientInvoker::sync(defs_ptr& client_defs) const
+{
+   if (client_defs.get()) {
+      server_reply_.set_client_defs( client_defs );
+      if (testInterface_) return invoke(CtsApi::sync(server_reply_.client_handle(), client_defs->state_change_no(), client_defs->modify_change_no()));
+      return invoke( Cmd_ptr( new CSyncCmd(CSyncCmd::SYNC,server_reply_.client_handle(), client_defs->state_change_no(), client_defs->modify_change_no() ) ) );
+   }
+
+   if (testInterface_) return invoke(CtsApi::get());
+   int res =  invoke( Cmd_ptr( new CtsNodeCmd(CtsNodeCmd::GET)));
+   if (res == 0) {
+      client_defs = server_reply_.client_defs(); // update change number
+   }
+   return res;
+}
+
+int ClientInvoker::sync_local() const
+{
+   // Prevent infinite loops in change observers.
+   // This can be removed  when we do the new ecflowview. TODO
+   if (ChangeMgrSingleton::exists() && ChangeMgrSingleton::instance()->in_notification()) {
+      std::cout << "ecflow:ClientInvoker::sync_local() called in the middle of ChangeMgrSingleton::notification. Ignoring..... \n";
+      return 0;
+   }
+
+   defs_ptr defs = server_reply_.client_defs();
+   if (defs.get()) {
+      if (testInterface_) return invoke(CtsApi::sync(server_reply_.client_handle(),defs->state_change_no(), defs->modify_change_no()));
+      return invoke( Cmd_ptr( new CSyncCmd(CSyncCmd::SYNC,server_reply_.client_handle(), defs->state_change_no(), defs->modify_change_no() ) ) );
+   }
+   // If we have a handle return the defs, with the registered suites, else returns the full defs
+   if (testInterface_) return invoke(CtsApi::sync_full(server_reply_.client_handle()));
+   return invoke( Cmd_ptr( new CSyncCmd(server_reply_.client_handle()) ) );
+}
+
+int ClientInvoker::news(defs_ptr& client_defs) const
+{
+   if (client_defs.get()) {
+      if (testInterface_) return invoke(CtsApi::news(server_reply_.client_handle(),client_defs->state_change_no(), client_defs->modify_change_no()));
+      return invoke( Cmd_ptr( new CSyncCmd(CSyncCmd::NEWS,server_reply_.client_handle(), client_defs->state_change_no(), client_defs->modify_change_no() ) ) );
+   }
+   server_reply_.set_error_msg("The client definition is empty.");
+   if (on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+   return 1;
+}
+
+int ClientInvoker::news_local() const
+{
+   defs_ptr defs = server_reply_.client_defs();
+   if (defs.get()) {
+      if (testInterface_) return invoke(CtsApi::news(server_reply_.client_handle(), defs->state_change_no(), defs->modify_change_no()));
+      return invoke( Cmd_ptr( new CSyncCmd(CSyncCmd::NEWS,server_reply_.client_handle(), defs->state_change_no(), defs->modify_change_no() ) ) );
+   }
+
+   // There is no local defs, i.e first time call, The default client handle should be 0.
+   // go with defaults for state and modify change numbers
+   // User is expected to call sync_local(), which will update local defs.
+   if (testInterface_) return invoke(CtsApi::news(server_reply_.client_handle(), 0, 0));
+   return invoke( Cmd_ptr( new CSyncCmd(CSyncCmd::NEWS,server_reply_.client_handle(), 0, 0 ) ) );
+}
+//=====================================================================================
+int ClientInvoker::restartServer() const
+{
+   if (testInterface_) return invoke(CtsApi::restartServer());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::RESTART_SERVER)));
+}
+int ClientInvoker::haltServer() const
+{
+   if (testInterface_) return invoke(CtsApi::haltServer(true/*auto_confirm*/));
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::HALT_SERVER)));
+}
+int ClientInvoker::pingServer() const
+{
+   if (testInterface_) return invoke( CtsApi::pingServer());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::PING)));
+}
+int ClientInvoker::shutdownServer() const
+{
+   if (testInterface_) return invoke(CtsApi::shutdownServer(true/*auto_confirm*/));
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::SHUTDOWN_SERVER)));
+}
+int ClientInvoker::terminateServer() const
+{
+   if (testInterface_) return invoke(CtsApi::terminateServer(true/*auto_confirm*/));
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::TERMINATE_SERVER)));
+}
+int ClientInvoker::stats() const
+{
+   if (testInterface_) return invoke(CtsApi::stats());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::STATS)));
+}
+int ClientInvoker::stats_reset() const
+{
+   if (testInterface_) return invoke(CtsApi::stats_reset());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::STATS_RESET)));
+}
+int ClientInvoker::suites() const
+{
+   if (testInterface_) return invoke(CtsApi::suites());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::SUITES)));
+}
+int ClientInvoker::server_version() const
+{
+   if (testInterface_) return invoke(CtsApi::server_version());
+   return invoke(Cmd_ptr(new ServerVersionCmd()) );
+}
+int ClientInvoker::debug_server_on() const
+{
+   if (testInterface_) return invoke(CtsApi::debug_server_on());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::DEBUG_SERVER_ON)));
+}
+int ClientInvoker::debug_server_off() const
+{
+   if (testInterface_) return invoke(CtsApi::debug_server_off());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::DEBUG_SERVER_OFF)));
+}
+
+//=====================================================================================
+
+int ClientInvoker::ch_register( bool auto_add_new_suites,const std::vector<std::string>& suites ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_register(auto_add_new_suites, suites));
+   return invoke(Cmd_ptr(new ClientHandleCmd(suites, auto_add_new_suites)) );
+}
+int ClientInvoker::ch_suites() const
+{
+   if (testInterface_) return invoke(CtsApi::ch_suites());
+   return invoke(Cmd_ptr(new ClientHandleCmd(ClientHandleCmd::SUITES)) );
+}
+int ClientInvoker::ch_drop( int client_handle ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_drop(client_handle));
+   return invoke(Cmd_ptr(new ClientHandleCmd(client_handle)) );
+}
+int ClientInvoker::ch_drop_user( const std::string& user) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_drop_user(user));
+   return invoke(Cmd_ptr(new ClientHandleCmd(user)) );
+}
+int ClientInvoker::ch_add( int client_handle, const std::vector<std::string>& suites ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_add(client_handle, suites));
+   return invoke(Cmd_ptr(new ClientHandleCmd(client_handle, suites, ClientHandleCmd::ADD)) );
+}
+int ClientInvoker::ch_remove( int client_handle, const std::vector<std::string>& suites ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_remove(client_handle, suites));
+   return invoke(Cmd_ptr(new ClientHandleCmd(client_handle, suites, ClientHandleCmd::REMOVE)) );
+}
+int ClientInvoker::ch_auto_add( int client_handle, bool auto_add_new_suites ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_auto_add(client_handle, auto_add_new_suites));
+   return invoke(Cmd_ptr(new ClientHandleCmd(client_handle,auto_add_new_suites)) );
+}
+int ClientInvoker::ch1_drop() const
+{
+   if (0 == server_reply_.client_handle()) return 0;
+   if (testInterface_) return invoke(CtsApi::ch_drop(server_reply_.client_handle()));
+   return invoke(Cmd_ptr(new ClientHandleCmd(server_reply_.client_handle())) );
+}
+int ClientInvoker::ch1_add( const std::vector<std::string>& suites ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_add(server_reply_.client_handle(), suites));
+   return invoke(Cmd_ptr(new ClientHandleCmd(server_reply_.client_handle(), suites, ClientHandleCmd::ADD)) );
+}
+int ClientInvoker::ch1_remove( const std::vector<std::string>& suites ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_remove(server_reply_.client_handle(), suites));
+   return invoke(Cmd_ptr(new ClientHandleCmd(server_reply_.client_handle(), suites, ClientHandleCmd::REMOVE)) );
+}
+int ClientInvoker::ch1_auto_add( bool auto_add_new_suites ) const
+{
+   if (testInterface_) return invoke(CtsApi::ch_auto_add(server_reply_.client_handle(), auto_add_new_suites));
+   return invoke(Cmd_ptr(new ClientHandleCmd(server_reply_.client_handle(),auto_add_new_suites)) );
+}
+
+// ======================================================================================================
+
+int ClientInvoker::begin( const std::string& suiteName, bool force ) const
+{
+   if (testInterface_) return invoke(CtsApi::begin(suiteName, force));
+   return invoke(Cmd_ptr(new BeginCmd(suiteName, force )) );
+}
+int ClientInvoker::begin_all_suites( bool force ) const
+{
+   if (testInterface_) return invoke(CtsApi::begin("", force));
+   return invoke(Cmd_ptr(new BeginCmd("", force )) );
+}
+// ======================================================================================================
+
+int ClientInvoker::zombieGet() const
+{
+   if (testInterface_) return invoke(CtsApi::zombieGet());
+   return invoke(Cmd_ptr(new CtsCmd(CtsCmd::GET_ZOMBIES)));
+}
+int ClientInvoker::zombieFob( const Zombie& z ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieFob(z.path_to_task(), z.process_or_remote_id(), z.jobs_password()));
+   return invoke(Cmd_ptr(new ZombieCmd(User::FOB, z.path_to_task(), z.process_or_remote_id(), z.jobs_password() )));
+}
+int ClientInvoker::zombieFail( const Zombie& z ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieFail(z.path_to_task(), z.process_or_remote_id(), z.jobs_password()));
+   return invoke(Cmd_ptr(new ZombieCmd(User::FAIL, z.path_to_task(), z.process_or_remote_id(), z.jobs_password() )));
+}
+int ClientInvoker::zombieAdopt( const Zombie& z ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieAdopt(z.path_to_task(), z.process_or_remote_id(), z.jobs_password()));
+   return invoke(Cmd_ptr(new ZombieCmd(User::ADOPT, z.path_to_task(), z.process_or_remote_id(), z.jobs_password() )));
+}
+int ClientInvoker::zombieBlock( const Zombie& z ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieBlock(z.path_to_task(), z.process_or_remote_id(), z.jobs_password()));
+   return invoke(Cmd_ptr(new ZombieCmd(User::BLOCK, z.path_to_task(), z.process_or_remote_id(), z.jobs_password() )));
+}
+int ClientInvoker::zombieRemove( const Zombie& z ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieRemove(z.path_to_task(), z.process_or_remote_id(), z.jobs_password()));
+   return invoke(Cmd_ptr(new ZombieCmd(User::REMOVE, z.path_to_task(), z.process_or_remote_id(), z.jobs_password() )));
+}
+int ClientInvoker::zombieKill( const Zombie& z ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieKill(z.path_to_task(), z.process_or_remote_id(), z.jobs_password()));
+   return invoke(Cmd_ptr(new ZombieCmd(User::KILL, z.path_to_task(), z.process_or_remote_id(), z.jobs_password() )));
+}
+int ClientInvoker::zombieFobCli( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieFobCli(absNodePath));
+   return invoke(Cmd_ptr(new ZombieCmd(User::FOB, absNodePath,"","")));
+}
+int ClientInvoker::zombieFailCli( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieFailCli(absNodePath));
+   return invoke(Cmd_ptr(new ZombieCmd(User::FAIL, absNodePath,"","" )));
+}
+int ClientInvoker::zombieAdoptCli( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieAdoptCli(absNodePath));
+   return invoke(Cmd_ptr(new ZombieCmd(User::ADOPT, absNodePath,"","" )));
+}
+int ClientInvoker::zombieBlockCli( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieBlockCli(absNodePath));
+   return invoke(Cmd_ptr(new ZombieCmd(User::BLOCK, absNodePath,"","" )));
+}
+int ClientInvoker::zombieRemoveCli( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieRemoveCli(absNodePath));
+   return invoke(Cmd_ptr(new ZombieCmd(User::REMOVE, absNodePath,"","" )));
+}
+int ClientInvoker::zombieKillCli( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::zombieKillCli(absNodePath));
+   return invoke(Cmd_ptr(new ZombieCmd(User::KILL, absNodePath,"","" )));
+}
+
+// ======================================================================================================
+
+int ClientInvoker::job_gen( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::job_gen(absNodePath));
+   return invoke(Cmd_ptr(new CtsNodeCmd( CtsNodeCmd::JOB_GEN, absNodePath)));
+}
+
+int ClientInvoker::edit_history( const std::string& path ) const
+{
+   if (testInterface_) return invoke(CtsApi::edit_history(path));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::EDIT_HISTORY, path)));
+}
+int ClientInvoker::kill( const std::vector<std::string>& paths ) const
+{
+   if (testInterface_) return invoke(CtsApi::kill(paths));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::KILL, paths)));
+}
+int ClientInvoker::kill( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::kill(absNodePath));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::KILL, absNodePath)));
+}
+int ClientInvoker::status( const std::vector<std::string>& paths ) const
+{
+   if (testInterface_) return invoke(CtsApi::status(paths));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::STATUS, paths)));
+}
+int ClientInvoker::status( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::status(absNodePath));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::STATUS, absNodePath)));
+}
+int ClientInvoker::suspend( const std::vector<std::string>& paths ) const
+{
+   if (testInterface_) return invoke(CtsApi::suspend(paths));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::SUSPEND, paths)));
+}
+int ClientInvoker::suspend( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::suspend(absNodePath));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::SUSPEND, absNodePath)));
+}
+int ClientInvoker::resume( const std::vector<std::string>& paths ) const
+{
+   if (testInterface_) return invoke(CtsApi::resume(paths));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::RESUME, paths)));
+}
+int ClientInvoker::resume( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::resume(absNodePath));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::RESUME, absNodePath)));
+}
+int ClientInvoker::check( const std::vector<std::string>& paths ) const
+{
+   if (testInterface_) return invoke(CtsApi::check(paths));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::CHECK, paths)));
+}
+int ClientInvoker::check( const std::string& absNodePath ) const
+{
+   if (testInterface_) return invoke(CtsApi::check(absNodePath));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::CHECK, absNodePath)));
+}
+int ClientInvoker::delete_nodes( const std::vector<std::string>& paths, bool force ) const
+{
+   if (testInterface_) return invoke(CtsApi::delete_node(paths, force, true/*auto_confirm*/));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::DELETE, paths,force)));
+}
+int ClientInvoker::delete_node( const std::string& absNodePath, bool force ) const
+{
+   if (testInterface_) return invoke(CtsApi::delete_node(absNodePath, force, true/*auto_confirm*/));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::DELETE, absNodePath,force)));
+}
+int ClientInvoker::delete_all( bool force) const
+{
+   if (testInterface_) return invoke(CtsApi::delete_node(std::vector<std::string>(),force));
+   return invoke(Cmd_ptr(new PathsCmd( PathsCmd::DELETE, std::vector<std::string>(),force)));
+}
+
+// ======================================================================================================
+
+int ClientInvoker::replace( const std::string& absNodePath, const std::string& path_to_client_defs,
+                            bool create_parents_as_required, bool force) const
+{
+   if (testInterface_) return invoke(CtsApi::replace(absNodePath, path_to_client_defs, create_parents_as_required, force));
+
+   /// *Note* server_reply_.client_handle_ is kept until the next call to register_client_handle
+   /// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
+   server_reply_.clear_for_invoke(cli_);
+
+   /// Handle command constructors that can throw
+   Cmd_ptr cts_cmd;
+   try {
+
+      ReplaceNodeCmd* replace_cmd = new ReplaceNodeCmd( absNodePath, create_parents_as_required, path_to_client_defs, force);
+
+      // For test allow the defs environment to changed, i.e. allow us to inject  ECF_CLIENT ???
+      replace_cmd->theDefs()->set_server().add_or_update_user_variables( clientEnv_.env() );
+
+      cts_cmd = Cmd_ptr( replace_cmd );
+   }
+   catch (std::exception& e ){
+      std::stringstream ss; ss << "ecflow:ClientInvoker::replace(" << absNodePath << "," << path_to_client_defs << ", ...) failed: " << e.what();
+      server_reply_.set_error_msg( ss.str() );
+      if (on_error_throw_exception_) throw std::runtime_error( server_reply_.error_msg() );
+      return 1;
+   }
+
+   return invoke( cts_cmd );
+}
+
+int ClientInvoker::replace_1(const std::string& absNodePath, defs_ptr client_defs, bool create_parents_as_required, bool force)  const
+{
+   /// *Note* server_reply_.client_handle_ is kept until the next call to register_client_handle
+   /// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
+   server_reply_.clear_for_invoke(cli_);
+
+   /// Handle command constructors that can throw
+   Cmd_ptr cts_cmd;
+   try {
+      cts_cmd = Cmd_ptr( new ReplaceNodeCmd( absNodePath, create_parents_as_required, client_defs, force) );
+   }
+   catch (std::exception& e ){
+      std::stringstream ss; ss << "ecflow:ClientInvoker::replace_1(" << absNodePath << " ...) failed: " << e.what();
+      server_reply_.set_error_msg( ss.str() );
+      if (on_error_throw_exception_) throw std::runtime_error( server_reply_.error_msg() );
+      return 1;
+   }
+
+   return invoke( cts_cmd );
+}
+
+int ClientInvoker::requeue( const std::vector<std::string>& paths,  const std::string& option ) const
+{
+   if (testInterface_) return invoke(CtsApi::requeue(paths, option));
+
+   RequeueNodeCmd::Option the_option = RequeueNodeCmd::NO_OPTION;
+   if (!option.empty()) {
+      if (option == "abort") the_option = RequeueNodeCmd::ABORT;
+      else if (option == "force") the_option = RequeueNodeCmd::FORCE;
+      else {
+         server_reply_.set_error_msg("ecflow:ClientInvoker::requeue: Expected option = [ force | abort ]");
+         if (on_error_throw_exception_) {
+            throw std::runtime_error(server_reply_.error_msg());
+         }
+         return 1;
+      }
+   }
+   return invoke(Cmd_ptr(new RequeueNodeCmd(paths, the_option)));
+}
+int ClientInvoker::requeue( const std::string& absNodePath, const std::string& option) const
+{
+   if (testInterface_) return invoke(CtsApi::requeue(absNodePath, option));
+
+   RequeueNodeCmd::Option the_option = RequeueNodeCmd::NO_OPTION;
+   if (!option.empty()) {
+      if (option == "abort") the_option = RequeueNodeCmd::ABORT;
+      else if (option == "force") the_option = RequeueNodeCmd::FORCE;
+      else {
+         server_reply_.set_error_msg("ecflow:ClientInvoker::requeue: Expected option = [ force | abort ]");
+         if (on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+         return 1;
+      }
+   }
+   return invoke(Cmd_ptr(new RequeueNodeCmd(absNodePath, the_option)));
+}
+
+int ClientInvoker::run( const std::vector<std::string>& paths, bool force ) const
+{
+   if (testInterface_) return invoke(CtsApi::run(paths, force));
+   return invoke(Cmd_ptr(new RunNodeCmd(paths, force)));
+}
+int ClientInvoker::run( const std::string& absNodePath, bool force ) const
+{
+   if (testInterface_) return invoke(CtsApi::run(absNodePath, force));
+   return invoke(Cmd_ptr(new RunNodeCmd(absNodePath, force)));
+}
+int ClientInvoker::order( const std::string& absNodePath, const std::string& order ) const
+{
+   if (testInterface_) return invoke(CtsApi::order(absNodePath, order));
+
+   if (!NOrder::isValid(order)) {
+      server_reply_.set_error_msg("ecflow:ClientInvoker::order: please specify one of [ top, bottom, alpha, order, up, down ]\n");
+      if (on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+      return 1;
+   }
+   return invoke(Cmd_ptr(new OrderNodeCmd(absNodePath, NOrder::toOrder(order))));
+}
+int ClientInvoker::order(const std::string& absNodePath,NOrder::Order order) const
+{
+   return invoke(Cmd_ptr(new OrderNodeCmd(absNodePath, order)));
+}
+
+// ======================================================================================================
+
+int ClientInvoker::checkPtDefs(ecf::CheckPt::Mode m,int check_pt_interval,int check_pt_save_time_alarm) const
+{
+   if (testInterface_) return invoke(CtsApi::checkPtDefs(m, check_pt_interval, check_pt_save_time_alarm));
+   return invoke(Cmd_ptr(new CheckPtCmd(m,check_pt_interval,check_pt_save_time_alarm)));
+}
+int ClientInvoker::restoreDefsFromCheckPt() const
+{
+   if (testInterface_) return invoke(CtsApi::restoreDefsFromCheckPt());
+   return invoke(Cmd_ptr(new CtsCmd( CtsCmd::RESTORE_DEFS_FROM_CHECKPT )));
+}
+
+int ClientInvoker::force( const std::string& absNodePath, const std::string& state_or_event,bool recursive, bool set_repeats_to_last_value ) const
+{
+   if (testInterface_) return invoke(CtsApi::force(absNodePath, state_or_event, recursive, set_repeats_to_last_value));
+   return invoke(Cmd_ptr(new ForceCmd(absNodePath, state_or_event, recursive, set_repeats_to_last_value  )));
+}
+int ClientInvoker::force( const std::vector<std::string>& paths, const std::string& state_or_event,bool recursive, bool set_repeats_to_last_value) const
+{
+   if (testInterface_) return invoke(CtsApi::force(paths, state_or_event, recursive, set_repeats_to_last_value));
+   return invoke(Cmd_ptr(new ForceCmd(paths, state_or_event, recursive, set_repeats_to_last_value  )));
+}
+
+int ClientInvoker::freeDep( const std::vector<std::string>& paths, bool trigger,bool all, bool date, bool the_time ) const
+{
+   if (testInterface_) return invoke(CtsApi::freeDep(paths, trigger, all, date, the_time));
+   return invoke(Cmd_ptr(new FreeDepCmd(paths, trigger, all, date , the_time)));
+}
+int ClientInvoker::freeDep( const std::string& absNodePath, bool trigger, bool all,bool date, bool the_time ) const
+{
+   if (testInterface_) return invoke(CtsApi::freeDep(absNodePath, trigger, all, date, the_time));
+   return invoke(Cmd_ptr(new FreeDepCmd(absNodePath, trigger, all, date , the_time)));
+}
+
+int ClientInvoker::file( const std::string& absNodePath, const std::string& fileType, const std::string& max_lines ) const
+{
+   if (testInterface_) return invoke(CtsApi::file(absNodePath, fileType, max_lines));
+
+   /// Handle command constructors that can throw
+   Cmd_ptr cts_cmd;
+   try {
+      cts_cmd = Cmd_ptr( new CFileCmd(absNodePath, fileType, max_lines));
+   }
+   catch (std::exception& e ){
+      std::stringstream ss; ss << "ecflow:ClientInvoker::file(" << absNodePath << "," << fileType << "," << max_lines << ") failed:\n" << e.what();
+      server_reply_.set_error_msg( ss.str() );
+      if (on_error_throw_exception_) {
+         throw std::runtime_error( server_reply_.error_msg() );
+      }
+      return 1;
+   }
+
+   return invoke( cts_cmd );
+}
+
+int ClientInvoker::plug( const std::string& sourcePath, const std::string& destPath ) const
+{
+   if (testInterface_) return invoke(CtsApi::plug(sourcePath, destPath));
+   return invoke(Cmd_ptr(new PlugCmd(sourcePath, destPath)));
+}
+
+// ======================================================================================================
+
+int ClientInvoker::reloadwsfile() const
+{
+   if (testInterface_) return invoke(CtsApi::reloadwsfile());
+   return invoke(Cmd_ptr(new CtsCmd( CtsCmd::RELOAD_WHITE_LIST_FILE )));
+}
+int ClientInvoker::group( const std::string& groupRequest ) const
+{
+   if (testInterface_)  return invoke(CtsApi::group(groupRequest));
+   return invoke(Cmd_ptr(new GroupCTSCmd(groupRequest,&clientEnv_)));
+}
+
+int ClientInvoker::logMsg( const std::string& msg ) const
+{
+   if (testInterface_) return invoke(CtsApi::logMsg(msg));
+   return invoke(Cmd_ptr(new LogMessageCmd( msg )));
+}
+int ClientInvoker::new_log( const std::string& new_path) const
+{
+   if (testInterface_) return invoke(CtsApi::new_log(new_path));
+
+   /// Handle command constructors that can throw
+   Cmd_ptr cts_cmd;
+   try {
+      cts_cmd = Cmd_ptr(new LogCmd( new_path ));
+   }
+   catch (std::exception& e ){
+      server_reply_.set_error_msg( e.what() );
+      if (on_error_throw_exception_) throw std::runtime_error( server_reply_.error_msg() );
+      return 1;
+   }
+   return invoke(cts_cmd);
+}
+int ClientInvoker::getLog( int lastLines) const
+{
+   if (lastLines == 0) lastLines = Log::get_last_n_lines_default();
+   if (testInterface_) return invoke(CtsApi::getLog(lastLines));
+   return invoke(Cmd_ptr(new LogCmd( LogCmd::GET, lastLines )));
+}
+int ClientInvoker::clearLog() const
+{
+   if (testInterface_) return invoke(CtsApi::clearLog());
+   return invoke(Cmd_ptr(new LogCmd( LogCmd::CLEAR )));
+}
+int ClientInvoker::flushLog() const
+{
+   if (testInterface_) return invoke(CtsApi::flushLog());
+   return invoke(Cmd_ptr(new LogCmd( LogCmd::FLUSH )));
+}
+int ClientInvoker::get_log_path() const
+{
+   if (testInterface_) return invoke(CtsApi::get_log_path());
+   return invoke(Cmd_ptr(new LogCmd( LogCmd::PATH )));
+}
+
+int ClientInvoker::forceDependencyEval() const
+{
+   return invoke(CtsApi::forceDependencyEval());
+}
+
+// ======================================================================================================
+
+int ClientInvoker::edit_script_edit(const std::string& path_to_task)
+{
+   return invoke(Cmd_ptr( new EditScriptCmd( path_to_task, EditScriptCmd::EDIT) ) );
+}
+
+int ClientInvoker::edit_script_preprocess(const std::string& path_to_task)
+{
+   return invoke(Cmd_ptr( new EditScriptCmd( path_to_task, EditScriptCmd::PREPROCESS) ) );
+}
+
+int ClientInvoker::edit_script_preprocess(const std::string& path_to_task,const std::vector<std::string>& file_contents)
+{
+   return invoke(Cmd_ptr( new EditScriptCmd( path_to_task,file_contents) ) );
+}
+
+int ClientInvoker::edit_script_submit(const std::string& path_to_task,const NameValueVec& used_variables)
+{
+   return invoke(Cmd_ptr( new EditScriptCmd( path_to_task,used_variables) ) );
+}
+
+int ClientInvoker::edit_script_submit(
+         const std::string& path_to_task,
+         const NameValueVec& used_variables,
+         const std::vector<std::string>& file_contents,
+         bool create_alias,
+         bool run_alias)
+{
+   return invoke(Cmd_ptr( new EditScriptCmd( path_to_task,used_variables,file_contents,create_alias,run_alias) ) );
+}
+
+std::string ClientInvoker::client_env_host_port() const
+{
+   std::string host_port = clientEnv_.host();
+   host_port += Str::COLON();
+   host_port += clientEnv_.port();
+   return host_port;
+}
+
+std::string ClientInvoker::find_free_port(int seed_port_number, bool debug)
+{
+   // Ping failed, We need to distinguish between:
+   //    a/ Server does not exist : <FREE> port
+   //    b/ Address in use        : <BUSY> port on existing server
+   // Using server_version() but then get error messages
+   // ******** Until this is done we can't implement port hopping **********
+
+   if (debug) cout << "ClientInvoker::find_free_port: starting with port " << seed_port_number << "\n";
+   int the_port = seed_port_number;
+   std::string free_port;
+   ClientInvoker client;
+   client.set_retry_connection_period(1); // avoid long wait
+   client.set_connection_attempts(1);     // avoid long wait
+   while (1) {
+      free_port = boost::lexical_cast<std::string>(the_port);
+      try {
+         if (debug) cout << "   Trying to connect to server on '" << Str::LOCALHOST() << ":" << free_port << "'\n";
+         client.set_host_port(Str::LOCALHOST(),free_port);
+         client.pingServer();
+         if (debug) cout << "   Connected to server on port " << free_port << " trying next port\n";
+         the_port++;
+      }
+      catch ( std::runtime_error& e) {
+         std::string error_msg = e.what();
+         if (debug) cout << "   " << e.what();
+         if (error_msg.find("authentication failed") != std::string::npos) {
+            if (debug) cout << "   Could not connect, due to authentication failure, hence port " << the_port << " is used,trying next port\n";
+            the_port++;
+            continue;
+         }
+         else {
+            if (debug) cout << "   Found free port " << free_port << "\n";
+            break;
+         }
+      }
+   }
+   return free_port;
+}
+
+bool ClientInvoker::wait_for_server_reply(int time_out) const
+{
+   DurationTimer timer;
+   while(1) {
+      sleep(2);
+
+      if (on_error_throw_exception_) {
+         try {
+            pingServer(); // will throw exception
+            return true;  // no exception, server lives
+         }
+         catch( ... ) {}
+      }
+      else {
+         if (pingServer() == 0) {
+            return true; // ping OK,
+         }
+      }
+      if (timer.duration() > time_out) {
+         return false;
+      }
+   }
+   return false;
+}
+
+bool ClientInvoker::wait_for_server_death(int time_out) const
+{
+   DurationTimer timer;
+   while(1) {
+
+      if (on_error_throw_exception_) {
+         try {
+            pingServer(); // will throw exception
+         }
+         catch( ... ) {
+            // server died
+            return true;
+         }
+      }
+      else {
+         if (pingServer() == 1) {
+            return true; // ping failed, server has died,
+         }
+      }
+      if (timer.duration() > time_out) {
+         return false; // server still lives
+      }
+
+      // Ping ok, server lives, continue pinging, until timeout
+      sleep(2);
+   }
+   return false;
+}
+
+
+int ClientInvoker::load_in_memory_defs( const defs_ptr& clientDefs, bool force) const
+{
+   /// *Note* server_reply_.client_handle_ is kept until the next call to register_client_handle
+   /// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
+   server_reply_.clear_for_invoke(cli_);
+
+   if ( !clientDefs.get() ) {
+      server_reply_.set_error_msg("The client definition is empty.");
+      if (on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+      return 1;
+   }
+
+   // Client defs  has been created in memory.
+   // warn about naff expression and unresolved in-limit references to Limit's
+   // Don't allow defs to be loaded into server, with trigger parser errors.
+   std::string warningMsg;
+   if (!clientDefs->check(server_reply_.get_error_msg(), warningMsg)) {
+      if (on_error_throw_exception_) throw std::runtime_error(server_reply_.error_msg());
+      return 1;
+   }
+
+   return invoke( Cmd_ptr( new LoadDefsCmd( clientDefs, force /*force overwrite suite of same name*/) ) );
+}
+
+
+// ==========================================================================
+// Python child support
+// ==========================================================================
+void ClientInvoker::set_child_path(const std::string& path)
+{
+   child_task_path_ = path;
+}
+void ClientInvoker::set_child_password(const std::string& pass)
+{
+   child_task_password_ = pass;
+}
+void ClientInvoker::set_child_pid(const std::string& pid)
+{
+   child_task_pid_ = pid;
+}
+void ClientInvoker::set_child_try_no(unsigned int try_no)
+{
+   child_task_try_no_ = try_no;
+}
+void ClientInvoker::set_child_timeout(unsigned int seconds )
+{
+   clientEnv_.set_child_cmd_timeout(seconds);
+}
+
+
+void ClientInvoker::check_child_parameters() const
+{
+   if (clientEnv_.debug()) {
+      std::cout << "  child_task_path_ = '" << child_task_path_ << "'\n";
+      std::cout << "  child_task_password_ = '" << child_task_password_ << "'\n";
+      std::cout << "  child_task_pid_ = '" << child_task_pid_ << "'\n";
+      std::cout << "  child_task_try_no_ = " << child_task_try_no_ << "\n";
+   }
+   if (child_task_path_.empty()) throw std::runtime_error("Child Path not set");
+   if (child_task_password_.empty()) throw std::runtime_error("Child password not set");
+   if (child_task_pid_.empty())  throw std::runtime_error("Child pid not set");
+   if (child_task_try_no_ == 0)  throw std::runtime_error("Child try_no not set");
+}
+
+void ClientInvoker::child_init()
+{
+   check_child_parameters();
+   on_error_throw_exception_ = true; // for python always throw exception
+   invoke( Cmd_ptr( new InitCmd(child_task_path_, child_task_password_, child_task_pid_, child_task_try_no_  ) ) );
+}
+
+void ClientInvoker::child_abort(const std::string& reason )
+{
+   check_child_parameters();
+   on_error_throw_exception_ = true; // for python always throw exception
+   invoke( Cmd_ptr( new AbortCmd(child_task_path_, child_task_password_, child_task_pid_, child_task_try_no_,reason  ) ) );
+}
+
+void ClientInvoker::child_event(const std::string& event_name_or_number)
+{
+   check_child_parameters();
+   on_error_throw_exception_ = true; // for python always throw exception
+   invoke( Cmd_ptr( new EventCmd(child_task_path_, child_task_password_, child_task_pid_, child_task_try_no_,event_name_or_number  ) ) );
+}
+
+void ClientInvoker::child_meter(const std::string& meter_name, int meter_value)
+{
+   if (meter_name.empty())  throw std::runtime_error("Meter name not set");
+   check_child_parameters();
+   on_error_throw_exception_ = true; // for python always throw exception
+   invoke( Cmd_ptr( new MeterCmd(child_task_path_, child_task_password_, child_task_pid_, child_task_try_no_,meter_name,meter_value  ) ) );
+}
+
+void ClientInvoker::child_label(const std::string& label_name, const std::string& label_value)
+{
+   if (label_name.empty()) throw std::runtime_error("Label name not set");
+   check_child_parameters();
+   on_error_throw_exception_ = true; // for python always throw exception
+   invoke( Cmd_ptr( new LabelCmd(child_task_path_, child_task_password_, child_task_pid_, child_task_try_no_,label_name,label_value  ) ) );
+}
+
+void ClientInvoker::child_wait(const std::string& expression)
+{
+   check_child_parameters();
+   on_error_throw_exception_ = true; // for python always throw exception
+   invoke( Cmd_ptr( new CtsWaitCmd(child_task_path_, child_task_password_, child_task_pid_, child_task_try_no_, expression ) ) );
+}
+
+void ClientInvoker::child_complete()
+{
+   check_child_parameters();
+   on_error_throw_exception_ = true; // for python always throw exception
+   invoke( Cmd_ptr( new CompleteCmd(child_task_path_, child_task_password_, child_task_pid_, child_task_try_no_  ) ) );
+}
+
+// ==========================================================================
+// class RequestLogger:
+// ==========================================================================
+RequestLogger::RequestLogger(const ClientInvoker* ci) : ci_(ci){}
+RequestLogger::~RequestLogger() {
+
+   // *assumes* destructor of RoundTripRecorder was invoked first, to allow recording of the time rtt_
+   if (cmd_.get()) {
+      if (ci_->clientEnv_.debug() && ci_->server_reply_.error_msg().empty()) {
+         cout << "ClientInvoker "; cmd_->print(cout); cout << " SUCCEDED " << to_simple_string(ci_->rtt_) << "\n";
+      }
+
+      if (Rtt::instance()) {
+         std::stringstream ss;
+         ss << ci_->client_env_host_port() << " ";
+         cmd_->print(ss);
+         ss << " " << Rtt::tag() << to_simple_string(ci_->rtt_); // Note: endl added rtt(..)
+         ss << " : " << ci_->server_reply_.error_msg();
+         rtt(ss.str());
+      }
+
+      if (ci_->cli_ && cmd_->ping_cmd() && ci_->server_reply_.error_msg().empty()) {
+         cout << "ping server(" << ci_->client_env_host_port() << ") succeeded in " << to_simple_string(ci_->rtt_) << "  ~" << ci_->rtt_.total_milliseconds() << " milliseconds\n";
+      }
+   }
+}
+
+// ==========================================================================
+// class RoundTripRecorder:
+// ==========================================================================
+RoundTripRecorder::RoundTripRecorder(const ClientInvoker* ci)
+: ci_(ci)
+{
+   // get the current time from the clock -- one second resolution
+   ci_->start_time_ = microsec_clock::universal_time();
+   ci_->rtt_ = boost::posix_time::time_duration();
+}
+
+RoundTripRecorder::~RoundTripRecorder() {
+   ci_->rtt_ = microsec_clock::universal_time() - ci_->start_time_;
+}
diff --git a/ecflow_4_0_7/Client/src/ClientInvoker.hpp b/ecflow_4_0_7/Client/src/ClientInvoker.hpp
new file mode 100644
index 0000000..802f802
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/ClientInvoker.hpp
@@ -0,0 +1,365 @@
+#ifndef CLIENT_INVOKER_HPP_
+#define CLIENT_INVOKER_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+#include "boost/date_time/posix_time/posix_time_types.hpp"
+
+#include "ClientEnvironment.hpp"
+#include "ClientOptions.hpp"
+#include "Cmd.hpp"
+#include "CtsApi.hpp"
+#include "TaskApi.hpp"
+#include "NodeFwd.hpp"
+#include "ServerReply.hpp"
+#include "Zombie.hpp"
+#include "NOrder.hpp"
+
+/// Invokes the client depending on the arguments
+/// This has been separated from main, to allow us to invoke the client
+/// from a test suite.
+/// Important: We can make *many* calls with the same ClientInvoker.
+/// This is more efficient than creating a ClientInvoker for each request
+class ClientInvoker : private boost::noncopyable {
+public:
+	/// Will create the *ClientEnvironment* once on construction
+	/// By default will throw exception std::runtime_error for errors
+   ClientInvoker();
+   ClientInvoker(const std::string& host_port);
+   ClientInvoker(const std::string& host, const std::string& port);
+   ClientInvoker(const std::string& host, int port);
+
+	/// if throw_exception_on_error = false, then
+	///    invoke() will return 0 for success and 1 for error.
+	///    The error message can be retrieved from errorMsg()
+	/// if throw_exception_on_error = true,
+	///	  then invoke() for errors will throw std::runtime_error
+	///   will still return 0 for success.
+	void set_throw_on_error(bool f) { on_error_throw_exception_ = f;}
+
+	/// Return the time it takes to contact server and get a reply.
+	const boost::posix_time::time_duration& round_trip_time() const { return rtt_;}
+
+	/// Configure to using command line interface
+	/// This affect commands like ping, log & file, so that, output is written to standard out
+	void set_cli(bool f) { cli_ =  f; }
+
+	/// This will override the environment setting.
+	/// In particular setting host explicitly will avoid cycling through server list,
+	/// if connection fails. hence will bomb out earlier
+	/// If applied to child command's will continue attempting this host/port until timeout
+	void set_host_port(const std::string& h, const std::string& p);
+   const std::string& host() const;
+   const std::string& port() const;
+
+	/// Whenever there is a connections failure we wait a number of seconds
+	/// before trying again. ( i.e. to get round glitches in the network.)
+	/// For the ping command this is set as 1 second
+	/// This wait between connection attempts can be configured here.
+	/// i.e for the GUI & python interface this can be reduced to increase responsiveness.
+	/// Default: In debug this period in set to 1 second and in release mode 10 seconds
+	void set_retry_connection_period(unsigned int period) { retry_connection_period_ = period; }
+
+	/// Set the number of times to connect to server, in case of failure
+	/// The period between connection attempts is handled by set_retry_connection_period
+	/// i.e for the GUI & python interface this can be reduced to increase responsiveness.
+	/// Default value is set as 2. Setting a value less than 1 is ignored, will default to 1 in this case
+	void set_connection_attempts( unsigned int attempts);
+
+	/// returns 1 on error and 0 on success. The errorMsg can be accessed via errorMsg()
+	/// Will attempt to connect to the server a number of times. If this fails it will
+	/// try the next server, and so on until a timeout period is reached.
+	int invoke( int argc, char* argv[]) const;
+
+   // support for forward compatibility, by changing boost archive version
+   // Chosen to change client side only
+   void allow_new_client_old_server(int archive_version_of_old_server);
+   int allow_new_client_old_server() const;
+
+	/// If testing, overwrite the task path set in the environment, required for
+	/// testing the task based commands.
+	/// By allowing environment to be changed, we allow smsinit,smscomplete, etc to be replaced
+	/// with ECF_CLIENT path executable
+	/// The following functions are only used for testing purposes.
+	/// Override task paths,env' & job creation at begin time
+	void taskPath(const std::string& s);
+	void set_jobs_password(const std::string&);
+ 	void setEnv( const std::vector<std::pair<std::string,std::string> >& e);
+ 	void testInterface(); // allow cmd construction to be aware thats it under test
+   const std::string& process_or_remote_id() const;
+
+ 	/// record each request its arguments and the round trip time to and from server
+ 	/// If the file can not opened for create/append then an runtime error exception is thrown
+   void enable_logging(const std::string& log_file_name);
+   void disable_logging();
+
+ 	/// The timeout feature allow the client to fail gracefully in the case
+ 	/// where the server has died/crashed. The timeout will ensure the socket is closed.
+ 	/// allowing the server to be restarted without getting the address is use error.
+ 	/// Set the timeout for each client->server communication:
+   //    connect        : timeout_ second
+   //    send request   : timeout_ second
+   //    receive reply  : timeout_ second
+ 	// default is 0 second, which means take the timeout from the command/request
+ 	// used for test only
+ 	void set_connect_timeout(int t);
+
+ 	/// ServerReply Holds the reply from the server
+ 	void reset(); // will clear local client definition and handle
+ 	const ServerReply& server_reply() const { return server_reply_;}
+ 	defs_ptr defs() const { return server_reply_.client_defs(); }
+	const std::string& get_string() const { return server_reply_.get_string(); }
+  	bool in_sync() const { return server_reply_.in_sync();}
+   bool get_news() const { return (server_reply_.get_news() != ServerReply::NO_NEWS); }
+	int client_handle() const { return server_reply_.client_handle(); }
+
+	/// If invoke returns 1, the error message can be retrieved with this function
+	const std::string& errorMsg() const { return server_reply_.error_msg();}
+
+	// ***************************************************************************
+	// Task/child based api. Only added here for test.
+	// Relies on environment for the other args
+	int initTask(const std::string& process_id)const
+	   { return invoke(TaskApi::init(process_id)); }
+	int abortTask(const std::string& reason_why = "") const
+	   { return invoke(TaskApi::abort(reason_why)); }
+	int eventTask(const std::string& eventName)  const
+	   { return invoke(TaskApi::event(eventName)); }
+	int meterTask(const std::string& meterName, const std::string& new_meter_value) const
+	   { return invoke(TaskApi::meter(meterName,new_meter_value)); }
+	int labelTask(const std::string& labelName, const std::vector<std::string>& labels) const
+	   { return invoke(TaskApi::label(labelName,labels)); }
+   int waitTask(const std::string& on_expression) const
+      { return invoke(TaskApi::wait(on_expression)); }
+	int completeTask() const
+	   { return invoke(TaskApi::complete()); }
+
+	// Support for python child commands, and python jobs
+	void set_child_path(const std::string& path);
+	void set_child_password(const std::string& pass);
+	void set_child_pid(const std::string& pid);
+	void set_child_try_no(unsigned int try_no);
+	void set_child_timeout(unsigned int seconds ); // ECF_TIMEOUT default is 24 hours allow python jobs to override
+	void child_init();
+	void child_abort(const std::string& reason  = "");
+	void child_event(const std::string& event_name_or_number);
+	void child_meter(const std::string& meter_name, int meter_value);
+	void child_label(const std::string& label_name, const std::string& label_value);
+	void child_wait(const std::string& on_expression);
+	void child_complete();
+
+	// ********************************************************************************
+	// The client api. Mirrors CtsApi on the whole
+	int getDefs() const;
+ 	int loadDefs(const std::string& filePath,
+ 	               bool force = false,     /* true means overwrite suite of same name */
+ 	               bool check_only = false /* true means don't send to server, just check only */
+ 	) const;
+ 	int load( const defs_ptr& defs, bool force  = false /*true means overwrite suite of same name*/) const
+ 	       { return load_in_memory_defs(defs,force); }
+	int sync(defs_ptr& client_defs) const;
+	int sync_local() const;
+	int news(defs_ptr& client_defs) const;
+	int news_local() const;
+
+	// find free port on local host. Not 100% accurate, use in test
+	static std::string find_free_port(int seed_port_number, bool debug = false);
+
+ 	bool wait_for_server_reply(int time_out = 60) const; // wait for server reply, returning false means timed out.
+   bool wait_for_server_death(int time_out = 60) const; // wait for server reply, returning true means server died,false means timed out.
+	int restartServer() const;
+	int haltServer() const;
+	int shutdownServer() const ;
+	int terminateServer() const;
+   int pingServer() const;
+   int server_load(const std::string& path_to_log_file = "") const { return invoke(CtsApi::server_load(path_to_log_file)); }
+   int debug_server_on() const;
+   int debug_server_off() const;
+   int stats() const;
+   int stats_reset() const;
+   int server_version() const;
+
+	int suites() const;
+	int ch_register( bool auto_add_new_suites, const std::vector<std::string>& suites) const;
+   int ch_suites() const;
+   int ch_drop(int client_handle) const;
+   int ch_drop_user(const std::string& user = "") const;
+	int ch_add(int client_handle, const std::vector<std::string>& suites) const;
+	int ch_remove(int client_handle, const std::vector<std::string>& suites) const;
+	int ch_auto_add(int client_handle, bool auto_add_new_suites) const;
+	int ch1_drop() const;
+	int ch1_add(const std::vector<std::string>& suites) const;
+	int ch1_remove(const std::vector<std::string>& suites) const;
+	int ch1_auto_add(bool auto_add_new_suites) const;
+
+	int begin(const std::string& suiteName,bool force = false) const;
+ 	int begin_all_suites(bool force = false) const;
+
+ 	int zombieGet() const;
+ 	int zombieFob(const Zombie& z) const;
+ 	int zombieFail(const Zombie& z) const;
+ 	int zombieAdopt(const Zombie& z) const;
+ 	int zombieBlock(const Zombie& z) const;
+   int zombieRemove(const Zombie& z) const;
+   int zombieKill(const Zombie& z) const;
+	int zombieFobCli(const std::string& absNodePath) const;
+ 	int zombieFailCli(const std::string& absNodePath) const;
+ 	int zombieAdoptCli(const std::string& absNodePath) const;
+ 	int zombieBlockCli(const std::string& absNodePath) const;
+   int zombieRemoveCli(const std::string& absNodePath) const;
+   int zombieKillCli(const std::string& absNodePath) const;
+
+   int job_gen(const std::string& absNodePath)  const;
+
+   int edit_history(const std::string& path) const;
+   int kill(const std::vector<std::string>& paths) const;
+   int kill(const std::string& absNodePath)  const;
+   int status(const std::vector<std::string>& paths) const;
+ 	int status(const std::string& absNodePath)  const;
+   int suspend(const std::vector<std::string>& paths) const;
+   int suspend(const std::string& absNodePath) const;
+   int resume(const std::vector<std::string>& paths) const;
+ 	int resume(const std::string& absNodePath)  const;
+   int check(const std::vector<std::string>& paths) const;
+   int check(const std::string& absNodePath) const;
+   int delete_nodes(const std::vector<std::string>& paths,bool force = false) const;
+   int delete_node(const std::string& absNodePath,bool force = false) const;
+ 	int delete_all(bool force = false) const;
+
+	int replace(  const std::string& absNodePath, const std::string& path_to_client_defs,
+	                  bool create_parents_as_required = true, bool force = false)  const;
+   int replace_1(  const std::string& absNodePath, defs_ptr client_defs, bool create_parents_as_required = true, bool force = false)  const;
+
+   int requeue(const std::vector<std::string>& paths,const std::string& option = "") const;
+   int requeue(const std::string& absNodePath,const std::string& option = "") const;
+   int run(const std::vector<std::string>& paths,bool force = false) const;
+   int run(const std::string& absNodePath,bool force = false) const;
+   int order(const std::string& absNodePath,const std::string& order) const; // slow
+   int order(const std::string& absNodePath,NOrder::Order) const;             // fast
+
+   int checkPtDefs(ecf::CheckPt::Mode m = ecf::CheckPt::UNDEFINED, int check_pt_interval = 0, int check_pt_save_time_alarm = 0) const;
+	int restoreDefsFromCheckPt() const;
+
+	int force(const std::string& absNodePath,const std::string& state_or_event,bool recursive = false,bool set_repeats_to_last_value = false) const;
+   int force(const std::vector<std::string>& paths,const std::string& state_or_event,bool recursive = false,bool set_repeats_to_last_value = false) const;
+
+ 	int freeDep(const std::vector<std::string>& paths,bool trigger = true, bool all = false, bool date = false, bool time = false) const;
+   int freeDep(const std::string& absNodePath,bool trigger = true, bool all = false, bool date = false, bool time = false) const;
+
+	int file(const std::string& absNodePath, const std::string& fileType, const std::string& max_lines = "10000") const;
+
+	int plug(const std::string& sourcePath, const std::string& destPath) const;
+
+	int alter(const std::vector<std::string>& paths,
+	          const std::string& alterType, /* one of [ add | change | delete | set_flag | clear_flag ] */
+	          const std::string& attrType,
+	          const std::string& name = "",
+	          const std::string& value = "") const { return invoke(CtsApi::alter(paths,alterType,attrType,name,value)); }
+   int alter(const std::string& path,
+             const std::string& alterType, /* one of [ add | change | delete | set_flag | clear_flag ] */
+             const std::string& attrType,
+             const std::string& name = "",
+             const std::string& value = "") const { return invoke(CtsApi::alter(path,alterType,attrType,name,value)); }
+
+	int reloadwsfile() const;
+	int group(const std::string& groupRequest) const;
+
+	int logMsg(const std::string& msg) const;
+   int new_log(const std::string& new_path = "") const;
+	int getLog(int lastLines = 0)  const;
+	int clearLog() const;
+   int flushLog() const;
+   int get_log_path() const;
+
+	int forceDependencyEval() const;
+
+	/// The first is for use by CLI(Commend level interface), the other are for ecFlowview/Python
+	int edit_script(  const std::string& path_to_task,
+	                  const std::string& edit_type,
+	                  const std::string& path_to_script = "",
+	                  bool create_alias = false,
+	                  bool run = true)
+		{return invoke(CtsApi::edit_script(path_to_task,edit_type,path_to_script,create_alias,run));}
+	int edit_script_edit(const std::string& path_to_task);                                                     // ecFlowview EDIT
+ 	int edit_script_preprocess(const std::string& path_to_task);                                               // ecFlowview PRE_PROCESS
+ 	int edit_script_submit(const std::string& path_to_task,const NameValueVec& used_variables );               // ecFlowview SUBMIT
+ 	int edit_script_preprocess(const std::string& path_to_task,const std::vector<std::string>& file_contents); // ecFlowview PRE_PROCESS USER File
+  	int edit_script_submit(const std::string& path_to_task,
+	                       const NameValueVec& used_variables,
+	                       const std::vector<std::string>& file_contents,
+	                       bool alias = false,
+	                       bool run = true);                                                                   // ecFlowview SUBMIT_FILE
+
+private:
+	/// returns 1 on error and 0 on success. The errorMsg can be accessed via errorMsg()
+	int invoke( const std::string& arg ) const;
+	int invoke( const std::vector<std::string>& args ) const;
+   int invoke(Cmd_ptr) const; // assumes clients of Cmd_ptr constructor has caught exceptions
+
+   int do_invoke_cmd(Cmd_ptr) const;
+	int load_in_memory_defs( const defs_ptr& clientDefs, bool force) const; /// For clients that want to load a in memory definition into the server.
+ 	std::string client_env_host_port() const;
+ 	void check_child_parameters() const;
+
+private:
+   friend class RoundTripRecorder;
+   friend class RequestLogger;
+private:
+	bool on_error_throw_exception_;
+	bool cli_;                             // Command Line Interface. Controls whether output written to standard out
+	bool test_;                            // used in testing only
+	bool testInterface_;                   // used in testing only
+	unsigned int connection_attempts_;     // No of attempts to establish connection with the server
+	unsigned int retry_connection_period_; // No of seconds to wait before trying to connect in case of failure.
+
+	std::string child_task_path_;                // support for python child commands
+	std::string child_task_password_;            // support for python child commands
+	std::string  child_task_pid_;                // support for python child commands
+	int  child_task_try_no_;                     // support for python child commands
+
+	mutable boost::posix_time::time_duration rtt_;// record latency for each cmd.
+	mutable boost::posix_time::ptime start_time_; // Used for time out and measuring latency
+	mutable ClientEnvironment clientEnv_;         // Will read the environment *once* on construction. Must be before Client options
+	mutable ClientOptions     args_;              // Used for argument parsing & creating client request
+	mutable ServerReply server_reply_;            // stores the local defs, client_handle, & all server replies
+
+   /// For use by python interface,
+   std::vector<std::string>::const_iterator changed_node_paths_begin() const { return server_reply_.changed_nodes().begin();}
+   std::vector<std::string>::const_iterator changed_node_paths_end() const { return server_reply_.changed_nodes().end();}
+   friend void export_Client();
+};
+
+// Allow logging and debug output of request round trip times
+class RequestLogger : private boost::noncopyable  {
+public:
+   RequestLogger(const ClientInvoker* ci);
+   ~RequestLogger();
+   void set_cts_cmd(Cmd_ptr cmd) { cmd_ = cmd;}
+private:
+   const ClientInvoker* ci_;
+   Cmd_ptr cmd_;
+};
+
+class RoundTripRecorder : private boost::noncopyable  {
+public:
+   RoundTripRecorder(const ClientInvoker* ci);
+   ~RoundTripRecorder();
+private:
+   const ClientInvoker* ci_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Client/src/ClientMain.cpp b/ecflow_4_0_7/Client/src/ClientMain.cpp
new file mode 100644
index 0000000..b1c2f85
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/ClientMain.cpp
@@ -0,0 +1,32 @@
+//============================================================================
+// Name        : ClientMain
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include "ClientInvoker.hpp"
+#include <iostream>
+
+int main( int argc, char* argv[] ) {
+
+	/// By default, error condition will throw exception.
+	try {
+	   ClientInvoker client;
+	   client.set_cli(true); // output log and file commands to standard out
+	   (void) client.invoke(argc,argv);
+	}
+	catch (std::exception& e ) {
+		std::cerr << e.what() << std::endl;
+		return 1;
+	}
+	return 0;
+}
diff --git a/ecflow_4_0_7/Client/src/ClientOptions.cpp b/ecflow_4_0_7/Client/src/ClientOptions.cpp
new file mode 100644
index 0000000..008e604
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/ClientOptions.cpp
@@ -0,0 +1,328 @@
+//============================================================================
+// Name        : ClientOptions
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Delegates argument parsing to the registered commands
+//============================================================================
+#include <boost/lexical_cast.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/bind.hpp>
+#include <iostream>
+#include <iomanip>
+
+#include "ClientOptions.hpp"
+#include "ClientEnvironment.hpp"
+#include "Version.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Child.hpp"
+#include "TaskApi.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost;
+namespace po = boost::program_options;
+
+static const char* client_env_description();
+static const char* client_task_env_description();
+
+
+ClientOptions::ClientOptions()
+{
+   // This could have been moved to parse(). However since the same ClienttInvoker can be
+   // be used for multiple commands. We have separated out the parts the need only be done once.
+   // hence improving the performance:
+   std::string title_help = "Client options, ";
+   title_help += Version::description();
+   title_help += "   ";
+   desc_ = new po::options_description( title_help , po::options_description::m_default_line_length + 80 );
+
+   // This will iterate over all the registered client to server commands and
+   // Each command will add to the option description, its required arguments
+   cmdRegistry_.addAllOptions(*desc_);
+
+   // Allow the host,port and rid to be  overridden by the command line
+   // This allows the jobs, which make other calls to ecflow_client from interfering with each other
+   desc_->add_options()("rid",po::value< string >()->implicit_value( string("") ),
+            "rid: If specified will override the environment variable ECF_RID, Can only be used for child commands");
+   desc_->add_options()("port",po::value< string >()->implicit_value( string("") ),
+            "port: If specified will override the environment variable ECF_PORT and default port number of 3141");
+   desc_->add_options()("host",po::value< string >()->implicit_value( string("") ),
+            "host: If specified will override the environment variable ECF_NODE and default host, localhost");
+}
+
+ClientOptions::~ClientOptions()
+{
+   delete desc_;
+}
+
+Cmd_ptr ClientOptions::parse(int argc, char* argv[],ClientEnvironment* env) const
+{
+   if (env->debug()) {
+      cout <<  "ClientOptions::parse argc=" << argc;
+      for(int i = 0; i < argc; i++) { cout << "  arg" << i << "=" << argv[i];}
+      cout << "\n";
+      std::cout << "help column width = " << po::options_description::m_default_line_length + 80 << "\n";
+   }
+
+   // parse arguments into 'vm'.
+   // Note: negative numbers get treated as options: i.e trying to change meter value to a negative number
+   //       --alter=/s1 change meter name -1
+   //       To avoid negative numbers from being treated as option use, we need to change command line style:
+   //       po::command_line_style::unix_style ^ po::command_line_style::allow_short
+   boost::program_options::variables_map vm;
+   po::store( po::parse_command_line( argc, argv, *desc_ ,po::command_line_style::unix_style ^ po::command_line_style::allow_short), vm );
+   po::notify( vm );
+
+
+   // Check to see if host or port, specified. This will override the environment variables
+   std::string host,port;
+   if ( vm.count( "port" ) ) {
+      port = vm[ "port" ].as< std::string > ();
+      if (env->debug())  std::cout << "   port " << port << " overridden at the command line\n";
+      try { boost::lexical_cast< int >( port );}
+      catch ( boost::bad_lexical_cast& e ) {
+         std::stringstream ss; ss << "ClientOptions::parse: The specified port(" << port << ") must be convertible to an integer";
+         throw std::runtime_error( ss.str() );
+      }
+   }
+   if ( vm.count( "host" ) ) {
+      host = vm[ "host" ].as< std::string > ();
+      if (env->debug())  std::cout << "   host " << host << " overridden at the command line\n";
+   }
+   if (!host.empty() || !port.empty()) {
+      if (host.empty()) host = env->hostSpecified();       // get the environment variable ECF_NODE
+      if (port.empty()) port = env->portSpecified();       // get the environment variable ECF_PORT
+      if (host.empty()) host = Str::LOCALHOST();           // if ECF_NODE not specified default to localhost
+      if (port.empty()) port = Str::DEFAULT_PORT_NUMBER(); // if ECF_PORT not specified use default
+      env->set_host_port(host,port);
+   }
+   if ( vm.count( "rid" ) ) {
+      std::string rid = vm[ "rid" ].as< std::string > ();
+      if (env->debug())  std::cout << "   rid " << rid << " overridden at the command line\n";
+      env->set_remote_id(rid);
+   }
+
+   // Defer the parsing of the command , to the command. This allows
+   // all cmd functionality to be centralised with the command
+   // This can throw std::runtime_error if arg's don't parse
+   Cmd_ptr client_request;
+   if ( ! cmdRegistry_.parse( client_request, vm, env) ) {
+
+      // The arguments did *NOT* match with any of the registered command.
+      // Hence if arguments don't match help, debug or version its an error
+      // Note: we did *NOT* check for a NULL client_request since *NOT* all
+      //       request need to create it. Some commands are client specific.
+      //       For example:
+      //         --server_load         // this is sent to server
+      //         --server_load=<path>  // no command returned, command executed by client
+      if ( vm.count( "help" ) )   {
+         string help_cmd = vm[ "help" ].as< std::string > ();
+         show_help(help_cmd);
+         return client_request;
+      }
+
+      if ( vm.count( "debug" ) )  {
+         cout << env->toString() << "\n";
+         return client_request;
+      }
+
+      if ( vm.count( "version" ) )  {
+         cout << Version::description()  << "\n";
+         exit(0);
+      }
+
+      std::stringstream ss;
+      ss << "ClientOptions::parse: Arguments did not match any commands.\n";
+      ss << "  argc=" << argc << "\n"; for(int i = 0; i < argc; i++) { ss << "  arg" << i << "=" << argv[i];}
+      ss << "\nUse --help to see all the available commands\n";
+      throw std::runtime_error(ss.str());
+   }
+
+   return client_request;
+}
+
+void ClientOptions::show_help(const std::string & help_cmd) const
+{
+   // WARNING: This assumes that there are no user/child commands with name 'summary','all','child','user'
+   if (help_cmd.empty()) {
+
+      cout << "\nClient/server based work flow package:\n\n";
+      cout << Version::description() << "\n\n";
+      cout << Ecf::CLIENT_NAME() << " provides the command line interface, for interacting with the server:\n";
+
+      cout << "Try:\n\n";
+      cout << "   " << Ecf::CLIENT_NAME() << " --help all       # List all commands, verbosely\n";
+      cout << "   " << Ecf::CLIENT_NAME() << " --help summary   # One line summary of all commands\n";
+      cout << "   " << Ecf::CLIENT_NAME() << " --help child     # One line summary of child commands\n";
+      cout << "   " << Ecf::CLIENT_NAME() << " --help user      # One line summary of user command\n";
+      cout << "   " << Ecf::CLIENT_NAME() << " --help <cmd>     # Detailed help on each command\n\n";
+
+      show_all_commands("Commands:");
+    }
+    else {
+       if (help_cmd == "all") cout << *desc_ << "\n";
+       else if (help_cmd == "summary") show_cmd_summary("\nEcflow client commands:\n");
+       else if (help_cmd == "child")   show_cmd_summary("\nEcflow child client commands:\n","child");
+       else if (help_cmd == "user")    show_cmd_summary("\nEcflow user client commands:\n","user");
+       else {
+          // Help on individual command
+          const po::option_description* od = desc_->find_nothrow(help_cmd,
+                                                   true,  /*approx, will find nearest match*/
+                                                   false, /*long_ignore_case = false*/
+                                                   false  /*short_ignore_case = false*/
+                                                   );
+//               cout << "long_name = " << od.long_name() << "\n";
+//               cout << "format_name = " << od.format_name() << "\n";
+//               cout << "format_parameter = " << od.format_parameter() << "\n";
+          if (od) {
+             cout << "\n";
+             cout << od->long_name() << "\n";
+             for(size_t i =0; i< od->long_name().size(); i++)  cout << "-";
+             cout << "\n\n";
+             cout << od->description() << "\n\n";
+             cout << client_env_description();
+             if ( od->long_name() == TaskApi::initArg()  ||
+                  od->long_name() == TaskApi::completeArg() ||
+                  od->long_name() == TaskApi::abortArg()  ||
+                  od->long_name() == TaskApi::waitArg()  ||
+                  od->long_name() == TaskApi::eventArg()  ||
+                  od->long_name() == TaskApi::labelArg()  ||
+                  od->long_name() == TaskApi::meterArg()) {
+                cout << "\n";
+                cout << client_task_env_description();
+             }
+          }
+          else {
+             show_all_commands("No matching command found, please choose from:");
+          }
+       }
+    }
+}
+
+void ClientOptions::show_all_commands(const char* title) const
+{
+   cout << title << "\n";
+   // take a copy, since we need to sort
+   std::vector< boost::shared_ptr<po::option_description> > options = desc_->options();
+
+   // sort using long_name
+   std::sort(options.begin(),options.end(),
+            boost::bind(std::less<std::string>(),
+                          boost::bind(&po::option_description::long_name,_1),
+                          boost::bind(&po::option_description::long_name,_2)));
+
+   size_t vec_size = options.size();
+   size_t max_width = 0;
+   for(size_t i = 0; i < vec_size; i++) { max_width = std::max(max_width,options[i]->long_name().size()); }
+   max_width += 1;
+   for(size_t i = 0; i < vec_size; i++) {
+      if (i == 0 || i % 5 == 0) cout << "\n   ";
+      cout << left << std::setw(max_width) << options[i]->long_name();
+   }
+   cout << "\n";
+}
+
+void ClientOptions::show_cmd_summary(const char *title,const std::string& user_or_child) const
+{
+   assert(user_or_child.empty() || user_or_child == "child" || user_or_child == "user");
+   cout << title << "\n";
+
+   // take a copy, since we need to sort
+   std::vector< boost::shared_ptr<po::option_description> > options = desc_->options();
+
+   // sort using long_name
+   std::sort(options.begin(),options.end(),
+            boost::bind(std::less<std::string>(),
+                          boost::bind(&po::option_description::long_name,_1),
+                          boost::bind(&po::option_description::long_name,_2)));
+
+   size_t vec_size = options.size();
+   size_t max_width = 0;
+   for(size_t i = 0; i < vec_size; i++) { max_width = std::max(max_width,options[i]->long_name().size()); }
+   max_width += 1;
+   for(size_t i = 0; i < vec_size; i++) {
+
+      if (user_or_child == "child" && Child::valid_child_cmd(options[i]->long_name())) {
+         std::vector< std::string > lines;
+         Str::split(options[i]->description(),lines,"\n");
+         if (!lines.empty()) {
+            cout << "  " << left << std::setw(max_width) << options[i]->long_name() << " ";
+            cout << "child  ";
+            cout << lines[0] << "\n";
+         }
+      }
+      else if (user_or_child == "user" && !Child::valid_child_cmd(options[i]->long_name())) {
+         std::vector< std::string > lines;
+         Str::split(options[i]->description(),lines,"\n");
+         if (!lines.empty()) {
+            cout << "  " << left << std::setw(max_width) << options[i]->long_name() << " ";
+            cout << "user   ";
+            cout << lines[0] << "\n";
+         }
+      }
+      else if (user_or_child .empty()) {
+         std::vector< std::string > lines;
+         Str::split(options[i]->description(),lines,"\n");
+         if (!lines.empty()) {
+            cout << "  " << left << std::setw(max_width) << options[i]->long_name() << " ";
+            if (Child::valid_child_cmd(options[i]->long_name())) cout << "child  ";
+            else cout << "user   ";
+            cout << lines[0] << "\n";
+         }
+      }
+   }
+   cout << "\n";
+}
+
+const char* client_env_description() {
+   return
+            "The client reads in the following environment variables. These are read by user and child command\n\n"
+            "|----------|----------|------------|-------------------------------------------------------------------|\n"
+            "| Name     |  Type    | Required   | Description                                                       |\n"
+            "|----------|----------|------------|-------------------------------------------------------------------|\n"
+            "| ECF_NODE | <string> | Mandatory* | The host name of the main server. defaults to 'localhost'         |\n"
+            "| ECF_PORT |  <int>   | Mandatory* | The TCP/IP port to call on the server. Must be unique to a server |\n"
+            "|----------|----------|------------|-------------------------------------------------------------------|\n\n"
+            "* The host and port must be specified in order for the client to communicate with the server, this can \n"
+            "  be done by setting ECF_NODE, ECF_PORT or by specifying --host <host> --port <int> on the command line\n"
+            ;
+}
+
+const char* client_task_env_description()
+{
+   return
+            "The following environment variables are specific to child commands.\n"
+            "The scripts should export the mandatory variables. Typically defined in the head/tail includes files\n\n"
+            "|--------------|----------|-----------|---------------------------------------------------------------|\n"
+            "| Name         |  Type    | Required  | Description                                                   |\n"
+            "|--------------|----------|-----------|---------------------------------------------------------------|\n"
+            "| ECF_NAME     | <string> | Mandatory | Full path name to the task                                    |\n"
+            "| ECF_PASS     | <string> | Mandatory | The jobs password, allocated by server, then used by server to|\n"
+            "|              |          |           | authenticate client request                                   |\n"
+            "| ECF_TRYNO    |  <int>   | Mandatory | The number of times the job has run. This is allocated by the |\n"
+            "|              |          |           | server, and used in job/output file name generation.          |\n"
+            "| ECF_RID      | <string> | Mandatory | The process identifier. Helps zombies identification and      |\n"
+            "|              |          |           | automated killing of running jobs                             |\n"
+            "| ECF_TIMEOUT  |  <int>   | optional  | Max time in *seconds* for client to deliver message to main   |\n"
+            "|              |          |           | server. The default is 24 hours                               |\n"
+            "| ECF_HOSTFILE | <string> | optional  | File that lists alternate hosts to try, if connection to main |\n"
+            "|              |          |           | host fails                                                    |\n"
+            "| ECF_DENIED   |  <any>   | optional  | Provides a way for child to exit with an error, if server     |\n"
+            "|              |          |           | denies connection. Avoids 24hr wait. Note: when you have      |\n"
+            "|              |          |           | hundreds of tasks, using this approach requires a lot of      |\n"
+            "|              |          |           | manual intervention to determine job status                   |\n"
+            "| NO_ECF       |  <any>   | optional  | If set exit's ecflow_client immediately with success. This    |\n"
+            "|              |          |           | allows the scripts to be tested independent of the server     |\n"
+            "|--------------|----------|-----------|---------------------------------------------------------------|\n"
+            ;
+}
+
diff --git a/ecflow_4_0_7/Client/src/ClientOptions.hpp b/ecflow_4_0_7/Client/src/ClientOptions.hpp
new file mode 100644
index 0000000..2deb931
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/ClientOptions.hpp
@@ -0,0 +1,50 @@
+#ifndef CLIENTOPTIONS_HPP_
+#define CLIENTOPTIONS_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : ClientOptions
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Will parse the client argument line, and construct a command
+//               that will be sent to the server.
+//
+// The environment must be read in before the program options. The program options
+// will construct the commands, some of which require the environment
+// We could have just done this as last part of constructor. However we need a
+// separation between reading the environment and reading the option for:
+// a/ testing purposes. i.e as this allows us to inject/override the task path
+//    read in from the environment.
+// b/ override host and port number.
+// will throw std::runtime_error for invalid arguments
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+#include "CtsCmdRegistry.hpp"
+class ClientEnvironment;
+
+class ClientOptions : private boost::noncopyable {
+public:
+   /// Will create command register, & ask each cmd to describe their arguments
+   ClientOptions();
+   ~ClientOptions();
+
+	/// parse the arguments and create the client request that is to be sent
+   /// to the server. Will throw std::runtime_error if invalid arguments specified
+	Cmd_ptr parse(int argc, char* argv[], ClientEnvironment*) const;
+
+private:
+
+	void show_help(const std::string& help_cmd) const;
+   void show_all_commands(const char* title) const;
+   void show_cmd_summary(const char* title, const std::string& user_or_child = "") const;
+
+  	CtsCmdRegistry cmdRegistry_;
+  	boost::program_options::options_description* desc_;
+};
+#endif
diff --git a/ecflow_4_0_7/Client/src/Rtt.cpp b/ecflow_4_0_7/Client/src/Rtt.cpp
new file mode 100644
index 0000000..a7be89f
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/Rtt.cpp
@@ -0,0 +1,180 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple singleton implementation of log
+//============================================================================
+#include <assert.h>
+#include <vector>
+#include <iostream>
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+#include "boost/date_time/posix_time/posix_time.hpp" //include all types plus i/o
+
+#include "Rtt.hpp"
+#include "File.hpp"
+#include "Str.hpp"
+#include "Indentor.hpp"
+
+using namespace std;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+namespace ecf {
+
+Rtt* Rtt::instance_ = NULL;
+
+void Rtt::create(const std::string& filename)
+{
+   if ( instance_ == NULL) {
+      instance_ = new Rtt(filename);
+   }
+}
+
+void Rtt::destroy()
+{
+   delete instance_;
+   instance_ = NULL;
+}
+
+
+Rtt::Rtt(const std::string& filename)
+: file_(filename.c_str(), ios::out | ios::app)
+{
+   if (!file_.is_open()) {
+      std::cerr << "Rtt::Rtt Could not open file '" << filename << "'\n";
+      std::runtime_error("Rtt::Rtt: Could not open file " + filename);
+   }
+}
+
+Rtt::~Rtt(){}
+
+void Rtt::log(const std::string& message)
+{
+   file_ << message << endl;
+}
+
+void rtt(const std::string& message)
+{
+   if (Rtt::instance()) {
+      Rtt::instance()->log(message);
+   }
+}
+
+std::string Rtt::analyis(const std::string& filename)
+{
+   std::vector<std::string> lines;
+   if (!File::splitFileIntoLines(filename,lines)) {
+      std::cout << "Rtt::analyis: could not open file " << filename << "\n";
+      return string();
+   }
+
+   // Typical format
+   // localhost:3141 --ping :ma0 rtt:00:00:00.001082
+   // localhost:3141 --log=new Test/data/ECF_HOME/test_wait_cmd/test_wait_cmd.def_log  :ma0 rtt:00:00:00.000930
+   // localhost:3141 --zombie_get :ma0 rtt:00:00:00.003982
+
+   /// Extract the command name and time, and add to map, to compute averages, min,max & standard deviation
+   map<string,vector<time_duration> > cmd_time_map;
+   size_t max_cmd_size = 0;
+   for(size_t i = 0; i < lines.size(); i++) {
+
+      if (lines[i].empty()) continue;
+//      cout << i << ":" << lines[i] << "   ";
+      string::size_type dash = lines[i].find("--");
+      string::size_type rtt_pos = lines[i].find(Rtt::tag());
+      if (dash == std::string::npos) continue;
+      if (rtt_pos == std::string::npos) continue;
+
+
+      int cmd_length = 0;
+      string::size_type equals = lines[i].find("=",dash);
+      string::size_type space = lines[i].find(" ",dash);
+      if (equals != std::string::npos)  cmd_length = equals;
+      else if (space != std::string::npos)  cmd_length = space;
+      string cmd = lines[i].substr(0,cmd_length);
+      max_cmd_size = std::max(max_cmd_size,cmd.size());
+
+      string time = lines[i].substr(rtt_pos+4);
+      time_duration td(duration_from_string(time));
+//      cout << "  cmd:(" << cmd << ") time(" << to_simple_string(td) << ")\n";
+
+      map<string,vector<time_duration> >::iterator cmd_iterator = cmd_time_map.find(cmd);
+      if ( cmd_iterator == cmd_time_map.end()) {
+         vector<time_duration> vec;
+         vec.push_back(td);
+         std::pair<string, vector<time_duration> > p = std::make_pair(cmd,vec);
+         cmd_time_map.insert( p );
+      }
+      else {
+         (*cmd_iterator).second.push_back(td);
+      }
+   }
+
+   time_duration total(0,0,0,0);
+   int           total_requests = 0;
+
+   // Create title
+   std::stringstream ss;
+   ss << left << setw(max_cmd_size+1) << "Command" << right << setw(5) << "count" << setw(9) << "min" << setw(9) << "average" << setw(9) << "max" << setw(9) << right << "std\n";
+   std::pair<string, vector<time_duration> > p;
+   BOOST_FOREACH(p, cmd_time_map) {
+
+      time_duration average_td(0,0,0,0);
+      time_duration min(24,59,59,0);
+      time_duration max(0,0,0,0);
+      for(size_t i = 0; i < p.second.size(); i++) {
+         average_td += p.second[i];
+         total_requests++;
+         total +=  p.second[i];
+         min = std::min(min,p.second[i]);
+         max = std::max(max,p.second[i]);
+      }
+
+      ss << left << setw(max_cmd_size+1) << p.first << setw(5) << right << p.second.size();
+      if (p.second.empty()) {
+         ss << setw(9) << right << p.second[0].total_microseconds() << " ? ";
+      }
+      else if ( p.second.size() ==  1) {
+         ss << setw(9) << right << p.second[0].total_microseconds();
+      }
+      else {
+          int average = average_td.total_microseconds()/p.second.size();
+
+//          bool debug = false;
+//          if (p.first == "begin")   debug = true;
+
+          // compute standard deviation
+          unsigned int total_diff_from_avg = 0;
+          for(size_t i = 0; i < p.second.size(); i++) {
+             int diff = p.second[i].total_microseconds() - average;
+             int diff_squared = diff * diff;
+             total_diff_from_avg += diff_squared;
+//             if (debug) cout << "diff: " << diff << " diff_squared: " << diff_squared << " total_diff_from_avg: " << total_diff_from_avg << "\n";
+          }
+
+          double avg =  total_diff_from_avg/p.second.size();
+          int stdd = (int)sqrt(avg);
+//          if (debug) cout << "avg: " << avg << " stdd: " << stdd << "\n";
+
+          ss << setw(9) << right << min.total_microseconds() ;
+          ss << setw(9) << right << average;
+          ss << setw(9) << right << max.total_microseconds();
+          ss << setw(9) << right << stdd;
+      }
+      ss << "\n";
+   }
+   ss << "\ntotal round trip time " << to_simple_string(total) << " for " << total_requests << " requests\n";
+   return ss.str();
+}
+
+}
+
diff --git a/ecflow_4_0_7/Client/src/Rtt.hpp b/ecflow_4_0_7/Client/src/Rtt.hpp
new file mode 100644
index 0000000..1f933ab
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/Rtt.hpp
@@ -0,0 +1,62 @@
+#ifndef RTT_HPP_
+#define RTT_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Rtt
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Simple client based singleton for recording round trip times
+//               of all client based command
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <fstream>
+#include <sstream>
+#include <boost/noncopyable.hpp>
+#include <boost/lambda/lambda.hpp>
+
+namespace ecf {
+
+class Rtt : private boost::noncopyable {
+public:
+   static void create(const std::string& filename);
+   static void destroy();
+   static Rtt* instance() { return instance_;}
+
+   void log(const std::string& message);
+
+   /// Open the file, and create average times for all client invoker round trip times
+   static std::string analyis(const std::string& filename);
+
+   /// Used in output and parsing, when computing averages
+   static const char* tag() { return "rtt:";}
+
+private:
+   ~Rtt();
+   Rtt(const std::string& filename);
+   static Rtt* instance_;
+   mutable std::ofstream file_;
+};
+
+void rtt(const std::string& message);
+
+// allow user to do the following:
+// RTT("this is " << path << " ok ");
+//
+// helper, see STRINGIZE() macro
+template <typename Functor>
+std::string stringize_rtt(Functor const & f) {
+   std::ostringstream out;
+   f(out);
+   return out.str();
+}
+#define STRINGIZE_RTT(EXPRESSION)  (ecf::stringize_rtt(boost::lambda::_1 << EXPRESSION))
+#define RTT(EXPRESSION) ecf::rtt(STRINGIZE_RTT(EXPRESSION))
+}
+#endif
diff --git a/ecflow_4_0_7/Client/src/UrlCmd.cpp b/ecflow_4_0_7/Client/src/UrlCmd.cpp
new file mode 100644
index 0000000..1d350c4
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/UrlCmd.cpp
@@ -0,0 +1,66 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Client side command only.
+//               Placed in this category, since the server does not need to link
+//               with it.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/foreach.hpp>
+#include "UrlCmd.hpp"
+#include "Defs.hpp"
+#include "Node.hpp"
+
+UrlCmd::UrlCmd(defs_ptr defs, const std::string& absNodePath)
+: defs_(defs),node_(NULL)
+{
+	if (!defs_.get()) {
+		throw std::runtime_error("UrlCmd: The definition parameter is empty");
+	}
+
+	if (absNodePath.empty()) {
+		throw std::runtime_error("UrlCmd: The node path parameter is empty");
+	}
+
+	node_ = defs_->findAbsNode(absNodePath).get();
+	if ( !node_ ) {
+		std::string errorMsg = "UrlCmd: The node path parameter '";
+		errorMsg += absNodePath;
+		errorMsg += "' can not be found.";
+		throw std::runtime_error(errorMsg);
+ 	}
+}
+
+std::string UrlCmd::getUrl() const
+{
+	std::string url;
+ 	node_->findParentUserVariableValue("ECF_URL_CMD", url);
+ 	if (url.empty()) {
+		std::string errorMsg = "UrlCmd: Could not find variable ECF_URL_CMD from node ";
+		errorMsg += node_->absNodePath();
+ 		throw std::runtime_error(errorMsg);
+ 	}
+
+ 	if (!node_->variableSubsitution(url)) {
+		std::string errorMsg = "UrlCmd:: Variable substitution failed for ";
+		errorMsg += url;
+ 		throw std::runtime_error(errorMsg);
+ 	}
+ 	return url;
+}
+
+void UrlCmd::execute() const
+{
+ 	// invoke as a system command, we don't use System::instance()
+ 	// since this is on the client side. hence no need manage the spawned process
+ 	system(getUrl().c_str());
+}
+
diff --git a/ecflow_4_0_7/Client/src/UrlCmd.hpp b/ecflow_4_0_7/Client/src/UrlCmd.hpp
new file mode 100644
index 0000000..14999b0
--- /dev/null
+++ b/ecflow_4_0_7/Client/src/UrlCmd.hpp
@@ -0,0 +1,40 @@
+#ifndef URL_CMD_HPP_
+#define URL_CMD_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Version     : Beta version for test use only
+// Revision    : $Revision$ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Client side command only.
+//               Placed in this category, since the server does not need to link
+//               with it.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <string>
+#include <boost/noncopyable.hpp>
+#include "NodeFwd.hpp"
+
+class UrlCmd : private boost::noncopyable {
+public:
+	/// Will throw std::runtime_error if defs or node path is not correct
+	UrlCmd(defs_ptr defs, const std::string& absNodePath );
+
+	/// Will throw std::runtime_error if url can not be formed
+	std::string getUrl() const;
+
+	/// Execute the url command
+	void execute() const;
+
+private:
+	defs_ptr defs_;
+	Node* node_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Client/test/EcfPortLock.hpp b/ecflow_4_0_7/Client/test/EcfPortLock.hpp
new file mode 100644
index 0000000..5cdcce3
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/EcfPortLock.hpp
@@ -0,0 +1,79 @@
+#ifndef ECF_PORT_LOCK_HPP_
+#define ECF_PORT_LOCK_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : This class is used in TEST only
+//               It allows functionality to create a lock file file, so that different process
+//               can avoid creating server with same port number
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include "boost/filesystem.hpp"
+#include "boost/filesystem/operations.hpp"
+#include <boost/lexical_cast.hpp>
+#include <sstream>
+#include <iostream>
+#include "File.hpp"
+
+namespace ecf {
+
+class EcfPortLock : private boost::noncopyable {
+public:
+
+   static bool is_free(int port)
+   {
+      std::string the_port = boost::lexical_cast<std::string>(port);
+      if (boost::filesystem::exists(port_file(the_port))) {
+   //      std::cout << "EcfPortLock::is_free returning FALSE\n ";
+         return false;
+      }
+   //   std::cout << "EcfPortLock::is_free returning TRUE\n ";
+      return true;
+   }
+
+   static void create(const std::string& the_port)
+   {
+      std::string the_file = port_file( the_port );
+   //   std::cout << "EcfPortLock::create " << the_file << "\n";
+      std::string errorMsg;
+      if (!ecf::File::create(the_file,"",errorMsg)) {
+         std::stringstream sb;
+         sb << "EcfPortLock::create_free_port_file : could not create file " << the_file;
+         throw std::runtime_error(sb.str());
+      }
+   }
+
+   static void remove(const std::string& the_port)
+   {
+      std::string the_file = port_file(the_port);
+   //   std::cout << "EcfPortLock::remove " << the_file << "\n";
+      boost::filesystem::remove(the_file);
+   }
+
+private:
+   EcfPortLock();
+
+   static std::string port_file(const std::string& the_port)
+   {
+      // We need the *SAME* location so that different process find the same file. Get to the workspace directory
+      std::string path = File::root_build_dir();
+      //std::cout << "\nworkspace_dir = " << path << " ------------------------------------------------------\n";
+      path += "/ECF_PORT_used_";
+      path += the_port;
+      path += ".lock";
+      return path;
+   }
+};
+}
+#endif
diff --git a/ecflow_4_0_7/Client/test/InvokeServer.hpp b/ecflow_4_0_7/Client/test/InvokeServer.hpp
new file mode 100644
index 0000000..659fa1f
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/InvokeServer.hpp
@@ -0,0 +1,158 @@
+#ifndef INVOKESERVER_HPP_
+#define INVOKESERVER_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include <boost/noncopyable.hpp>
+
+#include "TestHelper.hpp"
+#include "ClientInvoker.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+#include "EcfPortLock.hpp"
+#include "Host.hpp"
+
+class InvokeServer : private boost::noncopyable {
+public:
+	InvokeServer(const std::string& msg,
+	               const std::string& port = ecf::Str::DEFAULT_PORT_NUMBER(),
+	               bool disable_job_generation = false,
+                  bool remove_checkpt_file_before_server_start = true,
+                  bool remove_checkpt_file_after_server_exit = true
+	             ) : port_(port),
+	                 host_(ClientEnvironment::hostSpecified()),
+	                 remove_checkpt_file_after_server_exit_(remove_checkpt_file_after_server_exit)
+   {
+		if (host_.empty()) {
+			if(!msg.empty()) std::cout << msg << "   port(" << port_ << ")" << std::endl;
+
+			doStart(port_,disable_job_generation,remove_checkpt_file_before_server_start);
+		}
+		else {
+			// Start of test, clear any existing defs on remote server
+			// Assuming this has been started on DEFAULT_PORT_NUMBER, can't use existing port_
+			port_ = ecf::Str::DEFAULT_PORT_NUMBER();
+			std::string test_name = msg;
+         test_name += " on ";
+         test_name += host_;
+         test_name += ecf::Str::COLON();
+         test_name += port_;
+
+			std::cout << test_name << std::endl;
+
+			ClientInvoker theClient(host_,port_);
+		   theClient.logMsg( test_name );
+		   BOOST_REQUIRE_MESSAGE( theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " failed should return 0. Should Delete ALL existing defs in the server\n" << theClient.errorMsg());
+		}
+	}
+
+   InvokeServer(const std::string& port,
+                  bool stop_ambiguaty,
+                  bool disable_job_generation = false,
+                  bool remove_checkpt_file_before_server_start = true,
+                  bool remove_checkpt_file_after_server_exit = true
+                ) : port_(port),
+                    remove_checkpt_file_after_server_exit_(remove_checkpt_file_after_server_exit)
+   {
+      // host_ is empty.
+      doStart(port_,disable_job_generation,remove_checkpt_file_before_server_start);
+   }
+
+	~InvokeServer() {
+	   // This will also remove the generated files.
+	   // Will only terminate local server, host_ is *EMPTY* for local server, using two constructors above
+	   if (host_.empty()) {
+	      doEnd(ecf::Str::LOCALHOST(), port_, remove_checkpt_file_after_server_exit_);
+	   }
+	}
+
+	const std::string& port() const { return port_; }
+	const std::string& host() const { if (host_.empty()) return ecf::Str::LOCALHOST(); return host_; }
+
+	std::string ecf_log_file() const            { return host_name_.ecf_log_file(port_);}
+ 	std::string ecf_checkpt_file() const        { return host_name_.ecf_checkpt_file(port_); }
+	std::string ecf_backup_checkpt_file() const { return host_name_.ecf_backup_checkpt_file(port_); }
+
+
+	static void doStart(const std::string& port,bool disable_job_generation = false, bool remove_checkpt_file_before_server_start = true)
+	{
+		/// Remove check pt and backup check pt file, else server will load it & remove log file
+		ecf::Host h;
+		if (remove_checkpt_file_before_server_start) {
+		   boost::filesystem::remove(h.ecf_checkpt_file(port));
+		   boost::filesystem::remove(h.ecf_backup_checkpt_file(port));
+		}
+		boost::filesystem::remove(h.ecf_log_file(port));
+
+		// start the server in the background
+		std::string theServerInvokePath = ecf::File::find_ecf_server_path();
+		BOOST_REQUIRE_MESSAGE(!theServerInvokePath.empty(),"InvokeServer::doStart: The server program could not be found");
+      BOOST_REQUIRE_MESSAGE(boost::filesystem::exists(theServerInvokePath),"InvokeServer::doStart: server exe does not exist at:" << theServerInvokePath);
+
+		// Create a port file. To avoid creating multiple servers on the same port number
+		ecf::EcfPortLock::create( port );
+
+		// Make sure server starts in the background to avoid hanging test
+		theServerInvokePath += " --port=" + port;
+		if (disable_job_generation) {
+		   theServerInvokePath += " --dis_job_gen";
+		}
+		theServerInvokePath += " &";
+
+		//std::cout << "InvokeServer::doStart port = " << port << " server path = " <<  theServerInvokePath << "\n";
+		(void)system( theServerInvokePath.c_str() );
+
+		// Allow time for server process to kick in.
+      ClientInvoker theClient(ecf::Str::LOCALHOST(),port);
+      BOOST_REQUIRE_MESSAGE(theClient.wait_for_server_reply(),"InvokeServer::doStart: Server failed to start after 60 second on " << ecf::Str::LOCALHOST() << ":" << port);
+	}
+
+
+   static void doEnd( const std::string& host, const std::string& port, bool remove_checkpt_file_after_server_exit )
+   {
+      //    std::cout << "*****InvokeServer::doEnd    Closing server on  " << host << ecf::Str::COLON() << port << "\n";
+      {
+         ClientInvoker theClient(host,port);
+         BOOST_REQUIRE_NO_THROW( theClient.terminateServer() );
+         BOOST_REQUIRE_MESSAGE( theClient.wait_for_server_death(),"Failed to terminate server after 60 seconds\n");
+      }
+
+      // remove port file. This prevented multiple different process from opening servers with same port number
+      ecf::EcfPortLock::remove( port );
+
+      // Remove generated file comment for debug
+      ecf::Host h;
+      boost::filesystem::remove(h.ecf_log_file(port));
+      BOOST_CHECK_MESSAGE(!boost::filesystem::exists(h.ecf_log_file(port)), "log file " << h.ecf_log_file(port) << " not deleted\n");
+
+      if (remove_checkpt_file_after_server_exit) {
+         boost::filesystem::remove(h.ecf_checkpt_file(port));
+         boost::filesystem::remove(h.ecf_backup_checkpt_file(port));
+         BOOST_CHECK_MESSAGE(!boost::filesystem::exists(h.ecf_checkpt_file(port)), "file " << h.ecf_checkpt_file(port) << " not deleted\n");
+         BOOST_CHECK_MESSAGE(!boost::filesystem::exists(h.ecf_backup_checkpt_file(port)), "file " << h.ecf_backup_checkpt_file(port) << " not deleted\n");
+      }
+   }
+
+private:
+	InvokeServer(const InvokeServer&);
+	std::string port_;
+	std::string host_;
+	ecf::Host   host_name_;
+	bool remove_checkpt_file_after_server_exit_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Client/test/SCPort.cpp b/ecflow_4_0_7/Client/test/SCPort.cpp
new file mode 100644
index 0000000..e367a33
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/SCPort.cpp
@@ -0,0 +1,42 @@
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <iostream>
+#include "SCPort.hpp"
+#include "EcfPortLock.hpp"
+#include "ClientInvoker.hpp"
+
+namespace ecf {
+
+// init the globals. Note we dont use 3141, so that in the case where we already
+// have a remote/local server started external to the test, it does not clash
+// Also debug and release version use different port numbers to avoid clashes, if both tests run at same time
+
+#ifdef DEBUG
+int SCPort::thePort_ = 3161;
+#else
+int SCPort::thePort_ = 3142;
+#endif
+
+std::string SCPort::next()
+{
+   // Use a combination of local lock file, and pinging the server
+   while (!EcfPortLock::is_free(thePort_)) thePort_++;
+   // std::cout << "SCPort::next() = " << thePort << "\n";
+   return ClientInvoker::find_free_port(thePort_);
+}
+
+}
diff --git a/ecflow_4_0_7/Client/test/SCPort.hpp b/ecflow_4_0_7/Client/test/SCPort.hpp
new file mode 100644
index 0000000..bf036f9
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/SCPort.hpp
@@ -0,0 +1,42 @@
+#ifndef PORT_HPP_
+#define PORT_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+
+namespace ecf {
+
+// If two different process/servers both try to use the same port number, you
+// get an "Address in use" error, even if one the process is dead. This is
+// because the kernel does not immediately release the resource and there is
+// time out period. To get round this we will start the new server/client
+// and use a different port number.
+
+class SCPort {
+public:
+
+	/// make sure we have a unique port, each time next() is called;
+	static std::string next();
+
+private:
+	SCPort();
+	~SCPort();
+
+	static int thePort_;
+};
+}
+
+#endif
diff --git a/ecflow_4_0_7/Client/test/TestCheckPtDefsCmd.cpp b/ecflow_4_0_7/Client/test/TestCheckPtDefsCmd.cpp
new file mode 100644
index 0000000..2d8c9ae
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestCheckPtDefsCmd.cpp
@@ -0,0 +1,237 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #29 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// ************************************************************************************
+// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+// ************************************************************************************
+BOOST_AUTO_TEST_CASE( test_check_pt_defs_cmd )
+{
+	// This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+	InvokeServer invokeServer("Client:: ...test_check_pt_defs_cmd",SCPort::next());
+
+	ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+	BOOST_REQUIRE_MESSAGE( theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0 server not started, or connection refused\n" << theClient.errorMsg());
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+   BOOST_REQUIRE_MESSAGE(theClient.loadDefs(path) == 0,"load defs failed \n" << theClient.errorMsg());
+
+   // First time. Should create a ecf_checkpt_file, but _no_ backup file
+	BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " failed should return 0\n" << theClient.errorMsg());
+	BOOST_REQUIRE_MESSAGE(fs::exists(invokeServer.ecf_checkpt_file()),CtsApi::checkPtDefs() << " failed file(" << invokeServer.ecf_checkpt_file() << ") not saved");
+	BOOST_REQUIRE_MESSAGE(fs::file_size(invokeServer.ecf_checkpt_file()) !=0,"Expected check point file(" << invokeServer.ecf_checkpt_file() << "), to have file size > 0");
+   if (ClientEnvironment::hostSpecified().empty()) {
+      // This check only valid if server was invoked locally. Ignore for remote servers
+      BOOST_REQUIRE_MESSAGE(!fs::exists(invokeServer.ecf_backup_checkpt_file()), "Backup check point file(" << invokeServer.ecf_backup_checkpt_file() << ")should not exist,for very first time.");
+   }
+
+	// Save checkpoint file again. This should create a backup file, we should have ecf_checkpt_file and ecf_backup_checkpt_file
+	BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " failed should return 0\n" << theClient.errorMsg());
+	BOOST_REQUIRE_MESSAGE(fs::exists(invokeServer.ecf_checkpt_file()),CtsApi::checkPtDefs() << " failed No check pt file(" << invokeServer.ecf_checkpt_file() << ") saved");
+	BOOST_REQUIRE_MESSAGE(fs::file_size(invokeServer.ecf_checkpt_file()) !=0,"Expected check point file(" << invokeServer.ecf_checkpt_file() << ") to have file size > 0  ");
+	BOOST_REQUIRE_MESSAGE(fs::exists(invokeServer.ecf_backup_checkpt_file()), "Backup check point file(" << invokeServer.ecf_backup_checkpt_file() << ") not created");
+	BOOST_REQUIRE_MESSAGE(fs::file_size(invokeServer.ecf_backup_checkpt_file()) !=0,"Expected backup check point file(" << invokeServer.ecf_backup_checkpt_file() << "), to have file size > 0");
+
+	// Check the defaults for mode , interval and alarm time before making any changes
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::ON_TIME, " Expected default check pt mode to be ON_TIME");
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_interval_ == CheckPt::default_interval(), " Expected default check pt interval of " << CheckPt::default_interval() << " but found " << theClient.server_reply().stats().checkpt_interval_);
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_save_time_alarm_ == CheckPt::default_save_time_alarm(), " Expected default check pt alarm time of " << CheckPt::default_save_time_alarm() << " but found " << theClient.server_reply().stats().checkpt_save_time_alarm_);
+
+
+	// Test change of check_pt interval and mode and alarm
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::NEVER) == 0,CtsApi::checkPtDefs(ecf::CheckPt::NEVER) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::NEVER, " Expected check pt mode of NEVER");
+
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::ON_TIME) == 0,CtsApi::checkPtDefs(ecf::CheckPt::ON_TIME) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::ON_TIME, " Expected check pt mode of ON_TIME");
+
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::ALWAYS) == 0,CtsApi::checkPtDefs(ecf::CheckPt::ALWAYS) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::ALWAYS, " Expected check pt mode of ALWAYS");
+
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::ON_TIME,30) == 0,CtsApi::checkPtDefs(ecf::CheckPt::ON_TIME,30) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::ON_TIME, " Expected check pt mode of ON_TIME");
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_interval_ == 30, " Expected check pt interval of 30 but found " << theClient.server_reply().stats().checkpt_interval_);
+
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::UNDEFINED,56) == 0,CtsApi::checkPtDefs(ecf::CheckPt::UNDEFINED,56) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::ON_TIME, " Expected check pt mode of ON_TIME");
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_interval_ == 56, " Expected check pt interval of 56 but found " << theClient.server_reply().stats().checkpt_interval_);
+
+   // Mode and interval should remain unchanged only the alarm time should be changed
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::UNDEFINED,0,10) == 0,CtsApi::checkPtDefs(ecf::CheckPt::UNDEFINED,0,10) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::ON_TIME, " Expected check pt mode of ON_TIME");
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_interval_ == 56, " Expected check pt interval of 56 but found " << theClient.server_reply().stats().checkpt_interval_);
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_save_time_alarm_ == 10, " Expected check pt alarm time of 10 but found " << theClient.server_reply().stats().checkpt_save_time_alarm_);
+
+   // restore default check pointing for test that follow.
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::ON_TIME,CheckPt::default_interval()) == 0,CtsApi::checkPtDefs(ecf::CheckPt::ON_TIME) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::UNDEFINED,0,CheckPt::default_save_time_alarm()) == 0,CtsApi::checkPtDefs(ecf::CheckPt::ON_TIME) << " failed should return 0\n" << theClient.errorMsg());
+
+   // check defaults were set
+   BOOST_REQUIRE_MESSAGE(theClient.stats() == 0,CtsApi::stats() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_mode_ == ecf::CheckPt::ON_TIME, " Expected default check pt mode to be ON_TIME");
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_interval_ == CheckPt::default_interval(), " Expected default check pt interval of " << CheckPt::default_interval() << " but found " << theClient.server_reply().stats().checkpt_interval_);
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().stats().checkpt_save_time_alarm_ == CheckPt::default_save_time_alarm(), " Expected default check pt alarm time of " << CheckPt::default_save_time_alarm() << " but found " << theClient.server_reply().stats().checkpt_save_time_alarm_);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_restore_from_check_pt )
+{
+   InvokeServer invokeServer("Client:: ...test_restore_from_check_pt",SCPort::next());
+
+   defs_ptr the_defs = Defs::create();
+   the_defs->add_suite("s0");
+   the_defs->add_suite("s1");
+   the_defs->add_suite("s2");
+   the_defs->add_suite("s3");
+   the_defs->add_suite("s4");
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE(theClient.load(the_defs) == 0,"load defs failed \n" << theClient.errorMsg());
+
+   size_t expected_no_of_suites = 5;
+   for(int i = 0; i < 5; i++) {
+      BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " failed should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE( theClient.delete_all() == 0,"Expected delete all nodes to succeed\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.haltServer() == 0,"Expected halt server to succeed\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.restoreDefsFromCheckPt() == 0,"Expected restoreDefsFromCheckPt succeed\n");
+      BOOST_REQUIRE_MESSAGE( theClient.getDefs() == 0, "Expected getDefs() to succeed, i.e expected empty defs\n");
+      BOOST_REQUIRE_MESSAGE( theClient.defs()->suiteVec().size() == expected_no_of_suites, "Expected " << expected_no_of_suites << " suites, after restoreDefsFromCheckPt but found " <<  theClient.defs()->suiteVec().size() << "\n");
+
+      std::string suite = "/s" + boost::lexical_cast<std::string>(i);
+      BOOST_REQUIRE_MESSAGE( theClient.delete_node(suite) == 0,"Expected delete single suite to succeed\n" << theClient.errorMsg());
+      expected_no_of_suites--;
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_restore_from_check_pt_using_new_server )
+{
+   // This test relies on a NEW server invocation. Hence if ECF_NODE/remote server is used
+   // the test will will invalid. hence ignore.
+   if (!ClientEnvironment::hostSpecified().empty()) {
+      cout << "Client:: ...test_restore_from_check_pt_using_new_server: ignoring test when ECF_NODE specified\n";
+      return;
+   }
+
+   std::string port = SCPort::next();
+   {
+      // Start a new server. However make sure that on server exist we not delete check pt files
+      InvokeServer invokeServer("Client:: ...test_restore_from_check_pt_using_new_server",
+                                port,
+                                false, /* bool disable_job_generation = false */
+                                true,  /* bool remove_checkpt_file_before_server_start = true */
+                                false  /* bool remove_checkpt_file_after_server_exit = true */
+                                );
+
+      defs_ptr the_defs = Defs::create();
+      the_defs->add_suite("s0");
+      the_defs->add_suite("s1");
+      the_defs->add_suite("s2");
+      the_defs->add_suite("s3");
+      the_defs->add_suite("s4");
+
+      ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+      BOOST_REQUIRE_MESSAGE( theClient.load(the_defs) == 0,"load defs failed \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " failed should\n" << theClient.errorMsg());
+   }
+
+   // start a new server, using same port. Make sure on start, we do not delete any checkpt files on start up
+   // server should load check pt file on start up
+   InvokeServer invokeServer("",     /* for debug use -new server- as msg */
+                             port,
+                             false, /* bool disable_job_generation = false */
+                             false, /* bool remove_checkpt_file_before_server_start = true */
+                             true   /* bool remove_checkpt_file_after_server_exit = true */
+                             );
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE( theClient.sync_local() == 0, "Expected sync_local() to succeed \n");
+   BOOST_REQUIRE_MESSAGE( theClient.defs(), "Expected sync_local() to succeed defs is empty\n");
+   BOOST_REQUIRE_MESSAGE( theClient.defs()->suiteVec().size() == 5, "Expected 5 suites, after restoreDefsFromCheckPt but found " <<  theClient.defs()->suiteVec().size() << "\n");
+}
+
+BOOST_AUTO_TEST_CASE( test_check_pt_edit_history )
+{
+   // This test relies on a NEW server invocation. Hence if ECF_NODE/remote server is used
+   // the test will will invalid. hence ignore.
+   if (!ClientEnvironment::hostSpecified().empty()) {
+      cout << "Client:: ...test_check_pt_edit_history: ignoring test when ECF_NODE specified\n";
+      return;
+   }
+
+   // This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+   InvokeServer invokeServer("Client:: ...test_check_pt_edit_history",SCPort::next());
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE(theClient.edit_history(Str::ROOT_PATH()) == 0,CtsApi::to_string(CtsApi::edit_history(Str::ROOT_PATH())) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().get_string_vec().size() == 0,"Expected edit history of size 0 after server start, but found " << theClient.server_reply().get_string_vec().size());
+
+
+   // make 5 edits
+   BOOST_REQUIRE_MESSAGE( theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0 server not started, or connection refused\n" << theClient.errorMsg());
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+   BOOST_REQUIRE_MESSAGE(theClient.loadDefs(path) == 0,"load defs failed \n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.shutdownServer() == 0,CtsApi::shutdownServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.haltServer() == 0,CtsApi::haltServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+
+   // make sure edit history updated
+   BOOST_REQUIRE_MESSAGE(theClient.edit_history(Str::ROOT_PATH()) == 0,CtsApi::to_string(CtsApi::edit_history(Str::ROOT_PATH())) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.server_reply().get_string_vec().size() == 5,"Expected edit history of size 5, but found " << theClient.server_reply().get_string_vec().size());
+
+   // make sure edit history was *NOT* serialized, It is only serialized when check pointing
+   BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.defs()->get_edit_history(Str::ROOT_PATH()).size() ==  0,"Expected edit history of size 0, but found " <<  theClient.defs()->get_edit_history(Str::ROOT_PATH()).size());
+
+   // This should write the edit history
+   BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs(ecf::CheckPt::ALWAYS) == 0,CtsApi::checkPtDefs(ecf::CheckPt::ALWAYS) << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(fs::exists(invokeServer.ecf_checkpt_file()),CtsApi::checkPtDefs() << " failed No check pt file(" << invokeServer.ecf_checkpt_file() << ") saved");
+   BOOST_REQUIRE_MESSAGE(fs::file_size(invokeServer.ecf_checkpt_file()) !=0,"Expected check point file(" << invokeServer.ecf_checkpt_file() << ") to have file size > 0  ");
+
+
+   // Create a defs file from the check pt file & check edit history
+   Defs defs;
+   defs.restore_from_checkpt(invokeServer.ecf_checkpt_file()); // make a data model change
+   BOOST_REQUIRE_MESSAGE(defs.get_edit_history(Str::ROOT_PATH()).size() == 5,"Expected edit history of size 5, but found " <<  defs.get_edit_history(Str::ROOT_PATH()).size());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestClientEnvironment.cpp b/ecflow_4_0_7/Client/test/TestClientEnvironment.cpp
new file mode 100644
index 0000000..7c2e39a
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestClientEnvironment.cpp
@@ -0,0 +1,256 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <vector>
+#include <string>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "ClientEnvironment.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// **************************************************************************************
+// test the client environment:
+// In particular test host file parsing
+// **************************************************************************************
+BOOST_AUTO_TEST_CASE( test_client_environment_host_file_parsing )
+{
+	std::cout << "Client:: ...test_client_environment_host_file_parsing" << endl;
+
+   std::string good_host_file = File::test_data("Client/test/data/good_hostfile","Client");
+
+	// local host should be implicitly added to internal host list
+	std::vector<std::string> expectedHost;
+	expectedHost.push_back(Str::LOCALHOST());
+	expectedHost.push_back("host1");
+	expectedHost.push_back("host2");
+	expectedHost.push_back("host3");
+	expectedHost.push_back("host4");
+   expectedHost.push_back("host5");
+   expectedHost.push_back("host6");
+
+
+	ClientEnvironment client_env( good_host_file );
+//	cout << "client_env " << client_env.toString() << "\n";
+	std::string home_host = client_env.host();
+	std::string host;
+//	cout << "client_env home host " << client_env.host() << " job supplied port " << client_env.port() << "\n";
+	size_t count = 0;
+	BOOST_CHECK_MESSAGE( home_host == expectedHost[count], "Expected home host " << expectedHost[count] << " but found " << home_host);
+
+	bool home_host_fnd = false;
+	while (home_host != host) {
+	   // Cycle through the host until we reach the home host
+	   std::string errorMsg;
+	   BOOST_CHECK_MESSAGE( client_env.get_next_host(errorMsg), errorMsg);
+//	   cout << "client_env host " << client_env.host() << "  port " << client_env.port() << "\n";
+	   host = client_env.host();
+	   count++;
+	   if (host == home_host) {
+	      home_host_fnd = true ;
+	      count = 0;
+	   }
+	   BOOST_REQUIRE_MESSAGE( count < expectedHost.size(), "Test file out of date");
+	   BOOST_CHECK_MESSAGE( host == expectedHost[count], "Expected host " << expectedHost[count] << " but found " << host);
+	}
+	BOOST_CHECK_MESSAGE( home_host_fnd, "Cycling through host file, should lead to home host");
+}
+
+BOOST_AUTO_TEST_CASE( test_client_environment_host_file_defaults )
+{
+   std::cout << "Client:: ...test_client_environment_host_file_defaults" << endl;
+
+   // When the HOST file does *NOT* indicate the port, it should be taken
+   // from the config/environment.
+   // In file good_hostfile, host3 and host5 do not specify a port, hence
+   // this port is assumed to be the job supplied port, that was read from
+   // config or environment. To test this correctly we need to specify a port
+   // other than the default
+
+   std::string good_host_file = File::test_data("Client/test/data/good_hostfile","Client");
+
+
+   // local host should be implicitly added to internal host list
+   std::vector<std::pair<std::string,std::string> > expectedHost;
+   expectedHost.push_back( make_pair(Str::LOCALHOST(), string("5111")) ); // here 5111 is job supplied port
+   expectedHost.push_back( make_pair(string("host1"), string("3142")) );
+   expectedHost.push_back( make_pair(string("host2"), string("3141")) );
+   expectedHost.push_back( make_pair(string("host3"), string("5111")) ); // not specified in host file, hence expect 5111
+   expectedHost.push_back( make_pair(string("host4"), string("4001")) );
+   expectedHost.push_back( make_pair(string("host5"), string("5111")) ); // not specified in host file, hence expect 5111
+   expectedHost.push_back( make_pair(string("host6"), string("4081")) );
+
+   // Create the ClientEnvironment overriding the config & environment. To specify host and port
+   ClientEnvironment client_env( good_host_file , Str::LOCALHOST(),"5111");
+//   cout << "client_env " << client_env.toString() << "\n";
+   std::string home_host = client_env.host();
+   std::string home_port = client_env.port();
+   BOOST_CHECK_MESSAGE( Str::LOCALHOST() == home_host && "5111" == home_port,"host host & port not as expected");
+
+   std::string host;
+//   cout << "client_env home host " << client_env.host() << "  job supplied port " << client_env.port() << "\n";
+   size_t count = 0;
+   bool home_host_fnd = false;
+   while (home_host != host) {
+      // Cycle through the host until we reach the home host
+      std::string errorMsg;
+      BOOST_CHECK_MESSAGE( client_env.get_next_host(errorMsg), errorMsg);
+//      cout << "client_env host " << client_env.host() << "  port " << client_env.port() << "\n";
+      host = client_env.host();
+      std::string port = client_env.port();
+      count++;
+      if (host == home_host) {
+         BOOST_CHECK_MESSAGE( count-1 == 6, "Expected 6 hosts in host file"); // ignore last increment of count, hence -1
+         home_host_fnd = true ;
+         count = 0;
+      }
+      BOOST_REQUIRE_MESSAGE( count < expectedHost.size(), "Test file out of date");
+      BOOST_CHECK_MESSAGE( host == expectedHost[count].first, "Expected host " << expectedHost[count].first << " but found " << host);
+      BOOST_CHECK_MESSAGE( port == expectedHost[count].second, "Expected port " << expectedHost[count].second << " but found " << port);
+   }
+   BOOST_CHECK_MESSAGE( home_host_fnd, "Cycling through host file, should lead to home host");
+}
+
+
+BOOST_AUTO_TEST_CASE( test_client_environment_empty_host_file )
+{
+   std::cout << "Client:: ...test_client_environment_empty_host_file" << endl;
+
+   std::string empty_host_file = File::test_data("Client/test/data/empty_hostfile","Client");
+
+   std::string errormsg;
+   BOOST_CHECK_MESSAGE(File::create(empty_host_file,"",errormsg), "Failed to create empty host file " << errormsg);
+
+   ClientEnvironment client_env( empty_host_file );
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE( client_env.get_next_host(errorMsg),errorMsg);
+   BOOST_CHECK_MESSAGE( client_env.get_next_host(errorMsg),errorMsg);
+
+   fs::remove(empty_host_file);
+}
+
+
+BOOST_AUTO_TEST_CASE( test_client_environment_errors )
+{
+   if (getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")) {
+      cout << "Client:: ...test_client_environment_errors-ECF_ALLOW_NEW_CLIENT_OLD_SERVER: ignoring test when ECF_ALLOW_NEW_CLIENT_OLD_SERVER specified\n";
+      return;
+   }
+   if (getenv("ECF_PORT")) {
+      cout << "Client:: ...test_client_environment_errors-ECF_ALLOW_NEW_CLIENT_OLD_SERVER: ignoring test when ECF_PORT specified\n";
+      return;
+   }
+
+   std::cout << "Client:: ...test_client_environment_errors-ECF_ALLOW_NEW_CLIENT_OLD_SERVER" << endl;
+   {
+      char* put = const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER=xx");
+      BOOST_CHECK_MESSAGE(putenv(put) == 0,"putenv failed for " << put);
+      BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+
+   {
+      // ONLY run this test if enviroment variable ECF_PORT not defined
+      std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
+      env += Str::LOCALHOST(); env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += ":xx";
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+   {
+      std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
+      env += Str::LOCALHOST(); env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += "xx";
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+   {
+      std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
+      env += Str::LOCALHOST(); env += Str::DEFAULT_PORT_NUMBER(); env += "12";
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+   {
+      std::stringstream ss;
+      ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:0,bill:333:2222," << Str::LOCALHOST() << ":" << Str::DEFAULT_PORT_NUMBER() << ":xx";
+      std::string env = ss.str();
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_client_environment )
+{
+   if (getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")) {
+      cout << "Client:: ...test_client_environment-ECF_ALLOW_NEW_CLIENT_OLD_SERVER: ignoring test when ECF_ALLOW_NEW_CLIENT_OLD_SERVER specified\n";
+      return;
+   }
+   if (getenv("ECF_PORT")) {
+      cout << "Client:: ...test_client_environment-ECF_ALLOW_NEW_CLIENT_OLD_SERVER: ignoring test when ECF_PORT specified\n";
+      return;
+   }
+
+   std::cout << "Client:: ...test_client_environment-ECF_ALLOW_NEW_CLIENT_OLD_SERVER" << endl;
+   {
+      std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
+      env += Str::LOCALHOST(); env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += ":11";
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      ClientEnvironment client_env;
+      BOOST_CHECK_MESSAGE(client_env.allow_new_client_old_server()==11,"Expected 11 but found " << client_env.allow_new_client_old_server() << " for env " << env);
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+   {
+      std::stringstream ss;
+      ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:0,bill:333:2222," << Str::LOCALHOST() << ":" << Str::DEFAULT_PORT_NUMBER() << ":" << 33;
+      std::string env = ss.str();
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      ClientEnvironment client_env;
+      BOOST_CHECK_MESSAGE(client_env.allow_new_client_old_server()==33,"Expected 33 but found " << client_env.allow_new_client_old_server() << " for env " << env);
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+   {
+      // Create a valid ECF_ALLOW_NEW_CLIENT_OLD_SERVER list where there is no match with our host/port.
+      // hence allow_new_client_old_server should remain zero
+      std::stringstream ss;
+      ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:0,bill:333:2222,bill:333:2222,bill:333:2222,bill:333:2222,bill:333:2222";
+      std::string env = ss.str();
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      ClientEnvironment client_env;
+      BOOST_CHECK_MESSAGE(client_env.allow_new_client_old_server()==0,"Should remain unchanged but found " << client_env.allow_new_client_old_server());
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+   {
+      char* put = const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER=10");
+      BOOST_CHECK_MESSAGE(putenv(put) == 0,"putenv failed for " << put);
+      ClientEnvironment client_env;
+      BOOST_CHECK_MESSAGE(client_env.allow_new_client_old_server()==10,"expcted 10 but found " << client_env.allow_new_client_old_server());
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestClientInterface.cpp b/ecflow_4_0_7/Client/test/TestClientInterface.cpp
new file mode 100644
index 0000000..141aa21
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestClientInterface.cpp
@@ -0,0 +1,515 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #75 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <fstream>
+#include <iostream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/foreach.hpp>
+
+#include "ClientInvoker.hpp"
+#include "ClientToServerCmd.hpp"
+#include "ClientEnvironment.hpp"
+#include "NState.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "Suite.hpp"
+#include "Child.hpp"
+#include "File.hpp"
+#include "Flag.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// **************************************************************************************
+// test the interface, this will create the cmd without actually submitting to the server
+// This will test argument parsing.
+// **************************************************************************************
+BOOST_AUTO_TEST_CASE( test_client_interface )
+{
+   std::cout << "Client:: ...test_client_interface" << endl;
+
+   ClientInvoker theClient ;
+   theClient.testInterface(); // stops submission to server
+   std::vector<std::string> paths; paths.push_back("/s1"); paths.push_back("/s2");
+
+   BOOST_REQUIRE_MESSAGE( theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.shutdownServer() == 0,CtsApi::shutdownServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.haltServer() == 0,CtsApi::haltServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.terminateServer() == 0,CtsApi::terminateServer() << " should return 0\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.server_version() == 0,CtsApi::server_version() << " should return 0\n" << theClient.errorMsg());
+
+   {
+      defs_ptr dummy_defs = Defs::create();
+      BOOST_REQUIRE_MESSAGE( theClient.sync(dummy_defs) == 0, std::string(CtsApi::syncArg()) << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.news(dummy_defs) == 0, std::string(CtsApi::newsArg()) << " should return 0\n" << theClient.errorMsg());
+   }
+
+   BOOST_REQUIRE_MESSAGE( theClient.server_load("/path/to_log/file") == 0,CtsApi::server_load("/path/to_log/file") << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.server_load() == 0,CtsApi::server_load("") << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.pingServer() == 0,CtsApi::pingServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.debug_server_on() == 0,CtsApi::debug_server_on() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.debug_server_off() == 0,CtsApi::debug_server_off() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.stats() == 0,CtsApi::stats() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.stats_reset() == 0,CtsApi::stats_reset() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.suites() == 0,CtsApi::suites() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.getDefs() == 0,CtsApi::get() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.begin("/suite") == 0,CtsApi::begin("/suite") << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.begin("/suite",true) == 0,CtsApi::begin("/suite",true) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.begin("/suite",false) == 0,CtsApi::begin("/suite",false) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.begin_all_suites() == 0,CtsApi::begin() << " should return 0\n" << theClient.errorMsg());
+
+
+   Zombie z(Child::USER,ecf::Child::INIT,ZombieAttr::get_default_attr(Child::USER),"path_to_task","DUMMY_JOBS_PASSWORD", "DUMMY_PROCESS_OR_REMOTE_ID",1);
+   BOOST_REQUIRE_MESSAGE( theClient.zombieGet() == 0,CtsApi::zombieGet() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieFob(z) == 0,    " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieFail(z) == 0,   " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieAdopt(z) == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieBlock(z) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieRemove(z) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieKill(z) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieFobCli("path_to_task") == 0,    " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieFailCli("path_to_task") == 0,   " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieAdoptCli("path_to_task") == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieBlockCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieRemoveCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.zombieKillCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.job_gen("") == 0,CtsApi::job_gen("") << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.job_gen("/s") == 0,CtsApi::job_gen("/s") << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.check("") == 0,CtsApi::to_string(CtsApi::check("")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.check("/s") == 0,CtsApi::to_string(CtsApi::check("/s")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.check(paths) == 0,CtsApi::to_string(CtsApi::check(paths)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.kill("/s") == 0,CtsApi::to_string(CtsApi::kill("/s")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.kill(paths) == 0,CtsApi::to_string(CtsApi::kill(paths)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.status("/s") == 0,CtsApi::to_string(CtsApi::status("/s")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.status(paths) == 0,CtsApi::to_string(CtsApi::status(paths)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.suspend("/s") == 0,CtsApi::to_string(CtsApi::suspend("/s"))<< " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.suspend(paths) == 0,CtsApi::to_string(CtsApi::suspend(paths))<< " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.resume("/s") == 0,CtsApi::to_string(CtsApi::resume("/s")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.resume(paths) == 0,CtsApi::to_string(CtsApi::resume(paths)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.edit_history("/s") == 0,CtsApi::to_string(CtsApi::edit_history("/s")) << " should return 0\n" << theClient.errorMsg());
+
+   // empty string should be same as delete all
+   BOOST_REQUIRE_MESSAGE( theClient.delete_node("") == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.delete_node("/s") == 0,CtsApi::to_string(CtsApi::delete_node("/s")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.delete_node("/s",true) == 0,CtsApi::to_string(CtsApi::delete_node("/s",true)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.delete_node("/s",false) == 0,CtsApi::to_string(CtsApi::delete_node("/s",false)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.delete_nodes(paths,false) == 0,CtsApi::to_string(CtsApi::delete_node(paths,false)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.delete_nodes(paths,true) == 0,CtsApi::to_string(CtsApi::delete_node(paths,false)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.requeue("/s","") == 0,      CtsApi::to_string(CtsApi::requeue("/s","")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.requeue("/s","force") == 0, CtsApi::to_string(CtsApi::requeue("/s","force")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.requeue("/s","abort") == 0, CtsApi::to_string(CtsApi::requeue("/s","abort")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.requeue(paths,"") == 0,     CtsApi::to_string(CtsApi::requeue(paths,"")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.requeue(paths,"force") == 0,CtsApi::to_string(CtsApi::requeue(paths,"force")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.requeue(paths,"abort") == 0,CtsApi::to_string(CtsApi::requeue(paths,"abort")) << " should return 0\n" << theClient.errorMsg());
+
+
+   BOOST_REQUIRE_MESSAGE( theClient.run("/s") == 0,CtsApi::to_string(CtsApi::run("/s")) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.run("/s",true) == 0,CtsApi::to_string(CtsApi::run("/s",true)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.run(paths) == 0,CtsApi::to_string(CtsApi::run(paths)) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.run(paths,true) == 0,CtsApi::to_string(CtsApi::run(paths,true)) << " should return 0\n" << theClient.errorMsg());
+
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+   BOOST_REQUIRE_MESSAGE( theClient.loadDefs(path) == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.loadDefs(path,true/*force*/) == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.loadDefs(path,true/*force*/,true/*check_only*/) == 0,  "should return 0\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path) == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path,true) == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path,true, true) == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path,false, true) == 0,  " should return 0\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.order("/s","top") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.order("/s","bottom") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.order("/s","alpha") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.order("/s","order") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.order("/s","up") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.order("/s","down") == 0, " should return 0\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::NEVER) == 0," should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::ON_TIME) == 0," should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::ON_TIME,180) == 0," should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::ALWAYS) == 0," should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::UNDEFINED) == 0," should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::UNDEFINED,0,35) == 0," should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.restoreDefsFromCheckPt() == 0,CtsApi::restoreDefsFromCheckPt() << " should return 0\n" << theClient.errorMsg());
+
+   std::vector<std::string> event_paths; event_paths.push_back("/s1:e"); event_paths.push_back("/s2/f1/t1:e");
+   BOOST_REQUIRE_MESSAGE( theClient.force(event_paths[0],"set") == 0,   " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.force(event_paths[1],"clear") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.force(event_paths,"set") == 0,  " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.force(event_paths,"clear") == 0," should return 0\n" << theClient.errorMsg());
+   std::vector<std::string> validStates = NState::allStates(); // HPUX barfs if use NState::allStates() directly
+   BOOST_FOREACH(const string& state, validStates) {
+      BOOST_REQUIRE_MESSAGE( theClient.force("/s",state,true,true) == 0, "force " << state << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force(paths,state,true,true) == 0, "force " << state << " should return 0\n" << theClient.errorMsg());
+   }
+
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep("/s") == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep("/s",true,true,true,true) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep("/s",true) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep("/s",false,true) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep("/s",false,false,true) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep("/s",false,false,false,true) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep(paths) == 0, " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.freeDep(paths,true,true,true,true) == 0, " should return 0\n" << theClient.errorMsg());
+
+   std::vector<CFileCmd::File_t> fileTypesVec = CFileCmd::fileTypesVec();
+   for(size_t i = 0; i < fileTypesVec.size(); i++) {
+      BOOST_REQUIRE_MESSAGE( theClient.file("/s",CFileCmd::toString(fileTypesVec[i]),string("100")) == 0, " should return 0\n" << theClient.errorMsg());
+   }
+
+   BOOST_REQUIRE_MESSAGE( theClient.plug("/source","/dest") == 0, " should return 0\n" << theClient.errorMsg());
+
+   {
+      BOOST_REQUIRE_MESSAGE( theClient.getLog(10) == 0," should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.clearLog() == 0, CtsApi::clearLog() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.flushLog() == 0, CtsApi::flushLog() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.get_log_path() == 0, CtsApi::get_log_path() << " should return 0\n" << theClient.errorMsg());
+
+      std::string new_log_path = File::test_data("Client/test/data/new_log.log","Client");
+      BOOST_REQUIRE_MESSAGE( theClient.new_log(new_log_path) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.new_log("") == 0, " should return 0\n" << theClient.errorMsg());
+   }
+
+   BOOST_REQUIRE_MESSAGE( theClient.reloadwsfile() == 0,CtsApi::reloadwsfile() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.forceDependencyEval() == 0, CtsApi::forceDependencyEval() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.group("shutdown yes;halt yes;restart") == 0,"--group should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.group("get ; show") == 0,"--group should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.group("get ; show state") == 0,"--group should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.group("get ; show defs") == 0,"--group should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.group("get ; show migrate") == 0,"--group should return 0\n" << theClient.errorMsg());
+
+
+   {
+      std::string path_to_script = "dummy_ecf_file" + File::ECF_EXTN();
+      std::string contents = "%comment\n"
+               "VAR =  fred\n"
+               "%end\n"
+               "# rest of the ecf file\n";
+      std::string error_msg;
+      BOOST_CHECK_MESSAGE(File::create(path_to_script,contents,error_msg),error_msg);
+
+      std::vector<std::string> file_contents;
+      NameValueVec used_variables;
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script_edit("/s") == 0,"--edit_script_edit should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script_preprocess("/s") == 0,"--edit_script_preprocess should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script_preprocess("/s",file_contents) == 0,"--edit_script_preprocess should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script_submit("/s",used_variables) == 0,"--edit_script_submit should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script_submit("/s",used_variables,file_contents) == 0,"--edit_script_submit should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script_submit("/s",used_variables,file_contents,true/*alias*/) == 0,"--edit_script_submit should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script_submit("/s",used_variables,file_contents,true/*alias*/,true/*run*/) == 0,"--edit_script_submit should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","edit") == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","pre_process") == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","submit",path_to_script) == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","submit_file",path_to_script) == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","submit_file",path_to_script,true) == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","submit_file",path_to_script,false) == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","submit_file",path_to_script,false,true) == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","submit_file",path_to_script,false,false) == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_script("/s","pre_process_file",path_to_script) == 0,"--edit_script should return 0\n" << theClient.errorMsg());
+      fs::remove(path_to_script);
+   }
+
+   {
+      std::vector<std::string> suites; suites.push_back("a"); suites.push_back("b");
+      BOOST_REQUIRE_MESSAGE( theClient.ch_register(true,suites) == 0,"--ch_register \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_register(false,suites) == 0,"--ch_register \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_suites() == 0,"--ch_suites should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_drop(1) == 0,"--ch_drop should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_drop_user("user") == 0,"--ch_drop_user should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_add(1,suites) == 0,"--ch_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_remove(1,suites) == 0,"--ch_remove \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_auto_add(1,true) == 0,"--ch_auto_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_auto_add(1,false) == 0,"--ch_auto_add \n" << theClient.errorMsg());
+      // need test interface that allows client handle to set on ClinetInvoker
+//      BOOST_REQUIRE_MESSAGE( theClient.ch1_drop() == 0,"--ch1_drop \n" << theClient.errorMsg());
+//      BOOST_REQUIRE_MESSAGE( theClient.ch1_add(suites) == 0,"--ch1_add \n" << theClient.errorMsg());
+//      BOOST_REQUIRE_MESSAGE( theClient.ch1_remove(suites) == 0,"--ch1_remove \n" << theClient.errorMsg());
+//      BOOST_REQUIRE_MESSAGE( theClient.ch1_auto_add(true) == 0,"--ch1_auto_add \n" << theClient.errorMsg());
+//      BOOST_REQUIRE_MESSAGE( theClient.ch1_auto_add(false) == 0,"--ch1_auto_add \n" << theClient.errorMsg());
+   }
+
+   {
+      defs_ptr theDefs = Defs::create();
+      theDefs->addSuite( Suite::create("s1") );
+      BOOST_REQUIRE_MESSAGE( theClient.load( theDefs ) == 0,"-- load should return 0\n" << theClient.errorMsg());
+   }
+
+   /// test alter
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:fob::10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:fob::") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","user:fob::10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","path:fob::10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","path:fob::") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:fob:init,event,meter,label,wait,complete,abort:10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:fob:init,event,meter,label,wait,complete:10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:fail:init,event,meter,label,wait,complete:10000") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:adopt:init,event,meter,label,wait,complete:23") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:remove:init,event,meter,label,wait,complete:0") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:block:init,event,meter,label,wait,complete:") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","zombie","ecf:kill:init,event,meter,label,wait,complete:103333333") == 0,"--alter should return 0\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","+12:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","+10:00 20:00 00:30") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","12:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","10:00 20:00 00:30") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","12.12.2009") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","*.12.2009") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","*.*.2009") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","*.*.*") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","variable","name","value") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","variable","name","/value/with/path") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/",  "add","variable","name","value") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/",  "add","variable","name","/value/with/path") == 0,"--alter should return 0\n" << theClient.errorMsg());
+
+   std::vector<std::string> validDays = DayAttr::allDays(); // HPUX barfs if use DayAttr::allDays() directly in BOOST_FOREACH
+   BOOST_FOREACH(const string& day, validDays) {
+      BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","day",day) == 0,"--alter should return 0\n" << theClient.errorMsg());
+   }
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/",  "delete","variable","varName") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","variable","varName") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","variable") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","+12:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","+10:00 20:00 00:30") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today","12:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today","10:00 20:00 00:30") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","12.12.2009") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","*.12.2009") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","*.*.2009") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","*.*.*") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","day","sunday") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","day") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","23:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","10:00 20:00 01:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 0,1 10:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-d 10,11,12 12:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 0 -m 5,6,7,8 10:00 20:00 01:00") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","event","name") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","event","1") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","event") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","meter","name") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","meter") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","trigger") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","complete") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","repeat") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","limit","name") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","limit_path","limit_name","path") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","limit_path","limit_name","/path/with/slash") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","inlimit","name") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","zombie","user") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","zombie","ecf") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","zombie","path") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","variable","name","newValue") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","variable","name","/new/value/with/path") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","hybrid") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","real") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_date","12.6.2013") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_gain","20") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_sync") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","22","set") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","33","clear") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","4") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","name","set") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","name","clear") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","name") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","meter","name","20") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","meter","name","-1") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","label","name","newValue") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","trigger","(t:step + 20) ge (t:step1 - 20)") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","trigger","/suite/fred == complete") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","trigger","/suite/fred:event") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","complete","not ( a == complete )") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","complete","/trigger/with/leading/slash == aborted") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","complete","/trigger/with/leading/slash:event") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","repeat","1") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","repeat","blue") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","limit_max","limit_name","12") == 0,"--alter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","limit_value","limit_name","12") == 0,"--alter should return 0\n" << theClient.errorMsg());
+
+   std::vector<std::string> dstates = DState::allStates();
+   for(size_t i = 0; i < dstates.size(); i++) {
+      BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","defstatus",dstates[i]) == 0,"--alter should return 0\n" << theClient.errorMsg());
+   }
+
+   std::vector<std::string> flag_types;
+   Flag::valid_flag_type(flag_types);
+   for(size_t i = 0; i <  flag_types.size(); i++) {
+      BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","set_flag",flag_types[i]) == 0,"--alter should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","clear_flag",flag_types[i]) == 0,"--alter should return 0\n" << theClient.errorMsg());
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_client_interface_for_fail )
+{
+   std::cout << "Client:: ...test_client_interface_for_fail" << endl;
+
+   ClientInvoker theClient ;
+   theClient.testInterface(); // stops submission to server
+   theClient.set_throw_on_error(false);
+
+   std::vector<std::string> paths; paths.push_back("/s1"); paths.push_back("/s2");
+
+   /// test alter
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","012:00") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","1200") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","fred") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","+10:0020:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","+10:00 2000 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","+1000 20:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","+10:00 20:00 0030") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","time","any old rubbish") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","+10:0020:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","+10:00 2000 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","+1000 20:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","+10:00 20:00 0030") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","any old rubbish") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","today","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","0.12.2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","12.0.2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","12.12.g") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","*..2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","12..2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","12.12.") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","fred") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","date","any old rubbish") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","day","frenday") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","day","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","day","opps ") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","variable","na me","value") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/",  "add","variable","na me","value") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/",  "add","variable","","value") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/",  "delete","vari able","varName") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","v ariable","varName") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","012:00") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","1200") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","fred") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","+10:0020:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","+10:00 2000 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","+1000 20:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","+10:00 20:00 0030") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","time","any old rubbish") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today","+10:0020:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today","+10:00 2000 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today","+1000 20:00 00:30") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today","+10:00 20:00 0030") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","today","any old rubbish") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","0.12.2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","12.0.2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","12.12.g") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","*..2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","12..2009") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","12.12.") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","fred") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","date","any old rubbish") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","day","su nday") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","day","fryday") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","any old rubbish") == 1,"Expected fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","2300") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","1000 20:00 01:00") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 0,1 1000'") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 1000") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-d 10,11,12 1200") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-d 10,11,12") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-d 1200") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 0 -m 5,6,7,8 10:00 20:00 01:000") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 0 -m 5,6,7,8 10:00 20:00 0100") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w -m 20:00 01:00") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 0 -m 5,6,7,8 1000 20:00 01:00") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 20 -m 5,6,7,8 10:00 20:00 01:00") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","cron","-w 0 -m 5,6,7,8,24 10:00 20:00 01:00") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","event","name df") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","event","22  56  ") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","meter","na me") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","limit"," name") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","delete","inlimit","na me") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","vari able","name","newValue") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","","name","/new/value/with/path") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","hyb rid") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","hybrid ") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","ybrid") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","re al") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_type","rreal") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_date","*.6.2013") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_date","12.0.2013") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_date","any old rubbish") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_date","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_gain","string") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_gain","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","clock_gain","fred") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","name","fr ed") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","event","na me") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","meter","name","") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","meter","na me","20") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","meter","name","-") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","label","na me","newValue") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","trigger","t:step + 20) ge (t:step1 - 20)") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","complete","not  a == complete )") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","limit_max","limit_  name","12") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","limit_value","limit_  name","12") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","change","defstatus","complete-34") == 1,"--alter expected to fail\n" << theClient.errorMsg());
+}
+
+
+BOOST_AUTO_TEST_CASE( test_client_task_interface )
+{
+   std::cout << "Client:: ...test_client_task_interface" << endl;
+
+   ClientInvoker theClient ;
+   theClient.testInterface(); // stops submission to server
+   theClient.taskPath("/a/made/up/path");
+   theClient.set_jobs_password( Submittable::DUMMY_JOBS_PASSWORD() );
+
+   BOOST_REQUIRE_MESSAGE( theClient.initTask(Submittable::DUMMY_PROCESS_OR_REMOTE_ID()) == 0,"--init should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.abortTask("reason for abort") == 0,"--abort should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.eventTask("event_name") == 0,"--event should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.meterTask("meter_name","20") == 0,"--meter should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.waitTask("a == complete") == 0,"--wait should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.completeTask() == 0,"--complete should return 0\n" << theClient.errorMsg());
+   std::vector<std::string> labels; labels.push_back("test_client_task_interface");
+   BOOST_REQUIRE_MESSAGE( theClient.labelTask("label_name",labels) == 0,"--label should return 0\n" << theClient.errorMsg());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestClientInvoker.cpp b/ecflow_4_0_7/Client/test/TestClientInvoker.cpp
new file mode 100644
index 0000000..b8cfca0
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestClientInvoker.cpp
@@ -0,0 +1,63 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #9 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <vector>
+#include <string>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "ClientInvoker.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_client_invoker )
+{
+   if (getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")) {
+      cout << "Client:: ...test_client_invoker: ignoring test when ECF_ALLOW_NEW_CLIENT_OLD_SERVER specified\n";
+      return;
+   }
+
+   std::cout << "Client:: ...test_client_invoker" << endl;
+   {
+      char* put = const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER=10");
+      BOOST_CHECK_MESSAGE(putenv(put) == 0,"putenv failed for " << put);
+      ClientInvoker invoker;
+      BOOST_CHECK_MESSAGE(invoker.allow_new_client_old_server()==10,"Expected 10 but found " << invoker.allow_new_client_old_server() << " for env " << put);
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
+   }
+   {
+      std::stringstream ss;
+      ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:12,bill:3333:2222,bill4:6666:1313";
+      std::string env = ss.str();
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
+      ClientInvoker invoker("bill","3333");
+      BOOST_CHECK_MESSAGE(invoker.allow_new_client_old_server()==2222,"Expected 2222 but found " << invoker.allow_new_client_old_server() << " for env " << env);
+
+      invoker.set_host_port("bill4","6666");
+      BOOST_CHECK_MESSAGE(invoker.allow_new_client_old_server()==1313,"Expected 1313 but found " << invoker.allow_new_client_old_server() << " for env " << env);
+      putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains, + *COULD* affect other tests
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestClientTimeout.cpp b/ecflow_4_0_7/Client/test/TestClientTimeout.cpp
new file mode 100644
index 0000000..669fd84
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestClientTimeout.cpp
@@ -0,0 +1,77 @@
+////============================================================================
+//// Name        :
+//// Author      : Avi
+//// Revision    : $Revision: #5 $ 
+////
+//// Copyright 2009-2012 ECMWF. 
+//// This software is licensed under the terms of the Apache Licence version 2.0 
+//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+//// In applying this licence, ECMWF does not waive the privileges and immunities 
+//// granted to it by virtue of its status as an intergovernmental organisation 
+//// nor does it submit to any jurisdiction. 
+////
+//// Description :
+////============================================================================
+//#include <string>
+//#include <fstream>
+//
+//#include "boost/filesystem/operations.hpp"
+//#include "boost/filesystem/path.hpp"
+//#include <boost/test/unit_test.hpp>
+//
+//#include "ClientInvoker.hpp"
+//#include "ClientEnvironment.hpp"
+//#include "InvokeServer.hpp"
+//#include "SCPort.hpp"
+//#include "Str.hpp"
+//
+//namespace fs = boost::filesystem;
+//using namespace std;
+//using namespace ecf;
+//
+//BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+//
+//// ************************************************************************************
+//// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+//// ************************************************************************************
+//
+///// This test will check the timeoout feature of the Client
+///// The timeout feature allow the client to fail gracefully in the case
+///// where the server has died/crashed. The timeout will ensure the scoket is closed.
+///// allowing the server to be restarted withou getting the address is use error.
+//BOOST_AUTO_TEST_CASE( test_client_timeout )
+//{
+//   // This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+//   InvokeServer invokeServer("Client:: ...test_client_timeout",SCPort::next());
+//
+//   // The timeout is configured to vary according the the client request
+//   // however we can override for testing.
+//   // Here we set a timeout for 1 second, then attempt to load a very large definition into the server.
+//   // Note: the timeout of 1 second means we have 1 second for each communication, hence:
+//   //    connect        : 1 second
+//   //    send request   : 1 second
+//   //    receive reply  : 1 second
+//   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+//   theClient.set_timeout(1);
+//
+//    std::string path = File::test_data("AParser/test/data/single_defs/mega.def","AParser");
+//   BOOST_REQUIRE_THROW(theClient.loadDefs(path),std::runtime_error); // Expected load defs to fail with a timeout of 1 second\n
+//
+//   /// Now see what timeout value we succeed with
+//   bool loaded_defs = false;
+//   for(int i = 2; i < 10; ++i) {
+//      theClient.set_timeout(i);
+//      try {
+//         cout << "Trying with timeout of " << i << " seconds\n";
+//         theClient.loadDefs(path);
+//         cout << "   loaded mega defs with a timeout of " << i << " seconds\n";
+//         loaded_defs = true;
+//         break;
+//      }
+//      catch (...) {}
+//   }
+//   BOOST_REQUIRE_MESSAGE(loaded_defs,"Expected load of defs to succeed\n");
+//}
+//
+//BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestGroupCmd.cpp b/ecflow_4_0_7/Client/test/TestGroupCmd.cpp
new file mode 100644
index 0000000..0ef2e2a
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestGroupCmd.cpp
@@ -0,0 +1,219 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #37 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "File.hpp"
+#include "PrintStyle.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_group_cmd )
+{
+   // The previous test's has created/destroyed a server process
+   // If two different process both try to use the same port number, you
+   // get an "Address in use" error, even if one the process is dead. This is
+   // because the kernel does not immediately release the resource and there is
+   // time out period. To get round this we will start the new server/client
+   // and use a different port number. the default is 3141
+
+   // This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+   InvokeServer invokeServer("Client:: ...test_group_cmd",SCPort::next());
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE( theClient.group("shutdown yes;halt yes;restart") == 0,"--group should return 0\n" << theClient.errorMsg());
+}
+
+BOOST_AUTO_TEST_CASE( test_client_group_lifecyle )
+{
+   /// *** This test is the same as in file TestServerAndLifeCyle.cpp only this time
+   /// *** we use the group command where ever possible
+   // This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+
+   // ** NOTE: We disable job generation in the server **/
+   InvokeServer invokeServer("Client:: ...test_client_group_lifecyle",SCPort::next(),true /*disable job generation in server*/);
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+
+   {
+      // restart server, load lifecycle, and get the defs tree from the server
+      std::string groupRequest ="--restart; load=";
+      groupRequest += File::test_data("Client/test/data/lifecycle.txt","Client");
+      groupRequest += "; get";
+
+      BOOST_REQUIRE_MESSAGE( theClient.group(groupRequest) == 0,"Group request " << CtsApi::group(groupRequest) << " failed should return 0\n" << theClient.errorMsg());
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"Server returned a NULL defs");
+      BOOST_REQUIRE_MESSAGE( serverDefs->suiteVec().size() >= 1,"  no suite ?");
+   }
+
+   // Now go through and simulate client request to change Node tree state.
+   // This is **highly** dependent on lifecycle.txt
+   //	suite suite1
+   //	  family family1
+   //	   	task a
+   //	        event 1 myEvent
+   //	        meter myMeter 0 100
+   //	   	task b
+   //	   		trigger a == complete
+   //	   endfamily
+   //	   family family2
+   //	   		task aa
+   //	   			trigger ../family1/a:myMeter >= 20 and ../family1/a:myEvent
+   //	   		task bb
+   //	   			trigger ../family1/a:myMeter >= 50 || ../family1/a:myEvent
+   //	    endfamily
+   //	endsuite
+   string suite1_family1_a = "suite1/family1/a";
+   string suite1_family1_b = "suite1/family1/b";
+   string suite1_family2_aa = "suite1/family2/aa";
+   string suite1_family2_bb = "suite1/family2/bb";
+
+
+   // ***********************************************************************
+   // Create a request to initialise Node: suite1/family1/a
+   // Create a request to set the event on Node suite1/family1/a
+   // This should place suite1_family2_bb immediately into submitted state
+   // Since we at least one node in ACTIVE, suite should be in ACTIVE state
+   {
+      theClient.taskPath(suite1_family1_a);
+      theClient.set_jobs_password(Submittable::DUMMY_JOBS_PASSWORD());
+
+      // make sure to use same ECF_RID if its specified
+      std::string remote_id= "process_or_remote_id";
+      if (!theClient.process_or_remote_id().empty())  remote_id = theClient.process_or_remote_id();
+      std::string groupRequest ="begin=suite1;  init=";
+      groupRequest += remote_id;
+      groupRequest += "; event=myEvent; force-dep-eval; get";
+
+      BOOST_REQUIRE_MESSAGE(theClient.group(groupRequest) == 0,"Group request " << groupRequest << " failed should return 0\n" << theClient.errorMsg());
+
+      defs_ptr serverDefs =  theClient.defs();
+      // PrintStyle style(PrintStyle::STATE);
+      // cerr << *serverDefs.get() << "\n";
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      node_ptr node = serverDefs->findAbsNode(suite1_family1_a);
+      BOOST_REQUIRE_MESSAGE( node->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(node->state()));
+      node_ptr nodeb = serverDefs->findAbsNode(suite1_family2_bb);
+      BOOST_REQUIRE_MESSAGE( nodeb->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(nodeb->state()));
+   }
+
+
+   //**********************************************************************
+   // Create a request to set the Meter on Node suite1/family1/a
+   // This should force suite1_family2_aa immediately into submitted state
+   // This should force suite1_family2_bb immediately into submitted state
+   {
+      theClient.taskPath(suite1_family1_a);
+      std::string groupRequest ="meter=myMeter 100; force-dep-eval; get";
+      BOOST_REQUIRE_MESSAGE( theClient.group(groupRequest) == 0,"Group request " << CtsApi::group(groupRequest) << " failed should return 0\n" << theClient.errorMsg());
+
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      node_ptr nodeaa = serverDefs->findAbsNode(suite1_family2_aa);
+      BOOST_REQUIRE_MESSAGE( nodeaa->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(nodeaa->state()));
+
+      node_ptr nodebb = serverDefs->findAbsNode(suite1_family2_bb);
+      BOOST_REQUIRE_MESSAGE( nodebb->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(nodebb->state()));
+   }
+
+   //**********************************************************************
+   // Create a request to complete task suite1/family1/a
+   // This should force suite1_family1_b to complete
+   // 	Resolve dependencies
+   // 	We could either wait 60 second or
+   // 	added a custom command that will force dependency evaluation
+   {
+      theClient.taskPath(suite1_family1_a);
+      std::string groupRequest ="complete;force-dep-eval;get";
+      BOOST_REQUIRE_MESSAGE( theClient.group(groupRequest) == 0,"Group request " << CtsApi::group(groupRequest) << " failed should return 0\n" << theClient.errorMsg());
+
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      node_ptr node = serverDefs->findAbsNode(suite1_family1_b);
+      BOOST_REQUIRE_MESSAGE( node->state() == NState::ACTIVE,  "Expected NState::ACTIVE, but found " << NState::toString(node->state()));
+   }
+
+   //********************************************************************************
+   // Complete the remaining tasks. Should really call init first, but what the eck.
+   //
+   // Get the node tree back from the server, and check its node state
+   // All node state should be complete. + check meter/event value was set properly
+
+   {
+      theClient.taskPath(suite1_family1_b);
+      BOOST_REQUIRE_MESSAGE(theClient.completeTask() == 0,TaskApi::complete() << " failed should return 0\n" << theClient.errorMsg());
+
+      theClient.taskPath(suite1_family2_aa);
+      BOOST_REQUIRE_MESSAGE(theClient.completeTask() == 0,TaskApi::complete() << " failed should return 0\n" << theClient.errorMsg());
+
+      theClient.taskPath(suite1_family2_bb);
+      std::string groupRequest ="complete;force-dep-eval;get";
+      BOOST_REQUIRE_MESSAGE( theClient.group(groupRequest) == 0,"Group request " << CtsApi::group(groupRequest) << " failed should return 0\n" << theClient.errorMsg());
+
+
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      std::string metername = "myMeter";
+      int meterValue = 100;
+      node_ptr node = serverDefs->findAbsNode(suite1_family1_a);
+      const Meter& theMeter = node->findMeter(metername);
+      BOOST_REQUIRE_MESSAGE( !theMeter.empty(), "Could not find the meter");
+      BOOST_REQUIRE_MESSAGE( theMeter.value() == meterValue , "Expected meter value " << meterValue << " but found " << theMeter.value());
+      {
+         std::string errorMsg; BOOST_REQUIRE_MESSAGE( serverDefs->checkInvariants(errorMsg), errorMsg);
+      }
+
+      std::string eventname = "myEvent";
+      const Event& theEvent = node->findEventByNameOrNumber(eventname);
+      BOOST_REQUIRE_MESSAGE( !theEvent.empty(), "Could not find the event myEvent");
+      BOOST_REQUIRE_MESSAGE( theEvent.value(), "The event was not set");
+
+      const std::vector<suite_ptr>& suiteVec = serverDefs->suiteVec();
+      suite_ptr suite = suiteVec.back();
+      BOOST_REQUIRE_MESSAGE( suite->state() == NState::COMPLETE,
+               "Suite expected NState::COMPLETE, but found to be " << NState::toString(suite->state()));
+   }
+
+   {
+      // Check that a log file was created, by asking the server for it.
+      BOOST_REQUIRE_MESSAGE( theClient.getLog() == 0,  "get log  failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(!theClient.get_string().empty(),"The log file returned from the server is empty!!");
+
+      // Clear the log
+      BOOST_REQUIRE_MESSAGE( theClient.clearLog() == 0,CtsApi::clearLog() << " failed should return 0\n" << theClient.errorMsg());
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestJobGenOnly.cpp b/ecflow_4_0_7/Client/test/TestJobGenOnly.cpp
new file mode 100644
index 0000000..8a8d6ba
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestJobGenOnly.cpp
@@ -0,0 +1,97 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #40 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+
+#include "boost/make_shared.hpp"
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/foreach.hpp>
+#include <boost/timer.hpp>
+
+#include "Defs.hpp"
+#include "DefsStructureParser.hpp"
+#include "NodeAttr.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Str.hpp"
+#include "File.hpp"
+#include "EcfFile.hpp"
+#include "ExprAst.hpp"
+#include "TestHelper.hpp"
+#include "JobCreationCtrl.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+//  Tests the Job generation against the OLD sms
+BOOST_AUTO_TEST_CASE( test_jobgenonly )
+{
+	cout << "Client:: ...test_jobgenonly" << endl;
+
+	// Define paths to ECF_HOME and location of the defs file
+
+   std::string defsFile = File::test_data("Client/test/data/jobgenonly.def","Client");
+	std::string ecf_home = File::test_data("Client/test/data/ECF_HOME","Client");
+
+	/// Remove existing job file if any.
+	/// 	Job file location may NOT be same as ecf file.
+	/// 	The default Job location is defined by generated variable ECF_JOB
+	/// 	ECF_JOB = ECF_HOME/<abs node path>.job<try_no>.
+ 	std::vector<std::string> generatedFiles; generatedFiles.reserve(5);
+	std::string t1_job = ecf_home + "/suite/family/t1.job0"; generatedFiles.push_back(t1_job);
+	std::string t2_job = ecf_home + "/suite/family/t2.job0"; generatedFiles.push_back(t2_job);
+	std::string t3_job = ecf_home + "/suite/family/t3.job0"; generatedFiles.push_back(t3_job);
+
+	// See EcfFile.cpp: To enable generation of man files, for test. i.e DEBUG_MAN_FILE
+#ifdef DEBUG_MAN_FILE
+	std::string t1_man = ecf_home + "/suite/family/t1.man";  generatedFiles.push_back(t1_man);
+	std::string t3_man = ecf_home + "/suite/family/t3.man";  generatedFiles.push_back(t3_man);
+#endif
+	BOOST_FOREACH(const std::string& s, generatedFiles ) { fs::remove(s); }
+	BOOST_FOREACH(const std::string& s, generatedFiles ) { BOOST_REQUIRE_MESSAGE(!fs::exists(s),"Could not delete file " << s);  }
+
+
+	// Load the defs file 'jobgenonly.def'
+	Defs theDefs;
+ 	DefsStructureParser checkPtParser( &theDefs, defsFile );
+	std::string errorMsg,warningMsg;
+	BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+
+	// Override ECF_HOME. ECF_HOME is needed to locate to the .ecf files
+	theDefs.set_server().add_or_update_user_variables(Str::ECF_HOME(),ecf_home);
+
+	// provide definition of ECF_CLIENT. This should replace smsinit, smscomplete, smsevent,etc
+	// with path to the ecf client
+	std::string clientPath = File::find_ecf_client_path();
+	BOOST_REQUIRE_MESSAGE( !clientPath.empty(), "Could not find path to client executable");
+  	theDefs.set_server().add_or_update_user_variables("ECF_CLIENT",clientPath);
+
+	// JobCreationCtrl is used control what node we generate the jobs for:
+	// Since we have not set the node on it, we force job generation for all tasks
+   job_creation_ctrl_ptr jobCtrl = boost::make_shared<JobCreationCtrl>();
+	theDefs.check_job_creation(jobCtrl);
+	BOOST_REQUIRE_MESSAGE(jobCtrl->get_error_msg().empty(), jobCtrl->get_error_msg());
+	BOOST_REQUIRE_MESSAGE(jobCtrl->fail_submittables().empty(),"Expected no failing tasks");
+
+	// Check if jobs file were generated.
+	BOOST_FOREACH(const std::string& s, generatedFiles ) { BOOST_REQUIRE_MESSAGE(fs::exists(s),"File " << s << " should have been created");  }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Client/test/TestLifeCycle.cpp b/ecflow_4_0_7/Client/test/TestLifeCycle.cpp
new file mode 100644
index 0000000..6d9cecd
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestLifeCycle.cpp
@@ -0,0 +1,216 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #50 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestHelper.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite)
+
+BOOST_AUTO_TEST_CASE( test_node_tree_lifecycle )
+{
+	cout << "Client:: ...test_node_tree_lifecycle" << endl;
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+	Defs defs;
+	DefsStructureParser checkPtParser( &defs, path );
+	std::string errorMsg,warningMsg;
+	bool parse = checkPtParser.doParse(errorMsg,warningMsg);
+	if (!parse)  std::cerr << errorMsg;
+	BOOST_CHECK(parse);
+
+	// Now go through and simulate client request to change Node tree state.
+	// This is **highly** dependent on lifecycle.txt
+//	suite suite1
+//	  family family1
+//	   	task a
+//	        event 1 myEvent
+//	        meter myMeter 0 100
+//	   	task b
+//	   		trigger a == complete
+//	   endfamily
+//	   family family2
+//	   		task aa
+//	   			trigger ../family1/a:myMeter >= 20 and ../family1/a:myEvent
+//	   		task bb
+//	   			trigger ../family1/a:myMeter >= 50 || ../family1/a:myEvent
+//	    endfamily
+//	endsuite
+
+	// get the suite, before we do anything initial state should be UNKNOWN
+	const std::vector<suite_ptr>& suiteVec = defs.suiteVec();
+	suite_ptr suite = suiteVec.back();
+	BOOST_CHECK_MESSAGE( suite->state() == NState::UNKNOWN," Initial suite state should be NState::UNKNOWN");
+
+	string suite1_family1_a = "suite1/family1/a";
+	string suite1_family1_b = "suite1/family1/b";
+	string suite1_family2_aa = "suite1/family2/aa";
+	string suite1_family2_bb = "suite1/family2/bb";
+
+
+	// Pick the suite that is allowed to resolve dependencies
+	// The suite must be loaded and be in state UNKNOWN or COMPLETE
+ 	TestHelper::invokeRequest(&defs,Cmd_ptr( new BeginCmd("suite1")));
+
+
+	// ***********************************************************************
+	// Create a request to initialise Node: suite1/family1/a
+	{
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new InitCmd(suite1_family1_a,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1)));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new CtsCmd( CtsCmd::FORCE_DEP_EVAL)),false);
+
+		node_ptr node = defs.findAbsNode(suite1_family1_a);
+		BOOST_CHECK_MESSAGE( node, "Could not find node");
+		BOOST_CHECK_MESSAGE( node->state() == NState::ACTIVE, "Init request should place node in NState::ACTIVE");
+		BOOST_CHECK_MESSAGE( suite->state() == NState::ACTIVE, "Suite should be in NState::ACTIVE after init cmd");
+	 	std::string errorMsg; BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg),errorMsg);
+	}
+
+	//**********************************************************************
+	// Create a request to set the event on Node suite1/family1/a
+	// This should force suite1_family2_bb immediately into submitted/active state
+	{
+ 		std::string eventname = "myEvent";
+ 		TestHelper::invokeRequest(&defs,Cmd_ptr( new EventCmd(suite1_family1_a,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,eventname)));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new CtsCmd( CtsCmd::FORCE_DEP_EVAL)));
+ 		node_ptr node = defs.findAbsNode(suite1_family1_a);
+
+		const Event& theEvent = node->findEventByNameOrNumber(eventname);
+		BOOST_CHECK_MESSAGE( !theEvent.empty(), "Could not find the event myEvent");
+		BOOST_CHECK_MESSAGE( theEvent.value(), "The event was not set");
+	 	std::string errorMsg; BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg),errorMsg);
+
+ 		// cerr << "Defs " << defs << "\n";
+ 		BOOST_CHECK_MESSAGE( node->state() == NState::ACTIVE, "State should be NState::ACTIVE but found to be " << NState::toString(node->state()));
+		BOOST_CHECK_MESSAGE( suite->state() == NState::ACTIVE, "Suite should be in NState::ACTIVE but found to be " << NState::toString(suite->state()));
+
+		node_ptr nodebb = defs.findAbsNode(suite1_family2_bb);
+ 		BOOST_CHECK_MESSAGE( nodebb->state() == NState::ACTIVE, "State should be NState::ACTIVE but found to be " << NState::toString(nodebb->state()));
+	}
+
+	//*******************************************************************************
+	// Resolve dependencies. After previous event suite1_family2_bb should have
+	//                       been put into ACTIVE state.
+	//                       ** Tests trigger/AST OR functionality **
+	//                       Since we at least one node in active, suite should
+	//                       be in avtive state
+	{
+		JobsParam jobsParam; // create jobs = false, spawn jobs = false
+		Jobs jobs(&defs);
+		BOOST_CHECK_MESSAGE(jobs.generate(jobsParam),jobsParam.getErrorMsg());
+		BOOST_FOREACH(Submittable* t, jobsParam.submitted() ) {
+			BOOST_CHECK_MESSAGE( t->state() == NState::SUBMITTED, "jobSubmission should change Node state");
+ 		}
+
+		{
+			node_ptr node = defs.findAbsNode(suite1_family1_a);
+			BOOST_CHECK_MESSAGE( node->state() == NState::ACTIVE, "resolve dependencies should change Node state here");
+		}
+		node_ptr node = defs.findAbsNode(suite1_family2_bb);
+		BOOST_CHECK_MESSAGE( node, "Could Not find Node " << suite1_family2_bb );
+		BOOST_CHECK_MESSAGE( node->state() == NState::ACTIVE, "resolve dependencies should change Node state");
+		BOOST_CHECK_MESSAGE( suite->state() == NState::ACTIVE, "Suite expected NState::ACTIVE, but found to be " << NState::toString(suite->state()));
+	 	std::string errorMsg; BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg),errorMsg);
+	}
+
+	//**********************************************************************
+	// Create a request to set the Meter on Node suite1/family1/a
+	// This should immediately change suite1_family2_aa into submitted state
+	{
+ 		std::string metername = "myMeter";
+		int meterValue = 100;
+		TestHelper::invokeRequest(&defs, Cmd_ptr( new MeterCmd(suite1_family1_a,Submittable::DUMMY_JOBS_PASSWORD(),Submittable::DUMMY_PROCESS_OR_REMOTE_ID(),1,metername,meterValue)));
+      TestHelper::invokeRequest(&defs, Cmd_ptr( new CtsCmd( CtsCmd::FORCE_DEP_EVAL)));
+
+		node_ptr node = defs.findAbsNode(suite1_family1_a);
+ 		BOOST_CHECK_MESSAGE( node->state() == NState::ACTIVE,
+ 		                     "Expected Node '" << node->absNodePath() << "' to be NState::ACTIVE, but found " << NState::toString(node->state()) << "\n");
+		BOOST_CHECK_MESSAGE( suite->state() == NState::ACTIVE,
+		                     "Suite expected NState::ACTIVE, but found to be " << NState::toString(suite->state()));
+
+		const Meter& theMeter = node->findMeter(metername);
+		BOOST_CHECK_MESSAGE( !theMeter.empty(), "Could not find the meter");
+		BOOST_CHECK_MESSAGE( theMeter.value() == meterValue , "Meter value not set");
+		std::string errorMsg; BOOST_REQUIRE_MESSAGE( defs.checkInvariants(errorMsg), errorMsg);
+
+		node_ptr nodeaa = defs.findAbsNode(suite1_family2_aa);
+		BOOST_CHECK_MESSAGE( nodeaa, "Could Not find Node " << suite1_family2_aa );
+		BOOST_CHECK_MESSAGE( nodeaa->state() == NState::ACTIVE, "resolve dependencies should change Node state");
+	}
+
+	//**********************************************************************
+	// Create a request to complete task suite1/family1/a
+	// A is complete, which means evaluation dependencies should force:
+	//      suite1/family1/b   :->to be submitted.
+ 	// since the complete command does an immediate job submission afterwards
+	{
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new CompleteCmd(suite1_family1_a,Submittable::DUMMY_JOBS_PASSWORD())));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new CtsCmd( CtsCmd::FORCE_DEP_EVAL)));
+
+		node_ptr node = defs.findAbsNode(suite1_family1_a);
+		BOOST_CHECK_MESSAGE( node, "Could not find node");
+		BOOST_CHECK_MESSAGE( node->state() == NState::COMPLETE, "Complete request should place node in NState::COMPLETE");
+		BOOST_CHECK_MESSAGE( suite->state() == NState::ACTIVE, "Expected NState::ACTIVE, but found to be " << NState::toString(suite->state()));
+
+
+		node_ptr nodeb = defs.findAbsNode(suite1_family1_b);
+		BOOST_CHECK_MESSAGE( nodeb, "Could not find node");
+		BOOST_CHECK_MESSAGE( nodeb->state() == NState::ACTIVE, "Expected NState::ACTIVE, but found to be " << NState::toString(nodeb->state()));
+
+	 	std::string errorMsg; BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg),errorMsg);
+  	}
+
+	//*******************************************************************************
+	// Job submission, should not send any jobs for submission.
+ 	//         This will evaluate dependencies( ie day,date, trigger ast)
+ 	{
+		JobsParam jobsParam; // create jobs = false, spawn jobs = false
+		Jobs jobs(&defs);
+ 		BOOST_CHECK_MESSAGE( jobs.generate(jobsParam),jobsParam.getErrorMsg());
+		BOOST_CHECK_MESSAGE( jobsParam.submitted().size() == 0, "Expected 0 task to submit but found " << jobsParam.submitted().size());
+ 	}
+
+	//********************************************************************************
+	// Complete the remaining tasks
+	{
+		TestHelper::invokeRequest(&defs , Cmd_ptr( new CompleteCmd("suite1/family1/b",Submittable::DUMMY_JOBS_PASSWORD())));
+		TestHelper::invokeRequest(&defs , Cmd_ptr( new CompleteCmd(suite1_family2_aa,Submittable::DUMMY_JOBS_PASSWORD())));
+		TestHelper::invokeRequest(&defs , Cmd_ptr( new CompleteCmd(suite1_family2_bb,Submittable::DUMMY_JOBS_PASSWORD())));
+
+		BOOST_CHECK_MESSAGE( suite->state() == NState::COMPLETE, "Suite should be in NState::COMPLETE state");
+	 	std::string errorMsg; BOOST_CHECK_MESSAGE( defs.checkInvariants(errorMsg),errorMsg);
+ 	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestLoadDefsCmd.cpp b/ecflow_4_0_7/Client/test/TestLoadDefsCmd.cpp
new file mode 100644
index 0000000..8bdf824
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestLoadDefsCmd.cpp
@@ -0,0 +1,160 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #42 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "ClientToServerCmd.hpp"
+#include "ServerToClientCmd.hpp"
+#include "MockServer.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "System.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+//=============================================================================
+// This test the LoadDefsCmd. This command will merge/absorb a defs file
+// Since we are merging 2 files. It will give us an opportunity to resolve
+// the extern node paths in the trigger expressions.
+//
+// ********************************************************************
+// In the real server, we dont store, externs
+// *******************************************************************
+BOOST_AUTO_TEST_CASE( test_load_defs_cmd_handleRequest )
+{
+	cout << "Client:: ...test_load_defs_cmd_handleRequest"<< endl;
+
+   std::string firstDef = File::test_data("Client/test/data/first.def","Client");
+
+	// Load the FIRST file with a set of unresolved extrens
+	defs_ptr firstDefs =  Defs::create();
+ 	{
+		DefsStructureParser checkPtParser( firstDefs.get(), firstDef );
+		std::string errorMsg,warningMsg;
+		bool parse = checkPtParser.doParse(errorMsg,warningMsg);
+ 		BOOST_CHECK_MESSAGE(parse,"Parse failed. " << errorMsg);
+	}
+	size_t noOfSuites = firstDefs->suiteVec().size();
+	size_t noOfExterns = firstDefs->externs().size();
+
+
+	// load the SECOND file, which should resolve the externs
+   std::string secondDef = File::test_data("Client/test/data/second.def","Client");
+	Defs secondDefs;
+	{
+		DefsStructureParser checkPtParser( &secondDefs , secondDef);
+		std::string errorMsg,warningMsg;
+		bool parse = checkPtParser.doParse(errorMsg,warningMsg);
+ 		BOOST_CHECK_MESSAGE(parse,"Parse failed. " << errorMsg);
+	}
+	noOfSuites += secondDefs.suiteVec().size();
+	noOfExterns += secondDefs.externs().size();
+
+
+	// Create a LoadDefsCmd. This capable of merging defs files and resolving externs
+	LoadDefsCmd cmd(firstDefs);
+	cmd.setup_user_authentification();
+
+	// Calling handelRequest will absorb the first defs into second including externs & server user variables
+	// AND resolve any references to node paths in the trigger expressions
+	// Test that the merge was OK as well
+	MockServer mockServer(&secondDefs);
+ 	STC_Cmd_ptr requestStatus = cmd.handleRequest(&mockServer);
+	BOOST_CHECK_MESSAGE( requestStatus, "Handle Request " << cmd << " returned NULL\n");
+	BOOST_CHECK_MESSAGE( requestStatus->error().empty(), requestStatus->error());
+  	BOOST_CHECK_MESSAGE( secondDefs.suiteVec().size() == noOfSuites,"Merge failed to add suites");
+ 	BOOST_CHECK_MESSAGE( secondDefs.externs().size() == noOfExterns,"Merge failed to add externs");
+ 	BOOST_CHECK_MESSAGE( firstDefs->suiteVec().size() == 0,          "Merge failed to remove suites");
+
+
+ 	// Modify the Defs file to add a task/trigger that references the undefined
+ 	// extern path defined in file 'first.def' This should fail.
+	task_ptr task = Task::create( "AMadeUpName");
+	task->add_trigger( "/a/b/c/d/e/f/g/h/j == complete");
+	secondDefs.suiteVec().back()->familyVec().back()->addTask(task);
+
+	// we just added an expression, re-parse to create AST
+	// This should also attempt to resolve the extern node path /a/b/c/d/e/f/g/h/j
+	// The suite 'a' should exist. But the full path is non existent
+	// hence we expect the PARSE to fail.
+	std::string errormsg,warningMsg;
+	BOOST_CHECK_MESSAGE(!secondDefs.check(errormsg,warningMsg),errormsg);
+}
+
+BOOST_AUTO_TEST_CASE( test_load_defs_check_only )
+{
+   /// Test that when check only is called the definition is NOT loaded
+   InvokeServer invokeServer("Client:: ...test_load_defs_check_only",SCPort::next());
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+   // Do not load the defs do a check only
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE( theClient.loadDefs(path,false,true/* check only*/) == 0,"Expected load to succeed\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.sync_local() == 0,"Expected sync to succeed\n" << theClient.errorMsg());
+
+   // Note: when running with ECF_NODE=localhost the defs may exist, but the number of suites should be empty
+   BOOST_REQUIRE_MESSAGE( !theClient.defs() || theClient.defs()->suiteVec().empty(),"Expected no defs, since nothing should have been loaded\n" << theClient.errorMsg());
+
+   // provide path to definition that should fail to parse
+   std::string path_bad_def = File::test_data("Client/test/data/bad.def","Client");
+   BOOST_REQUIRE_THROW( theClient.loadDefs(path_bad_def,false,true/* check only*/),std::runtime_error);
+}
+
+BOOST_AUTO_TEST_CASE( test_load_defs )
+{
+   /// Test that loading a defs a second time, with the same suite, throws a errors
+   /// unless the -force option is used.
+   InvokeServer invokeServer("Client:: ...test_load_defs",SCPort::next());
+
+   // create a defs with a single suite 's1'
+   defs_ptr theDefs = Defs::create();
+   {
+      suite_ptr suite =  Suite::create("s1");
+      theDefs->addSuite( suite );
+   }
+
+   // Load the defs into the server
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   theClient.set_throw_on_error(false);
+   BOOST_REQUIRE_MESSAGE( theClient.load(theDefs) == 0,"Expected load to succeed\n" << theClient.errorMsg());
+
+   // load the defs again. This should fail. as it stops accidental overwrites
+   BOOST_REQUIRE_MESSAGE( theClient.load(theDefs) == 1,"Expected load to fail\n" << theClient.errorMsg());
+
+   // Try again but with force
+   BOOST_REQUIRE_MESSAGE( theClient.load(theDefs,true /*force*/) == 0,"Expected load to succeed\n" << theClient.errorMsg());
+
+   /// Destroy singleton's to avoid valgrind from complaining
+   System::destroy();
+   ChangeMgrSingleton::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Client/test/TestMigration.cpp b/ecflow_4_0_7/Client/test/TestMigration.cpp
new file mode 100644
index 0000000..23fa14f
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestMigration.cpp
@@ -0,0 +1,107 @@
+#define BOOST_TEST_MODULE TestMigration
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/timer.hpp>
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "File.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "TestHelper.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "Str.hpp"
+#include "Host.hpp"
+#include "Rtt.hpp"
+#include "DurationTimer.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// ************************************************************************************
+// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+// ************************************************************************************
+
+void do_test_migration(
+         ClientInvoker& theClient,
+         const std::string& host,
+         const std::string& port,
+         const std::string& directory,
+         int & error_cnt
+)
+{
+   fs::path full_path( fs::initial_path<fs::path>() );
+   full_path = fs::system_complete( fs::path( directory ) );
+
+   BOOST_CHECK(fs::exists( full_path ));
+   BOOST_CHECK(fs::is_directory( full_path ));
+
+   //std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
+   fs::directory_iterator end_iter;
+   for ( fs::directory_iterator dir_itr( full_path ); dir_itr != end_iter; ++dir_itr ) {
+      try  {
+         fs::path relPath(directory + "/" + dir_itr->path().filename().string());
+
+         // recurse down directories
+         if ( is_directory(dir_itr->status()) )  {
+            do_test_migration(theClient,host,port,relPath.string(),error_cnt);
+            continue;
+         }
+
+         cout << relPath.string() << "  : file size " << fs::file_size(relPath) << "\n\n";
+         if ( fs::file_size(relPath) > 0) {
+            try {
+               theClient.loadDefs(relPath.string());
+               theClient.delete_all(true);
+            }
+            catch ( std::exception& e) {
+               error_cnt++;
+               BOOST_CHECK_MESSAGE(false,theClient.errorMsg() << " : " << e.what());
+            }
+         }
+      }
+      catch ( const std::exception & ex ) {
+         std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
+      }
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_migration )
+{
+   if (fs::exists("/var/tmp/ma0/ECFLOW_TEST/migration")) {
+      /// This will remove checkpt and backup , to avoid server from loading it. (i.e from previous test)
+      InvokeServer invokeServer("Client:: ...test_migration:",SCPort::next());
+
+      ClientInvoker theClient(invokeServer.host(), invokeServer.port());
+      int error_cnt = 0;
+      do_test_migration(theClient,invokeServer.host(), invokeServer.port(),"/var/tmp/ma0/ECFLOW_TEST/migration",error_cnt);
+      BOOST_REQUIRE_MESSAGE( error_cnt == 0, "Migration test failed " << error_cnt << " times " );
+   }
+   else {
+      std::cout << "Ignoring test, since directory '/var/tmp/ma0/ECFLOW_TEST/migration' not found\n";
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Client/test/TestPlugCmd.cpp b/ecflow_4_0_7/Client/test/TestPlugCmd.cpp
new file mode 100644
index 0000000..2bff0ae
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestPlugCmd.cpp
@@ -0,0 +1,321 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #34 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/progress.hpp"
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "TestHelper.hpp"
+#include "MockServer.hpp"
+
+#include "ClientInvoker.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite)
+
+BOOST_AUTO_TEST_CASE( test_plug_cmd )
+{
+	cout << "Client:: ...test_plug_cmd" << endl;
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+	Defs defs;
+	DefsStructureParser checkPtParser( &defs , path );
+	std::string errorMsg,warningMsg;
+	bool parse = checkPtParser.doParse(errorMsg,warningMsg);
+	if (!parse)  std::cerr << errorMsg;
+	BOOST_CHECK(parse);
+
+//	suite suite1
+//	  family family1
+//	   	task a
+//	        event 1 myEvent
+//	        meter myMeter 0 100
+//	   	task b
+//	   		trigger a == complete
+//	   endfamily
+//	   family family2
+//	   		task aa
+//	   			trigger ../family1/a:myMeter >= 20 and ../family1/a:myEvent
+//	   		task bb
+//	   			trigger ../family1/a:myMeter >= 50 || ../family1/a:myEvent
+//	    endfamily
+//	endsuite
+
+	/// Test failure modes, MockServer defaults to localhost:3141
+	// test source node that does not exist, fails
+	TestHelper::invokeFailureRequest(&defs, Cmd_ptr( new PlugCmd("I/dont/exist/on/the server", "suite1/family2") ));
+
+	// test dest node that does not exist, fails
+	TestHelper::invokeFailureRequest(&defs, Cmd_ptr( new PlugCmd("suite1/family1/a", "i/dont/exist/on/server") ));
+
+	// test source node same as dest node, fails
+	TestHelper::invokeFailureRequest(&defs, Cmd_ptr( new PlugCmd("suite1/family1/a", "suite1/family1/a") ));
+
+	// test dest node that matches local server host and port, but where path does not exist, fails
+	TestHelper::invokeFailureRequest(&defs, Cmd_ptr( new PlugCmd("suite1/family1/a", "//localhost:3141/i/dont/exist/on/local_server") ));
+
+	// Lock server as another user. Invoke a valid request that should fail, due to a lock
+	MockServer server(&defs);
+	BOOST_REQUIRE_MESSAGE(server.lock("A user"),"Lock expected to succeed");
+	TestHelper::invokeFailureRequest(server,Cmd_ptr( new PlugCmd("suite1/family1/a", "suite1/family2")));
+
+
+	{   // Move the TASKS: on family1 --> family2
+		// Note: if on the destination node we select a task 'suite1/family2/aa', then node is moved to its parent
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family1/a", "suite1/family2")));
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family1/b", "//localhost:3141/suite1/family2/aa")));
+
+		node_ptr node = defs.findAbsNode("suite1/family1");
+		BOOST_REQUIRE_MESSAGE( node.get() && node->isFamily(), "Could not find suite1/family1");
+		BOOST_REQUIRE_MESSAGE( node->isFamily()->taskVec().size() == 0, "Failed to move task to other family");
+
+		node_ptr node2 = defs.findAbsNode("suite1/family2");
+		BOOST_REQUIRE_MESSAGE( node2.get() && node->isFamily(), "Could not find suite1/family2");
+		BOOST_REQUIRE_MESSAGE( node2->isFamily()->taskVec().size() == 4, "family2 two should have 4 tasks");
+	}
+
+	{   // Move FAMILIES: Add a new suite and move family1 and  family2 to it.
+		defs.addSuite(  Suite::create("suite2") );
+
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family1", "suite2")));
+		TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family2", "suite2")));
+
+		node_ptr suite1 = defs.findAbsNode("suite1");
+		BOOST_REQUIRE_MESSAGE( suite1.get() && suite1->isSuite(), "Could not find suite1");
+		BOOST_REQUIRE_MESSAGE( suite1->isSuite()->familyVec().size() == 0, "Expected suite1 to have '0' families as they should have been moved to suite2");
+
+		node_ptr suite2 = defs.findAbsNode("suite2");
+		BOOST_REQUIRE_MESSAGE( suite2.get() && suite2->isSuite(), "Could not find suite2");
+		BOOST_REQUIRE_MESSAGE( suite2->isSuite()->familyVec().size() == 2, "Expected suite2 to have '2' families");
+	}
+}
+
+
+BOOST_AUTO_TEST_CASE( test_plug_cmd_with_handles )
+{
+   cout << "Client:: ...test_plug_cmd_with_handles" << endl;
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+   Defs defs;
+   DefsStructureParser checkPtParser( &defs , path );
+   std::string errorMsg,warningMsg;
+   bool parse = checkPtParser.doParse(errorMsg,warningMsg);
+   if (!parse)  std::cerr << errorMsg;
+   BOOST_CHECK(parse);
+
+// suite suite1
+//   family family1
+//       task a
+//         event 1 myEvent
+//         meter myMeter 0 100
+//       task b
+//          trigger a == complete
+//    endfamily
+//    family family2
+//          task aa
+//             trigger ../family1/a:myMeter >= 20 and ../family1/a:myEvent
+//          task bb
+//             trigger ../family1/a:myMeter >= 50 || ../family1/a:myEvent
+//     endfamily
+// endsuite
+
+   /// create client handle which references suites suite in the server defs
+    std::vector<std::string> suite_names; suite_names.push_back("suite"); suite_names.push_back("suite2");
+    TestHelper::invokeRequest(&defs,Cmd_ptr( new ClientHandleCmd(suite_names,false)),false /* bypass_state_modify_change_check */);
+
+
+   {  // Move the TASKS: on family1 --> family2
+      // Note: if on the destination node we select a task 'suite1/family2/aa', then node is moved to its parent
+      Suite* suite = defs.findAbsNode("suite1")->isSuite();
+      unsigned int state_change_no = suite->state_change_no();
+      unsigned int modify_change_no = suite->modify_change_no();
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family1/a", "suite1/family2")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family1/b", "//localhost:3141/suite1/family2/aa")));
+
+      BOOST_CHECK_MESSAGE(state_change_no != suite->state_change_no() || modify_change_no != suite->modify_change_no(),
+                          "state and modify change numbers unaltered by plug command when using handles");
+   }
+
+   {   // Move FAMILIES: Add a new suite and move family1 and  family2 to it.
+      suite_ptr suite2 = defs.add_suite("suite2");
+      unsigned int state_change_no = suite2->state_change_no();
+      unsigned int modify_change_no = suite2->modify_change_no();
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family1", "suite2")));
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new PlugCmd("suite1/family2", "suite2")));
+      BOOST_CHECK_MESSAGE(state_change_no != suite2->state_change_no() || modify_change_no != suite2->modify_change_no(),
+                          "state and modify change numbers unaltered by plug command when using handles");
+   }
+}
+
+static void test_plug_on_multiple_server(
+         const std::string& host1, const std::string& port1,
+         const std::string& host2, const std::string& port2
+)
+{
+   std::cout << " on host1("<< host1 << ":" << port1 << ") host2(" << host2 << ":" << port2 << ")" << endl;
+   ClientInvoker server1Client(host1,port1); server1Client.set_throw_on_error(false);
+   ClientInvoker server2Client(host2,port2); server2Client.set_throw_on_error(false);
+
+   //std::cout << " restartServer the FIRST and SECOND servers" << endl;
+   BOOST_REQUIRE_MESSAGE( server1Client.restartServer() == 0,CtsApi::restartServer() << " should return 0 server not started, or connection refused\n" << server1Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE( server2Client.restartServer() == 0,CtsApi::restartServer() << " should return 0 server not started, or connection refused\n" << server2Client.errorMsg());
+
+   //std::cout << " LOAD the defs into FIRST server(" << host1 << ":" << port1 << ") There is NO DEFS in the second server." << endl;
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+   BOOST_REQUIRE_MESSAGE( server1Client.loadDefs(path) == 0,"load defs failed \n" << server1Client.errorMsg());
+
+
+   //cout << " Test the ERROR conditions in MoveCmd" << endl;
+   std::string sourcePath = "/suite1";
+   std::string secondServerHostPort = "//localhost:" + port2; // The destination path must encode the host:port path to the second server
+
+   std::string destPath = secondServerHostPort + "/A/made/up/dest/path/that/does/not/exist/on/server2";
+   //cout << " Plug/Move from server1(" << host1 << ":" << port1 << ") to destination server " << destPath << endl;
+   int theResult =  server1Client.plug(sourcePath,destPath);
+   BOOST_REQUIRE_MESSAGE( theResult == 1,CtsApi::plugArg() << "Expected to fail since no defs in server 2\n");
+   // 	std::cout << "Error message = " << server1Client.errorMsg() << "\n";
+
+   //cout << " *** Load Defs into SECOND server ***, ie both servers have the same definitions" << endl;
+   BOOST_REQUIRE_MESSAGE( server2Client.loadDefs(path) == 0,"load defs failed \n" << server2Client.errorMsg());
+
+
+   destPath = secondServerHostPort + "/suite1";
+   theResult =  server1Client.plug(sourcePath,destPath);
+   //  cout << "server1Client.errorMsg() = " << server1Client.errorMsg() << "\n";
+   BOOST_REQUIRE_MESSAGE( theResult == 1,CtsApi::plugArg() << " Expected to fail, since 'suite1' already exists in the server  \n");
+
+   destPath = secondServerHostPort + "/suite1/family1";
+   theResult =  server1Client.plug(sourcePath,destPath);
+   //  cout << "server1Client.errorMsg() = " << server1Client.errorMsg() << "\n";
+   BOOST_REQUIRE_MESSAGE( theResult == 1,CtsApi::plugArg() << " Expected to fail, since can't move a suite into a family\n");
+
+   destPath = secondServerHostPort + "/suite1";
+   theResult =  server1Client.plug("/suite1/family1",destPath);
+   //  cout << "server1Client.errorMsg() = " << server1Client.errorMsg() << "\n";
+   BOOST_REQUIRE_MESSAGE( theResult == 1,CtsApi::plugArg() << " Expected to fail, Destination already has a family1 \n");
+
+   destPath = secondServerHostPort + "/A/made/up/dest/path/that/does/not/exist/on/server2";
+   theResult =  server1Client.plug(sourcePath,destPath);
+   //  	cout << "server1Client.errorMsg() = " << server1Client.errorMsg() << "\n";
+   BOOST_REQUIRE_MESSAGE( theResult == 1,CtsApi::plugArg() << " Expected to fail, since destination path does not exist\n");
+
+   destPath = secondServerHostPort;
+   theResult =  server1Client.plug("/suite1/family1",destPath);
+   //  cout << "server1Client.errorMsg() = " << server1Client.errorMsg() << "\n";
+   BOOST_REQUIRE_MESSAGE( theResult == 1,CtsApi::plugArg() << " Expected to fail,since source path must be a suite, if the destination path name is empty\n");
+
+
+   // ==========================================================================================
+   // Test Plug command works
+   // ==========================================================================================
+
+   // Completely remove the 'suite1' file in the second server
+   BOOST_REQUIRE_MESSAGE( server2Client.delete_node(sourcePath) == 0,CtsApi::to_string(CtsApi::delete_node(sourcePath)) << " failed \n" << server2Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE( server2Client.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << server2Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE( server2Client.defs().get(),"Server returned a NULL defs");
+   BOOST_REQUIRE_MESSAGE( server2Client.defs()->suiteVec().size() == 0," Expected server2 to have zero suite");
+
+   // Move the suite FROM the FIRST server TO the SECOND server and check that it worked
+   destPath = secondServerHostPort;
+   theResult =  server1Client.plug(sourcePath,destPath);
+   BOOST_REQUIRE_MESSAGE( theResult == 0,CtsApi::plugArg() << " failed \n" << server1Client.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE( server1Client.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << server1Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE( server1Client.defs().get(),"Server returned a NULL defs");
+   BOOST_REQUIRE_MESSAGE( server1Client.defs()->suiteVec().size() == 0," Expected server1 to have no suites");
+
+   BOOST_REQUIRE_MESSAGE( server2Client.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << server2Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE( server2Client.defs().get(),"Server returned a NULL defs");
+   BOOST_REQUIRE_MESSAGE( server2Client.defs()->suiteVec().size() == 1," Expected server2 to have one suite");
+
+
+   // ==========================================================================
+   // Do it again, but with no defs file in second server. reload defs into server1
+   BOOST_REQUIRE_MESSAGE(server1Client.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " failed \n" << server1Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE(server2Client.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " failed \n" << server2Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE(server1Client.loadDefs(path) == 0,"load defs failed \n" << server1Client.errorMsg());
+
+   destPath = secondServerHostPort;
+   theResult =  server1Client.plug(sourcePath,destPath);
+   BOOST_REQUIRE_MESSAGE( theResult == 0,CtsApi::plugArg() << " failed \n" << server1Client.errorMsg());
+
+   BOOST_REQUIRE_MESSAGE(server1Client.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << server1Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE( server1Client.defs().get(),"Server returned a NULL defs");
+   BOOST_REQUIRE_MESSAGE( server1Client.defs()->suiteVec().size() == 0," Expected server1 to have no suites");
+
+   BOOST_REQUIRE_MESSAGE(server2Client.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << server2Client.errorMsg());
+   BOOST_REQUIRE_MESSAGE( server2Client.defs().get(),"Server returned a NULL defs");
+   BOOST_REQUIRE_MESSAGE( server2Client.defs()->suiteVec().size() == 1," Expected server2 to have one suite");
+}
+
+BOOST_AUTO_TEST_CASE( test_server_plug_cmd )
+{
+ 	if (ClientEnvironment::hostSpecified().empty()) {
+
+ 	   cout << "Client:: ...test_server_plug_cmd";
+
+ 		// Invoke two servers. *which* will both terminate at the end of this scope
+ 		// This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+ 		InvokeServer invokeServer1("",SCPort::next());
+ 		InvokeServer invokeServer2("",SCPort::next());
+
+		test_plug_on_multiple_server(invokeServer1.host(), invokeServer1.port(),
+		                             invokeServer2.host(), invokeServer2.port());
+	}
+ 	else {
+
+ 	   // Plug is broken for new->old servers, where boost serialsation version number changes.
+ 	   if (getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")) {
+ 	      cout << "Client:: ...test_server_plug_cmd:  ignoring test when ECF_ALLOW_NEW_CLIENT_OLD_SERVER specified" << endl;
+ 	      return;
+ 	   }
+
+      cout << "Client:: ...test_server_plug_cmd";
+
+ 	   // Remote server all ready running, start one more additional server
+ 	   {
+ 	      // remove any suites on the remote server. Since this test requires it.
+ 	      ClientInvoker theClient(ClientEnvironment::hostSpecified(),ClientEnvironment::portSpecified());
+ 	      BOOST_REQUIRE_MESSAGE( theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " failed should return 0. Should Delete ALL existing defs in the server\n" << theClient.errorMsg());
+ 	   }
+
+ 	   // Start additional local server, special constructor. need false flag, to avoid ambiguity, with the other constructor.
+ 	   std::string port2 = SCPort::next();
+ 	   InvokeServer invokeServer2(port2,false);
+
+ 	   test_plug_on_multiple_server(ClientEnvironment::hostSpecified(), Str::DEFAULT_PORT_NUMBER(),
+ 	                                Str::LOCALHOST(), port2);
+ 	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestRtt.cpp b/ecflow_4_0_7/Client/test/TestRtt.cpp
new file mode 100644
index 0000000..3c6e403
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestRtt.cpp
@@ -0,0 +1,53 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/timer.hpp>
+
+#include "Rtt.hpp"
+#include "File.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+BOOST_AUTO_TEST_CASE( test_client_invoker_round_trip_times )
+{
+   cout << "Client:: ...test_client_invoker_round_trip_times" << endl;
+
+   std::string root_path = File::test_data("Client/test/data/","Client");
+
+   /// Open file rtt.dat and compute average round trip times
+   std::string result = Rtt::analyis( root_path + "rtt.dat");
+   //cout << result << "\n";
+
+   /// generated a file with results
+   std::string errorMsg;
+   string generated_file = root_path + "rtt_analysis.dat";
+   BOOST_CHECK_MESSAGE(File::create(generated_file, result,errorMsg),errorMsg);
+
+   /// Compare with a reference file
+   std::vector<std::string> ignoreVec; errorMsg.clear();
+   std::string diffs = File::diff(generated_file, root_path + "ref_analysis.dat", ignoreVec, errorMsg );
+   BOOST_CHECK_MESSAGE(diffs.empty(),diffs << "\n" <<  errorMsg);
+
+   if (diffs.empty())  boost::filesystem::remove(generated_file);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Client/test/TestServer.cpp b/ecflow_4_0_7/Client/test/TestServer.cpp
new file mode 100644
index 0000000..0472366
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestServer.cpp
@@ -0,0 +1,318 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #45 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/timer.hpp>
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib, for to_simple_string
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "File.hpp"
+#include "TestHelper.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "Str.hpp"
+#include "DurationTimer.hpp"
+#include "Host.hpp"
+#include "Version.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// ************************************************************************************
+// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+//
+// Note: To test HPUX->Linux, invoke serve on (Linux/HPUX) and the client cmds on other system
+//       On the client side set ECF_NODE to machine name. To allow further testing if ECF_NODE
+//       is specified then *don't* shutdown the server
+// ************************************************************************************
+
+BOOST_AUTO_TEST_CASE( test_server_version )
+{
+   /// This will remove checkpt and backup , to avoid server from loading it. (i.e from previous test)
+   InvokeServer invokeServer("Client:: ...test_server_version:",SCPort::next());
+
+   ClientInvoker theClient(invokeServer.host(), invokeServer.port());
+   BOOST_REQUIRE_MESSAGE(theClient.server_version() == 0,"server version\n" << theClient.errorMsg());
+   if (ClientEnvironment::hostSpecified().empty()) {
+      // This check only valid if server was invoked locally. Ignore for remote servers
+      BOOST_REQUIRE_MESSAGE(theClient.get_string() == Version::raw(),"Expected client version(" << Version::raw() << ") to match server version(" << theClient.get_string() << ")");
+   }
+   else {
+      // remote server, version may be different
+      BOOST_WARN_MESSAGE(theClient.get_string() == Version::raw(),"Client version(" << Version::raw() << ") does not match server version(" << theClient.get_string() << ")");
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_server_state_changes )
+{
+   /// This will remove checkpt and backup , to avoid server from loading it. (i.e from previous test)
+   InvokeServer invokeServer("Client:: ...test_server_state_changes:",SCPort::next());
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+   ClientInvoker theClient(invokeServer.host(), invokeServer.port());
+   BOOST_REQUIRE_MESSAGE(theClient.loadDefs(path) == 0,"load defs failed \n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+   if (ClientEnvironment::hostSpecified().empty()) {
+      // server started locally
+      BOOST_REQUIRE_MESSAGE(theClient.defs()->server().get_state() == SState::HALTED,"Expected INITIAL server state HALTED but found " << SState::to_string(theClient.defs()->server().get_state()));
+   }
+
+   BOOST_REQUIRE_MESSAGE(theClient.shutdownServer() == 0,CtsApi::shutdownServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.defs()->server().get_state() == SState::SHUTDOWN,"Expected server state SHUTDOWN but found " << SState::to_string(theClient.defs()->server().get_state()));
+
+   BOOST_REQUIRE_MESSAGE(theClient.haltServer() == 0,CtsApi::haltServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.defs()->server().get_state() == SState::HALTED,"Expected server state HALTED but found " << SState::to_string(theClient.defs()->server().get_state()));
+
+   BOOST_REQUIRE_MESSAGE(theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.defs()->server().get_state() == SState::RUNNING,"Expected server state RUNNING but found " << SState::to_string(theClient.defs()->server().get_state()));
+
+   /// Repeat test using sync_local() to test incremental changes of server
+   BOOST_REQUIRE_MESSAGE(theClient.shutdownServer() == 0,CtsApi::shutdownServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.sync_local() == 0," failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.defs()->server().get_state() == SState::SHUTDOWN,"Expected server state SHUTDOWN but found " << SState::to_string(theClient.defs()->server().get_state()));
+
+   BOOST_REQUIRE_MESSAGE(theClient.haltServer() == 0,CtsApi::haltServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.sync_local() == 0," failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.defs()->server().get_state() == SState::HALTED,"Expected server state HALTED but found " << SState::to_string(theClient.defs()->server().get_state()));
+
+   BOOST_REQUIRE_MESSAGE(theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.sync_local() == 0," failed should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE(theClient.defs()->server().get_state() == SState::RUNNING,"Expected server state RUNNING but found " << SState::to_string(theClient.defs()->server().get_state()));
+
+   if (ClientEnvironment::hostSpecified().empty()) {
+      // This check only valid if server was invoked locally. Ignore for remote servers
+
+      // make sure edit history updated
+      BOOST_REQUIRE_MESSAGE(theClient.edit_history(Str::ROOT_PATH()) == 0,CtsApi::to_string(CtsApi::edit_history(Str::ROOT_PATH())) << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.server_reply().get_string_vec().size() ==  7,"Expected edit history of size 7, but found " << theClient.server_reply().get_string_vec().size());
+
+      // make sure edit history was *NOT* serialized, It is only serialized when check pointing
+      BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.defs()->get_edit_history(Str::ROOT_PATH()).size() ==  0,"Expected edit history of size 0, but found " <<  theClient.defs()->get_edit_history(Str::ROOT_PATH()).size());
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_server_stress_test )
+{
+	/// This will remove checkpt and backup , to avoid server from loading it. (i.e from previous test)
+	InvokeServer invokeServer("Client:: ...test_server_stress_test:",SCPort::next());
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+  	boost::timer boost_timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+	DurationTimer duration_timer;
+	ClientInvoker theClient(invokeServer.host(), invokeServer.port());
+	int load = 125;
+	for(int i = 0; i < load; i++) {
+
+		BOOST_REQUIRE_MESSAGE(theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+ 	   BOOST_REQUIRE_MESSAGE(theClient.loadDefs(path) == 0,"load defs failed \n" << theClient.errorMsg());
+		BOOST_REQUIRE_MESSAGE(theClient.shutdownServer() == 0,CtsApi::shutdownServer() << " should return 0\n" << theClient.errorMsg());
+		BOOST_REQUIRE_MESSAGE(theClient.haltServer() == 0,CtsApi::haltServer() << " should return 0\n" << theClient.errorMsg());
+		BOOST_REQUIRE_MESSAGE(theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+		BOOST_REQUIRE_MESSAGE(theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+		BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " failed should return 0\n" << theClient.errorMsg());
+
+ 		BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+    	BOOST_REQUIRE_MESSAGE( theClient.defs().get(),"Server returned a NULL defs");
+  		BOOST_REQUIRE_MESSAGE( theClient.defs()->suiteVec().size() >= 1,"  no suite ?");
+ 	}
+	cout << " Server handled " << load * 8
+	     << " requests in boost_timer(" << boost_timer.elapsed()
+	     << ") DurationTimer(" << to_simple_string(duration_timer.elapsed())
+	     << ")" << endl;
+}
+
+
+BOOST_AUTO_TEST_CASE( test_server_group_stress_test )
+{
+	/// This is exactly the same test as above, but uses the group command
+	/// This should be faster as the network traffic should be a lot less
+	InvokeServer invokeServer("Client:: ...test_server_group_stress_test:",SCPort::next());
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+  	boost::timer boost_timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+	DurationTimer duration_timer;
+	ClientInvoker theClient(invokeServer.host(), invokeServer.port());
+
+	std::string groupRequest = CtsApi::to_string(CtsApi::delete_node());
+	groupRequest += ";";
+	groupRequest +=	CtsApi::to_string(CtsApi::loadDefs(path,true/*force*/,false /*check_only*/));
+	groupRequest += ";";
+	groupRequest += CtsApi::shutdownServer();
+	groupRequest += ";";
+	groupRequest += CtsApi::haltServer();
+	groupRequest += ";";
+	groupRequest += CtsApi::restartServer();
+	groupRequest += ";";
+	groupRequest += CtsApi::restartServer();
+	groupRequest += ";";
+	groupRequest += CtsApi::checkPtDefs();
+	groupRequest += ";";
+	groupRequest += CtsApi::get();
+
+	//cout << "groupRequest = " << groupRequest << "\n";
+
+	int load = 125;
+	for(int i = 0; i < load; i++) {
+   	BOOST_REQUIRE_MESSAGE( theClient.group(groupRequest) == 0,"Group request " << CtsApi::group(groupRequest) << " failed should return 0\n" << theClient.errorMsg());
+ 	 	BOOST_REQUIRE_MESSAGE( theClient.defs().get(),"Server returned a NULL defs");
+  		BOOST_REQUIRE_MESSAGE( theClient.defs()->suiteVec().size() >= 1,"  no suite ?");
+ 	}
+	cout << " Server handled " << load * 8
+	     << " commands using " << load << " group requests in boost_timer(" << boost_timer.elapsed()
+	     << ") DurationTimer(" << to_simple_string(duration_timer.elapsed())
+	     << ")" << endl;
+}
+
+BOOST_AUTO_TEST_CASE( test_server_stress_test_2 )
+{
+   /// More extensive stress test, using as many user based command as possible.
+   ///
+   /// This will remove checkpt and backup , to avoid server from loading it. (i.e from previous test)
+   InvokeServer invokeServer("Client:: ...test_server_stress_test_2:",SCPort::next());
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+   Zombie z(Child::USER,ecf::Child::INIT,ZombieAttr::get_default_attr(Child::USER),"path_to_task","DUMMY_JOBS_PASSWORD", "DUMMY_PROCESS_OR_REMOTE_ID",1);
+   std::vector<std::string> suites; suites.push_back("suite1"); suites.push_back("made_up_suite");
+
+   std::vector<std::string> nodes_to_delete;
+   nodes_to_delete.push_back("/suite1/family2/aa"); // these should exist in lifecycle.txt
+   nodes_to_delete.push_back("/suite1/family2/bb");
+
+#if defined(HPUX)
+   int load = 10;  // On non linux systems use different load otherwise it takes to long
+#elif defined(_AIX)
+   int load = 65; // On non linux systems use different load otherwise it takes to long
+#else
+   int load = 136;
+#endif
+
+   boost::timer boost_timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
+   DurationTimer duration_timer;
+   ClientInvoker theClient(invokeServer.host(), invokeServer.port());
+   theClient.set_throw_on_error(false);
+   for(int i = 0; i < load; i++) {
+
+      BOOST_REQUIRE_MESSAGE( theClient.pingServer() == 0, " ping should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.loadDefs(path) == 0,"load defs failed \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.shutdownServer() == 0,CtsApi::shutdownServer() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.haltServer() == 0,CtsApi::haltServer() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.news_local() == 0, " new local failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.sync_local() == 0, "failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.stats() == 0,CtsApi::stats() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.suites() == 0,CtsApi::suites() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.server_version() == 0,CtsApi::server_version() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.debug_server_off() == 0,CtsApi::debug_server_off() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.check("/suite1") == 0,"check should return 0\n" << theClient.errorMsg()); //13
+
+      BOOST_REQUIRE_MESSAGE( theClient.logMsg("start") == 0,"log msg should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.get_log_path() == 0,"get_log_path should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.getLog(1) == 0,"get_log last line should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.flushLog() == 0,"flushLog should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1","unknown",true) == 0,"check should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1","complete",true) == 0,"check should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1","submitted",true) == 0,"check should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1","active",true) == 0,"check should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1","aborted",true) == 0,"check should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1","queued",true) == 0,"check should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1/family1/a:myEvent","set") == 0,"check should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.force("/suite1/family1/a:myEvent","clear") == 0,"check should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE( theClient.zombieGet() == 0,CtsApi::zombieGet() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.zombieFob(z) == 0,    " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.zombieFail(z) == 0,   " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.zombieAdopt(z) == 0,  " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.zombieBlock(z) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.zombieRemove(z) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.zombieKill(z) == 0, " should return 0\n" << theClient.errorMsg()); //19
+
+      BOOST_REQUIRE_MESSAGE( theClient.suspend("/suite1") == 0,CtsApi::to_string(CtsApi::suspend("/suite1"))<< " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.resume("/suite1") == 0,CtsApi::to_string(CtsApi::resume("/suite1")) << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.edit_history("/suite1") == 0,CtsApi::to_string(CtsApi::edit_history("/suite1")) << " should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path) == 0,  " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path,true) == 0,  " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path,true, true) == 0,  " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.replace("/suite1",path,false, true) == 0,  " should return 0\n" << theClient.errorMsg()); //26
+
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::NEVER) == 0," should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::ALWAYS) == 0," should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::ON_TIME,180) == 0," should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::ON_TIME) == 0," should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::UNDEFINED) == 0," should return 0\n" << theClient.errorMsg()); //32
+      BOOST_REQUIRE_MESSAGE( theClient.checkPtDefs(ecf::CheckPt::ON_TIME,CheckPt::default_interval()) == 0," should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE( theClient.freeDep("/suite1") == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.freeDep("/suite1",true,true,true,true) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.freeDep("/suite1",true) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.freeDep("/suite1",false,true) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.freeDep("/suite1",false,false,true) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.freeDep("/suite1",false,false,false,true) == 0, " should return 0\n" << theClient.errorMsg()); //38
+
+      BOOST_REQUIRE_MESSAGE( theClient.ch_register(true,suites) == 0,"--ch_register \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_suites() == 0,"--ch_suites should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_add(1,suites) == 0,"--ch_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_remove(1,suites) == 0,"--ch_remove \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_auto_add(1,true) == 0,"--ch_auto_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_auto_add(1,false) == 0,"--ch_auto_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch_drop(1) == 0,"--ch_drop should return 0\n" << theClient.errorMsg()); //45
+
+      BOOST_REQUIRE_MESSAGE( theClient.ch_register(true,suites) == 0,"--ch_register \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch1_add(suites) == 0,"--ch1_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch1_auto_add(true) == 0,"--ch1_auto_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch1_auto_add(false) == 0,"--ch1_auto_add \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch1_remove(suites) == 0,"--ch1_remove \n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.ch1_drop() == 0,"--ch1_drop \n" << theClient.errorMsg()); //51
+
+      BOOST_REQUIRE_MESSAGE( theClient.order("/suite1","top") == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.order("/suite1","bottom") == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.order("/suite1","alpha") == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.order("/suite1",NOrder::ORDER) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.order("/suite1",NOrder::UP) == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.order("/suite1",NOrder::DOWN) == 0, " should return 0\n" << theClient.errorMsg()); //57
+
+      BOOST_REQUIRE_MESSAGE( theClient.delete_node("/suite1/family1/a")  == 0, " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE( theClient.delete_nodes(nodes_to_delete) == 0, " should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE( theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg()); //60
+      BOOST_REQUIRE_MESSAGE( theClient.defs().get(),"Server returned a NULL defs");
+      BOOST_REQUIRE_MESSAGE( theClient.defs()->suiteVec().size() >= 1,"  no suite ?");
+   }
+   cout << " Server handled " << load * 74
+        << " requests in boost_timer(" << boost_timer.elapsed()
+        << ") DurationTimer(" << to_simple_string(duration_timer.elapsed())
+        << ")" << endl;
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Client/test/TestServerAndLifeCycle.cpp b/ecflow_4_0_7/Client/test/TestServerAndLifeCycle.cpp
new file mode 100644
index 0000000..d326f13
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestServerAndLifeCycle.cpp
@@ -0,0 +1,249 @@
+#define BOOST_TEST_MODULE TestClient
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #54 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "File.hpp"
+#include "PrintStyle.hpp"
+#include "WhiteListFile.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "Str.hpp"
+#include "System.hpp"             // kill singleton for valgrind
+#include "ChangeMgrSingleton.hpp" // kill singleton for valgrind
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// ************************************************************************************
+// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+//
+// Note: To test HPUX->Linux, invoke serve on (Linux/HPUX) and the client cmds on other system
+//       On the client side set ECF_NODE to machine name. To allow further testing if ECF_NODE
+//       is specified then *don't* shutdown the server
+// ************************************************************************************
+
+BOOST_AUTO_TEST_CASE( test_client_lifecyle )
+{
+   // *******************************************************************************************
+   // This test will *ONLY* work when testing with new server invocation, since it relies
+   // on disabling job generation. Hence ignore test if ECF_NODE has been defined
+   // *******************************************************************************************
+   std::string host = ClientEnvironment::hostSpecified();
+   if (!host.empty()) {
+      // Server allready started, since we cant disable job generation ignore this test
+      std::cout << "Client:: ...test_client_lifecycle, ignoring test when ECF_NODE specified..." << endl;
+      return;
+   }
+
+   // This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+   // ** NOTE: We disable job generation in the server **/
+   InvokeServer invokeServer("Client:: ...test_client_lifecycle",SCPort::next(),true /*disable job generation in server*/);
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE( theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0 server not started, or connection refused\n" << theClient.errorMsg());
+
+   // load the defs into the server
+   {
+      std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+      BOOST_REQUIRE_MESSAGE(theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.loadDefs(path) == 0, "Load defs failed \n" << theClient.errorMsg());
+   }
+   {
+      BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"Server returned a NULL defs");
+      BOOST_REQUIRE_MESSAGE( serverDefs->suiteVec().size() >= 1,"  no suite ?");
+   }
+
+
+   // Now go through and simulate client request to change Node tree state.
+   // This is **highly** dependent on lifecycle.txt
+   //	suite suite1
+   //	  family family1
+   //	   	task a
+   //	        event 1 myEvent
+   //	        meter myMeter 0 100
+   //	   	task b
+   //	   		trigger a == complete
+   //	   endfamily
+   //	   family family2
+   //	   		task aa
+   //	   			trigger ../family1/a:myMeter >= 20 and ../family1/a:myEvent
+   //	   		task bb
+   //	   			trigger ../family1/a:myMeter >= 50 || ../family1/a:myEvent
+   //	    endfamily
+   //	endsuite
+
+   string suite1_family1_a = "suite1/family1/a";
+   string suite1_family1_b = "suite1/family1/b";
+   string suite1_family2_aa = "suite1/family2/aa";
+   string suite1_family2_bb = "suite1/family2/bb";
+
+   {
+      // Begin will set all states to queued and then start job submission placing
+      // any submiited jobs into the active state. Note server setup has disabled job generation
+      BOOST_REQUIRE_MESSAGE(theClient.begin("suite1") == 0,CtsApi::begin("suite1") << " failed should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+      defs_ptr serverDefs =  theClient.defs();
+      node_ptr node = serverDefs->findAbsNode(suite1_family1_a);
+      BOOST_REQUIRE_MESSAGE( node->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(node->state()));
+   }
+
+   //**********************************************************************
+   // Create a request to set the event on Node suite1/family1/a
+   // This should place suite1_family2_bb immediately into submitted state
+   // Since we at least one node in submitted, suite should be in SUBMITTED state
+   {
+      theClient.taskPath(suite1_family1_a);
+      theClient.set_jobs_password(Submittable::DUMMY_JOBS_PASSWORD());
+      BOOST_REQUIRE_MESSAGE(theClient.eventTask("myEvent") == 0,TaskApi::event("myEvent") << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.forceDependencyEval() == 0,CtsApi::forceDependencyEval() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+      defs_ptr serverDefs =  theClient.defs();
+      // PrintStyle style(PrintStyle::STATE);
+      // 		cerr << *serverDefs.get() << "\n";
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      node_ptr node = serverDefs->findAbsNode(suite1_family1_a);
+      BOOST_REQUIRE_MESSAGE( node->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(node->state()));
+      node_ptr nodeb = serverDefs->findAbsNode(suite1_family2_bb);
+      BOOST_REQUIRE_MESSAGE( nodeb->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(nodeb->state()));
+   }
+
+
+   //**********************************************************************
+   // Create a request to set the Meter on Node suite1/family1/a
+   // This should force suite1_family2_aa immediately into submitted state
+   // This should force suite1_family2_bb immediately into submitted state
+   {
+      theClient.taskPath(suite1_family1_a);
+      {
+         char* argv[] = { const_cast<char*>("ClientInvoker"),
+                  const_cast<char*>("--meter=myMeter"),
+                  const_cast<char*>("100")
+         };
+         BOOST_REQUIRE_MESSAGE(theClient.invoke(3,argv) == 0," should return 0\n" << theClient.errorMsg());
+         BOOST_REQUIRE_MESSAGE(theClient.forceDependencyEval() == 0,CtsApi::forceDependencyEval() << " failed should return 0\n" << theClient.errorMsg());
+      }
+
+      BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      node_ptr nodeaa = serverDefs->findAbsNode(suite1_family2_aa);
+      BOOST_REQUIRE_MESSAGE( nodeaa->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(nodeaa->state()));
+
+      node_ptr nodebb = serverDefs->findAbsNode(suite1_family2_bb);
+      BOOST_REQUIRE_MESSAGE( nodebb->state() == NState::ACTIVE, "Node expected NState::ACTIVE, but found to be " << NState::toString(nodebb->state()));
+   }
+
+   //**********************************************************************
+   // Create a request to complete task suite1/family1/a
+   // This should force suite1_family1_b to complete
+   {
+      theClient.taskPath(suite1_family1_a);
+      BOOST_REQUIRE_MESSAGE(theClient.completeTask() == 0,TaskApi::complete() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.forceDependencyEval() == 0,CtsApi::forceDependencyEval() << " failed should return 0\n" << theClient.errorMsg());
+
+      // Resolve dependencies
+      // We could either wait 60 second or
+      // added a custom command that will force dependency evaluation
+      BOOST_REQUIRE_MESSAGE( theClient.forceDependencyEval() == 0,"--force-dep-eval failed should return 0\n" << theClient.errorMsg());
+
+      BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      node_ptr node = serverDefs->findAbsNode(suite1_family1_b);
+      BOOST_REQUIRE_MESSAGE( node->state() == NState::ACTIVE,  "Expected NState::ACTIVE, but found " << NState::toString(node->state()));
+   }
+
+   //********************************************************************************
+   // Complete the remaining tasks. Should really call init first, but what the eck.
+   {
+      theClient.taskPath(suite1_family1_b);
+      BOOST_REQUIRE_MESSAGE(theClient.completeTask() == 0,TaskApi::complete() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.forceDependencyEval() == 0,CtsApi::forceDependencyEval() << " failed should return 0\n" << theClient.errorMsg());
+
+      theClient.taskPath(suite1_family2_aa);
+      BOOST_REQUIRE_MESSAGE(theClient.completeTask() == 0,TaskApi::complete() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.forceDependencyEval() == 0,CtsApi::forceDependencyEval() << " failed should return 0\n" << theClient.errorMsg());
+
+      theClient.taskPath(suite1_family2_bb);
+      BOOST_REQUIRE_MESSAGE(theClient.completeTask() == 0,TaskApi::complete() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.forceDependencyEval() == 0,CtsApi::forceDependencyEval() << " failed should return 0\n" << theClient.errorMsg());
+   }
+
+   {
+      // Get the node tree back from the server, and check its node state
+      // All node state should be complete. + check meter/event value was set properly
+      BOOST_REQUIRE_MESSAGE(theClient.getDefs() == 0,CtsApi::get() << " failed should return 0\n" << theClient.errorMsg());
+
+      defs_ptr serverDefs =  theClient.defs();
+      BOOST_REQUIRE_MESSAGE( serverDefs.get(),"get command failed to get node tree from server");
+
+      std::string metername = "myMeter";
+      int meterValue = 100;
+      node_ptr node = serverDefs->findAbsNode(suite1_family1_a);
+      const Meter& theMeter = node->findMeter(metername);
+      BOOST_REQUIRE_MESSAGE( !theMeter.empty(), "Could not find the meter");
+      BOOST_REQUIRE_MESSAGE( theMeter.value() == meterValue , "Expected meter value " << meterValue << " but found " << theMeter.value());
+      {
+         std::string errorMsg; BOOST_REQUIRE_MESSAGE( serverDefs->checkInvariants(errorMsg), errorMsg);
+      }
+
+      std::string eventname = "myEvent";
+      const Event& theEvent = node->findEventByNameOrNumber(eventname);
+      BOOST_REQUIRE_MESSAGE( !theEvent.empty(), "Could not find the event myEvent");
+      BOOST_REQUIRE_MESSAGE( theEvent.value(), "The event was not set");
+
+      const std::vector<suite_ptr>& suiteVec = serverDefs->suiteVec();
+      suite_ptr suite = suiteVec.back();
+      BOOST_REQUIRE_MESSAGE( suite->state() == NState::COMPLETE,
+               "Suite expected NState::COMPLETE, but found to be " << NState::toString(suite->state()));
+   }
+
+   {
+      // Check that a log file was created, by asking the server for it.
+      BOOST_REQUIRE_MESSAGE( theClient.getLog() == 0, "get log failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(!theClient.get_string().empty(),"The log file returned from the server is empty!!");
+
+      // Clear the log
+      BOOST_REQUIRE_MESSAGE(theClient.flushLog() == 0,CtsApi::flushLog() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.clearLog() == 0,CtsApi::clearLog() << " failed should return 0\n" << theClient.errorMsg());
+      BOOST_REQUIRE_MESSAGE(theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+   }
+
+   /// Destroy singleton's to avoid valgrind from complaining
+   System::destroy();
+   ChangeMgrSingleton::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestSignalSIGTERM.cpp b/ecflow_4_0_7/Client/test/TestSignalSIGTERM.cpp
new file mode 100644
index 0000000..aa67be9
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestSignalSIGTERM.cpp
@@ -0,0 +1,82 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "Str.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// ************************************************************************************
+// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+//
+// This test will send a signal SIGTERM, i.e (via kill -15 pid) and check to ensure
+// that a check point file is saved.
+// ************************************************************************************
+BOOST_AUTO_TEST_CASE( test_signal_SIGTERM )
+{
+   // This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+   InvokeServer invokeServer("Client:: ...test_signal_SIGTERM",SCPort::next());
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE( theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0 server not started, or connection refused\n" << theClient.errorMsg());
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+   BOOST_REQUIRE_MESSAGE(theClient.loadDefs(path) == 0,"load defs failed \n" << theClient.errorMsg());
+
+   // Get the definition
+   BOOST_REQUIRE_MESSAGE(theClient.sync_local() == 0, "Sync local failed\n" << theClient.errorMsg());
+
+   // Get the process id of the server
+   const std::string& ecf_pid = theClient.defs()->server().find_variable("ECF_PID");
+   BOOST_REQUIRE_MESSAGE(!ecf_pid.empty(),"ECF_PID not set in the server");
+
+   // Send a SIGTERM to the server and ensure that a check point file is created
+   std::string sigterm = "kill -15 " + ecf_pid ;
+   system(sigterm.c_str());
+   sleep(2); // allow time for system call
+
+   // We expect a check point file to be save to disk, but *no* backup
+   BOOST_REQUIRE_MESSAGE(fs::exists(invokeServer.ecf_checkpt_file()),CtsApi::checkPtDefs() << " failed file(" << invokeServer.ecf_checkpt_file() << ") not saved");
+   BOOST_REQUIRE_MESSAGE(fs::file_size(invokeServer.ecf_checkpt_file()) !=0,"Expected check point file(" << invokeServer.ecf_checkpt_file() << "), to have file size > 0");
+   if (ClientEnvironment::hostSpecified().empty()) {
+      // This check only valid if server was invoked locally. Ignore for remote servers
+      BOOST_REQUIRE_MESSAGE(!fs::exists(invokeServer.ecf_backup_checkpt_file()), "Backup check point file(" << invokeServer.ecf_backup_checkpt_file() << ")should not exist,for very first time.");
+   }
+
+   // Send a SIGTERM again. This time we expect the backup check point file to be created.
+   system(sigterm.c_str());
+   sleep(2); // allow time for system call
+
+   BOOST_REQUIRE_MESSAGE(fs::exists(invokeServer.ecf_checkpt_file()),CtsApi::checkPtDefs() << " failed No check pt file(" << invokeServer.ecf_checkpt_file() << ") saved");
+   BOOST_REQUIRE_MESSAGE(fs::file_size(invokeServer.ecf_checkpt_file()) !=0,"Expected check point file(" << invokeServer.ecf_checkpt_file() << ") to have file size > 0  ");
+   BOOST_REQUIRE_MESSAGE(fs::exists(invokeServer.ecf_backup_checkpt_file()), "Expected backup check point file(" << invokeServer.ecf_backup_checkpt_file() << ") to be created");
+   BOOST_REQUIRE_MESSAGE(fs::file_size(invokeServer.ecf_backup_checkpt_file()) !=0,"Expected backup check point file(" << invokeServer.ecf_backup_checkpt_file() << "), to have file size > 0");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/TestSinglePerf.cpp b/ecflow_4_0_7/Client/test/TestSinglePerf.cpp
new file mode 100644
index 0000000..6fad523
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestSinglePerf.cpp
@@ -0,0 +1,211 @@
+#define BOOST_TEST_MODULE TestSingle
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <fstream>
+
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/timer.hpp>
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "File.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "TestHelper.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "Str.hpp"
+#include "Host.hpp"
+#include "Rtt.hpp"
+#include "DurationTimer.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// ************************************************************************************
+// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+// ************************************************************************************
+
+static void sync_and_news_local(ClientInvoker& theClient)
+{
+   {
+      cout << "   news_local() : ";
+      DurationTimer duration_timer;
+      theClient.news_local();
+      cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+   }
+   {
+      cout << "   sync_local() : ";
+      DurationTimer duration_timer;
+      theClient.sync_local();
+      cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000 << endl;
+   }
+}
+
+void time_load_and_downloads(
+         ClientInvoker& theClient,
+         const std::string& host,
+         const std::string& port,
+         const std::string& directory
+)
+{
+   fs::path full_path( fs::initial_path<fs::path>() );
+   full_path = fs::system_complete( fs::path( directory ) );
+
+   BOOST_CHECK(fs::exists( full_path ));
+   BOOST_CHECK(fs::is_directory( full_path ));
+
+   int count = 10;
+
+   //std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
+   fs::directory_iterator end_iter;
+   for ( fs::directory_iterator dir_itr( full_path ); dir_itr != end_iter; ++dir_itr )
+   {
+      try
+      {
+         fs::path relPath(directory + "/" + dir_itr->path().filename().string());
+
+         // recurse down directories
+         if ( is_directory(dir_itr->status()) )  {
+            time_load_and_downloads(theClient,host,port,relPath.string());
+            continue;
+         }
+
+         cout << "\n" << relPath.string() << "  : file size " << fs::file_size(relPath) << endl;
+         {
+            DurationTimer duration_timer;
+            BOOST_REQUIRE_MESSAGE(theClient.loadDefs(relPath.string()) == 0,"load defs failed \n" << theClient.errorMsg());
+            cout << " Load:                " << duration_timer.elapsed().total_milliseconds() << "ms" << endl;
+         }
+         {
+            DurationTimer duration_timer;
+            BOOST_REQUIRE_MESSAGE(theClient.begin_all_suites() == 0,"begin failed \n" << theClient.errorMsg());
+            cout << " Begin:               " << duration_timer.elapsed().total_milliseconds() << "ms" << endl;
+         }
+         {
+            cout << " Download(Sync):      ";
+            for(int i = 0; i < count; i++) {
+               DurationTimer duration_timer;
+               theClient.sync_local();
+               int seconds = duration_timer.elapsed().total_milliseconds();
+               cout << seconds << " ";
+            }
+            cout << ":(milli-seconds) sync_local() with the same Client. First call updates cache." << endl;
+         }
+         {
+            // On construction of Defs, hence should be slightly faster
+            cout << " Download(Sync-FULL): ";
+            double total = 0;
+            for(int i = 0; i < count; i++) {
+               ClientInvoker client(host,port);
+               DurationTimer duration_timer;
+               client.sync_local();
+               int seconds = duration_timer.elapsed().total_milliseconds();
+               cout << seconds << " ";
+               total += seconds;
+            }
+            cout << ": Avg:" << (double)(total)/((double)count*1000) << "(sec)  : sync_local() with *different* clients. Uses Cache" << endl;
+         }
+         {
+            // This should more expensive on second call, due to destruction of
+            // defs(on theClient) from previous calls
+            cout << " Download(FULL):      ";
+            double total = 0;
+            for(int i = 0; i < count; i++) {
+               DurationTimer duration_timer;
+               theClient.getDefs();
+               int seconds = duration_timer.elapsed().total_milliseconds();
+               cout << seconds << " ";
+               total += seconds;
+            }
+            cout << ": Avg:" << (double)(total)/((double)count*1000) << "(sec)  : get_defs() from same client" << endl;
+         }
+         {
+            std::vector<task_ptr> all_tasks;
+            theClient.defs()->get_all_tasks(all_tasks);
+            std::vector<std::string> paths;paths.reserve(all_tasks.size());
+            for(size_t i = 0; i < all_tasks.size(); i++) {
+               paths.push_back(all_tasks[i]->absNodePath());
+               if (i == 6000) break;  //  > 9000 really slows down, could be logging ??
+            }
+            {
+               cout << " Suspend " << paths.size() << " tasks : ";
+               DurationTimer duration_timer;
+               theClient.suspend(paths);
+               cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+            }
+            sync_and_news_local(theClient);
+            {
+               cout << " Resume " << paths.size() << " tasks  : ";
+               DurationTimer duration_timer;
+               theClient.resume(paths);
+               cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+            }
+            sync_and_news_local(theClient);
+            {
+               cout << " force  " << paths.size() << " tasks  : ";
+               DurationTimer duration_timer;
+               theClient.force(paths,"complete");
+               cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+            }
+            sync_and_news_local(theClient);
+         }
+         {
+            // This should more expensive on second call, due to destruction of
+            // defs(on theClient) from previous calls
+            cout << " Check pt:            ";
+            double total = 0;
+            for(int i = 0; i < count; i++) {
+               DurationTimer duration_timer;
+               theClient.checkPtDefs();
+               int seconds = duration_timer.elapsed().total_milliseconds();
+               cout << seconds << " ";
+               total += seconds;
+            }
+            cout << ": Avg:" << (double)(total)/((double)count*1000) << "ms" << endl;
+         }
+         {
+            DurationTimer duration_timer;
+            BOOST_REQUIRE_MESSAGE(theClient.delete_all(true)  == 0,"delete all defs failed \n" << theClient.errorMsg());
+            cout << " Delete:              " << duration_timer.elapsed().total_milliseconds() << "ms" << endl;
+         }
+      }
+      catch ( const std::exception & ex ) {
+         std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
+      }
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_perf_for_large_defs )
+{
+   if (fs::exists("/var/tmp/ma0/BIG_DEFS")) {
+      /// This will remove checkpt and backup , to avoid server from loading it. (i.e from previous test)
+      InvokeServer invokeServer("Client:: ...test_perf_for_large_defs:",SCPort::next());
+
+      ClientInvoker theClient(invokeServer.host(), invokeServer.port());
+      time_load_and_downloads(theClient,invokeServer.host(), invokeServer.port(),"/var/tmp/ma0/BIG_DEFS");
+   }
+   else {
+      std::cout << "Ingoring test, since directory /var/tmp/ma0/BIG_DEFS does not exist";
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Client/test/TestUrlCmd.cpp b/ecflow_4_0_7/Client/test/TestUrlCmd.cpp
new file mode 100644
index 0000000..aa6fd47
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestUrlCmd.cpp
@@ -0,0 +1,65 @@
+//============================================================================
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include "DefsStructureParser.hpp"
+#include "Defs.hpp"
+#include "UrlCmd.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+//=============================================================================
+// This will test the UrlCmd.
+BOOST_AUTO_TEST_CASE( test_url_cmd )
+{
+	cout << "Client:: ...test_url_cmd" << endl;
+
+   std::string path = File::test_data("Client/test/data/lifecycle.txt","Client");
+
+	defs_ptr defs = Defs::create();
+
+ 	DefsStructureParser checkPtParser( defs.get(), path );
+	std::string errorMsg,warningMsg;
+	bool parse = checkPtParser.doParse(errorMsg,warningMsg);
+ 	BOOST_CHECK_MESSAGE(parse,errorMsg);
+
+ 	// Check error conditions
+ 	BOOST_REQUIRE_THROW(UrlCmd(defs,"a made up name"), std::runtime_error );
+ 	BOOST_REQUIRE_THROW(UrlCmd(defs_ptr(),"/suite1/family1/a"), std::runtime_error );
+
+ 	// The Url command relies on variable substitution, hence we must ensure that
+ 	// generated variables are created.
+ 	defs->beginAll();
+
+	UrlCmd urlCmd(defs,"/suite1/family1/a");
+	std::string expected = "${BROWSER:=firefox} -remote 'openURL(http://www.ecmwf.int/publications/manuals/sms)'";
+	std::string actual = urlCmd.getUrl();
+	BOOST_CHECK_MESSAGE( expected == actual,"Expected '" << expected << "' but found " << actual);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+
diff --git a/ecflow_4_0_7/Client/test/TestWhiteListFile.cpp b/ecflow_4_0_7/Client/test/TestWhiteListFile.cpp
new file mode 100644
index 0000000..2ed7e11
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/TestWhiteListFile.cpp
@@ -0,0 +1,88 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <boost/test/unit_test.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+
+#include "ClientInvoker.hpp"
+#include "ClientEnvironment.hpp"
+#include "WhiteListFile.hpp"
+#include "InvokeServer.hpp"
+#include "SCPort.hpp"
+#include "Str.hpp"
+
+namespace fs = boost::filesystem;
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( ClientTestSuite )
+
+// ************************************************************************************
+// Note: If you make edits to node tree, they will have no effect until the server is rebuilt
+//
+// Note: To test HPUX->Linux, invoke serve on (Linux/HPUX) and the client cmds on other system
+//       On the client side set ECF_NODE to machine name. To allow further testing if ECF_NODE
+//       is specified then *don't* shutdown the server
+// ************************************************************************************
+
+BOOST_AUTO_TEST_CASE( test_loading_of_white_list_file )
+{
+   Host the_host;
+   std::string port = SCPort::next();
+   std::string host = ClientEnvironment::hostSpecified();
+   if (host.empty()) {
+
+      // make sure NO whitelist file is present before the server is started.
+      // This allows any user to send requests to the server
+      // Only do this locally, as white list file on remote machine may not be accessible
+      fs::remove(the_host.ecf_lists_file(port));
+   }
+
+   // This will remove check pt and backup file before server start, to avoid the server from loading previous test data
+   InvokeServer invokeServer("Client:: ...test_loading_of_white_list_file",port);
+
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE( theClient.delete_all() == 0,CtsApi::to_string(CtsApi::delete_node()) << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.shutdownServer() == 0,CtsApi::shutdownServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.haltServer() == 0,CtsApi::haltServer() << " should return 0\n" << theClient.errorMsg());
+   BOOST_REQUIRE_MESSAGE( theClient.restartServer() == 0,CtsApi::restartServer() << " should return 0\n" << theClient.errorMsg());
+
+   // OK now test white list file functionality, but only if server was invoked locally
+   if ( host.empty() ) {
+
+      // The white list file should not exist, hence reload white list SHOULD fail.
+      // i.e because we deleted it earlier
+      BOOST_REQUIRE_THROW( theClient.reloadwsfile(), std::runtime_error);
+
+      // Create a valid white list file; For the FIRST time:
+      // **** IMPORTANT: if we had reloaded a white list file where the user has read access
+      // **************: _FIRST_ it will not be possible reload white file with write access, afterwards
+      // **************: since subsequent RELOAD command itself will require write access
+      std::string errorMsg;
+      BOOST_REQUIRE_MESSAGE(WhiteListFile::createWithWriteAccess(the_host.ecf_lists_file(port),errorMsg),errorMsg);
+
+      //  Reload should pass, as its the _first_ time
+      BOOST_REQUIRE_MESSAGE( theClient.reloadwsfile() == 0, CtsApi::reloadwsfile() << " should return 0\n" << theClient.errorMsg());
+
+      // Invoking a client request that requires write access, should pass
+      BOOST_CHECK_MESSAGE( theClient.shutdownServer() == 0,"should return 0\n" << theClient.errorMsg());
+
+      // Remove the white list file. Comment out for debug
+      fs::remove(the_host.ecf_lists_file(port));
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Client/test/data/ECF_HOME/includes/head.h b/ecflow_4_0_7/Client/test/data/ECF_HOME/includes/head.h
new file mode 100644
index 0000000..fece220
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/ECF_HOME/includes/head.h
@@ -0,0 +1,43 @@
+#!/bin/ksh
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the three variables that are needed for any
+# communication with ECF_
+
+export ECF_PORT=%ECF_PORT%  # ECF_ Remote Procedure Call number
+export ECF_NODE=%ECF_NODE%    # The name sms that issued this task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of smsinit
+# Here we give the current PID.
+
+smsinit $$
+
+# Defined a error hanlder
+
+ERROR() {
+   # wait for background process to stop.
+   # If we did not have background jobs, closly called foreround jobs
+   # may arrive out of order at the server, causing unnecessary zombies
+   # The wait should prevent this.
+
+	set +e        # Clear -e flag, so we don't fail
+	wait          # wait for background process to stop
+   smsabort      # Notify ECF_ that something went wrong
+	trap 0        # Remove the trap
+	exit 0        # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
diff --git a/ecflow_4_0_7/Client/test/data/ECF_HOME/includes/tail.h b/ecflow_4_0_7/Client/test/data/ECF_HOME/includes/tail.h
new file mode 100644
index 0000000..066fcc6
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/ECF_HOME/includes/tail.h
@@ -0,0 +1,9 @@
+# wait for background process to stop.
+# If we did not have background jobs, closly called foreround jobs
+# may arrive out of order at the server, causing unnecessary zombies
+# The wait should prevent this.
+
+wait         # wait for background process to stop
+smscomplete  # Notify ECF of a normal end
+trap 0       # Remove all traps
+exit 0       # End the shell
diff --git a/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/head.h b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/head.h
new file mode 100644
index 0000000..1848925
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/head.h
@@ -0,0 +1,37 @@
+#!/bin/ksh
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the three variables that are needed for any
+# communication with ECF_
+
+export ECF_PORT=%ECF_PORT%  # ECF_ Remote Procedure Call number
+export ECF_NODE=%ECF_NODE%    # The name sms that issued this task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of smsinit
+# Here we give the current PID.
+
+smsinit $$
+
+# Defined a error hanlder
+
+ERROR() {
+	set +e        # Clear -e flag, so we don't fail
+	smsabort      # Notify ECF_ that something went wrong
+	trap 0        # Remove the trap
+	exit 0        # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
diff --git a/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t1.ecf b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t1.ecf
new file mode 100755
index 0000000..8aa16e7
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t1.ecf
@@ -0,0 +1,72 @@
+%manual
+	OPERATORS: This is an example of using a manual
+	
+	This is used to also test variable subsitution of 
+	generated variables
+	SUITE     = %SUITE%
+	DATE      = %DATE%
+	DAY       = %DAY%
+	DD        = %DD%
+	DOW       = %DOW%
+	DOY       = %DOY%
+	MM        = %MM%
+	MONTH     = %MONTH%
+	YYYY      = %YYYY%
+	ECF_DATE   = %ECF_DATE%
+	ECF_TIME   = %ECF_TIME%
+	ECF_CLOCK  = %ECF_CLOCK%
+
+	FAMILY    = %FAMILY%
+	FAMILY1   = %FAMILY1%
+
+	TASK      = %TASK%
+	ECF_RID    = %ECF_RID:<not defined yet, since empty string in task>%
+	ECF_TRYNO  = %ECF_TRYNO%
+	ECF_NAME   = %ECF_NAME%
+	ECF_PASS   = %ECF_PASS%
+	ECF_SCRIPT = %ECF_SCRIPT%
+	ECF_JOB    = %ECF_JOB%
+	ECF_JOBOUT = %ECF_JOBOUT%
+    
+    Other ECF_ variables
+	ECF_KILL_CMD  = %ECF_KILL_CMD:<not defined yet>%
+	ECF_JOB_CMD   = %ECF_JOB_CMD%
+	ECF_HOME      = %ECF_HOME%
+	ECF_TRIES     = %ECF_TRIES:<Error>%
+	SMFILES      = %SMFILES:<not defined yet>%
+	ECF_INCLUDE   = %ECF_INCLUDE:<not defined yet>%
+	ECF_FETCH     = %ECF_FETCH:<not defined yet>%
+	ECF_OUT       = %ECF_OUT:<not defined yet>%
+	ECF_MICRO     = %ECF_MICRO%
+%end
+
+#============================================================
+# Using angle brackets should use ECF_INCLUDE
+#=========================================================
+%include <head.h>
+
+
+echo do some work
+# SLEEPTIME is defined thedefs.def file. Test variable substituition
+sleep %SLEEPTIME%
+echo end of job
+
+# test smsevent. smsmeter replaced with path to client exe
+smsevent  eventname
+smsmeter  metername 10
+
+%include <tail.h>
+
+
+%manual
+	Rest of the manual page is placed here, closer to the code
+%end
+%comment
+  Comment start
+%end
+%comment
+  Comment end
+%end
+%nopp
+  ignore everything in here
+%end
diff --git a/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t2.ecf b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t2.ecf
new file mode 100644
index 0000000..3676b4d
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t2.ecf
@@ -0,0 +1,19 @@
+ 
+# using %include "filename"
+# include the contents of the file %ECF_HOME%/%SUITE%/%FAMILY%/filename
+#
+# since we are using quotes we expect to find 'head.h' and 'tail.h'
+# in the same directory as the sms files.
+#======================================================================
+%include "head.h"
+
+
+echo do some work
+# SLEEPTIME is defined thedefs.def file. Test variable substituition
+sleep 10
+echo end of job
+
+
+%include "tail.h"
+
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t3.ecf b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t3.ecf
new file mode 100755
index 0000000..bccc9bc
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/t3.ecf
@@ -0,0 +1,39 @@
+# using %include "filename"
+# include the contents of the file %ECF_HOME%/%SUITE%/%FAMILY%/filename
+#
+# since we are using quotes we expect to find 'head.h' and 'tail.h'
+# in the same directory as the sms files.
+#======================================================================
+%include "head.h"
+
+
+echo do some work
+sleep 10
+echo end of job
+
+#=====================================================
+# change the ecfmicro character
+%ecfmicro &
+
+&manual
+	START Rest of the manual page is placed here, closer to the code
+&end
+&comment
+  Comment start
+  &SUITE&
+&end
+&comment
+  Comment end
+&end
+&nopp
+  ignore everything in here
+&end
+&manual
+	END of the manual
+&end
+#=====================================================
+# change the ecfmicro character back
+&ecfmicro %
+
+
+%include "tail.h"
diff --git a/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/tail.h b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/tail.h
new file mode 100644
index 0000000..22b0e0f
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/ECF_HOME/suite/family/tail.h
@@ -0,0 +1,3 @@
+smscomplete  # Notify ECF of a normal end
+trap 0       # Remove all traps
+exit 0       # End the shell
diff --git a/ecflow_4_0_7/Client/test/data/bad.def b/ecflow_4_0_7/Client/test/data/bad.def
new file mode 100644
index 0000000..616c600
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/bad.def
@@ -0,0 +1,5 @@
+suite suite1
+   task dodgy
+      trigger a non sensical trigger and that should fail to parse 
+endsuite
+
diff --git a/ecflow_4_0_7/Client/test/data/first.def b/ecflow_4_0_7/Client/test/data/first.def
new file mode 100644
index 0000000..4552c01
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/first.def
@@ -0,0 +1,20 @@
+#
+# This defines extern which are defined in second.def
+#
+extern /a/b/c/d         
+extern /a/b/c/d/e:event        
+extern /a/b/c/d/e:meter       
+
+extern /a/b/c/d/e/f/g/h/j     # this does not exist in second.def
+
+suite suiteName
+   family familyName
+   		task p
+   			trigger /a/b/c/d == complete  		                                   # extern path
+  		task q
+   			trigger /a/b/c/d/e:event == set  		                               # extern event path
+ 		task r
+   			trigger /a/b/c/d/e:meter le 30		                                   # extern meter path	
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/Client/test/data/good_hostfile b/ecflow_4_0_7/Client/test/data/good_hostfile
new file mode 100644
index 0000000..511e0ab
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/good_hostfile
@@ -0,0 +1,13 @@
+
+host1:3142    # some description of the port
+host2:3141    # another description
+
+host3
+
+host4:4001
+
+host5
+host6:4081
+
+# a comment
+#a comment
\ No newline at end of file
diff --git a/ecflow_4_0_7/Client/test/data/jobgenonly.def b/ecflow_4_0_7/Client/test/data/jobgenonly.def
new file mode 100644
index 0000000..e59e7e7
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/jobgenonly.def
@@ -0,0 +1,15 @@
+#
+# We can define a variable ECF_HOME as want to use relative paths
+# i.e since the test must be relocatble to other platforms
+#
+suite suite
+	edit SLEEPTIME 10
+	edit ECF_INCLUDE $ECF_HOME/includes
+	family family
+	   task t1
+	   	event eventname
+	   	meter metername 0 100 100
+	   task t2
+	   task t3
+	endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/Client/test/data/lifecycle.txt b/ecflow_4_0_7/Client/test/data/lifecycle.txt
new file mode 100644
index 0000000..1dc39fb
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/lifecycle.txt
@@ -0,0 +1,19 @@
+suite suite1
+  edit ECF_URL_CMD  "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'"
+  edit ECF_URL_BASE "http://www.ecmwf.int"
+  edit ECF_URL      "publications/manuals/sms"
+  family family1
+   	task a
+        event 1 myEvent
+        meter myMeter 0 100
+   	task b
+   		trigger a == complete
+   endfamily
+   family family2
+   		task aa
+   			trigger ../family1/a:myMeter >= 20 and ../family1/a:myEvent 
+   		task bb
+   			trigger ../family1/a:myMeter >= 50  or  ../family1/a:myEvent
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/Client/test/data/second.def b/ecflow_4_0_7/Client/test/data/second.def
new file mode 100644
index 0000000..e135d35
--- /dev/null
+++ b/ecflow_4_0_7/Client/test/data/second.def
@@ -0,0 +1,17 @@
+ 
+#
+# The defs is used conjunction with first.def to test resolution of externs
+#
+
+suite a
+   family b
+   		family c
+   			family d
+   				task e
+   					event event
+           	    	meter meter  0 100 100  # meter <name> <min> <max> [optional color change]
+           	endfamily
+    	endfamily
+    endfamily
+endsuite
+
diff --git a/ecflow_4_0_7/Doc/user-manual/client_options.docx b/ecflow_4_0_7/Doc/user-manual/client_options.docx
new file mode 100644
index 0000000..4f90bc8
Binary files /dev/null and b/ecflow_4_0_7/Doc/user-manual/client_options.docx differ
diff --git a/ecflow_4_0_7/Doc/user-manual/user_manual.docx b/ecflow_4_0_7/Doc/user-manual/user_manual.docx
new file mode 100644
index 0000000..f30dccc
Binary files /dev/null and b/ecflow_4_0_7/Doc/user-manual/user_manual.docx differ
diff --git a/ecflow_4_0_7/Doc/user-manual/user_manual.pdf b/ecflow_4_0_7/Doc/user-manual/user_manual.pdf
new file mode 100644
index 0000000..5108b94
Binary files /dev/null and b/ecflow_4_0_7/Doc/user-manual/user_manual.pdf differ
diff --git a/ecflow_4_0_7/Jamroot.jam b/ecflow_4_0_7/Jamroot.jam
new file mode 100644
index 0000000..b5e658e
--- /dev/null
+++ b/ecflow_4_0_7/Jamroot.jam
@@ -0,0 +1,187 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# To clean all the sub projects just use: bjam --clean
+#
+path-constant TOP : . ;     # After that, the TOP variable can be used in every Jamfile. 
+
+build-project ACore ;
+build-project ANattr ;
+build-project ANode ;
+build-project AParser ;
+build-project Base ;
+build-project Client ;
+build-project CSim ;
+build-project Server ;
+build-project Test ;
+
+# The gui is not built on HPUX and IBM(power6) platforms
+import os ;
+ARCH = [ os.environ ARCH ] ;
+ARCH default = UNDEF ;  # if arch not defined set as UNDEF, otherwise if $(ARCH) will be true
+build_gui = linux cray other_gui_arch ;
+# echo "ARCH =  $(ARCH)" ;
+if $(ARCH) in $(build_gui) {
+   build-project view ;
+}
+
+# Some user do no want python: They must define ECF_NO_PYTHON
+NO_PYTHON = [ os.environ ECF_NO_PYTHON ] ;
+#echo "NO_PYTHON =  $(NO_PYTHON)" ;
+if ! $(NO_PYTHON) { 
+   # echo "building python" ; 
+   build-project Pyext ; 
+}
+ 
+# ==================== INSTALL ==========================================================
+
+local dest_dir = [ os.environ ECFLOW_DESTDIR ] ;
+dest_dir default = "" ;
+constant ECFLOW_DESTDIR : $(dest_dir) ;
+
+local ECFLOW_VERSION = [ SHELL "cd $(TOP); ./version.sh" ] ;
+local install_dir = [ os.environ ECFLOW_INSTALL_DIR ] ;
+install_dir default = "/usr/local/apps/ecflow/$(ECFLOW_VERSION)" ; 
+constant ECFLOW_INSTALL_DIR : $(install_dir) ;
+
+local python_install_dir = [ os.environ ECFLOW_PYTHON_INSTALL_DIR ] ;
+python_install_dir default = $(install_dir)/lib/python2.7/site-packages/ecflow ; 
+constant ECFLOW_PYTHON_INSTALL_DIR : $(python_install_dir) ;
+
+# Used for ecflowview files
+constant ECFLOW_SHARED_DIR : $(ECFLOW_DESTDIR)$(ECFLOW_INSTALL_DIR)/share/ecflow ;
+
+#echo "ECFLOW_VERSION            = '$(ECFLOW_VERSION)'" ;
+#echo "ECFLOW_DESTDIR            = '$(ECFLOW_DESTDIR)'" ;
+#echo "ECFLOW_INSTALL_DIR        = '$(ECFLOW_INSTALL_DIR)'" ;
+#echo "ECFLOW_PYTHON_INSTALL_DIR = '$(ECFLOW_PYTHON_INSTALL_DIR)'" ;
+#echo  "ECFLOW_SHARED_DIR        = '$(ECFLOW_SHARED_DIR)'" ;
+
+#
+# Allow the installation directory be be defined externally, by the environment variable ECFLOW_INSTALL_DIR
+#
+# However we want this to be explicit, as we dont need it on a day to day basis. 
+# Usage:
+#	bjam install variant=release
+#
+# to install the debug version
+# 	bjam install | bjam install variant=debug
+#
+# To preview the installation witout actaully doing it:
+#  	bjam install variant=release -d2 -n
+#
+# Note: if you find that the install has started to create directories
+#       of name install-server,install-client,,install-py
+#       Then *ensure* you have set the environment variables ECFLOW_INSTALL_DIR, 
+#
+# Note: Not all system have XLib, hence install ecFlowview manually by using:
+#      bjam -d2 install-viewer
+#
+# Make sure for ECMWF that ECFLOW_INSTALL_DIR leaf directory encompasses version number
+# that ties up with $WK/VERSION.cmake
+#
+ 
+# Do no call this on the command line, prefer bjam install-all || install-viewer
+# If this is called in isolation ldd will show the referenced shared lib as missing
+install install-view
+	: view//ecflowview
+	: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
+	  <dll-path>$(ECFLOW_INSTALL_DIR)/lib
+	;
+
+
+# Some linux RPM have requirements that 64 bit libs must be under lib64
+# See http://software.ecmwf.int/issues/browse/ECFLOW-30, 64-bit Linux platforms expect libraries to go to the $PREFIX/lib64 directory, not $PREFIX/lib
+#
+install install-view64
+	: view//ecflowview
+	: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
+	  <dll-path>$(ECFLOW_INSTALL_DIR)/lib64
+	;	
+
+install install-view-files
+    : [ glob view/servers ]
+      [ glob view/src/ecflowview.menu ]
+    : <location>$(ECFLOW_SHARED_DIR)
+    ;
+    
+install install-server
+	: Server//ecflow_server 
+	: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
+	;
+
+install install-client
+	: Client//ecflow_client
+	: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
+	;
+
+install install-tools
+	: [ glob tools/*.sh ]
+      [ glob tools/*.pl ]
+	: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
+	;
+
+install install-doc
+        : [ glob Doc/user-manual/*.docx ] 
+          [ glob Doc/user-manual/*.pdf ] 
+	: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/doc/ecflow
+	;
+ 
+# Fix bugs associated with the output of old version of ecflow_client --migrate
+install install-migrate
+	: [ glob Pyext/migrate/ecflow_migrate.py ]
+	: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
+	;
+
+# ===============================================================================================
+
+# Use this for a non-python install
+alias install-base :
+	install-server 
+	install-client 
+	install-tools 
+	install-doc
+   install-migrate
+	;
+alias install : 
+	install-base
+	Pyext//install-py 
+ 	Pyext//install-py1
+	;
+alias install-viewer :
+	install-view
+	install-view-files
+	;
+alias install-viewer64 :
+	install-view64
+   install-view-files
+ 	;
+alias install-all :
+	install
+   install-viewer
+   ;
+alias install-all64 :
+	install
+   install-viewer64
+   ;
+
+# make install explicit, otherwise we end installing for all calls to bjam
+explicit install-server ;
+explicit install-client ;
+explicit install-tools ;
+explicit install-view ;
+explicit install-viewer ;
+explicit install-view64 ;
+explicit install-viewer64 ;
+explicit install-view-files ;
+explicit install-doc ;
+explicit install-migrate ;
+explicit install ;
+explicit install-base ;
+explicit install-all ;
+explicit install-all64 ;
diff --git a/ecflow_4_0_7/LICENSE b/ecflow_4_0_7/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/ecflow_4_0_7/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/ecflow_4_0_7/Makefile b/ecflow_4_0_7/Makefile
new file mode 100644
index 0000000..db1d031
--- /dev/null
+++ b/ecflow_4_0_7/Makefile
@@ -0,0 +1,9 @@
+# This is used as part of install build/install for cmake/ecbuild
+
+default: release
+
+release:
+	(cd ../cmake_build_dir/ecflow/release; make -j4)
+	
+install:
+	(cd ../cmake_build_dir/ecflow/release; make install)
diff --git a/ecflow_4_0_7/Makefile.old b/ecflow_4_0_7/Makefile.old
new file mode 100644
index 0000000..f1a3316
--- /dev/null
+++ b/ecflow_4_0_7/Makefile.old
@@ -0,0 +1,24 @@
+BJAM=$(BOOST_ROOT)/bjam c++-template-depth=512
+
+all:  ecf view
+
+ecf:
+	echo . ./view/tool/env.sh 
+	$(BJAM) -j4
+rel:
+	$(BJAM) -j4 variant=release
+
+view:
+	(cd view; $(BJAM) -j4)
+
+clean:
+	$(BJAM) clean;
+	(cd view; $(BJAM) clean)
+
+realclean:
+	rm -rf */bin Pyext/ecflow/ecflow.so
+
+tar:
+	cd ../..; tar -cjvf $SCRATCH/ecf.tbz workspace
+
+
diff --git a/ecflow_4_0_7/NOTICE b/ecflow_4_0_7/NOTICE
new file mode 100644
index 0000000..16e734d
--- /dev/null
+++ b/ecflow_4_0_7/NOTICE
@@ -0,0 +1,56 @@
+Apache [ecflow]
+      Copyright [2009-2012] The Apache Software Foundation
+
+      This product includes software developed at
+      The Apache Software Foundation (http://www.apache.org/).
+
+
+
+Boost Software License - Version 1.0 - August 17th, 2003
+========================================================
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE. 
+
+
+
+The MIT License (MIT) - EOS-Portable-library
+============================================
+Copyright (c) 2012 EOS GmbH
+
+Permission is hereby granted, free of charge, to any person obtaining a copy 
+of this software and associated documentation files (the "Software"), 
+to deal in the Software without restriction, including without limitation 
+the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+and/or sell copies of the Software, and to permit persons to whom the 
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included 
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/ecflow_4_0_7/Pyext/.gitignore b/ecflow_4_0_7/Pyext/.gitignore
new file mode 100644
index 0000000..7558d28
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/.gitignore
@@ -0,0 +1,2 @@
+/build
+/setup.py
diff --git a/ecflow_4_0_7/Pyext/CMakeLists.txt b/ecflow_4_0_7/Pyext/CMakeLists.txt
new file mode 100644
index 0000000..f96babd
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/CMakeLists.txt
@@ -0,0 +1,143 @@
+### ecflow python bindings
+
+file( GLOB srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp" "src/*.hpp" )
+
+# local includes
+include_directories(  
+                     ../ACore/src 
+                     ../ANattr/src
+                     ../ANode/src
+                     ../AParser/src
+                     ../Base/src
+                     ../Base/src/cts
+                     ../Base/src/stc
+                     ../Client/src
+                     ../CSim/src
+                    )
+      
+# INCLUDES here is for external includes           
+ecbuild_add_library( TARGET    ecflow
+                     TYPE      MODULE
+                     SOURCES   ${srcs}
+					 CONDITION PYTHONLIBS_FOUND
+                     LIBS      libclient libsimu base libparser node nodeattr core
+                               ${PYTHON_LIBRARIES}
+                     INCLUDES 
+                               ${Boost_INCLUDE_DIRS}
+                               ${PYTHON_INCLUDE_DIRS} 
+                    )
+
+# This ensures that for debug config, we only link with debug boost libs, for other configs, we link with optimised boost libs                 
+target_link_libraries(ecflow debug ${Boost_PYTHON_LIBRARY_DEBUG}  ${Boost_PYTHON_LIBRARY_RELEASE})
+
+#
+# Override default behaviour that add RPATHS during install
+# The only thing that seem to work is set INSTALL_RPATH to ""
+# Using SKIP_BUILD_RPATH,BUILD_WITH_INSTALL_RPATH,INSTALL_RPATH_USE_LINK_PATH
+# had no effect
+#         
+# by default cmake add prefix 'lib', we don't want this hence disable
+set_target_properties(ecflow PROPERTIES 
+                             PREFIX ""
+                             INSTALL_RPATH ""
+                     )
+
+### tests 
+
+list( APPEND tests
+        py_u_TestAddDelete   
+        py_u_TestAddDeleteFunc 
+        py_u_TestAddNodeFunc  
+        py_s_TestClientApi    
+        py_s_TestPythonChildApi
+        py_u_TestDefs         
+        py_u_TestDefsCheck    
+        py_u_TestDerivable   
+        py_u_TestEcf  
+        py_u_TestError        
+        py_u_TestFind        
+        py_u_TestGetAllTasks   
+        py_u_TestJobGeneration 
+        py_u_TestParent        
+        py_u_TestRepeatArithmetic
+        py_u_TestSimulator  
+        py_u_TestTraversal     
+        py_u_TestUserManual    
+        py_u_TestWith         
+)
+
+foreach( test ${tests} )
+
+    ecbuild_add_test( TARGET ${test} 
+                      TYPE PYTHON 
+                      ARGS        ${CMAKE_CURRENT_SOURCE_DIR}/test/${test}.py
+                      ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/lib" 
+                      TEST_DEPENDS u_base
+                     )
+endforeach()
+
+set_property(TEST py_s_TestClientApi      APPEND PROPERTY DEPENDS s_test)
+set_property(TEST py_s_TestPythonChildApi APPEND PROPERTY DEPENDS py_s_TestClientApi)
+
+ecbuild_add_test( TARGET py_u_TestMigrate
+                  TYPE PYTHON 
+                  ARGS ${CMAKE_CURRENT_SOURCE_DIR}/migrate/py_u_TestMigrate.py
+                  ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/lib" )
+
+
+# ==========================================================================
+# install
+# ==========================================================================
+if( ENABLE_PYTHON )
+
+   message( STATUS "python found,  CMAKE_PYTHON_INSTALL_TYPE=${CMAKE_PYTHON_INSTALL_TYPE}")
+
+   # CMAKE_PYTHON_INSTALL_TYPE = [ local | setup ]
+   
+   if( CMAKE_PYTHON_INSTALL_TYPE MATCHES  "local"  OR NOT DEFINED CMAKE_PYTHON_INSTALL_TYPE )
+   
+      message(STATUS "python install *LOCAL* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
+      set(PYTHON_SITE "lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages" )
+      set(PYTHON_DEST "${PYTHON_SITE}/ecflow" )
+      
+      install( TARGETS ecflow   DESTINATION ${PYTHON_DEST} 
+               RENAME ecflow.so
+             )
+      install( FILES   ecflow/__init__.py  DESTINATION ${PYTHON_DEST} )
+      
+   else()
+
+      # -------------------------------------------------------------------------------------
+      # Install using setup.py
+      # See: http://bloerg.net/2012/11/10/cmake-and-distutils.html
+      # -------------------------------------------------------------------------------------
+      message(STATUS "python install using *setup.py* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
+      message(STATUS "CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}")
+      message(STATUS "CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}")
+      message(STATUS "CMAKE_PYTHON_INSTALL_PREFIX : ${CMAKE_PYTHON_INSTALL_PREFIX}" )  
+    
+      set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
+      set(SETUP_PY    "${CMAKE_CURRENT_SOURCE_DIR}/setup.py")
+      set(DEPS        "${CMAKE_CURRENT_SOURCE_DIR}/ecflow/__init__.py")
+      set(OUTPUT      "${CMAKE_CURRENT_SOURCE_DIR}/timestamp")
+
+      configure_file(${SETUP_PY_IN} ${SETUP_PY} )
+
+      add_custom_command(OUTPUT ${OUTPUT}
+                       COMMAND ${PYTHON} ${SETUP_PY} build
+                       COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}
+                       DEPENDS ${DEPS})
+      add_custom_target(target ALL DEPENDS ${OUTPUT})
+
+
+      install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} build_ext)")
+    
+	  if( DEFINED CMAKE_PYTHON_INSTALL_PREFIX )
+         message(STATUS "custom/*test* python install prefix defined CMAKE_PYTHON_INSTALL_PREFIX=${CMAKE_PYTHON_INSTALL_PREFIX}")
+         install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install -f --prefix=${CMAKE_PYTHON_INSTALL_PREFIX})")
+      else()
+         install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")
+      endif()
+   endif()
+
+endif()
diff --git a/ecflow_4_0_7/Pyext/doc/jamfile.jam b/ecflow_4_0_7/Pyext/doc/jamfile.jam
new file mode 100644
index 0000000..af12a9d
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/doc/jamfile.jam
@@ -0,0 +1,299 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# =============================================================================
+# This jam file, allows for creation of ecflow python extension module, where
+# we have a SHARED link to boost python, additionally boost python is
+# installed, and a rpath is set to it.
+# ===============================================================================
+
+# ===============================================================================
+# Error to watch out for:
+# error: No best alternative for /python_for_extensions
+#    next alternative: required properties: <python>2.7 <target-os>linux
+#        matched
+#    next alternative: required properties: <python>2.7 <target-os>linux
+#        matched
+# 
+# Please check if you have more than one 'using python' in configuration files.
+# Please check site-config.jam, user-config.jam and project-config.jam and 
+# remove duplicated 'using python'
+# ===============================================================================
+        
+#
+# jamfile for installing, building exposing c++ library to python.
+# and for testing embedded python
+#
+# Use of <dll-path> should force a relink. But this *ONLY* works for executables
+# and *NOT* shared libraries. The HACKY work around is use <dll-path> when 
+# building the extension. Hence this requires that ECFLOW_INSTALL_DIR 
+# is correctly set during build time. Yuk. 
+#
+project thePyext ;
+
+use-project theCore      : ../ACore ;
+use-project theNodeAttr  : ../ANattr ;
+use-project theNode      : ../ANode ;
+use-project theParser    : ../AParser ;
+use-project theBase      : ../Base ;
+use-project theClient    : ../Client ;
+use-project theSimulator : ../CSim ;
+
+# Make the definition of the python-extension rule available
+# Somehow this bjam causes boost python libs to be built under $BOOST_ROOT/bin.v2
+# How can I get it to use boost python that was built with all the other boost libs ???
+import python ;
+
+if ! [ python.configured ]
+{
+    # ECHO "notice: no Python configured in user-config.jam" ;
+    # ECHO "notice: will use default configuration" ;
+    # We will typically place this in user-congig/site-config.jam
+    #using python
+    #     :  # version
+    #     :  # cmd-or-prefix
+    #     :  # includes
+    #     :  # libraries
+    #     :  # condition
+    #     ;
+    using python ;
+}
+
+# Specify the path to the Boost project.  If you move this project,
+# adjust this path to refer to the Boost root directory.
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+use-project boost
+  : $(BOOST_ROOT) ;
+
+
+# ===================== project settings =================================
+# Set up the project-wide requirements that everything uses the
+# boost_python library from the project whose global ID is /boost/python.
+#
+# AIX: need to add additional include for pyconfig.hpp since we have 
+#      one for python32 and another one for python64. 
+#      (Typically there is only _one_ in  the python includes dir)
+#      *** This should have been added to site-config.jam file **
+#
+# AIX: we get TOC overflow, because compiler/linker has 64k limit on
+#      the number of global symbols. Options are use:
+#       0/ Break up shared lib
+#       1/ -bbigtoc to overcome at the cost of performance degradation
+#       2/ --qipa=level=0 if this fails try
+#       3/ --qipa=level=1 if this fails try
+#       4/ --qipa=level=2 if this fails, revert to -bbigtoc
+#       Currently option 2-4 didn't work!
+#      *** This should have been added to site-config.jam file **
+#      prevously we had:   : requirements <toolset>vacpp:<linkflags>-bbigtoc  
+#
+#  If we use:
+#  : requirements <library>/boost/python//boost_python 
+#       THEN we will depend on $BOOST_ROOT/bin.v2/...
+#       This will be automatically compiled if it does not exist
+#  : requirements <library>/site-config//boost_python
+#       THEN use the boost python in $BOOST_ROOT/stage/lib/
+#       This is also expects  we have defined boost_python in site-config.jam/user-config.jam
+#       
+project
+#   : requirements <library>/boost/python//boost_python 
+    : requirements <library>/site-config//boost_python
+  ;
+
+# ======================== libs ============================================
+# HPUX:  ADD standard libs. They don't get added by default ?
+#        Also on HPUX the shared libs appears reversed, and don't appear
+#        in the order specified weird ?
+#        Notice the use of <library> to add additional library on the link line
+#        but only for HPUX/acc toolset
+# <ALL>: It appears the pthread lib is automatically added. i.e >lib pthread ;
+#
+# Note:  <toolset>vacpp:<linkflags>-bbigtoc  was required for 
+#            ecgate(rs6000) ONLY and not c1b(ibm_power6)
+
+lib std_v2 ;
+lib stream ;
+lib Csup ;
+lib unwind ;
+lib m ;
+alias hpux_std_libs : std_v2 stream Csup unwind m ;
+
+# ========================================================================
+# Extension:  Declare a Python extension called ecflow.  
+# ========================================================================
+python-extension ecflow : [ glob src/*.cpp ]
+    /theCore//core
+    /theNodeAttr//nodeattr
+    /theNode//node
+    /theParser//libparser
+    /theBase//base
+    /theClient//libclient
+    /theSimulator//libsimu
+    /site-config//boost_system
+    /site-config//boost_serialization
+    /site-config//boost_filesystem
+    /site-config//boost_program_options
+    /site-config//boost_datetime
+    : <variant>debug:<define>DEBUG
+      <toolset>acc:<library>hpux_std_libs  
+      <toolset>acc:<linkflags>-L$(ECFLOW_PYTHON_INSTALL_DIR)
+      <toolset>vacpp:<linkflags>-L$(ECFLOW_PYTHON_INSTALL_DIR)
+      <toolset>vacpp:<linkflags>-bbigtoc
+      <dll-path>$(ECFLOW_PYTHON_INSTALL_DIR)
+    ;
+
+# ========================================================================
+# Documentation: 
+# ========================================================================
+# Place the shared library 'ecflow' into the ecflow/ directory. 
+# - *REQUIRED* for sphinx-build. Documentation generation  See Doc/online/conf.py
+#   We use this as first place to look for c++ extension
+# - avoids hard wired dependency on compiler path
+# - Picks up latest changes
+install ecflow/ : ecflow  ;
+
+
+# ========================================================================
+# INSTALLATION:
+# ========================================================================
+# <dll-path> specify the path which will be used at runtime to search for dynamic libraries
+# it is like using rpath, i.e. to hard code a directory, when doing a runtime search for a library
+# <dll-path>$(ECFLOW_PYTHON_INSTALL_DIR), is used, to dynamically load boost-python shared library
+# Requested by User Support, to avoid having user add LD_LIBRARY_PATH to their environment
+#
+# *HOWEVER* this does not work at install time, and must be done at link time. See below
+#
+# The tests(run-test) *BELOW* specify LD_LIBRARY_PATH and hence override <dll-path>
+# 
+# Linux: ldd <extension>
+#           If the embedded object is not accessible, it just shows "=>not found"
+#           In our case the boost python shared lib may not exist until added at install time.
+#           *** Hence ldd can be very misleading ***
+#           *** Also if LD_LIBRARY_PATH is set *and* path exist, this will be shown & hence hide embedded paths ***
+#
+#        objdump -p  <extension>     // detailed dump, *SHOWS* the embedded paths, and search order
+#           shared library dynamic path search:
+#              LD_LIBRARY_PATH    enabled  first
+#              embedded path      enabled  second   
+#
+# HPUX:  ldd <extension>
+#        chatr <extension>           // detailed dump, *SHOWS* search path and embedded path
+#           shared library dynamic path search:
+#              LD_LIBRARY_PATH    enabled  first
+#              SHLIB_PATH         enabled  second
+#              embedded path      enabled  third   
+#
+# AIX:  ldd  <extension>
+#       dump -H <extension>
+#
+# NOTE: <linkflags>-L$(ECFLOW_PYTHON_INSTALL_DIR)
+#       <dll-path>$(ECFLOW_PYTHON_INSTALL_DIR)
+#      is ONLY required during install. 
+#      However install does not appear to force a relink. 
+#      The bjam documentations suggests that <dll-path> is only required at install. 
+#      But that does not work, since we don't appear to relink. It *ONLY* works with exe's and not shared libs
+#      As a result tried to use <dll-path> at link time, with mixed results:
+#             hardcode-dll-paths    install                          link
+#      Linux:  does not work,       <dll-path> does not work         <dll-path> works
+#      HPUX:   works                <dll-path> does not work         <dll-path> does not work
+#                                                                    adding -L/path added, but get ignored by -L 
+#                                                                    allready there on development path 
+#      AIX:    does not work        <dll-path> does not work         <dll-path> does not work
+#                                                                    -L/path however does
+# Bjam documentation suggest hardcode-dll-paths has a default value of true,
+# this however can only be seen on HPUX. Tried combination of:
+#     <toolset>acc:<hardcode-dll-paths>false
+#     <toolset>acc:<linkflags>-L$(ECFLOW_PYTHON_INSTALL_DIR)
+# Again no effect:
+#
+# Tried using:  bjam install-py dll-path=/var/tmp/ma0/ecflow/1.9.15/lib/python2.5/site-packages/ecflow -d2
+# This will ONLY work if the extension needs building, will not work for installing as emos
+# as emos will not have permission to write into workspace first.
+#
+# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+# The hacky workaround is to use <dll-path> when building the extension. This requires
+# that ECFLOW_INSTALL_DIR is correctly set, which requires that ECFLOW_INSTALL_DIR
+# is correctly set. i.e during the build and NOT just install
+# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+# - install __init__.py file. 
+# - This install is referenced in JamRoot.jam
+install install-py1
+   : [ glob ecflow/*.py ] 
+   : <location>$(ECFLOW_DESTDIR)/$(ECFLOW_PYTHON_INSTALL_DIR)
+   ;
+
+# - <dll-path> for install Left in, in case its fixed in the future. 
+# - This install is referenced in JamRoot.jam
+install install-py 
+   : ecflow
+   : <install-dependencies>on 
+     <install-type>PYTHON_EXTENSION 
+     <install-type>SHARED_LIB 
+     <dll-path>$(ECFLOW_PYTHON_INSTALL_DIR)
+     <location>$(ECFLOW_DESTDIR)$(ECFLOW_PYTHON_INSTALL_DIR)
+   ;
+
+# make install explicit, otherwise we end installing for all calls to bjam
+explicit install-py1 ;
+explicit install-py  ;
+
+
+# ========================================================================
+# TESTING: unit-tests and test for python fragments in online tutorial
+# ========================================================================
+import testing ;
+
+# A little "rule" (function) to clean up the syntax of declaring tests
+# of these extension modules.
+local rule run-test ( test-name : sources + )
+{
+    testing.make-test run-pyd : $(sources) : : $(test-name) ;
+}
+
+#
+# Declare test targets; 
+# Note cant run TestWith until all plarforms support with statement, i.e python 2.6 or greater
+#                       
+run-test TestClientApi     : ecflow [ glob test/py_s_TestClientApi.py ] ;
+run-test TestDefs          : ecflow [ glob test/py_u_TestDefs.py ] ;
+run-test TestError         : ecflow [ glob test/py_u_TestError.py ] ;
+run-test TestTraversal     : ecflow [ glob test/py_u_TestTraversal.py ] ;
+run-test TestDefsCheck     : ecflow [ glob test/py_u_TestDefsCheck.py ] ;
+run-test TestSimulator     : ecflow [ glob test/py_u_TestSimulator.py ] ;
+run-test TestAddDelete     : ecflow [ glob test/py_u_TestAddDelete.py ] ;
+run-test TestAddDeleteFunc : ecflow [ glob test/py_u_TestAddDeleteFunc.py ] ;
+run-test TestAddNodeFunc   : ecflow [ glob test/py_u_TestAddNodeFunc.py ] ;
+run-test TestParent        : ecflow [ glob test/py_u_TestParent.py ] ;
+run-test TestUserManual    : ecflow [ glob test/py_u_TestUserManual.py ] ;
+run-test TestJobGeneration : ecflow [ glob test/py_u_TestJobGeneration.py ] ;
+run-test TestGetAllTasks   : ecflow [ glob test/py_u_TestGetAllTasks.py ] ;
+run-test TestDerivable     : ecflow [ glob test/py_u_TestDerivable.py ] ;
+run-test TestWith          : ecflow [ glob test/py_u_TestWith.py ] ;
+run-test TestFind          : ecflow [ glob test/py_u_TestFind.py ] ;
+run-test TestMigrate       : ecflow [ glob migrate/py_u_TestMigrate.py ] ;
+run-test TestRepeatArithmetic  :  ecflow [ glob test/py_u_TestRepeatArithmetic.py ] ;
+run-test TestGeneratedVariable : ecflow [ glob test/py_u_TestGeneratedVariable.py ] ;
+run-test TestEcf               : ecflow [ glob test/py_u_TestEcf.py ] ;
+
+# A target that runs all the tests. 
+# Note test_embed & test_embed_ecf commented out since we dont use this functionality
+alias test-all
+ :  TestUserManual TestJobGeneration TestClientApi TestDefs TestError TestTraversal TestDefsCheck 
+    TestSimulator TestAddDelete TestAddDeleteFunc TestAddNodeFunc TestParent TestGetAllTasks TestDerivable 
+    TestMigrate TestRepeatArithmetic TestWith TestFind TestGeneratedVariable TestEcf
+    # test_embed test_embed_ecf 
+    ;
+   
+# Only run tests when explicitly requested
+explicit test-all
+    TestUserManual TestJobGeneration TestClientApi TestDefs TestError TestTraversal TestDefsCheck 
+    TestSimulator TestAddDelete TestAddDeleteFunc TestAddNodeFunc TestParent TestGetAllTasks TestDerivable 
+    TestMigrate TestRepeatArithmetic TestWith TestFind TestGeneratedVariable TestEcf
+    # test_embed test_embed_ecf 
+    ;
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/doc/overload.txt b/ecflow_4_0_7/Pyext/doc/overload.txt
new file mode 100644
index 0000000..6588e39
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/doc/overload.txt
@@ -0,0 +1,14 @@
+
+When we have mutiple function of the same name but different args we can use
+the following to choose the correct overload
+
+   // choose the correct overload
+   void    (NodeContainer::*add_family)(family_ptr)          = &NodeContainer::addFamily;
+   void    (NodeContainer::*add_task)(task_ptr)              = &NodeContainer::addTask;
+   class_<NodeContainer, bases<Node>, boost::noncopyable >("NodeContainer",DefsDoc::node_container_doc(), no_init)
+   .def("add_family",&NodeContainer::add_family ,DefsDoc::add_family_doc())
+   .def("add_task",  &NodeContainer::add_task ,  DefsDoc::add_task_doc())
+   .def("add_family",add_family ,DefsDoc::add_family_doc())
+   .def("add_task",  add_task,   DefsDoc::add_task_doc())
+   .add_property("nodes",    boost::python::range( &NodeContainer::node_begin,  &NodeContainer::node_end),"Returns a list of Node's")
+   ;
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/ecflow/__init__.py b/ecflow_4_0_7/Pyext/ecflow/__init__.py
new file mode 100644
index 0000000..c9f8f93
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/ecflow/__init__.py
@@ -0,0 +1,12 @@
+from ecflow import *
+
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $ 
+#
+# Copyright 2009-2012 ECMWF. 
+# This software is licensed under the terms of the Apache Licence version 2.0 
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation 
+# nor does it submit to any jurisdiction.  
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/jamfile.jam b/ecflow_4_0_7/Pyext/jamfile.jam
new file mode 100755
index 0000000..8b22c64
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/jamfile.jam
@@ -0,0 +1,205 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# =============================================================================
+# This jam file, allows for creation of ecflow python extension module, where
+# we have a STATIC link to boost python 
+# ===============================================================================
+
+# ===============================================================================
+# Error to watch out for:
+# error: No best alternative for /python_for_extensions
+#    next alternative: required properties: <python>2.7 <target-os>linux
+#        matched
+#    next alternative: required properties: <python>2.7 <target-os>linux
+#        matched
+# 
+# Please check if you have more than one 'using python' in configuration files.
+# Please check site-config.jam, user-config.jam and project-config.jam and 
+# remove duplicated 'using python'
+#
+# When installing BOOST-python libs, make sure to call module load python *FIRST*
+# Otherwise it will pick the python specified in project-config.jam, which make not be correct
+#
+# ===============================================================================
+        
+#
+# jamfile for installing, building exposing c++ library to python.
+# and for testing embedded python
+#
+# Use of <dll-path> should force a relink. But this *ONLY* works for executables
+# and *NOT* shared libraries. The HACKY work around is use <dll-path> when 
+# building the extension. Hence this requires that ECFLOW_INSTALL_DIR 
+# is correctly set during build time. Yuk. 
+#
+project thePyext ;
+
+use-project theCore      : ../ACore ;
+use-project theNodeAttr  : ../ANattr ;
+use-project theNode      : ../ANode ;
+use-project theParser    : ../AParser ;
+use-project theBase      : ../Base ;
+use-project theClient    : ../Client ;
+use-project theSimulator : ../CSim ;
+
+# Make the definition of the python-extension rule available
+import python ;
+
+if ! [ python.configured ]
+{
+    # ECHO "notice: no Python configured in user-config.jam" ;
+    # ECHO "notice: will use default configuration" ;
+    # We will typically place this in user-congig/site-config.jam
+    #using python
+    #     :  # version
+    #     :  # cmd-or-prefix
+    #     :  # includes
+    #     :  # libraries
+    #     :  # condition
+    #     ;
+    using python ;
+}
+
+# Specify the path to the Boost project.  If you move this project,
+# adjust this path to refer to the Boost root directory.
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+use-project boost
+  : $(BOOST_ROOT) ;
+
+
+# ======================== libs ============================================
+# HPUX:  ADD standard libs. They don't get added by default ?
+#        Also on HPUX the shared libs appears reversed, and don't appear
+#        in the order specified weird ?
+#        Notice the use of <library> to add additional library on the link line
+#        but only for HPUX/acc toolset
+# <ALL>: It appears the pthread lib is automatically added. i.e >lib pthread ;
+#
+
+lib std_v2 ;
+lib stream ;
+lib Csup ;
+lib unwind ;
+lib m ;
+alias hpux_std_libs : std_v2 stream Csup unwind m ;
+
+# ========================================================================
+# Extension:  Declare a Python extension called ecflow.  
+# ========================================================================
+python-extension ecflow : [ glob src/*.cpp ]
+    /theCore//core
+    /theNodeAttr//nodeattr
+    /theNode//node
+    /theParser//libparser
+    /theBase//base
+    /theClient//libclient
+    /theSimulator//libsimu
+    /site-config//boost_system
+    /site-config//boost_serialization
+    /site-config//boost_filesystem
+    /site-config//boost_program_options
+    /site-config//boost_datetime
+    /site-config//boost_python_static
+    : <variant>debug:<define>DEBUG
+      <toolset>acc:<library>hpux_std_libs  
+    ;
+
+# ========================================================================
+# Documentation: 
+# ========================================================================
+# Place the shared library 'ecflow' into the ecflow/ directory. 
+# - *REQUIRED* for sphinx-build. Documentation generation  See Doc/online/conf.py
+#   We use this as first place to look for c++ extension
+# - avoids hard wired dependency on compiler path
+# - Picks up latest changes
+install ecflow/ : ecflow  ;
+
+
+# ========================================================================
+# INSTALLATION:
+# ========================================================================
+# - install __init__.py file. 
+# - This install is referenced in JamRoot.jam
+install install-py1
+   : [ glob ecflow/*.py ] 
+   : <location>$(ECFLOW_DESTDIR)/$(ECFLOW_PYTHON_INSTALL_DIR)
+   ;
+
+# - <dll-path> for install Left in, in case its fixed in the future. 
+# - This install is referenced in JamRoot.jam
+# - <install-dependencies>on will also install boost_python shared lib and add repath to it.
+install install-py 
+   : ecflow
+   : <install-type>PYTHON_EXTENSION 
+     <install-type>SHARED_LIB 
+     <location>$(ECFLOW_DESTDIR)$(ECFLOW_PYTHON_INSTALL_DIR)
+   ;
+
+# make install explicit, otherwise we end installing for all calls to bjam
+explicit install-py1 ;
+explicit install-py  ;
+
+
+# ========================================================================
+# TESTING: unit-tests and test for python fragments in online tutorial
+# ========================================================================
+import testing ;
+
+# A little "rule" (function) to clean up the syntax of declaring tests
+# of these extension modules.
+local rule run-test ( test-name : sources + )
+{
+    testing.make-test run-pyd : $(sources) : : $(test-name) ;
+}
+
+#
+# Declare test targets; 
+# Note cant run TestWith until all plarforms support with statement, i.e python 2.6 or greater
+#                       
+run-test TestClientApi      : ecflow [ glob test/py_s_TestClientApi.py ] ;
+run-test TestPythonChildApi : ecflow [ glob test/py_s_TestPythonChildApi.py ] ;
+run-test TestDefs           : ecflow [ glob test/py_u_TestDefs.py ] ;
+run-test TestError          : ecflow [ glob test/py_u_TestError.py ] ;
+run-test TestTraversal      : ecflow [ glob test/py_u_TestTraversal.py ] ;
+run-test TestDefsCheck      : ecflow [ glob test/py_u_TestDefsCheck.py ] ;
+run-test TestSimulator      : ecflow [ glob test/py_u_TestSimulator.py ] ;
+run-test TestAddDelete      : ecflow [ glob test/py_u_TestAddDelete.py ] ;
+run-test TestAddDeleteError : ecflow [ glob test/py_u_TestAddDeleteError.py ] ;
+run-test TestAddDeleteFunc : ecflow [ glob test/py_u_TestAddDeleteFunc.py ] ;
+run-test TestAddNodeFunc   : ecflow [ glob test/py_u_TestAddNodeFunc.py ] ;
+run-test TestParent        : ecflow [ glob test/py_u_TestParent.py ] ;
+run-test TestUserManual    : ecflow [ glob test/py_u_TestUserManual.py ] ;
+run-test TestJobGeneration : ecflow [ glob test/py_u_TestJobGeneration.py ] ;
+run-test TestGetAllTasks   : ecflow [ glob test/py_u_TestGetAllTasks.py ] ;
+run-test TestDerivable     : ecflow [ glob test/py_u_TestDerivable.py ] ;
+run-test TestWith          : ecflow [ glob test/py_u_TestWith.py ] ;
+run-test TestFind          : ecflow [ glob test/py_u_TestFind.py ] ;
+run-test TestMigrate       : ecflow [ glob migrate/py_u_TestMigrate.py ] ;
+run-test TestRepeatArithmetic  :  ecflow [ glob test/py_u_TestRepeatArithmetic.py ] ;
+run-test TestGeneratedVariable : ecflow [ glob test/py_u_TestGeneratedVariable.py ] ;
+run-test TestEcf               : ecflow [ glob test/py_u_TestEcf.py ] ;
+
+# A target that runs all the tests. 
+# Note test_embed & test_embed_ecf commented out since we dont use this functionality
+alias test-all
+ :  TestUserManual TestJobGeneration  TestDefs TestError TestTraversal TestDefsCheck 
+    TestSimulator TestAddDelete TestAddDeleteError TestAddDeleteFunc TestAddNodeFunc TestParent TestGetAllTasks 
+    TestDerivable  TestMigrate TestRepeatArithmetic TestWith TestFind TestGeneratedVariable TestEcf
+    TestClientApi TestPythonChildApi
+    # test_embed test_embed_ecf 
+    ;
+   
+# Only run tests when explicitly requested
+explicit test-all
+    TestUserManual TestJobGeneration TestDefs TestError TestTraversal TestDefsCheck 
+    TestSimulator TestAddDelete TestAddDeleteError TestAddDeleteFunc TestAddNodeFunc TestParent TestGetAllTasks 
+    TestDerivable TestMigrate TestRepeatArithmetic TestWith TestFind TestGeneratedVariable TestEcf
+    TestClientApi TestPythonChildApi
+    # test_embed test_embed_ecf 
+    ;
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/migrate/abort_and_label_bug.def b/ecflow_4_0_7/Pyext/migrate/abort_and_label_bug.def
new file mode 100644
index 0000000..fcf0169
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/abort_and_label_bug.def
@@ -0,0 +1,93 @@
+# 3.1.7
+defs_state MIGRATE state>:aborted flag:late,message state_change:983039 modify_change:1018
+  edit SLEEP '10'
+suite suite #  begun:1 state:aborted dur:01:29:57 flag:message,no_reque
+  defstatus suspended
+  edit ECF_EXTN '.sms'
+  clock real 
+  calendar initTime:2013-Sep-10 12:37:03 suiteTime:2013-Sep-10 15:56:00 duration:03:18:57 initLocalTime:2013-Sep-10 12:37:03 lastTime:2013-Sep-10 15:56:00 calendarIncrement:00:01:00
+  family family # state:aborted dur:02:18:57 flag:message
+    task task # passwd:jxX0gIbR abort<:   Script for /suite/family/task can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/family/task.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script
+      edit VARIABLE 'VALUE'
+    task rescue # passwd:Bs7hroqB abort<:   Script for /suite/family/rescue can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/family/rescue.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script
+      late -s +00:05 -c 00:05
+      complete task eq complete
+      trigger task == aborted
+    task step # passwd:4N9cOzVA abort<:   Script for /suite/family/step can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/family/step.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script
+      trigger task:step le step:STEP
+      trigger -o task eq complete
+      repeat integer STEP 0 100
+    family loop_in_time # state:complete
+      defstatus complete
+      time 12:00
+      task hold # state:complete
+        complete 1==1
+        trigger 1==0
+    endfamily
+  endfamily
+  task household # passwd:31NZt9lV abort<:   Script for /suite/household can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/household.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:22:57 flag:task_aborted,no_script
+    cron 00:00 23:59 01:00 # nextTimeSlot/13:00
+  task monthly # state:queued
+    date 1.*.*
+  family remote # state:aborted dur:01:29:57 flag:message,no_reque suspended:1
+    edit ECF_TRIES '1'
+    family c2a # state:aborted dur:01:29:57 flag:no_reque
+      edit LOGDIR '/s2o1/emos_esuite/emos_data/log'
+      task sub # passwd:gyBC8q.O abort<: PID(28027)  path(/suite/remote/c2a/sub)  exited with status 255 [ /home/ma/emos/bin/smssubmit.cray emos c2a /vol/emos_nc/output/suite/remote/c2a/sub.job1 /s2o1/emos_esuite/emos_data/log/suite/remote/c2a/sub.1 ]>abort try:1 state:aborted dur:01:29:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'c2a'
+    endfamily
+    family ecgate # state:aborted dur:02:02:57 flag:no_reque
+      task sub # passwd:6pIZXvrl abort<: PID(32480)  path(/suite/remote/ecgate/sub)  exited with status 255 [ /home/ma/emos/bin/smssubmit.cray emos ecgate /vol/emos_nc/output/suite/remote/ecgate/sub.job1 /vol/emos_nc/output/suite/remote/ecgate/sub.1 ]>abort try:1 state:aborted dur:02:02:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'ecgate'
+    endfamily
+    family ibis # state:aborted dur:02:02:57 flag:no_reque
+      task sub # passwd:AEX5NtyU abort<: PID(32532)  path(/suite/remote/ibis/sub)  exited with status 1 [ /home/ma/emos/bin/smssubmit.cray emos ibis /vol/emos_nc/output/suite/remote/ibis/sub.job1 /vol/emos_nc/output/suite/remote/ibis/sub.1 ]>abort try:1 state:aborted dur:02:02:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'ibis'
+    endfamily
+    family bilbo # state:aborted dur:02:02:57 flag:no_reque
+      task sub # passwd:30IPtlxu abort<: PID(32543)  path(/suite/remote/bilbo/sub)  exited with status 1 [ /home/ma/emos/bin/smssubmit.cray emos bilbo /vol/emos_nc/output/suite/remote/bilbo/sub.job1 /vol/emos_nc/output/suite/remote/bilbo/sub.1 ]>abort try:1 state:aborted dur:02:02:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'bilbo'
+    endfamily
+  endfamily
+  family catchup2rt # state:aborted dur:03:18:57 flag:message suspended:1
+    task doer # passwd:OXQkmELW abort<:   Script for /suite/catchup2rt/doer can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/catchup2rt/doer.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:1 state:aborted dur:03:18:57 flag:task_aborted,no_script,message,no_reque
+      complete timer eq complete
+      trigger 1==0
+  endfamily
+endsuite
+#
+# Label that spans multiple lines
+suite made_up
+    label info "110 nodes for 1 minutes in 55 minutes, emos12Aeda"
+    label info1 "((11*10*64)) for 30"
+    label info2 ""
+    label info3 "have you? set START_LOBSVR=1 in the task, once, to launch the logserver,
+setup ssh login
+created remote /tmp/map/cray"
+  zombie ecf:fob:label:3600 
+endsuite
diff --git a/ecflow_4_0_7/Pyext/migrate/aborted_reason_bug.def b/ecflow_4_0_7/Pyext/migrate/aborted_reason_bug.def
new file mode 100644
index 0000000..68666b0
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/aborted_reason_bug.def
@@ -0,0 +1,82 @@
+# 3.1.7
+defs_state MIGRATE state>:aborted flag:late,message state_change:983039 modify_change:1018
+  edit SLEEP '10'
+suite suite #  begun:1 state:aborted dur:01:29:57 flag:message,no_reque
+  defstatus suspended
+  edit ECF_EXTN '.sms'
+  clock real 
+  calendar initTime:2013-Sep-10 12:37:03 suiteTime:2013-Sep-10 15:56:00 duration:03:18:57 initLocalTime:2013-Sep-10 12:37:03 lastTime:2013-Sep-10 15:56:00 calendarIncrement:00:01:00
+  family family # state:aborted dur:02:18:57 flag:message
+    task task # passwd:jxX0gIbR abort<:   Script for /suite/family/task can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/family/task.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script
+      edit VARIABLE 'VALUE'
+    task rescue # passwd:Bs7hroqB abort<:   Script for /suite/family/rescue can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/family/rescue.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script
+      late -s +00:05 -c 00:05
+      complete task eq complete
+      trigger task == aborted
+    task step # passwd:4N9cOzVA abort<:   Script for /suite/family/step can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/family/step.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script
+      trigger task:step le step:STEP
+      trigger -o task eq complete
+      repeat integer STEP 0 100
+    family loop_in_time # state:complete
+      defstatus complete
+      time 12:00
+      task hold # state:complete
+        complete 1==1
+        trigger 1==0
+    endfamily
+  endfamily
+  task household # passwd:31NZt9lV abort<:   Script for /suite/household can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/household.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:2 state:aborted dur:02:22:57 flag:task_aborted,no_script
+    cron 00:00 23:59 01:00 # nextTimeSlot/13:00
+  task monthly # state:queued
+    date 1.*.*
+  family remote # state:aborted dur:01:29:57 flag:message,no_reque suspended:1
+    edit ECF_TRIES '1'
+    family c2a # state:aborted dur:01:29:57 flag:no_reque
+      edit LOGDIR '/s2o1/emos_esuite/emos_data/log'
+      task sub # passwd:gyBC8q.O abort<: PID(28027)  path(/suite/remote/c2a/sub)  exited with status 255 [ /home/ma/emos/bin/smssubmit.cray emos c2a /vol/emos_nc/output/suite/remote/c2a/sub.job1 /s2o1/emos_esuite/emos_data/log/suite/remote/c2a/sub.1 ]>abort try:1 state:aborted dur:01:29:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'c2a'
+    endfamily
+    family ecgate # state:aborted dur:02:02:57 flag:no_reque
+      task sub # passwd:6pIZXvrl abort<: PID(32480)  path(/suite/remote/ecgate/sub)  exited with status 255 [ /home/ma/emos/bin/smssubmit.cray emos ecgate /vol/emos_nc/output/suite/remote/ecgate/sub.job1 /vol/emos_nc/output/suite/remote/ecgate/sub.1 ]>abort try:1 state:aborted dur:02:02:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'ecgate'
+    endfamily
+    family ibis # state:aborted dur:02:02:57 flag:no_reque
+      task sub # passwd:AEX5NtyU abort<: PID(32532)  path(/suite/remote/ibis/sub)  exited with status 1 [ /home/ma/emos/bin/smssubmit.cray emos ibis /vol/emos_nc/output/suite/remote/ibis/sub.job1 /vol/emos_nc/output/suite/remote/ibis/sub.1 ]>abort try:1 state:aborted dur:02:02:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'ibis'
+    endfamily
+    family bilbo # state:aborted dur:02:02:57 flag:no_reque
+      task sub # passwd:30IPtlxu abort<: PID(32543)  path(/suite/remote/bilbo/sub)  exited with status 1 [ /home/ma/emos/bin/smssubmit.cray emos bilbo /vol/emos_nc/output/suite/remote/bilbo/sub.job1 /vol/emos_nc/output/suite/remote/bilbo/sub.1 ]>abort try:1 state:aborted dur:02:02:57 flag:task_aborted,ecfcmd_failed,message,no_reque
+        edit SCHOST 'bilbo'
+    endfamily
+  endfamily
+  family catchup2rt # state:aborted dur:03:18:57 flag:message suspended:1
+    task doer # passwd:OXQkmELW abort<:   Script for /suite/catchup2rt/doer can not be found:
+   ECF_SCRIPT(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/suite/catchup2rt/doer.sms) does not exist:
+   Variable ECF_FETCH not defined:
+   Variable ECF_FILES not defined:
+   Search of directory ECF_HOME(/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME) failed:
+>abort try:1 state:aborted dur:03:18:57 flag:task_aborted,no_script,message,no_reque
+      complete timer eq complete
+      trigger 1==0
+  endfamily
+endsuite
diff --git a/ecflow_4_0_7/Pyext/migrate/ecflow_migrate.py b/ecflow_4_0_7/Pyext/migrate/ecflow_migrate.py
new file mode 100644
index 0000000..51deede
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/ecflow_migrate.py
@@ -0,0 +1,416 @@
+#!/usr/bin/env python2.7
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+import os          # for getenv
+import shutil      # used to remove directory tree
+#import argparse   # requires python 2.7
+import getopt, sys # for argument parsing  
+
+class Migrator(object):
+    def __init__(self, list_of_input_lines):
+        self.list_of_input_lines =  list_of_input_lines
+        self.list_of_output_lines = []
+        
+    def _migration_hook(self,default_version_number):
+        """Derived suite should override this function to perform the migration
+        """
+        return False;
+    
+    def output_lines(self):
+        return self.list_of_output_lines
+    
+    def migrate(self, default_version_number):
+        """Template/skeleton function, which will call the hooks
+        """
+        version = self.version_number_as_integer(default_version_number) 
+        if version >= default_version_number:
+            self.list_of_output_lines = self.list_of_input_lines
+            return False
+
+        self.list_of_output_lines = [] 
+        migrated = self._migration_hook(default_version_number)
+        if migrated : 
+            self.list_of_input_lines = self.list_of_output_lines   # preserve this migration
+            print "Applying " + type(self).__name__  
+        else:
+            self.list_of_output_lines = self.list_of_input_lines   
+        return migrated         
+
+    def version_number_as_integer(self,default_version):
+        """Determine the version number used in ecflow_client --migrate
+           This should be in the very first line
+           # 3.1.8
+        """
+        if len(self.list_of_input_lines) > 0:
+            tokens = self.list_of_input_lines[0].split()
+            if len(tokens) > 1:
+                # print tokens
+                version = (int)(tokens[1].replace(".",""))
+                # print "******************* found version " + str(version)
+                return version;
+        return default_version
+    
+    
+class MigrateForTaskAbort(Migrator):
+    """Fix bug where the task abort states(i.e a string) will contain new lines and hence
+       spill over the next line, and affecting the parser. This will move the abort string
+       into the same line, and remove the interleaving new lines
+    """
+    def __init__(self, list_of_input_lines):
+        Migrator.__init__(self, list_of_input_lines)
+ 
+    def _migration_hook(self,default_version_number):
+        """
+        The correct format is: where abort state is on the same line
+        task task # passwd:jxX0gIbR abort<: reason for abort >abort:
+        ensure_start_abort_and_end_abort_on_sameline
+        """
+        migrated = False
+        start_line_append = ""
+        for line in self.list_of_input_lines:
+            # process line
+            end_abort_pos = line.find(">abort")
+            task_pos = line.find("task")
+            if task_pos != -1:
+                start_abort_pos = line.find("abort<:")
+                if start_abort_pos != -1 and end_abort_pos != -1:
+                    # start and end found on same line. This is the correct format
+                    start_line_append = ""
+                
+                if start_abort_pos != -1 and end_abort_pos == -1:
+                    # print "start abort found with no end abort"
+                    start_line_append = line
+                    start_line_append = start_line_append.rstrip('\n')
+                    start_line_append += " "
+                    migrated = True
+                    continue
+    
+            if len(start_line_append) > 0:
+                start_line_append += line
+                if end_abort_pos != -1:
+                    self.list_of_output_lines.append(start_line_append) # preserve'\n' for this case                   
+                    # print start_line_append
+                    start_line_append = "";
+                else:
+                    start_line_append = start_line_append.rstrip('\n')
+                    start_line_append += " "
+    
+                continue;
+                  
+            self.list_of_output_lines.append(line)
+           
+        return migrated  
+    
+    
+class MigrateForLabel(Migrator):
+    """Fix bug where label value has new lines, and hence spills over to next line
+       This will remove place newline back onto the same line
+    """
+    def __init__(self, list_of_input_lines):
+        Migrator.__init__(self, list_of_input_lines)
+ 
+    def _migration_hook(self,default_version_number):
+        """
+        The correct format is where label in on the same line
+            label name "value" # "new value"
+        However if the value or new value has new line it can mess up the parsing
+            label info "have you? set START_LOBSVR=1 in the task, once, to launch the logserver,
+    setup ssh login
+    created remote /tmp/map/cray"
+        """
+        #count = 0;
+        no_of_label_quotes = 0
+        migrated = False
+        start_line_append = ""
+        for line in self.list_of_input_lines:
+            #count =  count + 1
+            #print str(count) + ": " + line
+            #if count == 383119:
+            #    print "debug mee"
+            if len(start_line_append) > 0:
+                no_of_label_quotes += line.count('"')
+                start_line_append += line
+                if no_of_label_quotes % 2 == 0:
+                    # even number of quotes
+                    self.list_of_output_lines.append(start_line_append) # preserve last '\n'  
+                    start_line_append = ""
+                    no_of_label_quotes = 0 
+                else:
+                    start_line_append = start_line_append.rstrip('\n')
+                continue            
+            else:
+            
+                # process line
+                tokens = line.split()
+                if len(tokens) >0 and tokens[0] == "label":
+                    no_of_label_quotes = line.count('"')
+                    if no_of_label_quotes % 2 != 0 : 
+                        start_line_append = line
+                        start_line_append = start_line_append.rstrip('\n')
+                        migrated = True
+                        continue
+                  
+            self.list_of_output_lines.append(line)
+           
+        return migrated
+     
+class MigrateForVariable(Migrator):
+    """Fix bug where variable value has new lines, and hence spills over to next line
+       This will remove place newline back onto the same line
+    """
+    def __init__(self, list_of_input_lines):
+        Migrator.__init__(self, list_of_input_lines)
+ 
+    def _migration_hook(self,default_version_number):
+        """
+        The correct format is where variable in on the same line
+            edit EMOS_TYPE '  family prod_wparam
+  endfamily
+'         
+        """
+        #count = 0;
+        no_of_label_quotes = 0
+        migrated = False
+        start_line_append = ""
+        for line in self.list_of_input_lines:
+            #count =  count + 1
+            #print str(count) + ": " + line
+            #if count == 383119:
+            #    print "debug mee"
+            if len(start_line_append) > 0:
+                no_of_label_quotes += line.count("'")
+                start_line_append += line
+                if no_of_label_quotes % 2 == 0:
+                    # even number of quotes
+                    self.list_of_output_lines.append(start_line_append) # preserve last '\n'  
+                    start_line_append = ""
+                    no_of_label_quotes = 0 
+                else:
+                    start_line_append = start_line_append.rstrip('\n')
+                continue            
+            else:
+            
+                # process line, avoid ECF_URL_CMD as that could by error have uneven number of "'' i.e
+                #   edit ECF_URL_CMD '${BROWSER:=firefox} -remote 'openURL(%URL%'
+                # hence we use 
+                #    if no_of_label_quotes == 1: 
+                # instead of
+                #    if no_of_label_quotes % 2 == 0:
+                tokens = line.split()
+                if len(tokens) >= 3 and tokens[0] == "edit":
+                    no_of_label_quotes = line.count("'")
+                    if no_of_label_quotes == 1: 
+                        start_line_append = line
+                        start_line_append = start_line_append.rstrip('\n')
+                        migrated = True
+                        continue
+                  
+            self.list_of_output_lines.append(line)
+           
+        return migrated
+     
+     
+class MigrateForHistory(Migrator):
+    """Fix bug where history spans multiple lines.  
+       See File: history_bug.def
+    """
+    def __init__(self, list_of_input_lines):
+        Migrator.__init__(self, list_of_input_lines)
+ 
+    def _migration_hook(self,default_version_number):
+        """
+        The history should all be on one line
+            defs_state MIGRATE state>:queued flag:message state_change:1500811 modify_change:48
+            edit ECF_LOG '/vol/emos_nc/output/ecflow/vali.21801.ecf.log'
+            edit SMSNAME '0'
+            history /s2s_devel/ecmf/back MSG:[15:53:06 21.10.2014] --replace=/s2s_devel/ecmf/back s2s_devel.def parent  :emos
+            history /s2s_devel/ecmf/enfh MSG:[13:45:53 12.11.2014] -alter change label last_run 20140929
+            20141002
+            20141016
+            20141023 /s2s_devel/ecmf/enfh/  :emos    MSG:[14:05:53 14.11.2014] --requeue force /s2s_devel/ecmf/enfh  :emos
+            history /s2s_devel/ecmf/enfh/back MSG:[13:38:30 11.11.2014] --alter change event doIt set /s2s_devel/ecmf/enfh/back  :emos
+            suite limits #  begun:1 state:complete flag:message suspended:1
+            endsuite
+        """
+        migrated = False
+        history_started = False
+        for line in self.list_of_input_lines:
+            # process line
+            tokens = line.split()
+            if len(tokens) >= 2 and tokens[0] == "suite":
+                history_started = False
+
+            if not history_started and len(tokens) >= 2 and tokens[0] == "history":
+                history_started = True
+ 
+            if history_started:
+                # append to previous line
+                if len(tokens) >= 1 and tokens[0] != "history":
+                    # get last line of output lines, string the new line and append
+                    self.list_of_output_lines[-1] = self.list_of_output_lines[-1].rstrip()
+                    self.list_of_output_lines[-1] = self.list_of_output_lines[-1] + line
+                    migrated = True
+                    continue;
+                  
+            self.list_of_output_lines.append(line)
+           
+        return migrated  
+    
+    
+def do_migrate(defs_file):
+    
+    migration_count = 0
+    fileName, fileExtension = os.path.splitext(defs_file)
+    output_file_name = fileName + ".mig";
+    
+    input_file_object = open(defs_file,'r')
+    output_file_object = open(output_file_name,'w')
+    try:
+        list_of_input_lines = input_file_object.readlines()  # preserves new lines, we want this
+        
+        list_of_output_lines = []
+        abort_migrator = MigrateForTaskAbort(list_of_input_lines)
+        if abort_migrator.migrate(401):
+            migration_count += 1
+            # did migration, update input lines for next migration
+            list_of_input_lines = abort_migrator.output_lines()
+        list_of_output_lines = abort_migrator.output_lines()
+         
+         
+        label_migrator = MigrateForLabel(list_of_input_lines)
+        if label_migrator.migrate(319):
+            migration_count += 1
+            # did migration, update input lines for next migration
+            list_of_input_lines = label_migrator.output_lines()
+        list_of_output_lines = label_migrator.output_lines()
+
+
+        variable_migrator = MigrateForVariable(list_of_input_lines)
+        if variable_migrator.migrate(401):
+            migration_count += 1
+            # did migration, update input lines for next migration
+            list_of_input_lines = variable_migrator.output_lines()
+        list_of_output_lines = variable_migrator.output_lines()
+        
+        
+        variable_migrator = MigrateForHistory(list_of_input_lines)
+        if variable_migrator.migrate(406):
+            migration_count += 1
+            # did migration, update input lines for next migration
+            list_of_input_lines = variable_migrator.output_lines()
+        list_of_output_lines = variable_migrator.output_lines()
+            
+        output_file_object.writelines(list_of_output_lines)
+    finally:
+        input_file_object.close()
+        output_file_object.close()
+        
+    return migration_count 
+
+def usage():
+    DESC = """\nThis python file is used to *FIX* migration bugs, when migrating from one release of ecflow to another.
+
+ Migration may be required when the release number changes:
+ <release-number>.<major>.<minor>
+    6.1.7   ->  7.0.0
+ as the checkpoint files *may* not be compatible. 
+        
+ This can be *checked* before hand. By attempting to load the check pt into the new server. 
+ On the old server run:
+    ecflow_client --check_pt  # this will write out a checkpt file  
+ Now copy this file to a separate directory, and start the *new* server using the same port number
+ If no errors are reported, you do not need to migrate.  
+ If loading the checkpt file into the new server fails for any reason then
+ then please follow these steps.
+
+ Steps for Old server:
+   o shutdown
+        # ecflow_client --shutdown
+   o suspend all suites
+        # CL="ecflow_client --port 32222 --host vsms1"
+        # for s in $($CL --suites); do $CL --suspend /$s; done
+   o wait for active/submitted tasks to complete
+   o halt the server
+        # ecflow_client --halt
+   o Use --migrate to dump state and structure to a file
+        # ecflow_client --migrate > all_suites.def
+   o terminate server *or* leave server running but start new server on different machine
+     to avoid port number clash.
+   o remove checkpt and backup checkpt files, to prevent new server from loading them
+     *Only* applicable if starting new server on same machine
+   o Run this script 
+     python ecflow_migrate.py -d all_suites.def
+     This will fix any issues associated with reloading this defs into the new server.
+     It write a file called 'all_suites.mig', which we will need to load into the new server. 
+     See below.
+
+ Steps for New server:
+   o start server
+   o load the migration file
+       # ecflow_client --load all_suites.mig
+   o set server running:
+       # ecflow_client --restart
+   o resume suspended suites
+       # CL="ecflow_client --port 32222 --host vsms1"
+       # for s in $($CL --suites); do $CL --resume /$s; done
+
+
+ There could be bugs with *old* "ecflow_client --migrate > all_suites.def"
+ This file, will fix any bugs associated --migrate, so that the subsequent
+ load with  *new* client (ecflow_client --load all_suites.mig) will work
+
+ Usage:
+    python ecflow_migrate.py --defs_file <filename>
+    python ecflow_migrate.py --d <filename>
+    python ecflow_migrate.py --defs_file all_suites.def 
+    
+    The fixed definition is written as filename.mig, i.e. all_suites.mig
+    """
+    return DESC;
+    
+    
+if __name__ == "__main__":
+    
+#     PARSER = argparse.ArgumentParser(description=usage(),  
+#                                      formatter_class=argparse.RawDescriptionHelpFormatter)
+#     PARSER.add_argument('defs_file',  help="The definition file to *fix* for migration")
+#     ARGS = PARSER.parse_args()
+#     ARGS.defs_file = os.path.expandvars(ARGS.defs_file) # expand references to any environment variables
+#     print ARGS    
+#     do_migrate( ARGS.defs_file )
+    
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "hd", ["help", "defs_file="])
+    except getopt.GetoptError as err:
+        # print help information and exit:
+        print(err) # will print something like "option -a not recognised"
+        print usage()
+        sys.exit(2)
+        
+    defs_file = None
+    for o, a in opts:
+        if o in ("-h", "--help"):
+            print usage()
+            sys.exit()
+        elif o in ("-d", "--defs_file"):
+            defs_file = a
+        else:
+            assert False, "un-handled option"
+    
+    if defs_file == None:
+        print "Please enter path to the defs file i.e ecflow_migrate --d ./defs_file.def"
+        sys.exit(1)
+        
+    defs_file = os.path.expandvars(defs_file); # expand references to any environment variables
+    do_migrate( defs_file )
diff --git a/ecflow_4_0_7/Pyext/migrate/history_bug.def b/ecflow_4_0_7/Pyext/migrate/history_bug.def
new file mode 100644
index 0000000..2d28f81
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/history_bug.def
@@ -0,0 +1,18 @@
+# 4.0.1
+defs_state MIGRATE state>:queued flag:message state_change:1500811 modify_change:48
+  edit ECF_LOG '/vol/emos_nc/output/ecflow/vali.21801.ecf.log'
+  edit SMSNAME '0'
+  history /s2s_devel/ecmf/back MSG:[15:53:06 21.10.2014] --replace=/s2s_devel/ecmf/back s2s_devel.def parent  :emos
+  history /s2s_devel/ecmf/enfh MSG:[13:45:53 12.11.2014] --alter change label last_run 20141023 /s2s_devel/ecmf/enfh/  :emosMSG:[13:45:53 12.11.2014] --alter change label next_run 99999999 /s2s_devel/ecmf/enfh/  :emosMSG:[16:54:11 12.11.2014] --alter change label last_run 20140929
+20141002
+20141016
+20141023 /s2s_devel/ecmf/enfh/  :emosMSG:[16:54:11 12.11.2014] --alter change label next_run 20141023 /s2s_devel/ecmf/enfh/  :emosMSG:[16:58:54 12.11.2014] --alter change label last_run 20141023 /s2s_devel/ecmf/enfh/  :emosMSG:[16:58:54 12.11.2014] --alter change label next_run 20141023 /s2s_devel/ecmf/enfh/  :emosMSG:[17:01:39 12.11.2014] --alter change label last_run 20141023 /s2s_devel/ecmf/enfh/  :emosMSG:[17:01:39 12.11.2014] --alter change label next_run 20141027 /s2s_devel/ec [...]
+  history /s2s_devel/ecmf/enfh/back MSG:[13:38:30 11.11.2014] --alter change event doIt set /s2s_devel/ecmf/enfh/back  :emosMSG:[15:14:11 11.11.2014] --alter change event doIt set /s2s_devel/ecmf/enfh/back  :emosMSG:[15:15:54 11.11.2014] --alter change event doIt set /s2s_devel/ecmf/enfh/back  :emosMSG:[15:18:10 11.11.2014] --alter change event doIt set /s2s_devel/ecmf/enfh/back  :emosMSG:[16:21:22 11.11.2014] --requeue force /s2s_devel/ecmf/enfh/back  :marmMSG:[16:28:32 11.11.2014 [...]
+suite limits #  begun:1 state:complete flag:message suspended:1
+  defstatus complete
+  limit archive 3
+  calendar initTime:2014-Feb-20 09:26:31 suiteTime:2014-Sep-24 13:36:00 duration:6484:09:29 initLocalTime:2014-Feb-20 09:26:31 lastTime:2014-Nov-17 13:36:00 calendarIncrement:00:01:00
+endsuite
+suite tigge_lam #  begun:1 state:queued dur:9742:11:35 flag:message,no_reque suspended:1
+  defstatus suspended
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/migrate/label_bug.def b/ecflow_4_0_7/Pyext/migrate/label_bug.def
new file mode 100644
index 0000000..1bd8bc3
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/label_bug.def
@@ -0,0 +1,11 @@
+# 3.1.7
+defs_state MIGRATE state>:aborted flag:late,message state_change:2058963 modify_change:1954
+  edit ECF_INCLUDE '/tmp/map/work/p4/merlin/workspace/MyProject/Pyext/test/data/CUSTOMER/ECF_HOME/includes'
+  history /test MSG:[11:40:24 20.9.2013] --replace=/test <empty> parent  :mapMSG:[11:41:01 20.9.2013] --replace=/test <empty> parent  :mapMSG:[11:51:53 20.9.2013] --replace=/test <empty> parent  :mapMSG:[11:52:53 20.9.2013] --replace=/test <empty> parent  :mapMSG:[11:53:24 20.9.2013] --replace=/test <empty> parent  :mapMSG:[11:54:51 20.9.2013] --replace=/test <empty> parent  :map
+suite made_up
+    label info ""
+    label info "have you? set START_LOBSVR=1 in the task, once, to launch the logserver,
+setup ssh login
+created remote /tmp/map/cray"
+  zombie ecf:fob:label:3600 
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/migrate/no_migration.def b/ecflow_4_0_7/Pyext/migrate/no_migration.def
new file mode 100644
index 0000000..e168061
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/no_migration.def
@@ -0,0 +1,11 @@
+# 3.1.7
+defs_state MIGRATE state>:aborted flag:late,message state_change:983039 modify_change:1018
+  edit SLEEP '10'
+suite suite #  begun:1 state:aborted dur:01:29:57 flag:message,no_reque
+   task a
+   task b
+endsuite
+suite made_up
+   task a
+   task b
+endsuite
diff --git a/ecflow_4_0_7/Pyext/migrate/py_u_TestMigrate.py b/ecflow_4_0_7/Pyext/migrate/py_u_TestMigrate.py
new file mode 100644
index 0000000..69d4bf7
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/py_u_TestMigrate.py
@@ -0,0 +1,189 @@
+
+import os
+import ecflow_migrate
+import unittest
+import filecmp
+
+def get_parent_dir(file_path):
+    return os.path.dirname(file_path)
+
+def get_root_source_dir():
+    cwd = os.getcwd()
+    #print "get_root_source_dir from: " + cwd
+    while (1):
+        # Get to directory that has ecflow
+        head, tail = os.path.split(cwd)
+        #print "   tail:" + tail
+        if tail.find("ecflow") != -1 :
+            
+            # bjam, already at the source directory
+            if os.path.exists(cwd + "/VERSION.cmake"): 
+                #print "   Found VERSION.cmake in " + cwd
+                return cwd
+        
+            # in cmake, we may be in the build directory, hence we need to determine source directory
+            file = cwd + "/CTestTestfile.cmake"
+            print "   searching for " + file
+            if os.path.exists(file):
+                # determine path by looking into this file:
+                for line in open(file):
+                    ## Source directory: /tmp/ma0/clientRoot/workspace/working-directory/ecflow/Acore
+                    if line.find("Source directory"):
+                        tokens = line.split()
+                        if len(tokens) == 4:
+                            return tokens[3]
+                raise RuntimeError("ERROR could not find Source directory in CTestTestfile.cmake")
+            else:
+                raise RuntimeError("ERROR could not find file CTestTestfile.cmake in " + cwd)
+                
+        cwd = head
+    return cwd
+
+
+
+# These tests the migration for  ecflow < 318 to ecflow 318
+#
+# In ecflow_client --migrate, we can get abort reason to span multiple line, hence messing up load
+#
+class TestMigrate318(unittest.TestCase):
+    def setUp(self):
+        # perform setup actions if any
+        self.workspace_dir = get_root_source_dir()
+        #print "setup : " + self.workspace_dir
+        
+    def tearDown(self):
+        # Perform clean -up actions if any
+        pass
+    
+    def locate(self,file):
+        return self.workspace_dir + "/Pyext/" + file
+    
+    def testMigrateVersionNumber(self):
+        list_of_defs_lines =[ "# 3.1.2"]
+  
+        mig = ecflow_migrate.Migrator(list_of_defs_lines)
+        self.assertEqual(mig.version_number_as_integer(0), 312,"expected version 3.1.2")
+  
+        list_of_defs_lines =[ "# "]
+        mig = ecflow_migrate.Migrator(list_of_defs_lines)
+        self.assertEqual(mig.version_number_as_integer(10), 10,"Expected 10, since valid version not provided")
+  
+    def test_no_migration(self):
+        migration_count = ecflow_migrate.do_migrate(self.locate("migrate/no_migration.def"))
+        self.assertEqual(migration_count,0,"Expected no migration")
+        self.assertTrue(filecmp.cmp(self.locate("migrate/no_migration.def"),self.locate("migrate/no_migration.mig")))
+        # remove the generated file
+        try: os.remove(self.locate("migrate/no_migration.mig"))
+        except: pass
+   
+# ==============================================================================================
+    # Test for abort bug
+       
+    def test_normal_abort_case(self):
+        list_of_defs_lines = [ "# 3.1.2", "task task abort<: aa >abort\n" ]      
+        abort_migrator = ecflow_migrate.MigrateForTaskAbort(list_of_defs_lines)
+        abort_migrator.migrate(318)
+          
+        expected_output_lines = ["# 3.1.2", "task task abort<: aa >abort\n"]
+        self.assertEqual(abort_migrator.output_lines(),expected_output_lines)
+    
+    def test_task_abort_reason_bug_simple(self):
+        list_of_defs_lines = ["# 3.1.2", "task task abort<: aa\n",">abort\n" ] 
+        abort_migrator = ecflow_migrate.MigrateForTaskAbort(list_of_defs_lines)
+        abort_migrator.migrate(318)
+       
+        expected_output_lines = ["# 3.1.2","task task abort<: aa >abort\n"]
+        self.assertEqual(abort_migrator.output_lines(),expected_output_lines)
+   
+    def test_task_abort_reason_bug(self):
+        # In ecflow_client --migrate, we can get abort reason to span multiple line, hence messing up load
+        list_of_defs_lines = ["# 3.1.2","task task # passwd:jxX0gIbR abort<:   Script for /suite/family/task can not be found:\n",
+                              "line2\n", "line3\n",">abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script\n" ]
+           
+        abort_migrator = ecflow_migrate.MigrateForTaskAbort(list_of_defs_lines)
+        abort_migrator.migrate(318)
+            
+        expected_output_lines = ["# 3.1.2","task task # passwd:jxX0gIbR abort<:   Script for /suite/family/task can not be found: line2 line3 >abort try:2 state:aborted dur:02:19:57 flag:task_aborted,no_script\n"]
+        self.assertEqual(abort_migrator.output_lines(),expected_output_lines)
+            
+    def test_migrate_abort_file(self):
+        migration_count = ecflow_migrate.do_migrate(self.locate("migrate/aborted_reason_bug.def"))
+        self.assertEqual(migration_count,1,"Expected defs file to be migrated")
+                   
+        # remove the generated file
+        try: os.remove(self.locate("migrate/aborted_reason_bug.mig"))
+        except: pass
+           
+# ===============================================================================================
+   
+    def test_normal_label(self):
+        list_of_defs_lines = ["# 3.1.2","label name \"value\"\n" ]      
+  
+        migrator = ecflow_migrate.MigrateForLabel(list_of_defs_lines)
+        migrator.migrate(319)
+      
+        expected_output_lines = ["# 3.1.2","label name \"value\"\n" ]
+        self.assertEqual(migrator.output_lines(),expected_output_lines)
+   
+    def test_label_over_multiple_lines(self):
+        list_of_defs_lines = ["# 3.1.2","label name \"value1\n", "value2\n", "value3\"\n" ]  
+          
+        migrator = ecflow_migrate.MigrateForLabel(list_of_defs_lines)
+        migrator.migrate(319)
+      
+        expected_output_lines = ["# 3.1.2","label name \"value1value2value3\"\n" ]
+        self.assertEqual(migrator.output_lines(),expected_output_lines)
+          
+    def test_label_over_multiple_lines_with_state(self):
+        list_of_defs_lines = ["# 3.1.2","label name \"value1\n", "value2\n", "value3\" # \"value4\n", "value5\"\n" ]  
+          
+        migrator = ecflow_migrate.MigrateForLabel(list_of_defs_lines)
+        migrator.migrate(319)
+      
+        expected_output_lines = ["# 3.1.2","label name \"value1value2value3\" # \"value4value5\"\n" ]
+        self.assertEqual(migrator.output_lines(),expected_output_lines)
+   
+   
+    def test_migrate_label_file(self):
+        migration_count = ecflow_migrate.do_migrate(self.locate("migrate/label_bug.def"))
+        self.assertEqual(migration_count,1,"Expected defs file to be migrated")
+                   
+        # remove the generated file
+        try: os.remove(self.locate("migrate/label_bug.mig"))
+        except: pass
+  
+    def test_migrate_variable_file(self):
+        migration_count = ecflow_migrate.do_migrate(self.locate("migrate/variable_bug.def"))
+        self.assertEqual(migration_count,1,"Expected defs file to be migrated")
+                   
+        # remove the generated file
+        try: os.remove(self.locate("migrate/variable_bug.mig"))
+        except: pass
+   
+# ====================================================================================================
+# test both together
+   
+    def test_migrate_abort_and_label(self):
+        migration_count = ecflow_migrate.do_migrate(self.locate("migrate/abort_and_label_bug.def"))
+        self.assertEqual(migration_count,2,"Expected 2 migrations, one for abort and one for label")
+                   
+        # remove the generated file
+        try: os.remove(self.locate("migrate/abort_and_label_bug.mig"))
+        except: pass
+           
+#====================================================================================================
+#test history
+ 
+    def test_migrate_history(self):
+        print "test_migrate_history"
+        migration_count = ecflow_migrate.do_migrate(self.locate("migrate/history_bug.def"))
+        self.assertEqual(migration_count,1,"Expected 1 migrations,for history")
+                 
+        # remove the generated file
+        try: os.remove(self.locate("migrate/history_bug.mig"))
+        except: pass
+
+#run the tests 
+if __name__  == '__main__':
+    #print "Current working directory: " + os.getcwd()
+    unittest.main()
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/migrate/variable_bug.def b/ecflow_4_0_7/Pyext/migrate/variable_bug.def
new file mode 100644
index 0000000..c3c3c1e
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/migrate/variable_bug.def
@@ -0,0 +1,11 @@
+# 3.0.0
+suite s
+   task q2diss
+      defstatus complete
+      late -s +00:05 -c +00:15
+      trigger pdb==complete 
+      edit ECF_URL_CMD '${BROWSER:=firefox} -remote 'openURL(%URL%'
+      edit EMOS_TYPE '  family prod_wparam
+  endfamily
+'
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/samples/ListVariables.py b/ecflow_4_0_7/Pyext/samples/ListVariables.py
new file mode 100755
index 0000000..0861b1f
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/samples/ListVariables.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python2.7
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+import ecflow
+import argparse # for argument parsing     
+
+if __name__ == "__main__":
+    
+    DESC = """Will list variables for any node
+              Usage:
+                Example1: List all the server variables
+                   ListVariables.py --host cca --port 4141 --path /
+                   
+                Example2: List the variables for the given node
+                   ListVariables.py --host cca --port 4141 --path /path/to/node
+            """    
+    PARSER = argparse.ArgumentParser(description=DESC,  
+                                     formatter_class=argparse.RawDescriptionHelpFormatter)
+    PARSER.add_argument('--host', default="localhost",   
+                        help="The name of the host machine, defaults to 'localhost'")
+    PARSER.add_argument('--port', default="3141",   
+                        help="The port on the host, defaults to 3141")
+    PARSER.add_argument('--path', default="/",   
+                        help="The path to the node. i.e /suite/family/task")
+    ARGS = PARSER.parse_args()
+    #print ARGS    
+    
+    # ===========================================================================
+    CL = ecflow.Client(ARGS.host, ARGS.port)
+    try:
+        CL.ping() 
+
+        # get the incremental changes, and merge with defs stored on the Client 
+        CL.sync_local()
+        
+        # check to see if definition exists in the server
+        defs = CL.get_defs()
+        if defs == None :
+            print "No definition found, exiting..."
+            exit(0) 
+            
+        # print defs;
+        if ARGS.path == "/":
+            for var in defs.server_variables:  print "edit " + var.name() + " '" + var.value() + "'"
+            for var in defs.user_variables:    print "edit " + var.name() + " '" + var.value() + "'"
+        else:
+            node = defs.find_abs_node(ARGS.path)
+            if node == None:  
+                print "No node found at path " + ARGS.path
+            else:
+                for var in node.variables:     print "edit " + var.name() + " '" + var.value() + "'"
+
+    except RuntimeError, ex:
+        print "Error: " + str(ex)
+        print "Check host and port number are correct."
diff --git a/ecflow_4_0_7/Pyext/samples/TestBench.py b/ecflow_4_0_7/Pyext/samples/TestBench.py
new file mode 100644
index 0000000..875b23b
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/samples/TestBench.py
@@ -0,0 +1,200 @@
+#!/usr/bin/env python2.7
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# =============================================================================
+# Code for testing *any* definition
+#   Since any ad hoc definition will reference local directories in the
+#   ECF_ variables, we need to remove them and inject our own.
+#
+#   This script is re-runnable, and hence will delete suites in the server
+#   matching those in the input definition. Hence it is best to use this 
+#   script with a *test* server to avoid accidentally deleting existing suites 
+#   of the same name.
+# =============================================================================
+import ecflow
+import os       # for getenv
+import shutil   # used to remove directory tree
+import argparse # for argument parsing     
+
+def delete_variables_affecting_job_generation(node): 
+    """delete customer related ECF variables, these will point to directories
+       that don't exist. Its ok we will regenerate our own local ones"""
+    var = node.find_variable("ECF_HOME")
+    if not var.empty() :  
+        node.delete_variable("ECF_HOME")    
+    var = node.find_variable("ECF_FILES")
+    if not var.empty() :  
+        node.delete_variable("ECF_FILES")    
+    var = node.find_variable("ECF_INCLUDE")
+    if not var.empty() :  
+        node.delete_variable("ECF_INCLUDE")    
+    var = node.find_variable("ECF_JOB_CMD")
+    if not var.empty() :  
+        node.delete_variable("ECF_JOB_CMD")    
+    var = node.find_variable("ECF_KILL_CMD")
+    if not var.empty() :  
+        node.delete_variable("ECF_KILL_CMD")    
+    var = node.find_variable("ECF_STATUS_CMD")
+    if not var.empty() :  
+        node.delete_variable("ECF_STATUS_CMD")    
+    var = node.find_variable("ECF_OUT")
+    if not var.empty() :  
+        node.delete_variable("ECF_OUT")    
+      
+def traverse_container(node_container):
+    """Recursively traverse definition node hierarchy and delete
+       the variables that affect job generation.
+    """
+    delete_variables_affecting_job_generation(node_container)
+    for node in node_container.nodes:
+        delete_variables_affecting_job_generation(node)
+        if not isinstance(node, ecflow.Task):
+            traverse_container(node)  
+    
+if __name__ == "__main__":
+    
+    DESC = """Will allow any definition to be loaded and played on the server
+            This is done by:
+            o Remove existing ECF_ variables that affect job generation. 
+              i.e variables that refer to customer specific directories are removed
+            o Allows ECF_HOME to specified, defaults to ./CUSTOMER/ECF_HOME
+            o Generates the scripts(.ecf files) automatically based on the definition.
+              i.e if a task has events,meters,labels then the client request for these are
+              automatically injected in the generated .ecf script files
+            o Will clear out existing data both on disk and on the server to allow 
+              multiple re-runs of this script. ** If this is an issue please use
+              a test server **
+            o All suites are put into a suspended state. This allows the GUI to resume them
+            o The server is restarted and suites are begun
+            This programs assumes that ecflow module is accessible.
+            """    
+    PARSER = argparse.ArgumentParser(description=DESC,  
+                                     formatter_class=argparse.RawDescriptionHelpFormatter)
+    PARSER.add_argument('defs_file', 
+                        help="The definition file")
+    PARSER.add_argument('--host', default="localhost",   
+                        help="The name of the host machine, defaults to 'localhost'")
+    PARSER.add_argument('--port', default="3141",   
+                        help="The port on the host, defaults to 3141")
+    PARSER.add_argument('--path', default="/",   
+                        help="replace only the node path in the suite")
+    PARSER.add_argument('--ecf_home', default=os.getcwd() + "/CUSTOMER/ECF_HOME",
+                        help="Directory to be used for generated scripts(ECF_HOME), defaults to ./CUSTOMER/ECF_HOME")
+    PARSER.add_argument('--verbose', nargs='?', default=False, const=True, type=bool,
+                        help="Show verbose output")
+    ARGS = PARSER.parse_args()
+    ARGS.defs_file = os.path.expandvars(ARGS.defs_file) # expand references to any environment variables
+    print ARGS    
+    
+    # If running on local work space, use /Pyext/test/data/CUSTOMER/ECF_HOME as ecf_home
+    if not ARGS.ecf_home:
+        if os.getenv("WK") == None:
+            print "No ecf_home specified. Please specify a writable directory"
+            exit(1)
+        ARGS.ecf_home = os.getenv("WK") + "/Pyext/test/data/CUSTOMER/ECF_HOME"
+        if ARGS.verbose:
+            print "Workspace is defined" 
+            print "using /Client/bin/gcc\-4.5/debug/ecflow_client"
+
+    if ARGS.verbose:
+        print "Using ECF_HOME=" + ARGS.ecf_home
+         
+    if ARGS.verbose: 
+        print "\nloading the definition from the input arguments(" + ARGS.defs_file + ")\n"
+    try:
+        DEFS = ecflow.Defs(ARGS.defs_file)
+    except RuntimeError, ex:
+        print "   ecflow.Defs(" + ARGS.defs_file + ") failed:\n" + str(ex)
+        exit(1)
+    
+    if ARGS.verbose: 
+        print "remove test data associated with the DEFS, so we start fresh, Allows rerun"
+    for suite in DEFS.suites:
+        dir_to_remove = ARGS.ecf_home + suite.get_abs_node_path()
+        if ARGS.verbose: 
+            print "   Deleting directory: " + dir_to_remove + "\n"
+        shutil.rmtree(dir_to_remove, True)  
+        
+    if ARGS.verbose: 
+        print "remove remote reference to ECF_HOME and ECF_INCLUDE, since we inject or own\n"
+    for suite in DEFS.suites:
+        traverse_container(suite)
+  
+    if ARGS.verbose: 
+        print "add variables required for script generation, for all suites\n"
+    DEFS.add_variable("ECF_HOME", ARGS.ecf_home)
+    if os.getenv("WK") != None: 
+        if os.path.exists(os.getenv("WK") + "/Client/bin/gcc\-4.5/debug/ecflow_client"):
+            DEFS.add_variable("ECF_CLIENT_EXE_PATH", os.getenv("WK") + "/Client/bin/gcc\-4.5/debug/ecflow_client")
+        else:
+            DEFS.add_variable("ECF_CLIENT_EXE_PATH", os.getenv("WK") + "/Client/bin/gcc\-4.5/release/ecflow_client")            
+    DEFS.add_variable("SLEEP", "10")  # not strictly required since default is 1 second
+    DEFS.add_variable("ECF_INCLUDE", ARGS.ecf_home + "/includes")
+
+
+    if ARGS.verbose: 
+        print "Place all suites into suspended state, so they can be started by the GUI\n"  
+    for suite in DEFS.suites:
+        suite.add_defstatus(ecflow.DState.suspended)
+    
+    # ecflow.PrintStyle.set_style(ecflow.Style.STATE)
+    if ARGS.verbose: 
+        print DEFS
+
+    if ARGS.verbose: 
+        print "Generating script files(.ecf) from the definition"
+    DEFS.generate_scripts()
+
+    if ARGS.verbose: 
+        print "\nchecking script file generation, pre-processing & variable substitution\n"
+    JOB_CTRL = ecflow.JobCreationCtrl()
+    DEFS.check_job_creation(JOB_CTRL)       
+    assert len(JOB_CTRL.get_error_msg()) == 0, JOB_CTRL.get_error_msg()
+    
+    # ===========================================================================
+    CL = ecflow.Client(ARGS.host, ARGS.port)
+    try:
+        if ARGS.verbose: 
+            print "check server " + ARGS.host + ":" + ARGS.port + " is running"
+        CL.ping() 
+
+        if ARGS.verbose: 
+            print "Server is already running. re-start the server"
+        CL.restart_server() 
+
+        if ARGS.verbose: 
+            print "Remove suites associated with this DEFS, allows rerun *******************************************"
+        for suite in DEFS.suites:
+            try:
+                CL.delete(suite.get_abs_node_path(), True)
+            except RuntimeError, ex:
+                pass # For first run this will fail, hence ignore
+        
+        if ARGS.verbose: 
+            print "Load the definition into " + ARGS.host + ":" + ARGS.port
+        if ARGS.path == "/":
+            CL.load(DEFS) 
+        else:
+            CL.replace(ARGS.path, DEFS)
+
+        if ARGS.verbose: 
+            print "Begin all suites. They should be suspended."
+        print "Loaded suites:"
+        for suite in DEFS.suites:
+            CL.begin_suite(suite.name())
+            print "   " + suite.name()
+        print "into server " + ARGS.host \
+                             + ":" + ARGS.port + ", please view the playable suites in the GUI"
+    except RuntimeError, ex:
+        print "Error: " + str(ex)
diff --git a/ecflow_4_0_7/Pyext/samples/TestJobGenPerf.py b/ecflow_4_0_7/Pyext/samples/TestJobGenPerf.py
new file mode 100644
index 0000000..dd7c6e2
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/samples/TestJobGenPerf.py
@@ -0,0 +1,155 @@
+#!/usr/bin/env python2.7
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# =============================================================================
+# Code for testing *any* definition
+#   Since any ad hoc definition will reference local directories in the
+#   ECF_ variables, we need to remove them and inject our own.
+#
+#   This test was created aid the performance testing of job generation
+#   It is tied to AParser/test/TestJobGenPerf.cpp
+# =============================================================================
+import ecflow
+import os       # for getenv
+import shutil   # used to remove directory tree
+import argparse # for argument parsing     
+
+def delete_variables_affecting_job_generation(node): 
+    """delete customer related ECF variables, these will point to directories
+       that don't exist. Its ok we will regenerate our own local ones"""
+    var = node.find_variable("ECF_HOME")
+    if not var.empty() :  
+        node.delete_variable("ECF_HOME")    
+    var = node.find_variable("ECF_FILES")
+    if not var.empty() :  
+        node.delete_variable("ECF_FILES")    
+    var = node.find_variable("ECF_INCLUDE")
+    if not var.empty() :  
+        node.delete_variable("ECF_INCLUDE")    
+    var = node.find_variable("ECF_JOB_CMD")
+    if not var.empty() :  
+        node.delete_variable("ECF_JOB_CMD")    
+    var = node.find_variable("ECF_KILL_CMD")
+    if not var.empty() :  
+        node.delete_variable("ECF_KILL_CMD")    
+    var = node.find_variable("ECF_STATUS_CMD")
+    if not var.empty() :  
+        node.delete_variable("ECF_STATUS_CMD")    
+    var = node.find_variable("ECF_OUT")
+    if not var.empty() :  
+        node.delete_variable("ECF_OUT")    
+      
+def traverse_container(node_container):
+    """Recursively traverse definition node hierarchy and delete
+       the variables that affect job generation.
+    """
+    delete_variables_affecting_job_generation(node_container)
+    for node in node_container.nodes:
+        delete_variables_affecting_job_generation(node)
+        if not isinstance(node, ecflow.Task):
+            traverse_container(node)  
+    
+if __name__ == "__main__":
+    
+    DESC = """Will allow any definition to be loaded and played on the server
+            This is done by:
+            o Remove existing ECF_ variables that affect job generation. 
+              i.e variables that refer to customer specific directories are removed
+            o Allows ECF_HOME to specified, defaults to ./CUSTOMER/ECF_HOME
+            o Generates the scripts(.ecf files) automatically based on the definition.
+              i.e if a task has events,meters,labels then the client request for these are
+              automatically injected in the generated .ecf script files
+            o Will clear out existing data both on disk and on the server to allow 
+              multiple re-runs of this script. ** If this is an issue please use
+              a test server **
+            This programs assumes that ecflow module is accessible.
+            """    
+    PARSER = argparse.ArgumentParser(description=DESC,  
+                                     formatter_class=argparse.RawDescriptionHelpFormatter)
+    PARSER.add_argument('defs_file', 
+                        help="The definition file")
+    PARSER.add_argument('--ecf_home', default="/var/tmp/ma0/ECFLOW_TEST/TestJobGenPerf/ECF_HOME",
+                        help="Directory to be used for generated scripts(ECF_HOME), defaults to /var/tmp/ma0/ECFLOW_TEST/TestJobGenPerf/ECF_HOME")
+    PARSER.add_argument('--verbose', nargs='?', default=False, const=True, type=bool,
+                        help="Show verbose output")
+    ARGS = PARSER.parse_args()
+    ARGS.defs_file = os.path.expandvars(ARGS.defs_file) # expand references to any environment variables
+    print ARGS    
+    
+    # If running on local work space, use /Pyext/test/data/CUSTOMER/ECF_HOME as ecf_home
+    if not ARGS.ecf_home:
+        if os.getenv("WK") == None:
+            print "No ecf_home specified. Please specify a writable directory"
+            exit(1)
+        ARGS.ecf_home = "/var/tmp/ma0/ECFLOW_TEST/TestJobGenPerf/ECF_HOME"
+        if ARGS.verbose:
+            print "Workspace is defined" 
+            print "using /Client/bin/gcc\-4.5/debug/ecflow_client"
+
+    print "Using ECF_HOME=" + ARGS.ecf_home
+    print "removing directory " + ARGS.ecf_home
+    try:
+        shutil.rmtree(ARGS.ecf_home)   
+    except:
+        pass   
+        
+    if not os.path.exists(ARGS.ecf_home): 
+        print ARGS.ecf_home + " directory does not exist, creating"
+        os.makedirs(ARGS.ecf_home)
+
+    print "\nloading the definition from the input arguments(" + ARGS.defs_file + ")\n"
+    
+    try:
+        DEFS = ecflow.Defs(ARGS.defs_file)
+    except RuntimeError, ex:
+        print "   ecflow.Defs(" + ARGS.defs_file + ") failed:\n" + str(ex)
+        exit(1)
+    
+    if ARGS.verbose: 
+        print "remove test data associated with the DEFS, so we start fresh, Allows rerun"
+    for suite in DEFS.suites:
+        dir_to_remove = ARGS.ecf_home + suite.get_abs_node_path()
+        if ARGS.verbose: 
+            print "   Deleting directory: " + dir_to_remove + "\n"
+        shutil.rmtree(dir_to_remove, True)  
+        
+    if ARGS.verbose: 
+        print "remove remote reference to ECF_HOME and ECF_INCLUDE, since we inject or own\n"
+    for suite in DEFS.suites:
+        print "add variables required for script generation, for all suites\n"
+        traverse_container(suite)
+  
+        suite.add_variable("ECF_HOME", ARGS.ecf_home)
+        suite.add_variable("ECF_INCLUDE", ARGS.ecf_home + "/includes")
+        suite.add_variable("ECF_CLIENT_EXE_PATH", os.getenv("WK") + "/Client/bin/gcc\-4.5/debug/ecflow_client")
+        suite.add_variable("SLEEP", "10")  # not strictly required since default is 1 second
+
+
+    
+    # ecflow.PrintStyle.set_style(ecflow.Style.STATE)
+    #if ARGS.verbose: 
+    #print DEFS
+    DEFS.generate_scripts()
+
+    if ARGS.verbose: 
+        print "\nchecking script file generation, pre-processing & variable substitution\n"
+    JOB_CTRL = ecflow.JobCreationCtrl()
+    DEFS.check_job_creation(JOB_CTRL)       
+    assert len(JOB_CTRL.get_error_msg()) == 0, JOB_CTRL.get_error_msg()
+    
+    
+    newDefs = ARGS.ecf_home + "/../" + os.path.basename(ARGS.defs_file)
+    print "Saving modified defs as " + newDefs 
+    DEFS.save_as_defs(newDefs)
+
diff --git a/ecflow_4_0_7/Pyext/samples/TestServerGetDefs.py b/ecflow_4_0_7/Pyext/samples/TestServerGetDefs.py
new file mode 100644
index 0000000..ca54b0d
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/samples/TestServerGetDefs.py
@@ -0,0 +1,59 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# This test is a simple client that, repeatedly calls gets defs
+# This is used to stress test the server to determine how many defs
+# can be called before the server gets overloaded
+
+import datetime
+import time, sys
+from ecflow import Client   
+      
+def main(ci,inc = 2):
+    while True:
+        start_time = datetime.datetime.now()
+        try:
+            ci.get_server_defs() 
+        except RuntimeError, e : 
+            print "Error:" + str(e)
+
+        print "get_server_defs took: " + str(datetime.datetime.now() - start_time)
+        time.sleep(inc)
+
+if __name__ == "__main__":
+
+    numargs = len(sys.argv) - 1
+    #print "numargs = " + str(numargs)
+    #i = 0;
+    #while i < len(sys.argv):
+        #print "arg " + str(i) + ": " + sys.argv[i]
+        #i =  i + 1
+        
+    if  numargs > 3:
+        print "usage: " + sys.argv[0] + " host port  seconds_delay"
+        sys.exit(1)
+        
+    port = "3142"
+    host = "localhost"
+    inc  = 1
+    if numargs >= 1:  host = sys.argv[1];
+    if numargs >= 2:  port = sys.argv[2]
+    if numargs >= 3:  inc = int(sys.argv[3])
+        
+    #print "host(" + host + ") port(" + port + ") delay between get_server_defs(" + str(inc)   +")"
+
+    ci = Client(host,port)
+    ci.ping()    
+
+    main(ci,inc)
+    
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/samples/ecf.py b/ecflow_4_0_7/Pyext/samples/ecf.py
new file mode 100755
index 0000000..61af672
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/samples/ecf.py
@@ -0,0 +1,1012 @@
+#!/usr/bin/env python
+# This software is provided under the ECMWF standard software license agreement.
+""" a layer over raw ecflow api 
+
+use 'export ECF_DEBUG_LEVEL=10' to remove warning message related to
+variables overwrite
+
+"""
+
+import pwd, os, unittest
+try:
+  from ecflow import TimeSlot
+  from ecflow import JobCreationCtrl as JobCreationCtrl
+  from ecflow import ChildCmdType
+  from ecflow import ZombieType, ZombieAttr, ZombieUserActionType
+except: print "# ecf.py cannot import few types" 
+
+import ecflow
+ecflow.Ecf.set_debug_level(3)
+
+DEBUG = 0
+DECORATE = "ALL"
+# DECORATE = "ONLY_TRIGGER"
+# DECORATE = "NO_TRIGGER"
+# DECORATE = "ONLY_EVENT"
+# DECORATE = "NO_ATTRIBUTE"
+
+USE_TIME = True
+USE_LATE = False
+USE_TRIGGER = True
+USE_LIMIT = True
+
+if DECORATE == "NO_TRIGGER":
+    USE_TRIGGER = False
+    USE_LIMIT = True
+    USE_EVENT = True
+# elif DECORATE == "ONLY_TRIGGER":
+#     USE_TRIGGER = True 
+#     USE_LIMIT = False 
+#     USE_EVENT = False
+# elif DECORATE == "NO_ATTRIBUTE":
+#     USE_TRIGGER = False
+#     USE_LIMIT = False
+#     USE_EVENT = False
+# elif DECORATE == "ONLY_EVENT":
+#     USE_TRIGGER = False
+#     USE_LIMIT = False
+#     USE_EVENT = True
+elif DECORATE == "ALL":
+    USE_TRIGGER = True
+    USE_LIMIT = True
+    USE_EVENT = True
+else: raise BaseException
+
+def get_username():
+    return pwd.getpwuid( os.getuid() )[ 0 ]
+def get_uid():
+    return pwd.getpwnam(get_username()).pw_uid
+
+def translate(name, value=None):
+    """ Translate from sms to ecflow """
+    import sms2ecf, sys
+    def is_sms():
+        if sys.argv[-1] in ( # "localhost"
+            "sms", "od3", "ode","pikachu","ibis","map", "od", "od2", ):
+            sms2ecf.ECF_MODE = "sms"
+            return True
+        return sms2ecf.ECF_MODE == "sms"
+    if is_sms():
+        sms2ecf.ECF_MODE = "sms"
+        return sms2ecf.translate(name, value)
+    return name, value
+
+class State:
+    """ this class aims at affording a user the possibility to add Triggers as
+    t1 = Task("t1")
+    Task("ts").add(Trigger(t1 == COMPLETE))
+
+    SUBMITTED, ACTIVE, SUSPENDED, ABORTED, QUEUED, COMPLETE, UNKNOWN
+    are instance of this class.
+    """
+
+    def __init__(self, state):
+        """ store the status """
+        self.state = str(state)
+    
+    def __str__(self):
+        """ translate into string """
+        return "%s" % self.state
+
+    def __eq__(self, arg):
+        """ when == is used, we should care about task name starting with 0-9"""
+        if type(arg) == str:
+            add = ""
+            if type(arg[0]) == int:
+                add = "./"                
+            return add + arg + " == " + self.state
+        elif isinstance(arg, ecflow.Node):
+            return arg.get_abs_node_path() + " == " + self.state
+        return False
+
+    def __ne__(self, arg):
+        """ aka != """
+        if type(arg) == str:
+            add = ""
+            if type(arg[0]) == int:
+                add = "./"                
+            return add + arg + " != " + self.state
+        elif isinstance(arg, ecflow.Node):
+            return arg.get_abs_node_path() + " != " + self.state
+        return False
+
+    def value(self):
+        """ return state """
+        return self.state
+
+    def eval(self, node):
+        """ return state """
+        return self.state == node.get_state()
+
+
+
+SUBMITTED = State("submitted")
+ACTIVE    = State("active")
+SUSPENDED = State("suspended")
+ABORTED   = State("aborted")
+QUEUED    = State("queued")
+COMPLETE  = State("complete")
+UNKNOWN   = State("unknown")
+
+class Attribute(object):
+    """ generic attribute to be attached to a node"""
+    def add_to(self, node):
+        """ use polymorphism to attach attribute to a node"""
+        pass
+
+class Variable(Attribute, ecflow.Variable):
+    """ filter variables to be attached to a node, may alter its name SMS-ECF"""
+    def add_to(self, node):
+        """ add_variable"""
+        keyt, valt = translate(self.name(), self.value())
+        if "/tc1/emos_es" in valt: raise BaseException # FIXME
+        node.add_variable(keyt, valt)
+
+class Label(Attribute, ecflow.Label):
+    """ wrap around label"""
+    def add_to(self, node):
+        """ add_label"""
+        node.add_label(self)
+
+class Meter(Attribute, ecflow.Meter):
+    """ wrap around meter"""
+    def add_to(self, node):
+        """ add_meter"""
+        node.add_meter(self)
+
+class Event(Attribute, ecflow.Event):
+    """ wrap around event"""
+    def add_to(self, node):
+        """ add_event"""
+        node.add_event(self)
+
+class InLimit(Attribute):
+    """ a class to host a path for a limit
+        silently ignore if USE_LIMIT is False, 
+        (in debug mode) """
+
+    def __init__(self, fullpath):
+        self.data = None
+        if USE_LIMIT: 
+            try: path, name = fullpath.split(":")
+            except: name = fullpath; path = ""
+            if name is None: raise BaseException
+            self.data  = ecflow.InLimit(name, path)
+            self.path_ = path
+            self.name_ = name
+
+    def add_to(self, node):
+        """ add_inlimit"""
+        if USE_LIMIT and self.data is None: raise BaseException
+        if  USE_LIMIT and self.data is not None:
+            node.add_inlimit(self.data)
+
+    def value(self):        
+        """ get limit fullpath-name """
+        return self.path_ + ":" + self.name_
+
+    def name(self):
+        """ get limit name """
+        return self.name_
+
+class Inlimit(InLimit):
+    def __init__(self, fullpath):
+        super(Inlimit, self).__init__(fullpath)
+
+class Trigger(Attribute):
+    """ add trigger (string, list of task names, or directly
+           expression and: and'ed (True) or or'ed (False) unk: add or
+           [name]==unknown for RD
+    """
+    def __init__(self, expr, unk=False, anded=True):
+        self.expr = None
+        if expr is None: 
+            return
+        if expr == "": 
+            return
+        if type(expr) == str:
+            # self.expr = ecflow.Expression(expr)
+            self.expr = expr
+            return
+        if type(expr) == tuple:
+            prep = list(expr)
+            expr = prep
+
+        if type(expr) == list:
+            for index, name in enumerate(expr):
+                if name == None: 
+                    continue
+                pre = ""
+
+                if type(name) in (Node, Task, Family, Suite):
+                    fullname = name.fullname()
+                    name = fullname
+                elif type(name) in (ecflow.Task, ecflow.Family):
+                    name = name.name()
+                else: pass
+
+                if name[0].isdigit(): pre = "./" # "0123456789":
+
+                if ':' in name:
+                    item = pre + name
+                else:
+                    item = pre + "%s == complete" % name
+                    if unk: item += " or %s%s==unknown" % (pre, name)
+                    else: pass
+
+                if item is None: self.expr = None
+                elif index == 0 or self.expr is None:
+                    # 20131125 # self.expr = ecflow.Expression(item)
+                    self.expr = item
+                elif item is None: return
+                else: # self.expr.add(ecflow.PartExpression(item,anded))
+                    self.expr += " and %s" % item
+
+        elif type(expr) in (ecflow.Expression, 
+                            ecflow.PartExpression):
+            self.expr = ecflow.Expression(str(item))
+        else: print type(expr); raise Exception("what? trigger?")
+
+    def add_to(self, node):
+        if not USE_TRIGGER:
+            return
+        if self.expr is None:
+            return
+        if node.get_trigger() is None:
+            node.add_trigger(self.expr)
+        else: node.add_part_trigger(ecflow.PartExpression(self.expr, True))
+
+class TriggerAnd(Trigger):
+    def __init__(self, expr, unk=False, anded=True):
+        self.expr = expr
+        if (not ":" in expr and 
+            not " eq " in expr and 
+            not "==" in expr):
+            self.expr += " eq complete"
+    def add_to(self, node):        
+        node.add_part_trigger(ecflow.PartExpression(self.expr, True))
+
+class TriggerImpossible(Trigger):
+    """ attribute to be added to node when it is not expected to run
+    any task"""
+
+    def __init__(self):
+        """ add an 'impossible trigger', for a task not to run """
+        super(TriggerImpossible, self).__init__("1==0")
+
+class TriggerAlways(Trigger):
+    """ attribute to be added to node when it is not expected to run
+    any task"""
+
+    def __init__(self):
+        """ add an 'impossible trigger', for a task not to run """
+        super(TriggerAlways, self).__init__("1==1")
+
+class Complete(Trigger):
+    """ class to host complete expression, added later to a node"""
+    def __init__(self, expression, unk=False, anded=False):
+        super(Complete, self).__init__(expression, unk, anded)
+
+    def add_to(self, node):
+        if USE_TRIGGER and self.expr is not None:
+            node.add_complete(self.expr)
+
+class Clock(Attribute):
+    """ wrapper to add clock """
+    def __init__(self, arg):
+        if type(arg) == str:
+            hybrid = "hybrid" in arg
+            hhh, mmm, sss = [0, 0, 0]
+            try:
+                hhh, mmm, sss = arg.split(':')
+                self.data = ecflow.Clock(hhh, mmm, sss, hybrid)
+            except:
+                self.data = ecflow.Clock(hybrid)
+        else: self.data = ecflow.Clock(arg)
+
+    def add_to(self, node):
+        if type(node) != Suite:
+            print "WAR: clock can only be attached to suite node, "
+            print "WAR: clock is ignored"
+            return
+        node.add_clock(self.data)
+
+class AutoCancel(Attribute):
+    """ wrapper to add time """
+    def __init__(self, arg):
+        if type(arg) == str:
+            hhh, mmm = arg.split(':')
+            rel = '+' in arg
+            self.data = ecflow.Autocancel(int(hhh), int(mmm), rel)
+        else: self.data = ecflow.Autocancel(arg)
+
+    def add_to(self, node):
+        node.add_autocancel(self.data)
+
+class Time(Attribute):
+    """ wrapper to add time """
+    def __init__(self, arg):
+        self.data = arg
+
+    def add_to(self, node):
+        if USE_TIME and self.data is not None:
+            node.add_time(self.data)
+
+class Today(Time):
+    """ wrapper to add time """
+    def __init__(self, arg):
+        self.data = arg
+
+    def add_to(self, node):
+        if USE_TIME and self.data is not None:
+            node.add_today(self.data)
+
+class Cron(Time):
+    """ wrapper to add time """
+    def __init__(self, bes, wdays=None, days=None, months=None):
+        self.data = ecflow.Cron()
+
+        if not ("-w" in bes or "-m" in bes or "-d" in bes): 
+            self.data.set_time_series(bes); 
+            return
+
+        import argparse
+        parser = argparse.ArgumentParser()
+        parser.add_argument("-w", nargs='?', default=0, help= "weekdays")
+        parser.add_argument("-d", nargs='?', default=0, help= "days")
+        parser.add_argument("-m", nargs='?', default=0, help= "months")
+        parser.add_argument("arg", type=str, help= "begin end step")
+        parsed = parser.parse_args(bes.split())
+
+        if parsed.w: 
+            self.data.set_week_days([int(x) for x in parsed.w.split(',')])
+        if parsed.d: 
+            self.data.set_week_days([int(x) for x in parsed.d.split(',')])
+        if parsed.m:
+            self.data.set_months([int(x) for x in parsed.m.split(',')])
+        self.data.set_time_series(parsed.arg)
+
+    def add_to(self, node):
+        if USE_TIME and self.data is not None:
+            node.add_cron(self.data)
+        else: print "#WAR: ignoring: %s" % self.data
+
+class Date(Time):
+    """ wrapper to add date """
+
+    def __init__(self, arg, mask=False):
+        super(Date, self).__init__(arg)
+        self.mask = mask
+
+    def add_to(self, node):
+        if USE_TIME and self.data is not None:
+            ### ??? FIX, emos avoids dates, datasvc would not
+            if self.mask:
+                node.add_variable("DATEMASK", self.data)
+            else:
+                ddd, mmm, yyy = self.data.split('.')
+                if ddd == '*': ddd = 0
+                if mmm == '*': mmm = 0
+                if yyy == '*': yyy = 0
+
+                node.add_date(int(ddd), int(mmm), int(yyy))
+                # node.add_date(self.data)
+
+class Day(Date):
+    """ wrapper to add day """
+    def add_to(self, node):
+        if USE_TIME and self.data is not None:
+            # node.add_date(self.data) ### FIX
+            node.add_variable("WEEKDAY", self.data)
+
+class Defcomplete(Attribute):
+    """ wrapper to add defstatus complete """
+    def __init__(self):
+        pass
+
+    def add_to(self, node):
+        node.defstatus("complete")
+
+class Defstatus(Defcomplete):
+    """ add defstatus attribute"""
+    def __init__(self, kind):
+        if type(kind) == str:
+            kinds = {"suspended": ecflow.DState.suspended,
+                     "aborted": ecflow.DState.aborted,
+                     "complete": ecflow.DState.complete,
+                     "active": ecflow.DState.active,
+                     "submitted": ecflow.DState.submitted,
+                     "unknown": ecflow.DState.unknown,
+                     "queued": ecflow.DState.queued,
+                     }
+            self.data = kinds[kind]
+        else: self.data = kind
+
+    def add_to(self, node):
+        node.add_defstatus(self.data)
+
+class DefcompleteIf(Defcomplete):
+    """ wrapper to add conditional defstatus complete 
+    just change name to make it explicit
+    """
+    def __init__(self, arg=True):
+        # super(DefcompleteIf, self).__init__()
+        self.data = arg
+
+    def add_to(self, node):
+        if self.data:
+            node.defstatus("complete")
+        # else: node.defstatus("queued") # in comment to prevent
+        # overwrite when using multiple defcomplete
+
+class Limit(Attribute):
+    """ wrapper to add limit """
+
+    # name = None;     size = 1
+
+    def __init__(self, name=None, size=1):
+        self.name = name
+        self.size = size
+
+    def add_to(self, node):
+        if USE_LIMIT and self.name is not None:
+            if type(self.name) is dict:
+                for name, size in self.name.items():
+                    node.add_limit(name, size)
+            else: node.add_limit(self.name, self.size)
+
+class Late(Attribute):
+    """ wrapper around late, to be add'ed to families and tasks """
+
+    def __init__(self, arg):
+        self.data = None
+        if not USE_LATE: 
+            # print "#MSG: late is disabled"
+            return
+        sub = False
+        act = False
+        com = False
+        rel = False
+        self.data = ecflow.Late()
+        for item in arg.split(" "):
+            if   item == "-s": 
+                sub = True
+            elif item == "-c": 
+                com = True
+            elif item == "-a": 
+                act = True
+            else:
+                hour, mins = item.split(":")
+                rel = "+" in hour
+                if "+" in hour: hour= hour[1:]
+                if   sub: 
+                    self._add_sub(hour, mins)
+                elif com: 
+                    self._add_com(hour, mins, rel)
+                elif act: 
+                    self._add_act(hour, mins)
+                sub = False
+                act = False
+                com = False
+
+    def _add_sub(self, hour, mins):
+        """ submitted"""
+        self.data.submitted(ecflow.TimeSlot(int(hour), int(mins)))
+
+    def _add_com(self, hour, mins, rel):
+        """ complete"""
+        self.data.complete(ecflow.TimeSlot(int(hour), int(mins)), rel)
+
+    def _add_act(self, hour, mins):
+        """ active"""
+        self.data.active(ecflow.TimeSlot(int(hour), int(mins)))
+
+    def add_to(self, node):
+        if USE_LATE and self.data is not None:
+            node.add_late(self.data)
+
+class Variables(Attribute):
+    """ dedicated class to enable variable addition with different
+    syntax """
+    
+    def _set_tvar(self, key, val):        
+        """ facilitate to load a ecflow suite to SMS, translating
+        variable names"""
+        keyt, valt = translate(str(key), str(val))
+        if self.data is None:
+            self.data = Variable(keyt, valt)
+        else:
+            next = self.next
+            self.next = Variables(keyt, valt, next)
+
+    def __init__(self, __a=None, __b=None, __next=None, *args, **kwargs):
+        self.data = None
+        self.next = __next
+
+        if len(args) > 0:
+            if type(args) == list:
+                for item in args.iteritems():
+                    self._set_tvar(item.name(), item.value())
+            elif type(args) == tuple:
+                for key, val in args.items():
+                    self._set_tvar(key, val)
+            else: raise BaseException()
+        if len(kwargs) > 0: 
+            for key, val in kwargs.items():
+                self._set_tvar(key, val)
+        if type(__a) == dict:
+            for key, val in __a.items():
+                self._set_tvar(key, val)
+        elif type(__a) == tuple: raise BaseException()
+            # for key, val in __a.items(): self._set_tvar(key, val)
+        elif type(__a) == list: raise BaseException()
+        elif type(__a) == Variable: self.data = __a
+        elif __a is not None and __b is not None:
+            self._set_tvar(__a, __b)
+        elif __a is None and __b is None: pass
+        else: raise BaseException(__a, __b, __next, args, kwargs)
+
+    def add_to(self, node):
+        if self.data is not None:
+            node.add_variable(self.data)
+        if self.next is not None:
+            self.next.add_to(node)
+
+    def add(self, what): raise baseException(what.fullname())
+
+class Limits(Attribute):
+    """ dedicated class to enable limits addition with different syntax """
+    
+    def _set_tvar(self, key, val):        
+        """ append limits """
+        if self.data is None:
+            self.data = ecflow.Limit(key, val)
+        else:
+            next = self.next
+            self.next = Limits(key, val, next)
+
+    def __init__(self, __a=None, __b=None, __next=None, *args, **kwargs):
+        self.data = None
+        self.next = __next
+
+        if len(args) > 0:
+            if type(args) == list:
+                for item in args.iteritems():
+                    self._set_tvar(item.name(), item.value())
+            elif type(args) == tuple:
+                for key, val in args.items():
+                    self._set_tvar(key, val)
+        elif len(kwargs) > 0: 
+            for key, val in kwargs.items():
+                self._set_tvar(key, val)
+        elif type(__a) == dict:
+            for key in sorted(__a.iterkeys()):
+                self._set_tvar(key, __a[key])
+
+        if __a is not None and __b is not None:
+            self._set_tvar(__a, __b)
+
+    def add_to(self, node):
+        if self.data is not None:
+            node.add_limit(self.data)
+        if self.next is not None:
+            self.next.add_to(node)
+
+class Repeat(Attribute):
+    def __init__(self, name="YMD", start=20120101, end=21010101, step=1, kind="date"):
+       if kind == "date":
+           # print "# repeat", start, end, step, name, kind
+           self.data = ecflow.RepeatDate(name, int(start), int(end), 
+                                         int(step))
+       elif "int" in kind:
+           self.data = ecflow.RepeatInteger(name, int(start), int(end), int(step))
+       elif kind == "string":
+           self.data = ecflow.RepeatString(name, start)
+       elif "enum" in kind:
+           self.data = ecflow.RepeatEnumerated(name, start)
+       elif kind == "day":
+           self.data = ecflow.RepeatDay(step)        
+       else: self.data = None
+
+    def add_to(self, node):
+        if self.data is not None:
+            node.add_repeat(self.data)
+
+def If(test=True, then=None, otow=None):
+    """ enable Task("t1").add(If(test= (1==1),
+                                 then= Variables(ONE=1),
+                                 otow= Variables(TWO=2)))
+        appreciate that both branches are evaluated, using this If class
+        ie there is no 'dead code' as it is with python language 'if' structure
+
+        using If to distinguish od/rd mode request that both users share
+        the variables (parameter.py) and ecf.py
+                                 
+        otow: on the other way?
+        """
+    if test:
+        return then
+    return otow
+
+class Root(object): # from where Suite and Node derive
+    """ generic tree node """
+
+    def __str__(self):
+        if isinstance(self, ecflow.Node):
+            return self.fullname()
+        return str(self)
+
+    def __eq__(self, node):
+        if isinstance(self, ecflow.Node):
+            return "%s == " % self.fullname() + str(node)
+        return False
+
+    def __ne__(self, node):        
+        if isinstance(self, ecflow.Node):
+            return "%s != " % self.fullname() + str(node)
+        return False
+
+    def __and__(self, node):
+        if isinstance(self, ecflow.Node):
+            return "%s and " % self.fullname() + str(node)
+        return False
+
+    def __or__(self, node):
+        if isinstance(self, ecflow.Node):
+            return "%s or " % self.fullname() + str(node)
+        return False
+
+    def fullname(self):
+        """ simple syntax """
+        if isinstance(self, ecflow.Node):
+            return self.get_abs_node_path()
+        return str(self)
+    
+    def repeat(self, name="YMD", start=20120101, end=20321212, step=1,
+               kind="date"):
+        """ add repeat attribute"""
+        if kind == "date":
+            self.add_repeat(ecflow.RepeatDate(name, int(start), int(end), 
+                                              int(step)))
+        elif kind == "integer":
+            self.add_repeat(ecflow.RepeatInteger(name, int(start), int(end), int(step)))
+        elif kind == "string":
+            self.add_repeat(ecflow.RepeatString(name, start))
+        elif kind == "enumerated":
+            self.add_repeat(ecflow.RepeatEnumerated(name, start))
+        elif kind == "day":
+            self.add_repeat(ecflow.RepeatDay(step))
+        else: raise BaseException
+        return self
+
+    def defstatus(self, kind):
+        """ add defstatus attribute"""
+        status = kind
+        if type(kind) == str:
+            kinds = {"suspended": ecflow.DState.suspended,
+                     "aborted": ecflow.DState.aborted,
+                     "complete": ecflow.DState.complete,
+                     "active": ecflow.DState.active,
+                     "submitted": ecflow.DState.submitted,
+                     "unknown": ecflow.DState.unknown,
+                     "queued": ecflow.DState.queued,
+                     }
+            status = kinds[kind]
+        self.add_defstatus(status)
+        return self
+
+    def add(self, item=None, *args):
+        """ add a task, a family or an attribute """
+        if DEBUG: print self.fullname(), item, args
+
+        if item is not None:
+            if type(item) == tuple:
+                for val in item:
+                        self.add(val)
+            elif type(item) == list:
+                for val in item:
+                    self.add(val)
+            else:
+                try: item.add_to(self)
+                except Exception, exc: 
+                  raise BaseException("not yet", self, type(item), exc)
+
+        if len(args) > 0:
+            if type(args) == tuple:
+                for val in args:
+                    self.add(val)
+            elif type(args) == list:
+                for val in args:
+                    self.add(val)
+            else: raise BaseException()
+
+        if not isinstance(self, ecflow.Node): raise BaseException(
+          "you don't want that")
+
+        return self
+
+    def limit(self, name, size):
+        """ add limit attribute"""
+        if name is None: raise BaseException
+        self.add_limit(name, size)
+        return self
+
+    def inlimit(self, full_path):
+        """ add inlimit attribute"""
+        if not USE_LIMIT: 
+            return self
+
+        path, name = full_path.split(":")
+        if name is None: raise BaseException()
+        if path is None: raise BaseException()
+
+        self.add_inlimit(name, path)
+        return self
+
+class Node(Root): # from where Task and Family derive
+    """ Node class is shared by family and task """
+
+    def add_limits(self, __a = None, __b = None, **kwargs):
+        """ add limit dependency"""
+        if isinstance(__a, basestring):
+            self.add_limit(__a, __b)
+        elif isinstance(__a, dict):
+            assert __b is None
+            for key, val in __a.items():
+                self.add_limit(key, val)
+        for key, val in kwargs.items():
+            self.add_limit(key, val)
+        return self
+
+    def meter(self, name, start, end, threshold=None):
+        """ add meter attribute"""
+        if threshold == None:
+            threshold = end
+        self.add_meter(name, start, end, threshold)
+        return self
+
+    def label(self, name, default=""):
+        """ add label attribute"""
+        self.add_label(name, default)
+        return self
+
+    def event(self, name=1):
+        """ add event attribute"""
+        if USE_EVENT: 
+            self.add_event(name)
+        return self
+
+    def cron(self, time, dom=False, wdays=False, month=False):
+        """ wrapper for add_cron """
+        cron = ecflow.Cron()
+        cron.set_time_series(time)
+        if wdays is not False:
+            cron.set_week_days(wdays)
+        if month is not False:
+            cron.set_months(month)
+        if dom is not False:
+            cron.set_day_of_month(dom)
+
+        self.add_cron(cron)
+        return self
+
+    def today(self, hhmm): 
+        """ wrapper around time """
+        self.time(hhmm)
+        return self # ???
+
+    def time(self, hhmm):
+        """ wrapper around time, None argument is silently ignored """
+        if hhmm is not None:
+            self.add_time(hhmm)
+        return self
+
+    def trigger(self, arg):
+        """ add trigger attribute"""
+        if USE_TRIGGER and arg is not None:
+            self.add_trigger(arg)
+        return self
+
+    def trigger_and(self, arg):
+        """ append to existing trigger"""
+        if USE_TRIGGER and arg is not None:
+            self.add_part_trigger(ecflow.PartExpression(arg, True))
+        return self
+
+    def trigger_or(self, arg):
+        """ append to existing trigger"""
+        if USE_TRIGGER and arg is not None:
+            self.add_part_trigger(ecflow.PartExpression(arg, False))
+        return self
+
+    def complete(self, arg):
+        """ add complete attribute"""
+        if USE_TRIGGER and arg is not None:
+            self.add_complete(arg)
+        return self
+
+    def complete_and(self, arg):
+        """ append to existing complete"""
+        if USE_TRIGGER and arg is not None:
+            self.add_part_complete(ecflow.PartExpression(arg, True))
+        return self
+
+    def complete_or(self, arg):
+        """ append to existing complete"""
+        if USE_TRIGGER and arg is not None:
+            self.add_part_complete(ecflow.PartExpression(arg, False))
+        return self
+
+    def up(self):
+        """ get parent, one level up"""
+        return self.get_parent()
+
+class Defs(ecflow.Defs):
+    """ wrapper for the definition """
+    def add(self, suite):
+        """ add suite """
+        self.add_suite(suite)
+        return suite
+
+    def suite(self, name):
+        """ add suite providing its name """
+        suite = Suite(name)
+        self.add(suite)
+        return suite
+
+class Client(ecflow.Client):
+    """ wrapper around client """
+    def __init__(self, host="localhost", port="31415"):
+        if "@" in host:
+            host, port = host.split("@")
+            # super(Client, self).__init__(host, int(port))            
+            super(Client, self).__init__()
+            self.set_host_port(host, int(port))
+        else: 
+            super(Client, self).__init__()
+            self.set_host_port(host, int(port))
+            # super(Client, self).__init__(host, "%s" % port)
+        self.host = host
+        self.port = port
+
+    def __str__(self):
+        return "ecflow client %s@%s v%s" % (self.host, self.port, 
+                                                 self.version())
+
+class Suite(ecflow.Suite, Root):
+    """ wrapper for a suite """
+
+    def family(self, name):
+        """ add family """
+        fam = Family(name)
+        self.add_family(fam)
+        return fam
+
+    def task(self, name):
+        """ add family """
+        tsk = Task(name)
+        self.add_task(tsk)
+        return tsk
+
+    # def __enter__(self): return self
+    # def __exit__(self, *args): pass
+
+class Family(ecflow.Family, Node, Attribute):
+    """ wrapper around family """
+
+    def family(self, name):
+        """ add a family """
+        fam = Family(name)
+        self.add_family(fam)
+        return fam
+
+    def task(self, name):
+        """ add a task """
+        tsk = Task(name)
+        self.add_task(tsk)
+        return tsk
+
+    def add_to(self, node):        
+        node.add_family(self)
+
+    # def __enter__(self): return self
+    # def __exit__(self, *args): pass
+
+class Task(ecflow.Task, Node, Attribute):
+    """ wrapper around task """
+
+    def __setattr__(self, key, val):
+        # assert key.isupper()
+        if key.isupper():
+            key, val = translate(key, val)
+        self.add_variable(key, val)
+
+    def add_to(self, node):
+            node.add_task(self)
+
+    def add_family(self, node): raise BaseException()
+
+def display(defs, fname=None):
+    """ print defs"""
+    if fname is None:
+      pass # print defs
+    else:
+        fop = open(fname, "w")
+        print >> fop, defs
+
+
+class TestEcf(unittest.TestCase):
+    """ a test case """
+    def test_xxx(self):
+        """ a test """
+
+        suite = Suite ("a_suite")
+        suite.defstatus("suspended")
+
+        fam = Family("a_family")
+        tsk = Task("a_task")
+
+        ft2 = Task("a_fam")
+        ft2.add_to(fam)
+
+        tsk.VAR = "VALUE"                         # edit VAR "VALUE"
+        tsk.add(Late("-s 00:05 -c 01:00"))
+
+        fam.add(tsk,
+
+                (Task("1"), Task("2")), 
+                [Task("11"), Task("12")], 
+                Task("111"), Task("211"),
+
+                Task("t2").add(Trigger(tsk == COMPLETE),
+                               Time("01:00"))            )
+
+        fam.add(Task("t3").add(
+                If(test= (1==1),
+                   then=Variables(ADD_ONE=1),
+                   otow=Variables(ADD_TWO=1)),
+
+                If(test= (1==0),
+                   then=Variables(ADD_ONE=0),
+                   otow=Variables(ADD_TWO=0)),
+                Trigger(tsk != ABORTED),
+                Complete(tsk == COMPLETE))) # longer
+
+        fam.add(
+            Task("2t"),
+            Task("t4").add(
+                Trigger(tsk.name() != COMPLETE)),
+            Late("-s 00:05 -c 01:00"),
+            Variables(VAR="VALUE"),
+            Task("t5").add(Trigger(["t4", "t3", "t2"])),
+            Task("t6").add(Trigger("2t" == COMPLETE)),
+            Task("t7").add(Trigger("2t eq complete")),
+            )
+
+        tsk.add(Limit("a_limit", 10),
+                InLimit("a_task:a_limit"),
+                Meter("step", -1, 100),
+                Label("info", "none"),
+                Event(1),
+                Event("a"),
+                Defcomplete())
+        
+        tsk.add(Variables({"A": "a", "B": "b"}))
+        tsk.add(Variables(D="d", E="e"))
+        tsk.add(Variables("C", "c"))
+        suite.add(fam)
+
+        fam.family("another").add(DefcompleteIf(True))
+
+        defs = Defs()
+        defs.add(suite)
+        another = defs.suite("another")
+        another.defstatus("suspended")
+        another.task("tn")
+        afam = another.family("another_fam")
+        afam.task("t2n")
+
+        display(defs, fname="test_ecf.tmp")
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/ecflow_4_0_7/Pyext/samples/printdefs.py b/ecflow_4_0_7/Pyext/samples/printdefs.py
new file mode 100644
index 0000000..886194d
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/samples/printdefs.py
@@ -0,0 +1,178 @@
+#!/usr/bin/env python2.7
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+import ecflow
+import argparse # for argument parsing     
+
+class Indentor:
+    """This class manages indentation, 
+    It is used to correctly indent the definition node tree hierarchy
+    """
+    _index = 0
+    def __init__(self):
+        Indentor._index += 1
+    def __del__(self):
+        Indentor._index -= 1
+    @classmethod
+    def indent(cls):
+        for i in range(Indentor._index):
+            print ' ',
+     
+class DefsTraverser:
+    """Traverse the ecflow.Defs definition and writes to standard out.
+    
+    Ecflow has the following hierarchy::
+       Task   --> Submittable   -->Node
+       Family --> NodeContainer -->Node
+       Suite  --> NodeContainer -->Node
+    
+    This demonstrates that all nodes in the node tree and all attributes are accessible.
+    Additionally the state data is also accessible. This class will write state data as
+    comments. If the definition was returned from the server, it allows access to latest 
+    snapshot of the state data held in the server. 
+    """
+    def __init__(self,defs):
+        assert (isinstance(defs,ecflow.Defs)),"Expected ecflow.Defs as first argument"
+        self.__defs = defs
+        
+    def do_print(self):
+        for extern in self.__defs.externs:
+            self.__println("extern " + extern)
+        for suite in self.__defs.suites:
+            self.__print("suite ")
+            self.__print_node(suite)
+            clock = suite.get_clock()
+            if clock:
+                indent = Indentor()
+                self.__println(str(clock))
+                del indent
+            self.__print_nc(suite)
+            self.__println("endsuite")  
+ 
+    def __print_nc(self,node_container):
+        indent = Indentor()
+        for node in node_container.nodes:
+            if isinstance(node, ecflow.Task):
+                self.__print("task ")
+                self.__print_node(node)
+                self.__print_alias(node)
+            else: 
+                self.__print("family ")
+                self.__print_node(node)
+                self.__print_nc(node)
+                self.__println("endfamily")
+        del indent
+
+    def __print_alias(self,task):
+       indent = Indentor()
+       for alias in task.nodes:
+           self.__print("alias ")
+           self.__print_node(alias)
+           self.__println("endalias")
+       del indent
+
+    def __print_node(self,node):
+        print node.name() + " # state:" + str(node.get_state()) 
+        
+        indent = Indentor()
+        defStatus = node.get_defstatus()
+        if defStatus != ecflow.DState.queued: 
+            self.__println("defstatus " + str(defStatus))
+            
+        autocancel = node.get_autocancel()
+        if autocancel: self.__println(str(autocancel))
+        
+        repeat = node.get_repeat()
+        if not repeat.empty(): self.__println(str(repeat)  + " # value: " + str(repeat.value()))
+    
+        late = node.get_late()
+        if late: self.__println(str(late) + " # is_late: " + str(late.is_late()))
+
+        complete_expr = node.get_complete()
+        if complete_expr:
+            for part_expr in complete_expr.parts:
+                trig = "complete "
+                if part_expr.and_expr(): trig = trig + "-a "
+                if part_expr.or_expr():  trig = trig + "-o "
+                self.__print(trig)
+                print part_expr.get_expression()
+        trigger_expr = node.get_trigger()
+        if trigger_expr:
+            for part_expr in trigger_expr.parts:
+                trig = "trigger "
+                if part_expr.and_expr(): trig = trig + "-a "
+                if part_expr.or_expr():  trig = trig + "-o "
+                self.__print(trig)
+                print part_expr.get_expression() 
+                
+        for var in node.variables:    self.__println("edit " + var.name() + " '" + var.value() + "'")
+        for meter in node.meters:     self.__println(str(meter) + " # value: " + str(meter.value()))
+        for event in node.events:     self.__println(str(event) + " # value: " + str(event.value()))
+        for label in node.labels:     self.__println(str(label) + " # value: " + label.new_value())
+        for limit in node.limits:     self.__println(str(limit) + " # value: " + str(limit.value()))
+        for inlimit in node.inlimits: self.__println(str(inlimit))
+        for the_time in node.times:   self.__println(str(the_time))
+        for today in node.todays:     self.__println(str(today))   
+        for date in node.dates:       self.__println(str(date))  
+        for day in node.days:         self.__println(str(day))   
+        for cron in node.crons:       self.__println(str(cron))    
+        for verify in node.verifies:  self.__println(str(verify))
+        for zombie in node.zombies:   self.__println(str(zombie))
+        
+        del indent
+
+    def __print(self,the_string):
+        Indentor.indent()
+        print the_string,
+
+    def __println(self,the_string):
+        Indentor.indent()
+        print the_string
+ 
+if __name__ == "__main__":
+    
+    DESC = """Will list all the nodes and attributes in the definition
+              Usage:
+                Example1: List all the states
+                   printdefs.py --host cca --port 4141  
+            """    
+    PARSER = argparse.ArgumentParser(description=DESC,  
+                                     formatter_class=argparse.RawDescriptionHelpFormatter)
+    PARSER.add_argument('--host', default="localhost",   
+                        help="The name of the host machine, defaults to 'localhost'")
+    PARSER.add_argument('--port', default="3141",   
+                        help="The port on the host, defaults to 3141")
+    ARGS = PARSER.parse_args()
+    #print ARGS    
+    
+    # ===========================================================================
+    CL = ecflow.Client(ARGS.host, ARGS.port)
+    try:
+        CL.ping() 
+
+        # get the incremental changes, and merge with defs stored on the Client 
+        CL.sync_local()
+        
+        # check to see if definition exists in the server
+        defs = CL.get_defs()
+        if defs == None :
+            print "No definition found, exiting..."
+            exit(0) 
+            
+        # print defs;
+        defs_traverser = DefsTraverser(defs)
+        defs_traverser.do_print()
+
+    except RuntimeError, ex:
+        print "Error: " + str(ex)
+        print "Check host and port number are correct."
diff --git a/ecflow_4_0_7/Pyext/script.py b/ecflow_4_0_7/Pyext/script.py
new file mode 100644
index 0000000..0d73b95
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/script.py
@@ -0,0 +1,11 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+#
+print 'Hello World !'
+number = 42
diff --git a/ecflow_4_0_7/Pyext/setup.py.in b/ecflow_4_0_7/Pyext/setup.py.in
new file mode 100755
index 0000000..b587c90
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/setup.py.in
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+from distutils.core import setup, Extension
+import os
+import sys
+import glob
+
+# ========================================================================
+# Usage:
+#   cd $WK; cd ecbuild/release/; sh -x ../../cmake.sh release; make ; make install
+#   calling 'sh -x ../../cmake.sh release' will generate steup.py from setup.py.in
+# Issues:
+#   Can not test cmake install, since it will always install to 
+#     /usr/local/apps/python/current/lib/python2.7/site-packages/ecflow
+#
+# To test install manually, we can:
+#   cd $WK/Pyext
+#   rm -rf build/   # for a clean build
+#   python setup.py build_ext
+#   python setup.py install --home=~
+#
+# See: http://docs.python.org/2/distutils/apiref.html?highlight=extension#distutils.core.Extension
+#
+# ========================================================================
+# AIX: On AIX we need custom compile and link flags:
+# The final link line is wrong: xlC_r xlc_r  , 
+#                              /usr/local/lpp/vacpp11109/usr/vacpp/bin/.orig/xlC_r: 1501-228 (W) input file xlc_r not found
+#           
+# Removing the duplicated xlc_r, We then get a little further,
+#         ld: 0711-317 ERROR: Undefined symbol: .main
+#      Using -bnoquiet
+#        .main                     [12]    ER PR crt0_64.s(/lib/crt0_64.o)
+#                                          00000070 .text    R_RBR    [34]    .__start
+# This is because it is missing -G (generate dynamic library)
+# When we manually add -G, we sucessfully link(ecflow.so)
+#
+#      Both of these can be fixed, by overriding the Link line with:
+#      export LDSHARED="xlC_r -G -Wl,-bI:/usr/local/apps/python/2.7.2-01/lib/python2.7/config/python.exp"
+#
+# To find out what python is going to use:
+#         python -c "from distutils import sysconfig; print sysconfig.get_config_vars('LDSHARED')[0]"
+# On AIX, it does not use this  value ? 
+#
+#      See python issue 18235  _sysconfigdata.py wrong on AIX installations
+# ==========================================================================
+
+# ==========================================================================
+# Permissions: The permission of congfigured file are wrong: 2 choices
+# o Make sure origin file, has the right permissions
+# o Copy file to different directory, and change the permissions
+#   since file(COPY) does rename files
+#   configure_file(setup.py.in ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/setup.py)
+#       now copy the temporary into the final destination, setting the permissions
+#   file(COPY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/setup.py
+#     DESTINATION ${CMAKE_BINARY_DIR}
+#     FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
+#     GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+# ============================================================================
+        
+#=============================================================================
+# define the directories to search for include files
+# to get this to work, you will need to include the path
+# to your boost installation and  ecflow includes
+boost_root=os.getenv("BOOST_ROOT") 
+include_dirs = [ "@CMAKE_CURRENT_SOURCE_DIR@/../ACore/src", 
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../ANattr/src", 
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../ANode/src",
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../AParser/src",
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../Base/src",
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../Base/src/cts",
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../Base/src/stc",
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../CSim/src", 
+                 "@CMAKE_CURRENT_SOURCE_DIR@/../Client/src",
+                 "@CMAKE_CURRENT_SOURCE_DIR@/src",
+                 boost_root,
+               ]
+
+# define the library directories to include any extra libraries that may be needed.
+# Give preference to release libs   
+boost_lib_dir = boost_root + "/stage/lib/"
+library_dirs = ['@CMAKE_BINARY_DIR@/ACore',
+                '@CMAKE_BINARY_DIR@/ANattr/',
+                '@CMAKE_BINARY_DIR@/ANode/',
+                '@CMAKE_BINARY_DIR@/AParser/', 
+                '@CMAKE_BINARY_DIR@/Base/', 
+                '@CMAKE_BINARY_DIR@/CSim/', 
+                '@CMAKE_BINARY_DIR@/Client/', 
+                boost_lib_dir  
+               ]
+
+# define the libraries to link with this includes the boost lib
+libraries = [ 'core' , 'nodeattr', 'node', 'libparser', 'base', 'libsimu', 'libclient',
+              'boost_system-mt',
+              'boost_serialization-mt',
+              'boost_filesystem-mt',
+              'boost_program_options-mt',
+              'boost_date_time-mt', 
+              'boost_python-mt' ]
+ 
+# extra compile flags needed for AIX only
+# Note setup.py will add -q64 -qcpluscmt -DNDEBUG  automatically
+# Note: two extra_compile_args, debug and release, use the debug for testing and faster compiles
+extra_compile_args = []
+extra_link_args = []
+if sys.platform.startswith("aix"):
+   extra_compile_args =  [ '-qsuppress=1540-0198', '-O3', '-qstrict', '-qfuncsect', '-qeh', '-qrtti'  ]
+   #extra_compile_args = [ '-qsuppress=1540-0198',  '-qNOOPTimize', '-qnoinline', '-qfullpath', '-qfuncsect', '-qeh', '-qrtti' ]
+   extra_link_args= [ '-lpthread', '-ldl', '-bbigtoc' ]  # '-G', '-noipath', 
+ 
+
+# create the extension and add it to the python distribution
+# o glob.glob(os.path.join('src', '*.cpp'))
+#   This expand the list of cpp files that need to be compiled
+#
+# The configuation below installs to:
+#   o /usr/local/apps/python/current/lib/python2.7/site-packages/ecflow
+#     when, "python setup.py install" is used:
+#   lib/python2.7/site-packages/ecflow/ecflow.so
+#                                     __init__.py               
+setup( name='ecflow', 
+       version='@ECFLOW_VERSION@', 
+       author      = 'ECMWF',
+       description = """ecflow Python interface""",
+       packages = [ 'ecflow' ],
+       package_dir={'ecflow': '@CMAKE_CURRENT_SOURCE_DIR@/ecflow'},
+       ext_modules=[ Extension( 
+                              'ecflow.ecflow', 
+                              glob.glob(os.path.join('@CMAKE_CURRENT_SOURCE_DIR@/src', '*.cpp')), 
+                              include_dirs=include_dirs, 
+                              library_dirs=library_dirs, 
+                              libraries=libraries,
+                              extra_compile_args=extra_compile_args,
+                              extra_link_args=extra_link_args
+                              )
+                    ],
+   )
diff --git a/ecflow_4_0_7/Pyext/src/BoostPythonUtil.cpp b/ecflow_4_0_7/Pyext/src/BoostPythonUtil.cpp
new file mode 100644
index 0000000..7634251
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/BoostPythonUtil.cpp
@@ -0,0 +1,56 @@
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "BoostPythonUtil.hpp"
+
+void BoostPythonUtil::list_to_int_vec(const boost::python::list& list, std::vector<int>& int_vec)
+{
+   int the_list_size = len(list);
+   int_vec.reserve(the_list_size);
+   for (int i = 0; i < the_list_size; ++i) {
+      int_vec.push_back(boost::python::extract<int>(list[i]));
+   }
+}
+
+void BoostPythonUtil::list_to_str_vec(const boost::python::list& list, std::vector<std::string>& vec)
+{
+   int the_list_size = len(list);
+   vec.reserve(the_list_size);
+   for (int i = 0; i < the_list_size; ++i) {
+      vec.push_back(boost::python::extract<std::string>(list[i]));
+   }
+}
+
+void BoostPythonUtil::dict_to_str_vec(const boost::python::dict& dict, std::vector<std::pair<std::string,std::string> >& str_pair_vec)
+{
+   boost::python::list keys = dict.keys();
+   const int no_of_keys = len(keys);
+   str_pair_vec.reserve(no_of_keys);
+
+   for(int i = 0; i < no_of_keys; ++i) {
+
+      boost::python::object curArg = dict[keys[i]];
+      if(curArg) {
+         std::string first = boost::python::extract<std::string>(keys[i]);
+         std::string second = boost::python::extract<std::string>(dict[keys[i]]);
+         str_pair_vec.push_back( std::make_pair(first,second));
+//         std::cout << "BoostPythonUtil::dict_to_str_vec " << first << "   " << second << "\n";
+      }
+   }
+
+}
+
diff --git a/ecflow_4_0_7/Pyext/src/BoostPythonUtil.hpp b/ecflow_4_0_7/Pyext/src/BoostPythonUtil.hpp
new file mode 100644
index 0000000..8dc1c9a
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/BoostPythonUtil.hpp
@@ -0,0 +1,37 @@
+#ifndef BOOST_PYTHON_UTIL_HPP_
+#define BOOST_PYTHON_UTIL_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include <boost/python.hpp>
+#include <vector>
+#include <string>
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+
+class BoostPythonUtil : private boost::noncopyable {
+public:
+
+   /// Convert python list to a vector of integers. raises a type error if integer extraction fails
+   static void list_to_int_vec(const boost::python::list& list, std::vector<int>& int_vec);
+   static void list_to_str_vec(const boost::python::list& list, std::vector<std::string>& int_vec);
+   static void dict_to_str_vec(const boost::python::dict& dict, std::vector<std::pair<std::string,std::string> >& str_pair);
+
+};
+
+#endif
diff --git a/ecflow_4_0_7/Pyext/src/ClientDoc.cpp b/ecflow_4_0_7/Pyext/src/ClientDoc.cpp
new file mode 100644
index 0000000..0e65f44
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ClientDoc.cpp
@@ -0,0 +1,1419 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #89 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "ClientDoc.hpp"
+
+const char* ClientDoc::class_client(){
+   return
+            "Class client provides an interface to communicate with the :term:`ecflow_server`.::\n\n"
+            "   Client(\n"
+            "      string host, # The server name. Can not be empty.\n"
+            "      string port  # The port on the server, must be unique to the server\n"
+            "   )\n\n"
+            "   Client(\n"
+            "      string host, # The server name. Can not be empty.\n"
+            "      int port     # The port on the server, must be unique to the server\n"
+            "   )\n\n"
+            "   Client(\n"
+            "      string host_port, # Expect's <host>:<port>\n"
+            "   )\n\n"
+            "The client reads in the following environment variables.\n"
+            "For child commands,(i.e these are commands called in the .ecf/jobs files), these variables are used.\n"
+            "For the python interface these environment variable are not really applicable but documented for completeness:\n\n"
+            "* ECF_NAME    <string> : Full path name to the task\n"
+            "* ECF_PASS    <string> : The jobs password, allocated by server, then used by server to authenticate client request\n"
+            "* ECF_TRYNO      <int> : The number of times to start a job if it aborts\n"
+            "* ECF_TIMEOUT   <int>  : Max time in seconds for client to deliver message to main server\n"
+            "* ECF_HOSTFILE<string> : File that lists alternate hosts to try, if connection to main host fails\n"
+            "* ECF_DENIED     <any> : Provides a way for child to exit with an error, if server denies connection.\n"
+            "                         Avoids 24hr wait. Note: when you have hundreds of tasks, using this approach\n"
+            "                         requires a lot of manual intervention to determine job status\n"
+            "* NO_ECF         <any> : If set exit's immediately with success. Used to test jobs without communicating with server\n\n"
+            "The following environment variables are used by the python interface and child commands\n\n"
+            "* ECF_NODE  <string>   : The host name of the main server. defaults to 'localhost'\n"
+            "* ECF_PORT  <int>      : The TCP/IP port to call on the server. Must be unique to a server\n\n"
+            "The ECF_NODE and ECF_PORT can be overridden by using the Constructor or set_host_port() member function.\n"
+            "For optimal usage it is best to reuse the same Client rather than recreating for each client server interaction\n"
+            "By default the Client interface will throw exceptions for error's.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client(\"localhost:3150\")   # for errors will throw RuntimeError\n"
+            "       ci.terminate_server()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+            ;
+}
+
+const char* ClientDoc::set_host_port(){
+   return
+            "Override the default(localhost and port 3141) and environment setting(ECF_NODE and ECF_PORT)\n"
+            "and set it explicitly::\n\n"
+            "   set_host_port(\n"
+            "      string host, # The server name. Can not be empty.\n"
+            "      string port  # The port on the server, must be unique to the server\n"
+            "   )\n\n"
+            "   set_host_port(\n"
+            "      string host, # The server name. Can not be empty.\n"
+            "      int port     # The port on the server, must be unique to the server\n"
+            "   )\n\n"
+            "   set_host_port(\n"
+            "      string host_port, # Expect's <host>:<port>\n"
+            "   )\n\n"
+            "Exceptions:\n\n"
+            "- Raise a RuntimeError if the host or port is empty\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client();\n"
+            "       ci.set_host_port(\"localhost\",\"3150\")\n"
+            "       ci.set_host_port(\"avi\",3150)\n"
+            "       ci.set_host_port(\"avi:3150\")\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+            ;
+}
+
+const char* ClientDoc::set_retry_connection_period() {
+   return
+            "Set the sleep period between connection attempts\n\n"
+            "Whenever there is a connection failure we wait a number of seconds before trying again.\n"
+            "i.e. to get round glitches in the network.\n"
+            "For the ping command this is hard wired as 1 second.\n"
+            "This wait between connection attempts can be configured here.\n"
+            "i.e This could be reduced to increase responsiveness.\n"
+            "Default: In debug this period is 1 second and in release mode 10 seconds::\n\n"
+            "   set_retry_connection_period(\n"
+            "      int period # must be an integer >= 0\n"
+            "   )\n\n"
+            "Exceptions:\n\n"
+            "- None\n"
+            "\nUsage::\n\n"
+            "   ci = Client()\n"
+            "   ci.set_connection_attempts(3)     # make 3 attempts for server connection\n"
+            "   ci.set_retry_connection_period(1) # wait 1 second between each attempt\n"
+            ;
+}
+
+const char* ClientDoc::set_connection_attempts() {
+   return
+            "Set the number of times to connect to :term:`ecflow_server`, in case of connection failures\n\n"
+            "The period between connection attempts is handled by Client.set_retry_connection_period().\n"
+            "If the network is unreliable the connection attempts can be be increased, likewise\n"
+            "when the network is stable this number could be reduced to one.\n"
+            "This can increase responsiveness and reduce latency.\n"
+            "Default value is set as 2.\n"
+            "Setting a value less than one is ignored, will default to 1 in this case::\n\n"
+            "   set_connection_attempts(\n"
+            "      int attempts # must be an integer >= 1\n"
+            "   )\n"
+            "\nExceptions:\n\n"
+            "- None\n"
+            "\nUsage::\n\n"
+            "   ci = Client()\n"
+            "   ci.set_connection_attempts(3)     # make 3 attempts for server connection\n"
+            "   ci.set_retry_connection_period(1) # wait 1 second between each attempt\n"
+           ;
+}
+
+const char* ClientDoc::get_defs(){
+   return
+            "Returns the :term:`suite definition` stored on the Client.\n\n"
+            "Use :py:class:`ecflow.Client.sync_local()` to retrieve the definition from the server first.\n"
+            "The definition is *retained* in memory until the next call to sync_local().\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()         # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.sync_local()       # get the definition from the server and store on 'ci'\n"
+            "       print ci.get_defs()   # print out definition stored in the client\n"
+            "       print ci.get_defs()   # print again, this shows that defs is retained on ci\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::get_log()
+{
+   return
+            "Request the :term:`ecflow_server` to return the log file contents as a string\n\n"
+            "Use with caution as the returned string could be several megabytes.\n"
+            "Only enabled in the debug build of ECF.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()          # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       print ci.get_log()     # get the log file from the server\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::new_log()
+{
+   return
+            "Request the :term:`ecflow_server` to use the path provided, as the new log file\n\n"
+            "The old log file is released.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()               # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.new_log('/path/log.log') # use '/path/log,log' as the new log file\n"
+            "                                   # To keep track of log file Can change ECF_LOG\n"
+            "       ci.alter('\','change','variable','ECF_LOG','/new/path.log')\n"
+            "       ci.new_log()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+           ;
+}
+
+const char* ClientDoc::clear_log()
+{
+   return
+            "Request the :term:`ecflow_server` to clear log file.\n"
+            "Log file will be empty after this call.\n\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.clear_log()   # log file is now empty\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::flush_log()
+{
+   return
+            "Request the :term:`ecflow_server` to flush and then close log file\n\n"
+            "It is best that the server is :term:`shutdown` first, as log file will be reopened\n"
+            "whenever a command wishes to log any changes.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.flush_log()   # Log can now opened by external program\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::log_msg()
+{
+   return
+            "Request the :term:`ecflow_server` writes a string message to the log file.\n\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()             # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.log_msg(\"A message\") # Write message to log file\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::restart_server()   {
+   return
+            "Restart the :term:`ecflow_server`\n\n"
+            "Start job scheduling, communication with jobs, and respond to all requests.\n"
+            "See :term:`server states`\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()            # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.retstart_server()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+const char* ClientDoc::halt_server()      {
+   return
+            "Halt the :term:`ecflow_server`\n\n"
+            "Stop server communication with jobs, and new job scheduling, and stops check pointing.\n"
+            "See :term:`server states`\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()            # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.halt_server()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+const char* ClientDoc::shutdown_server()  {
+   return
+            "Shut down the :term:`ecflow_server`\n\n"
+            "Stop server from scheduling new jobs.\n"
+            "See :term:`server states`\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()            # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.shutdown_server()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::terminate_server() {
+   return   "Terminate the :term:`ecflow_server`::\n\n"
+            "   try:\n"
+            "       ci = Client()            # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.terminate_server()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::wait_for_server_reply() {
+   return   "Wait for a response from the :term:`ecflow_server`::\n\n"
+            "   void wait_for_server_reply(\n"
+            "      int time_out     : (default = 60) \n"
+            "   )\n\n"
+            "This is used to check if server has started. Typically for tests.\n"
+            "Returns true if server(ping) replies before time out, otherwise false\n"
+            "\nUsage::\n\n"
+            "   ci = Client()   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "   if ci.wait_for_server_reply(30):\n"
+            "      print 'Server is alive'\n"
+            "   else:\n"
+            "      print 'Timed out after 30 second wait for server response.?'\n"
+            ;
+}
+
+const char* ClientDoc::load_defs(){
+   return
+            "Load a :term:`suite definition` given by the file_path argument into the :term:`ecflow_server`::\n\n"
+            "   void load(\n"
+            "      string file_path     : path name to the definition file\n"
+            "      [(bool)force=False]  : If true overwrite suite of same name\n"
+            "   )\n\n"
+            "By default throws a RuntimeError exception for errors.\n"
+            "If force is not used and :term:`suite` of the same name already exists in the server,\n"
+            "then a error is thrown\n"
+            "\nUsage::\n\n"
+            "   defs_file = \"Hello.def\" \n"
+            "   defs = Defs()\n"
+            "   suite = def.add_suite(\"s1\")\n"
+            "   family = suite.add_family(\"f1\")\n"
+            "   for i in [ \"_1\", \"_2\", \"_3\" ]:\n"
+            "      family.add_task( \"t\" + i )\n"
+            "   defs.save_as_defs(defs_file)  # write out in memory defs into the file 'Hello.def'\n"
+            "   ...\n"
+            "   try:\n"
+            "       ci = Client()       # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.load(defs_file)  # open and parse defs file, and load into server.\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::load(){
+   return
+            "Load a in memory :term:`suite definition` into the :term:`ecflow_server`::\n\n"
+            "   void load(\n"
+            "      Defs defs           : A in memory definition\n"
+            "      [(bool)force=False] : for true overwrite suite of same name\n"
+            "   )\n\n"
+            "If force is not used and :term:`suite` already exists in the server, then a error is thrown.\n"
+            "\nUsage::\n\n"
+            "   defs = Defs(\"hello.def\")\n"
+            "   suite = defs.add_suite(\"s1\")\n"
+            "   family = suite.add_family(\"f1\")\n"
+            "   for i in [ \"_1\", \"_2\", \"_3\" ]: \n"
+            "       family.add_task( Task( \"t\" + i) )\n"
+            "   ...\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.load(defs)    # Load in memory defs, into the server\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::get_server_defs() {
+   return
+            "Get all suite Node tree's from the :term:`ecflow_server`.\n\n"
+            "The definition is *retained* in memory until the next call to get_server_defs().\n"
+            "This is important since get_server_defs() could return several megabytes of data.\n"
+            "Hence we only want to call it once, and then access it locally with get_defs().\n"
+            "If you need to access the server definition in a loop use :py:class:`ecflow.Client.sync_local` instead\n"
+            "since this is capable of returning incremental changes, and thus considerably\n"
+            "reducing the network load.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()         # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.get_server_defs()  # get the definition from the server and store on 'ci'\n"
+            "       print ci.get_defs()   # print out definition stored in the client\n"
+            "       print ci.get_defs()   # print again, this shows that defs is retained on ci\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::sync() {
+   return
+            "Requests that :term:`ecflow_server` returns the full definition or incremental change made and applies them to the client Defs\n\n"
+            "When there is a very large definition, calling :py:class:`ecflow.Client.get_server_defs` each time can be *very* expensive\n"
+            "both in terms of memory, speed, and network bandwidth. The alternative is to call \n"
+            "this function, which will get the incremental changes, and apply them local client :term:`suite definition`\n"
+            "effectively synchronising the client and server Defs.\n"
+            "If the period of time between two sync() calls is too long, then the full server definition\n"
+            "is returned and assigned to the client Defs.\n"
+            "We can determine if the changes were applied by calling in_sync() after the call to sync_local()::\n\n"
+            "   void sync_local();                     # The very first call, will get the full Defs.\n"
+            "\n"
+            "Exceptions:\n\n"
+            "- raise a RuntimeError if the delta change can not be applied.\n"
+            "- this could happen if the client Defs bears no resemblance to server Defs\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                       # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.sync_local()                     # Very first call gets the full Defs\n"
+            "       client_defs = ci.get_defs()         # End user access to the returned Defs\n"
+            "       ... after a period of time\n"
+            "       ci.sync_local()                     # Subsequent calls to sync_local() users the local Defs to sync incrementally\n"
+            "       if ci.in_sync():                    # returns true server changed and changes applied to client\n"
+            "          print 'Client is now in sync with server'\n"
+            "       client_defs = ci.get_defs()         # End user access to the returned Defs\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            "\n"
+            "Calling sync_local() is considerably faster than calling get_server_defs() for large Definitions"
+            ;
+}
+
+const char* ClientDoc::in_sync() {
+   return
+            "Returns true if the definition on the client is in sync with the :term:`ecflow_server`\n\n"
+            "Calling in_sync() is **only** valid after a call to sync_local().\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "      ci = Client()                       # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "      ci.sync_local()                     # very first call gets the full Defs\n"
+            "      client_defs = ci.get_defs()         # End user access to the returned Defs\n"
+            "      ... after a period of time\n"
+            "      ci.sync_local()                     # Subsequent calls to sync_local() users the local Defs to sync incrementally\n"
+            "      if ci.in_sync():                    # returns true  changed and changes applied to client\n"
+            "         print 'Client is now in sync with server'\n"
+            "      client_defs = ci.get_defs()         # End user access to the returned Defs\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+           ;
+}
+
+const char* ClientDoc::news() {
+   return
+            "Query the :term:`ecflow_server` to detect any changes.\n\n"
+            "This returns a simple bool, if there has been changes, the user should call :py:class:`ecflow.Client.sync_local`.\n"
+            "This will bring the client in sync with changes in the server. If sync_local() is not called\n"
+            "then calling news_local() will always return true.\n"
+            "news_local() uses the definition stored on the client::\n\n"
+            "   bool news_local()\n"
+            "\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                  # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       if ci.news_local():            # has the server changed\n"
+            "          print 'Server Changed'      # server changed bring client in sync with server\n"
+            "          ci.sync_local()             # get the full definition from the server if first time\n"
+            "                                      # otherwise apply incremental changes to Client definition,\n"
+            "                                      # bringing it in sync with the server definition\n"
+            "          print ci.get_defs()         # print the synchronised definition. Should be same as server\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::changed_node_paths() {
+   return
+            "After a call to sync_local() we can access the list of nodes that changed\n\n"
+            "The returned list consists of node paths. *IF* the list is empty assume that\n"
+            "whole definition changed. This should be expected after the first call to sync_local()\n"
+            "since that always retrieves the full definition from the server::\n\n"
+            "   void changed_node_paths()\n"
+            "\n"
+            "\nUsage::\n\n"
+            "try:\n"
+            "   ci = Client()                          # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "   if ci.news_local():                    # has the server changed\n"
+            "      print 'Server Changed'              # server changed bring client in sync with server\n"
+            "      ci.sync_local()                     # get the full definition from the server if first time\n"
+            "                                          # otherwise apply incremental changes to Client definition,\n"
+            "                                          # bringing it in sync with the server definition\n"
+            "      defs = ci.get_defs()                # get the updated/synchronised definition\n"
+            "      for path in ci.changed_node_paths():\n"
+            "         print path;\n"
+            "         if path == '/':                 # path '/' represent change to server node/defs\n"
+            "            print 'defs changed'         # defs state change or user variables changed\n"
+            "         else:\n"
+            "            node = defs.find_abs_node_path()\n"
+            "\n"
+            "      # if changed_node_paths is empty, then assume entire definition changed\n"
+            "      print defs                         # print the synchronised definition. Should be same as server\n"
+            "except RuntimeError, e:\n"
+            "  print str(e)\n"
+            ;
+}
+
+
+const char* ClientDoc::checkpt(){
+   return
+            "Request the :term:`ecflow_server` :term:`check point` s the definition held in the server immediately\n\n"
+            "This effectively saves the definition held in the server to disk,\n"
+            "in a platform independent manner. This is the default when no arguments are specified.\n"
+            "The saved file will include node state, passwords, etc.\n"
+            "The default file name is <host>.<port>.ecf.check and is saved in ECF_HOME directory.\n"
+            "The :term:`check point` file name can be overridden via ECF_CHECK server environment variable.\n"
+            "The back up :term:`check point` file name can be overridden via ECF_CHECKOLD server environment variable::\n\n"
+            "   void checkpt(\n"
+            "     [(CheckPt::Mode)mode=CheckPt.UNDEFINED]\n"
+            "                         : Must be one of [ NEVER, ON_TIME, ALWAYS, UNDEFINED ]\n"
+            "                           NEVER  :  Never check point the definition in the server\n"
+            "                           ON_TIME:  Turn on automatic check pointing at interval stored on server\n"
+            "                                     or with interval specified as the second argument\n"
+            "                           ALWAYS:   Check point at any change in node tree, *NOT* recommended for large definitions\n"
+            "                           UNDEFINED:The default, which allows for immediate check pointing, or alarm setting\n"
+            "     [(int)interval=120] : This specifies the interval in seconds when server should automatically check pt.\n"
+            "                           This will only take effect if mode is on_time/CHECK_ON_TIME\n"
+            "                           Should ideally be a value greater than 60 seconds, default is 120 seconds\n"
+            "     [(int)alarm=30]     : Specifies check pt save alarm time. If saving the check pt takes longer than\n"
+            "                           the alarm time, then the late flag is set on the server.\n"
+            "                           This flag will need to be cleared manually.\n"
+            "   )\n\n"
+            "Note: When the time taken to save the check pt is excessive, it can interfere with job scheduling.\n\n"
+            "It may be an indication of the following:\n\n"
+            "* slow disk\n"
+            "* file system full\n"
+            "* The definition is very large and needs to split\n\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                      # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.checkpt()                       # Save the definition held in the server to disk\n"
+            "       ci.checkpt(CheckPt.NEVER)          # Switch off check pointing\n"
+            "       ci.checkpt(CheckPt.ON_TIME)        # Start automatic check pointing at the interval stored in the server\n"
+            "       ci.checkpt(CheckPt.ON_TIME,180)    # Start automatic check pointing every 180 seconds\n"
+            "       ci.checkpt(CheckPt.ALWAYS)         # Check point at any state change in node tree. *not* recommended for large defs\n"
+            "       ci.checkpt(CheckPt.UNDEFINED,0,35) # Change check point save time alarm to 35 seconds\n"
+            "                                          # With these arguments mode and interval remain unchanged\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+
+const char* ClientDoc::restore_from_checkpt() {
+   return
+            "Request the :term:`ecflow_server` loads the :term:`check point` file from disk\n\n"
+            "The server will first try to open file at ECF_HOME/ECF_CHECK if that fails it will\n"
+            "then try path ECF_HOME/ECF_CHECKOLD.\n"
+            "An error is returned if the server has not been :term:`halted` or contains a :term:`suite definition`\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()             # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.halt_server()          # server must be halted, otherwise restore_from_checkpt will throw\n"
+            "       ci.restore_from_checkpt() # restore the definition from the check point file\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+
+const char* ClientDoc::reload_wl_file(){
+   return
+            "Request that the :term:`ecflow_server` reload the white list file.\n\n"
+            "The white list file if present, can be used to control who has read/write\n"
+            "access to the :term:`ecflow_server`::\n\n"
+            "   void reload_wl_file()\n\n"
+            "Usage::\n\n"
+            "   try:\n"
+            "       ci = Client()            # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.reload_wl_file()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::run(){
+   return
+            "Immediately run the jobs associated with the input :term:`node`.\n\n"
+            "Ignore :term:`trigger` s, :term:`limit` s, :term:`suspended`, :term:`time` or :term:`date` dependencies,\n"
+            "just run the :term:`task`.\n"
+            "When a job completes, it may be automatically re-queued if it has\n"
+            "multiple time :term:`dependencies`. In the specific case where a :term:`task` has a SINGLE\n"
+            "time dependency and we want to avoid re running the :term:`task` then\n"
+            "a flag is set so that it is not automatically re-queued when set to :term:`complete`.\n"
+            "The flag is applied up the :term:`node` hierarchy until we reach a node with a :term:`repeat`\n"
+            "or :term:`cron` attribute. This behaviour allow :term:`repeat` values to be incremented interactively.\n"
+            "A :term:`repeat` attribute is incremented when all the child nodes are :term:`complete`\n"
+            "in this case the child nodes are automatically re-queued\n::\n\n"
+            "   void run(\n"
+            "      string absolute_node_path : Path name to node. If the path is suite/family will recursively\n"
+            "                                  run all child tasks\n"
+            "      [(bool)force=False]       : If true, run even if there are nodes that are active or submitted.\n"
+            "   )\n"
+            "   void run(\n"
+            "      list  paths               : List of paths. If the path is suite/family will recursively run all child tasks\n"
+            "      [(bool)force=False]       : If true, run even if there are nodes that are active or submitted.\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                          # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.run('/s1')                          # run all tasks under suite /s1\n"
+            "\n"
+            "       path_list = ['/s1/f1/t1','/s2/f1/t2']\n"
+            "       ci.run(path_list)                      # run all tasks specified in the paths\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            "\nEffect::\n\n"
+            "   Lets see the effect of run command on the following defs::\n\n"
+            "   suite s1\n"
+            "      task t1; time 10:00             # will complete straight away\n"
+            "      task t2; time 10:00 13:00 01:00 # will re-queue 3 times and complete on fourth run\n\n"
+            "In the last case (task t2) after each run the next time slot is incremented.\n"
+            "This can be seen by calling the Why command."
+            ;
+}
+
+const char* ClientDoc::requeue(){
+
+   return
+            "Re queues the specified :term:`node` (s)::\n\n"
+            "   void requeue(\n"
+            "      list paths     : A list of paths. Node paths must begin with a leading '/' character\n"
+            "      [(str)option=''] : option = ('' | 'abort' | 'force')\n"
+            "          ''   : empty string, the default, re-queue the node\n"
+            "          abort: means re-queue only aborted tasks below node\n"
+            "          force: means re-queueing even if there are nodes that are active or submitted\n"
+            "   )\n"
+            "   void requeue(\n"
+            "      string absolute_node_path : Path name to node\n"
+            "      [(string)option='']       : option = ('' | 'abort' | 'force')\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.requeue('/s1','abort')       # re-queue aborted tasks below suite /s1\n"
+            "\n"
+            "       path_list = ['/s1/f1/t1','/s2/f1/t2']\n"
+            "       ci.requeue(path_list)\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::free_trigger_dep(){
+   return
+            "Free :term:`trigger` :term:`dependencies` for a :term:`node`::\n\n"
+            "   void free_trigger_dep(\n"
+            "      string absolute_node_path : Path name to node\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()         # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.free_trigger_dep('/s1')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::free_date_dep(){
+   return
+            "Free :term:`date` :term:`dependencies` for a :term:`node`::\n\n"
+            "   void free_date_dep(\n"
+            "      string absolute_node_path : Path name to node\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.free_date_dep('/s1')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::free_time_dep(){
+   return
+            "Free all time :term:`dependencies`. i.e :term:`time`, :term:`day`, :term:`today`, :term:`cron`::\n\n"
+            "   void free_time_dep(\n"
+            "      string absolute_node_path : Path name to node\n"
+            "   )\n\n"
+            "After freeing the time related dependencies (i.e time,today,cron)\n"
+            "the next time slot will be missed.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.free_time_dep('/s1')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::free_all_dep(){
+   return
+            "Free all :term:`trigger`, :term:`date` and all time(:term:`day`, :term:`today`, :term:`cron`,etc) :term:`dependencies`::\n\n"
+            "   void free_all_dep(\n"
+            "      string absolute_node_path : Path name to node\n"
+            "   )\n\n"
+            "After freeing the time related dependencies (i.e time,today,cron)\n"
+            "the next time slot will be missed.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.free_all_dep('/s1')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::ping(){
+   return
+            "Checks if the :term:`ecflow_server` is running::\n\n"
+            "   void ping()\n\n"
+            "The default behaviour is to check on host 'localhost' and port 3141\n"
+            "It should be noted that any Client function will fail if the server is\n"
+            "is not running. Hence ping() is not strictly required. However its main\n"
+            "distinction from other Client function is that it is quite fast.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client(\"localhost\",\"3150\")\n"
+            "       ci.ping()\n"
+            "       print \"------- Server already running------\"\n"
+            "       do_something_with_server(ci)\n"
+            "   except RuntimeError, e:\n"
+            "       print \"------- Server *NOT* running------\" + str(e)\n"
+            ;
+}
+
+const char* ClientDoc::stats(){
+   return
+            "Prints the :term:`ecflow_server` statistics to standard out::\n\n"
+            "   void stats()\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()  # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.stats()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::stats_reset(){
+   return
+            "Resets the statistical data in the server::\n\n"
+            "   void stats_reset()\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()  # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.stats_reset()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::suites(){
+   return
+            "Returns a list strings representing the :term:`suite` names.\n\n"
+            "   list(string) suites()\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()  # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       suites = ci.suites()\n"
+            "       print suites\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::ch_register() {
+   return
+            "Register interest in a set of :term:`suite` s.\n\n"
+            "If a definition has lots of suites, but the client is only interested in a small subset.\n"
+            "Then using this command can reduce network bandwidth and synchronisation will be quicker.\n"
+            "This command will create a client handle. This handle is held locally on the :py:class:`ecflow.Client`, and\n"
+            "can be used implicitly by ch_drop(),ch_add(),ch_remove() and ch_auto_add().\n"
+            "Registering a client handle affects the news() and sync() commands::\n\n"
+            "   void ch_register(\n"
+            "      bool auto_add_new_suites : true means add new suites to my list, when they are created\n"
+            "      list suite_names         : should be a list of suite names, names not in the definition are ignored\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()\n"
+            "       suite_names = [ 's1', 's2', 's3' ]\n"
+            "       ci.ch_register(True,suite_names)    # register interest in suites s1,s2,s3 and any new suites\n"
+            "       ci.ch_register(False,suite_names)   # register interest in suites s1,s2,s3 only\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+            "The client 'ci' will hold locally the client handle. Since we have made multiple calls to register\n"
+            "a handle, the variable 'ci' will hold the handle for the last call only.\n"
+            "The handle associated with the suite can be manually retrieved::\n\n"
+            "   try:\n"
+            "       ci = Client()\n"
+            "       suite_names = [ 's1', 's2', 's3' ]\n"
+            "       ci.ch_register(True,suite_names)    # register interest in suites s1,s2,s3 and any new suites\n"
+            "       client_handle = ci.ch_handle()\n    # get the handle associated with last call to ch_register\n"
+            "       ci.ch_drop( client_handle )         # de-register the handle\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+            ;
+}
+
+const char* ClientDoc::ch_suites() {
+   return
+            "Writes to standard out the list of registered handles and the suites they reference.\n\n";
+}
+
+const char* ClientDoc::ch_drop(){
+   return
+            "Drop/de-register the client handle.\n\n"
+            "Client must ensure un-used handle are dropped otherwise they will stay, in the :term:`ecflow_server`::\n\n"
+            "   void ch_drop(\n"
+            "      int client_handle : The handle must be an integer that is > 0\n"
+            "   )\n"
+            "   void ch_drop()       : Uses the local handle stored on the client, from last call to ch_register()\n\n"
+            "Exception:\n\n"
+            "- RunTimeError thrown if handle has not been previously registered\n"
+            "\nUsage::\n\n"
+            "	try:\n"
+            "      ci = Client()                      # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "      suites = [ 's1', 's2' ]\n"
+            "      ci.ch_register(False, suites)\n"
+            "      while( 1 ):\n"
+            "         # get incremental changes to suites s1 & s2, uses data stored on ci/defs\n"
+            "         ci.sync_local()                 # will only retrieve data for suites s1 & s2\n"
+            "         update(ci.get_defs())\n"
+            "	finally:\n"
+            "      ci.ch_drop()\n"
+            ;
+}
+
+const char* ClientDoc::ch_drop_user(){
+   return
+            "Drop/de-register all handles associated with user.\n\n"
+            "Client must ensure un-used handle are dropped otherwise they will stay, in the :term:`ecflow_server`::\n\n"
+            "   void ch_drop_user(\n"
+            "        string user   # If empty string will drop current user\n"
+            "   )\n\n"
+            "Exception:\n\n"
+            "- RunTimeError thrown if handle has not been previously registered\n"
+            "\nUsage::\n\n"
+            "  try:\n"
+            "      ci = Client()       # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "      suites = [ 's1', 's2' ]\n"
+            "      ci.ch_register(False, suites)\n"
+            "      while( 1 ):\n"
+            "         # get incremental changes to suites s1 & s2, uses data stored on ci/defs\n"
+            "         ci.sync_local()                 # will only retrieve data for suites s1 & s2\n"
+            "         update(ci.get_defs())\n"
+            "  finally:\n"
+            "      ci.ch_drop_user(\"\") # drop all handles associated with current user\n\n"
+            ;
+}
+
+const char* ClientDoc::ch_add() {
+   return
+            "Add a set of suites, to an existing handle::\n\n"
+            "  integer ch_add(\n"
+            "     integer handle   : the handle obtained after ch_register\n"
+            "     list suite_names : list of strings representing suite names\n"
+            "  )\n"
+            "  integer ch_add(\n"
+            "     list suite_names : list of strings representing suite names\n"
+            "  )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()        # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       suite_names = []\n"
+            "       ci.ch_register(True,suite_names)  # register interest in any new suites\n"
+            "       suite_names = [ 's1', 's2' ]\n"
+            "       ci.ch_add(suite_names)            # add suites s1,s2 to the last added handle\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+            ;
+}
+
+const char* ClientDoc::ch_remove() {
+   return
+            "Remove a set of suites, from an existing handle::\n\n"
+            "  integer ch_remove(\n"
+            "     integer handle   : the handle obtained after ch_register\n"
+            "     list suite_names : list of strings representing suite names\n"
+            "  )\n"
+            "  integer ch_remove(\n"
+            "     list suite_names : list of strings representing suite names\n"
+            "  )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                       # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       suite_names = [ 's1', 's2' , 's3']\n"
+            "       ci.ch_register(True,suite_names)    # register interest in suites s1,s2,s3 and any new suites\n"
+            "       suite_names = [ 's1' ]\n"
+            "       ci.ch_remove( suite_names )         # remove suites s1 from the last added handle\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+            ;
+}
+
+const char* ClientDoc::ch_auto_add() {
+   return
+            "Change an existing handle so that new suites can be added automatically::\n\n"
+            "   void ch_auto_add(\n"
+            "      integer handle,         : the handle obtained after ch_register\n"
+            "      bool auto_add_new_suite : automatically add new suites, this handle when they are created\n"
+            "   )\n"
+            "   void ch_auto_add(\n"
+            "      bool auto_add_new_suite : automatically add new suites using handle on the client\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                       # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       suite_names = [ 's1', 's2' , 's3']\n"
+            "       ci.ch_register(True,suite_names)    # register interest in suites s1,s2,s3 and any new suites\n"
+            "       ci.ch_auto_add( False )             # disable adding newly created suites to my handle\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+            ;
+}
+
+const char* ClientDoc::get_file(){
+   return
+            "File command can be used to request the various file types associated with a :term:`node`\n\n"
+            "This command defaults to returning a max of 10000 lines. This can be changed::\n\n"
+            "   string get_file(\n"
+            "      string absolute_node_path    : Path name to node\n"
+            "      [(string)file_type='script'] : file_type = [ script<default> | job | jobout | manual | kill | stat ]\n"
+            "      [(string)max_lines=\"10000\"]  : The number of lines in the file to return\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()        # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       for file in [ 'script', 'job', 'jobout', 'manual', 'kill', 'stat' ]:\n"
+            "   	      print ci.get_file('/suite/f1/t1',file)  # make a request to the server\n"
+            "   except RuntimeError, e:\n"
+            "      print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::plug(){
+   return
+            "Plug command is used to move :term:`node` s\n\n"
+            "The destination node can be on another :term:`ecflow_server`.\n"
+            "In which case the destination path should be of the form '//<host>:<port>/suite/family/task::\n\n"
+            "   void plug(\n"
+            "      string source_absolute_node_path       : Path name to source node\n"
+            "      string destination_absolute_node_path  : Path name to destination node. Note if only\n"
+            "                                               '//host:port' is specified the whole suite can be moved\n"
+            "   )\n\n"
+            "By default throws a RuntimeError exception for errors.\n\n"
+            "Exceptions can be raised because:\n\n"
+            "- Source :term:`node` is in a :term:`active` or :term:`submitted` state.\n"
+            "- Another user already has an lock.\n"
+            "- source/destination paths do not exist on the corresponding servers\n"
+            "- If the destination node path is empty, i.e. only host:port is specified,\n"
+            "  then the source :term:`node` must correspond to a :term:`suite`.\n"
+            "- If the source node is added as a child, then its name must be unique\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.plug('/suite','host3:3141')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::alter(){
+   return
+            "Alter command is used to change the attributes of a node::\n\n"
+            "   void alter(\n"
+            "      (list | string ) paths(s) : A single or list of paths. Path name to the node whose attributes are to be changed\n"
+            "      string alter_type         : This must be one of [ 'add' | 'change' | 'delete' | 'set_flag' | 'clear_flag' ]\n"
+            "      string attr_type          : This varies according to the 'alter_type'. valid strings are:\n"
+            "         add    : [ variable,time, today, date, day, zombie]\n"
+            "         delete : [ variable,time,today,date,day,cron,event,meter,label,trigger complete, repeat,limit,inlimit,limit_path,zombie]\n"
+            "         change : [ variable,clock-type,clock-gain,event,meter,label,trigger,complete,repeat,limit-max,limit-value]\n"
+            "         set_flag and clear_flag:\n"
+            "                  [ force_aborted | user_edit | task_aborted | edit_failed | ecfcmd_failed | no_script | killed | \n"
+            "                    migrated | late | message | complete | queue_limit | task_waiting | locked | zombie ]\n"
+            "      string name               : used to locate the attribute, when multiple attributes of the same type,\n"
+            "                                  optional for some.i.e. when changing, attributes like variable,meter,event,label,limits\n"
+            "      string value              : Only used when 'changing' a attribute. provides a new value\n"
+            "   )\n\n"
+            "Exceptions can be raised because:\n\n"
+            "- absolute_node_path does not exist.\n"
+            "- parsing fails\n"
+            "\n"
+            "The following describes the parameters in more detail::\n\n"
+            " add variable variable_name variable_value\n"
+            " add time   format    # when format is +hh:mm | hh:mm | hh:mm(start) hh:mm(finish) hh:mm(increment)\n"
+            " add today  format    # when format is +hh:mm | hh:mm | hh:mm(start) hh:mm(finish) hh:mm(increment)\n"
+            " add date   format    # when format dd.mm.yyyy, can use '*' to indicate any day,month, or year\n"
+            " add day    format    # when format is one of [ sunday,monday,tuesday,wednesday,friday,saturday ]\n"
+            " add zombie format    # when format is one of <zombie-type>:<child>:<server-action>|<client-action>:<zombie-lifetime>\n"
+            "                      #  <zombie-type> := [ user | ecf | path ]\n"
+            "                      #  <child> := [ init, event, meter, label, wait, abort, complete ]\n"
+            "                      #  <server-action> := [ adopt | delete ]\n"
+            "                      #  <client-action> := [ fob | fail | block(default) ]\n"
+            "                      #  <zombie-lifetime>:= lifetime of zombie in the server\n"
+            "                      # example\n"
+            "                      # add zombie :label:fob:0   # fob all child label request, & remove zombie as soon as possible\n"
+            "\n"
+            " delete variable name # if name is empty will delete -all- variables on the node\n"
+            " delete time name     # To delete a specific time, enter the time in same format as show above,\n"
+            "                      # or as specified in the defs file\n"
+            "                      # an empty name will delete all time attributes on the node\n"
+            " delete today name    # To delete a specific today attribute, enter in same format as show above,\n"
+            "                      # or as specified in the defs file.\n"
+            "                      # an empty name will delete all today attributes on the node\n"
+            " delete date name     # To delete a specific date attribute, enter in same format as show above,\n"
+            "                      # or as specified in the defs file\n"
+            "                      # an empty name will delete all date attributes on the node\n"
+            " delete day name      # To delete a specific day attribute, enter in same format as show above,\n"
+            "                      # or as specified in the defs file\n"
+            "                      # an empty name will delete all day attributes on the node\n"
+            " delete cron name     # To delete a specific cron attribute, enter in same as specified in the defs file\n"
+            "                      # an empty name will delete all cron attributes on the node\n"
+            " delete event name    # To delete a specific event, enter name or number\n"
+            "                      # an empty name will delete all events on the node\n"
+            " delete meter name    # To delete a specific meter , enter the meter name\n"
+            "                      # an empty name will delete all meter on the node \n"
+            " delete label name    # To delete a specific label , enter the label name\n"
+            "                      # an empty name will delete all labels on the node\n"
+            " delete limit name    # To delete a specific limit , enter the limit name\n"
+            "                      # an empty name will delete all limits on the node\n"
+            " delete inlimit name  # To delete a specific inlimit , enter the inlimit name\n"
+            "                      # an empty name will delete all inlimits on the node\n"
+            " delete limit_path limit_name limit_path # To delete a specific limit path\n"
+            " delete trigger       # A node can only have one trigger expression, hence the name is not required\n"
+            " delete complete      # A node can only have one complete expression, hence the name is not required\n"
+            " delete repeat        # A node can only have one repeat, hence the name is not required\n"
+            "\n"
+            " change variable name value    # Find the specified variable, and set the new value.\n"
+            " change clock_type name        # The name must be one of 'hybrid' or 'real'.\n"
+            " change clock_gain name        # The gain must be convertible to an integer.\n"
+            " change clock_sync name        # Sync suite calendar with the computer.\n"
+            " change event name(optional )  # if no name specified the event is set, otherwise name must be 'set' or 'clear'\n"
+            " change meter name value       # The meter value must be convertible to an integer, and between meter min-max range.\n"
+            " change label name value       # sets the label\n"
+            " change trigger name           # The name must be expression. returns an error if the expression does not parse\n"
+            " change complete name          # The name must be expression. returns an error if the expression does not parse\n"
+            " change limit_max name value   # Sets the max value of the limit. The value must be convertible to an integer\n"
+            " change limit_value name value # Sets the consumed tokens to value.The value must be convertible to an integer\n"
+            " change repeat value           # If the repeat is a date, then the value must be a valid YMD ( ie. yyyymmdd)\n"
+            "                               # and be convertible to an integer, additionally the value must be in range\n"
+            "                               # of the repeat start and end dates. Like wise for repeat integer. For repeat\n"
+            "                               # string and enum,  the name must either be an integer, that is a valid index or\n"
+            "                               # if it is a string, it must correspond to one of enum's or strings list\n"
+            "\nUsage::\n\n"
+            "  try:\n"
+            "     ci = Client()     # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "     ci.alter('/suite','change','trigger','b2 == complete')\n"
+            "  except RuntimeError, e:\n"
+            "     print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::force_state(){
+
+   return
+            "Force a node(s) to a given state\n\n"
+            "When a :term:`task` is set to :term:`complete`, it may be automatically re-queued if it has\n"
+            "multiple time :term:`dependencies`. In the specific case where a task has a single\n"
+            "time dependency and we want to interactively set it to :term:`complete`\n"
+            "a flag is set so that it is not automatically re-queued when set to complete.\n"
+            "The flag is applied up the node hierarchy until reach a node with a :term:`repeat`\n"
+            "or :term:`cron` attribute. This behaviour allow :term:`repeat` values to be incremented interactively.\n"
+            "A :term:`repeat` attribute is incremented when all the child nodes are :term:`complete`\n"
+            "in this case the child nodes are automatically re-queued\n::\n\n"
+            "   void force_state(\n"
+            "      string absolute_node_path: Path name to node. The path must begin with a leading '/'\n"
+            "      State::State state       : [ unknown | complete | queued | submitted | active | aborted ]\n"
+            "   )\n"
+            "   void force_state(\n"
+            "      list paths         : A list of absolute node paths. The paths must begin with a leading '/'\n"
+            "      State::State state : [ unknown | complete | queued | submitted | active | aborted ]\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       # force a single node to complete\n"
+            "       ci.force_state('/s1/f1',State.complete)\n"
+            "\n"
+            "       # force a list of nodes to complete\n"
+            "       paths = [ '/s1/t1', '/s1/t2', '/s1/f1/t1' ]\n"
+            "       ci.force_state(paths,State.complete)\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            "\nEffect::\n\n"
+            "   Lets see the effect of forcing complete on the following defs::\n\n"
+            "   suite s1\n"
+            "      task t1; time 10:00             # will complete straight away\n"
+            "      task t2; time 10:00 13:00 01:00 # will re-queue 3 times and complete on fourth \n\n"
+            "In the last case (task t2) after each force complete, the next time slot is incremented.\n"
+            "This can be seen by calling the Why command."
+
+            ;
+}
+
+const char* ClientDoc::force_state_recursive(){
+
+   return
+            "Force node(s) to a given state recursively::\n\n"
+            "   void force_state_recursive(\n"
+            "      string absolute_node_path: Path name to node.The paths must begin with a leading '/'\n"
+            "      State::State state       : [ unknown | complete | queued | submitted | active | aborted ]\n"
+            "   )\n"
+            "   void force_state_recursive(\n"
+            "      list  paths         : A list of absolute node paths.The paths must begin with a leading '/'\n"
+            "      State::State state  : [ unknown | complete | queued | submitted | active | aborted ]\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.force_state_recursive('/s1/f1',State.complete)\n"
+            "\n"
+            "       # recursively force a list of nodes to complete\n"
+            "       paths = [ '/s1', '/s2', '/s1/f1/t1' ]\n"
+            "       ci.force_state_recursive(paths,State.complete)\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::force_event(){
+
+   return
+            "Set or clear a :term:`event`::\n\n"
+            "   void force_event(\n"
+            "      string absolute_node_path:event: Path name to node: < event name | number>\n"
+            "                                       The paths must begin with a leading '/'\n"
+            "      string signal                  : [ set | clear ]\n"
+            "   )\n"
+            "   void force_event(\n"
+            "      list paths    : A list of absolute node paths. Each path must include a event name\n"
+            "                      The paths must begin with a leading '/'\n"
+            "      string signal : [ set | clear ]\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.force_event('/s1/f1:event_name','set')\n"
+            "\n"
+            "       # Set or clear a event for a list of events\n"
+            "       paths = [ '/s1/t1:ev1', '/s2/t2:ev2' ]\n"
+            "       ci.force_event(paths,State.complete)\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::replace(){
+   return
+            "Replaces a :term:`node` in a :term:`suite definition` with the given path. The definition is in the :term:`ecflow_server`::\n\n"
+            "   void replace(\n"
+            "      string absolute_node_path: Path name to node in the client defs.\n"
+            "                                 This is also the node we want to replace in the server.\n"
+            "      string client_defs_file  : File path to defs files, that provides the definition of the new node\n"
+            "      [(bool)parent=False]     : create parent families or suite as needed,\n"
+            "                                 when absolute_node_path does not exist in the server\n"
+            "      [(bool)force=False]      : check for zombies, if force = true, bypass checks\n"
+            "   )\n"
+            "\n"
+            "   void replace(\n"
+            "      string absolute_node_path: Path name to node in the client defs.\n"
+            "                                 This is also the node we want to replace in the server.\n"
+            "      Defs client_defs         : In memory client definition that provides the definition of the new node\n"
+            "      [(bool)parent=False]     : create parent families or suite as needed,\n"
+            "                                 when absolute_node_path does not exist in the server\n"
+            "      [(bool)force=False]      : check for zombies, force = true, bypass checks\n"
+            "   )\n"
+            "\n"
+            "Exceptions can be raised because:\n\n"
+            "- The absolute_node_path does not exist in the provided definition\n"
+            "- The provided client definition must be free of errors\n"
+            "- If the third argument is not provided, then the absolute_node_path must exist in the server defs\n"
+            "- replace will fail, if child task nodes are in :term:`active` / :term:`submitted` state\n\n"
+            "After replace is done, we check trigger expressions. These are reported to standard output.\n"
+            "It is up to the user to correct invalid trigger expressions, otherwise the tasks will *not* run.\n"
+            "Please note, you can use check() to check trigger expression and limits in the server.\n\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.replace('/s1/f1','/tmp/defs.def')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            "\n"
+            "   try:\n"
+            "       ci.replace('/s1',client_defs) # replace suite 's1' in the server, with 's1' in the client_defs\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::kill(){
+   return
+            "Kills the job associated with the :term:`node`.::\n\n"
+            "   void kill(\n"
+            "      list paths: List of paths. Paths must begin with a leading '/' character\n"
+            "   )\n"
+            "   void kill(\n"
+            "      string absolute_node_path: Path name to node to kill.\n"
+            "   )\n"
+            "\n"
+            "If a :term:`family` or :term:`suite` is selected, will kill hierarchically.\n"
+            "Kill uses the ECF_KILL_CMD variable. After :term:`variable substitution` it is invoked as a command.\n"
+            "The ECF_KILL_CMD variable should be written in such a way that the output is written to %ECF_JOB%.kill, i.e::\n\n"
+            "   kill -15 %ECF_RID% > %ECF_JOB%.kill 2>&1\n"
+            "   /home/ma/emos/bin/ecfkill %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.kill 2>&1\n\n"
+            "\n"
+            "Exceptions can be raised because:\n\n"
+            "- The absolute_node_path does not exist in the server\n"
+            "- ECF_KILL_CMD variable is not defined\n"
+            "- :term:`variable substitution` fails\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.kill('/s1/f1')\n"
+            "       time.sleep(2)\n"
+            "       print ci.file('/s1/t1','kill')  # request kill output\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::status(){
+   return
+            "Shows the status of a job associated with a :term:`task` ::\n\n"
+            "   void status(\n"
+            "      list paths: List of paths. Paths must begin with a leading '/' character\n"
+            "   )\n"
+            "   void status(\n"
+            "      string absolute_node_path\n"
+            "   )\n\n"
+            "If a :term:`family` or :term:`suite` is selected, will invoke status command hierarchically.\n"
+            "Status uses the ECF_STATUS_CMD variable. After :term:`variable substitution` it is invoked as a command.\n"
+            "The command should be written in such a way that the output is written to %ECF_JOB%.stat, i.e::\n\n"
+            "   /home/ma/emos/bin/ecfstatus  %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.stat 2>&1\n\n"
+            "Exceptions can be raised because:\n\n"
+            "- The absolute_node_path does not exist in the server\n"
+            "- ECF_STATUS_CMD variable is not defined\n"
+            "- :term:`variable substitution` fails\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.status('/s1/t1')\n"
+            "       time.sleep(2)\n"
+            "       print ci.file('/s1/t1','stats') # request status output\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::order(){
+   return
+            "Re-orders the :term:`node` s in the :term:`suite definition` held by the :term:`ecflow_server`\n\n"
+            "It should be noted that in the absence of :term:`dependencies`,\n"
+            "the order in which :term:`task` s are :term:`submitted`, depends on the order in the definition.\n"
+            "This changes the order and hence affects the submission order::\n\n"
+            "   void order(\n"
+            "      string absolute_node_path: Path name to node.\n"
+            "      string order_type        : Must be one of [ top | bottom | alpha | order | up | down ]\n"
+            "   )\n"
+            "   o top     raises the node within its parent, so that it is first\n"
+            "   o bottom  lowers the node within its parent, so that it is last\n"
+            "   o alpha   Arranges for all the peers of selected note to be sorted alphabetically\n"
+            "   o order   Arranges for all the peers of selected note to be sorted in reverse alphabet\n"
+            "   o up      Moves the selected node up one place amongst its peers\n"
+            "   o down    Moves the selected node down one place amongst its peers\n\n"
+            "Exceptions can be raised because:\n\n"
+            "- The absolute_node_path does not exist in the server\n"
+            "- The order_type is not the right type\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.order('/s1/f1','top')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::group(){
+   return
+            "Allows a series of commands to be executed in the :term:`ecflow_server`::\n\n"
+            "   void group(\n"
+            "       string cmds : a list of ';' separated commands \n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()               # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.group('get; show')\n"
+            "       ci.group('get; show state') # show node states and trigger abstract syntax trees\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::begin_suite(){
+   return
+            "Begin playing the chosen :term:`suite` s in the :term:`ecflow_server`\n"
+            "Note: using the force option may cause :term:`zombie` s::\n\n"
+            "   void begin_suite\n"
+            "      string suite_name     : begin playing the given suite\n"
+            "      [(bool)force=False]   : bypass the checks\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                  # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.begin_suite('/suite1')      # begin playing suite '/suite1'\n"
+            "       ci.begin_suite('/suite1',True) # begin playing suite '/suite1' bypass any checks"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::begin_all(){
+   return
+            "Begin playing all the :term:`suite` s in the :term:`ecflow_server`\n"
+            "Note: using the force option may cause :term:`zombie` s::\n\n"
+            "   void begin_all_suites(\n"
+            "      [(bool)force=False] : bypass the checks\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()             # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.begin_all_suites()     # begin playing all the suites\n"
+            "       ci.begin_all_suites(True) # begin playing all the suites, by passing checks\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::suspend(){
+   return
+            "Suspend :term:`job creation` / generation for the given :term:`node`::\n\n"
+            "   void suspend(\n"
+            "      list paths: List of paths. Paths must begin with a leading '/' character\n"
+            "   )\n"
+            "   void suspend(\n"
+            "      string absolute_node_path: Path name to node to suspend.\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.suspend('/s1/f1/task1')\n"
+            "       paths = ['/s1/f1/t1','/s2/f1/t2']\n"
+            "       ci.suspend(paths)\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::resume(){
+   return
+            "Resume :term:`job creation` / generation for the given :term:`node`::\n\n"
+            "   void resume(\n"
+            "      list paths: List of paths. Paths must begin with a leading '/' character\n"
+            "   )\n"
+            "   void resume(\n"
+            "      string absolute_node_path: Path name to node to resume.\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.resume('/s1/f1/task1')\n"
+            "       paths = ['/s1/f1/t1','/s2/f1/t2']\n"
+            "       ci.resume(paths)\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::job_gen(){
+   return
+            "Job submission for chosen Node *based* on :term:`dependencies`\n"
+            "The :term:`ecflow_server` traverses the :term:`node` tree every 60 seconds, and if the dependencies are free\n"
+            "does :term:`job creation` and submission. Sometimes the user may free time/date dependencies\n"
+            "to avoid waiting for the server poll, this commands allows early job generation::\n\n"
+            "   void job_generation(\n"
+            "      string absolute_node_path: Path name for job generation to start from\n"
+            "   )\n"
+            "   If empty string specified generates for full definition.\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.job_generation('/s1')  # generate jobs for suite '/s1 \n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::delete_node(){
+   return
+            "Delete the :term:`node` (s) specified.\n\n"
+            "If a node is :term:`submitted` or :term:`active`, then a Exception will be raised.\n"
+            "To force the deletion at the expense of :term:`zombie` creation, then set\n"
+            "the force parameter to true::\n\n"
+            "   void delete(\n"
+            "      list paths          : List of paths.\n"
+            "      [(bool)force=False] : If true delete even if in 'active' or 'submitted' states\n"
+            "                            Which risks creating zombies.\n"
+            "   )\n"
+            "   void delete(\n"
+             "      string absolute_node_path: Path name of node to delete.\n"
+            "      [(bool)force=False]       : If true delete even if in 'active' or 'submitted' states\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()                     # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.delete('/s1/f1/task1')\n"
+            "\n"
+            "       paths = ['/s1/f1/t1','/s2/f1/t2']\n"
+            "       ci.delete(paths)                  # delete all tasks specified in the paths\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* ClientDoc::delete_all(){
+   return
+            "Delete all the :term:`node` s held in the :term:`ecflow_server`.\n\n"
+            "The :term:`suite definition` in the server will be empty, after this call. **Use with care**\n"
+            "If a node is :term:`submitted` or :term:`active`, then a Exception will be raised.\n"
+            "To force the deletion at the expense of :term:`zombie` creation, then set\n"
+            "the force parameter to true::\n\n"
+            "   void delete_all(\n"
+            "      [(bool)force=False] : If true delete even if in 'active' or 'submitted' states\n"
+            "                            Which risks creating zombies.\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()    # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.delete_all()\n"
+            "       ci.get_server_defs()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e);    # expect failure since all nodes deleted"
+            ;
+}
+
+const char* ClientDoc::check()
+{
+   return
+            "Check :term:`trigger` and :term:`complete expression` s and :term:`limit` s\n\n"
+            "The :term:`ecflow_server` does not store :term:`extern` s. Hence all unresolved references\n"
+            "are reported as errors.\n"
+            "Returns a non empty string for any errors or warning::\n\n"
+            "   string check(\n"
+            "      list paths # List of paths.\n"
+            "   )\n"
+            "   string check(\n"
+            "      string absolute_node_path\n"
+            "   )\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()   # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       print ci.check('/suite1')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
diff --git a/ecflow_4_0_7/Pyext/src/ClientDoc.hpp b/ecflow_4_0_7/Pyext/src/ClientDoc.hpp
new file mode 100644
index 0000000..29224ee
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ClientDoc.hpp
@@ -0,0 +1,92 @@
+#ifndef CLIENT_DOC_HPP_
+#define CLIENT_DOC_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #32 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+
+// ===========================================================================
+// IMPORTANT: These appear as python doc strings.
+//            Additionally they are auto documented using sphinx-poco
+//            Hence the doc strings use reStructuredText markup.
+// ===========================================================================
+class ClientDoc : private boost::noncopyable {
+public:
+	static const char* class_client();
+  	static const char* set_host_port();
+   static const char* set_retry_connection_period();
+   static const char* set_connection_attempts();
+	static const char* get_defs();
+
+	static const char* get_log();
+	static const char* new_log();
+	static const char* clear_log();
+	static const char* flush_log();
+	static const char* log_msg();
+	static const char* restart_server();
+	static const char* halt_server();
+	static const char* shutdown_server();
+   static const char* terminate_server();
+   static const char* wait_for_server_reply();
+	static const char* load_defs();
+	static const char* load();
+	static const char* get_server_defs();
+   static const char* sync();
+   static const char* in_sync();
+   static const char* news();
+   static const char* changed_node_paths();
+	static const char* checkpt();
+	static const char* restore_from_checkpt();
+	static const char* reload_wl_file();
+	static const char* run();
+	static const char* requeue();
+   static const char* free_date_dep();
+   static const char* free_trigger_dep();
+   static const char* free_time_dep();
+   static const char* free_all_dep();
+	static const char* ping();
+   static const char* stats();
+   static const char* stats_reset();
+	static const char* suites();
+   static const char* ch_register();
+   static const char* ch_suites();
+   static const char* ch_drop();
+   static const char* ch_drop_user();
+	static const char* ch_add();
+	static const char* ch_remove();
+	static const char* ch_auto_add();
+	static const char* get_file();
+	static const char* plug();
+	static const char* alter();
+   static const char* force_state();
+   static const char* force_state_recursive();
+   static const char* force_event();
+	static const char* replace();
+   static const char* kill();
+   static const char* check();
+	static const char* status();
+	static const char* order();
+	static const char* group();
+	static const char* begin_suite();
+	static const char* begin_all();
+	static const char* suspend();
+   static const char* resume();
+   static const char* job_gen();
+	static const char* delete_node();
+	static const char* delete_all();
+
+private:
+	ClientDoc(){}
+};
+#endif
diff --git a/ecflow_4_0_7/Pyext/src/DefsDoc.cpp b/ecflow_4_0_7/Pyext/src/DefsDoc.cpp
new file mode 100644
index 0000000..7d6d718
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/DefsDoc.cpp
@@ -0,0 +1,800 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #73 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "DefsDoc.hpp"
+
+const char* DefsDoc::abs_node_path_doc()
+{
+   return  "returns a string which holds the path to the node\n\n";
+}
+
+const char* DefsDoc::part_expression_doc()
+{
+   return
+            "PartExpression holds part of a :term:`trigger` or :term:`complete expression`.\n\n"
+            "Expressions can contain references to :term:`event`, :term:`meter` s, user variables,\n"
+            ":term:`repeat` variables and generated variables. The part expression allows us\n"
+            "to split a large trigger or complete expression into smaller ones\n"
+            "\nConstructor::\n\n"
+            "  PartExpression(exp )\n"
+            "      string   exp: This represents the *first* expression\n\n"
+            "  PartExpression(exp, bool and_expr)\n"
+            "      string   exp: This represents the expression\n"
+            "      bool and_exp: If true the expression is to be anded, with a previously added expression\n"
+            "                    If false the expression is to be 'ored', with a previously added expression\n"
+            "\nUsage:\n"
+            "To add simple expression this class can be by-passed, i.e. can use::\n\n"
+            "  task = Task('t1')\n"
+            "  task.add_trigger( 't2 == active' )\n"
+            "  task.add_complete( 't2 == complete' )\n\n"
+            "To add large triggers and complete expression::\n\n"
+            "  exp1 = PartExpression('t1 == complete')\n  # a simple expression can be added as a string\n"
+            "  ....\n"
+            "  task2.add_part_trigger( PartExpression(\"t1 == complete or t4 == complete\") ) \n"
+            "  task2.add_part_trigger( PartExpression(\"t5 == active\",True) )    # anded with first expression\n"
+            "  task2.add_part_trigger( PartExpression(\"t7 == active\",False) )   # or'ed with last expression added\n\n"
+            "The trigger for task2 is equivalent to\n"
+            "'t1 == complete or t4 == complete and t5 == active or t7 == active'"
+            ;
+}
+
+const char* DefsDoc::expression_doc()
+{
+   return
+            "Expression holds :term:`trigger` or :term:`complete expression`.\n\n"
+            "Expressions can contain references to events, meters, user variables,repeat variables and generated variables.\n"
+            "Expressions hold a list of part expressions. This allows us to split a large trigger or complete\n"
+            "expression into smaller ones.\n"
+            "\nConstructor::\n\n"
+            "   Expression( expression )\n"
+            "      string expression  : This typically represents the complete expression\n"
+            "                           however part expression can still be added\n"
+            "   Expression( part )\n"
+            "      PartExpression part: The first part expression should have no 'and/or' set\n"
+            "\nUsage:\n"
+            "To add simple expression this class can be by passed, i.e. can use::\n\n"
+            "  task = Task('t1')\n"
+            "  task.add_trigger( 't2 == active' )\n"
+            "  task.add_complete( 't2 == complete' )\n"
+            "\n"
+            "  task = Task('t2')\n"
+            "  task.add_trigger( 't1 == active' )\n"
+            "  task.add_part_trigger( 't3 == active', True)\n\n"
+            "To store and add large expressions use a Expression with PartExpression::\n\n"
+            "  big_expr = Expression( PartExpression(\"t1 == complete or t4 == complete\") )\n"
+            "  big_expr.add( PartExpression(\"t5 == active\",True) )\n"
+            "  big_expr.add( PartExpression(\"t7 == active\",False) )\n"
+            "  task.add_trigger( big_expr)\n\n"
+            "In the example above the trigger for task is equivalent to\n"
+            "'t1 == complete or t4 == complete and t5 == active or t7 == active'\n\n"
+            "::\n\n"
+            "  big_expr2 = Expression('t0 == complete'))\n"
+            "  big_expr2.add( PartExpression(\"t1 == complete or t4 == complete\",True) )\n"
+            "  big_expr2.add( PartExpression(\"t5 == active\",False) )\n"
+            "  task2.add_trigger( big_expr2)\n\n"
+            "Here the trigger for task2 is equivalent to\n"
+            "'t0 == complete and t1 == complete or t4 == complete or t5 == active'"
+   ;
+}
+
+const char* DefsDoc::add_trigger_doc()
+{
+   return
+            "Add a :term:`trigger` or :term:`complete expression`.\n\n"
+            "This defines a dependency for a :term:`node`.\n"
+            "There can only be one :term:`trigger` or :term:`complete expression` dependency per node.\n"
+            "A :term:`node` with a trigger can only be activated when the trigger has expired.\n"
+            "A trigger holds a node as long as the expression returns false.\n"
+            "\nException:\n\n"
+            "- Will throw RuntimeError if multiple trigger or complete expression are added\n"
+            "- Will throw RuntimeError if first expression is added as 'AND' or 'OR' expression\n"
+            "  Like wise second and subsequent expression must have 'AND' or 'OR' booleans set\n"
+            "\nUsage:\n\n"
+            "Note we can not make multiple add_trigger(..) calls on the same :term:`task`!\n"
+            "to add a simple trigger::\n\n"
+            "  task1.add_trigger( \"t2 == active\" )\n"
+            "  task2.add_trigger( \"t1 == complete or t4 == complete\" )\n"
+            "  task3.add_trigger( \"t5 == active\" )\n"
+            "\n"
+            "Long expression can be broken up using add_part_trigger::\n\n"
+            "  task2.add_part_trigger( \"t1 == complete or t4 == complete\")\n"
+            "  task2.add_part_trigger( \"t5 == active\",True)  # True means  AND\n"
+            "  task2.add_part_trigger( \"t7 == active\",False) # False means OR\n\n"
+            "The trigger for task2 is equivalent to:\n"
+            "'t1 == complete or t4 == complete and t5 == active or t7 == active'"
+            ;
+}
+
+const char* DefsDoc::add_variable_doc()
+{
+   return
+            "Adds a name value :term:`variable`.\n\n"
+            "This defines a variable for use in :term:`variable substitution` in a :term:`ecf script` file.\n"
+            "There can be any number of variables. The variables are names inside a pair of\n"
+            "'%' characters in an :term:`ecf script`. The name are case sensitive.\n"
+            "Special character in the value, must be placed inside single quotes if misinterpretation\n"
+            "is to be avoided.\n"
+            "The value of the variable replaces the variable name in the :term:`ecf script` at :term:`job creation` time.\n"
+            "The variable names for any given node must be unique. If duplicates are added then the\n"
+            "the last value added is kept.\n"
+            "\nException:\n\n"
+            "- Writes warning to standard output, if a duplicate variable name is added\n"
+            "\nUsage::\n\n"
+            "  task.add_variable( Variable(\"ECF_HOME\",\"/tmp/\"))\n"
+            "  task.add_variable( \"TMPDIR\",\"/tmp/\")\n"
+            "  task.add_variable( \"COUNT\",2)\n"
+            "  a_dict = { \"name\":\"value\", \"name2\":\"value2\", \"name3\":\"value3\" }\n"
+            "  task.add_variable(a_dict)\n"
+            ;
+}
+
+const char* DefsDoc::add_label_doc()
+{
+   return
+            "Adds a :term:`label` to a :term:`node`.\n\n"
+            "Labels can be updated from the jobs files, via :term:`child command`\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if a duplicate label name is added\n"
+            "\nUsage::\n\n"
+            "  task.add_label( Label(\"TEA\",\"/me/\"))\n"
+            "  task.add_label( \"Joe\",\"/me/\")\n\n"
+            "The corresponding child command in the .ecf script file might be::\n"
+            "  ecflow_client --label TEA time\n"
+            "  ecflow_client --label Joe ninety\n"
+            ;
+}
+
+const char* DefsDoc::add_limit_doc()
+{
+   return
+            "Adds a :term:`limit` to a :term:`node` for simple load management.\n\n"
+            "Multiple limits can be added, however the limit name must be unique.\n"
+            "For a node to be in a limit, a :term:`inlimit` must be used.\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if a duplicate limit name is added\n"
+            "\nUsage::\n\n"
+            "  family.add_limit( Limit(\"load\",12) )\n"
+            "  family.add_limit( \"load\",12 )\n"
+            ;
+}
+
+const char* DefsDoc::add_inlimit_doc()
+{
+   return
+            "Adds a :term:`inlimit` to a :term:`node`.\n\n"
+            "InLimit reference a :term:`limit`/:py:class:`ecflow.Limit`. Duplicate InLimits are not allowed\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if a duplicate is added\n"
+            "\nUsage::\n\n"
+            "  task2.add_inlimit( InLimit(\"limitName\",\"/s1/f1\",2) )\n"
+            "  task2.add_inlimit( \"limitName\",\"/s1/f1\",2 )\n"
+            ;
+}
+
+const char* DefsDoc::suite_doc()
+{
+   return
+            "A :term:`suite` is a collection of Families,Tasks,Variables, :term:`repeat` and :term:`clock` definitions\n\n"
+            "Suite is the only node that can be started using the begin API.\n"
+            "There are two ways of adding a suite, see example below and :py:class:`ecflow.Defs.add_suite`\n"
+            "\nConstructor::\n\n"
+            "  Suite(name)\n"
+            "      string name : The Suite name. name must consist of alpha numeric characters or\n"
+            "                    underscore or dot. The first character can not be a dot, as this\n"
+            "                    will interfere with trigger expressions. Case is significant\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if the name is not valid\n"
+            "- Throws a RuntimeError if duplicate suite names added\n"
+            "\nUsage::\n\n"
+            "  defs = Defs(\"new.def\")         # create a defs\n"
+            "  suite = Suite(\"suite_1\")       # create a suite\n"
+            "  defs.add_suite(suite)          # add suite to definition\n"
+            "  suite2 = defs.add_suite(\"s2\")  # create a suite and add it to the defs\n"
+            ;
+}
+
+const char* DefsDoc::family_doc()
+{
+   return
+            "Create a :term:`family` :term:`node`.A Family node lives inside a :term:`suite` or another :term:`family`\n\n"
+            "A family is used to collect :term:`task` s together or to group other families.\n"
+            "Typically you place tasks that are related to each other inside the same family\n"
+            "analogous to the way you create directories to contain related files.\n"
+            "There are two ways of adding a family, see example below.\n"
+            "\nConstructor::\n\n"
+            "  Family(name)\n"
+            "      string name : The Family name. name must consist of alpha numeric characters or\n"
+            "                    underscore or dot. The first character can not be dot, as this\n"
+            "                    will interfere with trigger expressions. Case is significant\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if the name is not valid\n"
+            "- Throws a RuntimeError if a duplicate family is added\n"
+            "\nUsage::\n\n"
+            "  suite = Suite(\"suite_1\")       # create a suite\n"
+            "  family = Family(\"family_1\")    # create a family\n"
+            "  suite.add_family(family)       # add created family to a suite\n"
+            "  f2 = suite.add_family(\"f2\")    # create a family r2 and add to suite\n"
+            ;
+}
+
+const char* DefsDoc::task_doc()
+{
+   return
+            "Creates a :term:`task` :term:`node`.Task is a child of a :term:`suite` or :term:`family` node.\n\n"
+            "Multiple Tasks can be added, however the task names must be unique for a given parent.\n"
+            "Note case is significant. Only Tasks can be submitted. A job inside a Task :term:`ecf script` (i.e .ecf file)\n"
+            "should generally be re-entrant since a Task may be automatically submitted more than once if it aborts.\n"
+            "There are two ways of adding a task, see example below\n"
+            "\nConstructor::\n\n"
+            "   Task(name)\n"
+            "      string name : The Task name.Name must consist of alpha numeric characters or\n"
+            "                    underscore or dot. First character can not be a dot.\n"
+            "                    Case is significant\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if the name is not valid\n"
+            "- Throws a RuntimeError if a duplicate Task is added\n"
+            "\nUsage::\n\n"
+            "  task = Task(\"t1\")            # create a task\n"
+            "  family.add_task(task)        # add to the family\n"
+            "  t2 = family.add_task(\"t2\")   # create a task t2 and add to the family\n\n"
+            ;
+}
+
+const char* DefsDoc::alias_doc()
+{
+   return
+            "A Aliases is create by the GUI or via edit_script command\n\n"
+            "Aliases provide a mechanism to edit/test task scripts without effecting the suite\n"
+            "The Aliases parent is always a Task.Multiple Alias can be added\n"
+            ;
+}
+
+const char* DefsDoc::add_suite_doc()
+{
+   return
+            "Add a :term:`suite` :term:`node`. See :py:class:`ecflow.Suite`\n\n"
+            "Only one suite should be added for ease of maintenance. If a new suite is added\n"
+            "which matches the name of an existing suite, then an exception is thrown.\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError is the suite name is not valid\n"
+            "- Throws RuntimeError if duplicate suite is added\n"
+            "\nUsage::\n\n"
+            "  Defs defs(\"file.def\"         # create a defs)\n"
+            "  suite = Suite(\"suite\")       # create a Suite \n"
+            "  defs.add_suite(suite)        # add suite to defs\n"
+            "  s2 = defs.add_suite(\"s2\")    # create a suite and add to defs\n"
+            ;
+}
+
+const char* DefsDoc::add_extern_doc()
+{
+   return
+            ":term:`extern` refer to nodes that have not yet been defined typically due to cross suite :term:`dependencies`\n\n"
+            ":term:`trigger` and :term:`complete expression` s may refer to paths, and variables in other suites, that have not been\n"
+            "loaded yet. The references to node paths and variable must exist, or exist as externs\n"
+            "Externs can be added manually or automatically.\n\n"
+            "Manual Method::\n\n"
+            "  void add_extern(string nodePath )\n"
+            "\nUsage::\n\n"
+            "  defs = Defs(\"file.def\")\n"
+            "  ....\n"
+            "  defs.add_extern('/temp/bill:event_name')\n"
+            "  defs.add_extern('/temp/bill:meter_name')\n"
+            "  defs.add_extern('/temp/bill:repeat_name')\n"
+            "  defs.add_extern('/temp/bill:edit_name')\n"
+            "  defs.add_extern('/temp/bill')\n"
+            "\n"
+            "Automatic Method:\n"
+            "  This will scan all trigger and complete expressions, looking for paths and variables\n"
+            "  that have not been defined. The added benefit of this approach is that duplicates will not\n"
+            "  be added. It is the user's responsibility to check that extern's are eventually defined\n"
+            "  otherwise trigger expression will not evaluate correctly\n\n"
+            "::\n\n"
+            "  void auto_add_externs(bool remove_existing_externs_first )\n"
+            "\nUsage::\n\n"
+            "  defs = Defs(\"file.def\")\n"
+            "  ...\n"
+            "  defs.auto_add_externs(True)   # remove existing extern first.\n"
+            ;
+}
+
+
+const char* DefsDoc::node_doc()
+{
+   return
+             "A Node class is the abstract base class for Suite, Family and Task\n\n"
+             "Every Node instance has a name, and a path relative to a suite"
+             ;
+}
+
+const char* DefsDoc::node_container_doc()
+{
+   return
+             "NodeContainer is the abstract base class for a Suite and Family\n\n"
+             "A NodeContainer can have Families and Tasks as children"
+             ;
+}
+
+const char* DefsDoc::submittable_doc()
+{
+   return
+             "Submittable is the abstract base class for a Task and Alias\n\n"
+             "It provides a process id, password and try number"
+             ;
+}
+
+const char* DefsDoc::add_family_doc()
+{
+   return
+            "Add a :term:`family`. See :py:class:`ecflow.Family`.\n\n"
+            "Multiple families can be added. However family names must be unique.\n"
+            "for a given parent. Families can be hierarchical.\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if a duplicate is added\n"
+            "\nUsage::\n\n"
+            "  suite = Suite(\"suite\")          # create a suite\n"
+            "  f1 = Family(\"f1\")               # create a family\n"
+            "  suite.add_family(f1)            # add family to suite\n"
+            "  f2 = suite.add_family(\"f2\")     # create a family and add to suite\n"
+            ;
+}
+
+const char* DefsDoc::add_task_doc()
+{
+   return
+            "Add a :term:`task`. See :py:class:`ecflow.Task`\n\n"
+            "Multiple Tasks can be added. However Task names must be unique,\n"
+            "for a given parent. Task can be added to Familiy's or Suites.\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if a duplicate is added\n"
+            "\nUsage::\n\n"
+            "  f1 = Family(\"f1\")        # create a family\n"
+            "  t1 = Task(\"t1\")          # create a task\n"
+            "  f1.add_task(t1)          # add task to family\n"
+            "  t2 = f1.add_task(\"t2\")   # create task 't2' and add to family"
+            ;
+}
+
+
+const char* DefsDoc::add_definition_doc()
+{
+   return
+            "The Defs class holds the :term:`suite definition` structure.\n\n"
+            "It contains all the suites and hence acts like the root for suite node tree hierarchy.\n"
+            "The definition can be kept as python code, alternatively it can be saved as a flat\n"
+            "ASCII definition file.\n"
+            "If a definition is read in from disk, it will by default, check the :term:`trigger` expressions.\n"
+            "If however the definition is created in python, then checking should be done explicitly.\n"
+            "The Defs class take one argument which represents the file name\n\n"
+            "Example::\n\n"
+            "  defs = Defs()                      # create an empty defs\n"
+            "  suite = defs.add_suite(\"s1\")\n"
+            "  family = suite.add_family(\"f1\")\n"
+            "  for i in [ \"_1\", \"_2\", \"_3\" ]: family.add_task( \"t\" + i )\n"
+            "  defs.save_as_defs('filename.def')  # save defs into file\n"
+            "\n"
+            "Create a Defs from an existing file on disk.\n"
+            "\n"
+            "  defs = Defs('filename.def')   #  Will open and parse the file and create the Definition\n"
+            "  print defs\n"
+            ;
+}
+
+const char* DefsDoc::add_event_doc()
+{
+   return
+            "Add a :term:`event`. See :py:class:`ecflow.Event`\n"
+            "Events can be referenced in :term:`trigger` and :term:`complete expression` s\n\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if a duplicate is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task(\"t1\")\n"
+            "  t1.add_event( Event(10) )\n"
+            "  t1.add_event( Event(11,\"Eventname\") )\n"
+            "  t1.add_event( 12 )\n"
+            "  t1.add_event( 13, \"name\")\n"
+            "  t1.add_event(\"flag\")\n\n"
+            "To reference in a trigger::\n\n"
+            "  t2 = Task(\"t2\")\n"
+            "  t2.add_trigger('t1:flag == set')\n"
+            ;
+}
+
+const char* DefsDoc::add_meter_doc()
+{
+   return
+            "Add a :term:`meter`. See :py:class:`ecflow.Meter`\n"
+            "Meters can be referenced in :term:`trigger` and :term:`complete expression` s\n\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if a duplicate is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task(\"t1\")\n"
+            "  t1.add_meter( Meter(\"metername\",0,100,50) )\n"
+            "  t1.add_meter( \"meter\",0,200)\n\n"
+            "To reference in a trigger::\n\n"
+            "  t2 = Task(\"t2\")\n"
+            "  t2.add_trigger('t1:meter >= 10')\n"
+            ;
+}
+
+const char* DefsDoc::add_date_doc()
+{
+   return
+            "Add a :term:`date` time dependency\n\n"
+            "A value of zero for day,month,year means every day, every month, every year\n"
+            "\nException:\n\n"
+            "- Throws RuntimeError if an invalid date is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task(\"t1\")\n"
+            "  t1.add_date( Date(1,1,2010) ) # day,month,year\n"
+            "  t1.add_date( 2,1,2010)        # day,month,year\n"
+            "  t1.add_date( 1,0,0)           # day,month,year, the first of each month for every year\n"
+            ;
+}
+
+const char* DefsDoc::add_day_doc()
+{
+   return
+            "Add a :term:`day` time dependency\n\n"
+            "\nUsage::\n\n"
+            "  t1 = Task(\"t1\")\n"
+            "  t1.add_day( Day(Days.sunday) ) \n"
+            "  t1.add_day( Days.monday)\n"
+            "  t1.add_day( \"tuesday\")\n"
+            ;
+}
+
+const char* DefsDoc::add_today_doc()
+{
+   return
+            "Add a :term:`today` time dependency\n\n"
+            "\nUsage::\n\n"
+            "  t1 = Task(\"t1\")\n"
+            "  t1.add_today( \"00:30\" )\n"
+            "  t1.add_today( \"+00:30\" )\n"
+            "  t1.add_today( \"+00:30 20:00 01:00\" )\n"
+            "  t1.add_today( Today( 0,10 ))      # hour,min,relative =false\n"
+            "  t1.add_today( Today( 0,12,True )) # hour,min,relative\n"
+            "  t1.add_today( Today(TimeSlot(20,20),False))\n"
+            "  t1.add_today( 0,1 ))              # hour,min,relative=false\n"
+            "  t1.add_today( 0,3,False ))        # hour,min,relative=false\n"
+            "  start = TimeSlot(0,0)\n"
+            "  finish = TimeSlot(23,0)\n"
+            "  incr = TimeSlot(0,30)\n"
+            "  ts = TimeSeries( start, finish, incr, True)\n"
+            "  task2.add_today( Today(ts) )\n"
+            ;
+}
+
+const char* DefsDoc::add_time_doc()
+{
+   return
+            "Add a :term:`time` dependency\n\n"
+            "\nUsage::\n\n"
+            "  t1 = Task(\"t1\")\n"
+            "  t1.add_time( \"00:30\" )\n"
+            "  t1.add_time( \"+00:30\" )\n"
+            "  t1.add_time( \"+00:30 20:00 01:00\" )\n"
+            "  t1.add_time( Time( 0,10 ))      # hour,min,relative =false\n"
+            "  t1.add_time( Time( 0,12,True )) # hour,min,relative\n"
+            "  t1.add_time( Time(TimeSlot(20,20),False))\n"
+            "  t1.add_time( 0,1 ))              # hour,min,relative=false\n"
+            "  t1.add_time( 0,3,False ))        # hour,min,relative=false\n"
+            "  start = TimeSlot(0,0)\n"
+            "  finish = TimeSlot(23,0)\n"
+            "  incr = TimeSlot(0,30)\n"
+            "  ts = TimeSeries( start, finish, incr, True)\n"
+            "  task2.add_time( Time(ts) )\n"
+            ;
+}
+
+const char* DefsDoc::add_cron_doc()
+{
+   return
+            "Add a :term:`cron` time dependency\n\n"
+            "\nUsage::\n\n"
+            "  start = TimeSlot(0,0)\n"
+            "  finish = TimeSlot(23,0)\n"
+            "  incr = TimeSlot(0,30)\n"
+            "  time_series = TimeSeries( start, finish, incr, True)\n"
+            "  cron = Cron()\n"
+            "  cron.set_week_days( [0,1,2,3,4,5,6] )\n"
+            "  cron.set_days_of_month( [1,2,3,4,5,6] )\n"
+            "  cron.set_months( [1,2,3,4,5,6] )\n"
+            "  cron.set_time_series( time_series )\n"
+            "  t1 = Task(\"t1\")\n"
+            "  t1.add_cron( cron )\n"
+            ;
+}
+
+const char* DefsDoc::add_late_doc()
+{
+   return
+            "Add a :term:`late` attribute\n\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if more than one late is added\n"
+            "\nUsage::\n\n"
+            "   late = Late()\n"
+            "   late.submitted( 20,10 )     # hour,minute\n"
+            "   late.active(    20,10 )     # hour,minute\n"
+            "   late.complete(  20,10,True) # hour,minute,relative\n"
+            "   t1 = Task(\"t1\")\n"
+            "   t1.add_late( late )\n"
+            ;
+}
+
+const char* DefsDoc::add_autocancel_doc()
+{
+   return
+            "Add a :term:`autocancel` attribute.\n\n"
+            "This will delete the node on completion. The deletion may be delayed by\n"
+            "an amount of time in hours and minutes or expressed as days\n"
+            "Node deletion is not immediate. The nodes are checked once a minute\n"
+            "and expired auto cancel nodes are deleted\n"
+            "A node may only have one auto cancel attribute\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if more than one auto cancel is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task('t1')\n"
+            "  t1.add_autocancel( Autocancel(20,10,False) )  # hour,min, relative\n"
+            "  t2 = Task('t2')\n"
+            "  t2.add_autocancel( 3 )                        # 3 days \n"
+            "  t3 = Task('t3')\n"
+            "  t3.add_autocancel( 20,10,True )               # hour,minutes,relative \n"
+            "  t4 = Task('t4')\n"
+            "  t4.add_autocancel( TimeSlot(20,10),True )     # hour,minutes,relative \n"
+            ;
+}
+
+const char* DefsDoc::add_verify_doc()
+{
+   return
+            "Add a Verify attribute.\n\n"
+            "For DEBUG/test used to assert that a particular state was reached."
+            ;
+}
+
+const char* DefsDoc::add_repeat_date_doc()
+{
+   return
+            "Add a RepeatDate attribute.\n\n"
+            "A node can only have one repeat\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if more than one repeat is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task('t1')\n"
+            "  t1.add_repeat( RepeatDate(\"testDate\",20100111,20100115) )\n"
+            ;
+}
+
+const char* DefsDoc::add_repeat_integer_doc()
+{
+   return
+            "Add a RepeatInteger attribute.\n\n"
+            "A node can only have one :term:`repeat`\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if more than one repeat is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task('t1')\n"
+            "  t1.add_repeat( RepeatInteger(\"testInteger\",0,100,2) )\n"
+            ;
+}
+
+const char* DefsDoc::add_repeat_string_doc()
+{
+   return
+            "Add a RepeatString attribute.\n\n"
+            "A node can only have one :term:`repeat`\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if more than one repeat is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task('t1')\n"
+            "  t1.add_repeat( RepeatString(\"test_string\",['a', 'b', 'c' ] ) )\n"
+            ;
+}
+
+const char* DefsDoc::add_repeat_enumerated_doc()
+{
+   return
+            "Add a RepeatEnumerated attribute.\n\n"
+            "A node can only have one :term:`repeat`\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if more than one repeat is added\n"
+            "\nUsage::\n\n"
+            "  t1 = Task('t1')\n"
+            "  t1.add_repeat( RepeatEnumerated(\"test_string\", ['red', 'green', 'blue' ] ) )\n"
+            ;
+}
+
+const char* DefsDoc::add_repeat_day_doc()
+{
+   return
+            "Add a RepeatDay attribute.\n\n"
+            "A node can only have one :term:`repeat`\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if more than one repeat is added\n"
+            ;
+}
+
+const char* DefsDoc::add_defstatus_doc()
+{
+   return
+            "Set the default status( :term:`defstatus` ) of node at begin or re queue\n\n"
+            "A :term:`defstatus` is useful in preventing suites from running automatically\n"
+            "once begun, or in setting Task's complete so they can be run selectively\n"
+            "\nUsage::\n\n"
+            "  t1 = Task('t1')\n"
+            "  t1.add_defstatus( DState.suspended )\n"
+            ;
+}
+
+const char* DefsDoc::jobgenctrl_doc()
+{
+   return
+            "The class JobCreationCtrl is used in :term:`job creation` checking\n\n"
+            "Constructor::\n\n"
+            "   JobCreationCtrl()\n\n"
+            "\nUsage::\n\n"
+            "   defs = Defs('my.def')                     # specify the definition we want to check, load into memory\n"
+            "   job_ctrl = JobCreationCtrl()\n"
+            "   job_ctrl.set_node_path('/suite/to_check') # will hierarchically check job creation under this node\n"
+            "   defs.check_job_creation(job_ctrl)         # job files generated to ECF_JOB\n"
+            "   print job_ctrl.get_error_msg()            # report any errors in job generation\n"
+            "\n"
+            "   job_ctrl = JobCreationCtrl()              # no set_node_path() hence check job creation for all tasks\n"
+            "   job_ctrl.set_dir_for_job_creation(tmp)    # generate jobs file under this directory\n"
+            "   defs.check_job_creation(job_ctrl)\n"
+            "   print job_ctrl.get_error_msg()\n"
+            "\n"
+            "   job_ctrl = JobCreationCtrl()              # no set_node_path() hence check job creation for all tasks\n"
+            "   job_ctrl.generate_temp_dir()              # automatically generate directory for job file\n"
+            "   defs.check_job_creation(job_ctrl)\n"
+            "   print job_ctrl.get_error_msg()\n"
+            ;
+}
+
+const char* DefsDoc::check_job_creation_doc()
+{
+   return
+            "Check :term:`job creation` .\n\n"
+            "Will check the following:\n\n"
+            "- :term:`ecf script` files and includes files can be located\n"
+            "- recursive includes\n"
+            "- manual and comments :term:`pre-processing`\n"
+            "- :term:`variable substitution`\n\n"
+            "Some :term:`task` s are dummy tasks have no associated :term:`ecf script` file.\n"
+            "To disable error message for these tasks please add a variable called ECF_DUMMY_TASK to them.\n"
+            "Checking is done in conjunction with the class :py:class:`ecflow.JobCreationCtrl`.\n"
+            "If no node path is set on class JobCreationCtrl then all tasks are checked.\n"
+            "In the case where we want to check all tasks, use the convenience function that take no arguments.\n"
+            "\nUsage::\n\n"
+            "   defs = Defs('my.def')                     # specify the defs we want to check, load into memory\n"
+            "   ...\n"
+            "   print defs.check_job_creation()           # Check job generation for all tasks\n"
+            "   ...\n"
+            "   job_ctrl = JobCreationCtrl()\n"
+            "   defs.check_job_creation(job_ctrl)         # Check job generation for all tasks, same as above\n"
+            "   print job_ctrl.get_error_msg()\n"
+            "   ...\n"
+            "   job_ctrl = JobCreationCtrl()\n"
+            "   job_ctrl.set_node_path('/suite/to_check') # will hierarchically check job creation under this node\n"
+            "   defs.check_job_creation(job_ctrl)         # job files generated to ECF_JOB\n"
+            "   print job_ctrl.get_error_msg()\n"
+            "   ...\n"
+            "   job_ctrl = JobCreationCtrl()              # no set_node_path() hence check job creation for all tasks\n"
+            "   job_ctrl.set_dir_for_job_creation(tmp)    # generate jobs file under this directory\n"
+            "   defs.check_job_creation(job_ctrl)\n"
+            "   print job_ctrl.get_error_msg()\n"
+            "   ...\n"
+            "   job_ctrl = JobCreationCtrl()              # no set_node_path() hence check job creation for all tasks\n"
+            "   job_ctrl.generate_temp_dir()              # automatically generate directory for job file\n"
+            "   defs.check_job_creation(job_ctrl)\n"
+            "   print job_ctrl.get_error_msg()\n"
+            ;
+}
+
+const char* DefsDoc::generate_scripts_doc()
+{
+   return
+            "Automatically generate template :term:`ecf script` s for this definition\n"
+            "Will automatically add :term:`child command` s for :term:`event`, :term:`meter` and :term:`label` s.\n"
+            "This allows the definition to be refined with out worrying about the scripts.\n"
+            "However it should be noted that, this will create a lot of *duplicated* script contents\n"
+            "i.e in the absence of :term:`event` s, :term:`meter` s and :term:`label` s, most of generated :term:`ecf script` files will\n"
+            "be the same. Hence should only be used an aid to debugging the definition.\n"
+            "It uses the contents of the definition to parameterise what gets\n"
+            "generated, and the location of the files. Will throw Exceptions for errors.\n"
+            "\nRequires:\n\n"
+            "- ECF_HOME: specified and accessible for all Tasks, otherwise RuntimeError is raised\n"
+            "- ECF_INCLUDE: specifies location for head.h and tail.h includes, will use angle brackets,\n"
+            "               i.e %include <head.h>, if the head.h and tail.h already exist they are used otherwise\n"
+            "               they are generated\n"
+            "\nOptional:\n\n"
+            "- ECF_FILES: If specified, then scripts are generated under this directory otherwise ECF_HOME is used.\n"
+            "             The missing directories are automatically created.\n"
+            "- ECF_CLIENT_EXE_PATH: if specified child command will use this, otherwise will use ecflow_client\n"
+            "                       and assume this accessible on the path.\n"
+            "- ECF_DUMMY_TASK: Will not generated scripts for this task.\n"
+            "- SLEEP: Uses this variable to delay time between calls to child commands, if not specified uses delay of one second\n\n"
+            "\nUsage::\n\n"
+            "   defs = ecflow.Defs()\n"
+            "   suite = defs.add_suite('s1')\n"
+            "   suite.add_variable(\"ECF_HOME\",\"/user/var/home\")\n"
+            "   suite.add_variable(\"ECF_INCLUDE\",\"/user/var/home/includes\")\n"
+            "   for i in range(1,7) :\n"
+            "      fam = suite.add_family(\"f\" + str(i))\n"
+            "      for t in ( \"a\", \"b\", \"c\", \"d\", \"e\" ) :\n"
+            "        fam.add_task(t);\n"
+            "   defs.generate_scripts()   # generate '.ecf' and head.h/tail.h if required\n"
+            ;
+}
+
+const char* DefsDoc::check()
+{
+   return
+            "Check :term:`trigger` and :term:`complete expression` s and :term:`limit` s\n\n"
+            "* Client Side: The client side can specify externs. Hence all node path references\n"
+            "  in :term:`trigger` expressions, and :term:`inlimit` references to :term:`limit` s, that are\n"
+            "  unresolved and which do *not* appear in :term:`extern` s are reported as errors\n"
+            "* Server Side: The server does not store externs. Hence all unresolved references\n"
+            "  are reported as errors\n\n"
+            "Returns a non empty string for any errors or warning\n"
+            "\nUsage::\n\n"
+            "   # Client side\n"
+            "   defs = Defs('my.def')        # Load my.def from disk\n"
+            "   ....\n"
+            "   print defs.check() # do the check\n"
+            "\n"
+            "   # Server Side\n"
+            "   try:\n"
+            "       ci = Client()             # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       print ci.check('/suite')\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+            ;
+}
+
+const char* DefsDoc::simulate()
+{
+   return
+            "Simulates a :term:`suite definition` for 1 year:\n\n"
+            "Will disable infinite repeats at the suite level. i.e repeat day\n"
+            "This allows simulation to progress faster.\n"
+            "By default will run simulation for a year. If the simulation does not complete\n"
+            "creates  .flat and .depth files. This provides clues as to the state of the definition\n"
+            "at the end of the simulation\n"
+            "\nUsage::\n\n"
+            "   defs = Defs('my.def')        # specify the defs we want to simulate\n"
+            "   ....\n"
+            "   theResults = defs.simulate()\n"
+            "   print theResults\n"
+            ;
+}
+
+
+const char* DefsDoc::get_server_state()
+{
+   return
+            "Returns the :term:`ecflow_server` state: See :term:`server states`\n\n"
+            "\nUsage::\n\n"
+            "   try:\n"
+            "       ci = Client()           # use default host(ECF_NODE) & port(ECF_PORT)\n"
+            "       ci.shutdown_server()\n"
+            "       ci.sync_local()\n"
+            "       assert ci.get_defs().get_server_state() == SState.SHUTDOWN, \"Expected server to be shutdown\"\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n"
+             ;
+}
diff --git a/ecflow_4_0_7/Pyext/src/DefsDoc.hpp b/ecflow_4_0_7/Pyext/src/DefsDoc.hpp
new file mode 100644
index 0000000..d223487
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/DefsDoc.hpp
@@ -0,0 +1,71 @@
+#ifndef DEFS_DOC_HPP_
+#define DEFS_DOC_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+
+// ===========================================================================
+// IMPORTANT: These appear as python doc strings.
+//            Additionally they are auto documented using sphinx-poco
+//            Hence the doc strings use reStructuredText markup.
+// ===========================================================================
+class DefsDoc : private boost::noncopyable {
+public:
+   static const char* abs_node_path_doc();
+ 	static const char* part_expression_doc();
+ 	static const char* expression_doc();
+	static const char* add_trigger_doc();
+	static const char* add_variable_doc();
+	static const char* add_label_doc();
+	static const char* add_limit_doc();
+	static const char* add_inlimit_doc();
+   static const char* node_doc();
+   static const char* node_container_doc();
+   static const char* submittable_doc();
+   static const char* task_doc();
+   static const char* alias_doc();
+	static const char* family_doc();
+	static const char* add_suite_doc();
+	static const char* add_extern_doc();
+	static const char* add_family_doc();
+	static const char* add_task_doc();
+	static const char* suite_doc();
+	static const char* add_definition_doc();
+	static const char* add_event_doc();
+	static const char* add_meter_doc();
+	static const char* add_date_doc();
+	static const char* add_day_doc();
+	static const char* add_today_doc();
+	static const char* add_time_doc();
+	static const char* add_cron_doc();
+	static const char* add_late_doc();
+	static const char* add_autocancel_doc();
+	static const char* add_verify_doc();
+	static const char* add_repeat_date_doc();
+	static const char* add_repeat_integer_doc();
+	static const char* add_repeat_string_doc();
+	static const char* add_repeat_enumerated_doc();
+	static const char* add_repeat_day_doc();
+	static const char* add_defstatus_doc();
+	static const char* jobgenctrl_doc();
+   static const char* check_job_creation_doc();
+   static const char* generate_scripts_doc();
+	static const char* check();
+   static const char* simulate();
+   static const char* get_server_state();
+private:
+	DefsDoc(){}
+};
+#endif
diff --git a/ecflow_4_0_7/Pyext/src/EcfExt.cpp b/ecflow_4_0_7/Pyext/src/EcfExt.cpp
new file mode 100644
index 0000000..c5f7a4d
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/EcfExt.cpp
@@ -0,0 +1,45 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/python/docstring_options.hpp>
+using namespace boost::python;
+
+void export_Core();
+void export_NodeAttr();
+void export_Node();
+void export_Task();
+void export_SuiteAndFamily();
+void export_Defs();
+void export_Client();
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+BOOST_PYTHON_MODULE(ecflow)
+{
+	boost::python::docstring_options doc_options(
+	                                             true, // show the docstrings from here
+	                                             true, // show Python signatures.
+	                                             false // Don't mention the C++ method signatures in the generated docstrings
+	                                             );
+    scope().attr("__doc__") =
+    	"The ecflow module provides the python bindings/api for creating definition structure and communicating with the server.";
+
+	export_Core();
+	export_NodeAttr();
+   export_Node();
+   export_Task();
+   export_SuiteAndFamily();
+   export_Defs();
+	export_Client();
+}
diff --git a/ecflow_4_0_7/Pyext/src/ExportClient.cpp b/ecflow_4_0_7/Pyext/src/ExportClient.cpp
new file mode 100644
index 0000000..d746b64
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ExportClient.cpp
@@ -0,0 +1,329 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #85 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/noncopyable.hpp>
+
+#include "ClientInvoker.hpp"
+#include "Defs.hpp"
+#include "ClientDoc.hpp"
+#include "WhyCmd.hpp"
+#include "UrlCmd.hpp"
+#include "NState.hpp"
+#include "Version.hpp"
+#include "BoostPythonUtil.hpp"
+
+using namespace boost::python;
+using namespace std;
+namespace bp = boost::python;
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+
+void set_host_port(ClientInvoker* self, const std::string& host,int port) {self->set_host_port(host,boost::lexical_cast<std::string>(port));}
+void set_host_port_1(ClientInvoker* self, const std::string& host_port){
+   // assume format <host>:<port>
+   size_t colonPos = host_port.find_first_of(':');
+   if (colonPos == string::npos)  throw std::runtime_error("set_host_port: expected <host>:<port> : no ':' found in " + host_port);
+   std::string host = host_port.substr(0,colonPos);
+   std::string port = host_port.substr(colonPos+1);
+   self->set_host_port(host,port);
+}
+
+
+std::string version(ClientInvoker* self) { return ecf::Version::raw();}
+std::string server_version(ClientInvoker* self) { self->server_version(); return self->get_string();}
+
+const std::string& get_log(ClientInvoker* self) { self->getLog(); return self->get_string();}
+
+const std::string& get_file(ClientInvoker* self,
+                            const std::string& absNodePath,
+                            const std::string& file_type = "script",
+                            const std::string& max_lines = "10000")
+{ self->file(absNodePath,file_type,max_lines); return self->get_string(); }
+
+const std::string& get_file_1(ClientInvoker* self,
+                            const std::string& absNodePath,
+                            const std::string& file_type = "script" )
+{ self->file(absNodePath,file_type,"10000"); return self->get_string(); }
+
+
+/// Set the CLI to enable output to standard out
+class CliSetter {
+public:
+   CliSetter(ClientInvoker* self) : _self(self) {  self->set_cli(true); }
+   ~CliSetter()                                 { _self->set_cli(false);}
+private:
+   ClientInvoker* _self;
+};
+void stats(ClientInvoker* self) { CliSetter setter(self); self->stats(); }
+void stats_reset(ClientInvoker* self) { self->stats_reset(); }
+boost::python::list suites(ClientInvoker* self) {
+   self->suites();
+   const std::vector<std::string> the_suites = self->server_reply().get_string_vec();
+   boost::python::list list;
+   size_t the_size = the_suites.size();
+   for(size_t i = 0; i < the_size; i++)  list.append( the_suites[i] );
+   return list;
+}
+
+bool news_local(ClientInvoker* self) { self->news_local(); return self->get_news(); }
+
+void free_trigger_dep(ClientInvoker* self, const std::string& path) { self->freeDep(path,true /*trigger*/,false/*all*/,false/*date*/,false/*time*/); }
+void free_date_dep(ClientInvoker* self, const std::string& path)    { self->freeDep(path,false/*trigger*/,false/*all*/,true /*date*/,false/*time*/); }
+void free_time_dep(ClientInvoker* self, const std::string& path)    { self->freeDep(path,false/*trigger*/,false/*all*/,false/*date*/,true /*time*/); }
+void free_all_dep(ClientInvoker* self, const std::string& path)     { self->freeDep(path,false/*trigger*/,true /*all*/,false/*date*/,false/*time*/); }
+void free_trigger_dep1(ClientInvoker* self,const boost::python::list& list) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->freeDep(paths,true /*trigger*/,false/*all*/,false/*date*/,false/*time*/); }
+void free_date_dep1(ClientInvoker* self,   const boost::python::list& list) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->freeDep(paths,false/*trigger*/,false/*all*/,true /*date*/,false/*time*/); }
+void free_time_dep1(ClientInvoker* self,   const boost::python::list& list) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->freeDep(paths,false/*trigger*/,false/*all*/,false/*date*/,true /*time*/); }
+void free_all_dep1(ClientInvoker* self,    const boost::python::list& list) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->freeDep(paths,false/*trigger*/,true /*all*/,false/*date*/,false/*time*/); }
+
+void force_state(ClientInvoker* self, const std::string& path, NState::State state)         { self->force(path,NState::toString(state),false);}
+void force_states(ClientInvoker* self, const boost::python::list& list, NState::State state){ std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->force(paths,NState::toString(state),false);}
+void force_state_recursive(ClientInvoker* self, const std::string& path, NState::State state) { self->force(path,NState::toString(state),true);}
+void force_states_recursive(ClientInvoker* self,const boost::python::list& list,NState::State state){ std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->force(paths,NState::toString(state),true);}
+void force_event(ClientInvoker* self, const std::string& path, const std::string& set_or_clear)        { self->force(path,set_or_clear);}
+void force_events(ClientInvoker* self,const boost::python::list& list,const std::string& set_or_clear) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->force(paths,set_or_clear);}
+
+void run(ClientInvoker* self, const std::string& path,   bool force)       { self->run(path,force);}
+void runs(ClientInvoker* self,const boost::python::list& list, bool force) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths); self->run(paths,force);}
+void requeue(ClientInvoker* self,std::string path, const std::string& option) { self->requeue(path,option);}
+void requeues(ClientInvoker* self,const boost::python::list& list, const std::string& option) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->requeue(paths,option);}
+void suspend(ClientInvoker* self, const std::string& path)               { self->suspend(path);}
+void suspends(ClientInvoker* self,const boost::python::list& list) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->suspend(paths);}
+void resume(ClientInvoker* self, const std::string& path)          { self->resume(path);}
+void resumes(ClientInvoker* self,const boost::python::list& list)  { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->resume(paths);}
+void status(ClientInvoker* self, const std::string& path)          { self->status(path);}
+void statuss(ClientInvoker* self,const boost::python::list& list)  { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->status(paths);}
+void do_kill(ClientInvoker* self, const std::string& path)         { self->kill(path);}
+void do_kills(ClientInvoker* self,const boost::python::list& list) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->kill(paths);}
+const std::string& check(ClientInvoker* self, const std::string& node_path)     { self->check(node_path); return self->get_string(); }
+const std::string& checks(ClientInvoker* self, const boost::python::list& list) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->check(paths); return self->get_string(); }
+
+void delete_node(ClientInvoker* self,const boost::python::list& list, bool force) { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->delete_nodes(paths,force);}
+
+void ch_suites(ClientInvoker* self){ CliSetter cli(self);self->ch_suites();}
+void ch_register(ClientInvoker* self,bool auto_add_new_suites,const boost::python::list& list)
+{std::vector<std::string> suites;BoostPythonUtil::list_to_str_vec(list,suites); self->ch_register(auto_add_new_suites,suites);}
+
+void ch_add(ClientInvoker* self,int client_handle,const boost::python::list& list)
+{std::vector<std::string> suites;BoostPythonUtil::list_to_str_vec(list,suites); self->ch_add(client_handle,suites);}
+void ch1_add(ClientInvoker* self,const boost::python::list& list)
+{std::vector<std::string> suites;BoostPythonUtil::list_to_str_vec(list,suites); self->ch1_add(suites);}
+
+void ch_remove(ClientInvoker* self,int client_handle,const boost::python::list& list)
+{std::vector<std::string> suites;BoostPythonUtil::list_to_str_vec(list,suites); self->ch_remove(client_handle,suites);}
+void ch1_remove(ClientInvoker* self,const boost::python::list& list)
+{std::vector<std::string> suites;BoostPythonUtil::list_to_str_vec(list,suites); self->ch1_remove(suites);}
+
+/// Need to provide override since the boolean argument is optional.
+/// This saves on client python code, on having to specify the optional arg
+void replace_1(ClientInvoker* self,const std::string& absNodePath, defs_ptr client_defs) { self->replace_1(absNodePath,client_defs);}
+void replace_2(ClientInvoker* self,const std::string& absNodePath, const std::string& path_to_client_defs) { self->replace(absNodePath,path_to_client_defs);}
+
+void order(ClientInvoker* self,const std::string& absNodePath,const std::string& the_order){ self->order(absNodePath,the_order);}
+
+void alters(ClientInvoker* self,
+          const boost::python::list& list,
+          const std::string& alterType, /* one of [ add | change | delete | set_flag | clear_flag ] */
+          const std::string& attrType,
+          const std::string& name = "",
+          const std::string& value = "") { std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->check(paths);self->alter(paths,alterType,attrType,name,value); }
+void alter(ClientInvoker* self,
+          const std::string& path,
+          const std::string& alterType, /* one of [ add | change | delete | set_flag | clear_flag ] */
+          const std::string& attrType,
+          const std::string& name = "",
+          const std::string& value = "") { self->alter(path,alterType,attrType,name,value);  }
+
+void set_child_pid(ClientInvoker* self,int pid) { self->set_child_pid( boost::lexical_cast<std::string>(pid)); }
+
+
+void export_Client()
+{
+ 	class_<ClientInvoker, boost::noncopyable >("Client",ClientDoc::class_client())
+   .def( init<std::string>() /* host:port      */)
+   .def( init<std::string,std::string>() /* host, port      */)
+   .def( init<std::string,int>()         /* host, port(int) */)
+   .def("version",          &version,        "Returns the current client version")
+   .def("server_version",   &server_version, "Returns the server version, can throw for old servers, that did not implement this request.")
+   .def("set_host_port",    &ClientInvoker::set_host_port,  ClientDoc::set_host_port())
+   .def("set_host_port",    &set_host_port )
+   .def("set_host_port",    &set_host_port_1 )
+   .def("get_host",         &ClientInvoker::host, return_value_policy<copy_const_reference>(), "Return the host, assume set_host_port() has been set, otherwise return localhost" )
+   .def("get_port",         &ClientInvoker::port, return_value_policy<copy_const_reference>(), "Return the port, assume set_host_port() has been set. otherwise returns 3141" )
+   .def("set_retry_connection_period",&ClientInvoker::set_retry_connection_period,  ClientDoc::set_retry_connection_period())
+   .def("set_connection_attempts",&ClientInvoker::set_connection_attempts,  ClientDoc::set_connection_attempts())
+	.def("get_defs",         &ClientInvoker::defs,           ClientDoc::get_defs())
+	.def("in_sync",          &ClientInvoker::in_sync,        ClientDoc::in_sync())
+#ifdef DEBUG
+ 	.def("get_log" ,         &get_log,                       return_value_policy<copy_const_reference>(),ClientDoc::get_log())
+#endif
+ 	.def("new_log",          &ClientInvoker::new_log, (bp::arg("path")=""),ClientDoc::new_log())
+ 	.def("clear_log",        &ClientInvoker::clearLog,                     ClientDoc::clear_log())
+ 	.def("flush_log",        &ClientInvoker::flushLog,                     ClientDoc::flush_log())
+ 	.def("log_msg",          &ClientInvoker::logMsg,                       ClientDoc::log_msg())
+ 	.def("restart_server",   &ClientInvoker::restartServer,   ClientDoc::restart_server())
+	.def("halt_server",      &ClientInvoker::haltServer,      ClientDoc::halt_server())
+	.def("shutdown_server",  &ClientInvoker::shutdownServer,  ClientDoc::shutdown_server())
+   .def("terminate_server", &ClientInvoker::terminateServer, ClientDoc::terminate_server())
+   .def("wait_for_server_reply",&ClientInvoker::wait_for_server_reply,(bp::arg("time_out")=60), ClientDoc::wait_for_server_reply())
+	.def("load" ,            &ClientInvoker::loadDefs,(bp::arg("path_to_defs"), bp::arg("force")=false,bp::arg("check_only")=false),ClientDoc::load_defs())
+	.def("load" ,            &ClientInvoker::load,(bp::arg("defs"), bp::arg("force")=false),ClientDoc::load())
+	.def("get_server_defs",  &ClientInvoker::getDefs,         ClientDoc::get_server_defs())
+ 	.def("sync_local",       &ClientInvoker::sync_local,      ClientDoc::sync())
+ 	.def("news_local",       &news_local,                     ClientDoc::news())
+   .add_property("changed_node_paths",boost::python::range( &ClientInvoker::changed_node_paths_begin, &ClientInvoker::changed_node_paths_end),ClientDoc::changed_node_paths())
+	.def("suites" ,          &suites,                         ClientDoc::suites())
+	.def("ch_register",      &ch_register,                    ClientDoc::ch_register())
+   .def("ch_suites",        &ch_suites,                      ClientDoc::ch_suites())
+   .def("ch_handle",        &ClientInvoker::client_handle,   ClientDoc::ch_register())
+	.def("ch_drop",          &ClientInvoker::ch_drop,         ClientDoc::ch_drop())
+   .def("ch_drop",          &ClientInvoker::ch1_drop)
+   .def("ch_drop_user",     &ClientInvoker::ch_drop_user,    ClientDoc::ch_drop_user())
+	.def("ch_add",           &ch_add,                         ClientDoc::ch_add())
+	.def("ch_add",           &ch1_add )
+	.def("ch_remove",        &ch_remove,                      ClientDoc::ch_remove())
+	.def("ch_remove",        &ch1_remove)
+	.def("ch_auto_add",      &ClientInvoker::ch_auto_add,     ClientDoc::ch_auto_add())
+	.def("ch_auto_add",      &ClientInvoker::ch1_auto_add)
+   .def("checkpt",          &ClientInvoker::checkPtDefs,     (bp::arg("mode")=ecf::CheckPt::UNDEFINED, bp::arg("check_pt_interval")=0,bp::arg("check_pt_save_alarm_time")=0), ClientDoc::checkpt())
+	.def("restore_from_checkpt",&ClientInvoker::restoreDefsFromCheckPt,ClientDoc::restore_from_checkpt())
+	.def("reload_wl_file" ,  &ClientInvoker::reloadwsfile,    ClientDoc::reload_wl_file())
+   .def("requeue" ,         &requeue,                        (bp::arg("abs_node_path"), bp::arg("option")=""), ClientDoc::requeue())
+   .def("requeue" ,         &requeues,                       (bp::arg("paths"), bp::arg("option")="") )
+   .def("free_trigger_dep", &free_trigger_dep,               ClientDoc::free_trigger_dep())
+   .def("free_trigger_dep", &free_trigger_dep1 )
+   .def("free_date_dep",    &free_date_dep,                  ClientDoc::free_date_dep())
+   .def("free_date_dep",    &free_date_dep1 )
+   .def("free_time_dep",    &free_time_dep,                  ClientDoc::free_time_dep())
+   .def("free_time_dep",    &free_time_dep1)
+   .def("free_all_dep",     &free_all_dep,                   ClientDoc::free_all_dep())
+   .def("free_all_dep",     &free_all_dep1)
+	.def("ping" ,            &ClientInvoker::pingServer,      ClientDoc::ping())
+   .def("stats" ,           &stats,                          ClientDoc::stats())
+   .def("stats_reset" ,     &stats_reset,                    ClientDoc::stats_reset())
+   .def("get_file" ,        &get_file,                       return_value_policy<copy_const_reference>(), ClientDoc::get_file())
+   .def("get_file" ,        &get_file_1,                     return_value_policy<copy_const_reference>())
+	.def("plug" ,            &ClientInvoker::plug,            ClientDoc::plug())
+   .def("alter" ,           &alters,(bp::arg("paths"),bp::arg("alter_type"),bp::arg("attribute_type"),bp::arg("name")="",bp::arg("value")=""), ClientDoc::alter())
+   .def("alter" ,           &alter,(bp::arg("abs_node_path"),bp::arg("alter_type"),bp::arg("attribute_type"),bp::arg("name")="",bp::arg("value")=""))
+   .def("force_event" ,     &force_event,                    ClientDoc::force_event())
+   .def("force_event" ,     &force_events)
+   .def("force_state" ,     &force_state,                    ClientDoc::force_state())
+   .def("force_state" ,     &force_states)
+   .def("force_state_recursive",&force_state_recursive,      ClientDoc::force_state_recursive())
+   .def("force_state_recursive",&force_states_recursive)
+   .def("replace" ,         &ClientInvoker::replace,         ClientDoc::replace())
+   .def("replace" ,         &ClientInvoker::replace_1)
+   .def("replace" ,         &replace_1     )
+   .def("replace" ,         &replace_2     )
+	.def("order" ,           &order,           ClientDoc::order())
+	.def("group" ,           &ClientInvoker::group,           ClientDoc::group())
+   .def("begin_suite" ,     &ClientInvoker::begin,           (bp::arg("suite_name"),bp::arg("force")=false), ClientDoc::begin_suite())
+   .def("begin_all_suites", &ClientInvoker::begin_all_suites,(bp::arg("force")=false), ClientDoc::begin_all())
+   .def("job_generation",   &ClientInvoker::job_gen,         ClientDoc::job_gen())
+   .def("run" ,             &run,                            ClientDoc::run())
+   .def("run" ,             &runs)
+   .def("check" ,           &check,  return_value_policy<copy_const_reference>(), ClientDoc::check())
+   .def("check" ,           &checks, return_value_policy<copy_const_reference>())
+   .def("kill" ,            &do_kill,         ClientDoc::kill())
+   .def("kill" ,            &do_kills)
+   .def("status" ,          &status,          ClientDoc::status())
+   .def("status" ,          &statuss)
+   .def("suspend" ,         &suspend,         ClientDoc::suspend())
+   .def("suspend" ,         &suspends)
+   .def("resume" ,          &resume,          ClientDoc::resume())
+   .def("resume" ,          &resumes)
+   .def("delete" ,          &ClientInvoker::delete_node,     (bp::arg("abs_node_path"),bp::arg("force")=false), ClientDoc::delete_node())
+   .def("delete" ,          &delete_node,                    (bp::arg("paths"),bp::arg("force")=false))
+   .def("delete_all",       &ClientInvoker::delete_all,      (bp::arg("force")=false),                          ClientDoc::delete_all())
+   .def("debug_server_on",  &ClientInvoker::debug_server_on,  "Enable server debug, Will dump to standard out on server host.")
+   .def("debug_server_off", &ClientInvoker::debug_server_off, "Disable server debug")
+
+   .def("set_child_path",      &ClientInvoker::set_child_path ,   "Set the path to the task, obtained from server using %ECF_NAME%")
+   .def("set_child_password",  &ClientInvoker::set_child_password,"Set the password, needed for authentication, provided by the server using %ECF_PASS%")
+   .def("set_child_pid",       &ClientInvoker::set_child_pid,     "Set the process id of this job" )
+   .def("set_child_pid",       &set_child_pid,                    "Set the process id of this job" )
+   .def("set_child_try_no",    &ClientInvoker::set_child_try_no,  "Set the try no, i.e the number of times this job has run, obtained from the server, using %ECF_TRYNO%")
+   .def("set_child_timeout",   &ClientInvoker::set_child_timeout, "Set timeout if child can not connect to server, default is 24 hours. The input is required to be in seconds")
+   .def("child_init",          &ClientInvoker::child_init,    "Child command,notify server job has started")
+   .def("child_abort",         &ClientInvoker::child_abort,  (bp::arg("reason")=""), "Child command,notify server job has aborted, can provide an optional reason")
+   .def("child_event",         &ClientInvoker::child_event,   "Child command,notify server event occurred, requires the event name")
+   .def("child_meter",         &ClientInvoker::child_meter,   "Child command,notify server meter changed, requires meter name and value")
+   .def("child_label",         &ClientInvoker::child_label,   "Child command,notify server label changed, requires label name, and new value")
+   .def("child_wait",          &ClientInvoker::child_wait,    "Child command,wait for expression to come true")
+   .def("child_complete",      &ClientInvoker::child_complete,"Child command,notify server job has complete")
+	;
+
+	class_<WhyCmd,  boost::noncopyable >( "WhyCmd",
+	         "The why command reports, the reason why a node is not running.\n\n"
+	         "It needs the  definition structure and the path to node\n"
+	         "\nConstructor::\n\n"
+	         "   WhyCmd(defs, node_path)\n"
+	         "      defs_ptr  defs   : pointer to a definition structure\n"
+	         "      string node_path : The node path\n\n"
+	         "\nExceptions:\n\n"
+	         "- raises RuntimeError if the definition is empty\n"
+	         "- raises RuntimeError if the node path is empty\n"
+	         "- raises RuntimeError if the node path can not be found in the definition\n"
+	         "\nUsage::\n\n"
+	         "   try:\n"
+	         "      ci = Client()\n"
+	         "      ci.sync_local()\n"
+	         "      ask = WhyCmd(ci.get_defs(),'/suite/family')\n"
+	         "      print ask.why()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+	         ,
+			init<defs_ptr,std::string >()
+	)
+	.def("why", &WhyCmd::why, "returns a '/n' separated string, with reasons why node is not running")
+ 	;
+
+	class_<UrlCmd,  boost::noncopyable >( "UrlCmd",
+	         "Executes a command ECF_URL_CMD to display a url.\n\n"
+	         "It needs the definition structure and the path to node.\n"
+	         "\nConstructor::\n\n"
+	         "   UrlCmd(defs, node_path)\n"
+	         "      defs_ptr  defs   : pointer to a definition structure\n"
+	         "      string node_path : The node path.\n\n"
+	         "\nExceptions\n\n"
+	         "- raises RuntimeError if the definition is empty\n"
+	         "- raises RuntimeError if the node path is empty\n"
+	         "- raises RuntimeError if the node path can not be found in the definition\n"
+	         "- raises RuntimeError if ECF_URL_CMD not defined or if variable substitution fails\n"
+	         "\nUsage:\n"
+	         "Lets assume that the server has the following definition::\n\n"
+	         "   suite s\n"
+	         "      edit ECF_URL_CMD  \"${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'\"\n"
+	         "      edit ECF_URL_BASE \"http://www.ecmwf.int\"\n"
+	         "      family f\n"
+	         "         task t1\n"
+	         "            edit ECF_URL \"publications/manuals/ecflow\"\n"
+	         "         task t2\n"
+	         "            edit ECF_URL index.html\n\n"
+	         "::\n\n"
+            "   try:\n"
+	         "      ci = Client()\n"
+            "      ci.sync_local()\n"
+            "      url = UrlCmd(ci.get_defs(),'/suite/family/task')\n"
+	         "      print url.execute()\n"
+            "   except RuntimeError, e:\n"
+            "       print str(e)\n\n"
+  			,
+			init<defs_ptr,std::string >()
+	)
+	.def("execute", &UrlCmd::execute, "Displays url in the chosen browser")
+ 	;
+}
diff --git a/ecflow_4_0_7/Pyext/src/ExportCore.cpp b/ecflow_4_0_7/Pyext/src/ExportCore.cpp
new file mode 100644
index 0000000..70615e0
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ExportCore.cpp
@@ -0,0 +1,247 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #33 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+#include <boost/noncopyable.hpp>
+#include "PrintStyle.hpp"
+#include "DState.hpp"
+#include "SState.hpp"
+#include "File.hpp"
+#include "TimeSlot.hpp"
+#include "TimeSeries.hpp"
+#include "CheckPt.hpp"
+#include "Ecf.hpp"
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+// TODO:
+	template<class K, class T>
+	struct pair_to_tuple  {
+		typedef pair_to_tuple<K,T> converter;
+		typedef std::pair<K,T> ctype;
+
+		static PyObject* convert(ctype const& v)  {
+			using namespace boost::python;
+			return incref(make_tuple(v.first,v.second).ptr());
+		}
+		static void register_to_python()  {
+			boost::python::to_python_converter<ctype,converter>();
+		}
+	 };
+
+using namespace boost::python;
+using namespace std;
+using namespace ecf;
+
+bool debug_build()
+{
+#ifdef NDEBUG
+   return false;
+#else
+   return true;
+#endif
+}
+
+void export_Core()
+{
+   // For use in test only
+   def("debug_build",debug_build);
+
+	class_<File, boost::noncopyable >("File", "Utility class, Used in test only.")
+            .def("find_server", &File::find_ecf_server_path, "Provides pathname to the server")  .staticmethod("find_server")
+            .def("find_client", &File::find_ecf_client_path, "Provides pathname to the client")  .staticmethod("find_client")
+ 	;
+
+	enum_<PrintStyle::Type_t>("Style",
+	                          "Style is used to control printing output for the definition\n\n"
+	                          "- DEFS:  This style outputs the definition file in a format that is parse-able.\n"
+	                          "         and can be re-loaded back into the server.\n"
+	                          "         Externs are automatically added.\n"
+                             "         This excludes the edit history.\n"
+	                          "- STATE: The output includes additional state information for debug\n"
+	                          "         This excludes the edit history\n"
+	                          "- MIGRATE: Output includes structure and state, allow migration to future ecflow versions\n"
+                             "         This includes edit history. If file is reloaded no checking is done\n\n"
+	                          "The following shows a summary of the features associated with each choice\n"
+	                          "\n"
+	                          "   ===================== ==== ===== =======\n"
+	                          "   Functionality         DEFS STATE MIGRATE\n"
+                             "   ===================== ==== ===== =======\n"
+	                          "   Auto generate externs  Yes  Yes   No\n"
+	                          "   Checking on reload     Yes  Yes   No\n"
+	                          "   Edit History           No   No    Yes\n"
+	                          "   Show trigger AST       No   Yes   No\n"
+                             "   ===================== ==== ===== =======\n"
+	)
+	.value("NOTHING",  PrintStyle::NOTHING)
+	.value("DEFS",     PrintStyle::DEFS)
+   .value("STATE",    PrintStyle::STATE)
+   .value("MIGRATE",  PrintStyle::MIGRATE)
+	;
+
+   enum_<CheckPt::Mode>("CheckPt",
+            "CheckPt is enum that is used to control check pointing in the :term:`ecflow_server`\n\n"
+            "- NEVER  : Switches of check pointing\n"
+            "- ON_TIME: :term:`check point` file is saved periodically, specified by checkPtInterval. This is the default.\n"
+            "- ALWAYS : :term:`check point` file is saved after any state change, *not* recommended for large definitions\n"
+            "- UNDEFINED : None of the the above, used to provide default argument\n"
+   )
+   .value("NEVER",  CheckPt::NEVER)
+   .value("ON_TIME",CheckPt::ON_TIME)
+   .value("ALWAYS", CheckPt::ALWAYS)
+   .value("UNDEFINED", CheckPt::UNDEFINED)
+   ;
+
+
+	class_<PrintStyle, boost::noncopyable >("PrintStyle",
+	         "Singleton used to control the print Style.\n\n"
+ 	         "\nUsage::\n\n"
+	         "   style = PrintStyle.get_style()\n"
+	      ,
+			no_init)
+	.def("get_style", &PrintStyle::getStyle,"Returns the style, static method")
+	.staticmethod("get_style")
+	.def("set_style", &PrintStyle::setStyle,"Set the style, static method")
+	.staticmethod("set_style")
+ 	;
+
+	class_<Ecf, boost::noncopyable >("Ecf",
+			"Singleton used to control ecf debugging\n\n",
+			no_init)
+	.def("debug_equality", &Ecf::debug_equality,"Returns true if debugging of equality is enabled")
+	.staticmethod("debug_equality")
+	.def("set_debug_equality", &Ecf::set_debug_equality,"Set debugging for equality")
+	.staticmethod("set_debug_equality")
+   .def("debug_level", &Ecf::debug_level,"Returns integer showing debug level. debug_level > 0 will disable some warning messages")
+   .staticmethod("debug_level")
+   .def("set_debug_level", &Ecf::set_debug_level,"Set debug level. debug_level > 0 will disable some warning messages")
+   .staticmethod("set_debug_level")
+ 	;
+
+	enum_<NState::State>("State",
+			"Each :term:`node` can have a status, which reflects the life cycle of a node.\n\n"
+			"It varies as follows:\n\n"
+			"- When the definition file is loaded into the :term:`ecflow_server` the :term:`task` status is :term:`unknown`\n"
+			"- After begin command the :term:`task` s are either :term:`queued`, :term:`complete`, :term:`aborted` or :term:`suspended` ,\n"
+			"  a suspended task means that the task is really :term:`queued` but it must be resumed by\n"
+			"  the user first before it can be :term:`submitted`. See :py:class:`ecflow.DState`\n"
+			"- Once the :term:`dependencies` are resolved a task is submitted and placed into the :term:`submitted` state,\n"
+			"  however if the submission fails, the task is placed in a :term:`aborted` state.\n"
+			"- On a successful submission the task is placed into the :term:`active` state\n"
+			"- Before a job ends, it may send other message to the server such as:\n"
+			"  Set an :term:`event`, Change a :term:`meter`, Change a :term:`label`, send a message to log file\n\n"
+			"Jobs end by becoming either :term:`complete` or :term:`aborted`"
+			)
+	.value("unknown",  NState::UNKNOWN)
+	.value("complete", NState::COMPLETE)
+	.value("queued",   NState::QUEUED)
+	.value("aborted",  NState::ABORTED)
+	.value("submitted",NState::SUBMITTED)
+ 	.value("active",   NState::ACTIVE)
+ 	;
+
+	enum_<DState::State>("DState",
+	                     "A DState is like a ecflow.State, except for the addition of SUSPENDED\n\n"
+	                     "Suspended stops job generation, and hence is an attribute of a Node.\n"
+	                     "DState can be used for setting the default state of node when it is\n"
+	                     "begun or re queued. DState is used for defining :term:`defstatus`. See :py:class:`ecflow.Node.add_defstatus`\n"
+	                     "The default state of a :term:`node` is :term:`queued`.\n"
+	                     "\nUsage::\n\n"
+	                     "   task = ecflow.Task('t1')\n"
+	                     "   task.add_defstatus(ecflow.DState.complete)"
+			)
+	.value("unknown",  DState::UNKNOWN)
+	.value("complete", DState::COMPLETE)
+	.value("queued",   DState::QUEUED)
+	.value("aborted",  DState::ABORTED)
+	.value("submitted",DState::SUBMITTED)
+	.value("suspended",DState::SUSPENDED)
+	.value("active",   DState::ACTIVE)
+	;
+
+	enum_<SState::State>("SState",
+	         "A SState holds the :term:`ecflow_server` state\n\n"
+	         "See :term:`server states`"
+	)
+	.value("HALTED",   SState::HALTED)
+	.value("SHUTDOWN", SState::SHUTDOWN)
+	.value("RUNNING",  SState::RUNNING)
+	;
+
+
+	class_<TimeSlot>("TimeSlot",
+			"Represents a time slot.\n\n"
+	      "It is typically used as an argument to a TimeSeries or\n"
+			"other time dependent attributes of a node.\n"
+			"\n"
+			"\nConstructor::\n\n"
+			"   TimeSlot(hour,min)\n"
+			"      int hour:   represent an hour:\n"
+			"      int minute: represents a minute:\n"
+			"\nUsage::\n\n"
+			"   ts = TimeSlot(10,11)\n"
+			,
+			init<int,int>()
+		)
+	.def("__str__",     &TimeSlot::toString)       // __str__
+	.def(self == self )                            // __eq__
+	.def("hour",   &TimeSlot::hour)                // return int
+	.def("minute", &TimeSlot::minute)              // return int
+	.def("empty",  &TimeSlot::isNULL)              // return bool
+	;
+
+	// single slot, | start, finish, incr,  bool relative to suite start
+	class_<TimeSeries>("TimeSeries",
+			"A TimeSeries can hold a single time slot or a series.\n\n"
+	      "Time series can be created relative to the :term:`suite` start or start of a repeating node.\n"
+	      "A Time series can be used as argument to the :py:class:`ecflow.Time`, py:class:`ecflow.Today` and py:class:`ecflow.Cron` attributes of a node.\n"
+			"If a time the job takes to complete is longer than the interval, a 'slot' is missed\n"
+			"e.g time 10:00 20:00 01:00, if the 10.00 run takes more than an hour the 11.00 is missed\n\n"
+			"\nConstructor::\n\n"
+			"   TimeSeries(single,relative_to_suite_start)\n"
+			"      TimeSlot single :  A single point in a 24 clock \n"
+			"      optional bool relative_to_suite_start : depend on suite begin time or\n"
+			"                                              start of repeating node. Default is false\n"
+			"\n"
+			"   TimeSeries(hour,minute,relative_to_suite_start)\n"
+			"      int hour   :  hour in 24 clock \n"
+			"      int minute :  minute < 59 \n"
+			"      bool relative_to_suite_start<optional> : depend on suite begin time or\n"
+			"                                              start of repeating node. Default is false\n"
+			"\n"
+			"   TimeSeries(start,finish,increment,relative_to_suite_start)\n"
+			"      start TimeSlot :     The start time  \n"
+			"      finish TimeSlot :    The finish time, when used in a series. This must greater than the start.\n"
+			"      increment TimeSlot : The increment. This must be less that difference between start and finish\n"
+			"      bool relative_to_suite_start<optional> : The time is relative suite start, or start of repeating node.\n"
+			"                                               The default is false\n"
+			"\nExceptions:\n\n"
+			"- Raises IndexError when an invalid time series is specified\n"
+ 			"\nUsage::\n\n"
+			"   time_series = TimeSeries(TimeSlot(10,11),False)\n"			,
+			init<TimeSlot, optional<bool> >())
+ 	.def( init<int,int,optional<bool> >())
+	.def( init<TimeSlot,TimeSlot,TimeSlot,optional<bool> >())
+ 	.def("__str__",     &TimeSeries::toString)         // __str__
+ 	.def(self == self )                                // __eq__
+	.def("has_increment", &TimeSeries::hasIncrement,"distinguish between a single time slot and a series. returns true for a series")  // false if single time slot
+	.def("start",         &TimeSeries::start , return_value_policy<copy_const_reference>(),"returns the start time") // returns a time slot
+	.def("finish",        &TimeSeries::finish, return_value_policy<copy_const_reference>(),"returns the finish time if time series specified, else returns a NULL time slot") // returns a time slot
+	.def("incr",          &TimeSeries::incr,   return_value_policy<copy_const_reference>()," returns the increment time if time series specified, else returns a NULL time slot") // returns a time slot
+	.def("relative",      &TimeSeries::relative,"returns a boolean where true means that the time series is relative")
+ 	;
+
+	using namespace boost::python;
+ 	pair_to_tuple<std::string,std::string>::register_to_python();
+}
diff --git a/ecflow_4_0_7/Pyext/src/ExportDefs.cpp b/ecflow_4_0_7/Pyext/src/ExportDefs.cpp
new file mode 100644
index 0000000..7033f76
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ExportDefs.cpp
@@ -0,0 +1,189 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #93 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/noncopyable.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "PrintStyle.hpp"
+#include "File.hpp"
+#include "DefsStructureParser.hpp"
+#include "JobCreationCtrl.hpp"
+#include "Simulator.hpp"
+#include "BoostPythonUtil.hpp"
+
+#include "DefsDoc.hpp"
+
+using namespace ecf;
+using namespace boost::python;
+using namespace std;
+namespace bp = boost::python;
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+
+void save_as_defs(const Defs& theDefs, const std::string& filename, PrintStyle::Type_t the_style_enum)
+{
+   PrintStyle style(the_style_enum);
+   std::stringstream ss; ss << theDefs;
+
+   std::string file_creation_error_msg;
+   if (!File::create(filename,ss.str(),file_creation_error_msg)) {
+      std::string error = "save_as_defs failed: ";
+      error += file_creation_error_msg;
+      throw std::runtime_error(error);
+   }
+}
+
+void save_as_defs_1(const Defs& theDefs, const std::string& filename)
+{
+   save_as_defs(theDefs,filename,PrintStyle::DEFS);
+}
+
+static defs_ptr create_defs(const std::string& file_name)
+{
+   defs_ptr defs = Defs::create();
+
+   DefsStructureParser checkPtParser( defs.get(), file_name );
+   std::string errorMsg,warningMsg;
+   if (!checkPtParser.doParse(errorMsg,warningMsg)) {
+      throw std::runtime_error(errorMsg);
+   }
+   if (!warningMsg.empty()) std::cerr << warningMsg;
+   return defs;
+}
+
+std::string check_defs(defs_ptr defs)
+{
+	std::string  error_msg;
+	std::string  warning_msg;
+ 	if (defs.get() && !defs->check(error_msg,warning_msg)) {
+ 		error_msg += "\n";
+ 		error_msg += warning_msg;
+ 		return error_msg;
+ 	}
+ 	return warning_msg;
+}
+
+void save_as_checkpt(defs_ptr defs, const std::string& file_name)
+{
+   defs->save_as_checkpt(file_name); // use default ARCHIVE
+}
+
+void restore_from_checkpt(defs_ptr defs, const std::string& file_name)
+{
+   defs->restore_from_checkpt(file_name); // use default ARCHIVE
+}
+
+std::string simulate(defs_ptr defs)
+{
+   if (defs.get()) {
+      // name output file after name of the first suite
+      std::string defs_filename = "pyext.def";
+      if (!defs->suiteVec().empty()) {
+         defs_filename = (*defs->suiteVec().begin())->name() + ".def";
+      }
+
+      Simulator simulator;
+      std::string errorMsg;
+      if (!simulator.run(*defs, defs_filename, errorMsg)) {
+         return errorMsg;
+      }
+   }
+	return string();
+}
+
+SState::State get_server_state(defs_ptr self) { return self->server().get_state(); }
+
+/// Since we don't pass in a child pos, the nodes are added to the end
+void add_suite(defs_ptr self,suite_ptr s){ self->addSuite(s); }
+
+std::vector<task_ptr> get_all_tasks(defs_ptr self){ std::vector<task_ptr> tasks; self->get_all_tasks(tasks); return tasks; }
+std::vector<node_ptr> get_all_nodes(defs_ptr self){ std::vector<node_ptr> nodes; self->get_all_nodes(nodes); return nodes; }
+
+// Context management, Only used to provide indentation
+defs_ptr defs_enter(defs_ptr self) { return self;}
+bool defs_exit(defs_ptr self,const boost::python::object& type,const boost::python::object& value,const boost::python::object& traceback){return false;}
+
+std::string check_job_creation(defs_ptr defs)
+{
+   job_creation_ctrl_ptr jobCtrl = boost::make_shared<JobCreationCtrl>();
+   defs->check_job_creation(jobCtrl);
+   return jobCtrl->get_error_msg();
+}
+
+// Add  server user variables
+defs_ptr add_variable(defs_ptr self,const std::string& name, const std::string& value) {
+   self->set_server().add_or_update_user_variables(name,value); return self;}
+defs_ptr add_variable_int(defs_ptr self,const std::string& name, int value) {
+   self->set_server().add_or_update_user_variables(name, boost::lexical_cast<std::string>(value)); return self;}
+defs_ptr add_variable_var(defs_ptr self,const Variable& var) {
+   self->set_server().add_or_update_user_variables(var.name(),var.theValue()); return self;}
+defs_ptr add_variable_dict(defs_ptr self,const boost::python::dict& dict) {
+   std::vector<std::pair<std::string,std::string> > vec;
+   BoostPythonUtil::dict_to_str_vec(dict,vec);
+   std::vector<std::pair<std::string,std::string> >::iterator i;
+   std::vector<std::pair<std::string,std::string> >::iterator vec_end = vec.end();
+   for(i = vec.begin(); i != vec_end; ++i) {
+      self->set_server().add_or_update_user_variables((*i).first,(*i).second);
+   }
+   return self;
+}
+void delete_variable(defs_ptr self,const std::string& name) { self->set_server().delete_user_variable(name);}
+
+
+void export_Defs()
+{
+	class_<Defs, boost::noncopyable, defs_ptr >( "Defs", DefsDoc::add_definition_doc() ,init<>("Create a empty Defs"))
+   .def("__init__",make_constructor(&create_defs),         DefsDoc::add_definition_doc())
+	.def(self == self )                                           // __eq__
+	.def("__str__",               &Defs::toString)                // __str__
+   .def("__enter__",             &defs_enter)                    // allow with statement, hence indentation support
+   .def("__exit__",              &defs_exit)                     // allow with statement, hence indentation support
+   .def("add_suite",             &add_suite,               DefsDoc::add_suite_doc())
+   .def("add_suite",             &Defs::add_suite )
+ 	.def("add_extern",            &Defs::add_extern,        DefsDoc::add_extern_doc())
+	.def("auto_add_externs",      &Defs::auto_add_externs,  DefsDoc::add_extern_doc())
+   .def("add_variable",          &add_variable,            DefsDoc::add_variable_doc())
+   .def("add_variable",          &add_variable_int)
+   .def("add_variable",          &add_variable_var)
+   .def("add_variable",          &add_variable_dict)
+   .def("delete_variable",       &delete_variable,"An empty string will delete all user variables")
+	.def("find_suite",            &Defs::findSuite,"Given a name, find the corresponding :term:`suite`")
+   .def("find_abs_node",         &Defs::findAbsNode,"Given a path, find the the :term:`node`")
+   .def("get_all_nodes",         &get_all_nodes,"Returns all the :term:`node` s in the definition")
+   .def("get_all_tasks",         &get_all_tasks,"Returns all the :term:`task` nodes")
+	.def("has_time_dependencies", &Defs::hasTimeDependencies,"returns True if the :term:`suite definition` has any time :term:`dependencies`")
+	.def("save_as_checkpt",       &save_as_checkpt, "Save the in memory :term:`suite definition` as a :term:`check point` file. This includes all node state.")
+	.def("restore_from_checkpt",  &restore_from_checkpt, "Restore the :term:`suite definition` from a :term:`check point` file stored on disk")
+   .def("save_as_defs",          &save_as_defs,   "Save the in memory :term:`suite definition` into a file. The file name must be passed as an argument\n\n")
+   .def("save_as_defs",          &save_as_defs_1, "Save the in memory :term:`suite definition` into a file. The file name must be passed as an argument\n\n")
+	.def("check",                 &check_defs,               DefsDoc::check())
+	.def("simulate",              &simulate,                 DefsDoc::simulate())
+   .def("check_job_creation",    &check_job_creation,       DefsDoc::check_job_creation_doc() )
+   .def("check_job_creation",    &Defs::check_job_creation)
+   .def("generate_scripts",      &Defs::generate_scripts,   DefsDoc::generate_scripts_doc() )
+   .def("get_state",             &Defs::state )
+   .def("get_server_state",      &get_server_state,         DefsDoc::get_server_state() )
+	.add_property("suites",       boost::python::range( &Defs::suite_begin, &Defs::suite_end),"Returns a list of :term:`suite` s")
+	.add_property("externs",      boost::python::range( &Defs::extern_begin, &Defs::extern_end),"Returns a list of :term:`extern` s" )
+   .add_property("user_variables", boost::python::range( &Defs::user_variables_begin, &Defs::user_variables_end),"Returns a list of user defined :term:`variable` s" )
+   .add_property("server_variables", boost::python::range( &Defs::server_variables_begin, &Defs::server_variables_end),"Returns a list of server :term:`variable` s" )
+	;
+}
diff --git a/ecflow_4_0_7/Pyext/src/ExportNode.cpp b/ecflow_4_0_7/Pyext/src/ExportNode.cpp
new file mode 100644
index 0000000..673ddd3
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ExportNode.cpp
@@ -0,0 +1,279 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #85 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/noncopyable.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
+#include "Expression.hpp"
+#include "JobCreationCtrl.hpp"
+#include "BoostPythonUtil.hpp"
+
+#include "DefsDoc.hpp"
+#include "NodeAttrDoc.hpp"
+
+using namespace ecf;
+using namespace boost::python;
+using namespace std;
+namespace bp = boost::python;
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+
+Defs* get_defs(node_ptr self) { return self->defs(); }
+
+node_ptr add_variable(node_ptr self,const std::string& name, const std::string& value) { self->add_variable(name,value); return self;}
+node_ptr add_variable_int(node_ptr self,const std::string& name, int value) { self->add_variable_int(name,value); return self;}
+node_ptr add_variable_var(node_ptr self,const Variable& var) { self->addVariable(var); return self;}
+node_ptr add_variable_dict(node_ptr self,const boost::python::dict& dict) {
+   std::vector<std::pair<std::string,std::string> > vec;
+   BoostPythonUtil::dict_to_str_vec(dict,vec);
+   std::vector<std::pair<std::string,std::string> >::iterator i;
+   std::vector<std::pair<std::string,std::string> >::iterator vec_end = vec.end();
+   for(i = vec.begin(); i != vec_end; ++i) {
+      self->add_variable((*i).first,(*i).second);
+   }
+   return self;
+}
+
+node_ptr add_event(node_ptr self,const Event& e)                       { self->addEvent(e); return self; }
+node_ptr add_event_1(node_ptr self,int number)                         { self->addEvent(Event(number)); return self; }
+node_ptr add_event_2(node_ptr self,int number,const std::string& name) { self->addEvent(Event(number,name)); return self;  }
+node_ptr add_event_3(node_ptr self,const std::string& name)            { self->addEvent(Event(name)); return self; }
+
+node_ptr add_meter(node_ptr self,const Meter& m)                                                     { self->addMeter(m); return self;}
+node_ptr add_meter_1(node_ptr self,const std::string& meter_name, int min,int max, int color_change) { self->addMeter(Meter(meter_name,min,max,color_change)); return self;}
+node_ptr add_meter_2(node_ptr self,const std::string& meter_name, int min,int max)                   { self->addMeter(Meter(meter_name,min,max));return self; }
+
+node_ptr add_label(node_ptr self,const std::string& name, const std::string& value) { self->addLabel(Label(name,value)); return self; }
+node_ptr add_label_1(node_ptr self,const Label& label) { self->addLabel(label); return self; }
+node_ptr add_limit(node_ptr self,const std::string& name, int limit)                { self->addLimit(Limit(name,limit)); return self;}
+node_ptr add_limit_1(node_ptr self,const Limit& limit)                { self->addLimit(limit); return self;}
+node_ptr add_in_limit(node_ptr self,const std::string& name,const std::string& pathToNode,int tokens) { self->addInLimit(InLimit(name,pathToNode,tokens)); return self;}
+node_ptr add_in_limit_1(node_ptr self,const InLimit& inlimit) { self->addInLimit(inlimit); return self;}
+node_ptr add_time(node_ptr self,int hour, int minute)                    { self->addTime(ecf::TimeAttr(hour,minute));return self; }
+node_ptr add_time_1(node_ptr self,int hour, int minute, bool relative)   { self->addTime(ecf::TimeAttr(hour,minute,relative)); return self;}
+node_ptr add_time_2(node_ptr self,const std::string& ts)                 { self->addTime(ecf::TimeAttr(TimeSeries::create(ts)));return self;}
+node_ptr add_time_3(node_ptr self,const ecf::TimeAttr& ts)               { self->addTime(ts);return self;}
+node_ptr add_today(node_ptr self,int hour, int minute)                   { self->addToday(ecf::TodayAttr(hour,minute)); return self;}
+node_ptr add_today_1(node_ptr self,int hour, int minute, bool relative)  { self->addToday(ecf::TodayAttr(hour,minute,relative)); return self;}
+node_ptr add_today_2(node_ptr self,const std::string& ts)                { self->addToday(ecf::TodayAttr(TimeSeries::create(ts)));return self;}
+node_ptr add_today_3(node_ptr self,const ecf::TodayAttr& ts)             { self->addToday(ts);return self;}
+node_ptr add_date(node_ptr self,int day, int month, int year)            { self->addDate(DateAttr(day,month,year)); return self;}
+node_ptr add_date_1(node_ptr self,const DateAttr& d)                     { self->addDate(d); return self;}
+node_ptr add_day(node_ptr self,DayAttr::Day_t day )                      { self->addDay(DayAttr(day)); return self;}
+node_ptr add_day_1(node_ptr self,const std::string& day )                { self->addDay(DayAttr(DayAttr::getDay(day))); return self;}
+node_ptr add_day_2(node_ptr self,const DayAttr& day )                    { self->addDay(day); return self;}
+node_ptr add_autocancel(node_ptr self,int days )                         { self->addAutoCancel(ecf::AutoCancelAttr(days)); return self;}
+node_ptr add_autocancel_1(node_ptr self,int hour, int min,bool relative) { self->addAutoCancel(ecf::AutoCancelAttr(hour,min,relative)); return self;}
+node_ptr add_autocancel_2(node_ptr self,const TimeSlot& ts,bool relative){ self->addAutoCancel(ecf::AutoCancelAttr(ts,relative)); return self;}
+node_ptr add_autocancel_3(node_ptr self, const ecf::AutoCancelAttr& attr){ self->addAutoCancel(attr); return self;}
+node_ptr add_zombie(node_ptr self, const ZombieAttr& attr){ self->addZombie(attr); return self;}
+
+node_ptr add_cron(node_ptr self,const ecf::CronAttr& attr)      { self->addCron(attr); return self; }
+node_ptr add_late(node_ptr self,const ecf::LateAttr& attr)      { self->addLate(attr); return self; }
+std::string get_state_change_time(node_ptr self,const std::string& format)
+{
+   if (format == "iso_extended") return to_iso_extended_string(self->state_change_time());
+   else if (format == "iso") return to_iso_string(self->state_change_time());
+   return to_simple_string(self->state_change_time());
+}
+
+node_ptr add_defstatus(node_ptr self,DState::State s)      { self->addDefStatus(s); return self; }
+
+node_ptr add_repeat_date(node_ptr self,const RepeatDate& d)       { self->addRepeat(d); return self; }
+node_ptr add_repeat_integer(node_ptr self,const RepeatInteger& d) { self->addRepeat(d); return self; }
+node_ptr add_repeat_string(node_ptr self,const RepeatString& d)   { self->addRepeat(d); return self; }
+node_ptr add_repeat_enum(node_ptr self,const RepeatEnumerated& d) { self->addRepeat(d); return self; }
+node_ptr add_repeat_day(node_ptr self,const RepeatDay& d)         { self->addRepeat(d); return self; }
+
+node_ptr add_trigger(node_ptr self,const std::string& expr)      { self->add_trigger(expr); return self; }
+node_ptr add_trigger_expr(node_ptr self,const Expression& expr)  { self->add_trigger_expr(expr); return self; }
+node_ptr add_complete(node_ptr self,const std::string& expr)     { self->add_complete(expr); return self; }
+node_ptr add_complete_expr(node_ptr self,const Expression& expr) { self->add_complete_expr(expr); return self; }
+node_ptr add_part_trigger(node_ptr self,const PartExpression& expr)  { self->add_part_trigger(PartExpression(expr)); return self; }
+node_ptr add_part_trigger_1(node_ptr self,const std::string& expression)                { self->add_part_trigger(PartExpression(expression)); return self;}
+node_ptr add_part_trigger_2(node_ptr self,const std::string& expression, bool and_expr) { self->add_part_trigger(PartExpression(expression,and_expr)); return self;}
+node_ptr add_part_complete(node_ptr self,const PartExpression& expr)  { self->add_part_complete(PartExpression(expr)); return self; }
+node_ptr add_part_complete_1(node_ptr self,const std::string& expression)                 { self->add_part_complete(PartExpression(expression)); return self;}
+node_ptr add_part_complete_2(node_ptr self,const std::string& expression, bool and_expr){ self->add_part_complete(PartExpression(expression,and_expr)); return self;}
+bool evaluate_trigger(node_ptr self) { Ast* t = self->triggerAst(); if (t) return t->evaluate();return false;}
+bool evaluate_complete(node_ptr self) { Ast* t = self->completeAst(); if (t) return t->evaluate();return false;}
+
+static job_creation_ctrl_ptr makeJobCreationCtrl() { return boost::make_shared<JobCreationCtrl>();}
+
+void export_Node()
+{
+   class_<JobCreationCtrl, boost::noncopyable, job_creation_ctrl_ptr >("JobCreationCtrl",  DefsDoc::jobgenctrl_doc())
+   .def("__init__",make_constructor(makeJobCreationCtrl), DefsDoc::jobgenctrl_doc())
+   .def("set_node_path", &JobCreationCtrl::set_node_path, "The node we want to check job creation for. If no node specified check all tasks")
+   .def("set_dir_for_job_creation", &JobCreationCtrl::set_dir_for_job_creation, "Specify directory, for job creation")
+   .def("get_dir_for_job_creation", &JobCreationCtrl::dir_for_job_creation, return_value_policy<copy_const_reference>(), "Returns the directory set for job creation")
+   .def("generate_temp_dir", &JobCreationCtrl::generate_temp_dir, "Automatically generated temporary directory for job creation. Directory written to stdout for information")
+   .def("get_error_msg", &JobCreationCtrl::get_error_msg, return_value_policy<copy_const_reference>(),"Returns an error message generated during checking of job creation")
+   ;
+
+   // mimic PartExpression(const std::string& expression  )
+   // mimic PartExpression(const std::string& expression, bool andExpr /* true means AND , false means OR */ )
+   // Use to adding large trigger and complete expressions
+   class_<PartExpression>("PartExpression",DefsDoc::part_expression_doc(), init<std::string>())
+   .def(init<std::string,bool>())
+   .def(self == self )                 // __eq__
+   .def("get_expression", &PartExpression::expression, return_value_policy<copy_const_reference>(), "returns the part expression as a string")
+   .def("and_expr",       &PartExpression::andExpr)
+   .def("or_expr",        &PartExpression::orExpr)
+   ;
+
+   class_<Expression,  boost::shared_ptr<Expression> >("Expression",DefsDoc::expression_doc(), init<std::string>() )
+   .def(init<PartExpression>())
+   .def(self == self )                               // __eq__
+   .def("__str__",        &Expression::expression)   // __str__
+   .def("get_expression", &Expression::expression, "returns the complete expression as a string")
+   .def("add",            &Expression::add,"Add a part expression, the second and subsequent part expressions must have 'and/or' set")
+   .add_property("parts", boost::python::range( &Expression::part_begin, &Expression::part_end),"Returns a list of PartExpression's" )
+   ;
+
+   // Turn off proxies by passing true as the NoProxy template parameter.
+   // shared_ptrs don't need proxies because calls on one a copy of the
+   // shared_ptr will affect all of them (duh!).
+   class_<std::vector<node_ptr> >("NodeVec", "Hold a list of Nodes (i.e :term:`suite`, :term:`family` or :term:`task` s)")
+   .def(vector_indexing_suite<std::vector<node_ptr> , true >()) ;
+
+   // Note: we have have not added __setattr__, as it seems to interfere with
+   // classes derived from Node. i.e calling self.fred = bill in the derived class
+   // expects self to be of type Node.
+   class_<Node, boost::noncopyable, node_ptr >("Node", DefsDoc::node_doc(), no_init)
+   .def("name",&Node::name, return_value_policy<copy_const_reference>() )
+   .def("add_trigger",      &add_trigger,             DefsDoc::add_trigger_doc())
+   .def("add_trigger",      &add_trigger_expr)
+   .def("add_complete",     &add_complete,            DefsDoc::add_trigger_doc())
+   .def("add_complete",     &add_complete_expr)
+   .def("add_part_trigger" ,&add_part_trigger,        DefsDoc::add_trigger_doc())
+   .def("add_part_trigger" ,&add_part_trigger_1 )
+   .def("add_part_trigger" ,&add_part_trigger_2 )
+   .def("add_part_complete",&add_part_complete,          DefsDoc::add_trigger_doc())
+   .def("add_part_complete",&add_part_complete_1 )
+   .def("add_part_complete",&add_part_complete_2 )
+   .def("evaluate_trigger", &evaluate_trigger ,"evaluate trigger expression")
+   .def("evaluate_complete",&evaluate_complete ,"evaluate complete expression")
+   .def("add_variable",     &add_variable,               DefsDoc::add_variable_doc())
+   .def("add_variable",     &add_variable_int)
+   .def("add_variable",     &add_variable_var)
+   .def("add_variable",     &add_variable_dict)
+   .def("add_label",        &add_label,                  DefsDoc::add_label_doc())
+   .def("add_label",        &add_label_1)
+   .def("add_limit",        &add_limit,                  DefsDoc::add_limit_doc())
+   .def("add_limit",        &add_limit_1)
+   .def("add_inlimit",      &add_in_limit,(bp::arg("limit_name"),bp::arg("path_to_node_containing_limit")="",bp::arg("tokens")=1),DefsDoc::add_inlimit_doc())
+   .def("add_inlimit",      &add_in_limit_1)
+   .def("add_event",        &add_event,                  DefsDoc::add_event_doc())
+   .def("add_event",        &add_event_1)
+   .def("add_event",        &add_event_2)
+   .def("add_event",        &add_event_3)
+   .def("add_meter",        &add_meter,                  DefsDoc::add_meter_doc())
+   .def("add_meter",        add_meter_1)
+   .def("add_meter",        add_meter_2)
+   .def("add_date",         &add_date,                   DefsDoc::add_date_doc() )
+   .def("add_date",         &add_date_1)
+   .def("add_day",          &add_day,                    DefsDoc::add_day_doc())
+   .def("add_day",          &add_day_1)
+   .def("add_day",          &add_day_2)
+   .def("add_today",        &add_today,                  DefsDoc::add_today_doc())
+   .def("add_today",        &add_today_1)
+   .def("add_today",        &add_today_2)
+   .def("add_today",        &add_today_3)
+   .def("add_time",         &add_time,                   DefsDoc::add_time_doc())
+   .def("add_time",         &add_time_1 )
+   .def("add_time",         &add_time_2 )
+   .def("add_time",         &add_time_3 )
+   .def("add_cron",         &add_cron,                   DefsDoc::add_cron_doc())
+   .def("add_late",         &add_late,                   DefsDoc::add_late_doc())
+   .def("add_autocancel",   &add_autocancel,             DefsDoc::add_autocancel_doc())
+   .def("add_autocancel",   &add_autocancel_1)
+   .def("add_autocancel",   &add_autocancel_2)
+   .def("add_autocancel",   &add_autocancel_3)
+   .def("add_verify",       &Node::addVerify,            DefsDoc::add_verify_doc())
+   .def("add_repeat",       &add_repeat_date,            DefsDoc::add_repeat_date_doc())
+   .def("add_repeat",       &add_repeat_integer,         DefsDoc::add_repeat_integer_doc())
+   .def("add_repeat",       &add_repeat_string,          DefsDoc::add_repeat_string_doc())
+   .def("add_repeat",       &add_repeat_enum,            DefsDoc::add_repeat_enumerated_doc() )
+   .def("add_repeat",       &add_repeat_day,             DefsDoc::add_repeat_day_doc() )
+   .def("add_defstatus",    &add_defstatus,              DefsDoc::add_defstatus_doc())
+   .def("add_zombie",       &add_zombie,                 NodeAttrDoc::zombie_doc())
+   .def("delete_variable",  &Node::deleteVariable       )
+   .def("delete_event",     &Node::deleteEvent          )
+   .def("delete_meter",     &Node::deleteMeter          )
+   .def("delete_label",     &Node::deleteLabel          )
+   .def("delete_trigger",   &Node::deleteTrigger        )
+   .def("delete_complete",  &Node::deleteComplete       )
+   .def("delete_repeat",    &Node::deleteRepeat         )
+   .def("delete_limit",     &Node::deleteLimit          )
+   .def("delete_inlimit",   &Node::deleteInlimit        )
+   .def("delete_time",      &Node::deleteTime           )
+   .def("delete_time",      &Node::delete_time          )
+   .def("delete_today",     &Node::deleteToday          )
+   .def("delete_today",     &Node::delete_today         )
+   .def("delete_date",      &Node::deleteDate           )
+   .def("delete_date",      &Node::delete_date          )
+   .def("delete_day",       &Node::deleteDay            )
+   .def("delete_day",       &Node::delete_day           )
+   .def("delete_cron",      &Node::deleteCron           )
+   .def("delete_cron",      &Node::delete_cron          )
+   .def("delete_zombie",    &Node::deleteZombie         )
+   .def("delete_zombie",    &Node::delete_zombie        )
+   .def("change_trigger",   &Node::changeTrigger        )
+   .def("change_complete",  &Node::changeComplete       )
+   .def("get_abs_node_path",    &Node::absNodePath, DefsDoc::abs_node_path_doc())
+   .def("has_time_dependencies",      &Node::hasTimeDependencies)
+   .def("update_generated_variables", &Node::update_generated_variables)
+   .def("get_generated_variables", &Node::gen_variables, "returns a list of generated variables. Use ecflow.VariableList as return argument")
+   .def("is_suspended",     &Node::isSuspended, "Returns true if the :term:`node` is in a :term:`suspended` state")
+   .def("find_variable",    &Node::findVariable,           return_value_policy<copy_const_reference>(), "Find :term:`variable` on the node only.  Returns a object")
+   .def("find_meter",       &Node::findMeter,              return_value_policy<copy_const_reference>(), "Find the :term:`meter` on the node only. Returns a object")
+   .def("find_event",       &Node::findEventByNameOrNumber,return_value_policy<copy_const_reference>(), "Find the :term:`event` on the node only. Returns a object")
+   .def("find_label",       &Node::find_label,             return_value_policy<copy_const_reference>(), "Find the :term:`label` on the node only. Returns a object")
+   .def("find_limit",       &Node::find_limit  ,           "Find the :term:`limit` on the node only. returns a limit ptr" )
+   .def("find_node_up_the_tree",&Node::find_node_up_the_tree  , "Search immediate node, then up the node hierarchy" )
+   .def("get_state",        &Node::state , "Returns the state of the node. This excludes the suspended state")
+   .def("get_state_change_time",&get_state_change_time, (bp::arg("format")="iso_extended"), "Returns the time of the last state change as a string. Default format is iso_extended, (iso_extended, iso, simple)")
+   .def("get_dstate",       &Node::dstate, "Returns the state of node. This will include suspended state")
+   .def("get_defstatus",    &Node::defStatus )
+   .def("get_repeat",       &Node::repeat, return_value_policy<copy_const_reference>() )
+   .def("get_late",         &Node::get_late,return_internal_reference<>() )
+   .def("get_autocancel",   &Node::get_autocancel, return_internal_reference<>())
+   .def("get_trigger",      &Node::get_trigger, return_internal_reference<>() )
+   .def("get_complete",     &Node::get_complete, return_internal_reference<>() )
+   .def("get_defs",         get_defs,   return_internal_reference<>() )
+   .def("get_parent",       &Node::parent, return_internal_reference<>() )
+   .add_property("meters",    boost::python::range( &Node::meter_begin,    &Node::meter_end) ,  "Returns a list of :term:`meter` s")
+   .add_property("events",    boost::python::range( &Node::event_begin,    &Node::event_end) ,  "Returns a list of :term:`event` s")
+   .add_property("variables", boost::python::range( &Node::variable_begin, &Node::variable_end),"Returns a list of user defined :term:`variable` s" )
+   .add_property("labels",    boost::python::range( &Node::label_begin,    &Node::label_end) ,  "Returns a list of :term:`label` s")
+   .add_property("limits",    boost::python::range( &Node::limit_begin,    &Node::limit_end),   "Returns a list of :term:`limit` s" )
+   .add_property("inlimits",  boost::python::range( &Node::inlimit_begin,  &Node::inlimit_end), "Returns a list of :term:`inlimit` s" )
+   .add_property("verifies",  boost::python::range( &Node::verify_begin,   &Node::verify_end),  "Returns a list of Verify's" )
+   .add_property("times",     boost::python::range( &Node::time_begin,     &Node::time_end),    "Returns a list of :term:`time` s" )
+   .add_property("todays",    boost::python::range( &Node::today_begin,    &Node::today_end),   "Returns a list of :term:`today` s" )
+   .add_property("dates",     boost::python::range( &Node::date_begin,     &Node::date_end),    "Returns a list of :term:`date` s" )
+   .add_property("days",      boost::python::range( &Node::day_begin,      &Node::day_end),     "Returns a list of :term:`day` s")
+   .add_property("crons",     boost::python::range( &Node::cron_begin,     &Node::cron_end),    "Returns a list of :term:`cron` s" )
+   .add_property("zombies",   boost::python::range( &Node::zombie_begin,   &Node::zombie_end),  "Returns a list of :term:`zombie` s" )
+   ;
+}
diff --git a/ecflow_4_0_7/Pyext/src/ExportNodeAttr.cpp b/ecflow_4_0_7/Pyext/src/ExportNodeAttr.cpp
new file mode 100644
index 0000000..4cb52fb
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ExportNodeAttr.cpp
@@ -0,0 +1,386 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #53 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+#include <boost/make_shared.hpp>
+
+#include "NodeAttr.hpp"
+#include "Limit.hpp"
+#include "InLimit.hpp"
+#include "Variable.hpp"
+#include "ClockAttr.hpp"
+#include "CronAttr.hpp"
+#include "DateAttr.hpp"
+#include "DayAttr.hpp"
+#include "LateAttr.hpp"
+#include "RepeatAttr.hpp"
+#include "TimeAttr.hpp"
+#include "TodayAttr.hpp"
+#include "VerifyAttr.hpp"
+#include "AutoCancelAttr.hpp"
+#include "ZombieAttr.hpp"
+#include "NodeAttrDoc.hpp"
+#include "BoostPythonUtil.hpp"
+
+using namespace ecf;
+using namespace boost::python;
+using namespace std;
+namespace bp = boost::python;
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+
+void add_time_series_3(CronAttr* self,const std::string& ts) { self->addTimeSeries(TimeSeries::create(ts));}
+
+void set_week_days(CronAttr* cron,const boost::python::list& list)
+{
+   std::vector<int> int_vec;
+   BoostPythonUtil::list_to_int_vec(list,int_vec);
+   cron->addWeekDays(int_vec);
+}
+
+void set_days_of_month(CronAttr* cron,const boost::python::list& list)
+{
+   std::vector<int> int_vec;
+   BoostPythonUtil::list_to_int_vec(list,int_vec);
+   cron->addDaysOfMonth(int_vec);
+}
+
+void set_months(CronAttr* cron,const boost::python::list& list)
+{
+   std::vector<int> int_vec;
+   BoostPythonUtil::list_to_int_vec(list,int_vec);
+   cron->addMonths(int_vec);
+}
+
+// Create as shared because: we want to pass a Python list as part of the constructor,
+// *AND* the only way make_constructor works is with a pointer.
+// The Node::add function seem to cope with this, some boost python magic,must do a conversion
+// from shared_ptr to pass by reference
+static boost::shared_ptr<RepeatEnumerated> create_RepeatEnumerated(const std::string& name, const boost::python::list& list)
+{
+   std::vector<std::string> vec;
+   BoostPythonUtil::list_to_str_vec(list,vec);
+   return boost::make_shared<RepeatEnumerated>( name,vec );
+}
+static boost::shared_ptr<RepeatString> create_RepeatString(const std::string& name, const boost::python::list& list)
+{
+   std::vector<std::string> vec;
+   BoostPythonUtil::list_to_str_vec(list,vec);
+   return boost::make_shared<RepeatString>( name,vec );
+}
+
+static boost::shared_ptr<ZombieAttr> create_ZombieAttr(Child::ZombieType zt,const boost::python::list& list,User::Action uc,int life_time_in_server)
+{
+   std::vector<Child::CmdType> vec;
+   int the_list_size = len(list);
+   vec.reserve(the_list_size);
+   for (int i = 0; i < the_list_size; ++i) {
+      vec.push_back(boost::python::extract<Child::CmdType>(list[i]));
+   }
+
+   return boost::make_shared<ZombieAttr>(zt,vec,uc,life_time_in_server );
+}
+
+void export_NodeAttr()
+{
+	enum_<Child::ZombieType>("ZombieType", NodeAttrDoc::zombie_type_doc())
+	.value("ecf",   Child::ECF)
+	.value("user",  Child::USER)
+	.value("path",  Child::PATH)
+	;
+
+	enum_<User::Action>("ZombieUserActionType",NodeAttrDoc::zombie_user_action_type_doc())
+	.value("fob",     User::FOB)
+	.value("fail",    User::FAIL)
+	.value("remove",  User::REMOVE)
+	.value("adopt",   User::ADOPT)
+   .value("block",   User::BLOCK)
+   .value("kill",    User::KILL)
+	;
+
+	enum_<Child::CmdType>("ChildCmdType",NodeAttrDoc::child_cmd_type_doc())
+	.value("init",    Child::INIT)
+	.value("event",   Child::EVENT)
+	.value("meter",   Child::METER)
+	.value("label",   Child::LABEL)
+	.value("wait",    Child::WAIT)
+	.value("abort",   Child::ABORT)
+	.value("complete",Child::COMPLETE)
+ 	;
+
+	// 	ZombieAttr(ecf::Child::ZombieType t, const std::vector<ecf::Child::CmdType>& c, ecf::User::Action a, int zombie_lifetime);
+ 	class_<ZombieAttr>("ZombieAttr",NodeAttrDoc::zombie_doc())
+   .def("__init__",make_constructor(&create_ZombieAttr) )
+ 	.def("__str__",    &ZombieAttr::toString)              // __str__
+ 	.def(self == self )                                    // __eq__
+ 	.def("empty",          &ZombieAttr::empty,          "Return true if the attribute is empty")
+ 	.def("zombie_type",    &ZombieAttr::zombie_type,    "Returns the :term:`zombie type`")
+ 	.def("user_action",    &ZombieAttr::action,         "The automated action to invoke, when zombies arise")
+ 	.def("zombie_lifetime",&ZombieAttr::zombie_lifetime,"Returns the lifetime in seconds of :term:`zombie` in the server")
+   .add_property( "child_cmds",boost::python::range(&ZombieAttr::child_begin,&ZombieAttr::child_end),"The list of child commands. If empty action applies to all child cmds")
+   ;
+
+ 	class_<Variable>("Variable",NodeAttrDoc::variable_doc(),init<std::string, std::string>())
+ 	.def("__str__",    &Variable::toString)                // __str__
+ 	.def(self == self )                                    // __eq__
+	.def("name",     &Variable::name,     return_value_policy<copy_const_reference>(), "Return the variable name as string")
+   .def("value",    &Variable::theValue, return_value_policy<copy_const_reference>(), "Return the variable value as a string")
+   .def("empty",    &Variable::empty,   "Return true if the variable is empty. Used when returning a Null variable, from a find")
+ 	;
+
+   // We need to return pass a list of Variable as arguments, to retrieve the generated variables
+   class_<std::vector<Variable> >("VariableList", "Hold a list of Variables")
+               .def(vector_indexing_suite<std::vector<Variable> >()) ;
+
+
+	class_<Label>("Label",NodeAttrDoc::label_doc(),init<std::string, std::string>())
+	.def(self == self )                                    // __eq__
+	.def("__str__",   &Label::toString)                    // __str__
+	.def("name",      &Label::name,      return_value_policy<copy_const_reference>(), "Return the :term:`label` name as string")
+	.def("value",     &Label::value,     return_value_policy<copy_const_reference>(), "Return the original :term:`label` value as string")
+	.def("new_value", &Label::new_value, return_value_policy<copy_const_reference>(), "Return the new label value as string")
+   .def("empty",     &Label::empty,     "Return true if the Label is empty. Used when returning a NULL Label, from a find")
+  	;
+
+	class_<Limit,  boost::shared_ptr<Limit> >("Limit",NodeAttrDoc::limit_doc(),init<std::string, int>())
+	.def(self == self )                               // __eq__
+	.def("__str__",  &Limit::toString)                // __str__
+	.def("name",     &Limit::name, return_value_policy<copy_const_reference>(), "Return the :term:`limit` name as string")
+   .def("value",    &Limit::value,    "The :term:`limit` token value as an integer")
+   .def("limit",    &Limit::theLimit, "The max value of the :term:`limit` as an integer")
+   .add_property("node_paths", boost::python::range(&Limit::paths_begin,&Limit::paths_begin),"List of nodes(paths) that have consumed a limit")
+	;
+
+	class_<InLimit>("InLimit",NodeAttrDoc::inlimit_doc(),init<std::string,  std::string, optional<int> >())
+	.def( init<std::string,std::string> () )
+	.def( init<std::string> () )
+	.def(self == self )                                  // __eq__
+	.def("__str__",     &InLimit::toString)              // __str__
+	.def("name",        &InLimit::name,       return_value_policy<copy_const_reference>(), "Return the :term:`inlimit` name as string")
+	.def("path_to_node",&InLimit::pathToNode, return_value_policy<copy_const_reference>(), "Path to the node that holds the limit, can be empty")
+	.def("tokens",      &InLimit::tokens,                                                  "The number of token to consume from the Limit")
+	;
+
+	class_<Event>("Event",NodeAttrDoc::event_doc(), init<int, optional<std::string> >())
+   .def( init<std::string> () )
+	.def(self == self )                                  // __eq__
+	.def("__str__",     &Event::toString)                // __str__
+	.def("name",        &Event::name,       return_value_policy<copy_const_reference>(), "Return the Events name as string. If number supplied name may be empty.")
+	.def("number",      &Event::number,     "Return events number as a integer. if not specified return max integer value")
+	.def("value",       &Event::value,      "Return events current value")
+   .def("empty",       &Event::empty,      "Return true if the Event is empty. Used when returning a NULL Event, from a find")
+	;
+
+	class_<Meter>("Meter",NodeAttrDoc::meter_doc(),init<std::string,int,int,optional<int> >())
+ 	.def(self == self )                                  // __eq__
+	.def("__str__",     &Meter::toString)                // __str__
+	.def("name",        &Meter::name,       return_value_policy<copy_const_reference>(), "Return the Meters name as string")
+	.def("min",         &Meter::min,                                                     "Return the Meters minimum value")
+	.def("max",         &Meter::max,                                                     "Return the Meters maximum value")
+	.def("value",       &Meter::value,                                                   "Return meters current value")
+	.def("color_change",&Meter::colorChange,                                             "returns the color change")
+   .def("empty",       &Meter::empty,       "Return true if the Meter is empty. Used when returning a NULL Meter, from a find")
+	;
+
+	class_<DateAttr>("Date",NodeAttrDoc::date_doc() ,init<int,int,int>())  // day,month,year
+	.def(self == self )                                     // __eq__
+	.def("__str__",     &DateAttr::toString)                // __str__
+	.def("day",         &DateAttr::day,      "Return the day. The range is 0-31, 0 means its wild-carded")
+	.def("month",       &DateAttr::month,    "Return the month. The range is 0-12, 0 means its wild-carded")
+   .def("year",        &DateAttr::year,     "Return the year, 0 means its wild-carded")
+	;
+
+	enum_<DayAttr::Day_t>("Days",NodeAttrDoc::days_enum_doc())
+	.value("sunday",   DayAttr::SUNDAY)
+	.value("monday",   DayAttr::MONDAY)
+	.value("tuesday",  DayAttr::TUESDAY)
+	.value("wednesday",DayAttr::WEDNESDAY)
+	.value("thursday", DayAttr::THURSDAY)
+	.value("friday",   DayAttr::FRIDAY)
+	.value("saturday", DayAttr::SATURDAY);
+
+	class_<DayAttr>("Day",NodeAttrDoc::day_doc(),init<DayAttr::Day_t>() )
+	.def(self == self )                                    // __eq__
+	.def("__str__",     &DayAttr::toString)                // __str__
+	.def("day",         &DayAttr::day,      "Return the day as enumerator")
+	;
+
+	class_<TimeAttr>("Time",NodeAttrDoc::time_doc() ,init<TimeSlot, optional<bool> >())
+	.def( init<int,int,optional<bool> >())                  // hour, minute, relative
+ 	.def( init<TimeSeries>())
+	.def( init<TimeSlot,TimeSlot,TimeSlot,bool>())
+	.def(self == self )                           // __eq__
+	.def("__str__",    &TimeAttr::toString)       // __str__
+	.def("time_series",&TimeAttr::time_series,return_value_policy<copy_const_reference>(), "Return the Time attributes time series")
+	;
+
+	class_<TodayAttr>("Today",NodeAttrDoc::today_doc() ,init<TimeSlot, optional<bool> >())
+	.def( init<int,int,optional<bool> >())                  // hour, minute, relative
+ 	.def( init<TimeSeries>())
+	.def( init<TimeSlot,TimeSlot,TimeSlot,bool>())
+	.def(self == self )                                     // __eq__
+	.def("__str__",    &TodayAttr::toString)                // __str__
+	.def("time_series",&TodayAttr::time_series,return_value_policy<copy_const_reference>(), "Return the Todays time series")
+	;
+
+
+	class_<LateAttr, boost::shared_ptr<LateAttr>  >("Late",NodeAttrDoc::late_doc())
+ 	.def( "submitted", &LateAttr::addSubmitted,
+ 	      "submitted(TimeSlot):The time node can stay :term:`submitted`. Submitted is always relative. If the node stays\n"
+ 	      "submitted longer than the time specified, the :term:`late` flag is set\n"
+ 	)
+	.def( "submitted", &LateAttr::add_submitted,
+	      "submitted(hour,minute) The time node can stay submitted. Submitted is always relative. If the node stays\n"
+	      "submitted longer than the time specified, the late flag is set\n"
+	 )
+	.def( "active",    &LateAttr::add_active,
+	      "active(hour,minute): The time the node must become :term:`active`. If the node is still :term:`queued` or :term:`submitted`\n"
+	      "by the time specified, the late flag is set"
+	 )
+	 .def( "active",   &LateAttr::addActive,
+	       "active(TimeSlot):The time the node must become :term:`active`. If the node is still :term:`queued` or :term:`submitted`\n"
+	       "by the time specified, the late flag is set"
+	 )
+	.def( "complete",  &LateAttr::add_complete,
+	      "complete(hour,minute):The time the node must become :term:`complete`. If relative, time is taken from the time\n"
+	      "the node became :term:`active`, otherwise node must be :term:`complete` by the time given"
+	 )
+	 .def( "complete", &LateAttr::addComplete,
+	       "complete(TimeSlot): The time the node must become :term:`complete`. If relative, time is taken from the time\n"
+	       "the node became :term:`active`, otherwise node must be :term:`complete` by the time given"
+	 )
+	.def(self == self )                                  // __eq__
+	.def("__str__",   &LateAttr::toString)               // __str__
+	.def("submitted", &LateAttr::submitted,return_value_policy<copy_const_reference>(), "Return the submitted time as a TimeSlot")
+	.def("active",    &LateAttr::active,   return_value_policy<copy_const_reference>(), "Return the active time as a TimeSlot")
+	.def("complete",  &LateAttr::complete, return_value_policy<copy_const_reference>(), "Return the complete time as a TimeSlot")
+   .def("complete_is_relative",  &LateAttr::complete_is_relative, "Returns a boolean where true means that complete is relative")
+   .def("is_late",   &LateAttr::isLate, "Return True if late")
+ 	;
+
+
+	class_<AutoCancelAttr, boost::shared_ptr<AutoCancelAttr> >(
+			"Autocancel",NodeAttrDoc::autocancel_doc() ,
+			init<int,int,bool >()                             // hour, minute, relative
+	)
+	.def( init<int>())                                        // days
+	.def( init<TimeSlot, bool>())
+	.def(self == self )                                       // __eq__
+	.def("__str__", &AutoCancelAttr::toString)                // __str__
+	.def("time",    &AutoCancelAttr::time, return_value_policy<copy_const_reference>(), "returns cancel time as a TimeSlot")
+	.def("relative",&AutoCancelAttr::relative, "Returns a boolean where true means the time is relative")
+	.def("days",    &AutoCancelAttr::days,     "Returns a boolean true if time was specified in days")
+  	;
+
+
+	class_<RepeatDate >("RepeatDate",NodeAttrDoc::repeat_date_doc() ,init< std::string, int, int, optional<int> >()) // name, start, end , delta
+ 	.def(self == self )                              // __eq__
+	.def("__str__",        &RepeatDate::toString)    // __str__
+	.def("name",           &RepeatDate::name, return_value_policy<copy_const_reference>(),"Return the name of the repeat.")
+	.def("start",          &RepeatDate::start ,"Return the start date as an integer in yyyymmdd format")
+	.def("end",            &RepeatDate::end,   "Return the end date as an integer in yyyymmdd format")
+	.def("step",           &RepeatDate::step,  "Return the step increment. This is used to update the repeat, until end date is reached")
+	;
+
+	class_<RepeatInteger>("RepeatInteger",NodeAttrDoc::repeat_integer_doc(),init< std::string, int, int, optional<int> >()) // name, start, end , delta = 1
+ 	.def(self == self )                                  // __eq__
+	.def("__str__",        &RepeatInteger::toString)     // __str__
+	.def("name",           &RepeatInteger::name, return_value_policy<copy_const_reference>(),"Return the name of the repeat.")
+	.def("start",          &RepeatInteger::start)
+	.def("end",            &RepeatInteger::end)
+	.def("step",           &RepeatInteger::step)
+	;
+
+	// Create as shared because: we want to pass a Python list as part of the constructor,
+	// and the only way make_constructor works is with a pointer.
+	class_<RepeatEnumerated, boost::shared_ptr<RepeatEnumerated> >("RepeatEnumerated",NodeAttrDoc::repeat_enumerated_doc())
+   .def("__init__",make_constructor(&create_RepeatEnumerated) )
+	.def(self == self )                                     // __eq__
+	.def("__str__",        &RepeatEnumerated::toString)     // __str__
+	.def("name",           &RepeatEnumerated::name, return_value_policy<copy_const_reference>(),"Return the name of the :term:`repeat`.")
+	.def("start",          &RepeatEnumerated::start)
+	.def("end",            &RepeatEnumerated::end)
+	.def("step",           &RepeatEnumerated::step)
+	;
+
+	class_<RepeatString,boost::shared_ptr<RepeatString> >("RepeatString", NodeAttrDoc::repeat_string_doc())
+   .def("__init__",make_constructor(&create_RepeatString) )
+	.def(self == self )                                 // __eq__
+	.def("__str__",        &RepeatString::toString)     // __str__
+	.def("name",           &RepeatString::name, return_value_policy<copy_const_reference>(),"Return the name of the :term:`repeat`.")
+	.def("start",          &RepeatString::start)
+	.def("end",            &RepeatString::end)
+	.def("step",           &RepeatString::step)
+	;
+
+	class_<RepeatDay>("RepeatDay",NodeAttrDoc::repeat_day_doc(),init< optional<int> >())
+ 	.def(self == self )                              // __eq__
+	.def("__str__",        &RepeatDay::toString)     // __str__
+	;
+
+	class_<Repeat>("Repeat",NodeAttrDoc::repeat_doc() ,init< int >())
+	.def(self == self )                    // __eq__
+	.def("__str__", &Repeat::toString)     // __str__
+	.def("empty",   &Repeat::empty ,"Return true if the repeat is empty.")
+	.def("name",    &Repeat::name, return_value_policy<copy_const_reference>(), "The :term:`repeat` name, can be referenced in :term:`trigger` expressions")
+	.def("start",   &Repeat::start,"The start value of the repeat, as an integer")
+	.def("end",     &Repeat::end,  "The last value of the repeat, as an integer")
+   .def("step",    &Repeat::step, "The increment for the repeat, as an integer")
+   .def("value",   &Repeat::last_valid_value,"The current value of the repeat as an integer")
+	;
+
+
+	void (CronAttr::*add_time_series)(const TimeSeries&) = &CronAttr::addTimeSeries;
+	void (CronAttr::*add_time_series_2)( const TimeSlot& s, const TimeSlot& f, const TimeSlot& i) = &CronAttr::addTimeSeries;
+	class_<CronAttr>("Cron",NodeAttrDoc::cron_doc() )
+	.def(self == self )                                // __eq__
+	.def("__str__",            &CronAttr::toString)    // __str__
+   .def( "set_week_days",     &set_week_days ,   "Specifies days of week. Expects a list of integers, with integer range 0==Sun to 6==Sat")
+	.def( "set_days_of_month", &set_days_of_month,"Specifies days of the month. Expects a list of integers with integer range 1-31" )
+	.def( "set_months",        &set_months  ,     "Specifies months. Expects a list of integers, with integer range 1-12")
+	.def( "set_time_series",   &CronAttr::add_time_series,(bp::arg("hour"),bp::arg("minute"),bp::arg("relative")=false),"time_series(hour(int),minute(int),relative to suite start(bool=false)), Add a time slot")
+	.def( "set_time_series",   add_time_series,   "Add a time series. This will never complete")
+   .def( "set_time_series",   add_time_series_2, "Add a time series. This will never complete")
+   .def( "set_time_series",   &add_time_series_3,"Add a time series. This will never complete")
+	.def( "time",              &CronAttr::time, return_value_policy<copy_const_reference>(), "return cron time as a TimeSeries")
+	.add_property( "week_days",    boost::python::range(&CronAttr::week_days_begin,    &CronAttr::week_days_end),     "returns a integer list of week days")
+	.add_property( "days_of_month",boost::python::range(&CronAttr::days_of_month_begin,&CronAttr::days_of_month_end), "returns a integer list of days of the month")
+	.add_property( "months",       boost::python::range(&CronAttr::months_begin,       &CronAttr::months_end),        "returns a integer list of months of the year")
+ 	;
+
+
+	class_<VerifyAttr>("Verify", init<NState::State,int>())  // state, expected
+	.def(self == self )                               // __eq__
+	.def("__str__",        &VerifyAttr::toString)     // __str__
+	;
+
+
+	void (ClockAttr::*start_stop_with_server)(bool) = &ClockAttr::startStopWithServer;
+	class_<ClockAttr, boost::shared_ptr<ClockAttr> >("Clock",NodeAttrDoc::clock_doc() ,init<int,int,int,optional<bool> > ())  // day, month, year, hybrid
+   .def( init<int,int,int,bool>())
+   .def( init<bool>())
+	.def(self == self )                                   // __eq__
+	.def("__str__",             &ClockAttr::toString)     // __str__
+	.def( "set_gain_in_seconds",&ClockAttr::set_gain_in_seconds, "Set the gain in seconds")
+	.def( "set_gain",     &ClockAttr::set_gain,                  "Set the gain in hours and minutes")
+ 	.def( "set_virtual",  start_stop_with_server,   "Sets/unsets the clock as being virtual")
+	.def( "day",          &ClockAttr::day,          "Returns the day as an integer, range 1-31")
+	.def( "month",        &ClockAttr::month,        "Returns the month as an integer, range 1-12")
+	.def( "year",         &ClockAttr::year,         "Returns the year as an integer, > 1400")
+	.def( "gain",         &ClockAttr::gain,         "Returns the gain as an long. This represents seconds")
+	.def( "positive_gain",&ClockAttr::positive_gain,"Returns a boolean, where true means that the gain is positive")
+	.def( "virtual"      ,&ClockAttr::is_virtual,   "Returns a boolean, where true means that clock is virtual")
+	;
+}
diff --git a/ecflow_4_0_7/Pyext/src/ExportSuiteAndFamily.cpp b/ecflow_4_0_7/Pyext/src/ExportSuiteAndFamily.cpp
new file mode 100644
index 0000000..c6fbde4
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ExportSuiteAndFamily.cpp
@@ -0,0 +1,91 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #85 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/noncopyable.hpp>
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "BoostPythonUtil.hpp"
+
+#include "DefsDoc.hpp"
+
+using namespace ecf;
+using namespace boost::python;
+using namespace std;
+namespace bp = boost::python;
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+
+/// Since we don't pass in a child pos, the nodes are added to the end
+void add_family(NodeContainer* self,family_ptr f){ self->addFamily(f); }
+void add_task(NodeContainer* self,task_ptr t){ self->addTask(t); }
+
+suite_ptr add_clock(suite_ptr self, const ClockAttr& clk) { self->addClock(clk); return self;}
+
+// Context management, Only used to provide indentation
+suite_ptr suite_enter(suite_ptr self) { return self;}
+bool suite_exit(suite_ptr self,const boost::python::object& type,const boost::python::object& value,const boost::python::object& traceback){return false;}
+family_ptr family_enter(family_ptr self) { return self;}
+bool family_exit(family_ptr self,const boost::python::object& type,const boost::python::object& value,const boost::python::object& traceback){return false;}
+
+
+void export_SuiteAndFamily()
+{
+   // Turn off proxies by passing true as the NoProxy template parameter.
+   // shared_ptrs don't need proxies because calls on one a copy of the
+   // shared_ptr will affect all of them (duh!).
+   class_<std::vector<family_ptr> >("FamilyVec","Hold a list of :term:`family` nodes")
+   .def(vector_indexing_suite<std::vector<family_ptr>, true >()) ;
+
+   class_<std::vector<suite_ptr> >("SuiteVec","Hold a list of :term:`suite` nodes's")
+   .def(vector_indexing_suite<std::vector<suite_ptr>, true >());
+
+   // choose the correct overload
+   class_<NodeContainer, bases<Node>, boost::noncopyable >("NodeContainer",DefsDoc::node_container_doc(), no_init)
+   .def("add_family",&NodeContainer::add_family ,DefsDoc::add_family_doc())
+   .def("add_family",add_family )
+   .def("add_task",  &NodeContainer::add_task ,  DefsDoc::add_task_doc())
+   .def("add_task",  add_task )
+   .add_property("nodes",boost::python::range( &NodeContainer::node_begin,&NodeContainer::node_end),"Returns a list of Node's")
+   ;
+
+
+   class_<Family, bases<NodeContainer>, family_ptr, boost::noncopyable>("Family",DefsDoc::family_doc())
+   .def("__init__",make_constructor(&Family::create), DefsDoc::family_doc())
+   .def(self == self )                    // __eq__
+   .def("__str__",   &Family::to_string)  // __str__
+   .def("__enter__", &family_enter)       // allow with statement, hence indentation support
+   .def("__exit__",  &family_exit)        // allow with statement, hence indentation support
+   ;
+
+
+   class_<Suite, bases<NodeContainer>, suite_ptr, boost::noncopyable>("Suite",DefsDoc::suite_doc())
+   .def("__init__",make_constructor(&Suite::create), DefsDoc::suite_doc())
+   .def(self == self )                   // __eq__
+   .def("__str__",   &Suite::to_string)  // __str__
+   .def("__enter__", &suite_enter)       // allow with statement, hence indentation support
+   .def("__exit__",  &suite_exit)        // allow with statement, hence indentation support
+   .def("add_clock", &add_clock)
+   .def("get_clock", &Suite::clockAttr,"Returns the :term:`suite` :term:`clock`")
+   .def("begun",     &Suite::begun, "Returns true if the :term:`suite` has begun, false otherwise")
+   ;
+}
diff --git a/ecflow_4_0_7/Pyext/src/ExportTask.cpp b/ecflow_4_0_7/Pyext/src/ExportTask.cpp
new file mode 100644
index 0000000..f1406d3
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/ExportTask.cpp
@@ -0,0 +1,66 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #85 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/noncopyable.hpp>
+
+#include "Task.hpp"
+#include "DefsDoc.hpp"
+
+using namespace ecf;
+using namespace boost::python;
+using namespace std;
+namespace bp = boost::python;
+
+task_ptr task_enter(task_ptr self) { return self;}
+bool task_exit(task_ptr self,const boost::python::object& type,const boost::python::object& value,const boost::python::object& traceback){return false;}
+
+// See: http://wiki.python.org/moin/boost.python/HowTo#boost.function_objects
+
+void export_Task()
+{
+   // Turn off proxies by passing true as the NoProxy template parameter.
+   // shared_ptrs don't need proxies because calls on one a copy of the
+   // shared_ptr will affect all of them (duh!).
+   class_<std::vector<task_ptr> >("TaskVec","Hold a list of :term:`task` nodes")
+   .def(vector_indexing_suite<std::vector<task_ptr>, true >()) ;
+
+   class_<Submittable, bases<Node>, boost::noncopyable >("Submittable",DefsDoc::submittable_doc(), no_init)
+   .def("get_jobs_password" ,      &Submittable::jobsPassword, return_value_policy<copy_const_reference>(),        "The password. This generated by server")
+   .def("get_process_or_remote_id",&Submittable::process_or_remote_id, return_value_policy<copy_const_reference>(),"The process or remote id of the running job")
+   .def("get_try_no" ,             &Submittable::tryNo,                                                            "The current try number as a string.")
+   .def("get_int_try_no" ,         &Submittable::try_no,                                                           "The current try number as integer.")
+   .def("get_aborted_reason" ,     &Submittable::abortedReason,return_value_policy<copy_const_reference>(),        "If node was aborted and a reason was provided, return the string")
+   ;
+
+   class_<Task, bases<Submittable>, task_ptr, boost::noncopyable>("Task",DefsDoc::task_doc() )
+   .def("__init__",make_constructor(&Task::create), DefsDoc::task_doc())
+   .def(self == self )                        // __eq__
+   .def("__enter__", &task_enter)             // allow with statement, hence indentation support
+   .def("__exit__",  &task_exit)              // allow with statement, hence indentation support
+   .def("__str__",         &Task::to_string)  // __str__
+   .add_property("aliases",boost::python::range( &Task::alias_begin,  &Task::alias_end), "Returns a list of aliases")
+   .add_property("nodes",  boost::python::range( &Task::alias_begin,  &Task::alias_end), "Returns a list of aliases")
+   ;
+
+   class_<Alias, bases<Submittable>, alias_ptr, boost::noncopyable>("Alias",DefsDoc::alias_doc(),no_init)
+   .def(self == self )                 // __eq__
+   .def("__str__", &Alias::to_string)  // __str__
+   ;
+}
diff --git a/ecflow_4_0_7/Pyext/src/NodeAttrDoc.cpp b/ecflow_4_0_7/Pyext/src/NodeAttrDoc.cpp
new file mode 100644
index 0000000..df7d6d5
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/NodeAttrDoc.cpp
@@ -0,0 +1,567 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #36 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This class is used as a helper class
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include "NodeAttrDoc.hpp"
+
+const char* NodeAttrDoc::variable_doc()
+{
+   return
+            "Defines a :term:`variable` on a :term:`node` for use in :term:`ecf script`.\n\n"
+            "A Node can have a number of variables.\n"
+            "These variables can be added at any node level: :term:`suite`, :term:`family` or :term:`task`.\n"
+            "The variables are names inside a pair of '%' characters in an :term:`ecf script`.\n"
+            "The content of a variable replaces the variable name in the :term:`ecf script` at\n"
+            "job submission time. When a variable is needed at submission time, it is first\n"
+            "sought in the task itself. If it is not found, it is sought from the tasks parent\n"
+            "and so on, up through the node levels until found. See :term:`variable inheritance`\n"
+            "A undefined variable in a :term:`ecf script`, causes the :term:`task` to be :term:`aborted`,\n"
+            "without the job being submitted.\n"
+            "\nConstructor::\n\n"
+            "   Variable(name,value)\n"
+            "      string name: the name of the variable\n"
+            "      string value: The value of the variable\n"
+            "\nUsage::\n\n"
+            "   ..."
+            "   var = Variable(\"ECF_JOB_CMD\",\"/bin/sh %ECF_JOB% &\")\n"
+            "   task.add_variable(var)\n"
+            "   task.add_variable('JOE','90')\n"
+            ;
+}
+
+const char* NodeAttrDoc::zombie_doc()
+{
+   return
+            "The :term:`zombie` attribute defines how a :term:`zombie` should be handled in an automated fashion\n\n"
+            "Very careful consideration should be taken before this attribute is added\n"
+            "as it may hide a genuine problem.\n"
+            "It can be added to any :term:`node`. But is best defined at the :term:`suite` or :term:`family` level.\n"
+            "If there is no zombie attribute the default behaviour is to block the init,complete,abort :term:`child command`.\n"
+            "and *fob* the event,label,and meter :term:`child command`\n"
+            "This attribute allows the server to make a automated response\n"
+            "Please see: :py:class:`ecflow.ZombieType`, :py:class:`ecflow.ChildCmdType`, :py:class:`ecflow.ZombieUserActionType`\n"
+            "\nConstructor::\n\n"
+            "   ZombieAttr(ZombieType,ChildCmdTypes, ZombieUserActionType, lifetime)\n"
+            "      ZombieType           : Must be one of ZombieType.ecf, ZombieType.path, ZombieType.user\n"
+            "      ChildCmdType         : A list(ChildCmdType) of Child commands. Can be left empty in\n"
+            "                             which case the action affect all child commands\n"
+            "      ZombieUserActionType : One of [ fob, fail, block, remove, adopt ]\n"
+            "      int lifetime         : Defines the life time in seconds of the zombie in the server.\n"
+            "                             On expiration, zombie is removed automatically\n"
+            "\nUsage::\n\n"
+            "   # Add a zombie attribute so that child label commands(i.e ecflow_client --label)\n"
+            "   # never block the job\n"
+            "   s1 = ecflow.Suite('s1')\n"
+            "   child_list = [ ChildCmdType.label ]\n"
+            "   zombie_attr = ZombieAttr(ZombieType.ecf, child_list, ZombieUserActionType.fob, 300)\n"
+            "   s1.add_zombie(zombie_attr)\n"
+            ;
+}
+
+const char* NodeAttrDoc::zombie_type_doc()
+{
+   return
+            ":term:`zombie` s are running jobs that fail authentication when communicating with the :term:`ecflow_server`.\n\n"
+            "See class :term:`zombie type` and :py:class:`ecflow.ZombieAttr` for further information.\n"
+            ;
+}
+
+const char* NodeAttrDoc::zombie_user_action_type_doc()
+{
+   return
+            "ZombieUserActionType is used define an automated response. See class :py:class:`ZombieAttr`\n\n"
+            "This can be either on the client side or on the server side\n"
+            "\nclient side:\n\n"
+            "- fob:    The :term:`child command` always succeeds, i.e allowed to complete without blocking\n"
+            "- fail:   The :term:`child command` is asked to fail.\n"
+            "- block:  The :term:`child command` is asked to block. This is the default action for all child commands\n"
+            "\nserver side:\n\n"
+            "- adopt:  Allows the password supplied with the :term:`child command` s, to be adopted by the server\n"
+            "- kill:   Kills the zombie process associated with the :term:`child command` using ECF_KILL_CMD.\n"
+            "          path zombies will need to be killed manually. If kill is specified for path zombies\n"
+            "          they will be fobed, i.e allowed to complete without blocking the job.\n"
+            "- remove: :term:`ecflow_server` removes the :term:`zombie` from the zombie list.\n"
+            "          The child continues blocking. The :term:`zombie` may well re-appear\n\n"
+            "Note: Only adopt will allow the :term:`child command` to continue and change the :term:`node` tree\n"
+            ;
+}
+
+const char* NodeAttrDoc::child_cmd_type_doc()
+{
+   return
+            "ChildCmdType represents the different :term:`child command` s.\n"
+            "This type is used as a parameter to the class :py:class:`ecflow.ZombieAttr`\n\n"
+            "Child commands are called within a :term:`job file`::\n\n"
+            "  ChildCmdType::init     corresponds to : ecflow_client --init=<process_id>\n"
+            "  ChildCmdType::event    corresponds to : ecflow_client --event=<event_name | number>\n"
+            "  ChildCmdType::meter    corresponds to : ecflow_client --meter=<meter_name>, <meter_value>\n"
+            "  ChildCmdType::label    corresponds to : ecflow_client --label=<label_name>. <label_value>\n"
+            "  ChildCmdType::wait     corresponds to : ecflow_client --wait=<expression>\n"
+            "  ChildCmdType::abort    corresponds to : ecflow_client --abort=<reason>\n"
+            "  ChildCmdType::complete corresponds to : ecflow_client --complete\n"
+            ;
+}
+
+const char* NodeAttrDoc::label_doc()
+{
+   return
+            "A :term:`label` has a name and value and provides a way of displaying information in a GUI.\n\n"
+            "The value can be anything(ASCII) as it can not be used in triggers\n"
+            "The value of the label is set to be the default value given in the definition\n"
+            "when the :term:`suite` is begun. This is useful in repeated suites: A task sets the label\n"
+            "to be something, e.g, the number of observations, and once the :term:`suite` is :term:`complete`\n"
+            "and the next day starts) the number of observations is cleared.\n"
+            "Labels can be set at any level: Suite,Family,Task\n"
+            "There are two ways of updating the label\n"
+            "- A :term:`child command` can be used to automatically update the label on a :term:`task`\n"
+            "- By using the alter command, the labels on :term:`suite` :term:`family` and :term:`task` can be changed manually\n"
+            "\nConstructor::\n\n"
+            "   Label(name,value)\n"
+            "      string name:  The name of the label\n"
+            "      string value: The value of the label\n"
+            "\nUsage::\n\n"
+            "   t1 = Task('t1')\n"
+            "   t1.add_label('l1','value')\n"
+            "   t1.add_label(Label('l2','value2'))\n"
+            "   for label in t1.labels:\n"
+            "      print label\n"
+            ;
+}
+
+const char* NodeAttrDoc::limit_doc()
+{
+   return
+            ":term:`limit` provides a simple load management\n\n"
+            "i.e. by limiting the number of :term:`task` s submitted by a server.\n"
+            "Limits are typically defined at the :term:`suite` level, or defined in a\n"
+            "separate suite, so that they can be used by multiple suites.\n"
+            "Once a limit is defined in a :term:`suite definition`, you must also assign families/tasks to use\n"
+            "this limit. See  :term:`inlimit` and :py:class:`ecflow.InLimit`\n"
+            "\nConstructor::\n\n"
+            "   Limit(name,value)\n"
+            "      string name: the name of the limit\n"
+            "      int   value: The value of the limit\n"
+            "\nUsage::\n\n"
+            "   limit = Limit(\"fast\", 10)\n"
+            "    ...\n"
+            "   suite.add_limit(limit)\n"
+            ;
+}
+
+const char* NodeAttrDoc::inlimit_doc()
+{
+   return
+            ":term:`inlimit` is used in conjunction with :term:`limit` to provide simple load management::\n\n"
+            "   suite x\n"
+            "      limit fast 1\n"
+            "      family f\n"
+            "         inlimit /x:fast\n"
+            "         task t1\n"
+            "         task t2\n\n"
+            "Here 'fast' is the name of limit and the number defines the maximum number of tasks\n"
+            "that can run simultaneously using this limit. Thats why you do not need a :term:`trigger`\n"
+            "between tasks 't1' and 't2'. There is no need to change the tasks. The jobs are\n"
+            "created in the order they are defined\n"
+            "\nConstructor::\n\n"
+            "   InLimit(name, optional<path = ''>, optional<token =  1>)\n"
+            "      string name           : The name of the referenced Limit\n"
+            "      string path<optional> : The path to the Limit, if this is left out, then Limit of 'name' must be specified\n"
+            "                              some where up the parent hierarchy\n"
+            "      int value<optional>   : The usage of the Limit. Each job submission will consume 'value' tokens\n"
+            "                              from the Limit. defaults to 1 if no value specified.\n"
+            "\nUsage::\n\n"
+            "   inlimit = InLimit(\"fast\",\"/x/f\", 2)\n"
+            "    ...\n"
+            "   family.add_inlimit(inlimit)\n"
+            ;
+}
+
+const char* NodeAttrDoc::event_doc()
+{
+   return
+            ":term:`event` s are used as signal mechanism.\n\n"
+            "Typically they would be used to signal partial completion of a :term:`task`\n"
+            "and to be able to :term:`trigger` another job, which is waiting for this partial completion.\n"
+            "Only tasks can have events that are automatically set via a :term:`child command` s, see below.\n"
+            "Events are cleared automatically when a :term:`node` is re-queued or begun.\n"
+            "Suites and Families can have tasks, but these events must be set via the Alter command\n"
+            "Multiple events can be added to a task.\n"
+            "An Event has a number and a optional name. Events are typically used\n"
+            "in :term:`trigger` and :term:`complete expression` , to control job creation.\n"
+            "Event are fired within a :term:`job file`, i.e.::\n\n"
+            "   ecflow_client --init $$\n"
+            "   ecflow_client --event foo\n"
+            "   ecflow_client --complete\n\n"
+            "Hence the defining of an event for a :term:`task`, should be followed with the addition of ecflow_client --event\n"
+            ":term:`child command` in the corresponding :term:`ecf script` file.\n"
+            "\nConstructor::\n\n"
+            "   Event(number, optional<name = ''>)\n"
+            "      int number            : The number must be >= 0\n"
+            "      string name<optional> : If name is given, can only refer to Event by its name\n"
+            "\nUsage::\n\n"
+            "   event = Event(2,\"event_name\")\n"
+            "   task.add_event(event)\n"
+            "   task1.add_event(\"2\")      # create a event '1' and add to the task\n"
+            "   task2.add_event(\"name\")   # create a event 'name' and add to task\n"
+            ;
+}
+
+const char* NodeAttrDoc::meter_doc()
+{
+   return
+            ":term:`meter` s can be used to indicate proportional completion of :term:`task`\n\n"
+            "They are able to :term:`trigger` another job, which is waiting on this proportion.\n"
+            "Can also be used to indicate progress of a job. Meters can be used in\n"
+            ":term:`trigger` and :term:`complete expression`.\n"
+            "\nConstructor::\n\n"
+            "   Meter(name,min,max,<optional>color_change)\n"
+            "      string name                : The meter name\n"
+            "      int min                    : The minimum and initial meter value\n"
+            "      int max                    : The maximum meter value. Must be greater than min value.\n"
+            "      int color_change<optional> : default = max, Must be between min-max, used in the GUI\n"
+            "\nExceptions:\n\n"
+            "- raises IndexError when an invalid Meter is specified\n"
+            "\nUsage:\n\n"
+            "Using a meter requires:\n\n"
+            "- Defining a meter on a :term:`task`::\n\n"
+            "     meter = Meter(\"progress\",0,100,100)\n"
+            "     task.add_meter(meter)\n\n"
+            "- Updating the corresponding :term:`ecf script` file with the meter :term:`child command`::\n\n"
+            "     ecflow_client --init=$$\n"
+            "     for  i in 10 20 30 40 50 60 80 100; do\n"
+            "         ecflow_client --meter=progress $i\n"
+            "         sleep 2 # or do some work\n"
+            "     done\n"
+            "     ecflow_client --complete\n\n"
+            "- Optionally addition in a :term:`trigger` or :term:`complete expression` for job control::\n\n"
+            "     trigger task:progress ge 60\n\n"
+            "  trigger and complete expression should *avoid* using equality i.e::\n\n"
+            "     trigger task:progress == 60\n\n"
+            "  Due to network issues the meter event's may **not** arrive in sequential order\n"
+            "  hence the :term:`ecflow_server` will ignore meter value's, which are less than the current value\n"
+            "  as a result triggers's which use meter equality may never evaluate\n"
+            ;
+}
+
+const char* NodeAttrDoc::date_doc()
+{
+   return
+            "Used to define a :term:`date` dependency.\n\n"
+            "There can be multiple Date dependencies for a :term:`node`.\n"
+            "Any of the 3 attributes, i.e. day, month, year can be wild carded using a zero\n"
+            "If a hybrid :term:`clock` is defined on a suite, any node held by a date dependency\n"
+            "will be set to :term:`complete` at the beginning of the :term:`suite`, without the\n"
+            "task ever being dispatched otherwise, the suite would never complete.\n"
+            "\nConstructor::\n\n"
+            "   Date(day,month,year)\n"
+            "      int day   : represents the day, zero means wild card. day >= 0 & day < 31\n"
+            "      int month : represents the month, zero means wild card. month >= 0 & month < 12\n"
+            "      int year  : represents the year, zero means wild card. year >= 0\n"
+            "\nExceptions:\n\n"
+            "- raises IndexError when an invalid date is specified\n"
+            "\nUsage::\n\n"
+            "   date = Date(11,12,2010)  # represent 11th of December 2010\n"
+            "   date = Date(1,0,0);      # means the first day of every month of every year\n"
+            ;
+}
+
+const char* NodeAttrDoc::day_doc()
+{
+   return
+            "Defines a :term:`day` dependency.\n\n"
+            "There can be multiple day dependencies. If a hybrid :term:`clock` is defined\n"
+            "on a suite, any node held by a day dependency will be set to :term:`complete` at the\n"
+            "beginning of the :term:`suite`, without the task ever being dispatched otherwise\n"
+            "the suite would never complete.\n"
+            "\nConstructor::\n\n"
+            "   Day(Days)\n"
+            "      Days day: Is an enumerator with represent the days of the week\n"
+            "\nUsage::\n\n"
+            "   day1 = Day(Days.sunday)\n"
+            "   day2 = Day(Days.monday)\n"
+            ;
+}
+
+const char* NodeAttrDoc::days_enum_doc()
+{
+   return
+            "This enum is used as argument to a :py:class:`ecflow.Day` class.\n\n"
+            "It represents the days of the week\n"
+            "\nUsage::\n\n"
+            "   day1 = Day(Days.sunday)\n"
+            "   day2 = Day(Days.monday)\n"
+            "   day3 = Day(Days.tuesday)\n"
+            ;
+}
+
+const char* NodeAttrDoc::time_doc()
+{
+   return
+            "Is used to define a :term:`time` dependency\n\n"
+            "This can then control job submission.\n"
+            "There can be multiple time dependencies for a node, however overlapping times may\n"
+            "cause unexpected results. The time dependency can be made relative to the beginning\n"
+            "of the suite or in repeated families relative to the beginning of the repeated family.\n"
+            "\nConstructor::\n\n"
+            "   Time(hour,minute,relative<optional> = false)\n"
+            "      int hour:               hour in 24 clock\n"
+            "      int minute:             minute <= 59\n"
+            "      bool relative<optional>: default = False, Relative to suite start or repeated node.\n\n"
+            "   Time(single,relative<optional> = false)\n"
+            "      TimeSlot single:         A single time\n"
+            "      bool relative:           Relative to suite start or repeated node. Default is false\n\n"
+            "   Time(start,finish,increment,relative<optional> = false)\n"
+            "      TimeSlot start:          The start time\n"
+            "      TimeSlot finish:         The finish/end time\n"
+            "      TimeSlot increment:      The increment\n"
+            "      bool relative<optional>: default = False, relative to suite start or repeated node\n\n"
+            "   Time(time_series)\n"
+            "      TimeSeries time_series:Similar to constructor above\n"
+            "\nExceptions:\n\n"
+            "- raises IndexError when an invalid Time is specified\n"
+            "\nUsage::\n\n"
+            "   time = Time( 10,10 )                                                   #  time 10:10 \n"
+            "   time = Time( TimeSlot(10,10), true)                                    #  time +10:10 \n"
+            "   time = Time( TimeSlot(10,10), TimeSlot(20,10),TimeSlot(0,10), false )  #  time 10:10 20:10 00:10 \n"
+            ;
+}
+
+const char* NodeAttrDoc::today_doc()
+{
+   return
+            ":term:`today` is a time dependency that does not wrap to tomorrow.\n\n"
+            "If the :term:`suite` s begin time is past the time given for the Today,\n"
+            "then the node is free to run.\n"
+            "\nConstructor::\n\n"
+            "   Today(hour,minute,relative<optional> = false)\n"
+            "      int hour               : hour in 24 clock\n"
+            "      int minute             : minute <= 59\n"
+            "      bool relative<optional>: Default = false,Relative to suite start or repeated node.\n\n"
+            "   Today(single,relative<optional> = false)\n"
+            "      TimeSlot single        : A single time\n"
+            "      bool relative          : Relative to suite start or repeated node. Default is false\n\n"
+            "   Today(start,finish,increment,relative<optional> = false)\n"
+            "      TimeSlot start         : The start time\n"
+            "      TimeSlot finish        : The finish/end time. This must be greater than the start time.\n"
+            "      TimeSlot increment     : The increment\n"
+            "      bool relative<optional>: Default = false, Relative to suite start or repeated node.\n\n"
+            "   Today(time_series)\n"
+            "      TimeSeries time_series: Similar to constructor above\n"
+            "\nExceptions:\n\n"
+            "- raises IndexError when an invalid Today is specified\n"
+            "\nUsage::\n\n"
+            "   today = Today( 10,10 )                                                   #  today 10:10 \n"
+            "   today = Today( TimeSlot(10,10) )                                         #  today 10:10 \n"
+            "   today = Today( TimeSlot(10,10), true)                                    #  today +10:10 \n"
+            "   today = Today( TimeSlot(10,10), TimeSlot(20,10),TimeSlot(0,10), false )  #  time 10:10 20:10 00:10 \n"
+            ;
+}
+
+const char* NodeAttrDoc::late_doc()
+{
+   return
+            "Sets the :term:`late` flag.\n\n"
+            "When a Node is classified as being late, the only action :term:`ecflow_server` can take\n"
+            "is to set a flag. The GUI will display this alongside the :term:`node` name as a icon.\n"
+            "Only one Late attribute can be specified on a Node.\n"
+            "\nConstructor::\n\n"
+            "   Late()\n"
+            "\nUsage::\n\n"
+            "   late = Late()\n"
+            "   late.submitted( 0,15 )\n"
+            "   late.active(   20,0 )\n"
+            "   late.complete(  2,0, true )\n\n"
+            "This is interpreted as: The node can stay :term:`submitted` for a maximum of 15 minutes\n"
+            "and it must become :term:`active` by 20:00 and the run time must not exceed 2 hours"
+            ;
+}
+
+const char* NodeAttrDoc::autocancel_doc()
+{
+   return
+            "Provides a way to automatically delete/remove a node which has completed\n\n"
+            "See :term:`autocancel`\n"
+            "\nConstructor::\n\n"
+            "   Autocancel(TimeSlot,relative)\n"
+            "      TimeSlot single: A time\n"
+            "      bool relative:   Relative to completion. False means delete the node at the real time specified.\n\n"
+            "   Autocancel(hour,minute,relative)\n"
+            "      int hour:        hour in 24 hrs\n"
+            "      int minute:      minute <= 59\n"
+            "      bool relative:   Relative to completion. False means delete the node at the real time specified.\n\n"
+            "   Autocancel(days)\n"
+            "      int days:        Delete the node 'days' after completion\n"
+            "\nUsage::\n\n"
+            "   attr = Autocancel( 1,30, true )              # delete node 1 hour and 30 minutes after completion\n"
+            "   attr = Autocancel( TimeSlot(0,10), true )    # delete node 10 minutes after completion\n"
+            "   attr = Autocancel( TimeSlot(10,10), false )  # delete node at 10:10 after completion\n"
+            "   attr = Autocancel( 3  )                      # delete node 3 days after completion\n"
+            ;
+}
+
+const char* NodeAttrDoc::repeat_doc()
+{
+   return
+            "Represents one of RepeatString,RepeatEnumerated,RepeatInteger,RepeatDate,RepeatDay\n\n"
+            ;
+}
+
+const char* NodeAttrDoc::repeat_date_doc()
+{
+   return
+            "Allows a :term:`node` to be repeated using a yyyymmdd format\n\n"
+            "A node can only have one :term:`repeat`.\n"
+            "The repeat can be referenced in :term:`trigger` expressions.\n"
+            "\nConstructor::\n\n"
+            "   RepeatDate(variable,start,end,delta)\n"
+            "      string variable:     The name of the repeat. The current date can referenced in\n"
+            "                           in trigger expressions using the variable name\n"
+            "      int start:           Start date, must have format: yyyymmdd\n"
+            "      int end:             End date, must have format: yyyymmdd\n"
+            "      int delta<optional>: default = 1, Always in days. The increment used to update the date\n"
+            "\nException:\n\n"
+            "- Throws a RuntimeError if start/end are not valid dates\n"
+            "\nUsage::\n\n"
+            "   rep = RepeatDate(\"YMD\", 20050130, 20050203 )\n"
+            "   rep = RepeatDate(\"YMD\", 20050130, 20050203, 2 )\n"
+            ;
+}
+
+const char* NodeAttrDoc::repeat_integer_doc()
+{
+   return
+            "Allows a :term:`node` to be repeated using a integer range.\n\n"
+            "A node can only have one :term:`repeat`.\n"
+            "The repeat can be referenced in :term:`trigger` expressions.\n"
+            "\nConstructor::\n\n"
+            "   RepeatInteger(variable,start,end,step)\n"
+            "      string variable:     The name of the repeat. The current integer value can be\n"
+            "                           referenced in trigger expressions using the variable name\n"
+            "      int start:           Start integer value\n"
+            "      int end:             End end integer value\n"
+            "      int step<optional>:  Default = 1, The step amount\n"
+            "\nUsage::\n\n"
+            "   rep = RepeatInteger(\"HOUR\", 6, 24, 6 )\n"
+            ;
+}
+
+const char* NodeAttrDoc::repeat_enumerated_doc()
+{
+   return
+            "Allows a node to be repeated using a enumerated list.\n\n"
+            "A :term:`node` can only have one :term:`repeat`.\n"
+            "The repeat can be referenced in :term:`trigger` expressions.\n"
+            "\nConstructor::\n\n"
+            "   RepeatEnumerated(variable,list)\n"
+            "      string variable:     The name of the repeat. The current enumeration index can be\n"
+            "                           referenced in trigger expressions using the variable name\n"
+            "      vector list:         The list of enumerations\n"
+            "\nUsage::\n\n"
+            "   rep = RepeatEnumerated(\"COLOR\", [ 'red', 'green', 'blue' ] )\n"
+            ;
+}
+
+const char* NodeAttrDoc::repeat_string_doc()
+{
+   return
+            "Allows a :term:`node` to be repeated using a string list.\n\n"
+            "A :term:`node` can only have one :term:`repeat`.\n"
+            "The repeat can be referenced in :term:`trigger` expressions.\n"
+            "\nConstructor::\n\n"
+            "   RepeatString(variable,list)\n"
+            "      string variable:     The name of the repeat. The current index of the string list can be\n"
+            "                           referenced in trigger expressions using the variable name\n"
+            "      vector list:         The list of enumerations\n"
+            "\nUsage::\n\n"
+            "   rep = RepeatString(\"COLOR\", [ 'red', 'green', 'blue' ] )\n"
+            ;
+}
+
+const char* NodeAttrDoc::repeat_day_doc()
+{
+   return
+            "A repeat that is infinite.\n\n"
+            "A node can only have one :term:`repeat`.\n"
+            "\nConstructor::\n\n"
+            "   RepeatDay(step)\n"
+            "      int step:     The step.\n"
+            "\nUsage::\n\n"
+            "   rep = RepeatDay( 1 )\n"
+            ;
+}
+
+const char* NodeAttrDoc::cron_doc()
+{
+   return
+            ":term:`cron` defines a time dependency for a node.\n\n"
+            "Crons are repeated indefinitely.\n\n"
+            "Avoid having a cron and :term:`repeat` at the same level,\n"
+            "as both provide looping functionality\n"
+            "\nConstructor::\n\n"
+            "   Cron()\n"
+            "\nExceptions:\n\n"
+            "- raises IndexError when an invalid cron is specified\n"
+            "\nUsage::\n\n"
+            "    cron = ecflow.Cron()\n"
+            "    cron.set_week_days([0, 1, 2, 3, 4, 5, 6])\n"
+            "    cron.set_days_of_month([1, 2, 3, 4, 5, 6 ])\n"
+            "    cron.set_months([1, 2, 3, 4, 5, 6])\n"
+            "    start = ecflow.TimeSlot(0 , 0)\n"
+            "    finish = ecflow.TimeSlot(23, 0)\n"
+            "    incr = ecflow.TimeSlot(0, 30)\n"
+            "    ts = ecflow.TimeSeries(start, finish, incr, True)  # True means relative to suite start\n"
+            "    cron.set_time_series(ts)\n"
+            "\n"
+            "    cron1 = ecflow.Cron()\n"
+            "    cron1.set_time_series(1, 30, True)  # same as cron +01:30\n"
+            "\n"
+            "    cron2 = ecflow.Cron()\n"
+            "    cron2.set_week_days([0, 1, 2, 3, 4, 5, 6])\n"
+            "    cron2.set_time_series(\"00:30 01:30 00:01\")\n"
+            "\n"
+            "    cron3 = ecflow.Cron()\n"
+            "    cron3.set_week_days([0, 1, 2, 3, 4, 5, 6])\n"
+            "    cron3.set_time_series(\"+00:30\")\n"
+            ;
+}
+
+const char* NodeAttrDoc::clock_doc()
+{
+   return
+            "Specifies the :term:`clock` type used by the :term:`suite`.\n\n"
+            "Only suites can have a :term:`clock`.\n"
+            "A gain can be specified to offset from the given date.\n"
+            "\nConstructor::\n\n"
+            "   Clock(day,month,year,hybrid)\n"
+            "      int day              : Specifies the day of the month  1-31\n"
+            "      int month            : Specifies the month 1-12\n"
+            "      int year             : Specifies the year > 1400\n"
+            "      bool hybrid<optional>: Default = False, true means hybrid, false means real\n"
+            "                             by default the clock is not real\n\n"
+            "      Time will be set to midnight, use set_gain() to alter\n"
+            "\n"
+            "   Clock(hybrid)\n"
+            "      bool hybrid: true means hybrid, false means real\n"
+            "                   by default the clock is real\n"
+            "      Time will be set real time of the computer\n"
+            "\n"
+            "\nExceptions:\n\n"
+            "- raises IndexError when an invalid Clock is specified\n"
+            "\nUsage::\n\n"
+            "   suite = Suite('s1')\n"
+            "   clock = Clock(1,1,2012,False)\n"
+            "   clock.set_gain(1,10,True)\n"
+            "   suite.add_clock(clock)\n"
+            ;
+}
diff --git a/ecflow_4_0_7/Pyext/src/NodeAttrDoc.hpp b/ecflow_4_0_7/Pyext/src/NodeAttrDoc.hpp
new file mode 100644
index 0000000..b9f044b
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/src/NodeAttrDoc.hpp
@@ -0,0 +1,54 @@
+#ifndef NODE_ATTR_DOC_HPP_
+#define NODE_ATTR_DOC_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#include <boost/noncopyable.hpp>
+
+// ===========================================================================
+// IMPORTANT: These appear as python doc strings.
+//            Additionally they are auto documented using sphinx-poco
+//            Hence the doc strings use reStructuredText markup
+// ===========================================================================
+class NodeAttrDoc : private boost::noncopyable {
+public:
+ 	static const char* variable_doc();
+   static const char* zombie_doc();
+   static const char* zombie_type_doc();
+   static const char* zombie_user_action_type_doc();
+   static const char* child_cmd_type_doc();
+ 	static const char* label_doc();
+ 	static const char* limit_doc();
+ 	static const char* inlimit_doc();
+ 	static const char* event_doc();
+ 	static const char* meter_doc();
+ 	static const char* date_doc();
+   static const char* day_doc();
+   static const char* days_enum_doc();
+ 	static const char* time_doc();
+ 	static const char* today_doc();
+ 	static const char* late_doc();
+ 	static const char* autocancel_doc();
+ 	static const char* repeat_doc();
+ 	static const char* repeat_date_doc();
+ 	static const char* repeat_integer_doc();
+ 	static const char* repeat_enumerated_doc();
+ 	static const char* repeat_string_doc();
+ 	static const char* repeat_day_doc();
+  	static const char* cron_doc();
+ 	static const char* clock_doc();
+private:
+	NodeAttrDoc(){}
+};
+#endif
diff --git a/ecflow_4_0_7/Pyext/test/CleanupOnlineTutorial.py b/ecflow_4_0_7/Pyext/test/CleanupOnlineTutorial.py
new file mode 100644
index 0000000..4c3e861
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/CleanupOnlineTutorial.py
@@ -0,0 +1,28 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+import os
+
+# clean up any file after running the online tutorial examples
+# Place in separate exception, otherwise not all files will be removed
+try: os.remove("test.def")
+except: pass
+
+try: os.remove("TestSuite.def")
+except: pass
+
+try: os.remove("SuiteBuilder.def")
+except: pass
+
+try: os.remove("server.defs")   
+except: pass
diff --git a/ecflow_4_0_7/Pyext/test/TestEmbedded.cpp b/ecflow_4_0_7/Pyext/test/TestEmbedded.cpp
new file mode 100644
index 0000000..287c5c7
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/TestEmbedded.cpp
@@ -0,0 +1,139 @@
+//// Commented out since we *dont* use embedded python
+//// Copyright Stefan Seefeld 2005.
+//// Distributed under the Boost Software License, Version 1.0. (See
+//// accompanying file LICENSE_1_0.txt or copy at
+//// http://www.boost.org/LICENSE_1_0.txt)
+//
+//#include <boost/python.hpp>
+//#include <boost/detail/lightweight_test.hpp>
+//#include <iostream>
+//
+//namespace python = boost::python;
+//
+//// An abstract base class
+//class Base : public boost::noncopyable {
+//public:
+//	virtual ~Base() {};
+//	virtual std::string hello() = 0;
+//};
+//
+//// C++ derived class
+//class CppDerived : public Base {
+//public:
+//	virtual ~CppDerived() {}
+//	virtual std::string hello() { return "Hello from C++!";}
+//};
+//
+//// Familiar Boost.Python wrapper class for Base
+//struct BaseWrap : Base, python::wrapper<Base>
+//{
+//	virtual std::string hello()  { return this->get_override("hello")(); }
+//};
+//
+//// Pack the Base class wrapper into a module
+//BOOST_PYTHON_MODULE(embedded_hello)
+//{
+//	python::class_<BaseWrap, boost::noncopyable> base("Base");
+//}
+//
+//void exec_test()
+//{
+//	std::cout << "registering extension module embedded_hello..." << std::endl;
+//
+//	// Register the module with the interpreter
+//	if (PyImport_AppendInittab("embedded_hello", initembedded_hello) == -1)
+//		throw std::runtime_error("Failed to add embedded_hello to the interpreter's "
+//		                         "builtin modules");
+//
+//	std::cout << "defining Python class derived from Base..." << std::endl;
+//
+//	// Retrieve the main module
+//	python::object main = python::import("__main__");
+//
+//	// Retrieve the main module's namespace
+//	python::object global(main.attr("__dict__"));
+//
+//	// Define the derived class in Python.
+//	python::object result = python::exec(
+//	                                     "from embedded_hello import *        \n"
+//	                                     "class PythonDerived(Base):          \n"
+//	                                     "    def hello(self):                \n"
+//	                                     "        return 'Hello from Python!' \n",
+//	                                     global, global);
+//
+//	python::object PythonDerived = global["PythonDerived"];
+//
+//	// Creating and using instances of the C++ class is as easy as always.
+//	CppDerived cpp;
+//	BOOST_TEST(cpp.hello() == "Hello from C++!");
+//
+//	std::cout << "testing derived class from C++..." << std::endl;
+//
+//	// But now creating and using instances of the Python class is almost  easy!
+//	python::object py_base = PythonDerived();
+//	Base& py = python::extract<Base&>(py_base) BOOST_EXTRACT_WORKAROUND;
+//
+//	// Make sure the right 'hello' method is called.
+//	BOOST_TEST(py.hello() == "Hello from Python!");
+//
+//	std::cout << "success!" << std::endl;
+//}
+//
+//void exec_file_test(std::string const &script)
+//{
+//    std::cout << "running file " << script << "..." << std::endl;
+//
+//    // Run a python script in an empty environment.
+//    python::dict global;
+//    python::object result = python::exec_file(script.c_str(), global, global);
+//
+//    // Extract an object the script stored in the global dictionary.
+//    BOOST_TEST(python::extract<int>(global["number"]) ==  42);
+//
+//    std::cout << "success!" << std::endl;
+//}
+//
+//void exec_test_error()
+//{
+//    std::cout << "intentionally causing a python exception..." << std::endl;
+//
+//    // Execute a statement that raises a python exception.
+//    python::dict global;
+//    python::object result = python::exec("print unknown \n", global, global);
+//
+//    std::cout << "Oops! This statement should be skipped due to an exception" << std::endl;
+//}
+//
+//int main(int argc, char **argv)
+//{
+//	BOOST_TEST(argc == 2);
+//	std::string script = argv[1];
+//
+//	// Initialize the interpreter
+//	Py_Initialize();
+//
+//	bool error_expected = false;
+//
+//	if ( 	python::handle_exception(exec_test)
+//			|| python::handle_exception(boost::bind(exec_file_test, script))
+//			|| (
+//					(error_expected = true)
+//					&& python::handle_exception(exec_test_error)
+//			)
+//	)
+//	{
+//		if (PyErr_Occurred())
+//		{
+//			if (!error_expected) BOOST_ERROR("Python Error detected");
+//			PyErr_Print();
+//		}
+//		else
+//		{
+//			BOOST_ERROR("A C++ exception was thrown  for which "
+//			            "there was no exception translator registered.");
+//		}
+//	}
+//
+//	// Boost.Python doesn't support Py_Finalize yet, so don't call it!
+//	return boost::report_errors();
+//}
diff --git a/ecflow_4_0_7/Pyext/test/TestEmbeddedEcf.cpp b/ecflow_4_0_7/Pyext/test/TestEmbeddedEcf.cpp
new file mode 100644
index 0000000..d33f2b3
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/TestEmbeddedEcf.cpp
@@ -0,0 +1,84 @@
+//// Commented out since we *dont* use embedded python
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+//#include <boost/python.hpp>
+//#include <boost/detail/lightweight_test.hpp>
+//#include "boost/filesystem/operations.hpp"
+//#include "boost/filesystem/path.hpp"
+//#include <iostream>
+//
+//namespace fs     = boost::filesystem;
+//namespace python = boost::python;
+//
+//// init_defs is defined in BOOST_PYTHON_MODULE(_defs) in file EcfDefsExt.cpp
+//// However we need definition here. Hence expanded the pertinent contents of
+//// BOOST_PYTHON_MODULE
+//extern "C" __attribute__ ((visibility("default"))) void initecflow();
+//
+//void exec_test()
+//{
+//	std::cout << "registering extension module ecflow..." << std::endl;
+//
+//	// Register the module with the interpreter
+//	if (PyImport_AppendInittab((char*)"_defs", initecflow) == -1)
+//		throw std::runtime_error("Failed to add _defs to the interpreter's built in modules");
+//
+//	std::cout << "defining Defs..." << std::endl;
+//
+//	// Retrieve the main module
+//	python::object main = python::import("__main__");
+//
+//	// Retrieve the main module's namespace
+//	python::object global(main.attr("__dict__"));
+//
+//	// Define Defs in Python.
+//	python::object result = python::exec(
+//	                                     "from ecflow import *\n"
+//	                                     "file = 'embedded.def'\n"
+//	                                     "defs = Defs(file)\n"
+//	                                     "suite = Suite('s1')\n"
+//	                                     "family = Family('f1')\n"
+//	                                     "for i in [ '_1', '_2', '_3' ]: family.add_task( Task( 't' + i) ) \n"
+//	                                     "defs.add_suite(suite);  \n"
+//	                                     "suite.add_family(family)\n"
+//	                                     "defs.save_as_defs("embedded.def")\n",
+// 	                                     global, global);
+//
+//	// Check it worked by looking for the presence of embedded.def file
+// 	BOOST_TEST(fs::exists("embedded.def") );
+// 	fs::remove("embedded.def");
+//
+//	std::cout << "success!" << std::endl;
+//}
+//
+//int main(int argc, char **argv)
+//{
+//	// Initialize the interpreter
+//	Py_Initialize();
+//
+//	if ( python::handle_exception(exec_test) )
+//	{
+//		if (PyErr_Occurred())
+//		{
+// 			PyErr_Print();
+//		}
+//		else
+//		{
+//			BOOST_ERROR("A C++ exception was thrown  for which "
+//			            "there was no exception translator registered.");
+//		}
+//	}
+//
+//	// Boost.Python doesn't support Py_Finalize yet, so don't call it!
+//	return boost::report_errors();
+//}
diff --git a/ecflow_4_0_7/Pyext/test/data/.gitignore b/ecflow_4_0_7/Pyext/test/data/.gitignore
new file mode 100644
index 0000000..2be8f78
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/.gitignore
@@ -0,0 +1 @@
+/CUSTOMER
diff --git a/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t1.ecf b/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t1.ecf
new file mode 100755
index 0000000..8aa16e7
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t1.ecf
@@ -0,0 +1,72 @@
+%manual
+	OPERATORS: This is an example of using a manual
+	
+	This is used to also test variable subsitution of 
+	generated variables
+	SUITE     = %SUITE%
+	DATE      = %DATE%
+	DAY       = %DAY%
+	DD        = %DD%
+	DOW       = %DOW%
+	DOY       = %DOY%
+	MM        = %MM%
+	MONTH     = %MONTH%
+	YYYY      = %YYYY%
+	ECF_DATE   = %ECF_DATE%
+	ECF_TIME   = %ECF_TIME%
+	ECF_CLOCK  = %ECF_CLOCK%
+
+	FAMILY    = %FAMILY%
+	FAMILY1   = %FAMILY1%
+
+	TASK      = %TASK%
+	ECF_RID    = %ECF_RID:<not defined yet, since empty string in task>%
+	ECF_TRYNO  = %ECF_TRYNO%
+	ECF_NAME   = %ECF_NAME%
+	ECF_PASS   = %ECF_PASS%
+	ECF_SCRIPT = %ECF_SCRIPT%
+	ECF_JOB    = %ECF_JOB%
+	ECF_JOBOUT = %ECF_JOBOUT%
+    
+    Other ECF_ variables
+	ECF_KILL_CMD  = %ECF_KILL_CMD:<not defined yet>%
+	ECF_JOB_CMD   = %ECF_JOB_CMD%
+	ECF_HOME      = %ECF_HOME%
+	ECF_TRIES     = %ECF_TRIES:<Error>%
+	SMFILES      = %SMFILES:<not defined yet>%
+	ECF_INCLUDE   = %ECF_INCLUDE:<not defined yet>%
+	ECF_FETCH     = %ECF_FETCH:<not defined yet>%
+	ECF_OUT       = %ECF_OUT:<not defined yet>%
+	ECF_MICRO     = %ECF_MICRO%
+%end
+
+#============================================================
+# Using angle brackets should use ECF_INCLUDE
+#=========================================================
+%include <head.h>
+
+
+echo do some work
+# SLEEPTIME is defined thedefs.def file. Test variable substituition
+sleep %SLEEPTIME%
+echo end of job
+
+# test smsevent. smsmeter replaced with path to client exe
+smsevent  eventname
+smsmeter  metername 10
+
+%include <tail.h>
+
+
+%manual
+	Rest of the manual page is placed here, closer to the code
+%end
+%comment
+  Comment start
+%end
+%comment
+  Comment end
+%end
+%nopp
+  ignore everything in here
+%end
diff --git a/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t2.ecf b/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t2.ecf
new file mode 100755
index 0000000..b6a5fd6
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t2.ecf
@@ -0,0 +1,9 @@
+ 
+%include <head.h>
+
+echo do some work
+# SLEEPTIME is defined thedefs.def file. Test variable substituition
+sleep 10
+echo end of job
+
+%include <tail.h>
diff --git a/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t3.ecf b/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t3.ecf
new file mode 100755
index 0000000..dad9405
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/ECF_HOME/suite_job_gen/family/t3.ecf
@@ -0,0 +1,34 @@
+ 
+%include <head.h>
+
+
+echo do some work
+sleep 10
+echo end of job
+
+#=====================================================
+# change the ecfmicro character
+%ecfmicro &
+
+&manual
+	START Rest of the manual page is placed here, closer to the code
+&end
+&comment
+  Comment start
+  &SUITE&
+&end
+&comment
+  Comment end
+&end
+&nopp
+  ignore everything in here
+&end
+&manual
+	END of the manual
+&end
+#=====================================================
+# change the ecfmicro character back
+&ecfmicro %
+
+
+%include <tail.h>
diff --git a/ecflow_4_0_7/Pyext/test/data/includes/head.h b/ecflow_4_0_7/Pyext/test/data/includes/head.h
new file mode 100755
index 0000000..c39d08a
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/includes/head.h
@@ -0,0 +1,45 @@
+#!/bin/ksh
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+## Copyright 2009-2012 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+# Defines the variables that are needed for any
+# communication with ECF_
+
+export ECF_PORT=%ECF_PORT%    # ECF portnumber
+export ECF_NODE=%ECF_NODE%    # The name host that issued this task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of init
+# Here we give the current PID.
+
+%ECF_CLIENT_EXE_PATH:ecflow_client% --init=$$
+
+# Defined a error hanlder
+
+ERROR() {
+	set +e                                       # Clear -e flag, so we don't fail
+	wait                                         # wait for background process to stop
+	%ECF_CLIENT_EXE_PATH:ecflow_client% --abort  # Notify ECF_ that something went wrong
+	trap 0                                       # Remove the trap
+	exit 0                                       # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
diff --git a/ecflow_4_0_7/Pyext/test/data/includes/tail.h b/ecflow_4_0_7/Pyext/test/data/includes/tail.h
new file mode 100755
index 0000000..2127006
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/includes/tail.h
@@ -0,0 +1,4 @@
+wait                                            # wait for background process to stop
+%ECF_CLIENT_EXE_PATH:ecflow_client% --complete  # Notify ECF of a normal end
+trap 0                                          # Remove all traps
+exit 0                                          # End the shell
diff --git a/ecflow_4_0_7/Pyext/test/data/python_includes/head.py b/ecflow_4_0_7/Pyext/test/data/python_includes/head.py
new file mode 100644
index 0000000..09cb3cc
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/python_includes/head.py
@@ -0,0 +1,26 @@
+import os
+import ecflow
+
+print "PYTHONPATH====================================================="
+print os.environ['PYTHONPATH'].split(os.pathsep)
+
+print "Creating Client"
+ci = ecflow.Client()
+ci.set_host_port("%ECF_NODE%","%ECF_PORT%")
+ci.set_child_pid(os.getpid())
+ci.set_child_path("%ECF_NAME%")
+ci.set_child_password("%ECF_PASS%")
+ci.set_child_try_no(%ECF_TRYNO%)
+
+print "Only wait 5  minutes, if the server cannot be contacted (note default is 24 hours) before failing"
+ci.set_child_timeout(300) 
+
+try:
+   ci.child_init();
+   print "child init ok"
+except RuntimeError, e:
+   print "Error: abort in head.h " + str(e)
+   ci.child_abort("Abort in head" + str(e))
+except:
+   print "Error: abort in head.h"
+   ci.child_abort("Abort in head")
diff --git a/ecflow_4_0_7/Pyext/test/data/python_includes/tail.py b/ecflow_4_0_7/Pyext/test/data/python_includes/tail.py
new file mode 100644
index 0000000..1286f68
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/data/python_includes/tail.py
@@ -0,0 +1,7 @@
+try:
+   ci.child_complete()
+   print "Sent complete"
+except:
+   print "complete aborted"
+   ci.child_abort("Abort in tail")
+
diff --git a/ecflow_4_0_7/Pyext/test/ecflow_test_util.py b/ecflow_4_0_7/Pyext/test/ecflow_test_util.py
new file mode 100644
index 0000000..1819c8b
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/ecflow_test_util.py
@@ -0,0 +1,220 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2014 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#
+# Utility code used in the tests.
+#
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+from socket import gethostname 
+import os
+import fcntl
+import shutil   # used to remove directory tree
+
+from ecflow import Client, debug_build, File
+
+# Enable to stop data being deleted, and stop server from being terminated
+def debugging() : return False
+
+def ecf_home(port): 
+    # debug_build() is defined for ecflow. Used in test to distinguish debug/release ecflow
+    # Vary ECF_HOME based on debug/release/port allowing multiple invocations of these tests
+    if debug_build():
+        return os.getcwd() + "/test/data/ecf_home_debug_" + str(port)
+    return os.getcwd() + "/test/data/ecf_home_release_" + str(port)
+
+def get_parent_dir(file_path):
+    return os.path.dirname(file_path)
+
+def get_root_source_dir():
+    cwd = os.getcwd()
+    #print "get_root_source_dir from: " + cwd
+    while (1):
+        # Get to directory that has ecflow
+        head, tail = os.path.split(cwd)
+        #print "   tail:" + tail
+        if tail.find("ecflow") != -1 :
+            
+            # bjam, already at the source directory
+            if os.path.exists(cwd + "/VERSION.cmake"): 
+                #print "   Found VERSION.cmake in " + cwd
+                return cwd
+        
+            # in cmake, we may be in the build directory, hence we need to determine source directory
+            file = cwd + "/CTestTestfile.cmake"
+            print "   searching for " + file
+            if os.path.exists(file):
+                # determine path by looking into this file:
+                for line in open(file):
+                    ## Source directory: /tmp/ma0/clientRoot/workspace/working-directory/ecflow/Acore
+                    if line.find("Source directory"):
+                        tokens = line.split()
+                        if len(tokens) == 4:
+                            return tokens[3]
+                raise RuntimeError("ERROR could not find Source directory in CTestTestfile.cmake")
+            else:
+                raise RuntimeError("ERROR could not find file CTestTestfile.cmake in " + cwd)
+                
+        cwd = head
+    return cwd
+
+
+def log_file_path(port): return "./" + gethostname() + "." + port + ".ecf.log"
+def checkpt_file_path(port): return "./" + gethostname() + "." + port + ".ecf.check"
+def backup_checkpt_file_path(port): return "./" + gethostname() + "." + port + ".ecf.check.b"
+def white_list_file_path(port): return "./" + gethostname() + "." + port + ".ecf.lists"
+
+def clean_up_server(port):
+    print "   clean_up " + port
+    try: os.remove(log_file_path(port))
+    except: pass
+    try: os.remove(checkpt_file_path(port))
+    except: pass
+    try: os.remove(backup_checkpt_file_path(port))
+    except: pass
+    try: os.remove(white_list_file_path(port))  
+    except: pass
+    
+def clean_up_data(port):
+    print "   Attempting to Removing ECF_HOME " + ecf_home(port)
+    try: 
+        shutil.rmtree(ecf_home(port),True)   # True means ignore errors 
+        print "   Remove OK" 
+    except: 
+        print "   Remove Failed" 
+        pass
+        
+# =======================================================================================
+class EcfPortLock(object):
+    """allow debug and release version of python tests to run at the same
+    time, buy generating a unique port each time"""
+    def __init__(self):
+        print "   EcfPortLock:__init__"
+        pass
+    
+    def find_free_port(self,seed_port):
+        print "   EcfPortLock:find_free_port starting with " + str(seed_port)
+        port = seed_port
+        while 1:
+            if self._free_port(port) == True:
+                print "   *FOUND* free server port " + str(port)
+                if self._do_lock(port) == True:
+                    break;
+            else:
+                 print "   *Server* port " + str(port) + " busy, trying next port"
+            port = port + 1
+            
+        return str(port)  
+    
+    def _free_port(self,port):
+        try:
+            ci = Client()
+            ci.set_host_port("localhost",str(port))
+            ci.ping() 
+            return False
+        except RuntimeError, e:
+            return True
+            
+    def _do_lock(self,port):
+        file = self._lock_file(port)
+        try:
+            fp = open(file, 'w') 
+            try:
+                fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
+                self.lock_file_fp = fp
+                print "   *LOCKED* file " + file
+                return True;
+            except IOError:
+                print "   Could *NOT* lock file " + file + " trying next port"
+                return False
+        except IOError, e:
+             print "   Could not open file " + file + " for write trying next port"
+             return False
+        
+    def remove(self,port):
+        self.lock_file_fp.close()
+        os.remove(self._lock_file(port))
+    
+    def _lock_file(self,port):
+        lock_file = str(port) + ".lock"
+        return lock_file
+        
+# ===============================================================================
+
+class Server(object):
+    """TestServer: allow debug and release version of python tests to run at the same
+    time, by generating a unique port each time"""
+    def __init__(self):
+        print "Server:__init__: Starting server"      
+        if not debugging():
+            seed_port = 3153
+            if debug_build(): seed_port = 3152
+            self.lock_file = EcfPortLock()
+            self.the_port = self.lock_file.find_free_port(seed_port)   
+        else:
+            self.the_port = "3152"
+     
+        # Only worth doing this test, if the server is running
+        # ON HPUX, having only one connection attempt, sometimes fails
+        #ci.set_connection_attempts(1)     # improve responsiveness only make 1 attempt to connect to server
+        #ci.set_retry_connection_period(0) # Only applicable when make more than one attempt. Added to check api.
+        self.ci = Client("localhost", self.the_port)
+     
+    def __enter__(self):
+        try:
+            print "Server:__enter__: About to ping localhost:" + self.the_port       
+            self.ci.ping() 
+            print "   ------- Server all ready running *UNEXPECTED* ------"
+        except RuntimeError, e:
+            print "   ------- Server not running as *EXPECTED* ------ " 
+            print "   ------- Start the server on port " + self.the_port + " ---------"  
+            clean_up_server(str(self.the_port))
+            clean_up_data(str(self.the_port))
+    
+            server_exe = File.find_server();
+            assert len(server_exe) != 0, "Could not locate the server executable"
+        
+            server_exe += " --port=" + self.the_port + " --ecfinterval=4 &"
+            print "   TestClient.py: Starting server ", server_exe
+            os.system(server_exe) 
+        
+            print "   Allow time for server to start"
+            if self.ci.wait_for_server_reply() :
+                print "   Server has started"
+            else:
+                print "   Server failed to start after 60 second !!!!!!"
+                assert False , "Server failed to start after 60 second !!!!!!"
+            
+        print "   Run the tests, leaving Server:__enter__:" 
+
+        # return the Client, that can call to the server
+        return self.ci
+    
+    def __exit__(self,exctype,value,tb):
+        print "   Server:__exit__: Kill the server, clean up log file, check pt files and lock files, ECF_HOME"
+        print "   exctype:==================================================="
+        print exctype
+        print "   value:=====================================================" 
+        print value
+        print "   tb:========================================================"; 
+        print tb
+        print "   Terminate server ===================================================="
+        self.ci.terminate_server()  
+        print "   Terminate server OK ================================================="
+        print "   Remove lock file"
+        self.lock_file.remove(self.the_port)
+        clean_up_server(str(self.the_port))
+        
+        # Do not clean up data, if an assert was raised. This allow debug
+        if exctype == None:
+            clean_up_data(str(self.the_port))
+        return False
+        
+  
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_s_TestClientApi.py b/ecflow_4_0_7/Pyext/test/py_s_TestClientApi.py
new file mode 100644
index 0000000..b2ac1f3
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_s_TestClientApi.py
@@ -0,0 +1,1539 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#  code for testing client code in python
+import time
+import os
+import pwd
+from datetime import datetime
+import shutil   # used to remove directory tree
+
+# ecflow_test_util, see File ecflow_test_util.py
+import ecflow_test_util as Test
+from ecflow import Defs, Clock, DState,  Style, State, RepeatDate, PrintStyle, File, Client, SState, \
+                   JobCreationCtrl, CheckPt, Cron, debug_build
+#from __builtin__ import None
+
+def ecf_includes() :  return os.getcwd() + "/test/data/includes"
+
+def create_defs(name=""):
+    defs = Defs()
+    suite_name = name
+    if len(suite_name) == 0: suite_name = "s1"
+    suite = defs.add_suite(suite_name);
+    
+    ecfhome = Test.ecf_home(the_port);
+    suite.add_variable("ECF_HOME", ecfhome);
+    suite.add_variable("ECF_CLIENT_EXE_PATH", File.find_client());
+    suite.add_variable("SLEEP", "1");  # not strictly required since default is 1 second
+    suite.add_variable("ECF_INCLUDE", ecf_includes());
+
+    family = suite.add_family("f1")
+    family.add_task("t1")
+    family.add_task("t2")
+    return defs;
+    
+def test_host_port(ci,host,port):
+    try :
+        ci.set_host_port(host,port)
+        return True
+    except RuntimeError:
+        return False 
+
+def test_host_port_(ci,host_port):
+    try :
+        ci.set_host_port(host_port)
+        return True
+    except RuntimeError:
+        return False 
+    
+def test_client_host_port(host,port):
+    try :
+        Client(host,port)
+        return True
+    except RuntimeError:
+        return False 
+
+def test_client_host_port_(host_port):
+    try :
+        Client(host_port)
+        return True
+    except RuntimeError:
+        return False 
+        
+def test_set_host_port():
+    print "test_set_host_port"
+    ci = Client();
+    print " Client.get_host() = " + ci.get_host()
+    print " Client.get_port() = " + ci.get_port()
+    assert test_host_port(ci,"host","3141") ,  "Expected no errors"
+    assert test_host_port(ci,"host",4444) ,    "Expected no errors"
+    assert test_host_port_(ci,"host:4444") ,    "Expected no errors"
+    assert test_host_port(ci,"","") == False , "Expected errors"
+    assert test_host_port(ci,"host","") == False , "Expected errors"
+    assert test_host_port(ci,"host","host") == False , "Expected errors"
+    assert test_host_port_(ci,"host:host") == False , "Expected errors"
+    assert test_host_port_(ci,"3141:host") == False , "Expected errors"
+    
+    assert test_client_host_port("host","3141") ,  "Expected no errors"
+    assert test_client_host_port("host",4444) ,    "Expected no errors"
+    assert test_client_host_port_("host:4444") ,    "Expected no errors"
+    assert test_client_host_port("","") == False , "Expected errors"
+    assert test_client_host_port("host","") == False , "Expected errors"
+    assert test_client_host_port("host","host") == False , "Expected errors"
+    assert test_client_host_port_("host:host") == False , "Expected errors"
+    assert test_client_host_port_("3141:host") == False , "Expected errors"
+
+def test_version(ci):
+    client_version = ci.version();
+    server_version = ci.server_version();
+    assert client_version == server_version, "Expected client version(" + client_version +") and server version(" +  server_version + ") to match\n";
+    
+def test_client_get_server_defs(ci):
+    print "Client version is " + ci.version();
+    print "test_client_get_server_defs"
+    ci.delete_all() # start fresh
+    ci.load(create_defs())  
+    ci.get_server_defs() 
+    assert ci.get_defs().find_suite("s1") != None, "Expected to find suite of name s1:\n" + str(ci.get_defs())
+
+    ci.delete_all() # start fresh
+    ci.load(create_defs())  
+    ci.sync_local()
+    assert ci.get_defs().find_suite("s1") != None, "Expected to find suite of name s1:\n" + str(ci.get_defs())
+
+
+def test_client_new_log(ci, port):
+    print "test_client_new_log"
+    try : os.remove("./test_client_new_log.log") # delete file if it exists
+    except: pass
+    
+    ci.new_log("./test_client_new_log.log") 
+    ci.flush_log() # close log file and force write to disk
+    assert os.path.exists("./test_client_new_log.log"), "New log does not exist"
+    
+    # reset new log to original
+    ci.new_log(Test.log_file_path(port)) 
+    ci.ping()
+    ci.flush_log() # close log file and force write to disk    
+    log_file = open(Test.log_file_path(port))
+    try:     log_text = log_file.read();     # assume log file not to big
+    finally: log_file.close();
+    assert log_text.find("--ping") != -1, "Expected to find --ping in log file"
+    try: os.remove("./test_client_new_log.log")
+    except: pass
+
+
+def test_client_clear_log(ci, port):
+    print "test_client_clear_log"
+    # populate log
+    ci.ping();
+    ci.ping();
+    ci.flush_log() # close log file and force write to disk    
+    log_file = open(Test.log_file_path(port))
+    try:     log_text = log_file.read();     # assume log file not to big
+    finally: log_file.close();
+    assert log_text.find("--ping") != -1, "Expected to find --ping in log file"
+    
+    ci.clear_log()    
+    log_file = open(Test.log_file_path(port))
+    try:     log_text = log_file.read();     # assume log file not to big
+    finally: log_file.close();
+    assert len(log_text) == 0, "Expected log file to be empty but found " + log_text
+
+
+def test_client_log_msg(ci, port):
+    print "test_client_log_msg"
+    # Send a message to the log file, then make sure it was written
+    ci.log_msg("Humpty dumpty sat on a wall!")
+    ci.flush_log(); # flush and close log file, so we can open it
+    log_file = open(Test.log_file_path(port))
+    try:     log_text = log_file.read();     # assume log file not to big
+    finally: log_file.close();
+    assert log_text.find("Humpty dumpty sat on a wall!") != -1, "Expected to find Humpty dumpty in the log file"                
+        
+         
+def test_client_restart_server(ci):
+    print "test_client_restart_server"
+    ci.restart_server()
+    ci.sync_local()
+    assert ci.get_defs().get_server_state() == SState.RUNNING, "Expected server to be running"
+    
+    paths = list(ci.changed_node_paths)
+    assert len(paths) == 1, "expected changed node to be the root node"
+    assert paths[0] == "/", "Expected root path but found " + str(paths[0])
+
+def test_client_halt_server(ci):
+    print "test_client_halt_server"
+    ci.halt_server()
+    ci.sync_local()
+    assert ci.get_defs().get_server_state() == SState.HALTED, "Expected server to be halted"
+    
+    paths = list(ci.changed_node_paths)
+    assert len(paths) == 1, "expected changed node to be the root node"
+    assert paths[0] == "/", "Expected root path but found " + str(paths[0])
+
+def test_client_shutdown_server(ci):
+    print "test_client_shutdown_server"
+    ci.shutdown_server()
+    ci.sync_local()
+    assert ci.get_defs().get_server_state() == SState.SHUTDOWN, "Expected server to be shutdown"
+    
+    paths = list(ci.changed_node_paths)
+    assert len(paths) == 1, "expected changed node to be the root node"
+    assert paths[0] == "/", "Expected root path but found " + str(paths[0])
+
+
+def test_client_load_in_memory_defs(ci):
+    print "test_client_load_in_memory_defs"
+    ci.delete_all() # start fresh
+    ci.load(create_defs())  
+    ci.sync_local() 
+    assert ci.get_defs().find_suite("s1") != None, "Expected to find suite of name s1:\n" + str(ci.get_defs())              
+
+
+def test_client_load_from_disk(ci):            
+    print "test_client_load_from_disk"
+    ci.delete_all() # start fresh
+    defs = create_defs();
+    defs_file = "test_client_load_from_disk.def"
+    defs.save_as_defs(defs_file)     
+    assert os.path.exists(defs_file), "Expected file " + defs_file + " to exist after defs.save_as_defs()"
+    ci.load(defs_file) # open and parse defs file, and load into server.\n"
+        
+    # check load worked
+    ci.sync_local() 
+    assert ci.get_defs().find_suite("s1") != None, "Expected to find suite of name s1:\n" + str(ci.get_defs())
+    os.remove(defs_file)
+
+
+def test_client_checkpt(ci, port):
+    print "test_client_checkpt"
+    # start fresh
+    ci.delete_all() 
+    try:    
+        os.remove(Test.checkpt_file_path(port))
+        os.remove(Test.backup_checkpt_file_path(port))
+    except: pass
+    
+    ci.load(create_defs())  
+    ci.checkpt()
+    assert os.path.exists(Test.checkpt_file_path(port)), "Expected check pt file to exist after ci.checkpt()"
+    assert os.path.exists(Test.backup_checkpt_file_path(port)) == False, "Expected back up check pt file to *NOT* exist"
+    
+    ci.checkpt()   # second check pt should cause backup check pt to be written
+    assert os.path.exists(Test.backup_checkpt_file_path(port)), "Expected back up check pt file to exist after second ci.checkpt()"
+
+    ci.checkpt(CheckPt.NEVER)         # switch of check pointing
+    ci.checkpt(CheckPt.ALWAYS)        # always check point, at any state change
+    ci.checkpt(CheckPt.ON_TIME)       # Check point periodically, by interval set in server
+    ci.checkpt(CheckPt.ON_TIME, 200)  # Check point periodically, by interval set in server
+    ci.checkpt(CheckPt.UNDEFINED, 0, 35)  # Change check point save time alarm
+
+    os.remove(Test.checkpt_file_path(port))
+    os.remove(Test.backup_checkpt_file_path(port))
+
+
+def test_client_restore_from_checkpt(ci, port):          
+    print "test_client_restore_from_checkpt"
+    # start fresh
+    ci.delete_all() 
+    try:    
+        os.remove(Test.checkpt_file_path(port))
+        os.remove(Test.backup_checkpt_file_path(port))
+    except: pass
+    
+    ci.load(create_defs())  
+    ci.checkpt()
+    ci.delete_all() 
+    
+    ci.sync_local() 
+    assert ci.get_defs().find_suite("s1") == None, "Expected all suites to be delete:\n"
+    
+    ci.halt_server()  # server must be halted, otherwise restore_from_checkpt will throw
+    ci.restore_from_checkpt()
+    
+    ci.sync_local() 
+    assert ci.get_defs().find_suite("s1") != None, "Expected to find suite s1 after restore from checkpt:\n" + str(ci.get_defs())
+
+    os.remove(Test.checkpt_file_path(port))
+
+
+def get_username(): return pwd.getpwuid(os.getuid())[ 0 ]
+
+def test_client_reload_wl_file(ci, port):
+    print "test_client_reload_wl_file"
+    
+    expected = False
+    try:    ci.reload_wl_file();            
+    except: expected = True
+    assert expected, "Expected reload to fail when no white list specified"
+    
+    # create a white list file
+    wl_file = open(Test.white_list_file_path(port), 'w')
+    wl_file.write("#\n")
+    wl_file.write("4.4.14   #   comment\n\n")
+    wl_file.write("# These user have read and write access to the server\n")
+    wl_file.write(get_username() + "\n")  # add current user otherwise remaining test's, wont have access from server anymore
+    wl_file.write("axel  # admin\n")
+    wl_file.write("john  # admin\n\n")
+    wl_file.write("# Read only users\n")
+    wl_file.write("-fred   # needs read access only\n")
+    wl_file.write("-joe90  # needs read access only\n")
+    wl_file.close();
+    
+    ci.reload_wl_file();  
+    os.remove(Test.white_list_file_path(port))          
+
+
+def test_client_run(ci):            
+    print "test_client_run"
+    ci.delete_all()     
+    defs = create_defs("test_client_run")  
+    suite = defs.find_suite("test_client_run")
+    suite.add_defstatus(DState.suspended)
+
+    defs.generate_scripts();
+    
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+    
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+    ci.run("/test_client_run", False)
+    
+    count = 0
+    while 1:
+        count += 1
+        ci.sync_local() # get the changes, synced with local defs
+        suite = ci.get_defs().find_suite("test_client_run")
+        assert suite != None, "Expected to find suite test_client_run:\n" + str(ci.get_defs())
+        if suite.get_state() == State.complete:
+            break;
+        time.sleep(3)
+        if count > 20:
+            assert False, "test_client_run aborted after " + str(count) + " loops:\n" + str(ci.get_defs())
+        
+    ci.log_msg("Looped " + str(count) + " times")
+    
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_client_run"
+    shutil.rmtree(dir_to_remove)      
+
+def test_client_run_with_multiple_paths(ci):            
+    print "test_client_run_with_multiple_paths"
+    ci.delete_all()     
+    defs = create_defs("test_client_run_with_multiple_paths")  
+    suite = defs.find_suite("test_client_run_with_multiple_paths")
+    suite.add_defstatus(DState.suspended)
+
+    defs.generate_scripts();
+    
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+    
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+    path_list = [ "/test_client_run_with_multiple_paths/f1/t1", "/test_client_run_with_multiple_paths/f1/t2"]
+    ci.run( path_list, False)
+
+    count = 0
+    while 1:
+        count += 1
+        ci.sync_local() # get the changes, synced with local defs
+        suite = ci.get_defs().find_suite("test_client_run_with_multiple_paths")
+        assert suite != None, "Expected to find suite test_client_run_with_multiple_paths:\n" + str(ci.get_defs())
+        if suite.get_state() == State.complete:
+            break;
+        time.sleep(3)
+        if count > 20:
+            assert False, "test_client_run_with_multiple_paths aborted after " + str(count) + " loops:\n" + str(ci.get_defs())
+        
+    ci.log_msg("Looped " + str(count) + " times")
+    
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_client_run_with_multiple_paths"
+    shutil.rmtree(dir_to_remove)      
+
+    
+def test_client_requeue(ci):
+    print "test_client_requeue"
+    ci.delete_all()     
+    defs = create_defs("test_client_requeue")  
+    suite = defs.find_suite("test_client_requeue")
+    suite.add_defstatus(DState.suspended)
+     
+    defs.generate_scripts();
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+ 
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+    
+    ci.force_state_recursive("/test_client_requeue",State.unknown)
+    ci.sync_local();
+    suite = ci.get_defs().find_suite("test_client_requeue")
+    assert suite.get_state() == State.unknown, "Expected to find suite with state unknown"
+
+    ci.requeue("/test_client_requeue")
+    ci.sync_local();
+    suite = ci.get_defs().find_suite("test_client_requeue")
+    assert suite.get_state() == State.queued, "Expected to find suite with state queued"
+
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_client_requeue"
+    shutil.rmtree(dir_to_remove)      
+
+def test_client_requeue_with_multiple_paths(ci):
+    print "test_client_requeue_with_multiple_paths"
+    ci.delete_all()     
+    defs = create_defs("test_client_requeue_with_multiple_paths")  
+    suite = defs.find_suite("test_client_requeue_with_multiple_paths")
+    suite.add_defstatus(DState.suspended)
+     
+    defs.generate_scripts();
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+ 
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+    
+    ci.force_state_recursive("/test_client_requeue_with_multiple_paths",State.unknown)
+    ci.sync_local();
+    task1 = ci.get_defs().find_abs_node("/test_client_requeue_with_multiple_paths/f1/t1")
+    task2 = ci.get_defs().find_abs_node("/test_client_requeue_with_multiple_paths/f1/t2")
+    assert task1.get_state() == State.unknown, "Expected to find t1 with state unknown"
+    assert task2.get_state() == State.unknown, "Expected to find t2 with state unknown"
+
+    path_list = [ "/test_client_requeue_with_multiple_paths/f1/t1", "/test_client_requeue_with_multiple_paths/f1/t2" ]
+    ci.requeue( path_list)
+    ci.sync_local();
+    task1 = ci.get_defs().find_abs_node("/test_client_requeue_with_multiple_paths/f1/t1")
+    task2 = ci.get_defs().find_abs_node("/test_client_requeue_with_multiple_paths/f1/t2")
+    assert task1.get_state() == State.queued, "Expected to find task t1 with state queued"
+    assert task2.get_state() == State.queued, "Expected to find task t2 with state queued"
+
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_client_requeue_with_multiple_paths"
+    shutil.rmtree(dir_to_remove)      
+
+
+def test_client_free_dep(ci):
+    print "test_client_free_dep"
+    ci.delete_all()  
+       
+    # add a real clock, since we are adding date dependencies
+    # Note: adding a future time dependency on a task, will cause it to requeue, when complete
+    # Hence even when we free these dependency they get requeued.
+    # So we use todays date.
+    ltime = time.localtime();
+    day = ltime.tm_mday
+    month = ltime.tm_mon
+    year = ltime.tm_year
+    
+    defs = Defs()
+    suite = defs.add_suite("test_client_free_dep");
+    suite.add_clock(Clock(False)) # true means hybrid, False means real
+    ecfhome = Test.ecf_home(the_port);
+    suite.add_variable("ECF_HOME", ecfhome);
+    suite.add_variable("ECF_CLIENT_EXE_PATH", File.find_client());
+    suite.add_variable("SLEEPTIME", "1");
+    suite.add_variable("ECF_INCLUDE", ecf_includes());
+    family = suite.add_family("f1")
+    family.add_task("t1").add_time("00:01")
+    family.add_task("t2").add_date(day,month,year)
+    family.add_task("t3").add_trigger("1 == 0")
+    t4 = family.add_task("t4")
+    t4.add_time("00:01")
+    t4.add_date(day,month,year)
+    t4.add_trigger("1 == 0")
+
+    defs.generate_scripts();
+    
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+ 
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+    
+    t1_path = "/test_client_free_dep/f1/t1"
+    t2_path = "/test_client_free_dep/f1/t2"
+    t3_path = "/test_client_free_dep/f1/t3"
+    t4_path = "/test_client_free_dep/f1/t4"
+    while 1:
+        ci.sync_local()
+        t1 = ci.get_defs().find_abs_node(t1_path)
+        t2 = ci.get_defs().find_abs_node(t2_path)
+        t3 = ci.get_defs().find_abs_node(t3_path)
+        t4 = ci.get_defs().find_abs_node(t4_path)
+ 
+        if t1.get_state() == State.queued: ci.free_time_dep(t1_path)
+        if t2.get_state() == State.queued: ci.free_date_dep(t2_path)
+        if t3.get_state() == State.queued: ci.free_trigger_dep(t3_path)
+        if t4.get_state() == State.queued: ci.free_all_dep(t4_path)
+
+        suite = ci.get_defs().find_suite("test_client_free_dep")
+        if suite.get_state() == State.complete:
+            break;
+        time.sleep(3)       
+            
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_client_free_dep"
+    shutil.rmtree(dir_to_remove)             
+
+
+def test_client_stats(ci):
+    print "test_client_stats"
+    ci.stats()  # writes to standard out
+    
+def test_client_stats_reset(ci):
+    print "test_client_stats_reset"
+    ci.stats_reset()   
+    ci.stats()  # should produce no ouput, where we measure requests
+            
+def test_client_debug_server_on_off(ci):
+    print "test_client_debug_server_on_off"
+    ci.debug_server_on()  # writes to standard out
+    ci.debug_server_off()  
+
+
+def test_client_check(ci):
+    print "test_client_check"
+    ci.delete_all()     
+    
+    defs = Defs()
+    defs.add_extern("/a/b/c/d")
+    defs.add_extern("/a/b/c/d/e:event")
+    defs.add_extern("/a/b/c/d/e:meter")
+    defs.add_extern("/made/up/redundant/extren")
+    defs.add_extern("/made/up/redundant/extren")
+    defs.add_extern("/limits:c1a")
+    defs.add_extern("/limits:c1a")
+    defs.add_extern("fred")
+    defs.add_extern("limits:hpcd")
+    defs.add_extern("/suiteName:sg1")
+    defs.add_extern("/obs/limits:hpcd")
+    suite = defs.add_suite("extern")
+    family_f1 = suite.add_family("f1")
+    family_f1.add_task("p").add_trigger("/a/b/c/d == complete")      # extern path
+    family_f1.add_task("q").add_trigger("/a/b/c/d/e:event == set")   # extern event path
+    family_f1.add_task("r").add_trigger("/a/b/c/d/e:meter le 30")    # extern meter path
+
+    suite.add_inlimit("c1a","/limits")
+    suite.add_inlimit("fred")
+    
+    family_anon = suite.add_family("anon")
+    family_anon.add_inlimit("hpcd","limits")
+    family_anon.add_task("t1").add_inlimit("sg1","/suiteName")
+    family_anon.add_task("t2").add_inlimit("hpcd","/obs/limits")
+    family_anon.add_task("t3").add_inlimit("c1a","/limits")
+ 
+    # CLIENT side check
+    client_check = defs.check()
+    assert len(client_check) == 0, "Expected clean defs check due to externs but found:\n" + client_check + "\n" + str(defs)
+
+    # SERVER side check
+    ci.load(defs)
+    server_check = ci.check("") # empty string means check the whole defs, otherwise a node path can be specified.
+    # print server_check
+    assert len(server_check) > 0, "Expected defs to fail, since no externs in server "
+    
+def test_client_suites(ci):
+    print "test_client_suites"
+    ci.delete_all() 
+    assert len(ci.suites()) == 0 ,"expected 0 suite "
+
+    defs = create_defs("test_client_suites")
+    ci.load(defs)  
+    assert len(ci.suites()) == 1 ,"expected 1 suite "
+    
+    ci.delete_all() 
+    defs.add_suite("s2")
+    ci.load(defs)  
+    assert len(ci.suites()) == 2 ,"expected 2 suite "
+    
+def test_client_ch_suites(ci):
+    print "test_client_ch_suites"
+    ci.delete_all()     
+    
+    defs = Defs()
+    for i in range(1,7): defs.add_suite("s" + str(i))
+    ci.load(defs)
+    
+    suite_names = [ 's1', 's2', 's3' ]
+    ci.ch_register(True,suite_names)    # register interest in suites s1,s2,s3 and any new suites
+    ci.ch_register(False,[ "s1"])       # register interest in suites s1 
+ 
+    ci.ch_suites()  # writes to standard out, list of suites and handles
+
+def test_client_ch_register(ci):
+    print "test_client_ch_register"
+    ci.delete_all()  
+    try: ci.ch_drop_user("")  # drop all handle associated with current user
+    except: pass              # Drop throws if no handle registered
+    
+    defs = Defs()
+    for i in range(1,7): defs.add_suite("s" + str(i))
+    ci.load(defs)
+    
+    suite_names = [ 's1', 's2', 's3' ]
+    ci.ch_register(True, suite_names)    # register interest in suites s1,s2,s3 and any new suites
+    ci.ch_register(False,suite_names)    # register interest in suites s1,s2,s3 only
+  
+            
+def test_client_ch_drop(ci):
+    print "test_client_ch_drop"
+    ci.delete_all()   
+    try: ci.ch_drop_user("")  # drop all handle associated with current user
+    except: pass              # Drop throws if no handle registered
+    
+    defs = Defs()
+    for i in range(1,7): defs.add_suite("s" + str(i))
+    ci.load(defs)
+    
+    try:
+        # register interest in suites s1,s2,s3 and any new suites
+        suite_names = [ 's1', 's2', 's3' ]
+        ci.ch_register(True, suite_names)    
+    finally:  
+        ci.ch_drop()  # drop using handle stored in ci., from last register
+          
+          
+def test_client_ch_drop_user(ci):
+    print "test_client_ch_drop_user"
+    ci.delete_all()   
+    try: ci.ch_drop_user("")  # drop all handle associated with current user
+    except: pass              # Drop throws if no handle registered
+    
+    defs = Defs()
+    for i in range(1,7): defs.add_suite("s" + str(i))
+    ci.load(defs)
+    
+    try:
+        # register interest in suites s1,s2,s3 and any new suites
+        suite_names = [ 's1', 's2', 's3' ]
+        ci.ch_register(True, suite_names)
+    except RuntimeError, e:
+        print str(e)
+    
+    ci.ch_drop_user("")  # drop all handle associated with current user
+            
+            
+def test_client_ch_add(ci):
+    print "test_client_ch_add"
+    ci.delete_all()  
+    try: ci.ch_drop_user("")  # drop all handle associated with current user
+    except: pass              # Drop throws if no handle registered
+    
+    defs = Defs()
+    for i in range(1,7): defs.add_suite("s" + str(i))
+    ci.load(defs)
+    
+    try:
+        suite_names = []
+        ci.ch_register(True,suite_names)        # register interest in any new suites
+        suite_names = [ 's1', 's2' ]
+        ci.ch_add(suite_names)                  # add suites s1,s2 to the last added handle
+        suite_names = [ 's3', 's4' ]
+        ci.ch_add( ci.ch_handle(),suite_names)  # add suites s3,s4 using last handle
+    except RuntimeError, e:
+        print str(e)
+        
+    ci.ch_drop_user("")  # drop all handle associated with current user
+
+            
+def test_client_ch_auto_add(ci):
+    print "test_client_ch_auto_add"
+    ci.delete_all()  
+    try: ci.ch_drop_user("")  # drop all handle associated with current user
+    except: pass              # Drop throws if no handle registered
+    
+    defs = Defs()
+    for i in range(1,7): defs.add_suite("s" + str(i))
+    ci.load(defs)
+    
+    try:
+        suite_names = [ 's1', 's2' , 's3']
+        ci.ch_register(True,suite_names)     # register interest in suites s1,s2,s3 and any new suites
+        ci.ch_auto_add( False )                 # disable adding newly created suites to last registered handle\n"
+        ci.ch_auto_add( True )                  # enable adding newly created suites to last registered handle\n"
+        ci.ch_auto_add( ci.ch_handle(), False ) # disable adding newly created suites to handle\n"
+    except RuntimeError, e:
+        print str(e)
+        
+    ci.ch_drop_user("")  # drop all handle associated with current user
+        
+           
+def test_client_ch_remove(ci):
+    print "test_client_ch_remove"
+    ci.delete_all()  
+    try: ci.ch_drop_user("")  # drop all handle associated with current user
+    except: pass              # Drop throws if no handle registered
+    
+    defs = Defs()
+    for i in range(1,7): defs.add_suite("s" + str(i))
+    ci.load(defs)
+    
+    try:
+        suite_names = [ 's1', 's2' , 's3']
+        ci.ch_register(True,suite_names)     # register interest in suites s1,s2,s3 and any new suites
+        suite_names = [ 's1' ]
+        ci.ch_remove( suite_names )          # remove suites s1 from the last added handle\n"
+        suite_names = [ 's2' ]
+        ci.ch_remove( ci.ch_handle(), suite_names )  # remove suites s2 from the last added handle\n"
+    except RuntimeError, e:
+        print str(e)
+        
+    ci.ch_drop_user("")  # drop all handle associated with current user
+           
+           
+def test_client_get_file(ci):
+    print "test_client_get_file"
+    ci.delete_all()     
+    defs = create_defs("test_client_get_file")  
+      
+    defs.generate_scripts();
+    
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+ 
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+    
+    while 1:
+        if ci.news_local():
+            ci.sync_local() # get the changes, synced with local defs
+            suite = ci.get_defs().find_suite("test_client_get_file")
+            assert suite != None, "Expected to find suite"
+            if suite.get_state() == State.complete:
+                break;
+
+    try:
+        for file_t in [ 'script', 'job', 'jobout', 'manual' ]:
+            the_returned_file = ci.get_file('/test_client_get_file/f1/t1',file_t)  # make a request to the server
+            assert len(the_returned_file) > 0,"Expected ci.get_file(/test_client_get_file/f1/t1," + file_t + ") to return something"
+    except RuntimeError, e:
+        print str(e)
+
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_client_get_file"
+    shutil.rmtree(dir_to_remove,True)   # True means ignore errors   
+
+    
+def test_client_plug(ci):
+    pass
+           
+def test_client_alter_add(ci):
+    print "test_client_alter_add"
+    ci.delete_all()     
+    ci.load(create_defs("test_client_alter_add"))   
+
+    t1 = "/test_client_alter_add/f1/t1"
+    ci.alter(t1,"add","variable","var","var_name")
+    ci.alter(t1,"add","time","+00:30")
+    ci.alter(t1,"add","time","01:30")
+    ci.alter(t1,"add","time","01:30 20:00 00:30")
+    ci.alter(t1,"add","today","+00:30")
+    ci.alter(t1,"add","today","01:30")
+    ci.alter(t1,"add","today","01:30 20:00 00:30")
+    ci.alter(t1,"add","date","01.01.2001")
+    ci.alter(t1,"add","date","*.01.2001")
+    ci.alter(t1,"add","date","*.*.2001")
+    ci.alter(t1,"add","date","*.*.*")
+    ci.alter(t1,"add","day","sunday")
+    ci.alter(t1,"add","day","monday")
+    ci.alter(t1,"add","day","tuesday")
+    ci.alter(t1,"add","day","wednesday")
+    ci.alter(t1,"add","day","thursday")
+    ci.alter(t1,"add","day","friday")
+    ci.alter(t1,"add","day","saturday")
+
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.variables))) == 1 ,"Expected 1 variable :\n" + str(ci.get_defs())
+    assert( len(list(task_t1.times))) == 3 ,"Expected 3 time :\n" + str(ci.get_defs())
+    assert( len(list(task_t1.todays))) == 3 ,"Expected 3 today's :\n" + str(ci.get_defs())
+    assert( len(list(task_t1.dates))) == 4 ,"Expected 4 dates :\n" + str(ci.get_defs())
+    assert( len(list(task_t1.days))) == 7 ,"Expected 7 days :\n" + str(ci.get_defs())
+           
+
+def test_client_alter_delete(ci):
+    print "test_client_alter_delete"
+    ci.delete_all() 
+    defs =create_defs("test_client_alter_delete")   
+    t1 = "/test_client_alter_delete/f1/t1"
+    task_t1 = defs.find_abs_node(t1)
+    task_t1.add_variable("var","value")
+    task_t1.add_variable("var1","value")
+    task_t1.add_time("00:30")
+    task_t1.add_time("00:31")
+    task_t1.add_today("00:30")
+    task_t1.add_today("00:31")
+    task_t1.add_date(1,1,2001)
+    task_t1.add_date(1,1,2002)
+    task_t1.add_day("sunday")
+    task_t1.add_day("monday")
+    cron = Cron()
+    cron.set_week_days( [0,1,2,3,4,5,6] )
+    cron.set_time_series( "+00:30" )
+    task_t1.add_cron(cron)
+    task_t1.add_cron(cron)
+    task_t1.add_event("event")
+    task_t1.add_event("event1")
+    task_t1.add_meter("meter",0,100,100)
+    task_t1.add_meter("meter1",0,100,100)
+    task_t1.add_label("label","name")
+    task_t1.add_label("label1","name")
+    task_t1.add_limit("limit",10)
+    task_t1.add_limit("limit1",10)
+    task_t1.add_inlimit( "limit",t1,2)
+    task_t1.add_inlimit( "limit1",t1,2)
+    task_t1.add_trigger( "t2 == active" )
+    task_t1.add_complete( "t2 == complete" )
+            
+    t2 = "/test_client_alter_delete/f1/t2"
+    task_t2 = defs.find_abs_node(t2)
+    task_t2.add_repeat( RepeatDate("date",20100111,20100115,2) )  # can't add cron and repeat at the same level
+    
+    ci.load(defs)   
+
+    ci.alter(t1,"delete","variable","var")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.variables))) == 1 ,"Expected 1 variable :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","variable")  # delete all veriables
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.variables))) == 0 ,"Expected 0 variable :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","time","00:30")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.times))) == 1 ,"Expected 1 time :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","time")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.times))) == 0 ,"Expected 0 time :\n" + str(ci.get_defs())
+    
+    ci.alter(t1,"delete","today","00:30")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.todays))) == 1 ,"Expected 1 today :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","today")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.todays))) == 0 ,"Expected 0 today :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","date","01.01.2001")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.dates))) == 1 ,"Expected 1 date :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","date")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.dates))) == 0 ,"Expected 0 date :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","day","sunday")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.days))) == 1 ,"Expected 1 day :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","day")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.days))) == 0 ,"Expected 0 day :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","event","event")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.events))) == 1 ,"Expected 1 event :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","event")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.events))) == 0 ,"Expected 0 event :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","meter","meter")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.meters))) == 1 ,"Expected 1 meter :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","meter")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.meters))) == 0 ,"Expected 0 meter :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","label","label")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.labels))) == 1 ,"Expected 1 label :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","label")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.labels))) == 0 ,"Expected 0 label :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","limit","limit")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.limits))) == 1 ,"Expected 1 limit :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","limit")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.limits))) == 0 ,"Expected 0 limit :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","inlimit","limit")
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.inlimits))) == 1 ,"Expected 1 inlimit :\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","inlimit")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.inlimits))) == 0 ,"Expected 0 inlimit :\n" + str(ci.get_defs())
+
+    ci.alter(t1,"delete","cron")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert( len(list(task_t1.crons))) == 0 ,"Expected 0 crons :\n" + str(ci.get_defs())
+
+
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert task_t1.get_trigger() != None, "Expected trigger:\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","trigger")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert task_t1.get_trigger() == None, "Expected trigger to be deleted:\n" + str(ci.get_defs())
+
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert task_t1.get_complete() != None, "Expected complete:\n" + str(ci.get_defs())
+    ci.alter(t1,"delete","complete")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    assert task_t1.get_complete() == None, "Expected complete to be deleted:\n" + str(ci.get_defs())
+
+    ci.alter(t2,"delete","repeat")   
+    ci.sync_local()
+    task_t2 = ci.get_defs().find_abs_node(t2)
+    repeat = task_t2.get_repeat()
+    assert repeat.empty(), "Expected repeat to be deleted:\n" + str(ci.get_defs())
+ 
+def test_client_alter_change(ci):
+    print "test_client_alter_change"
+    ci.delete_all() 
+    defs =create_defs("test_client_alter_change")   
+    t1 = "/test_client_alter_change/f1/t1"
+    repeat_date_path = "/test_client_alter_change/f1/repeat_date"
+    task_t1 = defs.find_abs_node(t1)
+    task_t1.add_variable("var","value")
+    task_t1.add_variable("var1","value")
+    task_t1.add_event("event")
+    task_t1.add_event("event1")
+    task_t1.add_meter("meter",0,100,100)
+    task_t1.add_meter("meter1",0,100,100)
+    task_t1.add_label("label","name")
+    task_t1.add_label("label1","name1")
+    task_t1.add_limit("limit",10)
+    task_t1.add_limit("limit1",10)
+    task_t1.add_inlimit( "limit",t1,2)
+    task_t1.add_inlimit( "limit1",t1,2)
+    task_t1.add_trigger( "t2 == active" )
+    task_t1.add_complete( "t2 == complete" )
+            
+    f1 = defs.find_abs_node("/test_client_alter_change/f1")
+    repeat_date = f1.add_task("repeat_date")
+    repeat_date.add_repeat( RepeatDate("date",20100111,20100115,2) )  # can't add cron and repeat at the same level
+           
+    ci.load(defs)   
+
+    ci.alter(t1,"change","variable","var","changed_var")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    variable = task_t1.find_variable("var")
+    assert variable.value() == "changed_var", "Expected alter of variable to be 'change_var' but found " + variable.value()
+
+    ci.alter(t1,"change","meter","meter","10")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    meter = task_t1.find_meter("meter")
+    assert meter.value() == 10, "Expected alter of meter to be 10 but found " + str(meter.value())
+
+    ci.alter(t1,"change","event","event","set")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    event = task_t1.find_event("event")
+    assert event.value() == True, "Expected alter of event to be set but found " + str(event.value())
+
+    ci.alter(t1,"change","trigger","t2 == aborted")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    trigger = task_t1.get_trigger()
+    assert trigger.get_expression() == "t2 == aborted", "Expected alter of trigger to be 't2 == aborted' but found " + trigger.get_expression()
+
+    ci.alter(t1,"change","trigger","/s1/f1/t2 == complete")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    trigger = task_t1.get_trigger()
+    assert trigger.get_expression() == "/s1/f1/t2 == complete", "Expected alter of trigger to be '/s1/f1/t2 == complete' but found " + trigger.get_expression()
+
+    ci.alter(t1,"change","complete","t2 == aborted")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    complete = task_t1.get_complete()
+    assert complete.get_expression() == "t2 == aborted", "Expected alter of complete to be 't2 == aborted' but found " + complete.get_expression()
+
+    ci.alter(t1,"change","complete","/s1/f1/t2 == active")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    complete = task_t1.get_complete()
+    assert complete.get_expression() == "/s1/f1/t2 == active", "Expected alter of complete to be '/s1/f1/t2 == active' but found " + complete.get_expression()
+
+    ci.alter(t1,"change","limit_max","limit", "2")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    limit = task_t1.find_limit("limit")
+    assert limit != None, "Expected to find limit"
+    assert limit.limit() == 2, "Expected alter of limit_max to be 2 but found " + str(limit.limit())
+
+    ci.alter(t1,"change","limit_value","limit", "2")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    limit = task_t1.find_limit("limit")
+    assert limit != None, "Expected to find limit"
+    assert limit.value() == 2, "Expected alter of limit_value to be 2 but found " + str(limit.value())
+
+    
+    ci.alter(t1,"change","label","label","new-value")   
+    ci.sync_local()
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    label = task_t1.find_label("label")
+    assert label.new_value() == "new-value", "Expected alter of label to be 'new-value' but found " + label.new_value()
+    
+    ci.alter(repeat_date_path,"change","repeat","20100112")   
+    ci.sync_local()
+    task = ci.get_defs().find_abs_node(repeat_date_path)
+    repeat = task.get_repeat()
+    assert repeat.value() == 20100112, "Expected alter of repeat to be 20100112 but found " + str(repeat.value())
+ 
+
+    # ISSUES:
+    # o Currently we can only change clock attr if we have one.
+    # o Even when we have a clock attr, it only makes sense to apply clock attr changes
+    #   before begin(), i.e how do we apply change in gain after begin ??
+    
+    #" change clock-type name        # The name must be one of 'hybrid' or 'real'.\n"
+    #       " change clock-gain name        # The gain must be convertible to an integer.\n"
+    #        " change label name value       # sets the label\n"
+    #        " change repeat value           # If the repeat is a date, then the value must be a valid YMD ( ie. yyyymmdd)\n"
+    #        "                               # and be convertible to an integer, additionally the value must be in range\n"
+    #        "                               # of the repeat start and end dates. Like wise for repeat integer. For repeat\n"
+    #         "                               # string and enum,  the name must either be an integer, that is a valid index or\n"
+    #         "                               # if it is a string, it must correspond to one of enum's or strings list\n"
+
+
+def test_client_force(ci):
+    print "test_client_force"
+    ci.delete_all()     
+    defs = create_defs("test_client_force") 
+     
+    path_list = [ "/test_client_force/f1/t1", "/test_client_force/f1/t2" ]       
+    t1 = path_list[0]      
+    for path in path_list:
+        task = defs.find_abs_node(path)
+        assert task != None, "Expected to find task at path " + path
+        task.add_event("event")
+
+    ci.load(defs)   
+    
+    state_list = [ State.unknown, State.active, State.complete, State.queued, State.submitted, State.aborted ]
+    for state in state_list:
+        ci.force_state(t1,state) 
+        ci.sync_local()
+        task = ci.get_defs().find_abs_node(t1)
+        assert task.get_state() == state, "Expected state " + state + " but found " + str(task.get_state())      
+    for state in state_list:
+        ci.force_state( path_list,state) 
+        ci.sync_local()
+        for path in path_list:
+            task = ci.get_defs().find_abs_node(path)
+            assert task.get_state() == state, "Expected state " + state + " but found " + str(task.get_state())     
+ 
+    for state in state_list:
+        ci.force_state_recursive("/test_client_force",state) 
+        ci.sync_local()
+        task = ci.get_defs().find_abs_node(t1)
+        assert task.get_state() == state, "Expected state " + state + " but found " + str(task.get_state())
+    suite_paths = [ "/test_client_force"]
+    for state in state_list:
+        ci.force_state_recursive( suite_paths,state) 
+        ci.sync_local()
+        task = ci.get_defs().find_abs_node(t1)
+        assert task.get_state() == state, "Expected state " + state + " but found " + str(task.get_state())           
+    
+    event_states = [ "set", "clear" ]
+    for ev_state in event_states:
+        for path in path_list:
+            ci.force_event(path + ":event" , ev_state)
+            ci.sync_local()
+            task = ci.get_defs().find_abs_node(path)
+            event_fnd = False
+            for event in task.events:
+                event_fnd = True
+                if ev_state == "set" :  assert event.value() == True  ," Expected event value to be set"
+                else:                   assert event.value() == False ," Expected event value to be clear"
+            assert event_fnd == True," Expected event to be found"
+
+    event_path_list = [ "/test_client_force/f1/t1:event", "/test_client_force/f1/t2:event" ]       
+    event_states = [ "set", "clear" ]
+    for ev_state in event_states:
+        ci.force_event( event_path_list , ev_state)
+        ci.sync_local()
+        for path in path_list:
+            task = ci.get_defs().find_abs_node(path)
+            event_fnd = False
+            for event in task.events:
+                event_fnd = True
+                if ev_state == "set" :  assert event.value() == True  ," Expected event value to be set"
+                else:                   assert event.value() == False ," Expected event value to be clear"
+            assert event_fnd == True," Expected event to be found"
+
+      
+
+def test_client_replace(ci,on_disk):
+    print "test_client_replace client_defs on disk = " + str(on_disk)
+    # Create and load the following defs
+    # s1
+    #   f1
+    #     t1
+    #     t2
+    ci.delete_all()     
+    ci.load(create_defs("s1"))  
+    
+    #===============================================================================
+    # Example of using replace to ADD a *NEW* node hierarchy to an existing suite
+    # we should end up with:
+    # s1
+    #   f1
+    #     t1
+    #     t2
+    #   f2
+    #     t1
+    #     t2
+    client_def = create_defs("s1")
+    client_def.find_suite("s1").add_family("f2").add_task("t1")
+    if on_disk:
+        client_def.save_as_defs("test_client_replace.def")
+        client_def = "test_client_replace.def"
+    
+    ci.replace("/s1/f2",client_def,True,False)  # True means create parents as needed, False means don't bypass checks/zombies
+    ci.get_server_defs()
+    assert len(list(ci.get_defs().suites)) == 1 ,"Expected 1 suites:\n" + str(ci.get_defs())
+    assert ci.get_defs().find_abs_node("/s1/f2/t1") != None, "Expected to find task /s1/f2/t1\n" + str(ci.get_defs())
+
+
+    # Example of using replace to *REMOVE* node hierarchy to an existing suite, could have used delete
+    assert ci.get_defs().find_abs_node("/s1/f1/t1") != None, "Expected to find task /s1/f1/t1\n" + str(ci.get_defs())
+    assert ci.get_defs().find_abs_node("/s1/f2/t1") != None, "Expected to find task /s1/f2/t1\n" + str(ci.get_defs())
+    client_def = Defs()
+    client_def.add_suite("s1")    # should only have the suite
+    if on_disk:
+        client_def.save_as_defs("test_client_replace.def")
+        client_def = "test_client_replace.def"
+
+    ci.replace("/s1",client_def)   
+    ci.get_server_defs()
+    assert len(list(ci.get_defs().suites)) == 1 ,"Expected 1 suites:\n" + str(ci.get_defs())
+    assert ci.get_defs().find_abs_node("/s1/f1/t1") == None, "Expected NOT to find task /s1/f1/t1\n" + str(ci.get_defs())
+    assert ci.get_defs().find_abs_node("/s1/f2/t1") == None, "Expected NOT to find task /s1/f2/t1\n" + str(ci.get_defs())
+
+
+    #===============================================================================
+    # Example of using replace to add a *NEW* suite
+    client_def = Defs();
+    client_def.add_suite("s2")
+    if on_disk:
+        client_def.save_as_defs("test_client_replace.def")
+        client_def = "test_client_replace.def"
+
+    ci.replace("/s2",client_def,True,False)  # True means create parents as needed, False means don't bypass checks/zombies
+    ci.get_server_defs()
+    assert len(list(ci.get_defs().suites)) == 2 ," Expected two suites:\n" + str(ci.get_defs())
+           
+    # replace added suite s2 with a new s2 which has a task, 
+    # s2 must exist on the client defs
+    client_def = Defs();
+    client_def.add_suite("s2").add_task("t1")
+    if on_disk:
+        client_def.save_as_defs("test_client_replace.def")
+        client_def = "test_client_replace.def"
+
+    ci.replace("/s2",client_def) 
+        
+    ci.get_server_defs()
+    assert len(list(ci.get_defs().suites)) == 2 ," Expected two suites:\n" + str(ci.get_defs())
+    assert ci.get_defs().find_abs_node("/s2/t1") != None, "Expected to find task /s2/t1\n" + str(ci.get_defs())
+    if on_disk:
+        os.remove(client_def)
+
+def test_client_kill(ci):
+    pass
+        
+def test_client_status(ci):
+    pass
+           
+def test_client_order(ci):
+    pass
+           
+def test_client_group(ci):
+    pass
+           
+def test_client_suspend(ci):
+    print "test_client_suspend"
+    ci.delete_all()     
+    defs = create_defs("test_client_suspend")  
+    suite = defs.find_suite("test_client_suspend")
+    suite.add_variable("ECF_DUMMY_TASK","")
+        
+    ci.load(defs)  
+    ci.begin_all_suites()  
+    
+    ci.suspend("/test_client_suspend")  
+           
+    ci.sync_local();
+    suite = ci.get_defs().find_suite("test_client_suspend")
+    assert suite.is_suspended(), "Expected to find suite suspended"
+    
+
+def test_client_suspend_multiple_paths(ci):
+    print "test_client_suspend_multiple_paths"
+    ci.delete_all()     
+    defs = create_defs("test_client_suspend_multiple_paths")  
+    suite = defs.find_suite("test_client_suspend_multiple_paths")
+    suite.add_variable("ECF_DUMMY_TASK","")
+    
+    ci.load(defs)  
+    ci.begin_all_suites()  
+    
+    path_list = [ "/test_client_suspend_multiple_paths/f1/t1", "/test_client_suspend_multiple_paths/f1/t2" ]
+    ci.suspend( path_list )  
+           
+    ci.sync_local();
+    task_t1 = ci.get_defs().find_abs_node("/test_client_suspend_multiple_paths/f1/t1")
+    task_t2 = ci.get_defs().find_abs_node("/test_client_suspend_multiple_paths/f1/t2")
+    assert task_t1.is_suspended(), "Expected to find task t1 to be suspended"
+    assert task_t2.is_suspended(), "Expected to find task t2 to be suspended"
+            
+def test_client_resume(ci):
+    print "test_client_resume"
+    ci.delete_all()     
+    defs = create_defs("test_client_resume")  
+    suite = defs.find_suite("test_client_resume")
+    suite.add_variable("ECF_DUMMY_TASK","")
+        
+    ci.load(defs)  
+    ci.begin_all_suites()  
+    
+    ci.suspend("/test_client_resume")  
+    ci.sync_local();
+    suite = ci.get_defs().find_suite("test_client_resume")
+    assert suite.is_suspended(), "Expected to find suite suspended"
+    
+    ci.resume("/test_client_resume")  
+    ci.sync_local();
+    suite = ci.get_defs().find_suite("test_client_resume")
+    assert suite.is_suspended() == False, "Expected to find suite resumed"
+
+def test_client_resume_multiple_paths(ci):
+    print "test_client_resume_multiple_paths"
+    ci.delete_all()     
+    defs = create_defs("test_client_resume_multiple_paths")  
+    suite = defs.find_suite("test_client_resume_multiple_paths")
+    suite.add_variable("ECF_DUMMY_TASK","")
+        
+    ci.load(defs)  
+    ci.begin_all_suites()  
+    
+    path_list = [ "/test_client_resume_multiple_paths/f1/t1", "/test_client_resume_multiple_paths/f1/t2" ]
+    ci.suspend( path_list )  
+  
+    ci.sync_local();
+    task_t1 = ci.get_defs().find_abs_node("/test_client_resume_multiple_paths/f1/t1")
+    task_t2 = ci.get_defs().find_abs_node("/test_client_resume_multiple_paths/f1/t2")
+    assert task_t1.is_suspended(), "Expected to find task t1 to be suspended"
+    assert task_t2.is_suspended(), "Expected to find task t2 to be suspended"
+
+    ci.resume( path_list )  
+    ci.sync_local();
+    task_t1 = ci.get_defs().find_abs_node("/test_client_resume_multiple_paths/f1/t1")
+    task_t2 = ci.get_defs().find_abs_node("/test_client_resume_multiple_paths/f1/t2")
+    assert task_t1.is_suspended() == False, "Expected to find task t1 to be resumed"
+    assert task_t2.is_suspended() == False, "Expected to find task t2 to be resumed"
+ 
+          
+def test_client_delete_node(ci): 
+    print "test_client_delete_node"
+    ci.delete_all() 
+    defs = create_defs("test_client_delete_node")
+    
+    task_vec = defs.get_all_tasks();
+    assert len(task_vec) > 0, "Expected some tasks but found none:\n" + str(defs)
+
+    ci.load(defs)  
+    ci.sync_local();
+    for task in task_vec:
+        node = ci.get_defs().find_abs_node(task.get_abs_node_path()) 
+        assert node != None , "Expected to find task " + task.get_abs_node_path()  + ":\n"  + str(ci.get_defs()) 
+
+    for task in task_vec:
+        ci.delete(task.get_abs_node_path())
+
+    ci.sync_local();
+    for task in task_vec:
+        node = ci.get_defs().find_abs_node(task.get_abs_node_path()) 
+        assert node == None , "Expected not to find task " + task.get_abs_node_path()  + " as it should have been deleted:\n" + str(ci.get_defs())   
+    
+def test_client_delete_node_multiple_paths(ci): 
+    print "test_client_delete_node_multiple_paths"
+    ci.delete_all() 
+    defs = create_defs("test_client_delete_node_multiple_paths")
+    
+    task_vec = defs.get_all_tasks();
+    assert len(task_vec) > 0, "Expected some tasks but found none:\n" + str(defs)
+
+    paths = []
+    for task in task_vec:
+        paths.append(task.get_abs_node_path()) 
+ 
+    ci.load(defs)  
+    
+    ci.sync_local();
+    for task in task_vec:
+        node = ci.get_defs().find_abs_node(task.get_abs_node_path()) 
+        assert node != None , "Expected to find task " + task.get_abs_node_path()  + ":\n"  + str(ci.get_defs()) 
+
+    ci.delete(paths)
+
+    ci.sync_local();
+    for task in task_vec:
+        node = ci.get_defs().find_abs_node(task.get_abs_node_path()) 
+        assert node == None , "Expected not to find task " + task.get_abs_node_path()  + " as it should have been deleted:\n" + str(ci.get_defs())   
+    
+
+def test_client_check_defstatus(ci):            
+    print "test_client_check_defstatus"
+    ci.delete_all()     
+    defs = create_defs("test_client_check_defstatus")  
+    
+    # stop defs form running when begin is called.
+    suite = defs.find_suite("test_client_check_defstatus")
+    suite.add_defstatus(DState.suspended)
+
+    t1 = "/test_client_check_defstatus/f1/t1"
+    t2 = "/test_client_check_defstatus/f1/t2"
+    task_t1 = defs.find_abs_node(t1)
+    task_t1.add_defstatus(DState.suspended)
+    
+    defs.generate_scripts();
+    
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+    
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+     
+    ci.sync_local() # get the changes, synced with local defs
+    #print ci.get_defs();
+    task_t1 = ci.get_defs().find_abs_node(t1)
+    task_t2 = ci.get_defs().find_abs_node(t2)
+    assert task_t1 != None,"Could not find t1"
+    assert task_t2 != None,"Could not find t2"
+  
+    assert task_t1.get_state() == State.queued, "Expected state queued but found " + str(task_t1.get_state())
+    assert task_t2.get_state() == State.queued, "Expected state queued " + str(task_t2.get_state())
+
+    assert task_t1.get_dstate() == DState.suspended, "Expected state suspended but found " + str(task_t1.get_state())
+    assert task_t2.get_dstate() == DState.queued, "Expected state queued but found " + str(task_t2.get_state())
+   
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_client_check_defstatus"
+    shutil.rmtree(dir_to_remove)      
+    
+def test_ECFLOW_189(ci):
+    # Bug, when a node is resumed it ignored holding dependencies higher up the tree.
+    # i.e Previously when we resumed a node, it ignored trigger/time/node state, dependencies higher up the tree
+    print "test_ECFLOW_189"
+    ci.delete_all()     
+    defs = create_defs("test_ECFLOW_189")  
+    defs.generate_scripts();
+    
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+    
+    ci.restart_server()
+    ci.load(defs)   
+    
+    ci.suspend("/test_ECFLOW_189")
+    ci.suspend("/test_ECFLOW_189/f1/t1")
+    ci.suspend("/test_ECFLOW_189/f1/t2")
+        
+    ci.begin_all_suites()
+    
+    ci.sync_local() # get the changes, synced with local defs
+    #print ci.get_defs();
+    task_t1 = ci.get_defs().find_abs_node("/test_ECFLOW_189/f1/t1")
+    task_t2 = ci.get_defs().find_abs_node("/test_ECFLOW_189/f1/t2")
+    assert task_t1 != None,"Could not find /test_ECFLOW_189/f1/t1"
+    assert task_t2 != None,"Could not find /test_ECFLOW_189/f1/t2"
+  
+    assert task_t1.get_state() == State.queued, "Expected state queued but found " + str(task_t1.get_state())
+    assert task_t2.get_state() == State.queued, "Expected state queued but found " + str(task_t2.get_state())
+    assert task_t1.get_dstate() == DState.suspended, "Expected state suspended but found " + str(task_t1.get_dstate())
+    assert task_t2.get_dstate() == DState.suspended, "Expected state suspended but found " + str(task_t2.get_dstate())
+
+    # ok now resume t1/t2, they should remain queued, since the Suite is still suspended
+    ci.resume("/test_ECFLOW_189/f1/t1")
+    ci.resume("/test_ECFLOW_189/f1/t2")
+     
+    time.sleep(3)
+    ci.sync_local() # get the changes, synced with local defs
+    #print ci.get_defs();
+    task_t1 = ci.get_defs().find_abs_node("/test_ECFLOW_189/f1/t1")
+    task_t2 = ci.get_defs().find_abs_node("/test_ECFLOW_189/f1/t2")
+    assert task_t1.get_state() == State.queued, "Expected state queued but found " + str(task_t1.get_state())
+    assert task_t2.get_state() == State.queued, "Expected state queued but found " + str(task_t2.get_state())
+    assert task_t1.get_dstate() == DState.queued, "Expected state queued but found " + str(task_t1.get_dstate())
+    assert task_t2.get_dstate() == DState.queued, "Expected state queued but found " + str(task_t2.get_dstate())
+
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_ECFLOW_189"
+    shutil.rmtree(dir_to_remove)      
+
+
+def test_ECFLOW_199(ci):
+    # Test ClientInvoker::changed_node_paths
+    print "test_ECFLOW_199"
+    ci.delete_all()     
+    defs = create_defs("test_ECFLOW_199")  
+    defs.generate_scripts();
+    
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation(job_ctrl)       
+    assert len(job_ctrl.get_error_msg()) == 0, job_ctrl.get_error_msg()
+    
+    ci.restart_server()
+    ci.load(defs)   
+    
+    ci.suspend("/test_ECFLOW_199")
+    ci.suspend("/test_ECFLOW_199/f1/t1")
+    ci.suspend("/test_ECFLOW_199/f1/t2")
+        
+    ci.begin_all_suites()
+    
+    ci.sync_local() # get the changes, synced with local defs
+    #print ci.get_defs();
+    assert len(list(ci.changed_node_paths)) == 0, "Expected first call to sync_local, to have no changed paths but found " + str(len(list(ci.changed_node_paths)))
+    
+    # ok now resume t1/t2, they should remain queued, since the Suite is still suspended
+    ci.resume("/test_ECFLOW_199/f1/t1")
+    ci.sync_local() 
+    for path in ci.changed_node_paths:
+        print "   changed node path " + path;
+    assert len(list(ci.changed_node_paths)) == 1, "Expected 1 changed path but found " + str(len(list(ci.changed_node_paths)))
+
+    ci.resume("/test_ECFLOW_199/f1/t2")
+    ci.sync_local() 
+    for path in ci.changed_node_paths:
+        print "   changed node path " + path;
+    assert len(list(ci.changed_node_paths)) == 1, "Expected 1 changed path but found " + str(len(list(ci.changed_node_paths)))
+
+    dir_to_remove = Test.ecf_home(the_port) + "/" + "test_ECFLOW_199"
+    shutil.rmtree(dir_to_remove)      
+
+
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+
+    # server independent tests
+    test_set_host_port();
+    
+    with Test.Server() as ci:
+        global the_port
+        the_port = ci.get_port();
+        test_version(ci)
+        PrintStyle.set_style( Style.STATE ) # show node state 
+        test_client_get_server_defs(ci)             
+        test_client_new_log(ci, the_port)             
+        test_client_clear_log(ci, the_port)             
+        test_client_log_msg(ci, the_port)             
+          
+        test_client_restart_server(ci)             
+        test_client_halt_server(ci)             
+        test_client_shutdown_server(ci)   
+      
+        test_client_load_in_memory_defs(ci)             
+        test_client_load_from_disk(ci)             
+        test_client_checkpt(ci, the_port)             
+        test_client_restore_from_checkpt(ci, the_port)             
+           
+        test_client_reload_wl_file(ci, the_port)             
+   
+        test_client_run(ci)  
+        test_client_run_with_multiple_paths(ci)     
+        test_client_requeue(ci)             
+        test_client_requeue_with_multiple_paths(ci)             
+        test_client_free_dep(ci)              
+  
+        test_client_suites(ci)
+        test_client_ch_suites(ci)  
+        test_client_ch_register(ci)             
+        test_client_ch_drop(ci)             
+        test_client_ch_drop_user(ci)             
+        test_client_ch_add(ci)             
+        test_client_ch_auto_add(ci)             
+        test_client_ch_remove(ci)             
+             
+        test_client_get_file(ci)             
+        #test_client_plug(ci)             
+        test_client_alter_add(ci) 
+        test_client_alter_delete(ci) 
+        test_client_alter_change(ci) 
+                  
+        test_client_force(ci)             
+        test_client_replace(ci,False)             
+        test_client_replace(ci,True)             
+  
+        #test_client_kill(ci)             
+        #test_client_status(ci)             
+        #test_client_order(ci)             
+        #test_client_group(ci)             
+        test_client_suspend(ci)             
+        test_client_suspend_multiple_paths(ci)             
+        test_client_resume(ci)             
+        test_client_resume_multiple_paths(ci)             
+        test_client_delete_node(ci)             
+        test_client_delete_node_multiple_paths(ci)             
+  
+        test_client_check(ci)  
+        test_client_check_defstatus(ci)  
+   
+        test_client_stats(ci)             
+        test_client_stats_reset(ci)             
+        test_client_debug_server_on_off(ci)    
+         
+        test_ECFLOW_189(ci)         
+        test_ECFLOW_199(ci)         
+
+        print "All Tests pass ======================================================================"    
diff --git a/ecflow_4_0_7/Pyext/test/py_s_TestPythonChildApi.py b/ecflow_4_0_7/Pyext/test/py_s_TestPythonChildApi.py
new file mode 100644
index 0000000..c01b0fb
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_s_TestPythonChildApi.py
@@ -0,0 +1,140 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#  code for testing client code in python
+import time
+import os
+import pwd
+from datetime import datetime
+import shutil   # used to remove directory tree
+
+from ecflow import Defs, Clock, DState,  Style, State, PrintStyle, File, Client, SState, debug_build
+import ecflow_test_util as Test
+
+
+def ecf_includes() : return Test.get_root_source_dir() + "/Pyext" + "/test/data/python_includes"
+
+def create_defs(name,the_port):
+    defs = Defs()
+    suite_name = name
+    if len(suite_name) == 0: suite_name = "s1"
+    suite = defs.add_suite(suite_name);
+    
+    ecfhome = Test.ecf_home(the_port);
+    suite.add_variable("ECF_HOME", ecfhome);
+    suite.add_variable("ECF_INCLUDE", ecf_includes());
+
+    family = suite.add_family("f1")
+    family.add_variable("ECF_JOB_CMD","python %ECF_JOB% 1> %ECF_JOBOUT% 2>&1")
+
+    task = family.add_task("t1")
+    task.add_event("event_fred")
+    task.add_meter("meter", 0, 100)
+    task.add_label("label_name", "value")
+
+    family.add_task("t2")  # test wait
+ 
+    return defs;
+    
+
+def test_client_run(ci):            
+    print "\ntest_client_run " + ci.get_host() + ":" + str(ci.get_port())
+    print " ECF_HOME(" + Test.ecf_home(ci.get_port()) + ")"
+    print " ECF_INCLUDES(" + ecf_includes() + ")"
+    ci.delete_all()     
+    defs = create_defs("test_client_run",ci.get_port())  
+    suite = defs.find_suite("test_client_run")
+    suite.add_defstatus(DState.suspended)
+
+    # create the ecf file /test_client_run/f1/t1
+    ecf_home = Test.ecf_home(ci.get_port())
+    dir = ecf_home + "/test_client_run/f1"
+    
+    # on cray creating recursive directories can fail, try again. yuk
+    try:
+        if not os.path.exists(dir): os.makedirs(dir)
+    except:
+        try:
+            if not os.path.exists(dir): os.makedirs(dir)
+        except:
+            # try breaking down
+            if not os.path.exists(ecf_home): os.makedirs(ecf_home)
+            new_dir = ecf_home + "/test_client_run"
+            if not os.path.exists(new_dir): os.makedirs(new_dir)
+            new_dir = ecf_home + "/test_client_run/f1"
+            if not os.path.exists(new_dir): os.makedirs(new_dir)
+    if not os.path.exists(dir): os.makedirs(dir)
+
+    file = dir + "/t1.ecf"
+    contents = "%include <head.py>\n\n"
+    contents += "print 'doing some work'\n"
+    contents += "try:\n"
+    contents += "    ci.child_event('event_fred')\n"
+    contents += "    ci.child_meter('meter',100)\n"
+    contents += "    ci.child_label('label_name','100')\n"
+    contents += "    print 'Finished event,meter and label child commands'\n"
+    contents += "except:\n"
+    contents += "    ci.child_abort()\n\n"
+    contents += "%include <tail.py>\n"
+    open(file,'w').write(contents)
+    print " Created file " + file
+      
+    # create the ecf file /test_client_run/f1/t2
+    file = dir + "/t2.ecf"
+    contents = "%include <head.py>\n\n"
+    contents += "print 'Waiting for /test_client_run/f1/t1 == complete'\n"
+    contents += "try:\n"
+    contents += "    ci.child_wait('/test_client_run/f1/t1 == complete')\n"
+    contents += "    print 'Finished waiting'\n"
+    contents += "except:\n"
+    contents += "    ci.child_abort()\n\n"
+    contents += "%include <tail.py>\n"
+    open(file,'w').write(contents)
+    print " Created file " + file
+      
+    ci.restart_server()
+    ci.load(defs)           
+    ci.begin_all_suites()
+    ci.run("/test_client_run", False)
+    print " Running the test, wait for suite to complete ..."  
+
+    count = 0
+    while 1:
+        count += 1
+        ci.sync_local() # get the changes, synced with local defs
+        suite = ci.get_defs().find_suite("test_client_run")
+        assert suite != None, " Expected to find suite test_client_run:\n" + str(ci.get_defs())
+        if suite.get_state() == State.complete:
+            break;
+        if suite.get_state() == State.aborted:
+            print defs;
+            assert False," Suite aborted \n"  
+        time.sleep(2)
+        if count > 20:
+            assert False, " test_client_run aborted after " + str(count) + " loops:\n" + str(ci.get_defs())
+        
+    ci.log_msg("Looped " + str(count) + " times")
+    
+    if not Test.debugging():
+        dir_to_remove = Test.ecf_home(ci.get_port()) + "/" + "test_client_run"
+        print " Test OK: removing directory " + dir_to_remove
+        shutil.rmtree(dir_to_remove)      
+        
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+
+    with Test.Server() as ci:
+        PrintStyle.set_style( Style.STATE ) # show node state 
+        test_client_run(ci)  
+        print "\nAll Tests pass ======================================================================"    
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestAddDelete.py b/ecflow_4_0_7/Pyext/test/py_u_TestAddDelete.py
new file mode 100644
index 0000000..f1d1a19
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestAddDelete.py
@@ -0,0 +1,484 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# code for testing addition and deletion 
+#
+import ecflow
+import sys
+import os
+ 
+if __name__ == "__main__":
+    
+    print "####################################################################"
+    print "Running ecflow version " + ecflow.Client().version()  + " debug build(" + str(ecflow.debug_build()) +")"
+    print "PYTHONPATH: " + str(os.environ['PYTHONPATH'].split(os.pathsep))
+    print "sys.path:   " + str(sys.path)
+    print "####################################################################"
+ 
+    #===========================================================================
+    # Defs: add and delete *USER* variables
+    #===========================================================================
+    defs = ecflow.Defs()
+    defs.add_variable("FRED", "/tmp/")
+    defs.add_variable("ECF_URL_CMD", "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'")
+    defs.add_variable("ECF_URL_BASE", "http://www.ecmwf.int")
+    defs.add_variable("ECF_URL", "publications/manuals/sms")
+    assert len(list(defs.user_variables)) == 4, "Expected *user* 4 variable"    
+    defs.delete_variable("FRED");     assert len(list(defs.user_variables)) == 3, "Expected 3 variables since we just delete FRED"
+    defs.delete_variable("");         assert len(list(defs.user_variables)) == 0, "Expected 0 variables since we should have deleted all"
+    
+    a_dict = { "name":"value", "name2":"value2", "name3":"value3", "name4":"value4" }
+    defs.add_variable(a_dict)
+    assert len(list(defs.user_variables)) == 4, "Expected 4 variable"    
+    defs.delete_variable("");         assert len(list(defs.user_variables)) == 0, "Expected 0 variable since we should have deleted all"
+
+    # add a empty dictionary
+    a_dict = {}
+    defs.add_variable(a_dict)
+    assert len(list(defs.user_variables)) == 0, "Expected zero variables"    
+    
+    #===========================================================================
+    # Suite: add and delete variables
+    #===========================================================================
+    suite = ecflow.Suite("s1")
+    suite.add_variable(ecflow.Variable("ECF_HOME", "/tmp/"))
+    suite.add_variable("ECF_URL_CMD", "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'")
+    suite.add_variable("ECF_URL_BASE", "http://www.ecmwf.int")
+    suite.add_variable("ECF_URL", "publications/manuals/sms")
+    assert len(list(suite.variables)) == 4, "Expected 4 variable"    
+    suite.delete_variable("ECF_HOME"); assert len(list(suite.variables)) == 3, "Expected 3 variable since we just delete ECF_HOME"
+    suite.delete_variable("");         assert len(list(suite.variables)) == 0, "Expected 0 variable since we should have deleted all"
+    
+    a_dict = { "name":"value", "name2":"value2", "name3":"value3", "name4":"value4" }
+    suite.add_variable(a_dict)
+    assert len(list(suite.variables)) == 4, "Expected 4 variable"    
+    suite.delete_variable("");         assert len(list(suite.variables)) == 0, "Expected 0 variable since we should have deleted all"
+
+    # add a empty dictionary
+    a_dict = { }
+    suite.add_variable(a_dict)
+    assert len(list(suite.variables)) == 0, "Expected zero variables"    
+
+    # adding dictionary items that are not strings should result in a type error
+    expected_type_error = False
+    try:
+        a_bad_dict = { "name":"fred", "name2":14, "name3":"12", "name4":12 }
+        suite.add_variable(a_bad_dict)
+    except TypeError:
+        expected_type_error = True
+        
+    assert expected_type_error, "Expected Type error"
+    assert len(list(suite.variables)) == 0, "Expected 0 variable since we should have deleted all"
+    
+    suite.add_variable("ECF_URL_CMD", "test duplicates") 
+    suite.add_variable("ECF_URL_CMD", "Expected warning")  # expect a warning message to standard out
+
+
+    #===========================================================================
+    # add and delete limits
+    #===========================================================================
+    suite.add_limit(ecflow.Limit("limitName1", 10))
+    suite.add_limit(ecflow.Limit("limitName2", 10))
+    suite.add_limit("limitName3", 10)
+    suite.add_limit("limitName4", 10)
+    assert len(list(suite.limits)) == 4, "Expected 4 Limits"
+    suite.delete_limit("limitName1"); assert len(list(suite.limits)) == 3, "Expected 3 limits since we just deleted one limitName1" 
+    suite.delete_limit("");           assert len(list(suite.limits)) == 0, "Expected 0 limits since we just deleted all of them"
+
+
+    #===========================================================================
+    # add and delete inlimits
+    #===========================================================================
+    suite.add_inlimit(ecflow.InLimit("limitName1", "/s1/f1", 2))
+    suite.add_inlimit(ecflow.InLimit("limitName2", "/s1/f1", 2))
+    suite.add_inlimit("limitName3", "/s1/f1", 2)
+    suite.add_inlimit("limitName4", "/s1/f1", 2)
+    assert len(list(suite.inlimits)) == 4, "Expected 4 inLimits"
+    suite.delete_inlimit("limitName1"); assert len(list(suite.inlimits)) == 3, "Expected 3 inlimits since we just deleted one limitName1" 
+    suite.delete_inlimit("");           assert len(list(suite.inlimits)) == 0, "Expected 0 inlimits since we just deleted all of them"
+
+    #===============================================================================
+    # add and delete triggers and complete
+    #===============================================================================
+    task = ecflow.Task("task")
+    task.add_trigger("t2 == active")
+    task.add_complete("t2 == complete")
+    assert task.get_complete(), "Expected complete"
+    assert task.get_trigger(), "Expected trigger"
+    task.delete_trigger();  assert not task.get_trigger(), "Expected no trigger"
+    task.delete_complete(); assert not task.get_complete(), "Expected no complete"
+    
+    task.add_part_trigger(ecflow.PartExpression("t1 == complete"))
+    task.add_part_trigger(ecflow.PartExpression("t2 == active", True))  #  for long and/or expressions, subsequent expr must be and/or
+    task.add_part_complete(ecflow.PartExpression("t3 == complete"))
+    task.add_part_complete(ecflow.PartExpression("t4 == active", False))  #  for long and/or expressions, subsequent expr must be and/or
+    task.delete_trigger();  assert not task.get_trigger(), "Expected no trigger"
+    task.delete_complete(); assert not task.get_complete(), "Expected no complete"
+
+    task.add_part_trigger("t1 == complete")
+    task.add_part_trigger("t2 == active", True)  #  for long and/or expressions, subsequent expr must be and/or
+    task.add_part_complete("t3 == complete")
+    task.add_part_complete("t4 == active", False)  #  for long and/or expressions, subsequent expr must be and/or
+    task.delete_trigger();  assert not task.get_trigger(), "Expected no trigger"
+    task.delete_complete(); assert not task.get_complete(), "Expected no complete"
+   
+    #===========================================================================
+    # Add triggers using expressions
+    #===========================================================================
+    expr = ecflow.Expression("t1 == complete")
+    task = ecflow.Task("task")
+    task.add_trigger(expr)
+
+    expr = ecflow.Expression("t1 == complete")
+    expr.add(ecflow.PartExpression("t1 == complete", True))
+    expr.add(ecflow.PartExpression("t2 == complete", True))
+    task = ecflow.Task("task")
+    task.add_trigger(expr)
+
+     
+    #===========================================================================
+    # add,delete,find events
+    #===========================================================================
+    task.add_event(ecflow.Event(1)); 
+    task.add_event(2)                              
+    task.add_event(ecflow.Event(10, "Eventname"))  
+    task.add_event(10, "Eventname2")               
+    task.add_event("fred")                         
+    
+    # test find
+    event = task.find_event("EVENT")
+    assert(event.empty()),"Expected to not to find event"
+    assert(event.name() == ""),"Expected to not to find event, number is maximum int"
+    assert(event.value() == 0),"Expected to not to find event"
+
+    event = task.find_event("1"); 
+    assert(not event.empty()),"Expected to find event"
+    assert(event.number() == 1), "Expected to find event 1"
+    assert(event.name() == ""), "Expected name to be empty"
+    assert(event.value() == 0),"Expected to not to find event"
+
+    event = task.find_event("2"); 
+    assert(not event.empty()),"Expected to find event"
+    assert(event.number() == 2), "Expected to find event 1"
+    assert(event.name() == ""), "Expected name to be empty"
+    assert(event.value() == 0),"Expected to not to find event"
+
+    event = task.find_event("10"); 
+    assert(not event.empty()),"Expected to find event"
+    assert(event.number() == 10), "Expected to find event 10"
+    assert(event.name() == "Eventname"), "Expected name to be empty"
+    assert(event.value() == 0),"Expected to not to find event"
+
+    event = task.find_event("fred"); 
+    assert(not event.empty()),"Expected to find event"
+    assert(event.name() == "fred"), "Expected name to be empty, when name defind an not number, number is max_int"
+    assert(event.value() == 0),"Expected to not to find event"
+
+    for e in task.events:     print str(e)," # value: ",str(e.value())
+    a_dict = {}
+    for e in task.events:
+        if e.name() != "": a_dict[e.name()] = e.value()
+        else:              a_dict[e.number()] = e.value()
+    print a_dict
+
+    assert len(list(task.events)) == 5, "Expected 5 Events"
+    task.delete_event("1");         assert len(list(task.events)) == 4, "Expected 4 Events"
+    task.delete_event("Eventname"); assert len(list(task.events)) == 3, "Expected 3 Events"
+    task.delete_event("");          assert len(list(task.events)) == 0, "Expected 0 Events"
+
+
+    #===========================================================================
+    # add and delete meter
+    #===========================================================================
+    task.add_meter(ecflow.Meter("metername1", 0, 100, 50))
+    task.add_meter(ecflow.Meter("metername2", 0, 100))
+    task.add_meter("metername3", 0, 100, 50)
+    task.add_meter("metername4", 0, 100)
+    assert len(list(task.meters)) == 4, "Expected 4 Meters"
+    task.delete_meter("metername1"); assert len(list(task.meters)) == 3, "Expected 3 Meters"
+    task.delete_meter("metername4"); assert len(list(task.meters)) == 2, "Expected 2 Meters"
+    task.delete_meter("");           assert len(list(task.meters)) == 0, "Expected 0 Meters"
+
+
+    #===========================================================================
+    # add and delete label
+    #===========================================================================
+    task.add_label(ecflow.Label("label_name1", "value"))
+    task.add_label(ecflow.Label("label_name2", "value"))
+    task.add_label("label_name3", "value")
+    task.add_label("label_name4", "value")
+    assert len(list(task.labels)) == 4, "Expected 4 labels"
+    task.delete_label("label_name1"); assert len(list(task.labels)) == 3, "Expected 3 Labels"
+    task.delete_label("label_name4"); assert len(list(task.labels)) == 2, "Expected 2 Labels"
+    task.delete_label("");            assert len(list(task.labels)) == 0, "Expected 0 Labels"
+
+
+    #===========================================================================
+    # add delete Repeat
+    #===========================================================================
+    task.add_repeat(ecflow.RepeatInteger("integer", 0, 100, 2))
+    repeat = task.get_repeat(); assert not repeat.empty(), "Expected repeat"
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+    
+    task.add_repeat(ecflow.RepeatEnumerated("enum", ["red", "green", "blue" ]))
+    print task
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+
+    task.add_repeat(ecflow.RepeatDate("date", 20100111, 20100115, 2))
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+    
+    task.add_repeat(ecflow.RepeatString("string", ["a", "b", "c" ]))
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+    
+    
+    #===========================================================================
+    # create a time series, used for adding time and today
+    #===========================================================================
+    start = ecflow.TimeSlot(0, 0)
+    finish = ecflow.TimeSlot(23, 0)
+    incr = ecflow.TimeSlot(0, 30)
+    time_series = ecflow.TimeSeries(start, finish, incr, True)
+
+    # Add and delete today
+    # NOTE: **********************************************************************
+    # Do *NOT* delete attributes using iterator traversal
+    # The iterators *are* bound to the c++ iterators hence if we delete
+    # over the traversal, we can corrupt the vector, leading to undefined behavour.  
+    # Hence we **can not** delete more than once over a traversal
+    # Soln 1: take a copy
+    # *****************************************************************************
+    # task.add_today( Today( 0,10 ))
+    # task.add_today( Today( 0,59, True ))
+    # task.add_today( Today(TimeSlot(20,10)) )
+    # task.add_today( Today(TimeSlot(20,20),False)) 
+    # for today in task.todays: 
+    #    task.delete_today(today) # will corrupt C++ vector
+  
+    task.add_today("00:30")
+    task.add_today("+00:30")
+    task.add_today("+00:30 20:00 01:00")
+    task.add_today(ecflow.Today(time_series))
+    task.add_today(ecflow.Today(0, 10))
+    task.add_today(0, 59, True)
+    task.add_today(ecflow.Today(ecflow.TimeSlot(20, 10)))
+    task.add_today(ecflow.Today(ecflow.TimeSlot(20, 20), False)) 
+    assert len(list(task.todays)) == 8, "Expected 8 todays"
+    vec_copy = []
+    for today in task.todays: vec_copy.append(today)
+    for today in vec_copy: task.delete_today(today)
+    assert len(list(task.todays)) == 0, "Expected 0 todays"
+        
+    #===========================================================================
+    # add and delete time
+    #===========================================================================
+    task.add_time("00:30")
+    task.add_time("+00:30")
+    task.add_time("+00:30 20:00 01:00")
+    task.add_time(ecflow.Time(time_series))
+    task.add_time(ecflow.Time(0, 10))
+    task.add_time(0, 59, True)
+    task.add_time(ecflow.Time(ecflow.TimeSlot(20, 10)))
+    task.add_time(ecflow.Time(ecflow.TimeSlot(20, 20), False)) 
+    assert len(list(task.times)) == 8, "Expected 8 times"
+    vec_copy = []
+    for time in task.times: vec_copy.append(time)
+    for time in vec_copy: task.delete_time(time)
+    assert len(list(task.todays)) == 0, "Expected 0 todays"
+
+    #===========================================================================
+    # add and delete date
+    #===========================================================================
+    for i in [ 1, 2, 4, 8, 16 ] :
+        task.add_date(i, 0, 0)
+    task.add_date(ecflow.Date(1, 1, 2010))
+    task.add_date(1, 1, 2010)       # duplicate
+    task.add_date(ecflow.Date(2, 1, 2010))
+    task.add_date(ecflow.Date(3, 1, 2010))
+    task.add_date(ecflow.Date(4, 1, 2010)) 
+    assert len(list(task.dates)) == 10, "Expected 10 dates but found " + str(len(list(task.dates)))
+    vec_copy = []
+    for attr in task.dates: vec_copy.append(attr)
+    for attr in vec_copy: task.delete_date(attr)
+    assert len(list(task.dates)) == 0, "Expected 0 dates"
+
+    #===========================================================================
+    # add and delete day
+    #===========================================================================
+    task.add_day(ecflow.Day(ecflow.Days.sunday))
+    task.add_day(ecflow.Days.monday)
+    task.add_day(ecflow.Days.tuesday)  # duplicate ?
+    task.add_day("sunday")     
+    assert len(list(task.days)) == 4, "Expected 4 days"
+    vec_copy = []
+    for attr in task.days: vec_copy.append(attr)
+    for attr in vec_copy: task.delete_day(attr)
+    assert len(list(task.days)) == 0, "Expected 0 days"
+    
+    #===========================================================================
+    # add and delete crons
+    #===========================================================================
+    cron = ecflow.Cron()
+    start = ecflow.TimeSlot(23 , 0)
+    ts = ecflow.TimeSeries(start,True)  # True means relative to suite start
+    cron.set_time_series(ts)
+    
+    cron = ecflow.Cron()
+    cron.set_week_days([0, 1, 2, 3, 4, 5, 6])
+    cron.set_days_of_month([1, 2, 3, 4, 5, 6 ])
+    cron.set_months([1, 2, 3, 4, 5, 6])
+    start = ecflow.TimeSlot(0 , 0)
+    finish = ecflow.TimeSlot(23, 0)
+    incr = ecflow.TimeSlot(0, 30)
+    ts = ecflow.TimeSeries(start, finish, incr, True)  # True means relative to suite start
+    cron.set_time_series(ts)
+
+    cron0 = ecflow.Cron()
+    cron0.set_week_days([0, 1, 2, 3, 4, 5 ])
+    cron0.set_time_series(1, 30) # default relative = false, added in release 4.0.7
+
+    cron1 = ecflow.Cron()
+    cron1.set_week_days([0, 1, 2, 3, 4, 5, 6 ])
+    cron1.set_time_series(1, 30, True)
+    
+    cron2 = ecflow.Cron()
+    cron2.set_week_days([0, 1, 2, 3, 4, 5, 6])
+    cron2.set_time_series("00:30 01:30 00:01")
+    
+    cron3 = ecflow.Cron()
+    cron3.set_week_days([0, 1, 2, 3, 4, 5, 6])
+    cron3.set_time_series("+00:30")
+
+    task.add_cron(cron)
+    task.add_cron(cron1)
+    task.add_cron(cron2)
+    task.add_cron(cron3)
+    assert len(list(task.crons)) == 4, "Expected 4 crons"
+    vec_copy = []
+    for attr in task.crons: vec_copy.append(attr)
+    for attr in vec_copy: task.delete_cron(attr)
+    assert len(list(task.crons)) == 0, "Expected 0 crons"  
+    
+    #===========================================================================
+    # add autocancel
+    #===========================================================================
+    print "test add autoCancel"
+    t1 = ecflow.Task("t1")
+    assert t1.get_autocancel() == None, " Expected no autocancel"
+    t1.add_autocancel(3)                       # 3 days
+    assert t1.get_autocancel() != None, " Expected autocancel"
+    print str(t1.get_autocancel())
+
+    t3 = ecflow.Task("t3")
+    t3.add_autocancel(20, 10, True)              # hour,minutes,relative
+    print str(t3.get_autocancel())
+    
+    t4 = ecflow.Task("t4")
+    t4.add_autocancel(ecflow.TimeSlot(10, 10), True)    # hour,minutes,relative
+    print str(t4.get_autocancel())
+
+    t5 = ecflow.Task("t5")
+    t5.add_autocancel(ecflow.Autocancel(1, 10, True))   # hour,minutes,relative
+    print str(t5.get_autocancel())
+    
+    #===========================================================================
+    # add late
+    #===========================================================================
+    late = ecflow.Late()
+    late.submitted(ecflow.TimeSlot(20, 10))
+    late.active(ecflow.TimeSlot(20, 10))
+    late.complete(ecflow.TimeSlot(20, 10), True)
+    task.add_late(late)
+    
+    late = ecflow.Late()
+    late.submitted(20, 10)
+    late.active(20, 10)
+    late.complete(20, 10, True)
+    t1.add_late(late)
+    
+    
+    #===========================================================================
+    # add defstatus, last one set takes effect
+    #===========================================================================
+    task.add_defstatus(ecflow.DState.complete)
+    assert task.get_defstatus() == ecflow.DState.complete
+    task.add_defstatus(ecflow.DState.queued)
+    assert task.get_defstatus() == ecflow.DState.queued
+    task.add_defstatus(ecflow.DState.aborted)
+    assert task.get_defstatus() == ecflow.DState.aborted
+    task.add_defstatus(ecflow.DState.submitted)
+    assert task.get_defstatus() == ecflow.DState.submitted
+    task.add_defstatus(ecflow.DState.suspended)
+    assert task.get_defstatus() == ecflow.DState.suspended
+    task.add_defstatus(ecflow.DState.active)
+    assert task.get_defstatus() == ecflow.DState.active
+
+    # the state should be unknown until the suite is begun
+    assert task.get_state() == ecflow.State.unknown
+    assert task.get_dstate() == ecflow.DState.unknown
+ 
+    #===========================================================================
+    # add clock
+    #===========================================================================
+    clock = ecflow.Clock(1, 1, 2010, False)     # day,month, year, hybrid
+    clock.set_gain(1, 10, True)                 # True means positive gain
+    suite = ecflow.Suite("suite")
+    suite.add_clock(clock)
+    
+    clock = ecflow.Clock(1, 1, 2011, True)       # day,month, year, hybrid
+    clock.set_gain_in_seconds(12, True)
+    s1 = ecflow.Suite("s1")
+    s1.add_clock(clock)
+    
+    print "#==========================================================================="
+    print "# get clock"
+    print "#==========================================================================="
+    s0 = ecflow.Suite("s0")
+    assert s0.get_clock() == None, "Expected no clock"
+    
+    s0.add_clock(ecflow.Clock(1, 1, 2010, False))
+    assert s0.get_clock() != None, "Expected clock"
+
+    #===========================================================================
+    # Add zombie. Note we can *NOT* add two zombie attributes of the same ZombieType
+    #===========================================================================
+    zombie_life_time_in_server = 800
+    child_list = [ ecflow.ChildCmdType.init, ecflow.ChildCmdType.event, ecflow.ChildCmdType.meter, ecflow.ChildCmdType.label, ecflow.ChildCmdType.wait, ecflow.ChildCmdType.abort, ecflow.ChildCmdType.complete ]
+    zombie_type_list = [ ecflow.ZombieType.ecf, ecflow.ZombieType.user, ecflow.ZombieType.path ]
+    for zombie_type in zombie_type_list:
+        zombie_attr = ecflow.ZombieAttr(zombie_type, child_list, ecflow.ZombieUserActionType.block, zombie_life_time_in_server)
+        s1.add_zombie(zombie_attr)
+        
+    assert len(list(s1.zombies)) == 3, "Expected 3 zombie attributes but found " + str(len(list(s1.zombies)))
+    
+    # delete all the zombies
+    s1.delete_zombie("")
+    assert len(list(s1.zombies)) == 0, "Expected zero zombie attributes but found " + str(len(list(s1.zombies)))
+
+    # repeat the the test with empty child list. Empty child list means apply to all child commands
+    child_list = [ ]
+    zombie_type_list = [ ecflow.ZombieType.ecf, ecflow.ZombieType.user, ecflow.ZombieType.path ]
+    for zombie_type in zombie_type_list:
+        zombie_attr = ecflow.ZombieAttr(zombie_type, child_list, ecflow.ZombieUserActionType.block, zombie_life_time_in_server)
+        s1.add_zombie(zombie_attr)
+        
+        # test delete of specific zombie attribute
+        assert len(list(s1.zombies)) == 1, "Expected 1 zombie attributes but found " + str(len(list(s1.zombies)))
+        s1.delete_zombie(zombie_type)
+        assert len(list(s1.zombies)) == 0, "Expected 0 zombie attributes but found " + str(len(list(s1.zombies)))
+
+    print "All Tests pass"
+    
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteError.py b/ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteError.py
new file mode 100644
index 0000000..c6920fd
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteError.py
@@ -0,0 +1,86 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#
+from ecflow import Defs, Suite, Variable, Limit, InLimit, Task, PartExpression, \
+                   Event, Meter, Label, RepeatInteger, RepeatEnumerated, RepeatDate, RepeatString, \
+                   TimeSlot, TimeSeries, Today, Time, Date, Day, Days, Cron, Autocancel, Late, \
+                   DState, Clock, ChildCmdType, ZombieType, ZombieAttr, ZombieUserActionType, Client, debug_build
+        
+    
+if __name__ == "__main__":
+
+    print "######################################################################################"
+    print "Running ecflow version " + Client().version()  + " debug build(" + str(debug_build()) +")"
+    print "######################################################################################"
+    
+    #
+    # Test for: See  ECFLOW-106 Times/Dates attributes attached to suite node
+    #
+    defs = Defs()
+    suite = defs.add_suite("s1") 
+    
+    #
+    # Suite should not be allowed time based dependencies
+    # Check Today
+    expected_error = False
+    try:
+        suite.add_today("00:30")
+    except RuntimeError: 
+        expected_error = True
+    assert expected_error, "Suite should not allow any time based dependencies"
+
+    expected_error = False
+    try:
+        suite.add_today(0,30)
+    except RuntimeError: 
+        expected_error = True
+    assert expected_error, "Suite should not allow any time based dependencies"
+    
+    #
+    # Check Time
+    expected_error = False
+    try:
+        suite.add_time("+00:30")
+    except RuntimeError: 
+        expected_error = True
+    assert expected_error, "Suite should not allow any time based dependencies"
+
+    expected_error = False
+    try:
+        suite.add_time(0,30)
+    except RuntimeError: 
+        expected_error = True
+    assert expected_error, "Suite should not allow any time based dependencies"
+
+    # 
+    # Check Date::See  ECFLOW-106 Times/Dates attributes attached to suite node
+    expected_error = False
+    try:
+        suite.add_date( 1,1,2010)
+    except RuntimeError: 
+        expected_error = True
+    assert expected_error, "Suite should not allow any time based dependencies"
+ 
+    # 
+    # Check Day:: See  ECFLOW-106 Times/Dates attributes attached to suite node
+    expected_error = False
+    try:
+        suite.add_day("sunday")
+    except RuntimeError: 
+        expected_error = True
+    assert expected_error, "Suite should not allow any time based dependencies"
+     
+
+    print "All Tests pass"
+    
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteFunc.py b/ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteFunc.py
new file mode 100644
index 0000000..4c69289
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestAddDeleteFunc.py
@@ -0,0 +1,311 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#
+from ecflow import Defs, Suite, Variable, Limit, InLimit, Task, PartExpression, \
+                   Event, Meter, Label, RepeatInteger, RepeatEnumerated, RepeatDate, RepeatString, \
+                   TimeSlot, TimeSeries, Today, Time, Date, Day, Days, Cron, Autocancel, Late, \
+                   DState, Clock, ChildCmdType, ZombieType, ZombieAttr, ZombieUserActionType, Client, debug_build
+        
+    
+if __name__ == "__main__":
+
+    print "####################################################################"
+    print "Running ecflow version " + Client().version()  + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+    
+    #
+    # Add Nodes functional way
+    #
+    defs = Defs()
+    defs.add_suite("s1").add_task("t1").add_variable("var","v")
+    defs.add_suite("s2").add_family("f1").add_task("t1").add_variable("var","v")
+    defs.add_suite("s3").add_family("f1").add_family("f2").add_task("t1").add_variable("var","v")
+    assert len(list(defs.suites)) == 3,"Expected 3 suites"    
+
+
+    # add and delete variables
+    a_dict = { "name":"value", "name2":"value2", "name3":"value3", "name4":"value4" }
+    suite = Suite("s1")
+    suite.add_variable(Variable("ECF_HOME","'/tmp/'")) \
+         .add_variable("Fred", 1)\
+         .add_variable("ECF_URL_BASE",'http://www.ecmwf.int')\
+         .add_variable("ECF_URL",'"publications/manuals/sms"')\
+         .add_variable(a_dict)
+    print suite
+    assert len(list(suite.variables)) == 8,"Expected 8 variable"    
+    suite.delete_variable("");         assert len(list(suite.variables)) == 0,"Expected 0 variable since we should have deleted all"
+    
+    
+    # add and delete limits
+    the_limit = Limit("limitName1", 10)
+    assert len(list(the_limit.node_paths)) == 0 ,"Expected nodes which have consumed a limit to be empty"
+    suite.add_limit(  Limit("limitName1", 10) )\
+        .add_limit(  Limit("limitName2", 10) )\
+        .add_limit(  "limitName3", 10 )\
+        .add_limit(  "limitName4", 10 )
+    assert len(list(suite.limits)) == 4,"Expected 4 Limits"
+    suite.delete_limit("");           assert len(list(suite.limits)) == 0,"Expected 0 limits since we just deleted all of them"
+
+
+    # add and delete inlimits
+    suite.add_inlimit( InLimit("limitName1","/s1/f1",2) )\
+        .add_inlimit( InLimit("limitName2","/s1/f1",2))\
+        .add_inlimit( "limitName3","/s1/f1",2)\
+        .add_inlimit( "limitName4","/s1/f1",2)
+    assert len(list(suite.inlimits)) == 4,"Expected 4 inLimits"
+    suite.delete_inlimit("limitName1"); assert len(list(suite.inlimits)) == 3,"Expected 3 inlimits since we just deleted one limitName1" 
+    suite.delete_inlimit("");           assert len(list(suite.inlimits)) == 0,"Expected 0 inlimits since we just deleted all of them"
+
+
+    # add and delete triggers and complete
+    task = Task("task")
+    task.add_trigger( "t2 == active" ).add_complete( "t2 == complete" )
+    assert task.get_complete(), "Expected complete"
+    assert task.get_trigger(),  "Expected trigger"
+    task.delete_trigger();  assert not task.get_trigger(),  "Expected no trigger"
+    task.delete_complete(); assert not task.get_complete(), "Expected no complete"
+    
+    task.add_part_trigger(  PartExpression("t1 == complete") )\
+        .add_part_complete( PartExpression("t3 == complete") ) \
+        .add_part_complete( PartExpression("t4 == active",False) )   
+    task.delete_trigger();  assert not task.get_trigger(),  "Expected no trigger"
+    task.delete_complete(); assert not task.get_complete(), "Expected no complete"
+
+    task.add_part_trigger(  "t1 == complete" ) \
+        .add_part_complete( "t3 == complete" ) \
+        .add_part_complete( "t4 == active",False)  #  for long and/or expressions, subsequent expr must be and/or
+    task.delete_trigger();  assert not task.get_trigger(),  "Expected no trigger"
+    task.delete_complete(); assert not task.get_complete(), "Expected no complete"
+    
+    
+    # add and delete events
+    task.add_event( Event(1) ).add_event( 2 ).add_event( Event(10, "Eventname") ).add_event( 10, "Eventname2" ).add_event( "fred" )
+    assert len(list(task.events)) == 5,"Expected 5 Events"
+    task.delete_event("");          assert len(list(task.events)) == 0,"Expected 0 Events"
+
+
+    # add and delete meter
+    task.add_meter( Meter("metername1", 0, 100, 50) )\
+        .add_meter( Meter("metername2", 0, 100) )\
+        .add_meter( "metername3", 0, 100, 50 )\
+        .add_meter( "metername4", 0, 100 )
+    assert len(list(task.meters)) == 4,"Expected 4 Meters"
+    task.delete_meter("");           assert len(list(task.meters)) == 0,"Expected 0 Meters"
+
+
+    # add and delete label
+    task.add_label( Label("label_name1", "value") )\
+        .add_label( Label("label_name2", "value") )\
+        .add_label( "label_name3", "value" )\
+        .add_label( "label_name4", "value" )
+    assert len(list(task.labels)) == 4,"Expected 4 labels"
+    task.delete_label("");            assert len(list(task.labels)) == 0,"Expected 0 Labels"
+
+
+    # add delete Repeat
+    task.add_repeat( RepeatInteger("integer", 0, 100, 2) ).add_variable("fred","j")
+    repeat = task.get_repeat(); assert not repeat.empty(), "Expected repeat"
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+    
+    task.add_repeat( RepeatEnumerated("enum", ["red", "green", "blue" ]) ).add_variable("Q","j")
+    print task
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+
+    task.add_repeat( RepeatDate("date", 20100111, 20100115,2) ).add_variable("W","j")
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+    
+    task.add_repeat( RepeatString("string", ["a", "b", "c" ] ) ).add_variable("E","j")
+    task.delete_repeat()      
+    repeat = task.get_repeat(); assert repeat.empty(), "Expected no repeat"
+    
+    
+    # create a time series, used for adding time and today
+    start = TimeSlot(0, 0)
+    finish = TimeSlot(23, 0)
+    incr = TimeSlot(0, 30)
+    time_series = TimeSeries( start, finish, incr, True)
+
+    # Add and delete today
+    # NOTE: **********************************************************************
+    # Do *NOT* delete attributes using iterator traversal
+    # The iterators *are* bound to the c++ iterators hence if we delete
+    # over the traversal, we can corrupt the vector, leading to undefined behaviour.  
+    # Hence we **can not** delete more than once over a traversal
+    # Soln 1: take a copy
+    # *****************************************************************************
+    # task.add_today( Today( 0,10 ))
+    # task.add_today( Today( 0,59, True ))
+    # task.add_today( Today(TimeSlot(20,10)) )
+    # task.add_today( Today(TimeSlot(20,20),False)) 
+    # for today in task.todays: 
+    #    task.delete_today(today) # will corrupt C++ vector
+  
+    task.add_today( "00:30" ).add_today( "+00:30" ).add_today( "+00:30 20:00 01:00" )\
+        .add_today( Today( time_series) )\
+        .add_today( Today( 0,10 )).add_today( 0, 59, True )\
+        .add_today( Today(TimeSlot(20,10)) )\
+        .add_today( Today(TimeSlot(20,20),False)) 
+    assert len(list(task.todays)) == 8,"Expected 8 todays"
+    vec_copy = []
+    for today in task.todays: vec_copy.append(today)
+    for today in vec_copy: task.delete_today(today)
+    assert len(list(task.todays)) == 0,"Expected 0 todays"
+        
+             
+    # add and delete time
+    task.add_time( "00:30" ).add_time( "+00:30" ).add_time( "+00:30 20:00 01:00" )\
+        .add_time( Time(time_series ))\
+        .add_time( Time( 0,10 ))\
+        .add_time( 0, 59, True)\
+        .add_time( Time(TimeSlot(20,10)) )\
+        .add_time( Time(TimeSlot(20,20),False)) 
+    assert len(list(task.times)) == 8,"Expected 8 times"
+    vec_copy = []
+    for time in task.times: vec_copy.append(time)
+    for time in vec_copy: task.delete_time(time)
+    assert len(list(task.todays)) == 0,"Expected 0 todays"
+
+
+    # add and delete date
+    for i in [ 1, 2, 4, 8, 16 ] :
+        task.add_date( i, 0, 0)
+    task.add_date( Date(1, 1, 2010))\
+        .add_date( Date(2, 1, 2010))\
+        .add_date( Date(3, 1, 2010))\
+        .add_date( Date(4, 1, 2010))\
+        .add_date( 1, 1, 2010)
+    assert len(list(task.dates)) == 10,"Expected 10 dates but found " + str(len(list(task.dates)))
+    vec_copy = []
+    for attr in task.dates: vec_copy.append(attr)
+    for attr in vec_copy: task.delete_date(attr)
+    assert len(list(task.dates)) == 0,"Expected 0 dates"
+
+    # add and delete day
+    task.add_day( Day(Days.sunday))\
+        .add_day( Days.monday)\
+        .add_day( Days.tuesday)\
+        .add_day( "sunday")     
+    assert len(list(task.days)) == 4,"Expected 4 days"
+    vec_copy = []
+    for attr in task.days: vec_copy.append(attr)
+    for attr in vec_copy: task.delete_day(attr)
+    assert len(list(task.days)) == 0,"Expected 0 days"
+    
+    # add and delete crons
+    cron = Cron()
+    cron.set_week_days( [0, 1, 2, 3, 4, 5, 6]  )
+    cron.set_days_of_month( [1, 2, 3, 4, 5, 6 ] )
+    cron.set_months(  [1, 2, 3, 4, 5, 6]  )
+    start = TimeSlot(0 ,0)
+    finish = TimeSlot(23, 0)
+    incr = TimeSlot(0, 30)
+    ts = TimeSeries( start, finish, incr, True)  # True means relative to suite start
+    cron.set_time_series( ts )
+
+    cron1 = Cron()
+    cron1.set_week_days( [0, 1, 2, 3, 4, 5, 6 ] )
+    cron1.set_time_series( 1, 30,  True )
+    
+    cron2 = Cron()
+    cron2.set_week_days( [0, 1, 2, 3, 4, 5, 6] )
+    cron2.set_time_series( "00:30 01:30 00:01" )
+    
+    cron3 = Cron()
+    cron3.set_week_days( [0, 1, 2, 3, 4, 5, 6] )
+    cron3.set_time_series( "+00:30" )
+
+    task.add_cron( cron ) \
+        .add_cron( cron1 ) \
+        .add_cron( cron2 ) \
+        .add_cron( cron3 )
+    assert len(list(task.crons)) == 4,"Expected 4 crons"
+    vec_copy = []
+    for attr in task.crons: vec_copy.append(attr)
+    for attr in vec_copy: task.delete_cron(attr)
+    assert len(list(task.crons)) == 0,"Expected 0 crons"  
+    
+    
+    # add autocancel
+    t1 = Task("t1")
+    t1.add_autocancel( 3 ).add_variable("A","j")                       
+    t3 = Task("t3")
+    t3.add_autocancel( 20, 10, True ).add_variable("B","j") 
+    t4 = Task("t4")
+    t4.add_autocancel( TimeSlot(10, 10), True ).add_variable("C","j") 
+    t5 = Task("t5")
+    t5.add_autocancel( Autocancel(1, 10, True) ).add_variable("D","j") 
+    
+    
+    # add late
+    late = Late()
+    late.submitted( TimeSlot(20, 10) )
+    late.active(    TimeSlot(20, 10))
+    late.complete(  TimeSlot(20, 10), True)
+    task.add_late(late ).add_variable("FRED33","j") 
+        
+    
+    # add defstatus, last one set takes effect
+    task.add_defstatus( DState.complete )\
+        .add_defstatus( DState.queued )\
+        .add_defstatus( DState.aborted )\
+        .add_defstatus( DState.submitted )\
+        .add_defstatus( DState.suspended )\
+        .add_defstatus( DState.active )
+    
+    #
+    # add clock
+    #
+    clock = Clock(1, 1, 2010, False)     # day,month, year, hybrid
+    clock.set_gain(1, 10, True)         # True means positive gain
+    suite =  Suite("suite")
+    suite.add_clock(clock).add_variable("fred1","j") 
+    
+    clock = Clock(1, 1, 2011, True)       # day,month, year, hybrid
+    clock.set_gain_in_seconds(12, True)
+    s1 =  Suite("s1")
+    s1.add_clock(clock).add_variable("fred2","j") 
+    
+    #
+    # Add zombie. Note we can *NOT* add two zombie attributes of the same ZombieType
+    #
+    zombie_life_time_in_server = 800
+    child_list = [ ChildCmdType.init, ChildCmdType.event, ChildCmdType.meter, ChildCmdType.label, ChildCmdType.wait, ChildCmdType.abort, ChildCmdType.complete ]
+    zombie_type_list = [ ZombieType.ecf, ZombieType.user, ZombieType.path ]
+    for zombie_type in zombie_type_list:
+        zombie_attr = ZombieAttr(zombie_type, child_list, ZombieUserActionType.block, zombie_life_time_in_server)
+        s1.add_zombie(zombie_attr).add_variable("fred","j") 
+        
+    assert len(list(s1.zombies)) == 3,"Expected 3 zombie attributes but found " + str(len(list(s1.zombies)))
+    
+    # delete all the zombies
+    s1.delete_zombie("")
+    assert len(list(s1.zombies)) == 0,"Expected zero zombie attributes but found " + str(len(list(s1.zombies)))
+
+    # repeat the the test with empty child list. Empty child list means apply to all child commands
+    child_list = [ ]
+    zombie_type_list = [ ZombieType.ecf, ZombieType.user, ZombieType.path ]
+    for zombie_type in zombie_type_list:
+        zombie_attr = ZombieAttr(zombie_type, child_list, ZombieUserActionType.block, zombie_life_time_in_server)
+        s1.add_zombie(zombie_attr).add_variable("fred","j") 
+        
+        # test delete of specific zombie attribute
+        assert len(list(s1.zombies)) == 1,"Expected 1 zombie attributes but found " + str(len(list(s1.zombies)))
+        s1.delete_zombie(zombie_type)
+        assert len(list(s1.zombies)) == 0,"Expected 0 zombie attributes but found " + str(len(list(s1.zombies)))
+
+    print "All Tests pass"
+    
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestAddNodeFunc.py b/ecflow_4_0_7/Pyext/test/py_u_TestAddNodeFunc.py
new file mode 100644
index 0000000..3a8a68b
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestAddNodeFunc.py
@@ -0,0 +1,69 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+from ecflow import Defs, Client, debug_build
+     
+def create_defs_sequentially():
+    local_defs = Defs()
+    suite = local_defs.add_suite("s1")
+    suite.add_variable("Var","value")
+    suite.add_trigger("t1 == complete")
+    suite.add_meter( "metername3", 0, 100, 50 )
+    suite.add_event( 2 )
+    suite.add_event( 3 )
+    f1 = suite.add_family("f1")
+    f1 = f1.add_family("f1")
+    t1 = f1.add_task("t1")
+    t1.add_variable("fred","jones")
+    
+    f2 = suite.add_family("f2")
+    f1 = f2.add_family("f1")
+    t1 = f1.add_task("t1")
+    t1.add_variable("fred","jones")
+
+    f3 = suite.add_family("f3")
+    t1 = f3.add_task("t1")
+    t1.add_variable("fred",    "jones")
+    
+    suite.add_task("t1").add_variable("fred","jones")
+    return local_defs
+
+def create_defs_functionally():
+    f_defs = Defs()
+    suite = f_defs.add_suite("s1")
+    suite.add_variable("Var","value").add_family("f1").add_family("f1").add_task("t1").add_variable("fred","jones")
+    suite.add_trigger("t1 == complete").add_family("f2").add_family("f1").add_task("t1").add_variable("fred","jones")
+    suite.add_meter( "metername3", 0, 100, 50 ).add_family("f3").add_task("t1").add_variable("fred","jones")
+    suite.add_event( 2 ).add_event( 3 ).add_task("t1").add_variable("fred","jones")
+    return f_defs
+    
+    
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version()  + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+
+    #
+    # Add Nodes functional way
+    #
+    defs = Defs()
+    defs.add_suite("s1").add_task("t1").add_variable("var","v")
+    defs.add_suite("s2").add_family("f1").add_task("t1").add_variable("var","v")
+    defs.add_suite("s3").add_family("f1").add_family("f2").add_task("t1").add_variable("var","v")
+    assert len(list(defs.suites)) == 3,"Expected 3 suites"    
+  
+    # These test show that although add_variable() returns a node_ptr, its really a suite
+    # hence calling add_family/add_task still works.
+    assert create_defs_sequentially() == create_defs_functionally(),"Functional suite not as expected "
+  
+    print "All Tests pass"
+    
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestDefs.py b/ecflow_4_0_7/Pyext/test/py_u_TestDefs.py
new file mode 100644
index 0000000..18b5a6c
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestDefs.py
@@ -0,0 +1,221 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#  code for testing creation of defs file in python
+import os
+import ecflow
+print ecflow.__doc__
+print ecflow.Defs.__doc__
+    
+from ecflow import Suite, Family, Task, Defs, Clock, DState, PartExpression, Variable, Limit, InLimit, \
+                   Date, Day, Event, Meter, Label, Autocancel, Days, TimeSlot, TimeSeries, Style, State, \
+                   RepeatString, RepeatDate, RepeatInteger, RepeatDay, RepeatEnumerated, \
+                   Verify, PrintStyle, Time, Today, Late, Cron, Client, debug_build
+
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+    
+    suite = Suite("s1")
+    assert (isinstance(suite, ecflow.Suite)), "Expected suite"
+    assert (not isinstance(suite, ecflow.Family)), "Expected suite"
+    assert (not isinstance(suite, ecflow.Task)), "Expected suite"
+ 
+    family = Family("f1")
+    assert (isinstance(family, ecflow.Family)), "Expected Family"
+    assert (not isinstance(family, ecflow.Suite)), "Expected Family"
+    assert (not isinstance(family, ecflow.Task)), "Expected Family"
+    suite.add_family(family)
+
+    task = Task("f1")
+    assert (isinstance(task, ecflow.Task)), "Expected Task"
+    assert (not isinstance(task, ecflow.Suite)), "Expected Task"
+    assert (not isinstance(task, ecflow.Family)), "Expected Task"
+    family.add_task(task)
+
+    
+    defs = Defs()
+    defs2 = Defs()
+    assert defs == defs2, "Empty defs should be equal"
+ 
+    assert defs.get_state() == ecflow.State.unknown, "Expected default state to be unknown"
+    defs.add_suite(suite);  # add existing suite to defs
+ 
+    suite = defs.add_suite("s2");
+    suite.add_variable(Variable("ECF_HOME","/tmp/"))
+    suite.add_variable("ECF_URL_CMD", "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'")
+    suite.add_variable("ECF_URL_BASE","http://www.ecmwf.int")
+    suite.add_variable("ECF_URL","publications/manuals/sms")
+    suite.add_limit( Limit("limitName", 10) )
+    suite.add_limit( "limitName_2", 10 )
+    assert suite.begun() == False, "Suite should not have begun"
+
+    clock = Clock(1,1,2010,False);
+    clock.set_gain(1,10,True);
+    suite.add_clock(clock);
+
+    assert defs != defs2, "Defs should no longer compare as they are different"
+    
+    defs.add_extern("/path/to/task");
+    defs.add_extern("/fred/bill:event_name");
+    
+    family = suite.add_family("f1")
+    family.add_defstatus( DState.active );
+
+    task = family.add_task("t1")
+    task.add_trigger( "t2 == active" )
+    task.add_complete( "t2 == complete" )
+    task.add_autocancel( Autocancel(3) );
+
+    task2 = family.add_task("t2")
+    task2.add_defstatus(  DState.complete );
+    task2.add_part_trigger(  PartExpression("t1 == complete") )
+    task2.add_part_trigger(  PartExpression("t1 == active",True) )  #  for long and/or expressions, subsequent expr must be and/or
+    task2.add_part_complete( PartExpression("t1 == complete") )
+    task2.add_part_complete( PartExpression("t1 == active",False) )  #  for long and/or expressions, subsequent expr must be and/or
+    task2.add_label(      Label("labelname", "label1") )
+    task2.add_label(      "labelname2", "label1")
+    task2.add_inlimit(    InLimit("limitName","/s1/f1",2) )
+    task2.add_inlimit(    "limitName2" )
+    task2.add_event(      10 )
+    task2.add_event(      Event(10,"Eventname") )
+    task2.add_meter(      Meter("metername",0,100,50) )
+    task2.add_meter(      "metername2",0,100,50 )
+    task2.add_date(       Date(1,1,2010) )
+    task2.add_date(       1,2,2010 )
+    task2.add_day(        Day(Days.sunday) )
+    task2.add_day(        Days.monday )
+    task2.add_autocancel( Autocancel(TimeSlot(20,10),True) )
+
+    task2.add_today(      0,10 )
+    task2.add_today(      Today( 0,59, True ))
+    task2.add_today(      Today(TimeSlot(20,10)) )
+    task2.add_today(      Today(TimeSlot(20,20),False)) 
+    start = TimeSlot(0,0)
+    finish = TimeSlot(23,0)
+    incr = TimeSlot(0,30)
+    ts = TimeSeries( start, finish, incr, True);
+    task2.add_today(      Today(ts) )
+
+    task2.add_time(       20,10 )
+    task2.add_time(       Time(20,12,True) )
+    task2.add_time(       Time(TimeSlot(20,12))) 
+    task2.add_time(       Time(TimeSlot(20,20),True)) 
+    task2.add_time(       Time(ts) )
+    
+    late = Late()
+    late.submitted( 20,10 )
+    late.active(TimeSlot(20,10))
+    late.complete(TimeSlot(20,10),True)
+    task2.add_late(  late )
+        
+    cron = Cron()
+    cron.set_week_days( [0,1,2,3,4,5,6] )
+    cron.set_days_of_month(  [1,2,3,4,5,6] )
+    cron.set_months( [1,2,3,4,5,6] )
+    cron.set_time_series( ts )
+    task2.add_cron( cron );
+    
+    task3 = family.add_task("t3")
+    task3.add_repeat( RepeatDate("testDate",20100111,20100115,2) )
+    task3.add_defstatus( DState.queued );
+    task3.add_verify( Verify(State.complete, 1) )
+    task3.add_autocancel( Autocancel(20,10,False) )
+    task3.add_label( Label("label_name","label_value") )
+    
+    task3_1 = family.add_task("t3_1")
+    task3_1.add_repeat( RepeatDate("testDate",20100111,20100115) )
+    
+
+    task4 = family.add_task("t4")
+    task4.add_repeat( RepeatInteger("testInteger",0,100,2) )
+    task4.add_defstatus( DState.aborted );
+    
+    task4_1 = family.add_task("t4_1")
+    task4_1.add_repeat( RepeatInteger("testInteger",0,100) )
+ 
+    
+    task5 = family.add_task("t5")
+    task5.add_repeat( RepeatEnumerated("testInteger", ["red", "green", "blue" ] ) )
+    task5.add_defstatus( DState.submitted );
+        
+    task6 = family.add_task("t6")
+    task6.add_repeat( RepeatString("test_string",  ["a", "b", "c" ] ) )
+    task6.add_defstatus( DState.suspended );
+    
+    task7 = family.add_task("t7")
+    task7.add_repeat( RepeatDay(2) )
+    task7.add_defstatus( DState.active );
+    
+    task8 = family.add_task("t8")
+    task8.add_repeat( RepeatDay() )
+    print "task8.get_try_no()    :string:",task8.get_try_no()
+    print "task8.get_int_try_no():int   :",task8.get_int_try_no()
+    
+    the_defs = task8.get_defs()
+ 
+          
+    # Test find      
+    assert defs.find_suite("s1") != None, "Expected to find suite of name s1"
+    assert defs.find_suite("sffff1") == None, "Should not be able to find suite of name sfffff1"
+        
+    # save the defs file as a check point file and restore it again
+    checkpt_file = "py_u_TestDefs.check"
+    defs_file = "py_u_TestDefs.def"
+    if debug_build() :
+        checkpt_file = "py_u_TestDefs_debug.check"
+        defs_file = "py_u_TestDefs_debug.def"
+    defs.save_as_checkpt(checkpt_file);
+    
+    restored_checkpt_defs = Defs()
+    restored_checkpt_defs.restore_from_checkpt(checkpt_file)
+    
+    print "Save and restore as Defs ******************************************************"
+    defs.save_as_defs(defs_file)           # default is to save as DEFS
+    restored_from_defs = Defs( defs_file ) # restore the defs
+
+    defs.save_as_defs(defs_file,Style.DEFS)
+    restored_from_defs = Defs( defs_file ) # restore the defs
+            
+    print "Save and restore using STATE ******************************************************"
+    defs.save_as_defs(defs_file,Style.STATE)
+    restored_from_defs = Defs( defs_file ) # restore the defs
+
+    print "Save and restore using MIGRATE ******************************************************"
+    defs.save_as_defs(defs_file,Style.MIGRATE)
+    restored_from_defs = Defs( defs_file ) # restore the defs
+    assert restored_checkpt_defs == restored_from_defs ,"File should be the same"
+
+        
+    print "Print in DEFS style ******************************************************"
+    PrintStyle.set_style(Style.DEFS)
+    the_string = str(restored_from_defs)
+    assert the_string.find("defs_state") == -1, "Print in DEFS style failed"
+    print the_string
+    
+    print "Print in STATE style *****************************************************"
+    PrintStyle.set_style(Style.STATE)
+    the_string = str(restored_from_defs)
+    assert the_string.find("defs_state STATE") != -1, "Print in STATE style failed"
+    print the_string
+    
+    print "Print in MIGRATE style *****************************************************"
+    PrintStyle.set_style(Style.MIGRATE)
+    the_string = str(restored_from_defs)
+    assert the_string.find("defs_state MIGRATE") != -1, "Print in MIGRATE style failed"
+    print the_string
+     
+    # Comment this out if you want to see what the file looked like
+    os.remove(checkpt_file)
+    os.remove(defs_file)
+    print "All tests pass"
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestDefsCheck.py b/ecflow_4_0_7/Pyext/test/py_u_TestDefsCheck.py
new file mode 100644
index 0000000..d83a8e5
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestDefsCheck.py
@@ -0,0 +1,72 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#  Test the error and waning checks defined in the defs work
+
+from ecflow import  Defs, Limit, InLimit, Client, debug_build
+            
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+     
+    defs = Defs()
+    suite = defs.add_suite("s1");
+    suite.add_task("t1").add_trigger("t2 == active)")   
+    theCheckValue = defs.check();
+    print "Message: '" + theCheckValue + "'"
+    assert len(theCheckValue) != 0,  "Expected Error: triggers fail parse, miss-matched brackets in expression."
+ 
+    # The number of tokens specified on the in-limit must be less than or equal to those specified on the LIMIT
+    defs = Defs()
+    suite = defs.add_suite("s1");
+    suite.add_limit( Limit("disk", 50) );
+    family = suite.add_family("anon");
+    family.add_inlimit( InLimit("disk","/s1",100) )
+    family.add_task( "t1" );
+    theCheckValue = defs.check();
+    print "Message: '" + theCheckValue + "'"
+    assert len(theCheckValue) != 0,  "Expected Error: since inlimit value('100') is greater than the LIMIT value('50')"  
+
+
+    # When a path is specified on the in-limit we search for the limit on that path, otherwise the extern's
+    defs = Defs()
+    suite = defs.add_suite("s1");
+    family = suite.add_family("anon");
+    family.add_inlimit( InLimit("disk","/s1",100) )
+    family.add_task( "t1" );
+    theCheckValue = defs.check();
+    print "Message: '" + theCheckValue + "'"
+    assert len(theCheckValue) != 0,  "Expected warning: since inlimit PATH(/s1:disk) reference a limit('disk') that does not exist"  
+    
+    # Add as extern and repeat the check
+    defs.add_extern("/s1:disk")
+    assert len(defs.check()) == 0,  "Expected no warnings, since extern specified: "  + defs.check()
+
+
+    # When no path is specified on the in-limit, we search for the limit up the node tree, otherwise the extern's
+    defs = Defs()
+    suite = defs.add_suite("s1");
+    family = suite.add_family("anon");
+    family.add_inlimit( InLimit("disk","",100) )
+    family.add_task( "t1" );
+    theCheckValue = defs.check();
+    print "Message: '" + theCheckValue + "'"
+    assert len(theCheckValue) != 0,  "Expected warning: since inlimit SHOULD reference a limit('disk') somewhere UP parent hierarchy"  
+    
+    # Add as extern and repeat the check
+    defs.add_extern("disk")
+    assert len(defs.check()) == 0,  "Expected no warnings, since extern specified"  
+    
+    print "All Tests pass"
+    
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestDerivable.py b/ecflow_4_0_7/Pyext/test/py_u_TestDerivable.py
new file mode 100644
index 0000000..976e5dc
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestDerivable.py
@@ -0,0 +1,28 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#  code for testing derivation works
+import ecflow
+
+class MyDefs(ecflow.Defs): pass
+class MySuite(ecflow.Suite): pass
+class MyFamily(ecflow.Family): pass
+class MyTask(ecflow.Task): pass
+class MyClient(ecflow.Client): pass
+
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + ecflow.Client().version() + " debug build(" + str(ecflow.debug_build()) +")"
+    print "####################################################################"
+ 
+    print "All tests pass"
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestEcf.py b/ecflow_4_0_7/Pyext/test/py_u_TestEcf.py
new file mode 100644
index 0000000..6dc842e
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestEcf.py
@@ -0,0 +1,38 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#  code for testing creation of defs file in python
+import os
+import ecflow
+      
+from ecflow import Ecf, Client, debug_build
+
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running TestEcf, ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+    
+    default_debug_level = Ecf.debug_level()
+    assert default_debug_level == 0, "Expected default debug level to be 0"
+    Ecf.set_debug_level(10)
+    assert  Ecf.debug_level() == 10, "Expected debug level to be 10"
+    Ecf.set_debug_level(0)
+    assert  Ecf.debug_level() == 0, "Expected debug level to be 0"
+
+
+    assert  Ecf.debug_equality() == False, "Expected  default for Ecf.debug_equality() == False "
+    Ecf.set_debug_equality(True)
+    assert  Ecf.debug_equality() == True, "Expected  debug_equality() == True "
+    Ecf.set_debug_equality(False)
+    assert  Ecf.debug_equality() == False, "Expected  Ecf.debug_equality() == False "
+
+    print "All tests pass"
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestError.py b/ecflow_4_0_7/Pyext/test/py_u_TestError.py
new file mode 100644
index 0000000..551e0fc
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestError.py
@@ -0,0 +1,443 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#  code for testing errors in creation of defs file in python
+
+import os
+from ecflow import Date, Meter, Event, Clock, Variable, Label, Limit, InLimit, \
+                   RepeatDate, RepeatEnumerated, RepeatInteger, RepeatString, \
+                   Task, Family, Suite, Defs, Client, debug_build
+
+def check_date(day,month,year):
+    try:    
+        Date(day,month,year)
+        return True
+    except IndexError: 
+        return False
+
+def check_meter(name,min_meter_value,max_meter_value,color_change):
+    try:    
+        Meter(name,min_meter_value,max_meter_value,color_change)
+        return True
+    except IndexError: 
+        return False
+    except RuntimeError: 
+        return False
+    
+def check_event_number_and_name(number,name):
+    try:    
+        Event(number,name)
+        return True
+    except: 
+        return False
+    
+def check_event(number):
+    try:    
+        Event(number)
+        return True
+    except RuntimeError: 
+        return False
+        
+def check_clock(day_of_month,month,year):
+    try:    
+        Clock(day_of_month,month,year)
+        return True
+    except IndexError: 
+        return False
+
+def check_variable(name,value):
+    try:    
+        Variable(name,value)
+        return True
+    except RuntimeError: 
+        return False
+    
+def check_label(name,value):
+    try:    
+        Label(name,value)
+        return True
+    except RuntimeError: 
+        return False
+    
+def check_limit(name,int_token):
+    try:    
+        Limit(name,int_token)
+        return True
+    except RuntimeError: 
+        return False
+    except TypeError: 
+        return False
+    
+def check_inlimit(name,path_to_node,int_token):
+    try:    
+        InLimit(name,path_to_node,int_token)
+        return True
+    except RuntimeError: 
+        return False
+    except TypeError: 
+        return False
+        
+def check_repeat_date(name, start, end, step):
+    try:    
+        RepeatDate(name,start,end,step)
+        return True
+    except RuntimeError: 
+        return False
+    
+def check_repeat_integer(name, start, end, step):
+    try:    
+        RepeatInteger(name,start,end,step)
+        return True
+    except RuntimeError: 
+        return False
+    except TypeError: 
+        return False
+
+def check_repeat_enumerated(name, list_of_strings):
+    try:    
+        RepeatEnumerated(name,list_of_strings)
+        return True
+    except RuntimeError: 
+        return False
+    except TypeError: 
+        return False
+ 
+def check_repeat_string(name, list_of_strings):
+    try:    
+        RepeatString(name,list_of_strings)
+        return True
+    except RuntimeError: 
+        return False
+    except TypeError: 
+        return False
+        
+def check_node_name(name):
+    try:
+        Task(name)
+        Family(name)
+        Suite(name)
+        return True;
+    except RuntimeError: 
+        return False
+  
+def check_defs(path_to_defs):
+    try:    
+        Defs(path_to_defs)
+        return True
+    except RuntimeError: 
+        return False
+          
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+ 
+    # Names with leading '.' should not be allowed. Will interfere with triggers
+    # Empty names not allowed
+    # Spaces not allowed
+    invalid_names = [ ".", "", " ","   ",  "fred doc", "1 "]
+    
+    # Allow names with leading underscore
+    valid_names = [ "_", "__", "_._", "1.2", "fred.doc", "_.1"]
+    
+    assert check_date(0,1,2010),            "Expected valid date"
+    assert check_date(10,0,2010),           "Expected valid date"
+    assert check_date(10,1,0),              "Expected valid date"
+    assert check_date(0,0,0),               "Expected valid date"
+    assert check_date(40,1,2010) == False,  "Expected exception since day > 31"
+    assert check_date(-10,1,2010) == False, "Expected exception since day >= 0"
+    assert check_date(1,14,2010) == False,  "Expected exception since month > 12"
+    assert check_date(1,-1,2010) == False,  "Expected exception since month >= 0"
+    assert check_date(1,1,-2) == False,     "Expected exception since year >= 0"
+
+    # clock do not support wild carding hence we cant use 0 like in Date
+    assert check_clock(12,1,2010),           "Expected valid date"
+    assert check_clock(10,1,2010),           "Expected valid date"
+    assert check_clock(10,1,1400),           "Expected valid date"
+    assert check_clock(31,12,2010),          "Expected valid date"
+    assert check_clock(40,1,2010) == False,  "Expected exception since day > 31"
+    assert check_clock(-10,1,2010) == False, "Expected exception since day >= 0"
+    assert check_clock(1,14,2010) == False,  "Expected exception since month > 12"
+    assert check_clock(1,-1,2010) == False,  "Expected exception since month >= 0"
+    assert check_clock(1,1,-2) == False,     "Expected exception since year >= 0"
+
+    assert check_meter("m",0,100,100),             "Expected valid Meter"
+    assert check_meter("m",0,100,0),               "Expected valid Meter"
+    assert check_meter("m",200,100,100) == False,  "Expected exception since min > max"
+    assert check_meter("m",0,100,-20) == False,    "Expected exception since color_change should between min-max"
+    assert check_meter("m",0,100,200) == False,    "Expected exception since color_change should between min-max"
+    assert check_meter("",0,100,100) == False,     "Expected exception since no name specified"
+    assert check_meter(" ",0,100,100) == False,    "Expected Exception can not have spaces for a name"
+
+    assert check_event(1),                            "Expected valid Event"
+    assert check_event(2),                            "Expected valid Event"
+    assert check_event_number_and_name(2,"fred"),     "Expected valid Event"
+    assert check_event_number_and_name(2,2) == False, "Expected failure since the name is not a string"
+
+    assert check_repeat_date("m",20000101,20001201,200),          "Expected valid repeat"
+    assert check_repeat_date("m",20001201,20000101,200) == False, "Expected exception since end YMD > start YMD"
+    assert check_repeat_date("m",200001011,20001201,200)== False, "Expected Exception since start is invalid."
+    assert check_repeat_date("m",20000101,200012013,200)== False, "Expected Exception since send is invalid."
+    assert check_repeat_date("m",00000000,00000000,200)== False,  "Expected Exception since start/end are not valid dates is invalid."
+    assert check_repeat_date("",20000101,20001201,200)==False,    "Expected Exception since no name specified"
+    assert check_repeat_date(" ",20000101,20001201,200)==False,   "Expected Exception can not have spaces for a name"
+    assert check_repeat_integer("name",0, 10, 2 ),                "Expected valid repeat"
+    assert check_repeat_integer("",0, 10, 2 )==False,             "Expected Exception since no name specified"
+    assert check_repeat_integer(" ",0, 10, 2 )==False,            "Expected Exception can not have spaces for a name"
+    assert check_repeat_string("name",[ "a" ]),                   "Expected valid repeat"
+    assert check_repeat_string("",["a"] )==False,                 "Expected Exception since no name specified"
+    assert check_repeat_string(" ",["a"] )==False,                "Expected Exception can not have spaces for a name"
+    assert check_repeat_string("name",[ 1,2 ])==False,            "Expected Exception since a list of strings was expected"
+    assert check_repeat_enumerated("name",[ "a" ]),               "Expected valid repeat"
+    assert check_repeat_enumerated("",["a"] )==False,             "Expected Exception since no name specified"
+    assert check_repeat_enumerated(" ",["a"] )==False,            "Expected Exception since a list of strings was expected"
+    assert check_repeat_enumerated("name",[ 1,2 ])==False,        "Expected Exception since a list of strings was expected"
+
+
+    assert check_variable("name","value"),        "Expected valid Variable"
+    assert check_variable("name",""),             "Expected valid Variable"
+    assert check_variable("name"," "),            "Expected valid Variable"
+    assert check_variable("name","12"),           "Expected valid Variable"
+    assert check_variable("","12")==False,        "Expected Exception name must be specified"
+    assert check_variable(" ","12")==False,       "Expected Exception can not have spaces for a name"
+
+    assert check_label("name","value"),        "Expected valid label"
+    assert check_label("name",""),             "Expected valid label"
+    assert check_label("name"," "),            "Expected valid label"
+    assert check_label("name","12"),           "Expected valid label"
+    assert check_label("","12")==False,        "Expected exception name must be specified"
+    assert check_label(" ","12")==False,       "Expected Exception can not have spaces for a name"
+
+    assert check_limit("name",1),              "Expected valid limit"
+    assert check_limit("name",20000),          "Expected valid limit"
+    assert check_limit("name","ten")==False,   "Expected exception, token must be a integer"
+    assert check_limit("name","2")==False,     "Expected exception, token must be a integer"
+    assert check_limit("","2")==False,         "Expected exception, no name specified"
+    assert check_limit(" ","2")==False,        "Expected exception, can not have spaces for a name"
+
+    assert check_inlimit("limit_name","/path/to/limit",1),      "Expected valid in limit"
+    assert check_inlimit("limit_name","/path/to/limit",999999), "Expected valid in limit"
+    assert check_inlimit("limit_name","",1),                    "Expected valid in limit"
+    assert check_inlimit("","",1)==False,                       "Expected exception, no limit name specified"
+    assert check_inlimit(" ","",1)==False,                      "Expected exception, can not have spaces for a name"
+ 
+
+    # ========================================================================
+    print "Check node names"
+    for i in range(25):
+        assert check_node_name(str(i)),             "Integer names should be allowed"
+     
+    for name in valid_names:
+        assert check_node_name(name),  "Expected valid name " + name
+    
+    for name in invalid_names:
+        assert check_node_name(name)==False,  "Expected exception for invalid name " + name
+
+   
+    assert check_defs("a_made_up_path_that_doesnt_not_exit.def") == False, "Expected exception, Defs file does not exist"
+
+    # =================================================================================
+    print "test save_as_defs"
+    defs = Defs()                      # create a empty definition
+    s1 = defs.add_suite("s1")          # create a suite "s1" and add to defs
+    defs.save_as_defs("testerror.def") # create a defs on disk
+    assert check_defs("testerror.def"), "Expected defs file to exist"
+    os.remove("testerror.def")
+
+    # =================================================================================
+    print "Check duplicate suites not allowed"
+    test_passed = False
+    try :
+        defs = Defs()               # create a empty definition
+        s1 = defs.add_suite("s1")   # create a suite "s1" and add to defs
+        s2 = defs.add_suite("s1")   # Exception thrown trying to add suite name "s1" again
+    except RuntimeError, e : 
+        test_passed = True
+        pass 
+    assert test_passed,"duplicate suite test failed"   
+
+    # =================================================================================
+    test_passed = False
+    try:
+        defs = Defs()
+        defs.add_suite("1").add_today("00:30")
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"Adding today at the suite level should fail"   
+    print "check adding today at the suite level: RuntimeError: ",e
+
+    # =================================================================================
+    test_passed = False
+    try:
+        defs = Defs()
+        defs.add_suite("1").add_time("00:30")
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"Adding time at the suite level should fail"    
+    print "check adding time at the suite level: RuntimeError: ",e
+
+    # =================================================================================
+    test_passed = False
+    try:
+        defs = Defs()
+        defs.add_suite("1").add_date(1,1,2016)
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"Adding date at the suite level should fail"    
+    print "check adding date at the suite level: RuntimeError: ",e
+
+    # =================================================================================
+    test_passed = False
+    try:
+        defs = Defs()
+        defs.add_suite("1").add_day("monday")
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"Adding day at the suite level should fail"    
+    print "check adding day at the suite level: RuntimeError: ",e
+
+
+    # =================================================================================
+    print "check duplicate family not allowed"
+    test_passed = False
+    try:
+        suite = Suite("1")
+        fam1 = Family("1")
+        fam2 = Family("1")
+        suite.add_family(fam1)
+        suite.add_family(fam2)
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"duplicate Family test failed"   
+  
+    # =================================================================================
+    print "duplicate task not allowed"
+    test_passed = False
+    try:
+        suite = Suite("1")
+        ta = Task("a")
+        tb = Task("a")
+        suite.add_task(ta)
+        suite.add_task(tb)
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"duplicate Task test failed"   
+
+    # =================================================================================
+    print "check duplicate meter not allowed"
+    test_passed = False
+    try:
+        defs = Defs()
+        suite = defs.add_suite("1")
+        ta = suite.add_task("a")
+        ta.add_meter("meter",0,100);
+        ta.add_meter("meter",0,100);
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"duplicate event test failed"   
+
+    test_passed = False
+    try:
+        defs = Defs()
+        suite = defs.add_suite("1")
+        ta = suite.add_task("a")
+        ta.add_meter(Meter("meter",0,100));
+        ta.add_meter(Meter("meter",10,100));
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"duplicate meter test failed"   
+    
+    # =================================================================================
+    print "check duplicate event not allowed"
+    test_passed = False
+    try:
+        defs = Defs()
+        suite = defs.add_suite("1")
+        ta = suite.add_task("a")
+        ta.add_event(1);
+        ta.add_event("1");
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"duplicate event test failed"   
+    
+    test_passed = False
+    try:
+        defs = Defs()
+        suite = defs.add_suite("1")
+        ta = suite.add_task("a")
+        ta.add_event("name");
+        ta.add_event("name");
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"duplicate event test failed"   
+    
+    test_passed = False
+    try:
+        defs = Defs()
+        suite = defs.add_suite("1")
+        ta = suite.add_task("a")
+        ta.add_event(1,"name");
+        ta.add_event(1,"name");
+    except RuntimeError, e : 
+        test_passed = True
+        pass
+    assert test_passed,"duplicate event test failed"   
+    
+    
+    # =================================================================================
+    print "check cannot add same node to different containers"
+    defs1 = Defs();
+    suite = defs1.add_suite("s1")
+    family =  suite.add_family("f1")
+    task  = family.add_task("t1")
+    
+    test_passed = False
+    try :
+        defs2 = Defs();
+        defs2.add_suite(suite)
+    except RuntimeError, e : 
+        test_passed = True
+        pass    
+    assert test_passed,"Can't add same suite to two different defs"   
+
+    test_passed = False
+    try :
+        defs3 = Defs();
+        suite = defs3.add_suite(suite)
+        suite.add_family(family)
+    except RuntimeError, e : 
+        test_passed = True
+        pass    
+    assert test_passed,"Can't add same family to two different suites"   
+
+    test_passed = False
+    try :
+        defs4 = Defs();
+        suite = defs4.add_suite("s1")
+        suite.add_task(task)
+    except RuntimeError, e : 
+        test_passed = True
+        pass    
+    assert test_passed,"Can't add same task to two different containers"   
+
+    print "All Tests pass"
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestFind.py b/ecflow_4_0_7/Pyext/test/py_u_TestFind.py
new file mode 100644
index 0000000..ff12ed0
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestFind.py
@@ -0,0 +1,54 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#  code for testing pointers and hierarchy in python
+
+from ecflow import Suite, Family, Task, Defs, Client, debug_build
+
+def create_defs(name=""):
+    defs = Defs()
+    suite_name = name
+    if len(suite_name) == 0: suite_name = "s1"
+    suite = defs.add_suite(suite_name);
+    
+    f1 = suite.add_family("f1")
+    f1.add_task("f1_t1")
+    f1.add_task("f1_t2")
+    f2 = suite.add_family("f2")
+    f2.add_task("f2_t1")
+    f2.add_task("f2_t2")
+    return defs;
+    
+    
+if __name__ == "__main__":    
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+ 
+    defs = create_defs();
+    tasks = defs.get_all_tasks()
+    assert len(tasks) == 4, "Expected four tasks, but found " + str(len(tasks))
+    for task in tasks:
+        if task.name() == "f1_t1":
+            node = task.find_node_up_the_tree("f1")
+            assert node != None
+            assert node.get_abs_node_path() == "/s1/f1"
+            
+            node = task.find_node_up_the_tree("s1")
+            assert node != None
+            assert node.get_abs_node_path() == "/s1"
+
+            node = task.find_node_up_the_tree("freddd")
+            assert node == None
+
+    print "All Tests pass"
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestGeneratedVariable.py b/ecflow_4_0_7/Pyext/test/py_u_TestGeneratedVariable.py
new file mode 100644
index 0000000..a5a56c8
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestGeneratedVariable.py
@@ -0,0 +1,76 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# code for testing  generated variables
+#
+import ecflow
+    
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + ecflow.Client().version() + " debug build(" + str(ecflow.debug_build()) +")"
+    print "####################################################################"
+     
+    #===========================================================================
+    print "Defs: test generated variables"
+    #===========================================================================
+    defs = ecflow.Defs()
+    suite = defs.add_suite("s1")
+    family = suite.add_family("f1")
+    task = family.add_task("t1")
+
+    print "\nsuite generated variables, Most of date related suite generated variables will only have values after the suite has begun"
+    variable_list = ecflow.VariableList()
+    suite.get_generated_variables(variable_list)
+    for gen_var in variable_list:
+        print gen_var
+    assert len(list(variable_list)) == 12,"Expected 12 generated variables for suites"    
+    assert variable_list[0].name() == "SUITE", "expected generated variable of name SUITE but found " + variable_list[0].name()
+    assert variable_list[0].value() == "s1", "expected generated variable of value 's1' but found " + variable_list[0].value()
+
+
+    print "\nfamily generated variables"
+    variable_list = ecflow.VariableList()
+    family.get_generated_variables(variable_list)
+    for gen_var in variable_list:
+        print gen_var
+    assert len(list(variable_list)) == 2,"Expected 2 generated variables for families"    
+    assert variable_list[0].name() == "FAMILY", "expected generated variable of name FAMILY but found " + variable_list[0].name()
+    assert variable_list[0].value() == "f1", "expected generated variable of value 'f1' but found " + variable_list[0].value()
+    assert variable_list[1].name() == "FAMILY1", "expected generated variable of name FAMILY1 but found " + variable_list[1].name()
+    assert variable_list[1].value() == "f1", "expected generated variable of value 'f1' but found " + variable_list[1].value()
+
+    print "\ntask generated variables"
+    variable_list = ecflow.VariableList()
+    task.get_generated_variables(variable_list)
+    for gen_var in variable_list:
+        print gen_var
+    assert len(list(variable_list)) == 8,"Expected 8 generated variables for tasks"    
+    assert variable_list[0].name() == "TASK", "expected generated variable of name TASK but found " + variable_list[0].name()
+    assert variable_list[0].value() == "t1", "expected generated variable of value 't1' but found " + variable_list[0].value()
+    assert variable_list[1].name() == "ECF_JOB", "expected generated variable of name ECF_JOB but found " + variable_list[1].name()
+    assert variable_list[1].value() == "./s1/f1/t1.job0", "expected generated variable of value './s1/f1/t1.job0' but found " + variable_list[1].value()
+    assert variable_list[2].name() == "ECF_SCRIPT", "expected generated variable of name ECF_SCRIPT but found " + variable_list[2].name()
+    assert variable_list[2].value() == "./s1/f1/t1.ecf", "expected generated variable of value './s1/f1/t1.ecf' but found " + variable_list[2].value()
+    assert variable_list[3].name() == "ECF_JOBOUT", "expected generated variable of name ECF_JOBOUT but found " + variable_list[3].name()
+    assert variable_list[3].value() == "./s1/f1/t1.0", "expected generated variable of value './s1/f1/t1.0' but found " + variable_list[3].value()
+    assert variable_list[4].name() == "ECF_TRYNO", "expected generated variable of name ECF_TRYNO but found " + variable_list[4].name()
+    assert variable_list[4].value() == "0", "expected generated variable of value '0' but found " + variable_list[4].value()
+    assert variable_list[5].name() == "ECF_RID", "expected generated variable of name ECF_RID but found " + variable_list[5].name()
+    assert variable_list[5].value() == "", "expected generated variable of value '' but found " + variable_list[5].value()
+    assert variable_list[6].name() == "ECF_NAME", "expected generated variable of name ECF_NAME but found " + variable_list[6].name()
+    assert variable_list[6].value() == "/s1/f1/t1", "expected generated variable of value '/s1/f1/t1' but found " + variable_list[6].value()
+    assert variable_list[7].name() == "ECF_PASS", "expected generated variable of name ECF_NAME but found " + variable_list[7].name()
+    assert variable_list[7].value() == "_DJP_", "expected generated variable of value '_DJP_' but found " + variable_list[7].value()
+
+    print "\nAll Tests pass"
+    
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestGetAllTasks.py b/ecflow_4_0_7/Pyext/test/py_u_TestGetAllTasks.py
new file mode 100644
index 0000000..47e46e7
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestGetAllTasks.py
@@ -0,0 +1,73 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# Simple check for get all tasks
+from ecflow import Defs, Client, debug_build
+  
+def create_defs():
+    defs = Defs()
+    suite = defs.add_suite("test_get_all")
+    suite.add_task("t0")
+    fam = suite.add_family("f1")
+    fam.add_task("t1") 
+    fam.add_task("t2") 
+    fam2 = fam.add_family("f2")
+    fam2.add_task("t3") 
+    return defs
+   
+def test_get_all_tasks(defs):
+  
+    task_vec2 = defs.get_all_tasks()
+    assert len(task_vec2) == 4, "Expected four tasks, but found " + str(len(task_vec2))
+   
+    assert task_vec2[0].name() == "t0", "Expected task of name t0 but found " + task_vec2[0].name()
+    assert task_vec2[1].name() == "t1", "Expected task of name t1 but found " + task_vec2[1].name()
+    assert task_vec2[2].name() == "t2", "Expected task of name t2 but found " + task_vec2[2].name()
+    assert task_vec2[3].name() == "t3", "Expected task of name t3 but found " + task_vec2[3].name()
+   
+    print "test_get_all_tasks PASSED"
+   
+def test_get_all_nodes(defs):
+    
+    # Get all the nodes make sure they are in order
+    node_vec = defs.get_all_nodes()
+    assert len(node_vec) == 7, "Expected seven nodes, but found " + str(len(node_vec))
+    assert node_vec[0].name() == "test_get_all", "Nodes should be returned in order, expected test_get_all but found" + node_vec[0].name()
+    assert node_vec[1].name() == "t0", "Nodes should be returned in order, expected 't0' but found" + node_vec[1].name()
+    assert node_vec[2].name() == "f1", "Nodes should be returned in order, expected 'f1' but found" + node_vec[2].name()
+    assert node_vec[3].name() == "t1", "Nodes should be returned in order, expected 't1' but found" + node_vec[3].name()
+    assert node_vec[4].name() == "t2", "Nodes should be returned in order, expected 't2' but found" + node_vec[4].name()
+    assert node_vec[5].name() == "f2", "Nodes should be returned in order, expected 'f2' but found" + node_vec[5].name()
+    assert node_vec[6].name() == "t3", "Nodes should be returned in order, expected 't3' but found" + node_vec[6].name()
+
+    # test empty defs
+    empty_defs = Defs()
+    node_vec = empty_defs.get_all_nodes()
+    assert len(node_vec) == 0, "Expected zero nodes, for an empty defs but found " + str(len(node_vec))
+
+    # test one suite defs
+    one_suite_defs = Defs()
+    one_suite_defs.add_suite("s1")
+    node_vec = one_suite_defs.get_all_nodes()
+    assert len(node_vec) == 1, "Expected one node, but found" + str(len(node_vec))
+
+    print "test_get_all_nodes PASSED"
+
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+ 
+    test_get_all_tasks(create_defs())
+    test_get_all_nodes(create_defs())
+    print "All Tests pass"    
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestJobGeneration.py b/ecflow_4_0_7/Pyext/test/py_u_TestJobGeneration.py
new file mode 100644
index 0000000..36cc033
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestJobGeneration.py
@@ -0,0 +1,135 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# This code is used check job generation
+#
+import os
+import shutil   # used to remove directory tree
+
+import ecflow_test_util as Test
+from ecflow import Defs, JobCreationCtrl, TaskVec, File, Client, debug_build
+
+def ecf_includes() : return Test.get_root_source_dir() + "/Pyext" + "/test/data/includes"
+
+def create_defs(ecf_home,task_vec):
+    defs = Defs();
+    suite = defs.add_suite("suite_job_gen");
+    suite.add_variable("ECF_HOME",ecf_home);
+    suite.add_variable("ECF_CLIENT_EXE_PATH",File.find_client());
+    suite.add_variable("SLEEPTIME","1");
+    suite.add_variable("ECF_INCLUDE",ecf_includes());
+    
+    fam =  suite.add_family("family")
+    t1 = fam.add_task("t1")
+    t1.add_event("eventname");
+    t1.add_meter("meter",0,100,100)
+    
+    t2 = fam.add_task("t2")
+    t3 = fam.add_task("t3")
+    t4 = fam.add_task("dummy_task")
+    t4.add_variable("ECF_DUMMY_TASK","any"); # stop job generation errors for tasks without an .ecf
+    task_vec.append(t1);
+    task_vec.append(t2);
+    task_vec.append(t3);
+    task_vec.append(t4);
+    
+    return defs
+
+
+def delete_jobs(task_vec, ecf_home):
+    print "delete jobs"
+    for task in task_vec:
+        the_job_file = ecf_home + task.get_abs_node_path() + ".job" + task.get_try_no()
+        if os.path.exists(the_job_file) :
+            print "removing file " + the_job_file
+            try: os.remove(the_job_file)
+            except: pass
+        man_file = ecf_home + task.get_abs_node_path() + ".man"  
+        if os.path.exists(man_file) :
+            print "removing man_file " + man_file
+            try: os.remove(man_file)
+            except: pass
+   
+def check_jobs(task_vec, ecf_home):
+    print "Check job file exists"
+    for task in task_vec:
+        variable = task.find_variable("ECF_DUMMY_TASK")
+        if not variable.empty(): continue;
+        the_job_file = ecf_home + task.get_abs_node_path() + ".job" + task.get_try_no()
+      
+        if os.path.exists(the_job_file) :
+            print "Found job file " + the_job_file
+        else:
+            assert False, "Could not find job file " + the_job_file
+
+
+
+
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+ 
+    workspace = Test.get_root_source_dir();
+    print workspace
+    
+    ecf_home = workspace + "/Pyext/test/data/ECF_HOME"
+    task_vec = TaskVec()
+    defs = create_defs(ecf_home,task_vec)
+    print str(defs)
+
+    print "Generate jobs for *ALL* tasks, to default locations ECF_HOME/ECF_NAME.job0" 
+    print defs.check_job_creation()   
+    check_jobs(task_vec,ecf_home)
+    delete_jobs(task_vec,ecf_home)
+       
+    print "\nGenerate jobs for *ALL* tasks, to default locations ECF_HOME/ECF_NAME.job0"
+    job_ctrl = JobCreationCtrl()
+    defs.check_job_creation( job_ctrl )       
+    print job_ctrl.get_error_msg()
+    check_jobs(task_vec,ecf_home)
+    delete_jobs(task_vec,ecf_home)
+    
+    print "\nGenerate jobs for all nodes, under path, to default locations ECF_HOME/ECF_NAME.job0"    
+    job_ctrl = JobCreationCtrl()
+    job_ctrl.set_node_path( task_vec[0].get_abs_node_path() )    
+    defs.check_job_creation(job_ctrl)       
+    print job_ctrl.get_error_msg();
+    delete_jobs(task_vec,ecf_home)
+   
+    print "\nGenerate jobs for all tasks, to the specified directory"
+    # Directory will automatically created under the provided directory
+    job_ctrl = JobCreationCtrl()
+    job_ctrl.set_dir_for_job_creation(workspace + "/Pyext/test/data")  # generate jobs file under this directory
+    defs.check_job_creation(job_ctrl)
+    print job_ctrl.get_error_msg()
+    
+    generated_dir = job_ctrl.get_dir_for_job_creation() + "/suite_job_gen"
+    print "removing directory tree " + generated_dir
+    shutil.rmtree(generated_dir)      
+ 
+ 
+    # Create jobs for all task, to a TMP directory ($TMPDIR/ecf_check_job_creation/ECF_NAME.job0
+    # When run via rsh then TMPDIR may not be defined, hence expect exception to be thrown
+    try:
+        job_ctrl = JobCreationCtrl()                    
+        job_ctrl.generate_temp_dir()       
+        defs.check_job_creation(job_ctrl)
+        print job_ctrl.get_error_msg()
+        print "removing directory tree " + job_ctrl.get_dir_for_job_creation()
+        shutil.rmtree(job_ctrl.get_dir_for_job_creation())     
+    
+        delete_jobs(task_vec,ecf_home)
+        print "All test pass"
+    except RuntimeError, e:
+        print "failed: " + str(e)    
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestParent.py b/ecflow_4_0_7/Pyext/test/py_u_TestParent.py
new file mode 100644
index 0000000..346535b
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestParent.py
@@ -0,0 +1,77 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#  code for testing pointers and hierarchy in python
+
+from ecflow import Suite, Family, Task, Defs, Client, debug_build
+
+def absNodePath(node):
+    """ Given a node return its absolute node path. """
+    """ Example of using get_parent()               """
+    name_list = []
+    name_list.append(node.name())
+    parent = node.get_parent();
+    while parent:
+        name_list.append(parent.name())
+        parent = parent.get_parent()
+        
+    name_list.reverse()
+    ret = ""
+    for name in name_list:
+        ret = ret +  "/"
+        ret = ret + name
+    return ret
+    
+
+if __name__ == "__main__":    
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+   
+    suite = Suite("s1");
+    family = Family("f1")
+    task = Task("t1")
+
+    assert not suite.get_parent(), "Suite parent is always NULL"
+    assert not family.get_parent(), "Expect no parent"
+    assert not task.get_parent(), "Expect no parent"
+    
+    print "suite.get_defs() = " + str(suite.get_defs())
+    print "family.get_defs() = " + str(family.get_defs())
+    print "task.get_defs() = " + str(task.get_defs())
+    assert not suite.get_defs(),   "Expected no defs, since suite not added to defs yet"
+    assert not family.get_defs(),  "Expected no defs"
+    assert not task.get_defs(),    "Expected no defs"
+    
+    suite.add_family(family)
+    family.add_task(task)
+    
+    family2 = Family("f2")
+    family.add_family(family2)
+
+    t1 = Task("t1")
+    family2.add_task(t1)
+       
+    defs = Defs()
+    defs.add_suite(suite);
+    
+    print absNodePath(t1)
+    print absNodePath(family2)
+    print absNodePath(family)
+    print absNodePath(suite)
+    
+    assert t1.get_abs_node_path() == absNodePath(t1),          "Expected " + t1.get_abs_node_path()      + " but got " + absNodePath(t1)
+    assert family2.get_abs_node_path() == absNodePath(family2),"Expected " + family2.get_abs_node_path() + " but got " + absNodePath(family2)
+    assert family.get_abs_node_path() == absNodePath(family),  "Expected " + family.get_abs_node_path()  + " but got " + absNodePath(family)
+    assert suite.get_abs_node_path() == absNodePath(suite),    "Expected " + family.get_abs_node_path()  + " but got " + absNodePath(suite)
+    print "All Tests pass"
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestRepeatArithmetic.py b/ecflow_4_0_7/Pyext/test/py_u_TestRepeatArithmetic.py
new file mode 100644
index 0000000..aeccbf2
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestRepeatArithmetic.py
@@ -0,0 +1,52 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# This test checks trigger evaluation uses date arithmetic when
+# the expression reference a repeat DATE variable.
+# Addition and subtraction for repeat date, should follow data arithmetic
+# The repeat variable in the expression must be on the LHS(left hand side)
+# of the expression, otherwise integer arithmetic is used
+import ecflow
+ 
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + ecflow.Client().version() + " debug build(" + str(ecflow.debug_build()) + ")"
+    print "####################################################################"
+ 
+    defs = ecflow.Defs()
+    s1 = defs.add_suite("s1");
+    t1 = s1.add_task("t1").add_repeat( ecflow.RepeatDate("YMD",20090101,20091231,1) );
+    t2 = s1.add_task("t2").add_trigger("t1:YMD ge 20100601");
+ 
+    # Check trigger expressions
+    assert len(defs.check()) == 0,  "Expected no errors in parsing expressions."
+ 
+    # Initial value of repeat is 20090101 hence trigger should fail to evaluate
+    assert t2.evaluate_trigger() == False, "Expected trigger to evaluate. 20090101 >= 20100601"
+   
+    # Check end of month - 1
+    t2.change_trigger("t1:YMD - 1 eq 20081231")
+    assert t2.evaluate_trigger(), "Expected trigger to evaluate. 20090101 - 1  == 20081231"
+
+    # check addition
+    t2.change_trigger("t1:YMD + 1 eq 20090102");    
+    assert t2.evaluate_trigger(), "Expected trigger to evaluate. 20090101 + 1  == 20090102"
+
+    # Check the end of each month + 1
+    t1.delete_repeat();
+    t1.add_repeat( ecflow.RepeatDate("YMD",20090131,20101231,1)) 
+    t2.change_trigger("t1:YMD + 1 eq 20090201");   
+    assert t2.evaluate_trigger(), "Expected trigger to evaluate. 20090131 + 1  == 20090201"
+
+    print "All Tests pass"
+    
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestSimulator.py b/ecflow_4_0_7/Pyext/test/py_u_TestSimulator.py
new file mode 100644
index 0000000..749d838
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestSimulator.py
@@ -0,0 +1,82 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#  Test the simulation works
+
+import os
+import ecflow
+
+def simulate_defs_with_time():
+    #suite test_time_series
+    #  family family
+    #      task t1
+    #         time 00:00 23:00 04:00  # should run 6 times 00:00 04:00 08:00 12:00 16:00 20:00
+    #  endfamily
+    #endsuite
+    print "simulate_defs_with_time()"
+    defs = ecflow.Defs()
+    suite = defs.add_suite("test_time_series")
+    clock = ecflow.Clock(1, 1, 2011, False)       # day,month, year, hybrid make test start at midnight, otherwise current time used
+    suite.add_clock(clock)
+    family = suite.add_family("family")
+    task = family.add_task("t1")
+    ts = ecflow.TimeSeries(ecflow.TimeSlot(0,0), ecflow.TimeSlot(23,0), ecflow.TimeSlot(4,0), True)
+    task.add_time( ecflow.Time(ts) )
+    task.add_verify( ecflow.Verify(ecflow.State.complete, 6) ) # expect task to complete 6 times
+         
+    theResult = defs.simulate()
+    assert len(theResult) == 0,  "Expected simulation to return without any errors, but found:\n" + theResult
+    
+    print "  simple check for state change time"
+    print "   iso_extended:",task.get_state_change_time()
+    print "   iso_extended:",task.get_state_change_time("is0_extended")
+    print "   iso         :",task.get_state_change_time("iso")
+    print "   simple      :",task.get_state_change_time("simple")
+    print "   rubbish     :",task.get_state_change_time("rubbish")
+ 
+    os.remove("test_time_series.def.log")
+    
+def simulate_deadlock():
+    # This simulation is expected to fail, since we have a deadlock/ race condition
+    
+    # suite dead_lock
+    #  family family
+    #    task t1
+    #          trigger t2 == complete
+    #    task t2
+    #          trigger t1 == complete
+    #   endfamily
+    # endsuite
+    
+    defs = ecflow.Defs()
+    suite = defs.add_suite("dead_lock")
+    fam = suite.add_family("family")
+    fam.add_task("t1").add_trigger("t2 == complete")
+    fam.add_task("t2").add_trigger("t1 == complete")
+    
+    theResult = defs.simulate()
+    assert len(theResult) != 0, "Expected simulation to return errors, but found none" 
+    print theResult
+           
+    os.remove("dead_lock.def.log")
+    os.remove("defs.depth")
+    os.remove("defs.flat")
+
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + ecflow.Client().version() + " debug build(" + str(ecflow.debug_build()) +")"
+    print "####################################################################"
+ 
+    simulate_defs_with_time()
+    simulate_deadlock()
+    print "All Tests pass"
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestTraversal.py b/ecflow_4_0_7/Pyext/test/py_u_TestTraversal.py
new file mode 100644
index 0000000..f5a3d3d
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestTraversal.py
@@ -0,0 +1,221 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# This file is used to test the python traversal routines
+# This is done by loading from disk a defs file.
+# traversing this defs file, and creating another defs file
+# then comparing the two. If traversal was correct. the file should be the same
+
+import ecflow
+import os,fnmatch
+            
+class Indentor:
+    """This class manages indentation, for use with context manager
+    It is used to correctly indent the definition node tree hierarchy
+    """
+    _index = 0
+    def __init__(self):
+        Indentor._index += 1
+    def __del__(self):
+        Indentor._index -= 1
+    @classmethod
+    def indent(cls,the_file):
+        for i in range(Indentor._index):
+            the_file.write(' ')
+            
+class DefsTraverser:
+    """Traverse the ecflow.Defs definition and write to file.
+    
+    This demonstrates that all nodes in the node tree and all attributes are accessible.
+    Additionally the state data is also accessible. This class will write state data as
+    comments. If the definition was returned from the server, it allows access to latest 
+    snapshot of the state data held in the server. 
+    """
+    def __init__(self,defs,file_name):
+        assert (isinstance(defs,ecflow.Defs)),"Expected ecflow.Defs as first argument"
+        assert (isinstance(file_name,str)),"Expected a string argument. Representing a file name"
+        self.__defs = defs
+        self.__file = open(file_name, 'w')
+        
+    def write_to_file(self):
+        for extern in self.__defs.externs:
+            self.__writeln("extern " + extern)
+        for suite in self.__defs.suites:
+            self.__write("suite ")
+            self.__print_node(suite)
+            clock = suite.get_clock()
+            if clock:
+                indent = Indentor()
+                self.__writeln(str(clock))
+                del indent
+            self.__print_nc(suite)
+            self.__writeln("endsuite")  
+        self.__file.close()
+
+    def __print_nc(self,node_container):
+        indent = Indentor()
+        for node in node_container.nodes:
+            if isinstance(node, ecflow.Task):
+                self.__write("task ")
+                self.__print_node(node)
+                self.__print_alias(node)
+            else: 
+                self.__write("family ")
+                self.__print_node(node)
+                self.__print_nc(node)
+                self.__writeln("endfamily")
+        del indent
+
+    def __print_alias(self,task):
+       indent = Indentor()
+       for alias in task.nodes:
+           self.__write("alias ")
+           self.__print_node(alias)
+           self.__writeln("endalias")
+       del indent
+
+    def __print_node(self,node):
+        self.__file.write(node.name() + " # state:" + str(node.get_state()) + "\n")
+        
+        indent = Indentor()
+        defStatus = node.get_defstatus()
+        if defStatus != ecflow.DState.queued: 
+            self.__writeln("defstatus " + str(defStatus))
+            
+        autocancel = node.get_autocancel()
+        if autocancel: self.__writeln(str(autocancel))
+        
+        repeat = node.get_repeat()
+        if not repeat.empty(): self.__writeln(str(repeat)  + " # value: " + str(repeat.value()))
+    
+        late = node.get_late()
+        if late: self.__writeln(str(late) + " # is_late: " + str(late.is_late()))
+
+        complete_expr = node.get_complete()
+        if complete_expr:
+            for part_expr in complete_expr.parts:
+                trig = "complete "
+                if part_expr.and_expr(): trig = trig + "-a "
+                if part_expr.or_expr():  trig = trig + "-o "
+                self.__write(trig)
+                self.__file.write( part_expr.get_expression() + "\n")
+        trigger_expr = node.get_trigger()
+        if trigger_expr:
+            for part_expr in trigger_expr.parts:
+                trig = "trigger "
+                if part_expr.and_expr(): trig = trig + "-a "
+                if part_expr.or_expr():  trig = trig + "-o "
+                self.__write(trig)
+                self.__file.write( part_expr.get_expression() + "\n")
+                
+        for var in node.variables:    self.__writeln("edit " + var.name() + " '" + var.value() + "'")
+        for meter in node.meters:     self.__writeln(str(meter) + " # value: " + str(meter.value()))
+        for event in node.events:     self.__writeln(str(event) + " # value: " + str(event.value()))
+        for label in node.labels:     self.__writeln(str(label) + " # value: " + label.new_value())
+        for limit in node.limits:     self.__writeln(str(limit) + " # value: " + str(limit.value()))
+        for inlimit in node.inlimits: self.__writeln(str(inlimit))
+        for the_time in node.times:   self.__writeln(str(the_time))
+        for today in node.todays:     self.__writeln(str(today))   
+        for date in node.dates:       self.__writeln(str(date))  
+        for day in node.days:         self.__writeln(str(day))   
+        for cron in node.crons:       self.__writeln(str(cron))    
+        for verify in node.verifies:  self.__writeln(str(verify))
+        for zombie in node.zombies:   self.__writeln(str(zombie))
+        
+        del indent
+
+    def __write(self,the_string):
+        Indentor.indent(self.__file)
+        self.__file.write(the_string)
+
+    def __writeln(self,the_string):
+        Indentor.indent(self.__file)
+        self.__file.write(the_string + "\n")
+                                   
+def check_traversal(path_to_def):
+    # Open a def on disk *and* load into memory
+    reference_def = ecflow.Defs( path_to_def )
+         
+    # traverse the opened def and write it out again
+    file_name = "copy.def"
+    traverser = DefsTraverser(reference_def,file_name)
+    traverser.write_to_file()
+         
+    # restore the defs we create via traversal. If traversal was good it should
+    # be the same as def on disk.
+    try:
+        traversed_def = ecflow.Defs( file_name )
+    except RuntimeError, e: 
+        print "Could not parse file " + file_name + "\n" + str(e)
+        exit(1)
+         
+    # compare the two defs
+    ecflow.Ecf.set_debug_equality(True)
+    defs_equal = (traversed_def == reference_def)
+    if not defs_equal:
+        print str(path_to_def) + " FAILED "
+        print "The traversed defs=========\n" + str(traversed_def) + "\nnot the same as reference def============\n" + str(reference_def)
+        print "===================== " + file_name + " ===================================="
+        the_traversed_def_on_disk = open(file_name)
+        for line in the_traversed_def_on_disk:
+            print line,
+            
+        assert defs_equal, "Failed: ---"
+      
+        # Notice: this path does not delete file_name, left for analysis of failure
+    else:
+        print str(path_to_def) + " PASSED "
+        os.remove(file_name)        
+        
+
+def all_files(root, patterns='*', single_level=False, yield_folders=False):
+    """Expand patterns from semi-colon separated string to list"""
+    patterns = patterns.split(';')
+    for path, subdirs, files in os.walk(root):
+        if yield_folders:
+            files.extend(subdirs)
+        files.sort()
+        for name in files:
+            for pattern in patterns:
+                if fnmatch.fnmatch(name,pattern):
+                    yield os.path.join(path, name)
+                    break
+        if single_level:
+            break    
+        
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + ecflow.Client().version() + " debug build(" + str(ecflow.debug_build()) +")"
+    print "####################################################################"
+ 
+    cwd = os.getcwd()
+    #print cwd
+    #print "split = " + str(os.path.split(cwd))
+    #print "basename = " + os.path.basename(cwd)
+    #print "dirname = " + os.path.dirname(cwd)
+    #print "splitext = " + str( os.path.splitext(cwd) )
+    #print "isdir = " + str(os.path.isdir(cwd))
+    
+    # Traverse all the good defs in the Parser directory
+    newpath = ""
+    if os.path.basename(cwd) == "Pyext":
+        newpath = os.path.join( os.path.dirname(cwd),"AParser/test/data/good_defs" )
+    
+    #print newpath
+    for path_to_defs_file in all_files(newpath, '*.def;*.txt'):
+        check_traversal(path_to_defs_file)
+        
+    # try the mega_def. Commented out since it takes to long
+    #mega_def = os.path.join( os.path.dirname(cwd), "AParser/test/data/single_defs/mega.def")
+    #check_traversal(mega_def)
+    print "All Tests pass"    
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestUserManual.py b/ecflow_4_0_7/Pyext/test/py_u_TestUserManual.py
new file mode 100644
index 0000000..7634df6
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestUserManual.py
@@ -0,0 +1,156 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# This code is used in the user manual 
+#
+
+from ecflow import Suite, Task, RepeatDate
+      
+if __name__ == "__main__":
+ 
+    class ExperimentalSuite(object):
+        def __init__(self, start, end) :
+            self.start_ = start
+            self.end_ = end
+            self.start_cycle_ = 12
+            self.end_cycle_ = 12
+            
+        def generate(self) :
+            x_suite = Suite("x")
+            make_fam = x_suite.add_family("make")
+            make_fam.add_task("build")
+            make_fam.add_task("more_work")
+            
+            main_fam = x_suite.add_family("main")
+            main_fam.add_repeat( RepeatDate("YMD",self.start_,self.end_) )
+            main_fam.add_trigger( "make == complete" )
+           
+            previous = 0
+            for FAM in ( 0, 6, 12, 18 ) :
+                fam_fam = x_suite.add_family(str(FAM))
+                if FAM > 0 :
+                    fam_fam.add_trigger( "./" + str(previous) + " == complete " )
+                   
+                self.add_complete(fam_fam,FAM)
+                
+                fam_fam.add_task("run")
+                fam_fam.add_task("run_more").add_trigger( "run == complete")
+                previous = FAM
+            return x_suite
+           
+        def add_complete(self, family, fam):
+            if fam < self.start_cycle_ and fam > self.end_cycle_ :
+                family.add_complete("../main:YMD eq " + str(self.start_) + " or ../main:YMD ge " + str(self.end_))  
+            elif fam < self.start_cycle_  :
+                family.add_complete("../main:YMD eq " + str(self.start_))            
+            elif fam > self.end_cycle_    :
+                family.add_complete("../main:YMD ge " + str(self.end_))
+            return
+ 
+    print str( ExperimentalSuite(20050601,20050605).generate() )
+   
+# ==========================================================================
+ 
+# Control structure and looping
+    var = "aa"
+    if var in ( "a", "aa", "aaa" ) :     print "it is a kind of a "
+    elif var in ( "b", "bb", "bb" ) :    print "it is a kind of b "
+    else :                               print "it is something else "
+   
+# ==========================================================================
+
+    task = Task("task")
+    the_time = 0
+    if the_time == 0 :
+        task.add_today(17, 30)
+        task.add_variable("ANTIME", str(the_time))
+    elif the_time == 6 :
+        task.add_today(17, 30)
+        task.add_variable("ANTIME", str(the_time))
+    elif the_time == 12 :
+        task.add_today(19, 15)
+        task.add_variable("ANTIME", str(the_time))
+    elif the_time == 18 :
+        task.add_time(1, 30)
+        task.add_variable("ANTIME", str(the_time))
+    elif the_time == 24 :
+        task.add_time(3, 0)
+        task.add_variable("ANTIME", "0")
+        task.add_variable("DELTA_DAY", "1")
+        task.add_variable("EXPVER", "0002")
+              
+# ====================================================================================
+
+    # Reuseable class for adding synoptic times
+    class VarAdder(object):
+        def __init__(self, node):
+            self.node = node
+          
+        def add(self, time):
+            {
+               6:  lambda  self : self.add6(time),
+               12: lambda  self : self.add12(time),
+               18: lambda  self : self.add18(time),
+               24: lambda  self : self.add24(time) 
+             }.get(time, self.errorHandler)(self)
+      
+        def add6(self, time):  
+            print "add6 " + str(time)
+            self.node.add_today(17, 30)
+            self.node.add_variable("ANTIME", str(time))
+
+        def add12(self, time):  
+            print "add12 " + str(time)
+            self.node.add_today(19, 15)
+            self.node.add_variable("ANTIME", str(time))
+
+        def add18(self, time):  
+            print "add18 " + str(time)
+            self.node.add_time(1, 30)
+            self.node.add_variable("ANTIME", str(time))
+
+        def add24(self, time):  
+            print "add24 " + str(time)
+            self.node.add_time(3, 0)
+            self.node.add_variable("ANTIME", "0")
+            self.node.add_variable("DELTA_DAY", "1")
+            self.node.add_variable("EXPVER", "0002")
+         
+        def errorHandler(self, ignore): print "invalid time " + str(ignore)
+
+#for i in (0, 6 ,12, 18, 24):
+for i in (0, 6):
+    task = Task("t" + str(i))
+    print task.name()
+    varAdder = VarAdder(task)
+    varAdder.add(114)
+    for var in task.variables: 
+        print str(var) + "\n"
+    for the_time in task.times : 
+        print str(the_time) + "\n"
+    for today in task.todays : 
+        print str(today) + "\n"
+         
+# ==========================================================================
+
+suite = Suite("x")
+previous_time = 0
+for i in (0,6,12,18,24) :
+    the_fam = suite.add_family(str(i))
+    if i != 0:
+        the_fam.add_trigger("./" + previous_time + " == complete ")
+    the_fam.add_task("t1")
+    the_fam.add_task("t2").add_trigger("t1 == complete")
+    previous_time = str(i)
+
+# print str(suite)
diff --git a/ecflow_4_0_7/Pyext/test/py_u_TestWith.py b/ecflow_4_0_7/Pyext/test/py_u_TestWith.py
new file mode 100644
index 0000000..7b8ff9f
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/test/py_u_TestWith.py
@@ -0,0 +1,79 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name        :
+# Author      : Avi
+# Revision    : $Revision: #10 $
+#
+# Copyright 2009-2012 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# code for testing with statement
+# In our case it provides the ability to indent
+
+from ecflow import Defs, Suite, Family, Client, debug_build
+import sys
+    
+if __name__ == "__main__":
+    print "####################################################################"
+    print "Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")"
+    print "####################################################################"
+ 
+    version = sys.version_info;
+    if  version[1] < 7 : 
+        print "This test only run with python version 2.7, but found : " + str(version)
+        exit(0)
+    
+    print "start test"
+    # Add with context manager, in our case this only provides ability to indent
+    with Defs() as defs:
+        with defs.add_suite("s2") as s2:
+            with s2.add_family("f1") as f1:
+                with f1.add_task("t1") as t1:
+                    assert len(list(f1.nodes)) == 1,"Expected 1 task"
+            s2.add_family("f2")
+            s2.add_task("t1")
+        assert len(list(s2.nodes)) == 3,"Expected 2 families and one task suite"
+    assert len(list(defs.suites)) == 1,"Expected 1 suite"
+#    print defs
+ 
+    with Suite("s2") as s2:
+        s2.add_family("f1")
+        s2.add_task("t1")
+        assert len(list(s2.nodes)) == 2,"Expected 2 nodes family and task"
+        
+    with Family("f1") as f1:
+        f1.add_family("f2")
+        f1.add_task("t1")
+        assert len(list(s2.nodes)) == 2,"Expected 2 nodes family and task"
+        
+        
+    #
+    # Add Nodes functional way
+    #
+    defs1 = Defs()
+    defs1.add_suite("s1").add_task("t1").add_variable("var","v")
+    defs1.add_suite("s2").add_family("f1").add_task("t1").add_variable("var","v")
+    defs1.add_suite("s3").add_family("f1").add_family("f2").add_task("t1").add_variable("var","v")
+    
+    # add node using with, they should compare
+    with Defs() as defs2:
+        with defs2.add_suite("s1") as s1:
+            t1 = s1.add_task("t1")
+            t1.add_variable("var","v")
+        with defs2.add_suite("s2") as s2:
+            with s2.add_family("f1") as f1:
+                with f1.add_task("t1") as t1:
+                    t1.add_variable("var","v")
+        with defs2.add_suite("s3") as s3:
+            with s3.add_family("f1") as f1:
+                with f1.add_family("f2") as f2: 
+                    with f2.add_task("t1") as t1: 
+                        t1.add_variable("var","v")
+                    
+    assert defs1 == defs2,"expected defs to be the same"        
+        
+    print "All tests pass"
\ No newline at end of file
diff --git a/ecflow_4_0_7/Pyext/unicode.py b/ecflow_4_0_7/Pyext/unicode.py
new file mode 100644
index 0000000..6c3c05c
--- /dev/null
+++ b/ecflow_4_0_7/Pyext/unicode.py
@@ -0,0 +1,7 @@
+# Determine the python unicode
+
+import sys
+if sys.maxunicode > 65535:
+    print 'UCS4 build'
+else:
+    print 'UCS2 build'
\ No newline at end of file
diff --git a/ecflow_4_0_7/README b/ecflow_4_0_7/README
new file mode 100644
index 0000000..4fb55f9
--- /dev/null
+++ b/ecflow_4_0_7/README
@@ -0,0 +1,157 @@
+===========
+**Install**
+===========
+ 
+* dependencies
+
+   * | python 2.7,  Python 3.0 not tested. 
+     | If you intend to use ecFlow Python api, You will need to install python.
+     | If python installed in non standard installation, you may need to
+     | customise $BOOST_ROOT/tools/build/v2/site-config.jam
+     | The python installation should include the development packages
+     
+   * Xlib, X11, XMotif for :term:`ecflowview`. Do *not* use Lesstif library
+     to compile ecflowview as a replacement for Motif. OpenMotif can be 
+     downloaded from http://www.ist.co.uk/downloads/motif_download.html
+     
+   * optionally cmake
+
+* ecfFlow consists of two tar files i.e. :
+   
+   * :file:`boost_1_53_0.tar.gz`
+   * :file:`ecflow_4_0_7.tar.gz`
+   
+* Create a directory for the build::
+
+   > mkdir /tmp/ecflow_build
+   
+* Copy the the two tar file into this directory, then change directory to :file:`/tmp/ecflow_build`
+   
+* Un-zip then un-tar the two file files::
+
+   # gunzip boost_1_53_0.tar.gz
+   # gunzip ecflow_4_0_7.tar.gz
+   # tar -xf boost_1_53_0.tar
+   # tar -xf ecflow_4_0_7.tar
+   
+* You should have three directories created::
+
+   boost_1_53_0
+   ecflow_4_0_7
+   ecbuild
+   
+* Create two environment variables. These are used by some of scripts::
+
+   > export WK=/tmp/ecflow_build/ecflow_4_0_7
+   > export BOOST_ROOT=/tmp/ecflow_build/boost_1_53_0
+   
+   
+* There are two ways of building ecflow, boost-build/bjam or cmake/ecbuild
+
+
+cmake/ecbuild
+=====================================================================
+
+* run $WK/configure.sh , just specify the install prefix
+
+  # ./configure.sh /usr/local/apps/ecflow
+  # make
+  # make install
+  
+
+boost/bjam
+=====================================================================
+* | For installation the following environment variables are required.
+  
+  ::
+  
+      ECFLOW_INSTALL_DIR         # Directory Location for client ,server and gui program's
+      ECFLOW_PYTHON_INSTALL_DIR  # Directory Location for ecflow python package
+    
+  The python installation can be customised, by changing Pyext/jamfile.jam and site-config.jam
+   
+* | Boost uses bjam for build.  ecFlow also uses bjam for build and installation
+  | bjam source is available in boost, hence we first need to build bjam itself
+
+  ::
+  
+  > cd $BOOST_ROOT
+  > ./bootstrap.sh
+  
+  Now make sure bjam is accessible from $PATH
+
+* | Ecflow uses some of compiled libraries in boost. The following script
+  | will build the required lib's, in both debug and release forms
+  | and will configure boost build according to your platform
+  
+  ::
+  
+   > cd $BOOST_ROOT
+   > $WK/build/boost_1_53_fix.sh    # fix for boost, only for some platforms
+   > $WK/build/boost_build.sh       # compile boost libs used by ecFlow
+  
+* We now need to build ecFlow. Currently ecflowview is only built if 
+  environment variable of name ARCH is set to linux::
+  
+   > cd $WK
+   > bjam variant=release install-all
+  
+  | On some systems like fedora/redhat you may run into compiler errors
+  | which complain about the template depth being exceeded.
+  | In this case compile using:
+  
+  ::
+  
+   > cd $WK
+   > bjam c++-template-depth=512 variant=release install-all
+  
+  | If you have a multi-core machine, you can speed up the build using:
+  | the -j<n> option. Where 'n' is an integer, of the number of cores.
+  
+  ::
+  
+      bjam variant=release -j4
+  
+  
+* | Once ecFlow is built it can be installed. 
+   
+  ::
+  
+      bjam variant=release install-all
+      
+  This will create directories::
+  
+  <ECFLOW_INSTALL_DIR>/bin
+  <ECFLOW_INSTALL_DIR>/lib
+  <ECFLOW_INSTALL_DIR>/doc
+  <ECFLOW_PYTHON_INSTALL_DIR> 
+      
+  Depending on your umask setting you may need to call chmod 755 on the executables  
+      
+     
+* | To use the :ref:`python_api`, you need to add/change 
+  | PYTHONPATH and LD_LIBRARY_PATH
+  
+  ::
+  
+      export PYTHONPATH=$PYTHONPATH:$ECFLOW_PYTHON_INSTALL_DIR
+      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ECFLOW_PYTHON_INSTALL_DIR
+  
+* When compiling ecflowview in a system where motif is not installed in the
+  usual location, or where both motif and lesstif are installed, it is possible
+  to export the environment variables MOTIF_INCLUDE and MOTIF_LIBRARY to help
+  bjam to find the right location for include files and libraries.
+
+  Openmotif may be retrieve from IST server and installed locally:
+  wget http://www.ist-inc.com/motif/download/motif_files/openmotif-2.1.32-2_IST.x86_64.rpm
+  rpm2cpio openmotif-2.1.32-2_IST.x86_64.rpm | cpio -idmv 
+
+  user shall then compile setting MOTIF_INCLUDE and MOTIF_LIBRARY variable.
+
+..  ecflowview shall be started setting LD_LIBRARY_PATH=${MOTIF_LIBRARY}:$LD_LIBRARY_PATH
+
+* ECFLOWVIEW_HOME shell variable may be set to link ecflowview to the directory
+  where to find 'servers' and 'ecflowview.menu' files
+
+* ECFLOWRC variable may be set to use alternative directory for user
+  ecflowview option files (default is $HOME/.ecflowrc)
diff --git a/ecflow_4_0_7/Server/CMakeLists.txt b/ecflow_4_0_7/Server/CMakeLists.txt
new file mode 100644
index 0000000..517c655
--- /dev/null
+++ b/ecflow_4_0_7/Server/CMakeLists.txt
@@ -0,0 +1,80 @@
+ # =======================================================
+ # LIB
+ # to list all sources to build use:
+ #    cd $WK/Server
+ #    find src -name \*.cpp  -print | sort
+ # =======================================================
+list( APPEND srcs
+   src/CConnection.cpp
+   src/CheckPtSaver.cpp
+   src/NodeTreeTraverser.cpp
+   src/Server.cpp
+   src/ServerEnvironment.cpp
+   src/ServerOptions.cpp
+)
+ecbuild_add_library( TARGET libserver
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     LIBS     base libparser node nodeattr core
+                              pthread
+                     INCLUDES src
+                              ../ACore/src 
+                              ../ANattr/src
+                              ../ANode/src
+                              ../AParser/src
+                              ../Base/src
+                              ../Base/src/cts
+                              ../Base/src/stc
+                     )
+
+# This ensures that for debug config, we only link with debug boost libs, for other configs, we link with optimised boost libs
+target_link_libraries(libserver debug ${Boost_THREAD_LIBRARY_DEBUG} ${Boost_THREAD_LIBRARY_RELEASE})
+
+# =======================================================
+# EXE ecflow_server
+
+ecbuild_add_executable( TARGET   ecflow_server
+                        SOURCES  src/ServerMain.cpp
+                        LIBS     libserver    
+                        INCLUDES ${Boost_INCLUDE_DIRS} 
+                       )
+
+# Override default behaviour that add RPATHS during install
+# The only thing that seem to work is set INSTALL_RPATH to ""
+# Using SKIP_BUILD_RPATH,BUILD_WITH_INSTALL_RPATH,INSTALL_RPATH_USE_LINK_PATH
+# had no effect
+#          
+SET_TARGET_PROPERTIES(ecflow_server PROPERTIES 
+                                    INSTALL_RPATH ""
+                     )
+                         
+# use, i.e. don't skip the full RPATH for the build tree
+#SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
+
+# when building, don't use the install RPATH already
+# (but later on when installing)
+#SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
+
+# the RPATH to be used when installing
+#SET(CMAKE_INSTALL_RPATH "")
+
+# don't add the automatically determined parts of the RPATH
+# which point to directories outside the build tree to the install RPATH
+#SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
+
+                          
+# ================================================================================                         
+# TEST
+ecbuild_add_test( TARGET       u_server
+                  BOOST  
+                  SOURCES      test/TestServerEnvironment.cpp 
+                               test/TestServer1.cpp
+                  LIBS         libserver  
+                  TEST_DEPENDS u_base
+              )
+
+# ===================================================================
+# install
+# ===================================================================
+install (TARGETS ecflow_server DESTINATION bin)
diff --git a/ecflow_4_0_7/Server/Jamfile.jam b/ecflow_4_0_7/Server/Jamfile.jam
new file mode 100644
index 0000000..adcfdd3
--- /dev/null
+++ b/ecflow_4_0_7/Server/Jamfile.jam
@@ -0,0 +1,93 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# Server
+#
+project theServer ;
+
+#
+# IMPORTANT: server *MUST* not link with client or include any of the client code
+#
+use-project theCore     : ../ACore ;
+use-project theNodeAttr : ../ANattr ;
+use-project theNode     : ../ANode ;
+use-project theBase     : ../Base ;
+use-project theParser   : ../AParser ;
+
+lib pthread ;
+
+#
+# Split into library, so that testing can use library, and hence same compiler option
+#
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+
+#
+# Note: boost_thread is *ONLY* needed to test multi-threaded server, i.e when ECFLOW_MT defined
+#
+lib libserver : [ glob src/*.cpp : src/*Main.cpp ]
+              : <include>../ACore/src
+                <include>../ANattr/src 
+                <include>../ANode/src 
+                <include>../AParser/src 
+                <include>../Base/src 
+                <include>../Server/src
+                <variant>debug:<define>DEBUG
+                <link>static
+                <use>/theCore//core
+                <use>/theNode//node
+                <use>/theBase//base
+                <use>/theParser//libparser
+                <use>/site-config//boost_system
+                <use>/site-config//boost_thread
+                <use>/site-config//boost_serialization
+                <use>/site-config//boost_filesystem
+                <use>/site-config//boost_program_options
+                <use>/site-config//boost_datetime
+              :  
+              : <include>../Server/src         
+              ;
+               
+exe ecflow_server : [ glob src/*Main.cpp ]
+            pthread
+             /theCore//core
+             /theNodeAttr//nodeattr
+             /theNode//node
+             /theParser//libparser
+             /theBase//base
+             libserver
+             /site-config//boost_system
+             /site-config//boost_thread
+             /site-config//boost_serialization
+             /site-config//boost_filesystem
+             /site-config//boost_datetime
+             /site-config//boost_program_options
+           : <variant>debug:<define>DEBUG
+           ;
+
+#
+# Test for server
+# IMPORTANT: server *MUST* not link with client or include any of the client code
+#
+exe u_server : [ glob test/*.cpp ]
+            pthread
+             /theCore//core
+             /theNodeAttr//nodeattr
+             /theNode//node
+             /theParser//libparser
+             /theBase//base
+             libserver
+             /site-config//boost_system
+             /site-config//boost_thread
+             /site-config//boost_serialization
+             /site-config//boost_filesystem
+             /site-config//boost_datetime
+             /site-config//boost_program_options
+             /site-config//boost_test
+           : <variant>debug:<define>DEBUG
+           ;
diff --git a/ecflow_4_0_7/Server/server_environment.cfg b/ecflow_4_0_7/Server/server_environment.cfg
new file mode 100644
index 0000000..be8e578
--- /dev/null
+++ b/ecflow_4_0_7/Server/server_environment.cfg
@@ -0,0 +1,153 @@
+## Copyright 2009-2014 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# This file is used to define the standard defaults for ECF.
+# Most are *variables* used in the server
+# Some like ECF_TASK_THRESHOLD are used to debug job generation
+ 
+# ******************************************************************
+# Warning: Do *NOT* use quotes around the value part.
+#   WRONG: ECF_MICRODEF = "%"
+#   RIGHT: ECF_MICRODEF = %
+# ******************************************************************
+
+#  *******************************************************************
+#  * ECF_HOME is typically the home/root for all '.ecf' files
+#  * Can be overridden with a environment variable of the same name
+#  *******************************************************************
+ECF_HOME  = .
+
+
+#  ******************************************************************
+#  * The name of check point file. i.e defs file with state
+#  * Can be overridden with a environment variable of the same name
+#  * default: is <host>.<port>.ecf.check
+#  * Note: Any settings will be prepended with <host>.<port>.
+#  ******************************************************************
+ECF_CHECK = ecf.check
+
+
+#  ******************************************************************
+#  * The name of the backup checkpoint file
+#  * Can be overridden with a environment variable of the same name
+#  * default: is <host>.<port>.ecf.check.b
+#  * Note: Any settings will be prepended with <host>.<port>.
+#  ******************************************************************
+ECF_CHECKOLD = ecf.check.b
+
+
+#  ******************************************************************
+#  * The intervals within the server that the checkpoint file should 
+#  * be saved.
+#  * Can be overridden with a environment variable of the same name
+#  ******************************************************************
+ECF_CHECKINTERVAL = 120  
+
+
+#  ******************************************************************
+#  * Check point configuration:
+#  * 
+#  * Mode must be one of: 
+#  *   CHECK_NEVER    /* No auto checkpointing                       */
+#  *   CHECK_ON_TIME  /* At intervals specified by ECF_CHECKINTERVAL */
+#  *   CHECK_ALWAYS   /* After any change                            */
+#  * The checkpoint filenames can be configured using environment variables
+#  ******************************************************************
+ECF_CHECKMODE = CHECK_ON_TIME
+
+
+#  ******************************************************************
+#  * The port number, this must be consistent between client and server
+#  * If we get "Address in use" then both client/server number should changed.
+#  * Also if two servers are started on the same machine with same port
+#  * then we will also get "Address in use" error and server will bomb out.
+#  * Can be overridden with a environment variable of the same name
+#  ******************************************************************
+ECF_PORT = 3141
+
+
+#  ******************************************************************
+#  * The name of log file.
+#  * default log file name is: <host>.<port>.ecf.log, i.e machine1.3141.ecf.log
+#  * this is required since we can have multiple servers for a single
+#  * machine, where each server will have a separate port number.
+#  * Can be overridden with a environment variable of the same name
+#  *
+#  * Note: Any settings will be prepended with <host>.<port>.
+#  ******************************************************************
+ECF_LOG = ecf.log
+ 
+ 
+#  ******************************************************************
+#  * The period in second for which we should traverse dependencies
+#  * and submit jobs. This should rarely need changing, as it can affect
+#  * correspondence with real time
+#  ******************************************************************
+ECF_INTERVAL = 60       
+ 
+
+#  ******************************************************************
+#  * The standard command use for job submission. 
+#  * Provides DEFAULT can be overridden by user variable
+#  ******************************************************************
+ECF_JOB_CMD = %ECF_JOB% 1> %ECF_JOBOUT% 2>&1
+
+
+#  ******************************************************************
+#  * Define variable for killing any jobs. 
+#  * Provides DEFAULT can be overridden by user variable
+#  * The output of the command should be written to %ECF_JOB%.kill
+#  * ecmwf: ${ECF_KILL:=/home/ma/emos/bin/ecfkill} %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.kill 2>&1
+#  ******************************************************************
+ECF_KILL_CMD = kill -15 %ECF_RID%  
+
+
+#  ******************************************************************
+#  * define variable of obtaining status. 
+#  * Provides DEFAULT can be overridden by user variable
+#  * The output of the command should be written to %ECF_JOB%.stat
+#  * ecmwf: ${ECF_STAT:=/home/ma/emos/bin/ecfstatus} %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.stat 2>&1
+#  ******************************************************************
+ECF_STATUS_CMD = ps --sid %ECF_RID% -f 
+ 
+
+#  ******************************************************************
+#  * define variables used for url command. 
+#  * Provides DEFAULT can be overriden by user variables
+#  ******************************************************************
+ECF_URL_CMD    = ${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'
+ECF_URL_BASE   = https://software.ecmwf.int
+ECF_URL        = wiki/display/ECFLOW/Home
+
+#  ******************************************************************
+#  * Defines the character used in ECF_ pre-processing. i.e identifies includes
+#  * and is also used in variable substitution in '.ecf' scripts
+#  ******************************************************************
+ECF_MICRODEF = %
+
+#  ******************************************************************
+#  * The ECF_LISTS is used to identify a file, that lists the user 
+#  * who can access the server via client commands. Each client command 
+#  * (ignoring task based commands, i.e init, complete, event, meter, label)
+#  * will encode the user name of the process initiating the client request
+#  * This is then compared with list of users in the ecf.lists file.
+#  * If this file is empty, then no authentication is done
+#  * Each server can potionally have a different list.
+#  * default: <host>.<port>.ecf.lists
+#  * Note: Any settings will be prepended with <host>.<port>.
+#  ******************************************************************
+ECF_LISTS = ecf.lists
+
+
+# ***************************************************************************
+# * ECF_TASK_THRESHOLD:
+# * Report on an task taking longer than the threshold. !!
+# *    export ECF_TASK_THRESHOLD=4000
+# ***************************************************************************
+ECF_TASK_THRESHOLD = 4000         
+         
\ No newline at end of file
diff --git a/ecflow_4_0_7/Server/src/CConnection.cpp b/ecflow_4_0_7/Server/src/CConnection.cpp
new file mode 100644
index 0000000..5777005
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/CConnection.cpp
@@ -0,0 +1,237 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : ONLY used if ECFLOW_MT is defined
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#ifdef ECFLOW_MT
+#if defined(HPUX)
+#include <sys/select.h> // hp-ux uses pselect
+#endif
+
+#include <boost/thread/thread.hpp>
+#include <boost/bind.hpp>
+
+#include "CConnection.hpp"
+#include "Log.hpp"
+#include <vector>
+
+#include "Log.hpp"
+#include "Serialization.hpp"
+#include "Server.hpp"
+
+using namespace std;
+using namespace ecf;
+
+CConnection::CConnection(boost::asio::io_service& io_service,server* server)
+  : socket_(io_service),
+    server_(server)
+{
+}
+
+boost::asio::ip::tcp::socket& CConnection::socket()
+{
+  return socket_;
+}
+
+void CConnection::start()
+{
+   //cout << boost::this_thread::get_id() << " CConnection::start()\n";
+   boost::asio::async_read(socket_, boost::asio::buffer(inbound_header_),
+                           server_->strand_.wrap(
+                                    boost::bind(&CConnection::handle_read_header,
+                                                shared_from_this(),
+                                                boost::asio::placeholders::error)));
+}
+
+void CConnection::handle_read_header(const boost::system::error_code& e)
+{
+   //cout << boost::this_thread::get_id() << " CConnection::handle_read_header\n";
+   if (e) {
+      LogToCout toCoutAsWell;
+      LOG(Log::ERR, "   CConnection::handle_read_header error occurred  " <<  e.message());
+   }
+   else {
+      // Determine the length of the serialized data.
+      std::istringstream is(std::string(inbound_header_, header_length));
+      std::size_t inbound_data_size = 0;
+      if (!(is >> std::hex >> inbound_data_size)) {
+
+         // Header doesn't seem to be valid. Inform the caller.
+         boost::system::error_code error(boost::asio::error::invalid_argument);
+         LogToCout toCoutAsWell;
+         LOG(Log::ERR, "   CConnection::handle_read_header error occurred  " <<  e.message());
+         return;
+      }
+
+      // Start an asynchronous call to receive the data.
+      inbound_data_.resize(inbound_data_size);
+      boost::asio::async_read(socket_,boost::asio::buffer(inbound_data_),
+                              server_->strand_.wrap(
+                                       boost::bind(&CConnection::handle_read_data,
+                                                   shared_from_this(),
+                                                   boost::asio::placeholders::error)));
+   }
+}
+
+void CConnection::handle_read_data(const boost::system::error_code& e)
+{
+   //cout << boost::this_thread::get_id() << " CConnection::handle_read_data\n";
+   if (e) {
+      LogToCout toCoutAsWell;
+      LOG(Log::ERR, "   CConnection::handle_read_data error occurred  " << e.message());
+      return;
+   }
+
+   // Extract the data structure from the data just received.
+   try {
+      std::string archive_data(&inbound_data_[0], inbound_data_.size());
+      ecf::restore_from_string(archive_data,inbound_request_);
+   }
+   catch (const boost::archive::archive_exception& ae ) {
+      // Unable to decode data.
+      ecf::LogToCout logToCout;
+      LOG(ecf::Log::ERR,"CConnection::handle_read_data boost::archive::archive_exception " << ae.what());
+      return;
+   }
+   catch (std::exception& ) {
+      // Unable to decode data.
+      ecf::LogToCout logToCout;
+      LOG(ecf::Log::ERR,"CConnection::handle_read_data Unable to decode data");
+      return;
+   }
+
+
+   // See what kind of message we got from the client
+   // std::cout << boost::this_thread::get_id() << "   server::handle_read : client request " << inbound_request_ << "\n";
+   try {
+      // Service the in bound request, handling the request will populate the outbound_response_
+      // Note:: Handle request will first authenticate
+      outbound_response_.set_cmd( inbound_request_.handleRequest( server_ ) );
+   }
+   catch (exception& ex) {
+      outbound_response_.set_cmd( PreAllocatedReply::error_cmd( ex.what()  ));
+   }
+
+   // To improve performance, when the reply, is OK, don't bother replying back to the client
+   // The client will receive a EOF, and perceive this as OK.
+   // Need to specifically *ignore* for terminate, otherwise server will not shutdown cleanly
+   if (!inbound_request_.terminateRequest() && outbound_response_.get_cmd()->isOkCmd()) {
+      // cleanly close down the connection
+      socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
+      socket_.close();
+      return;
+   }
+
+   reply_back_to_client();
+}
+
+void CConnection::reply_back_to_client()
+{
+#ifdef DEBUG_CONNECTION
+      std::cout << "CConnection::reply_back_to_client, Serialise the data first so we know how large it is\n";
+#endif
+      // Serialise the data first so we know how large it is.
+      try {
+         ecf::save_as_string(outbound_data_,outbound_response_);
+      } catch (const boost::archive::archive_exception& ae ) {
+         // Unable to decode data. Something went wrong, inform the caller.
+         ecf::LogToCout logToCout;
+         LOG(ecf::Log::ERR,"Connection::async_write boost::archive::archive_exception " << ae.what());
+         return;
+      }
+
+      // Format the header.
+      std::ostringstream header_stream;
+      header_stream << std::setw(header_length) << std::hex << outbound_data_.size();
+      if (!header_stream || header_stream.str().size() != header_length) {
+         // Something went wrong, inform the caller.
+         ecf::LogToCout logToCout;
+         LOG(ecf::Log::ERR,"CConnection::reply_back_to_client: could not format header");
+         return;
+      }
+      outbound_header_ = header_stream.str();
+
+
+#ifdef DEBUG_CONNECTION
+      std::cout << "Connection::async_write Write the serialized data to the socket. \n";
+#endif
+      // Write the serialized data to the socket. We use "gather-write" to send
+      // both the header and the data in a single write operation.
+      std::vector<boost::asio::const_buffer> buffers; buffers.reserve(2);
+      buffers.push_back(boost::asio::buffer(outbound_header_));
+      buffers.push_back(boost::asio::buffer(outbound_data_));
+      boost::asio::async_write(socket_, buffers,
+                               server_->strand_.wrap(
+                                        boost::bind(&CConnection::handle_write, shared_from_this(),
+                                                    boost::asio::placeholders::error)));
+
+#ifdef DEBUG_CONNECTION
+      std::cout << "Connection::async_write END \n";
+#endif
+
+  // If an error occurs then no new asynchronous operations are started. This
+  // means that all shared_ptr references to the CConnection object will
+  // disappear and the object will be destroyed automatically after this
+  // handler returns. The CConnection class's destructor closes the socket.
+}
+
+void CConnection::handle_write(const boost::system::error_code& e)
+{
+  // Handle completion of a write operation.
+  // Nothing to do. The socket will be closed automatically when the last
+  // reference to the connection object goes away.
+  //cout << boost::this_thread::get_id() << "   server::handle_write: client request " << inbound_request_ << " replying with  " << outbound_response_ << "\n";
+
+  if (e)
+  {
+     ecf::LogToCout logToCout;
+     LOG(ecf::Log::ERR,"Connection::handle_write: " << e.message());
+
+     // No new asynchronous operations are started. This means that all shared_ptr
+     // references to the CConnection object will disappear and the object will be
+     // destroyed automatically after this handler returns. The CConnection class's
+     // destructor closes the socket.
+     return;
+   }
+
+
+  // Initiate graceful connection closure.
+  // For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.
+  // This *CAN* throw an error if the client side socket is not connected. client may have been killed.
+  // i.e "shutdown: Transport endpoint is not connected"
+  boost::system::error_code ec;
+  socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
+  if (ec) {
+     ecf::LogToCout logToCout;
+     LOG(Log::ERR,"server::handle_write: socket shutdown both failed: " << ec.message());
+  }
+
+
+  // If asked to terminate we do it here rather than in handle_read.
+  // So that we have responded to the client.
+  // *HOWEVER* only do this if the request was successful.
+  //           we do this by checking that the out bound response was ok
+  //           i.e a read only user should not be allowed to terminate server.
+  if (inbound_request_.terminateRequest() && outbound_response_.get_cmd()->isOkCmd()) {
+     // cout << "   <--server::handle_write exiting server via terminate() port " << endl;
+
+     server_->terminate();
+  }
+
+  // No new asynchronous operations are started. This means that all shared_ptr
+  // references to the CConnection object will disappear and the object will be
+  // destroyed automatically after this handler returns. The CConnection class's
+  // destructor closes the socket.
+}
+#endif
diff --git a/ecflow_4_0_7/Server/src/CConnection.hpp b/ecflow_4_0_7/Server/src/CConnection.hpp
new file mode 100644
index 0000000..8d9fb03
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/CConnection.hpp
@@ -0,0 +1,74 @@
+#ifndef CCONNECTION_HPP
+#define CCONNECTION_HPP
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : ONLY used if ECFLOW_MT is defined
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/asio.hpp>
+#include <boost/array.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#include "ClientToServerRequest.hpp"
+#include "ServerToClientResponse.hpp"
+
+class server;
+
+/// Represents a single connection from a client.
+class CConnection : public boost::enable_shared_from_this<CConnection>, private boost::noncopyable {
+public:
+   /// Construct a connection with the given io_service.
+   explicit CConnection( boost::asio::io_service& io_service, server* );
+
+   /// Get the socket associated with the connection.
+   boost::asio::ip::tcp::socket& socket();
+
+   /// Start the first asynchronous operation for the connection.
+   void start();
+
+private:
+   /// Handle completion of a read operation.
+   void handle_read( const boost::system::error_code& e, std::size_t bytes_transferred );
+
+   void handle_read_data(const boost::system::error_code& e);
+   void handle_read_header(const boost::system::error_code& e);
+   void reply_back_to_client();
+
+   /// Handle completion of a write operation.
+   void handle_write( const boost::system::error_code& e );
+
+private:
+   /// Socket for the connection.
+   boost::asio::ip::tcp::socket socket_;
+
+   /// Strand to ensure the connection's handlers are not called concurrently.
+   server* server_;
+
+   /// The data, typically loaded once, and then sent to many clients
+   ClientToServerRequest inbound_request_;     /// The incoming request.
+   ServerToClientResponse outbound_response_;   /// The reply to be sent back to the client.
+
+
+   std::string outbound_header_;        /// Holds an out-bound header.
+   std::string outbound_data_;          /// Holds the out-bound data.
+   enum { header_length = 8 };          /// The size of a fixed length header.
+   char inbound_header_[header_length]; /// Holds an in-bound header.
+   std::vector<char> inbound_data_;     /// Holds the in-bound data.
+};
+
+typedef boost::shared_ptr<CConnection> CConnection_ptr;
+
+#endif
diff --git a/ecflow_4_0_7/Server/src/CheckPtSaver.cpp b/ecflow_4_0_7/Server/src/CheckPtSaver.cpp
new file mode 100644
index 0000000..b856430
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/CheckPtSaver.cpp
@@ -0,0 +1,243 @@
+//============================================================================
+// Name        : CheckPtSaver.cpp
+// Author      : Avi
+// Revision    : $Revision: #43 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <fstream>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include "boost/bind.hpp"
+
+#include "CheckPtSaver.hpp"
+#include "Server.hpp"
+#include "ServerEnvironment.hpp"
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "DurationTimer.hpp"
+#include "CtsApi.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "File.hpp"
+
+//#define DEBUG_CHECKPT 1
+//#define DEBUG_CHECKPT_SAVE_ALLOWED 1
+
+#ifdef DEBUG_CHECKPT
+#include <boost/date_time/posix_time/time_formatters.hpp>  // requires boost date and time lib, for to_simple_string
+#endif
+
+namespace fs = boost::filesystem;
+using namespace ecf;
+
+
+//-------------------------------------------------------------------------------------
+CheckPtSaver::CheckPtSaver(
+         Server* s,
+         boost::asio::io_service& io,
+         const ServerEnvironment* serverEnv )
+: server_( s ),
+  timer_( io, boost::posix_time::seconds( 0 ) ),
+  firstTime_(true),
+  running_(false),
+  serverEnv_(serverEnv),
+  state_change_no_(Ecf::state_change_no()),
+  modify_change_no_(Ecf::modify_change_no())
+{
+#ifdef DEBUG_CHECKPT
+	std::cout << "      CheckPtSaver::CheckPtSaver period = " << serverEnv_->checkPtInterval() << "\n";
+#endif
+}
+
+CheckPtSaver::~CheckPtSaver() {
+#ifdef DEBUG_CHECKPT
+	std::cout << "      ~CheckPtSaver::CheckPtSaver\n";
+#endif
+}
+
+void CheckPtSaver::start()
+{
+#ifdef DEBUG_CHECKPT
+	std::cout << "      CheckPtSaver::start() check_mode: "
+	          << serverEnv_->check_mode_str() << " interval = " << serverEnv_->checkPtInterval()
+	          << " time = " << to_simple_string(boost::posix_time::second_clock::universal_time()) << "\n";
+#endif
+
+	// Only save check pt periodically if configuration allows it
+	if (serverEnv_->checkMode() != ecf::CheckPt::ON_TIME ) {
+#ifdef DEBUG_CHECKPT
+		std::cout << "      CheckPtSaver::start() aborted as configuration does not allow it" << std::endl;
+#endif
+		return;
+	}
+
+	running_ = true;
+
+	// * important * The time should only be started *ONCE*. Otherwise we will end up with
+	//               with explicit save each time server is halted/started.
+	if (firstTime_) {
+	   firstTime_ = false;
+	   timer_.expires_from_now(  boost::posix_time::seconds( serverEnv_->checkPtInterval() ) );
+#ifdef ECFLOW_MT
+	   timer_.async_wait( server_->strand_.wrap( boost::bind( &CheckPtSaver::periodicSaveCheckPt,this,boost::asio::placeholders::error ) ) );
+#else
+	   timer_.async_wait( server_->io_service_.wrap( boost::bind( &CheckPtSaver::periodicSaveCheckPt,this,boost::asio::placeholders::error ) ) );
+#endif
+	}
+}
+
+void CheckPtSaver::stop()
+{ // The server is stopped by cancelling all outstanding asynchronous
+   // operations. Once all operations have finished the io_service::run() call
+   // will exit.
+#ifdef DEBUG_CHECKPT
+	std::cout << "      CheckPtSaver::stop() check_mode: " << serverEnv_->check_mode_str() <<  " interval = " << serverEnv_->checkPtInterval() << "\n";
+#endif
+ 	running_ = false;
+}
+
+void CheckPtSaver::terminate()
+{
+   timer_.cancel();
+}
+
+
+void CheckPtSaver::explicitSave(bool from_server) const
+{
+	if ( server_->defs_ ) {
+
+		try {
+#ifdef DEBUG_CHECKPT
+			std::cout << "      CheckPtSaver::explicitSave() Saving checkpt file " << serverEnv_->checkPtFilename() << "\n";
+#endif
+			// Time how long we take to checkpt, Help to recognise *SLOW* disk, which can *AFFECT* server performance
+			DurationTimer durationTimer;
+
+			// Backup checkpoint file if it exists & is non zero
+			// Avoid an empty file as a backup file, could results from a full file system
+			// i.e move ecf_checkpt_file --> ecf_backup_checkpt_file
+			fs::path checkPtFile(serverEnv_->checkPtFilename());
+			if (fs::exists(checkPtFile) && fs::file_size(checkPtFile) != 0) {
+
+				fs::path oldCheckPtFile(serverEnv_->oldCheckPtFilename());
+				fs::remove(oldCheckPtFile);
+				fs::rename( checkPtFile, oldCheckPtFile );
+			}
+
+			// write to ecf_checkpt_file, if file system is full this could result in an empty file. ?
+			//
+			// To optimise check pointing, we minimise system calls, i.e we can write check point as a string,
+			// and save string to a file with a single write. This is faster than calling:
+			//    server_->defs_->save_as_checkpt( serverEnv_->checkPtFilename() );
+			// This solution however does require *MORE* memory.
+			std::string checkpt_as_string,error_msg;
+			server_->defs_->save_checkpt_as_string(checkpt_as_string);
+			if (!File::create(serverEnv_->checkPtFilename(),checkpt_as_string,error_msg)) {
+            throw std::runtime_error(error_msg);
+			}
+
+			state_change_no_ = Ecf::state_change_no();    // For periodic update only save checkPt if it has changed
+			modify_change_no_ = Ecf::modify_change_no();  // For periodic update only save checkPt if it has changed
+
+
+         if (from_server) {
+            // Create new time stamp otherwise we end up using the time stamp from the last command
+            if (Log::instance()) Log::instance()->cache_time_stamp();
+            std::string msg = Str::SVR_CMD(); msg += CtsApi::checkPtDefsArg();
+            std::stringstream ss; ss << msg << " in " << durationTimer.duration() << " seconds";
+            log(Log::MSG,ss.str());
+         }
+
+         /// If Save take longer than checkpt_save_time_alarm, then set a flag on server
+         /// So that user can be aware of it.
+         if (static_cast<size_t>(durationTimer.duration()) > server_->serverEnv_.checkpt_save_time_alarm() ) {
+            server_->defs_->flag().set(ecf::Flag::LATE);
+            std::stringstream ss;
+            ss << "Check pt save time(" << durationTimer.duration() << ") is greater than alarm time("
+               << server_->serverEnv_.checkpt_save_time_alarm() << "). Excessive save times can interfere with scheduling!";
+            log(Log::WAR,ss.str());
+         }
+#ifdef DEBUG_CHECKPT
+			std::cout << " backup and save took " <<  durationTimer.duration() << " seconds\n";
+#endif
+		}
+		catch (std::exception& e) {
+	 		LOG(Log::ERR,"Could not save checkPoint file! " << e.what() << " File system full?");
+	 	}
+	}
+	else {
+#ifdef DEBUG_CHECKPT
+		std::cout << "      CheckPtSaver::explicitSave() Node tree not loaded, can not save check pt file\n";
+#endif
+	}
+}
+
+void CheckPtSaver::periodicSaveCheckPt(const boost::system::error_code& error )
+{
+#ifdef DEBUG_CHECKPT
+      std::cout << "      CheckPtSaver::periodicSaveCheckPt() interval = " << serverEnv_->checkPtInterval() << "  time: " << to_simple_string(boost::posix_time::second_clock::universal_time()) << "\n";
+#endif
+   if (error == boost::asio::error::operation_aborted) {
+#ifdef DEBUG_CHECKPT
+   std::cout << "      CheckPtSaver::periodicSaveCheckPt : boost::asio::error::operation_aborted : time cancelled: Node running(" << running_ << ")  interval = " << serverEnv_->checkPtInterval() << "\n";
+#endif
+      return;
+   }
+   else if (error) {
+      LogToCout toCoutAsWell;
+      LOG(Log::ERR, "CheckPtSaver::periodicSaveCheckPt "  <<  error.message());
+      return;
+   }
+
+	if (running_) {
+	   // state changed
+	   if (state_change_no_  != Ecf::state_change_no() || modify_change_no_ != Ecf::modify_change_no()) {
+	      doSave();
+	   }
+	}
+
+ 	/// Appears that expires_from_now is more accurate then expires_at
+	timer_.expires_from_now(  boost::posix_time::seconds( serverEnv_->checkPtInterval() ) );
+#ifdef ECFLOW_MT
+   timer_.async_wait( server_->strand_.wrap( boost::bind( &CheckPtSaver::periodicSaveCheckPt,this,boost::asio::placeholders::error ) ) );
+#else
+   timer_.async_wait( server_->io_service_.wrap( boost::bind( &CheckPtSaver::periodicSaveCheckPt,this,boost::asio::placeholders::error ) ) );
+#endif
+}
+
+
+void CheckPtSaver::doSave() const
+{
+#ifdef DEBUG_CHECKPT
+		std::cout << "      CheckPtSaver::doSave()\n";
+#endif
+	// Check to see if configuration allows save
+	if (serverEnv_->checkMode() == ecf::CheckPt::NEVER ) {
+#ifdef DEBUG_CHECKPT
+		std::cout << "     CheckPtSaver::doSave() configuration does not allow save \n";
+#endif
+		return;
+	}
+	explicitSave(true/* from the server, hence log */);
+}
+
+void CheckPtSaver::saveIfAllowed()
+{
+	// Call on each state change. Hence will get many times
+#ifdef DEBUG_CHECKPT_SAVE_ALLOWED
+	std::cout << "      CheckPtSaver::saveIfAllowed()\n";
+#endif
+
+	// Check to see if configuration allows immediate save.
+	if (serverEnv_->checkMode() == ecf::CheckPt::ALWAYS ) {
+		doSave();
+ 	}
+}
diff --git a/ecflow_4_0_7/Server/src/CheckPtSaver.hpp b/ecflow_4_0_7/Server/src/CheckPtSaver.hpp
new file mode 100644
index 0000000..fa2b42d
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/CheckPtSaver.hpp
@@ -0,0 +1,86 @@
+#ifndef CHECKPTSAVER_HPP_
+#define CHECKPTSAVER_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : CheckPtSaver.cpp
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+// This class will save the defs file periodically. The period is obtained from
+// ServerEnvironment. The save of the check point file is controlled by
+// the settings in ServerEnvironment
+//
+// The checkpoint files is the defs file, with state. However its saved in
+// boost serialisation format(i.e can be text,binary,portable binary)
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/noncopyable.hpp>
+#include <boost/asio.hpp>
+
+class ServerEnvironment;
+class Server;
+
+class CheckPtSaver : private boost::noncopyable {
+public:
+	CheckPtSaver(  Server* s,   boost::asio::io_service& io, const ServerEnvironment*);
+	~CheckPtSaver();
+
+	/// Start periodical save of the checkpoint file
+	void start();
+
+	/// Stop periodical save of the checkPoint file
+	void stop();
+
+   /// terminate: This will cancel the timer and any pending async operation
+	/// If timer has already expired, then the handler function will be
+	/// passed an operation aborted error code.
+   /// Called when the server is exiting. We must be sure to cancel all
+   /// async handlers or the server, will not stop.
+   void terminate();
+
+	/// Will always save the check pt file. Independent of any server environment
+   /// The input argument is used in logging. When check pointing via user command
+   /// we log the request. However we also check point automatically via the server
+   /// This allows us to distinguish the two cases in the log file:
+	void explicitSave(bool from_server = false) const;
+
+	/// This function is called after node state changes. Check for save
+	/// CheckPt::ON_TIME - will do nothing since we will save periodically
+	/// CheckPt::NEVER   - will return immediately
+	/// CheckPt::ALWAYS  - will save immediately, may cause performance issues with large Node trees
+	void saveIfAllowed();
+
+private:
+	/// save the node tree in the server to a checkPt file.
+	/// this is controlled by the configuration. If the configuration does not
+	/// allow a save, does nothing
+	void doSave() const;
+
+	/// Called periodically to save checkPoint file
+	/// We use error parameter, since when we cancel the timer via, terminate
+	/// we do NOT want to do an explicit save *PLUS* we want to return without
+	/// starting another async operation. Otherwise the server will not return
+	///
+	/// This will call doSave() but *ONLY* if there has been a state change
+	/// This avoids writing out a checkpt file, unnecessarily & filling up log file
+	void periodicSaveCheckPt(const boost::system::error_code& error);
+
+	Server* server_;
+ 	boost::asio::deadline_timer timer_;
+   bool firstTime_;
+  	bool running_;
+  	const ServerEnvironment* serverEnv_;
+   mutable unsigned int state_change_no_;        // detect state change in defs
+   mutable unsigned int modify_change_no_;       // detect state change in defs
+};
+#endif
diff --git a/ecflow_4_0_7/Server/src/NodeTreeTraverser.cpp b/ecflow_4_0_7/Server/src/NodeTreeTraverser.cpp
new file mode 100644
index 0000000..7f13631
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/NodeTreeTraverser.cpp
@@ -0,0 +1,396 @@
+//============================================================================
+// Name        : NodeTreeTraverser.cpp
+// Author      : Avi
+// Revision    : $Revision: #101 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <iostream>
+#include "boost/bind.hpp"
+
+#include "ServerEnvironment.hpp"
+#include "NodeTreeTraverser.hpp"
+#include "Server.hpp"
+#include "Defs.hpp"
+#include "JobsParam.hpp"
+#include "Jobs.hpp"
+#include "Log.hpp"
+#include "CalendarUpdateParams.hpp"
+#include "Calendar.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::posix_time;
+
+//#define DEBUG_TRAVERSER 1
+//#define DEBUG_POLL 1
+
+// ***********************************************************************
+// It was noticed that having a poll of 60 seconds was not very accurate
+// even when the server was not active, could be out by as much as 25 seconds
+// Hence we poll every second, and check it against the minute boundary
+// ************************************************************************
+
+NodeTreeTraverser::NodeTreeTraverser( Server* s,
+		boost::asio::io_service& io,
+		const ServerEnvironment& serverEnv)
+: server_( s ),
+  serverEnv_(serverEnv),
+  timer_( io, boost::posix_time::seconds( 0 ) ),
+  interval_(0,0,serverEnv_.submitJobsInterval(),0),
+  count_( 0 ),
+  firstTime_( true),
+  running_(false)
+{
+#ifdef DEBUG_TRAVERSER
+	std::cout << "NodeTreeTraverser::NodeTreeTraverser period = " << serverEnv_.submitJobsInterval() << "\n";
+#endif
+}
+
+NodeTreeTraverser::~NodeTreeTraverser() {
+#ifdef DEBUG_TRAVERSER
+	std::cout << "~NodeTreeTraverser::NodeTreeTraverser\n";
+#endif
+}
+
+void NodeTreeTraverser::start()
+{
+#ifdef DEBUG_TRAVERSER
+	{LogToCout toCoutAsWell;LOG(Log::DBG, "NodeTreeTraverser::start() server_state(" << SState::to_string(server_->state()) << ") running(" << running_ << ")  count(" << count_ << ") firstTime_(" << firstTime_ << ")" );}
+#endif
+
+	if (!running_) {
+		count_ = 0;
+		running_ = true;
+		if (firstTime_) {
+			// If the server is stopped/started we want to avoid skewing the calendar, since each time
+			// we call traverse, the calendar is updated with the server poll. hence we must make sure
+			// we only start it once here
+			last_time_ = Calendar::second_clock_time();
+			next_poll_time_ = last_time_;
+			firstTime_ = false;
+
+			/// ==========================================================================
+			/// Make sure we *ALIGN* the poll period exactly *** to the minute*** boundary
+			/// ==========================================================================
+			if ( 60 == serverEnv_.submitJobsInterval() ) {
+
+				time_duration time_of_day = last_time_.time_of_day();
+				int seconds_to_minute_boundary =  60 - time_of_day.seconds();
+
+#ifdef DEBUG_TRAVERSER
+				std::cout << "  NodeTreeTraverser::start: time_of_day(" << to_simple_string(time_of_day) << ") seconds_to_minute_boundary(" << seconds_to_minute_boundary << ")\n";
+#endif
+
+				if ( seconds_to_minute_boundary != 0) {
+
+#ifdef DEBUG_TRAVERSER
+					std::cout << "  NodeTreeTraverser::start: Do an immediate job generation. Since we don't want to wait for minute boundary, when starting.\n";
+#endif
+
+					// Make sure subsequent polls are *ALIGNED* to minute boundary
+					next_poll_time_ = last_time_ + seconds(seconds_to_minute_boundary);
+
+					// ************************************************************************************************
+					// ** This relies on next_poll_time_ being set first, to ensure job generation does not take longer
+					// ************************************************************************************************
+					update_suite_calendar_and_traverse_node_tree(last_time_);
+
+					timer_.expires_from_now(  boost::posix_time::seconds( 1 ) );
+
+#ifdef DEBUG_TRAVERSER
+					std::cout << "  NodeTreeTraverser::start: next_poll_time_(" << to_simple_string(next_poll_time_) << ")\n";
+#endif
+				}
+			}
+#ifdef ECFLOW_MT
+			timer_.async_wait( server_->strand_.wrap( boost::bind( &NodeTreeTraverser::traverse, this, boost::asio::placeholders::error ) ) );
+#else
+			timer_.async_wait( server_->io_service_.wrap( boost::bind( &NodeTreeTraverser::traverse, this, boost::asio::placeholders::error ) ) );
+#endif
+		}
+	}
+}
+
+void NodeTreeTraverser::stop()
+{
+#ifdef DEBUG_TRAVERSER
+	{LogToCout toCoutAsWell; LOG(Log::DBG, "   NodeTreeTraverser::stop() count(" << count_ << ")");}
+#endif
+
+	running_ = false;
+}
+
+void NodeTreeTraverser::terminate()
+{
+#ifdef DEBUG_TRAVERSER
+	{LogToCout toCoutAsWell; LOG(Log::DBG, "   NodeTreeTraverser::terminate() count(" << count_ << ")");}
+#endif
+
+	timer_.cancel();
+}
+
+void NodeTreeTraverser::do_traverse()
+{
+	// since we poll every second, if less than next poll(every 60 seconds) continue.
+	ptime time_now = Calendar::second_clock_time();
+	if (time_now < next_poll_time_) {
+
+		// minimise the number of node tree traversal, to once every second, but only *IF* required
+		// Note: if we are a few seconds to the poll time, but job generation takes a while
+		//       we can get warning about the interval took to long. See below:
+
+		// LOG(Log::DBG,"get_job_generation_count() = " << server_->get_job_generation_count());
+		if (server_->get_job_generation_count() > 0) {
+			traverse_node_tree_and_job_generate( time_now , false /* not in command context */);
+		}
+
+		start_timer(); // timer fires *EVERY* second
+		return;
+	}
+	// time_now >= next_poll_time_
+
+
+	// We have SOFT real time, we poll every second, BUT only update the suite calendar at the job submission
+	// interval. However we can not guarantee to hit exactly at the next poll time
+	// *** traverse node tree and increment next_poll_time_ ***
+	time_duration duration = time_now - last_time_;
+	int diff_from_last_time = duration.total_seconds();
+	int submitJobsIntervalInSeconds = serverEnv_.submitJobsInterval();
+#ifdef DEBUG_TRAVERSER
+	int real_diff = diff_from_last_time - submitJobsIntervalInSeconds;
+	std::stringstream ss;
+	ss << "   NodeTreeTraverser::traverse() diff_from_last_time:" << diff_from_last_time << " running:" << running_ << " count:" << count_ << " real_diff:" << real_diff << "  time_now:" << to_simple_string(time_now);
+	if ( diff_from_last_time == 0) ss << ": FIRST time: ";
+#endif
+
+	/// Update server stat's. ie records number of requests for each poll period
+	server_->update_stats(diff_from_last_time);
+
+	/// The poll times will *vary* since we are trying to keep up with the hard real time.
+	if ( diff_from_last_time > submitJobsIntervalInSeconds ) {
+
+		/// This will happen from time to time, hence only report, for real wayward times
+		int diff = diff_from_last_time - submitJobsIntervalInSeconds;
+		if (diff > (submitJobsIntervalInSeconds * 0.25)) {
+			LOG(Log::WAR, ": interval is (" << submitJobsIntervalInSeconds << " seconds)  but took (" << diff_from_last_time  <<  " seconds)" );
+		}
+	}
+
+
+
+	/// Remove any stale zombies
+	server_->zombie_ctrl().remove_stale_zombies(time_now);
+
+#ifdef DEBUG_TRAVERSER
+	time_duration traverse_duration =  Calendar::second_clock_time() - time_now;
+	ss << " Traverse duration:" << traverse_duration.total_seconds();
+#endif
+
+
+	// We poll *EVERY second but update the next_poll_time_ to be consistent with the job submission interval
+	// Hence the next poll times *will* vary( SOFT REAL TIME ).
+	// Note: On server start, we modified the next_poll_time_ to hit the minute boundary.
+	//
+	//         FIRST          time_now(skip)                                   time_now(traverse node tree)
+	//           |                |         L                                      |         S
+	//           V                V------------------------|                       V-----------------|
+	// ==========0====================0====================0====================0====================0
+	//           ^                    ^                    ^                    ^                    ^
+	//           |                    |                    |                    |                    |
+	//         last_time_       next_poll_time_       next_poll_time_      next_poll_time_      next_poll_time_
+	//         next_poll_time_
+	//                                ^                                         ^
+	//                                |                                         |
+	//                             last_time_                                last_time_
+	//                             reset to previous next_poll_time_, to avoid yo-yoing, messages about poll being long/short
+	//
+	// Update next_poll_time_: WE  *ONLY* get here if time_now >= next_poll_time
+
+	if (time_now > next_poll_time_) {
+
+		/// Continue updating next_poll_time_ by interval_ until it is greater time_now
+#ifdef DEBUG_TRAVERSER
+		{  ss << ": Shorten the poll time : Current time(" << to_simple_string(time_now) << ") > current poll_time(" << to_simple_string(next_poll_time_) << ")";
+		time_duration diff =  time_now - next_poll_time_;
+		ss << " by " << diff.total_seconds() << " seconds: "; }
+#endif
+
+		while (next_poll_time_ <= time_now) { next_poll_time_ += interval_;}
+	}
+	else {
+
+		/// Hit the poll time: Should get here when traverse called for the *FIRST* time ( since time_now == next_poll_time_)
+#ifdef DEBUG_TRAVERSER
+		ss << ": On poll time: ";
+#endif
+
+		next_poll_time_ += interval_;
+	}
+
+	// At begin time for very large suites, slow disk, and in test, during job generation we can miss the next poll time(i.e a,b)
+	// This means that on the next poll time because last_time was not updated, to be immediately
+	// behind the next poll time by 'interval_' seconds an erroneous report is logged about missing the poll time
+	//
+	//         FIRST                                                               Time_now
+	//           |                                                                    |
+	//           V                    a                    b                    c     X
+	// ==========0====================0====================0====================0====================0
+	//           ^                    ^                    ^                    ^                    ^
+	//           |                    |                    |                    |                    |
+	//         last_time_       next_poll_time_       next_poll_time_      next_poll_time_      next_poll_time_
+	//
+	// Hence we need to ensure that last_time is always less that next_poll_time_ by interval_
+	// In the diagram above missed poll time a and b, then we need to set last_time_ to 'c' and *NOT* 'a' | 'b'
+	last_time_ = next_poll_time_ - interval_;
+
+
+#ifdef DEBUG_TRAVERSER
+	{ ss << " Next Poll at:" << to_simple_string(next_poll_time_);LogToCout toCoutAsWell; LOG(Log::DBG,ss.str()); }
+#endif
+
+
+	// Start node tree traversal.
+	// ************************************************************************************************
+	// ** This relies on next_poll_time_ being set first, to ensure job generation does not take longer
+	// ************************************************************************************************
+	update_suite_calendar_and_traverse_node_tree(time_now);
+
+	start_timer();  // timer fires *EVERY* second
+}
+
+void NodeTreeTraverser::start_timer()
+{
+	/// Appears that expires_from_now is more accurate then expires_at i.e timer_.expires_at( timer_.expires_at() + boost::posix_time::seconds( poll_at ) );
+	timer_.expires_from_now(  boost::posix_time::seconds( 1 ) );
+#ifdef ECFLOW_MT
+	timer_.async_wait( server_->strand_.wrap( boost::bind( &NodeTreeTraverser::traverse,this,boost::asio::placeholders::error ) ) );
+#else
+	timer_.async_wait( server_->io_service_.wrap( boost::bind( &NodeTreeTraverser::traverse,this,boost::asio::placeholders::error ) ) );
+#endif
+}
+
+void NodeTreeTraverser::traverse(const boost::system::error_code& error )
+{
+	if (error == boost::asio::error::operation_aborted) {
+#ifdef DEBUG_TRAVERSER
+		{ LogToCout toCoutAsWell; LOG(Log::DBG, "NodeTreeTraverser::traverse Timer was cancelled" ); }
+#endif
+		return;
+	}
+	else if (error) {
+		LogToCout toCoutAsWell;
+		std::string msg = "NodeTreeTraverser::traverse error: "; msg += error.message();
+		ecf::log(Log::ERR, msg);
+		return;
+	}
+
+	do_traverse();
+}
+
+
+void NodeTreeTraverser::update_suite_calendar_and_traverse_node_tree(const boost::posix_time::ptime& time_now)
+{
+	// *****************************************************************************
+	// JOB SUBMISSION SEEMS TO WORK BEST IF THE CALENDAR INCREMENT HAPPENS FIRST
+	// HOWEVER THIS MEANS WE MAY MISS THE VERY FIRST JOB SUBMISSION. ??
+	// Note: events,meters and task completion kick of another job submission
+	//       There seems to be greater stability in terms of testing as it allows
+	//       process to complete, before the calendar is incremented.
+	// *****************************************************************************
+	if ( server_->defs_ ) {
+
+		// This functions gets called every 60 seconds or so, update calendar && time
+		// dependent variables in case any jobs depend on them. By default the calendar
+		// update interval is the same as submitJobsInterval for non-real calendars,
+		// however for testing both real/non-real calendars the calendar increment can be
+		// changed to speed up calendar. This is done by setting the calendar increment
+		// on the suite(i.e in the defs file)  which will the _override_ this setting.
+		//
+		// Additionally by passing in the flag running_, it allow suites which want to
+		// stop the calendar updates, when the server is stopped to do so.
+		// For real time calendars we make one system call here, instead of many times in each suite
+		//
+		// In the case where defs/node tree is suspended updateCalendar will continue
+		// to mark those time dep' are free, as free. This information is then used
+		// during the resume
+		++count_;
+		CalendarUpdateParams calParams(time_now, interval_/* calendar increment */, running_ );
+		server_->defs_->updateCalendar( calParams );
+
+		traverse_node_tree_and_job_generate(time_now, false /* not in command context */);
+	}
+}
+
+void NodeTreeTraverser::traverse_node_tree_and_job_generate(
+		const boost::posix_time::ptime& start_time,
+		bool user_cmd_context) const
+{
+	// **************************************************************************************
+	// This can be called at the end of a user command(force,alter,requeue,etc),
+	// hence start_time may be >= poll_time, Note: for child command we just call
+	// increment_job_generation_count()
+	// **************************************************************************************
+
+	if ( running_ && server_->defs_) {
+#ifdef DEBUG_JOB_SUBMISSION
+		jobsParam.logDebugMessage(" from NodeTreeTraverser::traverse_node_tree_and_job_generate()");
+#endif
+
+		// ** In the *NON* command context, we should always have start_time < next_poll_time_
+ 		if (user_cmd_context && start_time >= next_poll_time_) {
+
+ 			//cout << "*****************************************************************************************************\n";
+ 			//cout << "user Command context " << cmd_context << " start_time: " << start_time << " >= " << " next_poll_time_: " << next_poll_time_ << "\n";
+ 			//cout << "*****************************************************************************************************\n";
+
+ 			server_->increment_job_generation_count();
+ 			return;
+		}
+
+		server_->reset_job_generation_count();
+
+		// Pass submit jobs interval, so that we can check jobs submission occurs within the allocated time.
+		// By default job generation is enabled, however for testing, allow job generation to be disabled.
+		JobsParam jobsParam(serverEnv_.submitJobsInterval(), serverEnv_.jobGeneration());
+
+		// If job generation takes longer than the time to *reach* next_poll_time_, then time out.
+		// Hence we start out with 60 seconds, and time for job generation should decrease. Until reset back to 60
+		// Should allow greater child communication.
+		// By setting set_next_poll_time, we enable timeout of job generation.
+		// ** IMPLIES => next_poll_time_ must be set first, before *THIS* function is called **
+		// Note: There are other place where we may not want to timeout job generation.
+		jobsParam.set_next_poll_time(next_poll_time_);
+
+		Jobs jobs(server_->defs_);
+		if (!jobs.generate(jobsParam)) { ecf::log(Log::ERR, jobsParam.getErrorMsg()); }
+		if (jobsParam.timed_out_of_job_generation()) {
+
+			// Implies we timed out, hence time_out_time >= next_poll_time_
+			const ptime& time_out_time = jobsParam.time_out_time();
+			// std::cout << "Job generation *timed* out: start time:" << start_time << "  time_out_time:" << time_out_time << "  poll_time:" << next_poll_time_ << "\n";
+
+			// It could be that we started job generation a few seconds before the poll time,
+			// Hence to avoid excessive warnings, Only warn if time_out_time > next_poll_time_ and  forgive about 3  seconds
+			if (!time_out_time.is_special() && time_out_time > next_poll_time_ ) {
+				int leeway = ( serverEnv_.submitJobsInterval() == 60) ? 3 : 1;
+				time_duration duration = time_out_time - next_poll_time_;
+				if ( duration.total_seconds() >= leeway) {
+
+					std::stringstream ss;
+					ss << "Job generation *timed* out: start time:" << start_time << "  time_out_time:" << time_out_time << "  poll_time:" << next_poll_time_;
+					ecf::log(Log::WAR,ss.str());
+				}
+			}
+		}
+	}
+}
+
diff --git a/ecflow_4_0_7/Server/src/NodeTreeTraverser.hpp b/ecflow_4_0_7/Server/src/NodeTreeTraverser.hpp
new file mode 100644
index 0000000..81dd277
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/NodeTreeTraverser.hpp
@@ -0,0 +1,86 @@
+#ifndef NODETREETRAVERSER_HPP_
+#define NODETREETRAVERSER_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : NodeTreeTraverser.cpp
+// Author      : Avi
+// Revision    : $Revision: #26 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+// This class will traverse the node tree periodically, It is tied to a server.
+// This implementation uses a strand to ensure sequential processing of the node dependency traversal
+// in the the presence of multiple threads, without the need of explicit locking. i.e mutex's
+//
+// For testing we make the distinction between the poll period, and calendar update interval
+// Some suites require a real time calendar. Hence we must make sure that
+// poll interval is in sync with real time.
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/asio.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+class Server;
+class ServerEnvironment;
+
+class NodeTreeTraverser : private boost::noncopyable {
+public:
+	NodeTreeTraverser(  Server* s,  boost::asio::io_service& io, const ServerEnvironment& serverEnv);
+	~NodeTreeTraverser();
+
+	/// If first time Starts traversing Node tree and resolving dependencies.
+	/// This essentially starts Jobs scheduling. Calling start more than once does nothing.
+	/// On subsequent calls to start resume is called. Which may cause immediate
+	/// job generation. (i.e for those nodes whose node are free of time dependencies)
+	/// Timer will be aligned to the minute boundary
+	void start();
+
+	/// Suspends job scheduling (for real time calendars/suite)
+ 	/// Shutdown & suspend (are very similar) shutdown operate at the top/level.
+ 	/// Both should have effect of stopping job submission and not the event loop
+ 	///
+ 	/// During a system session, a node can be placed into suspend mode.
+ 	/// In suspend mode, no jobs are submitted. (**** However node which are
+ 	/// free to run are marked****).
+ 	///
+ 	/// When the session is resumed, those node than were marked, have
+ 	/// the task's submitted. ( This means that job dependent on a time dependency
+ 	/// does not need to be held for the following day)
+	void stop();
+
+   /// terminate: This will cancel the timer and any pending async operation
+   /// If timer has already expired, then the handler function will be
+   /// passed an operation aborted error code.
+	/// Called when the server is exiting. We must be sure to cancel all
+	/// async handlers or the server, will not stop.
+   void terminate();
+
+   /// This can be called at the end of a *USER* command(force,alter,requeue,etc), hence time_now may be >= poll_time
+   /// If this is the case, we will defer job generation
+   void traverse_node_tree_and_job_generate(const boost::posix_time::ptime& time_now, bool user_cmd_context) const;
+
+private:
+	void traverse(const boost::system::error_code& error );
+	void do_traverse();
+	void start_timer();
+	void update_suite_calendar_and_traverse_node_tree(const boost::posix_time::ptime& time_now);
+
+	Server* server_;
+	const ServerEnvironment& serverEnv_;
+ 	boost::asio::deadline_timer timer_;
+	boost::posix_time::ptime last_time_;        // ensure poll is in sync
+	boost::posix_time::ptime next_poll_time_;   // Keep as sync as possible with hard real times
+	boost::posix_time::time_duration interval_; // Job submission interval
+ 	int count_;
+ 	bool firstTime_;
+ 	bool running_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Server/src/Server.cpp b/ecflow_4_0_7/Server/src/Server.cpp
new file mode 100644
index 0000000..d81a693
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/Server.cpp
@@ -0,0 +1,716 @@
+//============================================================================
+// Name        : Server.cpp
+// Author      : Avi
+// Revision    : $Revision: #173 $
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Server
+//
+// The port numbers are divided into three ranges:
+// o the Well Known Ports, (require root permission)  0   -1023
+//  o the Registered Ports,                            1024-49151
+//  o Dynamic and/or Private Ports.                    49151-65535
+//============================================================================
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/bind.hpp>
+#include <iostream>
+
+#include "Server.hpp" // Must come before boost/serialization headers.
+                       // defines ECFLOW_MT
+#include <boost/thread/thread.hpp> // needed for ECFLOW_MT and debug() to print thread ID
+#include "Defs.hpp"
+#include "Log.hpp"
+#include "System.hpp"
+#include "ServerEnvironment.hpp"
+#include "Ecf.hpp"
+#include "Calendar.hpp"
+#include "Version.hpp"
+#include "Str.hpp"
+
+using boost::asio::ip::tcp;
+namespace fs = boost::filesystem;
+
+using namespace std;
+using namespace ecf;
+
+
+/// Constructor opens the acceptor and starts waiting for the first incoming connection.
+Server::Server( ServerEnvironment& serverEnv ) :
+   io_service_(),
+   signals_(io_service_),
+   acceptor_(io_service_),
+#ifdef ECFLOW_MT
+   strand_(io_service_),
+   thread_pool_size_(serverEnv.threads()),
+   new_connection_(),
+#endif
+   defs_(Defs::create()),      // ECFLOW-182
+   traverser_   (this,  io_service_, serverEnv ),
+   checkPtSaver_(this,  io_service_, &serverEnv ),
+   serverState_(SState::HALTED),
+   serverEnv_(serverEnv)
+{
+#ifdef ECFLOW_MT
+   std::cout << "Server: thread pool size = " << thread_pool_size_ << endl;
+#endif
+
+   if (serverEnv_.debug()) cout << "-->Server::server starting server on port "
+                                << serverEnv.port()
+#ifdef ECFLOW_MT
+                                << " thread pool size = " << thread_pool_size_
+#endif
+                                << endl;
+
+   // Register to handle the signals.
+   // Support for emergency check pointing during system session.
+   signals_.add(SIGTERM);
+   signals_.async_wait(boost::bind(&Server::sigterm_signal_handler, this));
+
+
+   // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+   boost::asio::ip::tcp::endpoint endpoint(serverEnv.tcp_protocol(), serverEnv.port());
+   acceptor_.open(endpoint.protocol());
+   acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+   acceptor_.bind(endpoint);
+   acceptor_.listen();   // address is use error, when it comes, bombs out here
+
+
+   // Update stats, this is returned via --stats command option
+   stats().host_ = serverEnv.hostPort().first;
+   stats().port_ = serverEnv.hostPort().second;
+   stats().job_sub_interval_ = serverEnv.submitJobsInterval();
+   stats().checkpt_interval_ = serverEnv.checkPtInterval();
+   stats().checkpt_save_time_alarm_ = serverEnv.checkpt_save_time_alarm();
+   stats().checkpt_mode_ = serverEnv.checkMode();
+   stats().up_since_ = to_simple_string(Calendar::second_clock_time());
+   stats().version_ = Version::description();
+   stats().status_ = static_cast<int>(serverState_);
+   stats().ECF_HOME_ = serverEnv.ecf_home();
+   stats().ECF_CHECK_ = serverEnv.checkPtFilename();
+   stats().ECF_LOG_ = Log::instance()->path();
+
+   // Update log file:
+   ecf::log(Log::MSG, "Server initial state is HALTED");
+
+   // The defs_ *MUST* be updated with the server state
+   // When we load from the check pt file we call update_defs_server_state();
+   if (!load_check_pt_file_on_startup()) {
+
+      // No check pt files loaded, update defs, with server state
+      update_defs_server_state();           // works on def_
+   }
+
+   /// Setup globals used to detect incremental changes to the definition
+   Ecf::set_server(true);
+
+   // Start an accept operation for a new connection.
+   start_accept();
+}
+
+Server::~Server()
+{
+   if (serverEnv_.debug()) cout << "<--Server::~server exiting server on port " << serverEnv_.port() << endl;
+
+   defs_.reset();
+
+#ifdef DEBUG
+   if ( defs_.use_count() != 0) {
+      cout << "Server::~server() defs_.use_count() = " << defs_.use_count() << " something is still hold onto the defs, asserting\n";
+   }
+#endif
+   assert(defs_.use_count() == 0);
+}
+
+void Server::run()
+{
+  // The io_service::run() call will block until all asynchronous operations
+  // have finished. While the server is running, there is always at least one
+  // asynchronous operation outstanding: the asynchronous accept call waiting
+  // for new incoming connections.
+
+#ifdef ECFLOW_MT
+  // Create a pool of threads to run all of the io_services.
+  std::vector<boost::shared_ptr<boost::thread> > threads;
+  for (std::size_t i = 0; i < thread_pool_size_; ++i)
+  {
+      boost::shared_ptr<boost::thread> thread(new boost::thread(
+          boost::bind(&boost::asio::io_service::run, &io_service_)));
+      threads.push_back(thread);
+  }
+  // Wait for all threads in the pool to exit.
+  for (std::size_t i = 0; i < threads.size(); ++i)
+    threads[i]->join();
+#else
+  io_service_.run();
+#endif
+}
+
+void Server::start_accept()
+{
+#ifdef ECFLOW_MT
+   if (serverEnv_.debug()) cout << boost::this_thread::get_id() << "   Server::start_accept()" << endl;
+   new_connection_.reset(new CConnection(io_service_, this));
+   acceptor_.async_accept(new_connection_->socket(),
+                          boost::bind(&Server::handle_accept, this,
+                                      boost::asio::placeholders::error));
+#else
+   if (serverEnv_.debug()) cout << "   Server::start_accept()" << endl;
+   connection_ptr new_conn( new connection( io_service_ ) );
+   if (serverEnv_.allow_old_client_new_server() !=0 ) {
+      new_conn->allow_old_client_new_server(serverEnv_.allow_old_client_new_server());
+   }
+   acceptor_.async_accept( new_conn->socket(),
+                           boost::bind( &Server::handle_accept, this,
+                                 boost::asio::placeholders::error,
+                                 new_conn ) );
+#endif
+}
+
+#ifdef ECFLOW_MT
+void Server::handle_accept(const boost::system::error_code& e)
+{
+   // Check whether the server was stopped by a signal before this completion
+   // handler had a chance to run.
+   if (!acceptor_.is_open()) {
+      if (serverEnv_.debug()) cout << boost::this_thread::get_id() << "   Server::handle_accept:  acceptor is closed, returning\n";
+      return;
+   }
+
+   if (!e) {
+      new_connection_->start();
+   }
+   else {
+      LogToCout toCoutAsWell;
+      LOG(Log::ERR, "Server::handle_accept error occurred : " <<  e.message());
+   }
+
+   start_accept();
+}
+#else
+void Server::handle_accept( const boost::system::error_code& e, connection_ptr conn )
+{
+   // Check whether the server was stopped by a signal before this completion
+   // handler had a chance to run.
+   if (!acceptor_.is_open()) {
+      if (serverEnv_.debug()) cout << "   Server::handle_accept:  acceptor is closed, returning" << endl;
+      return;
+   }
+
+   if ( !e ) {
+      // Read and interpret message from the client
+      if (serverEnv_.debug()) cout << "   Server::handle_accept" << endl;
+
+      // Successfully accepted a new connection. Determine what the
+      // client sent to us. The connection::async_read() function will
+      // automatically. serialise the inbound_request_ data structure for us.
+      conn->async_read( inbound_request_,
+                     boost::bind( &Server::handle_read, this,
+                                boost::asio::placeholders::error,conn ) );
+   }
+   else {
+      if (serverEnv_.debug()) cout << "   Server::handle_accept " << e.message() << endl;
+      if (e != boost::asio::error::operation_aborted) {
+         // An error occurred. Log it
+         LogToCout toCoutAsWell;
+         LOG(Log::ERR, "   Server::handle_accept error occurred  " <<  e.message());
+      }
+   }
+
+   // Start an accept operation for a new connection.
+   // *NOTE* previously we had *ONLY* called this if there was no errors
+   //        However this would means that server would run out work.
+   //        When there were errors.!
+   // Moved here to follow the examples used in ASIO.
+   // However can this get into an infinite loop ???
+   start_accept();
+}
+
+void Server::handle_read(  const boost::system::error_code& e,connection_ptr conn )
+{
+   /// Handle completion of a write operation.
+   // **********************************************************************************
+   // This function *must* finish with write, otherwise it ends up being called recursively
+   // ***********************************************************************************
+   if ( !e ) {
+
+      // See what kind of message we got from the client
+      if (serverEnv_.debug()) std::cout << "   Server::handle_read : client request " << inbound_request_ << endl;
+
+      try {
+         // Service the in bound request, handling the request will populate the outbound_response_
+         // Note:: Handle request will first authenticate
+         outbound_response_.set_cmd( inbound_request_.handleRequest( this ) );
+      }
+      catch (exception& e) {
+         outbound_response_.set_cmd( PreAllocatedReply::error_cmd( e.what()  ));
+      }
+
+      // Release >= 4.0.6  More reliable to always respond back. Get more accurate logs
+      // However allow old/new client to deal with shutdown of socket:
+      // See: void Client::handle_read() See: ECFLOW-157, ECFLOW-169
+      //
+      //      if (!serverEnv_.reply_back_if_ok()) {
+      //
+      //         if (!inbound_request_.terminateRequest() && outbound_response_.get_cmd()->isOkCmd()) {
+      //
+      //            // cleanly close down the connection
+      //            if (serverEnv_.debug()) cout << "   Server::handle_read: NOT replying, since request is OK" << endl;
+      //
+      //            if (shutdown_socket(conn,"Server::handle_read:"))  conn->socket().close();
+      //            return;
+      //         }
+      //      }
+
+      // *Reply* back to the client:
+      conn->async_write( outbound_response_,
+                          boost::bind(&Server::handle_write,
+                                    this,
+                                    boost::asio::placeholders::error,
+                                    conn ) );
+   }
+   else {
+      // An error occurred.
+      // o/ If client has been killed/disconnected/timed out
+      //       Server::handle_read : End of file
+      //
+      // o/ If a *new* client talks to an *old* server, with an unrecognised request/command
+      //    we will see:
+      //       Connection::handle_read_data boost::archive::archive_exception unregistered class
+      //       Server::handle_read : Invalid argument
+      LogToCout toCoutAsWell;
+      LOG(Log::ERR, "Server::handle_read: " <<  e.message());
+   }
+}
+
+void Server::handle_write( const boost::system::error_code& e, connection_ptr conn )
+{
+   // Handle completion of a write operation.
+   // Nothing to do. The socket will be closed automatically when the last
+   // reference to the connection object goes away.
+   if (serverEnv_.debug())
+      cout << "   Server::handle_write: client request " << inbound_request_ << " replying with  " << outbound_response_ << endl;
+
+   if (e) {
+      ecf::LogToCout logToCout;
+      std::stringstream ss; ss << "Server::handle_write: " << e.message() << " : for request " << inbound_request_;
+      log(Log::ERR,ss.str());
+      return;
+   }
+
+   (void)shutdown_socket(conn,"Server::handle_write:");
+
+   // If asked to terminate we do it here rather than in handle_read.
+   // So that we have responded to the client.
+   // *HOWEVER* only do this if the request was successful.
+   //           we do this by checking that the out bound response was ok
+   //           i.e a read only user should not be allowed to terminate server.
+   if (inbound_request_.terminateRequest() && outbound_response_.get_cmd()->isOkCmd()) {
+      if (serverEnv_.debug()) cout << "   <--Server::handle_write exiting server via terminate() port " << serverEnv_.port() << endl;
+      terminate();
+   }
+}
+
+bool Server::shutdown_socket(connection_ptr conn, const std::string& msg) const
+{
+   // For portable behaviour with respect to graceful closure of a connected socket,
+   // call shutdown() before closing the socket.
+   //
+   //    conn->socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both)
+   // This *CAN* throw an error if the client side socket is not connected. client may have been killed *OR* timed out
+   // i.e "shutdown: Transport endpoint is not connected"
+   //
+   // Since this can happen, instead of throwing, we use non-throwing version & just report it
+   boost::system::error_code ec;
+   conn->socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both,ec);
+   if (ec) {
+      ecf::LogToCout logToCout;
+      std::stringstream ss; ss << msg << " socket shutdown both failed: " << ec.message() << " : for request " << inbound_request_;
+      log(Log::ERR,ss.str());
+      return false;
+   }
+   return true;
+}
+
+#endif
+
+
+void Server::terminate()
+{
+   // The server is terminated by cancelling all outstanding asynchronous
+   // operations. Once all operations have finished the io_service::run() call  will exit.
+   if (serverEnv_.debug()) cout << "   Server::terminate(): posting call to Server::handle_terminate" << endl;
+
+   // Post a call to the stop function so that Server::stop() is safe to call from any thread.
+   io_service_.post(boost::bind(&Server::handle_terminate, this));
+}
+
+void Server::handle_terminate()
+{
+   if (serverEnv_.debug()) cout << boost::this_thread::get_id() << "   Server::handle_terminate() : cancelling checkpt and traverser timers, and signals" << endl;
+
+   // Cancel signal
+   signals_.clear();
+   signals_.cancel();
+
+   // Cancel async timers for check pointing and traversal
+   traverser_.terminate();
+   checkPtSaver_.terminate();
+
+   acceptor_.close();
+
+   // Stop the io_service object's event processing loop. Will cause run to return immediately
+   io_service_.stop();
+}
+
+// ============================== other privates ===========================================
+
+bool Server::load_check_pt_file_on_startup()
+{
+   // On start up we want different behaviour.
+   // If check pt file exists and we can't load then we want to exit
+   // This avoids the server from overwriting the check point file
+   // Which may be from a different version. let the user handle it.
+   LogToCout logToCout;
+   bool checkpt_failed = false;
+   if (restore_from_checkpt(serverEnv_.checkPtFilename(),checkpt_failed)) {
+      return true;
+   }
+   bool backup_checkpt_failed = false;
+   if (restore_from_checkpt(serverEnv_.oldCheckPtFilename(),backup_checkpt_failed)) {
+      return true;
+   }
+
+   if (backup_checkpt_failed && !fs::exists(serverEnv_.checkPtFilename())) {
+      throw std::runtime_error("Can not start server, please handle the backup checkpoint file first");
+   }
+
+   if (checkpt_failed && !fs::exists(serverEnv_.oldCheckPtFilename())) {
+      throw std::runtime_error("Can not start server, please handle the checkpoint file first");
+   }
+   return false;
+}
+
+void Server::loadCheckPtFile()
+{
+   // if the check point file starts with an absolute file load that first
+   // otherwise check in ECF_HOME then load it. Repeat for back up check point file
+   // The server environment has already asserted that we can *NOT* have an empty check point file
+   bool ignore;
+   if (restore_from_checkpt(serverEnv_.checkPtFilename(),ignore)) {
+      return;
+   }
+
+   if (restore_from_checkpt(serverEnv_.oldCheckPtFilename(),ignore)) {
+      return;
+   }
+}
+
+bool Server::restore_from_checkpt(const std::string& filename,bool& failed)
+{
+   // cout << "Server::restore_from_checkpt " <<  filename;
+   failed = false;
+   if (fs::exists(filename)) {
+      // cout << " file exists\n";
+      LOG(Log::MSG, "Loading check point file " << filename << " port = " << serverEnv_.port());
+
+      try {
+         defs_->restore_from_checkpt(filename);   // this can throw
+         update_defs_server_state();              // works on def_
+         //cout << "Server::restore_from_checkpt SUCCEDED found " << defs_->suiteVec().size() << " suites\n";
+         return true;
+      }
+      catch (exception& e) {
+         LOG(Log::ERR, "Failed to load check point file " << filename << ", because: " << e.what());
+         failed = true;
+      }
+   }
+//   else {
+//      cout << " does *not* exist\n";
+//   }
+   return false;
+}
+
+void Server::update_defs_server_state()
+{
+   /// The Job submission interval, and host port are not persisted, on the DEFS
+   /// Hence when restoring from a checkpoint file, Be sure to update server state
+
+   // Do any *one* time setup on the defs
+
+   // Set the server environment *ON* the defs, so that generate variables can be created.
+   // gets the environment as read in by the server, and make available for defs
+   // ECF_HOME .
+   // ECF_CHECK ecf.check
+   // ECF_CHECKOLD ecf.check.b
+   std::vector<std::pair<std::string,std::string> > envVec;
+   serverEnv_.variables(envVec);
+   defs_->set_server().add_or_update_server_variables(envVec);
+
+   defs_->set_server().hostPort(  hostPort() );
+   defs_->set_server().set_state( serverState_ );
+
+   // let the defs store the job submission interval, & whether we want job generation.testing can disable this
+   defs_->set_server().jobSubmissionInterval(  serverEnv_.submitJobsInterval() );
+   defs_->set_server().jobGeneration( serverEnv_.jobGeneration() );
+   LOG_ASSERT( defs_->server().jobSubmissionInterval() != 0 ,"");
+
+   /// System needs defs to handle process that have died, and need to flagged as aborted
+   ecf::System::instance()->setDefs(defs_);
+}
+
+void Server::set_server_state(SState::State ss)
+{
+   serverState_ = ss;
+   stats().status_ = static_cast<int>(serverState_);
+   defs_->set_server().set_state( serverState_ );
+}
+
+
+/// ======================================================================================
+/// AbstractServer function.
+/// ======================================================================================
+
+std::pair<std::string,std::string> Server::hostPort() const
+{
+   return serverEnv_.hostPort();
+}
+
+void Server::updateDefs( defs_ptr defs, bool force)
+{
+   if (serverEnv_.debug()) std::cout << "   Server::updateDefs: Loading new suites" << endl;
+
+   // After the absorb, input defs will be left with NO suites.
+   defs_->absorb(defs.get(),force);
+
+   defs_->set_most_significant_state();
+   LOG_ASSERT( defs_->server().jobSubmissionInterval() != 0 ,"");
+}
+
+void Server::clear_defs()
+{
+   if (serverEnv_.debug()) cout << "   Server::clear_defs()" << endl;
+
+   defs_->clear();
+}
+
+void Server::checkPtDefs(ecf::CheckPt::Mode m, int check_pt_interval, int check_pt_save_time_alarm)
+{
+   if (serverEnv_.debug())
+      cout << "   Server::checkPtDefs() mode(" << m << ") check_pt_interval(" << check_pt_interval << ") check_pt_save_time_alarm(" << check_pt_save_time_alarm << ")" << endl;
+
+   if (m == ecf::CheckPt::UNDEFINED && check_pt_interval == 0 && check_pt_save_time_alarm == 0) {
+      checkPtSaver_.explicitSave();  // will always save
+   }
+   else {
+      if ( m != ecf::CheckPt::UNDEFINED ) {
+         serverEnv_.set_check_mode( m );
+         stats().checkpt_mode_ = serverEnv_.checkMode();
+      }
+      if ( check_pt_interval > 0) {
+         serverEnv_.set_checkpt_interval( check_pt_interval );
+         stats().checkpt_interval_ = check_pt_interval;
+      }
+      if (check_pt_save_time_alarm > 0 ) {
+         serverEnv_.set_checkpt_save_time_alarm( check_pt_save_time_alarm );
+         stats().checkpt_save_time_alarm_ = check_pt_save_time_alarm;
+      }
+   }
+}
+
+void Server::restore_defs_from_checkpt()
+{
+   if (serverEnv_.debug()) cout << "   Server::restore_defs_from_checkpt()" << endl;
+
+   if (serverState_ != SState::HALTED ) {
+      throw std::runtime_error( "Can not restore from checkpt the server must be halted first");
+   }
+
+   if (!defs_->suiteVec().empty()) {
+      // suites must be deleted manually first
+      throw std::runtime_error( "Can not restore from checkpt the server suites must be deleted first");
+   }
+
+   loadCheckPtFile();
+}
+
+void Server::nodeTreeStateChanged()
+{
+   if (serverEnv_.debug()) cout << "   Server::nodeTreeStateChanged()" << endl;
+
+   // will only actually save if configuration allows it
+   checkPtSaver_.saveIfAllowed();
+}
+
+bool Server::allowTaskCommunication() const
+{
+   return (serverState_ != SState::HALTED) ? true : false;
+}
+
+
+void Server::shutdown()
+{
+   ///           User Request    Task Request   Job Scheduling   Check-pointing
+   /// RUNNING      yes               yes              yes            yes
+   /// SHUTDOWN     yes               yes              no             yes
+   /// HALTED       yes               no               no             no
+   if (serverEnv_.debug()) cout << "   Server::shutdown. Stop Scheduling new jobs only" << endl;
+
+   // Stop server from creating new jobs. Don't stop the checkPtSaver_ since
+   // the jobs communication with server can still change state. Which we want
+   // to check point.
+   traverser_.stop();
+
+   // Continue check pointing since, we allow tasks communication. This can change node
+   // tree state. Which we *must* be able to checkpoint.
+   // If we go from HALTED --> SHUTDOWN, then check pointing  needs to be enabled
+   checkPtSaver_.start();
+
+   // Will update defs as well to stop job scheduling
+   set_server_state(SState::SHUTDOWN);
+}
+
+void Server::halted()
+{
+   ///           User Request    Task Request   Job Scheduling   Check-pointing
+   /// RUNNING      yes               yes              yes            yes
+   /// SHUTDOWN     yes               yes              no             yes
+   /// HALTED       yes               no               no             no
+   if (serverEnv_.debug()) cout << "   Server::halted. Stop Scheduling new jobs *and* block task communication. Stop check pointing. Only accept user request" << endl;
+
+   // Stop server from creating new jobs. i.e Job scheduling.
+   traverser_.stop();
+
+   // *** CRITICAL*** when the server is halted, we ***MUST NOT*** do any further check pointing
+   // In a typical operational scenario where we have a home, and backup servers.
+   // The checkpoint file is copied to the backup servers periodically (via a task)
+   // hence we want to preserve the state of the last checkpoint.
+   // Added after discussion with Axel.
+   checkPtSaver_.stop();
+
+   // Stop the task communication with server. Hence nodes can be stuck
+   // in submitted/active states. Task based command will continue attempting,
+   // communication with the server for up to 24hrs.
+   // Will update defs as well to stop job scheduling
+   set_server_state(SState::HALTED);
+}
+
+void Server::restart()
+{
+   ///           User Request    Task Request   Job Scheduling   Check-pointing
+   /// RUNNING      yes               yes              yes            yes
+   /// SHUTDOWN     yes               yes              no             yes
+   /// HALTED       yes               no               no             no
+   if (serverEnv_.debug()) std::cout << "   Server::restart" << endl;
+
+   // The server state *MUST* be set, *before* traverser_.start(), since that can kick off job traversal.
+   // Job Scheduling can only be done under RUNNING state, hence must be before traverser_.start();
+   //
+   // If we placed set_server_state(SState::RUNNING); after we can miss time slots
+   //    See:: SUP 571- Time dependency after halt/checkpoint
+   set_server_state(SState::RUNNING);
+
+   traverser_.start();
+   checkPtSaver_.start();
+}
+
+void Server::traverse_node_tree_and_job_generate(const boost::posix_time::ptime& time_now,bool user_cmd_context ) const
+{
+   traverser_.traverse_node_tree_and_job_generate(time_now, user_cmd_context);
+}
+
+bool Server::reloadWhiteListFile(std::string& errorMsg)
+{
+   if (serverEnv_.debug()) cout << "   Server::reloadWhiteListFile" << endl;
+
+   return serverEnv_.reloadWhiteListFile(errorMsg);
+}
+
+bool Server::authenticateUser(const std::string& user)
+{
+   return serverEnv_.authenticateUser(user);
+}
+
+bool Server::authenticateWriteAccess(const std::string& user,  bool client_request_can_change_server_state )
+{
+   return serverEnv_.authenticateWriteAccess(user, client_request_can_change_server_state);
+}
+
+bool Server::lock(const std::string& user)
+{
+   if (serverEnv_.debug()) std::cout << "   Server::lock " << user << endl;
+
+   if (userWhoHasLock_.empty()) {
+      userWhoHasLock_ = user;
+      stats().locked_by_user_ = user;
+      shutdown();
+      return true;
+   }
+   else if ( userWhoHasLock_ == user && serverState_ == SState::SHUTDOWN ) {
+      // Same user attempting multiple locks
+      return true;
+   }
+   return false;
+}
+void Server::unlock()
+{
+   if (serverEnv_.debug()) std::cout << "   Server::unlock " << userWhoHasLock_ << endl;
+
+   userWhoHasLock_.clear();
+   stats().locked_by_user_.clear();
+   if ( serverState_ == SState::SHUTDOWN ) restart();
+}
+const std::string& Server::lockedUser() const
+{
+   return userWhoHasLock_;
+}
+
+
+int Server::poll_interval() const
+{
+   return serverEnv_.submitJobsInterval();
+}
+
+void Server::debug_server_on()
+{
+   serverEnv_.set_debug(true);
+   std::cout << "\nEnable DEBUG, start with DUMP of server environment:\n\n";
+   std::cout << serverEnv_.dump() << endl;
+}
+
+void Server::debug_server_off()
+{
+   serverEnv_.set_debug(false);
+}
+
+bool Server::debug() const
+{
+   return serverEnv_.debug();
+}
+
+void Server::sigterm_signal_handler()
+{
+   if (io_service_.stopped()) {
+      if (serverEnv_.debug()) cout << "-->Server::sigterm_signal_handler(): io_service is stopped returning " << endl;
+      return;
+   }
+
+   if (serverEnv_.debug()) cout << "Server::sigterm_signal_handler(): Received SIGTERM : starting check pointing" << endl;
+   ecf::log(Log::MSG,"Server::sigterm_signal_handler(): Received SIGTERM : starting check pointing");
+
+   checkPtDefs();
+
+   ecf::log(Log::MSG,"Server::sigterm_signal_handler(): finished check pointing");
+   if (serverEnv_.debug()) cout << "Server::sigterm_signal_handler(): finished check pointing" << endl;
+
+   // We need re-wait each time signal handler is called
+   signals_.async_wait(boost::bind(&Server::sigterm_signal_handler, this));
+}
diff --git a/ecflow_4_0_7/Server/src/Server.hpp b/ecflow_4_0_7/Server/src/Server.hpp
new file mode 100644
index 0000000..3592b2d
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/Server.hpp
@@ -0,0 +1,159 @@
+#ifndef SERVER_HPP_
+#define SERVER_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Server.cpp
+// Author      : Avi
+// Revision    : $Revision: #62 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : ECFLOW Server. Based on ASIO
+//
+// The port numbers are divided into three ranges:
+//  o the Well Known Ports, (require root permission)  0   -1023
+//  o the Registered Ports,                            1024-49151
+//  o Dynamic and/or Private Ports.                    49151-65535
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <memory>
+#include <boost/asio.hpp>
+#include <boost/shared_ptr.hpp>
+
+// ECFLOW_MT See doc/multi-threaded-server.tar/ddoc
+//#define ECFLOW_MT 1
+#ifdef ECFLOW_MT
+#include "CConnection.hpp" // Must come before boost/serialisation headers.
+#else
+#include "Connection.hpp"  // Must come before boost/serialisation headers.
+#include "ClientToServerRequest.hpp"
+#include "ServerToClientResponse.hpp"
+#endif
+
+#include "NodeTreeTraverser.hpp"
+#include "CheckPtSaver.hpp"
+#include "AbstractServer.hpp"
+
+class ServerEnvironment;
+
+
+class Server : public AbstractServer {
+public:
+   /// Constructor opens the acceptor and starts waiting for the first incoming
+   /// connection.
+   Server(ServerEnvironment&);
+   virtual ~Server();
+
+   /// Start the server
+   /// The Server::run/io_service::run() call will block until all asynchronous operations
+   /// have finished. While the server is running, there is always at least one
+   /// asynchronous operation outstanding: the asynchronous accept call waiting
+   /// for new incoming connections.
+   void run();
+
+   /// Terminate the server gracefully. Need to cancel all timers, close all sockets
+   /// Server will hang if there are any pending async handlers
+   void terminate();
+
+private:
+
+#ifdef ECFLOW_MT
+   /// Handle completion of a accept operation.
+   void handle_accept(const boost::system::error_code& e);
+#else
+   /// Handle completion of a accept operation.
+   void handle_accept(const boost::system::error_code& e, connection_ptr conn);
+
+   /// Handle completion of a write operation.
+   void handle_write(const boost::system::error_code& e, connection_ptr conn);
+
+   /// Handle completion of a read operation.
+   void handle_read(const boost::system::error_code& e, connection_ptr conn);
+#endif
+
+   void handle_terminate();
+   void start_accept();
+   bool shutdown_socket(connection_ptr conn, const std::string& msg) const;
+
+private:
+
+   // abort server if check pt files exist, but can't be loaded
+   bool load_check_pt_file_on_startup();
+   void loadCheckPtFile();
+   bool restore_from_checkpt(const std::string& filename, bool& failed);
+   void update_defs_server_state();
+   void set_server_state(SState::State);
+
+protected: // Allow test to override
+
+   /// AbstractServer functions
+   virtual SState::State state() const { return serverState_; }
+   virtual std::pair<std::string,std::string> hostPort() const;
+   virtual defs_ptr defs() const { return defs_;}
+   virtual void updateDefs(defs_ptr,bool force);
+   virtual void clear_defs();
+   virtual void checkPtDefs(ecf::CheckPt::Mode m = ecf::CheckPt::UNDEFINED,
+                               int check_pt_interval = 0,
+                               int check_pt_save_time_alarm = 0);
+   virtual void restore_defs_from_checkpt();
+   virtual void nodeTreeStateChanged();
+   virtual bool allowTaskCommunication() const;
+   virtual void shutdown();
+   virtual void halted();
+   virtual void restart();
+   virtual bool reloadWhiteListFile(std::string& errorMsg);
+   virtual bool authenticateUser(const std::string& user);
+   virtual bool authenticateWriteAccess(const std::string& user, bool client_request_can_change_server_state);
+   virtual bool lock(const std::string& user);
+   virtual void unlock();
+   virtual const std::string& lockedUser() const;
+   virtual void traverse_node_tree_and_job_generate(const boost::posix_time::ptime& time_now, bool user_cmd_context) const;
+   virtual int poll_interval() const;
+   virtual void debug_server_on();
+   virtual void debug_server_off();
+   virtual bool debug() const;
+
+   // used in signal, for emergency check point during system session
+   void sigterm_signal_handler();
+
+private:
+
+   /// The io_service used to perform asynchronous operations.
+   boost::asio::io_service io_service_;
+
+   /// The signal_set is used to register for automatic check pointing
+   boost::asio::signal_set signals_;
+
+   /// The acceptor object used to accept incoming socket connections.
+   boost::asio::ip::tcp::acceptor acceptor_;
+
+#ifdef ECFLOW_MT
+   /// Strand to ensure the connection's handlers are not called concurrently.
+   boost::asio::io_service::strand strand_;
+   size_t  thread_pool_size_;
+   CConnection_ptr new_connection_;
+   friend class CConnection;
+#else
+   /// The data, typically loaded once, and then sent to many clients
+   ClientToServerRequest  inbound_request_;
+   ServerToClientResponse outbound_response_;
+#endif
+
+   defs_ptr defs_;             // shared because is deleted in Test, and used in System::instance()
+   NodeTreeTraverser traverser_;
+   friend class NodeTreeTraverser;
+
+   CheckPtSaver checkPtSaver_;
+   friend class CheckPtSaver;
+
+   SState::State serverState_;
+   ServerEnvironment& serverEnv_;
+   std::string userWhoHasLock_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Server/src/ServerEnvironment.cpp b/ecflow_4_0_7/Server/src/ServerEnvironment.cpp
new file mode 100644
index 0000000..44937c1
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/ServerEnvironment.cpp
@@ -0,0 +1,635 @@
+//============================================================================
+// Name        : ServerEnvironment
+// Author      : Avi
+// Revision    : $Revision: #95 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+//============================================================================
+
+#include <sys/types.h> // for getpid
+#include <unistd.h>    // for getpid
+#include <stdlib.h>    // for getenv()
+
+#include <iostream>
+#include <fstream>
+#include <iterator>
+
+#include <boost/program_options.hpp>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#ifdef ECFLOW_MT
+#include <boost/thread/thread.hpp> // needed for ECFLOW_MT and debug() to print thread ID
+#endif
+
+#include "ServerEnvironment.hpp"
+#include "ServerOptions.hpp"
+#include "WhiteListFile.hpp"
+#include "Log.hpp"
+#include "System.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "Version.hpp"
+#include "Calendar.hpp"
+#include "File.hpp"
+#include "boost_archive.hpp"
+#include "JobProfiler.hpp"
+
+using namespace ecf;
+using namespace std;
+using namespace boost;
+namespace po = boost::program_options;
+namespace fs = boost::filesystem;
+
+static std::string the_check_mode(ecf::CheckPt::Mode mode)
+{
+	switch (mode) {
+		case ecf::CheckPt::NEVER:     return "CHECK_NEVER"; break;
+		case ecf::CheckPt::ON_TIME:   return "CHECK_ON_TIME"; break;
+		case ecf::CheckPt::ALWAYS:    return "CHECK_ALWAYS"; break;
+		case ecf::CheckPt::UNDEFINED: return "UNDEFINED"; break;
+ 	}
+	cout << "ServerEnvironment.cpp theCheckMode: assert failed\n";
+	assert(false);
+	return std::string();
+}
+
+// This can be overridden by calling "server --ecfinterval 3" for test purposes
+const int defaultSubmitJobsInterval =  60;
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// class ServerEnvironment:
+///////////////////////////////////////////////////////////////////////////////////////////
+
+ServerEnvironment::ServerEnvironment( int argc, char* argv[])
+: serverHost_(host_name_.name()),
+  serverPort_(0),
+  checkPtInterval_(0),
+  checkpt_save_time_alarm_(CheckPt::default_save_time_alarm()),
+  submitJobsInterval_(defaultSubmitJobsInterval),
+#ifdef ECFLOW_MT
+  threads_(boost::thread::hardware_concurrency()),
+#endif
+  jobGeneration_(true),
+  debug_(false),
+  help_option_(false),
+  version_option_(false),
+  allow_old_client_new_server_(0),
+  checkMode_(ecf::CheckPt::ON_TIME),
+  tcp_protocol_(boost::asio::ip::tcp::v4())
+{
+   init(argc,argv,"server_environment.cfg");
+}
+
+// This is ONLY used in test
+ServerEnvironment::ServerEnvironment(int argc, char* argv[], const std::string& path_to_config_file)
+: serverHost_(host_name_.name()),
+  serverPort_(0),
+  checkPtInterval_(0),
+  checkpt_save_time_alarm_(CheckPt::default_save_time_alarm()),
+  submitJobsInterval_(defaultSubmitJobsInterval),
+#ifdef ECFLOW_MT
+  threads_(boost::thread::hardware_concurrency()),
+#endif
+  jobGeneration_(true),
+  debug_(false),
+  help_option_(false),
+  version_option_(false),
+  allow_old_client_new_server_(0),
+  checkMode_(ecf::CheckPt::ON_TIME),
+  tcp_protocol_(boost::asio::ip::tcp::v4())
+{
+   init(argc,argv,path_to_config_file);
+}
+
+void ServerEnvironment::init(int argc, char* argv[], const std::string& path_to_config_file)
+{
+   std::string log_file_name;
+   try {
+      read_config_file(log_file_name,path_to_config_file);
+      read_environment_variables(log_file_name); // overrides any settings in the config file
+   }
+   catch ( std::exception& e) {
+      std::string msg = "Exception in ServerEnvironment::ServerEnvironment() : ";
+      std::string exception_msg = e.what();
+      // On ecgate, wrong locale, causes an exception where msg is empty
+      if (exception_msg.empty()) msg += "Invalid locale? Check locale using 'locale -a', then export/set LANG environment";
+      else                       msg += e.what();
+      throw ServerEnvironmentException(msg);
+   }
+
+   // get server process id. This may be visualised in xecf. makes it easier to kill server
+   try { ecf_pid_ = boost::lexical_cast<std::string>(getpid());  }
+   catch (boost::bad_lexical_cast& e) {
+      throw ServerEnvironmentException("ServerEnvironment::ServerEnvironment:: Could not convert PID to a string\n");
+   }
+   // std::cout << "PID = " << ecf_pid_ << "\n";
+
+
+   // The options(argc/argv) must be read after the environment, since they override everything else
+   ServerOptions options(argc,argv,this);
+   help_option_ = options.help_option();
+   if (help_option_) return;    // User is printing the help
+   version_option_ = options.version_option();
+   if (version_option_) return; // User is printing the version
+
+
+   /// Config, Environment, or Options may have updated port, update port dependent file names
+   /// If we have default names make unique, by prefixing host and port
+   assert(!ecf_checkpt_file_.empty());          // expect name of form "ecf.check"
+   assert(!ecf_backup_checkpt_file_.empty());   // expect name of form "ecf.check.b"
+   assert(!log_file_name.empty());              // expect name of form "ecf.log"
+   assert(!ecf_white_list_file_.empty());       // expect name of form "ecf.lists"
+   std::string port = boost::lexical_cast<std::string>(serverPort_);
+
+   // If path is absolute leave as is
+   if (ecf_checkpt_file_ == Ecf::CHECKPT())
+      ecf_checkpt_file_ = host_name_.prefix_host_and_port(port,ecf_checkpt_file_);
+   if (ecf_checkpt_file_[0] != '/') {
+      // Prepend with ECF_HOME
+      std::string check_pt = ecf_home();
+      check_pt += Str::PATH_SEPERATOR();
+      check_pt += ecf_checkpt_file_;
+      ecf_checkpt_file_ = check_pt;
+   }
+
+   // If path is absolute leave as is
+   if (ecf_backup_checkpt_file_ == Ecf::BACKUP_CHECKPT())
+      ecf_backup_checkpt_file_ = host_name_.prefix_host_and_port(port,ecf_backup_checkpt_file_);
+   if (ecf_backup_checkpt_file_[0] != '/') {
+      std::string check_pt = ecf_home();
+      check_pt += Str::PATH_SEPERATOR();
+      check_pt += ecf_backup_checkpt_file_;
+      ecf_backup_checkpt_file_ = check_pt;
+   }
+
+   if (ecf_white_list_file_ == Str::WHITE_LIST_FILE())
+      ecf_white_list_file_ = host_name_.prefix_host_and_port(port,ecf_white_list_file_);
+
+   // Change directory to ECF_HOME and check thats its accessible
+   change_dir_to_ecf_home_and_check_accesibility();
+
+
+   // LOG FILE ================================================================================
+   if (log_file_name == Ecf::LOG_FILE())
+      log_file_name =  host_name_.prefix_host_and_port(port,log_file_name);
+
+   // Create the Log file. The log file is obtained from the environment. Hence **must** be done last.
+   Log::create(log_file_name);
+
+
+   // Init log file:
+   LOG(Log::MSG, Version::description() );
+   LOG(Log::MSG, "Started at " << to_simple_string(Calendar::second_clock_time()) << " universal time");
+   if ( tcp_protocol_.family() ==  2 /*PF_INET*/)
+      LOG(Log::MSG, "Host(" <<  hostPort().first << ")  Port(" << hostPort().second << ") using TCP/IP v4");
+   else
+      LOG(Log::MSG, "Host(" <<  hostPort().first << ")  Port(" << hostPort().second << ") using TCP/IP v6");
+   LOG(Log::MSG, "ECF_HOME " <<  ecf_home());
+   LOG(Log::MSG, "Job scheduling interval: " <<  submitJobsInterval_);
+   if (allow_old_client_new_server_ != 0) {
+      LOG(Log::MSG, "ECF_ALLOW_OLD_CLIENT_NEW_SERVER enabled: " <<  allow_old_client_new_server_);
+   }
+}
+
+ServerEnvironment::~ServerEnvironment()
+{
+	/// Destroy singleton to avoid valgrind from complaining
+	Log::destroy();
+	System::destroy();
+}
+
+bool ServerEnvironment::valid(std::string& errorMsg) const
+{
+   /// This must be called *AFTER* the constructor
+
+ 	if (serverHost_.empty()) {
+  		errorMsg = "Could not determine the server host.";
+  		return false;
+ 	}
+ 	std::stringstream ss;
+	if ( serverPort_ == 0 || serverPort_ <= 1023 || serverPort_ >= 49151) {
+
+ 		ss << "Server port " << serverPort_ << " not set correctly. \n";
+ 		ss << "The port numbers are divided into three ranges.\n";
+ 		ss << "   o the Well Known Ports, (require root permission)      0 -1023\n";
+ 		ss << "   o the Registered Ports,                             1024 -49151\n";
+ 		ss << "   o Dynamic and/or Private Ports.                    49151 -65535\n\n";
+  		ss << "Please set in the range 1024-49151 via argument or \n";
+  		ss << "Server/src/environment.cfg.h or set the environment variable ECF_PORT. \n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+	if (ecfHome_.empty()) {
+ 		ss << "No ECF_HOME specified. Please set in Server/server_environment.cfg or\n";
+		ss << "set the environment variable ECF_HOME\n";
+  		errorMsg = ss.str();
+		return false;
+	}
+	if (!Log::instance() || Log::instance()->path().empty()) {
+ 		ss << "No log file name specified. Please set in Server/server_environment.cfg or\n";
+		ss << "set the environment variable ECF_LOG\n";
+  		errorMsg = ss.str();
+		return false;
+	}
+	if ( checkPtInterval_ == 0 ) {
+ 		ss << "Checkpoint interval not set. Please set in Server/server_environment.cfg or\n";
+		ss << "set the environment variable ECF_CHECKINTERVAL. The value must be\n";
+		ss << "convertible to a integer\n";
+  		errorMsg = ss.str();
+		return false;
+	}
+	if ( submitJobsInterval_ < 1 || submitJobsInterval_ > 60) {
+		ss << "Submit jobs interval not set correctly. Please set in Server/server_environment.cfg\n";
+		ss << "or provide as an argument. It must be in the range [1-60] \n";
+  		errorMsg = ss.str();
+		return false;
+	}
+	if (ecf_checkpt_file_.empty()) {
+ 		ss << "No checkpoint file name specified. Please set in Server/server_environment.cfg or\n";
+		ss << "set the environment variable ECF_CHECK\n";
+  		errorMsg = ss.str();
+		return false;
+	}
+	if (ecf_backup_checkpt_file_.empty()) {
+ 		ss << "No old checkpoint file name specified. Please set in Server/server_environment.cfg or\n";
+		ss << "set the environment variable ECF_CHECKOLD\n";
+  		errorMsg = ss.str();
+		return false;
+	}
+	if (checkMode_ == ecf::CheckPt::UNDEFINED) {
+		ss << "No ECF_CHECKMODE specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+	if (ecf_cmd_.empty()) {
+		ss << "No ECF_JOB_CMD specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+	if (killCmd_.empty()) {
+		ss << "No ECF_KILL_CMD specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+	if (statusCmd_.empty()) {
+		ss << "No ECF_STATUS_CMD specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+	if (urlCmd_.empty()) {
+		ss << "No ECF_URL_CMD specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+	if (urlBase_.empty()) {
+		ss << "No ECF_URL_BASE specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+	if (url_.empty()) {
+		ss << "No ECF_URL specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+ 	if (ecf_micro_.empty()) {
+		ss << "No ECF_MICRODEF specified. Please set in Server/server_environment.cfg\n";
+  		errorMsg = ss.str();
+ 		return false;
+	}
+
+	// If the white list file is empty or does not exist, its perfectly valid
+	// i.e any user is free to access the server
+	if (ecf_white_list_file_.empty()) return true;
+	if (!fs::exists(ecf_white_list_file_)) return true;
+
+	if (debug()) {
+		std::cout << "White list file " << ecf_white_list_file_ << " exists, opening...\n";
+	}
+
+	/// read in the ecf white list file that specifies valid users and their access rights
+	/// If the file can't be opened returns false and an error message and false;
+	WhiteListFile theFile(ecf_white_list_file_);
+	ServerEnvironment* nonConstThis =  const_cast<ServerEnvironment*>(this);
+	bool parse_result  = theFile.parse(nonConstThis->validUsers_,errorMsg);
+
+   if (debug()) {
+      std::cout << dump_valid_users() << "\n";
+   }
+	return parse_result;
+}
+
+std::pair<std::string,std::string> ServerEnvironment::hostPort() const
+{
+ 	return std::make_pair(serverHost_,serverPort());
+}
+
+void ServerEnvironment::variables(std::vector<std::pair<std::string,std::string> >& theRetVec) const
+{
+   // Variables read in from the environment
+	   // Need to setup client environment.
+	   // The server sets these variable for use by the client. i.e when creating the jobs
+	   // The clients then uses them to communicate back with the server.
+  	theRetVec.push_back( std::make_pair(Str::ECF_PORT(), serverPort()) );
+	theRetVec.push_back( std::make_pair(std::string("ECF_NODE"), serverHost_) );
+
+	theRetVec.push_back( std::make_pair(Str::ECF_HOME(), ecfHome_) );
+	if (Log::instance()) theRetVec.push_back( std::make_pair(std::string("ECF_LOG"), Log::instance()->path()) );
+	else                 theRetVec.push_back( std::make_pair(std::string("ECF_LOG"), std::string() ));
+	theRetVec.push_back( std::make_pair(std::string("ECF_CHECK"), ecf_checkpt_file_) );
+	theRetVec.push_back( std::make_pair(std::string("ECF_CHECKOLD"), ecf_backup_checkpt_file_) );
+   theRetVec.push_back( std::make_pair(std::string("ECF_INTERVAL"), boost::lexical_cast<std::string>(submitJobsInterval_)) );
+
+	// These variable are read in from the environment, but are not exposed
+	// since they only affect the server
+	// ECF_CHECKINTERVAL
+
+   theRetVec.push_back( std::make_pair(std::string("ECF_LISTS"), ecf_white_list_file_) ); // read only variable, changing it has no effect
+
+	// variables that can be overridden, in the suite definition
+	theRetVec.push_back( std::make_pair(std::string("ECF_JOB_CMD"), ecf_cmd_) );
+	theRetVec.push_back( std::make_pair(std::string("ECF_KILL_CMD"), killCmd_) );
+	theRetVec.push_back( std::make_pair(std::string("ECF_STATUS_CMD"), statusCmd_) );
+	theRetVec.push_back( std::make_pair(std::string("ECF_URL_CMD"), urlCmd_) );
+	theRetVec.push_back( std::make_pair(std::string("ECF_URL_BASE"), urlBase_) );
+	theRetVec.push_back( std::make_pair(std::string("ECF_URL"), url_) );
+   theRetVec.push_back( std::make_pair(std::string("ECF_MICRO"), ecf_micro_) );
+
+   // Reference variable, these should be read only
+   theRetVec.push_back( std::make_pair(std::string("ECF_PID"), ecf_pid_) );          // server PID
+   theRetVec.push_back( std::make_pair(std::string("ECF_VERSION"), Version::raw()) );// server version
+}
+
+bool ServerEnvironment::reloadWhiteListFile(std::string& errorMsg)
+{
+   if (debug()) cout << "ServerEnvironment::reloadWhiteListFile:(" << ecf_white_list_file_ << ") CWD(" << fs::current_path().string() << ")\n";
+	if (ecf_white_list_file_.empty()) {
+		errorMsg += "The ECF_LISTS file ";
+		errorMsg += ecf_white_list_file_;
+		errorMsg += " has not been specified.";
+		return false;
+	}
+	if (!fs::exists(ecf_white_list_file_)) {
+		errorMsg += "The ECF_LISTS file ";
+		errorMsg += ecf_white_list_file_;
+      errorMsg += " does not exist. Server CWD : " + fs::current_path().string();
+		return false;
+	}
+
+	// Only override valid users if we successfully opened and parsed file
+	WhiteListFile theFile(ecf_white_list_file_);
+	std::map<std::string,bool> validUsers;
+ 	if (theFile.parse(validUsers,errorMsg)) {
+
+ 		validUsers_.clear();
+ 		validUsers_ = validUsers;
+
+ 	   if (debug())  std::cout << dump_valid_users() << "\n";
+ 		return true;
+ 	}
+ 	return false;
+}
+
+
+bool ServerEnvironment::authenticateUser(const std::string& user) const
+{
+	// If validUsers_ is empty , then all user are valid
+	if (validUsers_.empty()) return true;
+
+	if ( validUsers_.find(user) != validUsers_.end() ) {
+		return true;
+	}
+	return false;
+}
+
+bool ServerEnvironment::authenticateWriteAccess(const std::string& user, bool client_request_can_change_server_state) const
+{
+	// If validUsers_ is empty , then all users have write access
+	if (validUsers_.empty()) return true;
+
+	std::map<std::string,bool>::const_iterator i = validUsers_.find(user);
+	if ( i != validUsers_.end() ) {
+
+	   // (*i).second - true mean user is allowed read/write client requests
+	   //               false means user is only allowed read only client request
+	   if (client_request_can_change_server_state && (*i).second) {
+	      // request can change server state and user is allowed read/write access
+	      // authentication is OK
+	      return true;
+	   }
+	   if (!client_request_can_change_server_state) {
+	      // request is read only, and since user in the list, they must allow read requests
+	      return true;
+	   }
+ 	}
+	return false;
+}
+
+
+// ============================================================================================
+// Privates:
+// ============================================================================================
+
+void ServerEnvironment::read_config_file(std::string& log_file_name,const std::string& path_to_config_file)
+{
+   if (debug())  cout << "ServerEnvironment::read_config_file() current_path = " << fs::current_path() << "\n";
+
+   try {
+      std::string theCheckMode;
+      int the_task_threshold = 0;
+
+      // read the environment from the config file.
+      // **** Port *must* be read before log file, and check pt files
+      po::options_description config_file_options("Configuration");
+      config_file_options.add_options()
+         ("ECF_HOME",      po::value<std::string>(&ecfHome_)->default_value("."), "ECF_HOME, the home for all ECF files")
+         ("ECF_PORT",      po::value<int>(&serverPort_)->default_value(3141), "The port number. Clients must use same port.")
+         ("ECF_CHECK",     po::value<std::string>(&ecf_checkpt_file_)->default_value(Ecf::CHECKPT()), "Check point file name")
+         ("ECF_CHECKOLD",  po::value<std::string>(&ecf_backup_checkpt_file_)->default_value(Ecf::BACKUP_CHECKPT()), "Backup checkpoint file name")
+         ("ECF_LOG",       po::value<std::string>(&log_file_name)->default_value(Ecf::LOG_FILE()), "Log file name")
+         ("ECF_CHECKINTERVAL", po::value<int>(&checkPtInterval_)->default_value(CheckPt::default_interval()), "The interval in seconds to save check point file")
+         ("ECF_INTERVAL",  po::value<int>(&submitJobsInterval_)->default_value(defaultSubmitJobsInterval), "Check time dependencies and submit any jobs")
+         ("ECF_CHECKMODE", po::value<std::string>(&theCheckMode), "The check mode, must be one of CHECK_NEVER, CHECK_ON_TIME, CHECK_ALWAYS")
+         ("ECF_JOB_CMD",   po::value<std::string>(&ecf_cmd_)->default_value(Ecf::JOB_CMD()), "Command to be executed to submit a job.")
+         ("ECF_KILL_CMD",  po::value<std::string>(&killCmd_)->default_value(Ecf::KILL_CMD()), "Command to be executed to kill a job.")
+         ("ECF_STATUS_CMD",po::value<std::string>(&statusCmd_)->default_value(Ecf::STATUS_CMD()), "Command to be obtain the status.")
+         ("ECF_URL_CMD",   po::value<std::string>(&urlCmd_)->default_value(Ecf::URL_CMD()), "Command to be obtain url.")
+         ("ECF_URL_BASE",  po::value<std::string>(&urlBase_)->default_value(Ecf::URL_BASE()), "Defines url base.")
+         ("ECF_URL",       po::value<std::string>(&url_)->default_value(Ecf::URL()), "The default url.")
+         ("ECF_MICRODEF",  po::value<std::string>(&ecf_micro_)->default_value(Ecf::MICRO()), "Preprocessor character for variable substitution and including files")
+         ("ECF_LISTS",     po::value<std::string>(&ecf_white_list_file_)->default_value(Str::WHITE_LIST_FILE()), "Path name to file the list valid users and thier access rights")
+         ("ECF_TASK_THRESHOLD",po::value<int>(&the_task_threshold)->default_value(JobProfiler::task_threshold_default()),"The defaults thresholfs when profiling job generation")
+         ;
+
+      ifstream ifs(path_to_config_file.c_str());
+      if (!ifs) {
+         if (debug()) cout << "Could not load server_environment.cfg " << path_to_config_file << "\n";
+      }
+
+      /// This is *NOT* redundant, when the file is empty/not present, then the default value
+      /// defined above are set.
+      po::variables_map vm;
+      po::store(parse_config_file(ifs, config_file_options), vm);
+      po::notify( vm);
+
+      if (theCheckMode == "CHECK_ON_TIME")     checkMode_ = ecf::CheckPt::ON_TIME;
+      else if (theCheckMode == "CHECK_NEVER")  checkMode_ = ecf::CheckPt::NEVER;
+      else if (theCheckMode == "CHECK_ALWAYS") checkMode_ = ecf::CheckPt::ALWAYS;
+
+      if (the_task_threshold != 0 ) {
+         JobProfiler::set_task_threshold(the_task_threshold);
+      }
+   }
+   catch(std::exception& e)
+   {
+      cerr << "ServerEnvironment::read_config_file() " <<  e.what() << "\n";
+   }
+}
+
+void ServerEnvironment::read_environment_variables(std::string& log_file_name)
+{
+	if (debug()) cout << "ServerEnvironment::read_environment_variables()\n";
+
+	char* serverPort = getenv(Str::ECF_PORT().c_str());
+	if (serverPort) {
+		std::string port = serverPort;
+		try { serverPort_ = boost::lexical_cast< int >( port ); }
+		catch (boost::bad_lexical_cast& e) {
+			std::stringstream ss;
+			ss << "ServerEnvironment::read_environment_variables(): ECF_PORT is defined(" << port << ") but value is *not* convertible to an integer\n";
+			throw ServerEnvironmentException(ss.str());
+ 		}
+	}
+	char* checkPtInterval = getenv("ECF_CHECKINTERVAL");
+	if (checkPtInterval) {
+		std::string interval = checkPtInterval;
+		try { checkPtInterval_ = boost::lexical_cast< int >( interval ); }
+		catch (boost::bad_lexical_cast& e) {
+			std::stringstream ss;
+			ss << "ServerEnvironment::read_environment_variables(): ECF_CHECKINTERVAL is defined(" << interval << ") but value is *not* convertible to an integer\n";
+			throw ServerEnvironmentException(ss.str());
+		}
+	}
+
+	char* ecfHome = getenv(Str::ECF_HOME().c_str());
+	if (ecfHome) ecfHome_ = ecfHome;
+	if( ecfHome_ == "." )  { // expand to absolute paths
+		ecfHome_ =  fs::current_path().string();
+	}
+
+	char* logFileName = getenv("ECF_LOG");
+	if (logFileName) log_file_name = logFileName;
+
+	char* checkPtFileName = getenv("ECF_CHECK");
+	if (checkPtFileName) ecf_checkpt_file_ = checkPtFileName;
+
+	char* oldCheckPtFileName = getenv("ECF_CHECKOLD");
+	if (oldCheckPtFileName) ecf_backup_checkpt_file_ = oldCheckPtFileName;
+
+	char* smsWhiteListFile = getenv("ECF_LISTS");
+	if (smsWhiteListFile) ecf_white_list_file_ = smsWhiteListFile;
+
+	if (getenv("ECF_DEBUG_SERVER")) {
+		debug_ = true; // can also be enabled via --debug option
+	}
+
+	if (getenv("ECF_ALLOW_OLD_CLIENT_NEW_SERVER")) {
+	   // we don't need exact version of boost archive version of old client, since we can determine
+	   // this from the message sent to the server from the *old* client
+	   allow_old_client_new_server_ = ecf::boost_archive::version_1_47();
+	}
+
+   char* threshold = getenv("ECF_TASK_THRESHOLD");
+   if ( threshold ) {
+      std::string task_threshold = threshold;
+      try {
+         JobProfiler::set_task_threshold(boost::lexical_cast<int>(task_threshold));
+      }
+      catch ( ... ) {
+         std::stringstream ss;
+         ss << "ServerEnvironment::read_environment_variables(): ECF_TASK_THRESHOLD is defined(" << threshold << ") but value is *not* convertible to an integer\n";
+         throw ServerEnvironmentException(ss.str());
+      }
+   }
+}
+
+std::string ServerEnvironment::serverPort() const
+{
+	return boost::lexical_cast< std::string >( serverPort_ );
+}
+
+void ServerEnvironment::change_dir_to_ecf_home_and_check_accesibility()
+{
+	if( chdir(ecfHome_.c_str()) != 0 ) {
+		std::stringstream ss;
+		ss << "Can't chdir to ECF_HOME " << ecfHome_ << "\n";
+		throw ServerEnvironmentException(ss.str());
+	}
+	if( access(ecfHome_.c_str() , X_OK|R_OK|W_OK) != 0 ) {
+		// R_OK test for read permission
+		// W_OK test for write permission
+		// X_OK test for execute or search permission
+		// F_OK  test whether the directories leading to the file can be searched and the file exists.
+		std::stringstream ss;
+		ss << "Access restriction on ECF_HOME " << ecfHome_ << "\n";
+		throw ServerEnvironmentException(ss.str());
+	}
+}
+
+std::string ServerEnvironment::check_mode_str() const { return the_check_mode(checkMode_);}
+
+std::string ServerEnvironment::dump() const
+{
+   std::stringstream ss;
+	ss << "ECF_HOME = '" << ecfHome_ << "'\n";
+	if (Log::instance()) ss << "ECF_LOG = '" << Log::instance()->path() << "'\n";
+	else                 ss << "ECF_LOG = ''\n";
+	ss << "ECF_PORT = '" << serverPort_ << "'\n";
+	ss << "ECF_CHECK = '" << ecf_checkpt_file_ << "'\n";
+	ss << "ECF_CHECKOLD = '" << ecf_backup_checkpt_file_ << "'\n";
+	ss << "ECF_CHECKINTERVAL = '" << checkPtInterval_ << "'\n";
+	ss << "ECF_INTERVAL = '" << submitJobsInterval_ << "'\n";
+	ss << "ECF_CHECKMODE = '" << the_check_mode(checkMode_) << "'\n";
+	ss << "ECF_JOB_CMD = '" << ecf_cmd_ << "'\n";
+	ss << "ECF_KILL_CMD = '" << killCmd_ << "'\n";
+	ss << "ECF_STATUS_CMD = '" << statusCmd_ << "'\n";
+	ss << "ECF_URL_CMD = '" << urlCmd_ << "'\n";
+	ss << "ECF_URL_BASE = '" << urlBase_ << "'\n";
+	ss << "ECF_URL = '" << url_ << "'\n";
+	ss << "ECF_MICRO = '" << ecf_micro_ << "'\n";
+   ss << "check pt save time alarm " << checkpt_save_time_alarm_ << "\n";
+   ss << "Job generation " << jobGeneration_ << "\n";
+   ss << "Server host name " << serverHost_ << "\n";
+#ifdef ECFLOW_MT
+   ss << "No of threads used by server " << threads_ << "\n";
+#endif
+   if ( tcp_protocol_.family() ==  2 /*PF_INET*/)  ss << "TCP Protocol  v4 \n";
+   else if ( tcp_protocol_.family() ==  10 /*PF_INET6*/)  ss << "TCP Protocol  v6 \n";
+
+	ss << dump_valid_users();
+	return ss.str();
+}
+
+std::string ServerEnvironment::dump_valid_users() const
+{
+   std::stringstream ss;
+   ss << "ECF_LISTS = '" << ecf_white_list_file_ << "'\n";
+   if (validUsers_.empty()) ss << " No users specified. Everyone has read/write access\n";
+
+   std::map<std::string,bool>::const_iterator i;
+   for(i=validUsers_.begin(); i!= validUsers_.end(); ++i) {
+      ss << " User: " << (*i).first;
+      if ((*i).second) ss << " has read/write access\n";
+      else            ss << " has read access only\n";
+   }
+   return ss.str();
+}
+
diff --git a/ecflow_4_0_7/Server/src/ServerEnvironment.hpp b/ecflow_4_0_7/Server/src/ServerEnvironment.hpp
new file mode 100644
index 0000000..c62af60
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/ServerEnvironment.hpp
@@ -0,0 +1,216 @@
+#ifndef SERVER_ENVIRONMENT_HPP_
+#define SERVER_ENVIRONMENT_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : ServerEnvironment
+// Author      : Avi
+// Revision    : $Revision: #52 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+// The server environment is read from the configuration file. This defines
+// the defaults for the server,and is configurable by the user, at run time
+// Alternatively some variable can be set via environment. See environment.cfg
+//
+// The server must be created before the log file. Since the log is initialised
+// with the log file name from the server environment
+//
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <string>
+#include <vector>
+#include <map>
+#include <exception>
+#include <boost/noncopyable.hpp>
+#include <boost/asio.hpp>
+
+#include "Host.hpp"
+#include "CheckPt.hpp"
+
+// Added ServerEvinronmentException so that it can be in the same scope as server
+// in ServerMain. Previously we had a separate try block
+// Also distinguish between server and environment errors
+class ServerEnvironmentException : public std::runtime_error {
+public:
+   ServerEnvironmentException(const std::string& msg) : std::runtime_error(msg) {}
+};
+
+
+class ServerEnvironment : private boost::noncopyable {
+public:
+   ServerEnvironment(int argc, char* argv[]);
+   ServerEnvironment(int argc, char* argv[], const std::string& path_to_config_file); // *only used in test*
+	~ServerEnvironment();
+
+	/// return true if option are valid false and error message otherwise
+	bool valid(std::string& errorMsg) const;
+
+	/// return the directory path associated with smshome
+	/// but can be overridden by the environment variable ECF_HOME
+	std::string ecf_home() const { return ecfHome_; }
+
+	/// returns the server host and port
+	std::pair<std::string,std::string> hostPort() const;
+
+	/// returns the server port. This has a default value defined in server_environment.cfg
+	/// but can be overridden by the environment variable ECF_PORT
+	int port() const { return serverPort_;}
+
+	/// returns the TCP protocol. default is TCPv4. Can be changed via command line to TCPv6
+	boost::asio::ip::tcp tcp_protocol() const { return tcp_protocol_;}
+
+	/// Return true if job generation is enabled. By default job generation is enabled however
+	/// for test/debug we can elect to disable, it.
+	bool jobGeneration() const { return jobGeneration_;}
+
+   /// Forward compatibility allow old clients to talk to new server
+	/// Temp: This allows ecflow  to be built. i.e we have old clients(3.0.x), installed on different machines
+	///       they need to talk to new server. (i.e since we can't change the old clients)
+   /// This is controlled with ECF_ALLOW_OLD_CLIENT_NEW_SERVER
+   int allow_old_client_new_server() const { return allow_old_client_new_server_;}
+
+
+	/// Whenever we save the checkpt, we time how long this takes.
+	/// For very large definition the time can be significant and start to interfere with
+	/// the scheduling. (i.e since write to disk is blocking).
+	/// The default is 30 seconds. When the save time exceeds this, the late flag is
+	/// set on the definition. This needs to be manually reset.
+	size_t checkpt_save_time_alarm() const { return checkpt_save_time_alarm_;}
+	void set_checkpt_save_time_alarm(size_t t) { checkpt_save_time_alarm_ = t ;}
+
+	/// returns the path of the checkpoint file. This has a default name set in server_environment.cfg
+	/// but can be overridden by the environment variable ECF_CHECK
+   /// if the check point file starts with an absolute path return as is:
+   /// otherwise returns ECF_HOME/ecf_checkpt_file_
+	const std::string& checkPtFilename() const { return ecf_checkpt_file_; }
+
+	/// returns the path of the old checkPointFile. This has a default name set in server_environment.cfg
+	/// but can be overridden by the environment variable ECF_CHECKOLD
+   /// if the check point file starts with an absolute path return as is:
+   /// otherwise returns ECF_HOME/ecf_backup_checkpt_file_
+	const std::string& oldCheckPtFilename() const { return ecf_backup_checkpt_file_; }
+
+	/// returns the checkPt interval. This is the time in seconds, at which point the server
+	/// serializes the defs node tree. This is called the check point file.
+	/// This has a default value set in environment.cfg
+	/// but can be overridden by the environment variable ECF_CHECKINTERVAL
+	/// if set via environment variable it must be convertible to an integer
+	int checkPtInterval() const { return checkPtInterval_;}
+
+	/// set the check point interval. Typically set via client interface
+	/// value should > 0 for valid values.
+	void set_checkpt_interval(int v) { if (v > 0) checkPtInterval_ = v;}
+
+	/// returns the check mode. This specifies options for saving of the checkPoint file:
+   ecf::CheckPt::Mode checkMode() const { return checkMode_;}
+   void set_check_mode(ecf::CheckPt::Mode m) { checkMode_ = m; }
+   std::string check_mode_str() const;
+
+	/// returns the number of seconds at which we should check time dependencies
+	/// this includes evaluating trigger dependencies and submit the corresponding jobs.
+	/// This is set at 60 seconds. But will vary for debug/test purposes only.
+	/// For Testing the state change queued->submitted->active duration < submitJobsInterval
+	/// If this state change happens at the job submission boundary then
+	/// time series can get a skew.
+	int submitJobsInterval() const { return submitJobsInterval_;}
+
+	/// returns server variables, as vector of pairs.
+	/// Some of these variables hold environment variables
+	/// Note:: additional variable are created for use by clients, i.e like
+	///        ECF_PORT(jobs, server, client)
+	///        ECF_NODE(jobs).   ECF_NODE is the server machine host name
+  	void variables(std::vector<std::pair<std::string,std::string> >&) const;
+
+	/// Ask the server to reload file the hold list of users and their access rights
+	/// The white list file is specified by the environment variable ECF_LISTS
+	/// This allows/disallows user access on the live server
+	/// Return true if file is reloaded ok, else false and error message if:
+	/// 	a/ File does not exist
+	///  	b/ File is empty
+	///  	c/ Errors in parsing file
+	/// If errors arise the exist user still stay in affect
+  	bool reloadWhiteListFile(std::string& errorMsg);
+
+#ifdef ECFLOW_MT
+  	// returns the numbers threads to be used by the server.
+   size_t threads() const { return threads_; };
+#endif
+
+	/// There are several kinds of authentification:
+	///     a/ None
+	///     b/ List mode.   ASCII file based on ECF_LISTS is defined
+	///     c/ Secure mode. binary file based ECF_PASSWD is defined
+	/// At the moment we will only implement options a/ and b/
+	//
+	/// Returns true if the given user has access to the server, false otherwise
+	bool authenticateUser(const std::string& user)const;
+ 	bool authenticateWriteAccess(const std::string& user, bool client_request_can_change_server_state) const;
+
+	/// return true if help option was selected
+   bool help_option() const  { return help_option_; }
+   bool version_option() const  { return version_option_; }
+
+ 	/// debug is enabled via --debug or server invocation
+ 	bool debug() const { return debug_;}
+   void set_debug(bool f) { debug_ = f;}
+
+	std::string dump() const;
+
+private:
+   void init(int argc, char* argv[], const std::string& path_to_config_file);
+
+	///  defaults are read from a config file
+	void read_config_file(std::string& log_file_name,const std::string& path_to_config_file);
+
+	/// Get the standard environment variables, overwrite any settings from config file
+	void read_environment_variables(std::string& log_file_name);
+
+	/// Convert server port to a string
+	std::string serverPort() const;
+
+	void change_dir_to_ecf_home_and_check_accesibility();
+
+	/// dump out current settings
+	std::string dump_valid_users() const;
+
+private:
+	ecf::Host host_name_;
+	std::string serverHost_; // must be after host_name_, since used in init
+	int  serverPort_;
+	int  checkPtInterval_;
+	int  checkpt_save_time_alarm_;
+	int  submitJobsInterval_;
+#ifdef ECFLOW_MT
+	size_t threads_;
+#endif
+	bool jobGeneration_;   // used in debug/test mode only
+	bool debug_;
+   bool help_option_;
+   bool version_option_;
+	int allow_old_client_new_server_;
+ 	ecf::CheckPt::Mode checkMode_;
+	std::string ecfHome_;
+	std::string ecf_checkpt_file_;
+	std::string ecf_backup_checkpt_file_;
+	std::string ecf_pid_;
+	std::string killCmd_;
+	std::string statusCmd_;
+	std::string urlCmd_;
+	std::string urlBase_;
+	std::string url_;
+	std::string ecf_cmd_;
+	std::string ecf_micro_;
+   std::string ecf_white_list_file_;
+	std::map<std::string,bool> validUsers_;  // first user name, second true is write access, false read access
+	boost::asio::ip::tcp tcp_protocol_;      // defaults to IPv4 TCP protocol
+	friend class ServerOptions;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Server/src/ServerMain.cpp b/ecflow_4_0_7/Server/src/ServerMain.cpp
new file mode 100644
index 0000000..75c80db
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/ServerMain.cpp
@@ -0,0 +1,79 @@
+//============================================================================
+// Name        : ServerMain
+// Author      : Avi
+// Revision    : $Revision: #37 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : Server
+//============================================================================
+
+#include <memory>
+#include "Server.hpp"
+#include "Log.hpp"
+#include "ServerEnvironment.hpp"
+
+using namespace ecf;
+using namespace std;
+
+int main( int argc, char* argv[] ) {
+
+   try {
+      // Get the environment settings, and parse argument line and init the log file
+      ServerEnvironment server_environment(argc, argv);  // This can throw ServerEnvironmentException
+      if ( server_environment.help_option()) return 0;
+      if ( server_environment.version_option()) return 0;
+      std::string errorMsg;
+      if (!server_environment.valid(errorMsg))  {
+         cerr << errorMsg;
+         ecf::log(Log::ERR,errorMsg);
+         return 1;
+      }
+
+      if (server_environment.debug()) cout << "Server started: ------------------------------------------------>port:" << server_environment.port() <<  endl;
+      Server theServer( server_environment ); // This can throw exception, bind address in use.
+      for(;;) {
+         try {
+            theServer.run();
+            if (server_environment.debug()) cout << "Normal exit from server\n";
+            break;
+         }
+         catch ( std::exception& e ) {
+            // deal with errors from the handlers
+            std::string msg = "ServerMain:: "; msg += e.what();
+            std::cerr << msg  << endl;
+            ecf::log(Log::ERR,msg);
+         }
+      }
+
+      if (server_environment.debug()) cout << "Server EXITING: <------------------------------------------------ port:" << server_environment.port() <<  endl;
+      return 0;
+   }
+   catch ( ServerEnvironmentException& e ) {
+      // *** deal with server options and environment exceptions
+      std::cerr << "Could not load the server environment or options :\n" << e.what() << "\n";
+      std::cerr << "Invalid locale? Check locale using 'locale -a', then export/set LANG environment\n";
+   }
+   catch ( std::exception& e ) {
+      // *** deal with errors from the server constructor ****
+      std::string msg = "Exception in ServerMain:: "; msg += e.what();
+      std::cerr << msg  << endl;
+      ecf::log(Log::ERR,msg);
+
+      // dump server environment
+      cerr << "\nServer environment:\n";
+      ServerEnvironment server_env(argc, argv);  // This can throw ServerEnvironmentException
+      std::cerr << server_env.dump();
+   }
+   catch ( ... ) {
+       std::string msg = "ServerMain:: unknown exception";
+       std::cerr << msg  << endl;
+       ecf::log(Log::ERR,msg);
+   }
+   return 1;
+}
diff --git a/ecflow_4_0_7/Server/src/ServerOptions.cpp b/ecflow_4_0_7/Server/src/ServerOptions.cpp
new file mode 100644
index 0000000..4bc8da5
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/ServerOptions.cpp
@@ -0,0 +1,160 @@
+//============================================================================
+// Name        : ServerOptions
+// Author      : Avi
+// Revision    : $Revision: #28 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "ServerOptions.hpp"
+#include "Version.hpp"
+#include "ServerEnvironment.hpp"
+#include <boost/lexical_cast.hpp>
+#include <iostream>
+
+using namespace std;
+using namespace ecf;
+namespace po = boost::program_options;
+
+ServerOptions::ServerOptions( int argc, char* argv[],ServerEnvironment* env )
+{
+	std::stringstream ss;
+	ss << "\n" << Version::description() << "\nServer options";
+   po::options_description desc( ss.str() , po::options_description::m_default_line_length + 80 );
+
+	desc.add_options()
+( "help,h",
+         "The server reads the LANG for the locale. Please ensure that\n"
+         "locale is valid otherwise the server will abort on startup.\n"
+         "For a list of valid locale use 'locale -a'.\n"
+         "\n"
+         "The server will read the following environment variables:\n"
+         "ECF_PORT:\n"
+         "  Defines the port that the server will listen to.\n"
+         "  The port number must be consistent between client and server\n"
+         "  If two servers are started on the same machine with same port\n"
+         "  then a 'Address in use' error is shown and server will exit.\n"
+         "  The default value for client/server is 3141\n"
+         "ECF_HOME:\n"
+         "  This is the home/root for all '.ecf' scripts.\n"
+         "  When the server starts it will change directory to ECF_HOME,\n"
+         "  hence the directory must be accessible and writable.\n"
+         "  The default value is the current working directory\n"
+         "ECF_LOG:\n"
+         "  Overrides the name of log file.\n"
+         "  The default log file name is: <host>.<port>.ecf.log, i.e. machine1.3141.ecf.log\n"
+         "  this is required since we can have multiple servers for a single machine.\n"
+         "  Where each server will have a separate port number.\n"
+         "  Note: Any settings will be prepended with <host>.<port>.\n"
+         "ECF_CHECK:\n"
+         "  Defines the name of the check point file.\n"
+         "  This stores the state of the definition in memory,\n"
+         "  and allows recovery from crash. By default the server on start up will load\n"
+         "  the check point file or back up check point file if they exist.\n"
+         "  The default is <host>.<port>.ecf.check\n"
+         "  Any settings will be prepended with <host>.<port>.\n"
+         "ECF_CHECKOLD:\n"
+         "  The name of the backup checkpoint file\n"
+         "  default is <host>.<port>.ecf.check.b\n"
+         "  Any settings will be prepended with <host>.<port>.\n"
+         "ECF_CHECKINTERVAL:\n"
+         "  The interval in seconds within the server that the checkpoint file is saved\n"
+         "  Values less than 60 seconds are not recommended\n"
+         "  The default value is 120 seconds\n"
+         "ECF_LISTS:\n"
+         "  This variable is used to identify a file, that lists the user\n"
+         "  who can access the server via client commands. Each client command\n"
+         "  (ignoring child commands, i.e init, complete, event, meter, label, wait)\n"
+         "  will encode the user name of the process initiating the client request\n"
+         "  This is then compared with list of users in the ecf.lists file.\n"
+         "  If this file is empty, then no authentication is done.\n"
+         "  Each server can potentially have a different list.\n"
+         "  The default is <host>.<port>.ecf.lists\n"
+         "  Note: Any settings will be prepended with <host>.<port>.\n"
+         "ECF_TASK_THRESHOLD:\n"
+         "  The Job generation process is expected to take less than 60 seconds\n"
+         "  This is used to aid debugging of task tasking excessive times for job generation\n"
+         "  The causes can be:\n"
+         "    a/ Slow disk I/0, or when server is run an a virtual machine\n"
+         "    b/ Insufficient memory, when compared to the size of the scripts/definition\n"
+         "    c/ Large number of jobs submitted at the same time, and/or very large scripts\n"
+         "  Any task taking longer than the specified time in milliseconds will be logged.\n"
+         "  WAR:[..] Job generation for task /suite/family/dodgy_task took 5000ms, Exceeds ECF_TASK_THRESHOLD(4000ms)\n"
+         "  The default threshold is 4000 milliseconds\n"
+         "  Note: 1000 milliseconds = 1 second\n"
+         "    export ECF_TASK_THRESHOLD=1500\n"
+         "\n"
+         "These defaults along with several other can be specified in the file\n"
+         "server_environment.cfg. The file should be placed in the current working\n"
+         "directory. It can be found in ecFlow source tree under Server/ directory.\n"
+         "Please read this file to see the available options.\n"
+ 		   "Note: Environment variables _override_ any settings made in the\n"
+		   "server_environment.cfg file."
+)
+( "port",  po::value< int >(),       "<int> <Allowed range 1024-49151> The socket/port the server is listening too. default = 3141\n"
+                                      "If set will override the environment variable ECF_PORT"
+)
+( "ecfinterval",  po::value< int >(), "<int> <Allowed range 1-60>  Submit jobs interval. For DEBUG/Test only" )
+#ifdef ECFLOW_MT
+( "threads",  po::value< int >(),      "<int> No of threads used by the server. Default is no of cores on machine" )
+#endif
+( "v6",                               "Use IPv6 TCP protocol. Default is IPv4" )
+( "dis_job_gen",                      "Disable job generation. For DEBUG/Test only." )
+( "debug,d",                          "Enable debug output." )
+( "version,v",                        "Show ecflow version number,boost library version, compiler used and compilation date, then exit" )
+ 	;
+
+	po::store( po::parse_command_line( argc, argv, desc ), vm_ );
+	po::notify( vm_ );
+
+	if ( vm_.count( "help" ) ) cout << desc << "\n";
+
+	if ( vm_.count( "version" ) )  {
+	   cout << Version::description()  << "\n";
+	}
+
+	if ( vm_.count( "debug" ) )  env->debug_ = true;
+
+
+ 	if ( vm_.count( "port" ) ) {
+ 		if (env->debug_) cout << "ServerOptions:: The port number set to '" << vm_["port"].as< int > () << "'\n";
+		env->serverPort_ = vm_["port"].as< int > ();
+ 	}
+	if ( vm_.count( "ecfinterval" ) ) {
+		if (env->debug_) cout << "ServerOptions: The ecfinterval set to '" << vm_["ecfinterval"].as< int > () << "'\n";
+		env->submitJobsInterval_ = vm_["ecfinterval"].as< int > ();
+ 	}
+   if ( vm_.count( "v6" ) ) {
+      if (env->debug_) cout << "ServerOptions: The tcp protocol set to v6\n";
+      env->tcp_protocol_ = boost::asio::ip::tcp::v6();
+   }
+	if ( vm_.count( "dis_job_gen" ) ) {
+		if (env->debug_) cout << "ServerOptions: The dis_job_gen is set\n";
+		env->jobGeneration_ = false;
+ 	}
+
+#ifdef ECFLOW_MT
+   if ( vm_.count( "threads" ) ) {
+      if (env->debug_) cout << "ServerOptions: The numbers of threads set to '" << vm_["threads"].as< int > () << "'\n";
+      env->threads_ = vm_["threads"].as< int > ();
+   }
+#endif
+}
+
+bool ServerOptions::help_option() const
+{
+	if ( vm_.count( "help" ) ) return true;
+	return false;
+}
+
+bool ServerOptions::version_option() const
+{
+   if ( vm_.count( "version" ) ) return true;
+   return false;
+}
diff --git a/ecflow_4_0_7/Server/src/ServerOptions.hpp b/ecflow_4_0_7/Server/src/ServerOptions.hpp
new file mode 100644
index 0000000..eb4f4e9
--- /dev/null
+++ b/ecflow_4_0_7/Server/src/ServerOptions.hpp
@@ -0,0 +1,38 @@
+#ifndef SERVER_OPTIONS_HPP_
+#define SERVER_OPTIONS_HPP_
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : ServerOptions
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+// This class will parse the server arguments
+// It will update the ServerEnvironment
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+#include <boost/program_options.hpp>
+#include <boost/noncopyable.hpp>
+
+class ServerEnvironment;
+
+class ServerOptions : private boost::noncopyable {
+public:
+	ServerOptions(int argc, char* argv[], ServerEnvironment*);
+
+	/// return true if help selected, else false
+   bool help_option() const;
+   bool version_option() const;
+
+private:
+ 	boost::program_options::variables_map vm_;
+};
+#endif
diff --git a/ecflow_4_0_7/Server/test/TestServer1.cpp b/ecflow_4_0_7/Server/test/TestServer1.cpp
new file mode 100644
index 0000000..c0516a0
--- /dev/null
+++ b/ecflow_4_0_7/Server/test/TestServer1.cpp
@@ -0,0 +1,135 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+#include "boost/filesystem/operations.hpp"
+
+#include "ServerEnvironment.hpp"
+#include "Log.hpp"
+#include "Host.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "File.hpp"
+#include "Server.hpp"
+#include "Defs.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestServer )
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// make public the function we wish to test:
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+class TestServer : public Server {
+public:
+   TestServer(ServerEnvironment& s) : Server(s) {}
+   virtual ~TestServer() {}
+
+   // abort server if check pt files exist, but can't be loaded
+   //   bool load_check_pt_file_on_startup();
+   //   void loadCheckPtFile();
+   //   bool restore_from_checkpt(const std::string& filename, bool& failed);
+   //   void set_server_state(SState::State);
+
+   /// AbstractServer functions
+   virtual SState::State state() const { return Server::state(); }
+   virtual std::pair<std::string,std::string> hostPort() const { return Server::hostPort(); }
+   virtual defs_ptr defs() const { return Server::defs();}
+   // virtual void updateDefs(defs_ptr,bool force);
+   virtual void clear_defs() { Server::clear_defs();}
+   //   virtual void checkPtDefs(ecf::CheckPt::Mode m = ecf::CheckPt::UNDEFINED,
+   //                               int check_pt_interval = 0,
+   //                               int check_pt_save_time_alarm = 0);
+   virtual void restore_defs_from_checkpt() { Server::restore_defs_from_checkpt();}
+   virtual void nodeTreeStateChanged()  { Server::nodeTreeStateChanged(); }
+   virtual bool allowTaskCommunication() const { return Server::allowTaskCommunication();}
+   virtual void shutdown() { Server::shutdown(); }
+   virtual void halted() { Server::halted(); }
+   virtual void restart() { Server::restart(); }
+   virtual bool reloadWhiteListFile(std::string& errorMsg) { return Server::reloadWhiteListFile(errorMsg);}
+   virtual bool authenticateUser(const std::string& user) { return Server::authenticateUser(user); }
+   virtual bool authenticateWriteAccess(const std::string& user, bool client_request_can_change_server_state) { return Server::authenticateWriteAccess(user,client_request_can_change_server_state); }
+   virtual bool lock(const std::string& user) { return Server::lock(user); }
+   virtual void unlock() { Server::unlock();}
+   virtual const std::string& lockedUser() const { return Server::lockedUser(); }
+   //   virtual void traverse_node_tree_and_job_generate(const boost::posix_time::ptime& time_now, bool user_cmd_context) const;
+   virtual int poll_interval() const { return Server::poll_interval();}
+   //   virtual void debug_server_on();
+   //   virtual void debug_server_off();
+   //   virtual bool debug() const;
+};
+
+
+BOOST_AUTO_TEST_CASE( test_server )
+{
+   cout << "Server:: ...test_server\n";
+
+   int argc = 3;
+   char* argv[] = { const_cast<char*>("ServerEnvironment"),
+                     const_cast<char*>("--port=3144"),
+                     const_cast<char*>("--ecfinterval=12")
+                   };
+
+   ServerEnvironment server_environment(argc, argv);  // This can throw ServerEnvironmentException
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE(server_environment.valid(errorMsg),errorMsg);
+
+   {
+      TestServer theServer( server_environment ); // This can throw exception, bind address in use.
+
+      BOOST_REQUIRE_MESSAGE(theServer.defs(),"Expected defs to be created");
+
+      const std::vector<Variable>& server_variables = theServer.defs()->server().server_variables();
+      BOOST_REQUIRE_MESSAGE(!server_variables.empty(),"Expected defs to be updated with the server variables");
+
+      //for(size_t i = 0; i < server_variables.size(); ++i)  cout << server_variables[i].dump() << "\n";
+      const std::string& ecf_port = theServer.defs()->server().find_variable("ECF_PORT");
+      BOOST_REQUIRE_MESSAGE(ecf_port == "3144","Expected port 3144 but found " << ecf_port << " defs server variables, should be in sync with server");
+
+
+      const std::string& interval = theServer.defs()->server().find_variable("ECF_INTERVAL");
+      BOOST_REQUIRE_MESSAGE(interval == "12","Expected interval 12 but found " << interval << " defs server variables, should be in sync with server");
+      BOOST_REQUIRE_MESSAGE(theServer.poll_interval() == 12,"Expected poll interval 12 but found " << theServer.poll_interval());
+
+
+      BOOST_REQUIRE_MESSAGE(theServer.state() == SState::HALTED,"Expected halted at server start but found " << SState::to_string(theServer.state()));
+      theServer.halted(); BOOST_REQUIRE_MESSAGE(theServer.state() == SState::HALTED,"Expected halted ");
+      theServer.shutdown(); BOOST_REQUIRE_MESSAGE(theServer.state() == SState::SHUTDOWN,"Expected shutdown ");
+      theServer.restart(); BOOST_REQUIRE_MESSAGE(theServer.state() == SState::RUNNING,"Expected shutdown ");
+
+
+      BOOST_REQUIRE_MESSAGE(theServer.lock("fred"),"Expected to lock user fred");
+      BOOST_REQUIRE_MESSAGE(theServer.state() == SState::SHUTDOWN,"Locking should shutdown server");
+      BOOST_REQUIRE_MESSAGE(theServer.lockedUser() == "fred","Expected locked user 'fred' but found " << theServer.lockedUser());
+      theServer.unlock();
+      BOOST_REQUIRE_MESSAGE(theServer.lockedUser().empty(),"Expected no locked user but found " << theServer.lockedUser());
+      BOOST_REQUIRE_MESSAGE(theServer.state() == SState::RUNNING,"Expected unlock to restart server ");
+   }
+
+   Host h;
+   fs::remove(h.ecf_log_file(Str::DEFAULT_PORT_NUMBER()));
+
+   /// Destroy Log singleton to avoid valgrind from complaining
+   Log::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Server/test/TestServerEnvironment.cpp b/ecflow_4_0_7/Server/test/TestServerEnvironment.cpp
new file mode 100644
index 0000000..a1205d5
--- /dev/null
+++ b/ecflow_4_0_7/Server/test/TestServerEnvironment.cpp
@@ -0,0 +1,364 @@
+#define BOOST_TEST_MODULE Server
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+#include "boost/filesystem/operations.hpp"
+
+#include "ServerEnvironment.hpp"
+#include "Log.hpp"
+#include "Host.hpp"
+#include "Str.hpp"
+#include "Ecf.hpp"
+#include "File.hpp"
+#include "CheckPt.hpp"
+#include "JobProfiler.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestServer )
+
+
+BOOST_AUTO_TEST_CASE( test_server_environment_ecfinterval )
+{
+	cout << "Server:: ...test_server_environment_ecfinterval\n";
+
+	// ecflow server interval is valid for range [1-60]
+	for(int i=-10; i< 70; ++i)
+	{
+		string errorMsg;
+		string argument = "--ecfinterval=" + boost::lexical_cast<std::string>(i);
+
+		int argc = 2;
+		char* argv[] = { const_cast<char*>("ServerEnvironment"),  const_cast<char*>(argument.c_str()) };
+		ServerEnvironment serverEnv(argc,argv);
+		bool valid = serverEnv.valid(errorMsg);
+		if (i > 0 && i < 61)  {
+			BOOST_REQUIRE_MESSAGE(valid,"Server environment ecfinterval valid range is [1-60] " << errorMsg);
+			BOOST_CHECK_MESSAGE(serverEnv.submitJobsInterval() == i,"Expected submit jobs interval of " << i << " but found " << serverEnv.submitJobsInterval());
+ 		}
+		else   BOOST_CHECK_MESSAGE(!valid,"Server environment ecfinterval valid range is [1-60] " << errorMsg);
+	}
+
+	Host h;
+	fs::remove(h.ecf_log_file(Str::DEFAULT_PORT_NUMBER()));
+}
+
+BOOST_AUTO_TEST_CASE( test_server_environment_port )
+{
+	cout << "Server:: ...test_server_environment_port\n";
+
+	// The port numbers are divided into three ranges.\n";
+	//  o the Well Known Ports, (require root permission)      0 -1023\n";
+	//  o the Registered Ports,                             1024 -49151\n";
+	//  o Dynamic and/or Private Ports.                    49151 -65535\n\n";
+	//  Please set in the range 1024-49151 via argument or \n";
+	Host h;
+	int argc = 2;
+	{
+		std::string errorMsg;
+		char* argv[] = { const_cast<char*>("ServerEnvironment"),  const_cast<char*>("--port=0") };
+		ServerEnvironment serverEnv(argc,argv);
+		BOOST_CHECK_MESSAGE(!serverEnv.valid(errorMsg)," Server environment not valid " << errorMsg);
+		fs::remove(h.ecf_log_file("0"));
+ 	}
+	{
+		std::string errorMsg;
+		char* argv[] = { const_cast<char*>("ServerEnvironment"),  const_cast<char*>("--port=1000") };
+		ServerEnvironment serverEnv(argc,argv);
+		BOOST_CHECK_MESSAGE(!serverEnv.valid(errorMsg)," Server environment not valid " << errorMsg);
+		fs::remove(h.ecf_log_file("1000"));
+ 	}
+	{
+		std::string errorMsg;
+		char* argv[] = { const_cast<char*>("ServerEnvironment"),  const_cast<char*>("--port=49151") };
+		ServerEnvironment serverEnv(argc,argv);
+		BOOST_CHECK_MESSAGE(!serverEnv.valid(errorMsg)," Server environment not valid " << errorMsg);
+		fs::remove(h.ecf_log_file("49151"));
+ 	}
+
+	{
+		std::string errorMsg;
+		char* argv[] = { const_cast<char*>("ServerEnvironment"),  const_cast<char*>("--port=3144") };
+		ServerEnvironment serverEnv(argc,argv);
+		BOOST_CHECK_MESSAGE(serverEnv.valid(errorMsg)," Server environment not valid " << errorMsg);
+		BOOST_CHECK_MESSAGE(serverEnv.port() == 3144,"Expected 3144 but found " << serverEnv.port());
+		fs::remove(h.ecf_log_file("3144"));
+	}
+}
+
+BOOST_AUTO_TEST_CASE( test_server_environment_log_file )
+{
+   // Regression test log file creation
+   cout << "Server:: ...test_server_environment_log_file\n";
+
+   int argc = 2;
+   char* argv[] = { const_cast<char*>("ServerEnvironment"),  const_cast<char*>("--port=3144") };
+   ServerEnvironment serverEnv(argc,argv);
+
+   BOOST_CHECK_MESSAGE(Log::instance(), "Log singleton not created");
+   BOOST_CHECK_MESSAGE(fs::exists(Log::instance()->path()), "Log file not created");
+
+   // Check that server variable ECF_LOG created and value is correct
+   std::vector<std::pair<std::string,std::string> > server_vars;
+   serverEnv.variables(server_vars);
+
+   bool found_var = false;
+   typedef std::pair<std::string, std::string> mpair;
+   BOOST_FOREACH(const mpair& p, server_vars ) {
+      if (Str::ECF_LOG() == p.first) {
+         BOOST_CHECK_MESSAGE(p.second == Log::instance()->path(),"Expected " << Log::instance()->path() << " but found " << p.second);
+         found_var = true;
+         break;
+      }
+   }
+   BOOST_CHECK_MESSAGE(found_var,"Failed to find server variable ECF_LOG");
+
+   // tear down remove the log file created by ServerEnvironment
+   Host h;
+   fs::remove(h.ecf_log_file("3144"));
+
+   /// Destroy Log singleton to avoid valgrind from complaining
+   Log::destroy();
+}
+
+BOOST_AUTO_TEST_CASE( test_server_config_file )
+{
+   // Regression test to make sure the server environment variable don't get removed
+   cout << "Server:: ...test_server_config_file\n";
+
+   int argc = 1;
+   char* argv[] = { const_cast<char*>("ServerEnvironment")  };
+
+   ServerEnvironment serverEnv(argc,argv,File::test_data("Server/server_environment.cfg","Server"));
+
+   // expected variables
+   std::vector<std::string> expected_variables;
+   expected_variables.push_back(  Str::ECF_HOME() );
+   expected_variables.push_back( "ECF_LOG"  );
+   expected_variables.push_back( "ECF_CHECK" );
+   expected_variables.push_back( "ECF_CHECKOLD" );
+   expected_variables.push_back( "ECF_JOB_CMD" );
+   expected_variables.push_back( "ECF_KILL_CMD" );
+   expected_variables.push_back( "ECF_STATUS_CMD" );
+   expected_variables.push_back( "ECF_URL_CMD" );
+   expected_variables.push_back( "ECF_URL_BASE" );
+   expected_variables.push_back( "ECF_URL" );
+   expected_variables.push_back( "ECF_MICRO" );
+   expected_variables.push_back( "ECF_PID" );
+   expected_variables.push_back( "ECF_VERSION" );
+   expected_variables.push_back( "ECF_LISTS" );
+   expected_variables.push_back(  Str::ECF_PORT() );
+   expected_variables.push_back( "ECF_NODE");
+   expected_variables.push_back( "ECF_INTERVAL");
+
+   std::vector<std::pair<std::string,std::string> > server_vars;
+   serverEnv.variables(server_vars);
+   BOOST_FOREACH(const std::string& expected_var, expected_variables) {
+
+      bool found_var = false;
+      typedef std::pair<std::string, std::string> s_pair;
+      BOOST_FOREACH(const s_pair& p, server_vars ) {
+         if (expected_var == p.first) { found_var = true; break; }
+      }
+      BOOST_CHECK_MESSAGE(found_var,"Failed to find server var " << expected_var);
+   }
+
+   {
+      // check other way, so that this test gets updated
+      typedef std::pair<std::string, std::string> mpair;
+      BOOST_FOREACH(const mpair& p, server_vars ) {
+         bool found_var = false;
+         BOOST_FOREACH(const std::string& expected_var, expected_variables) {
+            if (expected_var == p.first) { found_var = true; break; }
+         }
+         BOOST_CHECK_MESSAGE(found_var,"Failed to update test for server var " << p.first);
+      }
+   }
+
+   // Check the values in the server config file, are the *SAME* as the defaults, when config is *NOT* present
+   // Please note do *NOT* use quotes for the values, otherwise quotes get added.
+   // WRONG: ECF_MICRODEF = "%"
+   // RIGHT: ECF_MICRODEF = %
+   // o IGNORE ECF_CHECK: We *ONLY check those value in the config, that should not be altered.
+   //                     since we add root path, and append with host/port
+   // o ignore ECF_CHECKMODE: not a server variable
+   //
+   typedef std::pair<std::string, std::string> mpair;
+   BOOST_FOREACH(const mpair& p, server_vars ) {
+      //std::cout << "server variables " << p.first << "  " << p.second << "\n";
+      if (Str::ECF_HOME() == p.first) {
+         BOOST_CHECK_MESSAGE(p.second == fs::current_path().string(),"for ECF_HOME expected " << fs::current_path().string() << " but found " << p.second);
+         continue;
+      }
+      if (string("ECF_PORT") == p.first && !getenv("ECF_PORT")) {
+         BOOST_CHECK_MESSAGE(p.second == Str::DEFAULT_PORT_NUMBER(),"for ECF_PORT expected " <<  Str::DEFAULT_PORT_NUMBER() << " but found " << p.second);
+         continue;
+      }
+      if (string("ECF_CHECKINTERVAL") == p.first) {
+         std::string expected = boost::lexical_cast<std::string>(CheckPt::default_interval());
+         BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_CHECKINTERVAL expected " <<  CheckPt::default_interval() << " but found " << p.second);
+         continue;
+      }
+      if (string("ECF_INTERVAL") == p.first) {
+          std::string expected = "60";
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_INTERVAL expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+      if (string("ECF_JOB_CMD") == p.first) {
+          std::string expected = Ecf::JOB_CMD();
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_JOB_CMD expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+      if (string("ECF_KILL_CMD") == p.first) {
+          std::string expected = Ecf::KILL_CMD();
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_KILL_CMD expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+      if (string("ECF_STATUS_CMD") == p.first) {
+          std::string expected = Ecf::STATUS_CMD();
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_STATUS_CMD expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+      if (string("ECF_URL_CMD") == p.first) {
+          std::string expected = Ecf::URL_CMD();
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_URL_CMD expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+      if (string("ECF_URL_BASE") == p.first) {
+          std::string expected = Ecf::URL_BASE();
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_URL_BASE expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+      if (string("ECF_URL") == p.first) {
+          std::string expected = Ecf::URL();
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_URL expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+      if (string("ECF_MICRODEF") == p.first) {
+          std::string expected = Ecf::MICRO();
+          BOOST_CHECK_MESSAGE(p.second == expected,"for ECF_MICRODEF expected " <<  expected << " but found " << p.second);
+          continue;
+      }
+   }
+
+   // tear down remove the log file created by ServerEnvironment
+   Host host;
+   fs::remove(host.ecf_log_file(Str::DEFAULT_PORT_NUMBER()));
+}
+
+
+BOOST_AUTO_TEST_CASE( test_server_environment_variables )
+{
+   // Regression test to make sure the server environment variable don't get removed
+   cout << "Server:: ...test_server_environment_variables\n";
+
+   int argc = 2;
+   char* argv[] = { const_cast<char*>("ServerEnvironment"),  const_cast<char*>("--port=3144") };
+   ServerEnvironment serverEnv(argc,argv);
+
+   // expected variables
+   std::vector<std::string> expected_variables;
+   expected_variables.push_back(  Str::ECF_HOME() );
+   expected_variables.push_back( "ECF_LOG"  );
+   expected_variables.push_back( "ECF_CHECK" );
+   expected_variables.push_back( "ECF_CHECKOLD" );
+   expected_variables.push_back( "ECF_JOB_CMD" );
+   expected_variables.push_back( "ECF_KILL_CMD" );
+   expected_variables.push_back( "ECF_STATUS_CMD" );
+   expected_variables.push_back( "ECF_URL_CMD" );
+   expected_variables.push_back( "ECF_URL_BASE" );
+   expected_variables.push_back( "ECF_URL" );
+   expected_variables.push_back( "ECF_MICRO" );
+   expected_variables.push_back( "ECF_PID" );
+   expected_variables.push_back( "ECF_VERSION" );
+   expected_variables.push_back( "ECF_LISTS" );
+   expected_variables.push_back(  Str::ECF_PORT() );
+   expected_variables.push_back( "ECF_NODE");
+   expected_variables.push_back( "ECF_INTERVAL");
+
+   std::vector<std::pair<std::string,std::string> > server_vars;
+   serverEnv.variables(server_vars);
+   BOOST_FOREACH(const std::string& expected_var, expected_variables) {
+
+      bool found_var = false;
+      typedef std::pair<std::string, std::string> mpair;
+      BOOST_FOREACH(const mpair& p, server_vars ) {
+         if (expected_var == p.first) { found_var = true; break; }
+      }
+      BOOST_CHECK_MESSAGE(found_var,"Failed to find server var " << expected_var);
+   }
+
+   // check other way, so that this test gets updated
+   typedef std::pair<std::string, std::string> mpair;
+   BOOST_FOREACH(const mpair& p, server_vars ) {
+      bool found_var = false;
+      BOOST_FOREACH(const std::string& expected_var, expected_variables) {
+         if (expected_var == p.first) { found_var = true; break; }
+      }
+      BOOST_CHECK_MESSAGE(found_var,"Failed to update test for server var " << p.first);
+   }
+
+   // tear down remove the log file created by ServerEnvironment
+   Host h;
+   fs::remove(h.ecf_log_file("3144"));
+
+   /// Destroy Log singleton to avoid valgrind from complaining
+   Log::destroy();
+}
+
+BOOST_AUTO_TEST_CASE( test_server_profile_threshold_environment_variable )
+{
+   cout << "Server:: ...test_server_profile_threshold_environment_variable\n";
+   int argc = 1;char* argv[] = { const_cast<char*>("ServerEnvironment") };
+   {
+      char* put = const_cast<char*>("ECF_TASK_THRESHOLD=9");
+      BOOST_CHECK_MESSAGE(putenv(put) == 0,"putenv failed for " << put);
+
+      ServerEnvironment serverEnv(argc,argv);
+      BOOST_CHECK_MESSAGE(JobProfiler::task_threshold() == 9,"Expected task threshold of 9 but found " <<  JobProfiler::task_threshold());
+   }
+
+   // ==================================================================================
+   // Note test for errors
+   vector<string> dodgy_thresholds;
+   dodgy_thresholds.push_back("ECF_TASK_THRESHOLD=x");
+   dodgy_thresholds.push_back("ECF_TASK_THRESHOLD=,");
+   dodgy_thresholds.push_back("ECF_TASK_THRESHOLD=:");
+   dodgy_thresholds.push_back("ECF_TASK_THRESHOLD=,,");
+
+   for(size_t i =0; i < dodgy_thresholds.size(); i++) {
+      //cout << "check -------> " << dodgy_thresholds[i] << endl;
+      BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(dodgy_thresholds[i].c_str())) == 0,"putenv failed for " << dodgy_thresholds[i]);
+      BOOST_CHECK_THROW(ServerEnvironment serverEnv(argc,argv), std::runtime_error );
+   }
+
+   putenv(const_cast<char*>("ECF_TASK_THRESHOLD")); // remove from env, otherwise valgrind complains
+
+   Host h;
+   fs::remove(h.ecf_log_file(Str::DEFAULT_PORT_NUMBER()));
+
+   /// Destroy Log singleton to avoid valgrind from complaining
+   Log::destroy();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/CMakeLists.txt b/ecflow_4_0_7/Test/CMakeLists.txt
new file mode 100644
index 0000000..707ee8c
--- /dev/null
+++ b/ecflow_4_0_7/Test/CMakeLists.txt
@@ -0,0 +1,75 @@
+# =======================================================
+# to list all sources to build use:
+#    cd $WK/Test
+#    find src -name \*.cpp -print | sort
+# =======================================================
+file( GLOB srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp" )
+ 
+# This library is used for the syste, level testing, hence can include test directories
+ecbuild_add_library( TARGET   libharness
+                     NOINSTALL
+                     TYPE     STATIC
+                     SOURCES  ${srcs}
+                     LIBS     libclient base libparser node nodeattr core  
+                     INCLUDES src
+                              ../ACore/src 
+                              ../ANattr/src
+                              ../ANode/src
+                              ../ANode/test
+                              ../AParser/src
+                              ../Base/src
+                              ../Base/src/cts
+                              ../Base/src/stc
+                              ../Base/test
+                              ../Client/src
+                              ../Client/test
+                    )
+
+# =================================================================
+# test
+list( APPEND test_srcs
+./TestAbortCmd.cpp
+./TestAlias.cpp
+./TestClkSync.cpp
+./TestComplete.cpp
+./TestCron.cpp
+./TestCtsWaitCmd.cpp
+./TestEvents.cpp
+./TestFileCmd.cpp
+./TestHandle.cpp
+./TestKillCmd.cpp
+./TestLate.cpp
+./TestLimit.cpp
+./TestOrderCmd.cpp
+./TestRepeat.cpp
+./TestRequeueNode.cpp
+./TestRunner.cpp
+./TestServer.cpp
+./TestSuspend.cpp
+./TestToday.cpp
+./TestTrigger.cpp
+./TestWhyCmd.cpp
+./Test_Time.cpp
+)
+ecbuild_add_test( TARGET s_test
+                  BOOST
+                  SOURCES  ${test_srcs}
+                  LIBS     libharness
+                  TEST_DEPENDS s_client
+                )
+
+
+ecbuild_add_test( TARGET  s_test_zombies
+                  BOOST
+                  SOURCES   ./TestZombies.cpp
+                  LIBS      libharness 
+                  TEST_DEPENDS s_test
+                )
+
+# This test runs forever, hence not suitable for unit test.                          
+#ecbuild_add_test( TARGET  singletest
+#                  BOOST
+#                  SOURCES   ./TestSingle.cpp
+#                  LIBS      libharness 
+#                  TEST_DEPENDS s_client
+#               )
diff --git a/ecflow_4_0_7/Test/DummyMain.cpp b/ecflow_4_0_7/Test/DummyMain.cpp
new file mode 100644
index 0000000..75f9df5
--- /dev/null
+++ b/ecflow_4_0_7/Test/DummyMain.cpp
@@ -0,0 +1,13 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+
+int main() { return 0; }
diff --git a/ecflow_4_0_7/Test/Jamfile.jam b/ecflow_4_0_7/Test/Jamfile.jam
new file mode 100644
index 0000000..a2f253b
--- /dev/null
+++ b/ecflow_4_0_7/Test/Jamfile.jam
@@ -0,0 +1,115 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+project theTest ;
+
+#
+# Test project
+#
+use-project theCore     : ../ACore ;
+use-project theNodeAttr : ../ANattr ;
+use-project theNode     : ../ANode ;
+use-project theParser   : ../AParser ;
+use-project theBase     : ../Base ;
+use-project theServer   : ../Server ;
+use-project theClient   : ../Client ;
+
+lib pthread ;
+
+#
+# Split into library, so that testing can use library, and hence same compiler option
+#
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+#
+lib libharness : [ glob src/*.cpp ]
+              : <include>../ACore/src
+                <include>../ANattr/src 
+                <include>../ANode/src 
+                <include>../AParser/src 
+                <include>../Base/src 
+          	    <include>../Base/test 
+                <include>../Client/src 
+                <include>../Client/test 
+                <variant>debug:<define>DEBUG
+                <link>static
+                <use>/theCore//core
+                <use>/theNodeAttr//nodeattr
+                <use>/theNode//node
+                <use>/theBase//base
+                <use>/theParser//libparser
+           	    <use>/theClient//libclient
+            	<use>/site-config//boost_system
+             	<use>/site-config//boost_serialization
+             	<use>/site-config//boost_filesystem
+             	<use>/site-config//boost_program_options
+             	<use>/site-config//boost_datetime
+       	      :
+              : <include>../Test/src         
+              ;
+
+# Ignore TestSingle.cpp, used for standalone testing
+exe s_test : [ glob Test*.cpp : TestSingle.cpp TestZombies.cpp ]  
+	       pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           /theBase//base
+           /theClient//libclient
+           libharness
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_program_options
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../Base/test 
+           <variant>debug:<define>DEBUG
+ 	     ;
+ 	     
+# Split because this was more error prone, Now stabilised all all platforms ?
+exe s_test_zombies : [ glob TestZombies.cpp  ]  
+          pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           /theBase//base
+           /theClient//libclient
+           libharness
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_program_options
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../Base/test 
+           <variant>debug:<define>DEBUG
+        ;
+
+# use for standalone testing
+exe singletest : [ glob TestSingle.cpp  ]  
+	       pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           /theBase//base
+           /theClient//libclient
+           libharness
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_program_options
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../Base/test 
+           <variant>debug:<define>DEBUG
+ 	     ;
+ 
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/Test/TestAbortCmd.cpp b/ecflow_4_0_7/Test/TestAbortCmd.cpp
new file mode 100644
index 0000000..3910bdb
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestAbortCmd.cpp
@@ -0,0 +1,99 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// Test the abort command. This will test the abort command and the
+// retry behaviour. i.e if a task is aborted, and the variable ECF_TRIES
+// is defined. Then providing its value is less the the task's try number
+// we should do an immediate job submission.
+BOOST_AUTO_TEST_CASE( test_ )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_abort_cmd "<< flush;
+   TestClean clean_at_start_and_end;
+
+	// Create the defs file corresponding to the text below
+	// ECF_HOME variable is automatically added by the test harness.
+	// ECF_INCLUDE variable is automatically added by the test harness.
+	// SLEEPTIME variable is automatically added by the test harness.
+	// ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+	//                     This is substituted in ecf includes
+	//                     Allows test to run without requiring installation
+
+ 	//# Note: we have to use relative paths, since these tests are relocatable
+	//	suite test_task_abort_cmd
+	//    edit ECF_TRIES '4'
+	//	  family family0
+	// 		task abort
+ 	//	   endfamily
+	//	endsuite
+   	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite("test_abort_cmd");
+ 		suite->addVariable( Variable("ECF_TRIES","4") );
+ 		family_ptr fam0 = suite->add_family("family0");
+ 		task_ptr abort = fam0->add_task("abort");
+ 		abort->addVerify( VerifyAttr(NState::ABORTED,3) ); // task should abort 3 times & succeed on 4th attempt
+ 		abort->addVerify( VerifyAttr(NState::COMPLETE,1) );// task should complete 1 times
+ 	}
+
+	// Create a custom ecf file for test_task_abort_cmd/family0/abort to invoke the child abort command
+	std::string templateEcfFile;
+ 	templateEcfFile += "%include <head.h>\n";
+	templateEcfFile += "\n";
+	templateEcfFile += "echo do some work\n";
+	templateEcfFile += "if [ %ECF_TRYNO% -le 3 ] ; then\n";
+ 	templateEcfFile += "   %ECF_CLIENT_EXE_PATH% --abort=\"expected abort at task try no %ECF_TRYNO%\"\n";
+	templateEcfFile += "   trap 0       # Remove all traps\n";
+	templateEcfFile += "   exit 0       # End the shell before child command complete\n";
+ 	templateEcfFile += "fi\n";
+	templateEcfFile += "\n";
+	templateEcfFile += "%include <tail.h>\n";
+
+ 	// The test harness will create corresponding directory structure
+ 	// Override the default ECF file, with our custom ECF_ file
+ 	std::map<std::string,std::string> taskEcfFileMap;
+ 	taskEcfFileMap.insert(std::make_pair(TestFixture::taskAbsNodePath(theDefs,"abort"),templateEcfFile));
+
+    // Avoid standard verification since we expect to abort many times
+   ServerTestHarness serverTestHarness;
+	serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_abort_cmd.def"), taskEcfFileMap);
+
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestAlias.cpp b/ecflow_4_0_7/Test/TestAlias.cpp
new file mode 100644
index 0000000..e0a1cbf
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestAlias.cpp
@@ -0,0 +1,218 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//
+//    This test will TEST:
+//       o Alias creation and running
+//       o Alias ordering
+//       o Alias deletion
+//    Will indirectly test the Alias memento's
+//============================================================================
+#include <iostream>
+#include <limits> // for std::numeric_limits<int>::max()
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "TestFixture.hpp"
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "DefsStructureParser.hpp"
+#include "AssertTimer.hpp"
+#include "Str.hpp"
+#include "NOrder.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSingleSuite  )
+
+template <typename T>
+static std::vector<std::string> toStrVec(const std::vector<T>& vec)
+{
+   std::vector<std::string> retVec; retVec.reserve(vec.size());
+   BOOST_FOREACH(T s, vec) { retVec.push_back(s->name()); }
+   return retVec;
+}
+
+std::string toString(const std::vector<std::string>& c)
+{
+   std::stringstream ss;
+   std::copy (c.begin(), c.end(), std::ostream_iterator <std::string> (ss, ", "));
+   return ss.str();
+}
+
+void wait_for_alias_to_complete(const std::string& alias_path)
+{
+   AssertTimer assertTimer(10,false); // Bomb out after 10 seconds, fall back if test fail
+   while(1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      node_ptr alias = defs->findAbsNode(alias_path);
+      BOOST_REQUIRE_MESSAGE(alias.get(), "Could not locate created alias at path " << alias_path << "\n" << TestFixture::client().errorMsg());
+      if (alias->state() == NState::COMPLETE) break;
+      sleep(2);
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_alias )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_alias "<< flush;
+   TestClean clean_at_start_and_end;
+
+   // Create the defs file corresponding to the text below
+   // ECF_HOME variable is automatically added by the test harness.
+   // ECF_INCLUDE variable is automatically added by the test harness.
+   // SLEEPTIME variable is automatically added by the test harness.
+   // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+   //                     This is substituted in ecf includes
+   //                     Allows test to run without requiring installation
+   Defs theDefs;
+   task_ptr task_a;
+   {
+      suite_ptr suite = theDefs.add_suite( "test_alias" ) ;
+      suite->add_variable("SLEEPTIME","0");
+      task_a = suite->add_task("task_a");
+      task_a->addMeter( Meter("meter",0,20,20) );
+      task_a->addEvent( Event(1,"event") );
+      task_a->addLabel( Label("task_a_label","Label1") );
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_alias.def"));
+
+   // After the task has completed create a Alias
+   TestFixture::client().set_throw_on_error(false);
+
+   // Get the ecf script from the current task and use it to create alias
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().file(task_a->absNodePath(),CFileCmd::toString(CFileCmd::ECF),"10000") == 0, "Expected to retreive script\n" << TestFixture::client().errorMsg());
+   std::string script = TestFixture::client().get_string();
+   BOOST_CHECK_MESSAGE( !script.empty(),"script for task " << task_a->absNodePath() << " is empty" );
+
+
+   // TEST Alias CREATION and running =============================================================================
+   // Split the file into line
+   std::vector<std::string> script_lines;
+   Str::split(script,script_lines,"\n");
+
+   NameValueVec used_variables;
+   int result = TestFixture::client().edit_script_submit(task_a->absNodePath(),used_variables,script_lines,true/*create alias*/,true/*run alias*/);
+   BOOST_REQUIRE_MESSAGE(result == 0, "Expected alias creation and run to succeed\n" << TestFixture::client().errorMsg());
+   std::string alias0_path = task_a->absNodePath() + "/alias0";
+
+   // Wait for alias to complete.
+   wait_for_alias_to_complete(alias0_path);
+
+//#ifdef DEBUG
+//   BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+//   defs_ptr defs = TestFixture::client().defs();
+//   PrintStyle::setStyle(PrintStyle::STATE);
+//   std::cout << *defs;
+//#endif
+
+
+   // TEST ORDERING:: Create another alias, but don't run it. =============================================================================
+   result = TestFixture::client().edit_script_submit(task_a->absNodePath(),used_variables,script_lines,true/*create alias*/,false/*run alias*/);
+   BOOST_REQUIRE_MESSAGE(result == 0, "Expected alias creation succeed\n" << TestFixture::client().errorMsg());
+   {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      std::vector<alias_ptr> aliases;
+      defs->get_all_aliases(aliases);
+      BOOST_REQUIRE_MESSAGE(aliases.size() == 2, "Expected 2 aliases\n" << TestFixture::client().errorMsg());
+   }
+
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().order(alias0_path, NOrder::toString(NOrder::DOWN)) == 0, "Expected order NOrder::DOWN to succeed\n" << TestFixture::client().errorMsg());
+   {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      Task* task = defs->findAbsNode(task_a->absNodePath())->isTask();
+      BOOST_REQUIRE_MESSAGE( task,"expected to find Task");
+
+      std::vector<std::string> expected;
+      expected.push_back("alias1");
+      expected.push_back("alias0");
+      BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::DOWN expected " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+   }
+
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().order(alias0_path, NOrder::toString(NOrder::UP)) == 0, "Expected order NOrder::UP to succeed\n" << TestFixture::client().errorMsg());
+   {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      Task* task = defs->findAbsNode(task_a->absNodePath())->isTask();
+      BOOST_REQUIRE_MESSAGE( task,"expected to find Task");
+
+      std::vector<std::string> expected;
+      expected.push_back("alias0");
+      expected.push_back("alias1");
+      BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::UP expected " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+   }
+
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().order(alias0_path, NOrder::toString(NOrder::ORDER)) == 0, "Expected order NOrder::ORDER to succeed\n" << TestFixture::client().errorMsg());
+   {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      Task* task = defs->findAbsNode(task_a->absNodePath())->isTask();
+      BOOST_REQUIRE_MESSAGE( task,"expected to find Task");
+
+      std::vector<std::string> expected;
+      expected.push_back("alias1");
+      expected.push_back("alias0");
+      BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::ORDER expected " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+   }
+
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().order(alias0_path, NOrder::toString(NOrder::ALPHA)) == 0, "Expected order NOrder::ALPHA to succeed\n" << TestFixture::client().errorMsg());
+   {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      Task* task = defs->findAbsNode(task_a->absNodePath())->isTask();
+      BOOST_REQUIRE_MESSAGE( task,"expected to find Task");
+
+      std::vector<std::string> expected;
+      expected.push_back("alias0");
+      expected.push_back("alias1");
+      BOOST_REQUIRE_MESSAGE( toStrVec(task->aliases()) == expected,"NOrder::ALPHA expected " << toString(expected) << " but found " << toString(toStrVec(task->aliases())) );
+   }
+
+
+   // TEST Alias DELETION =============================================================================
+   std::string alias1_path = task_a->absNodePath() + "/alias1";
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().delete_node(alias0_path) == 0, "delete alias0 failed\n" << TestFixture::client().errorMsg());
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().delete_node(alias1_path) == 0, "delete alias1 failed\n" << TestFixture::client().errorMsg());
+
+   // Get the defs from the server
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+   defs_ptr defs = TestFixture::client().defs();
+   std::vector<alias_ptr> aliases;
+   defs->get_all_aliases(aliases);
+   BOOST_REQUIRE_MESSAGE(aliases.empty(), "Alias deletion falied\n" << TestFixture::client().errorMsg());
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestClkSync.cpp b/ecflow_4_0_7/Test/TestClkSync.cpp
new file mode 100644
index 0000000..9efd61b
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestClkSync.cpp
@@ -0,0 +1,85 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #26 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+
+BOOST_AUTO_TEST_CASE( test_clk_sync )
+{
+   // This test is used to test sync'ing of the suite calendars
+   // The default clock type is *real*. We will create a suite with a hybrid clock attribute
+   // For the suite calendar, we do not persist the clock type(hybrid/real), since this can be
+   // obtained from the clock attribute. Hence a hybrid calendar in the server, will arrive as
+   // real calendar at the client side. (i.e via the memento). It is then up to the client
+   // to update the calendar with clock type stored in the clock attribute.
+   // See:void Suite::set_memento( const SuiteCalendarMemento* memento )
+   // This test(implicitly) will check that after an incremental sync that suite calendar and
+   // suite clock attribute, that both are of the same clock type.
+   // This is done in ServerTestHarness via invariant checking.
+
+   DurationTimer timer;
+   cout << "Test:: ...test_clk_sync "<< flush;
+   TestClean clean_at_start_and_end;
+
+   // Create the defs file corresponding to the text below
+   // ECF_HOME variable is automatically added by the test harness.
+   // ECF_INCLUDE variable is automatically added by the test harness.
+   // SLEEPTIME variable is automatically added by the test harness.
+   // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+   //                     This is substituted in ecf includes
+   //                     Allows test to run without requiring installation
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   // suite test_clk_sync
+   //   clocl hybrid
+   //   task a
+   //      meter myMeter 0 100
+   // endsuite
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_clk_sync" );
+      suite->addClock(ClockAttr(true)); // add hybrid clock
+      task_ptr task_a = suite->add_task("a");
+      task_a->addMeter( Meter("myMeter",0,100,100) );
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_clk_sync.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestComplete.cpp b/ecflow_4_0_7/Test/TestComplete.cpp
new file mode 100644
index 0000000..8b5c35b
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestComplete.cpp
@@ -0,0 +1,178 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #25 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+// This test does not have any time dependencies in the def file.
+//
+// This test shows the use of repeat and complete. this shows how
+// we can repeat a family without waiting for all the children to
+// complete. See page 65 of user manual
+//
+// As protection against user, a family should not complete
+// if any of its children are still in ACTIVE or SUBMIITED state.
+//
+// **************************************************************************
+// Note: When we use a complete expression. Node resolution will set complete
+//      hierarchically
+// **************************************************************************
+BOOST_AUTO_TEST_CASE( test_complete )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_complete " << flush;
+   TestClean clean_at_start_and_end;
+
+	// Create the defs file corresponding to the text below
+	// ECF_HOME variable is automatically added by the test harness.
+	// ECF_INCLUDE variable is automatically added by the test harness.
+	// SLEEPTIME variable is automatically added by the test harness.
+	// ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+	//                     This is substituted in sms includes
+	//                     Allows test to run without requiring installation
+
+ 	//# Note: we have to use relative paths, since these tests are relocatable
+	//	suite test_complete
+	//	  family family
+	//      repeat integer YMD 0 1
+	//	   	complete ./family/check:nofiles  # repeat family with waiting for children to complete
+	//	   	task check
+	//	   		event 1 nofiles
+	//	    task t1
+	//        trigger check==complete
+	//      task t2
+	//         trigger t2 == complete   #  never runs
+	//	    endfamily
+	//	endsuite
+ 	std::string eventName = "nofiles";
+  	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite("test_complete");
+      family_ptr fam = suite->add_family("family");
+ 		fam->addRepeat( RepeatInteger("VAR",0,1,1));  // repeat family 2 times
+ 		fam->add_complete( "/test_complete/family/check:nofiles" );
+		fam->addVerify( VerifyAttr(NState::COMPLETE,2) );       // family should complete 2 times
+
+      task_ptr task_check = fam->add_task("check");
+ 		task_check->addEvent( Event(1,eventName) );
+ 		task_check->addVerify( VerifyAttr(NState::COMPLETE,4) );
+
+      task_ptr task_t1 = fam->add_task("t1");
+		task_t1->add_trigger( "check == complete");
+		task_t1->addVerify( VerifyAttr(NState::COMPLETE,2) );
+
+      task_ptr task_t2 = fam->add_task("t2");
+		task_t2->add_trigger( "t2 == complete" );
+		task_t2->addVerify( VerifyAttr(NState::COMPLETE,2) );
+ 	}
+
+ 	// The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+ 	serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_complete.def") );
+
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_complete_does_not_hold )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_complete_does_not_hold " << flush;
+
+   /// This test shows that a complete expression should not hold a node
+   /// A complete should complete a node, and not hold it
+
+   // suite test_complete
+   //   family family
+   //     complete 1 == 0            # impossible expression that never evaluates
+   //     task t1                    # task t1 should still run
+   //     task t2
+   //         complete 1 == 0        # impossible expression that never evaluates
+   //         trigger t1 == complete # task t2 should still run
+   //     endfamily
+   // endsuite
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_complete_does_not_hold");
+      family_ptr fam = suite->add_family("family");
+      fam->add_complete( "1 == 0");
+      task_ptr t1 = fam->add_task("t1");
+      t1->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      task_ptr t2 = fam->add_task("t2");
+      t2->add_trigger( "t1 == complete");
+      t2->add_complete( "1 == 0");
+      t2->addVerify( VerifyAttr(NState::COMPLETE,1) );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_complete_does_not_hold.def") );
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_complete_with_empty_family )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_complete_with_empty_family " << flush;
+
+   // Test a family with a complete expression and that has no children
+
+   // suite test_complete_with_empty_family
+   //   family empty
+   //      complete /test_complete_with_empty_family/family/t1 == complete and
+   //               /test_complete_with_empty_family/family/t2 == complete
+   //   family family
+   //       task t1
+   //       task t2
+   //     endfamily
+   // endsuite
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_complete_with_empty_family");
+      family_ptr empty = suite->add_family("empty");
+      empty->add_complete( "/test_complete_with_empty_family/family/t1 == complete and /test_complete_with_empty_family/family/t2 == complete");
+      empty->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      family_ptr fam = suite->add_family("family");
+      fam->add_task("t1")->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      fam->add_task("t2")->addVerify( VerifyAttr(NState::COMPLETE,1) );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_complete_with_empty_family.def") );
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestCron.cpp b/ecflow_4_0_7/Test/TestCron.cpp
new file mode 100644
index 0000000..0a9f2ce
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestCron.cpp
@@ -0,0 +1,145 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #30 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "AssertTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+
+static void wait_for_cron( int max_time_to_wait, const std::string& path)
+{
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   TestFixture::client().set_throw_on_error( false );
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "sync_local failed should return 0\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      if (defs) {
+         node_ptr node = defs->findAbsNode(path);
+         BOOST_REQUIRE_MESSAGE(node, "Could not find task at path " << path );
+         if (node) {
+            const std::vector<VerifyAttr>&      verifys  = node->verifys();
+            BOOST_REQUIRE_MESSAGE(verifys.size() == 1,"Expected 1 verify");
+            if (!verifys.empty()) {
+               if ( verifys[0].actual() == verifys[0].expected()) {
+                  break;
+               }
+            }
+         }
+      }
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+                  "wait_for_cron: Test wait " << assertTimer.duration() <<
+                  " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                  " aborting\n" << *defs);
+         break;
+      }
+      sleep(1);
+   }
+}
+
+
+BOOST_AUTO_TEST_CASE( test_cron_time_series )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_cron_time_series " << flush;
+   TestClean clean_at_start_and_end;
+
+   // SLOW SYSTEMS
+   // for each time attribute leave GAP of 3 * job submission interval
+   // on slow systems submitted->active->complete > TestFixture::job_submission_interval()
+   // Also the task duration must be greater than job_submission_interval,  otherwise
+   // we will get multiple invocation for the same time step
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_cron_time_series
+   //	edit SLEEPTIME 1
+   //	edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <todays date>
+   //	family family
+   //   	task t1
+   //       cron <start> <finish> <incr>
+   //  	endfamily
+   //endsuite
+   Defs theDefs;
+   std::string path;
+   {
+      // Initialise clock with todays date and time, then create a cron attribute
+      // with a time series, so that task runs 3 times
+
+      // Note: we don't use:
+      //    boost::posix_time::ptime theLocalTime = Calendar::second_clock_time();
+      // Because this can fail with:
+      //    Test:: ...test_cron_time_series unknown location(0): fatal error in
+      //             "test_cron_time_series": std::out_of_range:
+      //             TimeSeries::TimeSeries: Invalid time series: Start time(23:58) is greater than end time(00:02)
+      // i.e
+      // if the test is started at 23:58, then adding the end time of by doing start_time + 5 will fail the check
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(10,0,0));
+      boost::posix_time::ptime time1 =  theLocalTime +  minutes(1);
+      boost::posix_time::ptime time2 =  theLocalTime +  minutes(5);
+
+      suite_ptr suite = theDefs.add_suite("test_cron_time_series");
+      ClockAttr clockAttr(theLocalTime, false);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );      // task should complete 3 times
+
+      CronAttr cronAttr;
+      cronAttr.addTimeSeries( ecf::TimeSlot(time1.time_of_day()),
+                              ecf::TimeSlot(time2.time_of_day()),
+                              ecf::TimeSlot(0,2)  );
+      task->addCron( cronAttr);
+
+      path = task->absNodePath();
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.add_default_sleep_time(false); // avoid missing time steps due to submit->active->complete > job submission interval
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_cron_time_series.def"),1 /* timeout ignored*/, false /*waitForTestCompletion*/);
+
+   // crons are *infinite*, just wait for cron to complete 3 times
+   wait_for_cron(40,path);
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Test/TestCtsWaitCmd.cpp b/ecflow_4_0_7/Test/TestCtsWaitCmd.cpp
new file mode 100644
index 0000000..af019a3
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestCtsWaitCmd.cpp
@@ -0,0 +1,216 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "AssertTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+static void create_defs(Defs& theDefs, const std::string& suite_name)
+{
+   // suite test_wait_cmd
+   //   family family0
+   //       task wait
+   //   family family1
+   //       task a
+   //       task b
+   //   endfamily
+   //   family family2
+   //          task aa
+   //          task bb
+   //    endfamily
+   // endsuite
+   suite_ptr suite = theDefs.add_suite(suite_name);
+   family_ptr fam0 = suite->add_family("family0");
+   task_ptr wait = fam0->add_task("wait");
+   wait->addVerify( VerifyAttr(NState::COMPLETE,1) );      // task should complete 1 times
+
+   family_ptr fam1 = suite->add_family("family1");
+   fam1->add_task( "a" );
+   fam1->add_task( "b" );
+
+   family_ptr fam2 = suite->add_family("family2");
+   fam2->add_task( "aa" );
+   fam2->add_task( "bb" );
+}
+
+static bool wait_for_state(
+         std::vector< std::pair<std::string,NState::State> >& path_state_vec,
+         int max_time_to_wait )
+{
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "sync_local failed should return 0\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      bool all_states_ok = true;
+      for(size_t i =0; i < path_state_vec.size(); ++i) {
+         node_ptr node = defs->findAbsNode( path_state_vec[i].first );
+         BOOST_REQUIRE_MESSAGE(node,"Could not find path '" << path_state_vec[i].first << "' in the defs\n" << *defs);
+         if (node->state() != path_state_vec[i].second) {
+            all_states_ok = false;
+            break;
+         }
+      }
+      if (all_states_ok) return true;
+
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+                  "wait_for_state: Test wait " << assertTimer.duration() <<
+                  " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                  " aborting\n" << *defs);
+         break;
+      }
+      sleep(1);
+   }
+   return false;
+}
+
+// Test the wait command. The Wait command is a child command.
+// The wait command is provided an expression. This expression is evaluated
+// in the server. If the evaluate returns false then the client should
+// blocks until the evaluation is true.
+// In this case the job associated with task 'wait' should block until the expression evaluates
+// to true, which should be after the completion of all other tasks
+BOOST_AUTO_TEST_CASE( test_wait_cmd )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_wait_cmd "<< flush;
+   TestClean clean_at_start_and_end;
+
+   Defs theDefs;
+   create_defs(theDefs,"test_wait_cmd");
+
+   // Create a custom sms file for test_wait_cmd/family0/wait to invoke the child wait command
+   // with an expression that forces it to block, until all other tasks complete
+   std::string templateEcfFileForWait;
+   templateEcfFileForWait += "%include <head.h>\n";
+   templateEcfFileForWait += "\n";
+   templateEcfFileForWait += "echo do some work\n";
+   templateEcfFileForWait += "%ECF_CLIENT_EXE_PATH% --wait=\"../family1/a eq complete and ../family1/b eq complete and ../family2/aa eq complete and ../family2/bb eq complete\"\n";
+   templateEcfFileForWait += "\n";
+   templateEcfFileForWait += "%include <tail.h>\n";
+
+   // The test harness will create corresponding directory structure
+   // Override the default ECF_ file, with our custom ECF_ file
+   std::map<std::string,std::string> taskEcfFileMap;
+   taskEcfFileMap.insert(std::make_pair(TestFixture::taskAbsNodePath(theDefs,"wait"),templateEcfFileForWait));
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_wait_cmd.def"), taskEcfFileMap);
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_wait_cmd_parse_fail )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_wait_cmd_parse_fail "<< flush;
+
+   // This time we add a wait expression that
+   // should fail to parse, and we should return an error
+   // The error should captured by the trap in .ecf script, which will
+   // then abort the task
+   Defs theDefs;
+   create_defs(theDefs,"test_wait_cmd_parse_fail");
+
+   // Create a custom ecf file for test_wait_cmd/family0/wait to invoke the child wait command
+   std::string templateEcfFileForWait;
+   templateEcfFileForWait += "%include <head.h>\n";
+   templateEcfFileForWait += "\n";
+   templateEcfFileForWait += "echo do some work\n";
+   templateEcfFileForWait += "%ECF_CLIENT_EXE_PATH% --wait=\"(((((((((../family1/a eq complete and ../family1/b eq complete and ../family2/aa eq complete and ../family2/bb eq complete\"\n";
+   templateEcfFileForWait += "\n";
+   templateEcfFileForWait += "%include <tail.h>\n";
+
+   std::map<std::string,std::string> taskEcfFileMap;
+   taskEcfFileMap.insert(std::make_pair(TestFixture::taskAbsNodePath(theDefs,"wait"),templateEcfFileForWait));
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_wait_cmd_parse_fail.def"), taskEcfFileMap,1 /*timeout*/,  false/* don't wait for test to finish */);
+
+   // wait for family1 and family2 to complete
+   std::vector< std::pair<std::string,NState::State> > path_state_vec;
+   path_state_vec.push_back( std::make_pair( std::string("/test_wait_cmd_parse_fail/family1"), NState::COMPLETE) );
+   path_state_vec.push_back( std::make_pair( std::string("/test_wait_cmd_parse_fail/family2"), NState::COMPLETE) );
+   wait_for_state(path_state_vec,10);
+
+   // wait for 'wait' task to abort
+   path_state_vec.clear();
+   path_state_vec.push_back( std::make_pair( std::string("/test_wait_cmd_parse_fail/family0/wait"), NState::ABORTED) );
+   wait_for_state(path_state_vec,10);
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_wait_cmd_non_existant_paths )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_wait_cmd_non_existant_paths "<< flush;
+
+   // This time we add a wait expression that should fail
+   // because the paths referenced in the expression don't exist
+   Defs theDefs;
+   create_defs(theDefs,"test_wait_cmd_non_existant_paths");
+
+   // Create a custom ecf file for test_wait_cmd/family0/wait to invoke the child wait command
+   // NOTE: ../family1/FRED does not exist
+   std::string templateEcfFileForWait;
+   templateEcfFileForWait += "%include <head.h>\n";
+   templateEcfFileForWait += "\n";
+   templateEcfFileForWait += "echo do some work\n";
+   templateEcfFileForWait += "%ECF_CLIENT_EXE_PATH% --wait=\"../family1/FRED eq complete and ../family1/b eq complete and ../family2/aa eq complete and ../family2/bb eq complete\"\n";
+   templateEcfFileForWait += "\n";
+   templateEcfFileForWait += "%include <tail.h>\n";
+
+   std::map<std::string,std::string> taskEcfFileMap;
+   taskEcfFileMap.insert(std::make_pair(TestFixture::taskAbsNodePath(theDefs,"wait"),templateEcfFileForWait));
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_wait_cmd_non_existant_paths.def"), taskEcfFileMap,1 /*timeout*/,  false/* don't wait for test to finish */);
+
+   // wait for family1 and family2 to complete
+   std::vector< std::pair<std::string,NState::State> > path_state_vec;
+   path_state_vec.push_back( std::make_pair( std::string("/test_wait_cmd_non_existant_paths/family1"), NState::COMPLETE) );
+   path_state_vec.push_back( std::make_pair( std::string("/test_wait_cmd_non_existant_paths/family2"), NState::COMPLETE) );
+   wait_for_state(path_state_vec,10);
+
+   // wait for 'wait' task to abort
+   path_state_vec.clear();
+   path_state_vec.push_back( std::make_pair( std::string("/test_wait_cmd_non_existant_paths/family0/wait"), NState::ABORTED) );
+   wait_for_state(path_state_vec,10);
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestEvents.cpp b/ecflow_4_0_7/Test/TestEvents.cpp
new file mode 100644
index 0000000..eb50a74
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestEvents.cpp
@@ -0,0 +1,107 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #26 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+// This test does not have any time dependencies in the def file.
+
+BOOST_AUTO_TEST_CASE( test_events )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_events "<< flush;
+   TestClean clean_at_start_and_end;
+
+   // Create the defs file corresponding to the text below
+   // ECF_HOME variable is automatically added by the test harness.
+   // ECF_INCLUDE variable is automatically added by the test harness.
+   // SLEEPTIME variable is automatically added by the test harness.
+   // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+   //                     This is substituted in sms includes
+   //                     Allows test to run without requiring installation
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   // suite test_events
+   //   family family1
+   //       task a
+   //         event 1 myEvent
+   //         meter myMeter 0 100
+   //       task b
+   //          trigger a == complete
+   //    endfamily
+   //    family family2
+   //          task aa
+   //             trigger ../family1/a:myMeter >= 90 and ../family1/a:myEvent
+   //          task bb
+   //             trigger ../family1/a:myMeter >= 50  or  ../family1/a:myEvent
+   //     endfamily
+   // endsuite
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_events" );
+      {
+         family_ptr fam = suite->add_family("family1");
+         task_ptr task_a = fam->add_task("a");
+         task_ptr task_b = fam->add_task("b");
+         task_a->addMeter( Meter("myMeter",0,100,100) );             // ServerTestHarness will add correct ecf
+         task_a->addEvent( Event(1,"myEvent") );                     // ServerTestHarness will add correct ecf
+         task_a->addLabel( Label("task_a_label","Label1") );         // ServerTestHarness will add correct ecf
+         task_a->addVerify( VerifyAttr(NState::COMPLETE,1) );
+
+         task_b->add_trigger( "a == complete" );
+         task_b->addLabel( Label("task_b_label","label1 label2") );  // ServerTestHarness will add correct ecf
+         task_b->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      }
+      {
+         family_ptr fam2 = suite->add_family("family2");
+         task_ptr task_aa = fam2->add_task("aa");
+         task_ptr task_bb = fam2->add_task("bb");
+         task_aa->add_trigger(  "../family1/a:myMeter >= 90 and ../family1/a:myEvent");
+         task_aa->addVerify( VerifyAttr(NState::COMPLETE,1) );
+         task_bb->add_trigger(  "../family1/a:myMeter >= 50  or  ../family1/a:myEvent" );
+         task_bb->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      }
+      //cout << theDefs;
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_events.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestFileCmd.cpp b/ecflow_4_0_7/Test/TestFileCmd.cpp
new file mode 100644
index 0000000..c668746
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestFileCmd.cpp
@@ -0,0 +1,132 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This is used to INVOKE a SINGLE test. Easier for debugging
+//============================================================================
+#include <iostream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "ClientToServerCmd.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite  )
+
+BOOST_AUTO_TEST_CASE( test_file_cmd )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_file_cmd " << flush;
+   TestClean clean_at_start_and_end;
+
+   // Create the defs file corresponding to the text below
+   // ECF_HOME variable is automatically added by the test harness.
+   // ECF_INCLUDE variable is automatically added by the test harness.
+   // SLEEPTIME variable is automatically added by the test harness.
+   // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+   //                     This is substituted in sms includes
+   //                     Allows test to run without requiring installation
+
+   //# Note: we have to use relative paths, since these tests are relocate-able
+   //suite test_file_cmd
+   // edit SLEEPTIME 1
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   // family family
+   //    task t1
+   //    task t2
+   //  endfamily
+   //endsuite
+
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_file_cmd");
+      suite->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      family_ptr fam = suite->add_family("family");
+      int taskSize = 2; // on linux 1024 tasks take ~4 seconds for job submission
+      for(int i=0; i < taskSize; i++) {
+         task_ptr task = fam->add_task("t" +  boost::lexical_cast<std::string>(i));
+         task->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      }
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files AND will generate man files for node containers
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.generateManFileForNodeContainers();
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_file_cmd.def"));
+
+   // Now invoke the file command to extract <ecffile,job file,job output, manual >
+   // If the requests succeeded the client needs to create a temporary file, and populate it with
+   // the contents of the string returned from the server
+   TestFixture::client().set_throw_on_error(false);
+
+   std::vector<Node*> nodeVec;
+   theDefs.getAllNodes(nodeVec);
+
+   BOOST_FOREACH(Node* node, nodeVec) {
+
+      string nodePath = node->absNodePath();
+      std::vector<CFileCmd::File_t> fileTypesVec = CFileCmd::fileTypesVec();
+      for(size_t i = 0; i < fileTypesVec.size(); i++) {
+
+         string file_type = CFileCmd::toString(fileTypesVec[i]);
+         std::vector<std::string> theArgs = CtsApi::file(nodePath,file_type,"10000");
+         std::string args; for(size_t x = 0; x < theArgs.size(); x++) { args += theArgs[x]; args += " "; }
+
+         int theResult =  TestFixture::client().file(nodePath,file_type,"10000");
+//         cout << "nodePath = " << nodePath << " fileType = " << file_type << " args passed = " << args << " pass = " << theResult << "\n";
+
+         /// Expect KILL and STAT file types to fail, i.e since we have not called those commands
+         if (fileTypesVec[i] == CFileCmd::KILL || fileTypesVec[i] == CFileCmd::STAT) {
+            BOOST_CHECK_MESSAGE(  theResult == 1,args << " Expected " << CFileCmd::toString(fileTypesVec[i]) << " to fail");
+            continue;
+         }
+
+         if (node->isSubmittable() || fileTypesVec[i] == CFileCmd::MANUAL) {
+            // For suite and families only manual is valid
+            BOOST_CHECK_MESSAGE(  theResult == 0,args << " failed for Node should return 0.\n" << TestFixture::client().errorMsg());
+            BOOST_CHECK_MESSAGE(  !TestFixture::client().get_string().empty()," file contents empty for  " << args );
+         }
+         else {
+            // Should fail
+            BOOST_CHECK_MESSAGE( theResult != 0, args << " Expected failure for node " << node->debugNodePath() << " with file= " << CFileCmd::toString(fileTypesVec[i]) );
+            if (theResult == 0 ) {
+               std::cout << "Found file contents:''\n";
+               std::cout << TestFixture::client().get_string();
+               std::cout << "''\n";
+            }
+         }
+      }
+   }
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Test/TestHandle.cpp b/ecflow_4_0_7/Test/TestHandle.cpp
new file mode 100644
index 0000000..5c0ce93
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestHandle.cpp
@@ -0,0 +1,391 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #22 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This is used to INVOKE a SINGLE test.
+//               Making it easier for Easier for debugging and development
+//============================================================================
+#include <iostream>
+#include <limits> // for std::numeric_limits<int>::max()
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "TestFixture.hpp"
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "DefsStructureParser.hpp"
+#include "AssertTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite  )
+
+//static void dump_suites_and_handles(ClientInvoker& theClient, const std::string& title)
+//{
+//   std::cout << title;
+//   TestFixture::client().suites();
+//   {
+//      const std::vector<std::string>& suites =  TestFixture::client().server_reply().get_string_vec();
+//      BOOST_FOREACH(const std::string& suite, suites) { std::cout << "\n---> " << suite; }
+//      std::cout << "\n";
+//
+//      const std::vector<std::pair<unsigned int, std::vector<std::string> > >& handles = TestFixture::client().server_reply().get_client_handle_suites();
+//      std::pair<unsigned int, std::vector<std::string> > int_str_pair;
+//      for(size_t i =0; i < handles.size(); i++) {
+//          std::cout << "handle: " << handles[i].first << " : ";
+//          BOOST_FOREACH(const std::string& suite, handles[i].second) {
+//            std::cout << suite << " ";
+//         }
+//         std::cout << "\n";
+//      }
+//   }
+//   std::cout << "\n";
+//}
+
+BOOST_AUTO_TEST_CASE( test_handle )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_handle " << flush;
+   TestClean clean_at_start_and_end;
+
+   Defs theDefs; {
+      for(int s = 0; s < 7; s++) {
+         suite_ptr suite = theDefs.add_suite("s" + boost::lexical_cast<std::string>(s));
+         suite->addDefStatus(DState::SUSPENDED); // NO NEED to run jobs for this test:
+         for(int t = 0; t < 2; t++) { suite->add_task("t" + boost::lexical_cast<std::string>(t)); }
+      }
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                        ServerTestHarness::testDataDefsLocation("test_handle.def"),
+                        1 /*timeout*/,
+                        false/* don't wait for test to finish */);
+
+   std::vector<std::string> suites_s0_s1_s2; suites_s0_s1_s2.push_back("s0"); suites_s0_s1_s2.push_back("s1"); suites_s0_s1_s2.push_back("s2");
+   std::vector<std::string> suites_s3_s4; suites_s3_s4.push_back("s3"); suites_s3_s4.push_back("s4");
+   std::vector<std::string> suites_s0_s1_s2_s3_s4; suites_s0_s1_s2_s3_s4.push_back("s0"); suites_s0_s1_s2_s3_s4.push_back("s1"); suites_s0_s1_s2_s3_s4.push_back("s2"),suites_s0_s1_s2_s3_s4.push_back("s3"),suites_s0_s1_s2_s3_s4.push_back("s4");;
+   std::vector<std::pair<unsigned int, std::vector<std::string> > > ch_suites;
+
+   {
+      // register suites s0,s1,s2
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s0_s1_s2);
+
+      // get the handle associated with the registered suites
+      unsigned int client_handle = TestFixture::client().server_reply().client_handle();
+
+      // Check the sync_local() does a full sync for our handle
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().in_sync(),"Expected to be in sync after syn_local()");
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after registering");
+
+      // Now check the suites were registered, correctly
+      TestFixture::client().ch_suites();
+      ch_suites = TestFixture::client().server_reply().get_client_handle_suites();
+      BOOST_CHECK_MESSAGE(!ch_suites.empty(),"Expected to have registered suites");
+      BOOST_CHECK_MESSAGE(ch_suites.size() == 1,"Expected to have registered a single set");
+      BOOST_CHECK_MESSAGE(ch_suites[0].first == client_handle,"Expected first client handle to be: " << client_handle << ", but found " << ch_suites[0].first);
+      BOOST_CHECK_MESSAGE(ch_suites[0].second == suites_s0_s1_s2,"Expected suites s0,s1,s2");
+
+      // Now drop the handle and Check handle was dropped
+      TestFixture::client().ch_drop(client_handle);
+      TestFixture::client().ch_suites();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have no registered suites");
+   }
+
+   {
+      // register suites s0,s1,s2
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s0_s1_s2);
+
+      // get the handle associated with the registered suites
+      unsigned int client_handle = TestFixture::client().server_reply().client_handle();
+      BOOST_CHECK_MESSAGE(client_handle == 1,"Expected to have handle 1");
+
+      // Check the sync_local() does a full sync for our handle. *THIS* should also clear the handle_changed flag
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().in_sync(),"Expected to be in sync after syn_local()");
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after registering");
+
+
+      // add additional suites & check suites were added to our handle. Sync_local should returna full_sync()
+      std::vector<std::string> added_suites; added_suites.push_back("s3"); added_suites.push_back("s4");
+      TestFixture::client().ch_add(client_handle,added_suites);
+
+      TestFixture::client().ch_suites();
+      ch_suites = TestFixture::client().server_reply().get_client_handle_suites();
+      BOOST_CHECK_MESSAGE(!ch_suites.empty(),"Expected to have registered suites");
+      BOOST_CHECK_MESSAGE(ch_suites.size() == 1,"Expected to have registered a single set");
+      BOOST_CHECK_MESSAGE(ch_suites[0].first == client_handle,"Expected first client handle to be: " << client_handle << ", but found " << ch_suites[0].first);
+      BOOST_CHECK_MESSAGE(ch_suites[0].second == suites_s0_s1_s2_s3_s4,"Expected suites s0,s1,s2,s3,s4");
+
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after adding suites.");
+
+
+      // remove the added suites, and check they were removed
+      TestFixture::client().ch_remove(client_handle,added_suites);
+
+      TestFixture::client().ch_suites();
+      ch_suites = TestFixture::client().server_reply().get_client_handle_suites();
+      BOOST_CHECK_MESSAGE(!ch_suites.empty(),"Expected to have registered suites");
+      BOOST_CHECK_MESSAGE(ch_suites.size() == 1,"Expected to have registered a single set");
+      BOOST_CHECK_MESSAGE(ch_suites[0].first == client_handle,"Expected first client handle to be: " << client_handle << ", but found " << ch_suites[0].first);
+      BOOST_CHECK_MESSAGE(ch_suites[0].second == suites_s0_s1_s2,"Expected suites s0,s1,s2");
+
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after removing suites");
+
+      // Now drop the handle and check handle was dropped
+      TestFixture::client().ch_drop(client_handle);
+      TestFixture::client().ch_suites();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have no registered suites");
+   }
+
+   {
+      // register suites s0,s1,s2
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s0_s1_s2);
+
+      // register suite s3,s4
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s3_s4);
+
+      // get all the registered suites
+      TestFixture::client().ch_suites();
+      ch_suites = TestFixture::client().server_reply().get_client_handle_suites();
+      BOOST_CHECK_MESSAGE(!ch_suites.empty(),"Expected to have registered suites");
+      BOOST_CHECK_MESSAGE(ch_suites.size() == 2,"Expected to have 2 registered sets");
+      BOOST_CHECK_MESSAGE(ch_suites[0].first == 1,"Expected first client handle to be 1, but found " << ch_suites[0].first);
+      BOOST_CHECK_MESSAGE(ch_suites[0].second == suites_s0_s1_s2,"Expected suites s0,s1,s2, in first handle");
+      BOOST_CHECK_MESSAGE(ch_suites[1].first == 2,"Expected second client handle to be 2, but found " << ch_suites[1].first);
+      BOOST_CHECK_MESSAGE(ch_suites[1].second == suites_s3_s4,"Expected suites s3,s4 , in second handle");
+
+      // Drop all handles
+      for(size_t i = 0; i < ch_suites.size(); i++) TestFixture::client().ch_drop(ch_suites[i].first);
+      TestFixture::client().ch_suites();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have no registered suites");
+   }
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_handle_sync )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_handle_sync " << flush;
+   TestClean clean_at_start_and_end;
+
+   Defs theDefs; {
+      for(int s = 0; s < 7; s++) {
+         suite_ptr suite = theDefs.add_suite("s" + boost::lexical_cast<std::string>(s));
+         suite->addDefStatus(DState::SUSPENDED);
+         for(int t = 0; t < 2; t++) { suite->add_task("t" + boost::lexical_cast<std::string>(t)); }
+      }
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_handle_sync.def"),
+                         1 /*timeout*/,
+                         false/* don't wait for test to finish */);
+
+   std::vector<std::string> suites_s0_s1_s2; suites_s0_s1_s2.push_back("s0"); suites_s0_s1_s2.push_back("s1"); suites_s0_s1_s2.push_back("s2");
+   std::vector<std::pair<unsigned int, std::vector<std::string> > > ch_suites;
+
+   {
+      // register suites s0,s1,s2
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s0_s1_s2);
+      unsigned int client_handle = TestFixture::client().server_reply().client_handle();
+      TestFixture::client().news_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().get_news(),"Expected news after registering");
+      TestFixture::client().sync_local(); // sync for any changes to get full update before test starts
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after registering");
+      BOOST_CHECK_MESSAGE(TestFixture::client().defs()->suiteVec().size() == 3,"Expected 3 suites back from sync, after registering 3 suites " << *TestFixture::client().defs());
+
+
+      // make a change to a suite not in our handle, that does not cause state propagation.
+      // State propagation changes the defs state. The defs state is sync regardless
+      TestFixture::client().suspend("/s3");
+      TestFixture::client().news_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().get_news(),"Expected no change since suite s3 is not in our handle");
+
+      // make a change to a suite *not* in our handle, that *does* cause state propagation.
+      TestFixture::client().force("/s3/t0","aborted");
+      TestFixture::client().news_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().get_news(),"Expected change via state propagation to defs, even though s3 not in our handle");
+
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental change, not a full update");
+
+
+      // make a change to a suite in our handle
+      TestFixture::client().force("/s0","complete");
+      TestFixture::client().news_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().get_news(),"Expected news since state changed");
+
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental change, not a full update");
+
+      TestFixture::client().ch_drop(client_handle);
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have no registered suites");
+   }
+
+   {
+      // register suites s0,s1,s2
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s0_s1_s2);
+      unsigned int client_handle = TestFixture::client().server_reply().client_handle();
+      TestFixture::client().news_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().get_news(),"Expected news after registering");
+      TestFixture::client().sync_local(); // sync for any changes to get full update before test starts
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after registering");
+
+
+      // make a small change to a suite *IN* our handle
+      TestFixture::client().force("/s1","complete");
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental change, not a full update");
+
+      // Change the order
+      TestFixture::client().order("/s0","alpha");
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental update");
+
+      TestFixture::client().ch_drop(client_handle);
+      TestFixture::client().suites();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have no registered suites");
+   }
+
+   {
+      // register suites s0,s1,s2
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s0_s1_s2);
+      unsigned int client_handle = TestFixture::client().server_reply().client_handle();
+      TestFixture::client().news_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().get_news(),"Expected news after registering");
+      TestFixture::client().sync_local(); // sync for any changes to get full update **before** test starts
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after registering");
+
+
+      // make a small change to a suite *IN* our handle
+      TestFixture::client().force("/s1","unknown");
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental change, not a full update");
+
+
+      // DELETE suite s2, i.e make a change that should force a *FULL* update
+      TestFixture::client().delete_node("/s2",true/*force*/);
+      TestFixture::client().news_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().get_news(),"Expected news after deleting node");
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected full update");
+
+
+      // Check that suite s2 is STILL in our handle.
+      // delete suites STAY registered until they are explicitly deleted
+      TestFixture::client().ch_suites();
+      ch_suites = TestFixture::client().server_reply().get_client_handle_suites();
+      BOOST_CHECK_MESSAGE(ch_suites[0].second == suites_s0_s1_s2,"Expected suites s0,s1,s2, in handle");
+
+      TestFixture::client().ch_drop(client_handle);
+      TestFixture::client().ch_suites();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have no registered suites");
+   }
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+
+BOOST_AUTO_TEST_CASE( test_handle_add_remove_add )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_handle_add_remove_add " << flush;
+   TestClean clean_at_start_and_end;
+
+   defs_ptr theDefs  =  Defs::create(); {
+      for(int s = 0; s < 3; s++) {
+         suite_ptr suite = theDefs->add_suite("s" + boost::lexical_cast<std::string>(s));
+         suite->addDefStatus(DState::SUSPENDED); // NO NEED to run jobs for this test:
+         for(int t = 0; t < 2; t++) { suite->add_task("t" + boost::lexical_cast<std::string>(t)); }
+      }
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   // ADD
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(*theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_handle_sync.def"),
+                         1 /*timeout*/,
+                         false/* don't wait for test to finish */);
+
+   TestFixture::client().set_throw_on_error( true );
+   std::vector<std::string> suites_s0_s1_s2; suites_s0_s1_s2.push_back("s0"); suites_s0_s1_s2.push_back("s1"); suites_s0_s1_s2.push_back("s2");
+   std::vector<std::pair<unsigned int, std::vector<std::string> > > ch_suites;
+
+   {
+      // register suites s0
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_s0_s1_s2);
+      unsigned int client_handle = TestFixture::client().server_reply().client_handle();
+      BOOST_CHECK_MESSAGE(client_handle == 1 ,"Expected handle of value 1 but found " << client_handle );
+
+      // Get the registered suites
+      TestFixture::client().ch_suites();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have registered suites");
+
+
+      // Check the sync_local() does a full sync for our handle
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().in_sync(),"Expected to be in sync after syn_local()");
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after registering");
+      BOOST_CHECK_MESSAGE(TestFixture::client().defs()->suiteVec().size() == 3,"Expected 3 suites back from sync " << *TestFixture::client().defs());
+
+
+      // DELETE suites. They should stay *registered*
+      TestFixture::client().delete_node("/s0");
+      TestFixture::client().delete_node("/s1");
+      TestFixture::client().delete_node("/s2");
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after deleting suite");
+      BOOST_CHECK_MESSAGE(TestFixture::client().defs()->suiteVec().size() == 0,"Expected 0 suites back from sync " << *TestFixture::client().defs());
+
+      // Check suites are still registered. Only explicit drop can remove registered suites
+      TestFixture::client().ch_suites();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have registered suites");
+
+
+      // RELOAD the defs, which includes s0,s1,s2:: THIS SHOULD GET RE_ADDED TO OUR EXISTING HANDLE's
+      // The handle references to the suites should get *refreshed*
+      TestFixture::client().load(theDefs);
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() since client handle should be refreshed with new suite_pts");
+      BOOST_CHECK_MESSAGE(TestFixture::client().defs()->suiteVec().size() == 3,"Expected 3 suites back from sync " << *TestFixture::client().defs());
+
+      TestFixture::client().ch_drop(client_handle);
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().get_client_handle_suites().empty(),"Expected to have no registered suites");
+   }
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestKillCmd.cpp b/ecflow_4_0_7/Test/TestKillCmd.cpp
new file mode 100644
index 0000000..a59b36b
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestKillCmd.cpp
@@ -0,0 +1,149 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #25 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This is used to INVOKE a SINGLE test. Easier for debugging
+//============================================================================
+#include <iostream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "AssertTimer.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite  )
+
+// forward declare functions
+static bool kill_cmd(bool kill_task);
+static bool waitForTaskState(NState::State state, int max_time_to_wait);
+
+// test:: test the kill command. Create a task that runs a long time
+// The associated job is then killed. This should leave task in aborted state
+BOOST_AUTO_TEST_CASE( test_kill_cmd )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_kill_cmd " << flush;
+   TestClean clean_at_start_and_end;
+   BOOST_REQUIRE_MESSAGE(kill_cmd(true)," kill of task '/test_kill_cmd/family/t0' failed");
+   cout << timer.duration() << "\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_hierarchical_kill_cmd )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_hierarchical_kill_cmd " << flush;
+   TestClean clean_at_start_and_end;
+   BOOST_REQUIRE_MESSAGE(kill_cmd(false),"kill of suite '/test_kill_cmd' failed");
+   cout << timer.duration() << "\n";
+}
+
+
+static bool kill_cmd(bool kill_task)
+{
+   /// Create dir location for log file.
+   std::string defs_location = ServerTestHarness::testDataDefsLocation("test_kill_cmd.def");
+   fs::path new_path = defs_location;
+   if (!fs::exists(new_path.parent_path())) {
+      File::createMissingDirectories(new_path.parent_path().string());
+   }
+
+   Defs theDefs;
+   std::string kill_path;
+   {
+      suite_ptr suite;
+      if (kill_task ) suite = theDefs.add_suite( "test_kill_task");
+      else            suite = theDefs.add_suite( "test_kill_suite");
+      suite->addVariable( Variable("ECF_TRIES","1") ); // do not try again
+      family_ptr fam = suite->add_family( "family" );
+      task_ptr task = fam->add_task(  "t0");
+      task->addMeter( Meter("meter",0,200,100) );      // Make sure it run long enough, to receive kill, on slow systems
+      task->addVerify( VerifyAttr(NState::ABORTED,1) );// task should abort 1 times
+      if (kill_task) kill_path = task->absNodePath();
+      else           kill_path = suite->absNodePath();
+   }
+
+   // *******************************************************************
+   // Important: The following will *not* work:
+   //    theDefs.set_server().add_or_update_variables("ECF_TRIES","1");                     // Override ECF_TRIES so don't try to restart aborted jobs
+   //    theDefs.set_server().add_or_update_variables("ECF_KILL_CMD","kill -15 %ECF_RID%"); // Provide a mechanism to kill the running job
+   // Since calling the begin command in the server,
+   // will update the defs with the server environment, and hence overriding
+   // any env variable of the same name, set here. Hence just use addVariable as above.
+   // *************************************************************************
+   //	cout << theDefs << "\n";
+
+   // cout << "test_kill_cmd Start test\n";
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,defs_location,1 /*timeout*/,  false/* don't wait for test to finish */);
+
+
+   // cout << "test_kill_cmd Waiting for task to become active\n";
+   TestFixture::client().set_throw_on_error(false);
+   (void)waitForTaskState(NState::ACTIVE,10);
+
+
+   // cout << "test_kill_cmd Now kill the active jobs\n";
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().kill(kill_path) == 0,CtsApi::to_string(CtsApi::kill(kill_path)) << " failed should return 0.\n" << TestFixture::client().errorMsg());
+
+
+   // cout << "test_kill_cmd Wait for the task to be aborted\n";
+   return waitForTaskState(NState::ABORTED,20 );
+}
+
+static bool waitForTaskState(NState::State state, int max_time_to_wait)
+{
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "sync_local failed should return 0\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      vector<Task*> tasks; defs->getAllTasks(tasks);
+      BOOST_FOREACH(Task* task, tasks) {
+         if (task->state() == state) {
+            return true;
+         }
+      }
+
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+                  "waitForTaskState " << NState::toString(state) << " Test wait " << assertTimer.duration() <<
+                  " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                  " aborting\n" << *defs);
+         break;
+      }
+      sleep(2);
+   }
+   return false;
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Test/TestLate.cpp b/ecflow_4_0_7/Test/TestLate.cpp
new file mode 100644
index 0000000..65c1cca
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestLate.cpp
@@ -0,0 +1,85 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <limits> // for std::numeric_limits<int>::max()
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "TestFixture.hpp"
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "DefsStructureParser.hpp"
+#include "AssertTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite  )
+
+BOOST_AUTO_TEST_CASE( test_late )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_late " << flush;
+   TestClean clean_at_start_and_end;
+
+   /// This test will sleep longer than the job submission interval
+   /// which cause the task to be late
+   /// as the active time has been set for 1 minute.
+   /// The check for lateness is ONLY done are server poll time.
+   /// Hence the task run time must be at least twice the poll time.
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite("test_late");
+      suite->add_variable("SLEEPTIME",boost::lexical_cast<std::string>(TestFixture::job_submission_interval()*2) ); // this will cause the late
+
+      task_ptr task = suite->add_task("t1");
+      ecf::LateAttr lateAttr;
+      lateAttr.addComplete( ecf::TimeSlot(0,1), true);
+
+      task->addLate( lateAttr );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_late.def"));
+
+   TestFixture::client().set_throw_on_error(true);
+   TestFixture::client().sync_local();
+   BOOST_CHECK_MESSAGE( TestFixture::client().defs(),"Expected defs");
+
+   node_ptr node = TestFixture::client().defs()->findAbsNode("/test_late/t1");
+   BOOST_CHECK_MESSAGE( node,"Expected task to be found");
+
+   ecf::LateAttr* late = node->get_late();
+   BOOST_CHECK_MESSAGE( late->isLate(),"Expected late to be set");
+   BOOST_CHECK_MESSAGE( node->flag().is_set(ecf::Flag::LATE),"Expected late flag to be set");
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestLimit.cpp b/ecflow_4_0_7/Test/TestLimit.cpp
new file mode 100644
index 0000000..a605045
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestLimit.cpp
@@ -0,0 +1,118 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #25 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+// This test does not have any time dependencies in the def file.
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+// This test does not have any time dependencies in the def file.
+BOOST_AUTO_TEST_CASE( test_limit )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_limit "<< flush;
+   TestClean clean_at_start_and_end;
+
+	// Create the defs file corresponding to the text below
+	// ECF_HOME variable is automatically added by the test harness.
+	// ECF_INCLUDE variable is automatically added by the test harness.
+	// SLEEPTIME variable is automatically added by the test harness.
+	// ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+	//                     This is substituted in sms includes
+	//                     Allows test to run without requiring installation
+
+	//# Test the ecf file can be found via ECF_SCRIPT
+	//# Note: we have to use relative paths, since these tests are relocatable
+ 	// Create the defs file
+	//	suite test_limit
+	//     limit disk 50
+	//     limit fast 1
+	//	   edit ECF_HOME data/ECF_HOME    # added by test harness
+	//	   edit SLEEPTIME 1
+	//	   edit ECF_INCLUDE $ECF_HOME/includes
+	//	   family family
+	//          inlimit /suite1:fast
+	//	   		task t1
+ 	//	   		task t2
+ 	//	   		task t3
+ 	//	   endfamily
+	//	   family family2
+	//          inlimit /suite1:disk 20
+	//	   		task t1
+ 	//	   		task t2
+ 	//	   		task t3
+ 	//	   endfamily
+	//	endsuite
+
+  	Defs theDefs;
+ 	{
+ 		std::string suiteName = "test_limit";
+  		std::string pathToLimit = "/" + suiteName;
+
+      suite_ptr suite = theDefs.add_suite( suiteName );
+		suite->addLimit(Limit("fast",1));
+		suite->addLimit(Limit("disk",50));
+
+      family_ptr fam = suite->add_family("family");
+		fam->addInLimit(InLimit("fast",pathToLimit));
+		fam->addVerify( VerifyAttr(NState::COMPLETE,1) );
+		int taskSize = 3;
+ 		for(int i=0; i < taskSize; i++) {
+ 		   task_ptr task = fam->add_task( "t" + boost::lexical_cast<std::string>(i) );
+ 			task->addVerify( VerifyAttr(NState::COMPLETE,1) );
+ 		}
+
+      family_ptr fam2 = suite->add_family("family2");
+		fam2->addInLimit(InLimit("disk",pathToLimit,20));
+		fam2->addVerify( VerifyAttr(NState::COMPLETE,1) );
+ 		for(int i=0; i < taskSize; i++) {
+ 		   task_ptr task = fam2->add_task( "t" + boost::lexical_cast<std::string>(i) );
+ 			task->addVerify( VerifyAttr(NState::COMPLETE,1) );
+  		}
+ 	}
+
+
+ 	// The test harness will create corresponding directory structure
+ 	// and populate with standard ecf files.
+ 	ServerTestHarness serverTestHarness;
+ 	serverTestHarness.run(theDefs,  ServerTestHarness::testDataDefsLocation( "test_limit.def" ));
+
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestOrderCmd.cpp b/ecflow_4_0_7/Test/TestOrderCmd.cpp
new file mode 100644
index 0000000..48204ef
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestOrderCmd.cpp
@@ -0,0 +1,216 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This is used to INVOKE a SINGLE test.
+//               Making it easier for Easier for debugging and development
+//============================================================================
+#include <iostream>
+#include <limits> // for std::numeric_limits<int>::max()
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "DefsStructureParser.hpp"
+#include "AssertTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite  )
+
+std::vector<std::string> to_string_vec(const std::vector<suite_ptr>& sv) {
+   std::vector<std::string> r; r.reserve(sv.size());
+   for(size_t i = 0; i < sv.size(); i++) r.push_back(sv[i]->name());
+   return r;
+}
+
+std::vector<std::string> to_string_vec(const std::vector<node_ptr>& sv) {
+   std::vector<std::string> r; r.reserve(sv.size());
+   for(size_t i = 0; i < sv.size(); i++) r.push_back(sv[i]->name());
+   return r;
+}
+
+void test_ordering() {
+
+   TestFixture::client().set_throw_on_error(true);
+   std::vector<std::string> str_a_b_c; str_a_b_c.push_back("a"); str_a_b_c.push_back("b"); str_a_b_c.push_back("c");
+   std::vector<std::string> str_c_b_a; str_c_b_a.push_back("c"); str_c_b_a.push_back("b"); str_c_b_a.push_back("a");
+   std::vector<std::string> str_b_c_a; str_b_c_a.push_back("b"); str_b_c_a.push_back("c"); str_b_c_a.push_back("a");
+   std::vector<std::string> str_b_a_c; str_b_a_c.push_back("b"); str_b_a_c.push_back("a"); str_b_a_c.push_back("c");
+   std::vector<std::string> str_a_c_b; str_a_c_b.push_back("a"); str_a_c_b.push_back("c"); str_a_c_b.push_back("b");
+   TestFixture::client().sync_local();  // First sync_local will do a full sync
+   {
+      // TEST SUITE ORDERING
+      TestFixture::client().order("/a",NOrder::toString(NOrder::ORDER));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()) ==  str_c_b_a, "Order not as expected");
+
+
+      TestFixture::client().order("/a",NOrder::toString(NOrder::ALPHA));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()) ==  str_a_b_c, "Order not as expected");
+
+
+      TestFixture::client().order("/a",NOrder::toString(NOrder::BOTTOM));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()) ==  str_b_c_a, "Order not as expected");
+
+      TestFixture::client().order("/a",NOrder::toString(NOrder::ALPHA));
+      TestFixture::client().order("/a",NOrder::toString(NOrder::DOWN));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()) ==  str_b_a_c, "Order not as expected");
+
+      TestFixture::client().order("/a",NOrder::toString(NOrder::ALPHA));
+      TestFixture::client().order("/c",NOrder::toString(NOrder::UP));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()) ==  str_a_c_b, "Order not as expected");
+   }
+   {
+      // TEST FAMILY ordering
+      TestFixture::client().order("/a/a",NOrder::toString(NOrder::ORDER));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()[0]->nodeVec()) ==  str_c_b_a, "Order not as expected");
+
+
+      TestFixture::client().order("/a/a",NOrder::toString(NOrder::ALPHA));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()[0]->nodeVec()) ==  str_a_b_c, "Order not as expected");
+
+
+      TestFixture::client().order("/a/a",NOrder::toString(NOrder::BOTTOM));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()[0]->nodeVec()) ==  str_b_c_a, "Order not as expected");
+
+      TestFixture::client().order("/a/a",NOrder::toString(NOrder::ALPHA));
+      TestFixture::client().order("/a/a",NOrder::toString(NOrder::DOWN));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()[0]->nodeVec()) ==  str_b_a_c, "Order not as expected");
+
+      TestFixture::client().order("/a/a",NOrder::toString(NOrder::ALPHA));
+      TestFixture::client().order("/a/c",NOrder::toString(NOrder::UP));
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(!TestFixture::client().server_reply().full_sync(),"Expected incremental sync");
+      BOOST_CHECK_MESSAGE(to_string_vec(TestFixture::client().defs()->suiteVec()[0]->nodeVec()) ==  str_a_c_b, "Order not as expected");
+   }
+}
+
+BOOST_AUTO_TEST_CASE( test_change_order )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_change_order " << flush;
+   TestClean clean_at_start_and_end;
+
+   /// NOT: We *DONT* need to run the jobs for this TEST
+   std::vector<std::string> str_a_b_c; str_a_b_c.push_back("a"); str_a_b_c.push_back("b"); str_a_b_c.push_back("c");
+   Defs theDefs; {
+      for(size_t s = 0; s < str_a_b_c.size(); s++) {
+         suite_ptr suite = theDefs.add_suite(str_a_b_c[s]);
+         suite->addDefStatus(DState::SUSPENDED); // NO NEED to run jobs for this test:
+         for(size_t f = 0; f < str_a_b_c.size(); f++) {
+            family_ptr fam = suite->add_family(str_a_b_c[f]);
+            for(size_t t = 0; t < str_a_b_c.size(); t++) {
+               fam->add_task(str_a_b_c[t]);
+            }
+         }
+      }
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+            ServerTestHarness::testDataDefsLocation("test_change_order.def"),
+            1 /*timeout*/,
+            false/* don't wait for test to finish */);
+
+
+   test_ordering();
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+
+BOOST_AUTO_TEST_CASE( test_handle_change_order )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_handle_change_order " << flush;
+   TestClean clean_at_start_and_end;
+
+   std::vector<std::string> str_a_b_c; str_a_b_c.push_back("a"); str_a_b_c.push_back("b"); str_a_b_c.push_back("c");
+   std::vector<std::string> suite_a_b_c_d_e; suite_a_b_c_d_e.push_back("a"); suite_a_b_c_d_e.push_back("b"); suite_a_b_c_d_e.push_back("c");
+   suite_a_b_c_d_e.push_back("d"); suite_a_b_c_d_e.push_back("e");
+   Defs theDefs; {
+      for(size_t s = 0; s < suite_a_b_c_d_e.size(); s++) {
+         suite_ptr suite = theDefs.add_suite(suite_a_b_c_d_e[s]);
+         suite->addDefStatus(DState::SUSPENDED); // NO NEED to run jobs for this test:
+         for(size_t f = 0; f < str_a_b_c.size(); f++) {
+            family_ptr fam = suite->add_family(str_a_b_c[f]);
+            for(size_t t = 0; t < str_a_b_c.size(); t++) {
+               fam->add_task(str_a_b_c[t]);
+            }
+         }
+      }
+   }
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+            ServerTestHarness::testDataDefsLocation("test_change_order.def"),
+            1 /*timeout*/,
+            false/* don't wait for test to finish */);
+
+
+   TestFixture::client().set_throw_on_error( true );
+   TestFixture::client().sync_local();  // First sync_local will do a full sync
+   {
+      // register suites a,b,c
+      std::vector<std::string> suites_a_b_c; suites_a_b_c.push_back("a"); suites_a_b_c.push_back("b"); suites_a_b_c.push_back("c");
+      TestFixture::client().ch_register(false/*add new suites to handle*/,suites_a_b_c);
+
+      // Check the sync_local() does a full sync for our handle
+      TestFixture::client().sync_local();
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().in_sync(),"Expected to be in sync after syn_local()");
+      BOOST_CHECK_MESSAGE(TestFixture::client().server_reply().full_sync(),"Expected a full_sync() after registering");
+      BOOST_CHECK_MESSAGE(TestFixture::client().defs()->suiteVec().size() == 3,"Expected sync to return 3 suites.");
+   }
+
+   // Do same test, this time sync_local will only return suite a,b,c (i.e suite d,e not registered and hence left out)
+   // Ording should still be applied to the whole suite.
+   test_ordering();
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestRepeat.cpp b/ecflow_4_0_7/Test/TestRepeat.cpp
new file mode 100644
index 0000000..18274da
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestRepeat.cpp
@@ -0,0 +1,338 @@
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "WhyCmd.hpp"
+#include "PrintStyle.hpp"
+#include "Str.hpp"
+
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+// This test does not have any time dependencies in the def file.
+BOOST_AUTO_TEST_CASE( test_repeat_integer )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_repeat_integer " << flush;
+   TestClean clean_at_start_and_end;
+
+   // ********************************************************************************
+   // IMPORTANT: A family will only complete when it has reached the end of the repeats
+   // *********************************************************************************
+
+	// Create the defs file corresponding to the text below
+	// ECF_HOME variable is automatically added by the test harness.
+	// ECF_INCLUDE variable is automatically added by the test harness.
+	// SLEEPTIME variable is automatically added by the test harness.
+	// ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+	//                     This is substituted in sms includes
+	//                     Allows test to run without requiring installation
+
+ 	//# Note: we have to use relative paths, since these tests are relocatable
+	//suite test_repeat_integer
+	//	repeat integer VAR 0 1 1          # run at 0, 1    2 times
+	//	edit SLEEPTIME 1
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//	    repeat integer VAR 0 2 1     # run at 0, 1     2 times
+	//   	task t<n>
+	//      ....
+ 	//  	endfamily
+	//endsuite
+
+	// Each task/job should be run *4* times, according to the repeats
+	// Mimics nested loops
+  	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite( "test_repeat_integer" );
+ 		suite->addRepeat( RepeatInteger("VAR",0,1,1)); // repeat suite 2 times,
+ 		suite->addVerify( VerifyAttr(NState::COMPLETE,2) );
+      family_ptr fam = suite->add_family("family");
+ 		fam->addRepeat( RepeatInteger("VAR",0,1,1));    // repeat family 2 times
+		fam->addVerify( VerifyAttr(NState::COMPLETE,4) );
+		int taskSize = 2; // on linux 1024 tasks take ~4 seconds for job submission
+  		for(int i=0; i < taskSize; i++) {
+  		   task_ptr task = fam->add_task ( "t" + boost::lexical_cast<std::string>(i) );
+  			task->addVerify( VerifyAttr(NState::COMPLETE,4) );      // task should complete 4 times
+ 		}
+ 	}
+
+ 	// The test harness will create corresponding directory structure
+ 	// and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+ 	serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_repeat_integer.def"));
+
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_date )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_repeat_date " << flush;
+   TestClean clean_at_start_and_end;
+
+   // ********************************************************************************
+   // IMPORTANT: A family will only complete when it has reached the end of the repeats
+   // *********************************************************************************
+   //suite test_repeat_date
+   // family family
+   //    repeat date DATE 20110630 20110632
+   //    task t<n>
+   //      ....
+   //    endfamily
+   //endsuite
+   int taskSize = 2;
+   Defs theDefs;  {
+      suite_ptr suite = theDefs.add_suite("test_repeat_date");
+      suite->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      family_ptr fam = suite->add_family("family" );
+      fam->addRepeat( RepeatDate("DATE",20110630,20110704));
+      fam->addVerify( VerifyAttr(NState::COMPLETE,5) );
+      for(int i=0; i < taskSize; i++) {
+         task_ptr task = fam->add_task( "t" + boost::lexical_cast<std::string>(i) );
+         task->addVerify( VerifyAttr(NState::COMPLETE,5) );
+      }
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_repeat_date.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+
+BOOST_AUTO_TEST_CASE( test_repeat_enumerator )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_repeat_enumerator " << flush;
+   TestClean clean_at_start_and_end;
+
+   // ********************************************************************************
+   // IMPORTANT: A family will only complete when it has reached the end of the repeats
+   // *********************************************************************************
+   //   suite test_repeat_enumerator
+   //     family top
+   //       family plot
+   //         family iasi_plots
+   //           repeat enumerated month "200801" "200802"
+   //           task t1
+   //         endfamily
+   //       endfamily
+   //     endfamily
+   //   endsuite
+
+   Defs theDefs;
+   {
+      suite_ptr suite = theDefs.add_suite(  "test_repeat_enumerator" );
+      family_ptr top = suite->add_family("top");
+      family_ptr plot = top->add_family("plot");
+      family_ptr iasi_plots = plot->add_family("iasi_plots");
+      vector<string> months; months.reserve(12); months.push_back("200801"); months.push_back("200802");
+      iasi_plots->addRepeat(RepeatEnumerated("month",months));
+      task_ptr t1 = iasi_plots->add_task("t1");
+      t1->addVerify( VerifyAttr(NState::COMPLETE,2) );
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_repeat_enumerator.def") );
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_defstatus )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_repeat_defstatus " << flush;
+   TestClean clean_at_start_and_end;
+
+	// TEST SHOULD COMPLETE STRAIGHT AWAY SINCE WE HAVE A DEFSTATUS COMPLETE
+	// since the complete state is set on all children of suite.
+
+	// Create the defs file corresponding to the text below
+ 	//# Note: we have to use relative paths, since these tests are relocatable
+	//suite test_repeat_defstatus
+	// defstatus complete
+	//	repeat integer VAR 0 1 1          # run at 0, 1    2 times
+	//	edit SLEEPTIME 1
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//	    repeat integer VAR 0 2 1     # run at 0, 1     2 times
+	//   	task t<n>
+	//      ....
+ 	//  	endfamily
+	//endsuite
+	int taskSize = 2; // on linux 1024 tasks take ~4 seconds for job submission
+  	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite(  "test_repeat_defstatus" );
+		suite->addDefStatus(DState::COMPLETE);
+ 		suite->addRepeat( RepeatInteger("VAR",0,1,1));
+ 		suite->addVerify( VerifyAttr(NState::COMPLETE,1) );
+
+      family_ptr fam = suite->add_family("family" );
+ 		fam->addRepeat( RepeatInteger("VAR",0,1,1));
+		fam->addVerify( VerifyAttr(NState::COMPLETE,1) );
+  		for(int i=0; i < taskSize; i++) {
+
+         task_ptr task = fam->add_task( "t" + boost::lexical_cast<std::string>(i) );
+  			task->addVerify( VerifyAttr(NState::COMPLETE,1) );
+ 		}
+ 	}
+
+   ServerTestHarness serverTestHarness;
+ 	serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_repeat_defstatus.def"));
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+//#define DEBUG_ME 1
+BOOST_AUTO_TEST_CASE( test_repeat_clears_user_edit )
+{
+   // Tests code:: Node::requeueOrSetMostSignificantStateUpNodeTree()
+   // In *PARTICULAR* THE REQUE caused by the repeat, this ensures we clear NO_REQUE_IF_SINGLE_TIME_DEP
+   // So that the effect of manual run/force complete are negated via automated re-queue caused by a REPEAT
+
+   DurationTimer timer;
+   cout << "Test:: ...test_repeat_clears_user_edit " << flush;
+   TestClean clean_at_start_and_end;
+
+   // The functionality where the Repeat requeue clears NO_REQUE_IF_SINGLE_TIME_DEP  was added in version 4.0.3
+   // Hence we need to disable this test, if the server version is less 403
+   // Since these tests can also be used to test backward compatibility. i.e new client old server
+   int the_server_version = TestFixture::server_version() ;
+   if (the_server_version < 403 ) {
+      cout << " SKIPPING, since this test requires server version >= 403, current server version is " << the_server_version << "\n";
+      return;
+   }
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_repeat_clears_user_edit
+   // edit SLEEPTIME 1
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   // family family
+   //    repeat integer VAR 0 3     # run at 0,1,2    i.e 3 times
+   //    task t<n>
+   //       time <current time>
+   //    endfamily
+   //endsuite
+
+   Defs theDefs;
+   task_ptr task;
+   {
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(10,0,0));
+      boost::posix_time::ptime time1 = theLocalTime +  minutes(3);
+
+      suite_ptr suite = theDefs.add_suite( "test_repeat_clears_user_edit" );
+      ClockAttr clockAttr(theLocalTime,false);
+      suite->addClock( clockAttr );
+
+      suite->addDefStatus(DState::SUSPENDED);
+      family_ptr fam = suite->add_family("family");
+      fam->addRepeat( RepeatInteger("VAR",0,2,1));    // repeat family 3 times
+      task = fam->add_task ( "t1" );
+      task->addTime( ecf::TimeAttr(ecf::TimeSlot(time1.time_of_day())));
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );
+
+      // cout << theDefs << "\n";
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_repeat_integer.def"), 40, false /* waitFortestcompletion */);
+
+#ifdef DEBUG_ME
+   PrintStyle::setStyle(PrintStyle::STATE);
+   TestFixture::client().sync_local();
+   defs_ptr server_defs = TestFixture::client().defs();
+   cout << "At start ============================================\n";
+   cout << server_defs  << "\n";
+#endif
+
+   // USER EDIT, on task with a time. The force complete will expire the time.
+   // Forcing a task with the time attribute, to complete state, should invalidate/expire the time,
+   // Hence it should hold indefinitely, or until it is re-queued manually, or automatically via a Repeat/cron.
+   // This Test ensures the the *REQUEUE* via the repeat, resets the time based attribute
+   TestFixture::client().force(task->absNodePath(),"complete",true);
+   TestFixture::client().force(task->absNodePath(),"complete",true);
+
+
+#ifdef DEBUG_ME
+   TestFixture::client().sync_local();
+   server_defs = TestFixture::client().defs();
+   cout << "After 2 force complete ============================================\n";
+   cout << server_defs  << "\n";
+
+   node_ptr the_task = server_defs->findAbsNode(task->absNodePath());
+   BOOST_REQUIRE_MESSAGE(the_task, "Task " << task->absNodePath() << " not found");
+   WhyCmd whyCmd( server_defs, the_task->absNodePath());
+   std::string reason = whyCmd.why();
+   cout << "Why command ============================================\n";
+   std::cout << reason << "\n\n";
+#endif
+
+   // resume the suspend suite
+   TestFixture::client().resume("/test_repeat_clears_user_edit");
+
+#ifdef DEBUG_ME
+   TestFixture::client().sync_local();
+   server_defs = TestFixture::client().defs();
+   cout << "At Resume ============================================\n";
+   cout << server_defs  << "\n";
+#endif
+
+   // Wait for final LOOP of the repeat, and test to finish
+   int timeout = 20;
+   bool verifyAttrInServer = true;
+   defs_ptr serverDefs = serverTestHarness.testWaiter(theDefs,timeout,verifyAttrInServer);
+   BOOST_REQUIRE_MESSAGE(serverDefs.get()," Failed to return defs after wait of 20 seconds");
+
+#ifdef DEBUG_ME
+   cout << "At test finish ============================================\n";
+   cout << serverDefs  << "\n";
+#endif
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestRequeueNode.cpp b/ecflow_4_0_7/Test/TestRequeueNode.cpp
new file mode 100644
index 0000000..1f98bfe
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestRequeueNode.cpp
@@ -0,0 +1,112 @@
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+using namespace std;
+using namespace ecf;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+BOOST_AUTO_TEST_CASE( test_requeue_node )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_requeue_node " << flush;
+   TestClean clean_at_start_and_end;
+
+	// Create the defs file corresponding to the text below
+	// ECF_HOME variable is automatically added by the test harness.
+	// ECF_INCLUDE variable is automatically added by the test harness.
+	// SLEEPTIME variable is automatically added by the test harness.
+	// ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+	//                     This is substituted in sms includes
+	//                     Allows test to run without requiring installation
+
+ 	//# Note: we have to use relative paths, since these tests are relocatable
+	//suite test_repeat_integer
+	//	repeat integer VAR 0 1 1          # run at 0, 1    2 times
+	//	edit SLEEPTIME 1
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//	    repeat integer VAR 0 2 1     # run at 0, 1     2 times
+	//   	task t<n>
+	//      ....
+ 	//  	endfamily
+	//endsuite
+
+	// Each task/job should be run *4* times, according to the repeats Mimics nested loops
+  	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite(  "test_reque" );
+ 		suite->addRepeat( RepeatInteger("VAR",0,1,1)); // repeat suite 2 times
+ 		suite->addVerify( VerifyAttr(NState::COMPLETE,2) );
+      family_ptr fam = suite->add_family("family" );
+ 		fam->addRepeat( RepeatInteger("VAR",0,1,1));    // repeat family 2 times
+		fam->addVerify( VerifyAttr(NState::COMPLETE,4) );
+		int taskSize = 2; // on linux 1024 tasks take ~4 seconds for job submission
+  		for(int i=0; i < taskSize; i++) {
+  		   task_ptr task = fam->add_task( "t" +   boost::lexical_cast<std::string>(i));
+  			task->addVerify( VerifyAttr(NState::COMPLETE,4) );      // task should complete 4 times
+ 		}
+ 	}
+
+ 	// The test harness will create corresponding directory structure
+ 	// and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+ 	serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_reque.def") );
+
+ 	// Now re-queue the whole suite
+	TestFixture::client().set_throw_on_error( true );
+   TestFixture::client().requeue("/test_reque");
+
+   // Wait for test to finish
+ 	int timeout = 30;
+	bool verifyAttrInServer = false;
+	defs_ptr serverDefs = serverTestHarness.testWaiter(theDefs,timeout,verifyAttrInServer);
+	BOOST_REQUIRE_MESSAGE(serverDefs.get()," Failed to return server after re-queue");
+
+//	cout << "Printing Defs \n";
+//	std::cout << *serverDefs.get();
+
+	// since we requed each task should have completed 8 times
+	std::vector<Task*> taskVec;
+	serverDefs->getAllTasks(taskVec);
+	BOOST_FOREACH(Task* t, taskVec) {
+ 		BOOST_FOREACH(const VerifyAttr& v, t->verifys()) {
+ 			if (v.state() == NState::COMPLETE) {
+ 				BOOST_CHECK_MESSAGE(v.actual() == 8,"Expected task " << t->absNodePath() << " to complete 8 times, due to reque, but it completed only " << v.actual() << " times\n");
+ 			}
+ 		}
+	}
+
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestRunner.cpp b/ecflow_4_0_7/Test/TestRunner.cpp
new file mode 100644
index 0000000..d4444d9
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestRunner.cpp
@@ -0,0 +1,21 @@
+#define BOOST_TEST_MODULE Test
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "TestFixture.hpp"
+#include <boost/test/unit_test.hpp>
+
+// Global test fixture. Dues to boost deficiency this can't be accessed. hence
+// TestFixture makes use of global data.
+BOOST_GLOBAL_FIXTURE( TestFixture );
diff --git a/ecflow_4_0_7/Test/TestServer.cpp b/ecflow_4_0_7/Test/TestServer.cpp
new file mode 100644
index 0000000..7e1530a
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestServer.cpp
@@ -0,0 +1,135 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #39 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "Host.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+// This test does not have any time dependencies in the def file.
+BOOST_AUTO_TEST_CASE( test_server_job_submission )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_server_job_submission "<< flush;
+   TestClean clean_at_start_and_end;
+
+ 	//# Note: we have to use relative paths, since these tests are relocatable
+	//suite test_server_job_submission
+	//	edit SLEEPTIME 1
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//   	task t<n>
+	//      ....
+ 	//  	endfamily
+	//endsuite
+  	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite( "test_server_job_submission" );
+      family_ptr fam = suite->add_family("family" );
+	 	fam->addVerify( VerifyAttr(NState::COMPLETE,1) );
+	 	int taskSize = 3; // on linux 1024 tasks take ~4 seconds for job submission
+  		for(int i=0; i < taskSize; i++) {
+         task_ptr task = fam->add_task( "t" +   boost::lexical_cast<std::string>(i));
+  	 		task->addVerify( VerifyAttr(NState::COMPLETE,1) );
+ 		}
+ 	}
+
+ 	// The test harness will create corresponding directory structure and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+	serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_server_job_submission.def"));
+
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_restore_defs_from_check_pt )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_restore_defs_from_check_pt "<< flush;
+   TestClean clean_at_start_and_end;
+   // **********************************************************************
+   // In order for this test to work, we need to disable the automatic
+   // check pointing done by the server. Otherwise it will interfere with
+   // this test. This is re-enabled at the end of the test
+   // ************************************************************************
+   Defs theDefs; {
+      suite_ptr suite = Suite::create( "test_restore_defs_from_check_pt" );
+      suite->addTask( Task::create( "t1" ) );
+      theDefs.addSuite( suite );
+   }
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_restore_defs_from_check_pt.def"));
+
+   TestFixture::client().set_throw_on_error(false);
+
+   // Disable server check pointing
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().checkPtDefs(ecf::CheckPt::NEVER) == 0,CtsApi::checkPtDefs(ecf::CheckPt::NEVER) << " failed should return 0\n" << TestFixture::client().errorMsg());
+
+   Host h;
+   std::string check_pt_file_name = h.ecf_checkpt_file(TestFixture::port());
+
+   // make sure we have a valid definition with at least one suite before start
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().getDefs() == 0, "Expected getDefs() to succeed\n");
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().defs()->suiteVec().size() == 1, "Expected 1 suite at the start\n");
+
+   // Check pt, make sure file exist on disk and has a non zero file size\n";
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().checkPtDefs() == 0,"Expected Check-pt to succeed.\n" << TestFixture::client().errorMsg());
+   BOOST_REQUIRE_MESSAGE( fs::exists(check_pt_file_name),CtsApi::checkPtDefs() << " failed file(" << check_pt_file_name << ") not saved");
+   BOOST_REQUIRE_MESSAGE( fs::file_size(check_pt_file_name) !=0,"Expected check point file(" << check_pt_file_name << ") to have file size > 0");
+
+   // Make sure restore from check pt, only works if server is halted and there are no suites\n";
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().restoreDefsFromCheckPt() == 1,"Expected restoreDefsFromCheckPt to *FAIL* since server not halted\n");
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().haltServer() == 0,"Expected halt server to succeed\n" << TestFixture::client().errorMsg());
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().restoreDefsFromCheckPt() == 1,"Expected restoreDefsFromCheckPt to *FAIL* since definition not deleted yet\n");
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().delete_all() == 0,"Expected delete all nodes to succeed\n" << TestFixture::client().errorMsg());
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().getDefs() == 0, "Expected getDefs() to succeed, i.e expected empty defs\n");
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().defs()->suiteVec().empty(), "Expected no suites, after delete_all()\n");
+
+   // make sure check pt file still exists, sanity test\n";
+   BOOST_REQUIRE_MESSAGE( fs::exists(check_pt_file_name),CtsApi::checkPtDefs() << " failed file(" << check_pt_file_name << ") not saved");
+   BOOST_REQUIRE_MESSAGE( fs::file_size(check_pt_file_name) !=0,"Expected check point file(" << check_pt_file_name << ") to have file size > 0");
+
+   // make sure restore actually worked, by retrieving the definition and counting the suites\n";
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().restoreDefsFromCheckPt() == 0,"Expected restoreDefsFromCheckPt to *SUCCEED*, since server halted and defs deleted \n" << TestFixture::client().errorMsg());
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().getDefs() == 0, "Get defs failed should return 0\n" << TestFixture::client().errorMsg());
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().defs()->suiteVec().size() == 1, "Restore from check pt did not work. expected 1 suite but found " << TestFixture::client().defs()->suiteVec().size() );
+
+   // restore default check pointing, for test that follow
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().checkPtDefs(ecf::CheckPt::ON_TIME,120) == 0,CtsApi::checkPtDefs(ecf::CheckPt::ON_TIME) << " failed should return 0\n" << TestFixture::client().errorMsg());
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestSingle.cpp b/ecflow_4_0_7/Test/TestSingle.cpp
new file mode 100644
index 0000000..356caae
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestSingle.cpp
@@ -0,0 +1,182 @@
+#define BOOST_TEST_MODULE TEST_SINGLE
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #80 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This is used to INVOKE a SINGLE test.
+//               Making it easier for Easier for debugging and development
+//============================================================================
+#include <iostream>
+#include <limits> // for std::numeric_limits<int>::max()
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "TestFixture.hpp"
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "DefsStructureParser.hpp"
+#include "AssertTimer.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_GLOBAL_FIXTURE( TestFixture );
+
+BOOST_AUTO_TEST_SUITE( TestSingleSuite  )
+
+
+// DO NOT delete
+// This is used to test large defs. and hence server performance & memory leaks
+// Be sure to comment out defstatus suspended in mega.def
+BOOST_AUTO_TEST_CASE( test_mega_def )
+{
+   DurationTimer timer;
+
+   // location to mega.def and left over log file
+   std::string log_file = File::test_data("AParser/test/data/single_defs/mega.def_log","AParser");
+   std::string path = File::test_data("AParser/test/data/single_defs/mega.def","AParser");
+
+   cout << "Test:: ..." << path << " log file: " << log_file << flush;
+
+   // Remove the log file.
+   boost::filesystem::remove(log_file);
+
+   // parse in file
+   Defs theDefs;
+   DefsStructureParser checkPtParser( &theDefs, path);
+   std::string errorMsg,warningMsg;
+   BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.check_task_duration_less_than_server_poll(false); // Add variable CHECK_TASK_DURATION_LESS_THAN_SERVER_POLL
+   serverTestHarness.run(theDefs,path,std::numeric_limits<int>::max()/*timeout*/  );
+
+   cout << timer.duration() << "\n";
+}
+
+// DO NOT delete
+// This is used to test with thousands of labels
+//BOOST_AUTO_TEST_CASE( test_large_client_labels_calls )
+//{
+//   DurationTimer timer;
+//   cout << "Test:: ...test_large_client_labels_calls "<< flush;
+//   TestClean clean_at_start_and_end;
+//
+//   //# Note: we have to use relative paths, since these tests are relocatable
+//   // suite test_large_client_labels_calls
+//   //   family family
+//   //       task t1
+//   //          label name "value"
+//   //    endfamily
+//   // endsuite
+//   Defs theDefs;
+//   {
+//      suite_ptr suite = theDefs.add_suite("test_large_client_labels_calls");
+//      family_ptr fam = suite->add_family("family");
+//      task_ptr t1 = fam->add_task("t1");
+//      t1->addLabel( Label("name","value"));
+//   }
+//
+//   // Create a custom ecf file for test_large_client_labels_calls/family/t1 to invoke label commands
+//   std::string templateEcfFile;
+//   templateEcfFile += "%include <head.h>\n";
+//   templateEcfFile += "\n";
+//   templateEcfFile += "echo do some work\n";
+//   templateEcfFile += "i=1\n";
+//   templateEcfFile += "while [ \"$i\" -le 10000 ] \n";
+//   templateEcfFile += "do\n";
+//   templateEcfFile += "  %ECF_CLIENT_EXE_PATH% --label=name \"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\"\n";
+//   templateEcfFile += "  i=$((i+1))\n";
+//   templateEcfFile += "done\n";
+//   templateEcfFile += "\n";
+//   templateEcfFile += "%include <tail.h>\n";
+//
+//   // The test harness will create corresponding directory structure
+//   // Override the default ECF file, with our custom ECF_ file
+//   std::map<std::string,std::string> taskEcfFileMap;
+//   taskEcfFileMap.insert(std::make_pair(TestFixture::taskAbsNodePath(theDefs,"t1"),templateEcfFile));
+//
+//    // Avoid standard verification since we expect to abort many times
+//   ServerTestHarness serverTestHarness;
+//   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_large_client_labels_calls.def"), taskEcfFileMap,1000000);
+//
+//   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n" << endl;
+//}
+//
+
+//// DO NOT delete
+/// The following  test verifies that the job generation is largely linear.
+/// Job submission interval was 3 seconds. In release mode.
+///
+/// Test duration is highly dependent on the OS/process handling.
+/// No of tasks     Job generation    Peak request/sec in server
+///   10                  -
+///   100                 -
+///   500                 -                     364
+///   1000               4                      450
+///   1500               6                      550
+///   2000               9                      880
+///   3000               15                     800
+///   4000               24                     923
+///   5000               29                     800
+///   6000               37                     900
+//void time_for_tasks(int tasks) {
+//
+//   std::string test_name = "test_stress_" + boost::lexical_cast<std::string>(tasks);
+//   cout << "Test:: ..." << test_name  << flush;
+//
+//   Defs theDefs;
+//   {
+//      suite_ptr suite = theDefs.add_suite( test_name );
+//      family_ptr fam = suite->add_family("fam" );
+//      for(int i = 0; i < tasks; i++) {
+//         fam->add_task( "t" +   boost::lexical_cast<std::string>(i));
+//      }
+//      //      suite->addRepeat( RepeatDate("YMD",19000101,99991201,1) );
+//   }
+//
+//   ServerTestHarness serverTestHarness;
+//   serverTestHarness.check_task_duration_less_than_server_poll(false); // Add variable CHECK_TASK_DURATION_LESS_THAN_SERVER_POLL
+//   DurationTimer timer;
+//   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation(test_name + ".def"), std::numeric_limits<int>::max()/*timeout*/  );
+//   cout << "  " << timer.duration() << "s\n";
+//}
+//
+//// Use to stress test server. i.e continually fire client requests.
+//BOOST_AUTO_TEST_CASE( test_stress )
+//{
+//   time_for_tasks(10);
+//   time_for_tasks(100);
+//   time_for_tasks(500);
+//   time_for_tasks(1000);
+//   time_for_tasks(1500);
+//   time_for_tasks(2000);
+//   time_for_tasks(3000);
+//   time_for_tasks(4000);
+//   time_for_tasks(5000);
+//}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestSuspend.cpp b/ecflow_4_0_7/Test/TestSuspend.cpp
new file mode 100644
index 0000000..d80b702
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestSuspend.cpp
@@ -0,0 +1,228 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #24 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "AssertTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+#if defined(_AIX)
+static int timeout = 30 ;
+#else
+static int timeout = 20 ;
+#endif
+
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+static void waitForTimeDependenciesToBeFree(int max_time_to_wait)
+{
+   // wait for a period of time, while time dependencies fire.
+   TestFixture::client().set_throw_on_error( false );
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0,"sync_local failed should return 0\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      vector<Task*> tasks; defs->getAllTasks(tasks);
+      size_t taskTimeDepIsFree = 0 ;
+      BOOST_FOREACH(Task* task, tasks) {
+         size_t attSetFree = 0;
+         BOOST_FOREACH( const ecf::TimeAttr& timeAttr, task->timeVec()) {
+            if (timeAttr.isFree(task->suite()->calendar())) attSetFree++;
+         }
+         if ( attSetFree == task->timeVec().size()) taskTimeDepIsFree++;
+      }
+      if ( taskTimeDepIsFree == tasks.size()) break;
+
+      BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+               "waitForTimeDependenciesToBeFree Test wait " << assertTimer.duration() <<
+               " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+               " aborting");
+      sleep(1);
+   }
+}
+
+// test:: suspend/shutdown. During suspend the time dependencies should still
+// be handled. When the server/node is restarted/resumed the task should
+// be submitted straight away.(i.e providing no trigger/complete dependencies)
+BOOST_AUTO_TEST_CASE( test_shutdown )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_shutdown " << flush;
+   TestClean clean_at_start_and_end;
+
+   // Create the defs file corresponding to the text below
+   // ECF_HOME variable is automatically added by the test harness.
+   // ECF_INCLUDE variable is automatically added by the test harness.
+   // SLEEPTIME variable is automatically added by the test harness.
+   // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+   //                     This is substituted in sms includes
+   //                     Allows test to run without requiring installation
+
+   int taskSize = 2; // on linux 1024 tasks take ~4 seconds for job submission
+   Defs theDefs;
+   {
+      // Initialise clock with todays date and time, then create a time attribute
+      // with todays time + minute Avoid adding directly to TimeSlot
+      // i.e if local time is 9:59 and we create a TimeSlot like
+      // 		task->addTime( ecf::TimeAttr( ecf::TimeSlot(theTm.tm_hour,theTm.tm_min+3) )  );
+      // The the minute will be 62, which is illegal and will not parse
+      boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+
+      // For each 2 seconds of poll in the server update calendar by 1 minute
+      // Note: if we use 1 seconds poll to update calendar by 1 minute, then
+      //       we will find that state change happens at job submission interval,
+      //       and hence skews time series.  Which can leave state in a queued state,
+      //       and hence test never completes
+      suite_ptr suite = theDefs.add_suite("test_shutdown");
+      ClockAttr clockAttr(theLocalTime);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      for(int i=0; i < taskSize; i++) {
+         task_ptr task = fam->add_task("t" + boost::lexical_cast<std::string>(i));
+
+         boost::posix_time::ptime   time1 =  theLocalTime +  minutes(1 + i);
+         task->addTime( ecf::TimeAttr( ecf::TimeSlot(time1.time_of_day())  ));
+
+         task->addVerify( VerifyAttr(NState::COMPLETE,1) );      // task should complete 1 times
+      }
+   }
+
+   // The test harness will create corresponding directory structure and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_shutdown.def"),
+                         1,
+                         false/* don't wait for test to finish */);
+
+
+   // Shutdown the server. The time dependencies *should* still be handled
+   // *** If this test fails, in that we fail to restart() server it will mess up
+   // *** any following test.
+   TestFixture::client().set_throw_on_error( false );
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().shutdownServer() == 0,CtsApi::shutdownServer() << " failed should return 0.\n" << TestFixture::client().errorMsg());
+
+   // wait for a period of time, while time dependencies fire.
+   (void)waitForTimeDependenciesToBeFree(timeout );
+
+   // restart server, all jobs should be launched straight away
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().restartServer() == 0,CtsApi::restartServer() << " failed should return 0.\n" << TestFixture::client().errorMsg());
+
+   // Wait for submitted jobs in restart server to complete
+   bool verifyAttrInServer = true;
+   defs_ptr serverDefs = serverTestHarness.testWaiter(theDefs,timeout,verifyAttrInServer);
+   BOOST_REQUIRE_MESSAGE(serverDefs.get()," Failed to return server after restartServer");
+
+   //	cout << "Printing Defs \n";
+   //	std::cout << *serverDefs.get();
+
+   cout << timer.duration() << " update-calendar-count(" << serverDefs->updateCalendarCount() << ")\n";
+}
+
+
+// test:: suspend/shutdown. During suspend the time dependencies should still
+// be handled. When the server/node is restarted/resumed the task should
+// be submitted straight away.(i.e providing no trigger/complete dependencies)
+BOOST_AUTO_TEST_CASE( test_suspend_node )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_suspend_node " << flush;
+   TestClean clean_at_start_and_end;
+
+   // Create the defs file corresponding to the text below
+   // ECF_HOME variable is automatically added by the test harness.
+   // ECF_INCLUDE variable is automatically added by the test harness.
+   // SLEEPTIME variable is automatically added by the test harness.
+   // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+   //                     This is substituted in sms includes
+   //                     Allows test to run without requiring installation
+   Defs theDefs;
+   {
+      // Initialise clock with todays date and time, then create a time attribute
+      // with todays time + minute Avoid adding directly to TimeSlot
+      // i.e if local time is 9:59 and we create a TimeSlot like
+      // 		task->addTime( ecf::TimeAttr( ecf::TimeSlot(theTm.tm_hour,theTm.tm_min+3) )  );
+      // The the minute will be 62, which is illegal and will not parse
+      boost::posix_time::ptime theLocalTime =  Calendar::second_clock_time();
+
+      suite_ptr suite = theDefs.add_suite("test_suspend_node");
+      ClockAttr clockAttr(theLocalTime);
+      suite->addClock( clockAttr );
+
+      task_ptr t1 = suite->add_task( "t1");
+      boost::posix_time::ptime time1 =  theLocalTime +  minutes(1);
+      t1->addTime( ecf::TimeAttr( ecf::TimeSlot(time1.time_of_day())  ));
+
+      task_ptr t2 = suite->add_task( "t2");
+      boost::posix_time::ptime time2 =  theLocalTime +  minutes(2);
+      t2->addTime( ecf::TimeAttr( ecf::TimeSlot(time2.time_of_day())  ));
+
+      family_ptr fam = suite->add_family("family");
+      for(int i=0; i < 2; i++) {
+         task_ptr task = fam->add_task("t" + boost::lexical_cast<std::string>(i));
+         task->addVerify( VerifyAttr(NState::COMPLETE,1) );      // task should complete 1 times
+
+         boost::posix_time::ptime time1 =  theLocalTime +  minutes(1 + i);
+         task->addTime( ecf::TimeAttr( ecf::TimeSlot(time1.time_of_day())  ));
+      }
+   }
+
+   // The test harness will create corresponding directory structure and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_suspend_node.def"),
+                         1,
+                         false/* don't wait for test to finish */);
+
+   // SUSPEND the family. The time dependencies *should* still be handled
+   TestFixture::client().set_throw_on_error( false );
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().suspend("/test_suspend_node/family") == 0,CtsApi::to_string(CtsApi::suspend("/test_suspend_node/family")) << " failed should return 0.\n" << TestFixture::client().errorMsg());
+
+   // wait for a period of time, while time dependencies fire.
+   waitForTimeDependenciesToBeFree(timeout);
+
+   // RESUME the family, all jobs should be launched straight away, since time dependencies should be free
+   BOOST_REQUIRE_MESSAGE( TestFixture::client().resume("/test_suspend_node/family") == 0,CtsApi::to_string(CtsApi::resume("/test_suspend_node/family")) << " failed should return 0.\n" << TestFixture::client().errorMsg());
+
+   // Wait for submitted jobs to complete
+   bool verifyAttrInServer = true;
+   defs_ptr serverDefs = serverTestHarness.testWaiter(theDefs,timeout,verifyAttrInServer);
+   BOOST_REQUIRE_MESSAGE(serverDefs.get()," Failed to return server after restartServer");
+
+   //	cout << "Printing Defs \n";
+   //	std::cout << *serverDefs.get();
+
+   cout << timer.duration() << " update-calendar-count(" << serverDefs->updateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestToday.cpp b/ecflow_4_0_7/Test/TestToday.cpp
new file mode 100644
index 0000000..0729c42
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestToday.cpp
@@ -0,0 +1,201 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #35 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+BOOST_AUTO_TEST_CASE( test_today_single_slot )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_today_single_slot " << flush;
+   TestClean clean_at_start_and_end;
+
+   // **************************************************************************
+   // It does not really make sense to have multiple today attributes
+   // since as soon as one today has expired the task is free to run
+   // suite test_today_mutiple_single_slot
+   //    edit SLEEPTIME 1
+   //    edit ECF_INCLUDE $ECF_HOME/includes
+   //    clock real <todays date>
+   //    family family
+   //       task t1
+   //          today 10.01  // after 10.01, the node is free, for 10.02,10.03
+   //          today 10.04
+   //    endfamily
+   // endsuite
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_today_single_slot
+   //	edit SLEEPTIME 1
+   //	edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <todays date>
+   //	family family
+   //   	task t1
+   //       today 11.12
+   //  	endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with todays date and time, then create a today attribute
+      // one hour past the clock todays time. The node should be free to run.
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(10,0,0));
+      boost::posix_time::ptime time_minus_hour =  theLocalTime -  hours(1);
+
+      suite_ptr suite = theDefs.add_suite( "test_today_single_slot");
+      ClockAttr clockAttr(theLocalTime,false,true/*positive gain*/);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family");
+      task_ptr task = fam->add_task( "t");
+      task->addToday( ecf::TodayAttr(ecf::TimeSlot(time_minus_hour.time_of_day())) );
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_today_single_slot.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_today_relative_time_series )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_today_relative_time_series " << flush;
+   TestClean clean_at_start_and_end;
+
+   // SLOW SYSTEMS
+   // for each time attribute leave GAP of 3 * job submission interval
+   // on slow systems submitted->active->complete > TestFixture::job_submission_interval()
+   // Also the task duration must be greater than job_submission_interval,  otherwise
+   // we will get multiple invocation for the same time step
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_today_relative_time_series
+   //	edit SLEEPTIME 1
+   //	edit ECF_INCLUDE $ECF_HOME/includes
+   // clock real <todays date>
+   //	family family
+   //   	task t1
+   //       today <start> <finish> <incr>
+   //  	endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with todays date and time, then create a today attribute
+      // with a time series, so that task runs 3 times
+      suite_ptr suite = theDefs.add_suite( "test_today_relative_time_series");
+      suite->add_variable("SLEEPTIME",boost::lexical_cast<std::string>(TestFixture::job_submission_interval()-1));
+      ClockAttr clockAttr(Calendar::second_clock_time(),false);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family( "family");
+      task_ptr task = fam->add_task( "t");
+      task->addToday( ecf::TodayAttr(
+               ecf::TimeSlot(0,1),
+               ecf::TimeSlot(0,7),
+               ecf::TimeSlot(0,3),
+               true /*relative to suite start*/
+      )
+      );
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );      // task should complete 3 times
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_today_relative_time_series.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_today_real_time_series )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_today_real_time_series " << flush;
+   TestClean clean_at_start_and_end;
+
+   // SLOW SYSTEMS
+   // for each time attribute leave GAP of 3 * job submission interval
+   // on slow systems submitted->active->complete > TestFixture::job_submission_interval()
+   // Also the task duration must be greater than job_submission_interval,  otherwise
+   // we will get multiple invocation for the same time step
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_today_real_time_series
+   //	edit ECF_INCLUDE $ECF_HOME/includes
+   // clock real <todays date>
+   //	family family
+   //   	task t1
+   //       today 10:01 10:07 00:03
+   //  	endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with a fixed date and time, then create a today attribute
+      // with a time series, so that task runs 3 times
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(10,0,0));
+      boost::posix_time::ptime time1 = theLocalTime + minutes(1);
+      boost::posix_time::ptime time2 = theLocalTime + minutes(7);
+
+      suite_ptr suite = theDefs.add_suite( "test_today_real_time_series");
+      ClockAttr clockAttr(theLocalTime,false);
+      suite->addClock( clockAttr );
+      suite->add_variable("SLEEPTIME",boost::lexical_cast<std::string>(TestFixture::job_submission_interval()-1));
+      suite->addVerify( VerifyAttr(NState::COMPLETE,1) );
+
+      family_ptr fam = suite->add_family( "family");
+      fam->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      task_ptr task = fam->add_task( "t");
+      task->addToday( ecf::TodayAttr(
+               ecf::TimeSlot(time1.time_of_day()),
+               ecf::TimeSlot(time2.time_of_day()),
+               ecf::TimeSlot(0,3)
+      )
+      );
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );      // task should complete 3 times
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_today_real_time_series.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestTrigger.cpp b/ecflow_4_0_7/Test/TestTrigger.cpp
new file mode 100644
index 0000000..1b25827
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestTrigger.cpp
@@ -0,0 +1,92 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #29 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "Str.hpp"
+
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+// In the test case we will dynamically create all the test data.
+// The data is created dynamically so that we can stress test the server
+// This test does not have any time dependencies in the def file.
+BOOST_AUTO_TEST_CASE( test_triggers_and_meters )
+{
+	DurationTimer timer;
+	cout << "Test:: ...test_triggers_and_meters " << flush;
+   TestClean clean_at_start_and_end;
+
+ 	//# Note: we have to use relative paths, since these tests are relocatable
+	//suite test_triggers_and_meters
+	//	edit SLEEPTIME 1
+	//	edit ECF_INCLUDE $ECF_HOME/includes
+	//	family family
+	//   	task model
+	//        	meter file 0 100 100
+	//      task t0
+	//          trigger model:file ge 10
+	//      task t1
+	//          trigger model:file ge 20
+	//      task t2
+	//          trigger model:file ge 30
+	//      ....
+ 	//  	endfamily
+	//endsuite
+	std::string meterName = "file";
+	std::string taskName = "model";
+  	Defs theDefs;
+ 	{
+      suite_ptr suite = theDefs.add_suite( "test_triggers_and_meters");
+		suite->addVerify( VerifyAttr(NState::COMPLETE,1) );
+      family_ptr fam = suite->add_family( "family");
+		fam->addVerify( VerifyAttr(NState::COMPLETE,1) );
+
+      task_ptr taskModel = fam->add_task(taskName);
+		taskModel->addMeter( Meter(meterName,0,100,100) ); // ServerTestHarness will add correct ecf
+
+		int taskSize = 9; // on linux 1024 tasks take ~4 seconds for job submission
+  		for(int i=0; i < taskSize; i++) {
+  			task_ptr task = fam->add_task( "t" + boost::lexical_cast<std::string>(i*10 + 10) );
+  			task->addVerify( VerifyAttr(NState::COMPLETE,1) );
+   		task->add_trigger(  taskName + Str::COLON() + meterName + " ge " + boost::lexical_cast<std::string>(i*10 + 10) );
+ 		}
+ 	}
+
+ 	// The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+	serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation( "test_triggers_and_meters.def"));
+
+	cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/TestWhyCmd.cpp b/ecflow_4_0_7/Test/TestWhyCmd.cpp
new file mode 100644
index 0000000..c4947ea
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestWhyCmd.cpp
@@ -0,0 +1,538 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #27 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include <iostream>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "AssertTimer.hpp"
+#include "WhyCmd.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+static unsigned int waitForWhy(const std::string& path, const std::string& why, int max_time_to_wait)
+{
+   unsigned int updateCalendarCount = 0;
+   TestFixture::client().set_throw_on_error( false );
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+
+      /// Why command relies on the Suite serializing the calendar. If this is changed we need to get the full defs
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "sync_local failed should return 0\n" << TestFixture::client().errorMsg());
+      defs_ptr server_defs = TestFixture::client().defs();
+      updateCalendarCount = server_defs->updateCalendarCount();
+
+      WhyCmd whyCmd( server_defs, path);
+      std::string reason = whyCmd.why();
+      // std::cout << reason;
+
+      if (reason.find(why) != std::string::npos) {
+         // see the reason why job is not running
+         std::cout << reason;
+         break;
+      }
+
+      BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+               "waitForWhy Test wait " << assertTimer.duration() <<
+               " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+               " aborting\n" << *server_defs);
+      sleep(1);
+   }
+   return updateCalendarCount;
+}
+
+BOOST_AUTO_TEST_CASE( test_why_day )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_day "<< flush;
+   TestClean clean_at_start_and_end;
+
+   Defs theDefs;
+   {
+      boost::posix_time::ptime today = Calendar::second_clock_time();
+      suite_ptr suite  = Suite::create("test_why_day" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr task = Task::create(  "t1" );
+
+      // Dont use hybrid for day dependency as that will force node to complete if days is not the same
+      ClockAttr clockAttr(today, false);
+      suite->addClock( clockAttr );
+
+      // ** add tomorrow days so that node stays queued **
+      task->addDay( DayAttr( today.date() +  boost::gregorian::date_duration(1 ) ) );
+
+      fam->addTask( task );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_day.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // The job should not be submitted and should stay queued since the day does not match
+   // running the why command, should report dependency on day
+   unsigned int updateCalendarCount = waitForWhy("/test_why_day/family/t1", "day", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_date )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_date "<< flush;
+
+   Defs theDefs;
+   {
+      suite_ptr suite  = Suite::create("test_why_date" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr task = Task::create(  "t1" );
+
+      // Don't use hybrid for date dependency as that will force node to complete if date is not the same
+      boost::posix_time::ptime today = Calendar::second_clock_time();
+      ClockAttr clockAttr(today, false);
+      suite->addClock( clockAttr );
+
+      // ** add tomorrow date so that node stays queued **
+      task->addDate( DateAttr( today.date() + boost::gregorian::date_duration(1 )) );
+      fam->addTask( task );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_date.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // The job should not be submitted and should stay queued since the day does not match
+   // running the why command, should report dependency on day
+   unsigned int updateCalendarCount = waitForWhy("/test_why_date/family/t1", "date", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_time )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_time "<< flush;
+
+   Defs theDefs;
+   {
+      boost::posix_time::ptime   theLocalTime =  Calendar::second_clock_time();
+      boost::posix_time::ptime   time1 =  theLocalTime -  hours(1);
+
+      suite_ptr suite  = Suite::create("test_why_time" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr task = Task::create(  "t1" );
+
+      ClockAttr clockAttr(theLocalTime);
+      suite->addClock( clockAttr );
+
+      task->addTime( ecf::TimeAttr(  ecf::TimeSlot(time1.time_of_day()) ) );
+      fam->addTask( task );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_time.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // The job should not be submitted and should stay queued since the time does not match
+   // running the why command, should report dependency on time
+   unsigned int updateCalendarCount = waitForWhy("/test_why_time/family/t1", "time", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_today )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_today "<< flush;
+
+   Defs theDefs;
+   {
+      // IMPORTANT: A Node with a today attribute is *free* to run *IF* the suite
+      //            calendar time is greater than the today date.
+      //            Hence if we start this test just before midnight i.e 11.20,
+      //            and add hour , then the today time would be 00:20
+      //            *i.e node is free to run*
+      // This is not what we want for this test. i.e we depend on node being queued
+      // in order to test the why command. Also the following tests, start
+      // by deleting all nodes. This will fail due to active/submitted tasks
+      // Hence can *NOT* use:
+      // boost::posix_time::ptime theLocalTime =  Calendar::second_clock_time();
+      // boost::posix_time::ptime time1 =  theLocalTime + hours(1);
+
+      // Use a hard coded a time, to avoid failure if test is run just before midnight
+      boost::posix_time::ptime theLocalTime(date(2010,2,10), hours(1));
+      boost::posix_time::ptime time1 =  theLocalTime + hours(1);
+
+      suite_ptr suite  = theDefs.add_suite("test_why_today" ) ;
+      ClockAttr clockAttr(theLocalTime);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family(  "family" );
+      task_ptr task = fam->add_task(  "t1" );
+      task->addToday( ecf::TodayAttr(  ecf::TimeSlot(time1.time_of_day()) ) );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_today.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // The job should not be submitted and should stay queued since the time does not match
+   // running the why command, should report dependency on time
+   unsigned int updateCalendarCount = waitForWhy("/test_why_today/family/t1", "today", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_cron )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_cron "<< flush;
+
+   Defs theDefs;
+   {
+      boost::posix_time::ptime   theLocalTime =  boost::posix_time::ptime(date(2010,6,21),time_duration(11,0,0));
+      boost::posix_time::ptime   time1 =  theLocalTime - hours(3);
+      boost::posix_time::ptime   time2 =  theLocalTime -  hours(1);
+      boost::gregorian::date todaysDate = theLocalTime.date();
+
+      suite_ptr suite  = Suite::create("test_why_cron" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr task = Task::create(  "t1" );
+
+      ClockAttr clockAttr(theLocalTime,false/*real*/);
+      suite->addClock( clockAttr );
+
+      // ** IMPORTANT **, for a date in the future we must match day of week,
+      // ***************  day of month, and year, i.e the results are ANDED
+      // ***************  this can lead to unexpected time in the future
+      // ***************  if all 3 dependencies are present, as *below*
+      ecf::CronAttr cronAttr;
+      ecf::TimeSlot start( time1.time_of_day() );  // in the past
+      ecf::TimeSlot finish( time2.time_of_day() ); // in the past
+      ecf::TimeSlot incr( 0, 5 );
+      cronAttr.addTimeSeries(start,finish,incr);
+
+      std::vector<int> weekDays; weekDays.push_back(todaysDate.day_of_week().as_number());
+      std::vector<int> daysOfMonth; daysOfMonth.push_back( todaysDate.day() );
+      std::vector<int> months; months.push_back( todaysDate.month() );
+      cronAttr.addWeekDays(     weekDays  );
+      cronAttr.addDaysOfMonth(  daysOfMonth );
+      cronAttr.addMonths(       months );
+
+      task->addCron(cronAttr);
+
+      fam->addTask( task );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_cron.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // The job should not be submitted and should stay queued we are past the cron time
+   // running the why command, should report dependency on cron
+   unsigned int updateCalendarCount = waitForWhy("/test_why_cron/family/t1", "cron", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_limit )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_limit "<< flush;
+
+   // Testing for limits requires that we have least some jobs are submitted.
+   // we need to kill these jobs, at the end of test.
+
+   //	suite test_why_limit
+   //    limit disk 50
+   //	   family family
+   //          inlimit /suite1:disk 50
+   //	   		task t0
+   //	   		task t1
+   //	   		task t2
+   //	   		task t3
+   //	   		task t4
+   //	   		task t5
+   //	   endfamily
+   //	endsuite
+   int taskSize = 6;
+
+   Defs theDefs;
+   {
+      std::string suiteName = "test_why_limit";
+      std::string pathToLimit = "/" + suiteName;
+      suite_ptr suite = theDefs.add_suite(suiteName );
+      suite->addVariable( Variable("ECF_TRIES","1") );
+      suite->addLimit(Limit("disk",50));
+
+      family_ptr fam = suite->add_family( "family");
+      fam->addInLimit(InLimit("disk",pathToLimit,50));
+      for(int i=0; i < taskSize; i++) {
+         fam->addTask( Task::create("t" + boost::lexical_cast<std::string>(i))  );
+      }
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation( "test_why_limit.def" ),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // Only one job should be submitted, at a time, we will query on task t5, which
+   // should still be queued because the limit is full
+   // running the why command, should report dependency on limit
+   waitForWhy("/test_why_limit/family/t5", "limit", 10);
+
+   // The main check is over. Wait for jobs to complete
+   int updateCalendarCount = 0;
+   TestFixture::client().set_throw_on_error(false) ;
+   {
+      AssertTimer assertTimer(50,false); // Bomb out after n seconds, fall back if test fail
+      while (1) {
+         BOOST_REQUIRE_MESSAGE(TestFixture::client().getDefs() == 0,CtsApi::get() << " failed should return 0\n" << TestFixture::client().errorMsg());
+         defs_ptr defs = TestFixture::client().defs();
+         updateCalendarCount = defs->updateCalendarCount();
+         bool wait = false;
+         vector<Task*> tasks; defs->getAllTasks(tasks);
+         BOOST_FOREACH(Task* task, tasks) {
+            if (task->state() != NState::COMPLETE) wait = true;
+         }
+         if (!wait) break;
+         if ( assertTimer.duration() >=  assertTimer.timeConstraint()) {
+            cout << "waitFor jobs to complete, wait time of " << assertTimer.duration() <<
+                               " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                               " aborting, ......breaking out\n" << *defs << "\n";
+         }
+         sleep(1);
+      }
+   }
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_trigger )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_trigger "<< flush;
+
+   Defs theDefs;
+   {
+      suite_ptr suite  = Suite::create("test_why_trigger" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr task = Task::create(  "t1" );
+      task->add_trigger(  "1 == 0");
+      fam->addTask( task );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_trigger.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // Waiting for a trigger expression which will never evaluate
+   unsigned int updateCalendarCount = waitForWhy("/test_why_trigger/family/t1", "expression", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_meter )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_meter "<< flush;
+
+   Defs theDefs;
+   {
+      suite_ptr suite  = Suite::create("test_why_meter" ) ;
+      family_ptr fam = Family::create(  "family" );
+      fam->addMeter( Meter("meter",0,100,100) );
+      task_ptr task = Task::create(  "t1" );
+      task->add_trigger(  "/test_why_meter/family:meter > 20");
+      fam->addTask( task );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_meter.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // Waiting for a trigger expression which references a meter.
+   unsigned int updateCalendarCount = waitForWhy("/test_why_meter/family/t1", "/test_why_meter/family:meter", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_event )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_event "<< flush;
+
+   Defs theDefs;
+   {
+      suite_ptr suite  = Suite::create("test_why_event" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr t1 = Task::create(  "t1" );
+      task_ptr t2 = Task::create(  "t2" );
+      t2->addEvent( Event(1,"theEvent") );
+      t2->add_trigger(   "1 == 0" ); // make sure task t2 never runs
+      t1->add_trigger(   "/test_why_event/family/t2:theEvent == set" );
+      fam->addTask( t1 );
+      fam->addTask( t2 );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_event.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // Task t1, should stay queued because the event on task t2 is never set.
+   unsigned int updateCalendarCount = waitForWhy("/test_why_event/family/t1", "/test_why_event/family/t2:theEvent", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_user_var )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_user_var "<< flush;
+
+   Defs theDefs;
+   {
+      suite_ptr suite  = Suite::create("test_why_user_var" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr t1 = Task::create(  "t1" );
+      suite->addVariable( Variable("user_var","10") );
+      t1->add_trigger(  "/test_why_user_var:user_var eq 100" );
+      fam->addTask( t1 );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_user_var.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // Task t1, should stay queued because the user variable 'user_var' value  = 10, is not 100
+   unsigned int updateCalendarCount = waitForWhy("/test_why_user_var/family/t1", "/test_why_user_var:user_var", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_gen_var )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_gen_var "<< flush;
+
+   Defs theDefs;
+   {
+      suite_ptr suite  = Suite::create("test_why_gen_var" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr t1 = Task::create(  "t1" );
+      t1->add_trigger( "/test_why_gen_var/family/t1:ECF_TRYNO eq 100" );
+      fam->addTask( t1 );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_gen_var.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // Task t1, should stay queued because the generated variable 'ECF_TRYNO' value  = 0, is not 100
+   unsigned int updateCalendarCount = waitForWhy("/test_why_gen_var/family/t1", "/test_why_gen_var/family/t1:ECF_TRYNO", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_why_repeat )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_why_repeat "<< flush;
+
+   Defs theDefs;
+   {
+      suite_ptr suite  = Suite::create("test_why_repeat" ) ;
+      family_ptr fam = Family::create(  "family" );
+      task_ptr t1 = Task::create(  "t1" );
+      suite->addRepeat( RepeatInteger("suite_repeat_var",0,3,1));
+      fam->addRepeat( RepeatInteger("family_repeat_var",0,3,1));
+      t1->add_trigger( "/test_why_repeat/family:family_repeat_var eq 100  or /test_why_repeat:suite_repeat_var eq 100" );
+      fam->addTask( t1 );
+      suite->addFamily( fam );
+      theDefs.addSuite( suite );
+   }
+
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation("test_why_repeat.def"),
+                         1/*timeout*/,
+                         false /* waitForTestCompletion*/);
+
+   // Task t1, should stay queued because the repeat variable on the suite and family do not match
+   unsigned int updateCalendarCount = waitForWhy("/test_why_repeat/family/t1", "/test_why_repeat/family:family_repeat_var", 10);
+
+   cout << " " << timer.duration() << " update-calendar-count(" << updateCalendarCount << ")\n";
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff --git a/ecflow_4_0_7/Test/TestZombies.cpp b/ecflow_4_0_7/Test/TestZombies.cpp
new file mode 100644
index 0000000..eef145d
--- /dev/null
+++ b/ecflow_4_0_7/Test/TestZombies.cpp
@@ -0,0 +1,948 @@
+#define BOOST_TEST_MODULE TEST_ZOMBIES
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #58 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This is used to INVOKE a SINGLE test.
+//               Making it easier for Easier for debugging and development
+//============================================================================
+#include <iostream>
+#include <limits> // for std::numeric_limits<int>::max()
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "TestFixture.hpp"
+#include "ServerTestHarness.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+#include "AssertTimer.hpp"
+#include "Child.hpp"
+#include "ZombieUtil.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+namespace fs = boost::filesystem;
+
+// ****************************************************************
+// In the test below we create two sets of process. One of these
+// being a zombie. The test below create a list of user Zombies.
+//   In the cases where these test fail
+//   The dump of zombies shows that only One call was made.(i.e the initial creation of the Zombie)
+//   and that the proces-id is not defined.
+//   This implies that at test start, that not all process were started.
+//   ??Note sure why?? This can be seen by enabling debug in TaskCmds which
+//   shows that the Task INIT command was never received ???
+// Updated these test to detect STALE *user* zombies & remove them
+// i.e. where we have created a user Zombie but there is associated process ??
+// *******************************************************************
+
+//#define DEBUG_ZOMBIE 1
+#define DO_TEST1 1
+#define DO_TEST2 1
+#define DO_TEST3 1
+#define DO_TEST4 1
+#define DO_TEST5 1
+#define DO_TEST6 1
+#define DO_TEST7 1
+#define DO_TEST8 1
+#define DO_TEST9 1
+//#define DO_TEST10 1 Need to make reliable
+#define DO_TEST11 1
+
+static bool ecf_debug_enabled = false; // allow environment to enable debug
+
+
+BOOST_GLOBAL_FIXTURE( TestFixture );
+
+BOOST_AUTO_TEST_SUITE( TestSuite  )
+
+enum WaitType { SINGLE, ALL };
+static int timeout = 30;
+static int NUM_OF_TASKS = 5;
+
+static void dump_zombies()
+{
+   TestFixture::client().zombieGet();
+   std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+   std::cout <<  Zombie::pretty_print( zombies , 3);
+}
+
+static void dump_tasks(const vector<Task*>& tasks) {
+   BOOST_FOREACH(const Task* task, tasks) {
+      std::cout << "    " << task->absNodePath() << " " << NState::toString(task->state()) << " " << task->jobsPassword() << " " << task->process_or_remote_id() << "\n";
+   }
+   std::cout << "\n";
+}
+
+static bool waitForTaskStates(WaitType num_of_tasks,NState::State state1,NState::State state2, int max_time_to_wait)
+{
+   std::string wait_type_str = (num_of_tasks == SINGLE ) ? "SINGLE" : "ALL";
+   if (ecf_debug_enabled) {
+      if ( num_of_tasks == SINGLE) {
+         if (state1 == state2) std::cout << "\n   Waiting for SINGLE task to reach state " << NState::toString(state1) << "\n";
+         else                  std::cout << "\n   Waiting for SINGLE task to reach state " << NState::toString(state1) << " || " << NState::toString(state2)  << "\n";
+      }
+      else {
+         if (state1 == state2)  std::cout << "\n   Waiting for ALL tasks to reach state " << NState::toString(state1) << "\n";
+         else                   std::cout << "\n   Waiting for ALL tasks to reach state " << NState::toString(state1) << " || " << NState::toString(state2)  << "\n";
+      }
+   }
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "waitForTaskStates: sync_local failed should return 0\n" << TestFixture::client().errorMsg());
+      defs_ptr defs = TestFixture::client().defs();
+      vector<Task*> tasks; defs->getAllTasks(tasks);
+      if (num_of_tasks == SINGLE) {
+         BOOST_FOREACH(Task* task, tasks) {
+            if (task->state() == state1 || task->state() == state2 ) {
+               if (ecf_debug_enabled) {
+                  if (task->state() == state1) std::cout << "    Found at least one Task with state " << NState::toString(state1) << " returning\n";
+                  if (state1 != state2 && task->state() == state2) std::cout << "    Found at least one Task with state " << NState::toString(state2) << " returning\n";
+                  dump_zombies();
+               }
+               return true;
+            }
+         }
+      }
+      else {
+         size_t count = 0;
+         BOOST_FOREACH(Task* task, tasks) { if (task->state() == state1 || task->state() == state2)  count++; }
+         if (count == tasks.size()) {
+            if (ecf_debug_enabled) {
+               if (state2 == state1) std::cout << "    All tasks(" << tasks.size() << ") have reached state " << NState::toString(state1) << " returning\n";
+               else                  std::cout << "    All tasks(" << tasks.size() << ") have reached state " << NState::toString(state1) << " || " <<  NState::toString(state2) <<  " returning\n";
+               dump_tasks(tasks);
+            }
+            return true;
+         }
+      }
+
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         if (ecf_debug_enabled) {
+            dump_zombies();
+            dump_tasks(tasks);
+            std::cout << "waitForTaskState " << wait_type_str << " reach state " << NState::toString(state1) << " || " << NState::toString(state2)
+                  << " Test taking longer than time constraint of " << assertTimer.timeConstraint() <<  " returning false\n";
+         }
+         break;
+      }
+      sleep(1);
+   }
+   return false;
+}
+
+static bool waitForTaskState(WaitType wait_type,NState::State state1, int max_time_to_wait)
+{
+   return waitForTaskStates(wait_type, state1, state1, max_time_to_wait);
+}
+
+static bool waitForZombieCreation(size_t no_of_zombies, int max_time_to_wait)
+{
+   if (ecf_debug_enabled) std::cout << "\n   Waiting for " << no_of_zombies << " zombies to be created\n";
+
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().zombieGet() == 0, "zombieGet failed should return 0\n" << TestFixture::client().errorMsg());
+      std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+      if (zombies.size() == no_of_zombies) {
+         if (ecf_debug_enabled) {
+            std::cout <<  Zombie::pretty_print( zombies , 3);
+            std::cout << "    Found " << no_of_zombies << " zombies. returning.\n";
+         }
+         return true;
+      }
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+
+         if (zombies.size() > 0) {
+            if (ecf_debug_enabled) {
+               std::cout << "   Timeout out found only " << zombies.size()  << " zombies." << "\n";
+               std::cout <<  Zombie::pretty_print( zombies , 3);
+               std::cout << "    Found " << no_of_zombies << " zombies. returning.\n";
+            }
+            return true;
+         }
+
+         BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+                  "waitForZombieCreation expected " << no_of_zombies
+                  << " zombies but found " << TestFixture::client().server_reply().zombies().size()
+                  << " : Test taking longer than time constraint of "
+                  << assertTimer.timeConstraint() << " aborting\n"
+                  << Zombie::pretty_print( zombies , 3));
+         break;
+      }
+      sleep(1);
+   }
+   return false;
+}
+
+static void remove_stale_zombies()
+{
+   // Remove those zombies that have only *ONE* call
+   // There is no associated process/child command that has updated the zombie
+   if (ecf_debug_enabled) cout << "\n   remove_stale_zombies \n";
+
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().zombieGet() == 0, "zombieGet failed should return 0\n" << TestFixture::client().errorMsg());
+   std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+   BOOST_FOREACH(const Zombie& z, zombies) {
+      if (z.calls() == 1) {
+         cout << "\n      **** removing_stale_zombies ***** " << z << "\n";
+         cout << "        Typically happens when a submitted job, never creates a process ?\n";
+         cout << "        Since the process never communicated back, the pid is empty.\n";
+         TestFixture::client().zombieRemove(z);
+      }
+   }
+}
+
+static void wait_for_path_zombies(int no_of_tasks, int max_time_to_wait)
+{
+   if (ecf_debug_enabled) cout << "\n   wait_for_path_zombies\n";
+
+   int no_of_path_zombies = 0;
+   std::vector<Zombie> zombies;
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().zombieGet() == 0, "zombieGet failed should return 0\n" << TestFixture::client().errorMsg());
+      zombies = TestFixture::client().server_reply().zombies();
+      BOOST_FOREACH(const Zombie& z, zombies) {
+         if (z.type() == Child::PATH ) {
+            no_of_path_zombies++;
+         }
+      }
+      if (no_of_path_zombies >= no_of_tasks) break;
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         // BOOST_WARN_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+         std::cout << "remove_user_zombies_and_wait_for_path_zombies. Expected "
+                            << no_of_tasks << " PATH zombies, but found " << no_of_path_zombies
+                            << "\nTest taking longer than time constraint of " << assertTimer.timeConstraint()
+                            << "\n"
+                            << Zombie::pretty_print( zombies , 6) << "\n... breaking out\n";
+         break;
+      }
+      sleep(1);
+   }
+
+   if (ecf_debug_enabled) cout << Zombie::pretty_print( zombies , 6) << "\n";
+}
+
+
+static void check_expected_no_of_zombies(size_t expected)
+{
+   TestFixture::client().zombieGet();
+   std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+
+   BOOST_CHECK_MESSAGE(zombies.size() == expected ,"Expected " << expected << " zombies but got " << zombies.size());
+   if ( zombies.size() != expected) {
+      std::cout <<  Zombie::pretty_print( zombies , 3);
+      return;
+   }
+}
+
+static void check_at_least_one_zombie()
+{
+   TestFixture::client().zombieGet();
+   std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+   BOOST_CHECK_MESSAGE(zombies.size() >= 1 ,"Expected at least one zombies but got nothing\n");
+}
+
+static bool wait_for_zombie_termination(int max_time_to_wait)
+{
+   if (ecf_debug_enabled) std::cout << "\n   wait_for_zombie_termination\n";
+
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      TestFixture::client().zombieGet();
+      std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+      if (zombies.empty() ) break;
+
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         if (ecf_debug_enabled)  {
+            std::cout << "wait_for_zombie_termination: taking longer than time constraint of " << assertTimer.timeConstraint() << " returning\n";
+            std::cout <<  Zombie::pretty_print( zombies , 3);
+         }
+         return false;
+      }
+      sleep(1);
+   }
+   return true;
+}
+
+static void wait_for_zombies_child_cmd(WaitType wait_type,ecf::Child::CmdType child_cmd,int max_time_to_wait, bool do_delete = false)
+{
+   if (ecf_debug_enabled) {
+      std::cout << "\n   Waiting for ";
+      if (wait_type == SINGLE) std::cout << "SINGLE";
+      else                     std::cout << "ALL";
+      std::cout << "  child (" << Child::to_string(child_cmd) << ") cmd; ";
+      if (do_delete) std::cout << " then DELETE zombies ";
+      std::cout << "=============================================================================================\n";
+   }
+
+   bool child_type_found = false;
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      TestFixture::client().zombieGet();
+      std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+      if (ecf_debug_enabled) std::cout << "    Get zombies returned " << zombies.size() << "\n";
+
+      if (zombies.empty() && child_type_found && do_delete) {
+         if (ecf_debug_enabled) std::cout << "   No zombies. (do_delete) was set returning\n";
+         return;
+      }
+
+      size_t completed_zombies = 0;
+      BOOST_FOREACH(const Zombie& z, zombies) {
+         if (ecf_debug_enabled) std::cout << "   " << z << "\n";
+         if (z.last_child_cmd() == child_cmd) {
+            child_type_found = true;
+            completed_zombies++;
+            if (wait_type == SINGLE) {
+               if (ecf_debug_enabled) {
+                  std::cout << "   " << z << "\n";
+                  std::cout << "   Found SINGLE zombie of correct child type returning\n";
+               }
+               return;
+            }
+         }
+      }
+
+      if ( completed_zombies == zombies.size() && child_type_found) {
+         if (ecf_debug_enabled) {
+            std::cout << "   Found ALL(" << completed_zombies << ") zombies of child type " << Child::to_string(child_cmd) << "\n";
+            std::cout << Zombie::pretty_print( zombies , 3);
+         }
+         if (do_delete) {
+            BOOST_FOREACH(const Zombie& z, zombies) {
+               if (ecf_debug_enabled) std::cout << "   deleteing " << z << "\n";
+               TestFixture::client().zombieRemove(z);
+            }
+         }
+         return;
+      }
+
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         std::cout << Zombie::pretty_print( zombies , 3);
+         BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+                  "wait_for_zombies_child_cmd Test wait " << assertTimer.duration() <<
+                  " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                  " aborting\n");
+      }
+      sleep(1);
+   }
+}
+
+static void wait_for_no_zombies(int max_time_to_wait)
+{
+   if (ecf_debug_enabled) std::cout << "\n   wait_for_no_zombies\n";
+
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      TestFixture::client().zombieGet();
+      std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+      if (ecf_debug_enabled) {
+         std::cout << "      Get zombies returned " << zombies.size() << "\n";
+         std::cout << Zombie::pretty_print( zombies , 6) << "\n";
+      }
+      if (zombies.empty()) return;
+
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         std::cout << "\n" << Zombie::pretty_print( zombies , 3);
+         BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),
+                  "wait_for_no_zombies Test wait " << assertTimer.duration() <<
+                  " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                  " aborting\n");
+      }
+      sleep(2);
+   }
+}
+
+static void populate_defs(Defs& theDefs,const std::string& suite_name) {
+   suite_ptr suite =  theDefs.add_suite(suite_name);
+   suite->addVariable(Variable("SLEEPTIME","5")); // sleep for longer than normal to allow for creation of zombies
+   family_ptr family = suite->add_family("f");
+   for (int i = 0; i < NUM_OF_TASKS; i++) {
+      family->add_task( "t" + boost::lexical_cast<std::string>(i) );
+   }
+   suite->add_variable("CHECK_TASK_DURATION_LESS_THAN_SERVER_POLL","_any_");
+}
+
+
+static void create_and_start_test(Defs& theDefs, const std::string& suite_name, const std::string& create_zombies_with) {
+   if (ecf_debug_enabled) {
+      std::cout << "\n\n=============================================================================\n";
+      std::cout << "create_and_start_test  " << suite_name << "  using  " << create_zombies_with << "\n";
+   }
+
+   /// Avoid side effects from previous test, by removing all zombies
+   TestFixture::client().zombieGet();
+   if (!TestFixture::client().server_reply().zombies().empty()) {
+      (void)ZombieUtil::do_zombie_user_action(User::REMOVE,TestFixture::client().server_reply().zombies().size(), timeout);
+   }
+
+   if (ecf_debug_enabled) std::cout << "   creating server test harness\n";
+
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+                         ServerTestHarness::testDataDefsLocation(suite_name + ".def"),
+                         1 /*timeout*/,
+                         false/* don't wait for test to finish */);
+
+   // Wait for a single task to reach state submitted or active, before creating zombies
+   waitForTaskStates(SINGLE,NState::SUBMITTED,NState::ACTIVE, timeout);
+
+   // ******************************************************************************
+   // IMPORTANT: Since 4.0.5, if Job generation takes to long i.e >= next poll
+   //            then it will TIMEOUT. Hence we may no get the number of zombies
+   //            that we expected
+   // *******************************************************************************
+
+   if (create_zombies_with == "delete") {
+      if (ecf_debug_enabled) std::cout << "   create USER zombies by deleting all the nodes in the server\n";
+      TestFixture::client().delete_all( true /* force */);
+   }
+   else if (create_zombies_with == "begin") {
+      /// Begin with force, Should create user zombies. WILL only catch those task that are submitted
+      /// It may well be that job submission, may only get a subset, others, which come for submission *later*
+      /// on will be ECF zombies.
+      /// Note: If we wait for SUMBITTED, then we get the case, where we have two task jobs
+      ///       with same password, BUT different process id ??????
+      ///       i.e The begin has regenerate the job file, so we get job started twice.
+      ///       This should be trapped by the server, as Task should be active
+      if (ecf_debug_enabled) std::cout << "   Calling begin_all_suites, now have 2 sets of jobs, The first/original set are now zombies\n";
+      TestFixture::client().set_throw_on_error(false);
+      if (TestFixture::client().begin_all_suites( true /* force */) == 1) {
+         std::cout << "   Begin raised exception: because " << TestFixture::client().errorMsg() << " ***\n";
+      }
+      TestFixture::client().set_throw_on_error(true);
+   }
+   else if (create_zombies_with == "complete") {
+
+      if (ecf_debug_enabled) std::cout << "   create USER zombies by calling complete\n";
+      std::string path = "/" + suite_name;
+      TestFixture::client().force(path,"complete",true/*recursive*/);
+   }
+   else if (create_zombies_with == "aborted") {
+
+      if (ecf_debug_enabled) std::cout << "   create USER zombies by calling abort\n";
+      std::string path = "/" + suite_name;
+      TestFixture::client().force(path,"aborted",true/*recursive*/);
+   }
+   else {
+      BOOST_REQUIRE_MESSAGE(false,"Create zombies via " << create_zombies_with << " unrecognised");
+   }
+
+   /// Wait for all task zombies
+   vector<Task*> tasks;
+   theDefs.getAllTasks(tasks);
+
+   /// When jobs try to communicate with server via child commands they will block the Child commands
+   if (waitForZombieCreation(tasks.size(),timeout)) {
+
+      /// Check we have zombies and they are of type USER
+      std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+      BOOST_CHECK_MESSAGE(zombies.size() > 0," NO zombies created");
+      BOOST_FOREACH(const Zombie& z, zombies) {
+         if (create_zombies_with == "begin") {
+            BOOST_CHECK_MESSAGE(z.type() == Child::USER,"Creating zombies via begin, Expected 'user' zombie type but got: " << z);
+         }
+         else if (create_zombies_with == "delete") {
+            BOOST_CHECK_MESSAGE(z.type() == Child::USER || z.type() == Child::PATH,"Creating zombies via delete, Expected 'user | path' zombie type but got: " << z);
+         }
+         else {
+            BOOST_CHECK_MESSAGE(z.type() == Child::ECF,"Expected 'ecf' zombie type but got: " << z);
+         }
+      }
+   }
+}
+
+static void create_and_start_test(const std::string& suite_name, const std::string& create_zombies_with) {
+
+   if (ecf_debug_enabled) std::cout << "   Creating defs\n";
+   Defs theDefs;
+   populate_defs(theDefs,suite_name);
+   create_and_start_test(theDefs,suite_name,create_zombies_with );
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+BOOST_AUTO_TEST_CASE( enable_debug_for_ECF_TRY_NO_Greater_than_one)
+{
+   BOOST_CHECK_MESSAGE(!ecf_debug_enabled ,"dummy test");
+
+   if (getenv("ECF_DEBUG_ZOMBIES")) {
+      ecf_debug_enabled = true;
+      cout << "Test:: ... debug_enabled" << endl;
+   }
+}
+
+#ifdef DO_TEST1
+BOOST_AUTO_TEST_CASE(test_path_zombie_creation)
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_path_zombie_creation " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   // User zombies will be converted to path zombies by the server
+   create_and_start_test("test_path_zombie_creation","delete"); // create zombie via delete
+
+   // expect NUM_OF_TASKS zombies, ie because we have NUM_OF_TASKS tasks
+   check_expected_no_of_zombies(NUM_OF_TASKS);
+
+   // The server will automatically change existing zombie to be of type PATH
+   // when no task nodes exists
+   // *Note* in test environment the client invoker will try connecting to the server
+   // ****** for 5 seconds, after that an error is returned. This will cause the
+   // ****** job to abort.
+   wait_for_path_zombies(NUM_OF_TASKS,timeout);
+
+   // Fob all the zombies. This will UNBLOCK the child commands allowing them to complete
+   // Fobing does *NOT* alter node tree state, however COMPLETE should auto delete the zombie
+   // Hence after this command, the number of fobed zombies may *NOT* be the same
+   // as the number of tasks. Since the fobed zombies are auto deleted when a complete
+   // child command is recieved.
+   int no_of_fobed_zombies = ZombieUtil::do_zombie_user_action(User::FOB, NUM_OF_TASKS, timeout);
+   BOOST_CHECK_MESSAGE(no_of_fobed_zombies > 0,"Expected some fobed zombies but found none ?");
+
+   // Wait for zombies to be deleted in the server
+   if (!wait_for_zombie_termination(timeout)) {
+      remove_stale_zombies();
+   }
+
+   // The fob should have forced removal of zombies, in the server. when the COMPLETE child command was recieved
+   check_expected_no_of_zombies(0);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+#ifdef DO_TEST2
+BOOST_AUTO_TEST_CASE( test_user_zombies_for_delete_fob )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_user_zombies_for_delete_fob " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   // User zombies will be converted to path zombies by the server
+   create_and_start_test("test_user_zombies_for_delete_fob","delete"); // create zombie via delete
+
+   // expect 5 zombies, ie because we have NUM_OF_TASKS tasks
+   check_expected_no_of_zombies(NUM_OF_TASKS);
+
+   // Fob all the zombies. This will UNBLOCK the child commands allowing them to finish
+   // Fobing does *NOT* alter node tree state, however COMPLETE should auto delete the zombie
+   // Hence after this command, the number of fobed zombies may *NOT* be the same
+   // as the number of tasks. Since the fobed zombies are auto deleted when a complete
+   // child command is recieved.
+   int no_of_fobed_zombies = ZombieUtil::do_zombie_user_action(User::FOB, NUM_OF_TASKS, timeout);
+   BOOST_CHECK_MESSAGE(no_of_fobed_zombies > 0,"Expected some fobed zombies but found none ?");
+
+   // Wait for zombies to be deleted in the server
+   if (!wait_for_zombie_termination(timeout)) {
+      remove_stale_zombies();  // see notes above
+   }
+
+   // The fob should have forced removal of zombies, in the server. when the COMPLETE child command was recieved
+   check_expected_no_of_zombies(0);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+
+#ifdef DO_TEST3
+BOOST_AUTO_TEST_CASE( test_user_zombies_for_delete_fail )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_user_zombies_for_delete_fail " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   // User zombies will be converted to path zombies by the server
+   create_and_start_test("test_user_zombies_for_delete_fail","delete");
+
+   check_at_least_one_zombie();
+
+   // Fail all the zombies. This will UNBLOCK and terminate the child commands allowing them to finish
+   int no_of_failed_zombies = ZombieUtil::do_zombie_user_action(User::FAIL, NUM_OF_TASKS, timeout);
+   BOOST_CHECK_MESSAGE(no_of_failed_zombies >0,"Expected > 0 Failed zombies but found none");
+
+   check_at_least_one_zombie();
+
+   // Wait for zombies to abort, then remove all the zombies
+   wait_for_zombies_child_cmd(ALL,ecf::Child::ABORT,timeout, true /* delete */);
+
+   check_expected_no_of_zombies(0);
+   cout << timer.duration() << "\n";
+}
+#endif
+
+//test_zombies_attr_for_begin/f/t1 user 26 ZzD/ycIW <pid> 1 calls(1) BLOCK INIT
+
+#ifdef DO_TEST4
+BOOST_AUTO_TEST_CASE( test_user_zombies_for_begin )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_user_zombies_for_begin " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   create_and_start_test("test_user_zombies_for_begin","begin");
+
+   /// We have two *sets* of jobs, Wait for ALL the tasks(non zombies) to complete
+   BOOST_REQUIRE_MESSAGE(waitForTaskState(ALL,NState::COMPLETE,timeout),"Expected non-zombie tasks to complete");
+
+   check_at_least_one_zombie();
+
+   // Fob all the zombies. This will UNBLOCK the child commands allowing them to finish
+   // Hence after this command, the number of fobed zombies may *NOT* be the same
+   // as the number of tasks. Since the fobed zombies are auto deleted when a complete
+   // child command is received. 
+   int no_of_fobed_zombies = ZombieUtil::do_zombie_user_action(User::FOB, NUM_OF_TASKS, timeout);
+   BOOST_CHECK_MESSAGE(no_of_fobed_zombies > 0,"Expected  some fobed zombies but found none ?");
+
+   // Fobing does *NOT* alter node tree state, however child COMPLETE should auto delete the zombie
+   if (!wait_for_zombie_termination(timeout)) {
+      remove_stale_zombies();  // see notes above
+   }
+
+   // The fob should have forced removal of zombies, in the server. when the COMPLETE child command was recieved
+   check_expected_no_of_zombies(0);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+
+#ifdef DO_TEST5
+BOOST_AUTO_TEST_CASE( test_zombies_attr_for_begin )
+{
+   DurationTimer timer;
+   std::string suite_name  = "test_zombies_attr_for_begin";
+   cout << "Test:: ..." << suite_name << " " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   create_and_start_test(suite_name,"begin"); // create zombies via begin force
+
+   /// We have two *sets* of jobs, Wait for ALL the tasks(non zombies) to complete
+   BOOST_REQUIRE_MESSAGE(waitForTaskState(ALL,NState::COMPLETE,timeout),"Expected non-zombie tasks to complete");
+
+   check_at_least_one_zombie();
+
+   /// *** Fobbing will not change state of the node tree ****
+   if (ecf_debug_enabled) std::cout << "   Add a zombie attribute 'user:fob::' to the suite, which fobs all child commands\n";
+   TestFixture::client().alter("/" + suite_name,"add","zombie","user:fob::");
+
+   // Fobbing causes auto deletion of zombies, when the Child complete is reached
+   if (!wait_for_zombie_termination(timeout)) {
+      remove_stale_zombies();  // see notes above
+   }
+
+   // The fob should have forced removal of zombies, in the server. when the COMPLETE child command was recieved
+   check_expected_no_of_zombies(0);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+
+
+#ifdef DO_TEST6
+BOOST_AUTO_TEST_CASE( test_user_zombies_for_adopt )
+{
+   DurationTimer timer;
+   std::string suite_name  = "test_user_zombies_for_adopt";
+   cout << "Test:: ..." << suite_name << " " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   create_and_start_test(suite_name,"begin");
+
+   /// We have two *sets* of jobs, Wait for ALL the tasks(non zombies) to complete
+   BOOST_REQUIRE_MESSAGE(waitForTaskState(ALL,NState::COMPLETE,timeout),"Expected non-zombie tasks to complete");
+
+   check_at_least_one_zombie();
+
+   /// Adopt all the zombies. This will UNBLOCK the child commands allowing them to finish
+   /// This test below fail on AIX, its too fast , task's may already be adopted and hence don't fail
+   int no_of_adopted_zombied = ZombieUtil::do_zombie_user_action(User::ADOPT,  NUM_OF_TASKS, timeout);
+   if (ecf_debug_enabled) cout << "   found " << no_of_adopted_zombied << " zombies for adoption\n";
+
+   /// The blocked zombies are free, start with blocked init command
+   /// This may fail on AIX, its too fast , task's may already be complete, hence don't fail
+   (void)waitForTaskState(SINGLE,NState::ACTIVE,timeout);
+
+   /// Now wait for all tasks to complete
+   BOOST_REQUIRE_MESSAGE(waitForTaskState(ALL,NState::COMPLETE,timeout),"Expected zombie tasks to complete");
+
+
+   remove_stale_zombies();  // see notes above
+
+   // After adoption the zombies should be removed
+   check_expected_no_of_zombies(0);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+
+#ifdef DO_TEST7
+BOOST_AUTO_TEST_CASE( test_zombies_attr_for_adopt )
+{
+   DurationTimer timer;
+   std::string suite_name  = "test_zombies_attr_for_adopt";
+   cout << "Test:: ..." << suite_name << " " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   create_and_start_test(suite_name,"begin");
+
+   /// We have two *sets* of jobs, Wait for ALL the tasks(non zombies) to complete
+   BOOST_REQUIRE_MESSAGE(waitForTaskState(ALL,NState::COMPLETE,timeout),"Wait for all non-zombie tasks to complete failed");
+
+   // expected 5 zombies, ie because we have NUM_OF_TASKS tasks. These should all be blocking
+   check_at_least_one_zombie();
+
+   if (ecf_debug_enabled) std::cout << "   Add a zombie attribute 'user:adopt::' to the suite, which *ADOPTS* all zombies allowing them to complete\n";
+   TestFixture::client().alter("/" + suite_name,"add","zombie","user:adopt::");
+
+   if (ecf_debug_enabled) dump_zombies();
+
+   /// The blocked zombies are free, start with blocked init command
+   /// This may fail on AIX, its too fast , task's may already be complete, dont fail
+   (void)waitForTaskState(SINGLE,NState::ACTIVE,timeout);
+
+   /// Now wait for all tasks to complete. ** They may be complete from last process set **
+   BOOST_REQUIRE_MESSAGE(waitForTaskState(ALL,NState::COMPLETE,timeout),"Expected all zombie task to complete after adopt");
+
+   remove_stale_zombies();  // see notes above
+
+   // After adoption the zombies should be removed
+   check_expected_no_of_zombies(0);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+
+#ifdef DO_TEST8
+BOOST_AUTO_TEST_CASE( test_ecf_zombie_creation_via_complete )
+{
+   DurationTimer timer;
+   std::string suite_name  = "test_ecf_zombie_creation_via_complete";
+   cout << "Test:: ..." << suite_name << " " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   create_and_start_test(suite_name,"complete");
+
+   /// Since we have set tasks to complete, we should only have *ONE* set of zombies
+   check_at_least_one_zombie();
+
+   // Fob all the zombies child commands allowing them to finish
+   (void) ZombieUtil::do_zombie_user_action(User::FOB, NUM_OF_TASKS, timeout);
+   // int no_of_fobed_zombies = ZombieUtil::do_zombie_user_action(User::FOB, NUM_OF_TASKS, timeout);
+   // BOOST_CHECK_MESSAGE(no_of_fobed_zombies == NUM_OF_TASKS,"Expected " << NUM_OF_TASKS << " Fobed zombies but found " << no_of_fobed_zombies);
+
+   // Wait for zombies to complete, they should get removed automatically
+   wait_for_no_zombies( timeout);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+#ifdef DO_TEST9
+BOOST_AUTO_TEST_CASE( test_ecf_zombie_creation_via_abort )
+{
+   DurationTimer timer;
+   std::string suite_name  = "test_ecf_zombie_creation_via_abort";
+   cout << "Test:: ..." << suite_name << " " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   create_and_start_test(suite_name,"aborted");
+
+   /// Since we have set tasks to complete, we should only have *ONE* set of zombies
+   check_at_least_one_zombie();
+
+   // Fob all the zombies child commands allowing them to finish
+   (void) ZombieUtil::do_zombie_user_action(User::FOB, NUM_OF_TASKS, timeout);
+   // int no_of_fobed_zombies = ZombieUtil::do_zombie_user_action(User::FOB, NUM_OF_TASKS, timeout);
+   // BOOST_CHECK_MESSAGE(no_of_fobed_zombies == NUM_OF_TASKS,"Expected " << NUM_OF_TASKS << " Fobed zombies but found " << no_of_fobed_zombies);
+
+   // Wait for zombies to complete, they should get removed automatically
+   wait_for_no_zombies(timeout);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+
+#ifdef DO_TEST10
+BOOST_AUTO_TEST_CASE( test_zombie_inheritance )
+{
+   DurationTimer timer;
+   std::string suite_name  = "test_zombie_inheritance";
+   cout << "Test:: ..." << suite_name << " " << flush;
+   TestClean clean_at_start_and_end;
+
+   // Add zombie attribute, make sure it inherited
+   Defs theDefs;
+   populate_defs(theDefs,suite_name);
+   suite_ptr suite = theDefs.findSuite(suite_name);
+   suite->addZombie( ZombieAttr(ecf::Child::USER, std::vector<ecf::Child::CmdType>(), ecf::User::FOB,-1) );
+   suite->addZombie( ZombieAttr(ecf::Child::ECF, std::vector<ecf::Child::CmdType>(), ecf::User::FOB,-1) );
+   suite->addZombie( ZombieAttr(ecf::Child::PATH, std::vector<ecf::Child::CmdType>(), ecf::User::FOB,-1) );
+
+   create_and_start_test(theDefs,suite_name,"complete" );
+
+   /// Since we have set tasks to complete, we should only have *ONE* set of zombies
+   // expect NUM_OF_TASKS zombies, ie because we have NUM_OF_TASKS tasks
+   TestFixture::client().set_throw_on_error(true);
+   TestFixture::client().zombieGet();
+   std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+   BOOST_CHECK_MESSAGE(!zombies.empty(),"No zombies found");
+   BOOST_FOREACH(const Zombie& z, zombies) {
+      BOOST_CHECK_MESSAGE(z.user_action() == ecf::User::FOB, "Expected zombies with user action of type FOB but found " << User::to_string(z.user_action()));
+      break;
+   }
+
+   // Wait for zombies to complete, they should get removed automatically
+   wait_for_no_zombies(timeout);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+
+#ifdef DO_TEST11
+static int wait_for_killed_zombies(int no_of_tasks, int max_time_to_wait)
+{
+   if (ecf_debug_enabled) std::cout << "\n   wait_for_killed_zombies\n";
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      int killed = 0;
+      TestFixture::client().zombieGet();
+      std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+      BOOST_FOREACH(const Zombie& z, zombies) {
+         if (z.kill()) killed++;
+      }
+      if (ecf_debug_enabled) std::cout << "   found " << killed << " killed zombies\n";
+
+      if (killed == no_of_tasks)  return killed;
+
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         cout <<  "wait_for_killed_zombies Test wait " << assertTimer.duration() <<
+                  " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                  " breaking out\n" << Zombie::pretty_print( zombies , 3) << "\n";
+         return killed;
+      }
+      sleep(2);
+   }
+   return 0;
+}
+
+BOOST_AUTO_TEST_CASE( test_zombie_kill )
+{
+   DurationTimer timer;
+   std::string suite_name  = "test_zombie_kill";
+   cout << "Test:: ..." << suite_name << " " << flush;
+   TestClean clean_at_start_and_end;
+
+   // This command creates user zombies up front, these may not have a pid, if task in submitted state
+   create_and_start_test(suite_name,"complete");
+
+   check_at_least_one_zombie();
+
+   // kill all the zombies, i.e kill -15 on the script
+   // This will be trapped by the signal and hence will call abort
+   (void) ZombieUtil::do_zombie_user_action(User::KILL, NUM_OF_TASKS, timeout);
+
+   // wait for kill zombies. This should eventually lead to process terminating
+   int killed = wait_for_killed_zombies(NUM_OF_TASKS,timeout);
+   BOOST_CHECK_MESSAGE(killed > 0,"Expected " <<  NUM_OF_TASKS << " killed ");
+
+   {
+      // wait for process to be killed: killing is a separate process, we could well
+      // have got to the complete, before the process is killed.
+      // Once the complete is fobed it terminate the process.
+      AssertTimer assertTimer(timeout,false); // Bomb out after n seconds, fall back if test fail
+      while (1) {
+          int completed = 0; int aborted = 0;
+          TestFixture::client().zombieGet();
+          std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+          BOOST_FOREACH(const Zombie& z, zombies) {
+             if (z.last_child_cmd() == ecf::Child::ABORT) aborted++;
+             if (z.last_child_cmd() == ecf::Child::COMPLETE) completed++;
+          }
+          if (aborted + completed == NUM_OF_TASKS) break;
+          if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+             cout <<  "wait for for abort:  found " << aborted+completed<< " aborted & completed tasks. Test wait "
+                      << assertTimer.duration() <<
+                      " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                      " breaking out\n" << Zombie::pretty_print( zombies , 3) << "\n";
+             break;
+          }
+          sleep(1);
+       }
+   }
+   bool task_became_blocked = false;
+   {
+      // wait for process to be die
+      AssertTimer assertTimer(timeout,false); // Bomb out after n seconds, fall back if test fail
+      while (1) {
+          TestFixture::client().zombieGet();
+          std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+          BOOST_FOREACH(const Zombie& z, zombies) {
+             if (z.block()) {  // something went wrong, fob so don't leave process hanging
+                TestFixture::client().zombieFob(z);
+                task_became_blocked = true;
+                cout << "Zombies blocking ?? " << z << "\n";
+             }
+          }
+          if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+             if ( task_became_blocked ) {
+                cout <<  "Task became blocked, fobing" << assertTimer.duration() <<
+                         " taking longer than time constraint of " << assertTimer.timeConstraint() <<
+                         " breaking out\n" << Zombie::pretty_print( zombies , 3) << "\n";
+             }
+             break;
+          }
+          sleep(1);
+       }
+   }
+
+   // remove the killed zombies
+   (void) ZombieUtil::do_zombie_user_action(User::REMOVE,NUM_OF_TASKS, timeout,false);
+
+   wait_for_no_zombies(timeout);
+
+   cout << timer.duration() << "\n";
+}
+#endif
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/Test_Time.cpp b/ecflow_4_0_7/Test/Test_Time.cpp
new file mode 100644
index 0000000..05ef888
--- /dev/null
+++ b/ecflow_4_0_7/Test/Test_Time.cpp
@@ -0,0 +1,387 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #35 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "DurationTimer.hpp"
+#include "PrintStyle.hpp"
+
+using namespace std;
+using namespace ecf;
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE( TestSuite )
+
+BOOST_AUTO_TEST_CASE( test_single_real_time )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_single_real_time " << flush;
+   TestClean clean_at_start_and_end;
+
+   // Create the defs file corresponding to the text below
+   // ECF_HOME variable is automatically added by the test harness.
+   // ECF_INCLUDE variable is automatically added by the test harness.
+   // SLEEPTIME variable is automatically added by the test harness.
+   // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
+   //                     This is substituted in sms includes
+   //                     Allows test to run without requiring installation
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite suite
+   // edit SLEEPTIME 1
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <todays date>
+   // family family
+   //    task t1
+   //         time 10:00
+   //    endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with fixed date and time, then create a time attribute
+      // with todays time + minute
+      // Avoid adding directly to TimeSlot
+      // i.e if local time is 9:59 and we create a TimeSlot like
+      //       task->addTime( ecf::TimeAttr( ecf::TimeSlot(theTm.tm_hour,theTm.tm_min+3) )  );
+      // The the minute will be 62, which is illegal and will not parse
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(10,0,0));
+      boost::posix_time::ptime time1 =  theLocalTime +  minutes(1);
+
+      // For each 2 seconds of poll in the server update calendar by 1 minute
+      // Note: if we use 1 seconds poll to update calendar by 1 minute, then
+      //       we will find that state change happens at job submission interval,
+      //       and hence skews time series.  Which can leave state in a queued state,
+      //       and hence test never completes
+      suite_ptr suite = theDefs.add_suite("test_single_real_time");
+      ClockAttr clockAttr(theLocalTime,false);
+      suite->addClock( clockAttr );
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr(ecf::TimeSlot(time1.time_of_day())));
+      task->addVerify( VerifyAttr(NState::COMPLETE,1) );      // task should complete 1 times
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_single_real_time.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_time_multiple_single_slot )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_time_multiple_single_slot "<< flush;
+   TestClean clean_at_start_and_end;
+
+   // SLOW SYSTEMS
+   // for each time attribute leave GAP of 3 * job submission interval
+   // on slow systems submitted->active->complete > TestFixture::job_submission_interval()
+   // Also the task duration must be greater than job_submission_interval,  otherwise
+   // we will get multiple invocation for the same time step.
+   // *sometimes* just submitted->active can take many times job submission interval.
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_time_multiple_single_slot
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <todays date>
+   // family family
+   //    task t1
+   //         time 10:01
+   //         time 10:04
+   //         time 10:07
+   //    endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with todays date and time, then create a time attribute
+      // with todays time + minute.
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(10,0,0));
+      boost::posix_time::ptime time1 = theLocalTime + minutes(1);
+      boost::posix_time::ptime time2 = time1 + minutes(TestFixture::job_submission_interval());
+      boost::posix_time::ptime time3 = time2 + minutes(TestFixture::job_submission_interval());
+
+      suite_ptr suite = theDefs.add_suite("test_time_multiple_single_slot");
+      ClockAttr clockAttr(theLocalTime,false);
+      suite->addClock( clockAttr );
+      suite->add_variable("SLEEPTIME","1");
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr( ecf::TimeSlot(time1.time_of_day()) )  );
+      task->addTime( ecf::TimeAttr( ecf::TimeSlot(time2.time_of_day()) )  );
+      task->addTime( ecf::TimeAttr( ecf::TimeSlot(time3.time_of_day()) )  );
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );      // task should complete 3 times
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_time_multiple_single_slot.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+
+BOOST_AUTO_TEST_CASE( test_time_relative_time_series )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_time_relative_time_series " << flush;
+   TestClean clean_at_start_and_end;
+
+   // SLOW SYSTEMS
+   // for each time attribute leave GAP of 3 * job submission interval
+   // on slow systems submitted->active->complete > TestFixture::job_submission_interval()
+   // Also the task duration must be greater than job_submission_interval,  otherwise
+   // we will get multiple invocation for the same time step
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_time_relative_time_series
+   // edit SLEEPTIME 1
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <todays date>
+   // family family
+   //    task t1
+   //       time +<start> <finish> incr
+   //    endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with todays date and time, then create a time attribute
+      // with a time series, so that task runs 3 times relative to suite start
+      suite_ptr suite = theDefs.add_suite("test_time_relative_time_series");
+      ClockAttr clockAttr(Calendar::second_clock_time(),false);
+      suite->addClock( clockAttr );
+      suite->add_variable("SLEEPTIME",boost::lexical_cast<std::string>(TestFixture::job_submission_interval()-1));
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr(
+               ecf::TimeSlot(0,1),
+               ecf::TimeSlot(0,7),
+               ecf::TimeSlot(0,3),
+               true /*relative to suite start*/
+      )
+      );
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );      // task should complete 3 times
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_time_relative_time_series.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_time_real_series )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_time_real_series " << flush;
+   TestClean clean_at_start_and_end;
+
+   // SLOW SYSTEMS
+   // for each time attribute leave GAP of 3 * job submission interval
+   // on slow systems submitted->active->complete > TestFixture::job_submission_interval()
+   // Also the task duration must be greater than job_submission_interval,  otherwise
+   // we will get multiple invocation for the same time step
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_time_real_series
+   // edit SLEEPTIME 1
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <date>
+   // family family
+   //    task t1
+   //       time <start> <finish> <incr>
+   //    endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // Initialise clock with todays date and time, then create a time attribute
+      // with a time series, so that task runs 3 times
+      boost::posix_time::ptime theLocalTime = boost::posix_time::ptime(date(2010,6,21),time_duration(10,0,0));
+      boost::posix_time::ptime time1 = theLocalTime + minutes(1);
+      boost::posix_time::ptime time2 = time1 + minutes(TestFixture::job_submission_interval()*2);
+
+      suite_ptr suite = theDefs.add_suite("test_time_real_series");
+      suite->add_variable("SLEEPTIME","1");
+
+      ClockAttr clockAttr(theLocalTime,false);
+      suite->addClock( clockAttr );
+
+      family_ptr  fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr(
+               ecf::TimeSlot(time1.time_of_day()),
+               ecf::TimeSlot(time2.time_of_day()),
+               ecf::TimeSlot(0,TestFixture::job_submission_interval())
+      ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,3) );      // task should complete 3 times
+      // 1 +    7  + 13
+      // 1 + (2*n) + (2*n) = 1 + 4n
+      // start = 1, finish = 13, when n=3, when n = job submission interval
+      // to complete 3 times, we must use interval of n*2
+   }
+
+   // The test harness will create corresponding directory structure
+   // and populate with standard sms files.
+   ServerTestHarness serverTestHarness;
+   //serverTestHarness.add_default_sleep_time(false); // avoid missing time steps due to submit->active->complete > job submission interval
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_time_real_series.def"));
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_single_real_time_near_midnight )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_single_real_time_near_midnight " << flush;
+   int the_server_version = TestFixture::server_version() ;
+   if (the_server_version == 403 ) {
+      cout << " SKIPPING, This test does not work with 403, current server version is " << the_server_version << "\n";
+      return;
+   }
+
+   TestClean clean_at_start_and_end;
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite suite
+   // edit SLEEPTIME 4
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <todays date>
+   // family family
+   //    task t1
+   //         time 23:59
+   //    endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // ECFLOW-130
+      // Make sure job completes after midnight.
+      // The task SHOULD stay complete and *NOT* requeue
+      // Since TestHarness requires suite completion, we dont need to do anything.
+      boost::posix_time::ptime time_start = boost::posix_time::ptime(date(2010,6,21),time_duration(23,59,0));
+      boost::posix_time::ptime clock_start = time_start -  minutes(1);
+
+      suite_ptr suite = theDefs.add_suite("test_single_real_time_near_midnight");
+      ClockAttr clockAttr(clock_start,false);
+      suite->addClock( clockAttr );
+      suite->add_variable("SLEEPTIME",boost::lexical_cast<string>(TestFixture::job_submission_interval()*2));
+
+      family_ptr fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr(ecf::TimeSlot(time_start.time_of_day())));
+      task->addVerify( VerifyAttr(NState::COMPLETE,1) );      // task should complete 1 times
+   }
+
+   // The test harness will create corresponding directory structure and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,ServerTestHarness::testDataDefsLocation("test_single_real_time_near_midnight.def"));
+
+#ifdef DEBUG_ME
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+   defs_ptr defs = TestFixture::client().defs();
+   PrintStyle::setStyle(PrintStyle::STATE);
+   std::cout << *defs;
+#endif
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+
+BOOST_AUTO_TEST_CASE( test_time_real_series_near_midnight )
+{
+   DurationTimer timer;
+   cout << "Test:: ...test_time_real_series_near_midnight " << flush;
+   int the_server_version = TestFixture::server_version() ;
+   if (the_server_version == 403 ) {
+      cout << " SKIPPING, This test does not work with 403, current server version is " << the_server_version << "\n";
+      return;
+   }
+
+   TestClean clean_at_start_and_end;
+
+   // SLOW SYSTEMS
+   // for each time attribute leave GAP of 3 * job submission interval
+   // on slow systems submitted->active->complete > TestFixture::job_submission_interval()
+   // Also the task duration must be greater than job_submission_interval,  otherwise
+   // we will get multiple invocation for the same time step
+
+   //# Note: we have to use relative paths, since these tests are relocatable
+   //suite test_time_real_series
+   // edit SLEEPTIME 1
+   // edit ECF_INCLUDE $ECF_HOME/includes
+   //  clock real <date>
+   // family family
+   //    task t1
+   //       time <start> <finish> <incr>
+   //    endfamily
+   //endsuite
+   Defs theDefs;
+   {
+      // ECFLOW-130
+      // make sure that last job, *runs* and completes after midnight.
+      // It should stay complete and not requeue.
+      // Test harness, will check suite task->family->suite completes, hence no need to do anything
+      boost::posix_time::ptime last_time = boost::posix_time::ptime(date(2010,6,21),time_duration(23,59,0));
+      boost::posix_time::ptime first_time = last_time - minutes(TestFixture::job_submission_interval()*2);
+      boost::posix_time::ptime clock_start = first_time - minutes(1);
+
+      suite_ptr suite = theDefs.add_suite("test_time_real_series_near_midnight");
+      suite->add_variable("SLEEPTIME",boost::lexical_cast<string>(TestFixture::job_submission_interval()*2));
+
+      ClockAttr clockAttr(clock_start,false);
+      suite->addClock( clockAttr );
+
+      family_ptr  fam = suite->add_family("family");
+      task_ptr task = fam->add_task("t");
+      task->addTime( ecf::TimeAttr(
+               ecf::TimeSlot(first_time.time_of_day()),
+               ecf::TimeSlot(last_time.time_of_day()),
+               ecf::TimeSlot(0,TestFixture::job_submission_interval()*2)
+      ));
+      task->addVerify( VerifyAttr(NState::COMPLETE,2) );      // task should complete 2 times
+   }
+
+   // The test harness will create corresponding directory structure and populate with standard ecf files.
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_time_real_series_near_midnight.def"));
+
+#ifdef DEBUG_ME
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().sync_local() == 0, "Could not get the defs from server\n" << TestFixture::client().errorMsg());
+   defs_ptr defs = TestFixture::client().defs();
+   PrintStyle::setStyle(PrintStyle::STATE);
+   std::cout << *defs;
+#endif
+
+   cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
+}
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/Test/data/.gitignore b/ecflow_4_0_7/Test/data/.gitignore
new file mode 100644
index 0000000..bc0add2
--- /dev/null
+++ b/ecflow_4_0_7/Test/data/.gitignore
@@ -0,0 +1,2 @@
+/ECF_HOME_debug
+/ECF_HOME_release
diff --git a/ecflow_4_0_7/Test/data/includes/head.h b/ecflow_4_0_7/Test/data/includes/head.h
new file mode 100644
index 0000000..9eb3728
--- /dev/null
+++ b/ecflow_4_0_7/Test/data/includes/head.h
@@ -0,0 +1,63 @@
+#!/bin/ksh
+
+%manual
+#This is the manual from the head.h file
+%end
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the three variables that are needed for any
+# communication with ECF
+
+export ECF_PORT=%ECF_PORT%    # ECF_ Remote Procedure Call number
+export ECF_NODE=%ECF_NODE%    # The ecflow server that issued the task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# to debug client communication with the server, enable this environment
+#export ECF_DEBUG_CLIENT=
+
+# Typically we dont set this, however the zombie automated test require this.
+# it allows us to disambiguate a zombie from a real job.
+export ECF_RID=$$
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of smsinit
+# Here we give the current PID.
+
+
+# allow where applicable for new clients to talk to old servers
+%ECF_ALLOW_NEW_CLIENT_OLD_SERVER:%
+
+
+# Defined a error hanlder
+ERROR() {
+	echo "ERROR called"
+	set +e        # Clear -e flag, so we don't fail
+	wait          # wait for background process to stop
+   # when the following signals arrive do nothing, stops recursive signals/error function being called
+	trap 0 1 2 3 4 5 6 7 8 10 12 13 15
+   # Notify ECF_ that something went wrong
+	%ECF_CLIENT_EXE_PATH% --abort
+	trap 0        # Remove the trap
+	exit 0        # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
+
+
+%ECF_CLIENT_EXE_PATH% --init=$$
+
+# record shell time
+%ecfmicro !
+start_time=$(date +%s)
+!ecfmicro %
diff --git a/ecflow_4_0_7/Test/data/includes/tail.h b/ecflow_4_0_7/Test/data/includes/tail.h
new file mode 100644
index 0000000..b2d3a22
--- /dev/null
+++ b/ecflow_4_0_7/Test/data/includes/tail.h
@@ -0,0 +1,17 @@
+# wait for background process to stop.
+# If we did not have background jobs, closly called foreround jobs
+# may arrive out of order at the server, causing unnecessary zombies
+# The wait should prevent this.
+wait
+
+# record shell time, see head.h
+%ecfmicro !
+finish_time=$(date +%s)
+!ecfmicro %
+echo "Job End: Time duration: $((finish_time - start_time)) secs."
+
+# Notify ECF of a normal end
+%ECF_CLIENT_EXE_PATH% --complete
+trap 0                          # Remove all traps
+exit 0                          # End the shell
+
diff --git a/ecflow_4_0_7/Test/samples/cron.def b/ecflow_4_0_7/Test/samples/cron.def
new file mode 100644
index 0000000..96e7bb0
--- /dev/null
+++ b/ecflow_4_0_7/Test/samples/cron.def
@@ -0,0 +1,105 @@
+suite cron
+
+   clock real  # Need real clock otherwise crons would be complete
+   task cron0
+      cron 00:25 23:59 00:30
+      
+   task cron1
+      cron -w 0 , 1, 2 -m 5, 6, 7 , 8,9,10      10:00  20:00  01:00  # run every sunday, between May-Aug, every hour between 10am and 8pm
+
+   task cron1_1
+      cron -w 0,1,2 -m 9,10  10:00  14:00  01:00  
+      
+   task cron2
+         cron 23:00                              # run every day at 23:00
+         
+   task cron3
+      cron 10:00 20:00 01:00                  # run every hour between 10am and 8pm
+      
+   task cron4
+      cron -w 0,1 10:00                       # run every sunday and monday at 10am
+      
+   task cron5
+      cron -d 10,11,12 12:00                  # run 10th, 11th and 12th of each month at noon
+      
+   task cron6
+      cron -m 1,2,3 12:00                     # run on Jan,Feb and March every day at noon.
+      
+   task cron7
+      cron -w 0,6 12:00
+      
+   task cron8
+      cron -w 0,1,2,3,4,5,6 12:00
+      
+   task cron9
+      cron -w 0 -m 5,6,7,8 10:00 20:00 01:00  # run every sunday, between May-Aug, every hour between 10am and 8pm
+   
+   task cron10
+      cron -w 0,1,2 -d 1,20,24 -m 5,6,7,8 10:00 20:00 01:00  #  
+
+
+   task cron11
+      cron 00:00 23:59 00:01  #  run every minute
+      
+   family f1
+      cron -d 22 12:00
+      task t1
+      task t2
+   endfamily
+   family f2
+      cron -d 8 12:00
+      task t1
+      task t2
+   endfamily
+   
+   family t1
+      task t1
+         cron 00:01
+         cron 23:59
+         
+     task t2
+         cron 09:00
+         cron 12:00
+
+     task t3
+         cron 12:00
+         cron 18:00
+
+     task t4
+         cron 18:00
+         cron 23:00
+         
+     task t5
+         cron 10:00
+    task t6
+         cron 11:00
+    task t7
+         cron 12:00
+    task t8
+         cron 13:00
+    task t9
+         cron 14:00
+    task t10
+         cron 15:00
+    task t11
+         cron 16:00
+    task t12
+         cron 17:00
+    task t13
+         cron 18:00
+    task t14
+         cron 19:00
+    task t15
+         cron 20:00
+    task t16
+         cron 21:00
+    task t17
+         cron 22:00
+    task t18
+         cron 23:00
+    task t19
+         cron 23:00
+    task t20
+         cron 00:00   
+   endfamily          
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/Test/samples/time.def b/ecflow_4_0_7/Test/samples/time.def
new file mode 100644
index 0000000..2475027
--- /dev/null
+++ b/ecflow_4_0_7/Test/samples/time.def
@@ -0,0 +1,84 @@
+suite time
+  clock real
+  family time_range
+   task t
+     time 07:00 23:00 00:30
+   task t2
+     cron 09:00 23:00 00:05
+   task t3
+     time 13:00
+   task t4
+     time 23:00
+   task t5
+      time 07:00
+      time 08:00
+      time 09:00
+      time 10:00
+      time 13:00
+      time 14:00
+      time 15:00
+      time 16:00
+      time 17:00
+    task every_minute
+     time 00:01 23:59 00:01
+     edit SLEEP 90          # task takes longer than one minute
+  endfamily
+   family t1
+      task t1
+         time 00:01
+         time 23:59
+         
+     task t2
+         time 09:00
+         time 12:00
+
+     task t3
+         time 12:00
+         time 18:00
+
+     task t4
+         time 18:00
+         time 23:00
+         
+     task t5_1
+         time 08:00
+    task t5
+         time 10:00
+    task t6
+         time 11:00
+    task t7
+         time 12:00
+    task t8
+         time 13:00
+         time 15:00
+    task t9
+         time 14:00
+    task t10
+         time 15:00
+    task t11
+         time 16:00
+         time 17:00
+         time 18:00
+         time 19:00
+         trigger 1 == 0
+    task t12
+         time 17:00
+    task t13
+         time 18:00
+    task t14
+         time 19:00
+    task t15
+         time 20:00
+    task t16
+         time 21:00
+    task t17
+         time 22:00
+    task t18
+         time 23:00
+    task t19
+         time 23:00
+         trigger 1 == 0
+    task t20
+         time 00:00
+   endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/Test/samples/today.def b/ecflow_4_0_7/Test/samples/today.def
new file mode 100644
index 0000000..c126a95
--- /dev/null
+++ b/ecflow_4_0_7/Test/samples/today.def
@@ -0,0 +1,75 @@
+suite today
+  clock real
+  family time_range
+   task t
+     today 07:00 23:00 00:30
+   task t2
+     today 09:00 23:00 00:05
+   task t3
+     today 13:00
+   task t4
+     today 23:00
+   task t5
+      today 09:00
+      today 13:00
+      today 14:00
+      today 15:00
+      today 16:00
+      today 17:00
+  endfamily
+   family t1
+      task t1
+         today 00:01
+         today 23:59
+      task t1_1
+         today 09:01
+         today 09:30
+     task t2
+         today 09:00
+         today 12:00
+     task t3
+         today 12:00
+         today 18:00
+     task t4
+         today 18:00
+         today 23:00
+     task t5
+         today 10:00
+     task t5_1
+         today 08:00    
+    task t6
+         today 11:00
+         today 11:30
+    task t7
+         today 12:00
+         today 12:30
+         today 13:30
+         today 14:30
+    task t8
+         today 13:00
+    task t9
+         today 14:00
+    task t10
+         today 15:00
+    task t11
+         today 16:00
+    task t12
+         today 17:00
+    task t13
+         today 18:00
+    task t14
+         today 19:00
+    task t15
+         today 20:00
+    task t16
+         today 21:00
+    task t17
+         today 22:00
+    task t18
+         today 23:00
+    task t19
+         today 23:00
+    task t20
+         today 00:00
+   endfamily
+endsuite
\ No newline at end of file
diff --git a/ecflow_4_0_7/Test/src/ServerTestHarness.cpp b/ecflow_4_0_7/Test/src/ServerTestHarness.cpp
new file mode 100644
index 0000000..081760e
--- /dev/null
+++ b/ecflow_4_0_7/Test/src/ServerTestHarness.cpp
@@ -0,0 +1,558 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #127 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>    // for getenv()
+
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/test/unit_test.hpp>
+
+#include "ServerTestHarness.hpp"
+#include "TestFixture.hpp"
+#include "DurationTimer.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "File.hpp"
+#include "AssertTimer.hpp"
+#include "TestHelper.hpp"
+#include "PrintStyle.hpp"
+#include "WhyCmd.hpp"
+#include "Ecf.hpp"
+#include "Str.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+//#define DEBUG_TEST_WAITER 1
+//#define DEBUG_TEST_WAITER_DEFS 1
+//#define DEBUG_TEST_HARNESS 1
+//#define DEBUG_DIFF 1
+
+ServerTestHarness::ServerTestHarness()
+: generateManFileForNodeContainers_(false),
+  check_task_duration_less_than_server_poll_(true),
+  add_default_sleep_time_(true),
+  serverUpdateCalendarCount_(0)
+{}
+
+void ServerTestHarness::run(
+         Defs& theClientDefs,
+         const std::string& defs_filename,
+         const std::map<std::string,
+         std::string>& customTaskSmsMap,
+         int timeout,
+         bool waitForTestCompletion)
+{
+   defs_filename_ = defs_filename;
+
+   /// RUN the TEST
+   defs_ptr serverDefs = doRun(theClientDefs,customTaskSmsMap,timeout,waitForTestCompletion);
+}
+
+void  ServerTestHarness::run(Defs& defs,const std::string& defs_filename, int timeout, bool waitForTestCompletion)
+{
+   std::map<std::string,std::string> customTaskSmsMap;
+   run(defs,defs_filename,customTaskSmsMap,timeout,waitForTestCompletion);
+}
+
+struct null_deleter { void operator()(void const *) const{} };
+
+defs_ptr
+ServerTestHarness::doRun(Defs& theClientDefs, const std::map<std::string,std::string>& customTaskSmsMap,int timeout,bool waitForTestCompletion)
+{
+#ifdef DEBUG_TEST_HARNESS
+   cout << "ServerTestHarness::doRun " << defs_filename_ << " timeout=" << timeout << "  waitForTestCompletion = " << waitForTestCompletion << "\n";
+#endif
+   BOOST_REQUIRE_MESSAGE(!theClientDefs.suiteVec().empty(), "No suite defined");
+
+
+#ifdef DEBUG_TEST_HARNESS
+   cout << "   ServerTestHarness::doRun: Get the client exe. This can be client exe on another platform hence cant run here\n";
+#endif
+   std::string theClientExePath = TestFixture::theClientExePath();
+   BOOST_REQUIRE_MESSAGE(!theClientExePath.empty()," The client program could not be found");
+
+
+#ifdef DEBUG_TEST_HARNESS
+   cout << "   ServerTestHarness::doRun: Create ECF directory structure corresponding to Node tree\n";
+#endif
+   // Automatically add variable ECF_HOME to each suite, before saving to disk
+   // This is needed to locate ECF_FILE includes
+   std::string ecf_home = testDataLocation( defs_filename_ );
+
+   // Most test just define one suite, however the mega.def has up to 26 suites
+   // If set this can be used to choose which suite to begin.
+   std::string suiteName;
+
+   // Create the client early, since we need to determine if environment variable
+   // ECF_ALLOW_NEW_CLIENT_OLD_SERVER was set, if it was, we need to update the generated .ecf scripts
+   // to embed this variable, this will allow  *new child commands* to talk to old servers
+   int allow_new_client_old_server = 0;
+   if (TestFixture::client().allow_new_client_old_server() != 0) {
+      // need export ECF_ALLOW_NEW_CLIENT_OLD_SERVER
+      allow_new_client_old_server = TestFixture::client().allow_new_client_old_server();
+   }
+
+
+   // ECF_CLIENT_EXE_PATH allows dependence on client exe without installation
+   // Allow user to add SLEEPTIME, otherwise add a default
+   int customSmsCnt = 0;
+   int taskSmsMapSize = static_cast<int>(customTaskSmsMap.size());
+   BOOST_FOREACH(suite_ptr s, theClientDefs.suiteVec()) {
+      if (allow_new_client_old_server != 0) {
+         std::string value = "export ECF_ALLOW_NEW_CLIENT_OLD_SERVER=" + boost::lexical_cast<std::string>(allow_new_client_old_server);
+         s->addVariable( Variable( "ECF_ALLOW_NEW_CLIENT_OLD_SERVER",  value ) );
+      }
+
+      // Always override these to correctly locate files.
+      s->addVariable( Variable( Str::ECF_HOME(),  ecf_home ) );
+      s->addVariable( Variable( "ECF_CLIENT_EXE_PATH",  theClientExePath ) );
+      s->addVariable( Variable( Str::ECF_INCLUDE(), TestFixture::includes()  ) );
+
+      if (s->findVariable("SLEEPTIME").empty())           s->addVariable( Variable( "SLEEPTIME", "1" ) );
+
+      if (check_task_duration_less_than_server_poll_) {
+         if (s->findVariable("CHECK_TASK_DURATION_LESS_THAN_SERVER_POLL").empty()) s->addVariable( Variable( "CHECK_TASK_DURATION_LESS_THAN_SERVER_POLL", "_any_" ) );
+      }
+      suiteName = s->name();
+
+      // recursively create directory structure from ECF_HOME and populate tasks with sms files
+      createDirAndEcfFiles(s.get(),ecf_home,customTaskSmsMap,customSmsCnt);
+   }
+   BOOST_REQUIRE_MESSAGE( customSmsCnt == taskSmsMapSize,"customSmsCnt:" << customSmsCnt << " does not match " << taskSmsMapSize << " createDirAndEcfFiles did not create all sms file corresponding to tasks");
+
+
+   // If the defs has more than one suite, then start them all.
+   if ( theClientDefs.suiteVec().size() != 1) {
+      suiteName.clear();
+#ifdef DEBUG_TEST_HARNESS
+      cout << "   ServerTestHarness::doRun: defs has " << theClientDefs.suiteVec().size() << " suites hence will begin all of them\n";
+#endif
+   }
+
+
+   bool load_defs_from_disk = true;
+   {
+#ifdef DEBUG_TEST_HARNESS
+      cout << "   ServerTestHarness::doRun: Save the Defs file to disk. " << defs_filename_ << "\n";
+#endif
+      std::ofstream theClientDefsFile( defs_filename_.c_str() );
+      if ( theClientDefsFile.fail()) {
+         // The file is *not on disk*, just use in memory defs
+         load_defs_from_disk = false;
+      }
+      else {
+         PrintStyle::setStyle(PrintStyle::DEFS); // needed for output
+         theClientDefsFile << theClientDefs;
+         PrintStyle::setStyle(PrintStyle::STATE); // From now on show state
+      }
+   }
+
+   // Set the location of the new log file. Close the current log file and create new log file
+   // The defs file name should have been set to the test location
+   // The log file is CLEARED so that previous run is ignored
+   std::string new_log_file_path = defs_filename_ + "_log";
+#ifdef DEBUG_TEST_HARNESS
+   cout << "   ServerTestHarness::new_log_file_path = " << new_log_file_path << "\n";
+#endif
+   TestFixture::client().new_log( new_log_file_path );
+   TestFixture::client().clearLog();
+
+
+#ifdef DEBUG_TEST_HARNESS
+   cout << "   ServerTestHarness::doRun: Delete all nodes in server. Using force to allow as many tests as possible\n";
+#endif
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().delete_all(true/*force, even if it creates zombies*/) == 0,CtsApi::to_string(CtsApi::delete_node()) << " failed should return 0. Should Delete ALL existing defs in the server\n" << TestFixture::client().errorMsg());
+
+
+#ifdef DEBUG_TEST_HARNESS
+   cout << "   ServerTestHarness::doRun: Load new defs in the server\n";
+#endif
+   if ( load_defs_from_disk ) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().loadDefs( defs_filename_ ) == 0,"load defs failed should return 0. Should Load defs file " << defs_filename_ << " into the server from current working directory\n" << TestFixture::client().errorMsg());
+   }
+   else {
+      // load expects a defs_ptr
+      defs_ptr defs(&theClientDefs,null_deleter());
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().load( defs ) == 0,"load defs failed should return 0. Should Load defs file " << defs_filename_ << " into the server\n" << TestFixture::client().errorMsg());
+   }
+
+#ifdef DEBUG_TEST_HARNESS
+   cout << "   ServerTestHarness::doRun: Restart server \n";
+#endif
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().restartServer() == 0,CtsApi::restartServer() << " failed should return 0. Should restart the server via a client command\n" << TestFixture::client().errorMsg());
+
+
+#ifdef DEBUG_TEST_HARNESS
+   cout << "   ServerTestHarness::doRun: Calling begin on suite " << suiteName << "\n";
+#endif
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().begin( suiteName ) == 0,CtsApi::begin( suiteName ) << " failed should return 0. Should Begin the suite " <<  suiteName << "\n" << TestFixture::client().errorMsg());
+
+
+   if (waitForTestCompletion) {
+#ifdef DEBUG_TEST_HARNESS
+      cout << "   ServerTestHarness::doRun: Waiting for test to finish\n";
+#endif
+      return testWaiter(theClientDefs,timeout,true /* test against verification attributes on defs */);
+   }
+   return defs_ptr();
+}
+
+
+static void test_invariants(defs_ptr the_defs, const std::string& title) {
+   std::string errorMsg;
+   BOOST_CHECK_MESSAGE( the_defs->checkInvariants(errorMsg),title << " Invariants failed " << errorMsg);
+}
+
+bool verify_attribute_verification()
+{
+   // In  version 4.0.1: We changed the way families changed states. i.e families will now change to state complete
+   // before being requeued. See ECFLOW-96 Families with loops(cron/repeat) should log complete
+   // This meant that when we run the migration tests, i.e new client with old server (with new test)
+   // It would fail some the test, during verify attribute verification. ie. where we count the number of times
+   // a node completes. To enable these tests to still run, we will disable verify attribute verification
+   static bool allow_verification = true;
+
+   if (!allow_verification) {
+      //std::cout << "Disable verify attribute verification ------------------------------------------\n";
+      return false;
+   }
+   char* the_env = getenv("DISABLE_VERIFY_ATTRIBUTE_VERIFICATION");
+   if (the_env) {
+      std::cout << "Disable verify attribute verification *************************************************************\n";
+      allow_verification= false;
+      return false;
+   }
+   return true;
+}
+
+defs_ptr
+ServerTestHarness::testWaiter( const Defs& theClientDefs, int timeout, bool verifyAttr)
+{
+#ifdef DEBUG_TEST_WAITER
+   cout << "ServerTestHarness::testWaiter \n";
+#endif
+
+#ifdef DEBUG_DIFF
+   std::string dump_defs_filename = "test.def";
+   int counter = 0;
+#endif
+
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().client_handle() == 0,"Client handle expected to be zero but found " << TestFixture::client().client_handle());
+
+   /// This function will test sync'ing. by getting the sync and full defs, then comparing them
+   AssertTimer assertTimer(timeout,false); // Bomb out after n seconds, fall back if test fail
+
+   // test the incremental changes
+   defs_ptr incremental_defs;
+   defs_ptr full_defs;
+
+   int sleepTime = (theClientDefs.suiteVec().size() == 1) ? TestFixture::job_submission_interval() : 10;
+   int sleep_fudgeFactor = TestFixture::job_submission_interval();
+
+   // How do we terminate this test?
+   // The test succeeds if the suite state is complete,
+   while( 1 ) {
+#ifdef DEBUG_TEST_WAITER
+  		std::cout << "sleepTime = " << sleepTime << "\n";
+#endif
+      sleep(sleepTime);    // avoid calling get excessively, by using sleep
+      DurationTimer timer; // automatically adjust sleep time
+
+      bool server_changed = false;
+      if (!full_defs.get()) {
+         server_changed = true;
+         // ********************************************************************************
+         // Calling getDefs will also force a flush of the log file. This is required since we
+         // copy the log file locally on the shared file system for cross platform testing
+         // ******************************************************************************
+         BOOST_REQUIRE_MESSAGE(TestFixture::client().getDefs() == 0,CtsApi::get() << " failed should return 0 " << TestFixture::client().errorMsg());
+         full_defs =  TestFixture::client().defs();
+         incremental_defs = TestFixture::client().defs();
+         BOOST_REQUIRE_MESSAGE( full_defs.get(),"get command failed to get node tree from server");
+         BOOST_REQUIRE_MESSAGE( incremental_defs.get(),"get command failed to get node tree from server");
+
+         // Ensure that when suite was loaded in server, that others suites were discarded
+         BOOST_CHECK_MESSAGE(theClientDefs.suiteVec().size() == full_defs->suiteVec().size(),"mismatch in client suite count " << theClientDefs.suiteVec().size() << " and server " << full_defs->suiteVec().size());
+         test_invariants(full_defs,"First time for getting full defs");
+      }
+      else {
+         BOOST_CHECK_MESSAGE(TestFixture::client().news(full_defs) == 0, "news failed should return 0 " << TestFixture::client().errorMsg());
+         server_changed = TestFixture::client().get_news();
+         //			std::cout << "server_changed = " << server_changed << "\n";
+         if ( server_changed ) {
+
+            // Get the incremental changes **FIRST** and compare this with the full defs later on
+            BOOST_REQUIRE_MESSAGE(TestFixture::client().sync(incremental_defs) == 0, "sync failed should return 0 " << TestFixture::client().errorMsg());
+            BOOST_CHECK_MESSAGE(TestFixture::client().in_sync(), "in_sync expected to return true, when we have changes in server");
+            test_invariants(incremental_defs,"After syncing with incremental defs.");
+
+            // get the FULL defs
+            BOOST_REQUIRE_MESSAGE(TestFixture::client().getDefs() == 0,CtsApi::get() << " failed should return 0 " << TestFixture::client().errorMsg());
+            full_defs =  TestFixture::client().defs();
+            BOOST_REQUIRE_MESSAGE( full_defs.get(),"get command failed to get node tree from server");
+            test_invariants(full_defs,"After getting the full defs.");
+
+            // **** NOTE ****: There could have been state change between the calls:
+            // **************: 	 TestFixture::client().sync(incremental_defs)
+            // **************:    TestFixture::client().getDefs()
+            // **************: hence we can only compare, incremental and full defs if
+            // **************: state and modification numbers are the same:
+            BOOST_REQUIRE_MESSAGE(incremental_defs.get() != full_defs.get()," Expected two different defs trees ");
+            if ( incremental_defs->state_change_no()  == full_defs->state_change_no() &&
+                     incremental_defs->modify_change_no() == full_defs->modify_change_no()) {
+               Ecf::set_debug_equality(true);  // only has affect in DEBUG build
+               BOOST_CHECK_MESSAGE( *full_defs == *incremental_defs,
+                        "Full and incremental defs should be the same. (state_change_no,modify_change_no) ("
+                        << incremental_defs->state_change_no() << "," << incremental_defs->modify_change_no() << ")"
+               );
+               Ecf::set_debug_equality(false); // only has affect in DEBUG build
+            }
+            else {
+#ifdef DEBUG_TEST_WAITER
+               std::cout << "***** ServerTestHarness::testWaiter: State change between getting incremental and full defs\n";
+#endif
+            }
+         }
+      }
+
+      int hasAutoCancel = 0;
+      size_t completeSuiteCnt = 0;
+      if (server_changed) {
+
+#ifdef DEBUG_DIFF
+         {
+            PrintStyle::Type_t st = PrintStyle::getStyle();
+            PrintStyle::setStyle(PrintStyle::STATE);
+            counter++;
+            std::string filename = dump_defs_filename + boost::lexical_cast<std::string>(counter);
+            std::ofstream theFile( filename.c_str() );
+
+            std::vector<Task*> tasks;
+            full_defs->getAllTasks(tasks);
+            int unknown = 0;
+            int complete = 0;
+            int queued = 0;
+            int aborted = 0;
+            int submitted = 0;
+            int active = 0;
+            size_t password_size = 0;
+            size_t process_id_size = 0;
+            for(size_t i =0; i < tasks.size(); i++) {
+               switch (tasks[i]->state()) {
+                  case NState::UNKNOWN: unknown++; break;
+                  case NState::COMPLETE: complete++; break;
+                  case NState::QUEUED: queued++; break;
+                  case NState::ABORTED: aborted++; break;
+                  case NState::SUBMITTED: submitted++; break;
+                  case NState::ACTIVE: active++; break;
+               }
+               password_size += tasks[i]->jobsPassword().size();
+               process_id_size += tasks[i]->process_or_remote_id().size();
+            }
+            theFile << "task password_size(" << password_size << ") process_id_size(" << process_id_size << ")   total = " << (password_size + process_id_size) << endl;
+            theFile << "unknown: " << unknown << "\n";
+            theFile << "complete: " << complete << "\n";
+            theFile << "queued: " << queued << "\n";
+            theFile << "aborted: " << aborted << "\n";
+            theFile << "submitted: " << submitted << "\n";
+            theFile << "active: " << active << "\n";
+            theFile << *full_defs.get();
+            PrintStyle::setStyle(st);
+         }
+#endif
+         std::string errorMsg;
+         BOOST_REQUIRE_MESSAGE( full_defs->checkInvariants(errorMsg),"Invariants failed " << errorMsg);
+
+         // record the number of times that the server updated the calendar. Allow debug of time dependencies
+         serverUpdateCalendarCount_ = full_defs->updateCalendarCount();
+
+         BOOST_FOREACH(suite_ptr s, full_defs->suiteVec()) {
+            if (s->state() == NState::COMPLETE) completeSuiteCnt++;
+            if (s->hasAutoCancel()) hasAutoCancel++;
+         }
+
+#ifdef DEBUG_TEST_WAITER_DEFS
+         cout << "\nPrinting Defs ==================================================================================\n";
+         std::cout << *full_defs.get();
+         cout << "completeSuiteCnt = " << completeSuiteCnt
+                  << " full_defs->suiteVec().size() = " <<  full_defs->suiteVec().size()
+                  << " hasAutoCancel = " << hasAutoCancel << "\n";
+#endif
+         if ( (full_defs->suiteVec().size() == completeSuiteCnt)  && (hasAutoCancel == 0)) {
+
+            if ( verifyAttr && verify_attribute_verification()) {
+               // Do verification of expected state changes
+               string localErrorMessage;
+               BOOST_REQUIRE_MESSAGE(full_defs->verification(localErrorMessage),localErrorMessage << "\n" << *full_defs.get());
+            }
+            return full_defs;
+         }
+      }
+
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+         // Give clues why we are not finishing on time, by using Why and by dumping out node tree
+         cout << "Test time " << assertTimer.duration() << " taking longer than time constraint of " << assertTimer.timeConstraint() << " aborting\n";
+         cout << "   completeSuiteCnt = " << completeSuiteCnt << "\n";
+         cout << "   full_defs->suiteVec().size() = " <<  full_defs->suiteVec().size() << "\n";
+         cout << "   hasAutoCancel = " << hasAutoCancel << "\n";
+         std::cout << "update-calendar-count(" << serverUpdateCalendarCount_ << ")\n";
+         std::cout << "WHY:\n";
+         WhyCmd reason(full_defs, "" /* do a top down why */ );
+         std::cout << reason.why() << "\n";
+      }
+      BOOST_REQUIRE_MESSAGE(assertTimer.duration() <  assertTimer.timeConstraint(),"\n" << *full_defs);
+      if ( assertTimer.duration() >= assertTimer.timeConstraint()) break; // fix warning on AIX
+
+      // auto adjust sleep time.
+      sleepTime = timer.duration() + sleep_fudgeFactor;
+   }
+   return defs_ptr();
+}
+
+
+void ServerTestHarness::createDirAndEcfFiles(
+         NodeContainer* nc,
+         const std::string& smshome,
+         const std::map<std::string,std::string>& customTaskSmsMap,
+         int& customSmsCnt) const
+{
+   std::string directory =  smshome + nc->absNodePath();
+#ifdef DEBUG_TEST_HARNESS
+   cout << "creating directory  " << directory << "\n";
+#endif
+
+   if ( !fs::exists( smshome ) )    fs::create_directory( smshome );
+   if ( !fs::exists( directory ) )  fs::create_directory( directory );
+
+   if ( generateManFileForNodeContainers_ ) {
+      std::string manFileName = smshome + nc->absNodePath() + File::MAN_EXTN();
+      std::ofstream theManFile( manFileName.c_str() );
+      theManFile << "%manual\n";
+      theManFile << "This file auto generated by ServerTestHarness::createDirAndEcfFiles for all Node Containers\n";
+      theManFile << "%end\n";
+   }
+
+   BOOST_FOREACH(node_ptr n, nc->nodeVec()) {
+
+      Task* t = n->isTask();
+      if (t) {
+         std::string ecf_file =  smshome + t->absNodePath() + File::ECF_EXTN();
+#ifdef DEBUG_TEST_HARNESS
+         cout << "creating ecf file  " << ecf_file << "\n";
+#endif
+         // Create ECF file with default template or custom  file.
+         std::ofstream theEcfFile( ecf_file.c_str() );
+         std::map<std::string,std::string>::const_iterator it = customTaskSmsMap.find(t->absNodePath());
+         if (it == customTaskSmsMap.end()) theEcfFile << getDefaultTemplateEcfFile(t);
+         else  {
+            theEcfFile << (*it).second;
+            customSmsCnt++;
+         }
+      }
+      else {
+         Family* f = n->isFamily();
+         assert(f);
+         createDirAndEcfFiles(f,smshome,customTaskSmsMap,customSmsCnt);
+      }
+   }
+}
+
+
+std::string ServerTestHarness::getDefaultTemplateEcfFile(Task* t) const
+{
+   std::string templateEcfFile;
+
+   templateEcfFile += "%manual\n";
+   templateEcfFile += "This is the default ecf script file used for testing\n";
+   templateEcfFile += "%end\n";
+   templateEcfFile += "%comment\n";
+   templateEcfFile += "# Using angle brackets should use ECF_INCLUDE\n";
+   templateEcfFile += "%end\n";
+   templateEcfFile += "%include <head.h>\n";
+   templateEcfFile += "\n";
+   BOOST_FOREACH(const Event& e, t->events()) {
+      templateEcfFile += "%ECF_CLIENT_EXE_PATH% --event=" + e.name_or_number() + "\n";
+   }
+   BOOST_FOREACH(const Meter& m, t->meters()) {
+      templateEcfFile += "for i in";
+      int min = m.min();
+      int max = m.max();
+      int delta = abs(max -min)/10;
+      for(int i = min+delta; i <= max; i = i + delta) {
+         templateEcfFile += " ";
+         templateEcfFile += boost::lexical_cast<std::string>(i);
+      }
+      templateEcfFile += "\n";
+      templateEcfFile += "do\n";
+      templateEcfFile += "   %ECF_CLIENT_EXE_PATH% --meter=" + m.name() + " $i\n";
+      templateEcfFile += "   sleep %SLEEPTIME%\n";
+      templateEcfFile += "done\n";
+   }
+   /// labels require at least 2 arguments,
+   BOOST_FOREACH(const Label& label, t->labels()) {
+      if (!label.new_value().empty()) {
+         templateEcfFile += "%ECF_CLIENT_EXE_PATH% --label=" + label.name() + " " + label.new_value() + "\n";
+      }
+      else if (!label.value().empty()) {
+         templateEcfFile += "%ECF_CLIENT_EXE_PATH% --label=" + label.name() + " " + label.value() + "\n";
+      }
+   }
+   if (add_default_sleep_time_ && t->events().empty() && t->meters().empty()) {
+      templateEcfFile += "\n# SLEEPTIME is defined the Client Defs.def file. Test variable substitution\n";
+      templateEcfFile += "sleep %SLEEPTIME%\n";
+   }
+   templateEcfFile += "\n%include <tail.h>\n";
+   return templateEcfFile;
+}
+
+std::string ServerTestHarness::testDataDefsLocation( const std::string& defsFile)
+{
+   // DefsFile is of the form base_name.def"
+   // We want to place the defs and log file in the same location as its test directory
+   // 		test/data/ECF_HOME/base_name/base_name.def
+   std::string testData = testDataLocation(defsFile) + "/" + defsFile;
+   return testData;
+}
+
+std::string ServerTestHarness::testDataLocation( const std::string& defsFile)
+{
+   // DefsFile is of the form:
+   //                           base_name.def
+   //                           /tmp/path/base_name.def
+   // We want to place the defs and log file in the same location as its test directory
+   // 		test/data/ECF_HOME/base_name
+   //
+   std::string base_name = defsFile;
+   size_t slash_pos = defsFile.rfind('/',defsFile.length());
+   if ( slash_pos != std::string::npos) {
+      base_name = base_name.erase(0,slash_pos+1);
+   }
+
+   size_t dot_pos = base_name.rfind('.',base_name.length());
+   assert( dot_pos != std::string::npos); // missing '.'
+   base_name =  base_name.substr(0,dot_pos);
+
+
+   std::string testData = TestFixture::smshome() + "/" + base_name;
+   return testData;
+}
diff --git a/ecflow_4_0_7/Test/src/ServerTestHarness.hpp b/ecflow_4_0_7/Test/src/ServerTestHarness.hpp
new file mode 100644
index 0000000..37c5265
--- /dev/null
+++ b/ecflow_4_0_7/Test/src/ServerTestHarness.hpp
@@ -0,0 +1,109 @@
+#ifndef SERVERTESTHARNESS_HPP_
+#define SERVERTESTHARNESS_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #46 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <map>
+#include "NodeFwd.hpp"
+#include "ZombieUtil.hpp"
+class ClientInvoker;
+
+// This class provides a test harness for running defs file in a client server environment
+// To avoid Address in use errors, we can have client/server use a different port number
+// This is more important when doing instrumentation in HP-UX, as that can take a long time.
+//
+// The Server is started/stopped by use of the Global text Fixture
+// See class TestFixture.hpp
+//
+class ServerTestHarness : private boost::noncopyable {
+public:
+	// if standardVerification is true, we test task goes through normal life cycle
+	// changes. else we compare the log file states with golden log file
+	// Comparing log files across platforms is not reliable, and ignored
+  	ServerTestHarness();
+
+  	/// generate man files for Suite and family nodes
+  	void generateManFileForNodeContainers() { generateManFileForNodeContainers_ = true; }
+
+  	/// Enable/disable checking for server poll being to small.
+  	/// This test creates dummy .ecf files. Since these tests are run with the server poll
+  	/// which is less than 60, we need the task duration between submit->active->complete duration to be less
+  	/// the server poll. Tests with time dependencies of one minute separation will be missed.\n"
+   /// Make this configurable since for large defs, when we have 1000's of tasks the
+  	/// task duration times are not deterministic
+  	void check_task_duration_less_than_server_poll(bool f) { check_task_duration_less_than_server_poll_ =  f;}
+
+  	/// Sometimes on slow systems we want to disable sleep time.
+  	/// since the time duration between submit->active->complete is greater than job submission interval
+  	/// and hence time slots get missed.
+  	/// The Default is to add the sleep time always for events and meters and when there is NO events or meters
+  	/// This flags is used for the *specific* case when there is *no* events/meters.
+  	void add_default_sleep_time(bool f) { add_default_sleep_time_ = f ;}
+
+	// Run the following defs file in the test harness.
+	// If no map is provided then a default sms file is fabricated, otherwise
+	// the map allows a sms file string to be associated with a task path
+	// map.first = absolute task path
+	// map.second =  sms file string
+#if defined(_AIX)
+   void run(Defs&, const std::string& defs_file, const std::map<std::string,std::string>&, int timeout = 120, bool waitForTestCompletion = true);
+   void run(Defs&, const std::string& defs_file, int timeout = 120,bool waitForTestCompletion = true);
+#elif defined(HPUX)
+   void run(Defs&, const std::string& defs_file, const std::map<std::string,std::string>&, int timeout = 100, bool waitForTestCompletion = true);
+   void run(Defs&, const std::string& defs_file, int timeout = 100,bool waitForTestCompletion = true);
+#else
+ 	void run(Defs&, const std::string& defs_file, const std::map<std::string,std::string>&, int timeout = 40, bool waitForTestCompletion = true);
+	void run(Defs&, const std::string& defs_file, int timeout = 40,bool waitForTestCompletion = true);
+#endif
+
+	/// Returns the location of the defs file, such thats it in the test data area
+	static std::string testDataDefsLocation( const std::string& defsFile);
+
+	/// The test data location
+	static std::string testDataLocation( const std::string& defsFile);
+
+
+	/// This function is used for waiting for test to finish
+	/// returns the defs from the server at test completeion
+	defs_ptr testWaiter( const Defs& theClientDefs,// The defs on the client side
+ 	                      int timeout,              // How long should we wait for test to finish
+ 	                      bool verifyAttr);         // Test verification use verify attributes on defs
+
+	/// for debug return the number of times the calendar was updated in the server
+	unsigned int serverUpdateCalendarCount() const { return serverUpdateCalendarCount_;}
+private:
+
+	defs_ptr doRun(Defs&, const std::map<std::string,std::string>&, int sleepTime,bool waitForTestCompletion);
+
+	void createDirAndEcfFiles(
+	   NodeContainer* nc,
+	   const std::string& smshome,
+	   const std::map<std::string,std::string>& taskSmsMap,
+	   int& customSmsCnt) const;
+
+	/// default ecf file will cater for events and meters
+  	std::string getDefaultTemplateEcfFile(Task* t) const;
+
+private:
+	bool generateManFileForNodeContainers_;
+	bool check_task_duration_less_than_server_poll_;
+	bool add_default_sleep_time_;
+	int serverUpdateCalendarCount_;
+	std::string defs_filename_;
+};
+#endif
diff --git a/ecflow_4_0_7/Test/src/TestFixture.cpp b/ecflow_4_0_7/Test/src/TestFixture.cpp
new file mode 100644
index 0000000..303135c
--- /dev/null
+++ b/ecflow_4_0_7/Test/src/TestFixture.cpp
@@ -0,0 +1,381 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #77 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description : This Fixture facilitates the test of client/server on different platforms
+//============================================================================
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/lexical_cast.hpp>
+#include <iostream>
+#include <stdlib.h> // for getenv()
+#include <fstream>  // for ofstream
+
+#include "TestFixture.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "ClientEnvironment.hpp" // needed for static ClientEnvironment::hostSpecified(); ONLY
+#include "File.hpp"
+#include "TestHelper.hpp"
+#include "Str.hpp"
+#include "CtsApi.hpp"
+#include "PrintStyle.hpp"
+#include "Host.hpp"
+#include "ChangeMgrSingleton.hpp" // keep valgrind happy
+#include "Rtt.hpp"
+#include "EcfPortLock.hpp"
+
+#ifdef DEBUG
+std::string rtt_filename = "rtt.dat";
+#else
+std::string rtt_filename = "rtt_d.dat";
+#endif
+std::string TestFixture::scratchSmsHome_ = "";
+std::string TestFixture::host_;
+std::string TestFixture::port_;
+std::string TestFixture::test_dir_;
+std::string TestFixture::project_test_dir_ = "Test";
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+// ************************************************************************************************
+// For test purpose the server can be started:
+// 	1/ By this test fixture
+//  2/ Externally but on the same machine. by defining env variable: export ECF_NODE=localhost
+// 	   WHY? To test for memory leak. (i.e. with valgrind)
+//  3/ Externally but on a different platform. by defining env variable: export ECF_NODE=itanium
+//     In this case we NEED to copy the test data, so that it is
+//     accessible by the client AND server
+//
+//  When invoking the server Externally _MUST_ use   .
+//			./Server/bin/gcc.<version>/debug/server --ecfinterval=2
+//       	The --ecfinterval=2 is _important_ or test will take a long time
+// ************************************************************************************************
+
+// Uncomment to preserve the files for test
+//#define DEBUG_HOST_SERVER 1
+#define DEBUG_LOCAL_SERVER 1
+
+TestFixture::TestFixture(const std::string& project_test_dir)
+{
+   init(project_test_dir);
+}
+
+TestFixture::TestFixture()
+{
+   init("Test");
+}
+
+ClientInvoker& TestFixture::client()
+{
+   static ClientInvoker theClient_;
+   return theClient_;
+}
+
+
+void TestFixture::init(const std::string& project_test_dir)
+{
+   TestFixture::project_test_dir_ = project_test_dir;
+
+   if ( !fs::exists( local_ecf_home() ) )  fs::create_directory( local_ecf_home() );
+
+   // client side file for recording all ClientInvoker round trip times
+   boost::filesystem::remove(rtt_filename);
+   Rtt::create(rtt_filename);
+
+   // ********************************************************
+   // Note: Global fixture Constructor can not use BOOST macro
+   // ********************************************************
+   PrintStyle::setStyle(PrintStyle::STATE);
+
+   // Let first see if we need do anything. If ECF_NODE is specified (ie the name
+   // of the machine, which has the ecflow server), only then do we need to do anything.
+   // The server must have access to the file system specified by ECF_HOME.
+   // This becomes an issue when the server is on a different machine
+   host_ = ClientEnvironment::hostSpecified();
+   port_ = ClientEnvironment::portSpecified(); // returns ECF_PORT, otherwise Str::DEFAULT_PORT_NUMBER
+   std::cout << "TestFixture::TestFixture()  jobSubmissionInterval = " << job_submission_interval() << "\n";
+   if (!host_.empty() && host_ != Str::LOCALHOST()) {
+
+      client().set_host_port(host_,port_);
+      std::cout << "   EXTERNAL SERVER running on _ANOTHER_ PLATFORM, assuming " << host_ << ":" << port_ << " copying test data ...\n";
+
+      // Must use a file system accessible from the server. Use $SCRATCH
+      // Duplicate test data, required to scratch area and reset ECF_HOME
+      char* scratchEnv = getenv("SCRATCH");
+      assert(scratchEnv != NULL);
+      std::string theSCRATCHArea(scratchEnv);
+      assert(!theSCRATCHArea.empty());
+
+      theSCRATCHArea += "/test_dir";
+      test_dir_ = theSCRATCHArea;  // test_dir_ needed in destructor
+      if (boost::filesystem::exists(test_dir_)) {
+         boost::filesystem::remove_all(test_dir_);
+      }
+      theSCRATCHArea += "/ECF_HOME";
+      scratchSmsHome_ = theSCRATCHArea;
+
+      bool ok = File::createDirectories(theSCRATCHArea); assert(ok);
+      ok = fs::exists(theSCRATCHArea); assert(ok);
+
+      // Ensure that local includes data exists. This needs to be copied to SCRATCH
+      ok = fs::exists(includes()); assert(ok);
+
+      // Copy over the includes directory to the SCRATCH area.
+      std::string scratchIncludes = test_dir_ + "/";
+      std::string do_copy = "cp -r " + includes() + " " + scratchIncludes;
+      if (system( do_copy.c_str() ) != 0)  assert(false);
+
+      // clear log file
+      clearLog();
+   }
+   else if (!host_.empty() && host_ == Str::LOCALHOST()) {
+
+      client().set_host_port(host_,port_);
+      std::cout << "   EXTERNAL SERVER running on _SAME_ PLATFORM. Assuming " << host_ << ":" << port_ << "\n";
+
+      // log file may have been deleted, by previous tests. Create a new log file
+      std::string the_log_file = TestFixture::pathToLogFile();
+      if ( !fs::exists( the_log_file )) {
+         std::cout << "   Log file " << the_log_file << " does NOT exist, attempting to recreate\n";
+         std::cout << "   Creating new log(via remote server) file " << the_log_file  << "\n";
+         client().new_log( the_log_file );
+         client().logMsg("Created new log file. msg sent to force new log file to be written to disk");
+      }
+      else std::cout << "   Log file " << the_log_file << " already exist\n";
+   }
+   else {
+      // For local host start by removing log file. Server invocation should create a new log file
+      boost::filesystem::remove( boost::filesystem::path( pathToLogFile() ) );
+      host_ = Str::LOCALHOST();
+
+      // Create a unique port number, allowing debug and release to run at the same time
+      // Note: linux64 and linux64intel, can run on same machine, on different workspace
+      // Hence the lock file is not sufficient. Hence we will make a client server call.
+      cout << "Find free port to start server, starting with port " << port_ << "\n";
+      int the_port = boost::lexical_cast<int>(port_);
+      while (!EcfPortLock::is_free(the_port)) the_port++;
+      port_ = ClientInvoker::find_free_port(the_port,true /*show debug output */);
+      EcfPortLock::create(port_);
+
+      // host_ is empty update to localhost, **since** port may have changed, update ClinetInvoker
+      client().set_host_port(host_,port_);
+
+      // Remove the generated check point files, at start of test, otherwise server will load check point file
+      Host h;
+      boost::filesystem::remove(h.ecf_checkpt_file(port_));
+      boost::filesystem::remove(h.ecf_backup_checkpt_file(port_));
+
+      std::string theServerInvokePath = File::find_ecf_server_path();
+      assert(!theServerInvokePath.empty() );
+      theServerInvokePath += " --port=" +  port_ ;
+      theServerInvokePath += " --ecfinterval=" + boost::lexical_cast<std::string>( job_submission_interval() );
+      theServerInvokePath += "&";
+      if ( system( theServerInvokePath.c_str() ) != 0)  assert(false); // " Server invoke failed "
+
+      std::cout << "   ECF_NODE not specified, starting LOCAL " << theServerInvokePath << "\n";
+   }
+
+   /// Ping the server to see if its running
+   /// Assume remote/local server started on the default port
+   /// Either way, we wait for 60 seconds for server, for it to respond to pings
+   /// This is important when server is started locally. We must wait for it to come alive.
+   if (!client().wait_for_server_reply()) {
+      cout << "Ping server on " << host_ << Str::COLON() << port_ << " failed. Is the server running ? " << client().errorMsg() << "\n";
+      assert(false);
+   }
+
+   // Log file must exist, otherwise test will not work. Log file required for comparison
+   if ( !fs::exists( TestFixture::pathToLogFile() )) {
+      cout << "Log file " << TestFixture::pathToLogFile() << " does not exist\n";
+      assert(false);
+   }
+}
+
+
+TestFixture::~TestFixture()
+{
+	// Note: Global fixture Destructor can not use BOOST macro
+  	std::cout << "TestFixture::~TestFixture() " << host_ << ":" << port_ << "\n";
+
+   // destructors should not allow exception propagation
+   try {
+#ifndef DEBUG_HOST_SERVER
+      if (!host_.empty() && boost::filesystem::exists(test_dir_)) {
+         boost::filesystem::remove_all(test_dir_);
+      }
+#endif
+#ifndef DEBUG_LOCAL_SERVER
+      if (boost::filesystem::exists(local_ecf_home())) {
+         boost::filesystem::remove_all(local_ecf_home());
+      }
+#endif
+
+      // Print the server suites
+      client().set_cli(true); // so server stats are written to standard out
+      client().set_throw_on_error( false ); // destructors should not allow exception propagation
+      if (client().suites() != 0) {
+         std::cout << "TestFixture::~TestFixture(): ClientInvoker " << CtsApi::suites() << " failed: " << client().errorMsg() << "\n";
+      }
+
+      // Print the server stats
+      if (client().stats() != 0) {
+         std::cout << "TestFixture::~TestFixture(): ClientInvoker " << CtsApi::stats() << " failed: " << client().errorMsg() << "\n";
+      }
+
+      // Kill the server, as all suites are complete. will work for local or external
+      if (client().terminateServer() != 0) {
+         std::cout << "TestFixture::~TestFixture():  ClientInvoker " << CtsApi::terminateServer() << " failed: " << client().errorMsg() << "\n";
+         EcfPortLock::remove( port_ );
+         assert(false);
+      }
+      sleep(1); // allow time to update log file
+
+      // Remove the generated check point files, at end of test
+      Host host;
+      boost::filesystem::remove(host.ecf_log_file(port_));
+      boost::filesystem::remove(host.ecf_checkpt_file(port_));
+      boost::filesystem::remove(host.ecf_backup_checkpt_file(port_));
+
+      // remove the lock file
+      EcfPortLock::remove( port_ );
+
+      // keep valgrind happy
+      ChangeMgrSingleton::destroy();
+
+      // destroy, so that we flush the rtt_filename
+      Rtt::destroy();
+
+      cout << "\nTiming: *NOTE*: The child commands *NOT* recorded. Since its a separate exe(ecflow_client), called via .ecf script\n";
+      cout << Rtt::analyis(rtt_filename); // report round trip times
+      boost::filesystem::remove(rtt_filename);
+   }
+ 	catch (std::exception& ex) {
+ 	   std::cout << "TestFixture::~TestFixture() caught exception " << ex.what() << "\n";
+ 	}
+ 	catch (...) {
+      std::cout << "TestFixture::~TestFixture() caught unknown exception\n";
+ 	}
+}
+
+int TestFixture::job_submission_interval()
+{
+   int jobSubmissionInterval = 3 ;
+#if defined(HPUX) || defined(_AIX)
+   jobSubmissionInterval += 3;
+#endif
+   return jobSubmissionInterval;
+}
+
+std::string TestFixture::smshome()
+{
+	if ( serverOnLocalMachine() )
+		return local_ecf_home();
+	return scratchSmsHome_;
+}
+
+bool TestFixture::serverOnLocalMachine() {
+	return (host_.empty() || host_ == Str::LOCALHOST());
+}
+
+std::string TestFixture::theClientExePath()
+{
+	if ( serverOnLocalMachine() ) return File::find_ecf_client_path();
+
+	char* client_path_p = getenv("ECF_CLIENT_EXE_PATH");
+	if ( client_path_p == NULL) {
+
+		// Try this before complaining
+      std::string path = "/usr/local/apps/ecflow/current/bin/ecflow_client";
+ 		if ( fs::exists(path) ) return path;
+
+		cout << "Please set ECF_CLIENT_EXE_PATH. This needs to be set to path to the client executable\n";
+		cout << "The client must be the one that was built on the same platform as the server\n";
+		assert(false);
+   }
+ 	return string(client_path_p);
+}
+
+void TestFixture::clearLog() {
+
+	// Can't remove log on remote server, just clear the log file
+   client().clearLog();
+}
+
+std::string TestFixture::pathToLogFile()
+{
+	if ( serverOnLocalMachine() )  {
+		Host host;
+		return host.ecf_log_file(port_);
+	}
+
+	char* pathToRemoteLog_p = getenv("ECF_LOG");
+	if ( pathToRemoteLog_p == NULL) {
+		cout << "TestFixture::pathToLogFile(): assert failed\n";
+		cout << "Please set ECF_LOG. This needs to be set to path to the log file\n";
+		cout << "that can be seen by the client and server\n";
+		assert(false);
+  	}
+	return std::string(pathToRemoteLog_p);
+}
+
+std::string TestFixture::local_ecf_home()
+{
+   std::string rel_path = project_test_dir_;
+#ifdef DEBUG
+   rel_path += "/data/ECF_HOME_debug";
+#else
+   rel_path += "/data/ECF_HOME_release";
+#endif
+
+   std::string absolute_path = File::test_data(rel_path,project_test_dir_);
+   return absolute_path;
+}
+
+std::string TestFixture::includes()
+{
+   // Get to the root source directory
+   std::string includes_path = File::root_source_dir();
+   includes_path += "/";
+   includes_path += project_test_dir_;
+   includes_path += "/data/includes";
+   //std::cout << "includes_path = " << includes_path << " ==============================================\n";
+   return includes_path;
+}
+
+
+/// Given a task name like "a" find the find the first task matching that name
+/// and returns is abs node path
+std::string TestFixture::taskAbsNodePath(const Defs& theDefs, const std::string& taskName)
+{
+	std::vector<Task*> vec;
+	theDefs.getAllTasks(vec);
+	BOOST_FOREACH(Task* t , vec ) {
+		if (t->name() == taskName) return t->absNodePath();
+	}
+
+	cout << "TestFixture::taskAbsNodePath: assert failed: Could not find task " << taskName << "\n";
+	assert(false); // could not find the task ??
+	return string();
+}
+
+int TestFixture::server_version()
+{
+   client().server_version();
+   std::string the_server_version_str = TestFixture::client().get_string();
+   //cout << "\nserver_version_str = " << the_server_version_str << "\n";
+   BOOST_REQUIRE_MESSAGE( Str::replace_all(the_server_version_str,".",""),"failed to find '.' in server version string " << TestFixture::client().get_string());
+   int the_server_version = boost::lexical_cast<int>(the_server_version_str);
+   return the_server_version;
+}
diff --git a/ecflow_4_0_7/Test/src/TestFixture.hpp b/ecflow_4_0_7/Test/src/TestFixture.hpp
new file mode 100644
index 0000000..e04e6ac
--- /dev/null
+++ b/ecflow_4_0_7/Test/src/TestFixture.hpp
@@ -0,0 +1,103 @@
+#ifndef TESTFIXTURE_HPP_
+#define TESTFIXTURE_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This Fixture facilitates the test of client/server on different platforms
+//
+// In order to carry out the test, we must have a common file system.
+// We will use $SCRATCH as this is accessible by both client and server.
+// This means copying over the test data
+//
+// When TextFixture is GLOBAL, then we can't seem to call any of the
+// BOOST_REQUIRE_MESSAGE() macro in constructor/descructor as this causes a crash
+// i.e order of initialisation issues
+//============================================================================
+
+#include "ClientInvoker.hpp"
+#include <string>
+class Defs;
+
+//
+// Need to use static data, since with boost global fixture, its not possible to access
+// the global test fixture in each of the test cases
+//
+struct TestFixture {
+
+	// Constructor will invoke the server, destructor will kill the server
+	// Since this class is static, the constructor/destructor can not call
+	// any of BOOST MACRO, since the unit test will not be there.
+	// When running across platforms will will assume server is already running
+   TestFixture(const std::string& project_test_dir /* Test or view */);
+   TestFixture();
+	~TestFixture();
+
+	// Configure the server with the job submission interval.
+	// i.e for each 'n' seconds of job submission interval the calendar
+	// is typically incremented by 1 minute. Hence speeding up the
+	// time and thus the testing. See Calendar for further details
+	static int job_submission_interval();
+
+	/// The location of ECF home will vary. If client/server on same machines we
+	/// return test data location. Otherwise we need return a common file system location
+	/// that was created in the constructor
+	static std::string smshome();
+
+	/// Will end up checking to see if ECF_NODE is specified. This specifies the name
+	/// of the machine that is running the server. Otherwise return true
+	static bool serverOnLocalMachine();
+
+	/// If running locally returns  location of client exe, if a server is on a remote
+	/// machine, we need to determine its location.
+ 	// Several options:
+	//    a/ Search for hard code path
+	//    b/ Ask server about test data, i.e. client exe path, log file location , etc
+	//       More flexible
+	static std::string theClientExePath();
+
+	/// When multiple tests are run , we need to clear the log file
+	static void clearLog();
+
+	/// When local just returns ecf.log, when remote return path to log file
+	static std::string pathToLogFile();
+
+	/// Given a task name like "a" find the find the first task matching that name
+	/// and returns is abs node path
+	static std::string taskAbsNodePath(const Defs& theDefs, const std::string& taskName);
+
+	/// Location of the includes used in the ecf file
+	static std::string includes();
+
+	/// returns the server version as an integer.
+	/// This allows as to ignore some tests, when testing old servers.(with new clients).
+	static int server_version();
+
+	// Use for all comms with server
+	static ClientInvoker& client();
+	static std::string port() { return port_;}
+
+private:
+
+	static std::string local_ecf_home();
+
+   void init(const std::string& project_test_dir);
+
+private:
+
+	static std::string scratchSmsHome_;
+	static std::string host_;
+	static std::string port_;
+   static std::string test_dir_;          // used when we have an external server, different platform
+   static std::string project_test_dir_;  // "Test" or "view"
+};
+
+#endif
diff --git a/ecflow_4_0_7/Test/src/ZombieUtil.hpp b/ecflow_4_0_7/Test/src/ZombieUtil.hpp
new file mode 100644
index 0000000..0426bc3
--- /dev/null
+++ b/ecflow_4_0_7/Test/src/ZombieUtil.hpp
@@ -0,0 +1,38 @@
+#ifndef ZOMBIE_UTIL_HPP_
+#define ZOMBIE_UTIL_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #57 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include <boost/noncopyable.hpp>
+#include "Child.hpp"
+class ClientInvoker;
+
+//
+class ZombieUtil : private boost::noncopyable {
+public:
+   static void test_clean_up(int timeout);
+   static int do_zombie_user_action(ecf::User::Action uc,
+                                    int expected_action_cnt,
+                                    int max_time_to_wait,
+                                    bool fail_if_to_long = true);
+};
+
+class TestClean : private boost::noncopyable {
+public:
+   TestClean(int timeout = 25) : timeout_(timeout)  { ZombieUtil::test_clean_up(timeout);}
+   ~TestClean() { ZombieUtil::test_clean_up(timeout_);}
+private:
+   int timeout_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/Test/src/ZombieUtill.cpp b/ecflow_4_0_7/Test/src/ZombieUtill.cpp
new file mode 100644
index 0000000..eafd490
--- /dev/null
+++ b/ecflow_4_0_7/Test/src/ZombieUtill.cpp
@@ -0,0 +1,184 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #57 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include <iostream>
+#include <boost/test/unit_test.hpp>
+
+#include "ZombieUtil.hpp"
+
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "PrintStyle.hpp"
+#include "ClientToServerCmd.hpp"
+#include "AssertTimer.hpp"
+#include "Zombie.hpp"
+#include "TestFixture.hpp"
+
+using namespace std;
+using namespace ecf;
+
+void ZombieUtil::test_clean_up(int timeout) {
+
+   // try to tidy up. Avoid leaving zombie process that mess up tests
+   TestFixture::client().zombieGet();
+   std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+   if (!zombies.empty()) {
+      cout << "\n***** test_clean_up: found\n" << Zombie::pretty_print( zombies , 9) << "\n, attempting to *fob* then *remove* ...\n";
+
+      int no_fobed = do_zombie_user_action(User::FOB, zombies.size(), timeout, false /* don't fail if it takes to long */);
+
+      // In order to FOB, we must wait, till a child command, talks to the server.
+      if (no_fobed) {
+         int wait = 5;
+#if defined(HPUX) || defined(_AIX)
+         wait += 5; // On these platforms wait longer,
+#endif
+         cout << "   Fobed " << no_fobed << " left over zombies. sleeping for " << wait << "s before attempting to remove\n";
+         sleep(wait);
+      }
+      (void) do_zombie_user_action(User::REMOVE, no_fobed, timeout, false /* don't fail if it takes to long */);
+   }
+}
+
+int ZombieUtil::do_zombie_user_action(User::Action uc, int expected_action_cnt, int max_time_to_wait, bool fail_if_to_long)
+{
+   /// return the number of zombies set to user action;
+   bool ecf_debug_zombies = false;
+   if (getenv("ECF_DEBUG_ZOMBIES")) {
+      ecf_debug_zombies = true;
+      cout << "\n   do_zombie_user_action " << User::to_string(uc) << " expected_action_cnt " << expected_action_cnt << "\n";
+   }
+
+   int action_set =  0;
+   std::vector<Zombie> action_set_zombies;
+   AssertTimer assertTimer(max_time_to_wait,false); // Bomb out after n seconds, fall back if test fail
+   while (1) {
+      BOOST_REQUIRE_MESSAGE(TestFixture::client().zombieGet() == 0, "zombieGet failed should return 0\n" << TestFixture::client().errorMsg());
+      std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+      bool continue_looping = false;
+      BOOST_FOREACH(const Zombie& z, zombies) {
+         switch (uc) {
+            case User::FOB: {
+               if (!z.fob()) {
+                  TestFixture::client().zombieFob(z); // UNBLOCK, child commands, allow zombie to complete, will clear server_reply().zombies()
+                  continue_looping = true;
+                  action_set++;
+                  action_set_zombies.push_back(z);
+               }
+               break;
+            }
+            case User::FAIL: {
+               if (!z.fail()) {
+                  TestFixture::client().zombieFail(z); // UNBLOCK, child commands, allow zombie to complete, will clear server_reply().zombies()
+                  continue_looping = true;
+                  action_set++;
+                  action_set_zombies.push_back(z);
+               }
+               break;
+            }
+            case User::ADOPT: {
+               if (!z.adopt()) {
+                  TestFixture::client().zombieAdopt(z); // UNBLOCK, child commands, allow zombie to complete, will clear server_reply().zombies()
+                  continue_looping = true;
+                  action_set++;
+                  action_set_zombies.push_back(z);
+               }
+               break;
+            }
+            case User::REMOVE: {
+               if (!z.remove()) {             // should always return false
+                  TestFixture::client().zombieRemove(z);  // This should be immediate, and is not remembered
+                  continue_looping = true;
+                  action_set++;
+                  action_set_zombies.push_back(z);
+               }
+               break;
+            }
+            case User::BLOCK:  {
+               if (!z.block()) {
+                  TestFixture::client().zombieBlock(z);
+                  continue_looping = true;
+                  action_set++;
+                  action_set_zombies.push_back(z);
+               }
+               break;
+            }
+            case User::KILL:  {
+                if (!z.kill()) {
+                   TestFixture::client().zombieKill(z);
+                   continue_looping = true;
+                   action_set++;
+                   action_set_zombies.push_back(z);
+                }
+                break;
+             }
+         }
+      }
+
+      if (expected_action_cnt == action_set) {
+         break; // return
+      }
+
+      if ( !continue_looping  && action_set > 0) {
+         if (expected_action_cnt == 0) break;          // return, some clients set this as 0
+         if (expected_action_cnt == action_set) break; // return
+      }
+
+      // make sure test does not take too long.
+      if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
+
+         if (expected_action_cnt > 0 && action_set > 0) {
+            if (ecf_debug_zombies) cout << "   timeing out after action_set = " << action_set << " expected_action_cnt = " << expected_action_cnt << "\n";
+            break;
+         }
+
+         std::stringstream ss;
+         ss << "do_zombie_user_action:\nExpected " << expected_action_cnt
+            << " zombies with user action " << User::to_string(uc) << " but found " << action_set << "\naction set zombies\n"
+            << Zombie::pretty_print( action_set_zombies , 6)
+            << ", Test taking longer than time constraint of "
+            << assertTimer.timeConstraint();
+         if (fail_if_to_long) {
+            BOOST_REQUIRE_MESSAGE(false,ss.str() << " aborting\n" << Zombie::pretty_print( zombies , 6));
+         }
+         else {
+            cout << ss.str() << " breaking out\n" << Zombie::pretty_print( zombies , 6) << "\n";
+            break;
+         }
+      }
+      sleep(1);
+   }
+
+   // return the real state of the server zombies.
+   // *** Note: remove is immediate hence z.remove() below is not valid
+   action_set = 0;
+   BOOST_REQUIRE_MESSAGE(TestFixture::client().zombieGet() == 0, "zombieGet failed should return 0\n" << TestFixture::client().errorMsg());
+   std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+   BOOST_FOREACH(const Zombie& z, zombies) {
+      switch (uc) {
+         case User::FOB:    { if (z.fob())    action_set++; break; }
+         case User::FAIL:   { if (z.fail())   action_set++; break; }
+         case User::ADOPT:  { if (z.adopt())  action_set++; break; }
+         case User::REMOVE: { if (z.remove()) action_set++; break; }
+         case User::BLOCK:  { if (z.block())  action_set++; break; }
+         case User::KILL:   { if (z.kill())   action_set++; break; }
+      }
+   }
+   if (ecf_debug_zombies) {
+      cout << "   " << action_set << " zombies set to user action " << User::to_string(uc) << " returning\n";
+      cout << Zombie::pretty_print( zombies , 6);
+   }
+   return action_set;
+}
diff --git a/ecflow_4_0_7/VERSION.cmake b/ecflow_4_0_7/VERSION.cmake
new file mode 100644
index 0000000..488b1fd
--- /dev/null
+++ b/ecflow_4_0_7/VERSION.cmake
@@ -0,0 +1,7 @@
+set( ECFLOW_RELEASE  "4" )
+set( ECFLOW_MAJOR    "0" )
+set( ECFLOW_MINOR    "7" )
+
+# use this form to be consistent with other packages, + allow standard extraction of version from scripts
+# could replaced "4.0.7" with "${ECFLOW_RELEASE}.${ECFLOW_MAJOR}.${ECFLOW_MINOR}"
+set( ${PROJECT_NAME}_VERSION_STR  "4.0.7" )
diff --git a/ecflow_4_0_7/boost-build.jam b/ecflow_4_0_7/boost-build.jam
new file mode 100644
index 0000000..bada444
--- /dev/null
+++ b/ecflow_4_0_7/boost-build.jam
@@ -0,0 +1,45 @@
+# Copyright (C) 2002-2003 David Abrahams.
+# Copyright (C) 2002-2003 Vladimir Prus.
+# Copyright (C) 2003,2007 Rene Rivera.
+# Use, modification and distribution are subject to the
+# Boost Software License, Version 1.0. (See accompanying file
+# LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+# This is the initial file loaded by Boost Jam when run from any Boost library
+# folder. It allows us to choose which Boost Build installation to use for
+# building Boost libraries. Unless explicitly selected using a command-line
+# option, the version included with the Boost library distribution is used (as
+# opposed to any other Boost Build version installed on the user's sytem).
+
+# ----------------------------------------------------------------------------
+# The two rules were added because, boost build < 1.56 have always been in
+#         $(BOOST_ROOT)/tools/build/v2
+# However for version >= 1.56, boost build is found in:
+#         $(BOOST_ROOT)/tools/build/src
+# This allows both to be searched.
+# ---------------------------------------------------------------------------
+local rule if-has-file ( file + : dir * )
+{
+  local result ;
+  if $(dir)
+  {
+    result = [ GLOB $(dir) : $(file) ] ;
+  }
+  return $(result[1]:P) ;
+}
+
+local boost-build-src = [ if-has-file bootstrap.jam :
+  [ MATCH --boost-build=(.*) : $(ARGV) ]
+  $(BOOST_BUILD_PATH)
+  $(BOOST_ROOT)/tools/build/v2
+  $(BOOST_ROOT)/tools/build/src
+] ;
+
+boost-build $(boost-build-src) ;
+
+# ------------------------------------------------------------------------------
+# Old
+#BOOST_BUILD = [ MATCH --boost-build=(.*) : $(ARGV) ] ;
+#BOOST_BUILD ?= $(BOOST_ROOT)/tools/build/v2 ;
+#BOOST_BUILD ?= $(BOOST_ROOT)/tools/build/src ;
+#boost-build $(BOOST_BUILD) ;
diff --git a/ecflow_4_0_7/build/aix_fix/README b/ecflow_4_0_7/build/aix_fix/README
new file mode 100644
index 0000000..8ad8a5d
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/README
@@ -0,0 +1,118 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+Boost 1.44
+=================================================================================
+force_include.hpp needs to be moved to boost/serialization/force_include.hpp
+This file fixes serialization via base ptr bugs, for Boost version < 1.44
+
+
+Boost 1.45, Serialisation crashes in release mode.
+==================================================================================
+
+FROM IBM:
+We have a Boost patch fix that fixes Serialization library runtime problems experienced at -O3
+
+The symptom's root cause is in singleton pattern of Serialization library that uses static object
+that is created but not referenced. 
+A trick in the library code is used to make a reference to this object by passing 
+it to a function with empty body to keep it around for static initialization. 
+Our optimizer aggressively inlines away the function with empty body, eliminating 
+this trick of a reference. This explains why turning off inlining also works. 
+Ensuring that we don't inline away this function will keep the static object around.
+
+This is a questionable Boost trick which we will advise either not use, or protect under macros. 
+The fix is in your Boost header and no compiler changes are needed.
+
+The changes are in two header files attached:
+boost/serialization/force_include.hpp and
+boost/serialization/singleton.hpp
+
+(See attached file: singleton.hpp)(See attached file: force_include.hpp)
+(See attached file: header_diff_item2.txt)
+
+
+Boost 1.45
+=====================================================================================
+1/boost will will not build cleanly due to a compilation error in v3 filesystem
+the work around is to comment out the v3 file system dependencies.
+in $BOOST_ROOT/libs/filesystem/build/Jamfile.v2
+
+>>>>>> OR
+
+Change file path.hpp:
+FROM:
+  //------------------------------------------------------------------------------------//
+  //                             class path::iterator                                   //
+  //------------------------------------------------------------------------------------//
+ 
+  class path::iterator
+    : public boost::iterator_facade<
+      iterator,
+      path const,
+      boost::bidirectional_traversal_tag >
+  {
+    ....
+TO:
+  //------------------------------------------------------------------------------------//
+  //                             class path::iterator                                   //
+  //------------------------------------------------------------------------------------//
+ 
+  class path::iterator
+    : public boost::iterator_facade<
+      path::iterator,
+      path const,
+      boost::bidirectional_traversal_tag >
+  {
+    ....
+
+ie. since iterator_facade uses CRTP, the iterator is being interperted as "boost::iterator"
+    passing "path::iterator" as the template argument fixes the compile error on AIX.
+    This should be safe for other platforms as well
+
+    This has been registered as a bug. ticket #4912
+
+2/ Problems running python examples, with boost filesystem linked,
+
+
+Python: Effects all boost versions where we want to embed python interpreter in C++
+=====================================================================================
+The following exe's,on AIX, python 2.5 64 bit, acc v11.1,
+raise *hundreds* of warning messages of the type:
+     ld: 0711-224 WARNING: Duplicate symbol: _PyObject_New.
+linking with flags -bloadmap:PARM, reveals:
+
+ _Py_NoneStruct            Objects/object.c(/usr/local/python64/lib/python2.5/config/libpython2.5.a[object.o])
+    ** Duplicate **        /usr/local/python64/lib/python2.5/config/python.exp{.}
+.Py_FatalError            Python/pythonrun.c(/usr/local/python64/lib/python2.5/config/libpython2.5.a[pythonrun.o])
+    ** Duplicate **        /usr/local/python64/lib/python2.5/config/python.exp{.}
+
+It appears that the symbols are defined libpython2.5.a and in the exports file 'python.exp':
+removing the export file: -Wl,-bI:/usr/local/python64/lib/python2.5/config/python.exp 
+from the link line removes the warning messages
+
+This can be done explicitly: $BOOST_ROOT/tools/build/v2/tools/python.jam
+Go to line: 992 and comment out <linkflags>-Wl,-bI:$(libraries[1])/python.exp
+ 
+    else if $(target-os) = aix
+    {
+        alias python_for_extensions
+            :
+            : $(target-requirements)
+            :
+            : $(usage-requirements) # <linkflags>-Wl,-bI:$(libraries[1])/python.exp
+            ;
+    }
+   
+
+This is not an absolute requirement, if you can live with warnings messages.
+The notes in python.jam seems to expect them: file python.jam
+
+    # the Python framework, even when building extensions. Note that framework
+    # builds of Python always use shared libraries, so we do not need to worry
+    # about duplicate Python symbols.
+           
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/aix_fix/boost_1_53_0/README b/ecflow_4_0_7/build/aix_fix/boost_1_53_0/README
new file mode 100644
index 0000000..032d07d
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/boost_1_53_0/README
@@ -0,0 +1,11 @@
+
+Fix for thread.cpp
+===================
+
+Fix cast line 440:
+
+from:
+   BOOST_VERIFY(!pthread_delay_np(&ts));
+    
+to:            
+   BOOST_VERIFY(!pthread_delay_np(const_cast<timespec*>(&ts)));
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/aix_fix/boost_1_53_0/thread.cpp b/ecflow_4_0_7/build/aix_fix/boost_1_53_0/thread.cpp
new file mode 100644
index 0000000..7f6b622
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/boost_1_53_0/thread.cpp
@@ -0,0 +1,744 @@
+// Copyright (C) 2001-2003
+// William E. Kempf
+// Copyright (C) 2007-8 Anthony Williams
+// (C) Copyright 2011-2012 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//#define BOOST_THREAD_VERSION 3
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/thread.hpp>
+#if defined BOOST_THREAD_USES_DATETIME
+#include <boost/thread/xtime.hpp>
+#endif
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/locks.hpp>
+#include <boost/thread/once.hpp>
+#include <boost/thread/tss.hpp>
+#include <boost/thread/future.hpp>
+
+#ifdef __GLIBC__
+#include <sys/sysinfo.h>
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#elif defined BOOST_HAS_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "./timeconv.inl"
+
+namespace boost
+{
+    namespace detail
+    {
+        thread_data_base::~thread_data_base()
+        {
+            for (notify_list_t::iterator i = notify.begin(), e = notify.end();
+                    i != e; ++i)
+            {
+                i->second->unlock();
+                i->first->notify_all();
+            }
+            for (async_states_t::iterator i = async_states_.begin(), e = async_states_.end();
+                    i != e; ++i)
+            {
+                (*i)->make_ready();
+            }
+        }
+
+        struct thread_exit_callback_node
+        {
+            boost::detail::thread_exit_function_base* func;
+            thread_exit_callback_node* next;
+
+            thread_exit_callback_node(boost::detail::thread_exit_function_base* func_,
+                                      thread_exit_callback_node* next_):
+                func(func_),next(next_)
+            {}
+        };
+
+        namespace
+        {
+#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
+          boost::once_flag current_thread_tls_init_flag;
+#else
+            boost::once_flag current_thread_tls_init_flag=BOOST_ONCE_INIT;
+#endif
+            pthread_key_t current_thread_tls_key;
+
+            extern "C"
+            {
+                static void tls_destructor(void* data)
+                {
+                    boost::detail::thread_data_base* thread_info=static_cast<boost::detail::thread_data_base*>(data);
+                    if(thread_info)
+                    {
+                        while(!thread_info->tss_data.empty() || thread_info->thread_exit_callbacks)
+                        {
+
+                            while(thread_info->thread_exit_callbacks)
+                            {
+                                detail::thread_exit_callback_node* const current_node=thread_info->thread_exit_callbacks;
+                                thread_info->thread_exit_callbacks=current_node->next;
+                                if(current_node->func)
+                                {
+                                    (*current_node->func)();
+                                    delete current_node->func;
+                                }
+                                delete current_node;
+                            }
+                            for(std::map<void const*,tss_data_node>::iterator next=thread_info->tss_data.begin(),
+                                    current,
+                                    end=thread_info->tss_data.end();
+                                next!=end;)
+                            {
+                                current=next;
+                                ++next;
+                                if(current->second.func && (current->second.value!=0))
+                                {
+                                    (*current->second.func)(current->second.value);
+                                }
+                                thread_info->tss_data.erase(current);
+                            }
+                        }
+                        if (thread_info) // fixme: should we test this?
+                        {
+                          thread_info->self.reset();
+                        }
+                    }
+                }
+            }
+
+#if defined BOOST_THREAD_PATCH
+
+            struct  delete_current_thread_tls_key_on_dlclose_t
+            {
+                delete_current_thread_tls_key_on_dlclose_t()
+                {
+                }
+                ~delete_current_thread_tls_key_on_dlclose_t()
+                {
+                    if (current_thread_tls_init_flag.epoch!=BOOST_ONCE_INITIAL_FLAG_VALUE)
+                    {
+                        pthread_key_delete(current_thread_tls_key);
+                    }
+                }
+            };
+            delete_current_thread_tls_key_on_dlclose_t delete_current_thread_tls_key_on_dlclose;
+#endif
+
+            void create_current_thread_tls_key()
+            {
+                BOOST_VERIFY(!pthread_key_create(&current_thread_tls_key,&tls_destructor));
+            }
+        }
+
+        boost::detail::thread_data_base* get_current_thread_data()
+        {
+            boost::call_once(current_thread_tls_init_flag,create_current_thread_tls_key);
+            return (boost::detail::thread_data_base*)pthread_getspecific(current_thread_tls_key);
+        }
+
+        void set_current_thread_data(detail::thread_data_base* new_data)
+        {
+            boost::call_once(current_thread_tls_init_flag,create_current_thread_tls_key);
+            BOOST_VERIFY(!pthread_setspecific(current_thread_tls_key,new_data));
+        }
+    }
+
+    namespace
+    {
+        extern "C"
+        {
+            static void* thread_proxy(void* param)
+            {
+                boost::detail::thread_data_ptr thread_info = static_cast<boost::detail::thread_data_base*>(param)->self;
+                thread_info->self.reset();
+                detail::set_current_thread_data(thread_info.get());
+#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
+                BOOST_TRY
+                {
+#endif
+                    thread_info->run();
+#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
+
+                }
+                BOOST_CATCH (thread_interrupted const&)
+                {
+                }
+// Removed as it stops the debugger identifying the cause of the exception
+// Unhandled exceptions still cause the application to terminate
+//                 BOOST_CATCH(...)
+//                 {
+//                   throw;
+//
+//                     std::terminate();
+//                 }
+                BOOST_CATCH_END
+#endif
+                detail::tls_destructor(thread_info.get());
+                detail::set_current_thread_data(0);
+                boost::lock_guard<boost::mutex> lock(thread_info->data_mutex);
+                thread_info->done=true;
+                thread_info->done_condition.notify_all();
+
+                return 0;
+            }
+        }
+
+        struct externally_launched_thread:
+            detail::thread_data_base
+        {
+            externally_launched_thread()
+            {
+#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
+                interrupt_enabled=false;
+#endif
+            }
+
+            void run()
+            {}
+            void notify_all_at_thread_exit(condition_variable*, mutex*)
+            {}
+
+        private:
+            externally_launched_thread(externally_launched_thread&);
+            void operator=(externally_launched_thread&);
+        };
+
+        detail::thread_data_base* make_external_thread_data()
+        {
+            detail::thread_data_base* const me(new externally_launched_thread());
+            me->self.reset(me);
+            set_current_thread_data(me);
+            return me;
+        }
+
+
+        detail::thread_data_base* get_or_make_current_thread_data()
+        {
+            detail::thread_data_base* current_thread_data(detail::get_current_thread_data());
+            if(!current_thread_data)
+            {
+                current_thread_data=make_external_thread_data();
+            }
+            return current_thread_data;
+        }
+
+    }
+
+
+    thread::thread() BOOST_NOEXCEPT
+    {}
+
+    bool thread::start_thread_noexcept()
+    {
+        thread_info->self=thread_info;
+        int const res = pthread_create(&thread_info->thread_handle, 0, &thread_proxy, thread_info.get());
+        if (res != 0)
+        {
+            thread_info->self.reset();
+            return false;
+//            boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_create"));
+        }
+        return true;
+    }
+
+    bool thread::start_thread_noexcept(const attributes& attr)
+    {
+        thread_info->self=thread_info;
+        const attributes::native_handle_type* h = attr.native_handle();
+        int res = pthread_create(&thread_info->thread_handle, h, &thread_proxy, thread_info.get());
+        if (res != 0)
+        {
+            thread_info->self.reset();
+            return false;
+//            boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_create"));
+        }
+        int detached_state;
+        res = pthread_attr_getdetachstate(h, &detached_state);
+        if (res != 0)
+        {
+            thread_info->self.reset();
+            return false;
+//            boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_attr_getdetachstate"));
+        }
+        if (PTHREAD_CREATE_DETACHED==detached_state)
+        {
+          detail::thread_data_ptr local_thread_info;
+          thread_info.swap(local_thread_info);
+
+          if(local_thread_info)
+          {
+              //lock_guard<mutex> lock(local_thread_info->data_mutex);
+              if(!local_thread_info->join_started)
+              {
+                  //BOOST_VERIFY(!pthread_detach(local_thread_info->thread_handle));
+                  local_thread_info->join_started=true;
+                  local_thread_info->joined=true;
+              }
+          }
+        }
+        return true;
+    }
+
+
+
+    detail::thread_data_ptr thread::get_thread_info BOOST_PREVENT_MACRO_SUBSTITUTION () const
+    {
+        return thread_info;
+    }
+
+    bool thread::join_noexcept()
+    {
+        detail::thread_data_ptr const local_thread_info=(get_thread_info)();
+        if(local_thread_info)
+        {
+            bool do_join=false;
+
+            {
+                unique_lock<mutex> lock(local_thread_info->data_mutex);
+                while(!local_thread_info->done)
+                {
+                    local_thread_info->done_condition.wait(lock);
+                }
+                do_join=!local_thread_info->join_started;
+
+                if(do_join)
+                {
+                    local_thread_info->join_started=true;
+                }
+                else
+                {
+                    while(!local_thread_info->joined)
+                    {
+                        local_thread_info->done_condition.wait(lock);
+                    }
+                }
+            }
+            if(do_join)
+            {
+                void* result=0;
+                BOOST_VERIFY(!pthread_join(local_thread_info->thread_handle,&result));
+                lock_guard<mutex> lock(local_thread_info->data_mutex);
+                local_thread_info->joined=true;
+                local_thread_info->done_condition.notify_all();
+            }
+
+            if(thread_info==local_thread_info)
+            {
+                thread_info.reset();
+            }
+            return true;
+        }
+        else
+        {
+          return false;
+        }
+    }
+
+    bool thread::do_try_join_until_noexcept(struct timespec const &timeout, bool& res)
+    {
+        detail::thread_data_ptr const local_thread_info=(get_thread_info)();
+        if(local_thread_info)
+        {
+            bool do_join=false;
+
+            {
+                unique_lock<mutex> lock(local_thread_info->data_mutex);
+                while(!local_thread_info->done)
+                {
+                    if(!local_thread_info->done_condition.do_wait_until(lock,timeout))
+                    {
+                      res=false;
+                      return true;
+                    }
+                }
+                do_join=!local_thread_info->join_started;
+
+                if(do_join)
+                {
+                    local_thread_info->join_started=true;
+                }
+                else
+                {
+                    while(!local_thread_info->joined)
+                    {
+                        local_thread_info->done_condition.wait(lock);
+                    }
+                }
+            }
+            if(do_join)
+            {
+                void* result=0;
+                BOOST_VERIFY(!pthread_join(local_thread_info->thread_handle,&result));
+                lock_guard<mutex> lock(local_thread_info->data_mutex);
+                local_thread_info->joined=true;
+                local_thread_info->done_condition.notify_all();
+            }
+
+            if(thread_info==local_thread_info)
+            {
+                thread_info.reset();
+            }
+            res=true;
+            return true;
+        }
+        else
+        {
+          return false;
+        }
+    }
+
+    bool thread::joinable() const BOOST_NOEXCEPT
+    {
+        return (get_thread_info)()?true:false;
+    }
+
+
+    void thread::detach()
+    {
+        detail::thread_data_ptr local_thread_info;
+        thread_info.swap(local_thread_info);
+
+        if(local_thread_info)
+        {
+            lock_guard<mutex> lock(local_thread_info->data_mutex);
+            if(!local_thread_info->join_started)
+            {
+                BOOST_VERIFY(!pthread_detach(local_thread_info->thread_handle));
+                local_thread_info->join_started=true;
+                local_thread_info->joined=true;
+            }
+        }
+    }
+
+    namespace this_thread
+    {
+      namespace hiden
+      {
+        void BOOST_THREAD_DECL sleep_for(const timespec& ts)
+        {
+            boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
+
+            if(thread_info)
+            {
+              unique_lock<mutex> lk(thread_info->sleep_mutex);
+              while( thread_info->sleep_condition.do_wait_for(lk,ts)) {}
+            }
+            else
+            {
+
+              if (boost::detail::timespec_ge(ts, boost::detail::timespec_zero()))
+              {
+
+  #   if defined(BOOST_HAS_PTHREAD_DELAY_NP)
+                // avib: fix for AIX
+                BOOST_VERIFY(!pthread_delay_np(const_cast<timespec*>(&ts)));
+  #   elif defined(BOOST_HAS_NANOSLEEP)
+                //  nanosleep takes a timespec that is an offset, not
+                //  an absolute time.
+                nanosleep(&ts, 0);
+  #   else
+                mutex mx;
+                unique_lock<mutex> lock(mx);
+                condition_variable cond;
+                cond.do_wait_for(lock, ts);
+  #   endif
+              }
+            }
+        }
+
+        void BOOST_THREAD_DECL sleep_until(const timespec& ts)
+        {
+            boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
+
+            if(thread_info)
+            {
+              unique_lock<mutex> lk(thread_info->sleep_mutex);
+              while(thread_info->sleep_condition.do_wait_until(lk,ts)) {}
+            }
+            else
+            {
+              timespec now = boost::detail::timespec_now();
+              if (boost::detail::timespec_gt(ts, now))
+              {
+                for (int foo=0; foo < 5; ++foo)
+                {
+
+  #   if defined(BOOST_HAS_PTHREAD_DELAY_NP)
+                  timespec d = boost::detail::timespec_minus(ts, now);
+                  BOOST_VERIFY(!pthread_delay_np(&d));
+  #   elif defined(BOOST_HAS_NANOSLEEP)
+                  //  nanosleep takes a timespec that is an offset, not
+                  //  an absolute time.
+                  timespec d = boost::detail::timespec_minus(ts, now);
+                  nanosleep(&d, 0);
+  #   else
+                  mutex mx;
+                  unique_lock<mutex> lock(mx);
+                  condition_variable cond;
+                  cond.do_wait_until(lock, ts);
+  #   endif
+                  timespec now2 = boost::detail::timespec_now();
+                  if (boost::detail::timespec_ge(now2, ts))
+                  {
+                    return;
+                  }
+                }
+              }
+            }
+        }
+      } // hiden
+    } // this_thread
+    namespace this_thread
+    {
+        void yield() BOOST_NOEXCEPT
+        {
+#   if defined(BOOST_HAS_SCHED_YIELD)
+            BOOST_VERIFY(!sched_yield());
+#   elif defined(BOOST_HAS_PTHREAD_YIELD)
+            BOOST_VERIFY(!pthread_yield());
+//#   elif defined BOOST_THREAD_USES_DATETIME
+//            xtime xt;
+//            xtime_get(&xt, TIME_UTC_);
+//            sleep(xt);
+//            sleep_for(chrono::milliseconds(0));
+#   else
+#error
+            timespec ts;
+            ts.tv_sec= 0;
+            ts.tv_nsec= 0;
+            hiden::sleep_for(ts);
+#   endif
+        }
+    }
+    unsigned thread::hardware_concurrency() BOOST_NOEXCEPT
+    {
+#if defined(PTW32_VERSION) || defined(__hpux)
+        return pthread_num_processors_np();
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+        int count;
+        size_t size=sizeof(count);
+        return sysctlbyname("hw.ncpu",&count,&size,NULL,0)?0:count;
+#elif defined(BOOST_HAS_UNISTD_H) && defined(_SC_NPROCESSORS_ONLN)
+        int const count=sysconf(_SC_NPROCESSORS_ONLN);
+        return (count>0)?count:0;
+#elif defined(__GLIBC__)
+        return get_nprocs();
+#else
+        return 0;
+#endif
+    }
+
+#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
+    void thread::interrupt()
+    {
+        detail::thread_data_ptr const local_thread_info=(get_thread_info)();
+        if(local_thread_info)
+        {
+            lock_guard<mutex> lk(local_thread_info->data_mutex);
+            local_thread_info->interrupt_requested=true;
+            if(local_thread_info->current_cond)
+            {
+                boost::pthread::pthread_mutex_scoped_lock internal_lock(local_thread_info->cond_mutex);
+                BOOST_VERIFY(!pthread_cond_broadcast(local_thread_info->current_cond));
+            }
+        }
+    }
+
+    bool thread::interruption_requested() const BOOST_NOEXCEPT
+    {
+        detail::thread_data_ptr const local_thread_info=(get_thread_info)();
+        if(local_thread_info)
+        {
+            lock_guard<mutex> lk(local_thread_info->data_mutex);
+            return local_thread_info->interrupt_requested;
+        }
+        else
+        {
+            return false;
+        }
+    }
+#endif
+
+    thread::native_handle_type thread::native_handle()
+    {
+        detail::thread_data_ptr const local_thread_info=(get_thread_info)();
+        if(local_thread_info)
+        {
+            lock_guard<mutex> lk(local_thread_info->data_mutex);
+            return local_thread_info->thread_handle;
+        }
+        else
+        {
+            return pthread_t();
+        }
+    }
+
+
+
+#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
+    namespace this_thread
+    {
+        void interruption_point()
+        {
+#ifndef BOOST_NO_EXCEPTIONS
+            boost::detail::thread_data_base* const thread_info=detail::get_current_thread_data();
+            if(thread_info && thread_info->interrupt_enabled)
+            {
+                lock_guard<mutex> lg(thread_info->data_mutex);
+                if(thread_info->interrupt_requested)
+                {
+                    thread_info->interrupt_requested=false;
+                    throw thread_interrupted();
+                }
+            }
+#endif
+        }
+
+        bool interruption_enabled() BOOST_NOEXCEPT
+        {
+            boost::detail::thread_data_base* const thread_info=detail::get_current_thread_data();
+            return thread_info && thread_info->interrupt_enabled;
+        }
+
+        bool interruption_requested() BOOST_NOEXCEPT
+        {
+            boost::detail::thread_data_base* const thread_info=detail::get_current_thread_data();
+            if(!thread_info)
+            {
+                return false;
+            }
+            else
+            {
+                lock_guard<mutex> lg(thread_info->data_mutex);
+                return thread_info->interrupt_requested;
+            }
+        }
+
+        disable_interruption::disable_interruption() BOOST_NOEXCEPT:
+            interruption_was_enabled(interruption_enabled())
+        {
+            if(interruption_was_enabled)
+            {
+                detail::get_current_thread_data()->interrupt_enabled=false;
+            }
+        }
+
+        disable_interruption::~disable_interruption() BOOST_NOEXCEPT
+        {
+            if(detail::get_current_thread_data())
+            {
+                detail::get_current_thread_data()->interrupt_enabled=interruption_was_enabled;
+            }
+        }
+
+        restore_interruption::restore_interruption(disable_interruption& d) BOOST_NOEXCEPT
+        {
+            if(d.interruption_was_enabled)
+            {
+                detail::get_current_thread_data()->interrupt_enabled=true;
+            }
+        }
+
+        restore_interruption::~restore_interruption() BOOST_NOEXCEPT
+        {
+            if(detail::get_current_thread_data())
+            {
+                detail::get_current_thread_data()->interrupt_enabled=false;
+            }
+        }
+    }
+#endif
+
+    namespace detail
+    {
+        void add_thread_exit_function(thread_exit_function_base* func)
+        {
+            detail::thread_data_base* const current_thread_data(get_or_make_current_thread_data());
+            thread_exit_callback_node* const new_node=
+                new thread_exit_callback_node(func,current_thread_data->thread_exit_callbacks);
+            current_thread_data->thread_exit_callbacks=new_node;
+        }
+
+        tss_data_node* find_tss_data(void const* key)
+        {
+            detail::thread_data_base* const current_thread_data(get_current_thread_data());
+            if(current_thread_data)
+            {
+                std::map<void const*,tss_data_node>::iterator current_node=
+                    current_thread_data->tss_data.find(key);
+                if(current_node!=current_thread_data->tss_data.end())
+                {
+                    return &current_node->second;
+                }
+            }
+            return 0;
+        }
+
+        void* get_tss_data(void const* key)
+        {
+            if(tss_data_node* const current_node=find_tss_data(key))
+            {
+                return current_node->value;
+            }
+            return 0;
+        }
+
+        void add_new_tss_node(void const* key,
+                              boost::shared_ptr<tss_cleanup_function> func,
+                              void* tss_data)
+        {
+            detail::thread_data_base* const current_thread_data(get_or_make_current_thread_data());
+            current_thread_data->tss_data.insert(std::make_pair(key,tss_data_node(func,tss_data)));
+        }
+
+        void erase_tss_node(void const* key)
+        {
+            detail::thread_data_base* const current_thread_data(get_or_make_current_thread_data());
+            current_thread_data->tss_data.erase(key);
+        }
+
+        void set_tss_data(void const* key,
+                          boost::shared_ptr<tss_cleanup_function> func,
+                          void* tss_data,bool cleanup_existing)
+        {
+            if(tss_data_node* const current_node=find_tss_data(key))
+            {
+                if(cleanup_existing && current_node->func && (current_node->value!=0))
+                {
+                    (*current_node->func)(current_node->value);
+                }
+                if(func || (tss_data!=0))
+                {
+                    current_node->func=func;
+                    current_node->value=tss_data;
+                }
+                else
+                {
+                    erase_tss_node(key);
+                }
+            }
+            else if(func || (tss_data!=0))
+            {
+                add_new_tss_node(key,func,tss_data);
+            }
+        }
+    }
+
+    BOOST_THREAD_DECL void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk)
+    {
+      detail::thread_data_base* const current_thread_data(detail::get_current_thread_data());
+      if(current_thread_data)
+      {
+        current_thread_data->notify_all_at_thread_exit(&cond, lk.release());
+      }
+    }
+
+
+
+}
diff --git a/ecflow_4_0_7/build/aix_fix/force_include.hpp b/ecflow_4_0_7/build/aix_fix/force_include.hpp
new file mode 100644
index 0000000..c3d9ada
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/force_include.hpp
@@ -0,0 +1,64 @@
+#ifndef BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
+#define BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// force_include.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+// the following help macro is to guarentee that certain coded
+// is not removed by over-eager linker optimiser.  In certain cases
+// we create static objects must be created but are actually never
+// referenced - creation has a side-effect such as global registration
+// which is important to us. We make an effort to refer these objects
+// so that a smart linker won't remove them as being unreferenced.
+// In microsoft compilers, inlining the code that does the referring
+// means the code gets lost and the static object is not included
+// in the library and hence never registered.  This manifests itself
+// in an ungraceful crash at runtime when (and only when) built in
+// release mode.
+
+#if defined(BOOST_HAS_DECLSPEC) && !defined(__COMO__)
+#   if defined(__BORLANDC__)
+#       define BOOST_DLLEXPORT __export
+#   else
+#       define BOOST_DLLEXPORT __declspec(dllexport)
+#   endif
+#elif ! defined(_WIN32) && ! defined(_WIN64)
+#   if defined(__MWERKS__)
+#       define BOOST_DLLEXPORT __declspec(dllexport)
+#   elif defined(__GNUC__) && (__GNUC__ >= 3)
+#       define BOOST_USED __attribute__ ((used))
+#   elif defined(__IBMCPP__) && (__IBMCPP__ >= 1110)
+#       define BOOST_USED __attribute__ ((used))
+#       define BOOST_NOINLINE __attribute__((noinline))
+#   elif defined(__INTEL_COMPILER) && (BOOST_INTEL_CXX_VERSION >= 800)
+#       define BOOST_USED __attribute__ ((used))
+#   endif
+#endif
+
+#ifndef BOOST_USED
+#    define BOOST_USED
+#endif
+
+#ifndef BOOST_DLLEXPORT
+#    define BOOST_DLLEXPORT
+#endif
+
+#ifndef BOOST_NOINLINE
+#    define BOOST_NOINLINE
+#endif
+
+#endif // BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
diff --git a/ecflow_4_0_7/build/aix_fix/force_include.hpp_boost_1.44 b/ecflow_4_0_7/build/aix_fix/force_include.hpp_boost_1.44
new file mode 100644
index 0000000..c3d9ada
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/force_include.hpp_boost_1.44
@@ -0,0 +1,64 @@
+#ifndef BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
+#define BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// force_include.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+// the following help macro is to guarentee that certain coded
+// is not removed by over-eager linker optimiser.  In certain cases
+// we create static objects must be created but are actually never
+// referenced - creation has a side-effect such as global registration
+// which is important to us. We make an effort to refer these objects
+// so that a smart linker won't remove them as being unreferenced.
+// In microsoft compilers, inlining the code that does the referring
+// means the code gets lost and the static object is not included
+// in the library and hence never registered.  This manifests itself
+// in an ungraceful crash at runtime when (and only when) built in
+// release mode.
+
+#if defined(BOOST_HAS_DECLSPEC) && !defined(__COMO__)
+#   if defined(__BORLANDC__)
+#       define BOOST_DLLEXPORT __export
+#   else
+#       define BOOST_DLLEXPORT __declspec(dllexport)
+#   endif
+#elif ! defined(_WIN32) && ! defined(_WIN64)
+#   if defined(__MWERKS__)
+#       define BOOST_DLLEXPORT __declspec(dllexport)
+#   elif defined(__GNUC__) && (__GNUC__ >= 3)
+#       define BOOST_USED __attribute__ ((used))
+#   elif defined(__IBMCPP__) && (__IBMCPP__ >= 1110)
+#       define BOOST_USED __attribute__ ((used))
+#       define BOOST_NOINLINE __attribute__((noinline))
+#   elif defined(__INTEL_COMPILER) && (BOOST_INTEL_CXX_VERSION >= 800)
+#       define BOOST_USED __attribute__ ((used))
+#   endif
+#endif
+
+#ifndef BOOST_USED
+#    define BOOST_USED
+#endif
+
+#ifndef BOOST_DLLEXPORT
+#    define BOOST_DLLEXPORT
+#endif
+
+#ifndef BOOST_NOINLINE
+#    define BOOST_NOINLINE
+#endif
+
+#endif // BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
diff --git a/ecflow_4_0_7/build/aix_fix/header_diff_item2.txt b/ecflow_4_0_7/build/aix_fix/header_diff_item2.txt
new file mode 100644
index 0000000..da1c45f
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/header_diff_item2.txt
@@ -0,0 +1,49 @@
+force_include.hpp
+===============
+*** boost/serialization/force_include.hpp~	Mon May 31 17:17:21 2010
+--- boost/serialization/force_include.hpp	Tue Dec 13 16:18:07 2011
+***************
+*** 43,48 ****
+--- 43,49 ----
+  #       define BOOST_USED __attribute__ ((used))
+  #   elif defined(__IBMCPP__) && (__IBMCPP__ >= 1110)
+  #       define BOOST_USED __attribute__ ((used))
++ #       define BOOST_NOINLINE __attribute__((noinline))
+  #   elif defined(__INTEL_COMPILER) && (BOOST_INTEL_CXX_VERSION >= 800)
+  #       define BOOST_USED __attribute__ ((used))
+  #   endif
+***************
+*** 54,59 ****
+--- 55,64 ----
+  
+  #ifndef BOOST_DLLEXPORT
+  #    define BOOST_DLLEXPORT
++ #endif
++ 
++ #ifndef BOOST_NOINLINE
++ #    define BOOST_NOINLINE
+  #endif
+  
+  #endif // BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
+
+singleton.hpp
+============
+*** boost/serialization/singleton.hpp~	Thu Nov 11 22:56:29 2010
+--- boost/serialization/singleton.hpp	Tue Dec 13 16:18:07 2011
+***************
+*** 123,129 ****
+  private:
+      BOOST_DLLEXPORT static T & instance;
+      // include this to provoke instantiation at pre-execution time
+!     static void use(T const &) {}
+      BOOST_DLLEXPORT static T & get_instance() {
+          static detail::singleton_wrapper< T > t;
+          // refer to instance, causing it to be instantiated (and
+--- 123,129 ----
+  private:
+      BOOST_DLLEXPORT static T & instance;
+      // include this to provoke instantiation at pre-execution time
+!     static void use(T const &) BOOST_NOINLINE {}
+      BOOST_DLLEXPORT static T & get_instance() {
+          static detail::singleton_wrapper< T > t;
+          // refer to instance, causing it to be instantiated (and
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/aix_fix/path.hpp b/ecflow_4_0_7/build/aix_fix/path.hpp
new file mode 100644
index 0000000..d50f184
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/path.hpp
@@ -0,0 +1,714 @@
+//  filesystem path.hpp  ---------------------------------------------------------------//
+
+//  Copyright Beman Dawes 2002-2005, 2009
+//  Copyright Vladimir Prus 2002
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  Library home page: http://www.boost.org/libs/filesystem
+
+//  path::stem(), extension(), and replace_extension() are based on
+//  basename(), extension(), and change_extension() from the original
+//  filesystem/convenience.hpp header by Vladimir Prus.
+
+#ifndef BOOST_FILESYSTEM_PATH_HPP
+#define BOOST_FILESYSTEM_PATH_HPP
+
+#include <boost/config.hpp>
+
+# if defined( BOOST_NO_STD_WSTRING )
+#   error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
+# endif
+
+#include <boost/filesystem/v3/config.hpp>
+#include <boost/filesystem/v3/path_traits.hpp>  // includes <cwchar>
+#include <boost/system/error_code.hpp>
+#include <boost/system/system_error.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/io/detail/quoted_manip.hpp>
+#include <boost/static_assert.hpp>
+#include <string>
+#include <iterator>
+#include <cstring>
+#include <iosfwd>
+#include <stdexcept>
+#include <cassert>
+#include <locale>
+#include <algorithm>
+
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+
+namespace boost
+{
+namespace filesystem3
+{
+  //------------------------------------------------------------------------------------//
+  //                                                                                    //
+  //                                    class path                                      //
+  //                                                                                    //
+  //------------------------------------------------------------------------------------//
+
+  class BOOST_FILESYSTEM_DECL path
+  {
+  public:
+
+    //  value_type is the character type used by the operating system API to
+    //  represent paths.
+
+#   ifdef BOOST_WINDOWS_API
+    typedef wchar_t                                     value_type;
+#   else
+    typedef char                                        value_type;
+#   endif
+    typedef std::basic_string<value_type>               string_type;
+    typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type;
+
+
+    //  ----- character encoding conversions -----
+
+    //  Following the principle of least astonishment, path input arguments
+    //  passed to or obtained from the operating system via objects of
+    //  class path behave as if they were directly passed to or
+    //  obtained from the O/S API, unless conversion is explicitly requested.
+    //
+    //  POSIX specfies that path strings are passed unchanged to and from the
+    //  API. Note that this is different from the POSIX command line utilities,
+    //  which convert according to a locale.
+    //
+    //  Thus for POSIX, char strings do not undergo conversion.  wchar_t strings
+    //  are converted to/from char using the path locale or, if a conversion
+    //  argument is given, using a conversion object modeled on
+    //  std::wstring_convert.
+    //
+    //  The path locale, which is global to the thread, can be changed by the
+    //  imbue() function. It is initialized to an implementation defined locale.
+    //
+    //  For Windows, wchar_t strings do not undergo conversion. char strings
+    //  are converted using the "ANSI" or "OEM" code pages, as determined by
+    //  the AreFileApisANSI() function, or, if a conversion argument is given,
+    //  using a conversion object modeled on std::wstring_convert.
+    //
+    //  See m_pathname comments for further important rationale.
+
+    //  TODO: rules needed for operating systems that use / or .
+    //  differently, or format directory paths differently from file paths.
+    //
+    //  ************************************************************************
+    //
+    //  More work needed: How to handle an operating system that may have
+    //  slash characters or dot characters in valid filenames, either because
+    //  it doesn't follow the POSIX standard, or because it allows MBCS
+    //  filename encodings that may contain slash or dot characters. For
+    //  example, ISO/IEC 2022 (JIS) encoding which allows switching to
+    //  JIS x0208-1983 encoding. A valid filename in this set of encodings is
+    //  0x1B 0x24 0x42 [switch to X0208-1983] 0x24 0x2F [U+304F Kiragana letter KU]
+    //                                             ^^^^
+    //  Note that 0x2F is the ASCII slash character
+    //
+    //  ************************************************************************
+
+    //  Supported source arguments: half-open iterator range, container, c-array,
+    //  and single pointer to null terminated string.
+
+    //  All source arguments except pointers to null terminated byte strings support
+    //  multi-byte character strings which may have embedded nulls. Embedded null
+    //  support is required for some Asian languages on Windows.
+
+    //  "const codecvt_type& cvt=codecvt()" default arguments are not used because some
+    //  compilers, such as Microsoft prior to VC++ 10, do not handle defaults correctly
+    //  in templates.
+
+    //  -----  constructors  -----
+
+    path(){}
+
+    path(const path& p) : m_pathname(p.m_pathname) {}
+
+    template <class Source>
+    path(Source const& source,
+      typename boost::enable_if<path_traits::is_pathable<
+        typename boost::decay<Source>::type> >::type* =0)
+    {
+      path_traits::dispatch(source, m_pathname, codecvt());
+    }
+
+    template <class Source>
+    path(Source const& source, const codecvt_type& cvt)
+    //  see note above explaining why codecvt() default arguments are not used
+    {
+      path_traits::dispatch(source, m_pathname, cvt);
+    }
+
+    template <class InputIterator>
+    path(InputIterator begin, InputIterator end)
+    {
+      if (begin != end)
+      {
+        std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+          s(begin, end);
+        path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, codecvt());
+      }
+    }
+
+    template <class InputIterator>
+    path(InputIterator begin, InputIterator end, const codecvt_type& cvt)
+    {
+      if (begin != end)
+      {
+        std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+          s(begin, end);
+        path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
+      }
+    }
+
+    //  -----  assignments  -----
+
+    path& operator=(const path& p)
+    {
+      m_pathname = p.m_pathname;
+      return *this;
+    }
+
+    template <class Source>
+      typename boost::enable_if<path_traits::is_pathable<
+        typename boost::decay<Source>::type>, path&>::type
+    operator=(Source const& source)
+    {
+      m_pathname.clear();
+      path_traits::dispatch(source, m_pathname, codecvt());
+      return *this;
+    }
+
+    template <class Source>
+    path& assign(Source const& source, const codecvt_type& cvt)
+    {
+      m_pathname.clear();
+      path_traits::dispatch(source, m_pathname, cvt);
+      return *this;
+    }
+
+    template <class InputIterator>
+    path& assign(InputIterator begin, InputIterator end)
+    {
+      return assign(begin, end, codecvt());
+    }
+
+    template <class InputIterator>
+    path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt)
+    {
+      m_pathname.clear();
+      if (begin != end)
+      {
+        std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+          s(begin, end);
+        path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
+      }
+      return *this;
+    }
+
+    //  -----  appends  -----
+
+    //  if a separator is added, it is the preferred separator for the platform;
+    //  slash for POSIX, backslash for Windows
+
+    path& operator/=(const path& p);
+
+    template <class Source>
+      typename boost::enable_if<path_traits::is_pathable<
+        typename boost::decay<Source>::type>, path&>::type
+    operator/=(Source const& source)
+    {
+      return append(source, codecvt());
+    }
+
+    template <class Source>
+    path& append(Source const& source, const codecvt_type& cvt);
+
+    template <class InputIterator>
+    path& append(InputIterator begin, InputIterator end)
+    {
+      return append(begin, end, codecvt());
+    }
+
+    template <class InputIterator>
+    path& append(InputIterator begin, InputIterator end, const codecvt_type& cvt);
+
+    //  -----  modifiers  -----
+
+    void   clear()             { m_pathname.clear(); }
+    path&  make_preferred()
+#   ifdef BOOST_POSIX_API
+      { return *this; }  // POSIX no effect
+#   else // BOOST_WINDOWS_API
+      ;  // change slashes to backslashes
+#   endif
+    path&  remove_filename();
+    path&  replace_extension(const path& new_extension = path());
+    void   swap(path& rhs)     { m_pathname.swap(rhs.m_pathname); }
+
+    //  -----  observers  -----
+
+    //  For operating systems that format file paths differently than directory
+    //  paths, return values from observers are formatted as file names unless there
+    //  is a trailing separator, in which case returns are formatted as directory
+    //  paths. POSIX and Windows make no such distinction.
+
+    //  Implementations are permitted to return const values or const references.
+
+    //  The string or path returned by an observer are specified as being formatted
+    //  as "native" or "generic".
+    //
+    //  For POSIX, these are all the same format; slashes and backslashes are as input and
+    //  are not modified.
+    //
+    //  For Windows,   native:    as input; slashes and backslashes are not modified;
+    //                            this is the format of the internally stored string.
+    //                 generic:   backslashes are converted to slashes
+
+    //  -----  native format observers  -----
+
+    const string_type&  native() const { return m_pathname; }          // Throws: nothing
+    const value_type*   c_str() const  { return m_pathname.c_str(); }  // Throws: nothing
+
+    template <class String>
+    String string() const;
+
+    template <class String>
+    String string(const codecvt_type& cvt) const;
+
+#   ifdef BOOST_WINDOWS_API
+    const std::string string() const { return string(codecvt()); }
+    const std::string string(const codecvt_type& cvt) const
+    {
+      std::string tmp;
+      if (!m_pathname.empty())
+        path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(),
+          tmp, cvt);
+      return tmp;
+    }
+
+    //  string_type is std::wstring, so there is no conversion
+    const std::wstring&  wstring() const { return m_pathname; }
+    const std::wstring&  wstring(const codecvt_type&) const { return m_pathname; }
+
+#   else   // BOOST_POSIX_API
+    //  string_type is std::string, so there is no conversion
+    const std::string&  string() const { return m_pathname; }
+    const std::string&  string(const codecvt_type&) const { return m_pathname; }
+
+    const std::wstring  wstring() const { return wstring(codecvt()); }
+    const std::wstring  wstring(const codecvt_type& cvt) const
+    {
+      std::wstring tmp;
+      if (!m_pathname.empty())
+        path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(),
+          tmp, cvt);
+      return tmp;
+    }
+
+#   endif
+
+    //  -----  generic format observers  -----
+
+    template <class String>
+    String generic_string() const;
+
+    template <class String>
+    String generic_string(const codecvt_type& cvt) const;
+
+#   ifdef BOOST_WINDOWS_API
+    const std::string   generic_string() const { return generic_string(codecvt()); }
+    const std::string   generic_string(const codecvt_type& cvt) const;
+    const std::wstring  generic_wstring() const;
+    const std::wstring  generic_wstring(const codecvt_type&) const { return generic_wstring(); };
+
+#   else // BOOST_POSIX_API
+    //  On POSIX-like systems, the generic format is the same as the native format
+    const std::string&  generic_string() const  { return m_pathname; }
+    const std::string&  generic_string(const codecvt_type&) const  { return m_pathname; }
+    const std::wstring  generic_wstring() const { return wstring(codecvt()); }
+    const std::wstring  generic_wstring(const codecvt_type& cvt) const { return wstring(cvt); }
+
+#   endif
+
+    //  -----  decomposition  -----
+
+    path  root_path() const;
+    path  root_name() const;         // returns 0 or 1 element path
+                                     // even on POSIX, root_name() is non-empty() for network paths
+    path  root_directory() const;    // returns 0 or 1 element path
+    path  relative_path() const;
+    path  parent_path() const;
+    path  filename() const;          // returns 0 or 1 element path
+    path  stem() const;              // returns 0 or 1 element path
+    path  extension() const;         // returns 0 or 1 element path
+
+    //  -----  query  -----
+
+    bool empty() const               { return m_pathname.empty(); } // name consistent with std containers
+    bool has_root_path() const       { return has_root_directory() || has_root_name(); }
+    bool has_root_name() const       { return !root_name().empty(); }
+    bool has_root_directory() const  { return !root_directory().empty(); }
+    bool has_relative_path() const   { return !relative_path().empty(); }
+    bool has_parent_path() const     { return !parent_path().empty(); }
+    bool has_filename() const        { return !m_pathname.empty(); }
+    bool has_stem() const            { return !stem().empty(); }
+    bool has_extension() const       { return !extension().empty(); }
+    bool is_absolute() const
+    {
+#     ifdef BOOST_WINDOWS_API
+      return has_root_name() && has_root_directory();
+#     else
+      return has_root_directory();
+#     endif
+    }
+    bool is_relative() const         { return !is_absolute(); }
+
+    //  -----  imbue  -----
+
+    static std::locale imbue(const std::locale& loc);
+
+    //  -----  codecvt  -----
+
+    static const codecvt_type& codecvt()
+    {
+      return *wchar_t_codecvt_facet();
+    }
+
+    //  -----  iterators  -----
+
+    class iterator;
+    typedef iterator const_iterator;
+
+    iterator begin() const;
+    iterator end() const;
+
+    //  -----  deprecated functions  -----
+
+# if defined(BOOST_FILESYSTEM_DEPRECATED) && defined(BOOST_FILESYSTEM_NO_DEPRECATED)
+#   error both BOOST_FILESYSTEM_DEPRECATED and BOOST_FILESYSTEM_NO_DEPRECATED are defined
+# endif
+
+# if !defined(BOOST_FILESYSTEM_NO_DEPRECATED)
+    //  recently deprecated functions supplied by default
+    path&  normalize()              { return m_normalize(); }
+    path&  remove_leaf()            { return remove_filename(); }
+    path   leaf() const             { return filename(); }
+    path   branch_path() const      { return parent_path(); }
+    bool   has_leaf() const         { return !m_pathname.empty(); }
+    bool   has_branch_path() const  { return !parent_path().empty(); }
+    bool   is_complete() const      { return is_absolute(); }
+# endif
+
+# if defined(BOOST_FILESYSTEM_DEPRECATED)
+    //  deprecated functions with enough signature or semantic changes that they are
+    //  not supplied by default
+    const std::string file_string() const               { return string(); }
+    const std::string directory_string() const          { return string(); }
+    const std::string native_file_string() const        { return string(); }
+    const std::string native_directory_string() const   { return string(); }
+    const string_type external_file_string() const      { return native(); }
+    const string_type external_directory_string() const { return native(); }
+
+    //  older functions no longer supported
+    //typedef bool (*name_check)(const std::string & name);
+    //basic_path(const string_type& str, name_check) { operator/=(str); }
+    //basic_path(const typename string_type::value_type* s, name_check)
+    //  { operator/=(s);}
+    //static bool default_name_check_writable() { return false; }
+    //static void default_name_check(name_check) {}
+    //static name_check default_name_check() { return 0; }
+    //basic_path& canonize();
+# endif
+
+//--------------------------------------------------------------------------------------//
+//                            class path private members                                //
+//--------------------------------------------------------------------------------------//
+
+  private:
+#   if defined(_MSC_VER)
+#     pragma warning(push) // Save warning settings
+#     pragma warning(disable : 4251) // disable warning: class 'std::basic_string<_Elem,_Traits,_Ax>'
+#   endif                            // needs to have dll-interface...
+/*
+      m_pathname has the type, encoding, and format required by the native
+      operating system. Thus for POSIX and Windows there is no conversion for
+      passing m_pathname.c_str() to the O/S API or when obtaining a path from the
+      O/S API. POSIX encoding is unspecified other than for dot and slash
+      characters; POSIX just treats paths as a sequence of bytes. Windows
+      encoding is UCS-2 or UTF-16 depending on the version.
+*/
+    string_type  m_pathname;  // Windows: as input; backslashes NOT converted to slashes,
+                              // slashes NOT converted to backslashes
+#   if defined(_MSC_VER)
+#     pragma warning(pop) // restore warning settings.
+#   endif
+
+    string_type::size_type m_append_separator_if_needed();
+    //  Returns: If separator is to be appended, m_pathname.size() before append. Otherwise 0.
+    //  Note: An append is never performed if size()==0, so a returned 0 is unambiguous.
+
+    void m_erase_redundant_separator(string_type::size_type sep_pos);
+    string_type::size_type m_parent_path_end() const;
+    void m_portable();
+
+    path& m_normalize();
+
+    // Was qualified; como433beta8 reports:
+    //    warning #427-D: qualified name is not allowed in member declaration
+    friend class iterator;
+    friend bool operator<(const path& lhs, const path& rhs);
+
+    // see path::iterator::increment/decrement comment below
+    static void m_path_iterator_increment(path::iterator & it);
+    static void m_path_iterator_decrement(path::iterator & it);
+
+    static const codecvt_type *&  wchar_t_codecvt_facet();
+
+  };  // class path
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+  typedef path wpath;
+# endif
+
+  //------------------------------------------------------------------------------------//
+  //                             class path::iterator                                   //
+  //------------------------------------------------------------------------------------//
+
+  class path::iterator
+    : public boost::iterator_facade<
+      path::iterator,
+      path const,
+      boost::bidirectional_traversal_tag >
+  {
+  private:
+    friend class boost::iterator_core_access;
+    friend class boost::filesystem3::path;
+    friend void m_path_iterator_increment(path::iterator & it);
+    friend void m_path_iterator_decrement(path::iterator & it);
+
+    const path& dereference() const { return m_element; }
+
+    bool equal(const iterator & rhs) const
+    {
+      return m_path_ptr == rhs.m_path_ptr && m_pos == rhs.m_pos;
+    }
+
+    // iterator_facade derived classes don't seem to like implementations in
+    // separate translation unit dll's, so forward to class path static members
+    void increment() { m_path_iterator_increment(*this); }
+    void decrement() { m_path_iterator_decrement(*this); }
+
+    path                    m_element;   // current element
+    const path *            m_path_ptr;  // path being iterated over
+    string_type::size_type  m_pos;       // position of name in
+                                         // m_path_ptr->m_pathname. The
+                                         // end() iterator is indicated by
+                                         // m_pos == m_path_ptr->m_pathname.size()
+  }; // path::iterator
+
+  //------------------------------------------------------------------------------------//
+  //                                                                                    //
+  //                              non-member functions                                  //
+  //                                                                                    //
+  //------------------------------------------------------------------------------------//
+
+  //  std::lexicographical_compare would infinately recurse because path iterators
+  //  yield paths, so provide a path aware version
+  inline bool lexicographical_compare(path::iterator first1, path::iterator last1,
+    path::iterator first2, path::iterator last2)
+  {
+    for (; first1 != last1 && first2 != last2 ; ++first1, ++first2)
+    {
+      if (first1->native() < first2->native()) return true;
+      if (first2->native() < first1->native()) return false;
+    }
+    return first1 == last1 && first2 != last2;
+  }
+
+  inline bool operator<(const path& lhs, const path& rhs)
+  {
+    return lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
+  }
+
+  inline bool operator<=(const path& lhs, const path& rhs) { return !(rhs < lhs); }
+  inline bool operator> (const path& lhs, const path& rhs) { return rhs < lhs; }
+  inline bool operator>=(const path& lhs, const path& rhs) { return !(lhs < rhs);  }
+
+  // equality operators act as if comparing generic format strings, to achieve the
+  // effect of lexicographical_compare element by element compare.
+  // operator==() efficiency is a concern; a user reported the original version 2
+  // !(lhs < rhs) && !(rhs < lhs) implementation caused a serious performance problem
+  // for a map of 10,000 paths.
+
+# ifdef BOOST_WINDOWS_API
+  inline bool operator==(const path& lhs, const path::value_type* rhs)
+  {
+    const path::value_type* l(lhs.c_str());
+    while ((*l == *rhs || (*l == L'\\' && *rhs == L'/') || (*l == L'/' && *rhs == L'\\'))
+      && *l) { ++l; ++rhs; }
+    return *l == *rhs || (*l == L'\\' && *rhs == L'/') || (*l == L'/' && *rhs == L'\\');
+  }
+  inline bool operator==(const path& lhs, const path& rhs)              { return lhs == rhs.c_str(); }
+  inline bool operator==(const path& lhs, const path::string_type& rhs) { return lhs == rhs.c_str(); }
+  inline bool operator==(const path::string_type& lhs, const path& rhs) { return rhs == lhs.c_str(); }
+  inline bool operator==(const path::value_type* lhs, const path& rhs)  { return rhs == lhs; }
+# else   // BOOST_POSIX_API
+  inline bool operator==(const path& lhs, const path& rhs)              { return lhs.native() == rhs.native(); }
+  inline bool operator==(const path& lhs, const path::string_type& rhs) { return lhs.native() == rhs; }
+  inline bool operator==(const path& lhs, const path::value_type* rhs)  { return lhs.native() == rhs; }
+  inline bool operator==(const path::string_type& lhs, const path& rhs) { return lhs == rhs.native(); }
+  inline bool operator==(const path::value_type* lhs, const path& rhs)  { return lhs == rhs.native(); }
+# endif
+
+  inline bool operator!=(const path& lhs, const path& rhs)              { return !(lhs == rhs); }
+  inline bool operator!=(const path& lhs, const path::string_type& rhs) { return !(lhs == rhs); }
+  inline bool operator!=(const path& lhs, const path::value_type* rhs)  { return !(lhs == rhs); }
+  inline bool operator!=(const path::string_type& lhs, const path& rhs) { return !(lhs == rhs); }
+  inline bool operator!=(const path::value_type* lhs, const path& rhs)  { return !(lhs == rhs); }
+
+  inline void swap(path& lhs, path& rhs)                   { lhs.swap(rhs); }
+
+  inline path operator/(const path& lhs, const path& rhs)  { return path(lhs) /= rhs; }
+
+  //  inserters and extractors
+  //    use boost::io::quoted() to handle spaces in paths
+  //    use '&' as escape character to ease use for Windows paths
+
+  template <class Char, class Traits>
+  inline std::basic_ostream<Char, Traits>&
+  operator<<(std::basic_ostream<Char, Traits>& os, const path& p)
+  {
+    return os
+      << boost::io::quoted(p.string<std::basic_string<Char> >(), static_cast<Char>('&'));
+  }
+
+  template <class Char, class Traits>
+  inline std::basic_istream<Char, Traits>&
+  operator>>(std::basic_istream<Char, Traits>& is, path& p)
+  {
+    std::basic_string<Char> str;
+    is >> boost::io::quoted(str, static_cast<Char>('&'));
+    p = str;
+    return is;
+  }
+
+  //  name_checks
+
+  //  These functions are holdovers from version 1. It isn't clear they have much
+  //  usefulness, or how to generalize them for later versions.
+
+  BOOST_FILESYSTEM_DECL bool portable_posix_name(const std::string & name);
+  BOOST_FILESYSTEM_DECL bool windows_name(const std::string & name);
+  BOOST_FILESYSTEM_DECL bool portable_name(const std::string & name);
+  BOOST_FILESYSTEM_DECL bool portable_directory_name(const std::string & name);
+  BOOST_FILESYSTEM_DECL bool portable_file_name(const std::string & name);
+  BOOST_FILESYSTEM_DECL bool native(const std::string & name);
+
+//--------------------------------------------------------------------------------------//
+//                     class path member template implementation                        //
+//--------------------------------------------------------------------------------------//
+
+  template <class InputIterator>
+  path& path::append(InputIterator begin, InputIterator end, const codecvt_type& cvt)
+  {
+    if (begin == end)
+      return *this;
+    string_type::size_type sep_pos(m_append_separator_if_needed());
+    std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+      s(begin, end);
+    path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
+    if (sep_pos)
+      m_erase_redundant_separator(sep_pos);
+    return *this;
+  }
+
+  template <class Source>
+  path& path::append(Source const & source, const codecvt_type& cvt)
+  {
+    if (path_traits::empty(source))
+      return *this;
+    string_type::size_type sep_pos(m_append_separator_if_needed());
+    path_traits::dispatch(source, m_pathname, cvt);
+    if (sep_pos)
+      m_erase_redundant_separator(sep_pos);
+    return *this;
+  }
+
+//--------------------------------------------------------------------------------------//
+//                     class path member template specializations                       //
+//--------------------------------------------------------------------------------------//
+
+  template <> inline
+  std::string path::string<std::string>() const
+    { return string(); }
+
+  template <> inline
+  std::wstring path::string<std::wstring>() const
+    { return wstring(); }
+
+  template <> inline
+  std::string path::string<std::string>(const codecvt_type& cvt) const
+    { return string(cvt); }
+
+  template <> inline
+  std::wstring path::string<std::wstring>(const codecvt_type& cvt) const
+    { return wstring(cvt); }
+
+  template <> inline
+  std::string path::generic_string<std::string>() const
+    { return generic_string(); }
+
+  template <> inline
+  std::wstring path::generic_string<std::wstring>() const
+    { return generic_wstring(); }
+
+  template <> inline
+  std::string path::generic_string<std::string>(const codecvt_type& cvt) const
+    { return generic_string(cvt); }
+
+  template <> inline
+  std::wstring path::generic_string<std::wstring>(const codecvt_type& cvt) const
+    { return generic_wstring(cvt); }
+
+
+}  // namespace filesystem3
+}  // namespace boost
+
+//----------------------------------------------------------------------------//
+
+namespace boost
+{
+  namespace filesystem
+  {
+    using filesystem3::path;
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    using filesystem3::wpath;
+# endif
+    using filesystem3::lexicographical_compare;
+    using filesystem3::portable_posix_name;
+    using filesystem3::windows_name;
+    using filesystem3::portable_name;
+    using filesystem3::portable_directory_name;
+    using filesystem3::portable_file_name;
+    using filesystem3::native;
+    using filesystem3::swap;
+    using filesystem3::operator<;
+    using filesystem3::operator==;
+    using filesystem3::operator!=;
+    using filesystem3::operator>;
+    using filesystem3::operator<=;
+    using filesystem3::operator>=;
+    using filesystem3::operator/;
+    using filesystem3::operator<<;
+    using filesystem3::operator>>;
+  }
+}
+
+//----------------------------------------------------------------------------//
+
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+
+#endif  // BOOST_FILESYSTEM_PATH_HPP
diff --git a/ecflow_4_0_7/build/aix_fix/singleton.hpp b/ecflow_4_0_7/build/aix_fix/singleton.hpp
new file mode 100644
index 0000000..235e3f0
--- /dev/null
+++ b/ecflow_4_0_7/build/aix_fix/singleton.hpp
@@ -0,0 +1,158 @@
+#ifndef BOOST_SERIALIZATION_SINGLETON_HPP
+#define BOOST_SERIALIZATION_SINGLETON_HPP
+
+/////////1/////////2///////// 3/////////4/////////5/////////6/////////7/////////8
+//  singleton.hpp
+//
+// Copyright David Abrahams 2006. Original version
+//
+// Copyright Robert Ramey 2007.  Changes made to permit
+// application throughout the serialization library.
+//
+// Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// The intention here is to define a template which will convert
+// any class into a singleton with the following features:
+//
+// a) initialized before first use.
+// b) thread-safe for const access to the class
+// c) non-locking
+//
+// In order to do this,
+// a) Initialize dynamically when used.
+// b) Require that all singletons be initialized before main
+// is called or any entry point into the shared library is invoked.
+// This guarentees no race condition for initialization.
+// In debug mode, we assert that no non-const functions are called
+// after main is invoked.
+//
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif 
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/force_include.hpp>
+
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable : 4511 4512)
+#endif
+
+namespace boost { 
+namespace serialization { 
+
+//////////////////////////////////////////////////////////////////////
+// Provides a dynamically-initialized (singleton) instance of T in a
+// way that avoids LNK1179 on vc6.  See http://tinyurl.com/ljdp8 or
+// http://lists.boost.org/Archives/boost/2006/05/105286.php for
+// details.
+//
+
+// singletons created by this code are guarenteed to be unique
+// within the executable or shared library which creates them.
+// This is sufficient and in fact ideal for the serialization library.
+// The singleton is created when the module is loaded and destroyed
+// when the module is unloaded.
+
+// This base class has two functions.
+
+// First it provides a module handle for each singleton indicating
+// the executable or shared library in which it was created. This
+// turns out to be necessary and sufficient to implement the tables
+// used by serialization library.
+
+// Second, it provides a mechanism to detect when a non-const function
+// is called after initialization.
+
+// make a singleton to lock/unlock all singletons for alteration.
+// The intent is that all singletons created/used by this code
+// are to be initialized before main is called. A test program
+// can lock all the singletons when main is entereed.  This any
+// attempt to retieve a mutable instances while locked will
+// generate a assertion if compiled for debug.
+
+class singleton_module : 
+    public boost::noncopyable
+{
+private:
+    static bool & get_lock(){
+        static bool lock = false;
+        return lock;
+    }
+public:
+//    static const void * get_module_handle(){
+//        return static_cast<const void *>(get_module_handle);
+//    }
+    static void lock(){
+        get_lock() = true;
+    }
+    static void unlock(){
+        get_lock() = false;
+    }
+    static bool is_locked() {
+        return get_lock();
+    }
+};
+
+namespace detail {
+
+template<class T>
+class singleton_wrapper : public T
+{
+public:
+    static bool m_is_destroyed;
+    ~singleton_wrapper(){
+        m_is_destroyed = true;
+    }
+};
+
+template<class T>
+bool detail::singleton_wrapper< T >::m_is_destroyed = false;
+
+} // detail
+
+template <class T>
+class singleton : public singleton_module
+{
+private:
+    BOOST_DLLEXPORT static T & instance;
+    // include this to provoke instantiation at pre-execution time
+    static void use(T const &) BOOST_NOINLINE {}
+    BOOST_DLLEXPORT static T & get_instance() {
+        static detail::singleton_wrapper< T > t;
+        // refer to instance, causing it to be instantiated (and
+        // initialized at startup on working compilers)
+        BOOST_ASSERT(! detail::singleton_wrapper< T >::m_is_destroyed);
+        use(instance);
+        return static_cast<T &>(t);
+    }
+public:
+    BOOST_DLLEXPORT static T & get_mutable_instance(){
+        BOOST_ASSERT(! is_locked());
+        return get_instance();
+    }
+    BOOST_DLLEXPORT static const T & get_const_instance(){
+        return get_instance();
+    }
+    BOOST_DLLEXPORT static bool is_destroyed(){
+        return detail::singleton_wrapper< T >::m_is_destroyed;
+    }
+};
+
+template<class T>
+BOOST_DLLEXPORT T & singleton< T >::instance = singleton< T >::get_instance();
+
+} // namespace serialization
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // BOOST_SERIALIZATION_SINGLETON_HPP
diff --git a/ecflow_4_0_7/build/boost_1_47_fix.sh b/ecflow_4_0_7/build/boost_1_47_fix.sh
new file mode 100644
index 0000000..d533c6d
--- /dev/null
+++ b/ecflow_4_0_7/build/boost_1_47_fix.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# This file is used paths up version of the boost libs
+# This script Use $BOOST_ROOT and $WK environment variable
+# Assumes boost version 1.47
+
+# Check that a command is in the PATH.
+test_path ()
+{
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
+    else
+        hash $1 1>/dev/null 2>/dev/null
+    fi
+}
+
+test_uname ()
+{
+    if test_path uname; then
+        test `uname` = $*
+    fi
+}
+
+if test_uname Linux ; then
+
+   echo "Nothing to fix"
+  
+elif test_uname HP-UX ; then
+
+  # Hack for utf8_codecvt_facet due to compiler build error on ACC
+  cp $WK/build/hpux_fix/utf8_codecvt_facet.cpp  $BOOST_ROOT/libs/detail/
+   
+elif test_uname AIX ; then  
+   
+   # Fix bug where release version crashes due to bug in Serialization/compiler
+   # See file $WK/build/aix_fix/README
+   cp $WK/build/aix_fix/singleton.hpp $BOOST_ROOT/boost/serialization/
+   cp $WK/build/aix_fix/force_include.hpp $BOOST_ROOT/boost/serialization/
+fi
diff --git a/ecflow_4_0_7/build/boost_1_48_fix.sh b/ecflow_4_0_7/build/boost_1_48_fix.sh
new file mode 100644
index 0000000..71d6f01
--- /dev/null
+++ b/ecflow_4_0_7/build/boost_1_48_fix.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# This file is used paths up version of the boost libs
+# This script Use $BOOST_ROOT and $WK environment variable
+# Assumes boost version 1.48
+
+# Check that a command is in the PATH.
+test_path ()
+{
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
+    else
+        hash $1 1>/dev/null 2>/dev/null
+    fi
+}
+
+test_uname ()
+{
+    if test_path uname; then
+        test `uname` = $*
+    fi
+}
+
+if test_uname Linux ; then
+
+   echo "Nothing to fix"
+  
+elif test_uname HP-UX ; then
+
+  # Hack for utf8_codecvt_facet due to compiler build error on ACC
+  cp $WK/build/hpux_fix/utf8_codecvt_facet.cpp  $BOOST_ROOT/libs/detail/
+
+  # Hack because boost::int8_t was being interpreted as a char,
+  # This cause duplicate class definition during template instantiation.
+  # in the file ./boost/numeric/conversion/detail/preprocessed/numeric_cast_traits.hpp
+  # See:: https://svn.boost.org/trac/boost/attachment/ticket/6158/cstdint_patch.diff
+  cp $WK/build/hpux_fix/cstdint.hpp  $BOOST_ROOT/boost/
+
+elif test_uname AIX ; then  
+   
+   # Fix bug where release version crashes due to bug in Serialization/compiler
+   # See file $WK/build/aix_fix/README
+   cp $WK/build/aix_fix/singleton.hpp $BOOST_ROOT/boost/serialization/
+   cp $WK/build/aix_fix/force_include.hpp $BOOST_ROOT/boost/serialization/
+fi
diff --git a/ecflow_4_0_7/build/boost_1_51_fix.sh b/ecflow_4_0_7/build/boost_1_51_fix.sh
new file mode 100644
index 0000000..5ff2d63
--- /dev/null
+++ b/ecflow_4_0_7/build/boost_1_51_fix.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# This file is used paths up version of the boost libs
+# This script Use $BOOST_ROOT and $WK environment variable
+# Assumes boost version 1.51
+
+# Check that a command is in the PATH.
+test_path ()
+{
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
+    else
+        hash $1 1>/dev/null 2>/dev/null
+    fi
+}
+
+test_uname ()
+{
+    if test_path uname; then
+        test `uname` = $*
+    fi
+}
+
+if test_uname HP-UX ; then
+
+  # Hack for utf8_codecvt_facet due to compiler build error on ACC
+  cp $WK/build/hpux_fix/boost_1_51_0/utf8_codecvt_facet.ipp  $BOOST_ROOT/boost/detail/.
+
+fi
diff --git a/ecflow_4_0_7/build/boost_1_53_fix.sh b/ecflow_4_0_7/build/boost_1_53_fix.sh
new file mode 100644
index 0000000..93955d5
--- /dev/null
+++ b/ecflow_4_0_7/build/boost_1_53_fix.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# This file is used paths up version of the boost libs
+# This script Use $BOOST_ROOT and $WK environment variable
+# Assumes boost version 1.51
+
+# Check that a command is in the PATH.
+test_path ()
+{
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
+    else
+        hash $1 1>/dev/null 2>/dev/null
+    fi
+}
+
+test_uname ()
+{
+    if test_path uname; then
+        test `uname` = $*
+    fi
+}
+
+if test_uname Linux ; then
+
+   echo "Nothing to fix"
+  
+elif test_uname HP-UX ; then
+
+  # Hack for utf8_codecvt_facet due to compiler build error on ACC
+  cp $WK/build/hpux_fix/boost_1_53_0/utf8_codecvt_facet.ipp  $BOOST_ROOT/boost/detail/.
+
+  # Seems to only affect debug build of ecflow(serialisation) on HP-UX
+  # Hack because:
+  #   more than one instance of overloaded function "throw_exception" matches the argument list
+  #
+  cp $WK/build/hpux_fix/boost_1_53_0/smart_cast.hpp  $BOOST_ROOT/boost/serialization/.
+   
+elif test_uname AIX ; then  
+   
+   # Fix bug with thread.cpp   libs/thread/src/pthread/thread.cpp
+   # See file $WK/build/aix_fix/README 
+   cp $WK/build/aix_fix/boost_1_53_0/thread.cpp  $BOOST_ROOT/libs/thread/src/pthread/ 
+fi
+
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/boost_1_56_fix.sh b/ecflow_4_0_7/build/boost_1_56_fix.sh
new file mode 100644
index 0000000..8e9ded5
--- /dev/null
+++ b/ecflow_4_0_7/build/boost_1_56_fix.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# This script Use $BOOST_ROOT and $WK environment variable
+# Assumes boost version 1.56
+
+# See: https://svn.boost.org/trac/boost/ticket/10348
+cp $WK/build/fix/boost_1_56_0/shared_ptr_helper.hpp  $BOOST_ROOT/boost/serialization/.
diff --git a/ecflow_4_0_7/build/boost_1_57_fix.sh b/ecflow_4_0_7/build/boost_1_57_fix.sh
new file mode 100644
index 0000000..43d3e77
--- /dev/null
+++ b/ecflow_4_0_7/build/boost_1_57_fix.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# Assumes boost version 1.57
+
+# Fix 1:
+# o https://svn.boost.org/trac/boost/ticket/10749
+# 
+#   This fix was implemented directly on the boost dir, then the tar recreated
+#   modify : shared_ptr_helper.hpp 
+#   to add
+#     #include <boost/serialization/type_info_implementation.hpp>
+
+# Fix 2: 
+# o maintain compatibility with boost 1.53 server/archives
+#   Modified Boost archive version is specified in: $BOOST_ROOT/libs/serialization/src/basic_archive.cpp
+#   From 11 -> 10
+#
+# There has not been any changes to boost that affects, text archives.
+# Testing with old version of the servers, and new clients, do not show any issues.
+#
+
+# Fix 1 notes:
+# In file included from /var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr.hpp:29:0,
+#                 from Base/src/cts/ClientToServerCmd.hpp:25,
+#                 from Base/test/TestRequeueNodeCmd.cpp:17:
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp: In static member function 'static const boost::serialization::extended_type_info* boost::serialization::shared_ptr_helper<SPT>::non_polymorphic::get_object_type(U&)':
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:108:39: error: 'type_info_implementation' in namespace 'boost::serialization' does not name a type
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:108:63: error: expected template-argument before '<' token
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:108:63: error: expected '>' before '<' token
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:109:13: error: template argument 1 is invalid
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:109:16: error: expected '(' before 'get_const_instance'
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:109:16: error: expected ';' before 'get_const_instance'
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:109:35: error: there are no arguments to 'get_const_instance' that depend on a template parameter, so a declaration of 'get_const_instance' must be available
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:109:35: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp: In static member function 'static const boost::serialization::extended_type_info* boost::serialization::shared_ptr_helper<SPT>::polymorphic::get_object_type(U&)':
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:118:39: error: 'type_info_implementation' in namespace 'boost::serialization' does not name a type
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:118:63: error: expected template-argument before '<' token
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:118:63: error: expected '>' before '<' token
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:119:13: error: template argument 1 is invalid
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:119:16: error: expected '(' before 'get_const_instance'
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:119:16: error: expected ';' before 'get_const_instance'
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:119:35: error: there are no arguments to 'get_const_instance' that depend on a template parameter, so a declaration of 'get_const_instance' must be available
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp: In member function 'void boost::serialization::shared_ptr_helper<SPT>::reset(SPT<T>&, T*)':
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:131:17: error: 'type_info_implementation' is not a member of 'boost::serialization'
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:131:67: error: expected primary-expression before '>' token
+#/var/tmp/ma0/boost/boost_1_57_0/boost/serialization/shared_ptr_helper.hpp:131:70: error: '::type' has not been declared
+#...failed gcc.compile.c++ Base/bin/gcc-4.5/release/test/TestRequeueNodeCmd.o...
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/boost_build.sh b/ecflow_4_0_7/build/boost_build.sh
new file mode 100755
index 0000000..b250732
--- /dev/null
+++ b/ecflow_4_0_7/build/boost_build.sh
@@ -0,0 +1,152 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# This file is used build the boost libs used by ecflow
+# This script Use $BOOST_ROOT and $WK environment variable
+echo "WK=$WK"
+echo "BOOST_ROOT=$BOOST_ROOT"
+
+#
+# From boost 1.56 > the location of site-config.jam location has changed
+#
+SITE_CONFIG_LOCATION=$BOOST_ROOT/tools/build/v2/site-config.jam
+BOOST_VERSION="$(basename $BOOST_ROOT)"
+if [[ "$BOOST_VERSION" = boost_1_56_0 || "$BOOST_VERSION" = boost_1_57_0 ]] ; then
+   SITE_CONFIG_LOCATION=$BOOST_ROOT/tools/build/src/site-config.jam
+fi
+
+tool=
+
+# Check that a command is in the PATH.
+test_path ()
+{
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
+    else
+        hash $1 1>/dev/null 2>/dev/null
+    fi
+}
+
+test_uname ()
+{
+    if test_path uname; then
+        test `uname` = $*
+    fi
+}
+
+#
+# --layout=system    -> libboost_system.a (default)
+# --layout=tagged    -> libboost_system-mt-d.a(debug)          libboost_system-mt.a(release) 
+# --layout=versioned -> libboost_system-xlc-mt-d-1.42(debug)   libboost_system-xlc-mt-1_42.a(release)
+#
+# for some reason on cray versioned does not embed the compiler name as a part
+# of the library name. However it it does add the boost version.
+# Hence we will use this to distinguish between the g++ and cray boost libs
+# On *CRAY* we can have 3 compilers we will use the versioned for CRAY and INTEL library
+layout=tagged
+
+CXXFLAGS=
+if test_uname Linux ; then
+  tool=gcc
+  X64=$(uname -m)
+  if [ "$X64" = x86_64 ]
+  then
+    # PE_ENV is defined in cray environment, at least on sandy bridge
+    if [ "$PE_ENV" = GNU -o "$PE_ENV" = INTEL -o "$PE_ENV" = CRAY ]
+    then
+       CXXFLAGS=cxxflags=-fPIC
+       layout=versioned  
+       
+       cp $WK/build/site_config/site-config-cray.jam $SITE_CONFIG_LOCATION
+       if [ "$PE_ENV" = INTEL ] ; then
+          tool=intel
+       fi
+       if [ "$PE_ENV" = CRAY ] ; then
+          tool=cray
+       fi
+    else
+       cp $WK/build/site_config/site-config-Linux64.jam $SITE_CONFIG_LOCATION  
+    fi
+     
+  else 
+    cp $WK/build/site_config/site-config-Linux.jam $SITE_CONFIG_LOCATION
+  fi
+  
+elif test_uname HP-UX ; then
+
+  tool=acc
+  cp $WK/build/site_config/site-config-HPUX.jam $SITE_CONFIG_LOCATION
+   
+elif test_uname AIX ; then
+
+   # on c1a
+   tool=vacpp
+   cp $WK/build/site_config/site-config-AIX.jam $SITE_CONFIG_LOCATION
+fi
+
+# Only uncomment for debugging this script
+#rm -rf stage
+#rm -rf tmpBuildDir
+
+#
+# Note: if '--build-dir=./tmpBuildDir' is omitted, boost will build the libs in a directory:
+#   bin.v2/
+# On completion , the library is copied to:
+#   stage/lib/
+# 
+
+# We use tagged as that allows the debug and release builds to built together
+#
+echo "using compiler $tool with build $1 variants "
+# ========================================================================
+# Note: boost thread *ONLY* need to test multi-threaded server See: define ECFLOW_MT
+# ========================================================================
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-system variant=debug -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-date_time variant=debug -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-filesystem variant=debug  -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-program_options variant=debug -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-serialization  variant=debug -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-test variant=debug  -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-thread variant=debug  -j2
+
+
+# ========================================================================
+# Note: boost thread *ONLY* need to test multi-threaded server See: define ECFLOW_MT
+# ========================================================================
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-system variant=release -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-date_time variant=release  -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-filesystem variant=release   -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-program_options variant=release -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-serialization  variant=release -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-test variant=release  -j2
+./bjam --build-dir=./tmpBuildDir toolset=$tool $CXXFLAGS stage link=static --layout=$layout --with-thread variant=release  -j2
+
+
+# Allow python to be disabled  
+if [ -n "$ECF_NO_PYTHON" ] ; then   
+   echo "****************************************************************************"
+   echo "Ignore boost python. ECF_NO_PYTHON set."
+   echo "****************************************************************************"
+else
+   # ================================================================================
+   # Build python
+   # ================================================================================
+   #*** If the boost python HAS not been built, and we build in $WK/Pyext, then it will build 
+   #*** boost python in $BOOST_ROOT/bin.v2/
+   #*** It appears to build boost python single threaded. (i.e you do not see threading-multi) in the directory path.
+   #
+   # To prebuild the boost python, hence we need to do the following: For now build both variants, keeps cmake happy! (i.e when finding libs)
+   #
+   ./bjam toolset=$tool link=shared variant=debug   $CXXFLAGS stage --layout=$layout threading=multi --with-python -d2 -j2
+   ./bjam toolset=$tool link=shared variant=release $CXXFLAGS stage --layout=$layout threading=multi --with-python -d2 -j2
+   ./bjam toolset=$tool link=static variant=debug   $CXXFLAGS stage --layout=$layout threading=multi --with-python -d2 -j2
+   ./bjam toolset=$tool link=static variant=release $CXXFLAGS stage --layout=$layout threading=multi --with-python -d2 -j2
+fi
+
+ 
diff --git a/ecflow_4_0_7/build/clean.sh b/ecflow_4_0_7/build/clean.sh
new file mode 100644
index 0000000..299667d
--- /dev/null
+++ b/ecflow_4_0_7/build/clean.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+cd $WK
+
+# Remove the bin directories
+rm -rf ACore/bin
+rm -rf ANattr/bin
+rm -rf ANode/bin 
+rm -rf AParser/bin 
+rm -rf Base/bin
+rm -rf CSim/bin
+rm -rf Client/bin 
+rm -rf Server/bin 
+rm -rf Test/bin
+rm -rf Pyext/bin 
+rm -rf view/bin 
+   
+# remove generated files
+rm -rf Doc/online/_build/*
+rm -rf Test/data/ECF_HOME_debug*
+rm -rf Test/data/ECF_HOME_release*
+rm -rf view/data/ECF_HOME_debug*
+rm -rf view/data/ECF_HOME_release*
+rm -rf AParser/test/data/single_defs/mega.def_log
+rm -rf Pyext/test.def
+rm -rf Pyext/build
+rm -rf bin
+rm -rf RemoteSystemsTempFiles
+rm -rf *.dat
+rm -rf *.log
+
+find . -name \*~ -exec rm -rf \*~ {} \; -print
+find . -name \*.mk -exec rm -rf \*.mk {} \; -print
+find . -name \*.so -exec rm -rf \*.so {} \; -print
+find . -name \*.tmp -exec rm -rf \*.tmp {} \; -print
+find . -name \*.job\* -exec rm -rf \*.job\* {} \; -print
+find . -name \*.check -exec rm -rf \*.check {} \; -print
+find . -name \*.flat -exec rm -rf \*.flat {} \; -print
+find . -name \*.depth -exec rm -rf \*.depth {} \; -print
+find . -name \*.out -exec rm -rf \*.out {} \; -print
+find . -name \*.pyc -exec rm -rf \*.pyc {} \; -print
+find . -name t\*.1 -exec rm -rf t\*.1 {} \; -print
+find . -name gmon.out -exec rm -rf gmon.out {} \; -print
+find . -name gnuplot.dat -exec rm -rf gnuplot.dat {} \; -print
+find . -name gnuplot.script -exec rm -rf gnuplot.script {} \; -print
+find . -name ecflow.html -exec rm -rf ecflow.html {} \; -print
+find . -name core -exec rm -rf core {} \; -print
+find . -name `hostname`.*.ecf.* -exec rm -rf `hostname`.*.ecf.* {} \; -print
+find . -name callgrind.out.\* -exec rm -rf callgrind.out.\* {} \; -print
+find . -name massif.out.\* -exec rm -rf massif.out.* {} \; -print
+
+# remove any defs file at the workspace level. There should not be any
+rm -rf *.def
+   
+# Remove any lock file create by tests which used EcfPortLock.hpp
+rm -rf *.lock
+
diff --git a/ecflow_4_0_7/build/cray_fix/boost_1_55_0/README b/ecflow_4_0_7/build/cray_fix/boost_1_55_0/README
new file mode 100644
index 0000000..476b92f
--- /dev/null
+++ b/ecflow_4_0_7/build/cray_fix/boost_1_55_0/README
@@ -0,0 +1,111 @@
+Fixes for boost 1.55, use with at least cce/8.3.0.186  
+======================================================
+
+Hi Avi,
+
+here a reply from Cray:
+
+
+the following back from the compiler group on this:
+
+---
+
+This is one of half a dozen constants that GNU provides, but that we (at the present time) don't.  
+I believe these will be defined by the compiler when we have relatively complete C++ 11 support.
+
+In the meantime,
+
+They can use the 1.56 version of ...boost/config/compiler/cray.hpp available here. 
+https://github.com/boostorg/config/blob/master/include/boost/config/compiler/cray.hpp
+
+ 
+Or insert the following into ...boost/config/user.hpp
+
+#ifndef __ATOMIC_RELAXED
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_SEQ_CST 5
+#endif
+
+
+or add these 8 lines to the ...boost/config/compiler/cray.hpp that they are using now.
+
+
+Christian
+
+----- Original Message -----
+> From: "Avi Bahra" <avi.bahra at ecmwf.int>
+> To: "Christian Weihrauch" <christian.weihrauch at ecmwf.int>
+> Cc: "Tiago Quintino" <tiago.quintino at ecmwf.int>
+> Sent: Thursday, 19 June, 2014 3:43:19 PM
+> Subject: Re: boost-1.55 patch for Cray
+>
+> Hi Christian,
+>
+>    I have applied the patch to boost 1.55.
+>    Most of boost compiled libs now build, with cray cce/8.3.0.186.
+>
+>    However it still fails to compile boost thread.
+>    Not sure if this is bug in their 'cray.jam' file, since it seems
+>    reference gnu ?
+>    Can you please inquire, if this is still a known issue.
+>
+> CC-20 crayc++: ERROR File =
+> /perm/ma/ma0/boost/boost_1_55_0/./boost/atomic/detail/gcc-atomic.hpp,
+> Line = 37
+>   The identifier "__ATOMIC_RELAXED" is undefined.
+>
+>       return (order == memory_order_relaxed ? __ATOMIC_RELAXED :
+>       (order == memory_order_consume ? __ATOMIC_CONSUME :
+>
+> Best regards
+>
+> Ta,
+>   Avi
+>
+> ----- Original Message -----
+> From: "Christian Weihrauch" <christian.weihrauch at ecmwf.int>
+> To: "Avi Bahra" <avi.bahra at ecmwf.int>, "Tiago Quintino"
+> <tiago.quintino at ecmwf.int>, "Stephan Siemen"
+> <stephan.siemen at ecmwf.int>
+> Sent: Monday, 16 June, 2014 4:01:03 PM
+> Subject: boost-1.55 patch for Cray
+>
+> Hi,
+>
+> Here the diff for boost-1.55 provided by Cray.
+>
+>
+> ###########################################################################################
+>
+> Please find attached a patch file against the boost-1.55.0 source.
+>   This should be used with cce/8.3.0.
+>
+> Instructions for use:
+>
+> > tar xvf boost_1_55_0.tar   (untar the boost archive into
+> > boost_1_55_0
+> > cp smalldiff boost_1_55_0  (copy the patch file into the boost
+> > directory)
+> > cd boost_1_55_0
+> > patch -p0 <smalldiff (apply patches to get cray to work better)
+> > ./bootstrap.sh
+> > ./b2 --with-serialization --with-system --with-filesystem
+> > --with-date_time --with-program_options --with-test -d2
+> > toolset=cray stage | & tee buildlog
+>
+> Builds the libraries in  boost_1_55_0/stage.
+>
+> Please note that when boost-1.56.0 is out the patch file will no
+> longer be required as we've pushed these changes into the boost
+> repository.
+>
+>
+> ###########################################################################################
+>
+>
+> Christian
+>
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/cray_fix/boost_1_55_0/cray.hpp b/ecflow_4_0_7/build/cray_fix/boost_1_55_0/cray.hpp
new file mode 100644
index 0000000..8271948
--- /dev/null
+++ b/ecflow_4_0_7/build/cray_fix/boost_1_55_0/cray.hpp
@@ -0,0 +1,88 @@
+// (C) Copyright John Maddock 2011.
+// (C) Copyright Cray, Inc. 2013
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for most recent version.
+
+// Greenhills C compiler setup:
+
+#define BOOST_COMPILER "Cray C version " BOOST_STRINGIZE(_RELEASE)
+
+#if _RELEASE < 8
+# error "Boost is not configured for Cray compilers prior to version 8, please try the configure script."
+#endif
+
+//
+// Check this is a recent EDG based compiler, otherwise we don't support it here:
+//
+#ifndef __EDG_VERSION__
+# error "Unsupported Cray compiler, please try running the configure script."
+#endif
+
+#include "boost/config/compiler/common_edg.hpp"
+
+
+//
+//
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_HAS_NRVO
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#define BOOST_HAS_NRVO
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+//#define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG
+#define BOOST_MATH_DISABLE_STD_FPCLASSIFY
+//#define BOOST_HAS_FPCLASSIFY
+
+#define BOOST_SP_USE_PTHREADS
+#define BOOST_AC_USE_PTHREADS
+
+/* everything that follows is working around what are thought to be
+* compiler shortcomings. Revist all of these regularly.
+*/
+
+//#define BOOST_USE_ENUM_STATIC_ASSERT
+//#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS //(this may be implied by the previous #define
+
+// These constants should be provided by the
+// compiler, at least when -hgnu is asserted on the command line.
+
+#ifndef __ATOMIC_RELAXED
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_SEQ_CST 5
+#endif
+
+
diff --git a/ecflow_4_0_7/build/cray_fix/boost_1_55_0/smalldiff b/ecflow_4_0_7/build/cray_fix/boost_1_55_0/smalldiff
new file mode 100644
index 0000000..0dc5f2c
--- /dev/null
+++ b/ecflow_4_0_7/build/cray_fix/boost_1_55_0/smalldiff
@@ -0,0 +1,144 @@
+Index: boost/config/compiler/cray.hpp
+===================================================================
+--- boost/config/compiler/cray.hpp	(revision 374)
++++ boost/config/compiler/cray.hpp	(revision 384)
+@@ -22,11 +22,12 @@
+ 
+ #include "boost/config/compiler/common_edg.hpp"
+ 
++
+ //
+ // Cray peculiarities, probably version 7 specific:
+ //
+-#undef BOOST_NO_CXX11_AUTO_DECLARATIONS
+-#undef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
++#define BOOST_NO_CXX11_AUTO_DECLARATIONS
++#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+ #define BOOST_HAS_NRVO
+ #define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+ #define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+@@ -63,3 +64,5 @@
+ #define BOOST_SP_USE_PTHREADS
+ #define BOOST_AC_USE_PTHREADS
+ 
++//#undef __GNUC__  Try plan A first.
++
+Index: boost/interprocess/detail/atomic.hpp
+===================================================================
+--- boost/interprocess/detail/atomic.hpp	(revision 374)
++++ boost/interprocess/detail/atomic.hpp	(revision 384)
+@@ -93,7 +93,7 @@
+ }  //namespace interprocess{
+ }  //namespace boost{
+ 
+-#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
++#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(_CRAYC)
+ 
+ namespace boost {
+ namespace interprocess {
+Index: boost/asio/detail/fenced_block.hpp
+===================================================================
+--- boost/asio/detail/fenced_block.hpp	(revision 374)
++++ boost/asio/detail/fenced_block.hpp	(revision 384)
+@@ -29,7 +29,7 @@
+ # include <boost/asio/detail/gcc_arm_fenced_block.hpp>
+ #elif defined(__GNUC__) && (defined(__hppa) || defined(__hppa__))
+ # include <boost/asio/detail/gcc_hppa_fenced_block.hpp>
+-#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
++#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(_CRAYC)
+ # include <boost/asio/detail/gcc_x86_fenced_block.hpp>
+ #elif defined(__GNUC__) \
+   && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \
+@@ -58,7 +58,7 @@
+ typedef gcc_arm_fenced_block fenced_block;
+ #elif defined(__GNUC__) && (defined(__hppa) || defined(__hppa__))
+ typedef gcc_hppa_fenced_block fenced_block;
+-#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
++#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(_CRAYC)
+ typedef gcc_x86_fenced_block fenced_block;
+ #elif defined(__GNUC__) \
+   && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \
+Index: libs/log/src/dump.cpp
+===================================================================
+--- libs/log/src/dump.cpp	(revision 374)
++++ libs/log/src/dump.cpp	(revision 384)
+@@ -113,7 +113,7 @@
+ BOOST_LOG_API dump_data_char32_t* dump_data_char32 = &dump_data_generic< char32_t >;
+ #endif
+ 
+-#if defined(BOOST_LOG_USE_SSSE3) || defined(BOOST_LOG_USE_AVX2)
++#if (defined(BOOST_LOG_USE_SSSE3) || defined(BOOST_LOG_USE_AVX2)) && !defined(_CRAYC)
+ 
+ BOOST_LOG_ANONYMOUS_NAMESPACE {
+ 
+Index: tools/build/v2/tools/cray.jam
+===================================================================
+--- tools/build/v2/tools/cray.jam	(revision 374)
++++ tools/build/v2/tools/cray.jam	(revision 384)
+@@ -47,24 +47,31 @@
+ generators.register-c-compiler cray.compile.c : C : OBJ : <toolset>cray ;
+ 
+ 
+-
+-# No static linking as far as I can tell.
++# unlike most compliers, Cray defaults to static linking.
+ # flags cxx LINKFLAGS <runtime-link>static : -bstatic ;
+-flags cray.compile OPTIONS <debug-symbols>on : -Gn ;
+-flags cray.link OPTIONS <debug-symbols>on : -Gn ;
++flags cray.compile OPTIONS <debug-symbols>on : -G0 ;
++flags cray.link OPTIONS <debug-symbols>on : -G0 ;
+ 
+ flags cray.compile OPTIONS <optimization>off : -O0 ;
+-flags cray.compile OPTIONS <optimization>speed : -O3 ;
++flags cray.compile OPTIONS <optimization>speed : -O2 ;
+ flags cray.compile OPTIONS <optimization>space : -O1 ;
+ 
++# flags cray.compile OPTIONS <inlining>off  : -hipa0 ;
++# flags cray.compile OPTIONS <inlining>on   : ;
++# flags cray.compile OPTIONS <inlining>full : -hipa5 ;
++
+ flags cray.compile OPTIONS <cflags> ;
+ flags cray.compile.c++ OPTIONS <cxxflags> ;
+ flags cray.compile DEFINES <define> ;
+ flags cray.compile INCLUDES <include> ;
+ flags cray.link OPTIONS <linkflags> ;
+ 
+-flags cray.compile OPTIONS <link>shared : -fPIC ;
+-flags cray.link OPTIONS <link>shared : -fPIC ;
++flags cray.compile OPTIONS : -hgnu -fPIC -h system_alloc -h tolerant -h ipa0 ;
++flags cray.compile OPTIONS <link>shared : -dynamic ;
++flags cray.compile OPTIONS <link>static : -static ;
++flags cray.link OPTIONS <link>static : -static ;
++flags cray.link OPTIONS <link>shared : ;
++flags cray.link LOPTIONS <link>shared : -dynamic ;
+ 
+ flags cray.link LIBPATH <library-path> ;
+ flags cray.link LIBRARIES <library-file> ;
+@@ -73,7 +80,7 @@
+ 
+ actions link bind LIBRARIES
+ {
+-    $(CONFIG_COMMAND) $(OPTIONS) -o "$(<)" -L$(LIBPATH) "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA)
++    $(CONFIG_COMMAND) $(OPTIONS) $(LOPTIONS) -o "$(<)" -L$(LIBPATH) "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA)
+ }
+ 
+ # When creating dynamic libraries, we don't want to be warned about unresolved
+@@ -83,7 +90,7 @@
+ 
+ actions link.dll bind LIBRARIES
+ {
+-    $(CONFIG_COMMAND) -shared $(OPTIONS) -o "$(<[1])" -L$(LIBPATH)  "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA)
++    $(CONFIG_COMMAND) -o "$(<[1])" -Wl,-h -Wl,$(<[-1]:D=) -shared -L$(LIBPATH)  "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(OPTIONS)
+ }
+ 
+ 
+@@ -103,7 +110,7 @@
+ 
+ actions compile.c++
+ {
+-    $(CONFIG_COMMAND) -c -h gnu $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -o "$(<)" "$(>)"
++    $(CONFIG_COMMAND) -c $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -o "$(<)" "$(>)"
+ }
+ 
+ # Always create archive from scratch. See the gcc toolet for rationale.
+
diff --git a/ecflow_4_0_7/build/cray_fix/swap.sh b/ecflow_4_0_7/build/cray_fix/swap.sh
new file mode 100644
index 0000000..4b8578f
--- /dev/null
+++ b/ecflow_4_0_7/build/cray_fix/swap.sh
@@ -0,0 +1,100 @@
+#!/bin/ksh
+
+# ==================================================================
+# Setup environment on CRAY, allow switch between cray,intel and gnu
+# ==================================================================
+
+#set -e # stop the shell on first error
+#set -u # fail when using an undefined variable
+#set -x # echo script lines as they are executed
+
+if [[ "$#" != 1 ]] ; then
+   echo "Expect one of [ gnu, intel, cray ] "
+   exit 1
+else 
+  if [[ "$1" != cray && "$1" != intel && "$1" != gnu ]] ; then
+     echo "Expect one of [ gnu, intel, cray ] "
+     exit 1
+  fi
+fi
+
+echo "STARTING   PE_ENV=$PE_ENV"
+
+# access the module functionality
+. /opt/modules/default/etc/modules.sh
+   
+# setup boost
+export BOOST_ROOT=/perm/ma/ma0/boost/boost_1_53_0
+cp $WK/build/site_config/site-config-cray.jam $BOOST_ROOT/tools/build/v2/site-config.jam
+   
+if [[ "$1" = cray ]] ; then
+   if [[ "$PE_ENV" = INTEL ]] ; then
+      module swap PrgEnv-intel PrgEnv-cray
+   fi
+   if [[ "$PE_ENV" = GNU ]] ; then
+      module swap PrgEnv-gnu PrgEnv-cray
+   fi
+   
+   module unload cce
+   module load cce/8.3.0.186
+   export COMPILER_VERSION=$(echo $CRAY_CC_VERSION | sed 's/\.//' | cut -c1-2)
+   export WK=/perm/ma/ma0/workspace/$PE_ENV/ecflow
+   export BOOST_ROOT=/perm/ma/ma0/boost/boost_1_55_0
+   cp $WK/build/site_config/site-config-cray.jam $BOOST_ROOT/tools/build/v2/site-config.jam
+   alias bjam='$BOOST_ROOT/bjam cxxflags=-hPIC toolset=cray'
+   
+   # module cray-libsci interferes with ecflow linking, hence disable
+   module unload cray-libsci
+fi
+
+
+if [[ "$1" = intel ]] ; then
+   if [[ "$PE_ENV" = CRAY ]] ; then
+      module swap PrgEnv-cray PrgEnv-intel
+   fi
+   if [[ "$PE_ENV" = GNU ]] ; then
+      module swap PrgEnv-gnu PrgEnv-intel
+   fi
+   
+   # for compiler version icc -dumpversion
+   export COMPILER_VERSION=$(icc -dumpversion | sed 's/\.//' | cut -c1-3)
+   export WK=/perm/ma/ma0/workspace/$PE_ENV/ecflow
+   alias bjam='$BOOST_ROOT/bjam cxxflags=-fPIC toolset=intel'
+fi
+
+if [[ "$1" = gnu ]] ; then
+   if [[ "$PE_ENV" = CRAY ]] ; then
+      module swap PrgEnv-cray PrgEnv-gnu
+   fi
+   if [[ "$PE_ENV" = INTEL ]] ; then
+      module swap PrgEnv-intel PrgEnv-gnu
+   fi
+   
+   # for compiler version gcc -dumpversion
+   #module load gcc/4.6.3
+   
+   export COMPILER_VERSION=$(gcc -dumpversion | sed 's/\.//' | cut -c1-2)
+   export WK=/perm/ma/ma0/workspace/$PE_ENV/ecflow
+   alias bjam='$BOOST_ROOT/bjam cxxflags=-fPIC toolset=gcc'     
+fi
+
+
+# =================================================================================================
+# Determine the release,major,minor numbers for this version 
+cd $WK
+release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+ECFLOW_VERSION=$release.$major.$minor
+  
+export ECFLOW_INSTALL_DIR=/usr/local/apps/ecflow/$release.$major.$minor
+export ECFLOW_PYTHON_INSTALL_DIR=$ECFLOW_INSTALL_DIR/lib/python/2.7/site-packages/ecflow 
+
+
+echo "AFTER SWAP PE_ENV=$PE_ENV"
+echo "WK=$WK"
+echo "BOOST_ROOT=$BOOST_ROOT"
+echo "COMPILER_VERSION=$COMPILER_VERSION"
+echo "ECFLOW_INSTALL_DIR=$ECFLOW_INSTALL_DIR"  
+echo "ECFLOW_PYTHON_INSTALL_DIR=$ECFLOW_PYTHON_INSTALL_DIR"  
+
diff --git a/ecflow_4_0_7/build/cray_fix/update_cray_swap.sh b/ecflow_4_0_7/build/cray_fix/update_cray_swap.sh
new file mode 100755
index 0000000..0246478
--- /dev/null
+++ b/ecflow_4_0_7/build/cray_fix/update_cray_swap.sh
@@ -0,0 +1,9 @@
+#!/bin/ksh
+
+# ==================================================================
+# Setup environment on CRAY, allow switch between cray,intel and gnu
+# ==================================================================
+
+scp $WK/build/cray_fix/swap.sh cca:/home/ma/ma0/.
+ 
+echo "copied swap.sh to cca:/home/ma/ma0/."
diff --git a/ecflow_4_0_7/build/fix/boost_1_56_0/shared_ptr_helper.hpp b/ecflow_4_0_7/build/fix/boost_1_56_0/shared_ptr_helper.hpp
new file mode 100644
index 0000000..35f8c23
--- /dev/null
+++ b/ecflow_4_0_7/build/fix/boost_1_56_0/shared_ptr_helper.hpp
@@ -0,0 +1,216 @@
+#ifndef BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP
+#define BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr_helper.hpp: serialization for boost shared pointern
+
+// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <map>
+#include <list>
+#include <utility>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+#include <boost/mpl/if.hpp>
+
+// <avi> these 2 includes were forgotten. ?????
+#include <boost/serialization/singleton.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+#include <boost/serialization/type_info_implementation.hpp>
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/decl.hpp>
+
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last headern
+
+namespace boost_132 {
+    template<class T> class shared_ptr;
+}
+namespace boost {
+namespace serialization {
+
+class extended_type_info;
+
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+template<class Archive, template<class U> class SPT >
+void load(
+    Archive & ar,
+    SPT< class U > &t,
+    const unsigned int file_version
+);
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// a common class for holding various types of shared pointers
+
+template<template<class T> class SPT>
+class shared_ptr_helper {
+    typedef std::map<
+        const void *, // address of object
+        SPT<void> // address shared ptr to single instance
+    > object_shared_pointer_map;
+
+    // list of shared_pointers create accessable by raw pointer. This
+    // is used to "match up" shared pointers loaded at different
+    // points in the archive. Note, we delay construction until
+    // it is actually used since this is by default included as
+    // a "mix-in" even if shared_ptr isn't used.
+    object_shared_pointer_map * m_o_sp;
+
+    struct null_deleter {
+        void operator()(void const *) const {}
+    };
+
+#if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) || defined(BOOST_MSVC)
+public:
+#else
+    template<class Archive, class U>
+    friend void boost::serialization::load(
+        Archive & ar,
+        SPT< U > &t,
+        const unsigned int file_version
+    );
+#endif
+
+    #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+    // list of loaded pointers.  This is used to be sure that the pointers
+    // stay around long enough to be "matched" with other pointers loaded
+    // by the same archive.  These are created with a "null_deleter" so that
+    // when this list is destroyed - the underlaying raw pointers are not
+    // destroyed.  This has to be done because the pointers are also held by
+    // new system which is disjoint from this set.  This is implemented
+    // by a change in load_construct_data below.  It makes this file suitable
+    // only for loading pointers into a 1.33 or later boost system.
+    std::list<boost_132::shared_ptr<const void> > * m_pointers_132;
+    BOOST_ARCHIVE_DECL(void)
+    append(const boost_132::shared_ptr<const void> & t){
+        if(NULL == m_pointers_132)
+            m_pointers_132 = new std::list<boost_132::shared_ptr<const void> >;
+        m_pointers_132->push_back(t);
+    }
+    #endif
+
+    struct non_polymorphic {
+        template<class U>
+        static const boost::serialization::extended_type_info *
+        get_object_type(U & ){
+            return & boost::serialization::singleton<
+                typename
+                boost::serialization::type_info_implementation< U >::type
+            >::get_const_instance();
+        }
+    };
+    struct polymorphic {
+        template<class U>
+        static const boost::serialization::extended_type_info *
+        get_object_type(U & u){
+            return boost::serialization::singleton<
+                typename
+                boost::serialization::type_info_implementation< U >::type
+            >::get_const_instance().get_derived_extended_type_info(u);
+        }
+    };
+
+public:
+    template<class T>
+    void reset(SPT< T > & s, T * t){
+        if(NULL == t){
+            s.reset();
+            return;
+        }
+        const boost::serialization::extended_type_info * this_type
+            = & boost::serialization::type_info_implementation< T >::type
+                    ::get_const_instance();
+
+        // get pointer to the most derived object's eti.  This is effectively
+        // the object type identifer
+        typedef typename mpl::if_<
+            is_polymorphic< T >,
+            polymorphic,
+            non_polymorphic
+        >::type type;
+
+        const boost::serialization::extended_type_info * true_type
+            = type::get_object_type(*t);
+
+        // note:if this exception is thrown, be sure that derived pointern
+        // is either registered or exported.
+        if(NULL == true_type)
+            boost::serialization::throw_exception(
+                boost::archive::archive_exception(
+                    boost::archive::archive_exception::unregistered_class,
+                    this_type->get_debug_info()
+                )
+            );
+        // get void pointer to the most derived type
+        // this uniquely identifies the object referred to
+        // oid = "object identifier"
+        const void * oid = void_downcast(
+            *true_type,
+            *this_type,
+            t
+        );
+        if(NULL == oid)
+            boost::serialization::throw_exception(
+                boost::archive::archive_exception(
+                    boost::archive::archive_exception::unregistered_cast,
+                    true_type->get_debug_info(),
+                    this_type->get_debug_info()
+                )
+            );
+
+        // make tracking array if necessary
+        if(NULL == m_o_sp)
+            m_o_sp = new object_shared_pointer_map;
+
+        typename object_shared_pointer_map::iterator i = m_o_sp->find(oid);
+
+        // if it's a new object
+        if(i == m_o_sp->end()){
+            s.reset(t);
+            std::pair<typename object_shared_pointer_map::iterator, bool> result;
+            result = m_o_sp->insert(std::make_pair(oid, s));
+            BOOST_ASSERT(result.second);
+        }
+        // if the object has already been seen
+        else{
+            s = SPT<T>(i->second, t);
+        }
+    }
+
+    shared_ptr_helper() :
+        m_o_sp(NULL)
+        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+            , m_pointers_132(NULL)
+        #endif
+    {}
+    virtual ~shared_ptr_helper(){
+        if(NULL != m_o_sp)
+            delete m_o_sp;
+        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+        if(NULL != m_pointers_132)
+            delete m_pointers_132;
+        #endif
+    }
+};
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP
diff --git a/ecflow_4_0_7/build/hpux_fix/README b/ecflow_4_0_7/build/hpux_fix/README
new file mode 100644
index 0000000..df744bc
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/README
@@ -0,0 +1,199 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+Compilation problems with: <boost_root>/boost/detail/utf8_codecvt_facet.ipp ( boost 1.53/1.51)
+was prevously file         <boost_root>/libs/detail/utf8_codecvt_facet.cpp  ( boost 1.42 --> 1.48)
+==========================================================================
+
+This needs to be fixed to boost versions:
+    1.42:
+    1.43:
+    1.44: (not tested)
+    1.45:
+    1.51
+    1.53
+
+Affects filesystem,program_options,serialisation
+
+Work around is to rewrite "get_cont_octet_out_count_impl"
+ignoring the preprocessor directives (which are window specific anyway)
+(see below). This needs to be done for each release as we dont know
+what else has changed.
+
+>>>>>>>>
+For 1.42 can no longer build boost on HP-UX.
+File-system, program-options and serialisation all show a similar
+problem
+
++ bjam --build-dir=./tmpBuildDir toolset=acc stage link=static --with-filesystem variant=debug
+...patience...
+.......
+acc.compile.c++ tmpBuildDir/boost/bin.v2/libs/filesystem/build/acc/debug/link-static/threading-multi/utf8_codecvt_facet.o
+"./libs/detail/utf8_codecvt_facet.cpp", line 255: error #2014-D: extra text after expected end of preprocessing directive
+  #elif WCHAR_MAX > 0x10000
+
+
+
+File:                     <boost_root>/boost/detail/utf8_codecvt_facet.ipp ( boost 1.53/1.51)
+was prevously file         <boost_root>/libs/detail/utf8_codecvt_facet.cpp  ( boost 1.42 --> 1.48)
+
+appears to have been changed in boost 1.40
+for the function  get_cont_octet_out_count_impl
+
+FROM:
+// note the following code will generate on some platforms where
+// wchar_t is defined as UCS2.  The warnings are superfluous as
+// the specialization is never instantitiated with such compilers.
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+}
+
+TO:
+
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+
+    // Note that the following code will generate warnings on some platforms
+    // where wchar_t is defined as UCS2.  The warnings are superfluous as the
+    // specialization is never instantitiated with such compilers, but this
+    // can cause problems if warnings are being treated as errors, so we guard
+    // against that.  Including <boost/detail/utf8_codecvt_facet.hpp> as we do
+    // should be enough to get WCHAR_MAX defined.
+#if !defined(WCHAR_MAX)
+#   error WCHAR_MAX not defined!
+#endif
+    // cope with VC++ 7.1 or earlier having invalid WCHAR_MAX
+#if defined(_MSC_VER) && _MSC_VER <= 1310 // 7.1 or earlier
+    return 2;
+#elif WCHAR_MAX > 0x10000
+   
+   if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+   
+#else
+    return 2;
+#endif
+}
+
+
+
+
+
+acc version 6 compiler problems with /boost/asio/detail/socket_ops.hpp 
+==================================================================================================
+**** This is required for all boost version < 1.45
+**** Seem to have been fixed in boost 1.45
+
+1/ The asio /boost/asio/detail/socket_ops.hpp (Line 643)
+   make a reference to ::pselect which is not defined on HPUX 11.23
+ 
+   In HP_UX 11.11,11.23  select() was defined in <sys/time.h>
+   In HP-UX 11.31        select() was moved to <sys/select.h> and pselect() was introduced in the same file
+
+   Hence boost/socket_ops.hpp needs a way of distinguishing OS versions.
+   for the moment the work around may be to introduce a define like 011.31 | OS_IS_HPUX11_31
+
+   // avi>> added ' && defined(OS_IS_HPUX11_31)'
+   #if defined(__hpux) && defined(__HP_aCC) && defined(OS_IS_HPUX11_31)
+
+   SO THAT WE CHOOSE select and NOT pselect
+
+2/ additionally in 11.23 there are 2 ::select to choose:
+
+  #include <sys/time.h>
+
+      int select(int nfds, fd_set *readfds, fd_set *writefds,
+           fd_set *errorfds, struct timeval *timeout);
+ 
+  For Backward Compatibility Only: (_XOPEN_SOURCE_EXTENDED not defined)
+
+      #include <time.h>
+
+      int select(size_t nfds, int *readfds, int *writefds,
+           int *exceptds, const struct timeval *timeout);
+
+
+  to get round the problem had to compile as:
+
+     bjam define=_XOPEN_SOURCE_EXTENDED
+
+  to choose the right select
+  
+  
+ Compilation problems with boost 1.48
+ ==============================================================
+ acc.compile.c++ tmpBuildDir/boost/bin.v2/libs/date_time/build/acc/debug/link-static/threading-multi/gregorian/greg_month.o
+"./boost/numeric/conversion/detail/preprocessed/numeric_cast_traits.hpp", line 25: error #2247: class "boost::numeric::numeric_cast_traits<char, char, void>" has already been defined
+      struct numeric_cast_traits
+             ^
+
+"./boost/numeric/conversion/detail/preprocessed/numeric_cast_traits.hpp", line 158: error #2247: class "boost::numeric::numeric_cast_traits<char, char, void>" has already been defined
+      struct numeric_cast_traits
+             ^
+
+"./boost/numeric/conversion/detail/preprocessed/numeric_cast_traits.hpp", line 170: error #2247: class "boost::numeric::numeric_cast_traits<char, char, void>" has already been defined
+      struct numeric_cast_traits
+             ^
+
+"./boost/numeric/conversion/detail/preprocessed/numeric_cast_traits.hpp", line 182: error #2247: class "boost::numeric::numeric_cast_traits<char, uint8_t, void>" has already been defined
+      struct numeric_cast_traits
+             ^
+
+"./boost/numeric/conversion/detail/preprocessed/numeric_cast_traits.hpp", line 194: error #2247: class "boost::numeric::numeric_cast_traits<char, int16_t, void>" has already been defined
+      struct numeric_cast_traits
+ 
+ 
+ >>>
+ >>> See:: https://svn.boost.org/trac/boost/attachment/ticket/6158/cstdint_patch.diff
+ >>>
+ *****
+ ***** Had to apply the same patch: i.e around line 101 of file  $BOOST_ROOT/boost/cstdint.hpp
+ *****
+ 103c103,107
+2  <   using ::int8_t;             
+3  ---
+4  > #if defined(sun) || defined(__sun)
+5  >   typedef signed char int8_t;
+6  > #else
+7  >   using ::int8_t;
+8  > #endif
+ 
+  # Hack because boost::int8_t was being interpreted as a char,
+  # This cause duplicate class definition during template instantiation.
+  # in the file ./boost/numeric/conversion/detail/preprocessed/numeric_cast_traits.hpp
+ 
+ 
diff --git a/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/future.hpp b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/future.hpp
new file mode 100644
index 0000000..cdc338a
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/future.hpp
@@ -0,0 +1,1704 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2012 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURE_HPP
+#define BOOST_THREAD_FUTURE_HPP
+
+#include <boost/thread/detail/config.hpp>
+
+// boost::thread::future requires exception handling
+// due to boost::exception::exception_ptr dependency
+
+#ifndef BOOST_NO_EXCEPTIONS
+
+#include <boost/detail/scoped_enum_emulation.hpp>
+#include <stdexcept>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/thread_time.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/exception_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <algorithm>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/ref.hpp>
+#include <boost/scoped_array.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <list>
+#include <boost/next_prior.hpp>
+#include <vector>
+#include <boost/system/error_code.hpp>
+#ifdef BOOST_THREAD_USES_CHRONO
+#include <boost/chrono/system_clocks.hpp>
+#endif
+
+#if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
+#include <boost/thread/detail/memory.hpp>
+#endif
+
+#include <boost/utility/result_of.hpp>
+//#include <boost/thread.hpp>
+
+#if defined BOOST_THREAD_PROVIDES_FUTURE
+#define BOOST_THREAD_FUTURE future
+#else
+#define BOOST_THREAD_FUTURE unique_future
+#endif
+
+
+namespace boost
+{
+
+  //enum class future_errc
+  BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_errc)
+  {
+      broken_promise,
+      future_already_retrieved,
+      promise_already_satisfied,
+      no_state
+  }
+  BOOST_SCOPED_ENUM_DECLARE_END(future_errc)
+
+  namespace system
+  {
+    template <>
+    struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc> : public true_type {};
+
+    #ifdef BOOST_NO_SCOPED_ENUMS
+    template <>
+    struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc::enum_type> : public true_type { };
+    #endif
+  }
+
+  //enum class launch
+  BOOST_SCOPED_ENUM_DECLARE_BEGIN(launch)
+  {
+      async = 1,
+      deferred = 2,
+      any = async | deferred
+  }
+  BOOST_SCOPED_ENUM_DECLARE_END(launch)
+
+  //enum class future_status
+  BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_status)
+  {
+      ready,
+      timeout,
+      deferred
+  }
+  BOOST_SCOPED_ENUM_DECLARE_END(future_status)
+
+  BOOST_THREAD_DECL
+  const system::error_category& future_category();
+
+  namespace system
+  {
+    inline BOOST_THREAD_DECL
+    error_code
+    make_error_code(future_errc e)
+    {
+        return error_code(underlying_cast<int>(e), boost::future_category());
+    }
+
+    inline BOOST_THREAD_DECL
+    error_condition
+    make_error_condition(future_errc e)
+    {
+        return error_condition(underlying_cast<int>(e), future_category());
+    }
+  }
+
+  class BOOST_SYMBOL_VISIBLE future_error
+      : public std::logic_error
+  {
+      system::error_code ec_;
+  public:
+      future_error(system::error_code ec)
+      : logic_error(ec.message()),
+        ec_(ec)
+      {
+      }
+
+      const system::error_code& code() const BOOST_NOEXCEPT
+      {
+        return ec_;
+      }
+
+      //virtual ~future_error() BOOST_NOEXCEPT;
+  };
+
+    class BOOST_SYMBOL_VISIBLE future_uninitialized:
+        public future_error
+    {
+    public:
+        future_uninitialized():
+          future_error(system::make_error_code(future_errc::no_state))
+        {}
+    };
+    class BOOST_SYMBOL_VISIBLE broken_promise:
+        public future_error
+    {
+    public:
+        broken_promise():
+          future_error(system::make_error_code(future_errc::broken_promise))
+        {}
+    };
+    class BOOST_SYMBOL_VISIBLE future_already_retrieved:
+        public future_error
+    {
+    public:
+        future_already_retrieved():
+          future_error(system::make_error_code(future_errc::future_already_retrieved))
+        {}
+    };
+    class BOOST_SYMBOL_VISIBLE promise_already_satisfied:
+        public future_error
+    {
+    public:
+        promise_already_satisfied():
+          future_error(system::make_error_code(future_errc::promise_already_satisfied))
+        {}
+    };
+
+    class BOOST_SYMBOL_VISIBLE task_already_started:
+        public future_error
+    {
+    public:
+        task_already_started():
+        future_error(system::make_error_code(future_errc::promise_already_satisfied))
+            //std::logic_error("Task already started")
+        {}
+    };
+
+        class BOOST_SYMBOL_VISIBLE task_moved:
+            public future_error
+        {
+        public:
+            task_moved():
+              future_error(system::make_error_code(future_errc::no_state))
+                //std::logic_error("Task moved")
+            {}
+        };
+
+            class promise_moved:
+                public future_error
+            {
+            public:
+                  promise_moved():
+                  future_error(system::make_error_code(future_errc::no_state))
+                    //std::logic_error("Promise moved")
+                {}
+            };
+
+    namespace future_state
+    {
+        enum state { uninitialized, waiting, ready, moved };
+    }
+
+    namespace detail
+    {
+        struct future_object_base
+        {
+            boost::exception_ptr exception;
+            bool done;
+            bool thread_was_interrupted;
+            boost::mutex mutex;
+            boost::condition_variable waiters;
+            typedef std::list<boost::condition_variable_any*> waiter_list;
+            waiter_list external_waiters;
+            boost::function<void()> callback;
+
+            future_object_base():
+                done(false),
+                thread_was_interrupted(false)
+            {}
+            virtual ~future_object_base()
+            {}
+
+            waiter_list::iterator register_external_waiter(boost::condition_variable_any& cv)
+            {
+                boost::unique_lock<boost::mutex> lock(mutex);
+                do_callback(lock);
+                return external_waiters.insert(external_waiters.end(),&cv);
+            }
+
+            void remove_external_waiter(waiter_list::iterator it)
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                external_waiters.erase(it);
+            }
+
+            void mark_finished_internal()
+            {
+                done=true;
+                waiters.notify_all();
+                for(waiter_list::const_iterator it=external_waiters.begin(),
+                        end=external_waiters.end();it!=end;++it)
+                {
+                    (*it)->notify_all();
+                }
+            }
+
+            struct relocker
+            {
+                boost::unique_lock<boost::mutex>& lock;
+
+                relocker(boost::unique_lock<boost::mutex>& lock_):
+                    lock(lock_)
+                {
+                    lock.unlock();
+                }
+                ~relocker()
+                {
+                    lock.lock();
+                }
+            private:
+                relocker& operator=(relocker const&);
+            };
+
+            void do_callback(boost::unique_lock<boost::mutex>& lock)
+            {
+                if(callback && !done)
+                {
+                    boost::function<void()> local_callback=callback;
+                    relocker relock(lock);
+                    local_callback();
+                }
+            }
+
+
+            void wait(bool rethrow=true)
+            {
+                boost::unique_lock<boost::mutex> lock(mutex);
+                do_callback(lock);
+                while(!done)
+                {
+                    waiters.wait(lock);
+                }
+                if(rethrow && thread_was_interrupted)
+                {
+                    throw boost::thread_interrupted();
+                }
+                if(rethrow && exception)
+                {
+                    boost::rethrow_exception(exception);
+                }
+            }
+
+            bool timed_wait_until(boost::system_time const& target_time)
+            {
+                boost::unique_lock<boost::mutex> lock(mutex);
+                do_callback(lock);
+                while(!done)
+                {
+                    bool const success=waiters.timed_wait(lock,target_time);
+                    if(!success && !done)
+                    {
+                        return false;
+                    }
+                }
+                return true;
+            }
+
+#ifdef BOOST_THREAD_USES_CHRONO
+
+            template <class Clock, class Duration>
+            future_status
+            wait_until(const chrono::time_point<Clock, Duration>& abs_time)
+            {
+              boost::unique_lock<boost::mutex> lock(mutex);
+              do_callback(lock);
+              while(!done)
+              {
+                  cv_status const st=waiters.wait_until(lock,abs_time);
+                  if(st==cv_status::timeout && !done)
+                  {
+                    return future_status::timeout;
+                  }
+              }
+              return future_status::ready;
+            }
+#endif
+            void mark_exceptional_finish_internal(boost::exception_ptr const& e)
+            {
+                exception=e;
+                mark_finished_internal();
+            }
+            void mark_exceptional_finish()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_exceptional_finish_internal(boost::current_exception());
+            }
+            void mark_interrupted_finish()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                thread_was_interrupted=true;
+                mark_finished_internal();
+            }
+            bool has_value()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                return done && !(exception || thread_was_interrupted);
+            }
+            bool has_exception()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                return done && (exception || thread_was_interrupted);
+            }
+
+            template<typename F,typename U>
+            void set_wait_callback(F f,U* u)
+            {
+                callback=boost::bind(f,boost::ref(*u));
+            }
+
+        private:
+            future_object_base(future_object_base const&);
+            future_object_base& operator=(future_object_base const&);
+        };
+
+        template<typename T>
+        struct future_traits
+        {
+            typedef boost::scoped_ptr<T> storage_type;
+#ifndef BOOST_NO_RVALUE_REFERENCES
+            typedef T const& source_reference_type;
+            struct dummy;
+            typedef typename boost::mpl::if_<boost::is_fundamental<T>,dummy&,BOOST_THREAD_RV_REF(T)>::type rvalue_source_type;
+            typedef typename boost::mpl::if_<boost::is_fundamental<T>,T,BOOST_THREAD_RV_REF(T)>::type move_dest_type;
+#elif defined BOOST_THREAD_USES_MOVE
+            typedef T& source_reference_type;
+            typedef typename boost::mpl::if_<boost::has_move_emulation_enabled<T>,BOOST_THREAD_RV_REF(T),T const&>::type rvalue_source_type;
+            typedef typename boost::mpl::if_<boost::has_move_emulation_enabled<T>,BOOST_THREAD_RV_REF(T),T>::type move_dest_type;
+#else
+            typedef T& source_reference_type;
+            typedef typename boost::mpl::if_<boost::is_convertible<T&,BOOST_THREAD_RV_REF(T) >,BOOST_THREAD_RV_REF(T),T const&>::type rvalue_source_type;
+            typedef typename boost::mpl::if_<boost::is_convertible<T&,BOOST_THREAD_RV_REF(T) >,BOOST_THREAD_RV_REF(T),T>::type move_dest_type;
+#endif
+
+            typedef const T& shared_future_get_result_type;
+
+            static void init(storage_type& storage,source_reference_type t)
+            {
+                storage.reset(new T(t));
+            }
+
+            static void init(storage_type& storage,rvalue_source_type t)
+            {
+              storage.reset(new T(static_cast<rvalue_source_type>(t)));
+            }
+
+            static void cleanup(storage_type& storage)
+            {
+                storage.reset();
+            }
+        };
+
+        template<typename T>
+        struct future_traits<T&>
+        {
+            typedef T* storage_type;
+            typedef T& source_reference_type;
+            struct rvalue_source_type
+            {};
+            typedef T& move_dest_type;
+            typedef T& shared_future_get_result_type;
+
+            static void init(storage_type& storage,T& t)
+            {
+                storage=&t;
+            }
+
+            static void cleanup(storage_type& storage)
+            {
+                storage=0;
+            }
+        };
+
+        template<>
+        struct future_traits<void>
+        {
+            typedef bool storage_type;
+            typedef void move_dest_type;
+            typedef void shared_future_get_result_type;
+
+            static void init(storage_type& storage)
+            {
+                storage=true;
+            }
+
+            static void cleanup(storage_type& storage)
+            {
+                storage=false;
+            }
+
+        };
+
+        template<typename T>
+        struct future_object:
+            detail::future_object_base
+        {
+            typedef typename future_traits<T>::storage_type storage_type;
+            typedef typename future_traits<T>::source_reference_type source_reference_type;
+            typedef typename future_traits<T>::rvalue_source_type rvalue_source_type;
+            typedef typename future_traits<T>::move_dest_type move_dest_type;
+            typedef typename future_traits<T>::shared_future_get_result_type shared_future_get_result_type;
+
+            storage_type result;
+
+            future_object():
+                result(0)
+            {}
+
+            void mark_finished_with_result_internal(source_reference_type result_)
+            {
+                future_traits<T>::init(result,result_);
+                mark_finished_internal();
+            }
+
+            void mark_finished_with_result_internal(rvalue_source_type result_)
+            {
+                future_traits<T>::init(result,static_cast<rvalue_source_type>(result_));
+                mark_finished_internal();
+            }
+
+            void mark_finished_with_result(source_reference_type result_)
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_finished_with_result_internal(result_);
+            }
+
+            void mark_finished_with_result(rvalue_source_type result_)
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_finished_with_result_internal(static_cast<rvalue_source_type>(result_));
+            }
+
+            move_dest_type get()
+            {
+                wait();
+                return static_cast<move_dest_type>(*result);
+            }
+
+            shared_future_get_result_type get_sh()
+            {
+                wait();
+                return static_cast<shared_future_get_result_type>(*result);
+            }
+
+            future_state::state get_state()
+            {
+                boost::lock_guard<boost::mutex> guard(mutex);
+                if(!done)
+                {
+                    return future_state::waiting;
+                }
+                else
+                {
+                    return future_state::ready;
+                }
+            }
+
+        private:
+            future_object(future_object const&);
+            future_object& operator=(future_object const&);
+        };
+
+        template<>
+        struct future_object<void>:
+            detail::future_object_base
+        {
+          typedef void shared_future_get_result_type;
+
+            future_object()
+            {}
+
+            void mark_finished_with_result_internal()
+            {
+                mark_finished_internal();
+            }
+
+            void mark_finished_with_result()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_finished_with_result_internal();
+            }
+
+            void get()
+            {
+                wait();
+            }
+            void get_sh()
+            {
+                wait();
+            }
+            future_state::state get_state()
+            {
+                boost::lock_guard<boost::mutex> guard(mutex);
+                if(!done)
+                {
+                    return future_state::waiting;
+                }
+                else
+                {
+                    return future_state::ready;
+                }
+            }
+        private:
+            future_object(future_object const&);
+            future_object& operator=(future_object const&);
+        };
+
+//        template<typename T, typename Allocator>
+//        struct future_object_alloc: public future_object<T>
+//        {
+//          typedef future_object<T> base;
+//          Allocator alloc_;
+//
+//        public:
+//          explicit future_object_alloc(const Allocator& a)
+//              : alloc_(a) {}
+//
+//        };
+        class future_waiter
+        {
+            struct registered_waiter;
+            typedef std::vector<registered_waiter>::size_type count_type;
+
+            struct registered_waiter
+            {
+                boost::shared_ptr<detail::future_object_base> future_;
+                detail::future_object_base::waiter_list::iterator wait_iterator;
+                count_type index;
+
+                registered_waiter(boost::shared_ptr<detail::future_object_base> const& a_future,
+                                  detail::future_object_base::waiter_list::iterator wait_iterator_,
+                                  count_type index_):
+                    future_(a_future),wait_iterator(wait_iterator_),index(index_)
+                {}
+
+            };
+
+            struct all_futures_lock
+            {
+                count_type count;
+                boost::scoped_array<boost::unique_lock<boost::mutex> > locks;
+
+                all_futures_lock(std::vector<registered_waiter>& futures):
+                    count(futures.size()),locks(new boost::unique_lock<boost::mutex>[count])
+                {
+                    for(count_type i=0;i<count;++i)
+                    {
+                       // avib
+#if defined __DECCXX || defined __SUNPRO_CC || defined __hpux
+                        locks[i]=boost::unique_lock<boost::mutex>(futures[i].future_->mutex).move();
+#else
+                        locks[i]=boost::unique_lock<boost::mutex>(futures[i].future_->mutex);
+#endif
+                    }
+                }
+
+                void lock()
+                {
+                    boost::lock(locks.get(),locks.get()+count);
+                }
+
+                void unlock()
+                {
+                    for(count_type i=0;i<count;++i)
+                    {
+                        locks[i].unlock();
+                    }
+                }
+            };
+
+            boost::condition_variable_any cv;
+            std::vector<registered_waiter> futures;
+            count_type future_count;
+
+        public:
+            future_waiter():
+                future_count(0)
+            {}
+
+            template<typename F>
+            void add(F& f)
+            {
+                if(f.future_)
+                {
+                    futures.push_back(registered_waiter(f.future_,f.future_->register_external_waiter(cv),future_count));
+                }
+                ++future_count;
+            }
+
+            count_type wait()
+            {
+                all_futures_lock lk(futures);
+                for(;;)
+                {
+                    for(count_type i=0;i<futures.size();++i)
+                    {
+                        if(futures[i].future_->done)
+                        {
+                            return futures[i].index;
+                        }
+                    }
+                    cv.wait(lk);
+                }
+            }
+
+            ~future_waiter()
+            {
+                for(count_type i=0;i<futures.size();++i)
+                {
+                    futures[i].future_->remove_external_waiter(futures[i].wait_iterator);
+                }
+            }
+
+        };
+
+    }
+
+    template <typename R>
+    class BOOST_THREAD_FUTURE;
+
+    template <typename R>
+    class shared_future;
+
+    template<typename T>
+    struct is_future_type
+    {
+        BOOST_STATIC_CONSTANT(bool, value=false);
+    };
+
+    template<typename T>
+    struct is_future_type<BOOST_THREAD_FUTURE<T> >
+    {
+        BOOST_STATIC_CONSTANT(bool, value=true);
+    };
+
+    template<typename T>
+    struct is_future_type<shared_future<T> >
+    {
+        BOOST_STATIC_CONSTANT(bool, value=true);
+    };
+
+    template<typename Iterator>
+    typename boost::disable_if<is_future_type<Iterator>,void>::type wait_for_all(Iterator begin,Iterator end)
+    {
+        for(Iterator current=begin;current!=end;++current)
+        {
+            current->wait();
+        }
+    }
+
+    template<typename F1,typename F2>
+    typename boost::enable_if<is_future_type<F1>,void>::type wait_for_all(F1& f1,F2& f2)
+    {
+        f1.wait();
+        f2.wait();
+    }
+
+    template<typename F1,typename F2,typename F3>
+    void wait_for_all(F1& f1,F2& f2,F3& f3)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+        f4.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4,typename F5>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+        f4.wait();
+        f5.wait();
+    }
+
+    template<typename Iterator>
+    typename boost::disable_if<is_future_type<Iterator>,Iterator>::type wait_for_any(Iterator begin,Iterator end)
+    {
+        if(begin==end)
+            return end;
+
+        detail::future_waiter waiter;
+        for(Iterator current=begin;current!=end;++current)
+        {
+            waiter.add(*current);
+        }
+        return boost::next(begin,waiter.wait());
+    }
+
+    template<typename F1,typename F2>
+    typename boost::enable_if<is_future_type<F1>,unsigned>::type wait_for_any(F1& f1,F2& f2)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        return waiter.wait();
+    }
+
+    template<typename F1,typename F2,typename F3>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        waiter.add(f3);
+        return waiter.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        waiter.add(f3);
+        waiter.add(f4);
+        return waiter.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4,typename F5>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        waiter.add(f3);
+        waiter.add(f4);
+        waiter.add(f5);
+        return waiter.wait();
+    }
+
+    template <typename R>
+    class promise;
+
+    template <typename R>
+    class packaged_task;
+
+    template <typename R>
+    class BOOST_THREAD_FUTURE
+    {
+    private:
+
+        typedef boost::shared_ptr<detail::future_object<R> > future_ptr;
+
+        future_ptr future_;
+
+        friend class shared_future<R>;
+        friend class promise<R>;
+        friend class packaged_task<R>;
+        friend class detail::future_waiter;
+
+        typedef typename detail::future_traits<R>::move_dest_type move_dest_type;
+
+        BOOST_THREAD_FUTURE(future_ptr a_future):
+            future_(a_future)
+        {}
+
+    public:
+        BOOST_THREAD_MOVABLE_ONLY(BOOST_THREAD_FUTURE)
+        typedef future_state::state state;
+
+        BOOST_THREAD_FUTURE()
+        {}
+
+        ~BOOST_THREAD_FUTURE()
+        {}
+
+        BOOST_THREAD_FUTURE(BOOST_THREAD_RV_REF(BOOST_THREAD_FUTURE) other) BOOST_NOEXCEPT:
+            future_(BOOST_THREAD_RV(other).future_)
+        {
+            BOOST_THREAD_RV(other).future_.reset();
+        }
+
+        BOOST_THREAD_FUTURE& operator=(BOOST_THREAD_RV_REF(BOOST_THREAD_FUTURE) other) BOOST_NOEXCEPT
+        {
+            future_=BOOST_THREAD_RV(other).future_;
+            BOOST_THREAD_RV(other).future_.reset();
+            return *this;
+        }
+
+        shared_future<R> share()
+        {
+          return shared_future<R>(::boost::move(*this));
+        }
+
+        void swap(BOOST_THREAD_FUTURE& other)
+        {
+            future_.swap(other.future_);
+        }
+
+        // retrieving the value
+        move_dest_type get()
+        {
+            if(!future_)
+            {
+                boost::throw_exception(future_uninitialized());
+            }
+
+            return future_->get();
+        }
+
+        // functions to check state, and wait for ready
+        state get_state() const BOOST_NOEXCEPT
+        {
+            if(!future_)
+            {
+                return future_state::uninitialized;
+            }
+            return future_->get_state();
+        }
+
+        bool is_ready() const BOOST_NOEXCEPT
+        {
+            return get_state()==future_state::ready;
+        }
+
+        bool has_exception() const BOOST_NOEXCEPT
+        {
+            return future_ && future_->has_exception();
+        }
+
+        bool has_value() const BOOST_NOEXCEPT
+        {
+            return future_ && future_->has_value();
+        }
+
+        bool valid() const BOOST_NOEXCEPT
+        {
+            return future_ != 0;
+        }
+
+
+        void wait() const
+        {
+            if(!future_)
+            {
+                boost::throw_exception(future_uninitialized());
+            }
+            future_->wait(false);
+        }
+
+        template<typename Duration>
+        bool timed_wait(Duration const& rel_time) const
+        {
+            return timed_wait_until(boost::get_system_time()+rel_time);
+        }
+
+        bool timed_wait_until(boost::system_time const& abs_time) const
+        {
+            if(!future_)
+            {
+                boost::throw_exception(future_uninitialized());
+            }
+            return future_->timed_wait_until(abs_time);
+        }
+#ifdef BOOST_THREAD_USES_CHRONO
+        template <class Rep, class Period>
+        future_status
+        wait_for(const chrono::duration<Rep, Period>& rel_time) const
+        {
+          return wait_until(chrono::steady_clock::now() + rel_time);
+
+        }
+        template <class Clock, class Duration>
+        future_status
+        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const
+        {
+          if(!future_)
+          {
+              boost::throw_exception(future_uninitialized());
+          }
+          return future_->wait_until(abs_time);
+        }
+#endif
+    };
+
+    BOOST_THREAD_DCL_MOVABLE_BEG(T) BOOST_THREAD_FUTURE<T> BOOST_THREAD_DCL_MOVABLE_END
+
+    template <typename R>
+    class shared_future
+    {
+        typedef boost::shared_ptr<detail::future_object<R> > future_ptr;
+
+        future_ptr future_;
+
+        friend class detail::future_waiter;
+        friend class promise<R>;
+        friend class packaged_task<R>;
+
+        shared_future(future_ptr a_future):
+            future_(a_future)
+        {}
+
+    public:
+        BOOST_THREAD_MOVABLE(shared_future)
+
+        shared_future(shared_future const& other):
+            future_(other.future_)
+        {}
+
+        typedef future_state::state state;
+
+        shared_future()
+        {}
+
+        ~shared_future()
+        {}
+
+        shared_future& operator=(shared_future const& other)
+        {
+            future_=other.future_;
+            return *this;
+        }
+        shared_future(BOOST_THREAD_RV_REF(shared_future) other) BOOST_NOEXCEPT :
+            future_(BOOST_THREAD_RV(other).future_)
+        {
+            BOOST_THREAD_RV(other).future_.reset();
+        }
+        shared_future(BOOST_THREAD_RV_REF_BEG BOOST_THREAD_FUTURE<R> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT :
+            future_(BOOST_THREAD_RV(other).future_)
+        {
+            BOOST_THREAD_RV(other).future_.reset();
+        }
+        shared_future& operator=(BOOST_THREAD_RV_REF(shared_future) other) BOOST_NOEXCEPT
+        {
+            future_.swap(BOOST_THREAD_RV(other).future_);
+            BOOST_THREAD_RV(other).future_.reset();
+            return *this;
+        }
+        shared_future& operator=(BOOST_THREAD_RV_REF_BEG BOOST_THREAD_FUTURE<R> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT
+        {
+            future_.swap(BOOST_THREAD_RV(other).future_);
+            BOOST_THREAD_RV(other).future_.reset();
+            return *this;
+        }
+
+        void swap(shared_future& other) BOOST_NOEXCEPT
+        {
+            future_.swap(other.future_);
+        }
+
+        // retrieving the value
+        typename detail::future_object<R>::shared_future_get_result_type get()
+        {
+            if(!future_)
+            {
+                boost::throw_exception(future_uninitialized());
+            }
+
+            return future_->get_sh();
+        }
+
+        // functions to check state, and wait for ready
+        state get_state() const  BOOST_NOEXCEPT
+        {
+            if(!future_)
+            {
+                return future_state::uninitialized;
+            }
+            return future_->get_state();
+        }
+
+        bool valid() const  BOOST_NOEXCEPT
+        {
+            return future_ != 0;
+        }
+
+        bool is_ready() const  BOOST_NOEXCEPT
+        {
+            return get_state()==future_state::ready;
+        }
+
+        bool has_exception() const BOOST_NOEXCEPT
+        {
+            return future_ && future_->has_exception();
+        }
+
+        bool has_value() const BOOST_NOEXCEPT
+        {
+            return future_ && future_->has_value();
+        }
+
+        void wait() const
+        {
+            if(!future_)
+            {
+                boost::throw_exception(future_uninitialized());
+            }
+            future_->wait(false);
+        }
+
+        template<typename Duration>
+        bool timed_wait(Duration const& rel_time) const
+        {
+            return timed_wait_until(boost::get_system_time()+rel_time);
+        }
+
+        bool timed_wait_until(boost::system_time const& abs_time) const
+        {
+            if(!future_)
+            {
+                boost::throw_exception(future_uninitialized());
+            }
+            return future_->timed_wait_until(abs_time);
+        }
+#ifdef BOOST_THREAD_USES_CHRONO
+
+        template <class Rep, class Period>
+        future_status
+        wait_for(const chrono::duration<Rep, Period>& rel_time) const
+        {
+          return wait_until(chrono::steady_clock::now() + rel_time);
+
+        }
+        template <class Clock, class Duration>
+        future_status
+        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const
+        {
+          if(!future_)
+          {
+              boost::throw_exception(future_uninitialized());
+          }
+          return future_->wait_until(abs_time);
+        }
+#endif
+    };
+
+    BOOST_THREAD_DCL_MOVABLE_BEG(T) shared_future<T> BOOST_THREAD_DCL_MOVABLE_END
+
+    template <typename R>
+    class promise
+    {
+        typedef boost::shared_ptr<detail::future_object<R> > future_ptr;
+
+        future_ptr future_;
+        bool future_obtained;
+
+        void lazy_init()
+        {
+#if defined BOOST_THREAD_PROMISE_LAZY
+            if(!atomic_load(&future_))
+            {
+                future_ptr blank;
+                atomic_compare_exchange(&future_,&blank,future_ptr(new detail::future_object<R>));
+            }
+#endif
+        }
+
+    public:
+        BOOST_THREAD_MOVABLE_ONLY(promise)
+#if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
+        template <class Allocator>
+        promise(boost::allocator_arg_t, Allocator a)
+        {
+          typedef typename Allocator::template rebind<detail::future_object<R> >::other A2;
+          A2 a2(a);
+          typedef thread_detail::allocator_destructor<A2> D;
+
+          future_ = future_ptr(::new(a2.allocate(1)) detail::future_object<R>(), D(a2, 1) );
+          future_obtained = false;
+        }
+#endif
+        promise():
+#if defined BOOST_THREAD_PROMISE_LAZY
+            future_(),
+#else
+            future_(new detail::future_object<R>()),
+#endif
+            future_obtained(false)
+        {}
+
+        ~promise()
+        {
+            if(future_)
+            {
+                boost::lock_guard<boost::mutex> lock(future_->mutex);
+
+                if(!future_->done)
+                {
+                    future_->mark_exceptional_finish_internal(boost::copy_exception(broken_promise()));
+                }
+            }
+        }
+
+        // Assignment
+        promise(BOOST_THREAD_RV_REF(promise) rhs) BOOST_NOEXCEPT :
+            future_(BOOST_THREAD_RV(rhs).future_),future_obtained(BOOST_THREAD_RV(rhs).future_obtained)
+        {
+            BOOST_THREAD_RV(rhs).future_.reset();
+            BOOST_THREAD_RV(rhs).future_obtained=false;
+        }
+        promise & operator=(BOOST_THREAD_RV_REF(promise) rhs) BOOST_NOEXCEPT
+        {
+            future_=BOOST_THREAD_RV(rhs).future_;
+            future_obtained=BOOST_THREAD_RV(rhs).future_obtained;
+            BOOST_THREAD_RV(rhs).future_.reset();
+            BOOST_THREAD_RV(rhs).future_obtained=false;
+            return *this;
+        }
+
+        void swap(promise& other)
+        {
+            future_.swap(other.future_);
+            std::swap(future_obtained,other.future_obtained);
+        }
+
+        // Result retrieval
+        BOOST_THREAD_FUTURE<R> get_future()
+        {
+            lazy_init();
+            if (future_.get()==0)
+            {
+                boost::throw_exception(promise_moved());
+            }
+            if (future_obtained)
+            {
+                boost::throw_exception(future_already_retrieved());
+            }
+            future_obtained=true;
+            return BOOST_THREAD_FUTURE<R>(future_);
+        }
+
+        void set_value(typename detail::future_traits<R>::source_reference_type r)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future_->mutex);
+            if(future_->done)
+            {
+                boost::throw_exception(promise_already_satisfied());
+            }
+            future_->mark_finished_with_result_internal(r);
+        }
+
+//         void set_value(R && r);
+        void set_value(typename detail::future_traits<R>::rvalue_source_type r)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future_->mutex);
+            if(future_->done)
+            {
+                boost::throw_exception(promise_already_satisfied());
+            }
+            future_->mark_finished_with_result_internal(static_cast<typename detail::future_traits<R>::rvalue_source_type>(r));
+        }
+
+        void set_exception(boost::exception_ptr p)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future_->mutex);
+            if(future_->done)
+            {
+                boost::throw_exception(promise_already_satisfied());
+            }
+            future_->mark_exceptional_finish_internal(p);
+        }
+
+        template<typename F>
+        void set_wait_callback(F f)
+        {
+            lazy_init();
+            future_->set_wait_callback(f,this);
+        }
+
+    };
+
+    template <>
+    class promise<void>
+    {
+        typedef boost::shared_ptr<detail::future_object<void> > future_ptr;
+
+        future_ptr future_;
+        bool future_obtained;
+
+        void lazy_init()
+        {
+#if defined BOOST_THREAD_PROMISE_LAZY
+            if(!atomic_load(&future_))
+            {
+                future_ptr blank;
+                atomic_compare_exchange(&future_,&blank,future_ptr(new detail::future_object<void>));
+            }
+#endif
+        }
+    public:
+        BOOST_THREAD_MOVABLE_ONLY(promise)
+
+#if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
+        template <class Allocator>
+        promise(boost::allocator_arg_t, Allocator a)
+        {
+          typedef typename Allocator::template rebind<detail::future_object<void> >::other A2;
+          A2 a2(a);
+          typedef thread_detail::allocator_destructor<A2> D;
+
+          future_ = future_ptr(::new(a2.allocate(1)) detail::future_object<void>(), D(a2, 1) );
+          future_obtained = false;
+        }
+#endif
+        promise():
+#if defined BOOST_THREAD_PROMISE_LAZY
+            future_(),
+#else
+            future_(new detail::future_object<void>),
+#endif
+            future_obtained(false)
+        {}
+
+        ~promise()
+        {
+            if(future_)
+            {
+                boost::lock_guard<boost::mutex> lock(future_->mutex);
+
+                if(!future_->done)
+                {
+                    future_->mark_exceptional_finish_internal(boost::copy_exception(broken_promise()));
+                }
+            }
+        }
+
+        // Assignment
+        promise(BOOST_THREAD_RV_REF(promise) rhs) BOOST_NOEXCEPT :
+            future_(BOOST_THREAD_RV(rhs).future_),future_obtained(BOOST_THREAD_RV(rhs).future_obtained)
+        {
+          // we need to release the future as shared_ptr doesn't implements move semantics
+            BOOST_THREAD_RV(rhs).future_.reset();
+            BOOST_THREAD_RV(rhs).future_obtained=false;
+        }
+
+        promise & operator=(BOOST_THREAD_RV_REF(promise) rhs) BOOST_NOEXCEPT
+        {
+            future_=BOOST_THREAD_RV(rhs).future_;
+            future_obtained=BOOST_THREAD_RV(rhs).future_obtained;
+            BOOST_THREAD_RV(rhs).future_.reset();
+            BOOST_THREAD_RV(rhs).future_obtained=false;
+            return *this;
+        }
+
+        void swap(promise& other)
+        {
+            future_.swap(other.future_);
+            std::swap(future_obtained,other.future_obtained);
+        }
+
+        // Result retrieval
+        BOOST_THREAD_FUTURE<void> get_future()
+        {
+            lazy_init();
+
+            if (future_.get()==0)
+            {
+                boost::throw_exception(promise_moved());
+            }
+            if(future_obtained)
+            {
+                boost::throw_exception(future_already_retrieved());
+            }
+            future_obtained=true;
+            return BOOST_THREAD_FUTURE<void>(future_);
+        }
+
+        void set_value()
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future_->mutex);
+            if(future_->done)
+            {
+                boost::throw_exception(promise_already_satisfied());
+            }
+            future_->mark_finished_with_result_internal();
+        }
+
+        void set_exception(boost::exception_ptr p)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future_->mutex);
+            if(future_->done)
+            {
+                boost::throw_exception(promise_already_satisfied());
+            }
+            future_->mark_exceptional_finish_internal(p);
+        }
+
+        template<typename F>
+        void set_wait_callback(F f)
+        {
+            lazy_init();
+            future_->set_wait_callback(f,this);
+        }
+
+    };
+
+#if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
+    namespace container
+    {
+      template <class R, class Alloc>
+      struct uses_allocator<promise<R> , Alloc> : true_type
+      {
+      };
+    }
+#endif
+
+    BOOST_THREAD_DCL_MOVABLE_BEG(T) promise<T> BOOST_THREAD_DCL_MOVABLE_END
+
+    namespace detail
+    {
+        template<typename R>
+        struct task_base:
+            detail::future_object<R>
+        {
+            bool started;
+
+            task_base():
+                started(false)
+            {}
+
+            void reset()
+            {
+              started=false;
+            }
+            void run()
+            {
+                {
+                    boost::lock_guard<boost::mutex> lk(this->mutex);
+                    if(started)
+                    {
+                        boost::throw_exception(task_already_started());
+                    }
+                    started=true;
+                }
+                do_run();
+            }
+
+            void owner_destroyed()
+            {
+                boost::lock_guard<boost::mutex> lk(this->mutex);
+                if(!started)
+                {
+                    started=true;
+                    this->mark_exceptional_finish_internal(boost::copy_exception(boost::broken_promise()));
+                }
+            }
+
+
+            virtual void do_run()=0;
+        };
+
+
+        template<typename R,typename F>
+        struct task_object:
+            task_base<R>
+        {
+        private:
+          task_object(task_object&);
+        public:
+            F f;
+            task_object(F const& f_):
+                f(f_)
+            {}
+#ifndef BOOST_NO_RVALUE_REFERENCES
+            task_object(BOOST_THREAD_RV_REF(F) f_):
+              f(boost::forward<F>(f_))
+            {}
+#else
+            task_object(BOOST_THREAD_RV_REF(F) f_):
+                f(boost::move(f_))
+            {}
+#endif
+            void do_run()
+            {
+                try
+                {
+                    this->mark_finished_with_result(f());
+                }
+                catch(thread_interrupted& )
+                {
+                    this->mark_interrupted_finish();
+                }
+                catch(...)
+                {
+                    this->mark_exceptional_finish();
+                }
+            }
+        };
+
+        template<typename F>
+        struct task_object<void,F>:
+            task_base<void>
+        {
+        private:
+          task_object(task_object&);
+        public:
+            F f;
+            task_object(F const& f_):
+                f(f_)
+            {}
+#ifndef BOOST_NO_RVALUE_REFERENCES
+            task_object(BOOST_THREAD_RV_REF(F) f_):
+              f(boost::forward<F>(f_))
+            {}
+#else
+            task_object(BOOST_THREAD_RV_REF(F) f_):
+                f(boost::move(f_))
+            {}
+#endif
+
+            void do_run()
+            {
+                try
+                {
+                    f();
+                    this->mark_finished_with_result();
+                }
+                catch(thread_interrupted& )
+                {
+                    this->mark_interrupted_finish();
+                }
+                catch(...)
+                {
+                    this->mark_exceptional_finish();
+                }
+            }
+        };
+
+    }
+
+    template<typename R>
+    class packaged_task
+    {
+        typedef boost::shared_ptr<detail::task_base<R> > task_ptr;
+        boost::shared_ptr<detail::task_base<R> > task;
+        bool future_obtained;
+
+    public:
+        typedef R result_type;
+        BOOST_THREAD_MOVABLE_ONLY(packaged_task)
+
+        packaged_task():
+            future_obtained(false)
+        {}
+
+        // construction and destruction
+
+        explicit packaged_task(R(*f)()):
+            task(new detail::task_object<R,R(*)()>(f)),future_obtained(false)
+        {}
+#ifndef BOOST_NO_RVALUE_REFERENCES
+        template <class F>
+        explicit packaged_task(BOOST_THREAD_RV_REF(F) f):
+            task(new detail::task_object<R,
+                typename remove_cv<typename remove_reference<F>::type>::type
+                >(boost::forward<F>(f))),future_obtained(false)
+        {}
+#else
+        template <class F>
+        explicit packaged_task(F const& f):
+            task(new detail::task_object<R,F>(f)),future_obtained(false)
+        {}
+        template <class F>
+        explicit packaged_task(BOOST_THREAD_RV_REF(F) f):
+            task(new detail::task_object<R,F>(boost::move(f))),future_obtained(false)
+        {}
+#endif
+
+#if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
+        template <class Allocator>
+        packaged_task(boost::allocator_arg_t, Allocator a, R(*f)())
+        {
+          typedef R(*FR)();
+          typedef typename Allocator::template rebind<detail::task_object<R,FR> >::other A2;
+          A2 a2(a);
+          typedef thread_detail::allocator_destructor<A2> D;
+
+          task = task_ptr(::new(a2.allocate(1)) detail::task_object<R,FR>(f), D(a2, 1) );
+          future_obtained = false;
+        }
+#ifndef BOOST_NO_RVALUE_REFERENCES
+        template <class F, class Allocator>
+        packaged_task(boost::allocator_arg_t, Allocator a, BOOST_THREAD_RV_REF(F) f)
+        {
+          typedef typename remove_cv<typename remove_reference<F>::type>::type FR;
+          typedef typename Allocator::template rebind<detail::task_object<R,FR> >::other A2;
+          A2 a2(a);
+          typedef thread_detail::allocator_destructor<A2> D;
+
+          task = task_ptr(::new(a2.allocate(1)) detail::task_object<R,FR>(boost::forward<F>(f)), D(a2, 1) );
+          future_obtained = false;
+        }
+#else
+        template <class F, class Allocator>
+        packaged_task(boost::allocator_arg_t, Allocator a, const F& f)
+        {
+          typedef typename Allocator::template rebind<detail::task_object<R,F> >::other A2;
+          A2 a2(a);
+          typedef thread_detail::allocator_destructor<A2> D;
+
+          task = task_ptr(::new(a2.allocate(1)) detail::task_object<R,F>(f), D(a2, 1) );
+          future_obtained = false;
+        }
+        template <class F, class Allocator>
+        packaged_task(boost::allocator_arg_t, Allocator a, BOOST_THREAD_RV_REF(F) f)
+        {
+          typedef typename Allocator::template rebind<detail::task_object<R,F> >::other A2;
+          A2 a2(a);
+          typedef thread_detail::allocator_destructor<A2> D;
+
+          task = task_ptr(::new(a2.allocate(1)) detail::task_object<R,F>(boost::move(f)), D(a2, 1) );
+          future_obtained = false;
+        }
+#endif //BOOST_NO_RVALUE_REFERENCES
+#endif // BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
+
+        ~packaged_task()
+        {
+            if(task)
+            {
+                task->owner_destroyed();
+            }
+        }
+
+        // assignment
+        packaged_task(BOOST_THREAD_RV_REF(packaged_task) other) BOOST_NOEXCEPT :
+            future_obtained(BOOST_THREAD_RV(other).future_obtained)
+        {
+            task.swap(BOOST_THREAD_RV(other).task);
+            BOOST_THREAD_RV(other).future_obtained=false;
+        }
+        packaged_task& operator=(BOOST_THREAD_RV_REF(packaged_task) other) BOOST_NOEXCEPT
+        {
+            packaged_task temp(static_cast<BOOST_THREAD_RV_REF(packaged_task)>(other));
+            swap(temp);
+            return *this;
+        }
+
+        void reset()
+        {
+            if (!valid())
+                throw future_error(system::make_error_code(future_errc::no_state));
+            task->reset();
+            future_obtained=false;
+        }
+
+        void swap(packaged_task& other) BOOST_NOEXCEPT
+        {
+            task.swap(other.task);
+            std::swap(future_obtained,other.future_obtained);
+        }
+        bool valid() const BOOST_NOEXCEPT
+        {
+          return task.get()!=0;
+        }
+
+        // result retrieval
+        BOOST_THREAD_FUTURE<R> get_future()
+        {
+            if(!task)
+            {
+                boost::throw_exception(task_moved());
+            }
+            else if(!future_obtained)
+            {
+                future_obtained=true;
+                return BOOST_THREAD_FUTURE<R>(task);
+            }
+            else
+            {
+                boost::throw_exception(future_already_retrieved());
+            }
+            return BOOST_THREAD_FUTURE<R>();
+
+        }
+
+
+        // execution
+        void operator()()
+        {
+            if(!task)
+            {
+                boost::throw_exception(task_moved());
+            }
+            task->run();
+        }
+
+        template<typename F>
+        void set_wait_callback(F f)
+        {
+            task->set_wait_callback(f,this);
+        }
+
+    };
+
+#if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
+    namespace container
+    {
+      template <class R, class Alloc>
+      struct uses_allocator<packaged_task<R>, Alloc>
+        : public true_type {};
+    }
+#endif
+
+    BOOST_THREAD_DCL_MOVABLE_BEG(T) packaged_task<T> BOOST_THREAD_DCL_MOVABLE_END
+
+//    template <class F>
+//    BOOST_THREAD_FUTURE<typename boost::result_of<F()>::type>
+//    async(launch policy, F f)
+//    {
+//        typedef typename boost::result_of<F()>::type R;
+//        typedef BOOST_THREAD_FUTURE<R> future;
+//        if (int(policy) & int(launch::async))
+//        {
+//          packaged_task<R> pt( f );
+//
+//          BOOST_THREAD_FUTURE ret = pt.get_future();
+//          boost::thread( boost::move(pt) ).detach();
+//          return ::boost::move(ret);
+//        }
+//        else if (int(policy) & int(launch::deferred))
+//        {
+//          packaged_task<R> pt( f );
+//
+//          BOOST_THREAD_FUTURE ret = pt.get_future();
+//          return ::boost::move(ret);
+//        }
+//    }
+//
+//    template <class F>
+//    BOOST_THREAD_FUTURE<typename boost::result_of<F()>::type>
+//    async(F f)
+//    {
+//        return async(launch::any, f);
+//    }
+
+
+
+}
+
+#endif // BOOST_NO_EXCEPTION
+#endif // header
diff --git a/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/overflow_helpers.hpp b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/overflow_helpers.hpp
new file mode 100644
index 0000000..2996357
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/overflow_helpers.hpp
@@ -0,0 +1,397 @@
+//  ratio.hpp  ---------------------------------------------------------------//
+
+//  Copyright 2008 Howard Hinnant
+//  Copyright 2008 Beman Dawes
+//  Copyright 2009 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+/*
+
+This code was derived by Beman Dawes from Howard Hinnant's time2_demo prototype.
+Many thanks to Howard for making his code available under the Boost license.
+The original code was modified to conform to Boost conventions and to section
+20.4 Compile-time rational arithmetic [ratio], of the C++ committee working
+paper N2798.
+See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf.
+
+time2_demo contained this comment:
+
+    Much thanks to Andrei Alexandrescu,
+                   Walter Brown,
+                   Peter Dimov,
+                   Jeff Garland,
+                   Terry Golubiewski,
+                   Daniel Krugler,
+                   Anthony Williams.
+*/
+
+// The way overflow is managed for ratio_less is taken from llvm/libcxx/include/ratio
+
+#ifndef BOOST_RATIO_DETAIL_RATIO_OPERATIONS_HPP
+#define BOOST_RATIO_DETAIL_RATIO_OPERATIONS_HPP
+
+#include <boost/ratio/detail/mpl/abs.hpp>
+#include <boost/ratio/detail/mpl/sign.hpp>
+#include <cstdlib>
+#include <climits>
+#include <limits>
+#include <boost/cstdint.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/integer_traits.hpp>
+
+#if !defined(BOOST_NO_STATIC_ASSERT) || !defined(BOOST_RATIO_USES_MPL_ASSERT)
+#define BOOST_RATIO_OVERFLOW_IN_ADD "overflow in ratio add"
+#define BOOST_RATIO_OVERFLOW_IN_SUB "overflow in ratio sub"
+#define BOOST_RATIO_OVERFLOW_IN_MUL "overflow in ratio mul"
+#define BOOST_RATIO_OVERFLOW_IN_DIV "overflow in ratio div"
+#define BOOST_RATIO_NUMERATOR_IS_OUT_OF_RANGE "ratio numerator is out of range"
+#define BOOST_RATIO_DIVIDE_BY_0 "ratio divide by 0"
+#define BOOST_RATIO_DENOMINATOR_IS_OUT_OF_RANGE "ratio denominator is out of range"
+#endif
+
+#ifndef BOOST_NO_STATIC_ASSERT
+#define BOOST_RATIO_STATIC_ASSERT(CND, MSG, TYPES) static_assert(CND,MSG)
+#elif defined(BOOST_RATIO_USES_STATIC_ASSERT)
+#include <boost/static_assert.hpp>
+#define BOOST_RATIO_STATIC_ASSERT(CND, MSG, TYPES) BOOST_STATIC_ASSERT(CND)
+#elif defined(BOOST_RATIO_USES_MPL_ASSERT)
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+#define BOOST_RATIO_STATIC_ASSERT(CND, MSG, TYPES)                                 \
+    BOOST_MPL_ASSERT_MSG(boost::mpl::bool_< (CND) >::type::value, MSG, TYPES)
+#else
+//~ #elif defined(BOOST_RATIO_USES_ARRAY_ASSERT)
+#define BOOST_RATIO_CONCAT(A,B) A##B
+#define BOOST_RATIO_NAME(A,B) BOOST_RATIO_CONCAT(A,B)
+#define BOOST_RATIO_STATIC_ASSERT(CND, MSG, TYPES) static char BOOST_RATIO_NAME(__boost_ratio_test_,__LINE__)[(CND)?1:-1]
+//~ #define BOOST_RATIO_STATIC_ASSERT(CND, MSG, TYPES)
+#endif
+
+
+//
+// We simply cannot include this header on gcc without getting copious warnings of the kind:
+//
+// boost/integer.hpp:77:30: warning: use of C99 long long integer constant
+//
+// And yet there is no other reasonable implementation, so we declare this a system header
+// to suppress these warnings.
+//
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#pragma GCC system_header
+#endif
+
+namespace boost
+{
+
+//----------------------------------------------------------------------------//
+//                                 helpers                                    //
+//----------------------------------------------------------------------------//
+
+namespace ratio_detail
+{
+
+  template <boost::intmax_t X, boost::intmax_t Y, boost::intmax_t = mpl::sign_c<boost::intmax_t, Y>::value>
+  class br_add;
+
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_add<X, Y, 1>
+  {
+      static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
+      static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
+
+      BOOST_RATIO_STATIC_ASSERT(X <= max - Y , BOOST_RATIO_OVERFLOW_IN_ADD, ());
+  public:
+      static const boost::intmax_t value = X + Y;
+  };
+
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_add<X, Y, 0>
+  {
+  public:
+      static const boost::intmax_t value = X;
+  };
+
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_add<X, Y, -1>
+  {
+      static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
+      static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
+
+      BOOST_RATIO_STATIC_ASSERT(min - Y <= X, BOOST_RATIO_OVERFLOW_IN_ADD, ());
+  public:
+      static const boost::intmax_t value = X + Y;
+  };
+
+  template <boost::intmax_t X, boost::intmax_t Y, boost::intmax_t = mpl::sign_c<boost::intmax_t, Y>::value>
+  class br_sub;
+
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_sub<X, Y, 1>
+  {
+      static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
+      static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
+
+      BOOST_RATIO_STATIC_ASSERT(min + Y <= X, BOOST_RATIO_OVERFLOW_IN_SUB, ());
+  public:
+      static const boost::intmax_t value = X - Y;
+  };
+
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_sub<X, Y, 0>
+  {
+  public:
+      static const boost::intmax_t value = X;
+  };
+
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_sub<X, Y, -1>
+  {
+      static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
+      static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
+
+      BOOST_RATIO_STATIC_ASSERT(X <= max + Y, BOOST_RATIO_OVERFLOW_IN_SUB, ());
+  public:
+      static const boost::intmax_t value = X - Y;
+  };
+
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_mul
+  {
+      // avib
+      //static const boost::intmax_t nan =
+      //  (BOOST_RATIO_INTMAX_C(1) << (sizeof(boost::intmax_t) * CHAR_BIT - 1));
+      static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
+      static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
+
+      static const boost::intmax_t a_x = mpl::abs_c<boost::intmax_t, X>::value;
+      static const boost::intmax_t a_y = mpl::abs_c<boost::intmax_t, Y>::value;
+
+      //avib
+      //BOOST_RATIO_STATIC_ASSERT(X != nan, BOOST_RATIO_OVERFLOW_IN_MUL, ());
+      //BOOST_RATIO_STATIC_ASSERT(Y != nan, BOOST_RATIO_OVERFLOW_IN_MUL, ());
+      BOOST_RATIO_STATIC_ASSERT(a_x <= max / a_y, BOOST_RATIO_OVERFLOW_IN_MUL, ());
+  public:
+      static const boost::intmax_t value = X * Y;
+  };
+
+  template <boost::intmax_t Y>
+  class br_mul<0, Y>
+  {
+  public:
+      static const boost::intmax_t value = 0;
+  };
+
+  template <boost::intmax_t X>
+  class br_mul<X, 0>
+  {
+  public:
+      static const boost::intmax_t value = 0;
+  };
+
+  template <>
+  class br_mul<0, 0>
+  {
+  public:
+      static const boost::intmax_t value = 0;
+  };
+
+  // Not actually used but left here in case needed in future maintenance
+  template <boost::intmax_t X, boost::intmax_t Y>
+  class br_div
+  {
+      static const boost::intmax_t nan = (1LL << (sizeof(boost::intmax_t) * CHAR_BIT - 1));
+      static const boost::intmax_t min = boost::integer_traits<boost::intmax_t>::const_min;
+      static const boost::intmax_t max = boost::integer_traits<boost::intmax_t>::const_max;
+
+      BOOST_RATIO_STATIC_ASSERT(X != nan, BOOST_RATIO_OVERFLOW_IN_DIV, ());
+      BOOST_RATIO_STATIC_ASSERT(Y != nan, BOOST_RATIO_OVERFLOW_IN_DIV, ());
+      BOOST_RATIO_STATIC_ASSERT(Y != 0, BOOST_RATIO_DIVIDE_BY_0, ());
+  public:
+      static const boost::intmax_t value = X / Y;
+  };
+
+  // ratio arithmetic
+  template <class R1, class R2> struct ratio_add;
+  template <class R1, class R2> struct ratio_subtract;
+  template <class R1, class R2> struct ratio_multiply;
+  template <class R1, class R2> struct ratio_divide;
+
+  template <class R1, class R2>
+  struct ratio_add
+  {
+      //The nested typedef type shall be a synonym for ratio<T1, T2>::type where T1 has the value R1::num *
+      //R2::den + R2::num * R1::den and T2 has the value R1::den * R2::den.
+      // As the preceding doesn't works because of overflow on boost::intmax_t we need something more elaborated.
+  private:
+      static const boost::intmax_t gcd_n1_n2 = mpl::gcd_c<boost::intmax_t, R1::num, R2::num>::value;
+      static const boost::intmax_t gcd_d1_d2 = mpl::gcd_c<boost::intmax_t, R1::den, R2::den>::value;
+  public:
+      // No need to normalize as ratio_multiply is already normalized
+      typedef typename ratio_multiply
+         <
+             ratio<gcd_n1_n2, R1::den / gcd_d1_d2>,
+             ratio
+             <
+                 boost::ratio_detail::br_add
+                 <
+                     boost::ratio_detail::br_mul<R1::num / gcd_n1_n2, R2::den / gcd_d1_d2>::value,
+                     boost::ratio_detail::br_mul<R2::num / gcd_n1_n2, R1::den / gcd_d1_d2>::value
+                 >::value,
+                 R2::den
+             >
+         >::type type;
+  };
+  template <class R, boost::intmax_t D>
+  struct ratio_add<R, ratio<0,D> >
+  {
+    typedef R type;
+  };
+
+  template <class R1, class R2>
+  struct ratio_subtract
+  {
+      //The nested typedef type shall be a synonym for ratio<T1, T2>::type where T1 has the value
+      // R1::num *R2::den - R2::num * R1::den and T2 has the value R1::den * R2::den.
+      // As the preceding doesn't works because of overflow on boost::intmax_t we need something more elaborated.
+  private:
+      static const boost::intmax_t gcd_n1_n2 = mpl::gcd_c<boost::intmax_t, R1::num, R2::num>::value;
+      static const boost::intmax_t gcd_d1_d2 = mpl::gcd_c<boost::intmax_t, R1::den, R2::den>::value;
+  public:
+      // No need to normalize as ratio_multiply is already normalized
+      typedef typename ratio_multiply
+         <
+             ratio<gcd_n1_n2, R1::den / gcd_d1_d2>,
+             ratio
+             <
+                 boost::ratio_detail::br_sub
+                 <
+                     boost::ratio_detail::br_mul<R1::num / gcd_n1_n2, R2::den / gcd_d1_d2>::value,
+                     boost::ratio_detail::br_mul<R2::num / gcd_n1_n2, R1::den / gcd_d1_d2>::value
+                 >::value,
+                 R2::den
+             >
+         >::type type;
+  };
+
+  template <class R, boost::intmax_t D>
+  struct ratio_subtract<R, ratio<0,D> >
+  {
+    typedef R type;
+  };
+
+  template <class R1, class R2>
+  struct ratio_multiply
+  {
+      // The nested typedef type  shall be a synonym for ratio<R1::num * R2::den - R2::num * R1::den, R1::den * R2::den>::type.
+      // As the preceding doesn't works because of overflow on boost::intmax_t we need something more elaborated.
+  private:
+     static const boost::intmax_t gcd_n1_d2 = mpl::gcd_c<boost::intmax_t, R1::num, R2::den>::value;
+     static const boost::intmax_t gcd_d1_n2 = mpl::gcd_c<boost::intmax_t, R1::den, R2::num>::value;
+  public:
+      typedef typename ratio
+         <
+             boost::ratio_detail::br_mul<R1::num / gcd_n1_d2, R2::num / gcd_d1_n2>::value,
+             boost::ratio_detail::br_mul<R2::den / gcd_n1_d2, R1::den / gcd_d1_n2>::value
+         >::type type;
+  };
+
+  template <class R1, class R2>
+  struct ratio_divide
+  {
+      // The nested typedef type  shall be a synonym for ratio<R1::num * R2::den, R2::num * R1::den>::type.
+      // As the preceding doesn't works because of overflow on boost::intmax_t we need something more elaborated.
+  private:
+      static const boost::intmax_t gcd_n1_n2 = mpl::gcd_c<boost::intmax_t, R1::num, R2::num>::value;
+      static const boost::intmax_t gcd_d1_d2 = mpl::gcd_c<boost::intmax_t, R1::den, R2::den>::value;
+  public:
+      typedef typename ratio
+         <
+             boost::ratio_detail::br_mul<R1::num / gcd_n1_n2, R2::den / gcd_d1_d2>::value,
+             boost::ratio_detail::br_mul<R2::num / gcd_n1_n2, R1::den / gcd_d1_d2>::value
+         >::type type;
+  };
+  template <class R1, class R2>
+  struct is_evenly_divisible_by
+  {
+  private:
+      static const boost::intmax_t gcd_n1_n2 = mpl::gcd_c<boost::intmax_t, R1::num, R2::num>::value;
+      static const boost::intmax_t gcd_d1_d2 = mpl::gcd_c<boost::intmax_t, R1::den, R2::den>::value;
+  public:
+      typedef integral_constant<bool,
+             ((R2::num / gcd_n1_n2 ==1) && (R1::den / gcd_d1_d2)==1)
+      > type;
+  };
+
+  template <class T>
+  struct is_ratio : public boost::false_type
+  {};
+  template <boost::intmax_t N, boost::intmax_t D>
+  struct is_ratio<ratio<N, D> > : public boost::true_type
+  {};
+
+  template <class R1, class R2,
+            boost::intmax_t Q1 = R1::num / R1::den, boost::intmax_t M1 = R1::num % R1::den,
+            boost::intmax_t Q2 = R2::num / R2::den, boost::intmax_t M2 = R2::num % R2::den>
+  struct ratio_less1
+  {
+    static const bool value = Q1 < Q2;
+  };
+
+  template <class R1, class R2, boost::intmax_t Q>
+  struct ratio_less1<R1, R2, Q, 0, Q, 0>
+  {
+    static const bool value = false;
+  };
+
+  template <class R1, class R2, boost::intmax_t Q, boost::intmax_t M2>
+  struct ratio_less1<R1, R2, Q, 0, Q, M2>
+  {
+    static const bool value = true;
+  };
+
+  template <class R1, class R2, boost::intmax_t Q, boost::intmax_t M1>
+  struct ratio_less1<R1, R2, Q, M1, Q, 0>
+  {
+    static const bool value = false;
+  };
+
+  template <class R1, class R2, boost::intmax_t Q, boost::intmax_t M1, boost::intmax_t M2>
+  struct ratio_less1<R1, R2, Q, M1, Q, M2>
+  {
+    static const bool value = ratio_less1<ratio<R2::den, M2>, ratio<R1::den, M1>
+                                            >::value;
+  };
+
+  template <
+      class R1,
+      class R2,
+      boost::intmax_t S1 = mpl::sign_c<boost::intmax_t, R1::num>::value,
+    boost::intmax_t S2 = mpl::sign_c<boost::intmax_t, R2::num>::value
+>
+  struct ratio_less
+  {
+      static const bool value = S1 < S2;
+  };
+
+  template <class R1, class R2>
+  struct ratio_less<R1, R2, 1LL, 1LL>
+  {
+      static const bool value = ratio_less1<R1, R2>::value;
+  };
+
+  template <class R1, class R2>
+  struct ratio_less<R1, R2, -1LL, -1LL>
+  {
+      static const bool value = ratio_less1<ratio<-R2::num, R2::den>,
+                                            ratio<-R1::num, R1::den> >::value;
+  };
+
+
+}  // namespace ratio_detail
+
+}  // namespace boost
+
+#endif  // BOOST_RATIO_HPP
diff --git a/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/system_clocks.hpp b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/system_clocks.hpp
new file mode 100644
index 0000000..0e70f14
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/system_clocks.hpp
@@ -0,0 +1,234 @@
+//  boost/chrono/system_clocks.hpp  --------------------------------------------------------------//
+
+//  Copyright 2008 Howard Hinnant
+//  Copyright 2008 Beman Dawes
+//  Copyright 2009-2011 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+/*
+
+This code was derived by Beman Dawes from Howard Hinnant's time2_demo prototype.
+Many thanks to Howard for making his code available under the Boost license.
+The original code was modified to conform to Boost conventions and to section
+20.9 Time utilities [time] of the C++ committee's working paper N2798.
+See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf.
+
+time2_demo contained this comment:
+
+    Much thanks to Andrei Alexandrescu,
+                   Walter Brown,
+                   Peter Dimov,
+                   Jeff Garland,
+                   Terry Golubiewski,
+                   Daniel Krugler,
+                   Anthony Williams.
+*/
+
+/*
+
+TODO:
+
+  * Fully implement error handling, with test cases.
+  * Consider issues raised by Michael Marcin:
+
+    > In the past I've seen QueryPerformanceCounter give incorrect results,
+    > especially with SpeedStep processors on laptops. This was many years ago and
+    > might have been fixed by service packs and drivers.
+    >
+    > Typically you check the results of QPC against GetTickCount to see if the
+    > results are reasonable.
+    > http://support.microsoft.com/kb/274323
+    >
+    > I've also heard of problems with QueryPerformanceCounter in multi-processor
+    > systems.
+    >
+    > I know some people SetThreadAffinityMask to 1 for the current thread call
+    > their QueryPerformance* functions then restore SetThreadAffinityMask. This
+    > seems horrible to me because it forces your program to jump to another
+    > physical processor if it isn't already on cpu0 but they claim it worked well
+    > in practice because they called the timing functions infrequently.
+    >
+    > In the past I have chosen to use timeGetTime with timeBeginPeriod(1) for
+    > high resolution timers to avoid these issues.
+
+*/
+
+#ifndef BOOST_CHRONO_SYSTEM_CLOCKS_HPP
+#define BOOST_CHRONO_SYSTEM_CLOCKS_HPP
+
+#include <boost/chrono/config.hpp>
+#include <boost/chrono/duration.hpp>
+#include <boost/chrono/time_point.hpp>
+#include <boost/chrono/detail/system.hpp>
+#include <boost/chrono/clock_string.hpp>
+
+#include <ctime>
+
+// avib
+//# if defined( BOOST_CHRONO_POSIX_API )
+//#   if ! defined(CLOCK_REALTIME)
+//#     error <time.h> does not supply CLOCK_REALTIME
+//#   endif
+//# endif
+
+#ifdef BOOST_CHRONO_WINDOWS_API
+// The system_clock tick is 100 nanoseconds
+# define BOOST_SYSTEM_CLOCK_DURATION boost::chrono::duration<boost::int_least64_t, ratio<BOOST_RATIO_INTMAX_C(1), BOOST_RATIO_INTMAX_C(10000000)> >
+#else
+# define BOOST_SYSTEM_CLOCK_DURATION boost::chrono::nanoseconds
+#endif
+
+// this must occur after all of the includes and before any code appears:
+#ifndef BOOST_CHRONO_HEADER_ONLY
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+#endif
+
+
+//----------------------------------------------------------------------------//
+//                                                                            //
+//                        20.9 Time utilities [time]                          //
+//                                 synopsis                                   //
+//                                                                            //
+//----------------------------------------------------------------------------//
+
+namespace boost {
+namespace chrono {
+
+  // Clocks
+  class BOOST_CHRONO_DECL system_clock;
+#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
+  class BOOST_CHRONO_DECL steady_clock;
+#endif
+
+#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
+  typedef steady_clock high_resolution_clock;  // as permitted by [time.clock.hires]
+#else
+  typedef system_clock high_resolution_clock;  // as permitted by [time.clock.hires]
+#endif
+
+//----------------------------------------------------------------------------//
+//                                                                            //
+//      20.9.5 Clocks [time.clock]                                            //
+//                                                                            //
+//----------------------------------------------------------------------------//
+
+// If you're porting, clocks are the system-specific (non-portable) part.
+// You'll need to know how to get the current time and implement that under now().
+// You'll need to know what units (tick period) and representation makes the most
+// sense for your clock and set those accordingly.
+// If you know how to map this clock to time_t (perhaps your clock is std::time, which
+// makes that trivial), then you can fill out system_clock's to_time_t() and from_time_t().
+
+//----------------------------------------------------------------------------//
+//      20.9.5.1 Class system_clock [time.clock.system]                       //
+//----------------------------------------------------------------------------//
+
+  class BOOST_CHRONO_DECL system_clock
+  {
+  public:
+      typedef BOOST_SYSTEM_CLOCK_DURATION          duration;
+      typedef duration::rep                        rep;
+      typedef duration::period                     period;
+      typedef chrono::time_point<system_clock>     time_point;
+      BOOST_STATIC_CONSTEXPR bool is_steady =             false;
+
+      static BOOST_CHRONO_INLINE time_point  now() BOOST_NOEXCEPT;
+#if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
+      static BOOST_CHRONO_INLINE time_point  now(system::error_code & ec);
+#endif
+
+      static BOOST_CHRONO_INLINE std::time_t to_time_t(const time_point& t) BOOST_NOEXCEPT;
+      static BOOST_CHRONO_INLINE time_point  from_time_t(std::time_t t) BOOST_NOEXCEPT;
+  };
+
+//----------------------------------------------------------------------------//
+//      20.9.5.2 Class steady_clock [time.clock.steady]                 //
+//----------------------------------------------------------------------------//
+
+// As permitted  by [time.clock.steady]
+// The class steady_clock is conditionally supported.
+
+#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
+  class BOOST_CHRONO_DECL steady_clock
+  {
+  public:
+      typedef nanoseconds                          duration;
+      typedef duration::rep                        rep;
+      typedef duration::period                     period;
+      typedef chrono::time_point<steady_clock>  time_point;
+      BOOST_STATIC_CONSTEXPR bool is_steady =             true;
+
+      static BOOST_CHRONO_INLINE time_point  now() BOOST_NOEXCEPT;
+#if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
+      static BOOST_CHRONO_INLINE time_point  now(system::error_code & ec);
+#endif
+  };
+#endif
+//----------------------------------------------------------------------------//
+//      20.9.5.3 Class high_resolution_clock [time.clock.hires]               //
+//----------------------------------------------------------------------------//
+
+//  As permitted, steady_clock or system_clock is a typedef for high_resolution_clock.
+//  See synopsis.
+
+
+  template<class CharT>
+  struct clock_string<system_clock, CharT>
+  {
+    static std::basic_string<CharT> name()
+    {
+      static const CharT u[] =
+      { 's', 'y', 's', 't', 'e', 'm', '_', 'c', 'l', 'o', 'c', 'k' };
+      static const std::basic_string<CharT> str(u, u + sizeof(u)
+          / sizeof(u[0]));
+      return str;
+    }
+    static std::basic_string<CharT> since()
+    {
+      static const CharT
+          u[] =
+              { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'J', 'a', 'n', ' ', '1', ',', ' ', '1', '9', '7', '0' };
+      static const std::basic_string<CharT> str(u, u + sizeof(u)
+          / sizeof(u[0]));
+      return str;
+    }
+  };
+
+#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
+
+  template<class CharT>
+  struct clock_string<steady_clock, CharT>
+  {
+    static std::basic_string<CharT> name()
+    {
+      static const CharT
+          u[] =
+              { 's', 't', 'e', 'a', 'd', 'y', '_', 'c', 'l', 'o', 'c', 'k' };
+      static const std::basic_string<CharT> str(u, u + sizeof(u)
+          / sizeof(u[0]));
+      return str;
+    }
+    static std::basic_string<CharT> since()
+    {
+      const CharT u[] =
+      { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'b', 'o', 'o', 't' };
+      const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
+      return str;
+    }
+  };
+
+#endif
+
+} // namespace chrono
+} // namespace boost
+
+#ifndef BOOST_CHRONO_HEADER_ONLY
+// the suffix header occurs after all of our code:
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+#else
+#include <boost/chrono/detail/inlined/chrono.hpp>
+#endif
+
+#endif // BOOST_CHRONO_SYSTEM_CLOCKS_HPP
diff --git a/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/utf8_codecvt_facet.ipp b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/utf8_codecvt_facet.ipp
new file mode 100644
index 0000000..2c6126a
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/boost_1_51_0/utf8_codecvt_facet.ipp
@@ -0,0 +1,309 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// utf8_codecvt_facet.ipp
+
+// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia at osl.iu.edu)
+// Andrew Lumsdaine, Indiana University (lums at osl.iu.edu). 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Please see the comments in <boost/detail/utf8_codecvt_facet.hpp> to
+// learn how this file should be used.
+
+#include <boost/detail/utf8_codecvt_facet.hpp>
+
+#include <cstdlib> // for multi-byte converson routines
+#include <cassert>
+
+#include <boost/limits.hpp>
+#include <boost/config.hpp>
+
+// If we don't have wstring, then Unicode support 
+// is not available anyway, so we don't need to even
+// compiler this file. This also fixes the problem
+// with mingw, which can compile this file, but will
+// generate link error when building DLL.
+#ifndef BOOST_NO_STD_WSTRING
+
+BOOST_UTF8_BEGIN_NAMESPACE
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation for wchar_t
+
+// Translate incoming UTF-8 into UCS-4
+std::codecvt_base::result utf8_codecvt_facet::do_in(
+    std::mbstate_t& /*state*/, 
+    const char * from,
+    const char * from_end, 
+    const char * & from_next,
+    wchar_t * to, 
+    wchar_t * to_end, 
+    wchar_t * & to_next
+) const {
+    // Basic algorithm:  The first octet determines how many
+    // octets total make up the UCS-4 character.  The remaining
+    // "continuing octets" all begin with "10". To convert, subtract
+    // the amount that specifies the number of octets from the first
+    // octet.  Subtract 0x80 (1000 0000) from each continuing octet,
+    // then mash the whole lot together.  Note that each continuing
+    // octet only uses 6 bits as unique values, so only shift by
+    // multiples of 6 to combine.
+    while (from != from_end && to != to_end) {
+
+        // Error checking   on the first octet
+        if (invalid_leading_octet(*from)){
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        // The first octet is   adjusted by a value dependent upon 
+        // the number   of "continuing octets" encoding the character
+        const   int cont_octet_count = get_cont_octet_count(*from);
+        const   wchar_t octet1_modifier_table[] =   {
+            0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+        };
+
+        // The unsigned char conversion is necessary in case char is
+        // signed   (I learned this the hard way)
+        wchar_t ucs_result = 
+            (unsigned char)(*from++) - octet1_modifier_table[cont_octet_count];
+
+        // Invariants   : 
+        //   1) At the start of the loop,   'i' continuing characters have been
+        //    processed 
+        //   2) *from   points to the next continuing character to be processed.
+        int i   = 0;
+        while(i != cont_octet_count && from != from_end) {
+
+            // Error checking on continuing characters
+            if (invalid_continuing_octet(*from)) {
+                from_next   = from;
+                to_next =   to;
+                return std::codecvt_base::error;
+            }
+
+            ucs_result *= (1 << 6); 
+
+            // each continuing character has an extra (10xxxxxx)b attached to 
+            // it that must be removed.
+            ucs_result += (unsigned char)(*from++) - 0x80;
+            ++i;
+        }
+
+        // If   the buffer ends with an incomplete unicode character...
+        if (from == from_end && i   != cont_octet_count) {
+            // rewind "from" to before the current character translation
+            from_next = from - (i+1); 
+            to_next = to;
+            return std::codecvt_base::partial;
+        }
+        *to++   = ucs_result;
+    }
+    from_next = from;
+    to_next = to;
+
+    // Were we done converting or did we run out of destination space?
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+std::codecvt_base::result utf8_codecvt_facet::do_out(
+    std::mbstate_t& /*state*/, 
+    const wchar_t *   from,
+    const wchar_t * from_end, 
+    const wchar_t * & from_next,
+    char * to, 
+    char * to_end, 
+    char * & to_next
+) const
+{
+    // RG - consider merging this table with the other one
+    const wchar_t octet1_modifier_table[] = {
+        0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+    };
+
+    wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)();
+    while (from != from_end && to != to_end) {
+
+        // Check for invalid UCS-4 character
+        if (*from  > max_wchar) {
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        int cont_octet_count = get_cont_octet_out_count(*from);
+
+        // RG  - comment this formula better
+        int shift_exponent = (cont_octet_count) *   6;
+
+        // Process the first character
+        *to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] +
+            (unsigned char)(*from / (1 << shift_exponent)));
+
+        // Process the continuation characters 
+        // Invariants: At   the start of the loop:
+        //   1) 'i' continuing octets   have been generated
+        //   2) '*to'   points to the next location to place an octet
+        //   3) shift_exponent is   6 more than needed for the next octet
+        int i   = 0;
+        while   (i != cont_octet_count && to != to_end) {
+            shift_exponent -= 6;
+            *to++ = static_cast<char>(0x80 + ((*from / (1 << shift_exponent)) % (1 << 6)));
+            ++i;
+        }
+        // If   we filled up the out buffer before encoding the character
+        if(to   == to_end && i != cont_octet_count) {
+            from_next = from;
+            to_next = to - (i+1);
+            return std::codecvt_base::partial;
+        }
+        ++from;
+    }
+    from_next = from;
+    to_next = to;
+    // Were we done or did we run out of destination space
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+// How many char objects can I process to get <= max_limit
+// wchar_t objects?
+int utf8_codecvt_facet::do_length(
+    BOOST_CODECVT_DO_LENGTH_CONST std::mbstate_t &,
+    const char * from,
+    const char * from_end, 
+    std::size_t max_limit
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+) const throw()
+#else
+) const
+#endif
+{ 
+    // RG - this code is confusing!  I need a better way to express it.
+    // and test cases.
+
+    // Invariants:
+    // 1) last_octet_count has the size of the last measured character
+    // 2) char_count holds the number of characters shown to fit
+    // within the bounds so far (no greater than max_limit)
+    // 3) from_next points to the octet 'last_octet_count' before the
+    // last measured character.  
+    int last_octet_count=0;
+    std::size_t char_count = 0;
+    const char* from_next = from;
+    // Use "<" because the buffer may represent incomplete characters
+    while (from_next+last_octet_count <= from_end && char_count <= max_limit) {
+        from_next += last_octet_count;
+        last_octet_count = (get_octet_count(*from_next));
+        ++char_count;
+    }
+    return static_cast<int>(from_next-from_end);
+}
+
+unsigned int utf8_codecvt_facet::get_octet_count(
+    unsigned char   lead_octet
+){
+    // if the 0-bit (MSB) is 0, then 1 character
+    if (lead_octet <= 0x7f) return 1;
+
+    // Otherwise the count number of consecutive 1 bits starting at MSB
+//    assert(0xc0 <= lead_octet && lead_octet <= 0xfd);
+
+    if (0xc0 <= lead_octet && lead_octet <= 0xdf) return 2;
+    else if (0xe0 <= lead_octet && lead_octet <= 0xef) return 3;
+    else if (0xf0 <= lead_octet && lead_octet <= 0xf7) return 4;
+    else if (0xf8 <= lead_octet && lead_octet <= 0xfb) return 5;
+    else return 6;
+}
+BOOST_UTF8_END_NAMESPACE
+
+namespace {
+template<std::size_t s>
+int get_cont_octet_out_count_impl(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    return 2;
+}
+
+
+// fix for boost_1_51_0
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+}
+
+/*  fix for boost_1_51_0
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+
+    // Note that the following code will generate warnings on some platforms
+    // where wchar_t is defined as UCS2.  The warnings are superfluous as the
+    // specialization is never instantitiated with such compilers, but this
+    // can cause problems if warnings are being treated as errors, so we guard
+    // against that.  Including <boost/detail/utf8_codecvt_facet.hpp> as we do
+    // should be enough to get WCHAR_MAX defined.
+#if !defined(WCHAR_MAX)
+#   error WCHAR_MAX not defined!
+#endif
+    // cope with VC++ 7.1 or earlier having invalid WCHAR_MAX
+#if defined(_MSC_VER) && _MSC_VER <= 1310 // 7.1 or earlier
+    return 2;
+#elif WCHAR_MAX > 0x10000
+    
+   if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+    
+#else
+    return 2;
+#endif
+}
+*/
+
+} // namespace anonymous
+
+BOOST_UTF8_BEGIN_NAMESPACE
+// How many "continuing octets" will be needed for this word
+// ==   total octets - 1.
+int utf8_codecvt_facet::get_cont_octet_out_count(
+    wchar_t word
+) const {
+    return get_cont_octet_out_count_impl<sizeof(wchar_t)>(word);
+}
+BOOST_UTF8_END_NAMESPACE
+
+#endif
diff --git a/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/README b/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/README
new file mode 100644
index 0000000..a01e1b1
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/README
@@ -0,0 +1,24 @@
+
+Fix for smart_cast.hpp
+======================
+
+Line 206:
+  replaced: 
+     if ( tmp == 0 ) throw_exception(std::bad_cast());
+  with:
+     if ( tmp == 0 ) boost::serialization::throw_exception(std::bad_cast());
+     
+     
+Due to following compile error:
+================================
+
+   acc.compile.c++ ANattr/bin/acc/debug/link-static/threading-multi/src/RepeatAttr.o
+"/scratch/ma/emos/ma0/hpia64/boost/boost_1_53_0/boost/serialization/smart_cast.hpp", line 206: error #2308: more than one instance of overloaded function "throw_exception" matches the argument list:
+            function template "void boost::throw_exception(const E &)"
+            function template "void boost::serialization::throw_exception(const E &)"
+            argument types are: (std::bad_cast)
+                      if ( tmp == 0 ) throw_exception(std::bad_cast());
+                                      ^
+   
+ODD: recompiling boost 1.53 did not show this problem ???????????
+     hence keep just in case.
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/smart_cast.hpp b/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/smart_cast.hpp
new file mode 100644
index 0000000..cdc7f97
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/smart_cast.hpp
@@ -0,0 +1,303 @@
+#ifndef BOOST_SERIALIZATION_SMART_CAST_HPP
+#define BOOST_SERIALIZATION_SMART_CAST_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// smart_cast.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/serialization for updates, documentation, and revision history.
+
+// casting of pointers and references.
+
+// In casting between different C++ classes, there are a number of
+// rules that have to be kept in mind in deciding whether to use
+// static_cast or dynamic_cast.
+
+// a) dynamic casting can only be applied when one of the types is polymorphic
+// Otherwise static_cast must be used.
+// b) only dynamic casting can do runtime error checking
+// use of static_cast is generally un checked even when compiled for debug
+// c) static_cast would be considered faster than dynamic_cast.
+
+// If casting is applied to a template parameter, there is no apriori way
+// to know which of the two casting methods will be permitted or convenient.
+
+// smart_cast uses C++ type_traits, and program debug mode to select the
+// most convenient cast to use.
+
+#include <exception>
+#include <typeinfo>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/identity.hpp>
+
+#include <boost/serialization/throw_exception.hpp>
+
+namespace boost {
+namespace serialization {
+namespace smart_cast_impl {
+
+    template<class T>
+    struct reference {
+
+        struct polymorphic {
+
+            struct linear {
+                template<class U>
+                 static T cast(U & u){
+                    return static_cast< T >(u);
+                }
+            };
+
+            struct cross {
+                 template<class U>
+                static T cast(U & u){
+                    return dynamic_cast< T >(u);
+                }
+            };
+
+            template<class U>
+            static T cast(U & u){
+                // if we're in debug mode
+                #if ! defined(NDEBUG)                               \
+                || defined(__BORLANDC__) && (__BORLANDC__ <= 0x560) \
+                || defined(__MWERKS__)
+                    // do a checked dynamic cast
+                    return cross::cast(u);
+                #else
+                    // borland 5.51 chokes here so we can't use it
+                    // note: if remove_reference isn't function for these types
+                    // cross casting will be selected this will work but will
+                    // not be the most efficient method. This will conflict with
+                    // the original smart_cast motivation.
+                    typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                            BOOST_DEDUCED_TYPENAME mpl::and_<
+                                mpl::not_<is_base_and_derived<
+                                    BOOST_DEDUCED_TYPENAME remove_reference< T >::type,
+                                    U
+                                > >,
+                                mpl::not_<is_base_and_derived<
+                                    U,
+                                    BOOST_DEDUCED_TYPENAME remove_reference< T >::type
+                                > >
+                            >,
+                            // borland chokes w/o full qualification here
+                            mpl::identity<cross>,
+                            mpl::identity<linear>
+                    >::type typex;
+                    // typex works around gcc 2.95 issue
+                    return typex::cast(u);
+                #endif
+            }
+        };
+
+        struct non_polymorphic {
+            template<class U>
+             static T cast(U & u){
+                return static_cast< T >(u);
+            }
+        };
+        template<class U>
+        static T cast(U & u){
+            #if defined(__BORLANDC__)
+                return mpl::eval_if<
+                    boost::is_polymorphic<U>,
+                    mpl::identity<polymorphic>,
+                    mpl::identity<non_polymorphic>
+                >::type::cast(u);
+            #else
+                typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                    boost::is_polymorphic<U>,
+                    mpl::identity<polymorphic>,
+                    mpl::identity<non_polymorphic>
+                >::type typex;
+                return typex::cast(u);
+            #endif
+        }
+    };
+
+    template<class T>
+    struct pointer {
+
+        struct polymorphic {
+            // unfortunately, this below fails to work for virtual base
+            // classes.  need has_virtual_base to do this.
+            // Subject for further study
+            #if 0
+            struct linear {
+                template<class U>
+                 static T cast(U * u){
+                    return static_cast< T >(u);
+                }
+            };
+
+            struct cross {
+                template<class U>
+                static T cast(U * u){
+                    T tmp = dynamic_cast< T >(u);
+                    #ifndef NDEBUG
+                        if ( tmp == 0 ) throw_exception(std::bad_cast());
+                    #endif
+                    return tmp;
+                }
+            };
+
+            template<class U>
+            static T cast(U * u){
+                // if we're in debug mode
+                #if ! defined(NDEBUG) || defined(__BORLANDC__) && (__BORLANDC__ <= 0x560)
+                    // do a checked dynamic cast
+                    return cross::cast(u);
+                #else
+                    // borland 5.51 chokes here so we can't use it
+                    // note: if remove_pointer isn't function for these types
+                    // cross casting will be selected this will work but will
+                    // not be the most efficient method. This will conflict with
+                    // the original smart_cast motivation.
+                    typedef
+                        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                            BOOST_DEDUCED_TYPENAME mpl::and_<
+                                mpl::not_<is_base_and_derived<
+                                    BOOST_DEDUCED_TYPENAME remove_pointer< T >::type,
+                                    U
+                                > >,
+                                mpl::not_<is_base_and_derived<
+                                    U,
+                                    BOOST_DEDUCED_TYPENAME remove_pointer< T >::type
+                                > >
+                            >,
+                            // borland chokes w/o full qualification here
+                            mpl::identity<cross>,
+                            mpl::identity<linear>
+                        >::type typex;
+                    return typex::cast(u);
+                #endif
+            }
+            #else
+            template<class U>
+            static T cast(U * u){
+                T tmp = dynamic_cast< T >(u);
+                #ifndef NDEBUG
+                    if ( tmp == 0 ) boost::serialization::throw_exception(std::bad_cast());
+                #endif
+                return tmp;
+            }
+            #endif
+        };
+
+        struct non_polymorphic {
+            template<class U>
+             static T cast(U * u){
+                return static_cast< T >(u);
+            }
+        };
+
+        template<class U>
+        static T cast(U * u){
+            #if defined(__BORLANDC__)
+                return mpl::eval_if<
+                    boost::is_polymorphic<U>,
+                    mpl::identity<polymorphic>,
+                    mpl::identity<non_polymorphic>
+                >::type::cast(u);
+            #else
+                typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                    boost::is_polymorphic<U>,
+                    mpl::identity<polymorphic>,
+                    mpl::identity<non_polymorphic>
+                >::type typex;
+                return typex::cast(u);
+            #endif
+        }
+
+    };
+
+    template<class TPtr>
+    struct void_pointer {
+        template<class UPtr>
+        static TPtr cast(UPtr uptr){
+            return static_cast<TPtr>(uptr);
+        }
+    };
+
+    template<class T>
+    struct error {
+        // if we get here, its because we are using one argument in the
+        // cast on a system which doesn't support partial template
+        // specialization
+        template<class U>
+        static T cast(U u){
+            BOOST_STATIC_ASSERT(sizeof(T)==0);
+            return * static_cast<T *>(NULL);
+        }
+    };
+
+} // smart_cast_impl
+
+// this implements:
+// smart_cast<Target *, Source *>(Source * s)
+// smart_cast<Target &, Source &>(s)
+// note that it will fail with
+// smart_cast<Target &>(s)
+template<class T, class U>
+T smart_cast(U u) {
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            BOOST_DEDUCED_TYPENAME mpl::or_<
+                boost::is_same<void *, U>,
+                boost::is_same<void *, T>,
+                boost::is_same<const void *, U>,
+                boost::is_same<const void *, T>
+            >,
+            mpl::identity<smart_cast_impl::void_pointer< T > >,
+        // else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<boost::is_pointer<U>,
+            mpl::identity<smart_cast_impl::pointer< T > >,
+        // else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<boost::is_reference<U>,
+            mpl::identity<smart_cast_impl::reference< T > >,
+        // else
+            mpl::identity<smart_cast_impl::error< T >
+        >
+        >
+        >
+        >::type typex;
+    return typex::cast(u);
+}
+
+// this implements:
+// smart_cast_reference<Target &>(Source & s)
+template<class T, class U>
+T smart_cast_reference(U & u) {
+    return smart_cast_impl::reference< T >::cast(u);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_SMART_CAST_HPP
diff --git a/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/utf8_codecvt_facet.ipp b/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/utf8_codecvt_facet.ipp
new file mode 100644
index 0000000..2c6126a
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/boost_1_53_0/utf8_codecvt_facet.ipp
@@ -0,0 +1,309 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// utf8_codecvt_facet.ipp
+
+// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia at osl.iu.edu)
+// Andrew Lumsdaine, Indiana University (lums at osl.iu.edu). 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Please see the comments in <boost/detail/utf8_codecvt_facet.hpp> to
+// learn how this file should be used.
+
+#include <boost/detail/utf8_codecvt_facet.hpp>
+
+#include <cstdlib> // for multi-byte converson routines
+#include <cassert>
+
+#include <boost/limits.hpp>
+#include <boost/config.hpp>
+
+// If we don't have wstring, then Unicode support 
+// is not available anyway, so we don't need to even
+// compiler this file. This also fixes the problem
+// with mingw, which can compile this file, but will
+// generate link error when building DLL.
+#ifndef BOOST_NO_STD_WSTRING
+
+BOOST_UTF8_BEGIN_NAMESPACE
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation for wchar_t
+
+// Translate incoming UTF-8 into UCS-4
+std::codecvt_base::result utf8_codecvt_facet::do_in(
+    std::mbstate_t& /*state*/, 
+    const char * from,
+    const char * from_end, 
+    const char * & from_next,
+    wchar_t * to, 
+    wchar_t * to_end, 
+    wchar_t * & to_next
+) const {
+    // Basic algorithm:  The first octet determines how many
+    // octets total make up the UCS-4 character.  The remaining
+    // "continuing octets" all begin with "10". To convert, subtract
+    // the amount that specifies the number of octets from the first
+    // octet.  Subtract 0x80 (1000 0000) from each continuing octet,
+    // then mash the whole lot together.  Note that each continuing
+    // octet only uses 6 bits as unique values, so only shift by
+    // multiples of 6 to combine.
+    while (from != from_end && to != to_end) {
+
+        // Error checking   on the first octet
+        if (invalid_leading_octet(*from)){
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        // The first octet is   adjusted by a value dependent upon 
+        // the number   of "continuing octets" encoding the character
+        const   int cont_octet_count = get_cont_octet_count(*from);
+        const   wchar_t octet1_modifier_table[] =   {
+            0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+        };
+
+        // The unsigned char conversion is necessary in case char is
+        // signed   (I learned this the hard way)
+        wchar_t ucs_result = 
+            (unsigned char)(*from++) - octet1_modifier_table[cont_octet_count];
+
+        // Invariants   : 
+        //   1) At the start of the loop,   'i' continuing characters have been
+        //    processed 
+        //   2) *from   points to the next continuing character to be processed.
+        int i   = 0;
+        while(i != cont_octet_count && from != from_end) {
+
+            // Error checking on continuing characters
+            if (invalid_continuing_octet(*from)) {
+                from_next   = from;
+                to_next =   to;
+                return std::codecvt_base::error;
+            }
+
+            ucs_result *= (1 << 6); 
+
+            // each continuing character has an extra (10xxxxxx)b attached to 
+            // it that must be removed.
+            ucs_result += (unsigned char)(*from++) - 0x80;
+            ++i;
+        }
+
+        // If   the buffer ends with an incomplete unicode character...
+        if (from == from_end && i   != cont_octet_count) {
+            // rewind "from" to before the current character translation
+            from_next = from - (i+1); 
+            to_next = to;
+            return std::codecvt_base::partial;
+        }
+        *to++   = ucs_result;
+    }
+    from_next = from;
+    to_next = to;
+
+    // Were we done converting or did we run out of destination space?
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+std::codecvt_base::result utf8_codecvt_facet::do_out(
+    std::mbstate_t& /*state*/, 
+    const wchar_t *   from,
+    const wchar_t * from_end, 
+    const wchar_t * & from_next,
+    char * to, 
+    char * to_end, 
+    char * & to_next
+) const
+{
+    // RG - consider merging this table with the other one
+    const wchar_t octet1_modifier_table[] = {
+        0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+    };
+
+    wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)();
+    while (from != from_end && to != to_end) {
+
+        // Check for invalid UCS-4 character
+        if (*from  > max_wchar) {
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        int cont_octet_count = get_cont_octet_out_count(*from);
+
+        // RG  - comment this formula better
+        int shift_exponent = (cont_octet_count) *   6;
+
+        // Process the first character
+        *to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] +
+            (unsigned char)(*from / (1 << shift_exponent)));
+
+        // Process the continuation characters 
+        // Invariants: At   the start of the loop:
+        //   1) 'i' continuing octets   have been generated
+        //   2) '*to'   points to the next location to place an octet
+        //   3) shift_exponent is   6 more than needed for the next octet
+        int i   = 0;
+        while   (i != cont_octet_count && to != to_end) {
+            shift_exponent -= 6;
+            *to++ = static_cast<char>(0x80 + ((*from / (1 << shift_exponent)) % (1 << 6)));
+            ++i;
+        }
+        // If   we filled up the out buffer before encoding the character
+        if(to   == to_end && i != cont_octet_count) {
+            from_next = from;
+            to_next = to - (i+1);
+            return std::codecvt_base::partial;
+        }
+        ++from;
+    }
+    from_next = from;
+    to_next = to;
+    // Were we done or did we run out of destination space
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+// How many char objects can I process to get <= max_limit
+// wchar_t objects?
+int utf8_codecvt_facet::do_length(
+    BOOST_CODECVT_DO_LENGTH_CONST std::mbstate_t &,
+    const char * from,
+    const char * from_end, 
+    std::size_t max_limit
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+) const throw()
+#else
+) const
+#endif
+{ 
+    // RG - this code is confusing!  I need a better way to express it.
+    // and test cases.
+
+    // Invariants:
+    // 1) last_octet_count has the size of the last measured character
+    // 2) char_count holds the number of characters shown to fit
+    // within the bounds so far (no greater than max_limit)
+    // 3) from_next points to the octet 'last_octet_count' before the
+    // last measured character.  
+    int last_octet_count=0;
+    std::size_t char_count = 0;
+    const char* from_next = from;
+    // Use "<" because the buffer may represent incomplete characters
+    while (from_next+last_octet_count <= from_end && char_count <= max_limit) {
+        from_next += last_octet_count;
+        last_octet_count = (get_octet_count(*from_next));
+        ++char_count;
+    }
+    return static_cast<int>(from_next-from_end);
+}
+
+unsigned int utf8_codecvt_facet::get_octet_count(
+    unsigned char   lead_octet
+){
+    // if the 0-bit (MSB) is 0, then 1 character
+    if (lead_octet <= 0x7f) return 1;
+
+    // Otherwise the count number of consecutive 1 bits starting at MSB
+//    assert(0xc0 <= lead_octet && lead_octet <= 0xfd);
+
+    if (0xc0 <= lead_octet && lead_octet <= 0xdf) return 2;
+    else if (0xe0 <= lead_octet && lead_octet <= 0xef) return 3;
+    else if (0xf0 <= lead_octet && lead_octet <= 0xf7) return 4;
+    else if (0xf8 <= lead_octet && lead_octet <= 0xfb) return 5;
+    else return 6;
+}
+BOOST_UTF8_END_NAMESPACE
+
+namespace {
+template<std::size_t s>
+int get_cont_octet_out_count_impl(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    return 2;
+}
+
+
+// fix for boost_1_51_0
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+}
+
+/*  fix for boost_1_51_0
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+
+    // Note that the following code will generate warnings on some platforms
+    // where wchar_t is defined as UCS2.  The warnings are superfluous as the
+    // specialization is never instantitiated with such compilers, but this
+    // can cause problems if warnings are being treated as errors, so we guard
+    // against that.  Including <boost/detail/utf8_codecvt_facet.hpp> as we do
+    // should be enough to get WCHAR_MAX defined.
+#if !defined(WCHAR_MAX)
+#   error WCHAR_MAX not defined!
+#endif
+    // cope with VC++ 7.1 or earlier having invalid WCHAR_MAX
+#if defined(_MSC_VER) && _MSC_VER <= 1310 // 7.1 or earlier
+    return 2;
+#elif WCHAR_MAX > 0x10000
+    
+   if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+    
+#else
+    return 2;
+#endif
+}
+*/
+
+} // namespace anonymous
+
+BOOST_UTF8_BEGIN_NAMESPACE
+// How many "continuing octets" will be needed for this word
+// ==   total octets - 1.
+int utf8_codecvt_facet::get_cont_octet_out_count(
+    wchar_t word
+) const {
+    return get_cont_octet_out_count_impl<sizeof(wchar_t)>(word);
+}
+BOOST_UTF8_END_NAMESPACE
+
+#endif
diff --git a/ecflow_4_0_7/build/hpux_fix/cstdint.hpp b/ecflow_4_0_7/build/hpux_fix/cstdint.hpp
new file mode 100644
index 0000000..bffdb4c
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/cstdint.hpp
@@ -0,0 +1,512 @@
+//  boost cstdint.hpp header file  ------------------------------------------//
+
+//  (C) Copyright Beman Dawes 1999.
+//  (C) Copyright Jens Mauer 2001
+//  (C) Copyright John Maddock 2001
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/integer for documentation.
+
+//  Revision History
+//   31 Oct 01  use BOOST_HAS_LONG_LONG to check for "long long" (Jens M.)
+//   16 Apr 01  check LONGLONG_MAX when looking for "long long" (Jens Maurer)
+//   23 Jan 01  prefer "long" over "int" for int32_t and intmax_t (Jens Maurer)
+//   12 Nov 00  Merged <boost/stdint.h> (Jens Maurer)
+//   23 Sep 00  Added INTXX_C macro support (John Maddock).
+//   22 Sep 00  Better 64-bit support (John Maddock)
+//   29 Jun 00  Reimplement to avoid including stdint.h within namespace boost
+//    8 Aug 99  Initial version (Beman Dawes)
+
+
+#ifndef BOOST_CSTDINT_HPP
+#define BOOST_CSTDINT_HPP
+
+//
+// Since we always define the INT#_C macros as per C++0x,
+// define __STDC_CONSTANT_MACROS so that <stdint.h> does the right
+// thing if possible, and so that the user knows that the macros
+// are actually defined as per C99.
+//
+#ifndef __STDC_CONSTANT_MACROS
+#  define __STDC_CONSTANT_MACROS
+#endif
+
+#include <boost/config.hpp>
+
+//
+// Note that GLIBC is a bit inconsistent about whether int64_t is defined or not
+// depending upon what headers happen to have been included first...
+// so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG.
+// See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990
+//
+#if defined(BOOST_HAS_STDINT_H) && (!defined(__GLIBC__) || defined(__GLIBC_HAVE_LONG_LONG))
+
+// The following #include is an implementation artifact; not part of interface.
+# ifdef __hpux
+// HP-UX has a vaguely nice <stdint.h> in a non-standard location
+#   include <inttypes.h>
+#   ifdef __STDC_32_MODE__
+      // this is triggered with GCC, because it defines __cplusplus < 199707L
+#     define BOOST_NO_INT64_T
+#   endif
+# elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX)
+#   include <inttypes.h>
+# else
+#   include <stdint.h>
+
+// There is a bug in Cygwin two _C macros
+#   if defined(__STDC_CONSTANT_MACROS) && defined(__CYGWIN__)
+#     undef INTMAX_C
+#     undef UINTMAX_C
+#     define INTMAX_C(c) c##LL
+#     define UINTMAX_C(c) c##ULL
+#   endif
+
+# endif
+
+#ifdef __QNX__
+
+// QNX (Dinkumware stdlib) defines these as non-standard names.
+// Reflect to the standard names.
+
+typedef ::intleast8_t int_least8_t;
+typedef ::intfast8_t int_fast8_t;
+typedef ::uintleast8_t uint_least8_t;
+typedef ::uintfast8_t uint_fast8_t;
+
+typedef ::intleast16_t int_least16_t;
+typedef ::intfast16_t int_fast16_t;
+typedef ::uintleast16_t uint_least16_t;
+typedef ::uintfast16_t uint_fast16_t;
+
+typedef ::intleast32_t int_least32_t;
+typedef ::intfast32_t int_fast32_t;
+typedef ::uintleast32_t uint_least32_t;
+typedef ::uintfast32_t uint_fast32_t;
+
+# ifndef BOOST_NO_INT64_T
+
+typedef ::intleast64_t int_least64_t;
+typedef ::intfast64_t int_fast64_t;
+typedef ::uintleast64_t uint_least64_t;
+typedef ::uintfast64_t uint_fast64_t;
+
+# endif
+
+#endif
+
+namespace boost
+{
+// avi>>
+#ifdef HPUX
+  typedef signed char int8_t;
+#else
+  using ::int8_t;
+#endif
+  using ::int_least8_t;
+  using ::int_fast8_t;
+  using ::uint8_t;
+  using ::uint_least8_t;
+  using ::uint_fast8_t;
+
+  using ::int16_t;
+  using ::int_least16_t;
+  using ::int_fast16_t;
+  using ::uint16_t;
+  using ::uint_least16_t;
+  using ::uint_fast16_t;
+
+  using ::int32_t;
+  using ::int_least32_t;
+  using ::int_fast32_t;
+  using ::uint32_t;
+  using ::uint_least32_t;
+  using ::uint_fast32_t;
+
+# ifndef BOOST_NO_INT64_T
+
+  using ::int64_t;
+  using ::int_least64_t;
+  using ::int_fast64_t;
+  using ::uint64_t;
+  using ::uint_least64_t;
+  using ::uint_fast64_t;
+
+# endif
+
+  using ::intmax_t;
+  using ::uintmax_t;
+
+} // namespace boost
+
+#elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__) || defined(__VMS)
+// FreeBSD and Tru64 have an <inttypes.h> that contains much of what we need.
+# include <inttypes.h>
+
+namespace boost {
+
+  using ::int8_t;
+  typedef int8_t int_least8_t;
+  typedef int8_t int_fast8_t;
+  using ::uint8_t;
+  typedef uint8_t uint_least8_t;
+  typedef uint8_t uint_fast8_t;
+
+  using ::int16_t;
+  typedef int16_t int_least16_t;
+  typedef int16_t int_fast16_t;
+  using ::uint16_t;
+  typedef uint16_t uint_least16_t;
+  typedef uint16_t uint_fast16_t;
+
+  using ::int32_t;
+  typedef int32_t int_least32_t;
+  typedef int32_t int_fast32_t;
+  using ::uint32_t;
+  typedef uint32_t uint_least32_t;
+  typedef uint32_t uint_fast32_t;
+
+# ifndef BOOST_NO_INT64_T
+
+  using ::int64_t;
+  typedef int64_t int_least64_t;
+  typedef int64_t int_fast64_t;
+  using ::uint64_t;
+  typedef uint64_t uint_least64_t;
+  typedef uint64_t uint_fast64_t;
+
+  typedef int64_t intmax_t;
+  typedef uint64_t uintmax_t;
+
+# else
+
+  typedef int32_t intmax_t;
+  typedef uint32_t uintmax_t;
+
+# endif
+
+} // namespace boost
+
+#else  // BOOST_HAS_STDINT_H
+
+# include <boost/limits.hpp> // implementation artifact; not part of interface
+# include <limits.h>         // needed for limits macros
+
+
+namespace boost
+{
+
+//  These are fairly safe guesses for some 16-bit, and most 32-bit and 64-bit
+//  platforms.  For other systems, they will have to be hand tailored.
+//
+//  Because the fast types are assumed to be the same as the undecorated types,
+//  it may be possible to hand tailor a more efficient implementation.  Such
+//  an optimization may be illusionary; on the Intel x86-family 386 on, for
+//  example, byte arithmetic and load/stores are as fast as "int" sized ones.
+
+//  8-bit types  ------------------------------------------------------------//
+
+# if UCHAR_MAX == 0xff
+     typedef signed char     int8_t;
+     typedef signed char     int_least8_t;
+     typedef signed char     int_fast8_t;
+     typedef unsigned char   uint8_t;
+     typedef unsigned char   uint_least8_t;
+     typedef unsigned char   uint_fast8_t;
+# else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+# endif
+
+//  16-bit types  -----------------------------------------------------------//
+
+# if USHRT_MAX == 0xffff
+#  if defined(__crayx1)
+     // The Cray X1 has a 16-bit short, however it is not recommend
+     // for use in performance critical code.
+     typedef short           int16_t;
+     typedef short           int_least16_t;
+     typedef int             int_fast16_t;
+     typedef unsigned short  uint16_t;
+     typedef unsigned short  uint_least16_t;
+     typedef unsigned int    uint_fast16_t;
+#  else
+     typedef short           int16_t;
+     typedef short           int_least16_t;
+     typedef short           int_fast16_t;
+     typedef unsigned short  uint16_t;
+     typedef unsigned short  uint_least16_t;
+     typedef unsigned short  uint_fast16_t;
+#  endif
+# elif (USHRT_MAX == 0xffffffff) && defined(__MTA__)
+      // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified
+      // MTA / XMT does support the following non-standard integer types
+      typedef __short16           int16_t;
+      typedef __short16           int_least16_t;
+      typedef __short16           int_fast16_t;
+      typedef unsigned __short16  uint16_t;
+      typedef unsigned __short16  uint_least16_t;
+      typedef unsigned __short16  uint_fast16_t;
+# elif (USHRT_MAX == 0xffffffff) && defined(CRAY)
+     // no 16-bit types on Cray:
+     typedef short           int_least16_t;
+     typedef short           int_fast16_t;
+     typedef unsigned short  uint_least16_t;
+     typedef unsigned short  uint_fast16_t;
+# else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+# endif
+
+//  32-bit types  -----------------------------------------------------------//
+
+# if UINT_MAX == 0xffffffff
+     typedef int             int32_t;
+     typedef int             int_least32_t;
+     typedef int             int_fast32_t;
+     typedef unsigned int    uint32_t;
+     typedef unsigned int    uint_least32_t;
+     typedef unsigned int    uint_fast32_t;
+# elif (USHRT_MAX == 0xffffffff)
+     typedef short             int32_t;
+     typedef short             int_least32_t;
+     typedef short             int_fast32_t;
+     typedef unsigned short    uint32_t;
+     typedef unsigned short    uint_least32_t;
+     typedef unsigned short    uint_fast32_t;
+# elif ULONG_MAX == 0xffffffff
+     typedef long            int32_t;
+     typedef long            int_least32_t;
+     typedef long            int_fast32_t;
+     typedef unsigned long   uint32_t;
+     typedef unsigned long   uint_least32_t;
+     typedef unsigned long   uint_fast32_t;
+# elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__)
+      // Integers are 64 bits on the MTA / XMT
+      typedef __int32           int32_t;
+      typedef __int32           int_least32_t;
+      typedef __int32           int_fast32_t;
+      typedef unsigned __int32  uint32_t;
+      typedef unsigned __int32  uint_least32_t;
+      typedef unsigned __int32  uint_fast32_t;
+# else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+# endif
+
+//  64-bit types + intmax_t and uintmax_t  ----------------------------------//
+
+# if defined(BOOST_HAS_LONG_LONG) && \
+   !defined(BOOST_MSVC) && !defined(__BORLANDC__) && \
+   (!defined(__GLIBCPP__) || defined(_GLIBCPP_USE_LONG_LONG)) && \
+   (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))
+#    if defined(__hpux)
+     // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
+#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL)
+                                                                 // 2**64 - 1
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+
+     typedef  ::boost::long_long_type            intmax_t;
+     typedef  ::boost::ulong_long_type   uintmax_t;
+     typedef  ::boost::long_long_type            int64_t;
+     typedef  ::boost::long_long_type            int_least64_t;
+     typedef  ::boost::long_long_type            int_fast64_t;
+     typedef  ::boost::ulong_long_type   uint64_t;
+     typedef  ::boost::ulong_long_type   uint_least64_t;
+     typedef  ::boost::ulong_long_type   uint_fast64_t;
+
+# elif ULONG_MAX != 0xffffffff
+
+#    if ULONG_MAX == 18446744073709551615 // 2**64 - 1
+     typedef long                 intmax_t;
+     typedef unsigned long        uintmax_t;
+     typedef long                 int64_t;
+     typedef long                 int_least64_t;
+     typedef long                 int_fast64_t;
+     typedef unsigned long        uint64_t;
+     typedef unsigned long        uint_least64_t;
+     typedef unsigned long        uint_fast64_t;
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+# elif defined(__GNUC__) && defined(BOOST_HAS_LONG_LONG)
+     __extension__ typedef long long            intmax_t;
+     __extension__ typedef unsigned long long   uintmax_t;
+     __extension__ typedef long long            int64_t;
+     __extension__ typedef long long            int_least64_t;
+     __extension__ typedef long long            int_fast64_t;
+     __extension__ typedef unsigned long long   uint64_t;
+     __extension__ typedef unsigned long long   uint_least64_t;
+     __extension__ typedef unsigned long long   uint_fast64_t;
+# elif defined(BOOST_HAS_MS_INT64)
+     //
+     // we have Borland/Intel/Microsoft __int64:
+     //
+     typedef __int64             intmax_t;
+     typedef unsigned __int64    uintmax_t;
+     typedef __int64             int64_t;
+     typedef __int64             int_least64_t;
+     typedef __int64             int_fast64_t;
+     typedef unsigned __int64    uint64_t;
+     typedef unsigned __int64    uint_least64_t;
+     typedef unsigned __int64    uint_fast64_t;
+# else // assume no 64-bit integers
+#  define BOOST_NO_INT64_T
+     typedef int32_t              intmax_t;
+     typedef uint32_t             uintmax_t;
+# endif
+
+} // namespace boost
+
+
+#endif // BOOST_HAS_STDINT_H
+
+#endif // BOOST_CSTDINT_HPP
+
+
+/****************************************************
+
+Macro definition section:
+
+Added 23rd September 2000 (John Maddock).
+Modified 11th September 2001 to be excluded when
+BOOST_HAS_STDINT_H is defined (John Maddock).
+Modified 11th Dec 2009 to always define the
+INT#_C macros if they're not already defined (John Maddock).
+
+******************************************************/
+
+#if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \
+   (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C))
+//
+// For the following code we get several warnings along the lines of:
+//
+// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant
+//
+// So we declare this a system header to suppress these warnings.
+//
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#pragma GCC system_header
+#endif
+
+#include <limits.h>
+# define BOOST__STDC_CONSTANT_MACROS_DEFINED
+# if defined(BOOST_HAS_MS_INT64)
+//
+// Borland/Intel/Microsoft compilers have width specific suffixes:
+//
+#ifndef INT8_C
+#  define INT8_C(value)     value##i8
+#endif
+#ifndef INT16_C
+#  define INT16_C(value)    value##i16
+#endif
+#ifndef INT32_C
+#  define INT32_C(value)    value##i32
+#endif
+#ifndef INT64_C
+#  define INT64_C(value)    value##i64
+#endif
+#  ifdef __BORLANDC__
+    // Borland bug: appending ui8 makes the type a signed char
+#   define UINT8_C(value)    static_cast<unsigned char>(value##u)
+#  else
+#   define UINT8_C(value)    value##ui8
+#  endif
+#ifndef UINT16_C
+#  define UINT16_C(value)   value##ui16
+#endif
+#ifndef UINT32_C
+#  define UINT32_C(value)   value##ui32
+#endif
+#ifndef UINT64_C
+#  define UINT64_C(value)   value##ui64
+#endif
+#ifndef INTMAX_C
+#  define INTMAX_C(value)   value##i64
+#  define UINTMAX_C(value)  value##ui64
+#endif
+
+# else
+//  do it the old fashioned way:
+
+//  8-bit types  ------------------------------------------------------------//
+
+#  if (UCHAR_MAX == 0xff) && !defined(INT8_C)
+#   define INT8_C(value) static_cast<boost::int8_t>(value)
+#   define UINT8_C(value) static_cast<boost::uint8_t>(value##u)
+#  endif
+
+//  16-bit types  -----------------------------------------------------------//
+
+#  if (USHRT_MAX == 0xffff) && !defined(INT16_C)
+#   define INT16_C(value) static_cast<boost::int16_t>(value)
+#   define UINT16_C(value) static_cast<boost::uint16_t>(value##u)
+#  endif
+
+//  32-bit types  -----------------------------------------------------------//
+#ifndef INT32_C
+#  if (UINT_MAX == 0xffffffff)
+#   define INT32_C(value) value
+#   define UINT32_C(value) value##u
+#  elif ULONG_MAX == 0xffffffff
+#   define INT32_C(value) value##L
+#   define UINT32_C(value) value##uL
+#  endif
+#endif
+
+//  64-bit types + intmax_t and uintmax_t  ----------------------------------//
+#ifndef INT64_C
+#  if defined(BOOST_HAS_LONG_LONG) && \
+    (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX) || defined(_LLONG_MAX))
+
+#    if defined(__hpux)
+        // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
+#       define INT64_C(value) value##LL
+#       define UINT64_C(value) value##uLL
+#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) ||  \
+        (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) ||  \
+        (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL) || \
+        (defined(_LLONG_MAX) && _LLONG_MAX == 18446744073709551615ULL)
+
+#       define INT64_C(value) value##LL
+#       define UINT64_C(value) value##uLL
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+#  elif ULONG_MAX != 0xffffffff
+
+#    if ULONG_MAX == 18446744073709551615U // 2**64 - 1
+#       define INT64_C(value) value##L
+#       define UINT64_C(value) value##uL
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+#  elif defined(BOOST_HAS_LONG_LONG)
+     // Usual macros not defined, work things out for ourselves:
+#    if(~0uLL == 18446744073709551615ULL)
+#       define INT64_C(value) value##LL
+#       define UINT64_C(value) value##uLL
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+#  else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+#  endif
+
+#  ifdef BOOST_NO_INT64_T
+#   define INTMAX_C(value) INT32_C(value)
+#   define UINTMAX_C(value) UINT32_C(value)
+#  else
+#   define INTMAX_C(value) INT64_C(value)
+#   define UINTMAX_C(value) UINT64_C(value)
+#  endif
+#endif
+# endif // Borland/Microsoft specific width suffixes
+
+#endif // INT#_C macros.
+
+
+
+
diff --git a/ecflow_4_0_7/build/hpux_fix/socket_ops.hpp b/ecflow_4_0_7/build/hpux_fix/socket_ops.hpp
new file mode 100644
index 0000000..b1341e1
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/socket_ops.hpp
@@ -0,0 +1,1914 @@
+//
+// socket_ops.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_ASIO_DETAIL_SOCKET_OPS_HPP
+#define BOOST_ASIO_DETAIL_SOCKET_OPS_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include <boost/asio/detail/push_options.hpp>
+
+#include <boost/asio/detail/push_options.hpp>
+#include <boost/config.hpp>
+#include <boost/assert.hpp>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
+#include <boost/detail/workaround.hpp>
+#include <new>
+#include <boost/asio/detail/pop_options.hpp>
+
+#include <boost/asio/error.hpp>
+#include <boost/asio/detail/socket_types.hpp>
+
+namespace boost {
+namespace asio {
+namespace detail {
+namespace socket_ops {
+
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+struct msghdr { int msg_namelen; };
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+
+#if defined(__hpux)
+// HP-UX doesn't declare these functions extern "C", so they are declared again
+// here to avoid linker errors about undefined symbols.
+extern "C" char* if_indextoname(unsigned int, char*);
+extern "C" unsigned int if_nametoindex(const char*);
+#endif // defined(__hpux)
+
+inline void clear_error(boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  WSASetLastError(0);
+#else
+  errno = 0;
+#endif
+  ec = boost::system::error_code();
+}
+
+template <typename ReturnType>
+inline ReturnType error_wrapper(ReturnType return_value,
+    boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  ec = boost::system::error_code(WSAGetLastError(),
+      boost::asio::error::get_system_category());
+#else
+  ec = boost::system::error_code(errno,
+      boost::asio::error::get_system_category());
+#endif
+  return return_value;
+}
+
+template <typename SockLenType>
+inline socket_type call_accept(SockLenType msghdr::*,
+    socket_type s, socket_addr_type* addr, std::size_t* addrlen)
+{
+  SockLenType tmp_addrlen = addrlen ? (SockLenType)*addrlen : 0;
+  socket_type result = ::accept(s, addr, addrlen ? &tmp_addrlen : 0);
+  if (addrlen)
+    *addrlen = (std::size_t)tmp_addrlen;
+  return result;
+}
+
+inline socket_type accept(socket_type s, socket_addr_type* addr,
+    std::size_t* addrlen, boost::system::error_code& ec)
+{
+  clear_error(ec);
+
+  socket_type new_s = error_wrapper(call_accept(
+        &msghdr::msg_namelen, s, addr, addrlen), ec);
+  if (new_s == invalid_socket)
+    return new_s;
+
+#if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
+  int optval = 1;
+  int result = error_wrapper(::setsockopt(new_s,
+        SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec);
+  if (result != 0)
+  {
+    ::close(new_s);
+    return invalid_socket;
+  }
+#endif
+
+  clear_error(ec);
+  return new_s;
+}
+
+template <typename SockLenType>
+inline int call_bind(SockLenType msghdr::*,
+    socket_type s, const socket_addr_type* addr, std::size_t addrlen)
+{
+  return ::bind(s, addr, (SockLenType)addrlen);
+}
+
+inline int bind(socket_type s, const socket_addr_type* addr,
+    std::size_t addrlen, boost::system::error_code& ec)
+{
+  clear_error(ec);
+  int result = error_wrapper(call_bind(
+        &msghdr::msg_namelen, s, addr, addrlen), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+}
+
+inline int close(socket_type s, boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  int result = error_wrapper(::closesocket(s), ec);
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  int result = error_wrapper(::close(s), ec);
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  if (result == 0)
+    clear_error(ec);
+  return result;
+}
+
+inline int shutdown(socket_type s, int what, boost::system::error_code& ec)
+{
+  clear_error(ec);
+  int result = error_wrapper(::shutdown(s, what), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+}
+
+template <typename SockLenType>
+inline int call_connect(SockLenType msghdr::*,
+    socket_type s, const socket_addr_type* addr, std::size_t addrlen)
+{
+  return ::connect(s, addr, (SockLenType)addrlen);
+}
+
+inline int connect(socket_type s, const socket_addr_type* addr,
+    std::size_t addrlen, boost::system::error_code& ec)
+{
+  clear_error(ec);
+  int result = error_wrapper(call_connect(
+        &msghdr::msg_namelen, s, addr, addrlen), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+}
+
+inline int socketpair(int af, int type, int protocol,
+    socket_type sv[2], boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  (void)(af);
+  (void)(type);
+  (void)(protocol);
+  (void)(sv);
+  ec = boost::asio::error::operation_not_supported;
+  return -1;
+#else
+  clear_error(ec);
+  int result = error_wrapper(::socketpair(af, type, protocol, sv), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+#endif
+}
+
+inline int listen(socket_type s, int backlog, boost::system::error_code& ec)
+{
+  clear_error(ec);
+  int result = error_wrapper(::listen(s, backlog), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+}
+
+inline void init_buf_iov_base(void*& base, void* addr)
+{
+  base = addr;
+}
+
+template <typename T>
+inline void init_buf_iov_base(T& base, void* addr)
+{
+  base = static_cast<T>(addr);
+}
+
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+typedef WSABUF buf;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+typedef iovec buf;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+
+inline void init_buf(buf& b, void* data, size_t size)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  b.buf = static_cast<char*>(data);
+  b.len = static_cast<u_long>(size);
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  init_buf_iov_base(b.iov_base, data);
+  b.iov_len = size;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline void init_buf(buf& b, const void* data, size_t size)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  b.buf = static_cast<char*>(const_cast<void*>(data));
+  b.len = static_cast<u_long>(size);
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  init_buf_iov_base(b.iov_base, const_cast<void*>(data));
+  b.iov_len = size;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline void init_msghdr_msg_name(void*& name, socket_addr_type* addr)
+{
+  name = addr;
+}
+
+inline void init_msghdr_msg_name(void*& name, const socket_addr_type* addr)
+{
+  name = const_cast<socket_addr_type*>(addr);
+}
+
+template <typename T>
+inline void init_msghdr_msg_name(T& name, socket_addr_type* addr)
+{
+  name = reinterpret_cast<T>(addr);
+}
+
+template <typename T>
+inline void init_msghdr_msg_name(T& name, const socket_addr_type* addr)
+{
+  name = reinterpret_cast<T>(const_cast<socket_addr_type*>(addr));
+}
+
+inline int recv(socket_type s, buf* bufs, size_t count, int flags,
+    boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  // Receive some data.
+  DWORD recv_buf_count = static_cast<DWORD>(count);
+  DWORD bytes_transferred = 0;
+  DWORD recv_flags = flags;
+  int result = error_wrapper(::WSARecv(s, bufs,
+        recv_buf_count, &bytes_transferred, &recv_flags, 0, 0), ec);
+  if (result != 0)
+    return -1;
+  clear_error(ec);
+  return bytes_transferred;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  msghdr msg = msghdr();
+  msg.msg_iov = bufs;
+  msg.msg_iovlen = count;
+  int result = error_wrapper(::recvmsg(s, &msg, flags), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline int recvfrom(socket_type s, buf* bufs, size_t count, int flags,
+    socket_addr_type* addr, std::size_t* addrlen,
+    boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  // Receive some data.
+  DWORD recv_buf_count = static_cast<DWORD>(count);
+  DWORD bytes_transferred = 0;
+  DWORD recv_flags = flags;
+  int tmp_addrlen = (int)*addrlen;
+  int result = error_wrapper(::WSARecvFrom(s, bufs, recv_buf_count,
+        &bytes_transferred, &recv_flags, addr, &tmp_addrlen, 0, 0), ec);
+  *addrlen = (std::size_t)tmp_addrlen;
+  if (result != 0)
+    return -1;
+  clear_error(ec);
+  return bytes_transferred;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  msghdr msg = msghdr();
+  init_msghdr_msg_name(msg.msg_name, addr);
+  msg.msg_namelen = *addrlen;
+  msg.msg_iov = bufs;
+  msg.msg_iovlen = count;
+  int result = error_wrapper(::recvmsg(s, &msg, flags), ec);
+  *addrlen = msg.msg_namelen;
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline int send(socket_type s, const buf* bufs, size_t count, int flags,
+    boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  // Send the data.
+  DWORD send_buf_count = static_cast<DWORD>(count);
+  DWORD bytes_transferred = 0;
+  DWORD send_flags = flags;
+  int result = error_wrapper(::WSASend(s, const_cast<buf*>(bufs),
+        send_buf_count, &bytes_transferred, send_flags, 0, 0), ec);
+  if (result != 0)
+    return -1;
+  clear_error(ec);
+  return bytes_transferred;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  msghdr msg = msghdr();
+  msg.msg_iov = const_cast<buf*>(bufs);
+  msg.msg_iovlen = count;
+#if defined(__linux__)
+  flags |= MSG_NOSIGNAL;
+#endif // defined(__linux__)
+  int result = error_wrapper(::sendmsg(s, &msg, flags), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline int sendto(socket_type s, const buf* bufs, size_t count, int flags,
+    const socket_addr_type* addr, std::size_t addrlen,
+    boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  // Send the data.
+  DWORD send_buf_count = static_cast<DWORD>(count);
+  DWORD bytes_transferred = 0;
+  int result = error_wrapper(::WSASendTo(s, const_cast<buf*>(bufs),
+        send_buf_count, &bytes_transferred, flags, addr,
+        static_cast<int>(addrlen), 0, 0), ec);
+  if (result != 0)
+    return -1;
+  clear_error(ec);
+  return bytes_transferred;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  msghdr msg = msghdr();
+  init_msghdr_msg_name(msg.msg_name, addr);
+  msg.msg_namelen = addrlen;
+  msg.msg_iov = const_cast<buf*>(bufs);
+  msg.msg_iovlen = count;
+#if defined(__linux__)
+  flags |= MSG_NOSIGNAL;
+#endif // defined(__linux__)
+  int result = error_wrapper(::sendmsg(s, &msg, flags), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline socket_type socket(int af, int type, int protocol,
+    boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  socket_type s = error_wrapper(::WSASocket(af, type, protocol, 0, 0,
+        WSA_FLAG_OVERLAPPED), ec);
+  if (s == invalid_socket)
+    return s;
+
+  if (af == AF_INET6)
+  {
+    // Try to enable the POSIX default behaviour of having IPV6_V6ONLY set to
+    // false. This will only succeed on Windows Vista and later versions of
+    // Windows, where a dual-stack IPv4/v6 implementation is available.
+    DWORD optval = 0;
+    ::setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
+        reinterpret_cast<const char*>(&optval), sizeof(optval));
+  }
+
+  clear_error(ec);
+
+  return s;
+#elif defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
+  socket_type s = error_wrapper(::socket(af, type, protocol), ec);
+  if (s == invalid_socket)
+    return s;
+
+  int optval = 1;
+  int result = error_wrapper(::setsockopt(s,
+        SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec);
+  if (result != 0)
+  {
+    ::close(s);
+    return invalid_socket;
+  }
+
+  return s;
+#else
+  int s = error_wrapper(::socket(af, type, protocol), ec);
+  if (s >= 0)
+    clear_error(ec);
+  return s;
+#endif
+}
+
+template <typename SockLenType>
+inline int call_setsockopt(SockLenType msghdr::*,
+    socket_type s, int level, int optname,
+    const void* optval, std::size_t optlen)
+{
+  return ::setsockopt(s, level, optname,
+      (const char*)optval, (SockLenType)optlen);
+}
+
+inline int setsockopt(socket_type s, int level, int optname,
+    const void* optval, std::size_t optlen, boost::system::error_code& ec)
+{
+  if (level == custom_socket_option_level && optname == always_fail_option)
+  {
+    ec = boost::asio::error::invalid_argument;
+    return -1;
+  }
+
+#if defined(__BORLANDC__)
+  // Mysteriously, using the getsockopt and setsockopt functions directly with
+  // Borland C++ results in incorrect values being set and read. The bug can be
+  // worked around by using function addresses resolved with GetProcAddress.
+  if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32"))
+  {
+    typedef int (WSAAPI *sso_t)(SOCKET, int, int, const char*, int);
+    if (sso_t sso = (sso_t)::GetProcAddress(winsock_module, "setsockopt"))
+    {
+      clear_error(ec);
+      return error_wrapper(sso(s, level, optname,
+            reinterpret_cast<const char*>(optval),
+            static_cast<int>(optlen)), ec);
+    }
+  }
+  ec = boost::asio::error::fault;
+  return -1;
+#else // defined(__BORLANDC__)
+  clear_error(ec);
+  int result = error_wrapper(call_setsockopt(&msghdr::msg_namelen,
+        s, level, optname, optval, optlen), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+#endif // defined(__BORLANDC__)
+}
+
+template <typename SockLenType>
+inline int call_getsockopt(SockLenType msghdr::*,
+    socket_type s, int level, int optname,
+    void* optval, std::size_t* optlen)
+{
+  SockLenType tmp_optlen = (SockLenType)*optlen;
+  int result = ::getsockopt(s, level, optname, (char*)optval, &tmp_optlen);
+  *optlen = (std::size_t)tmp_optlen;
+  return result;
+}
+
+inline int getsockopt(socket_type s, int level, int optname, void* optval,
+    size_t* optlen, boost::system::error_code& ec)
+{
+  if (level == custom_socket_option_level && optname == always_fail_option)
+  {
+    ec = boost::asio::error::invalid_argument;
+    return -1;
+  }
+
+#if defined(__BORLANDC__)
+  // Mysteriously, using the getsockopt and setsockopt functions directly with
+  // Borland C++ results in incorrect values being set and read. The bug can be
+  // worked around by using function addresses resolved with GetProcAddress.
+  if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32"))
+  {
+    typedef int (WSAAPI *gso_t)(SOCKET, int, int, char*, int*);
+    if (gso_t gso = (gso_t)::GetProcAddress(winsock_module, "getsockopt"))
+    {
+      clear_error(ec);
+      int tmp_optlen = static_cast<int>(*optlen);
+      int result = error_wrapper(gso(s, level, optname,
+            reinterpret_cast<char*>(optval), &tmp_optlen), ec);
+      *optlen = static_cast<size_t>(tmp_optlen);
+      if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY
+          && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD))
+      {
+        // Dual-stack IPv4/v6 sockets, and the IPV6_V6ONLY socket option, are
+        // only supported on Windows Vista and later. To simplify program logic
+        // we will fake success of getting this option and specify that the
+        // value is non-zero (i.e. true). This corresponds to the behavior of
+        // IPv6 sockets on Windows platforms pre-Vista.
+        *static_cast<DWORD*>(optval) = 1;
+        clear_error(ec);
+      }
+      return result;
+    }
+  }
+  ec = boost::asio::error::fault;
+  return -1;
+#elif defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  clear_error(ec);
+  int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen,
+        s, level, optname, optval, optlen), ec);
+  if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY
+      && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD))
+  {
+    // Dual-stack IPv4/v6 sockets, and the IPV6_V6ONLY socket option, are only
+    // supported on Windows Vista and later. To simplify program logic we will
+    // fake success of getting this option and specify that the value is
+    // non-zero (i.e. true). This corresponds to the behavior of IPv6 sockets
+    // on Windows platforms pre-Vista.
+    *static_cast<DWORD*>(optval) = 1;
+    clear_error(ec);
+  }
+  if (result == 0)
+    clear_error(ec);
+  return result;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  clear_error(ec);
+  int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen,
+        s, level, optname, optval, optlen), ec);
+#if defined(__linux__)
+  if (result == 0 && level == SOL_SOCKET && *optlen == sizeof(int)
+      && (optname == SO_SNDBUF || optname == SO_RCVBUF))
+  {
+    // On Linux, setting SO_SNDBUF or SO_RCVBUF to N actually causes the kernel
+    // to set the buffer size to N*2. Linux puts additional stuff into the
+    // buffers so that only about half is actually available to the application.
+    // The retrieved value is divided by 2 here to make it appear as though the
+    // correct value has been set.
+    *static_cast<int*>(optval) /= 2;
+  }
+#endif // defined(__linux__)
+  if (result == 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+template <typename SockLenType>
+inline int call_getpeername(SockLenType msghdr::*,
+    socket_type s, socket_addr_type* addr, std::size_t* addrlen)
+{
+  SockLenType tmp_addrlen = (SockLenType)*addrlen;
+  int result = ::getpeername(s, addr, &tmp_addrlen);
+  *addrlen = (std::size_t)tmp_addrlen;
+  return result;
+}
+
+inline int getpeername(socket_type s, socket_addr_type* addr,
+    std::size_t* addrlen, boost::system::error_code& ec)
+{
+  clear_error(ec);
+  int result = error_wrapper(call_getpeername(
+        &msghdr::msg_namelen, s, addr, addrlen), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+}
+
+template <typename SockLenType>
+inline int call_getsockname(SockLenType msghdr::*,
+    socket_type s, socket_addr_type* addr, std::size_t* addrlen)
+{
+  SockLenType tmp_addrlen = (SockLenType)*addrlen;
+  int result = ::getsockname(s, addr, &tmp_addrlen);
+  *addrlen = (std::size_t)tmp_addrlen;
+  return result;
+}
+
+inline int getsockname(socket_type s, socket_addr_type* addr,
+    std::size_t* addrlen, boost::system::error_code& ec)
+{
+  clear_error(ec);
+  int result = error_wrapper(call_getsockname(
+        &msghdr::msg_namelen, s, addr, addrlen), ec);
+  if (result == 0)
+    clear_error(ec);
+  return result;
+}
+
+inline int ioctl(socket_type s, long cmd, ioctl_arg_type* arg,
+    boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  int result = error_wrapper(::ioctlsocket(s, cmd, arg), ec);
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  int result = error_wrapper(::ioctl(s, cmd, arg), ec);
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+}
+
+inline int select(int nfds, fd_set* readfds, fd_set* writefds,
+    fd_set* exceptfds, timeval* timeout, boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  if (!readfds && !writefds && !exceptfds && timeout)
+  {
+    DWORD milliseconds = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
+    if (milliseconds == 0)
+      milliseconds = 1; // Force context switch.
+    ::Sleep(milliseconds);
+    ec = boost::system::error_code();
+    return 0;
+  }
+
+  // The select() call allows timeout values measured in microseconds, but the
+  // system clock (as wrapped by boost::posix_time::microsec_clock) typically
+  // has a resolution of 10 milliseconds. This can lead to a spinning select
+  // reactor, meaning increased CPU usage, when waiting for the earliest
+  // scheduled timeout if it's less than 10 milliseconds away. To avoid a tight
+  // spin we'll use a minimum timeout of 1 millisecond.
+  if (timeout && timeout->tv_sec == 0
+      && timeout->tv_usec > 0 && timeout->tv_usec < 1000)
+    timeout->tv_usec = 1000;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+
+#if defined(__hpux) && defined(__HP_aCC) && defined(OS_IS_HPUX11_31)
+  timespec ts;
+  ts.tv_sec = timeout ? timeout->tv_sec : 0;
+  ts.tv_nsec = timeout ? timeout->tv_usec * 1000 : 0;
+  return error_wrapper(::pselect(nfds, readfds,
+        writefds, exceptfds, timeout ? &ts : 0, 0), ec);
+#else
+  int result = error_wrapper(::select(nfds, readfds,
+        writefds, exceptfds, timeout), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif
+}
+
+inline int poll_read(socket_type s, boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  FD_SET fds;
+  FD_ZERO(&fds);
+  FD_SET(s, &fds);
+  clear_error(ec);
+  int result = error_wrapper(::select(s, &fds, 0, 0, 0), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  pollfd fds;
+  fds.fd = s;
+  fds.events = POLLIN;
+  fds.revents = 0;
+  clear_error(ec);
+  int result = error_wrapper(::poll(&fds, 1, -1), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline int poll_write(socket_type s, boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  FD_SET fds;
+  FD_ZERO(&fds);
+  FD_SET(s, &fds);
+  clear_error(ec);
+  int result = error_wrapper(::select(s, 0, &fds, 0, 0), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  pollfd fds;
+  fds.fd = s;
+  fds.events = POLLOUT;
+  fds.revents = 0;
+  clear_error(ec);
+  int result = error_wrapper(::poll(&fds, 1, -1), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline int poll_connect(socket_type s, boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  FD_SET write_fds;
+  FD_ZERO(&write_fds);
+  FD_SET(s, &write_fds);
+  FD_SET except_fds;
+  FD_ZERO(&except_fds);
+  FD_SET(s, &except_fds);
+  clear_error(ec);
+  int result = error_wrapper(::select(s, 0, &write_fds, &except_fds, 0), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  pollfd fds;
+  fds.fd = s;
+  fds.events = POLLOUT;
+  fds.revents = 0;
+  clear_error(ec);
+  int result = error_wrapper(::poll(&fds, 1, -1), ec);
+  if (result >= 0)
+    clear_error(ec);
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline const char* inet_ntop(int af, const void* src, char* dest, size_t length,
+    unsigned long scope_id, boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  using namespace std; // For memcpy.
+
+  if (af != AF_INET && af != AF_INET6)
+  {
+    ec = boost::asio::error::address_family_not_supported;
+    return 0;
+  }
+
+  union
+  {
+    socket_addr_type base;
+    sockaddr_storage_type storage;
+    sockaddr_in4_type v4;
+    sockaddr_in6_type v6;
+  } address;
+  DWORD address_length;
+  if (af == AF_INET)
+  {
+    address_length = sizeof(sockaddr_in4_type);
+    address.v4.sin_family = AF_INET;
+    address.v4.sin_port = 0;
+    memcpy(&address.v4.sin_addr, src, sizeof(in4_addr_type));
+  }
+  else // AF_INET6
+  {
+    address_length = sizeof(sockaddr_in6_type);
+    address.v6.sin6_family = AF_INET6;
+    address.v6.sin6_port = 0;
+    address.v6.sin6_flowinfo = 0;
+    address.v6.sin6_scope_id = scope_id;
+    memcpy(&address.v6.sin6_addr, src, sizeof(in6_addr_type));
+  }
+
+  DWORD string_length = static_cast<DWORD>(length);
+#if defined(BOOST_NO_ANSI_APIS)
+  LPWSTR string_buffer = (LPWSTR)_alloca(length * sizeof(WCHAR));
+  int result = error_wrapper(::WSAAddressToStringW(&address.base,
+        address_length, 0, string_buffer, &string_length), ec);
+  ::WideCharToMultiByte(CP_ACP, 0, string_buffer, -1, dest, length, 0, 0);
+#else
+  int result = error_wrapper(::WSAAddressToStringA(
+        &address.base, address_length, 0, dest, &string_length), ec);
+#endif
+
+  // Windows may set error code on success.
+  if (result != socket_error_retval)
+    clear_error(ec);
+
+  // Windows may not set an error code on failure.
+  else if (result == socket_error_retval && !ec)
+    ec = boost::asio::error::invalid_argument;
+
+  return result == socket_error_retval ? 0 : dest;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  const char* result = error_wrapper(::inet_ntop(af, src, dest, length), ec);
+  if (result == 0 && !ec)
+    ec = boost::asio::error::invalid_argument;
+  if (result != 0 && af == AF_INET6 && scope_id != 0)
+  {
+    using namespace std; // For strcat and sprintf.
+    char if_name[IF_NAMESIZE + 1] = "%";
+    const in6_addr_type* ipv6_address = static_cast<const in6_addr_type*>(src);
+    bool is_link_local = IN6_IS_ADDR_LINKLOCAL(ipv6_address);
+    if (!is_link_local || if_indextoname(scope_id, if_name + 1) == 0)
+      sprintf(if_name + 1, "%lu", scope_id);
+    strcat(dest, if_name);
+  }
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline int inet_pton(int af, const char* src, void* dest,
+    unsigned long* scope_id, boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  using namespace std; // For memcpy and strcmp.
+
+  if (af != AF_INET && af != AF_INET6)
+  {
+    ec = boost::asio::error::address_family_not_supported;
+    return -1;
+  }
+
+  union
+  {
+    socket_addr_type base;
+    sockaddr_storage_type storage;
+    sockaddr_in4_type v4;
+    sockaddr_in6_type v6;
+  } address;
+  int address_length = sizeof(sockaddr_storage_type);
+#if defined(BOOST_NO_ANSI_APIS)
+  int num_wide_chars = strlen(src) + 1;
+  LPWSTR wide_buffer = (LPWSTR)_alloca(num_wide_chars * sizeof(WCHAR));
+  ::MultiByteToWideChar(CP_ACP, 0, src, -1, wide_buffer, num_wide_chars);
+  int result = error_wrapper(::WSAStringToAddressW(
+        wide_buffer, af, 0, &address.base, &address_length), ec);
+#else
+  int result = error_wrapper(::WSAStringToAddressA(
+        const_cast<char*>(src), af, 0, &address.base, &address_length), ec);
+#endif
+
+  if (af == AF_INET)
+  {
+    if (result != socket_error_retval)
+    {
+      memcpy(dest, &address.v4.sin_addr, sizeof(in4_addr_type));
+      clear_error(ec);
+    }
+    else if (strcmp(src, "255.255.255.255") == 0)
+    {
+      static_cast<in4_addr_type*>(dest)->s_addr = INADDR_NONE;
+      clear_error(ec);
+    }
+  }
+  else // AF_INET6
+  {
+    if (result != socket_error_retval)
+    {
+      memcpy(dest, &address.v6.sin6_addr, sizeof(in6_addr_type));
+      if (scope_id)
+        *scope_id = address.v6.sin6_scope_id;
+      clear_error(ec);
+    }
+  }
+
+  // Windows may not set an error code on failure.
+  if (result == socket_error_retval && !ec)
+    ec = boost::asio::error::invalid_argument;
+
+  if (result != socket_error_retval)
+    clear_error(ec);
+
+  return result == socket_error_retval ? -1 : 1;
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  int result = error_wrapper(::inet_pton(af, src, dest), ec);
+  if (result <= 0 && !ec)
+    ec = boost::asio::error::invalid_argument;
+  if (result > 0 && af == AF_INET6 && scope_id)
+  {
+    using namespace std; // For strchr and atoi.
+    *scope_id = 0;
+    if (const char* if_name = strchr(src, '%'))
+    {
+      in6_addr_type* ipv6_address = static_cast<in6_addr_type*>(dest);
+      bool is_link_local = IN6_IS_ADDR_LINKLOCAL(ipv6_address);
+      if (is_link_local)
+        *scope_id = if_nametoindex(if_name + 1);
+      if (*scope_id == 0)
+        *scope_id = atoi(if_name + 1);
+    }
+  }
+  return result;
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline int gethostname(char* name, int namelen, boost::system::error_code& ec)
+{
+  clear_error(ec);
+  int result = error_wrapper(::gethostname(name, namelen), ec);
+#if defined(BOOST_WINDOWS)
+  if (result == 0)
+    clear_error(ec);
+#endif
+  return result;
+}
+
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) \
+  || defined(__MACH__) && defined(__APPLE__)
+
+// The following functions are only needed for emulation of getaddrinfo and
+// getnameinfo.
+
+inline boost::system::error_code translate_netdb_error(int error)
+{
+  switch (error)
+  {
+  case 0:
+    return boost::system::error_code();
+  case HOST_NOT_FOUND:
+    return boost::asio::error::host_not_found;
+  case TRY_AGAIN:
+    return boost::asio::error::host_not_found_try_again;
+  case NO_RECOVERY:
+    return boost::asio::error::no_recovery;
+  case NO_DATA:
+    return boost::asio::error::no_data;
+  default:
+    BOOST_ASSERT(false);
+    return boost::asio::error::invalid_argument;
+  }
+}
+
+inline hostent* gethostbyaddr(const char* addr, int length, int af,
+    hostent* result, char* buffer, int buflength, boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  (void)(buffer);
+  (void)(buflength);
+  hostent* retval = error_wrapper(::gethostbyaddr(addr, length, af), ec);
+  if (!retval)
+    return 0;
+  clear_error(ec);
+  *result = *retval;
+  return retval;
+#elif defined(__sun) || defined(__QNX__)
+  int error = 0;
+  hostent* retval = error_wrapper(::gethostbyaddr_r(addr, length, af, result,
+        buffer, buflength, &error), ec);
+  if (error)
+    ec = translate_netdb_error(error);
+  return retval;
+#elif defined(__MACH__) && defined(__APPLE__)
+  (void)(buffer);
+  (void)(buflength);
+  int error = 0;
+  hostent* retval = error_wrapper(::getipnodebyaddr(
+        addr, length, af, &error), ec);
+  if (error)
+    ec = translate_netdb_error(error);
+  if (!retval)
+    return 0;
+  *result = *retval;
+  return retval;
+#else
+  hostent* retval = 0;
+  int error = 0;
+  error_wrapper(::gethostbyaddr_r(addr, length, af, result, buffer,
+        buflength, &retval, &error), ec);
+  if (error)
+    ec = translate_netdb_error(error);
+  return retval;
+#endif
+}
+
+inline hostent* gethostbyname(const char* name, int af, struct hostent* result,
+    char* buffer, int buflength, int ai_flags, boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+  (void)(buffer);
+  (void)(buflength);
+  (void)(ai_flags);
+  if (af != AF_INET)
+  {
+    ec = boost::asio::error::address_family_not_supported;
+    return 0;
+  }
+  hostent* retval = error_wrapper(::gethostbyname(name), ec);
+  if (!retval)
+    return 0;
+  clear_error(ec);
+  *result = *retval;
+  return result;
+#elif defined(__sun) || defined(__QNX__)
+  (void)(ai_flags);
+  if (af != AF_INET)
+  {
+    ec = boost::asio::error::address_family_not_supported;
+    return 0;
+  }
+  int error = 0;
+  hostent* retval = error_wrapper(::gethostbyname_r(name, result, buffer,
+        buflength, &error), ec);
+  if (error)
+    ec = translate_netdb_error(error);
+  return retval;
+#elif defined(__MACH__) && defined(__APPLE__)
+  (void)(buffer);
+  (void)(buflength);
+  int error = 0;
+  hostent* retval = error_wrapper(::getipnodebyname(
+        name, af, ai_flags, &error), ec);
+  if (error)
+    ec = translate_netdb_error(error);
+  if (!retval)
+    return 0;
+  *result = *retval;
+  return retval;
+#else
+  (void)(ai_flags);
+  if (af != AF_INET)
+  {
+    ec = boost::asio::error::address_family_not_supported;
+    return 0;
+  }
+  hostent* retval = 0;
+  int error = 0;
+  error_wrapper(::gethostbyname_r(name, result,
+        buffer, buflength, &retval, &error), ec);
+  if (error)
+    ec = translate_netdb_error(error);
+  return retval;
+#endif
+}
+
+inline void freehostent(hostent* h)
+{
+#if defined(__MACH__) && defined(__APPLE__)
+  if (h)
+    ::freehostent(h);
+#else
+  (void)(h);
+#endif
+}
+
+// Emulation of getaddrinfo based on implementation in:
+// Stevens, W. R., UNIX Network Programming Vol. 1, 2nd Ed., Prentice-Hall 1998.
+
+struct gai_search
+{
+  const char* host;
+  int family;
+};
+
+inline int gai_nsearch(const char* host,
+    const addrinfo_type* hints, gai_search (&search)[2])
+{
+  int search_count = 0;
+  if (host == 0 || host[0] == '\0')
+  {
+    if (hints->ai_flags & AI_PASSIVE)
+    {
+      // No host and AI_PASSIVE implies wildcard bind.
+      switch (hints->ai_family)
+      {
+      case AF_INET:
+        search[search_count].host = "0.0.0.0";
+        search[search_count].family = AF_INET;
+        ++search_count;
+        break;
+      case AF_INET6:
+        search[search_count].host = "0::0";
+        search[search_count].family = AF_INET6;
+        ++search_count;
+        break;
+      case AF_UNSPEC:
+        search[search_count].host = "0::0";
+        search[search_count].family = AF_INET6;
+        ++search_count;
+        search[search_count].host = "0.0.0.0";
+        search[search_count].family = AF_INET;
+        ++search_count;
+        break;
+      default:
+        break;
+      }
+    }
+    else
+    {
+      // No host and not AI_PASSIVE means connect to local host.
+      switch (hints->ai_family)
+      {
+      case AF_INET:
+        search[search_count].host = "localhost";
+        search[search_count].family = AF_INET;
+        ++search_count;
+        break;
+      case AF_INET6:
+        search[search_count].host = "localhost";
+        search[search_count].family = AF_INET6;
+        ++search_count;
+        break;
+      case AF_UNSPEC:
+        search[search_count].host = "localhost";
+        search[search_count].family = AF_INET6;
+        ++search_count;
+        search[search_count].host = "localhost";
+        search[search_count].family = AF_INET;
+        ++search_count;
+        break;
+      default:
+        break;
+      }
+    }
+  }
+  else
+  {
+    // Host is specified.
+    switch (hints->ai_family)
+    {
+    case AF_INET:
+      search[search_count].host = host;
+      search[search_count].family = AF_INET;
+      ++search_count;
+      break;
+    case AF_INET6:
+      search[search_count].host = host;
+      search[search_count].family = AF_INET6;
+      ++search_count;
+      break;
+    case AF_UNSPEC:
+      search[search_count].host = host;
+      search[search_count].family = AF_INET6;
+      ++search_count;
+      search[search_count].host = host;
+      search[search_count].family = AF_INET;
+      ++search_count;
+      break;
+    default:
+      break;
+    }
+  }
+  return search_count;
+}
+
+template <typename T>
+inline T* gai_alloc(std::size_t size = sizeof(T))
+{
+  using namespace std;
+  T* p = static_cast<T*>(::operator new(size, std::nothrow));
+  if (p)
+    memset(p, 0, size);
+  return p;
+}
+
+inline void gai_free(void* p)
+{
+  ::operator delete(p);
+}
+
+inline void gai_strcpy(char* target, const char* source, std::size_t max_size)
+{
+  using namespace std;
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)
+  strcpy_s(target, max_size, source);
+#else
+  *target = 0;
+  strncat(target, source, max_size);
+#endif
+}
+
+enum { gai_clone_flag = 1 << 30 };
+
+inline int gai_aistruct(addrinfo_type*** next, const addrinfo_type* hints,
+    const void* addr, int family)
+{
+  using namespace std;
+
+  addrinfo_type* ai = gai_alloc<addrinfo_type>();
+  if (ai == 0)
+    return EAI_MEMORY;
+
+  ai->ai_next = 0;
+  **next = ai;
+  *next = &ai->ai_next;
+
+  ai->ai_canonname = 0;
+  ai->ai_socktype = hints->ai_socktype;
+  if (ai->ai_socktype == 0)
+    ai->ai_flags |= gai_clone_flag;
+  ai->ai_protocol = hints->ai_protocol;
+  ai->ai_family = family;
+
+  switch (ai->ai_family)
+  {
+  case AF_INET:
+    {
+      sockaddr_in4_type* sinptr = gai_alloc<sockaddr_in4_type>();
+      if (sinptr == 0)
+        return EAI_MEMORY;
+      sinptr->sin_family = AF_INET;
+      memcpy(&sinptr->sin_addr, addr, sizeof(in4_addr_type));
+      ai->ai_addr = reinterpret_cast<sockaddr*>(sinptr);
+      ai->ai_addrlen = sizeof(sockaddr_in4_type);
+      break;
+    }
+  case AF_INET6:
+    {
+      sockaddr_in6_type* sin6ptr = gai_alloc<sockaddr_in6_type>();
+      if (sin6ptr == 0)
+        return EAI_MEMORY;
+      sin6ptr->sin6_family = AF_INET6;
+      memcpy(&sin6ptr->sin6_addr, addr, sizeof(in6_addr_type));
+      ai->ai_addr = reinterpret_cast<sockaddr*>(sin6ptr);
+      ai->ai_addrlen = sizeof(sockaddr_in6_type);
+      break;
+    }
+  default:
+    break;
+  }
+
+  return 0;
+}
+
+inline addrinfo_type* gai_clone(addrinfo_type* ai)
+{
+  using namespace std;
+
+  addrinfo_type* new_ai = gai_alloc<addrinfo_type>();
+  if (new_ai == 0)
+    return new_ai;
+
+  new_ai->ai_next = ai->ai_next;
+  ai->ai_next = new_ai;
+
+  new_ai->ai_flags = 0;
+  new_ai->ai_family = ai->ai_family;
+  new_ai->ai_socktype = ai->ai_socktype;
+  new_ai->ai_protocol = ai->ai_protocol;
+  new_ai->ai_canonname = 0;
+  new_ai->ai_addrlen = ai->ai_addrlen;
+  new_ai->ai_addr = gai_alloc<sockaddr>(ai->ai_addrlen);
+  memcpy(new_ai->ai_addr, ai->ai_addr, ai->ai_addrlen);
+
+  return new_ai;
+}
+
+inline int gai_port(addrinfo_type* aihead, int port, int socktype)
+{
+  int num_found = 0;
+
+  for (addrinfo_type* ai = aihead; ai; ai = ai->ai_next)
+  {
+    if (ai->ai_flags & gai_clone_flag)
+    {
+      if (ai->ai_socktype != 0)
+      {
+        ai = gai_clone(ai);
+        if (ai == 0)
+          return -1;
+        // ai now points to newly cloned entry.
+      }
+    }
+    else if (ai->ai_socktype != socktype)
+    {
+      // Ignore if mismatch on socket type.
+      continue;
+    }
+
+    ai->ai_socktype = socktype;
+
+    switch (ai->ai_family)
+    {
+    case AF_INET:
+      {
+        sockaddr_in4_type* sinptr =
+          reinterpret_cast<sockaddr_in4_type*>(ai->ai_addr);
+        sinptr->sin_port = port;
+        ++num_found;
+        break;
+      }
+    case AF_INET6:
+      {
+        sockaddr_in6_type* sin6ptr =
+          reinterpret_cast<sockaddr_in6_type*>(ai->ai_addr);
+        sin6ptr->sin6_port = port;
+        ++num_found;
+        break;
+      }
+    default:
+      break;
+    }
+  }
+
+  return num_found;
+}
+
+inline int gai_serv(addrinfo_type* aihead,
+    const addrinfo_type* hints, const char* serv)
+{
+  using namespace std;
+
+  int num_found = 0;
+
+  if (
+#if defined(AI_NUMERICSERV)
+      (hints->ai_flags & AI_NUMERICSERV) ||
+#endif
+      isdigit(serv[0]))
+  {
+    int port = htons(atoi(serv));
+    if (hints->ai_socktype)
+    {
+      // Caller specifies socket type.
+      int rc = gai_port(aihead, port, hints->ai_socktype);
+      if (rc < 0)
+        return EAI_MEMORY;
+      num_found += rc;
+    }
+    else
+    {
+      // Caller does not specify socket type.
+      int rc = gai_port(aihead, port, SOCK_STREAM);
+      if (rc < 0)
+        return EAI_MEMORY;
+      num_found += rc;
+      rc = gai_port(aihead, port, SOCK_DGRAM);
+      if (rc < 0)
+        return EAI_MEMORY;
+      num_found += rc;
+    }
+  }
+  else
+  {
+    // Try service name with TCP first, then UDP.
+    if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_STREAM)
+    {
+      servent* sptr = getservbyname(serv, "tcp");
+      if (sptr != 0)
+      {
+        int rc = gai_port(aihead, sptr->s_port, SOCK_STREAM);
+        if (rc < 0)
+          return EAI_MEMORY;
+        num_found += rc;
+      }
+    }
+    if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_DGRAM)
+    {
+      servent* sptr = getservbyname(serv, "udp");
+      if (sptr != 0)
+      {
+        int rc = gai_port(aihead, sptr->s_port, SOCK_DGRAM);
+        if (rc < 0)
+          return EAI_MEMORY;
+        num_found += rc;
+      }
+    }
+  }
+
+  if (num_found == 0)
+  {
+    if (hints->ai_socktype == 0)
+    {
+      // All calls to getservbyname() failed.
+      return EAI_NONAME;
+    }
+    else
+    {
+      // Service not supported for socket type.
+      return EAI_SERVICE;
+    }
+  }
+
+  return 0;
+}
+
+inline int gai_echeck(const char* host, const char* service,
+    int flags, int family, int socktype, int protocol)
+{
+  (void)(flags);
+  (void)(protocol);
+
+  // Host or service must be specified.
+  if (host == 0 || host[0] == '\0')
+    if (service == 0 || service[0] == '\0')
+      return EAI_NONAME;
+
+  // Check combination of family and socket type.
+  switch (family)
+  {
+  case AF_UNSPEC:
+    break;
+  case AF_INET:
+  case AF_INET6:
+    if (service != 0 && service[0] != '\0')
+      if (socktype != 0 && socktype != SOCK_STREAM && socktype != SOCK_DGRAM)
+        return EAI_SOCKTYPE;
+    break;
+  default:
+    return EAI_FAMILY;
+  }
+
+  return 0;
+}
+
+inline void freeaddrinfo_emulation(addrinfo_type* aihead)
+{
+  addrinfo_type* ai = aihead;
+  while (ai)
+  {
+    gai_free(ai->ai_addr);
+    gai_free(ai->ai_canonname);
+    addrinfo_type* ainext = ai->ai_next;
+    gai_free(ai);
+    ai = ainext;
+  }
+}
+
+inline int getaddrinfo_emulation(const char* host, const char* service,
+    const addrinfo_type* hintsp, addrinfo_type** result)
+{
+  // Set up linked list of addrinfo structures.
+  addrinfo_type* aihead = 0;
+  addrinfo_type** ainext = &aihead;
+  char* canon = 0;
+
+  // Supply default hints if not specified by caller.
+  addrinfo_type hints = addrinfo_type();
+  hints.ai_family = AF_UNSPEC;
+  if (hintsp)
+    hints = *hintsp;
+
+  // If the resolution is not specifically for AF_INET6, remove the AI_V4MAPPED
+  // and AI_ALL flags.
+#if defined(AI_V4MAPPED)
+  if (hints.ai_family != AF_INET6)
+    hints.ai_flags &= ~AI_V4MAPPED;
+#endif
+#if defined(AI_ALL)
+  if (hints.ai_family != AF_INET6)
+    hints.ai_flags &= ~AI_ALL;
+#endif
+
+  // Basic error checking.
+  int rc = gai_echeck(host, service, hints.ai_flags, hints.ai_family,
+      hints.ai_socktype, hints.ai_protocol);
+  if (rc != 0)
+  {
+    freeaddrinfo_emulation(aihead);
+    return rc;
+  }
+
+  gai_search search[2];
+  int search_count = gai_nsearch(host, &hints, search);
+  for (gai_search* sptr = search; sptr < search + search_count; ++sptr)
+  {
+    // Check for IPv4 dotted decimal string.
+    in4_addr_type inaddr;
+    boost::system::error_code ec;
+    if (socket_ops::inet_pton(AF_INET, sptr->host, &inaddr, 0, ec) == 1)
+    {
+      if (hints.ai_family != AF_UNSPEC && hints.ai_family != AF_INET)
+      {
+        freeaddrinfo_emulation(aihead);
+        gai_free(canon);
+        return EAI_FAMILY;
+      }
+      if (sptr->family == AF_INET)
+      {
+        rc = gai_aistruct(&ainext, &hints, &inaddr, AF_INET);
+        if (rc != 0)
+        {
+          freeaddrinfo_emulation(aihead);
+          gai_free(canon);
+          return rc;
+        }
+      }
+      continue;
+    }
+
+    // Check for IPv6 hex string.
+    in6_addr_type in6addr;
+    if (socket_ops::inet_pton(AF_INET6, sptr->host, &in6addr, 0, ec) == 1)
+    {
+      if (hints.ai_family != AF_UNSPEC && hints.ai_family != AF_INET6)
+      {
+        freeaddrinfo_emulation(aihead);
+        gai_free(canon);
+        return EAI_FAMILY;
+      }
+      if (sptr->family == AF_INET6)
+      {
+        rc = gai_aistruct(&ainext, &hints, &in6addr, AF_INET6);
+        if (rc != 0)
+        {
+          freeaddrinfo_emulation(aihead);
+          gai_free(canon);
+          return rc;
+        }
+      }
+      continue;
+    }
+
+    // Look up hostname.
+    hostent hent;
+    char hbuf[8192] = "";
+    hostent* hptr = socket_ops::gethostbyname(sptr->host,
+        sptr->family, &hent, hbuf, sizeof(hbuf), hints.ai_flags, ec);
+    if (hptr == 0)
+    {
+      if (search_count == 2)
+      {
+        // Failure is OK if there are multiple searches.
+        continue;
+      }
+      freeaddrinfo_emulation(aihead);
+      gai_free(canon);
+      if (ec == boost::asio::error::host_not_found)
+        return EAI_NONAME;
+      if (ec == boost::asio::error::host_not_found_try_again)
+        return EAI_AGAIN;
+      if (ec == boost::asio::error::no_recovery)
+        return EAI_FAIL;
+      if (ec == boost::asio::error::no_data)
+        return EAI_NONAME;
+      return EAI_NONAME;
+    }
+
+    // Check for address family mismatch if one was specified.
+    if (hints.ai_family != AF_UNSPEC && hints.ai_family != hptr->h_addrtype)
+    {
+      freeaddrinfo_emulation(aihead);
+      gai_free(canon);
+      socket_ops::freehostent(hptr);
+      return EAI_FAMILY;
+    }
+
+    // Save canonical name first time.
+    if (host != 0 && host[0] != '\0' && hptr->h_name && hptr->h_name[0]
+        && (hints.ai_flags & AI_CANONNAME) && canon == 0)
+    {
+      std::size_t canon_len = strlen(hptr->h_name) + 1;
+      canon = gai_alloc<char>(canon_len);
+      if (canon == 0)
+      {
+        freeaddrinfo_emulation(aihead);
+        socket_ops::freehostent(hptr);
+        return EAI_MEMORY;
+      }
+      gai_strcpy(canon, hptr->h_name, canon_len);
+    }
+
+    // Create an addrinfo structure for each returned address.
+    for (char** ap = hptr->h_addr_list; *ap; ++ap)
+    {
+      rc = gai_aistruct(&ainext, &hints, *ap, hptr->h_addrtype);
+      if (rc != 0)
+      {
+        freeaddrinfo_emulation(aihead);
+        gai_free(canon);
+        socket_ops::freehostent(hptr);
+        return EAI_FAMILY;
+      }
+    }
+
+    socket_ops::freehostent(hptr);
+  }
+
+  // Check if we found anything.
+  if (aihead == 0)
+  {
+    gai_free(canon);
+    return EAI_NONAME;
+  }
+
+  // Return canonical name in first entry.
+  if (host != 0 && host[0] != '\0' && (hints.ai_flags & AI_CANONNAME))
+  {
+    if (canon)
+    {
+      aihead->ai_canonname = canon;
+      canon = 0;
+    }
+    else
+    {
+      std::size_t canonname_len = strlen(search[0].host) + 1;
+      aihead->ai_canonname = gai_alloc<char>(canonname_len);
+      if (aihead->ai_canonname == 0)
+      {
+        freeaddrinfo_emulation(aihead);
+        return EAI_MEMORY;
+      }
+      gai_strcpy(aihead->ai_canonname, search[0].host, canonname_len);
+    }
+  }
+  gai_free(canon);
+
+  // Process the service name.
+  if (service != 0 && service[0] != '\0')
+  {
+    rc = gai_serv(aihead, &hints, service);
+    if (rc != 0)
+    {
+      freeaddrinfo_emulation(aihead);
+      return rc;
+    }
+  }
+
+  // Return result to caller.
+  *result = aihead;
+  return 0;
+}
+
+inline boost::system::error_code getnameinfo_emulation(
+    const socket_addr_type* sa, std::size_t salen, char* host,
+    std::size_t hostlen, char* serv, std::size_t servlen, int flags,
+    boost::system::error_code& ec)
+{
+  using namespace std;
+
+  const char* addr;
+  size_t addr_len;
+  unsigned short port;
+  switch (sa->sa_family)
+  {
+  case AF_INET:
+    if (salen != sizeof(sockaddr_in4_type))
+    {
+      return ec = boost::asio::error::invalid_argument;
+    }
+    addr = reinterpret_cast<const char*>(
+        &reinterpret_cast<const sockaddr_in4_type*>(sa)->sin_addr);
+    addr_len = sizeof(in4_addr_type);
+    port = reinterpret_cast<const sockaddr_in4_type*>(sa)->sin_port;
+    break;
+  case AF_INET6:
+    if (salen != sizeof(sockaddr_in6_type))
+    {
+      return ec = boost::asio::error::invalid_argument;
+    }
+    addr = reinterpret_cast<const char*>(
+        &reinterpret_cast<const sockaddr_in6_type*>(sa)->sin6_addr);
+    addr_len = sizeof(in6_addr_type);
+    port = reinterpret_cast<const sockaddr_in6_type*>(sa)->sin6_port;
+    break;
+  default:
+    return ec = boost::asio::error::address_family_not_supported;
+  }
+
+  if (host && hostlen > 0)
+  {
+    if (flags & NI_NUMERICHOST)
+    {
+      if (socket_ops::inet_ntop(sa->sa_family, addr, host, hostlen, 0, ec) == 0)
+      {
+        return ec;
+      }
+    }
+    else
+    {
+      hostent hent;
+      char hbuf[8192] = "";
+      hostent* hptr = socket_ops::gethostbyaddr(addr,
+          static_cast<int>(addr_len), sa->sa_family,
+          &hent, hbuf, sizeof(hbuf), ec);
+      if (hptr && hptr->h_name && hptr->h_name[0] != '\0')
+      {
+        if (flags & NI_NOFQDN)
+        {
+          char* dot = strchr(hptr->h_name, '.');
+          if (dot)
+          {
+            *dot = 0;
+          }
+        }
+        gai_strcpy(host, hptr->h_name, hostlen);
+        socket_ops::freehostent(hptr);
+      }
+      else
+      {
+        socket_ops::freehostent(hptr);
+        if (flags & NI_NAMEREQD)
+        {
+          return ec = boost::asio::error::host_not_found;
+        }
+        if (socket_ops::inet_ntop(sa->sa_family,
+              addr, host, hostlen, 0, ec) == 0)
+        {
+          return ec;
+        }
+      }
+    }
+  }
+
+  if (serv && servlen > 0)
+  {
+    if (flags & NI_NUMERICSERV)
+    {
+      if (servlen < 6)
+      {
+        return ec = boost::asio::error::no_buffer_space;
+      }
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)
+      sprintf_s(serv, servlen, "%u", ntohs(port));
+#else
+      sprintf(serv, "%u", ntohs(port));
+#endif
+    }
+    else
+    {
+#if defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS)
+      static ::pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+      ::pthread_mutex_lock(&mutex);
+#endif // defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS)
+      servent* sptr = ::getservbyport(port, (flags & NI_DGRAM) ? "udp" : 0);
+      if (sptr && sptr->s_name && sptr->s_name[0] != '\0')
+      {
+        gai_strcpy(serv, sptr->s_name, servlen);
+      }
+      else
+      {
+        if (servlen < 6)
+        {
+          return ec = boost::asio::error::no_buffer_space;
+        }
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)
+        sprintf_s(serv, servlen, "%u", ntohs(port));
+#else
+        sprintf(serv, "%u", ntohs(port));
+#endif
+      }
+#if defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS)
+      ::pthread_mutex_unlock(&mutex);
+#endif // defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS)
+    }
+  }
+
+  clear_error(ec);
+  return ec;
+}
+
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+       //   || defined(__MACH__) && defined(__APPLE__)
+
+inline boost::system::error_code translate_addrinfo_error(int error)
+{
+  switch (error)
+  {
+  case 0:
+    return boost::system::error_code();
+  case EAI_AGAIN:
+    return boost::asio::error::host_not_found_try_again;
+  case EAI_BADFLAGS:
+    return boost::asio::error::invalid_argument;
+  case EAI_FAIL:
+    return boost::asio::error::no_recovery;
+  case EAI_FAMILY:
+    return boost::asio::error::address_family_not_supported;
+  case EAI_MEMORY:
+    return boost::asio::error::no_memory;
+  case EAI_NONAME:
+#if defined(EAI_ADDRFAMILY)
+  case EAI_ADDRFAMILY:
+#endif
+#if defined(EAI_NODATA) && (EAI_NODATA != EAI_NONAME)
+  case EAI_NODATA:
+#endif
+    return boost::asio::error::host_not_found;
+  case EAI_SERVICE:
+    return boost::asio::error::service_not_found;
+  case EAI_SOCKTYPE:
+    return boost::asio::error::socket_type_not_supported;
+  default: // Possibly the non-portable EAI_SYSTEM.
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+    return boost::system::error_code(
+        WSAGetLastError(), boost::asio::error::get_system_category());
+#else
+    return boost::system::error_code(
+        errno, boost::asio::error::get_system_category());
+#endif
+  }
+}
+
+inline boost::system::error_code getaddrinfo(const char* host,
+    const char* service, const addrinfo_type* hints, addrinfo_type** result,
+    boost::system::error_code& ec)
+{
+  clear_error(ec);
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) || defined(UNDER_CE)
+  // Building for Windows XP, Windows Server 2003, or later.
+  int error = ::getaddrinfo(host, service, hints, result);
+  return ec = translate_addrinfo_error(error);
+# else
+  // Building for Windows 2000 or earlier.
+  typedef int (WSAAPI *gai_t)(const char*,
+      const char*, const addrinfo_type*, addrinfo_type**);
+  if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32"))
+  {
+    if (gai_t gai = (gai_t)::GetProcAddress(winsock_module, "getaddrinfo"))
+    {
+      int error = gai(host, service, hints, result);
+      return ec = translate_addrinfo_error(error);
+    }
+  }
+  int error = getaddrinfo_emulation(host, service, hints, result);
+  return ec = translate_addrinfo_error(error);
+# endif
+#elif defined(__MACH__) && defined(__APPLE__)
+  int error = getaddrinfo_emulation(host, service, hints, result);
+  return ec = translate_addrinfo_error(error);
+#else
+  int error = ::getaddrinfo(host, service, hints, result);
+  return ec = translate_addrinfo_error(error);
+#endif
+}
+
+inline void freeaddrinfo(addrinfo_type* ai)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) || defined(UNDER_CE)
+  // Building for Windows XP, Windows Server 2003, or later.
+  ::freeaddrinfo(ai);
+# else
+  // Building for Windows 2000 or earlier.
+  typedef int (WSAAPI *fai_t)(addrinfo_type*);
+  if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32"))
+  {
+    if (fai_t fai = (fai_t)::GetProcAddress(winsock_module, "freeaddrinfo"))
+    {
+      fai(ai);
+      return;
+    }
+  }
+  freeaddrinfo_emulation(ai);
+# endif
+#elif defined(__MACH__) && defined(__APPLE__)
+  freeaddrinfo_emulation(ai);
+#else
+  ::freeaddrinfo(ai);
+#endif
+}
+
+inline boost::system::error_code getnameinfo(const socket_addr_type* addr,
+    std::size_t addrlen, char* host, std::size_t hostlen,
+    char* serv, std::size_t servlen, int flags, boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) || defined(UNDER_CE)
+  // Building for Windows XP, Windows Server 2003, or later.
+  clear_error(ec);
+  int error = ::getnameinfo(addr, static_cast<socklen_t>(addrlen),
+      host, static_cast<DWORD>(hostlen),
+      serv, static_cast<DWORD>(servlen), flags);
+  return ec = translate_addrinfo_error(error);
+# else
+  // Building for Windows 2000 or earlier.
+  typedef int (WSAAPI *gni_t)(const socket_addr_type*,
+      int, char*, DWORD, char*, DWORD, int);
+  if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32"))
+  {
+    if (gni_t gni = (gni_t)::GetProcAddress(winsock_module, "getnameinfo"))
+    {
+      clear_error(ec);
+      int error = gni(addr, static_cast<int>(addrlen),
+          host, static_cast<DWORD>(hostlen),
+          serv, static_cast<DWORD>(servlen), flags);
+      return ec = translate_addrinfo_error(error);
+    }
+  }
+  clear_error(ec);
+  return getnameinfo_emulation(addr, addrlen,
+      host, hostlen, serv, servlen, flags, ec);
+# endif
+#elif defined(__MACH__) && defined(__APPLE__)
+  using namespace std; // For memcpy.
+  sockaddr_storage_type tmp_addr;
+  memcpy(&tmp_addr, addr, addrlen);
+  tmp_addr.ss_len = addrlen;
+  addr = reinterpret_cast<socket_addr_type*>(&tmp_addr);
+  clear_error(ec);
+  return getnameinfo_emulation(addr, addrlen,
+      host, hostlen, serv, servlen, flags, ec);
+#else
+  clear_error(ec);
+  int error = ::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
+  return ec = translate_addrinfo_error(error);
+#endif
+}
+
+inline u_long_type network_to_host_long(u_long_type value)
+{
+  return ntohl(value);
+}
+
+inline u_long_type host_to_network_long(u_long_type value)
+{
+  return htonl(value);
+}
+
+inline u_short_type network_to_host_short(u_short_type value)
+{
+  return ntohs(value);
+}
+
+inline u_short_type host_to_network_short(u_short_type value)
+{
+  return htons(value);
+}
+
+} // namespace socket_ops
+} // namespace detail
+} // namespace asio
+} // namespace boost
+
+#include <boost/asio/detail/pop_options.hpp>
+
+#endif // BOOST_ASIO_DETAIL_SOCKET_OPS_HPP
diff --git a/ecflow_4_0_7/build/hpux_fix/utf8_codecvt_facet.cpp b/ecflow_4_0_7/build/hpux_fix/utf8_codecvt_facet.cpp
new file mode 100644
index 0000000..3e4eae8
--- /dev/null
+++ b/ecflow_4_0_7/build/hpux_fix/utf8_codecvt_facet.cpp
@@ -0,0 +1,307 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// utf8_codecvt_facet.cpp
+
+// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia at osl.iu.edu)
+// Andrew Lumsdaine, Indiana University (lums at osl.iu.edu). 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Please see the comments in <boost/detail/utf8_codecvt_facet.hpp> to
+// learn how this file should be used.
+
+#include <boost/detail/utf8_codecvt_facet.hpp>
+
+#include <cstdlib> // for multi-byte converson routines
+#include <cassert>
+
+#include <boost/limits.hpp>
+#include <boost/config.hpp>
+
+// If we don't have wstring, then Unicode support 
+// is not available anyway, so we don't need to even
+// compiler this file. This also fixes the problem
+// with mingw, which can compile this file, but will
+// generate link error when building DLL.
+#ifndef BOOST_NO_STD_WSTRING
+
+BOOST_UTF8_BEGIN_NAMESPACE
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation for wchar_t
+
+// Translate incoming UTF-8 into UCS-4
+std::codecvt_base::result utf8_codecvt_facet::do_in(
+    std::mbstate_t& /*state*/, 
+    const char * from,
+    const char * from_end, 
+    const char * & from_next,
+    wchar_t * to, 
+    wchar_t * to_end, 
+    wchar_t * & to_next
+) const {
+    // Basic algorithm:  The first octet determines how many
+    // octets total make up the UCS-4 character.  The remaining
+    // "continuing octets" all begin with "10". To convert, subtract
+    // the amount that specifies the number of octets from the first
+    // octet.  Subtract 0x80 (1000 0000) from each continuing octet,
+    // then mash the whole lot together.  Note that each continuing
+    // octet only uses 6 bits as unique values, so only shift by
+    // multiples of 6 to combine.
+    while (from != from_end && to != to_end) {
+
+        // Error checking   on the first octet
+        if (invalid_leading_octet(*from)){
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        // The first octet is   adjusted by a value dependent upon 
+        // the number   of "continuing octets" encoding the character
+        const   int cont_octet_count = get_cont_octet_count(*from);
+        const   wchar_t octet1_modifier_table[] =   {
+            0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+        };
+
+        // The unsigned char conversion is necessary in case char is
+        // signed   (I learned this the hard way)
+        wchar_t ucs_result = 
+            (unsigned char)(*from++) - octet1_modifier_table[cont_octet_count];
+
+        // Invariants   : 
+        //   1) At the start of the loop,   'i' continuing characters have been
+        //    processed 
+        //   2) *from   points to the next continuing character to be processed.
+        int i   = 0;
+        while(i != cont_octet_count && from != from_end) {
+
+            // Error checking on continuing characters
+            if (invalid_continuing_octet(*from)) {
+                from_next   = from;
+                to_next =   to;
+                return std::codecvt_base::error;
+            }
+
+            ucs_result *= (1 << 6); 
+
+            // each continuing character has an extra (10xxxxxx)b attached to 
+            // it that must be removed.
+            ucs_result += (unsigned char)(*from++) - 0x80;
+            ++i;
+        }
+
+        // If   the buffer ends with an incomplete unicode character...
+        if (from == from_end && i   != cont_octet_count) {
+            // rewind "from" to before the current character translation
+            from_next = from - (i+1); 
+            to_next = to;
+            return std::codecvt_base::partial;
+        }
+        *to++   = ucs_result;
+    }
+    from_next = from;
+    to_next = to;
+
+    // Were we done converting or did we run out of destination space?
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+std::codecvt_base::result utf8_codecvt_facet::do_out(
+    std::mbstate_t& /*state*/, 
+    const wchar_t *   from,
+    const wchar_t * from_end, 
+    const wchar_t * & from_next,
+    char * to, 
+    char * to_end, 
+    char * & to_next
+) const
+{
+    // RG - consider merging this table with the other one
+    const wchar_t octet1_modifier_table[] = {
+        0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+    };
+
+    wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)();
+    while (from != from_end && to != to_end) {
+
+        // Check for invalid UCS-4 character
+        if (*from  > max_wchar) {
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        int cont_octet_count = get_cont_octet_out_count(*from);
+
+        // RG  - comment this formula better
+        int shift_exponent = (cont_octet_count) *   6;
+
+        // Process the first character
+        *to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] +
+            (unsigned char)(*from / (1 << shift_exponent)));
+
+        // Process the continuation characters 
+        // Invariants: At   the start of the loop:
+        //   1) 'i' continuing octets   have been generated
+        //   2) '*to'   points to the next location to place an octet
+        //   3) shift_exponent is   6 more than needed for the next octet
+        int i   = 0;
+        while   (i != cont_octet_count && to != to_end) {
+            shift_exponent -= 6;
+            *to++ = static_cast<char>(0x80 + ((*from / (1 << shift_exponent)) % (1 << 6)));
+            ++i;
+        }
+        // If   we filled up the out buffer before encoding the character
+        if(to   == to_end && i != cont_octet_count) {
+            from_next = from;
+            to_next = to - (i+1);
+            return std::codecvt_base::partial;
+        }
+        ++from;
+    }
+    from_next = from;
+    to_next = to;
+    // Were we done or did we run out of destination space
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+// How many char objects can I process to get <= max_limit
+// wchar_t objects?
+int utf8_codecvt_facet::do_length(
+    BOOST_CODECVT_DO_LENGTH_CONST std::mbstate_t &,
+    const char * from,
+    const char * from_end, 
+    std::size_t max_limit
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+) const throw()
+#else
+) const
+#endif
+{ 
+    // RG - this code is confusing!  I need a better way to express it.
+    // and test cases.
+
+    // Invariants:
+    // 1) last_octet_count has the size of the last measured character
+    // 2) char_count holds the number of characters shown to fit
+    // within the bounds so far (no greater than max_limit)
+    // 3) from_next points to the octet 'last_octet_count' before the
+    // last measured character.  
+    int last_octet_count=0;
+    std::size_t char_count = 0;
+    const char* from_next = from;
+    // Use "<" because the buffer may represent incomplete characters
+    while (from_next+last_octet_count <= from_end && char_count <= max_limit) {
+        from_next += last_octet_count;
+        last_octet_count = (get_octet_count(*from_next));
+        ++char_count;
+    }
+    return static_cast<int>(from_next-from_end);
+}
+
+unsigned int utf8_codecvt_facet::get_octet_count(
+    unsigned char   lead_octet
+){
+    // if the 0-bit (MSB) is 0, then 1 character
+    if (lead_octet <= 0x7f) return 1;
+
+    // Otherwise the count number of consecutive 1 bits starting at MSB
+//    assert(0xc0 <= lead_octet && lead_octet <= 0xfd);
+
+    if (0xc0 <= lead_octet && lead_octet <= 0xdf) return 2;
+    else if (0xe0 <= lead_octet && lead_octet <= 0xef) return 3;
+    else if (0xf0 <= lead_octet && lead_octet <= 0xf7) return 4;
+    else if (0xf8 <= lead_octet && lead_octet <= 0xfb) return 5;
+    else return 6;
+}
+BOOST_UTF8_END_NAMESPACE
+
+namespace {
+template<std::size_t s>
+int get_cont_octet_out_count_impl(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    return 2;
+}
+
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+}
+
+/* **
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+
+    // Note that the following code will generate warnings on some platforms
+    // where wchar_t is defined as UCS2.  The warnings are superfluous as the
+    // specialization is never instantitiated with such compilers, but this
+    // can cause problems if warnings are being treated as errors, so we guard
+    // against that.  Including <boost/detail/utf8_codecvt_facet.hpp> as we do
+    // should be enough to get WCHAR_MAX defined.
+#if !defined(WCHAR_MAX)
+#   error WCHAR_MAX not defined!
+#endif
+    // cope with VC++ 7.1 or earlier having invalid WCHAR_MAX
+#if defined(_MSC_VER) && _MSC_VER <= 1310 // 7.1 or earlier
+    return 2;
+#elif WCHAR_MAX > 0x10000
+    
+   if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+    
+#else
+    return 2;
+#endif
+} 
+*/
+
+} // namespace anonymous
+
+BOOST_UTF8_BEGIN_NAMESPACE
+// How many "continuing octets" will be needed for this word
+// ==   total octets - 1.
+int utf8_codecvt_facet::get_cont_octet_out_count(
+    wchar_t word
+) const {
+    return get_cont_octet_out_count_impl<sizeof(wchar_t)>(word);
+}
+BOOST_UTF8_END_NAMESPACE
+
+#endif
diff --git a/ecflow_4_0_7/build/install_ecflow.sh b/ecflow_4_0_7/build/install_ecflow.sh
new file mode 100755
index 0000000..ae7e864
--- /dev/null
+++ b/ecflow_4_0_7/build/install_ecflow.sh
@@ -0,0 +1,258 @@
+#!/bin/ksh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+## This script will install ecflow dependent on the host
+##
+## Expect an optional argument [ debug | release | test ]
+##  - debug   : install a debug version of ecflow
+##  - release : install a release version of ecflow
+##  - test    : test install
+##
+## ie install_ecflow.sh debug test
+##    Will do a test install for debug build of ecflow
+##
+## Date Changed: 23/05/2011
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# ====================================================================
+# Check user is logged in as emos
+user="$(whoami)"
+if [[ $user != "emos" ]] && [[ $user != "map" ]] ; then
+   echo "Must be logged in as emos to install ecflow"
+   exit 1
+fi
+
+# ====================================================================
+# Maximum of 2 arguments expected:
+#    o/ platform
+#    o/ input parameter
+if [ "$#" -gt 2 ] ; then
+   echo "Install expects maximum of two arguments, i.e"
+   echo "  test debug"
+   echo "  test release"
+   echo "  test"
+   echo "  debug"
+   echo "  release"
+   exit 1
+fi
+
+mode_arg= 
+test_arg=
+while [[ "$#" != 0 ]] ; do   
+   if [[ "$1" != debug && "$1" != release && "$1" != test ]] ; then
+      echo "Install expected [ debug | release | test ] but found $1"
+      exit 1
+   fi
+   if [[ "$1" = debug || "$1" = release ]] ; then
+      mode_arg=$1
+   else
+      test_arg=-n
+   fi
+   # shift remove last argument
+   shift
+done
+
+if [ ${#mode_arg} -eq 0 ] ; then
+   echo "Install expects mode i.e. debug or release"
+   exit 1
+fi
+
+install_arg=install-all
+
+# ==============================================================================
+# Expect $WK and $BOOST_ROOT to be specified
+# ==============================================================================
+if [ "${WK:-unset}" = "unset" ] ; then
+   echo "Install expects environment variable WK  work space to be defined"
+   exit 1
+fi  
+if [ "${BOOST_ROOT:-unset}" = "unset" ] ; then
+   echo "Install expects environment variable BOOST_ROOT to be defined"
+   exit 1
+fi  
+echo "WK         = $WK"
+echo "BOOST_ROOT = $BOOST_ROOT"
+
+# ==============================================================================
+# In order to embedd boost_python path in the ecflow extension, we need
+# ECFLOW_INSTALL_DIR to be set correctly, when building the extension
+# Hacky work around since, <dll-path> does not work for a relink at install time.
+# Set install directory for ecflow & embedding of boost python extension
+# ===============================================================================
+cd $WK
+
+# Determine the release,major,minor numbers for this version 
+release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+ECFLOW_VERSION=$release.$major.$minor
+   
+export ECFLOW_INSTALL_DIR=${ECFLOW_INSTALL_DIR:-/usr/local/apps/ecflow/${release}.${major}.${minor}}
+
+# =============================================================================
+# Required for cray, since we allow multiple compilers
+# =============================================================================
+TOOLSET=
+CXXFLAGS=
+
+# ======================================================================
+# We do NOT install on the LOCAL build machine, since that will not have
+# the correct embedded paths with ecflow.so (i.e for boost python )
+# ======================================================================
+
+BOOST_VERSION=boost_1_53_0
+
+if [[ "$user" = "map" ]] # when user emos is commented out
+then
+   ARCH=linux
+   export BOOST_ROOT=${BOOST_ROOT:-/vol/ecf/opensuse113/boost/$BOOST_VERSION};  
+   export WK=${WK:-/vol/ecf/opensuse113/ecflow}
+
+elif [[ "$ARCH" = "Linux" ]] || [[ "$ARCH" = "linux" ]] 
+then  
+   # =====================================================================
+   # LINUX
+   # =====================================================================
+   
+   # lxop does not define OS_VERSION ?????, hence default to empty string
+   : ${OS_VERSION:=""}
+   
+   if [[ "$OS_VERSION" = opensuse113 ]] ; then
+   
+      export BOOST_ROOT=/vol/ecf/opensuse113/boost/$BOOST_VERSION; 
+      export WK=/vol/ecf/opensuse113/ecflow
+
+   elif [[ "$OS_VERSION" = opensuse131 ]] ; then
+   
+      export BOOST_ROOT=/vol/ecf/opensuse131/boost/$BOOST_VERSION; 
+      export WK=/vol/ecf/opensuse131/ecflow
+      
+   elif [[ "$OS_VERSION" = opensuse103 ]] ; then 
+   
+      export BOOST_ROOT=/vol/ecf/opensuse103/boost/$BOOST_VERSION;  
+      export WK=/vol/ecf/opensuse103/ecflow
+      
+   elif [[ "$OS_VERSION" = rhel6 ]] ; then 
+
+      export BOOST_ROOT=/vol/ecf/redhat/boost/$BOOST_VERSION;  
+      export WK=/vol/ecf/redhat/ecflow
+   
+   elif [[ "$OS_VERSION" = sles11 ]] ; then 
+   
+      # lxab this is still opensuse113
+      export BOOST_ROOT=/vol/ecf/cluster/boost/$BOOST_VERSION;  
+      export WK=/vol/ecf/cluster/ecflow
+      case "$HOST" in
+         lxc*)
+	           export BOOST_ROOT=/vol/ecf/lxc/boost/$BOOST_VERSION;  
+	           export WK=/vol/ecf/lxc/ecflow
+         ;;
+	  esac
+	  
+   elif [[ "$OS_VERSION" = "" ]] ; then 
+   
+      # lxop does not define OS_VERSION ?????
+      export BOOST_ROOT=/gpfs/lxop/build/builds/boost/$BOOST_VERSION;  
+      export WK=/gpfs/lxop/build/builds/ecflow
+   fi
+  
+elif [[ "$ARCH" = cray ]] ; then 
+
+   TOOLSET=toolset=gcc
+   CXXFLAGS=cxxflags=-fPIC
+   if [[ "$PE_ENV" = CRAY ]] ; then
+      echo "The PE_ENV=CRAY, For ecflow we only support install with PE_ENV=GNU"
+      exit 1
+   fi
+   if [[ "$PE_ENV" = INTEL ]] ; then
+      echo "The PE_ENV=INTEL, For ecflow we only support install with PE_ENV=GNU"
+      exit 1
+   fi
+   
+   export WK=/perm/ma/ma0/workspace/$PE_ENV/ecflow
+   export BOOST_ROOT=/perm/ma/ma0/boost/$BOOST_VERSION
+fi
+
+# =======================================================================================
+# Python
+# ========================================================================================
+export ECFLOW_PYTHON_INSTALL_DIR=$ECFLOW_INSTALL_DIR/lib/python2.7/site-packages/ecflow 
+
+
+# ============================================================================
+# INSTALL
+# ============================================================================
+$BOOST_ROOT/bjam $TOOLSET $CXXFLAGS -d2 variant=$mode_arg $test_arg $install_arg
+   
+
+#==========================================================================
+echo "...make sure executables have execute permissions for group and others"
+# ============================================================================
+if [[ "$test_arg" = "" ]] ; then
+   cd $ECFLOW_INSTALL_DIR/bin
+   chmod 755 *
+   
+   cd $ECFLOW_PYTHON_INSTALL_DIR
+   chmod 755 *
+   
+   #==========================================================================
+   echo "...sanity test, make sure exe's exist in the bin directory"
+   # ============================================================================
+   if [[ ! -r ecflow_client ]] ; then
+      echo "ecflow_client not installed !!!!!"
+   fi
+   if [[ ! -r ecflow_server ]] ; then
+      echo "ecflow_server not installed !!!!!"
+   fi
+   if [[ ! -r ecflowview ]] ; then
+      echo "ecflowview not installed !!!!!"
+   fi
+fi
+
+# ============================================================================ 
+# Copy over release from ccb -> cca, or cca ->ccb, depending on the machine 
+# *Make* sure destination has a trailing '/.' otherwise you can end up renaming.
+# ============================================================================
+if [[ "$ARCH" = cray ]] ; then 
+
+   if [[ "$test_arg" = "" ]] ; then
+      cd /usr/local/apps/ecflow
+      
+      if [[ "$EC_CLUSTER" = ccb ]] ; then
+      
+      	 scp -r $ECFLOW_VERSION emos at cca:/usr/local/apps/ecflow/.
+      	 
+      elif [[ "$EC_CLUSTER" = cca ]] ; then
+      
+        scp -r $ECFLOW_VERSION emos at ccb:/usr/local/apps/ecflow/.
+        
+      fi
+   fi
+fi  
+
+
+# ============================================================================ 
+# Copy over release from ecgb(redhat) -> sappa and sappb
+# *Make* sure destination has a trailing '/.' otherwise you can end up renaming.
+# ============================================================================
+if [[ "$ARCH" = "Linux" ]] || [[ "$ARCH" = "linux" ]] 
+then  
+   if [ "$OS_VERSION" = rhel6 ] ; then
+   
+      if [[ "$test_arg" = "" ]] ; then
+         # sappa/sappb(rhel63) are same as ecgb/redhat(rhel6)
+         cd /usr/local/apps/ecflow
+         scp -r $ECFLOW_VERSION emos at sappa:/usr/local/apps/ecflow/.
+         scp -r $ECFLOW_VERSION emos at sappb:/usr/local/apps/ecflow/.
+      fi
+   fi
+fi
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/kill_ecf.sh b/ecflow_4_0_7/build/kill_ecf.sh
new file mode 100755
index 0000000..52bdd17
--- /dev/null
+++ b/ecflow_4_0_7/build/kill_ecf.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# kill any running test
+ps -ef | grep ma0 | grep gcc | grep log_level=message | cut -c9-14 | xargs kill -9
+ps -ef | grep ma0 | grep test.sh | cut -c9-14 | xargs kill -9
+
+# kill any existing test based server 
+ps -ef | grep ma0 | grep ecfinterval | grep ecflow_server | cut -c9-14 | xargs kill -9
+ps -ef | grep ma0 | grep dis_job_gen | grep ecflow_server | cut -c9-14 | xargs kill -9
+ps -ef | grep ma0 | grep ecbuild | grep debug | grep ecflow_server | cut -c9-14 | xargs kill -9
+ps -ef | grep ma0 | grep gcc | grep ecflow_server | cut -c9-14 | xargs kill -9
+ps -ef | grep ma0 | grep gcc | grep ecflow_client | cut -c9-14 | xargs kill -9
+
+ps -ef | grep ma0 | grep clientRoot | grep ecbuild | grep debug | cut -c9-14 | xargs kill -9
+ps -ef | grep ma0 | grep clientRoot | grep ecbuild | grep release | cut -c9-14 | xargs kill -9
+
+# kill any jobs
+ps -ef | grep ma0  | grep job | grep test | cut -c9-14 | xargs kill -9
+
diff --git a/ecflow_4_0_7/build/massif.sh b/ecflow_4_0_7/build/massif.sh
new file mode 100755
index 0000000..d5bc484
--- /dev/null
+++ b/ecflow_4_0_7/build/massif.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+cd $WK
+
+# if argument is release test the release version else stick with debug
+mode=debug
+if test "$1" = release
+then
+   mode=release
+fi
+
+
+compiler=gcc-$(gcc -dumpversion)
+echo "valgrind: variant=$mode compiler=$compiler"
+
+valgrind --tool=massif ACore/bin/$compiler/$mode/u_acore
+valgrind --tool=massif ANattr/bin/$compiler/$mode/u_anattr
+valgrind --tool=massif ANode/bin/$compiler/$mode/u_anode
+valgrind --tool=massif AParser/bin/$compiler/$mode/u_aparser
+valgrind --tool=massif Base/bin/$compiler/$mode/u_base
+valgrind --tool=massif Client/bin/$compiler/$mode/s_client
+valgrind --tool=massif Server/bin/$compiler/$mode/u_server
+valgrind --tool=massif Test/bin/$compiler/$mode/s_test
+valgrind --tool=massif Simulator/bin/$compiler/$mode/c_csim
+#valgrind --tool=massif AParser/bin/$compiler/$mode/perf_aparser
+
diff --git a/ecflow_4_0_7/build/migrate.sh b/ecflow_4_0_7/build/migrate.sh
new file mode 100644
index 0000000..4daf15b
--- /dev/null
+++ b/ecflow_4_0_7/build/migrate.sh
@@ -0,0 +1,15 @@
+
+
+prepare_migration() {
+   use ecflow
+   while read nick host port
+   do
+     LOG="--host $host --port $port"
+     ecflow_client $LOG --ping || continue
+     version=$(ecflow_client $LOG --server_version)
+     echo $nick $host $port $version
+     /usr/local/apps/ecflow/$version/bin/ecflow_client $LOG --migrate > $host.$port.mig
+   done < /usr/local/apps/ecflow/current/lib/servers
+}
+
+prepare_migration
diff --git a/ecflow_4_0_7/build/p4_sync.sh b/ecflow_4_0_7/build/p4_sync.sh
new file mode 100755
index 0000000..640ae4d
--- /dev/null
+++ b/ecflow_4_0_7/build/p4_sync.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# Sync up before export/build
+ 
+set -e # stop the shell on first error 
+set -u # fail when using an undefined variable 
+
+
+# P4 login
+cd $HOME
+rm -rf .p4tickets
+p4login
+
+ 
+# setup for perforce server
+cd $WK
+export P4CLIENT=clientWS
+export P4PORT=p4od:14001
+
+p4 sync
diff --git a/ecflow_4_0_7/build/rmbin.sh b/ecflow_4_0_7/build/rmbin.sh
new file mode 100755
index 0000000..cef5b9d
--- /dev/null
+++ b/ecflow_4_0_7/build/rmbin.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+cd $WK
+ 
+rm -rf ACore/bin
+rm -rf ANattr/bin
+rm -rf ANode/bin 
+rm -rf AParser/bin 
+rm -rf Base/bin
+rm -rf CSim/bin
+rm -rf Client/bin 
+rm -rf Server/bin 
+rm -rf Test/bin
+rm -rf Pyext/bin 
+rm -rf view/bin 
+   
diff --git a/ecflow_4_0_7/build/site_config/site-config-AIX.jam b/ecflow_4_0_7/build/site_config/site-config-AIX.jam
new file mode 100644
index 0000000..4110b13
--- /dev/null
+++ b/ecflow_4_0_7/build/site_config/site-config-AIX.jam
@@ -0,0 +1,108 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# site-config.jam for AIX v11.1 compiler
+# This file should be place in $HOME or $BOOST_ROOT/tools/build/v2/
+#-----------------------------------------------------------------
+
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+
+# ========================= referenced libs =========================================
+
+# Boost libraries referenced in client/server programs. 
+# Assumes --layout=tagged
+#
+lib boost_serialization : :   <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d.a ;
+lib boost_system : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-d.a ;
+lib boost_thread : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-d.a ;
+lib boost_test   : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-d.a ;
+lib boost_test_monitor : :    <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-d.a ;
+lib boost_program_options : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-d.a ;
+lib boost_filesystem      : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-d.a ;
+lib boost_datetime        : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-d.a ;
+lib boost_python          : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.so ;
+lib boost_python_static   : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.a ;
+
+# profile uses release libs
+lib boost_serialization : :   <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+lib boost_serialization : :   <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+
+#======================= project site-config ================================
+
+# -bbigtoc:
+#  we get TOC overflow, because compiler/linker has 64k limit on
+#  the number of global symbols. Options are use:
+#       0/ Break up shared lib
+#       1/ -bbigtoc to overcome at the cost of performance degradation
+#       2/ --qipa=level=0 if this fails try
+#       3/ --qipa=level=1 if this fails try
+#       4/ --qipa=level=2 if this fails, revert to -bbigtoc
+#       Currently option 2-4 didn't work!
+
+# <threading>multi
+#  Note: in order to use xlC_r compiler, you have to use either 
+#  "bjam threading=multi"  OR
+#  add 
+#    requirements <threading>multi
+#  as below.
+#
+
+# <cxxflags>-qsuppress=1500-029
+# In release mode we get hundreds of 1500-029 warning message, ie failure to inline
+# hence decided to supress this.
+# 
+# Suppress 1540-2883 (W) Inline function "<funtion>" given attribute noinline.
+# This was the fix for release mode of the compiler & fixed the serialisation crash
+# Unfortunately it generates hundreds of warnings for each type seralized in each header file 
+#    "/s1a/emos_esuite/emos_data/sms/boost/boost_1_45_0/boost/serialization/singleton.hpp", line 126.17: 1540-2883 (W) Inline function "void use(const void_caster_primitive<Alias,Submittable> &)" given attribute noinline.
+#    "/s1a/emos_esuite/emos_data/sms/boost/boost_1_45_0/boost/serialization/singleton.hpp", line 126.17: 1540-2883 (W) Inline function "void use(const iserializer<boost::archive::text_iarchive,PartExpression> &)" given attribute noinline.
+
+project site-config 
+	: requirements <include>$(BOOST_ROOT)  
+	: requirements <threading>multi 
+   : requirements <cxxflags>-qsuppress=1540-0198                          # (W) The omitted keyword "private" is assumed for base class
+   : requirements <cxxflags>-qsuppress=1540-2883                          # (W) Inline function "<function>" given attribute noinline.
+   : requirements <variant>release:<cxxflags>-qsuppress=1500-029          # supress could not be inlined message
+   : requirements <linkflags>-bbigtoc  
+   ;
+
+# using syntax:
+# using toolset-name : version :invocation-command : options ;
+#   where options allows <cflags, cxxflags, compileflags and linkflags >
+#
+using vacpp ;
+using testing ;
+
+# ================================================================================
+# Link with FDB  (PRODGEN)
+ 
+lib libfdb
+    :
+    : <file>/usr/local/lib/libfdb.a   
+    ;
\ No newline at end of file
diff --git a/ecflow_4_0_7/build/site_config/site-config-HPUX.jam b/ecflow_4_0_7/build/site_config/site-config-HPUX.jam
new file mode 100644
index 0000000..4635fa2
--- /dev/null
+++ b/ecflow_4_0_7/build/site_config/site-config-HPUX.jam
@@ -0,0 +1,113 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# This file should be changed depending on the new system
+# no other files should need changing
+# This file should be place in $HOME or $BOOST_ROOT/tools/build/v2/
+#-----------------------------------------------------------------
+
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+
+#
+# Boost libraries referenced in client/server programs
+#
+lib boost_serialization : :   <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d.a ;
+lib boost_system : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-d.a ;
+lib boost_thread : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-d.a ;
+lib boost_test   : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-d.a ;
+lib boost_test_monitor : :    <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-d.a ;
+lib boost_program_options : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-d.a ;
+lib boost_filesystem      : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-d.a ;
+lib boost_datetime        : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-d.a ;
+lib boost_python          : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.so ;
+lib boost_python_static   : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.a ;
+
+lib boost_serialization : :   <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+# Lib for run time checks, use for debug builds only
+lib rtc : :  <variant>debug <file>/opt/langtools/lib/hpux32/librtc.so ;
+
+
+# project wide settings. Please disable requirements <variant>debug:<linkflags>+check=all 
+# for release build.
+# Note: _XOPEN_SOURCE_EXTENDED is only needed for Client/Server categories
+#       assuming its no harm to define everywhere
+#
+# Boost CHRONO does not work properly with HPUX compiler( boost version 1.51 )
+# hence use of BOOST_THREAD_DONT_USE_CHRONO, See http://www.boost.org/doc/libs/1_51_0/doc/html/thread/build.html
+# Even with this boost thread/chrono does not compile. Kept in case fixed in the future
+#
+project site-config 
+	: requirements <include>$(BOOST_ROOT)
+	: requirements <threading>multi 
+	: requirements <define>HPUX 
+   : requirements <define>_XOPEN_SOURCE_EXTENDED 
+   : requirements <define>BOOST_THREAD_DONT_USE_CHRONO 
+#	: requirements <library>rtc 
+#	: requirements <variant>debug:<linkflags>+check=all 
+	;
+	
+	
+# STATIC: Additional Lint type checks.Will drastically slow down compiles, hence optional
+#
+# use <compileflags>+w for additional lint style checking
+# Suppress the most prevalent boost warnings, this allows us to see lint
+# checks in our own code
+# 
+# suppress - warning #2261-D: controlling expression is constant
+#          - warning #2236-D: controlling expression is constant
+#          - remark #4296-D: arithmetic operation on boolean type
+#          - remark #2401-D: destructor for base class is not virtual
+#          - remark #2340-D: value copied to temporary, reference to temporary use
+#          - remark #4255-D: padding size of struct "d1" with 3 bytes to alignment boundary>]" at line 62
+#          - remark #4227-D: padding struct with 3 bytes to align member "old_mask_"
+#          - remark #2193-D: zero used for undefined preprocessing identifier "__GNUC__"
+#          - remark #2324-D: duplicate friend declaration
+#          - remark #4285-D: operator= does not have a check for the source and destination addresses being non-identical
+#
+# RUNTIME: Will drastically slow run runs, but will give very useful information, hence optional
+#
+# enable +check=all, to enable all runtime checks:
+#     +check=bounds
+#     +check=malloc
+#     +check=stack:variables
+#     +check=uninit -z
+#using acc :  : : <compileflags>+w
+#                 <compileflags>+W2236,2461,2261,2236,4296,2401,2340,4255,4227,2193,2324,4285
+#		            <compileflags>+check=all
+#                 ;
+
+
+#
+# suppress - warning #2236-D: controlling expression is constant
+#            warning #2461-D: initial value of reference to non-const must be an lvalue
+#            warning #2191-D: type qualifier is meaningless on cast type
+#            warning #2815-D: type qualifier on return type is meaningless
+#            warning #4232-D: conversion from "boost::python::converter::rvalue_from_python_stage1_data *" to a more strictly aligned type "boost::python::converter::rvalue_from_python_storage<boost::shared_ptr<CtsApi>> *" may cause misaligned access
+#            warning #4189-D: warning #4189-D: a non-POD class type used in offsetof macro BOOST_STATIC_ASSERT(BOOST_PYTHON_OFFSETOF(rvalue_from_python_storage<T>,stage1) == 0);
+#
+# using syntax:
+# using toolset-name : version : invocation-command : options ;
+#   where options allows <cflags, cxxflags, compileflags and linkflags >
+#
+using acc : : : <compileflags>+W2236,2461,2191,2815,4232,4189
+          ;
+          
+using testing ;
+
+# - If you change python version ,remember to change: $WK/build/install_ecflow.sh: ECFLOW_PYTHON_INSTALL_DIR
diff --git a/ecflow_4_0_7/build/site_config/site-config-Linux.jam b/ecflow_4_0_7/build/site_config/site-config-Linux.jam
new file mode 100644
index 0000000..fe8c23b
--- /dev/null
+++ b/ecflow_4_0_7/build/site_config/site-config-Linux.jam
@@ -0,0 +1,91 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# ===================================================================
+# site-config.jam file for Linux/gcc
+# This file should be placed in $HOME or $BOOST_ROOT/tools/build/v2/
+# ===================================================================
+
+#
+# Pull in environment variables
+#
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+
+#
+# --layout=system    -> libboost_system.a (default)
+# --layout=tagged    -> libboost_system-mt-d.a(debug)          libboost_system-mt.a(release) 
+# --layout=versioned -> libboost_system-xlc-mt-d-1.42(debug)   libboost_system-xlc-mt-1_42.a(release)
+#
+# Boost libraries referenced in client/server programs
+# assumes --layout=tagged for the debug release and profile variant
+#
+lib boost_serialization : :   <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d.a ;
+lib boost_system : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-d.a ;
+lib boost_thread : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-d.a ;
+lib boost_test   : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-d.a ;
+lib boost_test_monitor : :    <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-d.a ;
+lib boost_program_options : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-d.a ;
+lib boost_filesystem      : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-d.a ;
+lib boost_datetime        : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-d.a ;
+lib boost_python          : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.so ;
+lib boost_python_static   : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.a ;
+
+# profile uses release libs
+lib boost_serialization : :   <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+lib boost_serialization : :   <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+#
+# Notice: we don't add requirements <library>pthread ,  because
+#  	a/ Not all tests require it
+#  	b/ Can cause links errors
+# Hence left to individual projects/test
+#
+project site-config 
+	: requirements <include>$(BOOST_ROOT)  
+ 	;
+
+# using syntax:
+# using toolset-name : version : invocation-command : options ;
+#   where options allows <cflags, cxxflags, compileflags and linkflags >
+#
+using gcc ;
+using testing ;
+
+# ==================== ECFLOWVIEW =======================================================
+
+local motif_library = [ os.environ MOTIF_LIBRARY ] ;
+motif_library default = "/usr/lib64" ; 
+constant MOTIF_LIBRARY : $(motif_library) ; 
+
+MOTIF_LIBRARY default = /usr/lib ;
+
+# ================================================================================
+# Link with FDB, (PRODGEN)
+lib libfdb
+    :
+    : <file>/usr/local/lib/metaps/lib/libfdb.a 
+    ;
diff --git a/ecflow_4_0_7/build/site_config/site-config-Linux64-clang.jam b/ecflow_4_0_7/build/site_config/site-config-Linux64-clang.jam
new file mode 100644
index 0000000..053d452
--- /dev/null
+++ b/ecflow_4_0_7/build/site_config/site-config-Linux64-clang.jam
@@ -0,0 +1,91 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# ===================================================================
+# This file should be placed in $HOME or $BOOST_ROOT/tools/build/v2/
+# ===================================================================
+
+#
+# Pull in environment variables
+#
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+
+#
+# --layout=system    -> libboost_system.a (default)
+# --layout=tagged    -> libboost_system-mt-d.a(debug)          libboost_system-mt.a(release) 
+# --layout=versioned -> libboost_system-xlc-mt-d-1.42(debug)   libboost_system-xlc-mt-1_42.a(release)
+#
+# Boost libraries referenced in client/server programs
+# assumes --layout=tagged for the debug release and profile variant
+#
+lib boost_serialization : :   <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d.a ;
+lib boost_system : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-d.a ;
+lib boost_thread : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-d.a ;
+lib boost_test   : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-d.a ;
+lib boost_test_monitor : :    <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-d.a ;
+lib boost_program_options : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-d.a ;
+lib boost_filesystem      : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-d.a ;
+lib boost_datetime        : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-d.a ;
+lib boost_python          : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.so ;
+lib boost_python_static   : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.a ;
+
+# profile uses release libs
+lib boost_serialization : :   <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+lib boost_serialization : :   <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+#
+# Notice: we don't add  requirements <library>pthread , because
+#   a/ Not all tests require it
+#   b/ Can cause links errors
+# Hence left to individual projects/test
+#
+project site-config 
+    : requirements <include>$(BOOST_ROOT)  
+    ;
+
+# using syntax:
+# using toolset-name : version :invocation-command : options ;
+#   where options allows <cflags, cxxflags, compileflags and linkflags >
+#
+# On linux 64, because most of the static library's, are placed in a shared libs(ecflow.so)
+# hence we need to compile with -fPIC
+using clang : : /usr/local/apps/clang/current/bin/clang++ : <cxxflags>-fPIC ;
+
+using testing ;
+
+# ==================== ECFLOWVIEW/install =======================================================
+
+local motif_library = [ os.environ MOTIF_LIBRARY ] ;
+motif_library default = "/usr/lib64" ; 
+constant MOTIF_LIBRARY : $(motif_library) ; 
+
+# ================================================================================
+# Link with FDB, (PRODGEN)
+lib libfdb
+    :
+    : <file>/usr/local/lib/metaps/lib/libfdb.a 
+    ;
diff --git a/ecflow_4_0_7/build/site_config/site-config-Linux64-intel.jam b/ecflow_4_0_7/build/site_config/site-config-Linux64-intel.jam
new file mode 100644
index 0000000..9e330d3
--- /dev/null
+++ b/ecflow_4_0_7/build/site_config/site-config-Linux64-intel.jam
@@ -0,0 +1,98 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# ===================================================================
+# This file should be placed in $HOME or $BOOST_ROOT/tools/build/v2/
+# ===================================================================
+
+#
+# Pull in environment variables
+#
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+
+#
+# --layout=system    -> libboost_system.a (default)
+# --layout=tagged    -> libboost_system-mt-d.a(debug)          libboost_system-mt.a(release) 
+# --layout=versioned -> libboost_system-xlc-mt-d-1.42(debug)   libboost_system-xlc-mt-1_42.a(release)
+#
+# Boost libraries referenced in client/server programs
+# assumes --layout=tagged for the debug release and profile variant
+#
+lib boost_serialization : :   <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d.a ;
+lib boost_system : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-d.a ;
+lib boost_thread : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-d.a ;
+lib boost_test   : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-d.a ;
+lib boost_test_monitor : :    <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-d.a ;
+lib boost_program_options : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-d.a ;
+lib boost_filesystem      : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-d.a ;
+lib boost_datetime        : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-d.a ;
+lib boost_python          : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.so ;
+lib boost_python_static   : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.a ;
+
+# profile uses release libs
+lib boost_serialization : :   <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+lib boost_serialization : :   <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+#
+# Notice: we don't add  requirements <library>pthread , because
+#   a/ Not all tests require it
+#   b/ Can cause links errors
+# Hence left to individual projects/test
+#
+project site-config 
+    : requirements <include>$(BOOST_ROOT)  
+    ;
+
+# On linux 64, because most of the static library's, are placed in a shared libs(ecflow.so)
+# hence we need to compile with -fPIC
+#
+# using syntax:
+# using toolset-name : version : invocation-command : options ;
+#   where options allows <cflags, cxxflags, compileflags and linkflags >
+#
+# Suppress the following warnings:
+#    warning #1875: offsetof applied to non-POD (Plain Old Data) types is nonstandard
+#        This warning is mostly from boost python headers
+#    warning #1881: argument must be a constant null pointer value
+#        This warning is in the vewier, with X-windows
+#
+using intel-linux : : : <cxxflags>-fPIC <compileflags>-wd1875,1881  ;
+
+using testing ;
+
+# ==================== ECFLOWVIEW/install =======================================================
+
+local motif_library = [ os.environ MOTIF_LIBRARY ] ;
+motif_library default = "/usr/lib64" ; 
+constant MOTIF_LIBRARY : $(motif_library) ; 
+
+# ================================================================================
+# Link with FDB, (PRODGEN)
+lib libfdb
+    :
+    : <file>/usr/local/lib/metaps/lib/libfdb.a 
+    ;
diff --git a/ecflow_4_0_7/build/site_config/site-config-Linux64.jam b/ecflow_4_0_7/build/site_config/site-config-Linux64.jam
new file mode 100644
index 0000000..a2e576c
--- /dev/null
+++ b/ecflow_4_0_7/build/site_config/site-config-Linux64.jam
@@ -0,0 +1,96 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# ===================================================================
+# site-config.jam file for Linux/gcc
+# This file should be placed in $HOME or $BOOST_ROOT/tools/build/v2/
+# ===================================================================
+
+#
+# Pull in environment variables
+#
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+
+#
+# --layout=system    -> libboost_system.a (default)
+# --layout=tagged    -> libboost_system-mt-d.a(debug)          libboost_system-mt.a(release) 
+# --layout=versioned -> libboost_system-xlc-mt-d-1.42(debug)   libboost_system-xlc-mt-1_42.a(release)
+#
+# Boost libraries referenced in client/server programs
+# assumes --layout=tagged for the debug release and profile variant
+#
+lib boost_serialization : :   <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d.a ;
+lib boost_system : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-d.a ;
+lib boost_thread : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-d.a ;
+lib boost_test   : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-d.a ;
+lib boost_test_monitor : :    <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-d.a ;
+lib boost_program_options : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-d.a ;
+lib boost_filesystem      : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-d.a ;
+lib boost_datetime        : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-d.a ;
+lib boost_python          : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.so ;
+lib boost_python_static   : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d.a ;
+
+# profile uses release libs
+lib boost_serialization : :   <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+lib boost_serialization : :   <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt.a ;
+lib boost_system : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt.a ;
+lib boost_thread : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt.a ;
+lib boost_test   : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt.a ;
+lib boost_test_monitor : :    <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt.a ;
+lib boost_program_options : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt.a ;
+lib boost_filesystem      : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt.a ;
+lib boost_datetime        : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt.a ;
+lib boost_python          : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.so ;
+lib boost_python_static   : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt.a ;
+
+#
+# Notice: we don't add  requirements <library>pthread , because
+#   a/ Not all tests require it
+#   b/ Can cause links errors
+# Hence left to individual projects/test
+#
+project site-config 
+    : requirements <include>$(BOOST_ROOT)  
+    ;
+
+# using syntax:
+# using toolset-name : version :invocation-command : options ;
+#   where options allows <cflags, cxxflags, compileflags and linkflags >
+#
+# On linux 64, because most of the static library's, are placed in a shared libs(ecflow.so)
+# hence we need to compile with -fPIC
+using gcc : : : <cxxflags>-fPIC ;
+
+#
+# $BOOST_ROOT/bjam --toolset=gcc cflags="-std=gnu++11" c++-template-depth=512 
+# using gcc : 4.7.2 : : <cxxflags>-fPIC <cxxflags>-std=gnu++11 <cxxflags>-ftemplate-depth=512 ;
+ 
+using testing ;
+
+# ==================== ECFLOWVIEW/install =======================================================
+
+local motif_library = [ os.environ MOTIF_LIBRARY ] ;
+motif_library default = "/usr/lib64" ; 
+constant MOTIF_LIBRARY : $(motif_library) ; 
+
+# ================================================================================
+# Link with FDB, (PRODGEN)
+lib libfdb
+    :
+    : <file>/usr/local/lib/metaps/lib/libfdb.a 
+    ;
diff --git a/ecflow_4_0_7/build/site_config/site-config-cray.jam b/ecflow_4_0_7/build/site_config/site-config-cray.jam
new file mode 100644
index 0000000..b82419e
--- /dev/null
+++ b/ecflow_4_0_7/build/site_config/site-config-cray.jam
@@ -0,0 +1,203 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# ===================================================================
+# site-config.jam file for Linux/cray
+# This file should be placed in $HOME or $BOOST_ROOT/tools/build/v2/
+# ===================================================================
+
+#
+# Pull in environment variables
+#
+import os ;
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+local MACHINE_NAME = [ os.environ MACHINE_NAME ] ;
+
+#
+# --layout=system    -> libboost_system.a (default)
+# --layout=tagged    -> libboost_system-mt-d.a(debug)          libboost_system-mt.a(release) 
+# --layout=versioned -> libboost_system-xlc-mt-d-1.42(debug)   libboost_system-xlc-mt-1_42.a(release)
+#
+# Boost libraries referenced in client/server programs
+# assumes --layout=tagged for the debug release and profile variant
+#
+
+GCC_TAG = gcc46 ;
+VERSION_TAG = 1_53 ;
+switch $(BOOST_ROOT) {
+   case *boost_1_55_0 : VERSION_TAG = 1_55 ;
+   case *boost_1_56_0 : VERSION_TAG = 1_56 ;
+   case *boost_1_57_0 : VERSION_TAG = 1_57 ;
+}
+
+switch $(MACHINE_NAME) {
+   case cca : GCC_TAG = gcc48 ;
+   case ccb : GCC_TAG = gcc48 ;
+}
+
+
+lib boost_serialization : :   <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_system : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_thread : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_test   : :          <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_program_options : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_datetime        : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+lib boost_python          : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-$(GCC_TAG)-mt-d-$(VERSION_TAG).so ;
+lib boost_python_static   : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-$(GCC_TAG)-mt-d-$(VERSION_TAG).a ;
+
+# profile uses release libs
+lib boost_serialization : :   <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_system : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_thread : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_test   : :          <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_program_options : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_datetime        : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_python          : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-$(GCC_TAG)-mt-$(VERSION_TAG).so ;
+lib boost_python_static   : : <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+
+lib boost_serialization : :   <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_system : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_thread : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_test   : :          <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_program_options : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_datetime        : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+lib boost_python          : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-$(GCC_TAG)-mt-$(VERSION_TAG).so ;
+lib boost_python_static   : : <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-$(GCC_TAG)-mt-$(VERSION_TAG).a ;
+
+# INTEL ================================================================================================
+
+lib boost_serialization : :   <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-il-mt-d-$(VERSION_TAG).a ;
+lib boost_system : :          <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-il-mt-d-$(VERSION_TAG).a ;
+lib boost_thread : :          <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-il-mt-d-$(VERSION_TAG).a ;
+lib boost_test   : :          <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-il-mt-d-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-il-mt-d-$(VERSION_TAG).a ;
+lib boost_program_options : : <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-il-mt-d-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-il-mt-d-$(VERSION_TAG).a ;
+lib boost_datetime        : : <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-il-mt-d-$(VERSION_TAG).a ;
+lib boost_python          : : <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-il-mt-d-$(VERSION_TAG).so ;
+lib boost_python_static   : : <toolset>intel <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-il-mt-d-$(VERSION_TAG).a ;
+ 
+lib boost_serialization : :   <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-il-mt-$(VERSION_TAG).a ;
+lib boost_system : :          <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-il-mt-$(VERSION_TAG).a ;
+lib boost_thread : :          <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-il-mt-$(VERSION_TAG).a ;
+lib boost_test   : :          <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-il-mt-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-il-mt-$(VERSION_TAG).a ;
+lib boost_program_options : : <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-il-mt-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-il-mt-$(VERSION_TAG).a ;
+lib boost_datetime        : : <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-il-mt-$(VERSION_TAG).a ;
+lib boost_python          : : <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-il-mt-$(VERSION_TAG).so ;
+lib boost_python_static   : : <toolset>intel <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-il-mt-$(VERSION_TAG).a ;
+
+lib boost_serialization : :   <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-il-mt-$(VERSION_TAG).a ;
+lib boost_system : :          <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-il-mt-$(VERSION_TAG).a ;
+lib boost_thread : :          <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-il-mt-$(VERSION_TAG).a ;
+lib boost_test   : :          <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-il-mt-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-il-mt-$(VERSION_TAG).a ;
+lib boost_program_options : : <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-il-mt-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-il-mt-$(VERSION_TAG).a ;
+lib boost_datetime        : : <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-il-mt-$(VERSION_TAG).a ;
+lib boost_python          : : <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-il-mt-$(VERSION_TAG).so ;
+lib boost_python_static   : : <toolset>intel <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-il-mt-$(VERSION_TAG).a ;
+
+# CRAY ================================================================================================
+lib boost_serialization : :   <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d-$(VERSION_TAG).a ;
+lib boost_system : :          <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-d-$(VERSION_TAG).a ;
+lib boost_thread : :          <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-d-$(VERSION_TAG).a ;
+lib boost_test   : :          <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-d-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-d-$(VERSION_TAG).a ;
+lib boost_program_options : : <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-d-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-d-$(VERSION_TAG).a ;
+lib boost_datetime        : : <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-d-$(VERSION_TAG).a ;
+lib boost_python          : : <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d-$(VERSION_TAG).so ;
+lib boost_python_static   : : <toolset>cray <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-d-$(VERSION_TAG).a ;
+
+lib boost_serialization : :   <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-$(VERSION_TAG).a ;
+lib boost_system : :          <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-$(VERSION_TAG).a ;
+lib boost_thread : :          <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-$(VERSION_TAG).a ;
+lib boost_test   : :          <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-$(VERSION_TAG).a ;
+lib boost_program_options : : <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-$(VERSION_TAG).a ;
+lib boost_datetime        : : <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-$(VERSION_TAG).a ;
+lib boost_python          : : <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-$(VERSION_TAG).so ;
+lib boost_python_static   : : <toolset>cray <variant>profile <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-$(VERSION_TAG).a ;
+
+lib boost_serialization : :   <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-$(VERSION_TAG).a ;
+lib boost_system : :          <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_system-mt-$(VERSION_TAG).a ;
+lib boost_thread : :          <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_thread-mt-$(VERSION_TAG).a ;
+lib boost_test   : :          <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_unit_test_framework-mt-$(VERSION_TAG).a ;
+lib boost_test_monitor : :    <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_test_exec_monitor-mt-$(VERSION_TAG).a ;
+lib boost_program_options : : <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_program_options-mt-$(VERSION_TAG).a ;
+lib boost_filesystem      : : <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_filesystem-mt-$(VERSION_TAG).a ;
+lib boost_datetime        : : <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_date_time-mt-$(VERSION_TAG).a ;
+lib boost_python          : : <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-$(VERSION_TAG).so ;
+lib boost_python_static   : : <toolset>cray <variant>release <file>$(BOOST_ROOT)/stage/lib/libboost_python-mt-$(VERSION_TAG).a ;
+
+
+# ******************** CRAY Compiler specific ************************************
+# The customer may be able to work around this by adding
+#
+#      -DBOOST_ASIO_DISABLE_FENCED_BLOCK=1
+#
+#  to the compiler invocation.
+#
+#  The issue is that the various compiler macros set are causing a file with gcc
+#  inline assembly to be included. CCE does not currently support inline assembly.
+#
+#  Note that adding this macro to the command line may cause additional Boost
+#  compilation errors to surface.
+#
+# Notice: we don't add  requirements <library>pthread , because
+#   a/ Not all tests require it
+#   b/ Can cause links errors
+# Hence left to individual projects/test
+#
+# ***********************************************************************************
+project site-config 
+    : requirements <include>$(BOOST_ROOT)  
+    : requirements <toolset>cray:<define>BOOST_ASIO_DISABLE_FENCED_BLOCK
+    ;
+
+# On linux 64, because most of the static library's, are placed in a shared libs(ecflow.so)
+# hence we need to compile with -fPIC
+#
+# using syntax:
+# using toolset-name : version :invocation-command : options ;
+#   where options allows <cflags, cxxflags, compileflags and linkflags >
+#
+#using gcc         : : : <cxxflags>-fPIC ;
+#using cray        : : : <cxxflags>-fPIC ;
+#using intel-linux : : : <cxxflags>-fPIC ;
+
+
+# For cray use the 'CC' wrapper script, however this assumes you linking with MPI, then barf's
+# using gcc : : CC : <cxxflags>-fPIC ;
+#
+#
+# $BOOST_ROOT/bjam --toolset=gcc cflags="-std=gnu++11" c++-template-depth=512 
+# using gcc : 4.7.2 : : <cxxflags>-fPIC <cxxflags>-std=gnu++11 <cxxflags>-ftemplate-depth=512 ;
+ 
+using testing ;
+
+# ==================== ECFLOWVIEW/install =======================================================
+
+local motif_library = [ os.environ MOTIF_LIBRARY ] ;
+motif_library default = "/usr/lib64" ; 
+constant MOTIF_LIBRARY : $(motif_library) ; 
+
+# ================================================================================
+# Link with FDB, (PRODGEN)
+lib libfdb
+    :
+    : <file>/usr/local/lib/metaps/lib/libfdb.a 
+    ;
diff --git a/ecflow_4_0_7/build/tar_ecflow.sh b/ecflow_4_0_7/build/tar_ecflow.sh
new file mode 100755
index 0000000..fd6b595
--- /dev/null
+++ b/ecflow_4_0_7/build/tar_ecflow.sh
@@ -0,0 +1,146 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# Tar up ecflow  
+# Assumes $WK(root workspace) is defined
+
+set -e # stop the shell on first error 
+set -u # fail when using an undefined variable 
+
+# ===============================================================================
+# Test/data/ECF_HOME is used by Test to recursively generate directory structure
+# and populate with defs file, and job output, etc, hence exclude this directory
+# ===============================================================================
+cd $WK
+rm -rf *.dat
+rm -rf *lock
+rm -rf *log
+rm -rf *.check
+rm -rf *.def
+rm -rf rtt.dat
+rm -rf Test/data/ECF_HOME_debug*
+rm -rf Test/data/ECF_HOME_release*
+rm -rf view/data/ECF_HOME_debug*
+rm -rf view/data/ECF_HOME_release*
+rm -rf AParser/test/data/single_defs/mega.def_log
+rm -rf Pyext/test.def
+rm -rf Pyext/build
+rm -rf Pyext/test/data/ecf_home_*
+
+# ================================================================================
+# Remove generated files before taring ecFlow  
+# Be careful with *.txt extension. i.e do not to delete CMakeList.txt file.
+# ================================================================================
+cd $WK
+ 
+# exclude log files from hidden files/directories like .metadata
+find . \( ! -regex '.*/\..*' \) -type f -name  \*.log -exec rm -rf \*.log {} \; -print
+
+find . -name \*~ -exec rm -rf \*~ {} \; -print
+find . -name \*.mk -exec rm -rf \*.mk {} \; -print
+find . -name \*.so -exec rm -rf \*.so {} \; -print
+find . -name \*.tmp -exec rm -rf \*.tmp {} \; -print
+find . -name \*.job\* -exec rm -rf \*.job\* {} \; -print
+find . -name \*.check -exec rm -rf \*.check {} \; -print
+find . -name \*.flat -exec rm -rf \*.flat {} \; -print
+find . -name \*.depth -exec rm -rf \*.depth {} \; -print
+find . -name \*.out -exec rm -rf \*.out {} \; -print
+find . -name \*.pyc -exec rm -rf \*.pyc {} \; -print
+find . -name t\*.1 -exec rm -rf t\*.1 {} \; -print
+find . -name gmon.out -exec rm -rf gmon.out {} \; -print
+find . -name gnuplot.dat -exec rm -rf gnuplot.dat {} \; -print
+find . -name gnuplot.script -exec rm -rf gnuplot.script {} \; -print
+find . -name ecflow.html -exec rm -rf ecflow.html {} \; -print
+find . -name core -exec rm -rf core {} \; -print
+find . -name `hostname`.*.ecf.* -exec rm -rf `hostname`.*.ecf.* {} \; -print
+find . -name callgrind.out.\* -exec rm -rf callgrind.out.\* {} \; -print
+find . -name massif.out.\* -exec rm -rf massif.out.* {} \; -print
+
+# ======================================================================
+# Create the tar file name based on the version
+# Determine ecflow build directory name: see ACore/doc/extracting_version_number.ddoc
+# ========================================================================
+cd $WK
+
+release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+
+ECFLOW_WS_DIR=ecflow_${release}_${major}_${minor}
+
+# ================================================================================
+# Create ecflow tar file
+# ================================================================================
+cd $WK
+cd ..
+
+# remove old tar files
+ECFLOWTAR=$ECFLOW_WS_DIR.tar
+rm -rf $ECFLOWTAR.gz
+rm -rf $ECFLOWTAR
+
+# temporarily create a symbolic link ECFLOW_WS_DIR, so that tar file directory name has version number in it
+ln -s ecflow $ECFLOW_WS_DIR
+
+# Exclusions from tar file: 
+# o/ .pydevproject used by Pydev eclipse plug-in
+# o/ .metadata, .cproject, .project, .settings, csettings are eclipse dir
+# o/ --exclude=SCRATCH  - has code for recording stand alone bugs.
+# o/ bin directory contains the build object files and exe's
+# o/ Debug is the eclipse/make dir
+# o/ operations: this consists of the mega defs file used in operations for reference only /AParser/test/data/operations
+# o/ Pyext/ecf/ecflow.so is ecFlow python extension
+# o/ Exclude ddoc file's
+# o/ Exclude *CERTAIN* Documentation directory , this includes the sphinx generated file '_build' ~4 Mb
+#    ** STILL NEED Doc/online as this used in the python unit tests.
+#    ** STILL NEED user-manual as this is installed
+# o/ Exclude check point and back up check point files, --exclude=*.check --exclude=*.check.b
+# o/ Exclude build/include
+# o/ RemoteSystemsTempFile dir generated by eclipse
+# o/ Xcdp, xcdp old ecflowview dirs
+# o/ exclude ecbuild used for CMAKE. Still needs sorting out
+# o/ exclude Pyext/test/data/CUSTOMER
+# o/ gcc4.5 this directory is under build/, used for CMAKE
+tar --exclude=*.check --exclude=*.check.b \
+    --exclude=*.ddoc \
+    --exclude=.p4config \
+    --exclude=SCRATCH \
+    --exclude=New_viewer \
+    --exclude=_build --exclude=func_spec --exclude=misc --exclude=newsletter --exclude=presentations --exclude=seminar --exclude=tac --exclude=Thumbs.db \
+    --exclude=.pydevproject \
+    --exclude=.git \
+    --exclude=.metadata --exclude=.cproject --exclude=.project --exclude=.settings --exclude=.csettings \
+    --exclude=ecbuild \
+    --exclude=bin \
+    --exclude=gcc4.5 \
+    --exclude=Debug \
+    --exclude=operations \
+    --exclude=ecflow.so \
+    --exclude=profile.sh \
+    --exclude=CUSTOMER \
+    --exclude=massive.sh \
+    --exclude=val.sh \
+    --exclude=include \
+    --exclude=test_bench \
+    --exclude=nightly \
+    --exclude=online \
+    --exclude=RemoteSystemsTempFiles \
+    -cf $ECFLOWTAR $ECFLOW_WS_DIR/.
+
+# Remove the link
+rm $ECFLOW_WS_DIR  
+
+# add ecbuild/ into tar file, exclude any .git files
+tar -rvf  $ECFLOWTAR --exclude=.git ecbuild/
+
+ls -lh $ECFLOWTAR
+gzip $ECFLOWTAR
+
+# Move tar file to /var/tmp/ma0/clientRoot/workspace
+mv $ECFLOWTAR.gz ../.
diff --git a/ecflow_4_0_7/build/tar_ecflow_doc.sh b/ecflow_4_0_7/build/tar_ecflow_doc.sh
new file mode 100644
index 0000000..d4869a0
--- /dev/null
+++ b/ecflow_4_0_7/build/tar_ecflow_doc.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# tar up ecflow documentation.
+#  - consisting of html based online tutorial and python API
+#  - user manual in Word and PDF formats
+# Creates a file of the form ecflow_2_0_19_doc.tar.gz in directory $SCRATCH
+# Assumes $WK(root workspace) defined
+# Assumes $SCRATCH is defined
+# Assumes sphinx available to build online documentation
+#
+
+set -e # stop the shell on first error 
+set -u # fail when using an undefined variable 
+
+# ======================================================================
+# Determine ecflow build directory name: see ACore/doc/extracting_version_number.ddoc
+# ========================================================================
+cd $WK
+
+release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+
+ECFLOW_WS_DIR=ecflow_${release}_${major}_${minor}_doc
+
+
+# ===================================================================================
+# generate online tutorial so the we don't need to add dependency 
+# on sphinx build on other platforms
+# ===================================================================================
+cd $WK/Doc/online
+make clean
+make html
+
+
+# ================================================================================
+# remove old doc tar files
+# ================================================================================
+ECFLOWTAR=$ECFLOW_WS_DIR.tar
+rm -rf $SCRATCH/$ECFLOWTAR.gz
+rm -rf $SCRATCH/$ECFLOWTAR 
+
+
+# ================================================================================
+# Create a tar of the online and user manual documentation
+# Notice: we don't delete Doc/online/_build as this contains the index.html
+# ================================================================================
+# Exclusions from tar file: 
+# o/ func_spec 
+# o/ .metadata, .cproject, .project, .settings, csettings are eclipse dir
+# o/ newsletter
+# o/ presentation
+# o/ Tac
+# o/ misc
+#
+cd $WK
+tar --exclude=func_spec \
+    --exclude=newsletter \
+    --exclude=presentations \
+    --exclude=seminar \
+    --exclude=ecbuild \
+    --exclude=tac \
+    --exclude=misc \
+    --exclude=.metadata --exclude=.cproject --exclude=.project --exclude=.settings --exclude=.csettings \
+    --exclude=Thumbs.db \
+    -cf $ECFLOWTAR Doc/
+
+ls -lh $ECFLOWTAR
+gzip $ECFLOWTAR
+mv $ECFLOWTAR.gz $SCRATCH/
+
diff --git a/ecflow_4_0_7/build/test.sh b/ecflow_4_0_7/build/test.sh
new file mode 100755
index 0000000..d9d6416
--- /dev/null
+++ b/ecflow_4_0_7/build/test.sh
@@ -0,0 +1,185 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#===================================================================
+# Run all the ecflow tests, note use !/bin/bash to keep rpm happy, it uses bash
+#===================================================================
+
+if [ "$#" -gt 3 ] ; then
+   echo "Maximum of 3 arguments expected"
+   echo " arg1-mode    (optional) default = debug,    valid values = [ debug | release ]"
+   echo " arg2-compiler(optional) default = linux/gcc-4.2.1"
+   echo " arg3-safe    (optional) default = no, valid values = [ no | safe ],"
+   echo "                                   safe means only run deterministic tests"
+   exit 1
+fi
+
+mode=debug
+compiler_arg=
+safe=no
+while [ "$#" -ne 0 ] ; do   
+   if [ "$1" = debug -o "$1" = release -o "$1" = profile ] ; then
+      mode=$1
+   elif [ "$1" = safe ] ; then  
+      safe=yes
+   else
+      compiler_arg=$1
+   fi
+   # shift remove last argument
+   shift
+done
+
+if [ ${#mode} -eq 0 ] ; then
+   echo "test expects mode i.e. debug or release"
+   exit 1
+fi
+
+echo "mode=$mode compiler=$compiler_arg safe=$safe"
+#exit 1;
+
+#======================================================================
+# remove python test, so that they are rerun
+cd $WK
+rm -rf Pyext/bin/*.test   
+
+# Remove any lock file create by tests which used EcfPortLock.hpp
+# ** However DO *NOT* remove this locks for in ecflow test.ecf
+# ** as they allow the debug and release test to run at the same time.
+rm -rf *.lock
+ 
+# Check that a command is in the PATH.
+test_path ()
+{
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
+    else
+        hash $1 1>/dev/null 2>/dev/null
+    fi
+}
+
+# Check that the OS name, as returned by "uname", is as given.
+test_uname ()
+{
+    if test_path uname; then
+        test `uname` = $*
+    fi
+}
+
+if test_uname Linux ; then
+
+   TOOLSET=
+   CXXFLAGS=
+   compiler=gcc-$(gcc -dumpversion)
+   
+   # When on cray check PE_ENV for environment
+   if [ "$PE_ENV" = INTEL -o "$PE_ENV" = CRAY -o "$PE_ENV" = GNU ]
+   then
+       CXXFLAGS=cxxflags=-fPIC
+       TOOLSET=toolset=gcc
+       if [ "$PE_ENV" = INTEL ] ; then
+          compiler=intel-linux
+          TOOLSET=toolset=intel
+       fi
+       if [ "$PE_ENV" = CRAY ] ; then
+          compiler=cray
+          TOOLSET=toolset=cray
+       fi
+   fi   
+   
+   # Allow the compiler to be overridden on linux
+   if [ ${#compiler_arg} -ne 0 ] ; then
+      compiler=$compiler_arg
+   fi
+
+   echo "*****************************************"
+   echo "Testing: variant=$mode compiler=$compiler"
+   echo "*****************************************"
+
+   ACore/bin/$compiler/$mode/u_acore  --log_level=message $TEST_OPTS
+   ANattr/bin/$compiler/$mode/u_anattr  --log_level=message $TEST_OPTS
+   ANode/bin/$compiler/$mode/u_anode  --log_level=message $TEST_OPTS
+   AParser/bin/$compiler/$mode/u_aparser  --log_level=message $TEST_OPTS
+   if [ "$safe" = no ] ; then
+      AParser/bin/$compiler/$mode/perf_aparser          --log_level=message $TEST_OPTS
+   fi
+   Base/bin/$compiler/$mode/u_base     --log_level=message $TEST_OPTS
+   Client/bin/$compiler/$mode/s_client     --log_level=message $TEST_OPTS
+   Server/bin/$compiler/$mode/u_server       --log_level=message $TEST_OPTS
+   CSim/bin/$compiler/$mode/c_csim  --log_level=message $TEST_OPTS
+   if [ "$safe" = no ] ; then
+      Test/bin/$compiler/$mode/s_test  --log_level=message $TEST_OPTS
+      Test/bin/$compiler/$mode/s_test_zombies  --log_level=message $TEST_OPTS
+   fi
+   
+   if [ "$safe" = no ] ; then
+      # run python/C++ test
+      cd Pyext
+      $BOOST_ROOT/bjam $TOOLSET $CXXFLAGS variant=$mode test-all $TEST_OPTS
+      cd ..
+   fi
+   
+   if [ x$DISPLAY = x  ]; then
+       echo "DISPLAY variable is not defined, ecflowview is not tested..."
+   else
+       view/bin/$compiler/$mode/test-view  --log_level=message $TEST_OPTS
+   fi
+   
+elif test_uname HP-UX ; then
+
+   echo "Testing: variant=$mode"
+   ACore/bin/acc/$mode/threading-multi/u_acore  --log_level=message $TEST_OPTS
+   ANattr/bin/acc/$mode/threading-multi/u_anattr  --log_level=message $TEST_OPTS
+   ANode/bin/acc/$mode/threading-multi/u_anode  --log_level=message $TEST_OPTS
+   AParser/bin/acc/$mode/threading-multi/u_aparser  --log_level=message $TEST_OPTS
+   if [ "$safe" = no ] ; then
+      AParser/bin/acc/$mode/threading-multi/perf_aparser  --log_level=message $TEST_OPTS
+   fi
+   Base/bin/acc/$mode/threading-multi/u_base  --log_level=message $TEST_OPTS
+   Client/bin/acc/$mode/threading-multi/s_client  --log_level=message $TEST_OPTS
+   Server/bin/acc/$mode/threading-multi/u_server  --log_level=message $TEST_OPTS
+   CSim/bin/acc/$mode/threading-multi/c_csim  --log_level=message $TEST_OPTS
+   if [ "$safe" = no ] ; then
+      Test/bin/acc/$mode/threading-multi/s_test  --log_level=message $TEST_OPTS
+      Test/bin/acc/$mode/threading-multi/s_test_zombies  --log_level=message $TEST_OPTS
+   fi
+   
+   if [ "$safe" = no ] ; then
+      # run python/C++ test, use test to bypass 'with' statement tests
+      cd Pyext
+      $BOOST_ROOT/bjam variant=$mode test $TEST_OPTS
+      cd ..
+   fi
+
+elif test_uname AIX ; then
+
+   echo "Testing: $ARCH variant=$mode"
+   
+   ACore/bin/vacpp/$mode/threading-multi/u_acore  --log_level=message $TEST_OPTS
+   ANattr/bin/vacpp/$mode/threading-multi/u_anattr  --log_level=message $TEST_OPTS
+   ANode/bin/vacpp/$mode/threading-multi/u_anode  --log_level=message $TEST_OPTS
+   AParser/bin/vacpp/$mode/threading-multi/u_aparser  --log_level=message $TEST_OPTS
+   if [ "$safe" = no ] ; then
+      AParser/bin/vacpp/$mode/threading-multi/perf_aparser  --log_level=message $TEST_OPTS
+   fi
+   Base/bin/vacpp/$mode/threading-multi/u_base  --log_level=message $TEST_OPTS
+   Client/bin/vacpp/$mode/threading-multi/s_client  --log_level=message $TEST_OPTS
+   Server/bin/vacpp/$mode/threading-multi/u_server  --log_level=message $TEST_OPTS
+   CSim/bin/vacpp/$mode/threading-multi/c_csim  --log_level=message $TEST_OPTS
+   if [ "$safe" = no ] ; then
+      Test/bin/vacpp/$mode/threading-multi/s_test  --log_level=message $TEST_OPTS
+      Test/bin/vacpp/$mode/threading-multi/s_test_zombies  --log_level=message $TEST_OPTS
+   fi
+
+   if [ "$safe" = no ] ; then
+      # run python/C++ test
+      cd Pyext
+      $BOOST_ROOT/bjam variant=$mode test-all $TEST_OPTS
+      cd ..
+   fi
+fi
diff --git a/ecflow_4_0_7/build/update_site_config.sh b/ecflow_4_0_7/build/update_site_config.sh
new file mode 100644
index 0000000..fd2e403
--- /dev/null
+++ b/ecflow_4_0_7/build/update_site_config.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+# This file is used build the boost libs used by ecflow
+# This script Use $BOOST_ROOT and $WK environment variable
+
+echo "WK=$WK"
+echo "BOOST_ROOT=$BOOST_ROOT"
+
+#
+# From boost 1.56 > the location of site-config.jam location has changed
+#
+SITE_CONFIG_LOCATION=$BOOST_ROOT/tools/build/v2/site-config.jam
+BOOST_VERSION="$(basename $BOOST_ROOT)"
+if [[ "$BOOST_VERSION" = boost_1_56_0 || "$BOOST_VERSION" = boost_1_57_0 ]] ; then
+   SITE_CONFIG_LOCATION=$BOOST_ROOT/tools/build/src/site-config.jam
+fi
+
+tool=
+
+# Check that a command is in the PATH.
+test_path ()
+{
+    if `command -v command 1>/dev/null 2>/dev/null`; then
+        command -v $1 1>/dev/null 2>/dev/null
+    else
+        hash $1 1>/dev/null 2>/dev/null
+    fi
+}
+
+test_uname ()
+{
+    if test_path uname; then
+        test `uname` = $*
+    fi
+}
+
+if test_uname Linux ; then
+  tool=gcc
+  X64=$(uname -m)
+  if [ "$X64" = x86_64 ]
+  then
+    # PE_ENV is defined in cray environment, at least on sandy bridge
+    if [ "$PE_ENV" = GNU -o "$PE_ENV" = INTEL -o "$PE_ENV" = CRAY ]
+    then
+       CXXFLAGS=cxxflags=-fPIC
+       layout=versioned  
+       
+       cp $WK/build/site_config/site-config-cray.jam $SITE_CONFIG_LOCATION
+       if [ "$PE_ENV" = INTEL ] ; then
+          tool=intel
+       fi
+       if [ "$PE_ENV" = CRAY ] ; then
+          tool=cray
+       fi
+    else
+       cp $WK/build/site_config/site-config-Linux64.jam $SITE_CONFIG_LOCATION  
+    fi
+     
+  else 
+    cp $WK/build/site_config/site-config-Linux.jam $SITE_CONFIG_LOCATION
+  fi
+  
+elif test_uname HP-UX ; then
+
+  tool=acc
+  cp $WK/build/site_config/site-config-HPUX.jam $SITE_CONFIG_LOCATION
+   
+elif test_uname AIX ; then
+
+   # on c1a
+   tool=vacpp
+   cp $WK/build/site_config/site-config-AIX.jam $SITE_CONFIG_LOCATION
+ 
+fi
+
+ 
\ No newline at end of file
diff --git a/ecflow_4_0_7/cmake.sh b/ecflow_4_0_7/cmake.sh
new file mode 100755
index 0000000..7bb4e57
--- /dev/null
+++ b/ecflow_4_0_7/cmake.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# ====================================================================
+# Maximum of 1 arguments expected:
+#  
+if [ "$#" -gt 1 ] ; then
+   echo "cmake expects 1 argument i.e"
+   echo "  cmake.sh debug"
+   echo "  cmake.sh release"
+   exit 1
+fi
+if [[ "$1" != debug && "$1" != release  ]] ; then
+  echo "cmake expected [ debug | release   ] but found $1"
+  exit 1
+fi
+
+# ==================================================================
+# Error handling
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# ===================================================================
+cd $WK
+release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+
+mkdir -p ecbuild/$1
+cd ecbuild/$1
+      
+cmake_build_type=
+if [[ $1 = debug ]] ; then
+    cmake_build_type=Debug
+else
+    cmake_build_type=Release
+fi
+
+#
+# -DCMAKE_PYTHON_INSTALL_TYPE = [ local | setup ]
+# -DCMAKE_PYTHON_INSTALL_PREFIX should *only* used when using python setup.py (CMAKE_PYTHON_INSTALL_TYPE=setup)
+#   *AND* for testing python install to local directory
+#
+# Use:DCMAKE_CXX_FLAGS to set compiler flags 
+#            -DCMAKE_CXX_FLAGS="-ftemplate-depth-128  -finline-functions -Wno-inline -Wall -fPIC  -DNDEBUG" \
+
+
+cmake ../.. -DCMAKE_MODULE_PATH=$WK/../ecbuild/cmake \
+            -DCMAKE_BUILD_TYPE=$cmake_build_type \
+            -DCMAKE_INSTALL_PREFIX=/var/tmp/ma0/cmake/ecflow/$release.$major.$minor \
+            -DCMAKE_PYTHON_INSTALL_TYPE=local 
+            #-DCMAKE_PYTHON_INSTALL_PREFIX=/var/tmp/ma0/cmake/ecflow/$release.$major.$minor/lib/python2.7/site-packages/ecflow
+        
diff --git a/ecflow_4_0_7/configure.sh b/ecflow_4_0_7/configure.sh
new file mode 100755
index 0000000..f8deb30
--- /dev/null
+++ b/ecflow_4_0_7/configure.sh
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# ======================================================================
+# Use for install of ecflow using cmake and ecbuild(bundled with ecflow)
+# External requirements: cmake, boost
+#                        export WK=<source root of ecflow> i.e 
+#                        /var/tmp/fred/ecflow_4_0_7
+
+# assumes ecbuild is parallel to the source
+# Will by default create a build directory parallel to source directory, i.e.
+#                        /var/tmp/fred/cmake_build_dir
+#
+
+# Requires: users to set INSTALL_PREFIX,  
+# This needs to be set to path where you want to install
+INSTALL_PREFIX=/var/tmp/ma0/cmake/ecflow
+
+
+# =====================================================================
+# At least one argument expected:
+if [ "$#" -ne 1 ] ; then
+   echo "configure.sh expects 1 argument i.e"
+   echo "  configure.sh  <prefix-dir>"
+   echo "  configure.sh  /usr/local/apps/ecflow"
+   exit 1
+fi
+INSTALL_PREFIX=$1
+
+# ==================================================================
+# Error handling
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# ===================================================================
+# Version number
+cd $WK
+release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+
+# ===================================================================
+# Build directory
+cd ..
+mkdir -p cmake_build_dir/ecflow/release
+cd cmake_build_dir/ecflow/release
+      
+
+# ===================================================================
+# Configuration
+
+# BOOST_ROOT:  
+#  By default it looks for environment variable BOOST_ROOT, if not it can specified on the command line. i.e
+#  -DBOOST_ROOT=/var/tmp/ma0/boost/boost_1_53_0
+
+# Python:
+# -DCMAKE_PYTHON_INSTALL_TYPE = [ local | setup ]
+#    local : this will install to $INSTALL_PREFIX/$release.$major.$minor/lib/python2.7/site-packages/ecflow/
+#    setup : experimental only,python way of installing
+#
+#    -DCMAKE_PYTHON_INSTALL_PREFIX should *only* used when using python setup.py (CMAKE_PYTHON_INSTALL_TYPE=setup)
+#    *AND* for testing python install to local directory
+
+cmake $WK \
+      -DCMAKE_MODULE_PATH=$WK/../ecbuild/cmake \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX/$release.$major.$minor \
+      -DCMAKE_PYTHON_INSTALL_TYPE=local 
+      #-DCMAKE_PYTHON_INSTALL_PREFIX=$INSTALL_PREFIX/$release.$major.$minor/lib/python2.7/site-packages/ecflow
diff --git a/ecflow_4_0_7/project_summary.cmake b/ecflow_4_0_7/project_summary.cmake
new file mode 100644
index 0000000..819738b
--- /dev/null
+++ b/ecflow_4_0_7/project_summary.cmake
@@ -0,0 +1,21 @@
+message( STATUS "------------------------------------------------------" )
+
+if(Boost_FOUND)
+    message( STATUS " Boost    include : [${Boost_INCLUDE_DIRS}]" )
+    message( STATUS "          libs    : [${Boost_SYSTEM_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_SERIALIZATION_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_THREAD_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_FILESYSTEM_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_PROGRAM_OPTIONS_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_DATE_TIME_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_TEST_EXEC_MONITOR_LIBRARY}]" )
+    message( STATUS "          libs    : [${Boost_PYTHON_LIBRARY}]" )
+endif()
+
+if( PYTHONINTERP_FOUND )
+	message( STATUS "Python exec     : ${PYTHON_EXECUTABLE}" )
+	message( STATUS "       include  : ${PYTHON_INCLUDE_DIRS}" )
+	message( STATUS "       libs     : ${PYTHON_LIBRARIES}" )
+endif()
+
diff --git a/ecflow_4_0_7/tools/ecf_cmd b/ecflow_4_0_7/tools/ecf_cmd
new file mode 100755
index 0000000..f4ee8bb
--- /dev/null
+++ b/ecflow_4_0_7/tools/ecf_cmd
@@ -0,0 +1,868 @@
+#!/bin/ksh
+#==========================================================================
+##.TITLE   EMOS - METAPS utilities
+##.NAME    sms_submit
+##.SECTION EMOS
+##.DATE    2005-09-12
+##.VERSION 1.0
+#==========================================================================
+
+##$  sms_submit user host file
+##
+##?  Decides according to host argument which submit method to use.
+
+# Modifications:
+
+# Error handling and cleanup
+export SGE_ROOT=/usr/local/apps/sge
+export SLURM_ROOT=/usr/local/apps/slurm/current/bin
+export LL_ROOT=/usr/lpp/LoadL/full/bin
+STANDALONE=/usr/local/apps/sms/bin/standalone
+RUNSHELL=/bin/ksh 
+TIMEOUT=300  # timeout period (seconds)
+SSH="ssh -o ConnectTimeout=$TIMEOUT -o BatchMode=yes -o StrictHostKeyChecking=no "
+RSH=rsh
+PROFILE=". $HOME/.profile"
+type rsh > /dev/null || RSH=$SSH
+
+#--------------------------------------------------------------------------
+#  Parameters for ecrcmd
+#--------------------------------------------------------------------------
+
+SSH="ssh -o ConnectTimeout=$TIMEOUT -o BatchMode=yes -o StrictHostKeyChecking=no "
+
+ERROR() { 
+  err=$?
+  echo "ERROR $0: $* $? - Exiting."
+  # CP_SUB
+
+  [[ -f $subfile ]] && grep "has been submitted" $subfile && exit 0
+  [[ -f $subfile ]] && grep "Submitted batch job" $subfile && exit 0
+# Unable to run job: failed receiving gdi request # TBD OK
+  cat $subfile
+  exit $err
+}
+
+kill_submitted_and_abort() {
+    # not used while not deterministic: job may run in betweem and 
+    # become a zombie 
+    outf=$TMPDIR/kill$$
+    if [[ $? == 0 ]] && [[ -d $TMPDIR ]] ; then
+        touch $outf
+        grep "ECF_NODE="  ${subfile%.sub}   > $outf && \
+            grep "ECF_PORT=" ${subfile%.sub}  >> $outf && \
+            grep "ECF_NAME="  ${subfile%.sub}  >> $outf && \
+            grep "ECF_PASS="  ${subfile%.sub}  >> $outf && \
+            echo "export ECF_NODE ECF_PORT ECF_NAME ECF_PASS" >>$outf &&\
+            echo "ecflow_client --abort || :" >> $outf && . $outf
+        grep "^SMSNODE="  ${subfile%.sub}   > $outf && \
+            grep "^SMS_PROG=" ${subfile%.sub}  >> $outf && \
+            grep "^SMSNAME="  ${subfile%.sub}  >> $outf && \
+            grep "^SMSPASS="  ${subfile%.sub}  >> $outf && \
+            echo "export SMSNODE SMS_PROG SMSNAME SMSPASS " >> $outf && \
+            echo "smsabort || :" >> $outf && . $outf
+        ksh -x $outf
+        rm -f $outf
+    fi
+}
+
+kill_nqs() {
+    if [[ -s $subfile ]] ; then
+      tid=$(tail -1 $subfile | cut -d\. -f1 )
+      # tid=`tail -1 $subfile | cut -d\. -f1 `
+      # where=`tail -1 $subfile | cut -d\. -f2 `
+      $RSH $host -l $user qsig -s 2 $tid || qsig -s 2 $tid
+      $RSH $host -l $user qdel -W 10 $tid || qdel -W 10 $tid
+      
+    elif [[ -s $4 ]] ; then
+      tid=$(grep PBS_JOB ${4}.1 | cut -d= -f2)
+      $RSH $host -l $user qsig -s 2 $tid
+      $RSH $host -l $user qdel -W 10 $tid
+      
+    else
+      # Signal the job
+      $RSH $host -l $user qsig -s 2 $smsid
+
+      # Remove the job from PBS (give 10 ssmeconds delay for the above to finish)
+      $RSH $host -l $user qdel -W 10 $smsid
+    fi
+}
+
+kill_vpp() {
+    $RSH $host -l $user qdel -2 $smsid
+}
+
+kill_nqs() {
+    $RSH $host -l $user qdel -2 $smsid
+}
+
+kill_sge() {
+    use sge || :
+    QDEL=sge_qdel
+    type $QDEL || QDEL="ssh $host $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qdel"
+    if [[ -s $subfile ]] then
+      tid=$(grep " has been submitted" $subfile | cut -f 3 -d" ")
+      $QDEL $tid
+    elif [[ -s $4 ]] ; then
+      tid=$(grep active_jobs $4 | grep cd | cut -d"." -f 2 | cut -d"/" -f8)
+      $QDEL $tid
+    else
+      $QDEL $smsid
+    fi
+}
+
+kill_new_linux() {
+  tid=$(grep " has been submitted" $subfile | cut -f 3 -d" ")
+  $SSH $host -l $user $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qdel $tid
+}
+
+kill_ll() {
+ if [[ -s $subfile ]] then
+   tid=$(grep " has been submitted." $subfile | cut -d\" -f2)
+   $RSH $host -l $user $LL_ROOT/llcancel $tid
+ else
+
+   if [[ "$host" == hpc* ]] ; then
+     host=$(echo $host | cut -c1-4)
+     id=${host}0$(echo $smsid % 1000 | bc).$(echo $smsid / 1000 | bc)
+   else
+       id=$smsid
+       if [[ -f $smsid ]] ; then
+           grep "LOADL_STEP_ID=NOT_SET" $subfile && \
+               id=$(grep JOB_ID= $subfile | cut -d= -f2) && \
+               $RSH $host -l user kill -9 $id
+       fi
+   fi
+
+   $RSH $host -l $user $LL_ROOT/llcancel $id
+ fi
+}
+
+kill_slurm() {
+ if [[ -s $subfile ]] then
+   tid=$(grep "Submitted batch job " $subfile | awk '{print $4}')
+   $SSH $host -l $user $SLURM_ROOT/scancel $tid
+ else
+     id=$smsid
+     if [[ -f $smsid ]] ; then
+         grep "LOADL_STEP_ID=NOT_SET" $subfile && id=$(grep JOB_ID= $subfile | \
+             cut -d= -f2) && \
+             $SSH $host -l $user kill -9 $id
+     fi
+     
+     $SSH $host -l $user $SLURM_ROOT/scancel $id
+ fi
+}
+
+kill_rsh() {
+    $RSH $host -l $user /bin/kill -2 $smsid
+    # SGI syntax: kill -signal -pgid
+    $RSH $host -l $user kill -15 $smsid || kill -15 $smsid
+}
+
+status_pbs() {
+
+    qstat=/usr/local/apps/propbs/bin/qstat
+
+    if [[ -s $subfile ]] ; then
+        display_subfile
+      tid=$(tail -1 $subfile)
+    elif [[ -s $smsjob ]] ; then
+      tid=$(grep PBS_JOB ${smsjob}.1 | cut -d= -f2)
+    else
+      tid=$smsid
+    fi
+
+    banner "** output ** "
+    $RSH $host -l $user tail -100 /var/spool/PBS/spool/${tid}* &
+    wait
+    banner "** qstat ** "
+    $RSH $host -l $user $qstat -f $tid | grep $user && OK=OK &
+
+}
+
+status_vpp() {
+    $RSH $host -l $user qstat $smsid  | grep $user && OK=OK &
+}
+
+status_nqs() {
+    $RSH $host -l $user qstat $smsid  | grep $user && OK=OK &
+}
+
+status_swarm() {
+#    use sge
+    task_name=$(basename $smsjob | cut -d\. -f1)
+    if [[ -s $subfile ]] then
+        display_subfile
+      tid=$(grep " has been submitted" $subfile | cut -f 3 -d" ")
+    elif [[ -s $smsjob ]] ; then
+      tid=$(grep active_jobs $smsjob | grep cd | cut -d"." -f 2 | cut -d"/" -f8)
+    else
+      tid=$smsrid
+    fi
+
+    printf "==============================================================\n"
+    if [[ $host == @(lxa|lxb|lxab) ]] ; then
+        cat $file | $SSH $host $SGR_ROOT/sge6_2u5/bin/lx24-amd64/qstat -u $user -f  | \
+            grep -E "$task_name|$tid" | grep $user && OK=OK
+        cat $file | $SSH $host $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qstat -j $tid && \
+            print "$smsjob is there\n" || print "$smsjob not there ... \n"
+    else
+        qstat -u $user -f  | grep -E "$task_name|$tid" | grep $user && OK=OK
+        qstat -j $tid && print "$smsjob is there\n" || print "$smsjob not there ... \n"
+    fi
+    printf "==============================================================\n"
+}
+
+status_new_linux() {
+    status_swarm
+}
+
+status_ll() {
+    if [[ -s $subfile ]] then
+        tid=$(grep " has been submitted." $subfile | cut -d\" -f2)
+        host=$(echo $tid | cut -d\. -f1)
+        host4=$(echo $host | cut -c1-4)
+               
+        $RSH $host $LL_ROOT/llq -f %id %jn %o %c %st %nh $tid  | grep $user && OK=OK &
+
+    else
+        
+        if [[ -s $smsjob ]] ; then
+            host=$(grep HOST= $smsjob | cut -d= -f2)
+        fi
+        
+        if [[ "$host" == hpc* ]] ; then
+            host=$(echo $host | cut -c1-4)
+            host4=$(echo $host | cut -c1-4)
+            id=${host}0$(echo $smsid % 1000 | bc).$( echo $smsid / 1000 | bc)
+        else 
+            id=$host.$smsid
+        fi
+        
+        $RSH $host $LL_ROOT/llq -f %id %jn %o %c %st %nh $tid  | grep $user
+    fi
+}
+
+status_slurm() {
+ if [[ -s $subfile ]] then
+     display_subfile
+   tid=$(grep "Submitted batch job" $subfile | cut -d' ' -f4)
+   $SSH -l $user $host $SLURM_ROOT/scontrol show job -d $tid
+   $SSH -l $user $host $SLURM_ROOT/squeue | grep $user | grep " $tid"
+ elif [[ $host != $hostname ]] ; then
+     $SSH -l $user $host "$0 $user $host $file $uout $smsid status"
+ fi
+}
+
+status_rsh() {
+    if [[ $smsid == 0 ]]; then echo "too early"; exit 0; fi
+    $RSH $host -l $user ps -elf | grep " $user " | grep " $smsid " | grep -v " grep " && \
+        $RSH $host -l $user ps --sid $smsid -f 
+
+    \ps -elf | grep " $user " | grep " $smsid " | grep -v " grep " && OK=OK &
+    \ps --sid $smsid -f && OK=OK &   
+}
+
+disp_subfile() {
+  if [[ -s $subfile ]]; then # && [[ $OK = NOK ]] ; then
+    ls -la $subfile
+    # echo #    grep "^# +++ hpc" $subfile 
+    cat $subfile
+    # && type=ll
+fi
+}
+
+#--------------------------------------------------------------------------
+#  Check the number of arguments
+#--------------------------------------------------------------------------
+
+set -x
+echo $0 $*
+
+if [ $# -lt 3 ] ; then
+  echo
+  echo "usage: $0 <user> <host> file remote_output [node_suffix]"
+  echo
+  echo "example: $0 uid ecgate task.job1"
+  echo "while node_suffix is empty, host-batch node is the target, "
+  echo "      else \$node\$nodesuffix is the replacement target"
+  echo  
+  exit 1
+fi
+
+set -x
+
+user=$1
+host=$2
+file=$3
+uout=$4
+node_suffix=$5
+smsid=$5
+
+for last; do true; done # last shall be submit status kill only
+case $last in
+submit | status |  kill ) echo;;
+*) last="submit" ;;
+esac
+
+subfile=${file}.sub
+
+#--------------------------------------------------------------------------
+# determine queuing system from hostname
+# (can be replaced by a more refined method later...)
+#--------------------------------------------------------------------------
+
+hostname=$(hostname)
+
+case $host in
+    bilbo | belegorn | boromir | denethor | faramir | acq | pp1 | diss) type=pbs;;
+    vpp* )    type=vppnqs;;
+    swarm | linux_cluster | lxa | lxb | lxab )    type=sge_qsub;;
+    ecgate1 | ecgb* | ecgt* ) type=slurm;;
+    ecgate  | ecga* | c2* )   type=ll;;
+    $hostname | localhost )   type=local;;
+    datasvc)                  type=ssh;;
+    * )                       type=rsh;;
+esac
+
+# if [[ $type = "local" ]] && [[ $hostname = @(ecg*|vsms*) ]]; then type=ssh; fi
+
+#--------------------------------------------------------------------------
+# determine job file type and output directory
+#--------------------------------------------------------------------------
+
+output=""
+if egrep -i "^#.*QSUB " $file > /dev/null ; then
+  jtype=nqs
+  output=$(egrep -i "^#.*QSUB -o" $file | cut -d" " -f 4 | head -1)
+
+elif egrep -i "^#.*@.*queue" $file > /dev/null ; then
+  jtype=ll
+  output=$(egrep -i "^#.*@.*output" $file | cut -d"=" -f 2 | head -1)
+
+elif [[ $host == @(ecgb*|ecgt0*|ecgate1) ]] ; then
+  jtype=slurm
+  output=$(egrep -i "^#.*-o" $file | cut -d" " -f 3 | head -1)
+
+elif egrep -i "^#.*PBS " $file > /dev/null ; then
+  jtype=pbs
+
+elif egrep -i "^#.*SBATCH " $file > /dev/null ; then
+  jtype=slurm
+  output=$(egrep -i "^#.*-o" $file | cut -d" " -f 3 | head -1)
+  if [[ output == "" ]]; then
+    output=$(egrep -i "^#.*-output" $file | cut -d" " -f 3 | head -1)
+  fi
+  if [[ output == "" ]]; then output=$uout; fi
+  if [[ output != "" ]]; then
+    head -1 $output && grep "#!/" && RUNSHELL=$(head -1 $output | cut -d! -f2)
+  else 
+    RUNSHELL="/bin/bash"
+  fi
+  case $RUNSHELL in
+    *tcsh) PROFILE=". $HOME/.tcshrc";;
+    *csh) PROFILE=". $HOME/.cshrc";;
+  esac
+elif [[ $host == @(linux_cluster|lxa|lxb|lxab|swarm) ]] ; then
+  jtype=sge_qsub
+  output=$(egrep -i "^#.*-o" $file | cut -d" " -f 3 | head -1)
+
+else
+  jtype=sh
+
+fi
+
+case $last in
+submit)
+#--------------------------------------------------------------------------
+#  File must exist!
+#--------------------------------------------------------------------------
+
+if [[ ! -f $file ]] ; then
+  echo "$0: File $file not found?"
+  exit 1
+fi
+
+chmod 755 $file
+
+if [[ "$uout" != "" ]]; then output=$uout; mkdir -p $(dirname $uout); fi
+if [[ $output == *0.0 ]]; then echo "filename error $output"; exit 1; fi
+cp $file ${file}.pre
+# mailx -s "o:$output uo:$uout" $USER < /dev/null; exit 0
+
+LC="-c "
+if egrep -qi "^[[:space:]]*#[[:space:]]*@[[:space:]]*environment[[:space:]]*=" $file > /dev/null
+then
+  LC="-lc "
+fi
+
+[[ "$output" == "" ]] || outputdir=$(dirname $output)
+if [[ "$outputdir" != "" ]] ; then 
+#--------------------------------------------------------------------------
+#  Create the output directory if it can be found
+#--------------------------------------------------------------------------
+if [[ ! -d $outputdir ]] ; then
+  # don't worry anymore about output directory
+  $RSH $host -l $user mkdir -m 775 -p $outputdir || \
+      mkdir -m 775 -p $outputdir || /bin/true
+fi
+fi
+;;
+esac
+
+case $type in
+#==========================================================================
+# Submit to hp using PBS
+  pbs )
+#==========================================================================
+
+case $last in 
+kill) kill_pbs; exit 0;;
+status) status_pbs; exit 0;;
+esac
+
+# get queue-name, job-name
+if [[ $jtype == nqs ]] ; then
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+  jname=$(grep 'QSUB -r ' $file | cut -d" " -f 4 | head -1)
+
+elif [[ $jtype == ll ]] ; then
+  queue=$(egrep '^#.*@.*class.*=' $file | cut -d"=" -f 2 | head -1)
+  jname=$(egrep '^#.*@.*job_name.*=' $file | cut -d"=" -f 2 | head -1)
+
+elif [[ $jtype != pbs ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will contain the PBS directives
+#--------------------------------------------------------------------------
+
+if [[ $jtype != pbs ]] ; then
+
+cat > ${file}__ <<- EOF
+#!$RUNSHELL
+if [[ -f $HOME/.profile ]]; then
+$PROFILE
+fi
+#PBS -S /bin/ksh
+#PBS -N $jname
+#PBS -V
+#PBS -o /dev/null
+#PBS -e /dev/null
+#PBS -j oe
+#PBS -u $user
+#PBS -q $queue
+EOF
+
+  egrep -v '^#.*QSUB -|^:$|^#.*@' $file >> ${file}__
+
+  mv -f ${file}__ ${file}
+
+fi
+#--------------------------------------------------------------------------
+# Remote shell to $host and submit from there
+#--------------------------------------------------------------------------
+
+#rsh $host -l $user /usr/local/apps/propbs/bin/pbsqsub < $file || ERROR "Failed to submit job to PBS (possible failure of rsh)."
+
+if [[ $(uname -n) == @(ecgb*|vsms*|sms-map) ]]; then
+  $SSH -l $user $host /usr/local/apps/propbs/bin/pbsqsub -f $file > $subfile 2>&1 || \
+      ERROR "Failed to submit job to PBS. " 
+else
+    ecrcmd --timeout=$TIMEOUT < $file $user@$host $LC \
+        /usr/local/apps/propbs/bin/pbsqsub -f $file > $subfile || \
+        ERROR "Failed to submit job to PBS." 
+fi
+
+  ;;
+#==========================================================================
+# Submit to vpp using NQS
+  vppnqs )
+#==========================================================================
+
+case $last in 
+kill) kill_vpp; exit 0;;
+status) status_vpp; exit 0;;
+esac
+
+if [[ $jtype == ll ]] ; then
+  /home/ma/emos/bin/ll2nqs.pl $file ${file}__ || ERROR "Conversion ll2nqs.pl failed."
+  mv -f ${file}__ $file
+
+elif [[ $jtype != nqs ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+
+else
+  grep -v "QSUB -p" $file | grep -v "QSUB -lh" > ${file}__
+  mv -f ${file}__ $file
+fi
+  
+#--------------------------------------------------------------------------
+#  Send the file using qsub
+#  If send failed, sleep a while and try again, until maximum number of
+#  tries.
+#--------------------------------------------------------------------------
+
+$SSH $host -l $user /usr/local/bin/vppqsub < $file | grep -i submitted  > $subfile || \
+  ERROR "Failed to submit $file."
+
+  ;;
+#==========================================================================
+  sge_qsub ) # swarm linux cluster 
+
+case $last in 
+kill) kill_sge; exit 0;;
+status) status_sge; exit 0;;
+esac
+
+# get queue-name, job-name
+if [[ $jtype == nqs ]] ; then
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+  jname=$(grep 'QSUB -r ' $file | cut -d" " -f 4 | head -1)
+
+elif [[ $jtype == ll ]] ; then
+  queue=$(egrep '^#.*@.*class.*=' $file | cut -d"=" -f 2 | head -1)
+  jname=$(egrep '^#.*@.*job_name.*=' $file | cut -d"=" -f 2 | head -1)
+
+elif [[ $jtype != sge_qsub ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will contain the PBS directives
+#--------------------------------------------------------------------------
+
+# if [[ $jtype != sge_qsub ]] ; then
+
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+
+cat > ${file}__ <<- EOF
+#\$ -S /home/ma/emos/bin/ksh
+#\$ -N ${jname}
+#\$ -V
+#\$ -o $output
+#\$ -j y
+#\$ -u $user
+#\$ -q $queue
+EOF
+
+  egrep -v '^#.*QSUB -|^:$|^#.*@' $file >> ${file}__
+  chmod 755 ${file}__
+  mv -f ${file}__ ${file}
+
+# fi
+
+    mkdir -m 775 -p $outputdir || /bin/true
+    if [[ $host == @(lxa|lxb|lxab) ]] ; then
+        cat $file | $SSH $host \
+            $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qsub -notify > $subfile 2>&1 || \
+            ERROR "Job submission failed (${file}__)." 
+    elif [[ $HOST == @(ibis|pikachu) ]] ; then
+      cat $file | $RSH drn01 \
+          SGE_ROOT=$SGE_ROOT $SGE_ROOT/bin/lx24-amd64/qsub -notify > $subfile 2>&1 || \
+          ERROR "Job submission failed (${file}__)." 
+    elif [[ -d $SGE_ROOT ]]; then
+      /usr/local/share/sge_qsub -notify $file > $subfile 2>&1 || \
+          ERROR "Job submission failed (${file}__)." 
+    else
+      cat $file | $SSH drn01 \
+          ${SGE_ROOT:=/usr/local/apps/sge}/bin/lx24-amd64/qsub -notify > $subfile 2>&1 || \
+          cat $file | $SSH drn01 \
+          SGE_ROOT=$SGE_ROOT $SGE_ROOT/bin/lx24-amd64/qsub -notify $file > $subfile 2>&1 || \
+          ERROR "Job submission failed (${file}__)." 
+      
+      # || ERROR "Job submission failed (${file}__)." 
+    fi
+#     sge_qsub -notify $file  > $subfile || ERROR "Job submission failed (${file}__)."
+    ;;
+
+#==========================================================================
+# Submit to other workstation using NQS
+  nqs )
+#==========================================================================
+
+case $last in 
+kill) kill_nqs; exit 0;;
+status) status_nqs; exit 0;;
+esac
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will run the qsub
+#--------------------------------------------------------------------------
+
+cat > ${file}__ <<- EOF
+#!/bin/ksh
+unset WAITQUEUE
+set -e
+EOF
+
+# qsub statement
+echo "/usr/local/share/qsub < ${file}" >> ${file}__
+
+#
+#  Create the real request
+#
+grep -v "QSUB -A" $file | grep -v "QSUB -lh" | grep -v "QSUB -p" | grep -v "QSUB -u" > ${file}__.qsub
+mv -f ${file}__.qsub ${file}
+
+#--------------------------------------------------------------------------
+# Remote shell to $host and submit from there
+#--------------------------------------------------------------------------
+chmod +x ${file}__
+$SSH $host -l $user -n "${file}__" || ERROR "Job submission failed (${file}__)."
+
+sleep 10
+/bin/rm -f ${file}__
+
+  ;;
+#==========================================================================
+# Submit to IBM server using loadleveler
+  ll )
+#==========================================================================
+
+case $last in 
+kill) kill_ll; exit 0;;
+status) status_ll; exit 0;;
+esac
+
+if [[ $jtype == nqs ]] ; then
+  #
+  #  Create the real request
+  #
+  /home/ma/emos/bin/nqs2ll.pl $host $file ${file}__ || ERROR "Conversion nqs2ll.pl failed."
+  if [[ "$uout" != "" ]]; then
+      cat ${file}__ | sed -e "s:# @ output = .*:# @ output = $output:" | \
+          sed -e "s:# @ error .*:# @ error  = $output:" > ${file}
+  else
+      mv -f ${file}__ ${file}
+  fi
+
+elif [[ $jtype != ll ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+#--------------------------------------------------------------------------
+# Remote shell to $host and submit from there
+#--------------------------------------------------------------------------
+
+if [[ $host == @(c2*) ]] ; then
+  # file="/ws$file"
+  if [[ $node_suffix == "" ]] ; then
+    host="${host}-batch"
+  else
+    host="${host}${node_suffix}"
+  fi
+fi
+
+if [[ $(uname -n) == @(ecgb*|vsms*|sms-map) ]]; then
+  $SSH -l $user ${host} \
+      "unset WAITQUEUE ; $LL_ROOT/llsubmit - 2>&1 " < $file > $subfile 2>&1 || \
+      ERROR "Failed to submit job to LoadLeveler. $?" 
+else
+  ecrcmd --timeout=$TIMEOUT < $file $user@$host $LC \
+      "unset WAITQUEUE ; $LL_ROOT/llsubmit -"  > $subfile || \
+      ERROR "Failed to submit job to LoadLeveler."
+fi
+
+  ;;
+
+  slurm ) # swarm linux cluster 
+
+case $last in 
+kill) kill_slurm; exit 0;;
+status) status_slurm; exit 0;;
+esac
+
+# get queue-name, job-name
+if [[ $jtype == nqs ]] ; then
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+  jname=$(grep 'QSUB -r ' $file | cut -d" " -f 4 | head -1)
+
+# srun sinfo 
+  cat > ${file}__ <<- EOF
+#!$RUNSHELL
+#SBATCH --output=${output:-/dev/null}
+#SBATCH --error=${output:=/dev/null}
+#SBATCH --time=01:00:00
+#SBATCH --job-name=${jname}
+#SBATCH --get-user-env
+#SBATCH --uid=$user
+##BATCH --qos=normal # express/long
+$PROFILE
+EOF
+# cp $file  ${file}.pre
+  cat $file | egrep -v '^#.*QSUB -|^:$|^#.*@' | \
+      grep -E -v '(^#.*SBATCH --output.*|#.*SBATCH --error.*|^#.*SBATCH --uid.*|^#.*SBATCH --qos.*)'  >> ${file}__
+  chmod 755 ${file}__
+
+elif [[ $jtype == slurm ]]; then
+
+  cat > ${file}__ <<- EOF
+#!$RUNSHELL
+#SBATCH --output=${output:-/dev/null}
+#SBATCH --error=${output:-/dev/null}
+#SBATCH --time=01:00:00
+#SBATCH --job-name=${jname}
+#SBATCH --get-user-env
+#SBATCH --uid=$user
+##BATCH --qos=normal # express/long
+$PROFILE
+EOF
+# cp $file  ${file}.pre
+  cat $file | egrep -v '^#.*QSUB -|^:$|^#.*@' | \
+      grep -E -v '(^#.*SBATCH --output.*|#.*SBATCH --error.*|^#.*SBATCH --uid.*|^#.*SBATCH --qos.*)'  >> ${file}__
+  chmod 755 ${file}__
+
+elif [[ $jtype == ll ]] ; then 
+  $PROFILE
+  # /usr/local/apps/slurm/utils/bin/ll2slurm
+  ll2slurm -q -i $file -o ${file}__  || ERROR "Job conversion to slurm failed (${file})." 
+elif [[ $jtype != slurm ]]; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will contain the PBS directives
+#--------------------------------------------------------------------------
+  mv ${file}__ $file
+
+  if [[ $hostname == @(ecgb*|ecgate1) ]]; then
+      touch $output
+      $SLURM_ROOT/sbatch < ${file} > $subfile 2>&1 \
+      || ERROR "Job submission failed (${file})." 
+  else
+      $SSH $host -l $user touch $output
+      cat ${file} | $SSH $host -l $user $SLURM_ROOT/sbatch > $subfile 2>&1 \
+          || ERROR "Job submission failed (${file})." 
+  fi
+;;
+#==========================================================================
+# Submit using ssh
+#==========================================================================
+  ssh )
+
+case $last in 
+kill) kill_ssh; exit 0;;
+status) status_ssh; exit 0;;
+esac
+
+  cmd="ssh $user@$host"
+#
+#  Add the header with requested shell
+#
+
+  cat > ${file}__ <<- EOF
+#!$RUNSHELL
+# output=$output
+$PROFILE
+EOF
+
+#
+#  Add the real request removing all qsub statements
+#
+
+if [[ $jtype == ll ]] ; then
+  egrep -v '^#.*@|^#!|^:$' $file >> ${file}__
+elif [[ $jtype == nqs ]] ; then
+  egrep -v '^#.*QSUB|^#!|^:$' $file >> ${file}__
+elif [[ $jtype == slurm ]] ; then
+  egrep -v '^#.*SBATCH|^#!|^:$' $file >> ${file}__
+elif [[ $jtype == pbs ]] ; then
+  egrep -v '^#.*PBS|^#!|^:$' $file >> ${file}__
+fi
+
+#
+#  Submit the job
+#
+$cmd "/usr/local/bin/standalone -o $output -s $RUNSHELL " < ${file}__ || ERROR "Job submission to ssh standalone failed."
+;;
+
+#==========================================================================
+# Submit to any other workstation using rsh standalone or
+# submit to local workstation using standalone
+  rsh | local )
+#==========================================================================
+
+case $last in 
+kill) kill_rsh; exit 0;;
+status) status_rsh; exit 0;;
+esac
+
+if [[ $type == local ]] ; then
+  cmd=""
+elif [[ $hostname == @(ecgb*|vsms*) ]] ; then
+  cmd="$SSH -l $user $host "
+else
+  cmd="rsh $host -l $user "
+fi
+   
+#
+#  Add the header with requested shell
+#
+
+cat > ${file}__ <<- EOF
+#!$RUNSHELL
+# output=$output
+$PROFILE
+EOF
+#
+#  Add the real request removing all qsub statements
+#
+
+if [[ $jtype == ll ]] ; then
+  egrep -v '^#.*@|^#!|^:$' $file >> ${file}__
+
+elif [[ $jtype == nqs ]] ; then
+  egrep -v '^#.*QSUB|^#!|^:$' $file >> ${file}__
+
+elif [[ $jtype == slurm ]] ; then
+  egrep -v '^#.*SBATCH|^#!|^:$' $file >> ${file}__
+
+elif [[ $jtype == pbs ]] ; then
+  egrep -v '^#.*PBS|^#!|^:$' $file >> ${file}__
+
+fi
+
+mv -f ${file}__ $file
+#
+#  Submit the job
+#
+if [[ $type == local ]] ; then
+
+    case $hostname in
+        ecg* | vsms*)  nohup $RUNSHELL -x $file > $output 2>&1 &             ;;
+        *) standalone -o $output -s $RUNSHELL < $file || ERROR "Job submission to standalone failed."
+            ;;
+        esac
+else
+
+    case $hostname in
+        ecg* | vsms*)  # $cmd "nohup $RUNSHELL -x $file > $output 2>&1 &"             
+            $cmd "$STANDALONE -o $output -s $RUNSHELL" < $file  > $subfile || \
+                ERROR "Job submission to rsh standalone failed."
+            ;;
+        *)
+            $cmd "/usr/local/bin/standalone -o $output -s $RUNSHELL" < $file  > $subfile ||\
+                 ERROR "Job submission to rsh standalone failed."
+            ;;
+    esac
+fi
+
+  ;;
+esac
+
+exit 0
+
+ssh-keygen -t dsa
+scp ~/.ssh/id_dsa.pub ecgate:.ssh/authorized_keys2
+ssh-agent sh -c 'ssh-add < /dev/null && bash' 
+
+
+ssh-keygen -t rsa
+ssh server "mkdir .ssh; chmod 0700 .ssh"
+scp .ssh/id_rsa.pub server:.ssh/authorized_keys2
+scp $HOME/.ssh/id_rsa.pub c2a:$HOME/.ssh/authorized_keys2
+scp $HOME/.ssh/id_rsa.pub c2b:$HOME/.ssh/authorized_keys2
+
+cp $HOME/.ssh/id_rsa.pub $HOME/.ssh/authorized_keys2
diff --git a/ecflow_4_0_7/tools/ecf_kill b/ecflow_4_0_7/tools/ecf_kill
new file mode 100755
index 0000000..03fc5bd
--- /dev/null
+++ b/ecflow_4_0_7/tools/ecf_kill
@@ -0,0 +1,243 @@
+#!/bin/ksh
+#==========================================================================
+##.TITLE   EMOS - METAPS utilities
+##.NAME    smskill
+##.SECTION EMOS
+##.AUTHOR  Manuel Fuentes
+##.DATE    2001-11-20
+##.VERSION 1.0
+##.FILE    ~emos/bin/smskill
+##.ORIGIN  wssubmit
+#==========================================================================
+##$  smskill user host
+##
+##?  Decides according to host argument which kill method to use.
+
+# Modifications:
+
+#--------------------------------------------------------------------------
+#  Check the number of arguments
+#--------------------------------------------------------------------------
+export SLURM_ROOT=/usr/local/apps/slurm/current/bin
+RSH=rsh
+type rsh || RSH=ssh
+
+set -x
+
+if [ $# -lt 3 ] ; then
+  echo "usage: $0 <user> <host> <smsid> [ smsjob ]"
+  echo "example: $0 emos leda 12345"
+  echo "example: $0 emos leda 12345 smsjob"
+  exit 1
+fi
+
+user=$1
+host=$2
+smsid=$3
+
+subfile=${4}.sub
+
+#--------------------------------------------------------------------------
+# determine queuing system from hostname
+# (can be replaced by a more refined method later...)
+#--------------------------------------------------------------------------
+
+hostname=$(hostname)
+
+case $host in
+  ha-pp | happ | ha_pp | celeborn | elrond | altariel | frodo | bilbo | belegorn | boromir | denethor | faramir | acq | acq2 | pp1 | pp2 | diss | pp3 | hallas )
+    type=pbs
+    ;;
+  vpp* )    type=vppnqs      ;;
+  icarus )    type=nqs      ;;
+  ecgate1 | ecgb* )         type=slurm;;    
+  ecgate  | ecga* | c2*)    type=ll;;
+  lxa | lxb | lxab )    type=new_linux    ;;  
+  swarm | linux_cluster )    type=swarm      ;;
+  $hostname | localhost )
+    type=local
+    ;;
+  * )
+    type=rsh
+    ;;
+esac
+
+
+case $type in
+#==========================================================================
+# Kill on hp using PBS
+  pbs )
+#==========================================================================
+
+    if [[ -s $subfile ]] ; then
+      tid=`tail -1 $subfile | cut -d\. -f1 `
+      # tid=`tail -1 $subfile | cut -d\. -f1 `
+      # where=`tail -1 $subfile | cut -d\. -f2 `
+      # rsh $where -l $user qsig -s 2 $tid
+      # rsh $where -l $user qdel -W 10 $tid      
+      qsig -s 2 $tid
+      qdel -W 10 $tid
+      
+    elif [[ -s $4 ]] ; then
+      tid=`grep PBS_JOB ${4}.1 | cut -d= -f2`
+      $RSH $host -l $user qsig -s 2 $tid
+      $RSH $host -l $user qdel -W 10 $tid
+      
+    else
+      # Signal the job
+      $RSH $host -l $user qsig -s 2 $smsid
+
+      # Remove the job from PBS (give 10 seconds delay for the above to finish)
+      $RSH $host -l $user qdel -W 10 $smsid
+    fi
+
+  ;;
+#==========================================================================
+# Kill on vpp using NQS
+  vppnqs )
+#==========================================================================
+
+    $RSH $host -l $user qdel -2 $smsid
+  ;;
+#==========================================================================
+# Kill on workstations using NQS
+  nqs )
+#==========================================================================
+
+        $RSH $host -l $user qdel -2 $smsid
+
+  ;;
+#==========================================================================
+# Kill on linux cluster
+#==========================================================================
+  swarm )
+
+    use sge
+    if [[ -s $subfile ]] then
+      tid=`grep " has been submitted" $subfile | cut -f 3 -d" "`
+      sge_qdel $tid
+      if [[ $? = 0 ]] && [[ -d $TMPDIR ]] ; then
+        touch $TMPDIR/kill$$
+        grep "^SMSNODE="  ${subfile%.sub}   > $TMPDIR/kill$$ && \
+        grep "^SMS_PROG=" ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+        grep "^SMSNAME="  ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+        grep "^SMSPASS="  ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+        echo "export SMSNODE SMS_PROG SMSNAME SMSPASS " >> $TMPDIR/kill$$ && \
+        echo "smsabort " >> $TMPDIR/kill$$ && . $TMPDIR/kill$$
+        rm -f $TMPDIR/kill$$
+      fi
+
+    elif [[ -s $4 ]] ; then
+      tid=`grep active_jobs $4 | grep cd | cut -d"." -f 2 | cut -d"/" -f8`
+      sge_qdel $tid
+    else
+      sge_qdel $smsid
+    fi
+
+  ;;
+  new_linux )
+
+  tid=`grep " has been submitted" $subfile | cut -f 3 -d" "`
+  ssh $host /usr/local/apps/sge/sge6_2u5/bin/lx24-amd64/qdel $tid
+
+  ;;
+
+#==========================================================================
+# Kill on workstations using load leveler
+  ll )
+#==========================================================================
+
+ if [[ -s $subfile ]] then
+   tid=`grep " has been submitted." $subfile | cut -d\" -f2`
+   $RSH $host -l $user /usr/lpp/LoadL/full/bin/llcancel $tid
+
+   if [[ $? = 0 ]] && [[ -d $TMPDIR ]] ; then
+    touch $TMPDIR/kill$$
+    grep "^SMSNODE="  ${subfile%.sub}   > $TMPDIR/kill$$ && \
+    grep "^SMS_PROG=" ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+    grep "^SMSNAME="  ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+    grep "^SMSPASS="  ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+    echo "export SMSNODE SMS_PROG SMSNAME SMSPASS " >> $TMPDIR/kill$$ && \
+    echo "smsabort " >> $TMPDIR/kill$$ && . $TMPDIR/kill$$
+    rm -f $TMPDIR/kill$$
+   fi
+
+ else
+
+   if [[ "$host" = hpc* ]] ; then
+     host=`echo $host | cut -c1-4`
+     id=${host}0`echo $smsid % 1000 | bc`.` echo $smsid / 1000 | bc`
+   else
+     id=$smsid
+     if [[ -f $smsid ]] ; then
+       grep "LOADL_STEP_ID=NOT_SET" $subfile && id=`grep JOB_ID= $subfile | cut -d= -f2` && $RSH $host -l user kill -9 $id
+     fi
+   fi
+
+   $RSH $host -l $user /usr/lpp/LoadL/full/bin/llcancel $id
+ fi
+
+  ;;
+
+  slurm )
+#==========================================================================
+
+ if [[ -s $subfile ]] then
+   tid=`grep "Submitted batch job " $subfile | awk '{print $4}'`
+   ssh $host -l $user $SLURM_ROOT/scancel $tid
+
+   if [[ $? = 0 ]] && [[ -d $TMPDIR ]] ; then
+    touch $TMPDIR/kill$$
+    grep "^SMSNODE="  ${subfile%.sub}   > $TMPDIR/kill$$ && \
+    grep "^SMS_PROG=" ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+    grep "^SMSNAME="  ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+    grep "^SMSPASS="  ${subfile%.sub}  >> $TMPDIR/kill$$ && \
+    echo "export SMSNODE SMS_PROG SMSNAME SMSPASS " >> $TMPDIR/kill$$ && \
+    echo "smsabort " >> $TMPDIR/kill$$ && . $TMPDIR/kill$$
+    rm -f $TMPDIR/kill$$
+   fi
+
+ else
+
+     id=$smsid
+     if [[ -f $smsid ]] ; then
+       grep "LOADL_STEP_ID=NOT_SET" $subfile && id=`grep JOB_ID= $subfile | cut -d= -f2` && $RSH $host -l user kill -9 $id
+     fi
+
+   ssh $host -l $user $SLURM_ROOT/scancel $id
+ fi
+
+  ;;
+#==========================================================================
+# Kill on any other workstation using rsh standalone
+  rsh )
+#==========================================================================
+
+# Testing linux platforms
+if [[ $host = "selene" ]]
+then
+    # This doesn't work. COME BACK HERE
+    $RSH $host -l $user /bin/kill -s 2 $smsid
+else
+    # SGI syntax: kill -signal -pgid
+    $RSH $host -l $user kill -15 $smsid
+fi
+
+  ;;
+#==========================================================================
+# Kill on local workstation using standalone
+  local )
+#==========================================================================
+
+    kill -15 $smsid
+    ;;
+
+esac
+#-------------
+#  Sleep a bit
+#-------------
+
+sleep 2
+  
+exit 0
+
diff --git a/ecflow_4_0_7/tools/ecf_status b/ecflow_4_0_7/tools/ecf_status
new file mode 100755
index 0000000..0f5788f
--- /dev/null
+++ b/ecflow_4_0_7/tools/ecf_status
@@ -0,0 +1,209 @@
+#!/bin/ksh
+#==========================================================================
+##.TITLE   EMOS - METAPS utilities
+##.NAME    smsstatus
+##.SECTION EMOS
+##.AUTHOR  Axel Bonet
+##.DATE    2006-02-08
+##.VERSION 1.0
+##.FILE    ~emos/bin/smsstatus
+##.ORIGIN  smskill
+#==========================================================================
+##$  smsstatus user host smsrid smsjob
+##
+##?  Decides according to host argument which stat command to use.
+
+# Modifications:
+
+#--------------------------------------------------------------------------
+#  Check the number of arguments
+#--------------------------------------------------------------------------
+export SLURM_ROOT=/usr/local/apps/slurm/current/bin
+SSH=ssh
+RSH=rsh
+type rsh || RSH=ssh
+
+echo $0 $* ; # echo ; 
+date ; echo
+set -xv
+
+if [ $# -lt 4 ] ; then
+  echo "usage: $0 <user> <host> <smsid> <smsjob>"
+  echo "example: $0 emos leda 12345 smsjob"
+  exit 1
+fi
+
+user=$1
+host=$2
+smsid=$3
+smsjob=$4
+subfile=${smsjob}.sub
+
+#--------------------------------------------------------------------------
+# determine queuing system from hostname
+# (can be replaced by a more refined method later...)
+#--------------------------------------------------------------------------
+
+hostname=$(hostname)
+
+case $host in
+  happ | happ2 | celeborn | elrond | altariel | frodo | bilbo | belegorn | boromir | denethor | faramir | hallas | acq | pp1 | diss | acq2 | pp2 | acq3 | pp3 )
+    type=pbs;;
+  swarm | linux_cluster | lxa | lxb | lxab )    type=swarm;;
+
+  ecgate1 | ecgb* )                             type=slurm;;
+
+  ecgate  | ecga* | c2* )                       type=ll;;
+  $hostname | localhost | diomedes | ariel | osiris | adam | lenny ) 
+  type=local;;
+  datasvc | wedit | indigo | cassini | suse91 | stratos | katana | vali | mordred | ablamor | ibis | lenny )
+        type=ssh;;
+  * )
+    type=rsh
+    ;;
+esac
+
+OK=NOK
+
+case $type in
+#==========================================================================
+  pbs )
+#==========================================================================
+
+    qstat=/usr/local/apps/propbs/bin/qstat
+
+    if [[ -s $subfile ]] ; then
+      tid=$(tail -1 $subfile)
+    elif [[ -s $smsjob ]] ; then
+      tid=$(grep PBS_JOB ${smsjob}.1 | cut -d= -f2)
+    else
+      tid=$smsid
+    fi
+
+    banner "** output ** "
+    $RSH $host -l $user tail -100 /var/spool/PBS/spool/${tid}*
+    banner "** qstat ** "
+    $RSH $host -l $user $qstat -f $tid | grep $user && OK=OK &
+  ;;
+#==========================================================================
+  vppnqs )
+#==========================================================================
+
+    $RSH $host -l $user qstat $smsid  | grep $user && OK=OK &
+  ;;
+#==========================================================================
+  nqs )
+#==========================================================================
+
+    $RSH $host -l $user qstat $smsid  | grep $user && OK=OK &
+    ;;
+
+#==========================================================================
+  swarm | linux_cluster | lxa | lxb | lxab )
+#==========================================================================
+#    use sge
+    task_name=$(basename $smsjob | cut -d\. -f1)
+    if [[ -s $subfile ]] then
+      tid=$(grep "Submitted batch job" $subfile | cut -f 3 -d" ")
+    elif [[ -s $smsjob ]] ; then
+      tid=$(grep active_jobs $smsjob | grep cd | cut -d"." -f 2 | cut -d"/" -f8)
+    else
+      tid=$smsrid
+fi
+
+    printf "==============================================================\n"
+
+    if [[ $host == @(lxa|lxb|lxab) ]] ; then
+        cat $file | ssh $host /usr/local/apps/sge/sge6_2u5/bin/lx24-amd64/qstat -u $user -f  | grep -E "$task_name|$tid" | grep $user && OK=OK
+        cat $file | ssh $host /usr/local/apps/sge/sge6_2u5/bin/lx24-amd64/qstat -j $tid && print "$smsjob is there\n" || print "$smsjob not there ... \n"
+    else
+      qstat -u $user -f  | grep -E "$task_name|$tid" | grep $user && OK=OK
+      qstat -j $tid && print "$smsjob is there\n" || print "$smsjob not there ... \n"
+    fi
+
+    printf "==============================================================\n"
+
+  ;;
+#==========================================================================
+  ll )
+#==========================================================================
+
+ if [[ -s $subfile ]] then
+   tid=$(grep " has been submitted." $subfile | cut -d\" -f2)
+   host=$(echo $tid | cut -d\. -f1)
+   host4=$(echo $host | cut -c1-4)
+
+
+    $RSH $host /usr/lpp/LoadL/full/bin/llq -f %id %jn %o %c %st %nh $tid  | grep $user && OK=OK &
+
+else
+
+   if [[ -s $smsjob ]] ; then
+     host=$(grep HOST= $smsjob | cut -d= -f2)
+   fi
+
+   if [[ "$host" == hpc* ]] ; then
+     host=$(echo $host | cut -c1-4)
+     host4=$(echo $host | cut -c1-4)   
+     id=${host}0$(echo $smsid % 1000 | bc).$(echo $smsid / 1000 | bc)
+   else 
+     id=$host.$smsid
+   fi
+   
+   # rsh $host -l $user /usr/lpp/LoadL/full/bin/llq -x $id && OK=OK &
+   $RSH $host /usr/lpp/LoadL/full/bin/llq -f %id %jn %o %c %st %nh $tid  | grep $user && OK=OK &
+ fi
+  ;;
+#==========================================================================
+  slurm )
+#==========================================================================
+
+        if [[ -s $subfile ]] then
+            tid=$(grep " has been submitted." $subfile | cut -d\" -f2)
+            host=$(echo $tid | cut -d\. -f1)
+            host4=$(echo $host | cut -c1-4)
+        fi
+            
+        if [[ "$hostname" == @(ecgate1|ecgb*) ]] ; then
+            $SLURM_ROOT/squeue | grep " $tid"  | grep $user && OK=OK &
+        else
+            ssh -l $user $host $SLURM_ROOT/squeue | grep " $tid"  | grep $user && OK=OK &
+        fi
+  ;;
+#==========================================================================
+  rsh )
+#==========================================================================
+        
+        if [[ $smsid == 0 ]]; then echo "too early"; exit 0; fi
+        $RSH $host -l $user ps -elf | grep " $user " | grep " $smsid " | grep -v " grep " && OK=OK 2>/dev/null &
+        
+        $RSH $host -l $user ps -sid $smsid -f && OK=OK &
+
+        ;;     
+#==========================================================================
+  local )
+#==========================================================================
+
+    # \ps -U $user -u $user -lf $smsid &
+    if [[ $smsid == 0 ]]; then echo "too early"; exit 0; fi
+    \ps -elf | grep " $user " | grep " $smsid " | grep -v " grep " && OK=OK &
+    \ps -sid $smsid -f && OK=OK &
+    ;;
+
+  esac
+
+set +x
+display_subfile() {
+  if [[ -s $subfile ]]; then # && [[ $OK = NOK ]] ; then
+    ls -la $subfile
+    # echo #    grep "^# +++ hpc" $subfile 
+    cat $subfile
+    # && type=ll
+fi
+}
+
+echo "$0 $* # $tid"
+display_subfile
+# wait
+
+exit 0
diff --git a/ecflow_4_0_7/tools/ecf_submit b/ecflow_4_0_7/tools/ecf_submit
new file mode 100755
index 0000000..f4ee8bb
--- /dev/null
+++ b/ecflow_4_0_7/tools/ecf_submit
@@ -0,0 +1,868 @@
+#!/bin/ksh
+#==========================================================================
+##.TITLE   EMOS - METAPS utilities
+##.NAME    sms_submit
+##.SECTION EMOS
+##.DATE    2005-09-12
+##.VERSION 1.0
+#==========================================================================
+
+##$  sms_submit user host file
+##
+##?  Decides according to host argument which submit method to use.
+
+# Modifications:
+
+# Error handling and cleanup
+export SGE_ROOT=/usr/local/apps/sge
+export SLURM_ROOT=/usr/local/apps/slurm/current/bin
+export LL_ROOT=/usr/lpp/LoadL/full/bin
+STANDALONE=/usr/local/apps/sms/bin/standalone
+RUNSHELL=/bin/ksh 
+TIMEOUT=300  # timeout period (seconds)
+SSH="ssh -o ConnectTimeout=$TIMEOUT -o BatchMode=yes -o StrictHostKeyChecking=no "
+RSH=rsh
+PROFILE=". $HOME/.profile"
+type rsh > /dev/null || RSH=$SSH
+
+#--------------------------------------------------------------------------
+#  Parameters for ecrcmd
+#--------------------------------------------------------------------------
+
+SSH="ssh -o ConnectTimeout=$TIMEOUT -o BatchMode=yes -o StrictHostKeyChecking=no "
+
+ERROR() { 
+  err=$?
+  echo "ERROR $0: $* $? - Exiting."
+  # CP_SUB
+
+  [[ -f $subfile ]] && grep "has been submitted" $subfile && exit 0
+  [[ -f $subfile ]] && grep "Submitted batch job" $subfile && exit 0
+# Unable to run job: failed receiving gdi request # TBD OK
+  cat $subfile
+  exit $err
+}
+
+kill_submitted_and_abort() {
+    # not used while not deterministic: job may run in betweem and 
+    # become a zombie 
+    outf=$TMPDIR/kill$$
+    if [[ $? == 0 ]] && [[ -d $TMPDIR ]] ; then
+        touch $outf
+        grep "ECF_NODE="  ${subfile%.sub}   > $outf && \
+            grep "ECF_PORT=" ${subfile%.sub}  >> $outf && \
+            grep "ECF_NAME="  ${subfile%.sub}  >> $outf && \
+            grep "ECF_PASS="  ${subfile%.sub}  >> $outf && \
+            echo "export ECF_NODE ECF_PORT ECF_NAME ECF_PASS" >>$outf &&\
+            echo "ecflow_client --abort || :" >> $outf && . $outf
+        grep "^SMSNODE="  ${subfile%.sub}   > $outf && \
+            grep "^SMS_PROG=" ${subfile%.sub}  >> $outf && \
+            grep "^SMSNAME="  ${subfile%.sub}  >> $outf && \
+            grep "^SMSPASS="  ${subfile%.sub}  >> $outf && \
+            echo "export SMSNODE SMS_PROG SMSNAME SMSPASS " >> $outf && \
+            echo "smsabort || :" >> $outf && . $outf
+        ksh -x $outf
+        rm -f $outf
+    fi
+}
+
+kill_nqs() {
+    if [[ -s $subfile ]] ; then
+      tid=$(tail -1 $subfile | cut -d\. -f1 )
+      # tid=`tail -1 $subfile | cut -d\. -f1 `
+      # where=`tail -1 $subfile | cut -d\. -f2 `
+      $RSH $host -l $user qsig -s 2 $tid || qsig -s 2 $tid
+      $RSH $host -l $user qdel -W 10 $tid || qdel -W 10 $tid
+      
+    elif [[ -s $4 ]] ; then
+      tid=$(grep PBS_JOB ${4}.1 | cut -d= -f2)
+      $RSH $host -l $user qsig -s 2 $tid
+      $RSH $host -l $user qdel -W 10 $tid
+      
+    else
+      # Signal the job
+      $RSH $host -l $user qsig -s 2 $smsid
+
+      # Remove the job from PBS (give 10 ssmeconds delay for the above to finish)
+      $RSH $host -l $user qdel -W 10 $smsid
+    fi
+}
+
+kill_vpp() {
+    $RSH $host -l $user qdel -2 $smsid
+}
+
+kill_nqs() {
+    $RSH $host -l $user qdel -2 $smsid
+}
+
+kill_sge() {
+    use sge || :
+    QDEL=sge_qdel
+    type $QDEL || QDEL="ssh $host $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qdel"
+    if [[ -s $subfile ]] then
+      tid=$(grep " has been submitted" $subfile | cut -f 3 -d" ")
+      $QDEL $tid
+    elif [[ -s $4 ]] ; then
+      tid=$(grep active_jobs $4 | grep cd | cut -d"." -f 2 | cut -d"/" -f8)
+      $QDEL $tid
+    else
+      $QDEL $smsid
+    fi
+}
+
+kill_new_linux() {
+  tid=$(grep " has been submitted" $subfile | cut -f 3 -d" ")
+  $SSH $host -l $user $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qdel $tid
+}
+
+kill_ll() {
+ if [[ -s $subfile ]] then
+   tid=$(grep " has been submitted." $subfile | cut -d\" -f2)
+   $RSH $host -l $user $LL_ROOT/llcancel $tid
+ else
+
+   if [[ "$host" == hpc* ]] ; then
+     host=$(echo $host | cut -c1-4)
+     id=${host}0$(echo $smsid % 1000 | bc).$(echo $smsid / 1000 | bc)
+   else
+       id=$smsid
+       if [[ -f $smsid ]] ; then
+           grep "LOADL_STEP_ID=NOT_SET" $subfile && \
+               id=$(grep JOB_ID= $subfile | cut -d= -f2) && \
+               $RSH $host -l user kill -9 $id
+       fi
+   fi
+
+   $RSH $host -l $user $LL_ROOT/llcancel $id
+ fi
+}
+
+kill_slurm() {
+ if [[ -s $subfile ]] then
+   tid=$(grep "Submitted batch job " $subfile | awk '{print $4}')
+   $SSH $host -l $user $SLURM_ROOT/scancel $tid
+ else
+     id=$smsid
+     if [[ -f $smsid ]] ; then
+         grep "LOADL_STEP_ID=NOT_SET" $subfile && id=$(grep JOB_ID= $subfile | \
+             cut -d= -f2) && \
+             $SSH $host -l $user kill -9 $id
+     fi
+     
+     $SSH $host -l $user $SLURM_ROOT/scancel $id
+ fi
+}
+
+kill_rsh() {
+    $RSH $host -l $user /bin/kill -2 $smsid
+    # SGI syntax: kill -signal -pgid
+    $RSH $host -l $user kill -15 $smsid || kill -15 $smsid
+}
+
+status_pbs() {
+
+    qstat=/usr/local/apps/propbs/bin/qstat
+
+    if [[ -s $subfile ]] ; then
+        display_subfile
+      tid=$(tail -1 $subfile)
+    elif [[ -s $smsjob ]] ; then
+      tid=$(grep PBS_JOB ${smsjob}.1 | cut -d= -f2)
+    else
+      tid=$smsid
+    fi
+
+    banner "** output ** "
+    $RSH $host -l $user tail -100 /var/spool/PBS/spool/${tid}* &
+    wait
+    banner "** qstat ** "
+    $RSH $host -l $user $qstat -f $tid | grep $user && OK=OK &
+
+}
+
+status_vpp() {
+    $RSH $host -l $user qstat $smsid  | grep $user && OK=OK &
+}
+
+status_nqs() {
+    $RSH $host -l $user qstat $smsid  | grep $user && OK=OK &
+}
+
+status_swarm() {
+#    use sge
+    task_name=$(basename $smsjob | cut -d\. -f1)
+    if [[ -s $subfile ]] then
+        display_subfile
+      tid=$(grep " has been submitted" $subfile | cut -f 3 -d" ")
+    elif [[ -s $smsjob ]] ; then
+      tid=$(grep active_jobs $smsjob | grep cd | cut -d"." -f 2 | cut -d"/" -f8)
+    else
+      tid=$smsrid
+    fi
+
+    printf "==============================================================\n"
+    if [[ $host == @(lxa|lxb|lxab) ]] ; then
+        cat $file | $SSH $host $SGR_ROOT/sge6_2u5/bin/lx24-amd64/qstat -u $user -f  | \
+            grep -E "$task_name|$tid" | grep $user && OK=OK
+        cat $file | $SSH $host $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qstat -j $tid && \
+            print "$smsjob is there\n" || print "$smsjob not there ... \n"
+    else
+        qstat -u $user -f  | grep -E "$task_name|$tid" | grep $user && OK=OK
+        qstat -j $tid && print "$smsjob is there\n" || print "$smsjob not there ... \n"
+    fi
+    printf "==============================================================\n"
+}
+
+status_new_linux() {
+    status_swarm
+}
+
+status_ll() {
+    if [[ -s $subfile ]] then
+        tid=$(grep " has been submitted." $subfile | cut -d\" -f2)
+        host=$(echo $tid | cut -d\. -f1)
+        host4=$(echo $host | cut -c1-4)
+               
+        $RSH $host $LL_ROOT/llq -f %id %jn %o %c %st %nh $tid  | grep $user && OK=OK &
+
+    else
+        
+        if [[ -s $smsjob ]] ; then
+            host=$(grep HOST= $smsjob | cut -d= -f2)
+        fi
+        
+        if [[ "$host" == hpc* ]] ; then
+            host=$(echo $host | cut -c1-4)
+            host4=$(echo $host | cut -c1-4)
+            id=${host}0$(echo $smsid % 1000 | bc).$( echo $smsid / 1000 | bc)
+        else 
+            id=$host.$smsid
+        fi
+        
+        $RSH $host $LL_ROOT/llq -f %id %jn %o %c %st %nh $tid  | grep $user
+    fi
+}
+
+status_slurm() {
+ if [[ -s $subfile ]] then
+     display_subfile
+   tid=$(grep "Submitted batch job" $subfile | cut -d' ' -f4)
+   $SSH -l $user $host $SLURM_ROOT/scontrol show job -d $tid
+   $SSH -l $user $host $SLURM_ROOT/squeue | grep $user | grep " $tid"
+ elif [[ $host != $hostname ]] ; then
+     $SSH -l $user $host "$0 $user $host $file $uout $smsid status"
+ fi
+}
+
+status_rsh() {
+    if [[ $smsid == 0 ]]; then echo "too early"; exit 0; fi
+    $RSH $host -l $user ps -elf | grep " $user " | grep " $smsid " | grep -v " grep " && \
+        $RSH $host -l $user ps --sid $smsid -f 
+
+    \ps -elf | grep " $user " | grep " $smsid " | grep -v " grep " && OK=OK &
+    \ps --sid $smsid -f && OK=OK &   
+}
+
+disp_subfile() {
+  if [[ -s $subfile ]]; then # && [[ $OK = NOK ]] ; then
+    ls -la $subfile
+    # echo #    grep "^# +++ hpc" $subfile 
+    cat $subfile
+    # && type=ll
+fi
+}
+
+#--------------------------------------------------------------------------
+#  Check the number of arguments
+#--------------------------------------------------------------------------
+
+set -x
+echo $0 $*
+
+if [ $# -lt 3 ] ; then
+  echo
+  echo "usage: $0 <user> <host> file remote_output [node_suffix]"
+  echo
+  echo "example: $0 uid ecgate task.job1"
+  echo "while node_suffix is empty, host-batch node is the target, "
+  echo "      else \$node\$nodesuffix is the replacement target"
+  echo  
+  exit 1
+fi
+
+set -x
+
+user=$1
+host=$2
+file=$3
+uout=$4
+node_suffix=$5
+smsid=$5
+
+for last; do true; done # last shall be submit status kill only
+case $last in
+submit | status |  kill ) echo;;
+*) last="submit" ;;
+esac
+
+subfile=${file}.sub
+
+#--------------------------------------------------------------------------
+# determine queuing system from hostname
+# (can be replaced by a more refined method later...)
+#--------------------------------------------------------------------------
+
+hostname=$(hostname)
+
+case $host in
+    bilbo | belegorn | boromir | denethor | faramir | acq | pp1 | diss) type=pbs;;
+    vpp* )    type=vppnqs;;
+    swarm | linux_cluster | lxa | lxb | lxab )    type=sge_qsub;;
+    ecgate1 | ecgb* | ecgt* ) type=slurm;;
+    ecgate  | ecga* | c2* )   type=ll;;
+    $hostname | localhost )   type=local;;
+    datasvc)                  type=ssh;;
+    * )                       type=rsh;;
+esac
+
+# if [[ $type = "local" ]] && [[ $hostname = @(ecg*|vsms*) ]]; then type=ssh; fi
+
+#--------------------------------------------------------------------------
+# determine job file type and output directory
+#--------------------------------------------------------------------------
+
+output=""
+if egrep -i "^#.*QSUB " $file > /dev/null ; then
+  jtype=nqs
+  output=$(egrep -i "^#.*QSUB -o" $file | cut -d" " -f 4 | head -1)
+
+elif egrep -i "^#.*@.*queue" $file > /dev/null ; then
+  jtype=ll
+  output=$(egrep -i "^#.*@.*output" $file | cut -d"=" -f 2 | head -1)
+
+elif [[ $host == @(ecgb*|ecgt0*|ecgate1) ]] ; then
+  jtype=slurm
+  output=$(egrep -i "^#.*-o" $file | cut -d" " -f 3 | head -1)
+
+elif egrep -i "^#.*PBS " $file > /dev/null ; then
+  jtype=pbs
+
+elif egrep -i "^#.*SBATCH " $file > /dev/null ; then
+  jtype=slurm
+  output=$(egrep -i "^#.*-o" $file | cut -d" " -f 3 | head -1)
+  if [[ output == "" ]]; then
+    output=$(egrep -i "^#.*-output" $file | cut -d" " -f 3 | head -1)
+  fi
+  if [[ output == "" ]]; then output=$uout; fi
+  if [[ output != "" ]]; then
+    head -1 $output && grep "#!/" && RUNSHELL=$(head -1 $output | cut -d! -f2)
+  else 
+    RUNSHELL="/bin/bash"
+  fi
+  case $RUNSHELL in
+    *tcsh) PROFILE=". $HOME/.tcshrc";;
+    *csh) PROFILE=". $HOME/.cshrc";;
+  esac
+elif [[ $host == @(linux_cluster|lxa|lxb|lxab|swarm) ]] ; then
+  jtype=sge_qsub
+  output=$(egrep -i "^#.*-o" $file | cut -d" " -f 3 | head -1)
+
+else
+  jtype=sh
+
+fi
+
+case $last in
+submit)
+#--------------------------------------------------------------------------
+#  File must exist!
+#--------------------------------------------------------------------------
+
+if [[ ! -f $file ]] ; then
+  echo "$0: File $file not found?"
+  exit 1
+fi
+
+chmod 755 $file
+
+if [[ "$uout" != "" ]]; then output=$uout; mkdir -p $(dirname $uout); fi
+if [[ $output == *0.0 ]]; then echo "filename error $output"; exit 1; fi
+cp $file ${file}.pre
+# mailx -s "o:$output uo:$uout" $USER < /dev/null; exit 0
+
+LC="-c "
+if egrep -qi "^[[:space:]]*#[[:space:]]*@[[:space:]]*environment[[:space:]]*=" $file > /dev/null
+then
+  LC="-lc "
+fi
+
+[[ "$output" == "" ]] || outputdir=$(dirname $output)
+if [[ "$outputdir" != "" ]] ; then 
+#--------------------------------------------------------------------------
+#  Create the output directory if it can be found
+#--------------------------------------------------------------------------
+if [[ ! -d $outputdir ]] ; then
+  # don't worry anymore about output directory
+  $RSH $host -l $user mkdir -m 775 -p $outputdir || \
+      mkdir -m 775 -p $outputdir || /bin/true
+fi
+fi
+;;
+esac
+
+case $type in
+#==========================================================================
+# Submit to hp using PBS
+  pbs )
+#==========================================================================
+
+case $last in 
+kill) kill_pbs; exit 0;;
+status) status_pbs; exit 0;;
+esac
+
+# get queue-name, job-name
+if [[ $jtype == nqs ]] ; then
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+  jname=$(grep 'QSUB -r ' $file | cut -d" " -f 4 | head -1)
+
+elif [[ $jtype == ll ]] ; then
+  queue=$(egrep '^#.*@.*class.*=' $file | cut -d"=" -f 2 | head -1)
+  jname=$(egrep '^#.*@.*job_name.*=' $file | cut -d"=" -f 2 | head -1)
+
+elif [[ $jtype != pbs ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will contain the PBS directives
+#--------------------------------------------------------------------------
+
+if [[ $jtype != pbs ]] ; then
+
+cat > ${file}__ <<- EOF
+#!$RUNSHELL
+if [[ -f $HOME/.profile ]]; then
+$PROFILE
+fi
+#PBS -S /bin/ksh
+#PBS -N $jname
+#PBS -V
+#PBS -o /dev/null
+#PBS -e /dev/null
+#PBS -j oe
+#PBS -u $user
+#PBS -q $queue
+EOF
+
+  egrep -v '^#.*QSUB -|^:$|^#.*@' $file >> ${file}__
+
+  mv -f ${file}__ ${file}
+
+fi
+#--------------------------------------------------------------------------
+# Remote shell to $host and submit from there
+#--------------------------------------------------------------------------
+
+#rsh $host -l $user /usr/local/apps/propbs/bin/pbsqsub < $file || ERROR "Failed to submit job to PBS (possible failure of rsh)."
+
+if [[ $(uname -n) == @(ecgb*|vsms*|sms-map) ]]; then
+  $SSH -l $user $host /usr/local/apps/propbs/bin/pbsqsub -f $file > $subfile 2>&1 || \
+      ERROR "Failed to submit job to PBS. " 
+else
+    ecrcmd --timeout=$TIMEOUT < $file $user@$host $LC \
+        /usr/local/apps/propbs/bin/pbsqsub -f $file > $subfile || \
+        ERROR "Failed to submit job to PBS." 
+fi
+
+  ;;
+#==========================================================================
+# Submit to vpp using NQS
+  vppnqs )
+#==========================================================================
+
+case $last in 
+kill) kill_vpp; exit 0;;
+status) status_vpp; exit 0;;
+esac
+
+if [[ $jtype == ll ]] ; then
+  /home/ma/emos/bin/ll2nqs.pl $file ${file}__ || ERROR "Conversion ll2nqs.pl failed."
+  mv -f ${file}__ $file
+
+elif [[ $jtype != nqs ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+
+else
+  grep -v "QSUB -p" $file | grep -v "QSUB -lh" > ${file}__
+  mv -f ${file}__ $file
+fi
+  
+#--------------------------------------------------------------------------
+#  Send the file using qsub
+#  If send failed, sleep a while and try again, until maximum number of
+#  tries.
+#--------------------------------------------------------------------------
+
+$SSH $host -l $user /usr/local/bin/vppqsub < $file | grep -i submitted  > $subfile || \
+  ERROR "Failed to submit $file."
+
+  ;;
+#==========================================================================
+  sge_qsub ) # swarm linux cluster 
+
+case $last in 
+kill) kill_sge; exit 0;;
+status) status_sge; exit 0;;
+esac
+
+# get queue-name, job-name
+if [[ $jtype == nqs ]] ; then
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+  jname=$(grep 'QSUB -r ' $file | cut -d" " -f 4 | head -1)
+
+elif [[ $jtype == ll ]] ; then
+  queue=$(egrep '^#.*@.*class.*=' $file | cut -d"=" -f 2 | head -1)
+  jname=$(egrep '^#.*@.*job_name.*=' $file | cut -d"=" -f 2 | head -1)
+
+elif [[ $jtype != sge_qsub ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will contain the PBS directives
+#--------------------------------------------------------------------------
+
+# if [[ $jtype != sge_qsub ]] ; then
+
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+
+cat > ${file}__ <<- EOF
+#\$ -S /home/ma/emos/bin/ksh
+#\$ -N ${jname}
+#\$ -V
+#\$ -o $output
+#\$ -j y
+#\$ -u $user
+#\$ -q $queue
+EOF
+
+  egrep -v '^#.*QSUB -|^:$|^#.*@' $file >> ${file}__
+  chmod 755 ${file}__
+  mv -f ${file}__ ${file}
+
+# fi
+
+    mkdir -m 775 -p $outputdir || /bin/true
+    if [[ $host == @(lxa|lxb|lxab) ]] ; then
+        cat $file | $SSH $host \
+            $SGE_ROOT/sge6_2u5/bin/lx24-amd64/qsub -notify > $subfile 2>&1 || \
+            ERROR "Job submission failed (${file}__)." 
+    elif [[ $HOST == @(ibis|pikachu) ]] ; then
+      cat $file | $RSH drn01 \
+          SGE_ROOT=$SGE_ROOT $SGE_ROOT/bin/lx24-amd64/qsub -notify > $subfile 2>&1 || \
+          ERROR "Job submission failed (${file}__)." 
+    elif [[ -d $SGE_ROOT ]]; then
+      /usr/local/share/sge_qsub -notify $file > $subfile 2>&1 || \
+          ERROR "Job submission failed (${file}__)." 
+    else
+      cat $file | $SSH drn01 \
+          ${SGE_ROOT:=/usr/local/apps/sge}/bin/lx24-amd64/qsub -notify > $subfile 2>&1 || \
+          cat $file | $SSH drn01 \
+          SGE_ROOT=$SGE_ROOT $SGE_ROOT/bin/lx24-amd64/qsub -notify $file > $subfile 2>&1 || \
+          ERROR "Job submission failed (${file}__)." 
+      
+      # || ERROR "Job submission failed (${file}__)." 
+    fi
+#     sge_qsub -notify $file  > $subfile || ERROR "Job submission failed (${file}__)."
+    ;;
+
+#==========================================================================
+# Submit to other workstation using NQS
+  nqs )
+#==========================================================================
+
+case $last in 
+kill) kill_nqs; exit 0;;
+status) status_nqs; exit 0;;
+esac
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will run the qsub
+#--------------------------------------------------------------------------
+
+cat > ${file}__ <<- EOF
+#!/bin/ksh
+unset WAITQUEUE
+set -e
+EOF
+
+# qsub statement
+echo "/usr/local/share/qsub < ${file}" >> ${file}__
+
+#
+#  Create the real request
+#
+grep -v "QSUB -A" $file | grep -v "QSUB -lh" | grep -v "QSUB -p" | grep -v "QSUB -u" > ${file}__.qsub
+mv -f ${file}__.qsub ${file}
+
+#--------------------------------------------------------------------------
+# Remote shell to $host and submit from there
+#--------------------------------------------------------------------------
+chmod +x ${file}__
+$SSH $host -l $user -n "${file}__" || ERROR "Job submission failed (${file}__)."
+
+sleep 10
+/bin/rm -f ${file}__
+
+  ;;
+#==========================================================================
+# Submit to IBM server using loadleveler
+  ll )
+#==========================================================================
+
+case $last in 
+kill) kill_ll; exit 0;;
+status) status_ll; exit 0;;
+esac
+
+if [[ $jtype == nqs ]] ; then
+  #
+  #  Create the real request
+  #
+  /home/ma/emos/bin/nqs2ll.pl $host $file ${file}__ || ERROR "Conversion nqs2ll.pl failed."
+  if [[ "$uout" != "" ]]; then
+      cat ${file}__ | sed -e "s:# @ output = .*:# @ output = $output:" | \
+          sed -e "s:# @ error .*:# @ error  = $output:" > ${file}
+  else
+      mv -f ${file}__ ${file}
+  fi
+
+elif [[ $jtype != ll ]] ; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+#--------------------------------------------------------------------------
+# Remote shell to $host and submit from there
+#--------------------------------------------------------------------------
+
+if [[ $host == @(c2*) ]] ; then
+  # file="/ws$file"
+  if [[ $node_suffix == "" ]] ; then
+    host="${host}-batch"
+  else
+    host="${host}${node_suffix}"
+  fi
+fi
+
+if [[ $(uname -n) == @(ecgb*|vsms*|sms-map) ]]; then
+  $SSH -l $user ${host} \
+      "unset WAITQUEUE ; $LL_ROOT/llsubmit - 2>&1 " < $file > $subfile 2>&1 || \
+      ERROR "Failed to submit job to LoadLeveler. $?" 
+else
+  ecrcmd --timeout=$TIMEOUT < $file $user@$host $LC \
+      "unset WAITQUEUE ; $LL_ROOT/llsubmit -"  > $subfile || \
+      ERROR "Failed to submit job to LoadLeveler."
+fi
+
+  ;;
+
+  slurm ) # swarm linux cluster 
+
+case $last in 
+kill) kill_slurm; exit 0;;
+status) status_slurm; exit 0;;
+esac
+
+# get queue-name, job-name
+if [[ $jtype == nqs ]] ; then
+  queue=$(grep 'QSUB -q ' $file | cut -d" " -f 4 | head -1)
+  jname=$(grep 'QSUB -r ' $file | cut -d" " -f 4 | head -1)
+
+# srun sinfo 
+  cat > ${file}__ <<- EOF
+#!$RUNSHELL
+#SBATCH --output=${output:-/dev/null}
+#SBATCH --error=${output:=/dev/null}
+#SBATCH --time=01:00:00
+#SBATCH --job-name=${jname}
+#SBATCH --get-user-env
+#SBATCH --uid=$user
+##BATCH --qos=normal # express/long
+$PROFILE
+EOF
+# cp $file  ${file}.pre
+  cat $file | egrep -v '^#.*QSUB -|^:$|^#.*@' | \
+      grep -E -v '(^#.*SBATCH --output.*|#.*SBATCH --error.*|^#.*SBATCH --uid.*|^#.*SBATCH --qos.*)'  >> ${file}__
+  chmod 755 ${file}__
+
+elif [[ $jtype == slurm ]]; then
+
+  cat > ${file}__ <<- EOF
+#!$RUNSHELL
+#SBATCH --output=${output:-/dev/null}
+#SBATCH --error=${output:-/dev/null}
+#SBATCH --time=01:00:00
+#SBATCH --job-name=${jname}
+#SBATCH --get-user-env
+#SBATCH --uid=$user
+##BATCH --qos=normal # express/long
+$PROFILE
+EOF
+# cp $file  ${file}.pre
+  cat $file | egrep -v '^#.*QSUB -|^:$|^#.*@' | \
+      grep -E -v '(^#.*SBATCH --output.*|#.*SBATCH --error.*|^#.*SBATCH --uid.*|^#.*SBATCH --qos.*)'  >> ${file}__
+  chmod 755 ${file}__
+
+elif [[ $jtype == ll ]] ; then 
+  $PROFILE
+  # /usr/local/apps/slurm/utils/bin/ll2slurm
+  ll2slurm -q -i $file -o ${file}__  || ERROR "Job conversion to slurm failed (${file})." 
+elif [[ $jtype != slurm ]]; then
+  ERROR "No conversion available for these types ($jtype -> $type)."
+fi
+
+#--------------------------------------------------------------------------
+#  Create the script (${file}__) that will contain the PBS directives
+#--------------------------------------------------------------------------
+  mv ${file}__ $file
+
+  if [[ $hostname == @(ecgb*|ecgate1) ]]; then
+      touch $output
+      $SLURM_ROOT/sbatch < ${file} > $subfile 2>&1 \
+      || ERROR "Job submission failed (${file})." 
+  else
+      $SSH $host -l $user touch $output
+      cat ${file} | $SSH $host -l $user $SLURM_ROOT/sbatch > $subfile 2>&1 \
+          || ERROR "Job submission failed (${file})." 
+  fi
+;;
+#==========================================================================
+# Submit using ssh
+#==========================================================================
+  ssh )
+
+case $last in 
+kill) kill_ssh; exit 0;;
+status) status_ssh; exit 0;;
+esac
+
+  cmd="ssh $user@$host"
+#
+#  Add the header with requested shell
+#
+
+  cat > ${file}__ <<- EOF
+#!$RUNSHELL
+# output=$output
+$PROFILE
+EOF
+
+#
+#  Add the real request removing all qsub statements
+#
+
+if [[ $jtype == ll ]] ; then
+  egrep -v '^#.*@|^#!|^:$' $file >> ${file}__
+elif [[ $jtype == nqs ]] ; then
+  egrep -v '^#.*QSUB|^#!|^:$' $file >> ${file}__
+elif [[ $jtype == slurm ]] ; then
+  egrep -v '^#.*SBATCH|^#!|^:$' $file >> ${file}__
+elif [[ $jtype == pbs ]] ; then
+  egrep -v '^#.*PBS|^#!|^:$' $file >> ${file}__
+fi
+
+#
+#  Submit the job
+#
+$cmd "/usr/local/bin/standalone -o $output -s $RUNSHELL " < ${file}__ || ERROR "Job submission to ssh standalone failed."
+;;
+
+#==========================================================================
+# Submit to any other workstation using rsh standalone or
+# submit to local workstation using standalone
+  rsh | local )
+#==========================================================================
+
+case $last in 
+kill) kill_rsh; exit 0;;
+status) status_rsh; exit 0;;
+esac
+
+if [[ $type == local ]] ; then
+  cmd=""
+elif [[ $hostname == @(ecgb*|vsms*) ]] ; then
+  cmd="$SSH -l $user $host "
+else
+  cmd="rsh $host -l $user "
+fi
+   
+#
+#  Add the header with requested shell
+#
+
+cat > ${file}__ <<- EOF
+#!$RUNSHELL
+# output=$output
+$PROFILE
+EOF
+#
+#  Add the real request removing all qsub statements
+#
+
+if [[ $jtype == ll ]] ; then
+  egrep -v '^#.*@|^#!|^:$' $file >> ${file}__
+
+elif [[ $jtype == nqs ]] ; then
+  egrep -v '^#.*QSUB|^#!|^:$' $file >> ${file}__
+
+elif [[ $jtype == slurm ]] ; then
+  egrep -v '^#.*SBATCH|^#!|^:$' $file >> ${file}__
+
+elif [[ $jtype == pbs ]] ; then
+  egrep -v '^#.*PBS|^#!|^:$' $file >> ${file}__
+
+fi
+
+mv -f ${file}__ $file
+#
+#  Submit the job
+#
+if [[ $type == local ]] ; then
+
+    case $hostname in
+        ecg* | vsms*)  nohup $RUNSHELL -x $file > $output 2>&1 &             ;;
+        *) standalone -o $output -s $RUNSHELL < $file || ERROR "Job submission to standalone failed."
+            ;;
+        esac
+else
+
+    case $hostname in
+        ecg* | vsms*)  # $cmd "nohup $RUNSHELL -x $file > $output 2>&1 &"             
+            $cmd "$STANDALONE -o $output -s $RUNSHELL" < $file  > $subfile || \
+                ERROR "Job submission to rsh standalone failed."
+            ;;
+        *)
+            $cmd "/usr/local/bin/standalone -o $output -s $RUNSHELL" < $file  > $subfile ||\
+                 ERROR "Job submission to rsh standalone failed."
+            ;;
+    esac
+fi
+
+  ;;
+esac
+
+exit 0
+
+ssh-keygen -t dsa
+scp ~/.ssh/id_dsa.pub ecgate:.ssh/authorized_keys2
+ssh-agent sh -c 'ssh-add < /dev/null && bash' 
+
+
+ssh-keygen -t rsa
+ssh server "mkdir .ssh; chmod 0700 .ssh"
+scp .ssh/id_rsa.pub server:.ssh/authorized_keys2
+scp $HOME/.ssh/id_rsa.pub c2a:$HOME/.ssh/authorized_keys2
+scp $HOME/.ssh/id_rsa.pub c2b:$HOME/.ssh/authorized_keys2
+
+cp $HOME/.ssh/id_rsa.pub $HOME/.ssh/authorized_keys2
diff --git a/ecflow_4_0_7/tools/ecflow_logsvr.pl b/ecflow_4_0_7/tools/ecflow_logsvr.pl
new file mode 100644
index 0000000..f412775
Binary files /dev/null and b/ecflow_4_0_7/tools/ecflow_logsvr.pl differ
diff --git a/ecflow_4_0_7/tools/ecflow_logsvr.sh b/ecflow_4_0_7/tools/ecflow_logsvr.sh
new file mode 100644
index 0000000..02b15b1
--- /dev/null
+++ b/ecflow_4_0_7/tools/ecflow_logsvr.sh
@@ -0,0 +1,51 @@
+#!/bin/ksh
+
+if [[ $# -ge 2 ]] ; then
+    echo ecflow_logsvr.sh port
+    exit -1
+fi
+
+echo "logsvr pid $$"
+
+HOST=`hostname | cut -c 1-4`
+
+# LOGPORT=${1:-9318}
+LOGPORT=${1:-9316}
+USERS="$USER"
+
+if [[ $HOST = hpc* ]] ; then
+  LOGPATH=/$HOST/emos_dir:/emos_esuite:/emos_dir
+  LOGMAP=/emos_esuite:/emos_esuite:/vol/emos/output:/emos_esuite:/vol/emos/output:/$MACHINE_NAME/emos_dir:/$MACHINE_NAME/emos_dir:/$MACHINE_NAME/emos_dir:/emos_esuite:/emos_esuite:/vol/emos/output:/emos_dir:/emos_dir:/emos_dir
+  log=/$HOST/tmp/ma/emos/logsvr.log
+else
+# HP
+  LOGPATH=/tmp/output:/pp2/log:/acq2/log:/eacq1/log:/eacq2/log
+  LOGMAP=/pp2/log:/pp2/log:/acq2/log:/acq2/log:/eacq1/log:/eacq1/log:/eacq2/log:/eacq2/log
+  log=/sms/logsvr.log
+fi
+
+if [[ -x /usr/local/lib/metaps/perl/logsvr.pl ]] ; then
+    LOGSVR=/usr/local/lib/metaps/perl/logsvr.pl
+elif [[ -x /usr/local/apps/sms/bin/logsvr.pl ]] ; then
+    LOGSVR=/usr/local/apps/sms/bin/logsvr.pl
+elif [[ -x $HOME/bin/logsvr.pl ]] ; then
+    LOGSVR=$HOME/bin/logsvr.pl
+elif [[ -x /sms/bin/logsvr.pl ]] ; then
+  LOGSVR=/sms/bin/logsvr.pl
+elif [[ -x ./logsvr.pl ]] ; then
+  LOGSVR=`pwd`/logsvr.pl
+else
+    echo "logsvr.pl not found in expected location"
+fi
+
+echo "using: $LOGSVR"
+export LOGPORT LOGPATH LOGMAP
+n=0
+while [[ $n -lt 1 ]]
+do
+	$LOGSVR > $log 2>&1 &
+        echo "logsvr pid $!"
+        wait
+	tail $log | mail -s "logsvr.pl crashed" $USERS
+        sleep 10
+done
diff --git a/ecflow_4_0_7/tools/ecflow_start.sh b/ecflow_4_0_7/tools/ecflow_start.sh
new file mode 100755
index 0000000..0e1616e
--- /dev/null
+++ b/ecflow_4_0_7/tools/ecflow_start.sh
@@ -0,0 +1,283 @@
+#!/bin/sh
+#set -x
+#set -u
+#==========================================================================
+##.TITLE   ECMWF utility for ECFLOW
+##.NAME    ecf_start
+##.SECTION ECF
+##.AUTHOR  Avi
+## Revision    : $Revision: #19 $ 
+##
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+##
+##.FILE    ecflow_start. 
+###        Will start the ecflow_server in the background, using user id
+###        to make a unique port number.
+
+#==========================================================================
+export TZ=GMT LANG= # en_GB.UTF-8 unset, use locale -a to list available locales
+host=$(hostname)
+force=true
+backup_server=false
+verbose=false
+rerun=false
+
+#==========================================================================
+# Syntax
+# ecflow_start [-b] [-d ecf_home_directory] [-f] [-h] [-p port_number ]
+#==========================================================================
+# get command line options if any.
+while getopts hfbd:vp:r option
+do
+case $option in
+f)
+force=true
+;;
+b)
+backup_server=true
+;;
+v)
+verbose=true
+;;
+d)
+ecf_home_directory=$OPTARG
+;;
+p)
+ecf_port=$OPTARG
+;;
+r)
+rerun=true
+;;
+h)
+echo "Usage: $0 [-b] [-d ecf_home directory] [-f] [-h]"
+echo "       -b        start ECF for backup server or e-suite"
+echo "       -d <dir>  specify the ECF_HOME directory - default $HOME/ecflow_server"
+echo "       -f        forces the ECF to be restarted"
+echo "       -v        verbose mode"
+echo "       -h        print this help page"
+echo "       -p <num>  specify server port number(ECF_PORT number)  - default 1000+<UID> | 500+<UID> for backup server"
+exit 0
+;;
+*)
+echo "Usage: $0 [-b] [-d ecf_home directory] [-f] [-h]"
+echo "       -b        start ECF for backup server or e-suite"
+echo "       -d <dir>  specify the ECF_HOME directory - default $HOME/ecflow_server"
+echo "       -f        forces the ECF to be restarted"
+echo "       -v        verbose mode"
+echo "       -h        print this help page"
+echo "       -p <num>  specify server port number(ECF_PORT number)  - default 1500+<UID> | 1000+<UID> for backup server"
+exit 1
+;;
+esac
+done
+ 
+
+# =================================================================================
+# port_number is set based on the unique users numeric uid.
+
+username=`id -u`
+
+if [ -z "$ecf_port" ] ; then
+
+   if [ $backup_server = "true" ]; then
+     base=1000
+   else
+     base=1500
+   fi
+   port_number=$((base+username))
+
+else
+   port_number=$ecf_port
+fi
+
+export ECF_PORT=$port_number
+
+#===============================================================================
+# if working directory not set then set to current directory  
+
+export ECF_HOME=${ecf_home_directory:-$HOME/ecflow_server}
+export ECF_LISTS=${ECF_LISTS:-$ECF_HOME/ecf.lists}
+
+# ===============================================================================
+# Update kill and status command for ecgate
+
+rcdir=$HOME/.ecflowrc
+fname=$rcdir/$(echo $host | cut -c1-5).$USER.$ECF_PORT # OK as long as ecgate node is under 10
+mkdir -p $rcdir
+ecflow_client --port $ECF_PORT --host $(cat $fname) --ping  && echo "server is already started" && exit 0 || :
+
+case $host in
+ sappa*) 
+if [[ $(ssh sappa hostname) != $host ]]; then
+  echo "please start ecflow on the generic node only"; 
+  exit 1; 
+fi
+
+echo "$host" > $fname
+host=sappa
+  file=$HOME/.ecfhostfile_sappa
+  touch $file
+  grep sappa00 $file || cat >> $file <<EOF
+sappa00
+sappa01
+sappa02
+sappa03
+EOF
+;;
+ sappb*) 
+if [[ $(ssh sappb hostname) != $host ]]; then
+  echo "please start ecflow on the generic node only"; 
+  exit 1; 
+fi
+
+echo "$host" > $fname
+host=sappb
+  file=$HOME/.ecfhostfile_sappb
+  touch $file
+  grep sappb00 $file || cat >> $file <<EOF
+sappb00
+sappb01
+sappb02
+sappb03
+EOF
+;;
+ ecga*)
+    echo "$host" > $fname
+    host=ecgate
+    ECF_KILL_CMD='${ECF_KILL:=/home/ma/emos/bin/ecfkill} %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.kill 2>&1'
+    ECF_STATUS_CMD='${ECF_STAT:=/home/ma/emos/bin/ecfstatus} %USER% %HOST% %ECF_RID% %ECF_JOB% > %ECF_JOB%.stat 2>&1'
+    export ECF_KILL_CMD ECF_STATUS_CMD
+
+# ===============================================================================
+# Update host and create hosts file
+
+  file=$HOME/.ecfhostfile
+  grep ecga00 $file || ( cat >> $file <<EOF
+ecga00
+ecga01
+ecga02
+ecga03
+ecga04
+ecga05
+EOF
+
+  if [ "$USER" != emos ] ; then
+    rcp $file $USER at c2a:~/.ecfhostfile || :
+    rcp $file $USER at c2b:~/.ecfhostfile || :
+  fi
+) 
+
+  file=$HOME/.ecflowrc/servers
+  nick=ecgate1
+  grep "^ecgate " $file || echo "ecgate  ecgate  $ECF_PORT" >> $file
+  grep "^$nick  " $file || echo "$nick $nick $ECF_PORT" >> $file
+;;
+esac
+ 
+date -u
+
+# set up default environment variables
+export ECF_NODE=$host
+export ECF_LOG=$host.$ECF_PORT.ecf.log
+export ECF_CHECK=$host.$ECF_PORT.check
+export ECF_CHECKOLD=$host.$ECF_PORT.check.b
+if [ "$verbose" = "false" ]; then
+     export ECF_OUT=/dev/null
+else
+     export ECF_OUT=$host.$ECF_PORT.ecf.out
+fi
+
+echo 
+echo User \"$username\" attempting to start ecf server on \"$host\" using ECF_PORT \"$ECF_PORT\" and with:
+echo "ECF_HOME     : \"$ECF_HOME\""
+echo "ECF_LOG      : \"$ECF_LOG\""
+echo "ECF_CHECK    : \"$ECF_CHECK\""
+echo "ECF_CHECKOLD : \"$ECF_CHECKOLD\""
+if [ "$verbose" = "false" ]; then
+     echo "ECF_OUT      : \"/dev/null\""
+else
+     echo "ECF_OUT      : \"$host.$ECF_PORT.ecf.out\""
+fi
+echo 
+
+#==========================================================================
+
+echo "client version is $(ecflow_client --version)"
+# echo "server version is $(ecflow_server --version)"
+echo "Checking if the server is already running on $host and port $ECF_PORT"
+ecflow_client --ping 
+if [ $? -eq 0 ]; then
+  echo "... The server on $host:$ECF_PORT is already running. Use 'netstat -lnptu' for listing active port" 
+  exit 1
+fi
+
+
+#==========================================================================
+
+echo "";
+echo Backing up check point and log files
+
+if [ ! -d $ECF_HOME ] ;then
+  mkdir $ECF_HOME
+fi
+cd $ECF_HOME
+
+if [ ! -d log ] ;then
+  mkdir log
+fi
+
+set +e
+
+cp $ECF_CHECK    log/ 2>/dev/null
+cp $ECF_CHECKOLD log/ 2>/dev/null
+cp $ECF_LOG      log/ 2>/dev/null
+
+if [ -f $host.$ECF_PORT.ecf.out ]; then
+   cp $host.$ECF_PORT.ecf.out log/ 2>/dev/null
+fi
+
+set -e
+
+
+# =============================================================================
+# ecFlow server start in the background.
+#
+# o/ nohup is a POSIX command to ignore the HUP (hangup) signal, enabling the command to 
+#    keep running after the user who issues the command has logged out. 
+#    The HUP (hangup) signal is by convention the way a terminal warns depending processes of logout. 
+#
+#    Note that these methods prevent the process from being sent a 'stop' signal on logout,
+#    but if input/output is being received for these standard IO files (stdin, stdout, or stderr), 
+#    they will still hang the terminal
+#    This problem can also be overcome by redirecting all three I/O streams:
+#
+# o/ ecflow_server will by default attempt to recover from a check point file if it is there
+#    otherwise it will look for the backup check point file
+#
+echo "";
+echo "OK starting ecFlow server..."
+echo "";
+
+nohup ecflow_server > $ECF_OUT 2>&1 < /dev/null &
+
+# the sleep allows time for server to start
+if [ "$force" = "true" ]; then
+   echo "Placing server into RESTART mode..."
+   sleep 5  
+   ecflow_client --restart || { echo "restart of server failed" ; exit 1; }
+fi
+
+
+echo 
+echo "To view server on ecflowview - goto Edit/Preferences/Servers and enter"
+echo "Name        : <unique ecFlow server name>"
+echo "Host        : $host"
+echo "Port Number : $ECF_PORT"
+echo
+
+exit 0
diff --git a/ecflow_4_0_7/tools/ecflow_stop.sh b/ecflow_4_0_7/tools/ecflow_stop.sh
new file mode 100755
index 0000000..32a992d
--- /dev/null
+++ b/ecflow_4_0_7/tools/ecflow_stop.sh
@@ -0,0 +1,111 @@
+#!/bin/sh
+#==========================================================================
+##.TITLE   ECMWF utility for ecFlow
+##.NAME    ecf_stop
+##.SECTION ECFLOW
+##.AUTHOR  Avi
+## Revision    : $Revision: #10 $ 
+##
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+##
+##.FILE    ecf_stop
+##.INFO    this file is expected to be located in /usr/local/share
+##         it is to be used on ecgate by member states users  
+##         one ecf server occurence will be generated on ecgate
+#==========================================================================
+
+#set -eux
+
+PATH=/usr/local/bin:/usr/bin:$PATH
+export TZ=GMT LANG=en_GB.UTG-8
+host=$(hostname)
+backup_server=false
+
+case $host in 
+sappa*) host=sappa;;
+sappb*) host=sappb;;
+ecga*)  host=ecgate;;
+esac
+
+#==========================================================================
+# Syntax
+# ecf_stop [-b] [-p port_number ] [-h]
+#==========================================================================
+# get commane line options if any.
+while getopts b:p: option
+do
+case $option in
+b)
+backup_server=true
+;;
+p)
+ecf_port=$OPTARG
+;;
+h)
+echo "Usage: $0 [-b] [-p port_number ] [-h]"
+echo "       -b        stop ECF backup server"
+echo "       -p <num>  specify the ECF_PORT number  - default 1000+<UID> | 500+<UID> for backup server"
+echo "       -h        print this help page"
+exit 0
+;;
+*)
+echo "Usage: $0 [-b] [-p port_number ] [-h]"
+echo "       -b        stop ECF backup server"
+echo "       -p <num>  specify the ECF_PORT number  - default 1500+<UID> | 1000+<UID> for backup server"
+echo "       -h        print this help page"
+exit 1
+;;
+esac
+done
+
+#==========================================================================
+# port_number is set based on the unique users numeric uid.
+username=`id -u`
+
+if [ -z "$ecf_port" ] ; then
+   if [ $backup_server = "true" ]; then
+     base=1000
+   else
+     base=1500
+   fi
+   port_number=$((base+username))
+else
+   port_number=$ecf_port
+fi
+
+date -u
+echo ""
+echo "User \"$username\" attempting to stop ecf server on $host:$port_number" 
+ 
+#==========================================================================
+echo "";
+echo "Checking if the server is already running on $host:$port_number" 
+
+export ECF_PORT=$port_number
+export ECF_NODE=$host
+set -x
+rcdir=$HOME/.ecflowrc
+fname=$rcdir/$(echo $ECF_NODE | cut -c1-5).$USER.$ECF_PORT # OK as long as ecgate node is under 10
+if [[ -f $fname ]]; then host=$(cat $fname); fi
+
+ecflow_client --host $host --ping 
+if [ $? -eq 1 ]; then
+  echo "";
+  echo "... The server on $host:$port_number has already been stopped" 
+  exit 1
+fi
+
+#==========================================================================
+echo "";
+echo Halting, check pointing and terminating the server
+
+ecflow_client  --host $host --halt=yes
+ecflow_client  --host $host --check_pt
+ecflow_client  --host $host --terminate=yes
+
+exit 0
diff --git a/ecflow_4_0_7/tools/noconnect.sh b/ecflow_4_0_7/tools/noconnect.sh
new file mode 100755
index 0000000..6e5ee32
--- /dev/null
+++ b/ecflow_4_0_7/tools/noconnect.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+# disconnect all hosts to start ecflowview with empty screen
+#==========================================================================
+##.TITLE   ECMWF utility for ecFlow
+##.NAME     
+##.SECTION ECFLOW
+##.AUTHOR   
+## Revision    : $Revision: #7 $ 
+##
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+##
+##.FILE     
+##.INFO     
+#==========================================================================
+
+d=$HOME/.xcdprc
+d=$HOME/.ecflowrc
+for f in $d/*options
+do
+    # echo "##  $f"
+    if [ `grep "connect:true" $f 2>/dev/null` ]
+	then
+	# echo "### $f"
+	sed -e 's|connect:true|connect:false|' $f > ${f}.tmp
+	mv ${f}.tmp $f
+	fi
+done
diff --git a/ecflow_4_0_7/version.sh b/ecflow_4_0_7/version.sh
new file mode 100755
index 0000000..f838664
--- /dev/null
+++ b/ecflow_4_0_7/version.sh
@@ -0,0 +1,7 @@
+release=$(cat VERSION.cmake | grep 'set( ECFLOW_RELEASE' | awk '{print $3}'| sed 's/["]//g')
+major=$(cat VERSION.cmake   | grep 'set( ECFLOW_MAJOR'   | awk '{print $3}'| sed 's/["]//g')
+minor=$(cat VERSION.cmake   | grep 'set( ECFLOW_MINOR'   | awk '{print $3}'| sed 's/["]//g')
+ecflow_version=$release.$major.$minor
+
+# use tr -d '\12' to remove trailing newline
+echo "$ecflow_version" | tr -d '\12'
diff --git a/ecflow_4_0_7/view/CMakeLists.txt b/ecflow_4_0_7/view/CMakeLists.txt
new file mode 100644
index 0000000..11bf442
--- /dev/null
+++ b/ecflow_4_0_7/view/CMakeLists.txt
@@ -0,0 +1,278 @@
+# =======================================================
+# LIB
+# to list all sources to build use:
+#    cd $WK/View
+#    find src -name \icon_*.cc  -print | sort
+# =======================================================
+
+# Files to exclude
+#       src/lister.cc 
+#       src/extent.cc
+#       src/node_alert.cc 
+#       src/array.cc 
+#       src/option.cc 
+#       src/dialog.cc 
+#       src/ecflowview.cc
+#
+#       src/menul.c 
+#       src/tmpnam.c 
+#       src/line.c 
+#       src/x.c 
+       
+list( APPEND srcs_cc
+   src/aborted.cc
+   src/alerts.cc
+   src/alias.cc
+   src/ask.cc
+   src/auto_alarm.cc
+   src/base.cc
+   src/collector.cc
+   src/colors_prefs.cc
+   src/configurable.cc
+   src/confirm.cc
+   src/counted.cc
+   src/date.cc
+   src/depend.cc
+   src/directory.cc
+   src/dummy_node.cc
+   src/ecf_node.cc
+   src/ecflow.cc
+   src/edit.cc
+   src/edit_label.cc
+   src/edit_limit.cc
+   src/edit_meter.cc
+   src/edit_repeat.cc
+   src/edit_variable.cc
+   src/editor.cc
+   src/error.cc
+   src/event_node.cc
+   src/external.cc
+   src/find.cc
+   src/flags.cc
+   src/fonts_prefs.cc
+   src/fsb.cc
+   src/globals.cc
+   src/graph_layout.cc
+   src/gui.cc
+   src/history.cc
+   src/host.cc
+   src/host_prefs.cc
+   src/html_lister.cc
+   src/http.cc
+   src/hyper_lister.cc
+   src/icon_Josstatus3.cc
+   src/icon_W.cc
+   src/icon_byrule.cc
+   src/icon_cmd_failed.cc
+   src/icon_edit_failed.cc
+   src/icon_force_abort.cc
+   src/icon_killed.cc
+   src/icon_no_script.cc
+   src/icon_queuelimit.cc
+   src/icon_task_aborted.cc
+   src/icon_user_edit.cc
+   src/info.cc
+   src/init.cc
+   src/inlimit_node.cc
+   src/input.cc
+   src/interface.cc
+   src/job.cc
+   src/jobcheck_panel.cc
+   src/jobstatus.cc
+   src/label.cc
+   src/late.cc
+   src/late_node.cc
+   src/layout.cc
+   src/limit_node.cc
+   src/log_event.cc
+   src/logsvr.cc
+   src/mail.cc
+   src/manual.cc
+   src/menu_prefs.cc
+   src/menus.cc
+   src/messages.cc
+   src/meter_node.cc
+   src/node.cc
+   src/node_editor.cc
+   src/node_list.cc
+   src/node_window.cc
+   src/not_enqueued.cc
+   src/observable.cc
+   src/observer.cc
+   src/option_panel.cc
+   src/output.cc
+   src/panel.cc
+   src/panel_window.cc
+   src/parser.cc
+   src/passwrd.cc
+   src/persist.cc
+   src/pixmap.cc
+   src/pref_editor.cc
+   src/pref_window.cc
+   src/prefs.cc
+   src/reach.cc
+   src/relation.cc
+   src/repeat_node.cc
+   src/resource.cc
+   src/restart.cc
+   src/result.cc
+   src/runnable.cc
+   src/script_panel.cc
+   src/scripting.cc
+   src/search.cc
+   src/searchable.cc
+   src/selection.cc
+   src/server.cc
+   src/servers_prefs.cc
+   src/show.cc
+   src/simple_node.cc
+   src/str.cc
+   src/substitute.cc
+   src/suites_panel.cc
+   src/super_node.cc
+   src/task_node.cc
+   src/text_layout.cc
+   src/text_window.cc
+   src/time.cc
+   src/timeout.cc
+   src/timetable_panel.cc
+   src/tip.cc
+   src/tmp_file.cc
+   src/top.cc
+   src/translator.cc
+   src/tree.cc
+   src/trigger_node.cc
+   src/trigger_panel.cc
+   src/url.cc
+   src/user_prefs.cc
+   src/users.cc
+   src/variable_node.cc
+   src/variables.cc
+   src/viewer.cc
+   src/why.cc
+   src/window.cc
+   src/xdxmdialog.cc
+   src/xdxtclass.cc
+   src/xmstring.cc
+   src/xnode.cc
+   src/zombies_panel.cc
+)
+
+list( APPEND srcs_c
+   src/Hyper.c
+   src/SimpleBase.c
+   src/SimpleGraph.c
+   src/SimpleTime.c
+   src/SimpleTree.c
+   src/Tab.c
+   src/menuy.c
+)
+
+file( GLOB srcs_cpp     RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp"        )
+file( GLOB libicon_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/libicon/*.cc" )
+file( GLOB libxec_srcs  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/libxec/*.c"   )
+file( GLOB libui_srcs   RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/libui/*.cc"   )
+
+# ======================================================================================
+
+find_package( X11 )
+debug_var( X11_INCLUDE_DIR )
+debug_var( X11_LIBRARIES )  
+debug_var( X11_Xt_INCLUDE_PATH )
+debug_var( X11_Xt_LIB )
+debug_var( X11_Xpm_INCLUDE_PATH )
+debug_var( X11_Xpm_LIB )
+
+find_package( Motif )
+debug_var( MOTIF_INCLUDE_DIR )
+debug_var( MOTIF_LIBRARIES )  
+ 
+ 
+# =======================================================================================
+find_package( CMath )
+
+set( CMAKE_THREAD_PREFER_PTHREAD TRUE )
+find_package( Threads )
+
+
+# =========================================================================================
+# libecflowview needs to be compiled as dynamic lin  otherwise the icons do not appear.
+#
+# Note: -DECFLOW_SHARED_DIR is *ONLY* required for one file view/src/directory.cc
+#
+add_definitions( -D_GNU_SOURCE -DUNIX -Dunix -Dlinux -DECFLOW_SHARED_DIR="${CMAKE_INSTALL_PREFIX}/share/ecflow" )
+
+
+# local includes
+include_directories( src
+                     src/libicon
+                     src/libxec
+                     src/libui
+                     ../ACore/src 
+                     ../ANattr/src
+                     ../ANode/src
+                     ../AParser/src
+                     ../Base/src
+                     ../Base/src/cts
+                     ../Base/src/stc
+                     ../Client/src
+                    )
+
+# in ecbuild_add_library INCLUDES is only for external includes
+ecbuild_add_library(TARGET    libecflowview
+				        CONDITION MOTIF_FOUND AND X11_FOUND AND CMAKE_THREAD_LIBS_INIT
+                    SOURCES  
+                              ${srcs_cc} ${srcs_c} ${srcs_cpp} ${libicon_srcs} ${libxec_srcs} ${libui_srcs}
+                    TEMPLATES
+                              src/array.cc
+                    INCLUDES 
+                              ${X11_INCLUDE_DIR}
+                              ${MOTIF_INCLUDE_DIR}
+                   )
+
+# =======================================================================
+# EXE ecflowview
+#    o crypt    Does not appear to be used           ?
+#    o Xp       libxprint does not appear to be used ?
+#    o fl       fast lexical analyser generator, not used ?
+# ========================================================================
+
+ecbuild_add_executable( TARGET    ecflowview
+                        SOURCES   
+                                  src/ecflowview.cc
+						      CONDITION 
+						                MOTIF_FOUND AND X11_FOUND AND CMAKE_THREAD_LIBS_INIT
+                        LIBS      
+                                  libecflowview  libclient base libparser node nodeattr core
+                                  ${CMAKE_THREAD_LIBS_INIT} 
+                                  ${X11_LIBRARIES} ${X11_Xext_LIB} ${MOTIF_LIBRARIES} ${X11_Xpm_LIB} ${X11_Xt_LIB} 
+                                  ${CMATH_LIBRARIES}
+                        INCLUDES  
+                                  ${X11_INCLUDE_DIR}
+                                  ${MOTIF_INCLUDE_DIR}
+                     )
+
+
+# ===================================================================
+# test
+# ===================================================================
+
+ecbuild_add_test( TARGET  test-view
+                  BOOST
+                  CONDITION MOTIF_FOUND AND X11_FOUND AND CMAKE_THREAD_LIBS_INIT
+                  SOURCES   test/TestRunner.cpp test/TestView.cpp
+                  LIBS      libharness    
+                  INCLUDES  ../Test/src
+                  TEST_DEPENDS s_test_zombies
+                )
+                          
+# ===================================================================
+# install
+# ===================================================================
+                     
+install ( FILES       ${CMAKE_SOURCE_DIR}/view/src/ecflowview.menu 
+                      ${CMAKE_SOURCE_DIR}/view/servers
+          DESTINATION share/ecflow
+          PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE
+        )
+        
diff --git a/ecflow_4_0_7/view/Jamfile.jam b/ecflow_4_0_7/view/Jamfile.jam
new file mode 100644
index 0000000..84c793d
--- /dev/null
+++ b/ecflow_4_0_7/view/Jamfile.jam
@@ -0,0 +1,117 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+#
+# ecflowview
+#
+project ecflowview ;
+
+use-project theCore      : ../ACore ;
+use-project theNodeAttr  : ../ANattr ;
+use-project theNode      : ../ANode ;
+use-project theBase      : ../Base ;
+use-project theClient    : ../Client ;
+use-project theTest      : ../Test ;
+
+# This should be in the site-config.jam file as a project wide requirement
+# however if this is done, it will not link since, lpthread appears twice
+# on the link line
+#
+lib pthread ;
+
+import os ;
+MOTIF_INCLUDE = [ os.environ MOTIF_INCLUDE ] ;
+MOTIF_INCLUDE default = /usr/include ;
+# MOTIF_LIBRARY = [ os.environ MOTIF_LIBRARY ] ;
+# MOTIF_LIBRARY default = /usr/lib64 ;
+# echo "# MOTIF_LIBRARY = $(MOTIF_LIBRARY)" ;
+
+exe ecflowview 
+   : [ glob src/*.cc src/*.c src/*cpp 
+       src/libicon/*.cc src/libxec/*.c src/libui/*.cc :
+       src/menul.c src/lister.cc src/tmpnam.c src/line.c src/x.c src/extent.cc
+       src/node_alert.cc src/array.cc src/option.cc 
+       src/dialog.cc src/host.cc ] 
+     host
+     /theCore//core
+     /theNodeAttr//nodeattr
+     /theNode//node
+     /theParser//libparser
+     /theBase//base
+     /theClient//libclient
+     /site-config//boost_system
+     /site-config//boost_serialization
+     /site-config//boost_filesystem
+     /site-config//boost_program_options
+     /site-config//boost_datetime
+     pthread
+   : <variant>debug:<define>DEBUG
+#     <variant>release:<cxxflags>-O1
+     <toolset>gcc:<include>$(MOTIF_INCLUDE)
+     <include>../view/src
+     <include>../view/src/libicon
+     <include>../view/src/libxec
+     <include>../view/src/libui	
+     <define>_GNU_SOURCE
+     <define>linux
+     <define>ECFLOW_SHARED_DIR='\"$(ECFLOW_SHARED_DIR)\"'
+     <define>UNIX
+     <define>unix
+     <linkflags>-lm 
+     <linkflags>-g
+     <toolset>gcc:<linkflags>-L$(MOTIF_LIBRARY)
+     <dll-path>$(MOTIF_LIBRARY)
+     <linkflags>-L/usr/X11R6/lib
+     <linkflags>-lXpm
+     <linkflags>-lXm
+     <linkflags>-lXext
+     <linkflags>-lXt
+     <linkflags>-lX11
+   ;
+
+obj host : src/host.cc 
+     /theCore//core
+     /theNodeAttr//nodeattr
+     /theNode//node
+     /theParser//libparser
+     /theBase//base
+     /theClient//libclient
+  : # <variant>release:<optimization>off 
+     <include>../view/src
+     <include>../view/src/libicon
+     <include>../view/src/libxec
+     <include>../view/src/libui	
+     <define>_GNU_SOURCE
+     <define>linux
+     <define>ECFLOW_SHARED_DIR='\"$(ECFLOW_SHARED_DIR)\"'
+     <define>UNIX
+     <define>unix
+   ; 
+#
+# Test the view
+# This uses /theTest//libharness to setup a server
+#
+exe test-view : [ glob test/*.cpp  ]  
+          pthread
+           /theCore//core
+           /theNodeAttr//nodeattr
+           /theNode//node
+           /theParser//libparser
+           /theBase//base
+           /theClient//libclient
+           /theTest//libharness
+           /site-config//boost_system
+           /site-config//boost_serialization
+           /site-config//boost_filesystem
+           /site-config//boost_program_options
+           /site-config//boost_datetime
+           /site-config//boost_test
+         : <include>../Base/test 
+           <include>../Test/src 
+           <variant>debug:<define>DEBUG
+#  	   <variant>release:<cxxflags>-O1
+        ;
diff --git a/ecflow_4_0_7/view/Makefile b/ecflow_4_0_7/view/Makefile
new file mode 100644
index 0000000..f994b71
--- /dev/null
+++ b/ecflow_4_0_7/view/Makefile
@@ -0,0 +1,99 @@
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+KIND=bin/gcc-4.5
+CLNT=../Client/bin/gcc-4.5/debug/ecflow_client --port 3199
+CLNT=../Client/bin/gcc-4.5/release/ecflow_client --port 3199
+CLNT2=../Client/bin/gcc-4.5/debug/ecflow_client
+DEFS=
+DEFS=
+# DEFS=define=PORTABLE_BINARY_ARCHIVE
+DIRRC=~/.ecflowrc
+BJAM=bjam
+BJAM=$(BOOST_ROOT)/bjam c++-template-depth=512
+VALG=/tmp/map/work/valgrind-3.7.0/coregrind/valgrind
+
+all:
+	$(BJAM) -j4 variant=debug $(DEFS) ecflowview
+
+fast:
+	$(BJAM) variant=debug $(DEFS) ecflowview
+
+rel:
+	$(BJAM) -j4 variant=release $(DEFS) ecflowview 
+
+val:
+	$(VALG) bin/gcc-4.5/release/ecflowview 
+
+vald:
+	$(VALG) bin/gcc-4.5/debug/ecflowview 
+
+profile:
+	$(BJAM) -j4 variant=profile $(DEFS) ecflowview 
+
+prof:   profile $(KIND)/profile/ecflowview 
+	date
+	- time $(KIND)/profile/ecflowview 
+	gprof $(KIND)/profile/ecflowview gmon.out >gprof.out
+	@cp gprof.out $(SCRATCH)/.	# - kprof # 
+
+# useful when updating the menu from the sources
+menuclean:
+	rm -rf $(DIRRC)
+	mkdir $(DIRRC)
+
+parse:
+	cd src && lex  -t menul.l > menul.c && yacc  menuy.y && mv -f y.tab.c menuy.c && cd ../
+
+menu-full: menu parse all rel 
+
+menu:
+	sh src/menu2c.sh  < src/ecflowview.menu > src/ecflowview.menu.h
+	cp -f src/ecflowview.menu $(DIRRC)/.
+	sh src/menu2c.sh < src/xcdp.menu  > src/xcdp.menu.h
+	cp -f src/xcdp.menu $(DIRRC)/.
+
+clean-run: menu all
+	rm $(DIRRC)/ecflowview.menu || :
+	exec `	find bin/ -name ecflowview`
+
+tags:
+	etags ../[ABCv]*/src/*.[hcp]
+
+d:
+	time $(KIND)/debug/ecflowview
+ddd:
+	time ddd $(KIND)/debug/ecflowview
+
+clean:
+	-\rm *~ gmon.out
+	$(BJAM) clean
+
+calib:
+	date; time $(CLNT) --get > /dev/null
+	date; time $(CLNT) --get > 3199.tmp
+	date; time python tool/timing.py
+	date
+
+SUITE=test_suite
+load:	
+	 $(CLNT) --replace /gui tool/test.def
+	 $(CLNT2) --host badger --port 31415 --group="get; show" > badger.def
+	 $(CLNT) --load badger.def
+
+boot:
+	 - $(CLNT) --load tool/3199.exp
+ping:
+	 - $(CLNT) --ping
+
+relbin:
+	$(BJAM) -j4 variant=release define=PORTABLE_BINARY_ARCHIVE ecflowview 
+
+t2:
+	gcc t2.c -lXm -lX11 
+t1: 
+	gcc t1.c
\ No newline at end of file
diff --git a/ecflow_4_0_7/view/data/includes/head.h b/ecflow_4_0_7/view/data/includes/head.h
new file mode 100644
index 0000000..f2ee97c
--- /dev/null
+++ b/ecflow_4_0_7/view/data/includes/head.h
@@ -0,0 +1,54 @@
+#!/bin/ksh
+
+%manual
+#This is the manual from the head.h file
+%end
+
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the three variables that are needed for any
+# communication with ECF
+
+export ECF_PORT=%ECF_PORT%    # ECF_ Remote Procedure Call number
+export ECF_NODE=%ECF_NODE%    # The ecflow server that issued the task
+export ECF_NAME=%ECF_NAME%    # The name of this current task
+export ECF_PASS=%ECF_PASS%    # A unique password
+export ECF_TRYNO=%ECF_TRYNO%  # Current try number of the task
+
+# to debug client communication with the server, enable this environment
+#export ECF_DEBUG_CLIENT=
+
+# Typically we dont set this, however the zombie automated test require this.
+# it allows us to disambiguate a zombie from a real job.
+export ECF_RID=$$
+
+# Tell ECF_ we have stated
+# The ECF_ variable ECF_RID will be set to parameter of smsinit
+# Here we give the current PID.
+
+
+# Defined a error hanlder
+ERROR() {
+	echo "ERROR called"
+	set +e        # Clear -e flag, so we don't fail
+   # when the following signals arrive do nothing, stops recursive signals/error function being called
+	trap 0 1 2 3 4 5 6 7 8 10 12 13 15
+   # Notify ECF_ that something went wrong
+	%ECF_CLIENT_EXE_PATH% --abort
+	trap 0        # Remove the trap
+	exit 0        # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
+
+
+%ECF_CLIENT_EXE_PATH% --init=$$
+echo $?
diff --git a/ecflow_4_0_7/view/data/includes/tail.h b/ecflow_4_0_7/view/data/includes/tail.h
new file mode 100644
index 0000000..e1da198
--- /dev/null
+++ b/ecflow_4_0_7/view/data/includes/tail.h
@@ -0,0 +1,8 @@
+# Notify ECF of a normal end
+%ECF_CLIENT_EXE_PATH% --complete
+trap 0                          # Remove all traps
+exit 0                          # End the shell
+
+%manual
+#This is the manual from the tail.h file
+%end
diff --git a/ecflow_4_0_7/view/install_server.sh b/ecflow_4_0_7/view/install_server.sh
new file mode 100755
index 0000000..0a77faf
--- /dev/null
+++ b/ecflow_4_0_7/view/install_server.sh
@@ -0,0 +1,29 @@
+#!/bin/ksh
+
+rdservers=/home/rd/rdx/ecflow/servers.config
+serv=servers
+cat servers.od > $serv
+cat $rdservers | grep vecf | grep -v -E "^#.*" | awk '{ print $1"\t"$2"\t"$3;}' | sort >> $serv
+
+loc=/usr/local/apps/ecflow/*/share/ecflow 
+# loc=/usr/local/apps/ecflow/4.0.6/share/ecflow 
+files=$serv
+files=ecflowview.menu
+dests="ibis ablamor opensuse113 opensuse103"
+set +x
+list="$(rsh $dest ls -d $loc | grep -v current)"
+# list=/usr/local/apps/ecflow/4.0.4/share/ecflow
+for dest in $dests; do
+  for locs in $list; do
+    rcp $files emos@$dest:$locs/. || echo $dest NOK
+  done
+done
+
+dests="ecgb vsms1 vsms2 vsms3 lxab lxop opensuse131"
+list="$(ssh $dest ls -d $loc | grep -v current)"
+# list=/usr/local/apps/ecflow/4.0.4/share/ecflow
+for dest in $(echo $dests); do
+  for locs in $list; do
+    scp $files emos@$dest:$locs/. || echo $dest NOK
+  done
+done
diff --git a/ecflow_4_0_7/view/servers b/ecflow_4_0_7/view/servers
new file mode 100644
index 0000000..0dfaab9
--- /dev/null
+++ b/ecflow_4_0_7/view/servers
@@ -0,0 +1,48 @@
+eod1     vsms1 32112
+sappa    sappa 3141
+sappb    sappb 3141
+eod2     vsms1 32222
+eod3     vsms1 43333
+eod4     vsms1 45555
+eode     vsms2 31415
+tigge_lam     vali     21801
+rdda1	vecfrdda1	11001
+rdda2	vecfrdda2	11002
+rddi1	vecfrddi1	11011
+rddi2	vecfrddi2	11012
+rdecgems1	vecfecgems1	11311
+rdecgems2	vecfecgems2	11312
+rderas1	vecferas1	11111
+rderas2	vecferas2	11112
+rdguest1	vecfrdguest1	11091
+rdna1	vecfrdna1	11021
+rdna2	vecfrdna2	11022
+rdne1	vecfrdne1	11031
+rdne2	vecfrdne2	11032
+rdocx-prod1	vecfocxprod1	11211
+rdocx-prod2	vecfocxprod2	11212
+rdpa1	vecfrdpa1	11041
+rdpa2	vecfrdpa2	11042
+rdst1	vecfrdst1	11051
+rdst2	vecfrdst2	11052
+rdtest1	vecfrdxadmin	12090
+rdx_admin	vecfrdxadmin	10091
+xat1	vecfmspifs	21001
+xbe1	vecfmspifs	21011
+xch1	vecfmspifs	21021
+xde1	vecfmspifs	21031
+xdk1	vecfmspifs	21041
+xes1	vecfmspifs	21051
+xfi1	vecfmspifs	21061
+xfr1	vecfmspifs	21071
+xgb1	vecfmspifs	21081
+xge1	vecfmspifs	21091
+xgr1	vecfmspifs	21101
+xie1	vecfmspifs	21111
+xit1	vecfmspifs	21121
+xlu1	vecfmspifs	21131
+xnl1	vecfmspifs	21141
+xno1	vecfmspifs	21151
+xpt1	vecfmspifs	21161
+xse1	vecfmspifs	21171
+xtr1	vecfmspifs	21181
diff --git a/ecflow_4_0_7/view/servers.od b/ecflow_4_0_7/view/servers.od
new file mode 100644
index 0000000..e630711
--- /dev/null
+++ b/ecflow_4_0_7/view/servers.od
@@ -0,0 +1,8 @@
+eod1     vsms1 32112
+sappa    sappa 3141
+sappb    sappb 3141
+eod2     vsms1 32222
+eod3     vsms1 43333
+eod4     vsms1 45555
+eode     vsms2 31415
+tigge_lam     vali     21801
diff --git a/ecflow_4_0_7/view/src/ArrayP.h b/ecflow_4_0_7/view/src/ArrayP.h
new file mode 100644
index 0000000..cd7657d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ArrayP.h
@@ -0,0 +1,60 @@
+#ifndef ARRAYP_H
+#define ARRAYP_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include <Xm/XmP.h>
+#include <Xm/DrawingAP.h>
+
+typedef struct _ArrayClassPart {
+    int         ignore;
+} ArrayClassPart;
+
+typedef struct _ArrayClassRec {
+    CoreClassPart       core_class;
+    CompositeClassPart  composite_class;
+    ConstraintClassPart constraint_class;
+    XmManagerClassPart  manager_class;
+    XmDrawingAreaClassPart  drawing_area_class;
+    ArrayClassPart     array_class;
+} ArrayClassRec;
+
+extern ArrayClassRec arrayClassRec;
+
+typedef struct {
+	int round;
+	int rows;
+	int cols;
+} ArrayPart;
+
+
+typedef struct _ArrayRec {
+    CorePart        core;
+    CompositePart   composite;
+    ConstraintPart  constraint;
+    XmManagerPart    manager;
+    XmDrawingAreaPart   drawing_area;
+    ArrayPart      array;
+}  ArrayRec;
+
+
+#define XtArrayNumChildren(w) (((ArrayWidget)w) -> composite.num_children)
+#define XtArrayChild(w,i)     (((ArrayWidget)w) -> composite.children[i])
+
+#endif /* ARRAYP_H */
+
+
+
diff --git a/ecflow_4_0_7/view/src/Hyper.c b/ecflow_4_0_7/view/src/Hyper.c
new file mode 100644
index 0000000..c3176ea
--- /dev/null
+++ b/ecflow_4_0_7/view/src/Hyper.c
@@ -0,0 +1,1589 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      : B.Raoult                                                                      */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description : Hyper text like widget.                                                       */
+/*=============================================================================================*/
+
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <X11/IntrinsicP.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/CoreP.h>
+#include <X11/cursorfont.h>
+#include "Hyper.h"
+#include "HyperP.h"
+#include <Xm/ScrollBar.h>
+#include <stdlib.h>
+#include <string.h> /* strerror */
+
+extern void xec_compile(char *w);
+extern int xec_step(char *p);
+
+#ifndef ABS
+#define ABS(a)           ((a)>=0?(a):-(a))
+#endif
+#ifndef MIN
+#define MIN(a,b)         ((a)>(b)?(b):(a))
+#endif
+
+#define ESIZE 1024
+
+#define NORMAL           0
+#define HIGHLIGHT        1
+#define NEWLINE          2
+
+#define MAX_LINE_SIZE    1024
+
+extern char *xec_loc1, *xec_loc2;
+
+/* 
+  Private functions 
+*/
+
+static void hilite(HyperWidget w,Boolean on);
+static text_segment *find_segment(HyperWidget,int,int);
+static void    free_text(text_segment*);
+static void    create_gcs(HyperWidget);
+static void    create_new_text(HyperWidget);
+static void    xselect();
+static void    cursor();
+static void    activate();
+static void    xincrement();
+static void    add_to_text ( HyperWidget,char*,int,int);
+static void    calc_new_size (HyperWidget);
+static void    zoom_open (HyperWidget,text_segment*);
+static void    show_selection(HyperWidget);
+static void    set_selection(HyperWidget);
+static void    clear_selection(HyperWidget);
+static void lowcase(char *p);
+static void find_visible_part(Widget,Position*,Position*,Dimension*,Dimension*);
+static void set_text(HyperWidget,char (*)(XtPointer),XtPointer);
+
+/*
+  Widget class methods
+*/
+
+static void    Initialize();
+static void    Redisplay();
+static void    Resize();
+static void    Destroy();
+static Boolean SetValues();
+
+static char defaultTranslations[] = 
+"     <Btn1Down>:select()\n                 <Btn1Up>: activate()\n\
+      <Motion>:cursor()\n\
+      <Btn2Down>:select()\n                 <Btn2Up>: activate() \n\
+ Shift<Btn5Down>: increment(1)\n       Shift<Btn4Down>: increment(-1)  \n\
+      <Btn5Down>: increment(10)\n           <Btn4Down>: increment(-10) \n";
+
+static XtActionsRec actionsList[] = {
+    { "select",   (XtActionProc) xselect},
+    { "activate", (XtActionProc) activate},
+    { "cursor",   (XtActionProc) cursor},
+    { "increment",(XtActionProc) xincrement},
+};
+
+static XtResource resources[] = {
+
+    {XtNhighlightFont, XtCFont, XtRFontStruct, sizeof (XFontStruct *),
+    XtOffset(HyperWidget, hyper.highlight_font), XtRString, "fixed"},
+
+    {XtNnormalFont, XtCFont, XtRFontStruct, sizeof (XFontStruct *),
+    XtOffset(HyperWidget, hyper.normal_font), XtRString, "fixed"},
+
+    {XtNhighlightColor, XtCColor, XtRPixel, sizeof (Pixel),
+    XtOffset(HyperWidget, hyper.highlight_color),XtRString, "Red"},
+
+    {XtNselectColor, XtCColor, XtRPixel, sizeof (Pixel),
+    XtOffset(HyperWidget, hyper.select_color),XtRString, "Blue"},
+
+    {XtNnormalColor, XtCColor, XtRPixel, sizeof (Pixel),
+    XtOffset(HyperWidget, hyper.normal_color),XtRString,"Black"},
+
+    {XtNactivateCallback,XtCCallback,XtRCallback,sizeof(caddr_t),
+    XtOffset (HyperWidget, hyper.activate),XtRCallback,NULL},
+
+    {XtNzoomEffect,XtCZoom,XtRBoolean,sizeof(Boolean),
+    XtOffset (HyperWidget, hyper.zoom),XtRImmediate,(XtPointer)TRUE},
+
+#ifndef XDESIGNER
+    {XtNstartHighlight,XtCTagChar,XtRUnsignedChar,sizeof(unsigned char),
+    XtOffset(HyperWidget,hyper.start_of_highlight),XtRImmediate,
+    (XtPointer)'{'},
+
+    {XtNendHighlight,XtCTagChar,XtRUnsignedChar,sizeof(unsigned char),
+    XtOffset (HyperWidget, hyper.end_of_highlight),XtRImmediate,
+    (XtPointer)'}'},
+#endif
+
+    {XtNzoomSpeed,XtCZoomSpeed,XtRInt,sizeof(int),
+    XtOffset (HyperWidget, hyper.speed),XtRImmediate,(XtPointer)4},
+
+    {XtNmargin,XtCMargin,XtRInt,sizeof(int),
+    XtOffset (HyperWidget, hyper.margin),XtRImmediate,(XtPointer)10},
+
+};
+
+/*---------------------------------------------------------------*/
+/* Static initialisation of the class record                     */
+/*---------------------------------------------------------------*/
+
+HyperClassRec  hyperClassRec = {
+    {
+#ifdef MOTIF
+    (WidgetClass) &xmPrimitiveClassRec,  /* superclass            */
+#else
+    (WidgetClass) &widgetClassRec,       /* superclass            */
+#endif
+    "Hyper",                             /* class_name            */
+    sizeof(HyperRec),                    /* widget_size           */
+    NULL,                                /* class_initialize      */
+    NULL,                                /* class_part_initialize */
+    FALSE,                               /* class_inited          */
+    Initialize,                          /* initialize            */
+    NULL,                                /* initialize_hook       */
+    XtInheritRealize,                    /* realize               */
+    actionsList,                         /* actions               */
+    XtNumber(actionsList),               /* num_actions           */
+    resources,                           /* resources             */
+    XtNumber(resources),                 /* num_resources         */
+    NULLQUARK,                           /* xrm_class             */
+    TRUE,                                /* compress_motion       */
+    XtExposeCompressMaximal,             /* compress_exposure     */
+    TRUE,                                /* compress_enterleave   */
+    TRUE,                                /* visible_interest      */
+    Destroy,                             /* destroy               */
+    Resize,                              /* resize                */
+    Redisplay,                           /* expose                */
+    SetValues,                           /* set_values            */
+    NULL,                                /* set_values_hook       */
+    XtInheritSetValuesAlmost,            /* set_values_almost     */
+    NULL,                                /* get_values_hook       */
+    NULL,                                /* accept_focus          */
+    XtVersion,                           /* version               */
+    NULL,                                /* callback private      */
+    defaultTranslations,                 /* tm_table              */
+    NULL,                                /* query_geometry        */
+    NULL,                                /* display_accelerator   */
+    NULL,                                /* extension             */
+    },
+#ifdef MOTIF
+    {
+    (XtWidgetProc)_XtInherit,             /* border_highlight      */
+    (XtWidgetProc)_XtInherit,             /* border_unhighligh     */
+    XtInheritTranslations,                /* translations          */
+/*** SOS!!!! Following line was replaced ...... */
+/*    (XtWidgetProc)_XtInherit,          arm_and_activate      */
+#if (XmVersion == 1001)
+    (XmArmAndActivate)_XtInherit,         /* arm_and_activate      */
+#else
+    (XtActionProc)_XtInherit,         /* arm_and_activate      */
+#endif
+    NULL,                                 /* syn_resources         */
+    0,                                    /* num_syn_resources     */
+    NULL,                                 /* extension             */
+    },
+#endif
+    {
+    0,                                    /* ignore                */
+    }
+};
+
+
+
+
+
+
+
+
+
+WidgetClass hyperWidgetClass = (WidgetClass) &hyperClassRec;
+
+/*---------------------------------------------------------------*/
+/* Create the two GCs needed                                     */
+/*---------------------------------------------------------------*/
+
+static void create_gcs(w)
+HyperWidget w;
+{
+    XGCValues values;
+    XtGCMask  valueMask;
+
+    valueMask = GCForeground | GCBackground | GCFont;
+
+    values.background = w->core.background_pixel;
+
+    values.foreground = w->hyper.highlight_color;
+    values.font       = w->hyper.highlight_font->fid;
+    w->hyper.highlight_gc = XtGetGC((Widget)w, valueMask, &values);
+
+    values.foreground = w->hyper.select_color;
+    w->hyper.select_gc = XtGetGC((Widget)w, valueMask, &values);
+
+    values.foreground = w->hyper.normal_color;
+    values.font       = w->hyper.normal_font->fid;
+    w->hyper.normal_gc = XtGetGC((Widget)w, valueMask, &values);
+
+
+
+    valueMask = GCBackground|GCForeground|GCFunction|GCGraphicsExposures;
+
+    values.background         = 0;
+    values.foreground         = w->hyper.normal_color ^ w->core.background_pixel;
+    values.graphics_exposures = False;
+    values.function           = GXxor;
+
+    w->hyper.xor_gc = XtGetGC((Widget)w, valueMask, &values);
+
+
+}
+
+/*--------------------------------------------------------------*/
+/* Initialize: Create the GCs                                   */
+/*--------------------------------------------------------------*/
+
+static void Initialize (request, new)
+HyperWidget request, new;
+{
+    /* Check the size of the widget */
+
+    if (request->core.width == 0)
+        new->core.width = 100;
+    if (request->core.height == 0)
+        new->core.height = 100;
+
+
+    /* Create the GCs */
+
+    create_gcs(new);
+
+    /* No text yet */
+
+    new->hyper.first_seg     = new->hyper.last_selected 
+        = new->hyper.last_cursor =  NULL;
+    new->hyper.hand     = XCreateFontCursor(XtDisplay(new),XC_hand2);
+
+    /* Nothing found */
+
+    new->hyper.grep_seg = NULL;
+    new->hyper.grep_txt = NULL;
+    new->hyper.grep_len = 0;
+    new->hyper.grep_off = 0;
+
+}
+
+/*--------------------------------------------------------------*/
+/* Free all memory allocated for the text segments              */
+/*--------------------------------------------------------------*/
+
+static void free_text(s)
+text_segment *s;
+{
+
+    while(s)
+    {
+        text_segment *p=s->next;
+        if(s->text) XtFree((XtPointer)s->text);
+        XtFree((XtPointer)s);
+        s = p;
+    }
+
+}
+
+/*--------------------------------------------------------------*/
+/* Destroy the widget: release all memory alocated              */
+/*--------------------------------------------------------------*/
+
+static void Destroy (w)
+HyperWidget w;
+{
+    free_text(w->hyper.first_seg);
+    XtReleaseGC((Widget)w, w->hyper.normal_gc);
+    XtReleaseGC((Widget)w, w->hyper.highlight_gc);
+    XtReleaseGC((Widget)w, w->hyper.xor_gc);
+    XtReleaseGC((Widget)w, w->hyper.select_gc);
+    XtRemoveAllCallbacks ((Widget)w,XtNactivateCallback);
+}
+
+/*--------------------------------------------------------------*/
+/* Resize : not implemented                                     */
+/*--------------------------------------------------------------*/
+
+
+static void Resize (w)
+HyperWidget w;
+{
+    /* 
+       For futur implementation
+       May be for text warp ...
+    */
+}
+
+/*--------------------------------------------------------------*/
+/* Redisplay : redraw the text                                  */
+/*--------------------------------------------------------------*/
+
+
+static void Redisplay (w, event, region)
+HyperWidget  w;
+XEvent       *event;
+Region        region;
+{
+
+    if(w->core.visible)
+    {
+        text_segment *s = w->hyper.first_seg;
+        int x = w->hyper.margin;
+        int y = 0;
+        Boolean newline = TRUE;
+
+        while(s)
+        {
+
+            /* change line on new lines */
+
+            if(newline)
+            {
+                x = w->hyper.margin;
+                y += s->height;
+            }
+
+            /* redraw only what is needed */
+
+            if(XRectInRegion(region,x,y-s->height+s->desc,s->width,s->height)
+                != RectangleOut)
+            {
+
+                XDrawImageString(XtDisplay (w), XtWindow (w), 
+                    s->gc,
+                    x,
+                    y,
+                    s->text,
+                    s->length);
+
+				if(s->type == HIGHLIGHT)
+				{
+					XDrawLine(XtDisplay (w), XtWindow (w), 
+						s->gc,  
+						x,
+						y+1,
+						x+s->width,
+						y+1);
+				}
+            }
+
+            x += s->width;
+
+            newline = (s->type == NEWLINE);
+
+            s = s->next;
+        }
+
+
+        if(w->hyper.grep_seg)
+        {
+            if(XRectInRegion(region,
+                w->hyper.grep_x,
+                w->hyper.grep_y,
+                w->hyper.grep_width,
+                w->hyper.grep_height) != RectangleOut)
+
+                XFillRectangle(XtDisplay(w),XtWindow(w),
+                    w->hyper.xor_gc,
+                    w->hyper.grep_x,
+                    w->hyper.grep_y,
+                    w->hyper.grep_width,
+                    w->hyper.grep_height);
+
+        }
+    }
+}
+
+/*------------------------------------------------------------------*/
+/* SetValues : redraw only for font or color changes                */
+/*------------------------------------------------------------------*/
+
+static Boolean SetValues (current, request, new)
+HyperWidget current, request, new;
+{
+    Boolean    redraw = FALSE;
+
+#define HAS_CHANGED(a)    (new->a != current->a)
+
+    if(
+        HAS_CHANGED(core.background_pixel) ||
+        HAS_CHANGED(hyper.select_color)    ||
+        HAS_CHANGED(hyper.highlight_color) ||
+        HAS_CHANGED(hyper.highlight_font)  ||
+        HAS_CHANGED(hyper.normal_color)    ||
+        HAS_CHANGED(hyper.normal_font)
+        )
+    {
+
+        XtReleaseGC((Widget)new, new->hyper.normal_gc);
+        XtReleaseGC((Widget)new, new->hyper.highlight_gc);
+        XtReleaseGC((Widget)new, new->hyper.xor_gc);
+        XtReleaseGC((Widget)new, new->hyper.select_gc);
+        create_gcs(new);
+
+        /* rebuild text */
+/*
+        if(HAS_CHANGED(hyper.normal_font) || 
+            HAS_CHANGED(hyper.highlight_font))
+			*/
+            create_new_text(new);
+
+        redraw = TRUE;
+    }
+
+    return (redraw);
+
+#undef HAS_CHANGED
+
+}
+
+/*------------------------------------------------------------------*/
+/* Calculate the size of the widget                                 */
+/*------------------------------------------------------------------*/
+
+static void calc_new_size (w)
+HyperWidget  w;
+{
+    text_segment       *s = w->hyper.first_seg;
+    int                 x = w->hyper.margin;
+    int                 y = 0;
+    int                 last_height = 0;
+    Boolean             newline = TRUE;
+    Dimension           maxWidth = w->hyper.margin;
+    Dimension           maxHeight = w->hyper.margin;
+    XtGeometryResult    result;
+    Dimension           replyWidth = 0, replyHeight = 0;
+
+    /* Get the size of the widget */
+
+    while(s)
+    {
+        if(newline)
+        {
+            if (x > (int) maxWidth) maxWidth=x;
+            x = w->hyper.margin;
+            y += s->height;
+            if(y > (int) maxHeight) maxHeight=y;
+
+        }
+
+        s->x = x;
+        s->y = y - s->height;
+
+        x += s->width;
+
+        newline = (s->type == NEWLINE);
+        last_height = s->height;
+
+        s = s->next;
+    }
+
+    x+= w->hyper.margin;
+    y+= last_height;
+
+    if((Dimension) x > maxWidth ) maxWidth=x;
+    if((Dimension) y > maxHeight) maxHeight=y;
+
+    /* 
+    Tell our parent we want a new size 
+    */
+
+    if(w->core.width != maxWidth || w->core.height != maxHeight)
+    {
+        result = XtMakeResizeRequest((Widget)w,maxWidth,maxHeight, 
+            &replyWidth, &replyHeight) ;
+
+        if (result == XtGeometryAlmost)
+            XtMakeResizeRequest ((Widget)w, replyWidth, replyHeight,NULL, NULL);
+
+    }
+}
+
+/*-----------------------------------------------------------------------*/
+/* Find the "visible" part of a widget as the intersection of all the    */
+/* windows of it's parents' windows                                      */
+/*-----------------------------------------------------------------------*/
+
+static void find_visible_part(w,x,y,width,height)
+Widget    w;
+Position  *x;
+Position  *y;
+Dimension *width;
+Dimension *height;
+{
+    Position root_x,root_y;
+    Widget   p = w;
+
+    *width  = w->core.width;
+    *height = w->core.height;
+    XtTranslateCoords(w,0,0,&root_x,&root_y);
+
+    *x = 0;
+    *y = 0;
+
+    while((p = XtParent(p)))
+    {
+        Position  rx,ry;
+        Dimension w,h;
+
+        /* 
+           make all computations in the root's
+           coordinate system
+        */
+
+        XtTranslateCoords(p,0,0,&rx,&ry);
+
+        w = p->core.width;
+        h = p->core.height;
+
+        /* 
+            use the smallest rectangle
+        */
+
+        if(w < *width)  *width  = w;
+        if(h < *height) *height = h;
+
+        if(rx>root_x) root_x = rx;
+        if(ry>root_y) root_y = ry;
+
+        /* stop when reach a shell,
+          don't go to top level shell */
+        if(XtIsShell(p)) break;
+    }
+
+    /* Back to the widget's coordinate system */
+
+    XtTranslateCoords(w,0,0,x,y);
+    *x = root_x - *x;
+    *y = root_y - *y;
+
+
+}
+
+/*-----------------------------------------------------------------------*/
+/* Do a "zoom" effect animation, from the selected text segment to the  */
+/* visible part of the widget                                            */
+/*-----------------------------------------------------------------------*/
+
+static void zoom_open(w,s)
+HyperWidget   w;
+text_segment *s;
+{
+    int dx1,dx2,dy1,dy2;
+
+    Position x ;
+    Position y ;
+    Dimension width  ;
+    Dimension height ;
+
+    /* selected rectangle */
+
+    Position  xs = s->x;
+    Position  ys = s->y;
+    Dimension ws = s->width;
+    Dimension hs = s->height;
+
+
+    /* get the rectangle we want to zoom to */
+
+    find_visible_part((Widget)w,&x,&y,&width,&height);
+
+    /* make sure selected rectangle in visible */
+
+    if(xs<x) xs = x;
+    if(ys<y) ys = y;
+    if((Dimension)(xs+ws) > (Dimension)(x+width))  ws = x+width-xs;
+    if((Dimension)(ys+hs) > (Dimension)(y+height)) hs = y+height-ys;
+
+    /* get the offsets in each directions */
+
+    dx1 = x-xs;
+    dy1 = y-ys;
+    dx2 = ((x+width)-(xs+ws));
+    dy2 = ((y+height)-(ys+hs));
+
+    /* in the rectangles are differents */
+
+    if(dx1 || dy1 || dx2 || dy2)
+    {
+        int min = 32000; /* <-- Can be buggy */
+
+        /* 
+          work in "left,top,bottom,right" rectangles (Mac)
+          rather than "x,y,width,height" (X)
+          It's easier for the animation 
+        */
+
+        int xws = xs+ws;
+        int yhs = ys+hs;
+
+        /* Get smallest non-null offset */
+
+        if(dx1) min = MIN(min,ABS(dx1));
+        if(dx2) min = MIN(min,ABS(dx2));
+        if(dy1) min = MIN(min,ABS(dy1));
+        if(dy2) min = MIN(min,ABS(dy2));
+
+        /* Scale offsets so minimun offset is 1 pixel */
+
+        dx1 /= min;
+        dx2 /= min;
+        dy1 /= min;
+        dy2 /= min;
+
+        /* Use speed .. */
+
+        dx1 *= w->hyper.speed;
+        dx2 *= w->hyper.speed;
+        dy1 *= w->hyper.speed;
+        dy2 *= w->hyper.speed;
+
+        /* Animate */
+
+        while(min--)
+        {
+            XDrawRectangle(XtDisplay(w),XtWindow(w),
+                w->hyper.xor_gc,xs,ys,xws-xs,yhs-ys);
+
+            /* Needed, otherwise X calls are buffered */
+            XSync(XtDisplay(w),False);
+
+            XDrawRectangle(XtDisplay(w),XtWindow(w),
+                w->hyper.xor_gc,xs,ys,xws-xs,yhs-ys);
+
+            xs += dx1;
+            ys += dy1;
+
+            xws += dx2;
+            yhs += dy2;
+
+        }
+    }
+
+}
+
+/*----------------------------------------------------------------------*/
+/* Find the text segment at point (x,y)                                 */
+/*----------------------------------------------------------------------*/
+static text_segment *find_segment(w,x,y)
+HyperWidget w;
+int x,y;
+{
+    text_segment *s = w->hyper.first_seg;
+
+    while(s)
+    {
+        if( s->type == HIGHLIGHT &&
+            x >= s->x &&
+            y >= s->y &&
+            (Dimension) x <= (Dimension) (s->x + s->width) &&
+            (Dimension) y <= (Dimension) (s->y + s->height) 
+            )
+            return s;
+        s = s->next;
+    }
+
+	return NULL;
+}
+
+/*----------------------------------------------------------------------*/
+/* highlight text under cursor                                          */
+/*----------------------------------------------------------------------*/
+static void hilite(HyperWidget w,Boolean on)
+{
+
+    text_segment *s = w->hyper.last_selected;
+
+    if(s)
+        XDrawImageString(XtDisplay (w), XtWindow (w),
+            on?w->hyper.select_gc:s->gc,
+            s->x,
+            s->y+s->height,
+            s->text, s->length);
+
+}
+
+/*-----------------------------------------------------------------------*/
+/* Check for mouse down                                                  */
+/*-----------------------------------------------------------------------*/
+
+static void xselect (w, event, args, n_args)
+HyperWidget   w;
+XEvent        *event;
+char          *args[];
+int            n_args;
+{
+    text_segment *s;
+
+    /* 
+       Find if the used clicked in an 
+       highlighted text 
+    */
+
+    if((s = w->hyper.last_selected = find_segment(w,event->xbutton.x,event->xbutton.y)))
+        hilite(w,TRUE);
+}
+
+/*-----------------------------------------------------------------------*/
+/* Check for mouse up                                                    */
+/*-----------------------------------------------------------------------*/
+
+static void activate (w, event, args, n_args)
+HyperWidget   w;
+XEvent        *event;
+char          *args[];
+int            n_args;
+{
+    hyperCallbackStruct cb;
+    text_segment *s;
+
+    /* 
+       Find if the user clicked in an 
+       highlighted text 
+    */
+
+    if((s = find_segment(w,event->xbutton.x,event->xbutton.y))
+        && (s == w->hyper.last_selected))
+    {
+        hilite(w,FALSE);
+
+        /* zoom if required */
+
+        if(w->hyper.zoom) zoom_open(w,s);
+
+        /* Fill callback struct */
+
+        cb.text     = s->text;
+        cb.length   = s->length;
+        cb.reason   = HYPER_REASON;
+        cb.event    = event;
+
+        /* call callbacks */
+
+        XtCallCallbacks((Widget)w, XtNactivateCallback, (XtPointer)&cb);
+    }
+    w->hyper.last_selected = NULL;
+}
+
+/*-----------------------------------------------------------------------*/
+/* Check for mouse moves                                                 */
+/*-----------------------------------------------------------------------*/
+
+static void cursor (w, event, args, n_args)
+HyperWidget   w;
+XEvent        *event;
+char          *args[];
+int            n_args;
+{
+
+    text_segment *s;
+
+    s = find_segment(w,event->xbutton.x,event->xbutton.y);
+
+    if(s != w->hyper.last_cursor)
+    {
+        if(s)
+            XDefineCursor(XtDisplay(w),XtWindow(w),w->hyper.hand);
+        else
+            XUndefineCursor(XtDisplay(w),XtWindow(w));
+        hilite(w,s == w->hyper.last_selected);
+        w->hyper.last_cursor = s;
+    }
+
+}
+
+static void xincrement (h, event, args, n_args)
+HyperWidget   h;
+XEvent        *event;
+char          *args[];
+int            n_args;
+{
+#ifdef MOTIF
+#define SetArg(a,b)  XtSetArg(al[ac],a,b);ac++
+#define GetValues(w) XtGetValues(w,al,ac);ac=0
+#define SetValues(w) XtSetValues(w,al,ac);ac=0
+
+  Widget clip = XtParent(h);
+  Widget swin;
+  Widget v_scroll;
+
+  int ac = 0;
+
+//  Position    x_grep,y_grep;
+//  Dimension   h_grep,w_grep;
+//  Position    x_clip,y_clip;
+//  Dimension   h_clip,w_clip;
+//  Position    dv=0,dh=0;
+//  int min,max;
+//  int v_val,v_size,v_inc,v_page;
+//  int h_val,h_size,h_inc,h_page;
+//  Position x,y;
+  
+  Position    dh=0;
+
+  Arg al[5];
+
+  // https://software.ecmwf.int/issues/browse/SUP-646
+
+  /* printf("## mouse 1\n"); */
+  if(!clip) return;
+  swin = XtParent(clip);
+
+  /* printf("## mouse 2\n"); */
+  // if(!swin || !XmIsScrolledWindow(swin)) return;
+  if(!swin) return;
+
+  /* printf("## mouse 3\n"); */
+  // 20131126 if (n_args != 1) return;
+  SetArg(XmNverticalScrollBar  , &v_scroll);
+  GetValues(swin);
+  
+  {
+    int min = 0;
+    int max = 80; 
+    int value = 0;
+    int slider_size = 80;
+    int inc = 10;
+    int page_inc = 100;
+    SetArg(XmNminimum,&min); /* ??? */
+    SetArg(XmNmaximum,&max);    
+    SetArg(XmNvalue,&value);    
+    SetArg(XmNsliderSize,&slider_size);    
+    SetArg(XmNincrement,&inc);    
+    /* SetArg(XmNpageIncrement,&page_inc);     ??? */ 
+    
+    GetValues(v_scroll);
+    /* XmScrollBarGetValues(v_scroll, value, slider_size, inc, page_inc); */
+    
+    int arg = atoi(args[0]);
+    dh = (abs(arg) > 5) ? page_inc : inc;
+
+    if (arg < 0) {
+      if (value - dh < min)
+        value = min;
+      else
+        value -= dh;
+    } else {
+      if (value + dh > max)
+        value = max;
+      else
+        value += dh;
+    }
+
+    XmScrollBarSetValues(v_scroll,value,slider_size, inc, page_inc,TRUE);
+  }
+#endif
+}
+
+/*-----------------------------------------------------------------------*/
+/* Add a new text segment to the text                                    */
+/*-----------------------------------------------------------------------*/
+/* static void add_to_text(w,word,type) */
+static void add_to_text(w,word,type,offset)	/* add offset */
+HyperWidget w;
+char *word;
+int  type;
+int offset;             /* add offset */
+{
+    text_segment *s = XtNew(text_segment);
+    XCharStruct   char_info;
+    int dir,ascent,desc;
+    text_segment *p,*q;
+
+    s->next = NULL;
+    s->text = (word?XtNewString(word):NULL);
+    s->type = type;
+    s->gc   = (type == HIGHLIGHT ? w->hyper.highlight_gc : w->hyper.normal_gc);
+    s->x    = s->y = s->width = s->height = 0;
+    s->length = (word?strlen(word):0);
+	if(offset>=0) s->offset = offset;           /* add offset */
+
+    XTextExtents(
+        (type == HIGHLIGHT ? w->hyper.highlight_font : w->hyper.normal_font),
+        word,
+        s->length,
+        &dir,&ascent,&desc,&char_info);
+
+    s->height = ascent + desc;
+    s->desc   = desc;
+    s->width  = char_info.width;
+
+    if((p = w->hyper.first_seg))
+    {
+        while(p)
+        {
+            q=p;
+            p=p->next;
+        }
+        q->next = s;
+    }
+    else w->hyper.first_seg = s;
+}
+
+/*-----------------------------------------------------------------------*/
+/* Rebuild the text structure. Called when the font changes              */
+/*-----------------------------------------------------------------------*/
+
+static void create_new_text(w)
+HyperWidget   w;
+{
+    text_segment *s = w->hyper.first_seg;
+
+    w->hyper.first_seg = w->hyper.last_selected = w->hyper.last_cursor = NULL;
+
+    while(s)
+    {
+        /* add_to_text(w,s->text,s->type); */
+        add_to_text(w,s->text,s->type, -1);	/*don't update offset */
+        s = s->next;
+    }
+    free_text(s);
+    calc_new_size(w);
+}
+
+/*-----------------------------------------------------------------------*/
+/* Build the text. Gets the chars from the funtion "get_next_char"       */
+/* using "data" as a parameter                                           */
+/*-----------------------------------------------------------------------*/
+
+static void set_text(w,get_next_char,data)
+HyperWidget   w;
+char (*get_next_char)(XtPointer);
+XtPointer data;
+{
+    char word[MAX_LINE_SIZE];
+    int  i = 0;
+    char soh = w->hyper.start_of_highlight;
+    char eoh = w->hyper.end_of_highlight;
+    char c;
+    int  mode = NORMAL;
+	int offset = 0;		/* add offset */
+
+    free_text(w->hyper.first_seg);
+    w->hyper.first_seg = w->hyper.last_selected = w->hyper.last_cursor = NULL;
+    w->hyper.grep_seg = NULL;
+    w->hyper.grep_txt = NULL;
+    w->hyper.grep_len = 0;
+    w->hyper.grep_off = 0;
+
+    while((c = (get_next_char)(&data)))
+    {
+
+        /* New line */
+
+        if(c == '\n')
+        {
+            word[i]=0;
+            /* if(i) add_to_text(w,word,mode); */
+            if(i) {									/* add offset */
+				add_to_text(w,word,mode,offset);	/* add offset */
+				offset+=i;                          /* increment offset */
+			}										/* add offset */
+            /* add_to_text(w,NULL,NEWLINE); */
+            add_to_text(w,NULL,NEWLINE, offset);	/* add offset */
+            i = 0;
+        }
+
+        /* Start of highlight */
+
+        else if(c == soh)
+        {
+            word[i]=0;
+            /* if(i) add_to_text(w,word,mode); */
+            if(i) {									/* add offset */
+				add_to_text(w,word,mode,offset);	/* add offset */
+				offset += i;                       /* increment offset */
+			}										/* add offset */
+            mode = HIGHLIGHT;
+            i = 0;
+        }
+
+        /* End of highlight */
+
+        else if(c == eoh)
+        {
+            word[i]=0;
+            /* if(i) add_to_text(w,word,mode); */
+            if(i) {						/* add offset */
+				add_to_text(w,word,mode,offset); /* add offset */
+				offset += i+2;         /* increment offset, 2 to iclude tags */
+			}							/* add offset */
+            mode = NORMAL;
+            i = 0;
+        }
+        else 
+        {
+            if(c=='\t') c = ' ';
+            word[i++] = c;
+            if(i==MAX_LINE_SIZE)
+            {
+                word[--i]=0;
+                /* add_to_text(w,word,mode); */
+                add_to_text(w,word,mode,offset);	/* add offset */
+                i=0;
+                word[i++] = c;
+            }
+        }
+    }
+
+    /* flush .. */
+
+    if(i)
+    {
+        word[i]=0;
+        add_to_text(w,word,mode,offset);
+    }
+
+    calc_new_size(w);
+
+	/* br advised, vk realized 02 Jun 94 */
+    if(XtIsRealized((Widget) w))
+	    XClearArea(XtDisplay(w),XtWindow(w),0,0,0,0,True);
+
+}
+
+/*-----------------------------------------------------------------------*/
+/* Create a new HyperWidget                                              */
+/*-----------------------------------------------------------------------*/
+
+Widget CreateHyper(parent,name,al,ac)
+Widget parent;
+char   *name;
+ArgList al;
+int     ac;
+{
+    return XtCreateWidget(name,hyperWidgetClass,parent,al,ac);
+}
+
+
+/*-----------------------------------------------------------------------*/
+/* Load the text from a file                                             */
+/*-----------------------------------------------------------------------*/
+
+/* provides chars to "set_text" routine */
+
+static char get_from_file(XtPointer d)
+{
+	FILE **f = (FILE**)d;
+    int n =  getc(*f);
+    return (n==EOF?0:(char)n);
+}
+
+/* Public routine */
+
+void HyperLoadFile(widget,fname)
+Widget widget;
+char   *fname;
+{
+/*#ifndef linux
+    extern char *sys_errlist[];
+    #endif*/
+
+    FILE *f = fopen(fname,"r");
+    if(f)
+    {
+        set_text((HyperWidget)widget,get_from_file,(XtPointer)f);
+        fclose(f);
+    }
+    else
+    {
+        char msg[1024];
+        sprintf(msg,"%s: %s",fname,strerror(errno)); /* sys_errlist[errno]); */
+        XtWarning(msg);
+    }
+
+}
+
+/*-----------------------------------------------------------------------*/
+/* Load text from memory buffer                                          */
+/*-----------------------------------------------------------------------*/
+
+/* provides chars to "set_text" routine */
+
+static char get_from_buffer(XtPointer d)
+{
+	char **buffer = (XtPointer)d;
+    char c = **buffer;
+    (*buffer)++;
+    return c;
+}
+
+/* Public routine */
+
+void HyperSetText(widget,text)
+Widget  widget;
+char *text;
+{
+    set_text((HyperWidget)widget,get_from_buffer,(XtPointer)text);
+}
+
+/*-----------------------------------------------------------------------*/
+/* Specifies start and end of highlignt chars                            */
+/*-----------------------------------------------------------------------*/
+
+#ifdef _NO_PROTO
+
+void HyperSetTags(widget,start_highlight,end_highlight)
+Widget   widget;
+int start_highlight;
+int end_highlight;
+
+#else
+
+void HyperSetTags(Widget widget,
+				  int start_highlight,
+				  int end_highlight)
+
+#endif
+
+{
+    ((HyperWidget)widget)->hyper.start_of_highlight = start_highlight;
+    ((HyperWidget)widget)->hyper.end_of_highlight = end_highlight;
+}
+
+
+/*-----------------------------------------------------------------------*/
+/* convert a string to lower case                                        */
+/*-----------------------------------------------------------------------*/
+
+static void lowcase(p)
+register char *p;
+{
+    while(*p)
+    {
+        if(isupper(*p)) *p += 32;
+        p++;
+    }
+}
+
+/*-----------------------------------------------------------------------*/
+/* Returns the text of the widget                                        */
+/* the memory is allocated. It must be freed by the application          */
+/* If include_tags if FALSE, the special characters are not returned     */
+/*-----------------------------------------------------------------------*/
+
+#ifdef _NO_PROTO
+
+char *HyperGetText(widget,include_tags)
+Widget widget;
+Boolean include_tags;
+
+#else
+
+char *HyperGetText(Widget widget,Boolean include_tags)
+
+#endif
+{
+
+    HyperWidget  w = (HyperWidget)widget;
+    char         *p ;
+    text_segment *s = w->hyper.first_seg;
+    int          len = 1;
+    char         soh[2];
+    char         eoh[2];
+
+    soh[0] = w->hyper.start_of_highlight;
+    eoh[0] = w->hyper.end_of_highlight;
+
+    soh[1] = eoh[1] = 0;
+
+    /* Get size of text */
+
+    while(s)
+    {
+        len += s->length?s->length:1;
+        if(include_tags && s->type == HIGHLIGHT)
+            len += 2;
+        s = s->next;
+    }
+
+    p = XtMalloc(len);
+    *p = 0;
+
+    s = w->hyper.first_seg;
+    while(s)
+    {
+        if(s->length)
+        {
+            if(include_tags && s->type == HIGHLIGHT)
+                strcat(p,soh);
+            strcat(p,s->text);
+            if(include_tags && s->type == HIGHLIGHT)
+                strcat(p,eoh);
+        }
+        else
+            strcat(p,"\n");
+        s=s->next;
+    }
+
+    return p;
+
+}
+
+/*-----------------------------------------------------------------------*/
+/* Only for Motif                                                        */
+/* If the widget is in a XmScrolledWindow, scroll it so the selection is */
+/* visible                                                               */
+/*-----------------------------------------------------------------------*/
+
+static void show_selection(h)
+HyperWidget h;
+{
+#ifdef MOTIF
+
+    Widget clip = XtParent(h);
+    Widget swin;
+
+    Widget h_scroll;
+    Widget v_scroll;
+
+    int ac = 0;
+
+    Position    x_grep,y_grep;
+    Dimension   h_grep,w_grep;
+    Position    x_clip,y_clip;
+    Dimension   h_clip,w_clip;
+    Position    dv=0,dh=0;
+    int min,max;
+    int v_val,v_size,v_inc,v_page;
+    int h_val,h_size,h_inc,h_page;
+    Position x,y;
+
+    Arg al[5];
+
+
+
+    /* check if selection exists */
+
+    if(!h->hyper.grep_seg) return;
+
+    /* check if the widget is in a scrolled window */
+    /* the XnScrolledWindow creates a clip window  */
+    /* The widget's parent is the clip window      */
+
+
+    if(!clip) return;
+    swin = XtParent(clip);
+
+    if(!swin || !XmIsScrolledWindow(swin)) return;
+
+    /* Get window scroll bars */
+
+    SetArg(XmNhorizontalScrollBar, &h_scroll);
+    SetArg(XmNverticalScrollBar  , &v_scroll);
+    GetValues(swin);
+
+    /* Get size of clip window and selection rect */
+
+    w_clip = clip->core.width;
+    h_clip = clip->core.height;
+
+    w_grep = h->hyper.grep_width;
+    h_grep = h->hyper.grep_height;
+
+    /* Get global coordinates of clip and selection rect */
+
+    XtTranslateCoords(clip,0,0,&x_clip,&y_clip);
+    XtTranslateCoords((Widget)h,h->hyper.grep_x,h->hyper.grep_y,&x_grep,&y_grep);
+
+    /* offset of selection within clip window */
+
+    x = x_grep - x_clip;
+    y = y_grep - y_clip;
+
+
+    /* selection y coordinate is not visible */
+
+    if( y < 0 || (Dimension) (y + h_grep) > h_clip)
+    {
+        /* the widget must be moved verticaly by dv pixels */
+
+        dv = (y + h_grep / 2)  - h_clip / 2;
+
+        SetArg(XmNminimum,&min);
+        SetArg(XmNmaximum,&max);
+
+        GetValues(v_scroll);
+
+        XmScrollBarGetValues(v_scroll,&v_val,&v_size,&v_inc,&v_page);
+
+        max -= v_size;
+
+        if( dv + v_val > max ) dv = max - v_val;
+        if( dv + v_val < min ) dv = min - v_val;
+
+
+    }
+
+    /* selection x coordinate is not visible */
+
+    if( x < 0 || (Dimension) (x + w_grep) > w_clip)
+    {
+        /* the widget must be moved horizontaly by dh pixels */
+
+        dh = (x + w_grep / 2)  - w_clip / 2;
+
+        SetArg(XmNminimum,&min);
+        SetArg(XmNmaximum,&max);
+        GetValues(h_scroll);
+
+        XmScrollBarGetValues(h_scroll,&h_val,&h_size,&h_inc,&h_page);
+
+        max -= h_size;
+
+        if( dh + h_val > max ) dh = max - h_val;
+        if( dh + h_val < min ) dh = min - h_val;
+
+    }
+
+    /* if the widget must be moved */
+
+    if(dv || dh)
+    {
+        Position x = h->core.x-dh;
+        Position y = h->core.y-dv;
+
+        /* move it */
+
+        SetArg(XmNx,x);
+        SetArg(XmNy,y);
+        SetValues((Widget)h);
+
+        /* update scroll bars */
+
+        if(dv) XmScrollBarSetValues(v_scroll,v_val+dv,v_size,v_inc,
+            v_page,TRUE);
+        if(dh) XmScrollBarSetValues(h_scroll,h_val+dh,h_size,h_inc,
+            h_page,TRUE);
+
+
+    }
+
+
+#endif /* MOTIF */
+}
+
+/*-----------------------------------------------------------------------*/
+/* Clear previous selection                                              */
+/*-----------------------------------------------------------------------*/
+
+static void clear_selection(w)
+HyperWidget w;
+{
+    if(w->hyper.grep_seg)
+    {
+        if(XtIsRealized((Widget)w))
+
+            /* force a redraw */
+
+            XClearArea(XtDisplay(w),XtWindow(w),
+                w->hyper.grep_x,
+                w->hyper.grep_y,
+                w->hyper.grep_width,
+                w->hyper.grep_height,
+                TRUE);
+
+    }
+    w->hyper.grep_seg = NULL;
+}
+
+/*-----------------------------------------------------------------------*/
+/* Set the new selection                                                 */
+/*-----------------------------------------------------------------------*/
+
+static void set_selection(w)
+HyperWidget w;
+{
+    if(w->hyper.grep_seg)
+    {
+        text_segment *s = w->hyper.grep_seg;
+        XCharStruct   char_info;
+        int dir,ascent,desc;
+
+        /* get size of the begining of
+           the segment, up to the found string */
+
+        XTextExtents(
+            (s->type == HIGHLIGHT ? 
+            w->hyper.highlight_font : 
+            w->hyper.normal_font),
+            s->text,
+            w->hyper.grep_off,
+            &dir,&ascent,&desc,&char_info);
+
+        w->hyper.grep_x      = s->x + char_info.width;
+        w->hyper.grep_y      = s->y + desc;
+        w->hyper.grep_height = s->height;
+
+        /* Get size of the selection */
+
+        XTextExtents(
+            (s->type == HIGHLIGHT ? 
+            w->hyper.highlight_font : 
+            w->hyper.normal_font),
+            w->hyper.grep_txt,
+            w->hyper.grep_len,
+            &dir,&ascent,&desc,&char_info);
+
+
+        w->hyper.grep_width  = char_info.width;
+
+        /* force update */
+
+        if(XtIsRealized((Widget)w))
+            XClearArea(XtDisplay(w),XtWindow(w),
+                w->hyper.grep_x,
+                w->hyper.grep_y,
+                w->hyper.grep_width,
+                w->hyper.grep_height,
+                TRUE);
+    }
+}
+
+/*-----------------------------------------------------------------------*/
+/* Select a word in the hyper widget                                     */
+/* word : word to find ( or regular expression if USE_REGEX is defined)  */
+/* ignore_case : if TRUE ignore case in comparaison                      */
+/* from_start : if TRUE search from start of text, else search from      */
+/* current selection                                                     */
+/* wrap: if TRUE, continue search from the begining of text if the end   */
+/* is reached                                                            */
+/*-----------------------------------------------------------------------*/
+
+#ifdef _NO_PROTO
+
+Boolean HyperGrep(widget,word,ignore_case,from_start,wrap)
+Widget   widget;
+char     *word;
+Boolean  ignore_case;
+Boolean  from_start;
+Boolean  wrap;
+
+#else
+
+Boolean HyperGrep(Widget widget,
+				  char *word,
+				  Boolean ignore_case,
+				  Boolean from_start,
+				  Boolean wrap)
+
+#endif
+
+{
+    HyperWidget  h = (HyperWidget)widget;
+    char         *w = word;
+    char         *p;
+    int          offset;
+    text_segment *s;
+
+    if(!h->hyper.first_seg) return False;
+
+    if(ignore_case)
+    {
+        /* if ignore case, change word to lower case */
+        w = XtNewString(word);
+        lowcase(w);
+    }
+
+    /* compile the regular expression */
+    xec_compile(w);
+
+
+    if(ignore_case) XtFree((XtPointer)w);
+
+    /* if from_start or no previous selection, 
+       start from first segment */
+
+    if(from_start || h->hyper.grep_seg == NULL)
+    {
+        offset=0;
+        wrap = FALSE;
+        s = h->hyper.first_seg;
+    }
+    else 
+    {
+        /* start from last selection */
+
+        offset = h->hyper.grep_off + h->hyper.grep_len;
+        s = h->hyper.grep_seg;
+    }
+
+    for(;;)
+    {
+        if(s->text)
+        {
+            if(ignore_case)
+            {
+                /* if ignore case, change segment to lower case */
+                p = XtNewString(s->text);
+                lowcase(p);
+            }
+			else
+				p = s->text;
+
+            /* search the string */
+
+            if(xec_step(p+offset))
+            {
+                /* if found ...*/
+
+                /* clear previous selection */
+                clear_selection(h);
+
+                h->hyper.grep_seg = s;
+                h->hyper.grep_off = offset + (xec_loc1-(p+offset));
+                h->hyper.grep_txt = s->text + h->hyper.grep_off;
+                h->hyper.grep_len = xec_loc2-xec_loc1;
+
+                /* set new selection */
+
+                set_selection(h);
+
+                /* make it visible */
+
+                show_selection(h);
+
+                if(ignore_case) XtFree((XtPointer)p);
+
+                return TRUE;
+            }
+
+            if(ignore_case) XtFree((XtPointer)p);
+        }
+
+        offset = 0;
+        s = s->next;
+
+        /* if end of text and wrap mode, go to start of text */
+        if(!s)
+	{
+            if(wrap)
+            {
+                wrap = FALSE;
+                s = h->hyper.first_seg;
+            }
+            else break;
+	}
+
+    }
+
+
+    return FALSE;
+
+}
diff --git a/ecflow_4_0_7/view/src/Hyper.h b/ecflow_4_0_7/view/src/Hyper.h
new file mode 100644
index 0000000..f60f475
--- /dev/null
+++ b/ecflow_4_0_7/view/src/Hyper.h
@@ -0,0 +1,119 @@
+#ifndef  HYPER_H
+#define  HYPER_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+/* 
+    If you define MOTIF, the widget will inherit proprieties 
+   from the XmPrimitive class : Help Callback, user data, ...
+*/
+
+#ifndef MOTIF
+#define MOTIF
+#endif
+
+/*
+   If your machine got regexp.h
+*/
+
+
+extern WidgetClass hyperWidgetClass;
+typedef struct _HyperClassRec * HyperWidgetClass;
+typedef struct _HyperRec      * HyperWidget;
+
+/*
+ * Define resource strings for the Hyper widget.
+ */
+
+#define XtNhighlightFont     "highlightFont"
+#define XtNnormalFont        "normalFont"
+#define XtNhighlightColor    "highlightColor"
+#define XtNselectColor       "selectColor"
+#define XtNnormalColor       "normalColor"
+#define XtNactivateCallback  "activateCallback"
+#define XtNzoomEffect        "zoomEffect"
+#define XtCZoom              "Zoom"
+#define XtNstartHighlight    "startHighlight"
+#define XtNendHighlight      "endHighlight"
+#define XtCTagChar           "TagChar"
+#define XtNzoomSpeed         "zoomSpeed"
+#define XtCZoomSpeed         "ZoomSpeed"
+#ifndef XtCMargin
+#define XtCMargin            "Margin"
+#endif
+#define XtNmargin            "margin"
+
+/*
+  Callback structure
+*/
+
+#define HYPER_REASON 1
+
+typedef struct {
+    int     reason;   /* always = HYPER_REASON                            */
+    XEvent *event;    /* event                                            */
+    char     *text;     /* pointer on highlighted text selected (read only) */
+    int  length;    /* length of selected text                          */
+}  hyperCallbackStruct;
+
+#ifdef _NO_PROTO
+
+extern Widget CreateHyper();
+extern void HyperLoadFile();
+extern void HyperSetText();
+extern void HyperSetTags();
+extern Boolean HyperFind();
+extern char    *HyperGetText();
+
+#else
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+    extern Widget CreateHyper(Widget parent,
+        char *name,
+        ArgList al,
+        int ac);
+
+    extern void HyperLoadFile(Widget widget,
+        char *fname);
+
+    extern void HyperSetText(Widget widget,
+        char *text);
+
+    extern void HyperSetTags (Widget widget,
+        int start_highlight,
+        int end_highlight);
+
+    Boolean HyperGrep(Widget  widget,
+        char    *word,
+        Boolean ignore_case,
+        Boolean from_start,
+        Boolean wrap);
+
+        char *HyperGetText(Widget widget,Boolean include_tags);
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* _NO_PROTO */
+
+#define XtIsHyper(w)     XtIsSubclass(w,hyperWidgetClass)
+
+#endif /* HYPER_H */
diff --git a/ecflow_4_0_7/view/src/HyperP.h b/ecflow_4_0_7/view/src/HyperP.h
new file mode 100644
index 0000000..cc0129f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/HyperP.h
@@ -0,0 +1,110 @@
+#ifndef HYPERP_H
+#define HYPERP_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#ifdef MOTIF
+#include <Xm/XmP.h>
+#if (XmVersion >= 1002)
+#include <Xm/PrimitiveP.h>
+#endif
+#endif
+
+/* Hyper class : no new fileds */
+
+typedef struct _HyperClassPart{
+    int ignore;
+} HyperClassPart;
+
+typedef struct _HyperClassRec{
+    CoreClassPart    core_class;
+#ifdef MOTIF
+    XmPrimitiveClassPart  primitive_class;
+#endif
+    HyperClassPart  hyper_class;
+} HyperClassRec;
+
+extern HyperClassRec hyperClassRec;
+
+/* Text segment */
+
+typedef struct text_segment {
+
+    struct text_segment *next; /* Next segment */
+    int          type;         /* NEWLINE, NORMAL or HIGHLIGHT */
+    char         *text;        /* pointer to text */
+    int          length;       /* length of text */
+    int          desc;         /* font descent */
+    GC           gc;           /* GC used to draw text */
+    Position     x,y;          /* Position of drawn text */
+    Dimension    width,height; /* Size of drawn text */
+	int			 offset;       /* KELD : offset from start of widget */
+
+} text_segment;
+
+typedef struct _HyperPart {
+
+    Cursor    hand;               /* Selecting cursor shape */
+
+    Pixel     normal_color;       /* Color of the normal text */
+    Pixel     highlight_color;    /* Color of the highlighted text */
+    Pixel     select_color;       /* Color of the selected text */
+
+    XFontStruct  *normal_font;    /* Font of the normal text */
+    XFontStruct  *highlight_font; /* Font of the highlighted text */
+
+    GC        normal_gc;          /* Gc for the normal text */
+    GC        highlight_gc;       /* Gc for the highlighted text */
+
+    GC        xor_gc;             /* Gc for zoom  */
+    GC        select_gc;          /* Gc for select */
+
+    Boolean  zoom;               /* zoom effect when selected */
+    int      speed;              /* zoom speed                */
+    char         start_of_highlight; /* start of highlighted text mark */
+    char         end_of_highlight;   /* end of highlighted text mark */
+
+    int      margin;             /* margins size */
+
+
+    text_segment         *grep_seg;  /* segment where found text is */
+
+    char                 *grep_txt;  /* pointer to found text */
+    int              grep_len;   /* length of found text */
+    int              grep_off;   /* offset of found text */
+
+    Position          grep_x;    /* rectangle of founf text*/
+    Position          grep_y;
+    Dimension        grep_width;
+    Dimension        grep_height;
+
+    text_segment        *first_seg;     /* the text segments         */
+    text_segment        *last_selected; /* last selected segment     */
+    text_segment        *last_cursor;   /* last under cursor segment */
+
+
+    XtCallbackList activate;         /* callback list             */
+
+} HyperPart;
+
+typedef struct _HyperRec {
+    CorePart          core;
+#ifdef MOTIF
+    XmPrimitivePart  primitive;
+#endif
+    HyperPart        hyper;
+} HyperRec;
+
+#endif /* HYPERP_H */
diff --git a/ecflow_4_0_7/view/src/SimpleBase.c b/ecflow_4_0_7/view/src/SimpleBase.c
new file mode 100644
index 0000000..1209e62
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleBase.c
@@ -0,0 +1,1304 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #10 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <X11/Intrinsic.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/CoreP.h>
+#include <X11/CompositeP.h>
+#include <X11/ConstrainP.h>
+#include <Xm/XmP.h>
+#include <Xm/DrawingAP.h>
+#include <Xm/ExtObjectP.h>
+#include <Xm/ScrollBar.h>
+#include "SimpleBase.h"
+#include "SimpleBaseP.h"
+
+static void             Initialize();
+static void             Destroy();
+static void             Realize();
+static Boolean          SetValues();
+
+
+#ifdef linux
+/* putting this into comments makes ctrl-left button for collector
+   disappear !! */
+static char defaultTranslations[] = "\
+ Shift<Btn5Down>: increment(1)\n       Shift<Btn4Down>: increment(-1)  \n\
+      <Btn5Down>: increment(10)\n           <Btn4Down>: increment(-10) \n\
+<BtnDown>:DrawingAreaInput()\n              <BtnUp>:DrawingAreaInput()\n\
+<Key>osfActivate:DrawingAreaInput()\n\
+~s ~m ~a <Key>Return:DrawingAreaInput()\n\
+~s ~m ~a <Key>space:DrawingAreaInput()\n\
+<Key>F1:DrawingAreaInput()\n\
+<Key>F2:DrawingAreaInput()\n";
+#else
+
+#define defaultTranslations XmInheritTranslations
+
+#endif
+
+static void xincrement();
+static XtActionsRec actionsList[] = {
+    { "increment",(XtActionProc) xincrement},
+};
+
+static XtResource resources[] = {
+	{XtNblinkColor, XtCBlinkColor, XtRPixel, sizeof (Pixel),
+	XtOffset(SimpleBaseWidget, simplebase.blink_color), XtRString,"Black"},
+
+	{XtNselected, XtCSelected, XtRInt, sizeof (int),
+	XtOffset(SimpleBaseWidget, simplebase.selected), XtRImmediate,(XtPointer)-1},
+
+	{"blinkRate", "BlinkRate", XtRInt, sizeof (int),
+	XtOffset(SimpleBaseWidget, simplebase.timeout), XtRImmediate,(XtPointer)500},
+
+	{XtNgetpsCallback,XtCCallback,XtRCallback,sizeof(caddr_t),
+	XtOffset (SimpleBaseWidget, simplebase.getps),XtRCallback,NULL},
+
+	{XtNlinkCallback,XtCCallback,XtRCallback,sizeof(caddr_t),
+	XtOffset (SimpleBaseWidget, simplebase.link),XtRCallback,NULL},
+
+	{XtNpsHeader,XtCPsHeader,XtRString,sizeof(String),
+	XtOffset (SimpleBaseWidget, simplebase.header),XtRImmediate,NULL},
+};
+
+
+SimpleBaseClassRec simplebaseClassRec = {
+	{
+	/* core_class fields  */
+	(WidgetClass) &xmDrawingAreaClassRec,/* superclass         */
+	"SimpleBase",                           /* class_name         */
+	sizeof(SimpleBaseRec),                /* widget_size        */
+	NULL,                             /* class_init         */
+	NULL,                             /* class_part_init    */
+	FALSE,                            /* class_inited       */
+	Initialize,                       /* initialize         */
+	NULL,                             /* initialize_hook    */
+	Realize,      /* realize            */
+	actionsList,                      /* actions            */
+	XtNumber(actionsList),            /* num_actions        */
+	resources,                        /* resources          */
+	XtNumber(resources),              /* num_resources      */
+	NULLQUARK,                        /* xrm_class          */
+	TRUE,                             /* compress_motion    */
+	XtExposeCompressMaximal,         /* compress_exposure  */
+	TRUE,                             /* compress_enterleave*/
+	TRUE,                             /* visible_interest   */
+	Destroy,                          /* destroy            */
+	NULL,                             /* resize             */
+	NULL,                             /* expose             */
+	SetValues,                        /* set_values         */
+	NULL,                             /* set_values_hook    */
+	XtInheritSetValuesAlmost,         /* set_values_almost  */
+	NULL,                             /* get_values_hook    */
+	NULL,                             /* accept_focus       */
+	XtVersion,                        /* version            */
+	NULL,                             /* callback_private   */
+	defaultTranslations,              /* tm_table           */
+	NULL,                             /* query_geometry     */
+	XtInheritDisplayAccelerator,      /* display_accelerator*/
+	NULL,                             /* extension          */
+	},
+	{
+	/* composite_class fields */
+	NULL,                            /* geometry_manager    */
+	NULL,                            /* change_managed      */
+	XtInheritInsertChild,            /* insert_child        */
+	XtInheritDeleteChild,            /* delete_child        */
+	NULL,                            /* extension           */
+	},
+	{ 
+	/* constraint_class fields */
+	NULL,                             /* subresources        */
+	0,                                /* subresource_count   */
+	0,                                /* constraint_size     */
+	NULL,                             /* initialize          */
+	NULL,                             /* destroy             */
+	NULL,                             /* set_values          */
+	NULL,                             /* extension           */
+	},
+	{
+	XtInheritTranslations,   /* default translations */
+	NULL,                    /* syn_resources          */
+	0,               /* num_syn_resources      */
+	NULL,                        /* syn_cont_resources     */
+	0,                           /* num_syn_cont_resources */
+	XmInheritParentProcess,  /* parent_process */
+	NULL,                        /* extension              */
+	},
+	{
+	NULL,
+	},
+	{
+	/* SimpleBase class fields */
+	NULL,
+	},
+};
+
+
+#ifndef MIN
+#define MIN(a,b) ((a)>(b)?(b):(a))
+#endif
+
+WidgetClass simplebaseWidgetClass = (WidgetClass) &simplebaseClassRec;
+
+//static void find_visible_part(Widget w,Position *x,Position *y,
+//	Dimension* width, Dimension* height)
+//{
+//    Position root_x,root_y;
+//    Widget   p = w;
+//
+//    *width  = w->core.width;
+//    *height = w->core.height;
+//    XtTranslateCoords(w,0,0,&root_x,&root_y);
+//
+//    *x = 0;
+//    *y = 0;
+//
+//    while((p = XtParent(p)))
+//    {
+//        Position  rx,ry;
+//        Dimension w,h;
+//
+//        /*
+//           make all computations in the root's coordinate system
+//        */
+//
+//        XtTranslateCoords(p,0,0,&rx,&ry);
+//
+//        w = p->core.width;
+//        h = p->core.height;
+//
+//        /*
+//            use the smallest rectangle
+//        */
+//
+//        if(w < *width)  *width  = w;
+//        if(h < *height) *height = h;
+//
+//        if(rx>root_x) root_x = rx;
+//        if(ry>root_y) root_y = ry;
+//
+//        /* stop when reach a shell, don't go to top level shell */
+//        if(XtIsShell(p)) break;
+//    }
+//
+//    /* Back to the widget's coordinate system */
+//
+//    XtTranslateCoords(w,0,0,x,y);
+//    *x = root_x - *x;
+//    *y = root_y - *y;
+//}
+
+
+/*-----------------------------------------------------------------*/
+/* Find which gadget was called                                    */
+/*-----------------------------------------------------------------*/
+
+static void button_click(w,cd,event,continue_dispatch)
+SimpleBaseWidget    w;
+XtPointer *cd;
+XEvent    *event;
+Boolean   *continue_dispatch;
+{
+	int i;
+	Position    x,y;
+	XmDrawingAreaCallbackStruct cb;
+
+	x = event->xbutton.x;
+	y = event->xbutton.y;
+	// printf("bclick\n");
+
+	for (i = 0; i < w -> composite.num_children; i++)
+	{
+		Widget child = w -> composite.children[i];
+
+		if(  XtIsManaged(child) &&
+		    (x >= child->core.x && x <= child->core.x + child->core.width)
+		    && (y >= child->core.y && y <= child->core.y + child->core.height))
+		{
+			cb.reason = -1;
+			cb.event= event;
+			cb.window = (Window)child;
+			XtCallCallbacks((Widget)w,XmNinputCallback,(XtPointer)&cb);
+		}
+	}
+
+}
+
+
+/*-------------------------------------------------------------------*/
+/* Blink current gadget                                              */
+/*-------------------------------------------------------------------*/
+
+#if 0
+static void time_out(SimpleBaseWidget w,XtIntervalId id)
+{
+	if( w->simplebase.selected >= 0 && w->simplebase.selected < w->simplebase.count) {
+		NodeStruct *n = w->simplebase.nodes +  w->simplebase.selected;
+
+		if(XtIsRealized((Widget) w) && n->managed)
+		{
+			/* XFillRectangle */
+
+			XDrawRectangle(XtDisplay(w),XtWindow(w),
+			    w->simplebase.blink_gc,
+			    n->r.x+1,
+			    n->r.y+1,
+			    n->r.width-2,
+			    n->r.height-2);
+		}
+	}
+	w->simplebase.timeout_id = XtAppAddTimeOut(
+	    XtWidgetToApplicationContext((Widget)w),
+	    w->simplebase.timeout,
+	    (XtTimerCallbackProc)time_out,
+	    (XtPointer)w);
+}
+#endif
+
+static void clip_input_callback(clip,widget,cb)
+Widget clip;
+Widget widget;
+XtPointer cb;
+{
+	XtCallCallbacks(widget,XmNinputCallback,cb);
+}
+
+static XtCallbackRec clipcb[] = {
+	{ (XtCallbackProc)clip_input_callback, NULL, },
+	{ NULL,NULL,},
+};
+
+/*----------------------------------------------------*/
+/* Init : create blink gc                             */
+/*----------------------------------------------------*/
+
+static void Realize(SimpleBaseWidget w,XtValueMask *value_mask,
+XSetWindowAttributes *attributes)
+{
+	Widget clip,scroll,ww;
+	WidgetClass class = XtClass(w);
+
+	while(class != (WidgetClass)simplebaseWidgetClass)
+		class = class->core_class.superclass;
+	class = class->core_class.superclass;
+    	(class->core_class.realize) ((Widget) w, value_mask, attributes);
+
+	ww = (Widget)w;
+	while(ww){
+  	          if((clip = XtParent(ww)))
+ 		         if((scroll = XtParent(clip)))
+				if(XmIsScrolledWindow(scroll))
+				{
+					clipcb[0].closure = (XtPointer)w;
+					XtAddCallbacks(clip,XmNinputCallback,clipcb);
+				}
+		ww = clip;
+	}
+}
+
+static void Initialize(request, new)
+SimpleBaseWidget request, new;
+{
+	XGCValues values;
+	XtGCMask  valueMask;
+
+	/*
+   * Make sure the widget's width and height are 
+   * greater than zero.
+   */
+	if (request->core.width <= 0)
+		new->core.width = 5;
+	if (request->core.height <= 0)
+		new->core.height = 5;
+
+	new->simplebase.gc = XtGetGC((Widget)new,0,0);
+
+	valueMask = GCLineWidth ;
+	    /* GCForeground | GCBackground | GCFunction | | GCGraphicsExposures; */
+
+	values.foreground  = new->core.background_pixel^new->simplebase.blink_color;
+	values.background  = values.foreground;
+	values.function           = GXxor;
+	values.graphics_exposures = False;
+	values.line_width         = 2;
+
+	new->simplebase.blink_gc = XtGetGC((Widget)new,valueMask,&values);
+
+	XtAddEventHandler((Widget)new,ButtonPressMask,
+	    False,(XtEventHandler)button_click,(XtPointer)new);
+	XtAddEventHandler((Widget)new,KeyPressMask,
+	    False,(XtEventHandler)button_click,(XtPointer)new);
+
+	/* time_out(new,NULL); */
+
+	new->simplebase.focus = -1;
+	new->simplebase.max   = 0;
+	new->simplebase.link_max  = 0;
+	new->simplebase.count = 0;
+	new->simplebase.link_count = 0;
+	new->simplebase.nodes = NULL;
+	new->simplebase.links = NULL;
+	new->simplebase.work  = 0;
+}
+
+
+/*----------------------------------------------------------*/
+/*----------------------------------------------------------*/
+
+static void Destroy(SimpleBaseWidget w)
+{
+	Widget clip,scroll,ww;
+
+	//printf("Destroy(SimpleBaseWidget w)\n");
+
+	NodeReset((Widget)w);
+
+	XtRemoveEventHandler((Widget)w,ButtonPressMask,
+	    False,(XtEventHandler)button_click,(XtPointer)w);
+	XtRemoveEventHandler((Widget)w,KeyPressMask,
+	    False,(XtEventHandler)button_click,(XtPointer)w);
+
+	XtReleaseGC((Widget)w,w->simplebase.blink_gc);
+	XtReleaseGC((Widget)w,w->simplebase.gc);
+	/* XtRemoveTimeOut(w->simplebase.timeout_id); */
+
+	ww = (Widget)w;
+	while(ww) {
+	  if((clip = XtParent(ww)))
+	    if((scroll = XtParent(clip)))
+			if(XmIsScrolledWindow(scroll))
+			{
+				clipcb[0].closure = (XtPointer)w;
+				XtRemoveCallbacks(clip,XmNinputCallback,clipcb);
+			}
+			ww = clip;
+		}
+
+	XtFree((char*)w->simplebase.nodes);
+	XtFree((char*)w->simplebase.links);
+}
+
+static void selection(SimpleBaseWidget w)
+{
+	if( w->simplebase.selected >= 0 && w->simplebase.selected < w->simplebase.count) {
+		NodeStruct *n = w->simplebase.nodes +  w->simplebase.selected;
+		if(n->managed)
+		{
+			XDrawRectangle(XtDisplay(w),XtWindow(w),
+				w->simplebase.blink_gc,
+				n->r.x-1,
+				n->r.y-1,
+				n->r.width+2,
+				n->r.height+2);
+		}
+	}
+}
+
+static void clear(SimpleBaseWidget w)
+{
+	if( w->simplebase.selected >= 0 && w->simplebase.selected < w->simplebase.count) {
+		NodeStruct *n = w->simplebase.nodes +  w->simplebase.selected;
+		if(n->managed)
+		{
+			XClearArea(XtDisplay(w),XtWindow(w),
+				n->r.x-3,
+				n->r.y-3,
+				n->r.width+5,
+				n->r.height+5,True);
+		}
+	}
+}
+
+void NodesRedraw(SimpleBaseWidget w,XEvent *event, Region region)
+{
+	int i;
+	/* int d = 0,u = 0; */
+
+	/* Position x,y; */
+	/* Dimension a,h; */
+
+	/* find_visible_part(w,&x,&y,&a,&h); */
+	/* printf("find_visible_part : %d %d %d %d \n",x,y,a,h); */
+
+	for(i = 0; i < w->simplebase.count;i++)
+	{
+		NodeStruct *n = w->simplebase.nodes + i;
+		if(n->managed)
+				if(XRectInRegion(region, n->r.x, n->r.y, n->r.width, n->r.height))
+					n->draw((Widget)w,&n->r,n->user_data);
+	}
+
+	/* printf("NodesRedraw %s: draw %d, skip %d\n",XtName(w),d,u); */
+
+	/* XSetRegion(XtDisplay(w),w->simplebase.blink_gc,region); */
+	selection(w);
+	/* XSetClipMask(XtDisplay(w),w->simplebase.blink_gc,None); */
+
+#if 0
+	if( w->simplebase.selected >= 0 && w->simplebase.selected < w->simplebase.count) {
+		NodeStruct *n = w->simplebase.nodes +  w->simplebase.selected;
+		if(n->managed)
+			if(XRectInRegion(region, n->r.x-1, n->r.y-1, n->r.width+2, n->r.height+2))
+			{
+				XDrawRectangle(XtDisplay(w),XtWindow(w),
+					w->simplebase.blink_gc,
+					n->r.x-1,
+					n->r.y-1,
+					n->r.width+2,
+					n->r.height+2);
+			}
+		}
+#endif
+}
+
+static int new_link_data(SimpleBaseWidget w)
+{
+	LinkData *d;
+	if(w->simplebase.link_count >= w->simplebase.link_max)
+	{
+		w->simplebase.link_max += w->simplebase.link_max/2 + 128;
+		w->simplebase.links = 
+		    (LinkData*)XtRealloc((XtPointer)w->simplebase.links,
+		    w->simplebase.link_max*sizeof(LinkData));
+		memset(w->simplebase.links + w->simplebase.link_count, 0,
+		(w->simplebase.link_max - w->simplebase.link_count)*sizeof(LinkData));
+	}
+
+	d            = &w->simplebase.links[w->simplebase.link_count];
+	d->gc        = w->simplebase.gc;
+	d->user_data = 0;
+
+	return w->simplebase.link_count++;
+}
+
+int NodeCreate(Widget _w,DrawProc draw,SizeProc size,void *data)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	NodeStruct *n;
+	if(w->simplebase.count >= w->simplebase.max)
+	{
+		w->simplebase.max += w->simplebase.max/2 + 128;
+		w->simplebase.nodes = 
+		    (NodeStruct*)XtRealloc((XtPointer)w->simplebase.nodes,
+		    w->simplebase.max*sizeof(NodeStruct));
+		memset(w->simplebase.nodes + w->simplebase.count, 0,
+		    (w->simplebase.max - w->simplebase.count)*sizeof(NodeStruct));
+	}
+
+	n = &w->simplebase.nodes[w->simplebase.count];
+#if 0
+	n-> group    = -1;
+#endif
+	n->r.width  = 30;
+	n->r.height = 20;
+	n->draw = draw;
+	n->size = size;
+	n->user_data = data;
+	/* n->size(_w,&n->r,data); */
+
+	return w->simplebase.count++;
+}
+
+
+static Boolean manage_proc(SimpleBaseWidget w)
+{
+	WidgetClass class = XtClass(w);
+	WidgetClass sclass = simplebaseClassRec.core_class.superclass;
+
+	long width  = w->core.width;
+	long height = w->core.height;
+	Position pwidth; 
+	Position pheight;
+
+	w->simplebase.work = 0;
+
+	while(class != sclass)
+	{
+		SimpleBaseClassRec *bc = (SimpleBaseClassRec*)class;
+
+		if(bc->simplebase_class.layout)
+			(*(bc->simplebase_class.layout))((Widget)w,&width,&height);
+
+		class = class->core_class.superclass;
+
+	}
+
+	pwidth  = width; if(pwidth != width)   pwidth  = 0x7f00;
+	pheight = height;if(pheight != height) pheight = 0x7f00;
+
+	if(pwidth != w->core.width || pheight != w->core.height)
+	{
+		Dimension           replyWidth = 0, replyHeight = 0;
+
+		XtGeometryResult result = XtMakeResizeRequest((Widget)w,
+		    pwidth,pheight,
+		    &replyWidth, &replyHeight);
+
+		if (result == XtGeometryAlmost)
+			XtMakeResizeRequest ((Widget)w, replyWidth, replyHeight,
+			    NULL, NULL);
+	}
+
+	if(XtIsRealized((Widget) w))
+	{
+		/* printf("XClearArea 1 %s\n",XtName(w)); */
+		XClearArea(XtDisplay(w),XtWindow(w),0,0,0,0,True);
+	}
+
+	return True;
+
+}
+
+static void enqueue_manage_proc(SimpleBaseWidget w)
+{
+	if(w->simplebase.work == 0)
+		w->simplebase.work = XtAppAddWorkProc(
+		    XtWidgetToApplicationContext((Widget)w),
+		    (XtWorkProc)manage_proc,(XtPointer)w);
+}
+
+void NodeChanged(Widget _w,int node)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	if( w == 0 || node < 0 || node >= w->simplebase.count) return;
+
+	if(XtIsRealized((Widget)w))
+	{
+		NodeStruct *p = w->simplebase.nodes + node;
+		if(p->managed) 
+		{
+			/* printf("XClearArea 2 %s\n",XtName(w)); */
+			XClearArea(XtDisplay(w),XtWindow(w),
+				p->r.x,p->r.y,
+				p->r.width,p->r.height,True);
+		}
+	}
+}
+
+void NodeSetFocus(Widget _w,int node)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	if( w == 0 || node >= w->simplebase.count) return;
+	w->simplebase.focus = node;
+	enqueue_manage_proc(w);
+}
+
+void *NodeFind(Widget _w,XEvent *ev)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	int i;
+	for(i = 0; i < w->simplebase.count;i++)
+	{
+		NodeStruct *n = w->simplebase.nodes + i;
+		if(n->managed)
+			if(ev->xbutton.x >= n->r.x && ev->xbutton.x <= n->r.x + n->r.width &&
+			    ev->xbutton.y >= n->r.y && ev->xbutton.y <= n->r.y + n->r.height)
+				return n->user_data;
+	}
+	return NULL;
+}
+
+void SimpleBaseShow(Widget _w,XRectangle* r,XEvent* ev)
+{
+  /* SimpleBaseWidget sw = (SimpleBaseWidget)_w; */
+
+	Widget v_scroll,h_scroll;
+	Position        x_parent,y_parent;
+	Position        x_clip,y_clip;
+	Position        x_event,y_event;
+	Dimension       h_clip,w_clip;
+	Position        dv=0,dh=0;
+	int min,max;
+	int     v_val,v_size,v_inc,v_page;
+	int     h_val,h_size,h_inc,h_page;
+	Widget clip = NULL;
+	Widget scroll_window = NULL;
+	Arg al[5];
+	int ac;
+	/* NodeStruct *w; */
+        Position x_node ,y_node;
+	Dimension h_node,w_node;
+
+	Position x,y;
+
+	Widget ww = _w;
+	while(ww) {
+		if(!(clip            = XtParent(ww)))    return;
+		if(!(scroll_window   = XtParent(clip)))  return;
+		if(XmIsScrolledWindow(scroll_window))    break;
+		if(!(ww = XtParent(ww))) return;
+
+	}
+
+    x_node = r->x;
+    y_node = r->y;
+    h_node = r->height;
+    w_node = r->width;
+
+	ac = 0;
+	XtSetArg(al[ac],XmNhorizontalScrollBar, &h_scroll );ac++;
+	XtSetArg(al[ac],XmNverticalScrollBar, &v_scroll );ac++;
+	XtGetValues(scroll_window,al,ac);
+
+	ac = 0;
+	XtSetArg(al[ac],XmNx,&x_parent);ac++;
+	XtSetArg(al[ac],XmNy,&y_parent);ac++;
+	XtGetValues(_w,al,ac);
+
+	ac = 0;
+	XtSetArg(al[ac],XmNclipWindow,&clip);ac++;
+	XtGetValues(scroll_window,al,ac);
+
+	ac = 0;
+	XtSetArg(al[ac],XmNheight,&h_clip);ac++;
+	XtSetArg(al[ac],XmNwidth,&w_clip);ac++;
+	XtGetValues(clip,al,ac);
+
+
+	XtTranslateCoords(_w,x_node,y_node,        &x_node,&y_node);
+	XtTranslateCoords(clip,0,0,&x_clip,&y_clip);
+	if(ev) XtTranslateCoords(_w,ev->xbutton.x,ev->xbutton.y, &x_event,&y_event);
+
+
+	x = x_node - x_clip;
+	y = y_node - y_clip;
+
+
+	if( y < 0 || y + h_node > h_clip || ev)
+	{
+		if(ev)
+			dv = (y + h_node / 2)  - (y_event - y_clip);
+		else
+			dv = (y + h_node / 2)  - h_clip / 2;
+
+		ac = 0;
+		XtSetArg(al[ac],XmNminimum,&min);ac++;
+		XtSetArg(al[ac],XmNmaximum,&max);ac++;
+		XtGetValues(v_scroll,al,ac);
+
+		XmScrollBarGetValues(v_scroll,&v_val,&v_size,&v_inc,&v_page);
+
+		max -= v_size;
+
+		if( dv + v_val > max ) dv = max - v_val;
+		if( dv + v_val < min ) dv = min - v_val;
+
+
+	}
+	if( x < 0 || x + w_node > w_clip || ev)
+	{
+		if(ev)
+			dh = (x + w_node / 2)  - (x_event - x_clip);
+		else
+			dh = (x + w_node / 2)  - w_clip / 2;
+
+		ac = 0;
+		XtSetArg(al[ac],XmNminimum,&min);ac++;
+		XtSetArg(al[ac],XmNmaximum,&max);ac++;
+		XtGetValues(h_scroll,al,ac);
+
+		XmScrollBarGetValues(h_scroll,&h_val,&h_size,&h_inc,&h_page);
+
+		max -= h_size;
+
+		if( dh + h_val > max ) dh = max - h_val;
+		if( dh + h_val < min ) dh = min - h_val;
+
+	}
+
+
+	if(dv || dh)
+	{
+		Position x = x_parent-dh;
+		Position y = y_parent-dv;
+
+		ac = 0;
+		XtSetArg(al[ac],XmNx,x);ac++;
+		XtSetArg(al[ac],XmNy,y);ac++;
+		XtSetValues(_w,al,ac);
+
+
+		if(dv) XmScrollBarSetValues(v_scroll,v_val+dv,
+			v_size,v_inc,v_page,TRUE);
+		if(dh) XmScrollBarSetValues(h_scroll,h_val+dh,
+			h_size,h_inc,h_page,TRUE);
+	}
+}
+
+void NodeShow(Widget _w,int node)
+{
+	SimpleBaseWidget sw = (SimpleBaseWidget)_w;
+	NodeStruct *w;
+
+	if( node < 0 || node >= sw->simplebase.count) return;
+	w = sw->simplebase.nodes + node;
+	if(!w->managed) return;
+
+	SimpleBaseShow(_w,&w->r,NULL);
+}
+
+void NodeHideAll(Widget _w)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	int i;
+	for(i = 0; i < w->simplebase.count;i++)
+	{
+		NodeStruct *n = w->simplebase.nodes + i;
+		n->managed = False;
+	}
+	NodeUpdate(_w);
+}
+
+Boolean NodeVisibility(Widget _w,int node,Boolean vis)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	if (!w) {
+	  return False;
+	}
+	NodeStruct *p = w->simplebase.nodes + node;
+	if( node < 0 || node >= w->simplebase.count) return vis;
+	if (0 == p) { 
+	  fprintf(stderr, "unexpected\n");
+	  return False;
+	}
+	if(p->managed == vis) return vis;
+
+	/* if(node == w->simplebase.selected) selection(w); */
+
+	p->managed = vis;
+
+	if(vis && !p->inited)
+	{
+		p->size(_w,&p->r,p->user_data);
+		p->inited = True;
+	}
+
+	enqueue_manage_proc(w);
+	return !vis;
+}
+
+void NodeNewSizeAll(Widget _w)
+{
+  int i;
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	for(i = 0; i < w->simplebase.count;i++)
+		NodeNewSize(_w,i);
+	if(XtIsRealized(_w))
+		XClearArea(XtDisplay(_w),XtWindow(_w),0,0,0,0,True);
+}
+
+void NodeNewSize(Widget _w,int node)
+{
+	XRectangle next,old;
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	NodeStruct *p ;
+	if( w == 0 || node < 0 || node >= w->simplebase.count) return;
+
+	p = w->simplebase.nodes + node;
+
+	if( !p->managed)
+	{
+		p->inited = False;
+		return;
+	}
+
+
+	old = next = p->r;
+	p->size(_w,&next,p->user_data);
+
+	if(next.x == p->r.x && next.y == p->r.y &&
+		next.width ==  p->r.width &&  next.height ==  p->r.height)
+			return;
+
+	if(node == w->simplebase.selected) clear(w);
+
+	p->r = next;
+
+	/* if(node == w->simplebase.selected) selection(w);  */
+
+	/* if( !p->managed) return; */
+
+	if(!XtIsRealized(_w))
+		return;
+
+	XClearArea(XtDisplay(_w),XtWindow(_w),old.x,old.y,
+		old.width,old.height,True);
+
+	XClearArea(XtDisplay(_w),XtWindow(_w),p->r.x,p->r.y,
+		p->r.width,p->r.height,True);
+
+	if(p->managed)
+		enqueue_manage_proc(w);
+}
+
+
+
+void NodeUpdate(Widget _w)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	if(w->simplebase.work) {
+		XtRemoveWorkProc(w->simplebase.work);
+		w->simplebase.work = 0;
+	}
+	/* printf("update\n"); */
+	manage_proc(w);
+}
+
+
+
+void NodeReset(Widget _w)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	int i;
+	for(i = 0; i < w->simplebase.count;i++)
+	{
+		NodeStruct *n = w->simplebase.nodes + i;
+		if(n->parents) XtFree((XtPointer)n->parents);
+		if(n->kids) XtFree((XtPointer)n->kids);
+	}
+	w->simplebase.count    = 0;
+	w->simplebase.link_count    = 0;
+	w->simplebase.selected = -1;
+	w->simplebase.focus    = -1;
+	memset(w->simplebase.nodes,0,w->simplebase.max*sizeof(NodeStruct));
+	memset(w->simplebase.links,0,w->simplebase.link_max*sizeof(LinkData));
+	NodeUpdate(_w);
+}
+
+void NodeReserve(Widget _w,int count)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	if(count > w->simplebase.max)
+	{
+		w->simplebase.max = count;
+		w->simplebase.nodes = 
+		    (NodeStruct*)XtRealloc((XtPointer)w->simplebase.nodes,
+		    w->simplebase.max*sizeof(NodeStruct));
+		memset(w->simplebase.nodes + w->simplebase.count, 0,
+		    (w->simplebase.max - w->simplebase.count)*sizeof(NodeStruct));
+	}
+}
+
+
+void NodeAddRelation(Widget _w,int pnode,int knode)
+{
+	int i;
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	NodeStruct *p = w->simplebase.nodes + pnode;
+	NodeStruct *k = w->simplebase.nodes + knode;
+
+	if( pnode < 0 || pnode >= w->simplebase.count) return;
+	if( knode < 0 || knode >= w->simplebase.count) return;
+
+	for(i = 0 ; i < p->kcnt; i++)
+		if(p->kids[i].node == knode)
+			return;
+
+	if(k->pcnt >= k->pmax)
+	{
+		k->pmax += k->pmax/2 + 1;
+		k->parents = (Link*)XtRealloc((XtPointer)k->parents,k->pmax*sizeof(Link));
+	}
+
+	if(p->kcnt >= p->kmax)
+	{
+		p->kmax += p->kmax/2 + 1;
+		p->kids = (Link*)XtRealloc((XtPointer)p->kids,p->kmax*sizeof(Link));
+	}
+
+	p->kids[p->kcnt].link_data    = -1;
+	p->kids[p->kcnt++].node  = knode;
+
+	k->parents[k->pcnt].link_data   = -1;
+	k->parents[k->pcnt++].node = pnode;
+	
+	/*printf("NodeAddRelation %d %d (%d)\n",pnode,knode,kind);*/
+}
+
+void* NodeGetRelationData(Widget _w,int pnode,int knode)
+{
+	int i;
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	NodeStruct *p = w->simplebase.nodes + pnode;
+	/* NodeStruct *k = w->simplebase.nodes + knode; */
+
+	if( pnode < 0 || pnode >= w->simplebase.count) return 0;
+	if( knode < 0 || knode >= w->simplebase.count) return 0;
+
+	for(i = 0 ; i < p->kcnt; i++)
+		if(p->kids[i].node == knode)
+		{
+			if( p->kids[i].link_data == -1)
+				return 0;
+			return w->simplebase.links[p->kids[i].link_data].user_data;
+		}
+
+
+	/* Check for dummies */
+	for(i = 0 ; i < p->kcnt; i++)
+	{
+		NodeStruct* z = &KIDS(w,p,i);
+		if(sb_is_dummy(w,z))
+		{
+			void *d = NodeGetRelationData(_w,NODE_TO_INDEX(w,z),knode);
+			if(d) return d;
+		}
+	}
+
+
+	return 0;
+}
+
+void* NodeSetRelationData(Widget _w,int pnode,int knode,void *data)
+{
+	int i;
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	NodeStruct *p = w->simplebase.nodes + pnode;
+	/* NodeStruct *k = w->simplebase.nodes + knode; */
+
+	if( pnode < 0 || pnode >= w->simplebase.count) return 0;
+	if( knode < 0 || knode >= w->simplebase.count) return 0;
+
+	for(i = 0 ; i < p->kcnt; i++)
+		if(p->kids[i].node == knode)
+		{
+			void *old = 0;
+			if( p->kids[i].link_data == -1)
+				p->kids[i].link_data = new_link_data(w);
+			else
+				old = w->simplebase.links[p->kids[i].link_data].user_data;
+			w->simplebase.links[p->kids[i].link_data].user_data = data;
+			return old;
+		}
+
+	return 0;
+}
+
+GC NodeSetRelationGC(Widget _w,int pnode,int knode,GC rgc)
+{
+	int i;
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	NodeStruct *p = w->simplebase.nodes + pnode;
+	/* NodeStruct *k = w->simplebase.nodes + knode; */
+	GC gc = w->simplebase.gc;
+
+	if( pnode < 0 || pnode >= w->simplebase.count) return gc;
+	if( knode < 0 || knode >= w->simplebase.count) return gc;
+
+	for(i = 0 ; i < p->kcnt; i++)
+		if(p->kids[i].node == knode)
+		{
+			GC old = gc;
+			if( p->kids[i].link_data == -1)
+				p->kids[i].link_data = new_link_data(w);
+			else
+				old = w->simplebase.links[p->kids[i].link_data].gc;
+			w->simplebase.links[p->kids[i].link_data].gc = rgc;
+			enqueue_manage_proc(w);
+			return old;
+		}
+
+	return gc;
+}
+
+
+static Boolean SetValues(SimpleBaseWidget current, 
+SimpleBaseWidget request, 
+SimpleBaseWidget new)
+{
+	int       redraw = FALSE;
+	XGCValues values;
+	XtGCMask  valueMask;
+
+	if (new->simplebase.blink_color != current->simplebase.blink_color ||
+	    new->core.background_pixel !=
+	    current->core.background_pixel){
+		valueMask         = GCForeground | GCBackground | 
+		    GCFunction | GCLineWidth;
+		values.foreground = new->simplebase.blink_color;
+		values.background = new->core.background_pixel;
+		values.function   = GXxor;
+		values.line_width   = 2;
+		XtReleaseGC((Widget)new,new->simplebase.blink_gc);
+		new->simplebase.blink_gc = XtGetGC((Widget)new, valueMask, &values);
+		redraw = TRUE;
+	}
+
+	if(XtIsRealized((Widget)new) && XtIsManaged((Widget)new))
+		if(new->simplebase.selected != current->simplebase.selected)
+		{
+			clear(current);
+			clear(new);
+		}
+
+	/* printf("Redraw %d\n",redraw); */
+
+	return (redraw);
+}
+
+static void drawDummy(Widget w,XRectangle* r,void* d)
+{
+}
+
+static void sizeDummy(Widget w,XRectangle* r,void* d)
+{
+	r->width = r->height = 0;
+}
+
+int sb_new_dummy_node(SimpleBaseWidget gw)
+{
+	int i;
+	int n = gw->simplebase.count;
+	/* int more = 0; */
+	NodeStruct* z = 0;
+
+	for(i=0; i < n; i++)
+	{
+		NodeStruct* w = gw->simplebase.nodes + i;
+		if(w->draw == drawDummy && !w->managed)
+		{
+			printf("Recycle dummy %d\n",i);
+			z = w;
+			break;
+		}
+	}
+
+	if(z == 0)
+	{
+		printf("Create dummy\n");
+		i =  NodeCreate((Widget)gw,drawDummy,sizeDummy,0);
+		z = INDEX_TO_NODE(gw,i);
+		z->kids    = XtNew(Link);
+		z->parents = XtNew(Link);
+		z->kcnt = z->kmax = z->pcnt = z->pmax = 1;
+	}
+
+	z->r.width = z->r.height = 0;
+
+	z->kids[0].node    = -1;
+	z->parents[0].node = -1;
+
+	z->managed = False;
+	z->inited  = False;
+
+	z->kids[0].link_data    = -1;
+	z->parents[0].link_data = -1;
+
+	return NODE_TO_INDEX(gw,z);
+}
+
+void sb_clear_dummy_nodes(SimpleBaseWidget gw)
+{
+	int i;
+	int n = gw->simplebase.count;
+	/* int more = 0; */
+	int cnt = 0;
+
+	for(i=0; i < n; i++)
+	{
+		NodeStruct* w = gw->simplebase.nodes + i;
+		if(w->draw == drawDummy && w->managed)
+		{
+			NodeStruct *p = INDEX_TO_NODE(gw,w->parents[0].node);
+			NodeStruct *k = INDEX_TO_NODE(gw,w->kids[0].node);
+			int j;
+
+			cnt++;
+
+			j = sb_find_kid_index(gw,p,w);
+			if(j == -1) {
+				printf("Cannot find dummy in parent\n");
+				abort();
+			}
+			p->kids[j].node = w->kids[0].node;
+
+			j = sb_find_parent_index(gw,k,w);
+			if(j == -1) {
+				printf("Cannot find dummy in kid\n");
+				abort();
+			}
+			k->parents[j].node = w->parents[0].node;
+
+			w->kids[0].node         = -1;
+			w->parents[0].node      = -1;
+			w->kids[0].link_data    = -1;
+			w->parents[0].link_data = -1;
+			w->managed              = False;
+
+		}
+	}
+	// printf("remove_dummy_nodes: %d\n",cnt);
+}
+
+int sb_insert_dummy_node(SimpleBaseWidget gw,int np,int nk)
+{
+	NodeStruct *p = INDEX_TO_NODE(gw,np);
+	NodeStruct *k = INDEX_TO_NODE(gw,nk);
+	int a = sb_find_kid_index(gw,p,k);
+	int b = sb_find_parent_index(gw,k,p);
+	int x;
+	NodeStruct *z;
+
+	if(a == -1)
+	{
+		printf("Cannot find kid in parent\n");
+		abort();
+	}
+
+	if(b == -1)
+	{
+		printf("Cannot find parent in kid\n");
+		abort();
+	}
+
+	x  = sb_new_dummy_node(gw);
+	z = INDEX_TO_NODE(gw,x);
+
+	/* sb_new_dummy_node may have changed the pointers */
+
+	p = INDEX_TO_NODE(gw,np); 
+	k = INDEX_TO_NODE(gw,nk);
+
+	z->managed = True;
+
+	p->kids[a].node      = x;
+	z->parents[0].node   = np;
+	z->kids[0].link_data = p->kids[a].link_data;;
+
+	k->parents[b].node      = x;
+	z->kids[0].node         = nk;
+	z->parents[0].link_data = k->parents[b].link_data;
+
+	return x;
+}
+
+int sb_find_kid_index(SimpleBaseWidget w,NodeStruct* p,NodeStruct *k)
+{
+	int i;
+	int x = NODE_TO_INDEX(w,k);
+
+	for(i=0;i<p->kcnt;i++)
+		if( p->kids[i].node == x)
+			return i;
+
+	return -1;
+}
+
+int sb_find_parent_index(SimpleBaseWidget w,NodeStruct* k,NodeStruct *p)
+{
+	int i;
+	int x = NODE_TO_INDEX(w,p);
+
+	for(i=0;i<k->pcnt;i++)
+		if( k->parents[i].node == x)
+			return i;
+
+	return -1;
+}
+
+Boolean sb_is_dummy(SimpleBaseWidget w,NodeStruct* n)
+{
+	return n->draw == drawDummy;
+}
+
+int NodeNewGroup(Widget _w,DrawProc draw, SizeProc size, void *data)
+{ return 0;
+}
+void NodeSetGroup(Widget _w,int node,int group)
+{
+}
+int NodeGetGroup(Widget _w,int node)
+{
+	return -1;
+}
+
+static void xincrement (h, event, args, n_args)
+Widget   h;
+XEvent        *event;
+char          *args[];
+int            n_args;
+{
+#ifdef MOTIF
+#define SetArg(a,b)  XtSetArg(al[ac],a,b);ac++
+#define GetValues(w) XtGetValues(w,al,ac);ac=0
+#define SetValues(w) XtSetValues(w,al,ac);ac=0
+
+  Widget clip = XtParent(h);
+  Widget swin;
+  Widget v_scroll;
+
+  int ac = 0;
+
+//  Position    x_grep,y_grep;
+//  Dimension   h_grep,w_grep;
+//  Position    x_clip,y_clip;
+//  Dimension   h_clip,w_clip;
+//  Position    dv=0,dh=0;
+//  int min,max;
+//  int v_val,v_size,v_inc,v_page;
+//  int h_val,h_size,h_inc,h_page;
+//  Position x,y;
+  
+  Arg al[5];
+
+  /* printf("## mouse 1\n"); */
+  if(!clip) return;
+  swin = XtParent(clip);
+  /* printf("## mouse 2\n"); */
+  if(!swin || !XmIsScrolledWindow(swin)) return;
+  /* printf("## mouse 3\n"); */
+  if (n_args != 1) return;
+
+  SetArg(XmNverticalScrollBar  , &v_scroll);
+  GetValues(swin);
+  
+  {
+    int min, max, value, slider_size, inc, page_inc;
+    SetArg(XmNminimum,&min);
+    SetArg(XmNmaximum,&max);    
+    SetArg(XmNvalue,&value);    
+    SetArg(XmNsliderSize,&slider_size);    
+    SetArg(XmNincrement,&inc);    
+    SetArg(XmNpageIncrement,&page_inc);    
+    
+    GetValues(v_scroll);
+    /* XmScrollBarGetValues(v_scroll, value, slider_size, inc, page_inc); */
+    
+    int arg = atoi(args[0]);
+    dh = (abs(arg) > 5) ? page_inc : inc;
+
+    if (arg < 0) {
+      if (value - dh < min)
+        value = min;
+      else
+        value -= dh;
+    } else {
+      if (value + dh > max)
+        value = max;
+      else
+        value += dh;
+    }
+
+    XmScrollBarSetValues(v_scroll,value,slider_size, inc, page_inc,TRUE);
+  }
+#endif
+}
diff --git a/ecflow_4_0_7/view/src/SimpleBase.h b/ecflow_4_0_7/view/src/SimpleBase.h
new file mode 100644
index 0000000..c0d170f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleBase.h
@@ -0,0 +1,95 @@
+#ifndef SIMPLEBASE_H
+#define SIMPLEBASE_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+extern WidgetClass  simplebaseWidgetClass;
+
+typedef struct _SimpleBaseClassRec *SimpleBaseWidgetClass;
+typedef struct _SimpleBaseRec      *SimpleBaseWidget;
+
+#define XtNselected           "selected"
+#define XtCSelected           "Selected"
+
+#define XtNblinkRate           "blinkRate"
+#define XtCBlinkRate           "BlinkRate"
+
+#define XtNblinkColor           "blinkColor"
+#define XtCBlinkColor           "BlinkColor"
+
+#define XtNpsHeader           "psHeader"
+#define XtCPsHeader           "PsHeader"
+
+#define XtNgetpsCallback		"getps"
+#define XtNlinkCallback        "linkCallback"
+
+
+typedef struct {
+	Widget widget;
+	char *name;
+	char *psproc;
+} getpsCallbackStruct;
+
+typedef struct {
+    int     reason; 
+    XEvent *event; 
+    void*   data1;
+    void*   data2;
+} LinkCallbackStruct;
+
+typedef void (*DrawProc)(Widget,XRectangle*,void*);
+typedef void (*SizeProc)(Widget,XRectangle*,void*);
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+
+void NodesRedraw(SimpleBaseWidget w, XEvent *event, Region region);
+int  NodeCreate(Widget _w, DrawProc draw, SizeProc size, void *data);
+void NodeChanged(Widget _w, int node);
+void *NodeFind(Widget _w, XEvent *ev);
+void NodeShow(Widget _w, int node);
+void NodeHideAll(Widget _w);
+Boolean NodeVisibility(Widget _w, int node, Boolean vis);
+void NodeNewSize(Widget _w, int node);
+void NodeNewSizeAll(Widget _w);
+void NodeUpdate(Widget _w);
+void NodeReset(Widget _w);
+void NodeReserve(Widget _w, int count);
+
+void NodeInsert(Widget _w,int pnode,int knode,int nnode);
+
+void NodeAddRelation(Widget _w,int pnode,int knode);
+void *NodeGetRelationData(Widget _w,int pnode,int knode);
+void *NodeSetRelationData(Widget _w,int pnode,int knode,void*);
+GC NodeGetRelationGC(Widget _w,int pnode,int knode);
+GC NodeSetRelationGC(Widget _w,int pnode,int knode,GC);
+
+void NodeSetFocus(Widget _w, int node);
+int  NodeGetFocus(Widget _w);
+
+int NodeNewGroup(Widget _w,DrawProc draw, SizeProc size, void *data);
+void NodeSetGroup(Widget _w,int node,int group);
+int NodeGetGroup(Widget _w,int node);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+
+#endif /* SIMPLEBASE_H */
diff --git a/ecflow_4_0_7/view/src/SimpleBaseP.h b/ecflow_4_0_7/view/src/SimpleBaseP.h
new file mode 100644
index 0000000..46450d9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleBaseP.h
@@ -0,0 +1,133 @@
+#ifndef SIMPLEBASEP_H
+#define SIMPLEBASEP_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "SimpleBase.h"
+#include <Xm/DrawingAP.h>
+
+typedef void (*PrintProc) (Widget,FILE*);
+typedef void (*LayoutProc)(Widget,long*,long*);
+typedef void (*ResetProc)(Widget);
+
+
+typedef struct LinkData {
+	GC     gc;
+	void* user_data;
+} LinkData;
+
+typedef struct Link {
+	int   node;
+	int   link_data;
+} Link;
+
+typedef struct NodeStruct {
+    XRectangle   r;
+    XtPointer    user_data;
+    DrawProc     draw;
+    SizeProc     size;
+    Boolean      managed;
+    Boolean      inited;
+    int          pmax;
+    int          pcnt;
+    int          kmax;
+    int          kcnt;
+    Link         *parents;
+    Link         *kids;
+    int          tmpx;
+    int          tmpy;
+    int          misc[4];
+#if 0
+    Boolean      is_group;
+	int          group;
+#endif
+} NodeStruct;
+
+typedef struct _SimpleBaseClassPart {
+    PrintProc       print;
+    LayoutProc      layout;
+	ResetProc       reset;
+} SimpleBaseClassPart;
+
+typedef struct _SimpleBaseClassRec {
+    CoreClassPart           core_class;
+    CompositeClassPart      composite_class;
+    ConstraintClassPart     constraint_class;
+    XmManagerClassPart      manager_class;
+    XmDrawingAreaClassPart  drawing_area_class;
+    SimpleBaseClassPart     simplebase_class;
+} SimpleBaseClassRec;
+
+extern SimpleBaseClassRec simplebaseClassRec;
+
+typedef struct {
+
+    int            max;
+    int            count;
+    NodeStruct           *nodes;
+
+	LinkData       *links;
+	int             link_max;
+	int             link_count;
+
+    Pixel          blink_color;
+    GC             blink_gc;
+    GC             gc;
+    int            selected;
+    int            focus;
+    XtIntervalId   timeout_id;
+    int            timeout;
+    XtCallbackList getps;
+	XtCallbackList link;
+    String         header;
+    XtWorkProcId   work;
+
+} SimpleBasePart;
+
+
+typedef struct _SimpleBaseRec {
+    CorePart            core;
+    CompositePart       composite;
+    ConstraintPart      constraint;
+    XmManagerPart       manager;
+    XmDrawingAreaPart   drawing_area;
+    SimpleBasePart      simplebase;
+}  SimpleBaseRec;
+
+
+#define NODE_TO_INDEX(w,n) ((n)-(w)->simplebase.nodes)
+#define INDEX_TO_NODE(w,i) (&((w)->simplebase.nodes[i]))
+
+
+#define KIDS(w,n,i)    (*INDEX_TO_NODE(w,n->kids[i].node))
+#define PARENTS(w,n,i) (*INDEX_TO_NODE(w,n->parents[i].node))
+
+
+int  sb_new_dummy_node(SimpleBaseWidget w);
+void sb_clear_dummy_nodes(SimpleBaseWidget w);
+int  sb_insert_dummy_node(SimpleBaseWidget w,int p,int k);
+
+int sb_find_kid_index(SimpleBaseWidget w,NodeStruct* p,NodeStruct *k);
+int sb_find_parent_index(SimpleBaseWidget w,NodeStruct* k,NodeStruct *p);
+
+
+Boolean sb_is_dummy(SimpleBaseWidget w,NodeStruct*p);
+
+
+#endif
+
+
+
diff --git a/ecflow_4_0_7/view/src/SimpleGraph.c b/ecflow_4_0_7/view/src/SimpleGraph.c
new file mode 100644
index 0000000..c47ba6f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleGraph.c
@@ -0,0 +1,1324 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/CoreP.h>
+#include <X11/CompositeP.h>
+#include <X11/ConstrainP.h>
+#include <Xm/Xm.h>
+#include <Xm/XmP.h>
+#include <Xm/DrawingAP.h>
+#include <Xm/ExtObjectP.h>
+#include "SimpleGraph.h"
+#include "SimpleGraphP.h"
+
+#ifndef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+#ifndef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define LEVEL 0
+#define ARC   1
+#define VISIT 2
+#define GROUP 3
+
+#define round(X) (((X) >= 0) ? (int)((X)+0.5) : (int)((X)-0.5))
+#define RADIANS(x) (M_PI * (x) / 180.0)
+#define ABS(a) ((a)>0?(a):(-(a)))
+#define C(w) (SIMPLEGRAPH_CONSTRAINT(w)->simplegraph)
+
+
+static void Initialize();
+//static void ConstraintInitialize();
+//static void ConstraintDestroy();
+//static Boolean ConstraintSetValues();
+static void Destroy();
+static Boolean SetValues();
+//static XtGeometryResult GeometryManager();
+//static void ChangeManaged();
+//static Boolean insert_new_node();
+//static void delete_node();
+//static void new_layout();
+static void Redisplay();
+static void compute_positions(SimpleGraphWidget,int);
+static void set_positions(SimpleGraphWidget,long*,long*);
+static void Print();
+static void Layout(Widget,long*,long*);
+static void bezier_find(SimpleGraphWidget,XEvent*);
+
+static XtResource resources[] = {
+	{XtNhorizontalSpace,XtCSpace,XtRDimension,sizeof(Dimension),
+	XtOffset(SimpleGraphWidget, simplegraph.h_min_space), XtRString,"30" },
+	{XtNverticalSpace,XtCSpace, XtRDimension,sizeof (Dimension),
+	XtOffset(SimpleGraphWidget, simplegraph.v_min_space), XtRString,"10" },
+	{XtNarrowAngle,XtCArrowAngle, XtRDimension,sizeof (Dimension),
+	XtOffset(SimpleGraphWidget, simplegraph.arrow_angle), XtRString,"22" },
+	{XtNarrowLength,XtCArrowLength, XtRDimension,sizeof (Dimension),
+	XtOffset(SimpleGraphWidget, simplegraph.arrow_length), XtRString,"8" },
+	{XtNarrowFilled,XtCArrowFilled, XtRBoolean,sizeof (Boolean),
+	XtOffset(SimpleGraphWidget, simplegraph.arrow_filled), XtRString,"false" },
+	{"round","Round", XtRBoolean,sizeof (Boolean),
+	XtOffset(SimpleGraphWidget, simplegraph.mode), XtRString,"false" },
+	{XtNarcOnly,XtCArcOnly, XtRPointer,sizeof(Widget),
+	XtOffset(SimpleGraphWidget, simplegraph.arc_only), XtRPointer,NULL},
+};
+
+/*
+static XtResource simplegraphConstraintResources[] = {
+ {XtNarcNumber,XtCArcNumber, XtRint,sizeof(int),
+ XtOffset(SimpleGraphConstraints, simplegraph.misc[ARC]), XtRString,"0" },
+};
+*/
+
+SimpleGraphClassRec simplegraphClassRec = {
+	{
+	/* core_class fields */
+	(WidgetClass) &simplebaseClassRec, /* superclass */
+	"SimpleGraph", /* class_name */
+	sizeof(SimpleGraphRec), /* widget_size */
+	NULL, /* class_init */
+	NULL, /* class_part_init */
+	FALSE, /* class_inited */
+	Initialize, /* initialize */
+	NULL, /* initialize_hook */
+	XtInheritRealize, /* realize */
+	NULL, /* actions */
+	0, /* num_actions */
+	resources, /* resources */
+	XtNumber(resources), /* num_resources */
+	NULLQUARK, /* xrm_class */
+	TRUE, /* compress_motion */
+	XtExposeCompressMaximal, /* compress_exposure */
+	TRUE, /* compress_enterleave*/
+	TRUE, /* visible_interest */
+	Destroy, /* destroy */
+	NULL, /* resize */
+	Redisplay, /* expose */
+	SetValues, /* set_values */
+	NULL, /* set_values_hook */
+	XtInheritSetValuesAlmost, /* set_values_almost */
+	NULL, /* get_values_hook */
+	NULL, /* accept_focus */
+	XtVersion, /* version */
+	NULL, /* callback_private */
+	XtInheritTranslations, /* tm_table */
+	NULL, /* query_geometry */
+	XtInheritDisplayAccelerator, /* display_accelerator*/
+	NULL, /* extension */
+	},
+	{
+	/* simplebase_class fields */
+	NULL, /* geometry_manager */
+	NULL, /* change_managed */
+	XtInheritInsertChild, /* insert_child */
+	XtInheritDeleteChild, /* delete_child */
+	NULL, /* extension */
+	},
+	{ 
+	/* constraint_class fields */
+	NULL, /* subresources */
+	0, /* subresource_count */
+	0, /* constraint_size */
+	NULL, /* initialize */
+	NULL, /* destroy */
+	NULL, /* set_values */
+	NULL, /* extension */
+	},
+	{
+	XtInheritTranslations, /* default translations */
+	NULL, /* syn_resources */
+	0, /* num_syn_resources */
+	NULL, /* syn_cont_resources */
+	0, /* num_syn_cont_resources */
+	XmInheritParentProcess, /* parent_process */
+	NULL, /* extension */
+
+	},
+	{
+	NULL,
+	},
+	{
+	Print,
+	Layout,
+	},
+	{
+	/* SimpleGraph class fields */
+	0, 
+	},
+};
+
+#ifdef TOP_BOTTOM
+
+#define TMPX   tmpx
+#define TMPY   tmpy
+#define WIDTH  width
+#define HEIGHT height
+#define H_DIST h_dist
+#define V_DIST v_dist
+#define H_MIN_SPACE h_min_space
+#define V_MIN_SPACE v_min_space
+
+#else
+
+#define TMPX   tmpy
+#define TMPY   tmpx
+#define WIDTH  height
+#define HEIGHT width
+#define H_DIST v_dist
+#define V_DIST h_dist
+#define H_MIN_SPACE v_min_space
+#define V_MIN_SPACE h_min_space
+
+#endif
+
+/* #define MANAGED(n) ((n)->managed && ((n)->group == -1)) */
+#define MANAGED(n) ((n)->managed)
+
+WidgetClass simplegraphWidgetClass = (WidgetClass) &simplegraphClassRec;
+
+static void button_click(w,cd,event,continue_dispatch)
+SimpleGraphWidget    w;
+XtPointer *cd;
+XEvent    *event;
+Boolean   *continue_dispatch;
+{
+	bezier_find(w,event);
+}
+
+static void make_gc(SimpleGraphWidget w)
+{
+}
+
+static void delete_gc(SimpleGraphWidget w)
+{
+}
+
+static void Initialize(request, new)
+SimpleGraphWidget request, new;
+{
+  /* XGCValues values;
+     XtGCMask valueMask;
+     int i; */
+	/*
+ * Make sure the widget's width and height are 
+ * greater than zero.
+ */
+	if (request->core.width <= 0)
+		new->core.width = 5;
+	if (request->core.height <= 0)
+		new->core.height = 5;
+
+	new->simplegraph.cos_arrow = cos(RADIANS(new->simplegraph.arrow_angle));
+	new->simplegraph.sin_arrow = sin(RADIANS(new->simplegraph.arrow_angle));
+
+	/*
+ * Create a simplegraphics context for the connecting lines.
+ */
+
+	make_gc(new);
+
+	/*
+ * Create the hidden root widget.
+ */
+
+	/*
+ * Allocate the tables used by the layout
+ * algorithm.
+ */
+
+   new->simplegraph.gc[0]    = new->simplebase.gc;
+   new->simplegraph.gc_count = 1;
+
+	XtAddEventHandler((Widget)new,ButtonPressMask,
+	    False,(XtEventHandler)button_click,(XtPointer)new);
+
+}
+
+static void Destroy(w)
+SimpleGraphWidget w;
+{
+	delete_gc(w);
+	XtRemoveEventHandler((Widget)w,ButtonPressMask,
+	    False,(XtEventHandler)button_click,(XtPointer)w);
+}
+
+
+
+static Boolean SetValues(current, request, new)
+SimpleGraphWidget current, request, new;
+{
+	int redraw = TRUE;
+	long w,h;
+	/* int i;
+	int new_gc = new->core.background_pixel != current->core.background_pixel; */
+
+
+	if (new->simplegraph.arrow_angle != current->simplegraph.arrow_angle)
+	{
+		new->simplegraph.cos_arrow = cos(RADIANS(new->simplegraph.arrow_angle));
+		new->simplegraph.sin_arrow = sin(RADIANS(new->simplegraph.arrow_angle));
+	}
+
+	if (new->simplegraph.arc_only != current->simplegraph.arc_only)
+	{
+		Layout((Widget)new,&w,&h);
+		redraw = FALSE;
+	}
+
+	/*
+ * If the minimum spacing has changed, recalculate the
+ * simplegraph layout. new_layout() does a redraw, so we don't
+ * need SetValues to do another one.
+ */
+	if (new->simplegraph.v_min_space != current->simplegraph.v_min_space ||
+	    new->simplegraph.h_min_space != current->simplegraph.h_min_space){
+		Layout((Widget)new,&w,&h);
+		redraw = FALSE;
+	}
+	return (redraw);
+}
+
+
+
+//static int first_kid(SimpleGraphWidget w,NodeStruct *n)
+//{
+//	int i;
+//	for(i=0;i<n->pcnt;i++)
+//		if(MANAGED(&PARENTS(w,n,i)))
+//			return i;
+//	return -1;
+//}
+//
+//static int last_kid(SimpleGraphWidget w,NodeStruct *n)
+//{
+//	int i;
+//
+//	if(n->pcnt)
+//		for(i= n->pcnt - 1;i>=0;i--)
+//			if(MANAGED(&PARENTS(w,n,i)))
+//				return i;
+//	return -1;
+//}
+
+
+//static void line(SimpleGraphWidget w,int x1,int y1,int x2,int y2,int gc)
+//{
+//	GC topGC = w->manager.top_shadow_GC;
+//	GC midGC = w->manager.background_GC;
+//	GC botGC = w->manager.bottom_shadow_GC;
+//	if(gc) midGC = w->simplegraph.gc[gc % GC_COUNT];
+//
+//	if(x1 == x2)
+//	{
+//		/* vertical */
+//
+//		XDrawLine(XtDisplay(w),XtWindow(w),
+//		    topGC,x1-1,y1,x2-1,y2);
+//		XDrawLine(XtDisplay(w),XtWindow(w),
+//		    midGC,x1,y1,x2,y2);
+//		XDrawLine(XtDisplay(w),XtWindow(w),
+//		    botGC,x1+1,y1,x2+1,y2);
+//	}
+//	else
+//	{
+//		/* horizontal */
+//
+//		XDrawLine(XtDisplay(w),XtWindow(w),
+//		    topGC,x1,y1-1,x2,y2-1);
+//		XDrawLine(XtDisplay(w),XtWindow(w),
+//		    midGC,x1,y1,x2,y2);
+//		XDrawLine(XtDisplay(w),XtWindow(w),
+//		    botGC,x1,y1+1,x2,y2+1);
+//	}
+//}
+
+//static void arrow(SimpleGraphWidget fw,int x1,int y1,int x2,int y2,int gc)
+//{
+//	int x;
+//	int y;
+//	int size = 11;
+//	int h = size;
+//	int w = size;
+//	unsigned int d;
+//
+//	GC topGC = fw->manager.top_shadow_GC;
+//	GC midGC = fw->manager.background_GC;
+//	GC botGC = fw->manager.bottom_shadow_GC;
+//	if(gc) midGC = fw->simplegraph.gc[gc % GC_COUNT];
+//
+//	if(x1 > x2)
+//	{
+//		d = XmARROW_LEFT;
+//		x = (x1 + x2)/2 - size/2;
+//		y = y1 - size/2;
+//	}
+//	else if(x1 < x2)
+//	{
+//		d = XmARROW_RIGHT;
+//		x = (x2 + x1)/2 - size/2;
+//		y = y1 - size/2;
+//	}
+//	else if(y2 >= y1)
+//	{
+//		d = XmARROW_DOWN;
+//		y = (y2 + y1)/2 - size/2;
+//		x = x1 - size/2;
+//	}
+//	else
+//	{
+//		d = XmARROW_UP;
+//		y = (y1 + y2)/2 - size/2;
+//		x = x1 - size/2;
+//	}
+//
+//
+//	_XmDrawArrow(XtDisplay(fw),XtWindow(fw),
+//	    topGC,
+//	    botGC,
+//	    midGC,
+//	    x,y,w,h,1,d);
+//
+//}
+//
+//static int minspace = 10;
+
+static void bezier_arrow(Widget w,GC gc,XPoint* p,int npoints)
+{
+#define ASIZE 4
+
+	XPoint* f;
+	XPoint* t;
+	double a,b,l;
+	int i;
+	XPoint q[3];
+
+	double xx[3] = { 
+		-ASIZE, ASIZE , -ASIZE  	};
+	double yy[3] = { 
+		ASIZE,       0 , -ASIZE 	};
+
+
+	int n = npoints/2;
+	int m = npoints/2+1;
+	while(n >= 0 && m < npoints)
+	{
+		f = &p[n];
+		t = &p[m];
+
+		a = t->x - f->x;
+		b = t->y - f->y;
+		l = sqrt(a*a+b*b);
+		if(l > ASIZE) break;
+
+		n--;
+		m++;
+	}
+
+
+	/* a = -a; */
+	b = -b;
+
+	for(i = 0 ; i < 3; i++)
+	{
+		double x = (a*xx[i]  + b*yy[i])/l;
+		double y = (-b*xx[i] + a*yy[i])/l;
+
+		q[i].x = round(x + f->x);
+		q[i].y = round(y + f->y);
+
+	}
+
+	XFillPolygon(XtDisplay(w), XtWindow(w), gc,
+	    q,3,Convex,CoordModeOrigin);
+
+}
+
+static void bezier(XPoint* p,int npoints,XPoint* control)
+{
+	int i;
+	for (i = 0; i < npoints; i++)
+	{
+		double array[4];
+		double u, u2, u3, x, y;
+		u = (double) i / (double) (npoints - 1);                                        
+		u2 = u * u;
+		u3 = u2 * u;
+		array[0] = -u3 + 3. * u2 - 3. * u + 1.;
+		array[1] = 3. * u3 - 6. * u2 + 3. * u;
+		array[2] = -3. * u3 + 3. * u2;
+		array[3] = u3;
+		x = array[0] * control[0].x + array[1] * control[1].x + array[2] * control[2].x + array[3] * control[3].x;
+		y = array[0] * control[0].y + array[1] * control[1].y + array[2] * control[2].y + array[3] * control[3].y;
+
+		p[i].x = round(x);
+		p[i].y = round(y);
+	}
+
+}
+
+static void connect(SimpleGraphWidget w,
+XRectangle *from,XRectangle *to,
+int fn, int fc,int tn,int tc,int dm,int link_data)
+{
+
+	GC gc = w->simplebase.gc;
+
+#if TOP_BOTTOM
+	int fx = from->x + ((fn+1)*from->width)/(fc+1);
+	int fy = from->y + from->height;
+	int tx = to->x + ((tn+1)*to->width)/(tc+1);
+	int ty = to->y;
+#else
+	double fx = from->x + from->width;
+	double fy = from->y + from->height/2.0;
+	double tx = to->x ;
+	double ty = to->y + to->height / 2.0;
+#endif
+
+
+	/* .cap_style = CapRound;  join_style = JoinRound;    */
+
+
+	XPoint control[4];
+	XPoint p[100];
+
+	control[0].x = fx;
+	control[0].y = fy;
+
+	control[1].x = (fx + tx)/2;
+	control[1].y = fy;
+
+	control[2].x = (fx + tx)/2;
+	control[2].y = ty;
+
+	control[3].x = tx;
+	control[3].y = ty;
+
+	bezier(p,XtNumber(p),control);
+
+	if(link_data != -1)
+	{
+		int i;
+		gc = w->simplebase.links[link_data].gc;
+		for(i = 0; i < w->simplegraph.gc_count; i++)
+			if(w->simplegraph.gc[i] == gc)
+				break;
+		if(i == w->simplegraph.gc_count)
+			w->simplegraph.gc[w->simplegraph.gc_count++] = gc;
+	}
+
+	XDrawLines(XtDisplay(w),XtWindow(w), 
+	    gc,
+	    p,XtNumber(p),CoordModeOrigin);
+
+
+	bezier_arrow((Widget)w,gc,p,XtNumber(p));
+
+}
+
+int close_to(int x,int y, int x1, int y1, int x2, int y2)
+{
+	if(x1>x2) { 
+		int c = x1; 
+		x1 = x2; 
+		x2 = c; 
+	}
+	if(y1>y2) { 
+		int c = y1; 
+		y1 = y2; 
+		y2 = c; 
+	}
+
+	x1 -= 3; 
+	x2 += 3;
+	y1 -= 3; 
+	y2 += 3;
+
+	return ( x1 <= x && x <= x2 && y1 <= y && y <= y2);
+}
+
+static int smallest(int x, int y,XPoint* p, int n)
+{
+  /* int i; */
+	if(n > 1 && close_to(x,y,p[0].x,p[0].y, p[n-1].x,p[n-1].y))
+	{
+		int m = n/2;
+		int a = smallest(x,y,p,m);
+		int b = smallest(x,y,p+m,n-m);
+		int z = MIN(a,b);
+		return MIN(z,n);
+	}
+	return 32000;
+}
+
+static int line_find(SimpleGraphWidget w,XEvent* event,
+XRectangle *from,XRectangle *to,
+NodeStruct* n1,NodeStruct* n2)
+{
+
+#if TOP_BOTTOM
+	int fx = from->x + ((fn+1)*from->width)/(fc+1);
+	int fy = from->y + from->height;
+	int tx = to->x + ((tn+1)*to->width)/(tc+1);
+	int ty = to->y;
+#else
+	double fx = from->x + from->width;
+	double fy = from->y + from->height/2.0;
+	double tx = to->x ;
+	double ty = to->y + to->height / 2.0;
+#endif
+
+	int  x = event->xbutton.x;
+	int  y = event->xbutton.y;
+	/* int i; */
+	int value = 32000;
+
+	/* .cap_style = CapRound;  join_style = JoinRound;    */
+
+	if( close_to(x,y,fx,fy,tx,ty))
+	{
+
+
+		XPoint control[4];
+		XPoint p[100];
+
+		control[0].x = fx;
+		control[0].y = fy;
+
+		control[1].x = (fx + tx)/2;
+		control[1].y = fy;
+
+		control[2].x = (fx + tx)/2;
+		control[2].y = ty;
+
+		control[3].x = tx;
+		control[3].y = ty;
+
+		bezier(p,XtNumber(p),control);
+
+		return smallest(x,y,p,XtNumber(p));
+	}
+
+	return value;
+
+}
+
+static void Redisplay (SimpleGraphWidget w, XEvent *event, Region region)
+{
+	int i, j;
+	/* int fkid; */
+	int m = 0;
+
+	/* XPoint points[3]; */
+	Region rg,clip;
+
+	XEvent ev;
+
+	while(XCheckWindowEvent(XtDisplay(w),XtWindow(w),ExposureMask,&ev))
+		XtAddExposureToRegion(&ev,region);
+
+	rg = XCreateRegion();
+	clip = XCreateRegion();
+
+	for (i = 0; i < w -> simplebase.count; i++)
+	{
+
+		NodeStruct *child = w -> simplebase.nodes + i;
+		if((child)->managed)
+			XUnionRectWithRegion(&child->r,rg,rg);
+	}
+	XSubtractRegion(region,rg,clip);
+
+	for(i = 0; i < w->simplegraph.gc_count; i++)
+		XSetRegion(XtDisplay(w),w->simplegraph.gc[i],clip);
+
+
+	for (i = 0; i < w -> simplebase.count; i++)
+	{
+
+		NodeStruct *n = w -> simplebase.nodes + i;
+		if(!n->managed)
+			continue;
+
+		for (j = 0; j < n->kcnt; j++)
+		{
+			NodeStruct *c = &KIDS(w,n,j);
+			int k = 0;
+
+			if(!c->managed)
+				continue;
+
+			connect(w,&n->r,&c->r,
+			    j,n->kcnt,
+			    k,c->pcnt,
+			    m++,
+			    n->kids[j].link_data
+			    );
+
+		}
+	}
+
+	XDestroyRegion(clip);
+	XDestroyRegion(rg);
+	for(i = 0; i < w->simplegraph.gc_count; i++)
+		XSetClipMask(XtDisplay(w),w->simplegraph.gc[i],None);
+
+	NodesRedraw((SimpleBaseWidget)w,event,region);
+}
+
+static void bezier_find(SimpleGraphWidget w,XEvent *event)
+{
+	int i, j;
+	/* int fkid; */
+	int m = 0;
+	int min = 32000;
+	NodeStruct* m1 = 0 ;
+	NodeStruct *m2 = 0;
+	LinkCallbackStruct cb;
+
+	for (i = 0; i < w -> simplebase.count; i++)
+	{
+		NodeStruct *n = w -> simplebase.nodes + i;
+		if(!n->managed)
+			continue;
+
+		for (j = 0; j < n->kcnt; j++)
+		{
+			NodeStruct *c = &KIDS(w,n,j);
+			if(!c->managed)
+				continue;
+
+			m = line_find(w,event,&n->r,&c->r,n,c);
+			if(m < min)
+			{
+				min = m;
+				m1 = n;
+				m2 = c;
+
+			}
+		}
+	}
+
+	while(m1 && sb_is_dummy((SimpleBaseWidget)w,m1)) 
+		m1 = &PARENTS(w,m1,0);
+
+	while(m2 && sb_is_dummy((SimpleBaseWidget)w,m2)) 
+		m2 = &KIDS(w,m2,0);
+
+	cb.reason = 0;
+	cb.event  = event;
+	cb.data1  = m1?m1->user_data:0;
+	cb.data2  = m1?m2->user_data:0;
+	XtCallCallbacks((Widget)w, XtNlinkCallback, (XtPointer)&cb);
+}
+
+static void Layout(Widget w,long *maxWidth,long *maxHeight)
+{
+	SimpleGraphWidget gw = (SimpleGraphWidget)w;
+	/* XtGeometryResult result; */
+	/* Dimension replyWidth = 0, replyHeight = 0; */
+	*maxWidth = 1;
+	*maxHeight = 1;
+	sb_clear_dummy_nodes((SimpleBaseWidget)gw);
+	compute_positions(gw,1);
+	set_positions(gw, maxWidth,maxHeight);
+}
+
+
+static int calc_level(SimpleGraphWidget w,NodeStruct *n)
+{
+
+	int i;
+	int lvl = 0;
+
+	if(n->misc[VISIT]) return -1;
+
+	n->misc[VISIT] = True;
+
+	for(i=0;i<n->pcnt;i++)
+	{
+		NodeStruct *p = &PARENTS(w,n,i);
+		if(MANAGED(p))
+		{
+			int lev = calc_level(w,p) + 1;
+			lvl = MAX(lvl,lev);
+		}
+	}
+
+	n->misc[LEVEL] = lvl;
+	n->misc[VISIT] = False;
+
+	return lvl;
+
+}
+
+static void set_arc(SimpleGraphWidget w,NodeStruct *n,int arc)
+{
+
+	int i;
+
+	if(n->misc[VISIT]) return;
+	n->misc[VISIT] = True;
+
+	n->misc[ARC] = arc;
+
+	for(i=0;i<n->pcnt;i++)
+	{
+		NodeStruct *p = &PARENTS(w,n,i);
+		if(MANAGED(p))
+			set_arc(w,p,arc);
+	}
+
+	n->misc[VISIT] = False;
+
+}
+
+static int calc_arc(SimpleGraphWidget w,NodeStruct *n)
+{
+
+	int i;
+	int a = n->misc[ARC];
+
+	if(n->misc[VISIT]) return 0;
+	n->misc[VISIT] = True;
+
+	if(n->pcnt)
+	{
+		for(i=0;i<n->pcnt;i++)
+		{
+			NodeStruct *p = &PARENTS(w,n,i);
+			if(MANAGED(p))
+			{
+				int b = calc_arc(w,p);
+				a = MAX(a,b);
+			}
+		}
+		set_arc(w,n,a);
+	}
+
+	n->misc[VISIT] = False;
+	return a;
+}
+
+static SimpleGraphWidget sort;
+
+static int by_arc(const void* n1,const void* n2)
+{
+	NodeStruct *w1 = sort->simplebase.nodes + *(int*)n1;
+	NodeStruct *w2 = sort->simplebase.nodes + *(int*)n2;
+	if(w1->misc[LEVEL] != w2->misc[LEVEL])
+		return w1->misc[LEVEL] - w2->misc[LEVEL];
+
+	return w1->misc[ARC] - w2->misc[ARC];
+
+}
+
+static int by_x(const void *n1,const void *n2)
+{
+	NodeStruct *w1 = sort->simplebase.nodes + *(int*)n1;
+	NodeStruct *w2 = sort->simplebase.nodes + *(int*)n2;
+
+	if(w1->misc[LEVEL] != w2->misc[LEVEL])
+		return w1->misc[LEVEL] - w2->misc[LEVEL];
+
+	return w1->TMPX - w2->TMPX;
+
+}
+
+
+static int by_level(const void *n1,const void *n2)
+{
+	NodeStruct *w1 = sort->simplebase.nodes + *(int*)n1;
+	NodeStruct *w2 = sort->simplebase.nodes + *(int*)n2;
+
+	return w1->misc[LEVEL] - w2->misc[LEVEL];
+
+}
+
+
+static int no_parents(SimpleGraphWidget w,NodeStruct *n)
+{
+	int i;
+
+	for(i=0;i<n->pcnt;i++) {
+		NodeStruct *p = &PARENTS(w,n,i);
+		if(MANAGED(p)) return FALSE;
+	}
+
+	return TRUE;
+
+}
+
+static int no_kidss(SimpleGraphWidget w,NodeStruct *n)
+{
+	int i;
+	for(i=0;i<n->kcnt;i++) {
+		NodeStruct *p = &KIDS(w,n,i);
+		if(MANAGED(p)) return FALSE;
+	}
+
+	return TRUE;
+
+}
+
+
+static void calc_level_pass2(SimpleGraphWidget w,NodeStruct *n)
+{
+	int i;
+	int lvl1 = 12000;
+
+	for(i=0;i<n->kcnt;i++)
+	{
+		NodeStruct *p = &KIDS(w,n,i);
+		if(MANAGED(p))
+			lvl1 = MIN(lvl1,p->misc[LEVEL]);
+	}
+	n->misc[LEVEL] = lvl1-1;
+}
+
+static void calc_y(SimpleGraphWidget gw,int *nodes,int *levels,
+int *positions,
+int max_in_a_level,int no_levels,int num_nodes,int v_dist)
+{
+	int i;
+	int max = max_in_a_level * v_dist;
+
+	for(i=0;i<no_levels;i++)
+		positions[i] = ((max / levels[i])-
+		    (max / max_in_a_level))/2;
+
+	for(i=0;i<num_nodes;i++)
+	{
+		NodeStruct *n = gw->simplebase.nodes + nodes[i];
+		n->TMPX = positions[n->misc[LEVEL]];
+		positions[n->misc[LEVEL]] += (max / levels[n->misc[LEVEL]]);
+	}
+
+}
+
+static int add_node(SimpleGraphWidget w,int n,int m,int lvl)
+{
+	int x = sb_insert_dummy_node((SimpleBaseWidget)w,n,m);
+	INDEX_TO_NODE(w,x)->misc[LEVEL] = lvl;
+	return x;
+}
+
+static int add_dummies(SimpleGraphWidget w,NodeStruct *n)
+{
+	int i;
+	int more = 0;
+	int lvl = n->misc[LEVEL];
+
+	if(n->misc[VISIT]) return 0;
+	n->misc[VISIT] = True;
+
+	for(i=0;i<n->kcnt;i++)
+	{
+		NodeStruct *p = &KIDS(w,n,i);
+
+		if(MANAGED(p))
+		{
+			int klvl = p->misc[LEVEL];
+			int d = klvl - lvl;
+			int l = lvl;
+			int a = NODE_TO_INDEX(w,n);
+			int b = NODE_TO_INDEX(w,p);
+
+			int x = NODE_TO_INDEX(w,p);
+			int y = NODE_TO_INDEX(w,n);
+
+			while(d-- > 1)
+			{
+				a = add_node(w,a,b,++l);
+				more = 1;
+			}
+
+			/* note: creating dummnies may change pointers*/
+			p = INDEX_TO_NODE(w,x);
+			n = INDEX_TO_NODE(w,y);
+
+		}
+
+
+		more = add_dummies(w,p) || more;
+	}
+	n->misc[VISIT] = False;
+	return more;
+
+}
+
+static int add_dummy_nodes(SimpleGraphWidget gw)
+{
+	int i;
+	int n = gw->simplebase.count;
+	int more = 0;
+
+	for(i=0; i < n; i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + i;
+		if(MANAGED(w))
+			more = add_dummies(gw,w) || more;
+	}
+
+	return more;
+}
+
+static void compute_positions(SimpleGraphWidget gw,int dummy)
+{
+	int i;
+	int n = gw->simplebase.count;
+	int *levels;
+	int *positions;
+	int count;
+	int max_in_a_level = 0;
+	int max_level = 0;
+	int arc=0;
+	int minx,miny;
+
+	int no_levels = 0;
+	int num_nodes = 0;
+	int *nodes;
+	int *widths;
+	int *heights;
+	int *kids;
+	int a;
+	int move_it;
+	int more;
+	int v_dist = 10;
+	int h_dist = 10;
+	int chg = TRUE;
+	NodeStruct* focus = (gw->simplebase.focus>=0)? (gw->simplebase.nodes +
+	    gw->simplebase.focus) : 0;
+
+	sort = gw;
+
+
+	num_nodes = 0;
+	for(i=0;i<n;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + i;
+		if(MANAGED(w)) num_nodes++;
+		w->misc[LEVEL] = w->misc[ARC] = -1;
+		w->misc[VISIT] = False;
+	}
+
+	if(!num_nodes) return;
+
+	if(focus == 0) focus = gw->simplebase.nodes;
+
+
+	levels = (int*)XtCalloc(num_nodes,sizeof(int));
+	positions = (int*)XtCalloc(num_nodes,sizeof(int));
+	nodes = (int*)XtCalloc(num_nodes,sizeof(int));
+	widths = (int*)XtCalloc(num_nodes,sizeof(int));
+	heights = (int*)XtCalloc(num_nodes,sizeof(int));
+	kids = (int*)XtCalloc(num_nodes,sizeof(int));
+
+	num_nodes=0;
+	for(i=0;i<n;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + i;
+		if(MANAGED(w)) nodes[num_nodes++] = i;
+		w->misc[LEVEL] = 0;
+	}
+	arc = 1;
+
+	for(i=0;i<num_nodes;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + nodes[i];
+		calc_level(gw,w);
+		w->misc[ARC] = arc++;
+
+		H_DIST = MAX(H_DIST,w->r.WIDTH);
+		V_DIST = MAX(V_DIST,w->r.HEIGHT);
+	}
+
+	H_DIST += gw->simplegraph.H_MIN_SPACE;
+	V_DIST += gw->simplegraph.V_MIN_SPACE;
+
+	for(i=0;i<num_nodes;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + nodes[i];
+		if (no_parents(gw,w) && !no_kidss(gw,w))
+			calc_level_pass2(gw,w);
+	}
+
+#if 1
+	if(dummy && add_dummy_nodes(gw))
+	{
+		XtFree((XtPointer)levels);
+		XtFree((XtPointer)positions);
+		XtFree((XtPointer)nodes);
+		XtFree((XtPointer)widths);
+		XtFree((XtPointer)heights);
+		XtFree((XtPointer)kids);
+		compute_positions(gw,0);
+		return;
+	}
+#endif
+
+	qsort(nodes,num_nodes,sizeof(int),by_level);
+
+	for(i=0;i<num_nodes;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + nodes[i];
+		levels[w->misc[LEVEL]]++;
+
+		if(levels[w->misc[LEVEL]] > max_in_a_level)
+		{
+			max_in_a_level = levels[w->misc[LEVEL]];
+			max_level = w->misc[LEVEL];
+		}
+
+		no_levels = MAX(no_levels,w->misc[LEVEL]);
+
+		widths[w->misc[LEVEL]] = MAX(widths[w->misc[LEVEL]],w->r.WIDTH);
+		heights[w->misc[LEVEL]] = MAX(heights[w->misc[LEVEL]],w->r.HEIGHT);
+		kids[w->misc[LEVEL]] = MAX(kids[w->misc[LEVEL]],w->kcnt);
+
+	}
+	no_levels++;
+
+
+	a = 0;
+	for( i = 0 ;i<no_levels;i++)
+	{
+		int b = heights[i] + gw->simplegraph.V_MIN_SPACE;
+
+
+		b += kids[i] * 2 ; /* +5 pixels per node with max kids in level */
+		/* printf("level %d = %d %d\n",i,a,heights[i]); */
+		heights[i] = a;
+		a += b;
+		widths[i] += gw->simplegraph.H_MIN_SPACE;
+		/* printf("level %d = %d\n",i,a); */
+	}
+
+	for(i=0;i<num_nodes;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + nodes[i];
+		w->TMPY = heights[w->misc[LEVEL]];
+		/* printf("node y = %d %d\n",w->misc[LEVEL],w->TMPY); */
+	}
+
+
+	for(a=0;a<2;a++)
+	{
+		for(i=0;i<num_nodes;i++) {
+			NodeStruct *w = gw->simplebase.nodes + nodes[i];
+			if(no_kidss(gw,w)) calc_arc(gw,w);
+		}
+		for(i=0;i<num_nodes;i++){
+			NodeStruct *w = gw->simplebase.nodes + nodes[i];
+			if(no_kidss(gw,w)) set_arc(gw,w,w->misc[ARC]);
+		}
+	}
+
+
+	qsort(nodes,num_nodes,sizeof(int),by_arc);
+
+	for(a=0;a<no_levels;a++)
+		if(levels[a]==0) levels[a]=1;
+
+
+	calc_y(gw,nodes,levels,positions,max_in_a_level,no_levels,num_nodes,H_DIST);
+
+	move_it = 0;
+
+	more = 1;
+	qsort(nodes,num_nodes,sizeof(int),by_x);
+	while(more--)
+	{
+
+		count = num_nodes;
+		while(count--)
+		{
+			for(i=0;i<num_nodes;i++)
+			{
+				int j;
+				int n = 0;
+				int x = 0;
+				NodeStruct *w = gw->simplebase.nodes + nodes[i];
+				if( (max_level != w->misc[LEVEL]) ^ move_it)
+				{
+
+
+					for(j=0;j<w->pcnt;j++)
+					{
+						NodeStruct *p = &PARENTS(gw,w,j);
+						if(MANAGED(p) && p != focus)
+						{
+							x += p->TMPX;
+							n++;
+						}
+					}
+
+
+					for(j=0;j<w->kcnt;j++)
+					{
+						NodeStruct *p = &KIDS(gw,w,j);
+						if(MANAGED(p) && p != focus)
+						{
+							x += p->TMPX;
+							n++;
+						}
+					}
+					w->TMPX = n?x/n:x;
+				}
+			}
+
+
+
+			qsort(nodes,num_nodes,sizeof(int),by_x);
+			move_it = !move_it;
+
+			chg = TRUE;
+			a = 10000;
+			while(chg && a--)
+			{
+				chg = FALSE;
+				for(i=1;i<num_nodes;i++) {
+					NodeStruct *w = gw->simplebase.nodes + nodes[i];
+					NodeStruct *z = gw->simplebase.nodes + nodes[i-1];
+					if(z->misc[LEVEL] == w->misc[LEVEL])
+						if(w->TMPX-z->TMPX< widths[w->misc[LEVEL]])
+						{
+							if(z != focus)
+								z->TMPX -= widths[w->misc[LEVEL]]/2;
+							if(w != focus)
+								w->TMPX += widths[w->misc[LEVEL]]/2;
+							chg = TRUE;
+						}
+				}
+			}
+		}
+	}
+
+
+	miny = (gw->simplebase.nodes + nodes[0])->tmpy;
+	minx = (gw->simplebase.nodes + nodes[0])->tmpx;
+
+	for(i=1;i<num_nodes;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + nodes[i];
+		if(w->tmpx<minx) minx = w->tmpx;
+		if(w->tmpy<miny) miny = w->tmpy;
+	}
+
+	minx -= 20;
+	miny -= 20;
+
+	for(i=0;i<num_nodes;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + nodes[i];
+		w->tmpx -= minx;
+		w->tmpy -= miny;
+	}
+
+
+	XtFree((XtPointer)levels);
+	XtFree((XtPointer)positions);
+	XtFree((XtPointer)nodes);
+	XtFree((XtPointer)widths);
+	XtFree((XtPointer)heights);
+	XtFree((XtPointer)kids);
+
+
+}
+
+
+
+static SimpleGraphWidget sort_widget = 0;
+
+static int left_to_right(const void *a,const void *b)
+{
+	NodeStruct *na = sort_widget->simplebase.nodes + ((Link*)a)->node;
+	NodeStruct *nb = sort_widget->simplebase.nodes + ((Link*)b)->node;
+	return na->r.x - nb->r.x;
+}
+
+
+static void set_positions(SimpleGraphWidget gw, long *maxWidth,long *maxHeight)
+{
+	int i;
+
+	for(i=0;i<gw->simplebase.count;i++)
+	{
+		NodeStruct *w = gw->simplebase.nodes + i;
+		if(w->managed )
+		{
+			{
+			w->r.x = w->tmpx;
+			w->r.y = w->tmpy;
+			*maxWidth = MAX(*maxWidth,w->tmpx + w->r.width + gw->simplegraph.h_min_space);
+			*maxHeight = MAX(*maxHeight,w->tmpy + w->r.height + gw->simplegraph.v_min_space);
+#if 0
+			if(w->is_group)
+			{
+				int j;
+				int	x = w->r.x;
+				int	y = w->tmpy;
+				for(j=0;j<gw->simplebase.count;j++)
+				{
+					NodeStruct *v = gw->simplebase.nodes + j;
+					if(v->managed && v->group == i)
+					{
+						v->r.x = x;
+						v->r.y = y;
+						y += v->r.height;
+					}
+				}
+			}
+#endif
+		}
+	}
+}
+
+sort_widget = gw;
+for(i=0;i<gw->simplebase.count;i++)
+{
+	NodeStruct *w = gw->simplebase.nodes + i;
+	qsort(w->parents,w->pcnt,sizeof(Link),left_to_right);
+	qsort(w->kids,w->kcnt,sizeof(Link),left_to_right);
+}
+}
+
+Widget CreateGraph(par,nam,al,ac)
+Widget par;
+char *nam;
+ArgList al;
+int ac;
+
+{
+	return XtCreateWidget(nam,simplegraphWidgetClass,par,al,ac);
+}
+
+static void Print (SimpleGraphWidget w, FILE *f)
+{
+}
+
diff --git a/ecflow_4_0_7/view/src/SimpleGraph.h b/ecflow_4_0_7/view/src/SimpleGraph.h
new file mode 100644
index 0000000..9f3cafe
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleGraph.h
@@ -0,0 +1,42 @@
+#ifndef SIMPLEGRAPH_H
+#define SIMPLEGRAPH_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "SimpleBase.h"
+
+extern WidgetClass  simplegraphWidgetClass;
+
+typedef struct _SimpleGraphClassRec *SimpleGraphWidgetClass;
+typedef struct _SimpleGraphRec      *SimpleGraphWidget;
+
+#define XtNhorizontalSpace    "horizontalSpace"
+#define XtNverticalSpace      "verticalSpace"
+#define XtCPad                "Pad"
+
+#define XtNarcOnly             "arcOnly"
+#define XtCArcOnly             "ArcOnly"
+
+#define XtNarrowAngle       "arrowAngle"
+#define XtNarrowFilled      "arrowFilled"
+#define XtNarrowLength      "arrowLength"
+#define XtCArrowAngle       "ArrowAngle"
+#define XtCArrowFilled      "ArrowFilled"
+#define XtCArrowLength      "ArrowLength"
+
+Widget CreateGraph(Widget,char*, Arg*,int);
+
+
+#endif /* SIMPLEGRAPH_H */
diff --git a/ecflow_4_0_7/view/src/SimpleGraphP.h b/ecflow_4_0_7/view/src/SimpleGraphP.h
new file mode 100644
index 0000000..fa45aa2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleGraphP.h
@@ -0,0 +1,72 @@
+#ifndef SIMPLEGRAPHP_H
+#define SIMPLEGRAPHP_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+
+#include  <Xm/XmP.h>
+#include  <Xm/DrawingAP.h>
+#include  "SimpleBaseP.h"
+
+#define GC_COUNT 10
+
+typedef struct _SimpleGraphClassPart {
+    int         ignore;
+} SimpleGraphClassPart;
+
+typedef struct _SimpleGraphClassRec {
+    CoreClassPart           core_class;
+    CompositeClassPart      composite_class;
+    ConstraintClassPart     constraint_class;
+    XmManagerClassPart      manager_class;
+    XmDrawingAreaClassPart  drawing_area_class;
+    SimpleBaseClassPart     simplebase_part;
+    SimpleGraphClassPart    simplegraph_class;
+} SimpleGraphClassRec;
+
+extern SimpleGraphClassRec simplegraphClassRec;
+
+
+typedef struct {
+    Dimension      h_min_space;
+    Dimension      v_min_space;
+    Dimension      arrow_length;
+    Dimension      arrow_angle;
+    Boolean        arrow_filled;
+	int            gc_count;
+    GC             gc[GC_COUNT];
+    float          cos_arrow;
+    float          sin_arrow;
+    Boolean        mode;
+    Widget         arc_only;
+} SimpleGraphPart;
+
+
+typedef struct _SimpleGraphRec {
+    CorePart           core;
+    CompositePart      composite;
+    ConstraintPart     constraint;
+    XmManagerPart      manager;
+    XmDrawingAreaPart  drawing_area;
+    SimpleBasePart     simplebase;
+    SimpleGraphPart    simplegraph;
+}  SimpleGraphRec;
+
+
+#endif 
+
+
+
diff --git a/ecflow_4_0_7/view/src/SimpleTime.c b/ecflow_4_0_7/view/src/SimpleTime.c
new file mode 100644
index 0000000..618f6fc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleTime.c
@@ -0,0 +1,784 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <stdio.h>
+#include <time.h>
+#include <Xm/ScrollBar.h>
+
+#include      <X11/Intrinsic.h>
+#include      <X11/IntrinsicP.h>
+#include      <X11/StringDefs.h>
+#include      <X11/CoreP.h>
+#include    <X11/CompositeP.h>
+#include      <X11/ConstrainP.h>
+#include        <Xm/XmP.h>
+#include        <Xm/DrawingAP.h>
+#include        <Xm/ExtObjectP.h>
+#include      "SimpleTime.h"
+#include      "SimpleTimeP.h"
+
+#ifndef MAX
+#define   MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+#ifndef MIN
+#define   MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#define DATE  0
+#define TIME  1
+#define ARC   2
+
+static void             Initialize();
+//static void             ConstraintInitialize();
+//static Boolean          ConstraintSetValues();
+//static void             Resize();
+static void             Print();
+static void             Layout(Widget,long*,long*);
+static void             Destroy();
+static Boolean          SetValues();
+//static void             insert_new_node();
+//static void             delete_node();
+//static void             new_layout();
+static void             Redisplay();
+//static int              compute_positions();
+//static void             shift_subsimpletime();
+//static void             set_positions();
+/* static void             reset(); */
+
+void SimpleBaseShow(Widget _w,XRectangle* r,XEvent* ev);
+
+
+static XtResource resources[] = {
+	{XtNverticalSpace,XtCSpace, XtRDimension,sizeof (Dimension),
+	XtOffset(SimpleTimeWidget, simpletime.v_min_space), XtRImmediate,(XtPointer)8  },
+	{XtNpixelSecond,XtCPixelSecond, XtRInt,sizeof (int),
+	XtOffset(SimpleTimeWidget, simpletime.second_per_pixel), XtRImmediate,(XtPointer)60 },
+	{XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel),
+	XtOffset(SimpleTimeWidget, simpletime.foreground), XtRString,"Red"},
+	{XtNautoScroll, XtCAutoScroll, XtRBoolean, sizeof (Boolean),
+	XtOffset(SimpleTimeWidget, simpletime.auto_scroll), XtRImmediate,(XtPointer)TRUE},
+
+    { XmNfontList, XmCFontList, XmRFontList, sizeof (XmFontList),
+    XtOffset (SimpleTimeWidget, simpletime.font), XmRString, 
+		"-*-*-*-*-*-*-7-*-*-*-*-*-*-*"},
+
+
+
+};
+
+
+SimpleTimeClassRec simpletimeClassRec = {
+	{
+	/* core_class fields  */
+	(WidgetClass) &simplebaseClassRec,/* superclass         */
+	"SimpleTime",                           /* class_name         */
+	sizeof(SimpleTimeRec),                /* widget_size        */
+	NULL,                             /* class_init         */
+	NULL,                             /* class_part_init    */
+	FALSE,                            /* class_inited       */
+	Initialize,                       /* initialize         */
+	NULL,                             /* initialize_hook    */
+	XtInheritRealize,                 /* realize            */
+	NULL,                             /* actions            */
+	0,                                /* num_actions        */
+	resources,                        /* resources          */
+	XtNumber(resources),              /* num_resources      */
+	NULLQUARK,                        /* xrm_class          */
+	TRUE,                             /* compress_motion    */
+	XtExposeCompressMaximal,          /* compress_exposure  */
+	TRUE,                             /* compress_enterleave*/
+	TRUE,                             /* visible_interest   */
+	Destroy,                          /* destroy            */
+	NULL,                             /* resize             */
+	Redisplay,                        /* expose             */
+	SetValues,                        /* set_values         */
+	NULL,                             /* set_values_hook    */
+	XtInheritSetValuesAlmost,         /* set_values_almost  */
+	NULL,                             /* get_values_hook    */
+	NULL,                             /* accept_focus       */
+	XtVersion,                        /* version            */
+	NULL,                             /* callback_private   */
+	XtInheritTranslations,            /* tm_table           */
+	NULL,                             /* query_geometry     */
+	XtInheritDisplayAccelerator,      /* display_accelerator*/
+	NULL,                             /* extension          */
+	},
+	{
+	/* simplebase_class fields */
+	NULL,                 /* geometry_manager    */
+	NULL,                   /* change_managed      */
+	XtInheritInsertChild,            /* insert_child        */
+	XtInheritDeleteChild,            /* delete_child        */
+	NULL/*&compext*/,                        /* extension           */
+	},
+	{ 
+	/* constraint_class fields */
+	NULL,          /* subresources        */
+	0,/* subresource_count   */
+	0,       /* constraint_size     */
+	NULL,             /* initialize          */
+	NULL,                			  /* destroy             */
+	NULL,              /* set_values          */
+	NULL,                             /* extension           */
+	},
+	{
+	XtInheritTranslations,   /* default translations */
+	NULL,                    /* syn_resources          */
+	0,               /* num_syn_resources      */
+	NULL,                        /* syn_cont_resources     */
+	0,                           /* num_syn_cont_resources */
+	XmInheritParentProcess,  /* parent_process */
+	NULL,                        /* extension              */
+
+	},
+	{
+	NULL,
+	},
+	{
+	Print,
+	Layout,
+	},
+	{
+	/* SimpleTime class fields */
+	0,                               /* ignore              */
+	},
+};
+
+
+WidgetClass simpletimeWidgetClass = (WidgetClass) &simpletimeClassRec;
+
+static long time_to_sec(long ddate)
+{
+	long hh,mm,ss;
+	hh = ddate / 10000; ddate %= 10000;
+	mm = ddate / 100; ddate %= 100;
+	ss = ddate;
+	return hh*60*60 + mm * 60 + ss;
+}
+
+static long sec_to_time(long ddate)
+{
+	long hh,mm,ss;
+	hh = ddate / (60*60); ddate %= (60*60);
+	mm = ddate / 60; ddate %= 60;
+	ss = ddate;
+	return hh*10000 + mm * 100 + ss;
+}
+
+static long date_to_julian(long ddate)
+{
+	long  m1,y1,a,b,c,d,j1;
+
+	long month,day,year;
+
+	year = ddate / 10000;
+	ddate %= 10000;
+	month  = ddate / 100;
+	ddate %= 100;
+	day = ddate;
+
+	if (month > 2)
+	{
+		m1 = month - 3;
+		y1 = year;
+	}
+	else
+	{
+		m1 = month + 9;
+		y1 = year - 1;
+	}
+	a = 146097*(y1/100)/4;
+	d = y1 % 100;
+	b = 1461*d/4;
+	c = (153*m1+2)/5+day+1721119;
+	j1 = a+b+c;
+
+	return(j1);
+}
+
+static long julian_to_date(long jdate)
+{
+	long x,y,d,m,e;
+	long day,month,year;
+
+	x = 4 * jdate - 6884477;
+	y = (x / 146097) * 100;
+	e = x % 146097;
+	d = e / 4;
+
+	x = 4 * d + 3;
+	y = (x / 1461) + y;
+	e = x % 1461;
+	d = e / 4 + 1;
+
+	x = 5 * d - 3;
+	m = x / 153 + 1;
+	e = x % 153;
+	d = e / 5 + 1;
+
+	if( m < 11 )
+		month = m + 2;
+	else
+		month = m - 10;
+
+
+	day = d;
+	year = y + m / 11;
+
+	return year * 10000 + month * 100 + day;
+}
+
+static int x_of(SimpleTimeWidget w,int d,int t)
+{
+	double s;
+	d = d - w->simpletime.start_date;
+	t = t - w->simpletime.start_time;
+	s = d * 24.0*60*60 + t;
+	return s / w->simpletime.second_per_pixel + 10 + w->simpletime.max_w;
+}
+
+static void time_of(SimpleTimeWidget w,int x,int* d,int* t)
+{
+	double s = (x - 10 - w->simpletime.max_w) * w->simpletime.second_per_pixel;
+	*d = (s / 24.0/60/60);
+	*t = ( s - *d * 24.0*60*60);
+	*d = *d + w->simpletime.start_date;
+	*t = *t + w->simpletime.start_time;
+}
+
+static void time_out(SimpleTimeWidget w,XtIntervalId id)
+{
+	// time_t   t = time(0);
+	/* struct tm *tt = gmtime(&t); */
+
+
+	if(XtIsRealized((Widget)w) && XtIsManaged((Widget)w))
+	{
+#if 0
+		int n = X(w,w->simpletime.second);
+		XClearArea(XtDisplay(w),XtWindow(w),
+		    n,0,1,w->core.height,TRUE);
+#endif
+	}
+
+	/* w->simpletime.second = tt->tm_min+tt->tm_hour*60; */
+	/* w->simpletime.second = tt->tm_min+tt->tm_hour*60; */
+
+	w->simpletime.timeout_id = 
+	    XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)w),
+	    60000,
+	    (XtTimerCallbackProc)time_out,(XtPointer)w);
+
+	/* if(w->simpletime.auto_scroll) TimeShowTime((Widget)w,TIME_NOW); */
+}
+
+
+static void Initialize(SimpleTimeWidget request, SimpleTimeWidget new)
+{
+	XGCValues values;
+	XtGCMask  valueMask;
+
+	if (request->core.width <= 0)
+		new->core.width = 5;
+	if (request->core.height <= 0)
+		new->core.height = 5;
+
+	valueMask = GCForeground | GCBackground;
+	values.foreground = new->simpletime.foreground;
+	values.background = new->core.background_pixel;
+	new->simpletime.gc = XtGetGC((Widget)new, valueMask, &values);
+	new->simpletime.start_time = new->simpletime.end_time = 0;
+	new->simpletime.start_date = new->simpletime.end_date = 0;
+	new->simpletime.inited     = 0;
+	new->simpletime.arcs       = 0;
+
+	time_out(new,0);
+
+}
+
+static void Destroy(SimpleTimeWidget w)
+{
+	XtReleaseGC((Widget)w, w->simpletime.gc);
+	XtRemoveTimeOut(w->simpletime.timeout_id);
+}
+
+
+static Boolean SetValues(SimpleTimeWidget current,SimpleTimeWidget request,
+	SimpleTimeWidget  new)
+{
+	int       redraw = FALSE;
+
+	/*
+  * If the minimum spacing has changed, recalculate the
+  * simpletime layout. new_layout() does a redraw, so we don't
+  * need SetValues to do another one.
+  */
+
+	if (new->simpletime.v_min_space != current->simpletime.v_min_space ||
+	    new->simpletime.second_per_pixel != current->simpletime.second_per_pixel )
+	{
+		long width,height;
+		Layout((Widget)new,&width,&height);
+		if(width != new->core.width || height != new->core.height)
+		{
+			Dimension           replyWidth = 0, replyHeight = 0;
+
+			XtGeometryResult result = XtMakeResizeRequest((Widget)new,
+				width,height,
+				&replyWidth, &replyHeight);
+
+			if (result == XtGeometryAlmost)
+				XtMakeResizeRequest ((Widget)new, replyWidth, replyHeight,
+					NULL, NULL);
+		}
+		redraw = True;
+	}
+	return (redraw);
+}
+
+
+static void line_in(SimpleTimeWidget w,int x1,int y1,int x2,int y2)
+{
+	XDrawLine(XtDisplay(w), XtWindow(w), w->manager.bottom_shadow_GC,
+	    x1,y1,x2,y2);
+	XDrawLine(XtDisplay(w), XtWindow(w), w->manager.top_shadow_GC,
+	    x1+1,y1+1,x2+1,y2+1);
+}
+
+//static void line_out(SimpleTimeWidget w,int x1,int y1,int x2,int y2)
+//{
+//	XDrawLine(XtDisplay(w), XtWindow(w), w->simpletime.gc,
+//	    x1,y1,x2,y2);
+//}
+
+static void Redisplay (SimpleTimeWidget w, XEvent *event, Region region)
+{
+	int              i;
+	int				n;
+	int y;
+	XEvent			ev;
+	/* int max  = 0; */
+
+	int d,t;
+	int date = 0;
+
+	/*
+   * If the SimpleTime widget is visible, visit each managed child.
+   */
+
+	while(XCheckWindowEvent(XtDisplay(w),XtWindow(w),ExposureMask,&ev))
+		XtAddExposureToRegion(&ev,region);
+
+	d = w->simpletime.start_date;
+	t = w->simpletime.start_time;
+
+	t /= 60*60;
+	t *= 60*60;
+
+	while( d <= w->simpletime.end_date )
+	{
+		int width;
+		n = x_of(w,d,t);
+
+		if(n >= w->simpletime.max_w) {
+			int hh = sec_to_time(t) / 10000;
+			XmString s,z,sdat,stim,sep;
+			char dat[80];
+			char tim[80];
+
+			line_in(w,n,w->simpletime.title,n,w->core.height);
+
+			dat[0] = tim[0] = 0;
+
+			if(date == 0 || d != date)
+			{
+				int yy,mm,dd;
+				int x = julian_to_date(d);
+				yy = x / 10000; x %= 10000;
+				mm = x / 100; x %= 100;
+				dd = x;
+
+				sprintf(dat,"%d-%02d-%02d",yy,mm,dd);
+			}
+
+			sprintf(tim,"%02dh",hh);
+
+			sdat = XmStringCreateSimple(dat);
+			stim = XmStringCreateSimple(tim);
+			sep  = XmStringSeparatorCreate();
+
+			z    = XmStringConcat(sdat,sep);
+			s    = XmStringConcat(z,stim);
+
+			date = d;
+			width = XmStringWidth(w->simpletime.font,s);
+
+			XmStringDraw(XtDisplay(w),XtWindow(w),
+				w->simpletime.font,
+				s,
+				w->manager.bottom_shadow_GC,
+				n - width / 2,
+				5,
+				width,
+				XmALIGNMENT_CENTER, 
+				XmSTRING_DIRECTION_L_TO_R, 0);
+
+			XmStringFree(s);
+			XmStringFree(z);
+			XmStringFree(sdat);
+			XmStringFree(stim);
+			XmStringFree(sep);
+		}
+
+		t += 60*60;
+		if(t >= 24*60*60)
+		{
+			d++;
+			t -= 24*60*60;
+		}
+
+		if( d == w->simpletime.end_date && t > w->simpletime.end_time)
+			break;
+	}
+	
+	for (i = 0; i < w -> simplebase.count; i++)
+	{
+
+		NodeStruct *n = w -> simplebase.nodes + i;
+		int j;
+		if(!n->managed)
+			continue;
+
+		for (j = 0; j < n->kcnt; j++)
+		{
+			NodeStruct *c = &KIDS(w,n,j);
+
+			if(!c->managed)
+				continue;
+
+#if 0
+			if(n->kids[j].link_data != -1)
+			{
+				GC gc = w->simplebase.links[n->kids[j].link_data].gc;
+				XDrawLine(XtDisplay(w), XtWindow(w), 
+					gc,
+					n->r.x + n->r.width/2 , 
+					n->r.y + n->r.height/2 ,
+					c->r.x + c->r.width/2  ,
+					c->r.y + c->r.height/2);
+			 }
+#endif
+
+				
+		}
+
+	}
+
+	y = w->simpletime.max_h + w->simpletime.title;
+	 for (i = 0; i < w ->simpletime.arcs; i++)
+	 {
+		line_in(w,0,y, w->core.width, y);
+		y +=  w->simpletime.max_h;
+	}
+
+	NodesRedraw((SimpleBaseWidget)w,event,region);
+
+	
+}
+
+static void Print(SimpleTimeWidget w,FILE *f)
+{
+}
+
+
+static void calc_arc(SimpleTimeWidget tw,NodeStruct* w,int arc)
+{
+	int j;
+	if(w->misc[ARC] == -1 && w->managed)
+	{
+		w->misc[ARC] = arc;
+		for (j = 0; j < w->kcnt; j++)
+		{
+			NodeStruct *c = &KIDS(tw,w,j);
+			calc_arc(tw,c,arc);
+		}
+
+		for (j = 0; j < w->pcnt; j++)
+		{
+			NodeStruct *c = &PARENTS(tw,w,j);
+			calc_arc(tw,c,arc);
+		}
+
+	}
+}
+
+static void Layout(Widget w,long *maxWidth,long *maxHeight)
+{
+	SimpleTimeWidget tw = (SimpleTimeWidget)w;
+//	XtGeometryResult    result;
+//	Dimension           replyWidth = 0, replyHeight = 0;
+	int i;
+//	int nlines = 0;
+//	Position		*lines;
+	int arc = 0;
+
+	XmString s = XmStringCreateSimple("0123456789:- ");
+	tw->simpletime.title = XmStringHeight(tw->simpletime.font,s)*2 + 10;
+	XmStringFree(s);
+
+	*maxWidth = *maxHeight = 5;
+
+	if(tw->simplebase.count == 0)
+	{
+		tw->simpletime.inited = 0;
+		return;
+	}
+
+
+	tw->simpletime.max_w = 0;
+	tw->simpletime.max_h = 0;
+
+	for(i=0;i<tw->simplebase.count;i++)
+	{
+		NodeStruct  *w = tw->simplebase.nodes + i;
+		if(!w->managed) continue;
+
+		w->misc[ARC] = -1;
+	    if(w->r.height> tw->simpletime.max_h) 
+			tw->simpletime.max_h = w->r.height;
+
+		if(w->misc[DATE] == 0)
+			if(w->r.width > tw->simpletime.max_w)
+				tw->simpletime.max_w = w->r.width;
+	}
+
+	tw->simpletime.max_h += 4;
+
+	for(i=0;i<tw->simplebase.count;i++)
+	{
+		NodeStruct  *w = tw->simplebase.nodes + i;
+		if(!w->managed) continue;
+		if(w->misc[ARC] == -1)
+			calc_arc(tw,w,arc++);
+	}
+
+	tw->simpletime.arcs = arc;
+
+	if(tw->simpletime.second_per_pixel<1)
+		tw->simpletime.second_per_pixel = 1;
+
+	if(1) {
+		Widget ww = (Widget)tw;
+		Widget clip = 0,scroll = 0;
+		while(ww){
+		  if((clip = XtParent(ww)))
+		    if((scroll = XtParent(clip))) {
+					if(XmIsScrolledWindow(scroll))
+						break;
+					else
+						clip = scroll = 0;
+			  }
+		}
+
+		if(clip)
+		{
+			while(tw->simpletime.second_per_pixel > 1 &&
+				x_of(tw,tw->simpletime.end_date,tw->simpletime.end_time) < clip->core.width)
+				tw->simpletime.second_per_pixel--;
+
+			while(x_of(tw,tw->simpletime.end_date,tw->simpletime.end_time) > clip->core.width)
+				tw->simpletime.second_per_pixel++;
+		}
+	}
+
+	while(x_of(tw,tw->simpletime.end_date,tw->simpletime.end_time) > 64000)
+	{
+#if 0
+		printf("Scaling too large... %d %d %d %d\n",
+			tw->simpletime.second_per_pixel,
+			tw->simpletime.end_date,tw->simpletime.end_time,
+			x_of(tw,tw->simpletime.end_date,tw->simpletime.end_time)
+		
+			);
+#endif
+		tw->simpletime.second_per_pixel++;
+	}
+
+	for(i=0;i<tw->simplebase.count;i++)
+	{
+		NodeStruct  *w = tw->simplebase.nodes + i;
+		if(!w->managed) continue;
+
+		
+		if(w->misc[DATE] == 0)
+			w->r.x = 0;
+		else
+			w->r.x = x_of(tw,w->misc[DATE],w->misc[TIME]) - w->r.width/2;
+
+		w->r.y = tw->simpletime.title +
+			w->misc[ARC] * tw->simpletime.max_h +
+			(tw->simpletime.max_h - w->r.height)/2;
+
+		if(*maxWidth < w->r.x + w->r.width)
+			*maxWidth = w->r.x + w->r.width;
+
+		if(*maxHeight < w->r.y + w->r.height)
+			*maxHeight = w->r.y + w->r.height;
+	}
+
+}
+
+
+void TimeSetTime(Widget _w,int n,DateTime dt)
+{
+	SimpleTimeWidget tw = (SimpleTimeWidget)_w;
+	NodeStruct *w = tw->simplebase.nodes + n;
+
+	w->misc[DATE] = date_to_julian(dt.date);
+	w->misc[TIME] = time_to_sec(dt.time);
+
+	if(!tw->simpletime.inited)
+	{
+		tw->simpletime.start_date = tw->simpletime.end_date = w->misc[DATE];
+		tw->simpletime.start_time = tw->simpletime.end_time = w->misc[TIME];
+		tw->simpletime.inited = 1;
+	}
+
+	if(w->misc[DATE] < tw->simpletime.start_date ||
+		( w->misc[DATE] == tw->simpletime.start_date && 
+		  w->misc[TIME] <  tw->simpletime.start_time))
+	{
+		tw->simpletime.start_date = w->misc[DATE];
+		tw->simpletime.start_time = w->misc[TIME];
+	}
+
+	if(w->misc[DATE] > tw->simpletime.end_date ||
+		( w->misc[DATE] == tw->simpletime.end_date && 
+		  w->misc[TIME]  > tw->simpletime.end_time))
+	{
+		tw->simpletime.end_date = w->misc[DATE];
+		tw->simpletime.end_time = w->misc[TIME];
+	}
+
+#if 0
+	printf("TimeSetTime %d %d %d %d\n",
+		w->misc[DATE],w->misc[TIME],
+		 tw->simpletime.end_date, tw->simpletime.end_time
+		
+		);
+#endif
+}
+
+DateTime TimeGetTime(Widget _w,int n)
+{
+	SimpleTimeWidget tw = (SimpleTimeWidget)_w;
+	NodeStruct *w = tw->simplebase.nodes + n;
+	DateTime dt;
+
+	dt.date = julian_to_date(w->misc[DATE]);
+	dt.time = sec_to_time(w->misc[TIME]);
+
+	return dt;
+}
+
+void TimeAdd(DateTime* dt,int n)
+{
+	int dd = date_to_julian(dt->date);
+	int tt = time_to_sec(dt->time);
+
+	tt += n;
+	while(tt < 0) {
+		dd++;
+		tt += 24*60*60;
+	}
+
+	while(tt >= 24*60*60)
+	{
+		dd--;
+		tt -= 24*60*60;
+	}
+
+	/* printf("TimeAdd: %d %d\n",*d,*t); */
+
+	dt->date = julian_to_date(dd);
+	dt->time = sec_to_time(tt);
+	/* printf("TimeAdd: %d %d\n",*d,*t); */
+}
+
+Widget CreateTime(Widget par,char *nam,ArgList al,int ac)
+{
+	return XtCreateWidget(nam,simpletimeWidgetClass,par,al, ac);
+}
+
+/* 
+	Make the simpletime _second_ visible
+	If _second_ is equal to TIME_NOW show the current simpletime
+*/
+
+void TimeShowTime(Widget _w,DateTime dt,XEvent* ev)
+{
+	SimpleTimeWidget h = (SimpleTimeWidget)_w;
+    XRectangle r;
+
+
+    int d = date_to_julian(dt.date);
+    int t = time_to_sec(dt.time);
+
+    r.x      = x_of(h,d,t);
+    r.y      = ev?ev->xbutton.y:0;
+    r.width  = 1;
+    r.height = 1;
+
+    SimpleBaseShow(_w,&r,ev);
+}
+
+void TimeEventTime(Widget _w,XEvent* e,DateTime *dt)
+{
+	int x = e->xbutton.x;
+	int d,t;
+	time_of((SimpleTimeWidget)_w,x,&d,&t);
+	dt->date = julian_to_date(d);
+	dt->time = sec_to_time(t);
+}
+
+int TimeDiff(DateTime dt1,DateTime dt2)
+{
+	long long x1,x2;
+	int d1 = date_to_julian(dt1.date);
+	int d2 = date_to_julian(dt2.date);
+	int t1 = time_to_sec(dt1.time);
+	int t2 = time_to_sec(dt2.time);
+
+	x1 = d1 * 24 * 60 * 60 + t1;
+	x2 = d2 * 24 * 60 * 60 + t2;
+
+	return x1 - x2;
+}
+
+void *TimeFindByY(Widget _w,XEvent *ev)
+{
+	SimpleBaseWidget w = (SimpleBaseWidget)_w;
+	int i;
+	for(i = 0; i < w->simplebase.count;i++)
+	{
+		NodeStruct *n = w->simplebase.nodes + i;
+		if(n->managed)
+			if(
+			/* ev->xbutton.x >= n->r.x && ev->xbutton.x <= n->r.x + n->r.width && */
+			    ev->xbutton.y >= n->r.y && ev->xbutton.y <= n->r.y + n->r.height)
+				return n->user_data;
+	}
+	return NULL;
+}
diff --git a/ecflow_4_0_7/view/src/SimpleTime.h b/ecflow_4_0_7/view/src/SimpleTime.h
new file mode 100644
index 0000000..dfe33e4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleTime.h
@@ -0,0 +1,76 @@
+#ifndef SIMPLETIME_H
+#define SIMPLETIME_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "SimpleBase.h"
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+extern WidgetClass  simpletimeWidgetClass;
+
+typedef struct _SimpleTimeClassRec *SimpleTimeWidgetClass;
+typedef struct _SimpleTimeRec      *SimpleTimeWidget;
+
+/* constraint resources */
+
+#define XtNstartSimpleTime          "startSimpleTime"
+#define XtNendSimpleTime            "endSimpleTime"
+#define XtCSimpleTime               "SimpleTime"
+
+
+/* Tieme widget resources */
+
+/* Pixel between rows of widgets */
+
+#define XtNverticalSpace      "verticalSpace"
+
+/* Scale factor */
+
+#define XtNpixelSecond		  "pixelSecond"
+#define XtCPixelSecond		  "PixelSecond"
+
+/* always make current simpletime visible */
+
+#define XtNautoScroll		  "autoScroll"
+#define XtCAutoScroll		  "AutoScroll"
+
+extern Widget CreateTime(Widget,char*,Arg*,int);
+
+#define TIME_NOW	(-1)      /* Used in SimpleTimeShowSimpleTime */
+
+
+typedef struct DateTime {
+	int date;
+	int time;
+} DateTime ;
+
+void     TimeSetTime(Widget,int,DateTime);
+DateTime TimeGetTime(Widget,int);
+void     TimeAdd(DateTime*,int);
+int      TimeDiff(DateTime,DateTime);
+
+void*    TimeFindByY(Widget,XEvent*);
+
+void TimeEventTime(Widget,XEvent*,DateTime*);
+void TimeShowTime(Widget,DateTime,XEvent*);
+void TimeRange(Widget,DateTime*,DateTime*);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+#endif
diff --git a/ecflow_4_0_7/view/src/SimpleTimeP.h b/ecflow_4_0_7/view/src/SimpleTimeP.h
new file mode 100644
index 0000000..9cac613
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleTimeP.h
@@ -0,0 +1,74 @@
+#ifndef SIMPLETIMEP_H
+#define SIMPLETIMEP_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include        "SimpleBaseP.h"
+#include        <Xm/DrawingAP.h>
+
+
+typedef struct _SimpleTimeClassPart {
+    int         ignore;
+} SimpleTimeClassPart;
+
+typedef struct _SimpleTimeClassRec {
+    CoreClassPart           core_class;
+    CompositeClassPart      composite_class;
+    ConstraintClassPart     constraint_class;
+    XmManagerClassPart      manager_class;
+    XmDrawingAreaClassPart  drawing_area_class;
+    SimpleBaseClassPart     simplebase_class;
+    SimpleTimeClassPart     simpletime_class;
+} SimpleTimeClassRec;
+
+extern SimpleTimeClassRec simpletimeClassRec;
+
+typedef struct {
+	Pixel           foreground;      /* Color of time line */
+    Dimension       v_min_space;     /* Distance between rows */
+	int             second_per_pixel;/* Scale factor */
+	int			    minute;          /* Current time */
+	Boolean			auto_scroll;     /* Allays show current time line */
+	XtIntervalId	timeout_id;      /* Time out id */
+	GC				gc;              /* Gc for time line */
+	int          start_date;
+	int          end_date;
+	int          start_time;
+	int          end_time;
+	int             arcs;
+	int             inited;
+	int             max_w;
+	int             max_h;
+	int             title;
+	XmFontList      font;
+} SimpleTimePart;
+
+
+typedef struct _SimpleTimeRec {
+    CorePart            core;
+    CompositePart       composite;
+    ConstraintPart      constraint;
+    XmManagerPart       manager;
+    XmDrawingAreaPart   drawing_area;
+    SimpleBasePart      simplebase;
+    SimpleTimePart      simpletime;
+}  SimpleTimeRec;
+
+
+#endif 
+
+
+
diff --git a/ecflow_4_0_7/view/src/SimpleTree.c b/ecflow_4_0_7/view/src/SimpleTree.c
new file mode 100644
index 0000000..7c571b6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleTree.c
@@ -0,0 +1,656 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <stdio.h>
+
+#include <X11/Intrinsic.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/CoreP.h>
+#include <X11/CompositeP.h>
+#include <X11/ConstrainP.h>
+#include <Xm/XmP.h>
+#include <Xm/DrawingAP.h>
+#include <Xm/ExtObjectP.h>
+#include "SimpleTree.h"
+#include "SimpleTreeP.h"
+
+#include <Xm/ScrollBar.h>
+#include <stdlib.h>
+
+#ifndef MAX
+#define   MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+#ifndef MIN
+#define   MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#define LAYOUT 0
+
+static void             Initialize();
+/*static void             ConstraintInitialize();
+  static Boolean          ConstraintSetValues();*/
+static void             Destroy();
+static void             Print();
+static Boolean          SetValues();
+/*static XtGeometryResult GeometryManager();
+static void             ChangeManaged();
+static void             insert_new_node();
+static void             delete_node();*/
+static void Layout(Widget,long*,long*);
+static void             Redisplay();
+static void compute_rect(SimpleTreeWidget,NodeStruct*,int,int,int,int,int,XRectangle*);
+static void set_positions(SimpleTreeWidget,long*,long*);
+/* static void change_vertical(SimpleTreeWidget tw, NodeStruct *w,Boolean v); ??? */
+#ifdef linux
+/* putting this into comments makes ctrl-left button for collector
+   disappear !! */
+static char defaultTranslations[] = "\
+ Shift<Btn5Down>: increment(1)\n       Shift<Btn4Down>: increment(-1)  \n\
+      <Btn5Down>: increment(10)\n           <Btn4Down>: increment(-10) \n\
+<BtnDown>:DrawingAreaInput()\n\
+<BtnUp>:DrawingAreaInput()\n\
+<Key>osfActivate:DrawingAreaInput()\n\
+~s ~m ~a <Key>Return:DrawingAreaInput()\n\
+~s ~m ~a <Key>space:DrawingAreaInput()\n\
+<Key>F1:DrawingAreaInput()\n\
+<Key>F2:DrawingAreaInput()\n";
+#else
+
+#define defaultTranslations XmInheritTranslations
+
+#endif
+
+static XtResource resources[] = {
+	{XtNhorizontalSpace,XtCSpace,XtRDimension,sizeof(Dimension),
+	XtOffset(SimpleTreeWidget, simpletree.h_min_space), XtRString,"6" },
+	{XtNverticalSpace,XtCSpace, XtRDimension,sizeof (Dimension),
+	XtOffset(SimpleTreeWidget, simpletree.v_min_space), XtRString,"2"  },
+
+};
+
+// https://software.ecmwf.int/issues/browse/SUP-646
+static void xincrement();
+static XtActionsRec actionsList[] = {
+    { "increment",(XtActionProc) xincrement},
+}; // 
+
+SimpleTreeClassRec simpletreeClassRec = {
+	{
+	/* core_class fields  */
+	(WidgetClass) &simplebaseClassRec,/* superclass         */
+	"SimpleTree",                           /* class_name         */
+	sizeof(SimpleTreeRec),                /* widget_size        */
+	NULL,                             /* class_init         */
+	NULL,                             /* class_part_init    */
+	FALSE,                            /* class_inited       */
+	Initialize,                       /* initialize         */
+	NULL,                             /* initialize_hook    */
+	XtInheritRealize,                 /* realize            */
+	actionsList, /*NULL,                 actions            */
+        XtNumber(actionsList),            /* num_actions        */
+	resources,                        /* resources          */
+	XtNumber(resources),              /* num_resources      */
+	NULLQUARK,                        /* xrm_class          */
+	TRUE,                             /* compress_motion    */
+	 /* XtExposeCompressMaximal, */
+	True,          
+	/* compress_exposure  */
+	TRUE,                             /* compress_enterleave*/
+	TRUE,                             /* visible_interest   */
+	Destroy,                          /* destroy            */
+	NULL,                             /* resize             */
+	Redisplay,                        /* expose             */
+	SetValues,                        /* set_values         */
+	NULL,                             /* set_values_hook    */
+	XtInheritSetValuesAlmost,         /* set_values_almost  */
+	NULL,                             /* get_values_hook    */
+	NULL,                             /* accept_focus       */
+	XtVersion,                        /* version            */
+	NULL,                             /* callback_private   */
+	defaultTranslations,              /* tm_table           */
+	/* XtInheritTranslations,            tm_table           */
+	NULL,                             /* query_geometry     */
+	XtInheritDisplayAccelerator,      /* display_accelerator*/
+	NULL,                             /* extension          */
+	},
+	{
+	/* composite_class fields */
+	NULL,                 /* geometry_manager    */
+	NULL,                   /* change_managed      */
+	XtInheritInsertChild,            /* insert_child        */
+	XtInheritDeleteChild,            /* delete_child        */
+	NULL/*&compext*/,                        /* extension           */
+	},
+	{ 
+	/* constraint_class fields */
+	NULL,          /* subresources        */
+	0,/* subresource_count   */
+	0,       /* constraint_size     */
+	NULL,             /* initialize          */
+	NULL,                /* destroy             */
+	NULL,              /* set_values          */
+	NULL,                             /* extension           */
+	},
+	{
+	XtInheritTranslations,   /* default translations */
+	NULL,                    /* syn_resources          */
+	0,               /* num_syn_resources      */
+	NULL,                        /* syn_cont_resources     */
+	0,                           /* num_syn_cont_resources */
+	XmInheritParentProcess,  /* parent_process */
+	NULL,                        /* extension              */
+
+	},
+	{
+	NULL,
+	},
+	{
+	Print,
+	Layout,
+	},
+	{
+	/* SimpleTree class fields */
+	0,                               /* ignore              */
+	},
+};
+
+
+WidgetClass simpletreeWidgetClass = (WidgetClass) &simpletreeClassRec;
+
+static void Initialize(SimpleTreeWidget request, SimpleTreeWidget new)
+{
+	if (request->core.width <= 0)
+		new->core.width = 5;
+	if (request->core.height <= 0)
+		new->core.height = 5;
+
+}
+
+static void Destroy(SimpleTreeWidget w)
+{
+}
+
+
+static Boolean SetValues(SimpleTreeWidget current, 
+SimpleTreeWidget request, SimpleTreeWidget new)
+{
+	int  redraw = FALSE;
+	long w = 0;
+	long h = 0;
+
+	if (new->simpletree.v_min_space != current->simpletree.v_min_space ||
+	    new->simpletree.h_min_space != current->simpletree.h_min_space){
+		Layout((Widget)new,&w,&h);
+		redraw = True;
+	}
+
+	/* printf("Redraw tree %d\n",redraw); */
+
+	return (redraw);
+}
+
+
+static int first_kid(SimpleTreeWidget w,NodeStruct *n)
+{
+	int i;
+	for(i=0;i<n->kcnt;i++)
+		if(KIDS(w,n,i).managed)
+			return i;
+	return -1;
+}
+
+static int last_kid(SimpleTreeWidget w,NodeStruct *n)
+{
+	int i;
+
+	if(n->kcnt)
+		for(i= n->kcnt - 1;i>=0;i--)
+			if(KIDS(w,n,i).managed)
+				return i;
+	return -1;
+}
+
+static void line(SimpleTreeWidget w,int x1,int y1,int x2,int y2,Region region ) 
+{
+	int width  = x2>x1 ? x2-x1+2 : x1-x2+2;
+	int height = y2>y1 ? y2-y1+2 : y1-y2+2;
+	int x      = x2>x1 ? x1 : x2;
+	int y      = y2>y1 ? y1 : y2;
+
+	if(XRectInRegion(region,x,y,width,height))
+	{
+
+		XDrawLine(XtDisplay(w), XtWindow(w), w->manager.bottom_shadow_GC,
+			x1,y1,x2,y2);
+
+		XDrawLine(XtDisplay(w), XtWindow(w), w->manager.top_shadow_GC,
+			x1+1,y1+1,x2+1,y2+1);
+	}
+}
+
+static void Redisplay (SimpleTreeWidget w, XEvent *event, Region region)
+{
+	int i, j;
+	int fkid;
+	int lkid;
+
+#if 0
+	NodeStruct    *child;
+	XEvent  ev;
+	XmRegion r = (XmRegion)region;
+
+	printf("Before: %p\n",r);
+	if(r)
+	for(i=0;i<r->numRects;i++)
+	{
+		XmRegionBox* x = &r->rects[i];
+		printf("  %d-%d %d-%d\n", x->x1,x->x2,x->y1,x->y2);
+	}
+
+	while(XCheckWindowEvent(XtDisplay(w),XtWindow(w),ExposureMask,&ev))
+		XtAddExposureToRegion(&ev,region);
+
+	printf("After:\n");
+	if(r)
+	for(i=0;i<r->numRects;i++)
+	{
+		XmRegionBox* x = &r->rects[i];
+		printf("  %d %d %d %d\n", x->x1,x->y1,x->x2,x->y2);
+	}
+#endif
+
+
+	for (i = 0; i < w -> simplebase.count; i++)
+	{
+		NodeStruct *child = w -> simplebase.nodes + i;
+
+		fkid = first_kid(w,child);
+
+		if(!child->misc[LAYOUT]) /* Vertical layout */
+		{
+
+			if(fkid>=0)
+			{
+				line(w,
+				    child->r.x + child->r.width, 
+				    child->r.y + child->r.height / 2,
+				    KIDS(w,child,fkid).r.x,
+				    child->r.y + child->r.height / 2
+				    /* KIDS(w,child,fkid).r.y +  */
+				    /* KIDS(w,child,fkid).r.height/2 */
+					,region);
+
+				lkid = last_kid(w,child);
+
+				if(lkid != fkid)
+				{
+					int x =  child->r.x + child->r.width + 
+					(KIDS(w,child,fkid).r.x - (child->r.x + child->r.width)) / 2;
+
+					line(w,
+					    x, 
+					    child->r.y + child->r.height / 2,
+					    x,
+					    KIDS(w,child,lkid).r.y + 
+					    KIDS(w,child,lkid).r.height/2,region);
+
+					for (j = fkid + 1 ; j < child->kcnt; j++)
+						if (KIDS(w,child,j).managed)
+						{
+
+							line(
+							    w,
+							    x,
+							    KIDS(w,child,j).r.y +
+							    KIDS(w,child,j).r.height/2,
+							    KIDS(w,child,j).r.x,
+							    KIDS(w,child,j).r.y + 
+							    KIDS(w,child,j).r.height/2,region);
+
+						}
+				}
+			}
+		}
+		else
+		{
+			fkid = first_kid(w,child);
+
+			if(fkid>=0 )
+			{
+				lkid = last_kid(w,child);
+
+				line(w,
+					KIDS(w,child,fkid).r.x + KIDS(w,child,fkid).r.width/2,
+					child->r.y + child->r.height + w->simpletree.v_min_space/2,
+					KIDS(w,child,lkid).r.x + KIDS(w,child,lkid).r.width/2, 
+					child->r.y + child->r.height + w->simpletree.v_min_space/2,region);
+
+				line(
+					w,
+					KIDS(w,child,fkid).r.x + KIDS(w,child,fkid).r.width/2,
+					child->r.y + child->r.height,
+					KIDS(w,child,fkid).r.x + KIDS(w,child,fkid).r.width/2,
+					KIDS(w,child,fkid).r.y,region);
+
+				for (j = fkid + 1; j <  child->kcnt; j++)
+					if (KIDS(w,child,j).managed)
+					{
+
+						line(
+						    w,
+						    KIDS(w,child,j).r.x + KIDS(w,child,j).r.width/2,
+							child->r.y + child->r.height + w->simpletree.v_min_space/2,
+						    KIDS(w,child,j).r.x + KIDS(w,child,j).r.width/2,
+						    KIDS(w,child,j).r.y,region);
+					}
+			}
+
+		}
+
+	}
+
+	NodesRedraw((SimpleBaseWidget)w,event,region);
+}
+
+
+
+static void Layout(Widget w,long *maxWidth,long *maxHeight)
+{
+	SimpleTreeWidget tw = (SimpleTreeWidget)w;
+	int                 high = (int)tw->simpletree.v_min_space;
+	int                 i,n;
+	int                 h_max = 0,w_max = 0, dh;
+
+	*maxWidth = *maxHeight = 5;
+
+	h_max = high;
+
+	for(i=0;i<tw->simplebase.count;i++)
+	{
+		NodeStruct *w = tw->simplebase.nodes + i;
+		h_max = MAX(h_max,w->r.height); /* just a try */
+		w_max = MAX(w_max,w->r.width);
+	}
+
+	dh = h_max / 2;
+
+	h_max += tw->simpletree.v_min_space;
+	w_max += tw->simpletree.h_min_space;
+
+	for(n=0;n<tw->simplebase.count;n++)
+	{
+		for(i=0;i<tw->simplebase.count;i++)
+		{
+			NodeStruct *w = tw->simplebase.nodes + i;
+			if(w->managed && (w->pcnt == 0))
+			{
+				XRectangle r;
+				compute_rect(tw,w,
+					(int)tw->simpletree.h_min_space,
+					(int)tw->simpletree.h_min_space,
+					w->r.width,
+					w->r.height, 
+					w->r.height, 
+					&r);
+			}
+		}
+
+		set_positions(tw,maxWidth,maxHeight);
+#if 0
+		if(*maxWidth == 0 || *maxHeight == 0)
+		{
+			Boolean v = (*maxWidth == 0);
+			for(i=0;i<tw->simplebase.count;i++)
+			{
+				NodeStruct *w = tw->simplebase.nodes + i;
+				if(w->managed && (w->pcnt == 0))
+					change_vertical(tw,w,!v);
+			}
+
+		}
+		else 
+#endif
+		break;
+	}
+}
+
+#if 0
+static void change_vertical(SimpleTreeWidget tw, NodeStruct *w,Boolean v)
+{
+	int i;
+	if(w->misc[LAYOUT] != v )
+		w->misc[LAYOUT] = v;
+	else
+	{
+		for(i = 0; i < w->kcnt ; i++)
+			if(KIDS(tw,w,i).managed)
+				change_vertical(tw,&KIDS(tw,w,i),v);
+	}
+}
+#endif
+
+static void union_rect(XRectangle *r1,XRectangle *r2,XRectangle *r3)
+{
+	int dx,dy;
+
+	dx  = MAX(r1->x+r1->width,r2->x+r2->width);
+	dy  = MAX(r1->y+r1->height,r2->y+r2->height);
+	r3->x = MIN(r1->x,r2->x);
+	r3->y = MIN(r1->y,r2->y);
+
+	r3->width  = dx - r3->x;
+	r3->height = dy - r3->y;
+
+}
+
+
+static void compute_rect(SimpleTreeWidget tw,NodeStruct *w,
+	int x,int y,int dx,int dy,int h,XRectangle *rect)
+{
+	int i;
+	int mx = 0;
+	int my = 0;
+
+	*rect   = w->r;
+	rect->x = w->tmpx = x;
+	rect->y = w->tmpy = y; /* + (h - w->r.height) / 2; */
+	rect->width += tw->simpletree.h_min_space;
+	rect->height += tw->simpletree.v_min_space;
+
+	if(h > w->r.height)
+		rect->y = w->tmpy = y + (h - w->r.height) / 2;
+
+	for(i = 0; i < w->kcnt; i++)
+	{
+		NodeStruct *z = &KIDS(tw,w,i);
+		if(z->managed)
+		{
+			if(z->kcnt) /* && !w->misc[LAYOUT]) */
+				mx = MAX(mx,z->r.width);
+			my = MAX(my,z->r.height);
+		}
+	}
+
+	for(i = 0; i < w->kcnt; i++)
+	{
+		NodeStruct *z = &KIDS(tw,w,i);
+		if(z->managed)
+		{
+			XRectangle r;
+			if(!w->misc[LAYOUT])
+			{
+				compute_rect(tw,z,x + dx + tw->simpletree.h_min_space ,
+					y, mx, my, w->r.height,&r);
+				union_rect(rect,&r,rect);
+				y += r.height;
+
+				if(y > 60000)
+				{
+					y = w->tmpy;
+					x += r.width;
+				}
+			}
+			else
+			{
+				compute_rect(tw,z,x,y + dy
+				+ tw->simpletree.v_min_space, mx, my, w->r.height,
+					 &r);
+				union_rect(rect,&r,rect);
+				x += r.width;
+			}
+		}
+	}
+
+}
+
+
+static void set_positions(SimpleTreeWidget tw,long *maxWidth, long *maxHeight)
+{
+	int       i;
+
+	for(i=0;i<tw->simplebase.count;i++)
+	{
+		NodeStruct *w = tw->simplebase.nodes + i;
+
+		if(w->managed)
+		{
+#if 0
+			if(w->tmpx != (Position)w->tmpx)
+			{
+				*maxWidth = 0;
+				return;
+			}
+
+			if(w->tmpy != (Position)w->tmpy)
+			{
+				*maxHeight = 0;
+				return;
+			}
+#endif
+
+
+#if 0
+			w->r.x = w->tmpx % 64000    + (w->tmpy / 64000) * (w->r.width  + 20);
+			w->r.y = w->tmpy % 64000    + (w->tmpx / 64000) * (w->r.height + 20);
+#endif
+
+			w->r.x = w->tmpx;
+			w->r.y = w->tmpy;
+
+			*maxWidth = MAX(*maxWidth,
+			    w->r.x + w->r.width + tw->simpletree.h_min_space);
+			*maxHeight = MAX(*maxHeight,
+			    w->r.y + w->r.height + tw->simpletree.v_min_space);
+		}
+	}
+}
+
+void NodeTreeFlip(Widget _w,int node)
+{
+    SimpleTreeWidget w = (SimpleTreeWidget)_w;
+	NodeStruct *p = w->simplebase.nodes + node;
+	if( node < 0 || node >= w->simplebase.count) return;
+	p->misc[LAYOUT] = !p->misc[LAYOUT];
+	NodeNewSize(_w,node);
+}
+
+Widget CreateTree(Widget par,char *nam,ArgList al,int ac)
+{
+	return XtCreateWidget(nam,simpletreeWidgetClass,par,al, ac);
+}
+
+static void Print (SimpleTreeWidget w, FILE *f)
+{
+}
+
+static void xincrement (h, event, args, n_args)
+Widget   h;
+XEvent        *event;
+char          *args[];
+int            n_args;
+{
+#ifdef MOTIF
+#define SetArg(a,b)  XtSetArg(al[ac],a,b);ac++
+#define GetValues(w) XtGetValues(w,al,ac);ac=0
+#define SetValues(w) XtSetValues(w,al,ac);ac=0
+
+  Widget clip = XtParent(h);
+  Widget swin;
+  Widget v_scroll;
+
+  int ac = 0, arg;
+  Position        x_parent,y_parent, dh=0, dv=0;  
+  Arg al[5];
+
+  if(!clip) return;
+  swin = XtParent(clip);
+
+  if(!(swin = XtParent(swin))) return;
+  while (swin && !XmIsScrolledWindow(swin)) {
+    swin = XtParent(swin); 
+  }
+
+  /* printf("# SimpleTree swin %s\n",XtName(swin));  */
+  /* while (clip) { */
+  /*   printf("# SimpleTree clip %s\n",XtName(clip));  */
+  /*   clip = XtParent(clip);  */
+  /* } */
+  if(!swin) return;
+  {
+    int min, max, value, slider_size, inc, page_inc;
+    ac = 0;
+    XtSetArg(al[ac],XmNverticalScrollBar, &v_scroll );ac++;
+    XtGetValues(swin,al,ac);
+  
+    ac = 0;
+    XtSetArg(al[ac], XmNminimum,&min); ac++;
+    XtSetArg(al[ac], XmNmaximum,&max); ac++;   
+    XtGetValues(v_scroll, al, ac);
+    XmScrollBarGetValues(v_scroll,&value,&slider_size,&inc,&page_inc);
+
+    ac = 0;
+    XtSetArg(al[ac],XmNx,&x_parent);ac++;
+    XtSetArg(al[ac],XmNy,&y_parent);ac++;
+    XtGetValues(swin,al,ac);
+
+    arg = atoi(args[0]);
+    dh = (abs(arg) > 5) ? page_inc : inc;
+
+    if (arg < 0) {
+      if (value - dh < min)
+        value = min;
+      else
+        value -= dh;
+    } else {
+      if (value + dh > max)
+        value = max;
+      else
+        value += dh;
+    }
+
+    {
+      Position x = x_parent-dh;
+      Position y = y_parent-dv;
+
+      ac = 0;
+      XtSetArg(al[ac],XmNx,x);ac++;
+      XtSetArg(al[ac],XmNy,y);ac++;
+      XtSetValues(swin,al,ac);
+      XmScrollBarSetValues(v_scroll,value,slider_size, inc, page_inc,TRUE);
+    }
+  }
+#endif
+}
diff --git a/ecflow_4_0_7/view/src/SimpleTree.h b/ecflow_4_0_7/view/src/SimpleTree.h
new file mode 100644
index 0000000..0797a2b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleTree.h
@@ -0,0 +1,49 @@
+#ifndef SIMPLETREE_H
+#define SIMPLETREE_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+#ifndef MOTIF
+#define MOTIF
+#endif
+
+#include "SimpleBase.h"
+
+extern WidgetClass  simpletreeWidgetClass;
+
+typedef struct _SimpleTreeClassRec *SimpleTreeWidgetClass;
+typedef struct _SimpleTreeRec      *SimpleTreeWidget;
+
+#define XtNhorizontalSpace    "horizontalSpace"
+#define XtNverticalSpace      "verticalSpace"
+#define XtNparentNode         "parentNode"
+#define XtCParentNode         "ParentNode"
+#define XtNselected           "selected"
+#define XtCSelected           "Selected"
+#define XtNvertical            "vertical"
+#define XtCVertical            "Vertical"
+
+extern Widget CreateTree(Widget,char*,Arg*,int);
+extern void NodeTreeFlip(Widget,int);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif 
diff --git a/ecflow_4_0_7/view/src/SimpleTreeP.h b/ecflow_4_0_7/view/src/SimpleTreeP.h
new file mode 100644
index 0000000..50325b2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/SimpleTreeP.h
@@ -0,0 +1,60 @@
+#ifndef SIMPLETREEP_H
+#define SIMPLETREEP_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "SimpleBaseP.h"
+#include <Xm/DrawingAP.h>
+
+
+typedef struct _SimpleTreeClassPart {
+    int         ignore;
+} SimpleTreeClassPart;
+
+typedef struct _SimpleTreeClassRec {
+    CoreClassPart           core_class;
+    CompositeClassPart      composite_class;
+    ConstraintClassPart     constraint_class;
+    XmManagerClassPart      manager_class;
+    XmDrawingAreaClassPart  drawing_area_class;
+    SimpleBaseClassPart     simplebase_class;
+    SimpleTreeClassPart     simpletree_class;
+} SimpleTreeClassRec;
+
+extern SimpleTreeClassRec simpletreeClassRec;
+
+typedef struct {
+    Dimension      h_min_space;
+    Dimension      v_min_space;
+} SimpleTreePart;
+
+
+typedef struct _SimpleTreeRec {
+    CorePart            core;
+    CompositePart       composite;
+    ConstraintPart      constraint;
+    XmManagerPart       manager;
+    XmDrawingAreaPart   drawing_area;
+    SimpleBasePart      simplebase;
+    SimpleTreePart      simpletree;
+}  SimpleTreeRec;
+
+
+
+#endif 
+
+
+
diff --git a/ecflow_4_0_7/view/src/Tab.c b/ecflow_4_0_7/view/src/Tab.c
new file mode 100644
index 0000000..e53a720
--- /dev/null
+++ b/ecflow_4_0_7/view/src/Tab.c
@@ -0,0 +1,784 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #6 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <stdio.h>
+#include <math.h>
+
+#ifndef M_PI
+#define M_PI    3.14159265358979323846
+#endif
+
+#define  RADIANS(x)  (M_PI * (x) / 180.0)
+#define  ROUND(X)  (((X) >= 0) ? (int)((X)+0.5) : (int)((X)-0.5))
+
+
+#include      <X11/Intrinsic.h>
+#include      <X11/IntrinsicP.h>
+#include      <X11/StringDefs.h>
+#include      <X11/CoreP.h>
+#include    <X11/CompositeP.h>
+#include      <X11/ConstrainP.h>
+#include        <Xm/XmP.h>
+#include        <Xm/DrawingAP.h>
+#include      "Tab.h"
+#include      "TabP.h"
+
+#ifndef MAX
+#define   MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+#ifndef MIN
+#define   MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+static void             Initialize();
+static void             Resize();
+static void             Destroy();
+static void             ReDisplay();
+static void             Click();
+static Boolean          SetValues();
+static XtGeometryResult GeometryManager();
+static void             ChangeManaged();
+static void             new_layout(TabWidget,Boolean);
+
+static XtResource resources[] = {
+	{XmNvalueChangedCallback,XmCValueChangedCallback,XtRCallback,
+	 sizeof(XtPointer), XtOffset(TabWidget,tab.cb), XtRCallback, 
+	 NULL },
+
+	{XmNopenCallback,XmCValueChangedCallback,XtRCallback,
+	 sizeof(XtPointer), XtOffset(TabWidget,tab.open_cb), XtRCallback, 
+	 NULL },
+
+	{XmNcloseCallback,XmCValueChangedCallback,XtRCallback,
+	 sizeof(XtPointer), XtOffset(TabWidget,tab.close_cb), XtRCallback,
+	 NULL },
+
+	{XmNfontList,XmCFontList,XmRFontList,sizeof(XmRFontList),
+	 XtOffset(TabWidget,tab.font),XmRString,(XtPointer)"fixed" },
+
+	{ "Back", "back", XmRPixel,sizeof(Pixel),
+	  XtOffset(TabWidget,tab.back),XmRString,"#bcbcbcbcbcbc"},
+
+	{ "Blue", "blue", XmRPixel,sizeof(Pixel),
+	  XtOffset(TabWidget,tab.blue),XmRString,"blue"},
+
+	{ "drawer", "Drawer", XmRBoolean,sizeof(Boolean),
+	  XtOffset(TabWidget,tab.drawer),XmRString,"false"},
+};
+
+
+static XtActionsRec actions[] = {
+	{"Click",Click}
+};
+
+
+static char translations[] =
+"<Btn1Down>: Click()";
+
+#define USE_MANAGER
+
+TabClassRec tabClassRec = {
+	{
+	/* core_class fields  */
+	(WidgetClass) &xmDrawingAreaClassRec,/* superclass         */
+	"Tab",                           /* class_name         */
+	sizeof(TabRec),                /* widget_size        */
+	NULL,                             /* class_init         */
+	NULL,                             /* class_part_init    */
+	FALSE,                            /* class_inited       */
+	Initialize,                       /* initialize         */
+	NULL,                             /* initialize_hook    */
+	XtInheritRealize,                 /* realize            */
+	actions,                             /* actions            */
+	XtNumber(actions),                                /* num_actions        */
+	resources,                        /* resources          */
+	XtNumber(resources),              /* num_resources      */
+	NULLQUARK,                        /* xrm_class          */
+	TRUE,                             /* compress_motion    */
+	XtExposeCompressMaximal,          /* compress_exposure  */
+	TRUE,                             /* compress_enterleave*/
+	TRUE,                             /* visible_interest   */
+	Destroy,                          /* destroy            */
+	Resize,                           /* resize             */
+	ReDisplay,                        /* expose             */
+	SetValues,                        /* set_values         */
+	NULL,                             /* set_values_hook    */
+	XtInheritSetValuesAlmost,         /* set_values_almost  */
+	NULL,                             /* get_values_hook    */
+	NULL,                             /* accept_focus       */
+	XtVersion,                        /* version            */
+	NULL,                             /* callback_private   */
+	translations,            /* tm_table           */
+	NULL,                             /* query_geometry     */
+	XtInheritDisplayAccelerator,      /* display_accelerator*/
+	NULL,                             /* extension          */
+	},
+	{
+	/* composite_class fields */
+	GeometryManager,                 /* geometry_manager    */
+	ChangeManaged,                   /* change_managed      */
+	XtInheritInsertChild,            /* insert_child        */
+	XtInheritDeleteChild,            /* delete_child        */
+	NULL ,                           /* extension           */
+	},
+	{ 
+	/* constraint_class fields */
+	NULL,                             /* subresources        */
+	0,                                /* subresource_count   */
+	0,                                /* constraint_size     */
+	NULL,                             /* initialize          */
+	NULL,                             /* destroy             */
+	NULL,                             /* set_values          */
+	NULL,                             /* extension           */
+	},
+	{
+	XtInheritTranslations,   /* default translations */
+	NULL,                    /* syn_resources          */
+	0,               /* num_syn_resources      */
+	NULL,                        /* syn_cont_resources     */
+	0,                           /* num_syn_cont_resources */
+	XmInheritParentProcess,  /* parent_process */
+	NULL,                        /* extension              */
+
+	},
+	{
+	NULL,
+	},
+	{
+	/* Tab class fields */
+	0,                               /* ignore              */
+	},
+};
+
+static void make_visible(TabWidget tw,Widget w);
+
+WidgetClass tabWidgetClass = (WidgetClass) &tabClassRec;
+
+static void Initialize(TabWidget request, TabWidget new)
+{
+
+	XGCValues       values;
+        XtGCMask        valueMask = 0;
+
+	XFontStruct     *fs = (XFontStruct *) NULL;
+
+	/*
+	 * Make sure the widget's width and height are 
+	 * greater than zero.
+	 */
+	if (request->core.width <= 0)
+		new->core.width = 5;
+	if (request->core.height <= 0)
+		new->core.height = 5;
+
+	_XmFontListGetDefaultFont(new->tab.font,&fs);
+	if(fs != NULL)
+	{
+		valueMask    |= GCFont;
+		values.font  = fs->fid;
+	}
+      
+	new->tab.gc     = XtGetGC((Widget)new,valueMask,&values);
+	new->tab.current = 0;
+
+	new->tab.hmargin = 8;
+	new->tab.vmargin = 3;
+
+	new->tab.top    = 2;
+	new->tab.bottom = 2;
+	new->tab.delta  = new->tab.hmargin;
+}
+
+static void Destroy(TabWidget w)
+{
+	XtReleaseGC((Widget)w,w->tab.gc);
+}
+
+static void Resize(TabWidget w)
+{
+	XmDrawingAreaCallbackStruct cb;
+	new_layout(w,False);
+	cb.reason = XmCR_RESIZE;
+	cb.event = NULL;
+	cb.window = XtWindow (w);
+	XtCallCallbackList((Widget)w,w->drawing_area.resize_callback, &cb);
+	make_visible(w,w->tab.current);
+	if(XtIsRealized((Widget)w))
+		XClearArea(XtDisplay(w),XtWindow(w),0,0,0,0,True);
+}
+
+static Boolean SetValues(TabWidget current, TabWidget request, TabWidget new)
+{
+	new_layout(new,False);
+	return (False);
+}
+
+static XtGeometryResult GeometryManager(Widget w, 
+	XtWidgetGeometry *request, 
+	XtWidgetGeometry *reply)
+{
+	new_layout((TabWidget)XtParent(w),True);
+	return XtGeometryYes;
+}
+
+static void ChangeManaged(TabWidget tw)
+{
+	new_layout(tw,True);
+}
+
+static char* name_of(Widget w)
+{
+	if(XmIsScrolledWindow(w))
+	{
+		static char name[90];
+		strcpy(name,XtName(w));
+		name[strlen(name)-2] = 0;
+		return name;
+	}
+	else
+		return XtName(w);	
+		
+}
+
+static void new_layout(TabWidget tw,Boolean geometry)
+{
+        /* Dimension w = tw->core.width; */
+	/* Dimension h = tw->core.height; */
+	int t;
+	int i;
+
+	Dimension mw = 0;
+	Dimension mh = 0;
+	Dimension ww = 0;
+
+	Dimension width  = tw->core.width;
+	Dimension height = tw->core.height;
+
+	tw->tab.title = 0;
+
+
+	for(i=0;i<tw->composite.num_children;i++)
+	{
+		Widget c = tw->composite.children[i];
+		if(XtIsManaged(c))
+		{
+			char *n = name_of(c);
+			XmString s = XmStringCreateSimple(n);
+			int   h = XmStringHeight(tw->tab.font, s) + 2 * tw->tab.vmargin;
+			int   w = XmStringWidth(tw->tab.font, s)  + 2 * tw->tab.hmargin;
+			XmStringFree(s);
+
+			ww += w;
+
+			mh  = MAX(mh,c->core.height);
+			mw  = MAX(mh,c->core.width);
+
+			tw->tab.title = MAX(tw->tab.title,h);
+
+		}
+	}
+
+	if(tw->tab.drawer && !geometry )
+		height = tw->tab.title;
+	else
+		height = tw->tab.title + tw->tab.top + tw->tab.bottom + mh;
+
+	width  = 2 * tw->tab.hmargin + MAX(ww,mw);
+
+    if(geometry)
+    if(tw->core.width < width || tw->core.height < height)
+    {
+        Dimension           maxWidth = width, maxHeight = height;
+        XtGeometryResult    result;
+        Dimension           replyWidth = 0, replyHeight = 0;
+
+        result = XtMakeResizeRequest(
+            (Widget)tw,
+            maxWidth,
+            maxHeight,
+            &replyWidth, &replyHeight);
+
+        if (result == XtGeometryAlmost)
+            XtMakeResizeRequest (
+                (Widget)tw,
+                replyWidth,
+                replyHeight,NULL, NULL);
+    }
+
+
+	width  = tw->core.width;
+	t      = (tw->tab.title + tw->tab.top + tw->tab.bottom);
+	height = tw->core.height - t;
+
+	for(i=0;i<tw->composite.num_children;i++)
+	{
+		Widget c = tw->composite.children[i];
+		_XmConfigureObject((Widget)c,0,t,width,height,0);
+	}
+
+}
+
+static void draw(TabWidget tw, Widget c,int* x,int* y,int k)
+{
+	char *n = name_of(c);
+	XmString s = XmStringCreateSimple(n);
+	XPoint points[10];
+	int count = 4;
+	int minx = 0;
+	int maxx = 0;
+	int xx = 0;
+	int i;
+
+	int sw    = XmStringWidth(tw->tab.font, s);
+	int step  = sw + 2 * tw->tab.hmargin;
+
+	points[0].x = *x - tw->tab.hmargin / 2;
+	points[0].y = tw->tab.title + tw->tab.top ;
+
+	points[1].x = tw->tab.hmargin ;
+	points[1].y = -tw->tab.title;
+
+	points[2].x = sw + tw->tab.hmargin;
+	points[2].y = 0;
+
+	points[3].x = tw->tab.hmargin ;
+	points[3].y = tw->tab.title;
+
+	if(points[0].x + points[1].x + points[2].x + points[3].x > tw->core.width  )
+	{
+		int ww = 5;
+		int xx = points[0].x + points[1].x;
+
+		points[2].x = tw->core.width - xx - ww;
+		points[2].y = 0;
+
+		points[3].x = -ww;
+		points[3].y = tw->tab.title / 3;
+
+		points[4].x = ww;
+		points[4].y = tw->tab.title / 3;
+
+		points[5].x = -ww;
+		points[5].y = tw->tab.title - 2 * (tw->tab.title / 3);
+
+		count = 6;
+
+		if(k < tw->tab.last)
+			tw->tab.last = k;
+
+		if(points[2].x < points[1].x)
+		{
+			(*x) += step;
+			return;
+		}
+	}
+
+	if(points[0].x < 0)
+	{
+		int ww = 5;
+
+		points[0].x = 0;
+		points[0].y = tw->tab.title + tw->tab.top ;
+
+		points[1].x = ww;
+		points[1].y = -tw->tab.title / 3;
+
+		points[2].x = -ww;
+		points[2].y = -tw->tab.title / 3;
+
+		points[3].x = ww;
+		points[3].y = -tw->tab.title + 2 * (tw->tab.title / 3);
+
+		points[4].x = *x - tw->tab.hmargin / 2 + 2*tw->tab.hmargin + sw - ww ;
+		points[4].y = 0;
+
+		points[5].x = tw->tab.hmargin ;
+		points[5].y = tw->tab.title;
+
+		count = 6;
+
+		if(k > tw->tab.first)
+			tw->tab.first = k;
+
+		if(points[4].x < 0 )
+		{
+			(*x) += step;
+			return;
+		}
+	}
+
+	minx = points[0].x;
+	maxx = points[0].x;
+	xx   = points[0].x;
+
+	for(i = 1; i < count; i++)
+	{
+		xx += points[i].x;
+		if(xx < minx) minx = xx;
+		if(xx > maxx) maxx = xx;
+	}
+	
+	XSetForeground(XtDisplay(tw),
+		tw->tab.gc,
+		(c == tw->tab.current) ? 
+			tw->core.background_pixel:
+			tw->tab.back);
+		
+	XFillPolygon(
+		XtDisplay(tw),
+		XtWindow(tw),
+		tw->tab.gc,
+		points,
+		count,
+		Convex,
+		CoordModePrevious
+	);
+
+	XSetForeground(XtDisplay(tw),
+		tw->tab.gc,
+		tw->manager.foreground);
+
+	XDrawLines(
+		XtDisplay(tw),
+		XtWindow(tw),
+		/* tw->tab.gc, */
+		tw->manager.bottom_shadow_GC,
+		points,
+		count,
+		CoordModePrevious
+	);
+
+	XSetForeground(XtDisplay(tw),
+		tw->tab.gc,
+		(c == tw->tab.current) ? 
+			tw->tab.blue:
+			tw->manager.foreground);
+
+	{
+		char buf[1024];
+		int i = strlen(n);
+
+		while(--i >= 0 && sw > (maxx - minx - 2 * tw->tab.hmargin))
+		{
+			XmStringFree(s);
+			strncpy(buf,n,i);
+			buf[i] = '.';
+			buf[i+1] = '.';
+			buf[i+2] = '.';
+			buf[i+3] = 0;
+
+			s  = XmStringCreateSimple(buf);
+			sw = XmStringWidth(tw->tab.font, s);
+		}
+
+		
+
+	XmStringDraw(XtDisplay(tw),
+		XtWindow(tw),
+		tw->tab.font,
+		s,
+		tw->tab.gc,
+		minx ,
+		tw->tab.vmargin + tw->tab.top + tw->tab.vmargin/3,
+		maxx - minx,
+		XmALIGNMENT_CENTER,
+		XmSTRING_DIRECTION_L_TO_R,
+		NULL);
+
+	}
+
+	XSetForeground(XtDisplay(tw),
+		tw->tab.gc,
+		tw->manager.foreground);
+
+	XmStringFree(s);
+
+	(*x) += step;
+}
+
+static void ReDisplay(Widget w, XEvent *event, Region region)
+{
+	TabWidget tw = (TabWidget)w;
+
+	int x = tw->tab.delta;
+	int y = 0;
+	int i;
+	int cx = 0,cy= 0, ci = 0;
+
+	tw->tab.first = -1;
+	tw->tab.last  = tw->composite.num_children + 1;
+
+	for(i=0;i<tw->composite.num_children;i++)
+	{
+		Widget c = tw->composite.children[i];
+		if(XtIsManaged(c))
+		{
+			if(!tw->tab.current) tw->tab.current = c;
+
+			if(c == tw->tab.current) { cx = x; cy = y; ci = i; }
+			draw(tw,c,&x,&y,i);
+		}
+	}
+
+	if(tw->tab.current)
+	{
+		GC gc = tw->tab.gc;
+		int t = tw->tab.title + tw->tab.top;
+
+		x = cx;
+		y = cy;
+
+		draw(tw,tw->tab.current,&x,&y,ci);
+
+		/*========================*/
+
+		XSetForeground(XtDisplay(tw),gc,
+			tw->core.background_pixel);
+
+		XDrawLine(XtDisplay(tw),
+			XtWindow(tw),
+			gc, 0, t, tw->core.width, t);
+
+		XSetForeground(XtDisplay(tw),
+			tw->tab.gc,
+			tw->manager.foreground);
+
+		/*========================*/
+
+		gc = tw->manager.bottom_shadow_GC;
+
+		XDrawLine(XtDisplay(tw),
+			XtWindow(tw),
+			gc,
+			0,
+			t,
+			cx - tw->tab.hmargin/2,
+			t);
+
+		XDrawLine(XtDisplay(tw),
+			XtWindow(tw),
+			gc,
+			x + tw->tab.hmargin/2,
+			t,
+			tw->core.width,
+			t);
+	}
+
+	if(tw->tab.current && XtIsRealized(tw->tab.current))
+		XRaiseWindow(XtDisplay(tw->tab.current),XtWindow(tw->tab.current));
+}
+
+
+Widget CreateTab(Widget par,char* nam,Arg* al,int ac)
+{
+	return XtCreateWidget(nam,tabWidgetClass,par,al,ac);
+}
+
+Widget TabGetCurrent(Widget w)
+{
+	TabWidget tw = (TabWidget)w;
+	return tw->tab.current;
+}
+
+static int opened_size(TabWidget tw)
+{
+	XtWidgetGeometry preferred;
+	int size;
+
+	XtQueryGeometry(tw->tab.current,NULL,&preferred);
+
+	if((preferred.request_mode & CWHeight) != 0)
+		size = preferred.height;
+	else
+		size = tw->tab.current->core.height;
+
+	return size + tw->tab.title + tw->tab.vmargin;
+}
+
+static void open_close_tab(TabWidget tw)
+{
+	if(tw->core.height == tw->tab.title)
+		XtVaSetValues((Widget)tw,XmNheight,opened_size(tw),NULL);
+	else
+		XtVaSetValues((Widget)tw,XmNheight,tw->tab.title,NULL);
+}
+
+static void open_full(TabWidget tw)
+{
+	int size = opened_size(tw);
+	if(tw->core.height < size)
+		XtVaSetValues((Widget)tw,XmNheight,size,NULL);
+}
+
+static void set_tab(Widget w,Widget c,Boolean tell,XEvent* ev)
+{
+	TabWidget tw = (TabWidget)w;
+	TabCallbackStruct cb;
+
+	while(c && XtParent(c) != w)
+		c = XtParent(c);
+
+	if(!c) return;
+
+	if(tw->tab.current == c)
+	{
+	  if(tw->tab.drawer) {
+	    if(ev)
+	      open_close_tab(tw);
+	    else
+	      open_full(tw);
+	  }	  
+	  return;
+	}
+
+	cb.reason = XmCR_VALUE_CHANGED;
+	cb.widget = c;
+	cb.event  = ev;
+
+	if(tell) 
+		XtCallCallbacks(w, XmNvalueChangedCallback, &cb);
+
+	tw->tab.current = cb.widget;
+
+	if(tw->tab.drawer) 
+		open_full(tw);
+
+	make_visible(tw,tw->tab.current);
+
+	if(XtIsRealized(w))
+		XClearArea(XtDisplay(w),XtWindow(w),0,0,0,0,True);
+}
+
+void TabSetCurrent(Widget w,Widget c,Boolean tell)
+{
+	set_tab(w,c,tell,NULL);
+}
+
+void TabOpen(Widget w)
+{
+	open_full((TabWidget)w);
+}
+
+void TabClose(Widget w)
+{
+	TabWidget tw = (TabWidget)w;
+	new_layout(tw,True);
+	XtVaSetValues(w,XmNheight,tw->tab.title,NULL);
+}
+
+Boolean TabClosed(Widget w)
+{
+	TabWidget tw = (TabWidget)w;
+	return tw->tab.title == tw->core.height;
+}
+
+static void Click(Widget w, XEvent *event, String *params,Cardinal *nparams)
+{
+	TabWidget tw = (TabWidget)w;
+
+	int x = tw->tab.delta;
+	int i;
+
+	for(i=0;i<tw->composite.num_children;i++)
+	{
+		Widget c = tw->composite.children[i];
+		if(XtIsManaged(c))
+		{
+			char *n    = name_of(c);
+			XmString s = XmStringCreateSimple(n);
+
+			int   h = XmStringHeight(tw->tab.font, s) + 2 * tw->tab.vmargin;
+			int   w = XmStringWidth(tw->tab.font, s)  + 2 * tw->tab.hmargin;
+
+			XmStringFree(s);
+
+			if(event->xbutton.y >= tw->tab.top && 
+			   event->xbutton.y <= h + tw->tab.top)
+				if(event->xbutton.x >= x && event->xbutton.x <= x + w)
+				{
+
+					if(i <= tw->tab.first || i>= tw->tab.last)
+						make_visible(tw,c);
+					else
+						set_tab((Widget)tw,c,True,event);
+					break;
+				}
+			x += w;
+		}
+	}
+}
+
+
+static void make_visible(TabWidget tw, Widget wid)
+{
+	int x = 0;
+	int i;
+	int m = 0;
+	int j = 0;
+
+	int from,to;
+
+	int* pos = (int*)XtCalloc(sizeof(int),tw->composite.num_children+1);
+
+	for(i=0;i<tw->composite.num_children;i++)
+	{
+		Widget c = tw->composite.children[i];
+		if(XtIsManaged(c))
+		{
+			char *n    = name_of(c);
+			XmString s = XmStringCreateSimple(n);
+
+			/* int   h = XmStringHeight(tw->tab.font, s) + 2 * tw->tab.vmargin; */
+			int   w = XmStringWidth(tw->tab.font, s)  + 2 * tw->tab.hmargin; 
+
+			XmStringFree(s);
+
+			if(c == wid)
+				j = m;
+			pos[m++] = x;
+			x += w;
+		}
+	}
+
+	pos[m] = x;
+
+	if(j == 0 || j == m-1)
+	{
+		from = pos[j]   - tw->tab.hmargin;
+		to   = pos[j+1] + tw->tab.hmargin;;
+	}
+	else {
+		from = (pos[j]+pos[j-1])/2;
+		to   = (pos[j+2]+pos[j+1])/2;
+	}
+
+	tw->tab.delta = 5; /*  start from first tab */
+
+	if(from + tw->tab.delta < 0)
+	{
+		tw->tab.delta = -from;	
+		if(XtIsRealized((Widget)tw))
+			XClearArea(XtDisplay(tw),XtWindow(tw),0,0,0,0,True);
+	}
+
+	if(to + tw->tab.delta > tw->core.width )
+	{
+		tw->tab.delta = -(to-tw->core.width);
+		if(XtIsRealized((Widget)tw))
+			XClearArea(XtDisplay(tw),XtWindow(tw),0,0,0,0,True);
+	}
+
+	XtFree((XtPointer)pos);
+}
diff --git a/ecflow_4_0_7/view/src/Tab.h b/ecflow_4_0_7/view/src/Tab.h
new file mode 100644
index 0000000..dd1d9cf
--- /dev/null
+++ b/ecflow_4_0_7/view/src/Tab.h
@@ -0,0 +1,66 @@
+#ifndef TAB_H
+#define TAB_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#define XtNround   "round"
+#define XtCRound   "Round"
+#define XtNrows    "rows"
+#define XtNcolumns "columns"
+#define XtCRowCol  "RowCol"
+
+#define XmNopenCallback  "openCallback"
+#define XmNcloseCallback "closeCallback"
+
+extern WidgetClass  tabWidgetClass;
+
+typedef struct _TabClassRec *TabWidgetClass;
+typedef struct _TabRec      *TabWidget;
+
+#ifdef _NO_PROTO
+
+extern Widget CreateTab();
+
+#else
+ 
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+Widget    CreateTab(Widget,String,Arg*,int);
+Widget    TabGetCurrent(Widget);
+void      TabSetCurrent(Widget,Widget,Boolean);
+
+void TabOpen(Widget);
+void TabClose(Widget);
+
+Boolean TabClosed(Widget);
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+ 
+#endif /* _NO_PROTO */
+
+typedef struct {
+    int      reason;
+    XEvent  *event;
+    Widget   widget;
+}TabCallbackStruct;
+
+
+#endif /* TAB_H */
diff --git a/ecflow_4_0_7/view/src/TabP.h b/ecflow_4_0_7/view/src/TabP.h
new file mode 100644
index 0000000..e9bc60e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/TabP.h
@@ -0,0 +1,80 @@
+#ifndef TABP_H
+#define TABP_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include <Xm/XmP.h>
+#include <Xm/DrawingAP.h>
+
+typedef struct _TabClassPart {
+    int         ignore;
+} TabClassPart;
+
+typedef struct _TabClassRec {
+    CoreClassPart       core_class;
+    CompositeClassPart  composite_class;
+    ConstraintClassPart constraint_class;
+    XmManagerClassPart  manager_class;
+    XmDrawingAreaClassPart  drawing_area_class;
+    TabClassPart     tab_class;
+} TabClassRec;
+
+extern TabClassRec tabClassRec;
+
+typedef struct {
+	XtCallbackList cb;
+	XtCallbackList open_cb;
+	XtCallbackList close_cb;
+	XmFontList     font;
+	Widget         current;
+	GC             gc;
+	Pixel          back;
+	Pixel          blue;
+
+	Dimension      hmargin;
+	Dimension      vmargin;
+
+	Dimension      title;
+	Dimension      top;
+	Dimension      bottom;
+
+	int            delta;
+	int            first;
+	int            last;
+
+	Boolean        drawer;
+	Time            last_click;
+
+} TabPart;
+
+
+typedef struct _TabRec {
+    CorePart        core;
+    CompositePart   composite;
+    ConstraintPart  constraint;
+    XmManagerPart    manager;
+    XmDrawingAreaPart   drawing_area;
+    TabPart      tab;
+}  TabRec;
+
+
+#define XtTabNumChildren(w) (((TabWidget)w) -> composite.num_children)
+#define XtTabChild(w,i)     (((TabWidget)w) -> composite.children[i])
+
+#endif /* TABP_H */
+
+
+
diff --git a/ecflow_4_0_7/view/src/aborted.cc b/ecflow_4_0_7/view/src/aborted.cc
new file mode 100644
index 0000000..0ed73db
--- /dev/null
+++ b/ecflow_4_0_7/view/src/aborted.cc
@@ -0,0 +1,33 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "aborted.h"
+#include "node.h"
+
+aborted::aborted():
+	node_alert<aborted>("Aborted tasks",STATUS_ABORTED)
+{
+}
+
+aborted::~aborted()
+{
+}
+
+
+bool aborted::keep(node* n)
+{
+	return n->status() == STATUS_ABORTED;
+}
+
diff --git a/ecflow_4_0_7/view/src/aborted.h b/ecflow_4_0_7/view/src/aborted.h
new file mode 100644
index 0000000..838d6f6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/aborted.h
@@ -0,0 +1,109 @@
+#ifndef aborted_H
+#define aborted_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node_alert.h"
+
+class node;
+
+class aborted : public node_alert<aborted> {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	aborted();
+
+// -- Destructor
+
+	~aborted(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	aborted(const aborted&);
+	aborted& operator=(const aborted&);
+
+// -- Methods
+
+// -- Overridden methods
+
+	virtual bool keep(node*);
+
+// -- Class members
+
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const aborted& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(aborted**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(aborted);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/alerts.cc b/ecflow_4_0_7/view/src/alerts.cc
new file mode 100644
index 0000000..62b31ce
--- /dev/null
+++ b/ecflow_4_0_7/view/src/alerts.cc
@@ -0,0 +1,26 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "to_check.h"
+#include "zombie.h"
+
+to_check::to_check() : node_alert<to_check>("Tasks to check") {}
+to_check::~to_check() {} // Change to virtual if base class
+bool to_check::keep(node* n) { return n->isToBeChecked(); }
+
+zombie::zombie() : node_alert<zombie>("Zombies") {}
+zombie::~zombie() {} // Change to virtual if base class
+bool zombie::keep(node* n) { return n->isZombie(); }
+
diff --git a/ecflow_4_0_7/view/src/alias.cc b/ecflow_4_0_7/view/src/alias.cc
new file mode 100644
index 0000000..56dd1ac
--- /dev/null
+++ b/ecflow_4_0_7/view/src/alias.cc
@@ -0,0 +1,38 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "task_node.h"
+
+#ifdef BRIDGE
+alias_node::alias_node(host& h,sms_node* n,char b):
+  task_node(h,n,b)
+{}
+#endif
+
+alias_node::alias_node(host& h,ecf_node* n):
+	task_node(h,n)
+{
+}
+
+alias_node::~alias_node()
+{
+}
+
+
+void alias_node::why(std::ostream& f)
+{
+	task_node::why(f);	
+}
+
diff --git a/ecflow_4_0_7/view/src/arch.h b/ecflow_4_0_7/view/src/arch.h
new file mode 100644
index 0000000..320880c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/arch.h
@@ -0,0 +1,20 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#if defined(__GNUC__) || defined(_AIX) || defined(alpha)
+#define _(z) z
+#else
+#define _(z)
+#endif
diff --git a/ecflow_4_0_7/view/src/array.cc b/ecflow_4_0_7/view/src/array.cc
new file mode 100644
index 0000000..3b205e8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/array.cc
@@ -0,0 +1,79 @@
+#ifndef array_H
+#include "array.h"
+#endif
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+template<class T>
+array<T>::array():
+	count_(0),
+	max_(0),
+	values_(0)
+{
+}
+
+template<class T>
+array<T>::array(const array<T>& other):
+	count_(other.count_),
+	max_(other.count_),
+	values_(0)
+{
+	values_ = new T[count_];
+	for(int i = 0; i< count_; i++)
+		values_[i] = other.values_[i];
+}
+
+template<class T>
+array<T>::~array()
+{
+	delete[] values_;
+}
+
+template<class T>
+void array<T>::clear()
+{
+	count_ =  0; 
+}
+
+template<class T>
+void array<T>::add(const T& t)
+{
+	//printf("1. array<T>::add( %d  %d\n", max_,count_);
+	if(count_ == max_)
+	{
+		max_ += 1 + max_/2;
+		T* o = new T[max_];
+		for(int i = 0; i< count_; i++)
+			o[i] = values_[i];
+		delete[] values_;
+		values_ = o;
+		//printf("2. array<T>::add( %d  %d\n", max_,count_);
+	}
+	//printf("3. array<T>::add( %d  %d\n", max_,count_);
+	values_[count_++] = t;
+}
+
+template<class T>
+void array<T>::remove(const T& t)
+{
+	for(int i = 0; i< count_; i++)
+	{
+		if(values_[i] == t)
+		{
+			values_[i] = values_[--count_];
+			break;
+		}
+	}
+}
diff --git a/ecflow_4_0_7/view/src/array.h b/ecflow_4_0_7/view/src/array.h
new file mode 100644
index 0000000..6e9704f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/array.h
@@ -0,0 +1,131 @@
+#ifndef array_H
+#define array_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <stdio.h>
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+template<class T> 
+class array {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	array();
+	array(const array<T>&);
+
+// -- Destructor
+
+	~array(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+
+	array<T>& operator=(const array<T>&);
+
+	T& operator[](int i ) { return values_[i]; }
+	int count() { return count_; }
+
+// -- Methods
+	// None
+
+	void add(const T&);
+	void remove(const T&);
+	void clear();
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+	int count_;
+	int max_;
+	T* values_;
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+
+// -- Members
+	// None
+
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const array& p)
+	//	{ p.print(s); return s; }
+
+};
+
+
+#include "array.cc"
+
+#endif
diff --git a/ecflow_4_0_7/view/src/ask.cc b/ecflow_4_0_7/view/src/ask.cc
new file mode 100644
index 0000000..9bd3332
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ask.cc
@@ -0,0 +1,46 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "ask.h"
+#include "gui.h"
+#include <Xm/Text.h>
+
+ask::ask()
+{
+  create(gui::top());
+}
+
+ask::~ask()
+{
+}
+
+bool ask::show(str& val,std::string msg)
+{
+  static std::string m = msg;
+  return instance().show(m.c_str(),val);
+}
+
+bool ask::show(const char* msg,str& val)
+{
+  XmTextSetString(value_, (char*) val.c_str());
+  if (!modal(msg, true))
+    return false;
+  char *p=XmTextGetString(value_);;
+  val = p;
+  XtFree(p);
+  return true;
+}
diff --git a/ecflow_4_0_7/view/src/ask.h b/ecflow_4_0_7/view/src/ask.h
new file mode 100644
index 0000000..0552b81
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ask.h
@@ -0,0 +1,41 @@
+#ifndef ask_H
+#define ask_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiask.h"
+#include "dialog.h"
+#include "str.h"
+#include <string>
+
+class ask : public dialog<ask,ask_shell_c> {
+public:
+
+	ask();
+
+	~ask(); // Change to virtual if base class
+
+	static bool show(str&,std::string);
+private:
+
+	ask(const ask&);
+	ask& operator=(const ask&);
+
+	bool show(const char*,str&);
+};
+
+inline void destroy(ask**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/autoAlarm.h b/ecflow_4_0_7/view/src/autoAlarm.h
new file mode 100644
index 0000000..d5ea501
--- /dev/null
+++ b/ecflow_4_0_7/view/src/autoAlarm.h
@@ -0,0 +1,42 @@
+#ifndef _AutoAlarm_h
+#define _AutoAlarm_h
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+class AutoAlarm {
+ private:
+  AutoAlarm (const AutoAlarm&); /* no copy allowed */
+  AutoAlarm& operator= (const AutoAlarm&);
+
+  typedef void (*proc)(int);
+  proc (old_);
+  int saveSec_;
+
+  static sigjmp_buf env_;
+  static bool caught_;
+  static int  sec_;
+
+  static void sigAlarm (int);
+
+ public:
+  AutoAlarm (int);
+  
+  ~AutoAlarm ();
+
+  static bool caught () { return caught_;};
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/auto_alarm.cc b/ecflow_4_0_7/view/src/auto_alarm.cc
new file mode 100644
index 0000000..71f6565
--- /dev/null
+++ b/ecflow_4_0_7/view/src/auto_alarm.cc
@@ -0,0 +1,47 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <signal.h>
+
+#include "ecflowview.h"
+#include "auto_alarm.h"
+
+int auto_alarm::sec_    = 0;
+
+auto_alarm::auto_alarm (int sec)
+{
+  printf ("set alarm %d\n",sec);  
+  old_ = ::signal (SIGALRM, sigAlarm);
+  sec_ = sec;
+
+  ::alarm (sec);
+};
+
+
+auto_alarm::~auto_alarm ()
+{
+  sec_ = saveSec_;
+  ::signal (SIGALRM, old_);
+  ::alarm (0);
+  printf ("reset alarm\n");  
+};
+
+
+void auto_alarm::sigAlarm (int)
+{
+  printf ("catching\n");  
+  /* if (recover_jump) */
+  // FILL longjmp(ecf_jump_station, 1);
+};
diff --git a/ecflow_4_0_7/view/src/auto_alarm.h b/ecflow_4_0_7/view/src/auto_alarm.h
new file mode 100644
index 0000000..331cdc7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/auto_alarm.h
@@ -0,0 +1,44 @@
+#ifndef _auto_alarm_h
+#define _auto_alarm_h
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "setjmp.h"
+
+class auto_alarm {
+ private:
+  auto_alarm (const auto_alarm&); /* no copy allowed */
+  auto_alarm& operator= (const auto_alarm&);
+
+  typedef void (*proc)(int);
+  proc (old_);
+  int saveSec_;
+
+  static sigjmp_buf env_;
+  static bool caught_;
+  static int  sec_;
+
+  static void sigAlarm (int);
+
+ public:
+  auto_alarm (int);
+  
+  ~auto_alarm ();
+
+  static bool caught () { return caught_;};
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/base.cc b/ecflow_4_0_7/view/src/base.cc
new file mode 100644
index 0000000..fde7daa
--- /dev/null
+++ b/ecflow_4_0_7/view/src/base.cc
@@ -0,0 +1,203 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <Xm/Xm.h>
+// #include <ostream.h>
+
+#include "base.h"
+#include "directory.h"
+#include "str.h"
+
+struct pairs {
+
+	pairs* next_;
+	str  name_;
+	str  value_;
+
+	pairs(const str& n,const str& v, pairs* x): 
+	   next_(x), name_(n),value_(v) {}
+
+	~pairs() { delete next_; }
+};
+
+
+static base* defbase = 0;
+
+base::base(const str& name,const str& dir,bool save,base* p):
+	name_(name),
+	dir_(dir),
+	count_(0),
+	pairs_(0),
+	parent_(p),
+	save_(save)
+{
+}
+
+base::~base()
+{
+}
+
+base* base::lookup(const str& name)
+{
+  if(defbase == 0) {
+    defbase = new base("user.default",directory::user(),true,
+		       new base("system.default",directory::system(),true, 
+				new base(str(),str(),false,0)
+				)
+		       );
+  }
+
+  base *p = extent<base>::first();
+  while(p) {
+    if(p->name_ == name)
+      return p;
+    p = p->extent<base>::next();
+  }
+
+  return new base(name,directory::user(),true,defbase);
+}
+
+void base::attach()
+{
+  if(parent_) 
+    parent_->attach();
+
+  count_++;
+
+  if(count_ == 1 && save_) {
+  // if(save_) {
+    char buf[1024];
+    sprintf(buf,"%s/%s.options",dir_.c_str(),name_.c_str());
+    
+    FILE* f = fopen(buf,"r");
+    if(f) {
+      while(fgets(buf,sizeof(buf),f)) {
+	char *p = buf;
+	while(*p && *p != ':') p++;
+	if(*p != ':') continue;
+	
+	buf[strlen(buf)-1] = 0;
+	*p = 0;
+	
+	store(buf,p+1,true);
+      }
+      fclose(f);
+    }
+  }
+}
+
+void base::detach()
+{
+  if(parent_) 
+    parent_->detach();
+
+  count_--;
+  
+  if(count_ == 0 && save_)
+    save();
+}
+
+void base::save()
+{
+  char buf[1024];
+  sprintf(buf,"%s/%s.options",dir_.c_str(),name_.c_str());
+  // fprintf(stdout, "%s\n", buf);
+  
+  FILE* f = fopen(buf,"w");
+  if(f) {
+    pairs* p = pairs_;
+    while(p) {
+      fprintf(f,"%s:%s\n",p->name_.c_str(),p->value_.c_str());	
+      p = p->next_;
+    }
+    fclose(f);
+  }
+}
+
+bool base::fetch(const str& key,str& value)
+{
+  pairs* p = pairs_;
+  while(p) {
+    if(p->name_ == key) {
+      value = p->value_;
+      return true;
+    }
+    p = p->next_;
+  }
+  
+  if(parent_) 
+    parent_->fetch(key,value);
+  return false;
+}
+
+void base::defaults(const str& key,const str& value)
+{
+  if(parent_) {
+    parent_->defaults(key,value);
+  } else {
+    store(key,value,false);
+  }
+}
+
+void base::remove(const str& key)
+{
+  pairs* p = pairs_;
+  pairs* q = 0;
+  
+  while(p) {
+    if(p->name_ == key) {
+      if(q) q->next_ = p->next_;
+      else pairs_ = p->next_;
+      p->next_ = 0;
+      
+      delete p;
+      
+      remove(key);
+      return;
+    }
+    q = p;
+    p = p->next_;
+  }
+  enable();
+}
+
+void base::store(const str& key,const str& value,bool replace)
+{
+  pairs* p = pairs_;
+  enable();
+  while(p) {
+    if(p->name_ == key) {
+      if(replace) {
+	p->value_ = value;
+      }
+      return;
+    }
+    p = p->next_;
+  }
+
+  pairs_ = new pairs(key,value,pairs_);
+}
+
+void base::run()
+{
+  if(save_) 
+    save();
+  disable();
+}
+
+IMP(base)
diff --git a/ecflow_4_0_7/view/src/base.h b/ecflow_4_0_7/view/src/base.h
new file mode 100644
index 0000000..d4ece74
--- /dev/null
+++ b/ecflow_4_0_7/view/src/base.h
@@ -0,0 +1,65 @@
+#ifndef base_H
+#define base_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifndef runnable_H
+#include "runnable.h"
+#endif
+
+struct pairs;
+
+class base : public extent<base>, public runnable {
+public:
+	base(const str&,const str&,bool,base*);
+
+	~base(); // Change to virtual if base class
+
+	void attach();
+	void detach();
+
+	void defaults(const str&,const str&);
+	bool fetch(const str&,str&);
+	void store(const str&,const str&,bool);
+	void remove(const str&);
+	void save();
+
+	static base* lookup(const str&);
+
+private:
+
+	base(const base&);
+	base& operator=(const base&);
+	virtual void run();
+
+	str    name_;
+	str    dir_;
+	int    count_;
+	pairs* pairs_;
+	base*  parent_;
+	bool   save_;
+};
+
+inline void destroy(base**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/bool.h b/ecflow_4_0_7/view/src/bool.h
new file mode 100644
index 0000000..3f0cc52
--- /dev/null
+++ b/ecflow_4_0_7/view/src/bool.h
@@ -0,0 +1,25 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#ifndef bool_H
+#define bool_H
+
+typedef char xbool;
+
+#define bool  xbool
+#define false 0
+#define true  1
+
+#endif
diff --git a/ecflow_4_0_7/view/src/cdp.cmd b/ecflow_4_0_7/view/src/cdp.cmd
new file mode 100644
index 0000000..b4dda41
--- /dev/null
+++ b/ecflow_4_0_7/view/src/cdp.cmd
@@ -0,0 +1,71 @@
+"actionnumber",  // 0
+"alter",  // 1
+"begin",  // 2
+"cancel",  // 3
+"check",  // 4
+"cwn",  // 5
+"delete",  // 6
+"dir",  // 7
+"expand",  // 8
+"expire",  // 9
+"file",  // 10
+"find",  // 11
+"force",  // 12
+"genjob",  // 13
+"get",  // 14
+"halt",  // 15
+"html",  // 16
+"info",  // 17
+"inrun",  // 18
+"jobcheck",  // 19
+"jobstatus",  // 20
+"kill",  // 21
+"lock",  // 22
+"loggen",  // 23
+"login",  // 24
+"logout",  // 25
+"ls",  // 26
+"mail",  // 27
+"makebin",  // 28
+"messages",  // 29
+"migrate",  // 30
+"mkdirs",  // 31
+"news",  // 32
+"nicks",  // 33
+"order",  // 34
+"overview",  // 35
+"passwd",  // 36
+"ping",  // 37
+"play",  // 38
+"playbin",  // 39
+"plug",  // 40
+"privileges",  // 41
+"recover",  // 42
+"register",  // 43
+"requeue",  // 44
+"reset",  // 45
+"restart",  // 46
+"restore",  // 47
+"resubmit",  // 48
+"resume",  // 49
+"run",  // 50
+"send",  // 51
+"servers",  // 52
+"shadow",  // 53
+"show",  // 54
+"shutdown",  // 55
+"sms",  // 56
+"smshistory",  // 57
+"status",  // 58
+"suites",  // 59
+"suspend",  // 60
+"swap",  // 61
+"terminate",  // 62
+"test",  // 63
+"unlock",  // 64
+"url",  // 65
+"users",  // 66
+"varcheck",  // 67
+"why",  // 68
+"xml",  // 69
+"zombies",  // 70
\ No newline at end of file
diff --git a/ecflow_4_0_7/view/src/choice.h b/ecflow_4_0_7/view/src/choice.h
new file mode 100644
index 0000000..de44b15
--- /dev/null
+++ b/ecflow_4_0_7/view/src/choice.h
@@ -0,0 +1,37 @@
+#ifndef choice_H
+#define choice_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+class choice {
+public:
+
+	choice(int value = 0) : value_(value) {}
+	choice(const choice& other) : value_(other.value_) {}
+
+	operator int() const { return value_; }
+	choice& operator=(int n) { value_ = n; return *this; }
+	choice& operator=(const choice& other) { value_ = other.value_; return *this; }
+
+private:
+	
+	int value_;
+
+};
+
+inline void destroy(choice**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/collector.cc b/ecflow_4_0_7/view/src/collector.cc
new file mode 100644
index 0000000..593a88f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/collector.cc
@@ -0,0 +1,280 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "collector.h"
+#include "gui.h"
+#include "node.h"
+#include "host.h"
+#include "substitute.h"
+#include "directory.h"
+#include <Xm/List.h>
+#include <Xm/Text.h>
+#include <Xm/Separator.h>
+#include <Xm/PushB.h>
+#include <Xm/Command.h>
+#include <Xm/Xm.h>
+extern "C" {
+#include "xec.h"
+}
+
+collector::collector()
+{
+
+  const int commands_nb = 20;          
+  static char* commands[commands_nb] = {
+    (char *) "ecflow_client --zombie_fob <full_name>" ,
+    (char *) "ecflow_client --zombie_fail <full_name>" ,
+    (char *) "ecflow_client --zombie_adopt <full_name>" ,
+    (char *) "ecflow_client --zombie_block <full_name>" ,
+    (char *) "ecflow_client --alter clear_flag zombie <full_name>" ,
+    (char *) "###",
+    (char *) "ecflow_client --suspend <full_name>" ,
+    (char *) "ecflow_client --resume <full_name>" ,
+    (char *) "ecflow_client --kill <full_name>" ,
+    (char *) "ecflow_client --run <full_name>" ,
+    (char *) "###",
+    (char *) "ecflow_client --delete force yes <full_name>",
+    (char *) "###",
+    (char *) "ecflow_client --begin <node_name>",
+    (char *) "###",
+    (char *) "ecflow_client --requeue <full_name>",
+    (char *) "ecflow_client --alter change defstatus queued <full_name>",
+    (char *) "ecflow_client --alter change defstatus complete <full_name>",
+    (char *) "ecflow_client --force complete <full_name>",
+    (char *) "ecflow_client --force aborted  <full_name>",
+    };
+
+	create(gui::top());	
+	set_menu("Collector");
+	substitute::fill(blocks_);
+	XtManageChild(XmCreateSeparator(blocks_,"-",0,0));
+	update();
+
+	FILE* f = directory::open("collector.commands","r");
+	if(f) {
+		char line[1024];
+		while(fgets(line,sizeof(line),f))
+		{
+			line[strlen(line)-1] = 0;
+			XtManageChild(XmCreatePushButton(blocks_,line,0,0));
+		}
+		fclose(f);
+	} else {
+          /* provide default commands to new users */
+	  
+          for(int i = 0; i < commands_nb; i++)
+            XtManageChild(XmCreatePushButton(blocks_,commands[i],0,0));            
+        }
+
+	f = directory::open("collector.history","r");
+	if(f)
+	{
+		char line[1024];
+		int n = 0;
+		while(fgets(line,sizeof(line),f))
+			n++;
+
+		rewind(f);
+
+		XmString* s = new XmString[n];
+		int i = 0;
+
+		while(fgets(line,sizeof(line),f))
+		{
+			line[strlen(line)-1] = 0;
+			s[i++] = xec_NewString(line);
+		}
+		fclose(f);
+
+		XtVaSetValues(command_,
+			XmNhistoryItems, s,
+			XmNhistoryItemCount, n,
+			NULL);
+		
+		for(i = 0; i < n; i++)
+			XmStringFree(s[i]);	
+		delete[] s;
+	} else {
+          /* provide default commands to new users */
+	  const int maxCmd = 128;
+          XmString* s = new XmString[maxCmd];
+          for(int i = 0; i < commands_nb; i++) {
+	    s[i] = xec_NewString(commands[i]);
+	  }
+
+          XtVaSetValues(command_,
+			XmNhistoryItems, s,
+			XmNhistoryItemCount, commands_nb,
+			NULL);
+          for(int i = 0; i < commands_nb; i++) XmStringFree(s[i]);	
+          delete[] s;
+        }
+
+}
+
+collector::~collector()
+{
+
+	FILE * f = directory::open("collector.history","w");
+	if(f)
+	{
+		XmString* s = 0;
+		int n = 0;
+
+		XtVaGetValues(command_,
+			XmNhistoryItems, &s,
+			XmNhistoryItemCount, &n,
+			NULL);
+		
+		for(int i = 0; i < n; i++)
+		{
+			char *p = xec_GetString(s[i]);
+			fprintf(f,"%s\n",p);
+			XtFree(p);
+		}
+
+		fclose(f);
+	}
+}
+
+void collector::show(node& n)
+{
+	instance().nodes_.clear();
+	instance().add(&n,true);
+	instance().update();
+}
+
+void collector::applyCB( Widget, XtPointer data)
+{
+	XmCommandCallbackStruct* cb = (XmCommandCallbackStruct*)data;
+	nodes_.clear();
+
+	char *p = xec_GetString(cb->value);
+	send(p);
+	XtFree(p);
+}
+
+void collector::removeCB( Widget, XtPointer )
+{
+	XmString    *items = 0;
+	int count = 0;
+
+	nodes_.clear();
+
+	XtVaGetValues(list_,
+		XmNselectedItems,&items,
+		XmNselectedItemCount,&count,
+		NULL);
+
+	XmListDeleteItems(list_,items,count);
+	update();
+}
+
+void collector::noneCB( Widget, XtPointer )
+{
+	nodes_.clear();
+	XmListDeselectAllItems(list_);
+	update();
+}
+
+void collector::allCB( Widget, XtPointer )
+{
+	nodes_.clear();
+	xec_ListSelectAll(list_);
+	update();
+}
+
+void collector::selectCB( Widget, XtPointer )
+{
+	update();
+}
+
+void collector::update()
+{
+	int count = 0;
+	int total = 0;
+
+	XtVaGetValues(list_,
+		XmNselectedItemCount,&count,
+		XmNitemCount,&total,
+		NULL);
+
+	XtSetSensitive(remove_,  count != 0);
+	XtSetSensitive(command_, count != 0);
+	XtSetSensitive(all_,     count != total);
+	XtSetSensitive(none_,    count != 0);
+}
+
+
+void collector::send(const char* cmd)
+{
+	XmString* items = 0;
+	int count = 0;
+
+	XtVaGetValues(list_,
+		XmNselectedItems,&items,
+		XmNselectedItemCount,&count,
+		NULL);
+
+	cmd_ = cmd;
+	nodes_.clear();
+
+	for(int i = 0; i < count ; i++)
+		nodes_.add(items[i]);
+
+	next_ = 0;
+	runnable::enable();
+	XtSetSensitive(stop_,true);
+}
+		
+		
+void collector::run()
+{
+	if(next_ >= nodes_.count())
+	{
+		nodes_.clear(); 
+		runnable::disable();
+		XtSetSensitive(stop_,false);
+		return;
+	}
+
+	XmListDeselectItem(list_,nodes_[next_]);
+	XmListSetBottomItem(list_,nodes_[next_]);
+	node *n = find(nodes_[next_++]);
+	if(n) n->command(cmd_.c_str());
+	update();
+}
+
+void collector::closeCB(Widget,XtPointer)
+{
+  // 201207 ABO warnings?	XmListDeleteAllItems(list_);
+	XtUnmanageChild(form_);
+}
+
+void collector::entryCB(Widget,XtPointer data)   
+{
+  XmRowColumnCallbackStruct *cb = (XmRowColumnCallbackStruct *) data;
+  xec_ReplaceTextSelection(text_,XtName(cb->widget),False);
+}
+
+bool collector::keep(node*)
+{
+	return true;
+}
+
+void collector::stopCB(Widget,XtPointer data)  
+{
+	nodes_.clear();
+}
diff --git a/ecflow_4_0_7/view/src/collector.h b/ecflow_4_0_7/view/src/collector.h
new file mode 100644
index 0000000..2626fe5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/collector.h
@@ -0,0 +1,100 @@
+#ifndef collector_H
+#define collector_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef window_H
+#include "window.h"
+#endif
+
+#ifndef uicollector_H
+#include "uicollector.h"
+#endif
+
+#ifndef singleton_H
+#include "singleton.h"
+#endif
+
+#ifndef node_list_H
+#include "node_list.h"
+#endif
+
+#ifndef runnable_H
+#include "runnable.h"
+#endif
+
+#ifndef array_H
+#include "array.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifndef xmstring_H
+#include "xmstring.h"
+#endif
+
+class node;
+
+class collector : public collector_shell_c, public window,
+	public runnable,
+	public singleton<collector>, public node_list {
+public:
+
+	collector();
+
+	~collector(); // Change to virtual if base class
+
+// -- Overridden methods
+
+	virtual Widget shell() { return _xd_rootwidget; }
+	virtual Widget list() { return list_; }
+	virtual Widget form() { return form_; }
+
+// -- Class members
+
+	static void show(node&);
+
+private:
+
+	collector(const collector&);
+	collector& operator=(const collector&);
+
+	str        cmd_;
+	array<xmstring> nodes_;
+	int        next_;
+
+	void update();
+	void send(const char*);
+
+	void run();
+
+	virtual void closeCB( Widget, XtPointer );
+	virtual void applyCB( Widget, XtPointer );
+	virtual void removeCB( Widget, XtPointer );
+	virtual void noneCB( Widget, XtPointer );
+	virtual void allCB( Widget, XtPointer );
+	virtual void selectCB( Widget, XtPointer );
+	virtual void entryCB( Widget, XtPointer );
+	virtual void stopCB( Widget, XtPointer );
+
+	virtual bool keep(node*);
+
+};
+
+inline void destroy(collector**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/colors_prefs.cc b/ecflow_4_0_7/view/src/colors_prefs.cc
new file mode 100644
index 0000000..8eeaa9b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/colors_prefs.cc
@@ -0,0 +1,24 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "colors_prefs.h"
+
+void colors_prefs::create(Widget w,char*) 
+{ 
+	colors_form_c::create(w); 
+	prefs::setup(w); 
+}
+
+// static colors_prefs hp;
diff --git a/ecflow_4_0_7/view/src/colors_prefs.h b/ecflow_4_0_7/view/src/colors_prefs.h
new file mode 100644
index 0000000..7674f5d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/colors_prefs.h
@@ -0,0 +1,47 @@
+#ifndef colors_prefs_H
+#define colors_prefs_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef prefs_H
+#include "prefs.h"
+#endif
+
+#ifndef uicolors
+#include "uicolors.h"
+#endif
+
+class colors_prefs : public prefs, public colors_form_c {
+public:
+
+	colors_prefs() {}
+
+	~colors_prefs() {}
+
+	virtual Widget widget() { return _xd_rootwidget; }
+
+private:
+
+	colors_prefs(const colors_prefs&);
+	colors_prefs& operator=(const colors_prefs&);
+
+	virtual void changedCB( Widget w, XtPointer ) { pref_editor::changed(w); }
+	virtual void useCB( Widget w, XtPointer )     { pref_editor::use(w);     }
+
+	virtual void create(Widget w,char*);
+};
+
+inline void destroy(colors_prefs**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/configurable.cc b/ecflow_4_0_7/view/src/configurable.cc
new file mode 100644
index 0000000..64fe75e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/configurable.cc
@@ -0,0 +1,23 @@
+#ifndef configurable_H
+#include "configurable.h"
+#endif
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+configurable::~configurable() {}
+
+void configurable::changed(resource&)
+{
+}
diff --git a/ecflow_4_0_7/view/src/configurable.h b/ecflow_4_0_7/view/src/configurable.h
new file mode 100644
index 0000000..b85d392
--- /dev/null
+++ b/ecflow_4_0_7/view/src/configurable.h
@@ -0,0 +1,38 @@
+#ifndef configurable_H
+#define configurable_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+class configurator;
+class resource;
+
+class configurable {
+public:
+   virtual ~configurable();
+	virtual void changed(resource&);
+
+#ifdef alpha
+	configurable(const char* name): name_(name) {}
+	const char* name() const { return name_; }
+private:
+	const char* name_;
+#else
+	virtual const char* name() const = 0;
+#endif
+};
+
+inline void destroy(configurable**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/configurator.h b/ecflow_4_0_7/view/src/configurator.h
new file mode 100644
index 0000000..632b340
--- /dev/null
+++ b/ecflow_4_0_7/view/src/configurator.h
@@ -0,0 +1,128 @@
+#ifndef configurator_H
+#define configurator_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+template<class T>
+class option;
+
+class str;
+
+class configurator {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	//configurator();
+
+// -- Destructor
+
+	//~configurator(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+	virtual void init(resource&) = 0;
+	virtual bool modified(resource&) = 0;
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+//	configurator(const configurator&);
+//	configurator& operator=(const configurator&);
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const configurator& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(configurator**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(configurator);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/confirm.cc b/ecflow_4_0_7/view/src/confirm.cc
new file mode 100644
index 0000000..c3df4e2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/confirm.cc
@@ -0,0 +1,44 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "confirm.h"
+#include "gui.h"
+
+confirm::confirm()
+{
+	create(gui::top());
+}
+
+confirm::~confirm()
+{
+}
+
+Boolean confirm::ask(Boolean def_ok,const char* fmt,...)
+{
+	char buf[1024];
+	va_list arg;
+	va_start(arg,fmt);
+	vsprintf(buf,fmt,arg);
+	va_end(arg);
+
+	return instance().modal(buf, def_ok);
+}
+
+Boolean confirm::ask(Boolean def_ok,str& msg)
+{
+  return instance().modal(msg.c_str(), def_ok);
+}
diff --git a/ecflow_4_0_7/view/src/confirm.h b/ecflow_4_0_7/view/src/confirm.h
new file mode 100644
index 0000000..84cff07
--- /dev/null
+++ b/ecflow_4_0_7/view/src/confirm.h
@@ -0,0 +1,40 @@
+#ifndef confirm_H
+#define confirm_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "uiconfirm.h"
+#include "dialog.h"
+#include "str.h"
+
+class confirm : public dialog<confirm,confirm_shell_c> {
+public:
+
+	confirm();
+
+	~confirm(); // Change to virtual if base class
+
+	static Boolean ask(Boolean,const char*,...);
+	static Boolean ask(Boolean,str& msg);
+
+private:
+
+	confirm(const confirm&);
+	confirm& operator=(const confirm&);
+};
+
+inline void destroy(confirm**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/counted.cc b/ecflow_4_0_7/view/src/counted.cc
new file mode 100644
index 0000000..e633749
--- /dev/null
+++ b/ecflow_4_0_7/view/src/counted.cc
@@ -0,0 +1,37 @@
+#ifndef counted_H
+#include "counted.h"
+#endif
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+counted::counted():
+	count_(0)
+{
+}
+
+counted::~counted()
+{
+}
+
+void counted::attach()
+{
+	count_++;
+}
+
+void counted::detach()
+{
+	if(--count_ == 0) delete this;
+}
diff --git a/ecflow_4_0_7/view/src/counted.h b/ecflow_4_0_7/view/src/counted.h
new file mode 100644
index 0000000..047776d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/counted.h
@@ -0,0 +1,124 @@
+#ifndef counted_H
+#define counted_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+class counted {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	counted();
+
+// -- Destructor
+
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	void attach();
+	void detach();
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+	virtual ~counted(); // Change to virtual if base class
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	counted(const counted&);
+	counted& operator=(const counted&);
+
+// -- Members
+
+	int count_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const counted& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(counted**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(counted);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/date.cc b/ecflow_4_0_7/view/src/date.cc
new file mode 100644
index 0000000..5c7386a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/date.cc
@@ -0,0 +1,106 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "date.h"
+#include "ecf_node.h"
+
+date_node::date_node(host& h,ecf_node* n) : node(h,n) {
+  if (!n) return;
+  full_name_ = parent()->full_name();
+  full_name_ += ":";
+  if (n) full_name_ += n->toString();
+}
+
+#ifdef BRIDGE
+static char *week[] = {
+	(char*)"sunday", (char*)"monday",(char*)"tuesday",(char*)"wednesday",(char*)"thursday",
+	(char*)"friday",(char*)"saturday"};
+
+date_node::date_node(host& h,sms_node* n, char b) 
+  : node(h,n,b) 
+{}
+#endif
+
+char* date_node::string(char *s)
+{
+  char buf[1024];
+  s[0] = 0;
+  if (owner_)
+    snprintf(buf, 1024, "%s", owner_->toString().c_str());
+#ifdef BRIDGE
+  if (tree_) {
+	sms_date *d = (sms_date*)tree_;
+
+	char buf[1024];
+	s[0] = 0;
+
+	if(d->weekdays)
+	{
+		int flg = 0;
+		for( int i=0 ; i<DAY_MAX ; i++ )
+			if( d->weekdays & ( 1<<i ) )
+			{
+				if(flg) { 
+					strcat(s," ");
+				}
+				strcat(s,week[i]);
+				flg++;
+			}
+	} else {
+			sprintf(buf,d->day<0?"*":"%02d",d->day);
+			strcat(s,buf);
+			strcat(s,".");
+
+			sprintf(buf,d->month<0?"*":"%02d",d->month);
+			strcat(s,buf);
+			strcat(s,".");
+
+			sprintf(buf,d->year<0?"*":"%02d",d->year+1900);
+			strcat(s,buf);
+	}
+	return s;
+  }
+  else 
+#endif
+  strcat(s,buf);
+  return s; 
+}
+
+xmstring date_node::make_label_tree()
+{
+  char buf[1024];
+  return xmstring(string(buf));
+}
+
+void date_node::perlify(FILE* f) 
+{
+	char buf[1034];
+	perl_member(f,"value",string(buf));
+}
+
+node* date_node::graph_node()
+{
+  return &dummy_node::get(full_name());
+}
+
+const std::string& date_node::name() const 
+{ 
+  static std::string date_ = "date";
+#ifdef BRIDGE
+  if (tree_) return date_;
+#endif
+  if (owner_) date_ = owner_->name(); 
+  return date_;
+}
diff --git a/ecflow_4_0_7/view/src/date.h b/ecflow_4_0_7/view/src/date.h
new file mode 100644
index 0000000..4aa9a42
--- /dev/null
+++ b/ecflow_4_0_7/view/src/date.h
@@ -0,0 +1,48 @@
+#ifndef DATE_H
+#define DATE_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #10 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "node.h"
+#include "show.h"
+#include "dummy_node.h"
+#
+class date_node : public node {
+
+  std::string full_name_;
+	virtual bool is_my_parent(node*) const { return false; }
+	virtual void info(std::ostream&) {}
+
+	virtual xmstring make_label_tree();
+	virtual xmstring make_label_trigger() { return make_label_tree(); }
+
+	virtual const std::string& name()  const;
+	const std::string& full_name() const {return full_name_; }
+	virtual Boolean menus()       { return False; }
+	virtual Boolean selectable() { return False; }
+
+	virtual Boolean visible() const { return show::want(show::date); }
+	virtual node* graph_node();
+	char* string(char*);
+
+	virtual void perlify(FILE*);
+
+public:
+	date_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+	date_node(host& h,sms_node* n, char b);
+#endif
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/depend.cc b/ecflow_4_0_7/view/src/depend.cc
new file mode 100644
index 0000000..951d4a9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/depend.cc
@@ -0,0 +1,72 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "depend.h"
+#include "host.h"
+#include "runnable.h"
+#include <Xm/List.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+#include <Xm/PushB.h>
+#include "gui.h"
+#include "extent.h"
+#include "flags.h"
+#include "pixmap.h"
+#include "result.h"
+#include <X11/IntrinsicP.h>
+#include <stdarg.h>
+
+extern "C" {
+#include "xec.h"
+}
+
+depend::depend()
+{
+	_xd_rootwidget = 0;
+}
+
+depend::~depend()
+{
+	if(_xd_rootwidget)
+	XtDestroyWidget(_xd_rootwidget);
+}
+
+void depend::closeCB(Widget,XtPointer)  
+{
+	hide();
+}
+
+void depend::hide()
+{
+	if(_xd_rootwidget) {
+		XtUnmanageChild(form_);
+	}
+}
+
+void depend::make(Widget top)
+{
+	while(!XtIsShell(top))
+		top = XtParent(top);
+
+	if(!_xd_rootwidget)
+		depend_shell_c::create(top);
+}
+
+void depend::raise(Widget top)
+{
+	make(top);
+	XtManageChild(form_);
+	XMapRaised(XtDisplay(_xd_rootwidget),XtWindow(_xd_rootwidget));
+}
diff --git a/ecflow_4_0_7/view/src/depend.h b/ecflow_4_0_7/view/src/depend.h
new file mode 100644
index 0000000..ddc14cd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/depend.h
@@ -0,0 +1,126 @@
+#ifndef depend_H
+#define depend_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+class host;
+// 
+
+#include "uidepend.h"
+
+
+class depend : public depend_shell_c {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	depend();
+
+// -- Destructor
+
+	~depend(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+
+	void make(Widget);
+	void raise(Widget);
+	void hide();
+
+// -- Methods
+
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	depend(const depend&);
+	depend& operator=(const depend&);
+
+// -- Members
+
+
+// -- Methods
+
+
+
+// -- Overridden methods
+
+
+// -- Class members
+
+
+// -- Class methods
+
+	void closeCB(Widget,XtPointer);
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const depend& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(depend**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(depend);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/dialog.cc b/ecflow_4_0_7/view/src/dialog.cc
new file mode 100644
index 0000000..9984685
--- /dev/null
+++ b/ecflow_4_0_7/view/src/dialog.cc
@@ -0,0 +1,83 @@
+#ifndef dialog_H
+#include "dialog.h"
+#endif
+
+#ifndef SVR4
+#include <stdio.h>
+#endif
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+extern "C" {
+#include "xec.h"
+}
+
+
+template<class T,class U>
+void dialog<T,U>::helpCB( Widget, XtPointer )
+{
+}
+
+template<class T,class U>
+void dialog<T,U>::cancelCB( Widget, XtPointer )
+{
+	ok_   = False;
+	stop_ = True;
+}
+
+template<class T,class U>
+void dialog<T,U>::okCB( Widget, XtPointer )
+{
+	ok_  = True;
+	stop_ = True;
+}
+
+
+template<class T,class U>
+Boolean dialog<T,U>::modal(const char* message,Boolean def_ok)
+{
+	XtVaSetValues(this->form_,
+		XmNdefaultButtonType,
+		(def_ok? XmDIALOG_OK_BUTTON : XmDIALOG_CANCEL_BUTTON),
+		NULL);
+
+	if(message)
+		xec_SetLabel(this->label_,message);
+
+	XtManageChild(this->form_);
+
+	stop_ = False;
+
+	XEvent  event_node;
+	XtAppContext ac = XtWidgetToApplicationContext(this->form_);
+
+	while(!stop_)
+	{
+		XtAppNextEvent(ac,&event_node);
+		XtDispatchEvent(&event_node);
+	}
+
+	XtUnmanageChild(this->form_);
+	
+	return ok_;
+}
+
+template<class T,class U>
+void dialog<T,U>::show()
+{
+	XtManageChild(this->form_);
+}
diff --git a/ecflow_4_0_7/view/src/dialog.h b/ecflow_4_0_7/view/src/dialog.h
new file mode 100644
index 0000000..b685e03
--- /dev/null
+++ b/ecflow_4_0_7/view/src/dialog.h
@@ -0,0 +1,50 @@
+#ifndef dialog_H
+#define dialog_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef singleton_H
+#include "singleton.h"
+#endif
+
+template<class T,class U>
+class dialog : public U, public singleton<T>  {
+public:
+
+	dialog() : stop_(True), ok_(False) {}
+
+protected:
+
+	Boolean stop_;
+	Boolean ok_;
+
+	Boolean modal(const char*,Boolean);
+	void show();
+
+private:
+
+	dialog(const dialog<T,U>&);
+	dialog<T,U>& operator=(const dialog<T,U>&);
+
+	virtual void helpCB( Widget, XtPointer ) ;
+	virtual void cancelCB( Widget, XtPointer ) ;
+	virtual void okCB( Widget, XtPointer ) ;
+};
+
+#if defined(__GNUC__) || defined(hpux) || defined(_AIX)
+#include "dialog.cc"
+#endif
+#endif
diff --git a/ecflow_4_0_7/view/src/directory.cc b/ecflow_4_0_7/view/src/directory.cc
new file mode 100644
index 0000000..aeb171c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/directory.cc
@@ -0,0 +1,72 @@
+#ifndef directory_H
+#include "directory.h"
+#endif
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include "ecflowview.h"
+
+
+const char* directory::user()
+{
+	static char x[1024] = {0};
+	if(x[0] == 0)
+	{
+	  const char * rcdir = getenv("ECFLOWRC");
+	  if (rcdir) 
+	    sprintf(x,"%s",rcdir);
+	  else
+	    sprintf(x,"%s/.%s",getenv("HOME"),"ecflowrc");
+	  mkdir(x,0755);
+	  fprintf(stdout, "# rcdir: %s\n", x);
+	}
+	return x;
+}
+
+// ECFLOW_SHARED_DIR is a define, where 'server'file is installed
+const char* directory::system()
+{
+  static char x[1024] = {0};
+  if(x[0] == 0) {
+    if(getenv("ECFLOWVIEW_HOME"))
+      strcpy(x,getenv("ECFLOWVIEW_HOME"));
+    else	
+      strcpy(x,ECFLOW_SHARED_DIR);
+  }
+
+  //std::cout << "system dir  = " << x << "\n";
+  return x;
+}
+
+
+FILE* directory::open(const char* name,const char *mode)
+{
+	FILE* f = 0;
+	char buf[1024];
+
+	sprintf(buf,"%s/%s",user(),name);
+	f = fopen(buf,mode);
+	if(f || *mode != 'r') return f;
+
+	sprintf(buf,"%s/%s",system(),name);
+	return fopen(buf,mode);		
+}
diff --git a/ecflow_4_0_7/view/src/directory.h b/ecflow_4_0_7/view/src/directory.h
new file mode 100644
index 0000000..e500f3e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/directory.h
@@ -0,0 +1,40 @@
+#ifndef directory_H
+#define directory_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <stdio.h>
+
+class directory {
+public:
+
+	directory();
+
+	~directory(); // Change to virtual if base class
+
+	static FILE* open(const char*,const char*);
+	static const char* user();
+	static const char* system();
+
+private:
+
+	directory(const directory&);
+	directory& operator=(const directory&);
+
+};
+
+inline void destroy(directory**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/doer.sh b/ecflow_4_0_7/view/src/doer.sh
new file mode 100644
index 0000000..a36a6ef
--- /dev/null
+++ b/ecflow_4_0_7/view/src/doer.sh
@@ -0,0 +1,29 @@
+#!/bin/ksh
+#=============================================================================================
+# Name        : 
+# Author      : 
+# Revision    : $Revision: #3 $ 
+#
+# Copyright 2009-2012 ECMWF. 
+# This software is licensed under the terms of the Apache Licence version 2.0 
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+# In applying this licence, ECMWF does not waive the privileges and immunities 
+# granted to it by virtue of its status as an intergovernmental organisation 
+# nor does it submit to any jurisdiction. 
+#
+# Description : 
+#=============================================================================================
+
+return
+function call {
+grep -l sms_node * > sms_node.list     
+
+for f in `cat sms_node.list`; do 
+   cat $f | sed -e 's:sms_node:ecf_node:' > ${f}.tmp; ; 
+   mv ${f} ${f}.orig; 
+   mv ${f}.tmp ${f}; 
+done
+
+ clear; ./env.sh cc 2>&1 | head -50
+
+}
diff --git a/ecflow_4_0_7/view/src/dummy_node.cc b/ecflow_4_0_7/view/src/dummy_node.cc
new file mode 100644
index 0000000..82944d8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/dummy_node.cc
@@ -0,0 +1,58 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "dummy_node.h"
+#include "host.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+#include <boost/shared_ptr.hpp>
+
+static node* head_ = 0;
+static const std::string id = "(dummy_node)";
+const std::string dummy_node::toString() const { return id; }
+
+dummy_node::dummy_node(const std::string name)
+  : node(host::dummy(),0)
+  , name_ (name)
+{
+  next_          = head_;
+  head_          = this;
+  owner_ = new ecf_concrete_node<dummy_node> (this, 0);
+}
+
+dummy_node::~dummy_node()
+{
+}
+
+dummy_node& dummy_node::get(const std::string name)
+{
+  node* e = head_;
+  while(e) {
+    if(name == e->name())
+      return * (dummy_node*) e;
+    e = e->next();
+  }
+  return *(new dummy_node(name));
+}
+
+void dummy_node::info(std::ostream&)
+{
+}
+
+void dummy_node::perlify(FILE* f) 
+{
+}
diff --git a/ecflow_4_0_7/view/src/dummy_node.h b/ecflow_4_0_7/view/src/dummy_node.h
new file mode 100644
index 0000000..b00cf32
--- /dev/null
+++ b/ecflow_4_0_7/view/src/dummy_node.h
@@ -0,0 +1,53 @@
+#ifndef dummy_node_H
+#define dummy_node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node.h"
+
+class dummy_node : public node {
+public:
+
+  dummy_node(const std::string);
+  ~dummy_node(); // Change to virtual if base class
+
+  virtual Boolean menus()      { return False;      }
+  virtual Boolean selectable() { return False;      }
+  virtual const std::string& full_name()  const  { return name();}
+  virtual const std::string& name()  const  { return name_; }
+  virtual void info(std::ostream&);
+  
+  const std::string toString() const;
+  virtual const char* type_name() const  { return "dummy_node"; }
+  virtual const char* status_name() const  { return "unknown"; }
+  virtual std::ostream& print(std::ostream&s) const { return s << "dummy_node\n";};
+   
+  static dummy_node& get(const std::string);
+private:
+
+  dummy_node(const dummy_node&);
+  dummy_node& operator=(const dummy_node&);
+  
+  const std::string name_;
+  // int  type_;
+  int type() const { return NODE_UNKNOWN; } 
+  //int  status_;
+  virtual void perlify(FILE*); 
+};
+
+inline void destroy(dummy_node**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/ecf.cmd b/ecflow_4_0_7/view/src/ecf.cmd
new file mode 100644
index 0000000..34d58e7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecf.cmd
@@ -0,0 +1,71 @@
+"actionnumber",  // 0
+"--alter",  // 1
+"--begin",  // 2
+"--delete",  // 3
+"--check-pt",  // 4
+"cwn", // /* "cwn" 5 */
+"--clear-dep", /* "delete"  6 */
+"dir", /* "dir"  // 7 */
+"expand",  // 8
+"expire",  // 9
+"--file",  // 10
+"find",  // 11
+"--force",  // 12
+"genjob",  // 13
+"--group='get'",  // 14
+"--halt",  // 15
+"html",  // 16
+"info",  // 17
+"inrun",  // 18
+"jobcheck",  // 19
+"jobstatus",  // 20
+"--kill",  // 21
+"lock",  // 22
+"loggen",  // 23
+"login",  // 24
+"logout",  // 25
+"ls",  // 26
+"mail",  // 27
+"makebin",  // 28
+"messages",  // 29
+"migrate",  // 30
+"mkdirs",  // 31
+"--news",  // 32
+"nicks",  // 33
+"--order",  // 34
+"overview",  // 35
+"passwd",  // 36
+"--ping",  // 37
+"--play",  // 38
+"playbin", /* "playbin" 39 */
+"plug",  // 40
+"privileges",  // 41
+"recover",  // 42
+"register",  // 43
+"--requeue",  // 44
+"reset",  // 45
+"--restart",  // 46
+"restore",  // 47
+"resubmit",  // 48
+"--resume",  // 49
+"--run",  // 50
+"--send",  // 51
+"servers",  // 52
+"",  // 53
+"--show",  // 54
+"--shutdown",  // 55
+"--stats",  // 56 sms
+"--log", /* "smshistory"  // 57 */
+"status",  // 58
+"--suites",  // 59
+"--suspend",  // 60
+"swap",  // 61
+"--terminate",  // 62
+"",  // 63 test
+"unlock",  // 64
+"url",  // 65
+"users",  // 66 users
+"varcheck",  // 67
+"--group='get; why'",  // 68
+"xml",  // 69
+"--zombie-get",  // zombies 70
\ No newline at end of file
diff --git a/ecflow_4_0_7/view/src/ecf_node.cc b/ecflow_4_0_7/view/src/ecf_node.cc
new file mode 100644
index 0000000..ca51d43
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecf_node.cc
@@ -0,0 +1,1193 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #114 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "ecf_node.h"
+#include "host.h"
+#include "node.h"
+#include "tree.h"
+#include "ChangeMgrSingleton.hpp"
+#include "NodeAttr.hpp"
+#include "Variable.hpp"
+#include "dummy_node.h"
+#include "external.h"
+#include <Str.hpp> 
+#ifndef NODE_MAX
+#define NODE_MAX 41
+#endif
+std::map<std::string, ecf_node_maker*>& ecf_node_maker::map()
+{
+   static std::map<std::string, ecf_node_maker*> map_;
+   return map_;
+}
+
+std::vector<ecf_node_maker*>& ecf_node_maker::builders()
+{
+   static std::vector<ecf_node_maker*> builders_((size_t)NODE_MAX,(ecf_node_maker*)0);
+   return builders_;
+}
+
+void ecf_node::counter() {
+  int count = 0; node* n = 0x0; if (node_) n = node_->kids();
+  while (n) { 
+    std::cerr << "# " << n->full_name() << " " << n->type() << "\n";
+    n = n->next(); 
+    count++; 
+  } 
+  if (count) { 
+    std::cerr << "# " << full_name() << " kids: " << count << "\n"; 
+  }
+}
+
+void ecf_node::update(const Node* n, const std::vector<ecf::Aspect::Type>&)
+{
+  if (!node_) return;
+  /* ok node create through node replace is simple update */
+  node_->update(-1, -1, -1); 
+  node_->notify_observers(); 
+  node_->redraw();
+}
+
+int convert(NState::State state) {
+   int rc = STATUS_UNKNOWN;
+   switch (state) {
+      case NState::UNKNOWN :  rc= STATUS_UNKNOWN;  break;
+      case NState::COMPLETE:  rc= STATUS_COMPLETE; break;
+      case NState::QUEUED:    rc= STATUS_QUEUED;   break;
+      case NState::ABORTED:   rc= STATUS_ABORTED;  break;
+      case NState::SUBMITTED: rc= STATUS_SUBMITTED;break;
+      case NState::ACTIVE:    rc= STATUS_ACTIVE;   break;
+      default: rc = STATUS_UNKNOWN;  break;
+   }
+   return rc;
+}
+
+int convert(DState::State state) {
+   int rc = STATUS_UNKNOWN;
+   switch (state) {
+      case DState::UNKNOWN :  rc= STATUS_UNKNOWN;  break;
+      case DState::COMPLETE:  rc= STATUS_COMPLETE; break;
+      case DState::QUEUED:    rc= STATUS_QUEUED;   break;
+      case DState::ABORTED:   rc= STATUS_ABORTED;  break;
+      case DState::SUBMITTED: rc= STATUS_SUBMITTED;break;
+      case DState::ACTIVE:    rc= STATUS_ACTIVE;   break;
+      default: rc = STATUS_UNKNOWN;  break;
+   }
+   return rc;
+}
+
+void ecf_node::update(const Defs*, const std::vector<ecf::Aspect::Type>&)
+{
+  if (!node_) return;
+  node_->update(-1, -1, -1); 
+  node_->notify_observers(); 
+  node_->redraw();
+}
+
+void ecf_node::update_delete(const Node* n) { 
+  if (!node_) return;
+  node_->unlink();
+  node *parent = node_->parent();
+  node_->visibility(False);
+  node_->remove();
+  delete node_;
+  node_ = 0x0; 
+  notify_observers();
+  if (parent) { 
+    parent->folded_ = true;
+    parent->update(-1, -1, -1); 
+    parent->notify_observers(); 
+    parent->redraw(); 
+  }
+}
+
+void ecf_node::update_delete(const Defs* n) {
+  if (node_) node_->unlink(); 
+  node_ = 0x0; 
+  notify_observers();
+}
+
+void ecf_node::unlink(bool detach) { 
+  if (detach) {}
+  else if (node_) 
+    node_->unlink(); 
+  node_ = 0x0; 
+}
+
+const Repeat& ecf_node::crd() { static const Repeat REPEAT = Repeat( RepeatInteger("PRB", 1, 1, 1) ); return REPEAT; }
+
+node* ecf_node_maker::make_xnode(host& h, ecf_node* n, std::string type)
+{ 
+   if (!n) return NULL;
+   node* out = NULL;
+
+   if (n->type() >= 0 && n->type() < NODE_MAX && builders()[n->type()]) {
+      if (n->type() == NODE_REPEAT)
+         out = map()[type]->make(h, n);
+      else
+         out = builders()[n->type()]->make(h, n);
+      n->set_graphic_ptr(out);
+   }
+   else {
+      std::cout << "!!!" << n->full_name() << n->type() << " " << n->name() << " " << n->type_name() << "\n";
+      if (map()[type]) {
+         out = map()[type]->make(h, n);
+         assert(out);
+         n->set_graphic_ptr(out);
+         std::cout << "!!!ok\n";
+      }
+   }
+   return out;
+}
+
+ecf_node::ecf_node(ecf_node* parent, const std::string& name, char k) 
+  : parent_(parent), node_(0), kind_(k) 
+  , name_(name)
+  , trigger_(0)
+  , complete_(0)
+{
+}
+
+ecf_node::~ecf_node() 
+{  
+  // std::cerr << "# eode del: " << full_name_ << std::endl;
+  nokids(true);
+  unlink();
+  delete trigger_;
+  delete complete_;
+}
+
+node* ecf_node::create_tree(host& h, node* xnode) {
+  if (xnode) { node_ = xnode; }
+  else if (node_) return node_;
+  else if (!(node_ = create_node(h))) { return 0x0; }
+  if (get_node()) 
+    get_node()->set_graphic_ptr(node_);
+  
+  for(std::vector<ecf_node*>::const_iterator 
+        j  = kids_.begin(); j != kids_.end(); ++j) 
+    if (*j) 
+      node_->insert((*j)->create_tree(h, 0x0));
+  
+  return node_;
+}
+
+void ecf_node::add_kid(ecf_node* k) {
+  if (k) 
+    kids_.push_back(k);
+}
+
+template<> const std::string& ecf_concrete_node<Defs>::name() const
+{ return ecf_node::slash(); }
+
+template<> 
+void ecf_concrete_node<Node>::why(std::ostream&f) const
+{   
+   if (!owner_) return;
+   std::vector<std::string> theReasonWhy;
+   std::vector<std::string>::const_iterator it;
+   owner_->bottom_up_why(theReasonWhy); 
+   for (it=theReasonWhy.begin(); it != theReasonWhy.end(); ++it)
+     f << (*it) << "\n";
+ }
+
+
+template<> 
+void ecf_concrete_node<Suite>::why(std::ostream &f) const
+{   
+   if (!owner_) return;
+   std::vector<std::string> theReasonWhy;
+   std::vector<std::string>::const_iterator it;
+   owner_->bottom_up_why(theReasonWhy); 
+   for (it=theReasonWhy.begin(); it != theReasonWhy.end(); ++it)
+     f << (*it) << "\n";
+ }
+
+template<> 
+void ecf_concrete_node<Defs>::why(std::ostream &f) const
+{   
+   if (!owner_) return;
+   std::vector<std::string> theReasonWhy;
+   std::vector<std::string>::const_iterator it;
+   owner_->why(theReasonWhy); 
+   for (it=theReasonWhy.begin(); it != theReasonWhy.end(); ++it)
+     f << (*it) << "\n";
+}
+
+#define UNLINK(T) template<> void ecf_concrete_node<T>::unlink(bool detach) \
+{ if (!owner_) return; if (detach) ChangeMgrSingleton::instance()->detach(owner_,this); owner_ = 0x0; }
+UNLINK(Alias)
+UNLINK(Task)
+UNLINK(Family)
+UNLINK(Suite)
+UNLINK(Node)
+UNLINK(Defs)
+#undef UNLINK
+
+#define SORT_VAR 1
+#ifdef SORT_VAR
+struct cless_than {
+    inline bool operator() (const Variable& v1,  const Variable& v2)    {
+      return (v1.name() < v2.name()); } 
+};
+#endif
+
+template<> 
+void ecf_concrete_node<Alias>::make_subtree() {
+
+  if (!owner_) return;
+  Alias* n = owner_; 
+
+  full_name_ = owner_->absNodePath();
+
+  ChangeMgrSingleton::instance()->attach(owner_, this);  
+  n->update_generated_variables();
+  
+  std::vector<Variable> gvar; 
+  n->gen_variables(gvar);
+  std::vector<Variable>::const_iterator it;
+#ifdef SORT_VAR
+  std::sort(gvar.begin(),gvar.end(),cless_than());
+#endif
+
+  for (it = gvar.begin(); it != gvar.end(); ++it)
+    if ((*it).name() == "" || !(*it == Variable::EMPTY()))
+      add_kid(make_node(*it, this, 'g'));
+    else std::cerr << "# empty variable\n";
+  
+#ifdef SORT_VAR
+  gvar = n->variables(); /* expensive */
+  std::sort(gvar.begin(),gvar.end(),cless_than());
+  make_kids_list(this,gvar);
+#else
+ make_kids_list(this,n->variables());
+#endif
+
+  make_kids_list(this,n->labels());
+  make_kids_list(this,n->events());
+  make_kids_list(this,n->meters());
+}
+
+template<> 
+void ecf_concrete_node<Node>::make_subtree() {
+
+  if (!owner_) return;
+  Node* n = owner_; 
+
+  full_name_ = owner_->absNodePath();
+  ChangeMgrSingleton::instance()->attach(owner_, this);  
+
+  if (owner_->suite()->begun())
+    owner_->update_generated_variables();
+
+  std::vector<node_ptr> kids; n->immediateChildren(kids);
+  make_kids_list(this,kids);
+  
+  std::vector<Variable> gvar; 
+  n->gen_variables(gvar);
+#ifdef SORT_VAR
+  std::sort(gvar.begin(),gvar.end(),cless_than());
+#endif
+
+  std::vector<Variable>::const_iterator it;
+  for (it = gvar.begin(); it != gvar.end(); ++it)
+    if (!(*it == Variable::EMPTY()))
+      add_kid(make_node(*it, this, 'g'));
+    else std::cerr << "# empty variable\n";
+
+#ifdef SORT_VAR
+  gvar = n->variables(); /* expensive */
+  std::sort(gvar.begin(),gvar.end(),cless_than());
+  make_kids_list(this,gvar);
+#else
+  make_kids_list(this,n->variables());
+#endif
+
+  make_kids_list(this,n->labels());
+  make_kids_list(this,n->events());
+  make_kids_list(this,n->meters());
+
+  make_kids_list(this,n->timeVec());
+  make_kids_list(this,n->todayVec());
+  make_kids_list(this,n->crons());
+  
+  make_kids_list(this,n->dates());
+  make_kids_list(this,n->days());
+    
+  make_kids_list(this,n->limits());
+  make_kids_list(this,n->inlimits());
+  
+  if (n->get_trigger()) { 
+    trigger_ = new ExpressionWrapper(n, 't');
+    add_kid(make_node(trigger_, this, 't'));
+  }
+  if (n->get_complete()) {
+    complete_ = new ExpressionWrapper(n, 'c');
+    add_kid(make_node(complete_, this, 'c'));
+  }
+
+  if (n->get_late() != 0x0) { add_kid(make_node(n->get_late(), this)); }
+
+  if ((!n->repeat().empty()) && "" != n->repeat().name()) {
+    RepeatEnumerated *re;
+    RepeatDate *rd;
+    RepeatString *rs;
+    RepeatInteger *ri;
+    RepeatDay *rday;
+
+    if ((re = dynamic_cast<RepeatEnumerated *>(n->repeat().repeatBase())))
+      add_kid(make_node(re, this));
+    else if ((rd = dynamic_cast<RepeatDate *>(n->repeat().repeatBase())))
+      add_kid(make_node(rd, this)); 
+    else if ((rs = dynamic_cast<RepeatString *>(n->repeat().repeatBase())))
+      add_kid(make_node(rs, this));
+    else if ((ri = dynamic_cast<RepeatInteger *>(n->repeat().repeatBase())))
+      add_kid(make_node(ri, this));
+    else if ((rday = dynamic_cast<RepeatDay *>(n->repeat().repeatBase())))
+      {}
+    else 
+      std::cerr << "# ecflfowview does not recognises this repeat item\n";
+  }
+}
+
+template<> 
+void ecf_concrete_node<Suite>::make_subtree() {
+
+  if (!owner_) return;
+  Suite* n = owner_; 
+  if (n->begun())
+    n->update_generated_variables();
+
+  full_name_ = owner_->absNodePath(); // "/" + n->name();
+
+  ChangeMgrSingleton::instance()->attach(owner_, this); 
+
+  std::vector<node_ptr> kids; n->immediateChildren(kids);
+  make_kids_list(this,kids);
+  
+  std::vector<Variable> gvar;
+  n->gen_variables(gvar);  
+
+  std::vector<Variable>::const_iterator it;
+  for (it = gvar.begin(); it != gvar.end(); ++it)
+    if (!(*it == Variable::EMPTY()))
+      add_kid(make_node(*it, this, 'g'));
+    else std::cerr << "# empty variable\n";
+
+#ifdef SORT_VAR
+  gvar = n->variables(); /* expensive */
+  std::sort(gvar.begin(),gvar.end(),cless_than());
+  make_kids_list(this,gvar);
+#else
+  make_kids_list(this,n->variables());
+#endif
+  make_kids_list(this,n->labels());
+  make_kids_list(this,n->events());
+  make_kids_list(this,n->meters());
+  
+  make_kids_list(this,n->timeVec());
+  make_kids_list(this,n->todayVec());
+  make_kids_list(this,n->crons());
+  
+  make_kids_list(this,n->dates());
+  make_kids_list(this,n->days());
+  
+  make_kids_list(this,n->limits());
+  make_kids_list(this,n->inlimits());
+  
+  if (n->get_trigger()) { 
+    trigger_ = new ExpressionWrapper(n, 't');
+    add_kid(make_node(trigger_, this, 't'));
+  }
+  if (n->get_complete()) {
+    complete_ = new ExpressionWrapper(n, 'c');
+    add_kid(make_node(complete_, this, 'c'));
+  }
+
+  if (n->get_late() != 0x0) { add_kid(make_node(n->get_late(), this)); }
+  if ((!n->repeat().empty())) {
+    RepeatEnumerated *re;
+    RepeatDate *rd;
+    RepeatString *rs;
+    RepeatInteger *ri;
+    RepeatDay *rday;
+
+    if ((re = dynamic_cast<RepeatEnumerated *>(n->repeat().repeatBase())))
+      add_kid(make_node(re, this));
+    else if ((rd = dynamic_cast<RepeatDate *>(n->repeat().repeatBase())))
+      add_kid(make_node(rd, this)); 
+    else if ((rs = dynamic_cast<RepeatString *>(n->repeat().repeatBase())))
+      add_kid(make_node(rs, this));
+    else if ((ri = dynamic_cast<RepeatInteger *>(n->repeat().repeatBase())))
+      add_kid(make_node(ri, this));
+    else if ((rday = dynamic_cast<RepeatDay *>(n->repeat().repeatBase())))
+      add_kid(make_node(rday, this));
+    else 
+      std::cerr << "# ecflfowview does not recognises this repeat item\n";
+    }
+}
+
+template<>
+const std::string& ecf_concrete_node<Defs>::variable(const std::string& name) const
+{ 
+  Defs* n = owner_;
+  if (!n) return ecf_node::none();
+
+  const Variable & var = owner_->server().findVariable(name);
+  if (!var.empty())
+    return var.theValue();
+
+  return ecf_node::none();
+}
+
+template<>
+const std::string& ecf_concrete_node<Node>::variable(const std::string& name) const
+{
+  if (!owner_) 
+    return ecf_node::none();
+
+  const Variable & var = owner_->findVariable(name);
+  if (!var.empty())
+    return var.theValue();
+
+  return ecf_node::none();
+}
+
+template<>
+const std::string& ecf_concrete_node<Suite>::variable(const std::string& name) const
+{
+  if (!owner_) 
+    return ecf_node::none();
+
+  const Variable& var = owner_->findVariable(name);
+  if (!var.empty())
+    return var.theValue();
+
+  return ecf_node::none();
+}
+
+template<> ecf_concrete_node<const Variable>::
+ecf_concrete_node(const Variable *owner, ecf_node *parent, const char c)
+  : ecf_node(parent, owner->name(), c)
+  , owner_(owner)
+{
+}
+
+template<> 
+const std::string& ecf_concrete_node<const Event>::full_name() const
+{
+  full_name_ = parent()->full_name();
+  full_name_ += ":";
+  full_name_ += name();
+  return full_name_;
+}
+template<> 
+const std::string& ecf_concrete_node<const Meter>::full_name() const
+{
+  full_name_ = parent()->full_name();
+  full_name_ += ":";
+  full_name_ += name();
+  return full_name_;
+}
+template<> 
+const std::string& ecf_concrete_node<const Repeat>::full_name() const
+{
+  full_name_ = parent()->full_name();
+  full_name_ += ":";
+  full_name_ += name();
+  return full_name_;
+}
+template<> 
+const std::string& ecf_concrete_node<const Variable>::full_name() const
+{
+  full_name_ = parent()->full_name();
+  full_name_ += ":";
+  full_name_ += name();
+  return full_name_;
+}
+
+template<> 
+const std::string& ecf_concrete_node<const std::pair<std::string, std::string> >
+::full_name() const
+{
+  full_name_ = parent()->full_name();
+  full_name_ += ":";
+  full_name_ += name();
+  return full_name_;
+}
+
+template<> 
+ecf_concrete_node<const std::pair<std::string, std::string> >::
+ecf_concrete_node(const std::pair<std::string, std::string> *owner, 
+                  ecf_node *parent, const char c)
+  : ecf_node(parent, owner->first, c)
+  , owner_(owner)
+{
+}
+
+template<>
+std::ostream& ecf_concrete_node<Defs>::print(std::ostream& s) const 
+{ 
+  if (owner_) 
+    owner_->print(s); 
+  return s; 
+}
+
+template<>
+std::ostream& ecf_concrete_node<Node>::print(std::ostream& s) const 
+{ 
+  if (owner_) 
+    owner_->print(s); 
+  return s; 
+}
+
+template<>void ecf_concrete_node<Defs>::print(std::ostream& s){ }
+template<>void ecf_concrete_node<Node>::print(std::ostream& s){ }
+
+template<> const std::string& ecf_concrete_node<Defs>::full_name() const
+{ return ecf_node::slash(); }
+
+void hide(node* n) {
+  while (n) {
+    n->visibility(False);
+    hide(n->kids());
+    n = n->next();
+  }
+}
+
+void ecf_node::nokids(bool own) { 
+  if (node_) { node::destroy(node_->kids_); node_->kids_ = 0x0; }
+
+  for (size_t i = 0; i < kids_.size(); i++) {
+     delete kids_[i];
+  }
+  kids_.clear();
+}
+
+int redraw_kids(node* node_, 
+		const std::vector<ecf::Aspect::Type>& aspect) {
+   int tot = 0;
+   for(std::vector<ecf::Aspect::Type>::const_iterator it = aspect.begin(); it != aspect.end(); ++it) {
+     int  kind = 0;
+      switch ( *it ) {
+         case ecf::Aspect::METER:
+	   kind = NODE_METER;
+            break;
+         case ecf::Aspect::LABEL: 	   
+	   kind = NODE_LABEL;
+            break;
+         case ecf::Aspect::EVENT:
+	   kind = NODE_EVENT;
+            break;
+         case ecf::Aspect::LIMIT:
+	   kind = NODE_LIMIT;
+	   break;
+      default: 
+	   continue;
+      }
+      ++tot;
+      if (kind)
+	   for(node *xn = node_->kids(); xn; xn = xn->next())
+	     if (xn) if (xn->type() == kind) {
+		 xn->update(-1, -1, -1);
+		 xn->redraw();
+	       }
+   }
+   return tot;
+}
+
+template<> 
+void ecf_concrete_node<Node>::update(const Node* n, 
+                                     const std::vector<ecf::Aspect::Type>& aspect)
+{
+   if (!owner_) return;
+   if (!node_) return;
+   if (is_reset(aspect)) {
+      Updating::set_full_redraw();
+      return;
+   }
+   
+   node_->delvars();
+      if (owner_->suite()->begun()) {
+         owner_->update_generated_variables();
+      }
+      std::vector<Variable> gvar;
+      n->gen_variables(gvar);
+      std::vector<Variable>::const_iterator it, gvar_end;
+      for(it = gvar.begin(); it != gvar.end(); ++it) {
+         if ((*it).name() == "" || *it == Variable::EMPTY()) {
+            std::cerr << "# empty variable\n";
+            continue;
+         }
+         ecf_node *run = make_node(*it, this, 'g');
+         add_kid(run);
+         node_->insert(run->create_node(node_->serv()));
+      }
+
+#ifdef SORT_VAR
+      gvar = n->variables(); /* expensive */
+      std::sort(gvar.begin(), gvar.end(), cless_than());
+      gvar_end = gvar.end();
+      for(it = gvar.begin(); it != gvar_end; ++it) {
+#else
+      for (it = n->variables().begin(); it != n->variables().end(); ++it) {
+#endif
+         if ((*it).name() == "" || *it == Variable::EMPTY()) {
+            std::cerr << "# empty variable\n";
+            continue;
+         }
+         ecf_node *run = make_node(*it, this);
+         add_kid(run);
+         node_->insert(run->create_node(node_->serv()));      
+      }
+
+   const_cast<Node*>(n)->set_graphic_ptr(xnode());
+   if (redraw_kids(node_, aspect) == 1) return;
+
+   node_->update(-1, -1, -1); // call pop up window with check
+   node_->notify_observers();
+   node_->redraw();
+}
+
+template<> 
+void ecf_concrete_node<Suite>::update(const Node* n, 
+                                      const std::vector<ecf::Aspect::Type>& aspect) {
+  if (!owner_) return;     
+  if (!node_) return;
+  assert(xnode());
+  const_cast<Node*> (n)->set_graphic_ptr(xnode()); /* ??? */
+
+  if (is_reset(aspect)) {  
+
+     Updating::set_full_redraw();
+     return;
+  }
+
+  if (owner_->begun())
+     owner_->update_generated_variables();
+
+  if (redraw_kids(node_, aspect) == 1) return;
+
+  node_->update(-1, -1, -1);
+  node_->notify_observers();
+  node_->redraw();
+}
+
+template<>
+bool ecf_concrete_node<Suite>::is_late() { 
+  if (!owner_) return false;
+  return owner_->get_late()
+    ? owner_->get_late()->isLate()
+    : false; 
+}
+
+template<>
+bool ecf_concrete_node<Node>::is_late() {
+  if (!owner_) return false;
+  return owner_->get_late()
+    ? owner_->get_late()->isLate()
+    : false; 
+}
+
+template<>
+bool ecf_concrete_node<Suite>::hasZombieAttr() { 
+  if (!owner_) return false;
+  return owner_->zombies().size() > 0;
+}
+
+template<>
+bool ecf_concrete_node<Node>::hasZombieAttr() {
+  if (!owner_) return false;
+  return owner_->zombies().size() > 0;
+}
+
+template<>
+bool ecf_concrete_node<Node>::hasTime() {
+  return owner_ ? (owner_->timeVec().size() > 0 ||
+                   owner_->todayVec().size() > 0 ||
+                   owner_->crons().size() > 0) 
+    : false;
+}
+
+template<>
+bool ecf_concrete_node<Suite>::hasTime() {
+  return owner_ ? (owner_->timeVec().size() > 0 ||
+                   owner_->todayVec().size() > 0 ||
+                   owner_->crons().size() > 0) 
+    : false;
+}
+
+template<>
+bool ecf_concrete_node<Family>::hasTime() {
+  return owner_ ? (owner_->timeVec().size() > 0 ||
+                   owner_->todayVec().size() > 0 ||
+                   owner_->crons().size() > 0) 
+    : false;
+}
+
+template<>
+bool ecf_concrete_node<Node>::hasTrigger() {
+  return owner_ ? (owner_->triggerAst() || 
+                   owner_->completeAst()) 
+    : false;
+}
+
+template<>
+bool ecf_concrete_node<Node>::hasDate() {
+  return owner_ ? (owner_->days().size() > 0 || 
+                   owner_->dates().size() > 0) 
+    : false;
+}
+
+template<>
+bool ecf_concrete_node<Suite>::hasDate() {
+  return owner_ ? (owner_->days().size() > 0 || 
+                   owner_->dates().size() > 0) 
+    : false;
+}
+
+template<>
+bool ecf_concrete_node<Family>::hasDate() {
+  return owner_ ? (owner_->days().size() > 0 || 
+                   owner_->dates().size() > 0) 
+    : false;
+}
+
+
+template<> ecf_concrete_node<const Event>::
+ecf_concrete_node(const Event* owner,ecf_node* parent, const char c) 
+   :  ecf_node(parent, owner ? owner->name_or_number() : ecf_node::none(), c)
+   , owner_(owner)
+{}
+
+template<> 
+const std::string ecf_concrete_node<ExpressionWrapper>::toString() const 
+  { if (owner_) return owner_->expression(); return ecf_node::none(); }
+
+template<> 
+const std::string ecf_concrete_node<Expression>::toString() const
+{ if (owner_) return owner_->expression();
+  return ecf_node::none(); }
+
+template<> 
+const std::string ecf_concrete_node<external>::toString() const 
+{ return ecf_node::none(); }
+
+template<> 
+const std::string ecf_concrete_node<dummy_node>::toString() const 
+{ return ecf_node::none(); }
+
+template<> 
+const std::string ecf_concrete_node<AstTop>::toString() const 
+{ return owner_ ? owner_->expression() : ecf_node::none(); }
+
+template<> 
+const std::string ecf_concrete_node<Suite>::toString() const 
+{ return owner_ ? owner_->name() : ecf_node::none(); }
+
+template<> 
+const std::string ecf_concrete_node<Node>::toString() const 
+{ return owner_ ? owner_->name() : ecf_node::none(); }
+
+template<> 
+const std::string ecf_concrete_node<Defs>::toString() const
+{ return ecf_node::slash(); }
+
+template<> 
+const std::string ecf_concrete_node<RepeatDay>::toString() const
+{ if (parent())
+      return parent()->get_repeat().toString();
+  return none();
+}
+
+template<> 
+const std::string ecf_concrete_node<RepeatDate>::toString() const
+{ if (parent())
+      return parent()->get_repeat().toString();
+  return none();
+}
+
+template<> 
+const std::string ecf_concrete_node<RepeatEnumerated>::toString() const
+{ if (parent())
+      return parent()->get_repeat().toString();
+  return none();
+}
+
+template<> 
+const std::string ecf_concrete_node<RepeatString>::toString() const
+{ if (parent())
+      return parent()->get_repeat().toString();
+  return none();
+}
+
+template<> 
+const std::string ecf_concrete_node<RepeatInteger>::toString() const
+{ if (parent())
+      return parent()->get_repeat().toString();
+  return none();
+}
+
+template<>
+const std::string ecf_concrete_node<const std::pair<std::string, std::string> >
+::toString() const
+{ if (owner_) return owner_->first + " : " + owner_->second; return "pair"; }
+
+template<> int ecf_concrete_node<const Event>::status() const
+{ return owner_ ? owner_->value() : 0; }
+
+template<> boost::posix_time::ptime ecf_concrete_node<Suite>::status_time() const
+{   
+  if (owner_) return owner_->state_change_time(); 
+  return boost::posix_time::ptime(); 
+}
+
+template<> boost::posix_time::ptime ecf_concrete_node<Family>::status_time() const
+{   
+  if (owner_) return owner_->state_change_time(); 
+  return boost::posix_time::ptime(); 
+}
+
+template<> boost::posix_time::ptime ecf_concrete_node<Node>::status_time() const
+{ 
+  if (owner_) return owner_->state_change_time(); 
+  return boost::posix_time::ptime(); 
+}
+
+template<> int ecf_concrete_node<Suite>::status() const
+{
+  int rc = STATUS_UNKNOWN;
+  if (!owner_) return rc;
+  else if (!owner_->begun()) return rc;
+  else rc = convert(owner_->state());
+  return owner_->isSuspended() ? STATUS_SUSPENDED : rc;
+}
+
+template<> int ecf_concrete_node<Node>::status() const
+{
+  int rc = STATUS_UNKNOWN;
+  if (!owner_) return rc;
+  else rc = convert(owner_->state());
+  return owner_->isSuspended() ? STATUS_SUSPENDED : rc;
+}
+
+template<> int ecf_concrete_node<Defs>::status() const
+{
+  int rc = STATUS_UNKNOWN;
+  if (!owner_) return rc;
+  switch (owner_->server().get_state()) {
+  case SState::HALTED:   rc = STATUS_HALTED;   break;
+  case SState::SHUTDOWN: rc = STATUS_SHUTDOWN; break;
+  case SState::RUNNING: rc = convert(owner_->state()); break;
+  } 
+  return rc;
+}
+
+template<> int ecf_concrete_node<Suite>::defstatus() const
+{
+  return owner_ ? convert(owner_->defStatus()) : STATUS_QUEUED;
+}
+
+template<> int ecf_concrete_node<Node>::defstatus() const
+{
+  return owner_ ? convert(owner_->defStatus()) : STATUS_QUEUED;
+}
+
+template<>int ecf_concrete_node<Defs>::flags() const { 
+  return owner_ ? owner_->flag().flag() : 0;
+}
+
+template<>int ecf_concrete_node<Node>::flags() const { 
+  return owner_ ? owner_->flag().flag() : 0;
+}
+template<>int ecf_concrete_node<Suite>::flags() const { 
+  return owner_ ? owner_->flag().flag() : 0;
+}
+
+template<>int ecf_concrete_node<Node>::type() const { 
+  int rc = NODE_UNKNOWN;
+  if (!owner_) return rc;
+  if (owner_->isFamily()) rc = NODE_FAMILY;
+  else if (owner_->isAlias())  rc = NODE_ALIAS;
+  else if (owner_->isTask())   rc = NODE_TASK;
+  else if (owner_->isSuite())  rc = NODE_SUITE;
+  return rc;
+}
+
+template<>int ecf_concrete_node<Alias>::type() const { return NODE_ALIAS; }
+template<>int ecf_concrete_node<Suite>::type() const { return NODE_SUITE; }
+template<>int ecf_concrete_node<Family>::type() const { return NODE_FAMILY; }
+template<>int ecf_concrete_node<Defs>::type() const { return NODE_SUPER; }
+template<>int ecf_concrete_node<const ecf::TimeAttr>::type() const { return NODE_TIME; }
+template<>int ecf_concrete_node<const ecf::TodayAttr>::type() const { return NODE_TIME; }
+template<>int ecf_concrete_node<const ecf::CronAttr>::type() const { return NODE_TIME; }
+template<>int ecf_concrete_node<const DateAttr>::type() const { return NODE_DATE; }
+template<>int ecf_concrete_node<DateAttr>::type() const { return NODE_DATE; }
+template<>int ecf_concrete_node<const DayAttr>::type() const { return NODE_DATE; }
+// template<>int ecf_concrete_node<RepeatBase>::type() const { return NODE_REPEAT; }
+template<>int ecf_concrete_node<RepeatEnumerated>::type() const { return NODE_REPEAT_E; }
+template<>int ecf_concrete_node<RepeatString>::type() const     { return NODE_REPEAT_S; }
+template<>int ecf_concrete_node<RepeatDate>::type() const       { return NODE_REPEAT_D; }
+template<>int ecf_concrete_node<RepeatInteger>::type() const    { return NODE_REPEAT_I; }
+template<>int ecf_concrete_node<RepeatDay>::type() const    { return NODE_REPEAT_DAY; }
+template<>int ecf_concrete_node<const ecf::LateAttr>::type() const { return NODE_LATE; }
+template<>int ecf_concrete_node<ecf::LateAttr>::type() const { return NODE_LATE; }
+
+template<>int ecf_concrete_node<const Event>::type() const    { return NODE_EVENT; }
+template<>int ecf_concrete_node<const Label>::type() const    { return NODE_LABEL; }
+template<>int ecf_concrete_node<const Meter>::type() const    { return NODE_METER; }
+
+template<>int ecf_concrete_node<const Variable>::type() const    { return NODE_VARIABLE; }
+template<>int ecf_concrete_node<ExpressionWrapper>::type() const { return NODE_TRIGGER; }
+template<>int ecf_concrete_node<Variable>::type() const { return NODE_VARIABLE;}
+template<>int  ecf_concrete_node<const std::pair<std::string, std::string> >
+::type() const { return NODE_VARIABLE; }
+
+template<>int ecf_concrete_node<Limit>::type() const { return NODE_LIMIT; }
+template<>int ecf_concrete_node<const InLimit>::type() const 
+{ return NODE_INLIMIT; }
+
+template<>int ecf_concrete_node<Expression>::type() const { return NODE_TRIGGER; }
+template<> int ecf_concrete_node<dummy_node>::type() const { return NODE_UNKNOWN; }
+template<> int ecf_concrete_node<dummy_node>::status() const { return STATUS_UNKNOWN; }
+template<> const std::string& ecf_concrete_node<dummy_node>::name() const { return owner_->name(); }
+template<> const std::string& ecf_concrete_node<dummy_node>::full_name() const
+{ return owner_ ? owner_->name() : ecf_node::none(); }
+template<> void ecf_concrete_node<dummy_node>::set_graphic_ptr(node* n){}
+
+template<> int ecf_concrete_node<external>::type() const { return NODE_UNKNOWN; }
+
+template<> 
+int ecf_concrete_node<Node>::tryno() {
+   int num = -1;
+   if (owner_) {
+      Submittable* submittable = owner_->isSubmittable();
+      if ( submittable )
+         num = submittable->try_no();
+   }
+   return num;
+}
+
+template<> 
+void ecf_concrete_node<Suite>::set_graphic_ptr(node* n) 
+{ return owner_->set_graphic_ptr(n); }
+
+template<> 
+void ecf_concrete_node<Node>::set_graphic_ptr(node* n)
+{ return owner_->set_graphic_ptr(n); }
+
+const std::string& ecf_node::no_owner() { static const std::string NO_OWNER = "(no owner)"; return NO_OWNER; }
+const std::string& ecf_node::none()     { static const std::string NONE = "(none)";  return NONE; }
+const std::string& ecf_node::slash()    { static const std::string SLASH =  "/";  return SLASH; }
+
+ExpressionWrapper::ExpressionWrapper(Node* n, char c) : 
+  node_(n), kind_(c) {
+  if (n) {
+    if (c=='c')
+      mem = n->completeExpression();
+    else
+      mem = n->triggerExpression();
+  }
+}
+
+const std::string & ExpressionWrapper::name() const 
+{ 
+  return ecf_node::none();
+}
+
+const std::string & ExpressionWrapper::full_name() const 
+{
+  return ecf_node::none();
+}
+const std::string & ExpressionWrapper::toString() const 
+{ 
+  return mem;
+}
+
+void ecf_node::delvars() {
+   for (size_t i = 0; i < kids_.size(); i++) {
+      if (kids_[i]->type() == NODE_VARIABLE) {
+         kids_.erase(kids_.begin() + i);
+      }
+   }
+}
+
+template<>
+std::string ecf_concrete_node<Suite>::get_var(const std::string& name, 
+                                              bool is_gen,
+                                              bool substitute) 
+{   
+   if (!is_gen) { // user variable have priority
+      const Variable& var = owner_->findVariable(name);
+      if (!var.empty()) {
+         std::string value = var.theValue();
+         if (substitute)
+            owner_->variableSubsitution(value);
+         return value;
+      }
+   }
+   if ((!owner_->repeat().empty()) && name == owner_->repeat().name()) {
+      return owner_->repeat().valueAsString();
+   }
+   return owner_->findGenVariable(name).theValue();
+}
+
+template<>
+std::string ecf_concrete_node<Node>::get_var(const std::string& name, 
+                                             bool is_gen,
+                                             bool substitute) 
+                                             {
+   if (!is_gen) { // user variable have priority
+      const Variable& var = owner_->findVariable(name);
+      if (!var.empty()) {
+         std::string value = var.theValue();
+         if (substitute)
+            owner_->variableSubsitution(value);
+         return value;
+      }
+   }
+   if ((!owner_->repeat().empty()) && name == owner_->repeat().name()) {
+      return owner_->repeat().valueAsString();
+   }
+   return owner_->findGenVariable(name).theValue();
+}
+
+template<>
+std::string ecf_concrete_node<Defs>::get_var(const std::string& name, 
+                                             bool is_gen,
+                                             bool substitute) 
+{ if (!is_gen) { // user variable have priority
+      const Variable& var = owner_->server().findVariable(name);
+      if (!var.empty()) {
+         std::string value = var.theValue();
+         if (substitute)
+            owner_->server().variableSubsitution(value);
+         return value;
+      }
+   }
+  return owner_->server().findVariable(name).theValue(); 
+}
+
+template<>
+Limit* ecf_concrete_node<Limit>::get_limit(const std::string& name)
+{ return owner_; }
+template<>
+const Label& ecf_concrete_node<Node>::get_label(const std::string& name)
+{ return owner_ ? owner_->find_label(name) : Label::EMPTY(); }
+template<>
+const Event& ecf_concrete_node<Node>::get_event(const std::string& name)
+{ return owner_ ? owner_->findEvent(name) : Event::EMPTY(); }
+template<>
+const Meter& ecf_concrete_node<Node>::get_meter(const std::string& name)
+{ return owner_ ? owner_->findMeter(name) : Meter::EMPTY(); }
+template<>
+const Repeat& ecf_concrete_node<Node>::get_repeat()
+{ return owner_ ? owner_->repeat() : crd(); }
+
+template<>
+const Label& ecf_concrete_node<Suite>::get_label(const std::string& name)
+{ return owner_ ? owner_->find_label(name) : Label::EMPTY(); }
+template<>
+const Event& ecf_concrete_node<Suite>::get_event(const std::string& name)
+{ return owner_ ? owner_->findEvent(name) : Event::EMPTY(); }
+template<>
+const Meter& ecf_concrete_node<Suite>::get_meter(const std::string& name)
+{ return owner_ ? owner_->findMeter(name) : Meter::EMPTY(); }
+
+template<>
+const Repeat& ecf_concrete_node<Suite>::get_repeat()
+{ 
+  return owner_ ? owner_->repeat() : crd();
+}
+
+template<>
+Node* ecf_concrete_node<Node>::get_node() const { return owner_; }
+template<>
+Node* ecf_concrete_node<Alias>::get_node() const { return owner_; }
+template<>
+Node* ecf_concrete_node<Suite>::get_node() const { return owner_; }
+template<>
+Node* ecf_concrete_node<Defs>::get_node() const { return 0x0; }
+
+const char* ecf_node_name(int ii) {
+
+  static char* types[] = {
+     (char*)"list",    (char*)"user",    (char*)"connection",(char*)"variable",
+     (char*)"time",    (char*)"date",    (char*)"trigger",   (char*)"tree",
+     (char*)"action",  (char*)"event",   (char*)"task",      (char*)"family",  
+     (char*)"suite",   (char*)"super",   (char*)"passwd",    (char*)"login",   
+     (char*)"status",  (char*)"reply",   (char*)"check",     (char*)"nid",
+     (char*)"file",    (char*)"handle",  (char*)"repeat",    (char*)"dir",  
+     (char*)"meter",   (char*)"label",   (char*)"cancel",    (char*)"migrate", 
+     (char*)"late",    (char*)"restore", (char*)"complete",  (char*)"nickname",
+     (char*)"alias",   (char*)"limit",   (char*)"inlimit",   (char*)"unknown", 
+     (char*)"repeat-e", (char*)"repeat-s", (char*)"repeat-d", (char*)"repeat-i", 
+     // (char*)"zombie",  (char*)"project", (char*)"object",    (char*)"call",
+     (char*)"cron",
+      NULL};
+  int size = sizeof(types) / sizeof(char*);
+  if (ii >= size) return "out of bound";
+  return (const char*) types[ii];
+}
+
+const std::string ecf_node::type_name() const { return ecf_node_name(type()); }
+
+template<>
+void ecf_concrete_node<Defs>::make_subtree() {
+  full_name_ = "/";
+  if (!owner_) return;
+
+  ChangeMgrSingleton::instance()->attach(owner_, this); 
+  make_kids_list(this,owner_->suiteVec());
+
+  std::vector<Variable> gvar = owner_->server().user_variables();
+  std::sort(gvar.begin(),gvar.end(),cless_than());
+  make_kids_list(this,gvar);
+
+  std::vector<Variable>::const_iterator it;
+  gvar = owner_->server().server_variables();
+  for (it = gvar.begin(); it != gvar.end(); ++it)
+    if (!(*it == Variable::EMPTY()))
+      add_kid(make_node(*it, this, 'g'));
+    else std::cerr << "# empty variable\n";
+}
+
+
+template<> 
+void ecf_concrete_node<Defs>::update(const Defs* n, 
+                                     const std::vector<ecf::Aspect::Type>& aspect) {
+  if (!owner_) return;     
+  if (!node_) return;
+  if (is_reset(aspect)) {  
+
+     Updating::set_full_redraw();
+
+     XECFDEBUG {
+        for (std::vector<suite_ptr>::const_iterator i = n->suiteVec().begin();
+                 i != n->suiteVec().end(); ++i) {
+           std::cout << "suite name " << (*i)->name() << "\n";
+        }}
+
+     return;
+  }
+
+  { node_->update(-1, -1, -1); node_->notify_observers(); node_->redraw(); }
+}
+
+ecf_node* ecf_node::dummy_node()
+{
+  ecf_concrete_node<external> *n = new  ecf_concrete_node<external>(0x0, 0x0, 'e');
+  return n;
+}
+
diff --git a/ecflow_4_0_7/view/src/ecf_node.h b/ecflow_4_0_7/view/src/ecf_node.h
new file mode 100644
index 0000000..bf78261
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecf_node.h
@@ -0,0 +1,582 @@
+#ifndef ecf_node_H
+#define ecf_node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #65 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "observable.h"
+class host;
+class ecf_node;
+#include "ecflowview.h"
+#include <iostream>
+#include <deque>
+#include <ChangeMgrSingleton.hpp>
+class node;
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#if 0
+struct ext_node;
+struct ext_list {
+   int type_;
+   char *name_;
+   struct ext_list *next;
+
+   const std::string name() {return name_;}
+};
+
+struct ext_tree {int type_;
+   char *name;
+   struct ext_tree *left, *right;
+   int mtype, level;
+   struct ext_tree *math;
+};
+
+struct ext_trigger {
+   int type_;
+   char *name;
+   struct ext_trigger *next_;
+   int status_, nid_, num_;
+   struct ext_node *parent;
+   void* user_ptr;
+   int uint_;
+   struct ext_node *kids_;
+   int mod_no;
+   ext_tree* math;
+};
+
+struct ext_node {
+   int type_;
+   char *name_;
+   struct ext_node *next_;
+   int status_, nid_, num_;
+   struct ext_node *parent;
+   void* user_ptr_;
+   int uint_;
+   struct ext_node *kids_;
+   int defs_, svds_, flags;
+   ext_node *text, *event, *meter, *label, *time, *date,
+   *trigger, *complete, *action, *autocm, *late, *limit,
+   *inlimit, *wait;
+   int rid, tryno_, alias, count;
+   char *passwd;
+   ext_node *user, *variable;
+   int mod, clk, gain;
+   time_t stime, btime;
+   ext_node *genvars, *repeat, *log, *restore;
+   char* name() const {return name_ ? name_ : getenv("USER");}
+   const std::string toString() const {return name();}
+   int status() const {return status_;}
+   int type() const {return type_;}
+   int defComplete() const {return defs_ == STATUS_COMPLETE;}
+   const std::string& full_name() {
+      static std::string fname;
+      if (type_ == NODE_SUPER) {fname = "/";}
+      else if (parent) {
+         fname = parent->full_name();
+         if (type_ == NODE_SUITE) {}
+         else if (type_== NODE_FAMILY || type_ == NODE_TASK || type_ == NODE_ALIAS)
+         fname += "/";
+         else
+         fname += ":";
+         fname += name_;
+      }
+      return fname;
+   }
+};
+#endif
+const char* ecf_node_name( int ii );
+
+class ecf_node_maker {
+   virtual node* make( host&, ecf_node* e ) = 0;
+protected:
+   static std::map<std::string, ecf_node_maker*>& map();
+   static std::vector<ecf_node_maker*>& builders();
+public:
+   static node* make_xnode( host& h, ecf_node* n, std::string type );
+};
+
+template<typename T, class W>
+class ecf_node_builder : public ecf_node_maker {
+   virtual node* make( host& h, ecf_node* e )
+   {
+      return new W(h, e);
+   }
+public:
+   ecf_node_builder( int type )
+   {
+      map()[typeid(T).name()] = this;
+      builders()[type] = this;
+   }
+   ~ecf_node_builder()
+   {
+   }
+};
+
+class ExpressionWrapper {
+   Node* node_;
+   char kind_;
+   std::string mem;
+public:
+   ExpressionWrapper( Node* n, char c );
+
+   const std::string & name() const;
+   const std::string & full_name() const;
+   const std::string & toString() const;
+
+   std::string expression() const
+   {
+      if (kind_ == 'c') return node_->completeExpression();
+      return node_->triggerExpression();
+   }
+
+   AstTop* get_ast_top()
+   {
+      if (kind_ == 'c') return node_->completeAst();
+      return node_->triggerAst();
+   }
+};
+
+class ecf_node : public boost::enable_shared_from_this<ecf_node>
+ , public observable 
+{
+private:
+   ecf_node* parent_;
+
+protected:
+   mutable std::string full_name_;
+   std::vector<ecf_node*> kids_;
+   node *node_;
+   char kind_; // 'c' for complete trigger
+
+   const std::string name_;
+
+   ExpressionWrapper *trigger_;
+   ExpressionWrapper *complete_;
+   friend class ecf_node_maker;
+
+   void counter();
+
+public:
+   ecf_node( ecf_node* parent, const std::string& name, char k );
+
+   ~ecf_node();
+
+   static const std::string& no_owner();
+   static const std::string& none();
+   static const std::string& slash();
+
+   virtual void set_graphic_ptr( node* )
+   {
+   }
+   virtual node* create_node( host& ) = 0;
+   virtual node* create_tree( host& h, node* xnode = 0x0 );
+   void adopt( node* n )
+   {
+      node_ = n;
+   }
+   void nokids( bool own = false );
+
+   void add_kid( ecf_node* k );
+#ifdef BRIDGE
+   void* user_ptr;
+#endif
+
+   virtual int type() const = 0;
+   virtual int flags() const = 0;
+   virtual const std::string type_name() const;
+   virtual void update( const Node*, const std::vector<ecf::Aspect::Type>& );
+   virtual void update( const Defs*, const std::vector<ecf::Aspect::Type>& );
+   virtual void update_delete( const Node* );
+   virtual void update_delete( const Defs* );
+
+   virtual void make_subtree() = 0;
+
+   virtual const std::string toString() const
+   {
+      return none();
+   }
+   // virtual const std::string substitute(const std::string& cmd) const { return cmd; }
+   virtual int status() const
+   {
+      return STATUS_UNKNOWN;
+   }
+   virtual boost::posix_time::ptime status_time() const
+   {
+      return boost::posix_time::ptime();
+   }
+   virtual int defstatus() const
+   {
+      return STATUS_QUEUED;
+   }
+   virtual int tryno()
+   {
+      return 0;
+   }
+   virtual const std::string& name() const
+   {
+      return name_;
+   }
+   virtual const std::string& full_name() const
+   {
+      return full_name_;
+   }
+
+   virtual bool is_late()
+   {
+      return false;
+   }
+   virtual bool hasZombieAttr()
+   {
+      return false;
+   }
+   virtual bool hasTime()
+   {
+      return false;
+   }
+   virtual bool hasDate()
+   {
+      return false;
+   }
+   virtual bool hasTrigger()
+   {
+      return false;
+   }
+
+   virtual std::ostream& print( std::ostream& s ) const
+   {
+      return s << none();
+   }
+   virtual void print( std::ostream& s )
+   {
+      s << none();
+   }
+   virtual const std::string& variable( const std::string& name ) const = 0;
+   virtual void why( std::ostream & ) const
+   {
+   }
+
+   virtual std::string get_var( const std::string& name, bool is_gen = false,
+                                bool substitute = false )
+   {
+      return none();
+   }
+
+   virtual Limit* get_limit( const std::string& name ) = 0;
+   virtual Node* get_node() const = 0;
+   virtual const Label& get_label( const std::string& name ) = 0;
+   virtual const Event& get_event( const std::string& name ) = 0;
+   virtual const Meter& get_meter( const std::string& name ) = 0;
+   virtual const Repeat& get_repeat() = 0;
+
+   static const Repeat& crd();
+
+private:
+   ecf_node( const ecf_node& );
+   ecf_node& operator=( const ecf_node& );
+
+public:
+   ecf_node* parent() const
+   {
+      return parent_;
+   }
+   node* xnode() const
+   {
+      return node_;
+   }
+   char kind()
+   {
+      return kind_;
+   }
+   static ecf_node* dummy_node();
+
+   virtual void unlink( bool detach = true );
+   virtual void check() const
+   {
+      if (parent() == 0x0) std::cerr << "# ecf: no parent: " << name() << "\n";
+      if (xnode() == 0x0) std::cerr << "# ecf: no xnode:  " << name() << "\n";
+   }
+
+   void delvars();
+};
+
+template<typename T>
+class ecf_concrete_node : public ecf_node, public AbstractObserver {
+private:
+   T* owner_;
+private:
+   ecf_concrete_node( const ecf_concrete_node& );
+   ecf_concrete_node& operator=( const ecf_concrete_node& );
+
+protected:
+   virtual node* create_node( host& h )
+   {
+      return ecf_node_maker::make_xnode(h, this, type_name());
+   }
+
+public:
+   ecf_concrete_node( T* owner, ecf_node* parent, char c = 'd' )
+     : ecf_node(parent, owner ? owner->name() : ecf_node::none(), c)
+     , owner_(owner)
+   {
+      if (0 && parent) {
+         full_name_ = parent->full_name();
+         full_name_ += ":";
+         full_name_ += name();
+      }
+   }
+
+   ~ecf_concrete_node()
+   {
+      unlink();
+   }
+
+   virtual void set_graphic_ptr( node* )
+   {
+   }
+
+   T* get() const
+   {
+      return owner_;
+   }
+   virtual const std::string toString() const;
+
+   // virtual const std::string substitute(const std::string& cmd) const { return cmd; }
+   virtual int status() const
+   {
+      return STATUS_UNKNOWN;
+   }
+   virtual int defstatus() const
+   {
+      return STATUS_QUEUED;
+   }
+   virtual boost::posix_time::ptime status_time() const
+   {
+      return boost::posix_time::ptime();
+   }
+   virtual int tryno()
+   {
+      return 0;
+   }
+   virtual int type() const
+   {
+      return NODE_UNKNOWN;
+   }
+   virtual int flags() const
+   {
+      return 0;
+   }
+   virtual const std::string& name() const
+   {
+      return ecf_node::name();
+   }
+   virtual const std::string& full_name() const
+   {
+      return full_name_;
+   }
+   virtual bool is_late()
+   {
+      return false;
+   }
+   virtual bool hasZombieAttr()
+   {
+      return false;
+   }
+   virtual bool hasTime()
+   {
+      return false;
+   }
+   virtual bool hasDate()
+   {
+      return false;
+   }
+   virtual bool hasTrigger()
+   {
+      return false;
+   }
+
+   virtual void make_subtree()
+   {
+   }
+
+   virtual std::ostream& print( std::ostream& s ) const
+   {
+      return s << none();
+   }
+   virtual void print( std::ostream& s )
+   {
+   }
+
+   virtual const std::string type_name() const
+   {
+      return typeid(owner_).name();
+   }
+
+   virtual void update( const Node* n, const std::vector<ecf::Aspect::Type>& asp )
+   {
+      if (!owner_) return;
+      ecf_node::update(n, asp);
+   }
+   virtual void update( const Defs* n, const std::vector<ecf::Aspect::Type>& asp )
+   {
+      if (!owner_) return;
+      ecf_node::update(n, asp);
+   }
+
+   void update_delete( const Node* n )
+   {
+      unlink();
+      ecf_node::update_delete(n);
+   }
+   void update_delete( const Defs* n )
+   {
+      unlink();
+      ecf_node::update_delete(n);
+   }
+
+   virtual const std::string& variable( const std::string& ) const
+   {
+      return none();
+   }
+   virtual void why( std::ostream & ) const
+   {
+   }
+
+   virtual std::string get_var( const std::string& name, bool is_gen = false,
+                                bool substitute = false )
+   {
+      return none();
+   }
+
+   virtual void unlink( bool detach = true )
+   {
+      owner_ = 0x0;
+      ecf_node::unlink(detach);
+   }
+   virtual void check() const
+   {
+      if (get() == 0x0) std::cerr << "# ecf: no owner: " << name() << "\n";
+      ecf_node::check();
+   }
+
+   virtual Limit* get_limit( const std::string& name )
+   {
+      return 0x0;
+   }
+   virtual Node* get_node() const
+   {
+      return 0x0;
+   }
+   virtual const Label& get_label( const std::string& name )
+   {
+      return Label::EMPTY();
+   }
+   virtual const Event& get_event( const std::string& name )
+   {
+      return Event::EMPTY();
+   }
+   virtual const Meter& get_meter( const std::string& name )
+   {
+      return Meter::EMPTY();
+   }
+   virtual const Repeat& get_repeat()
+   {
+      return crd();
+   }
+
+private:
+   bool is_reset( const std::vector<ecf::Aspect::Type>& v ) const
+   {
+      bool reset = false;
+      for(std::vector<ecf::Aspect::Type>::const_iterator it = v.begin(); it != v.end();
+               ++it) {
+         if (*it == ecf::Aspect::ORDER || *it == ecf::Aspect::ADD_REMOVE_NODE
+                  || *it == ecf::Aspect::ADD_REMOVE_ATTR) {
+            reset = true;
+            break;
+         }
+      }
+      return reset;
+   }
+};
+
+template<typename T>
+ecf_node* make_node( T* n, ecf_node* parent, char c = 'd' )
+{
+   ecf_node* ec = new ecf_concrete_node<T>(n, parent, c);
+   if (ec && n) {
+      int type = ec->type();
+      // gcc 4.7 optimisation issue, keep next line
+      XECFDEBUG { if (!ec) std::cerr << "# make node " << type << "\n"; }
+      if (!parent || type == NODE_SUPER || type == NODE_SUITE)
+         ec->make_subtree();
+      else if (type == NODE_FAMILY || type == NODE_TASK || type == NODE_ALIAS) {
+         /* temp on demand:: */ec->make_subtree();
+      }
+   }
+   // XECFDEBUG { if (!ec) std::cerr << "# no ecf\n"; if (!n) std::cerr << "# no node\n"; }
+   return ec;
+}
+
+template<typename T>
+ecf_node* make_node( T& n, ecf_node* parent, const char c = 'd' )
+{
+   return make_node<T>(&n, parent, c);
+}
+
+template<typename T>
+node* make_xnode( T* n, ecf_node* parent, host& h, char c = 'd' )
+{
+   ecf_node* ec = make_node<T>(n, parent, c);
+   if (ec) {
+      node *xnode = ec->create_tree(h);
+      ec->adopt(xnode); /* twice ? create is adoption */
+      return xnode;
+   }
+   XECFDEBUG { if (!ec) std::cerr << "# no ecf2\n"; }
+   return NULL;
+}
+
+template<typename T>
+node* make_xnode( T& n, ecf_node* parent, host& h, const char c = 'd' )
+{
+   return make_xnode<T>(&n, parent, h, c);
+}
+
+template<typename T>
+void make_kids_list( ecf_node* parent, const std::vector<boost::shared_ptr<T> >& v )
+{
+   for(typename std::vector<boost::shared_ptr<T> >::const_reverse_iterator j = v.rbegin();
+            j != v.rend(); ++j) {
+      parent->add_kid(make_node((*j).get(), parent));
+   }
+}
+
+template<typename T>
+void make_kids_list( ecf_node* parent, const std::vector<T>& v )
+{
+   for(typename std::vector<T>::const_reverse_iterator j = v.rbegin(); j != v.rend();
+            ++j) {
+      parent->add_kid(make_node(*j, parent));
+   }
+}
+
+template<typename T>
+const std::string ecf_concrete_node<T>::toString() const
+{
+   if (owner_) return owner_->toString();
+   return "";
+}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/ecflow.cc b/ecflow_4_0_7/view/src/ecflow.cc
new file mode 100644
index 0000000..895cbe6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecflow.cc
@@ -0,0 +1,289 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <map>
+// #include <iostream>
+// #include <fstream>
+// #include <sstream>
+#include <boost/lexical_cast.hpp>
+#include "File.hpp"
+#include "Str.hpp"
+#      include <sys/file.h>
+#include "ecflow.h"
+#include "directory.h"
+#include "host.h"
+
+using namespace ecf;
+
+ecf_list *ecf_node_create(char *text)
+{
+  return new ecf_list(text);
+}
+
+/********************/
+
+static std::map<std::string, ecf_map> servers;
+
+int ecf_nick_read(ecf_map::kind kind)
+{
+  FILE *fp;
+#undef  MAXLEN
+#define MAXLEN 128
+  char buff[MAXLEN];
+  char name[MAXLEN];
+  char netname[MAXLEN];
+  int  prog;
+  std::string servpath;
+
+  if (kind == ecf_map::GLOBAL)
+    servpath = directory::system();
+  else
+    servpath = directory::user();
+  servpath += "/servers";
+  std::cout << "# servers: " << servpath << "\n";
+
+  if( !(fp=fopen(servpath.c_str(),"r")) ) return FALSE;
+  while(fgets(buff,MAXLEN,fp)) {
+    name[0] = netname[0] = 0;
+    sscanf(buff,(char*)"%s %s %d",name,netname,&prog);
+
+    if(name[0] != 0 && name[0] != '#' && 
+       servers.find(name) == servers.end())
+      servers.insert(std::make_pair
+		     (name, ecf_map(name, netname, prog, kind)));
+  }
+
+  fclose(fp);
+  return 0;
+}
+
+int ecf_nick_load() {
+  static bool been_here = false;
+  if(been_here) return TRUE;  
+  else been_here = true;
+
+  servers.insert(std::make_pair
+		 ("localhost", 
+		  ecf_map("local","localhost", 3141,ecf_map::GLOBAL)));
+  ecf_nick_read(ecf_map::GLOBAL);
+  ecf_nick_read(ecf_map::USER);
+
+  for (std::map<std::string, ecf_map>::const_iterator 
+	 it = servers.begin(); it != servers.end(); ++it) {
+    host_maker::make_host(it->first, 
+			  it->second.machine(), 
+			  it->second.port());
+  }  
+  return TRUE;
+}
+
+int ecf_nick_write()
+{
+  std::string servpath = directory::user();
+  servpath += "/servers";
+  FILE *f = fopen(servpath.c_str(), "w");
+  if(!f) return FALSE;  
+  for (std::map<std::string, ecf_map>::const_iterator 
+	 it = servers.begin(); it != servers.end(); ++it) {
+    fprintf(f, "%s\n", it->second.print().c_str());
+  }
+  fclose(f);
+  return TRUE;
+}
+
+int ecf_nick_origin(const std::string& name)
+{
+  std::map<std::string, ecf_map>::iterator found = servers.find(name); 
+  if (found != servers.end())
+    return (int) found->second.from;
+  return (int) ecf_map::GLOBAL;
+}
+
+int ecf_nick_delete(const std::string& name)
+{
+  if (servers.find(name) != servers.end())
+    servers.erase(servers.find(name)); 
+  return TRUE;
+}
+
+int ecf_nick_update(const std::string& name, 
+		    const std::string& machine, 
+		    int port)
+{
+   if (servers.find(name) != servers.end())
+     servers.erase(servers.find(name));
+   servers.insert(std::make_pair
+		  (name, ecf_map(name, machine, port, ecf_map::USER)));
+   ecf_nick_write();
+   return TRUE;
+}
+
+
+long ecf_repeat_julian_to_date(long jdate)
+{
+	long x,y,d,m,e;
+	long day,month,year;
+
+	x = 4 * jdate - 6884477;
+	y = (x / 146097) * 100;
+	e = x % 146097;
+	d = e / 4;
+
+	x = 4 * d + 3;
+	y = (x / 1461) + y;
+	e = x % 1461;
+	d = e / 4 + 1;
+
+	x = 5 * d - 3;
+	m = x / 153 + 1;
+	e = x % 153;
+	d = e / 5 + 1;
+
+	if( m < 11 )
+		month = m + 2;
+	else
+		month = m - 10;
+
+
+	day = d;
+	year = y + m / 11;
+
+	return year * 10000 + month * 100 + day;
+}
+
+long ecf_repeat_date_to_julian(long ddate)
+{
+	long  m1,y1,a,b,c,d,j1;
+
+	long month,day,year;
+
+	year = ddate / 10000;
+	ddate %= 10000;
+	month  = ddate / 100;
+	ddate %= 100;
+	day = ddate;
+
+	if (month > 2)
+	{
+		m1 = month - 3;
+		y1 = year;
+	}
+	else
+	{
+		m1 = month + 9;
+		y1 = year - 1;
+	}
+	a = 146097*(y1/100)/4;
+	d = y1 % 100;
+	b = 1461*d/4;
+	c = (153*m1+2)/5+day+1721119;
+	j1 = a+b+c;
+
+	return(j1);
+}
+
+char *ecf_string(char *str, char *file, int lineno)
+{
+  static const char *null_string = "(null string)";
+  return str ? str : const_cast<char *>(null_string);
+}
+static const char* const_ecf_string(const char *str)
+{
+   static const char *null_string = "(null string)";
+   return str ? str : null_string ;
+}
+
+#undef MAXLEN
+#define MAXLEN          255        /* For temp names, should be big enough */
+#include <sys/stat.h>
+#include <dirent.h>
+
+ecf_dir *ecf_file_dir(char *path, char *pattern, int fullname)
+/**************************************************************************
+?  Read the directory and generate the listing
+************************************o*************************************/
+{
+  struct dirent *de;
+  DIR           *dp;
+  struct stat    st;
+
+  ecf_dir       *cur = NULL;
+  ecf_dir       *dir = NULL;
+
+  bool            ok = true;
+
+  if( (dp=opendir(path)) )
+  {
+    char name[MAXLEN];
+    char *s;
+
+    strcpy(name,path);
+    s = name + strlen(path);
+    *s++ = '/';
+
+    while( ok && (de=readdir(dp)) != NULL )
+    { 
+      if( de->d_ino != 0 )
+      {
+        strcpy(s,de->d_name);
+
+        if( !pattern || strncmp(de->d_name,pattern,strlen(pattern))==0 )
+          if( lstat(name,&st) == 0 )
+          {
+            if( (cur = new ecf_dir())) // (ecf_dir*) calloc(1,sizeof(ecf_dir))) )  
+            {
+              if(fullname)
+              {
+                char buff[MAXLEN];
+                sprintf(buff,"%s/%s",const_ecf_string(path),const_ecf_string(de->d_name));
+                cur->name_ = strdup(buff);
+              }
+              else
+                cur->name_  = strdup(de->d_name);
+
+              cur->mode  = st.st_mode;
+              cur->uid   = st.st_uid;
+              cur->gid   = st.st_gid;
+              cur->size  = st.st_size;
+              cur->atime = st.st_atime;
+              cur->mtime = st.st_mtime;
+              cur->ctime = st.st_ctime;
+
+              ecf_list_add<ecf_dir>(&dir,cur);
+            }
+            else
+              ok = false;
+          }
+	  else {}
+        else {}                        /* Didn't match */
+      }
+    }
+    closedir(dp);
+  } else {};
+
+  return dir;
+}
+
+bool ecf_map::operator== (const ecf_map& l) const
+  {
+    return l.name_ == name_
+      && l.machine_ == machine_
+      && l.port_ == port_;
+  }
+
+const std::string ecf_map::print() const {
+  std::stringstream i; i << port_;
+  return name_ + "\t\t" + machine_ + "\t\t" + i.str();
+}
diff --git a/ecflow_4_0_7/view/src/ecflow.h b/ecflow_4_0_7/view/src/ecflow.h
new file mode 100644
index 0000000..96b0571
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecflow.h
@@ -0,0 +1,258 @@
+#ifndef ecf_H
+#define ecf_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #19 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <rpc/rpc.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+
+#if defined(__cplusplus) || defined(c_plusplus)
+#include "std.h"
+#include <sstream>
+#include <extent.h>
+
+#include "Str.hpp"
+#include <inttypes.h>
+
+#define ECF_PROG 3141
+
+class ecf_dir : public extent<ecf_dir> {
+ protected:
+  bool sort() { return true; }
+  ecf_dir(const ecf_dir&);
+  ecf_dir operator=(const ecf_dir&);
+ public:
+  char *name_;
+  ecf_dir *next;
+
+  int mode;
+  int uid;
+  int gid;
+  int size;
+  int atime;
+  int mtime;
+  int ctime;
+
+ ecf_dir() : name_ (0x0), next (0x0) {}
+ virtual ~ecf_dir() {}
+
+  std::string name() const { return (name_); }
+};
+
+template<class T>
+bool ecf_list_add(T **list, T *kid)
+{
+  T **top = list; 
+  T  *run = *top;
+  if( !kid ) return false; kid->next = NULL;
+  if( run ) {
+    while( run->next ) run = run->next;
+    run->next = kid;
+  } else
+    *top = kid;
+  return true;
+};
+
+int ecf_nick_update(const std::string& name, 
+		    const std::string& machine, 
+		    int port);
+int ecf_nick_write();
+int ecf_nick_delete(const std::string& name);
+
+class ecf_list {
+ public:
+  int       type_;
+  char     *name_;  
+  ecf_list *next;
+
+  ecf_list(const char *text,
+	  ecf_list *n= 0x0) : name_(0x0), next (n) { name_ = strdup(text); }
+  virtual ~ecf_list() { if (name_) free(name_); }
+
+  std::string name() const { return name_; }
+ private:
+  ecf_list(ecf_list& );
+};
+
+class ecf_map {
+  std::string  name_;
+  std::string  machine_;
+  int          port_;
+
+public:
+  enum kind {GLOBAL, USER, NETWORK};
+  kind from;
+
+  ecf_map (const std::string n, const std::string m, int p, kind f)
+    : name_(n)
+    , machine_(m)
+    , port_(p)
+    , from(f)
+  {}
+
+  ~ecf_map() {}
+
+  std::string name() const { return name_; }
+  std::string machine() const { return machine_; }
+  int port() const { return port_; }
+
+  bool operator== (const std::string& n) const { return name_ == n; }
+
+  bool operator== (const ecf_map& l) const;
+
+  const std::string print() const;
+};
+
+int ecf_nick_load();
+ecf_list *ecf_node_create(char *text);
+int ecf_nick_origin(const std::string& name);
+
+#include <Suite.hpp>
+#include <Family.hpp>
+#include <Task.hpp>
+#include <ClientInvoker.hpp>
+#include <AbstractObserver.hpp>
+#include "NodeFwd.hpp"
+
+#include "ExprAst.hpp"
+#include "TimeAttr.hpp"
+#include "TodayAttr.hpp"
+#include "NodeAttr.hpp"
+#include "DateAttr.hpp"
+#include "DayAttr.hpp"
+#include "CronAttr.hpp"
+#include "LateAttr.hpp"
+#include "ZombieAttr.hpp"
+#include "RepeatAttr.hpp"
+#include "AutoCancelAttr.hpp"
+
+#include "Node.hpp"
+#include "Defs.hpp"
+
+typedef uint64_t uint64;
+#include <boost/algorithm/string.hpp>
+
+char    *ecf_string(char *str, char *file, int lineno);
+ecf_dir *ecf_file_dir(char *path, char *pattern, int fullname);
+
+#endif
+
+#ifndef ECF_NO_DUPLICATE
+#define SMS_PROG 314159
+
+#ifndef NODE_COMPLETE
+#define STR(x) ecf_string((x), __FILE__ , __LINE__ )
+
+#define STATUS_RESUME -1
+#define STATUS_UNKNOWN 0
+#define STATUS_SUSPENDED 1
+#define STATUS_COMPLETE 2
+#define STATUS_QUEUED 3
+#define STATUS_SUBMITTED 4
+#define STATUS_ACTIVE 5
+#define STATUS_ABORTED 6
+#define STATUS_USABLE 7
+#define STATUS_SHUTDOWN 7
+#define STATUS_HALTED 8
+#define STATUS_MAX 9
+
+#define FLAG_FORCE_ABORT 0
+#define FLAG_USER_EDIT 1
+#define FLAG_TASK_ABORTED 2
+#define FLAG_EDIT_FAILED 3
+#define FLAG_CMD_FAILED 4
+#define FLAG_NO_SCRIPT 5
+#define FLAG_KILLED 6
+#define FLAG_MIGRATED 7
+#define FLAG_LATE 8
+#define FLAG_MESSAGE 9
+#define FLAG_BYRULE 10
+#define FLAG_QUEUELIMIT 11
+#define FLAG_WAIT 12
+#define FLAG_LOCKED 13
+#define FLAG_ZOMBIE 14
+#define FLAG_TO_CHECK 15
+#define FLAG_MAX 16
+
+#define ZOMBIE_USER 1
+#define ZOMBIE_NET 2
+#define ZOMBIE_GET 0
+#define ZOMBIE_FOB 1
+#define ZOMBIE_DELETE 2
+#define ZOMBIE_FAIL 3
+#define ZOMBIE_RESCUE 4
+#define ZOMBIE_KILL 5
+
+#define ECF_E_NOTIN        26
+#define ECF_E_IN           27
+#define ECF_E_NONEWS       28      /* Not really an error */
+#define ECF_E_HOST         29
+
+#define NODE_LIST 0
+#define NODE_USER 1
+#define NODE_CONNECTION 2
+#define NODE_VARIABLE 3
+#define NODE_TIME 4
+#define NODE_DATE 5
+#define NODE_TRIGGER 6
+#define NODE_TREE 7
+#define NODE_COMPLETE 30
+#define NODE_EVENT 9
+#define NODE_TASK 10
+#define NODE_FAMILY 11
+#define NODE_SUITE 12
+#define NODE_SUPER 13
+#define NODE_REPEAT 22
+#define NODE_DIR    23
+#define NODE_METER 24
+#define NODE_LABEL 25
+#define NODE_LATE 28
+#define NODE_UNKNOWN 35
+#define NODE_ALIAS 32
+#define NODE_LIMIT 33
+#define NODE_INLIMIT 34
+#define NODE_UNKNOWN 35
+
+#define NODE_REPEAT_E 36
+#define NODE_REPEAT_S 37
+#define NODE_REPEAT_D 38
+#define NODE_REPEAT_I 39
+#define NODE_REPEAT_DAY 40
+
+#define NODE_MAX 41
+
+#define SUITES_LIST 3
+#define SUITES_MINE 4
+#define SUITES_REG  7
+
+#ifndef NIL
+#define NIL -1
+#endif
+
+#ifndef MIN
+#define MIN(a,b) ((a)<=(b)?(a):(b))
+#endif
+#endif /* do not overwrite sms.h */
+
+long ecf_repeat_julian_to_date(long jdate);
+long ecf_repeat_date_to_julian(long ddate);
+#endif /* ECF_NO_DUPLICATE */
+#endif /* ecf_H */
diff --git a/ecflow_4_0_7/view/src/ecflowview.cc b/ecflow_4_0_7/view/src/ecflowview.cc
new file mode 100644
index 0000000..1d2e50e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecflowview.cc
@@ -0,0 +1,165 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #30 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#define ecflowview_cc
+#include "ecflowview.h"
+
+#include "ecflow.h"
+#include "ecf_node.h"
+
+#include "edit.h"
+#include "edit_label.h"
+#include "edit_limit.h"
+#include "edit_meter.h"
+#include "edit_repeat.h"
+#include "edit_variable.h"
+#include "history.h"
+#include "info.h"
+#include "job.h"
+#include "jobcheck_panel.h"
+#include "jobstatus.h"
+#include "manual.h"
+#include "messages.h"
+#include "option_panel.h"
+#include "output.h"
+#include "script_panel.h"
+#include "suites_panel.h"
+#include "timetable_panel.h"
+#include "trigger_panel.h"
+#include "users.h"
+#include "variables.h"
+#include "why.h"
+#include "zombies_panel.h"
+
+#include "user_prefs.h"
+#include "fonts_prefs.h"
+#include "colors_prefs.h"
+#include "servers_prefs.h"
+#include "host_prefs.h"
+
+#include "simple_node.h"
+#include "date.h"
+#include "event_node.h"
+#include "inlimit_node.h"
+#include "label_node.h"
+#include "late_node.h"
+#include "limit_node.h"
+#include "meter_node.h"
+#include "node.h"
+#include "super_node.h"
+#include "task_node.h"
+#include "time_node.h"
+#include "trigger_node.h"
+#include "variable_node.h"
+/*
+void __cyg_profile_func_enter( void *, void * )
+  __attribute__ ((no_instrument_function));
+
+void __cyg_profile_func_enter(void *thisone, void *callsite) {
+  printf("E%p\n", (int*)thisone);
+}
+
+void __cyg_profile_func_exit(void *thisone, void *callsite) {
+  printf("X%p\n", (int*)thisone);
+}
+*/
+
+extern int xmain(int,char**); /* from uitop.cc */
+extern int wmain(int,char**);
+
+// In label_variable.cc
+static ecf_node_builder<Variable *, variable_node>  build_variable(NODE_VARIABLE);
+static ecf_node_builder<const Variable *, variable_node>  build_pkvariable(NODE_VARIABLE);
+// In label_node.cc
+static ecf_node_builder< const Label *, label_node>     build_plabel(NODE_LABEL);
+// In event_node.cc
+static ecf_node_builder< const Event *, event_node>     build_pevent(NODE_EVENT);
+// In meter_node.cc
+static ecf_node_builder< const Meter *, meter_node>     build_cmeter(NODE_METER);
+// In time_node.cc
+static ecf_node_builder<const ecf::TimeAttr *, time_node>     build_ctime(NODE_TIME);
+static ecf_node_builder<const ecf::TodayAttr *, time_node>     build_ctoday(NODE_TIME);
+// In date_node.cc
+static ecf_node_builder<const DateAttr *, date_node>     build_cdate(NODE_DATE);
+static ecf_node_builder<const DayAttr *, date_node>     build_cday(NODE_DATE);
+static ecf_node_builder<const ecf::CronAttr *, date_node>     build_ccron(NODE_DATE);
+// In limit_node.cc
+static ecf_node_builder<Limit * const, limit_node>     build_pklimit(NODE_LIMIT);
+static ecf_node_builder<const InLimit *, inlimit_node> build_cinlimit(NODE_INLIMIT);
+static ecf_node_builder<const ecf::LateAttr *, late_node>     build_clate(NODE_LATE);
+static ecf_node_builder<ecf::LateAttr *, late_node>     build_late(NODE_LATE);
+
+static ecf_node_builder<ExpressionWrapper*, trigger_node> build_trigger(NODE_TRIGGER);
+#include "repeat.h"
+
+static ecf_node_builder<const std::pair<std::string, std::string> *, variable_node> build_pkpvariable(NODE_VARIABLE);
+
+static ecf_node_builder<Suite*,suite_node>build_suite(NODE_SUITE);
+static ecf_node_builder<Defs*,super_node>build_topnode(NODE_SUPER);
+static ecf_node_builder<Node*,family_node>build_simple(NODE_FAMILY);
+static ecf_node_builder<Alias*,alias_node>build_alias(NODE_ALIAS);
+static ecf_node_builder<Task*, task_node> build_task(NODE_TASK);
+static ecf_node_builder<Family*,family_node>build_family(NODE_FAMILY);
+
+static ecf_node_builder<RepeatEnumerated*,repeat_enumerated_node> pprce(NODE_REPEAT_E);
+static ecf_node_builder<RepeatString*,repeat_string_node> prcs(NODE_REPEAT_S); 
+static ecf_node_builder<RepeatDate*,repeat_date_node> prcd(NODE_REPEAT_D);
+static ecf_node_builder<RepeatInteger*,repeat_integer_node> prci(NODE_REPEAT_I);
+static ecf_node_builder<RepeatDay*,repeat_day_node> prcday(NODE_REPEAT_DAY);
+
+static panel_maker<info> info_maker(PANEL_INFO);
+static panel_maker<manual> manual_maker(PANEL_MANUAL);
+static panel_maker<script_panel> script_maker(PANEL_SCRIPT);
+static panel_maker<job> job_maker(PANEL_JOB);
+static panel_maker<jobstatus> jobstatus_maker(PANEL_JOBSTATUS);
+static panel_maker<output> output_maker(PANEL_OUTPUT);
+static panel_maker<why> why_maker(PANEL_WHY);
+static panel_maker<trigger_panel> trigger_panel_maker(PANEL_TRIGGER);
+static panel_maker<jobcheck_panel> jobcheck_maker(PANEL_JOBCHECK);
+static panel_maker<timetable_panel> timetable_maker(PANEL_TIMETABLE);
+static panel_maker<variables> variables_maker(PANEL_VARIABLES);
+static panel_maker<edit> edit_maker(PANEL_EDIT_TASK);
+static panel_maker<edit_label> edit_label_maker(PANEL_EDIT_LABEL);
+static panel_maker<edit_limit> edit_limit_maker(PANEL_EDIT_LIMIT);
+static panel_maker<edit_variable> edit_variable_maker(PANEL_EDIT_VARIABLE);
+static panel_maker<edit_meter> edit_meter_maker(PANEL_EDIT_METER);
+static panel_maker<edit_repeat> edit_repeat_maker(PANEL_EDIT_REPEAT);
+static panel_maker<history> history_maker(PANEL_HISTORY);
+static panel_maker<messages> messages_maker(PANEL_MESSAGES);
+static panel_maker<suites_panel> suites_maker(PANEL_SUITES);
+static panel_maker<users> users_maker(PANEL_USERS);
+static panel_maker<zombies_panel> zombies_maker(PANEL_ZOMBIES);
+static panel_maker<option_panel> maker(PANEL_ECF_OPTIONS);
+
+static user_prefs    user_hp;
+static colors_prefs  colors_hp;
+static fonts_prefs   fonts_hp;
+static host_prefs    hosts_hp;
+
+#ifdef BRIDGE
+static repeat_node_maker repeat_node_maker_instance;
+late_node::late_node(host& h,sms_node* n, char b) : node(h,n,b), label_(0) {}
+#endif
+
+int main(int argc,char** argv)
+{
+  return getenv("ECFLOW_HTTP_PORT") ? wmain(argc,argv) : 
+    xmain(argc,argv);
+  ecf_nick_write();
+}
+
diff --git a/ecflow_4_0_7/view/src/ecflowview.h b/ecflow_4_0_7/view/src/ecflowview.h
new file mode 100644
index 0000000..5d42a6f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecflowview.h
@@ -0,0 +1,53 @@
+#ifndef ecflowview_h
+#define ecflowview_h
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #13 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#ifdef hpux
+// hpux X11 headers are wrong
+#undef bcopy
+#undef bzero
+#undef bcmp
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include "ecflow.h"
+
+#define NOTIMP throw "not_implemented"
+#define XECF_SNAP_ENABLED TRUE
+
+#ifdef BRIDGE 
+/* #define appName "XCdp - ecFlowview" */
+  #define appName "XCdp"
+#else
+#define appName "ecFlowview"
+#endif
+
+#define clientName "ecflow_client"
+#define snapshotName "${TMPDIR:=/tmp}/ecflowview$USER.png"
+#define browserName "${BROWSER:firefox --new-tab}"
+#define urlRef "http://software.ecmwf.int/issues/browse/ECFLOW"
+#define tmpName   "ecFlowvw" /* 8 char */
+
+#if 1 // DEBUG
+#define XECFDEBUG if(getenv("XECFLOW_DEBUG"))
+#else
+#define XECFDEBUG if (0)
+#endif
+#endif
diff --git a/ecflow_4_0_7/view/src/ecflowview.menu b/ecflow_4_0_7/view/src/ecflowview.menu
new file mode 100644
index 0000000..b2a1d1d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecflowview.menu
@@ -0,0 +1,313 @@
+!===========================================================
+! Name        : 
+! Author      : 
+! Revision    : $Revision: #26 $ 
+!
+! Copyright 2009-2012 ECMWF. 
+! This software is licensed under the terms of the Apache Licence version 2.0 
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+! In applying this licence, ECMWF does not waive the privileges and immunities 
+! granted to it by virtue of its status as an intergovernmental organisation 
+! nor does it submit to any jurisdiction. 
+!
+! Description : 
+! this file may be found in 
+! - ecflowview sources in order to generate  ecflowview.menu.h
+! - ~/.ecflowrc/ecflowview.menu # edit backup remove (reset)
+! - ~/ is preferred to $HOME
+! - menus can call ecflow client command (start with 'ecflow_client')
+! - menus can call system command (start with sh)
+!===========================================================
+!
+! Format
+!-------
+! menu TITLE 
+! {
+!	(vis flg,enable flg,title,command,question,answer)
+! }
+!
+!===========================================================
+!
+! Values for the status flags
+!----------------------------
+!
+!NONE ALL UNKNOWN SUSPENDED COMPLETE QUEUED SUBMITTED ACTIVE
+!ABORTED CLEAR SET SHUTDOWN HALTED
+!
+! Values for type flags
+!----------------------
+!
+!NONE ALL SERVER SUITE FAMILY TASK EVENT
+!
+! Values for visible flags
+!-------------------------
+!
+!NONE ALL SERVER SUITE FAMILY TASK EVENT
+!
+! Values for special flags
+!-------------------------
+! 
+!NONE ALL  HAS_TRIGGERS HAS_TIME HAS_DATE
+!
+!===========================================================
+
+!==============================================================================
+! Main menu
+!==============================================================================
+
+version 1 0 0 ;
+
+menu 'MAIN'
+{
+  (~SUSPENDED & NODE, ALL, 'Suspend',  'ecflow_client --suspend  <full_name>')
+  (SUSPENDED & NODE,  ALL, 'Resume',   'ecflow_client --resume <full_name>')
+
+  ( TASK, ~ACTIVE & ~SUBMITTED, 'Rerun', 'ecflow_client --force queued <full_name>')
+
+  (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set complete', 
+    'ecflow_client --force complete <full_name>',
+    'Have you checked that the job is not active anymore (jobstatus) ?', YES)
+  (TASK|ALIAS, UNKNOWN|QUEUED|ABORTED, 'Set complete', 
+    'ecflow_client --force complete <full_name>')
+  (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set aborted', 
+    'ecflow_client --force aborted <full_name>',
+    'Have you checked that the job is not active anymore (jobstatus) ?', YES)
+  (TASK|ALIAS, UNKNOWN|QUEUED|COMPLETE, 'Set aborted', 
+     'ecflow_client --force aborted <full_name>')
+
+  (TASK|ALIAS, ~ACTIVE & ~SUBMITTED, 'Execute', 'ecflow_client --run <full_name>')
+
+  (SUITE|TASK|FAMILY, ~ACTIVE & ~SUBMITTED, 'Requeue',
+     'ecflow_client --requeue force <full_name>', 
+     'Confirm requeuing of <full_name>', YES)
+
+  (SUITE|FAMILY, ABORTED | SUSPENDED, 'Requeue aborted',
+    'ecflow_client --requeue abort <full_name>', 
+    'Confirm requeuing of aborted tasks from <full_name>', YES)
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (SUITE|TASK|FAMILY,(QUEUED|SUSPENDED|ACTIVE) & (HAS_TRIGGERS|HAS_TIME|HAS_DATE),'Delete',MENU)
+  (NODE | ALIAS, ALL, 'Special', MENU)
+  (NODE | ALIAS, ALL, 'Defstatus', MENU)
+  (NODE & ADMIN, ALL, 'Force',   MENU)
+  ((NODE|ALIAS)& ADMIN, ALL,'Order', MENU)
+
+  (ALL,ALL,'-',SEPARATOR ,'',YES)
+  (SUITE|FAMILY|TASK, ALL, 'Web...', 'ecflow_client --url <full_name> ', '', YES)
+  (TASK, ALL, 'Web', MENU)
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (SUITE & (OPER|ADMIN) ,UNKNOWN|COMPLETE,'Begin',
+        'ecflow_client --begin <node_name>','',YES)
+
+  (SUITE & (OPER|ADMIN) ,~SUBMITTED & ~ACTIVE,'Cancel',
+        'ecflow_client --delete yes <full_name>',
+        'Do you really want to cancel suite <full_name> ?',NO)
+
+! Events
+!---------------------------------
+
+  (EVENT, CLEAR,     'Set'  ,    
+    'ecflow_client --alter change event <node_name> set <parent_name>',   '',YES)
+  (EVENT, SET,       'Clear',    
+    'ecflow_client --alter change event <node_name> clear <parent_name>', '',YES)
+
+!!-----------------------------------
+
+  (SERVER & (ADMIN|OPER) & LOCKED , ALL , 'Unlock', 'unlock -y',
+        'Before going further, please check why the server was locked.',NO)
+	(ALL,ALL,'-',SEPARATOR,'',YES)
+
+!!-----------------------------------
+
+  (SERVER,SHUTDOWN|HALTED, 'Restart',  
+    'ecflow_client --restart yes','Restart the server in <node_name>?' ,NO)
+  (SERVER,~SHUTDOWN,       'Shutdown', 
+    'ecflow_client --shutdown yes','Shutdown the server in <node_name>?',NO)
+  (SERVER,~HALTED,         'Halt',     
+    'ecflow_client --halt yes','Halt the server in <node_name>?',NO)
+  (SERVER,HALTED|UNKNOWN,          'Terminate',
+    'ecflow_client --terminate yes','Terminate the server in <node_name>?',NO)
+  (ALL,ALL,'-',SEPARATOR,'',YES)
+  (SERVER,ALL,             'Checkpoint','ecflow_client --check_pt','',YES)
+  (SERVER,HALTED,          'Recover',   
+    'ecflow_client --restore_from_checkpt','Recover the server in <node_name>?',NO)
+
+!!-----------------------------------
+
+  (LIMIT , ALL, 'Reset' , 
+      'ecflow_client --alter change limit_value <node_name> 0 <parent_name>', 
+      'Confirm resetting <full_name>', YES)
+  (ALIAS , ALL, 'Remove', 'ecflow_client --delete yes <full_name>', 
+    'Confirm remove alias <full_name>', YES)
+
+!!-----------------------------------
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (TASK|LIMIT|LABEL|METER|REPEAT|VARIABLE, ALL , 'Edit...', WINDOW(Edit))
+  (TASK|ALIAS, ALL , 'Output...', WINDOW(Output) )
+
+  (TASK|ALIAS, SUBMITTED|ACTIVE , 'Status...',   WINDOW(Jobstatus))
+  (ALIAS, ALL , 'Job...', WINDOW(Job) )
+  (TASK|ALIAS, ALL , 'Script...', WINDOW(Script) )
+
+  (SERVER, ALL ,  'Suites...',   WINDOW(Suites)   )
+  (SERVER, ALL ,  'History...',  WINDOW(History)  )
+  (SERVER, ALL ,  'Zombies...',  WINDOW(Zombies)  )
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER, ALL ,  'Options...',  WINDOW(Options)  )
+  (SERVER, ALL ,  'Extra',  MENU  )
+}
+
+menu 'Web' 
+{
+  (TASK, ALL, 'Man', 'sh firefox %ECF_URL_BASE%/%ECF_URL%', '', YES)
+  (TASK, ALL, 'Script', 'sh xterm -T Script -e vim %ECF_SCRIPT%', '', YES)
+  (TASK, ALL, 'Job', 'sh xterm -T Job -e vim %ECF_JOB%', '', YES)
+  (TASK, ALL, 'Output', 'sh xterm -T Output -e vim %ECF_JOBOUT%', '', YES)
+  (TASK, ALL , 'TimeLine...', WINDOW(Timeline))
+  ! request from Lidström Jonas https://software.ecmwf.int/issues/browse/SUP-829
+  (TASK, ALL,  'Details', 'sh  xterm -T Details-%ECF_NAME% -e "grep %ECF_NAME% %ECF_LOG% ; read"') 
+}
+
+!==============================================================================
+! Status submenu
+!==============================================================================
+
+menu 'Status'
+{
+  (SUITE|TASK|FAMILY, ~SUSPENDED,'Suspend', 'ecflow_client --suspend <full_name>', '',YES)
+  (SUITE|TASK|FAMILY, SUSPENDED ,'Resume',  'ecflow_client --resume <full_name>',  '',YES)
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (TASK, ~ACTIVE & ~SUBMITTED,   'Rerun',   'ecflow_client --force queued <full_name>',   '',YES)
+  (TASK, ~COMPLETE, 'Set complete', 'ecflow_client --force complete <full_name>', '',YES)
+
+  (SUITE|TASK|FAMILY|ALIAS, ~ACTIVE & ~SUBMITTED,
+	 'Requeue','ecflow_client --requeue force <full_name>', 'Confirm requeuing of <full_name>', YES)
+
+  (SUITE|FAMILY, ABORTED | SUSPENDED,
+	'Requeue aborted','ecflow_client --requeue abort <full_name>', 
+	'Confirm requeuing aborted tasks below <full_name>', YES)
+}
+
+!==============================================================================
+! Suite submenu
+!==============================================================================
+
+menu 'Suite'
+{
+  (SUITE,UNKNOWN|COMPLETE,'Begin','ecflow_client --begin <node_name>','',YES)
+
+  (SUITE,ALL,'Cancel','ecflow_client --delete yes <full_name>',
+    'Do you really want to cancel <full_name> ?',NO)
+
+  (ALL,ALL,'-',SEPARATOR)
+}
+
+!==============================================================================
+! Delete submenu
+!==============================================================================
+
+menu 'Delete'
+{
+	(ALL,HAS_TRIGGERS|HAS_TIME|HAS_DATE, 'All dependencies','ecflow_client --free-dep all <full_name>')
+	(ALL,HAS_TRIGGERS, 'Trigger dependencies','ecflow_client --free-dep trigger <full_name>')
+	(ALL,HAS_TIME, 'Time dependencies','ecflow_client --free-dep time <full_name>')
+	(ALL,QUEUED,   'Date dependencies','ecflow_client --free-dep date <full_name>')
+}
+
+menu "Order"
+{
+  (ALL,ALL,'Top','ecflow_client --order <full_name> top')
+  (ALL,ALL,'Up','ecflow_client --order <full_name> up')
+  (ALL,ALL,'Down','ecflow_client --order <full_name> down')
+  (ALL,ALL,'Bottom','ecflow_client --order <full_name> bottom')
+  (ALL,ALL,'Alphabetically','ecflow_client --order <full_name> alpha')
+}
+
+menu "Force"
+{
+  (NODE, ~UNKNOWN, 'Unknown',   'ecflow_client --force unknown recursive <full_name>')
+  (NODE, ~COMPLETE & ~ACTIVE & ~SUBMITTED, 'Complete', 
+   'ecflow_client --force complete recursive <full_name>', 
+   'Check running/queued jobs and Confirm force complete of <full_name>', YES)
+  (NODE, ~QUEUED & ~ACTIVE & ~SUBMITTED,   'Queued',   
+   'ecflow_client --force queued recursive <full_name>')
+  (NODE, ~SUBMITTED & ~ACTIVE,'Submitted',
+   'ecflow_client --force submitted recursive <full_name>')
+  (NODE, ~ACTIVE,   'Active',   'ecflow_client --force active recursive <full_name>')
+  (NODE, ~ABORTED,  'Aborted',  'ecflow_client --force aborted recursive <full_name>', 
+   'Check running/queued jobs and Confirm force submitted of <full_name>', YES)
+}
+
+menu "Defstatus"
+{ 
+(NODE, ALL, 'Complete', 'ecflow_client --alter change defstatus complete <full_name>')
+(NODE, ALL, 'Queued', 'ecflow_client --alter change defstatus queued <full_name>')
+}
+
+menu "Special"
+{
+  (SUITE|FAMILY,(ACTIVE|SUBMITTED|ABORTED),'Kill', 'ecflow_client --kill <full_name>','',YES)
+  (TASK|ALIAS,(ACTIVE|SUBMITTED),'Kill','ecflow_client --kill <full_name>','',YES)
+  (ALL,ALL,'Check',WINDOW(Check),'',YES)
+  (TASK|ALIAS,ALL,'Free password','ecflow_client --alter add variable ECF_PASS FREE <full_name>')
+  (TASK|ALIAS,ALL,'ClearZ','ecflow_client --alter clear_flag zombie <full_name>')
+  (TASK|ALIAS,ALL,'ClearLate','ecflow_client --alter clear_flag late <full_name>')
+
+  (FAMILY, ~ACTIVE & ~SUBMITTED, 'Execute', 'ecflow_client --run <full_name>')
+  ((SUITE|FAMILY|TASK), SELECTION, 'Plug into selected node', PLUG)
+  (FAMILY|TASK,ALL,'get','ecflow_client --get <full_name>')
+  (TASK,ALL,'status','ecflow_client --status <full_name>')
+  (SUITE|SERVER, ALL, 'Collect...',  WINDOW(Collector))
+  (SUITE|FAMILY, ALL, 'Walk', 'ecflow_client --force-dep-eval <full_name>')
+}
+
+menu "Extra"
+{
+  (SERVER|SUITE,ALL,'Windows', MENU)
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER,ALL,'ClearLate','ecflow_client --alter clear_flag late <full_name>')
+  ! (SERVER|SUITE,ALL,'tail log', 'sh /usr/bin/xterm -e rsh %ECF_NODE% tail -f %ECF_HOME%/%ECF_LOG%&')
+(SERVER|SUITE,ALL,'tail log', 'sh /usr/bin/xterm -e tail -f /tmp/$USER/$HOST*.ecf.log&')
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER|SUITE,ALL,'overwrite', 'write menu')
+  (SERVER|SUITE,ALL,'edit menu', 'sh /usr/bin/xterm -e vi ~/.ecflowrc/ecflowview.menu')
+  (SERVER|SUITE,ALL,'bkup menu', 'sh /bin/cp ~/.ecflowrc/ecflowview.menu ~/.ecflowrc/ecflowview.menu.bak')
+  (SERVER|SUITE,ALL,'rm   menu', 'sh /bin/rm ~/.ecflowrc/ecflowview.menu')
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER|SUITE,ALL,'debug on', 'ecflow_client --debug_server_on')
+  (SERVER|SUITE,ALL,'debug off','ecflow_client --debug_server_off')
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER|SUITE,ALL,'stats','ecflow_client --stats')
+  (SERVER|SUITE,ALL,'suites','ecflow_client --suites')
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER|SUITE,ALL,'log get','ecflow_client --log get')
+  (SERVER|SUITE,ALL,'log clear','ecflow_client --log clear')
+  (SERVER|SUITE,ALL,'log new','ecflow_client --log new')
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER|SUITE,ALL,'svr load','ecflow_client --server_load')
+  (SERVER|SUITE,ALL,'svr load local','ecflow_client --server_load %ECF_HOME%/%ECF_LOG%')
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER|SUITE,ALL,'client logging on','ecflow_client --enable_logging')
+  (SERVER|SUITE,ALL,'client loggging off','ecflow_client --disable_logging')
+}
+
+menu "Windows"
+{
+  (SERVER, ALL , 'Info...',      WINDOW(Info))
+  (SERVER, ALL , 'Man...',       WINDOW(Manual))
+  (SERVER, ALL , 'Var...',       WINDOW(Variables))
+  (SERVER, ALL , 'Msg...',       WINDOW(Messages))
+  (SERVER, ALL , 'Why...',       WINDOW(Why))
+  (SERVER, ALL , 'Triggers...',  WINDOW(Triggers))
+  (SERVER, ALL , 'Check...',     WINDOW(Check))
+  (SERVER, ALL , 'Jobstatus...', WINDOW(Jobstatus))
+  (SERVER, ALL , 'TimeLine...',  WINDOW(Timeline))
+}
+
diff --git a/ecflow_4_0_7/view/src/ecflowview.menu.h b/ecflow_4_0_7/view/src/ecflowview.menu.h
new file mode 100644
index 0000000..5c9992c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/ecflowview.menu.h
@@ -0,0 +1,317 @@
+(char*) " !=========================================================== ",
+(char*) " ! Name : ",
+(char*) " ! Author : ",
+(char*) " ! Revision : $Revision: #26 $ ",
+(char*) " ! ",
+(char*) " ! Copyright 2009-2012 ECMWF. ",
+(char*) " ! This software is licensed under the terms of the Apache Licence version 2.0 ",
+(char*) " ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. ",
+(char*) " ! In applying this licence, ECMWF does not waive the privileges and immunities ",
+(char*) " ! granted to it by virtue of its status as an intergovernmental organisation ",
+(char*) " ! nor does it submit to any jurisdiction. ",
+(char*) " ! ",
+(char*) " ! Description : ",
+(char*) " ! this file may be found in ",
+(char*) " ! - ecflowview sources in order to generate ecflowview.menu.h ",
+(char*) " ! - ~/.ecflowrc/ecflowview.menu # edit backup remove (reset) ",
+(char*) " ! - ~/ is preferred to $HOME ",
+(char*) " ! - menus can call ecflow client command (start with 'ecflow_client') ",
+(char*) " ! - menus can call system command (start with sh) ",
+(char*) " !=========================================================== ",
+(char*) " ! ",
+(char*) " ! Format ",
+(char*) " !------- ",
+(char*) " ! menu TITLE ",
+(char*) " ! { ",
+(char*) " ! (vis flg,enable flg,title,command,question,answer) ",
+(char*) " ! } ",
+(char*) " ! ",
+(char*) " !=========================================================== ",
+(char*) " ! ",
+(char*) " ! Values for the status flags ",
+(char*) " !---------------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL UNKNOWN SUSPENDED COMPLETE QUEUED SUBMITTED ACTIVE ",
+(char*) " !ABORTED CLEAR SET SHUTDOWN HALTED ",
+(char*) " ! ",
+(char*) " ! Values for type flags ",
+(char*) " !---------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL SERVER SUITE FAMILY TASK EVENT ",
+(char*) " ! ",
+(char*) " ! Values for visible flags ",
+(char*) " !------------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL SERVER SUITE FAMILY TASK EVENT ",
+(char*) " ! ",
+(char*) " ! Values for special flags ",
+(char*) " !------------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL HAS_TRIGGERS HAS_TIME HAS_DATE ",
+(char*) " ! ",
+(char*) " !=========================================================== ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Main menu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " version 1 0 0 ; ",
+(char*) "  ",
+(char*) " menu 'MAIN' ",
+(char*) " { ",
+(char*) " (~SUSPENDED & NODE, ALL, 'Suspend', 'ecflow_client --suspend <full_name>') ",
+(char*) " (SUSPENDED & NODE, ALL, 'Resume', 'ecflow_client --resume <full_name>') ",
+(char*) "  ",
+(char*) " ( TASK, ~ACTIVE & ~SUBMITTED, 'Rerun', 'ecflow_client --force queued <full_name>') ",
+(char*) "  ",
+(char*) " (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set complete', ",
+(char*) " 'ecflow_client --force complete <full_name>', ",
+(char*) " 'Have you checked that the job is not active anymore (jobstatus) ?', YES) ",
+(char*) " (TASK|ALIAS, UNKNOWN|QUEUED|ABORTED, 'Set complete', ",
+(char*) " 'ecflow_client --force complete <full_name>') ",
+(char*) " (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set aborted', ",
+(char*) " 'ecflow_client --force aborted <full_name>', ",
+(char*) " 'Have you checked that the job is not active anymore (jobstatus) ?', YES) ",
+(char*) " (TASK|ALIAS, UNKNOWN|QUEUED|COMPLETE, 'Set aborted', ",
+(char*) " 'ecflow_client --force aborted <full_name>') ",
+(char*) "  ",
+(char*) " (TASK|ALIAS, ~ACTIVE & ~SUBMITTED, 'Execute', 'ecflow_client --run <full_name>') ",
+(char*) "  ",
+(char*) " (SUITE|TASK|FAMILY, ~ACTIVE & ~SUBMITTED, 'Requeue', ",
+(char*) " 'ecflow_client --requeue force <full_name>', ",
+(char*) " 'Confirm requeuing of <full_name>', YES) ",
+(char*) "  ",
+(char*) " (SUITE|FAMILY, ABORTED | SUSPENDED, 'Requeue aborted', ",
+(char*) " 'ecflow_client --requeue abort <full_name>', ",
+(char*) " 'Confirm requeuing of aborted tasks from <full_name>', YES) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (SUITE|TASK|FAMILY,(QUEUED|SUSPENDED|ACTIVE) & (HAS_TRIGGERS|HAS_TIME|HAS_DATE),'Delete',MENU) ",
+(char*) " (NODE | ALIAS, ALL, 'Special', MENU) ",
+(char*) " (NODE | ALIAS, ALL, 'Defstatus', MENU) ",
+(char*) " (NODE & ADMIN, ALL, 'Force', MENU) ",
+(char*) " ((NODE|ALIAS)& ADMIN, ALL,'Order', MENU) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR ,'',YES) ",
+(char*) " (SUITE|FAMILY|TASK, ALL, 'Web...', 'ecflow_client --url <full_name> ', '', YES) ",
+(char*) " (TASK, ALL, 'Web', MENU) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (SUITE & (OPER|ADMIN) ,UNKNOWN|COMPLETE,'Begin', ",
+(char*) " 'ecflow_client --begin <node_name>','',YES) ",
+(char*) "  ",
+(char*) " (SUITE & (OPER|ADMIN) ,~SUBMITTED & ~ACTIVE,'Cancel', ",
+(char*) " 'ecflow_client --delete yes <full_name>', ",
+(char*) " 'Do you really want to cancel suite <full_name> ?',NO) ",
+(char*) "  ",
+(char*) " ! Events ",
+(char*) " !--------------------------------- ",
+(char*) "  ",
+(char*) " (EVENT, CLEAR, 'Set' , ",
+(char*) " 'ecflow_client --alter change event <node_name> set <parent_name>', '',YES) ",
+(char*) " (EVENT, SET, 'Clear', ",
+(char*) " 'ecflow_client --alter change event <node_name> clear <parent_name>', '',YES) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (SERVER & (ADMIN|OPER) & LOCKED , ALL , 'Unlock', 'unlock -y', ",
+(char*) " 'Before going further, please check why the server was locked.',NO) ",
+(char*) " (ALL,ALL,'-',SEPARATOR,'',YES) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (SERVER,SHUTDOWN|HALTED, 'Restart', ",
+(char*) " 'ecflow_client --restart yes','Restart the server in <node_name>?' ,NO) ",
+(char*) " (SERVER,~SHUTDOWN, 'Shutdown', ",
+(char*) " 'ecflow_client --shutdown yes','Shutdown the server in <node_name>?',NO) ",
+(char*) " (SERVER,~HALTED, 'Halt', ",
+(char*) " 'ecflow_client --halt yes','Halt the server in <node_name>?',NO) ",
+(char*) " (SERVER,HALTED, 'Terminate', ",
+(char*) " 'ecflow_client --terminate yes','Terminate the server in <node_name>?',NO) ",
+(char*) " (ALL,ALL,'-',SEPARATOR,'',YES) ",
+(char*) " (SERVER,ALL, 'Checkpoint','ecflow_client --check_pt','',YES) ",
+(char*) " (SERVER,HALTED, 'Recover', ",
+(char*) " 'ecflow_client --restore_from_checkpt','Recover the server in <node_name>?',NO) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (LIMIT , ALL, 'Reset' , ",
+(char*) " 'ecflow_client --alter change limit_value <node_name> 0 <parent_name>', ",
+(char*) " 'Confirm resetting <full_name>', YES) ",
+(char*) " (ALIAS , ALL, 'Remove', 'ecflow_client --delete yes <full_name>', ",
+(char*) " 'Confirm remove alias <full_name>', YES) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (TASK|LIMIT|LABEL|METER|REPEAT|VARIABLE, ALL , 'Edit...', WINDOW(Edit)) ",
+(char*) " (TASK|ALIAS, ALL , 'Output...', WINDOW(Output) ) ",
+(char*) "  ",
+(char*) " (TASK|ALIAS, SUBMITTED|ACTIVE , 'Status...', WINDOW(Jobstatus)) ",
+(char*) " (ALIAS, ALL , 'Job...', WINDOW(Job) ) ",
+(char*) " (TASK|ALIAS, ALL , 'Script...', WINDOW(Script) ) ",
+(char*) "  ",
+(char*) " (SERVER, ALL , 'Suites...', WINDOW(Suites) ) ",
+(char*) " (SERVER, ALL , 'History...', WINDOW(History) ) ",
+(char*) " (SERVER, ALL , 'Zombies...', WINDOW(Zombies) ) ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER, ALL , 'Options...', WINDOW(Options) ) ",
+(char*) " (SERVER, ALL , 'Extra', MENU ) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu 'Web' ",
+(char*) " { ",
+(char*) " (TASK, ALL, 'Man', 'sh firefox %ECF_URL_BASE%/%ECF_URL%', '', YES) ",
+(char*) " (TASK, ALL, 'Script', 'sh xterm -T Script -e vim %ECF_SCRIPT%', '', YES) ",
+(char*) " (TASK, ALL, 'Job', 'sh xterm -T Job -e vim %ECF_JOB%', '', YES) ",
+(char*) " (TASK, ALL, 'Output', 'sh xterm -T Output -e vim %ECF_JOBOUT%', '', YES) ",
+(char*) " (TASK, ALL , 'TimeLine...', WINDOW(Timeline)) ",
+(char*) " ! request from Lidström Jonas https://software.ecmwf.int/issues/browse/SUP-829 ",
+(char*) " (TASK, ALL, 'Details', 'sh xterm -T Details-%ECF_NAME% -e \"grep %ECF_NAME% %ECF_LOG% ; read\"') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Status submenu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " menu 'Status' ",
+(char*) " { ",
+(char*) " (SUITE|TASK|FAMILY, ~SUSPENDED,'Suspend', 'ecflow_client --suspend <full_name>', '',YES) ",
+(char*) " (SUITE|TASK|FAMILY, SUSPENDED ,'Resume', 'ecflow_client --resume <full_name>', '',YES) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (TASK, ~ACTIVE & ~SUBMITTED, 'Rerun', 'ecflow_client --force queued <full_name>', '',YES) ",
+(char*) " (TASK, ~COMPLETE, 'Set complete', 'ecflow_client --force complete <full_name>', '',YES) ",
+(char*) "  ",
+(char*) " (SUITE|TASK|FAMILY|ALIAS, ~ACTIVE & ~SUBMITTED, ",
+(char*) " 'Requeue','ecflow_client --requeue force <full_name>', 'Confirm requeuing of <full_name>', YES) ",
+(char*) "  ",
+(char*) " (SUITE|FAMILY, ABORTED | SUSPENDED, ",
+(char*) " 'Requeue aborted','ecflow_client --requeue abort <full_name>', ",
+(char*) " 'Confirm requeuing aborted tasks below <full_name>', YES) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Suite submenu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " menu 'Suite' ",
+(char*) " { ",
+(char*) " (SUITE,UNKNOWN|COMPLETE,'Begin','ecflow_client --begin <node_name>','',YES) ",
+(char*) "  ",
+(char*) " (SUITE,ALL,'Cancel','ecflow_client --delete yes <full_name>', ",
+(char*) " 'Do you really want to cancel <full_name> ?',NO) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Delete submenu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " menu 'Delete' ",
+(char*) " { ",
+(char*) " (ALL,HAS_TRIGGERS|HAS_TIME|HAS_DATE, 'All dependencies','ecflow_client --free-dep all <full_name>') ",
+(char*) " (ALL,HAS_TRIGGERS, 'Trigger dependencies','ecflow_client --free-dep trigger <full_name>') ",
+(char*) " (ALL,HAS_TIME, 'Time dependencies','ecflow_client --free-dep time <full_name>') ",
+(char*) " (ALL,QUEUED, 'Date dependencies','ecflow_client --free-dep date <full_name>') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Order\" ",
+(char*) " { ",
+(char*) " (ALL,ALL,'Top','ecflow_client --order <full_name> top') ",
+(char*) " (ALL,ALL,'Up','ecflow_client --order <full_name> up') ",
+(char*) " (ALL,ALL,'Down','ecflow_client --order <full_name> down') ",
+(char*) " (ALL,ALL,'Bottom','ecflow_client --order <full_name> bottom') ",
+(char*) " (ALL,ALL,'Alphabetically','ecflow_client --order <full_name> alpha') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Force\" ",
+(char*) " { ",
+(char*) " (NODE, ~UNKNOWN, 'Unknown', 'ecflow_client --force unknown recursive <full_name>') ",
+(char*) " (NODE, ~COMPLETE & ~ACTIVE & ~SUBMITTED, 'Complete', ",
+(char*) " 'ecflow_client --force complete recursive <full_name>', ",
+(char*) " 'Check running/queued jobs and Confirm force complete of <full_name>', YES) ",
+(char*) " (NODE, ~QUEUED & ~ACTIVE & ~SUBMITTED, 'Queued', ",
+(char*) " 'ecflow_client --force queued recursive <full_name>') ",
+(char*) " (NODE, ~SUBMITTED & ~ACTIVE,'Submitted', ",
+(char*) " 'ecflow_client --force submitted recursive <full_name>') ",
+(char*) " (NODE, ~ACTIVE, 'Active', 'ecflow_client --force active recursive <full_name>') ",
+(char*) " (NODE, ~ABORTED, 'Aborted', 'ecflow_client --force aborted recursive <full_name>', ",
+(char*) " 'Check running/queued jobs and Confirm force submitted of <full_name>', YES) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Defstatus\" ",
+(char*) " { ",
+(char*) " (NODE, ALL, 'Complete', 'ecflow_client --alter change defstatus complete <full_name>') ",
+(char*) " (NODE, ALL, 'Queued', 'ecflow_client --alter change defstatus queued <full_name>') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Special\" ",
+(char*) " { ",
+(char*) " (SUITE|FAMILY,(ACTIVE|SUBMITTED|ABORTED),'Kill', 'ecflow_client --kill <full_name>','',YES) ",
+(char*) " (TASK|ALIAS,(ACTIVE|SUBMITTED),'Kill','ecflow_client --kill <full_name>','',YES) ",
+(char*) " (ALL,ALL,'Check',WINDOW(Check),'',YES) ",
+(char*) " (TASK|ALIAS,ALL,'Free password','ecflow_client --alter add variable ECF_PASS FREE <full_name>') ",
+(char*) " (TASK|ALIAS,ALL,'ClearZ','ecflow_client --alter clear_flag zombie <full_name>') ",
+(char*) " (TASK|ALIAS,ALL,'ClearLate','ecflow_client --alter clear_flag late <full_name>') ",
+(char*) "  ",
+(char*) " (FAMILY, ~ACTIVE & ~SUBMITTED, 'Execute', 'ecflow_client --run <full_name>') ",
+(char*) " ((SUITE|FAMILY|TASK), SELECTION, 'Plug into selected node', PLUG) ",
+(char*) " (TASK|ALIAS, SELECTION, 'Compare Edit (vs selected)', COMP( 'compare' , 'edit' )) ",
+(char*) " (TASK|ALIAS, SELECTION, 'Compare EditPP (vs selected)', COMP( 'compare' , 'editpp')) ",
+(char*) " (TASK|ALIAS, SELECTION, 'Compare output (vs selected)', COMP('compare' , 'output')) ",
+(char*) " (FAMILY|TASK,ALL,'get','ecflow_client --get <full_name>') ",
+(char*) " (TASK,ALL,'status','ecflow_client --status <full_name>') ",
+(char*) " (SUITE|SERVER, ALL, 'Collect...', WINDOW(Collector)) ",
+(char*) " (SUITE|FAMILY, ALL, 'Walk', 'ecflow_client --force-dep-eval <full_name>') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Extra\" ",
+(char*) " { ",
+(char*) " (SERVER|SUITE,ALL,'Windows', MENU) ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER,ALL,'ClearLate','ecflow_client --alter clear_flag late <full_name>') ",
+(char*) " ! (SERVER|SUITE,ALL,'tail log', 'sh /usr/bin/xterm -e rsh %ECF_NODE% tail -f %ECF_HOME%/%ECF_LOG%&') ",
+(char*) " (SERVER|SUITE,ALL,'tail log', 'sh /usr/bin/xterm -e tail -f /tmp/$USER/$HOST*.ecf.log&') ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER|SUITE,ALL,'overwrite', 'write menu') ",
+(char*) " (SERVER|SUITE,ALL,'edit menu', 'sh /usr/bin/xterm -e vi ~/.ecflowrc/ecflowview.menu') ",
+(char*) " (SERVER|SUITE,ALL,'bkup menu', 'sh /bin/cp ~/.ecflowrc/ecflowview.menu ~/.ecflowrc/ecflowview.menu.bak') ",
+(char*) " (SERVER|SUITE,ALL,'rm menu', 'sh /bin/rm ~/.ecflowrc/ecflowview.menu') ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER|SUITE,ALL,'debug on', 'ecflow_client --debug_server_on') ",
+(char*) " (SERVER|SUITE,ALL,'debug off','ecflow_client --debug_server_off') ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER|SUITE,ALL,'stats','ecflow_client --stats') ",
+(char*) " (SERVER|SUITE,ALL,'suites','ecflow_client --suites') ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER|SUITE,ALL,'log get','ecflow_client --log get') ",
+(char*) " (SERVER|SUITE,ALL,'log clear','ecflow_client --log clear') ",
+(char*) " (SERVER|SUITE,ALL,'log new','ecflow_client --log new') ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER|SUITE,ALL,'svr load','ecflow_client --server_load') ",
+(char*) " (SERVER|SUITE,ALL,'svr load local','ecflow_client --server_load %ECF_HOME%/%ECF_LOG%') ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER|SUITE,ALL,'client logging on','ecflow_client --enable_logging') ",
+(char*) " (SERVER|SUITE,ALL,'client loggging off','ecflow_client --disable_logging') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Windows\" ",
+(char*) " { ",
+(char*) " (SERVER, ALL , 'Info...', WINDOW(Info)) ",
+(char*) " (SERVER, ALL , 'Man...', WINDOW(Manual)) ",
+(char*) " (SERVER, ALL , 'Var...', WINDOW(Variables)) ",
+(char*) " (SERVER, ALL , 'Msg...', WINDOW(Messages)) ",
+(char*) " (SERVER, ALL , 'Why...', WINDOW(Why)) ",
+(char*) " (SERVER, ALL , 'Triggers...', WINDOW(Triggers)) ",
+(char*) " (SERVER, ALL , 'Check...', WINDOW(Check)) ",
+(char*) " (SERVER, ALL , 'Jobstatus...', WINDOW(Jobstatus)) ",
+(char*) " (SERVER, ALL , 'TimeLine...', WINDOW(Timeline)) ",
+(char*) " } ",
+(char*) "  ",
+NULL
diff --git a/ecflow_4_0_7/view/src/edit.cc b/ecflow_4_0_7/view/src/edit.cc
new file mode 100644
index 0000000..350a61c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit.cc
@@ -0,0 +1,264 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <unistd.h>
+#include "host.h"
+#include "edit.h"
+#include "node.h"
+#include "globals.h"
+#include "input.h"
+#include "error.h"
+#include "lister.h"
+#include "tmp_file.h"
+
+#include <Xm/Label.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+#include <X11/IntrinsicP.h>
+#include <vector>
+
+static const char* micro="%";
+const char* sStart = "comment - ecf user variables";
+const char* sEnd   = "end - ecf user variables";
+
+extern "C" {
+#include "xec.h"
+}
+
+edit::edit(panel_window& w):
+	panel(w),
+	text_window(false),
+	loading_(False),
+	preproc_(False),
+	tmp_(0), kStart(0x0), kEnd(0x0)
+{
+  if (kStart==NULL) 
+    kStart=(char*)calloc(1024, sizeof(char*));
+  if (kEnd==NULL)   
+    kEnd=(char*)calloc(1024, sizeof(char*));
+}
+
+edit::~edit()
+{
+  if(tmp_) XtFree(tmp_);
+  if (kStart) free(kStart);
+  if (kEnd) free(kEnd);
+}
+
+void edit::create (Widget parent, char *widget_name )
+{
+	edit_form_c::create(parent,widget_name);
+        XmToggleButtonSetState(alias_, globals::get_resource("send_as_alias", 0), FALSE);
+}
+
+void edit::clear()
+{
+	loading_ = True;
+	XmTextSetString(text_,(char*)"");
+	loading_ = False;
+}
+
+void edit::show(node& n)
+{
+  loading_ = True;
+  XmTextSetString(text_,(char*)"");
+
+  // tmp_file v(tmpnam(0), true); FILE *f = fopen(v.c_str(),"w");
+  char tmpname[] = "/tmp/xecfXXXXXX";
+  int  fid = mkstemp(tmpname);
+  FILE *f = fdopen(fid, "w");
+
+  if(!f) {
+    gui::syserr(tmpname);
+    return;
+  }
+  
+  std::list<Variable> vl; // FILL handle vl
+  tmp_file tmp(NULL);
+  tmp = n.serv().edit(n, vl, preproc_);
+  
+  if(fclose(f)) {
+    gui::syserr(tmpname);
+    return;    
+  }
+
+  xec_LoadText(text_, tmpname, True);
+  xec_LoadText(text_, tmp.c_str(), True);
+  
+  XmTextSetInsertionPosition(text_,0);
+  XmTextShowPosition(text_, 0);
+  
+  loading_ = False;
+}
+
+void edit::changed(node&)
+{
+}
+
+Boolean edit::enabled(node& n)
+{
+	return n.type() == NODE_TASK;
+}
+
+void edit::changedCB(Widget,XtPointer data)
+{
+	if(!loading_) freeze();
+}
+
+void edit::preprocCB(Widget,XtPointer data)
+{
+	preproc_ = XmToggleButtonGetState(preprocess_);
+	if(get_node())
+		show(*get_node());
+	else
+		clear();
+}
+
+static char* strip(char* n)
+{
+  int l = strlen(n) - 1;
+  while(l >= 0 && n[l] == ' ')
+    n[l--] = 0;
+  
+  char* p = n;
+  while(*p && *p == ' ') p++;
+  
+  return p;
+}
+
+void edit::submitCB(Widget,XtPointer)
+{
+  bool alias = XmToggleButtonGetState(alias_);
+  bool run   = true;
+  char line[4096];
+  node *nd = get_node();
+  
+  if(nd) {
+    tmp_file t(tmpnam(0), true);
+    if(xec_SaveText(text_,(char*)t.c_str())) {
+      gui::syserr(t.c_str());
+      return;
+    }
+    
+    NameValueVec var; 
+    FILE *f = fopen(t.c_str(),"r");
+    if(!f) {
+      gui::syserr(t.c_str());
+      return;
+    }
+	
+    const std::string& mv = nd->__node__() ? 
+      nd->variable("ECF_MICRO") : nd->variable("SMSMICRO");
+    const char * mic = (mv.size() == 1) ? mv.c_str() : micro;
+    sprintf(kStart, "%s%s", mic, sStart);
+    sprintf(kEnd,   "%s%s", mic, sEnd);	  
+    
+    bool isvars = false;
+    while(fgets(line,sizeof(line),f)) {
+      line[strlen(line)-1] = 0;
+      
+      if(isvars) {
+	char* p = line;
+	while(*p && *p != '=') p++;
+	if(*p == '=') {
+	  *p = 0;
+	  
+	  char n[1024];
+	  char v[1024];
+	  
+	  strcpy(n,line);
+	  strcpy(v,p+1); 
+	  
+	  var.push_back(std::make_pair(strip(n), strip(v))); 
+	}
+      }
+            
+      if (strcmp(line,kStart) == 0)
+	isvars = true;			  
+      if(strcmp(line,kEnd) == 0)
+	break;      
+    }
+    
+    if(var.empty()) {
+      gui::message("No user variables!");
+      // return;
+    }
+    
+    get_node()->serv().send(*get_node(),alias,run,var,t.c_str());
+    
+  } else 
+    clear();
+
+  if (alias != globals::get_resource("send_as_alias", 0))
+    globals::set_resource("send_as_alias", alias);
+  
+  submit();
+}
+
+void edit::externalCB(Widget,XtPointer)
+{
+	if(tmp_) XtFree(tmp_);
+	tmp_ = XtNewString(tmpnam(0));
+
+	if(xec_SaveText(text_,tmp_))
+	{
+		gui::syserr(tmp_);
+		return;
+	}
+
+	char cmd[1024];
+	const char* xedit = getenv("XEDITOR");
+	if (xedit)
+	  sprintf(cmd,"${XEDITOR:=xterm -e vi} %s",tmp_);
+	else
+	  sprintf(cmd,"xterm -e ${EDITOR:=vi} %s",tmp_);
+
+	FILE *f = popen(cmd,"r");
+	if(!f) {
+		gui::syserr(cmd);
+		return;
+	}
+	XtSetSensitive(text_,False);
+	XtSetSensitive(tools_,False);
+	XtSetSensitive(tools2_,False);
+
+	start(f);
+}
+
+void edit::ready(const char* line)
+{
+	gui::error("%s",line);
+}
+
+void edit::done(FILE* f)
+{
+  stop();
+  
+  if(pclose(f)) {
+    gui::error("External editor returns error");
+    return;
+  }
+  
+  if(xec_LoadText(text_,tmp_,False))
+    gui::syserr(tmp_);
+  
+  unlink(tmp_);
+  
+  XtSetSensitive(text_,True);
+  XtSetSensitive(tools_,True);
+  XtSetSensitive(tools2_,True);
+}
+
+// static panel_maker<edit> maker(PANEL_EDIT_TASK);
diff --git a/ecflow_4_0_7/view/src/edit.h b/ecflow_4_0_7/view/src/edit.h
new file mode 100644
index 0000000..c308927
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit.h
@@ -0,0 +1,76 @@
+#ifndef edit_H
+#define edit_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiedit.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#include "input.h"
+#include "text_window.h"
+
+class edit : public panel, public edit_form_c, public input, public text_window {
+public:
+	edit(panel_window&);
+
+	~edit(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Edit"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Boolean enabled(node&);
+	virtual Widget widget() { return edit_form_c::xd_rootwidget(); }
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()  { return text_; }
+
+	virtual void create (Widget parent, char *widget_name = NULL);
+
+private:
+
+	edit(const edit&);
+	edit& operator=(const edit&);
+
+	Boolean loading_;
+	Boolean preproc_;
+	char*   tmp_;
+
+	char *kStart;
+	char *kEnd  ;
+
+	void ready(const char*);
+	void done(FILE*);
+
+	virtual void changed(node&);
+
+	virtual void changedCB(Widget,XtPointer);
+	virtual void preprocCB(Widget,XtPointer);
+	virtual void submitCB(Widget,XtPointer);
+	virtual void externalCB(Widget,XtPointer);
+
+	virtual void searchCB(Widget ,XtPointer ) 
+		{ text_window::open_search();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+};
+
+inline void destroy(edit**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/edit_label.cc b/ecflow_4_0_7/view/src/edit_label.cc
new file mode 100644
index 0000000..b240616
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_label.cc
@@ -0,0 +1,86 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "edit_label.h"
+#include "label_node.h"
+#include "host.h"
+#include <Xm/Text.h>
+extern "C" {
+#include "xec.h"
+}
+
+edit_label::edit_label(panel_window& w):
+	panel(w),
+	loading_(false)
+{
+}
+
+edit_label::~edit_label()
+{
+}
+
+void edit_label::clear()
+{
+	loading_ = true;
+	XmTextSetString(value_,"");
+	XmTextSetString(default_,"");
+	loading_ = false;
+}
+
+void edit_label::show(node& n)
+{
+
+	label_node& m = (label_node&)n;
+
+	loading_ = true;
+	XmTextSetString(value_,(char*)m.value());
+	XmTextSetString(default_,(char*)m.def());
+
+	loading_ = false;
+}
+
+Boolean edit_label::enabled(node& n)
+{
+	return n.type() == NODE_LABEL;
+}
+
+void edit_label::applyCB(Widget,XtPointer)
+{
+  // alter -m node value
+  if(get_node())
+    {
+      char *p = XmTextGetString(value_);
+      if (get_node()->__node__()) /* ecflow */
+	get_node()->serv().command(clientName,"--alter", "change", "label",
+				   get_node()->name().c_str(), p,
+				   get_node()->parent_name().c_str(),
+				   NULL);
+      else
+	get_node()->serv().command("alter", "-l",
+				   get_node()->full_name().c_str(), p, NULL);
+      XtFree(p);
+    }
+  else clear();
+
+	submit();
+}
+
+void edit_label::changedCB(Widget,XtPointer)  
+{
+	if(loading_) return;
+	freeze();
+}
+
+// static panel_maker<edit_label> maker(PANEL_EDIT_LABEL);
diff --git a/ecflow_4_0_7/view/src/edit_label.h b/ecflow_4_0_7/view/src/edit_label.h
new file mode 100644
index 0000000..7cce8cc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_label.h
@@ -0,0 +1,137 @@
+#ifndef edit_label_H
+#define edit_label_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+
+#include "uiedit_label.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+// 
+
+class edit_label : public panel, public edit_label_form_c {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	edit_label(panel_window&);
+
+// -- Destructor
+
+	~edit_label(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	virtual const char* name() const { return "Edit"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+	virtual Widget tools() { return tools_; }
+
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	edit_label(const edit_label&);
+	edit_label& operator=(const edit_label&);
+
+// -- Members
+	bool loading_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	virtual void applyCB(Widget,XtPointer);
+	virtual void changedCB(Widget,XtPointer);
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const edit_label& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(edit_label**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(edit_label);
+//#endif
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/edit_limit.cc b/ecflow_4_0_7/view/src/edit_limit.cc
new file mode 100644
index 0000000..c009535
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_limit.cc
@@ -0,0 +1,146 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "edit_limit.h"
+#include "limit_node.h"
+#include "host.h"
+#include <Xm/Text.h>
+#include <Xm/List.h>
+extern "C" {
+#include "xec.h"
+}
+
+edit_limit::edit_limit(panel_window& w):
+	panel(w),
+	loading_(false),
+	name_(0)
+{
+}
+
+edit_limit::~edit_limit()
+{
+	if(name_) XtFree(name_);
+}
+
+void edit_limit::clear()
+{
+	loading_ = true;
+	XmTextSetString(max_,(char*)"");
+	XmListDeleteAllItems(list_);
+	XtSetSensitive(remove_,False);
+	forget_all();
+	loading_ = false;
+	if(name_) XtFree(name_);
+	name_ = 0;
+}
+
+void edit_limit::show(node& n)
+{
+	clear();
+
+	limit_node& m = (limit_node&)n;
+
+	char buf[80];
+	loading_ = true;
+
+	sprintf(buf,"%d",m.maximum()); XmTextSetString(max_,buf);
+
+	m.nodes(*this);
+
+	loading_ = false;
+}
+
+Boolean edit_limit::enabled(node& n)
+{
+	return n.type() == NODE_LIMIT;
+}
+
+void edit_limit::applyCB(Widget,XtPointer)
+{
+  // alter -m node value
+  if(get_node()) {
+    char *p = XmTextGetString(max_);
+    if (1) {
+    if (get_node()->__node__()) /* ecflow */
+      get_node()->serv().command(clientName,"--alter", "change","limit_max",
+				 get_node()->name().c_str(),p,
+				 get_node()->parent_name().c_str(),
+				 NULL);
+    else
+      get_node()->serv().command("alter", "-M", 
+				 get_node()->full_name().c_str(), p, NULL);
+    } else {
+      std::string cmd;
+      if (get_node()->__node__()) { /* ecflow */
+	cmd = clientName; cmd+= "--alter change limit_max <node_name> ";
+	cmd += p; cmd += " <parent_name>"; 
+    } else {
+	cmd = "alter -M <full_name> "; cmd += p; 
+      }
+      get_node()->command(cmd.c_str());
+    }
+    XtFree(p);
+  } else {
+    clear();
+  }
+  submit();
+}
+
+void edit_limit::changedCB(Widget,XtPointer)  
+{
+	if(loading_) return;
+	freeze();
+}
+
+void edit_limit::browseCB(Widget,XtPointer data)
+{
+	XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+	char *p = xec_GetString(cb->item);
+	if(name_) XtFree(name_);
+	name_ = p;
+	XtSetSensitive(remove_,True);
+}
+
+void edit_limit::removeCB(Widget,XtPointer data)
+{
+  if(get_node()) {
+    if(name_) {
+      if (get_node()->__node__()) /* ecflow */
+	get_node()->serv().command(clientName,"--alter", "delete","limit_path",
+				   get_node()->name().c_str(), // limit name 
+				   name_,
+				   get_node()->parent_name().c_str(),
+				   NULL); // task node name
+      else
+	get_node()->serv().command("alter", "-N",
+				   get_node()->full_name().c_str(),
+				   name_,
+				   NULL);
+    }
+  } else {
+    clear();
+  }
+}
+
+void edit_limit::next(node& n)
+{
+  observe(&n);
+  xec_AddListItem(list_,(char*)n.full_name().c_str());
+}
+
+void edit_limit::next(const std::string n)
+{
+  xec_AddListItem(list_,(char*)n.c_str());
+}
diff --git a/ecflow_4_0_7/view/src/edit_limit.h b/ecflow_4_0_7/view/src/edit_limit.h
new file mode 100644
index 0000000..4a600ae
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_limit.h
@@ -0,0 +1,60 @@
+#ifndef edit_limit_H
+#define edit_limit_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiedit_limit.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef node_lister_H
+#include "node_lister.h"
+#endif
+
+class edit_limit : public panel, public edit_limit_form_c, public node_lister {
+public:
+
+	edit_limit(panel_window&);
+
+	~edit_limit(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Edit"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+	virtual Widget tools() { return tools_; }
+private:
+
+	edit_limit(const edit_limit&);
+	edit_limit& operator=(const edit_limit&);
+
+	bool loading_;
+	char* name_;
+
+	virtual void applyCB(Widget,XtPointer);
+	virtual void changedCB(Widget,XtPointer);
+	virtual void removeCB(Widget,XtPointer);
+	virtual void browseCB(Widget,XtPointer);
+
+	virtual void next(node&);
+	virtual void next(const std::string);
+};
+
+inline void destroy(edit_limit**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/edit_meter.cc b/ecflow_4_0_7/view/src/edit_meter.cc
new file mode 100644
index 0000000..4c5b19e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_meter.cc
@@ -0,0 +1,91 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "edit_meter.h"
+#include "meter_node.h"
+#include "host.h"
+#include <Xm/Text.h>
+extern "C" {
+#include "xec.h"
+}
+
+edit_meter::edit_meter(panel_window& w):
+	panel(w),
+	loading_(false)
+{
+}
+
+edit_meter::~edit_meter()
+{
+}
+
+void edit_meter::clear()
+{
+	loading_ = true;
+	XmTextSetString(min_,(char*)"");
+	XmTextSetString(value_,(char*)"");
+	XmTextSetString(max_,(char*)"");
+	XmTextSetString(threshold_,(char*)"");
+	loading_ = false;
+}
+
+void edit_meter::show(node& n)
+{
+	meter_node& m = (meter_node&)n;
+
+	char buf[80];
+	loading_ = true;
+
+	sprintf(buf,"%d",m.minimum()); XmTextSetString(min_,buf);
+	sprintf(buf,"%d",m.value());   XmTextSetString(value_,buf);
+	sprintf(buf,"%d",m.maximum()); XmTextSetString(max_,buf);
+	sprintf(buf,"%d",m.threshold()); XmTextSetString(threshold_,buf);
+
+	loading_ = false;
+}
+
+Boolean edit_meter::enabled(node& n)
+{
+	return n.type() == NODE_METER;
+}
+
+void edit_meter::applyCB(Widget,XtPointer)
+{
+  // alter -m node value
+  if(get_node())
+    {
+      char *p = XmTextGetString(value_);
+      if (get_node()->__node__()) /* ecflow */
+	get_node()->serv().command(clientName, "--alter", "change", "meter",
+				   get_node()->name().c_str(), p,
+				   get_node()->parent_name().c_str(), 
+				   NULL);
+      else
+	get_node()->serv().command("alter", "-m",
+				   get_node()->full_name().c_str(), p, NULL);
+      XtFree(p);
+    }
+  else clear();
+
+  submit();
+}
+
+void edit_meter::changedCB(Widget,XtPointer)  
+{
+	if(loading_) return;
+	freeze();
+}
+
+// static panel_maker<edit_meter> maker(PANEL_EDIT_METER);
diff --git a/ecflow_4_0_7/view/src/edit_meter.h b/ecflow_4_0_7/view/src/edit_meter.h
new file mode 100644
index 0000000..b8c04b0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_meter.h
@@ -0,0 +1,137 @@
+#ifndef edit_meter_H
+#define edit_meter_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+
+#include "uiedit_meter.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+// 
+
+class edit_meter : public panel, public edit_meter_form_c {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	edit_meter(panel_window&);
+
+// -- Destructor
+
+	~edit_meter(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	virtual const char* name() const { return "Edit"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+	virtual Widget tools() { return tools_; }
+
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	edit_meter(const edit_meter&);
+	edit_meter& operator=(const edit_meter&);
+
+// -- Members
+	bool loading_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	virtual void applyCB(Widget,XtPointer);
+	virtual void changedCB(Widget,XtPointer);
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const edit_meter& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(edit_meter**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(edit_meter);
+//#endif
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/edit_repeat.cc b/ecflow_4_0_7/view/src/edit_repeat.cc
new file mode 100644
index 0000000..2113059
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_repeat.cc
@@ -0,0 +1,140 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "edit_repeat.h"
+#include "repeat_node.h"
+#include "host.h"
+#include "ecflowview.h"
+#include <Xm/List.h>
+#include <Xm/Text.h>
+extern "C" {
+#include "xec.h"
+}
+
+edit_repeat::edit_repeat(panel_window& w):
+	panel(w),
+	loading_(false),
+	index_(-1), 
+	indexs_("")
+{
+}
+
+edit_repeat::~edit_repeat()
+{
+}
+
+void edit_repeat::clear()
+{
+	loading_ = true;
+	XmListDeleteAllItems(list_);     
+	index_ = -1;
+	indexs_ = "";
+	loading_ = false;
+}
+
+void edit_repeat::show(node& n)
+{
+	repeat_node& m = (repeat_node&)n;
+
+	loading_ = true;
+
+	str80 buf;
+	int end = m.last();
+	int cur = m.current();
+	int inc = m.step();
+	XmListDeleteAllItems(list_);     
+
+	if(end > 50 && m.can_use_text())
+	{
+		use_text_ = true;
+		char buf[1024];
+		char buf1[1024];
+		char buf2[1024];
+		m.value(buf1,0);
+		m.value(buf2,end-1);
+		sprintf(buf,"Enter a value between %s and %s (step %d):",buf1,buf2,inc);
+		xec_SetLabel(label_,buf);
+		XtUnmanageChild(show_list_);
+		XtManageChild(show_text_);
+		m.value(buf,cur);
+		XmTextSetString(text_,buf);
+	}
+	else
+	{
+		use_text_ = false;
+		XtManageChild(show_list_);
+		XtUnmanageChild(show_text_);
+
+		for(int i=0 ; i < end ; i++)
+		{
+			m.value(buf,i);
+			xec_AddListItem(list_,buf);
+		}
+
+		XmListSelectPos(list_,cur+1,True);
+	}
+
+	loading_ = false;
+}
+
+Boolean edit_repeat::enabled(node& n)
+{ 
+  int i = n.type();
+  return i == NODE_REPEAT || 
+    i == NODE_REPEAT_E || 
+    i == NODE_REPEAT_S ||
+    i == NODE_REPEAT_D || 
+    i == NODE_REPEAT_I;
+}
+
+void edit_repeat::applyCB(Widget,XtPointer)
+{
+  if(get_node()) {
+    char *p = 0x0;
+    if(use_text_) {
+      p = XmTextGetString(text_);
+    }
+
+    if (get_node()->__node__()) /* ecflow */
+      get_node()->serv().command(clientName, "--alter", "change", "repeat",
+			       p ? p : indexs_.c_str(),
+			       get_node()->parent_name().c_str(), 
+			       NULL);
+    else
+      get_node()->serv().command("alter", "-R", 
+				 get_node()->full_name().c_str(), p, NULL);
+
+    if (p) XtFree(p);
+
+  } else { 
+    clear();
+  }
+  submit();
+}
+
+void edit_repeat::browseCB(Widget,XtPointer data)  
+{
+	XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+	char *p = xec_GetString(cb->item); 
+	if(get_node())
+	  indexs_ = p;
+	else
+	  indexs_ = "";
+	XtFree(p);
+
+	if(loading_) return;
+	freeze();
+}
+
diff --git a/ecflow_4_0_7/view/src/edit_repeat.h b/ecflow_4_0_7/view/src/edit_repeat.h
new file mode 100644
index 0000000..13f1075
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_repeat.h
@@ -0,0 +1,51 @@
+#ifndef edit_repeat_H
+#define edit_repeat_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiedit_repeat.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+class edit_repeat : public panel, public edit_repeat_form_c {
+public:
+	edit_repeat(panel_window&);
+
+	~edit_repeat(); // Change to virtual if base class
+	virtual const char* name() const { return "Edit"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+	virtual Widget tools() { return tools_; }
+
+private:
+
+	edit_repeat(const edit_repeat&);
+	edit_repeat& operator=(const edit_repeat&);
+
+	bool loading_;
+	int  index_; std::string indexs_;
+	bool use_text_;
+
+	virtual void applyCB(Widget,XtPointer);
+	virtual void browseCB(Widget,XtPointer);
+};
+
+inline void destroy(edit_repeat**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/edit_variable.cc b/ecflow_4_0_7/view/src/edit_variable.cc
new file mode 100644
index 0000000..8437765
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_variable.cc
@@ -0,0 +1,70 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "edit_variable.h"
+#include "host.h"
+#include "node.h"
+#include <Xm/Text.h>
+#include <Xm/List.h>
+extern "C" {
+#include "xec.h"
+}
+
+edit_variable::edit_variable(panel_window& w):
+	panel(w),
+	loading_(false)
+{
+}
+
+edit_variable::~edit_variable()
+{
+}
+
+void edit_variable::clear()
+{
+	loading_ = true;
+	xec_SetLabel(name_,"<no name>");
+	XmTextSetString(value_,"");
+	loading_ = false;
+}
+
+void edit_variable::show(node& n)
+{
+	clear();
+	n.edit(*this);
+	loading_ = false;
+}
+
+Boolean edit_variable::enabled(node& n)
+{
+  return n.type() == NODE_VARIABLE;
+}
+
+void edit_variable::applyCB(Widget,XtPointer)
+{
+	if(get_node())
+		get_node()->apply(*this);
+	else 
+		clear();
+	submit();
+}
+
+void edit_variable::changedCB(Widget,XtPointer)  
+{
+	if(loading_) return;
+	freeze();
+}
+
+// static panel_maker<edit_variable> maker(PANEL_EDIT_VARIABLE);
diff --git a/ecflow_4_0_7/view/src/edit_variable.h b/ecflow_4_0_7/view/src/edit_variable.h
new file mode 100644
index 0000000..118c2eb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/edit_variable.h
@@ -0,0 +1,58 @@
+#ifndef edit_variable_H
+#define edit_variable_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiedit_variable.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef node_editor_H
+#include "node_editor.h"
+#endif
+
+class edit_variable : public panel, public edit_variable_form_c, 
+	public node_editor {
+public:
+
+	edit_variable(panel_window&);
+
+	~edit_variable(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Edit"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+	virtual Widget form()   { return xd_rootwidget(); }
+	virtual Widget tools()  { return tools_; }
+
+private:
+
+	edit_variable(const edit_variable&);
+	edit_variable& operator=(const edit_variable&);
+
+	bool loading_;
+
+	virtual void applyCB(Widget,XtPointer);
+	virtual void changedCB(Widget,XtPointer);
+
+};
+
+inline void destroy(edit_variable**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/editor.cc b/ecflow_4_0_7/view/src/editor.cc
new file mode 100644
index 0000000..1329d92
--- /dev/null
+++ b/ecflow_4_0_7/view/src/editor.cc
@@ -0,0 +1,47 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef editor_H
+#include "editor.h"
+#endif
+
+
+Widget editor::find(const char* name)
+{
+	Widget w = find(name,form());
+	return w;
+}
+
+Widget editor::find(const char* name,Widget p)
+{
+	Widget w = XtNameToWidget(p,name);
+	if(w) return w;
+
+	WidgetList wl = 0;
+	int count = 0;
+
+	XtVaGetValues(p,
+		XmNchildren,&wl,
+		XtNnumChildren,&count,
+		NULL);
+
+	for(int i=0; i<count; i++)
+	{
+		w = find(name,wl[i]);
+		if(w) return w;
+	}
+
+	return 0;
+}
diff --git a/ecflow_4_0_7/view/src/editor.h b/ecflow_4_0_7/view/src/editor.h
new file mode 100644
index 0000000..841e449
--- /dev/null
+++ b/ecflow_4_0_7/view/src/editor.h
@@ -0,0 +1,108 @@
+#ifndef editor_H
+#define editor_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#include <Xm/Xm.h>
+
+
+class editor {
+public:
+
+// -- Methods
+
+	virtual Widget form() = 0;
+
+// -- Overridden methods
+
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+
+	Widget find(const char*,Widget);
+	Widget find(const char* n);
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const editor& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(editor**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(editor);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/error.cc b/ecflow_4_0_7/view/src/error.cc
new file mode 100644
index 0000000..855d0fc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/error.cc
@@ -0,0 +1,38 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include "error.h"
+#include "gui.h"
+#include "ecflowview.h"
+
+
+error::error()
+{
+	create(gui::top());
+}
+
+
+error::~error()
+{
+}
+
+
+void error::show(const char* msg)
+{
+	instance().modal(msg,True);
+}
diff --git a/ecflow_4_0_7/view/src/error.h b/ecflow_4_0_7/view/src/error.h
new file mode 100644
index 0000000..0637474
--- /dev/null
+++ b/ecflow_4_0_7/view/src/error.h
@@ -0,0 +1,106 @@
+#ifndef error_H
+#define error_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uierror.h"
+#include "dialog.h"
+
+class error : public dialog<error,error_shell_c> {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	error();
+
+// -- Destructor
+
+	~error(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+	static void show(const char*);
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	error(const error&);
+	error& operator=(const error&);
+
+// -- Methods
+
+
+// -- Overridden methods
+
+
+// -- Class members
+
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const error& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(error**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(error);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/eval.h b/ecflow_4_0_7/view/src/eval.h
new file mode 100644
index 0000000..19ef321
--- /dev/null
+++ b/ecflow_4_0_7/view/src/eval.h
@@ -0,0 +1,49 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+	virtual Boolean is_MENU() { return 0;}
+	virtual Boolean is_IDENT() { return 0;}
+	virtual Boolean is_NONE() { return 0;}
+	virtual Boolean is_ALL() { return 1;}
+	virtual Boolean is_UNKNOWN() { return 0;}
+	virtual Boolean is_SUSPENDED() { return 0;}
+	virtual Boolean is_COMPLETE() { return 0;}
+	virtual Boolean is_QUEUED() { return 0;}
+	virtual Boolean is_SUBMITTED() { return 0;}
+	virtual Boolean is_ACTIVE() { return 0;}
+	virtual Boolean is_ABORTED() { return 0;}
+	virtual Boolean is_CLEAR() { return 0;}
+	virtual Boolean is_SET() { return 0;}
+	virtual Boolean is_SHUTDOWN() { return 0;}
+	virtual Boolean is_HALTED() { return 0;}
+	virtual Boolean is_ECF() { return 0;}
+	virtual Boolean is_SUITE() { return 0;}
+	virtual Boolean is_FAMILY() { return 0;}
+	virtual Boolean is_TASK() { return 0;}
+	virtual Boolean is_EVENT() { return 0;}
+	virtual Boolean is_LABEL() { return 0;}
+	virtual Boolean is_METER() { return 0;}
+	virtual Boolean is_REPEAT() { return 0;}
+	virtual Boolean is_VARIABLE() { return 0;}
+	virtual Boolean is_TRIGGER() { return 0;}
+	virtual Boolean is_HAS_TRIGGERS() { return 0;}
+	virtual Boolean is_HAS_TIME() { return 0;}
+	virtual Boolean is_HAS_DATE() { return 0;}
+	virtual Boolean is_SEPARATOR() { return 0;}
+	virtual Boolean is_STRING() { return 0;}
+	virtual Boolean is_DEFAULT_YES() { return 0;}
+	virtual Boolean is_DEFAULT_NO() { return 0;}
+	virtual Boolean is_EDIT() { return 0;}
+	virtual Boolean is_OUTPUT() { return 0;}
diff --git a/ecflow_4_0_7/view/src/event_node.cc b/ecflow_4_0_7/view/src/event_node.cc
new file mode 100644
index 0000000..a529bdf
--- /dev/null
+++ b/ecflow_4_0_7/view/src/event_node.cc
@@ -0,0 +1,75 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "event_node.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+event_node::event_node(host& h,ecf_node* n) : node(h,n) {}
+
+const char* event_node::status_name() const 
+{ 
+  char *event_name[]  = { (char*) "clear", (char*) "set", NULL };
+  return event_name[owner_->status()]; 
+}
+
+void event_node::drawNode(Widget w,XRectangle* r,bool tree)
+{
+	drawBackground(w,r,tree);
+
+	XmString s = tree ? labelTree() : labelTrigger();
+	XRectangle x = *r;
+
+	x.x += (x.height - 10)/2;
+	x.width = x.height = 10;
+
+	XFillRectangles
+	  (XtDisplay(w),XtWindow(w),
+	   // status() ? blueGC() : colorGC(0), &x,1);
+	   status() ? gui::colorGC(STATUS_MAX+2) : colorGC(0), &x,1);
+
+	shadow(w,&x);
+
+	XmStringDraw(XtDisplay(w),XtWindow(w),
+	    smallfont(),
+	    s,
+	    blackGC(),    
+	    r->x + x.width + 4,
+	    r->y,
+	    r->width - x.width - 4,
+	    XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, 
+		     NULL);
+}
+
+void event_node::sizeNode(Widget w,XRectangle* r,bool tree)
+{
+	XmString s = tree ? labelTree() : labelTrigger();
+	r->height = XmStringHeight(smallfont(),s);
+	r->width  = XmStringWidth(smallfont(),s) + 14 ;
+	if(r->height<10) r->height = 10;
+}
+
+bool event_node::evaluate() const
+{
+  return status() != 0;
+}
+
+void event_node::perlify(FILE* f)
+{
+  perl_member(f,"status",owner_->status());
+}
+
diff --git a/ecflow_4_0_7/view/src/event_node.h b/ecflow_4_0_7/view/src/event_node.h
new file mode 100644
index 0000000..23d53b9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/event_node.h
@@ -0,0 +1,42 @@
+#ifndef EVENT_NODE_H
+#define EVENT_NODE_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #10 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "node.h"
+#include "show.h"
+
+class event_node : public node {
+
+  virtual void info(std::ostream&){}
+    virtual bool evaluate() const;
+
+    virtual void drawNode(Widget w,XRectangle* r,bool);
+    virtual void sizeNode(Widget w,XRectangle* r,bool);
+
+    virtual Boolean visible() const { return show::want(show::event); }
+
+    const char* status_name() const;
+
+    virtual void perlify(FILE*);
+
+public:
+    event_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+    event_node(host& h,sms_node* n,char b) : node(h,n,b) {}
+#endif
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/events.h b/ecflow_4_0_7/view/src/events.h
new file mode 100644
index 0000000..ffdd271
--- /dev/null
+++ b/ecflow_4_0_7/view/src/events.h
@@ -0,0 +1,132 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef events_H
+#define events_H
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#ifndef array_H
+#include "array.h"
+#endif
+
+
+class events {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	events() {}
+
+// -- Destructor
+
+	~events() {}
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	int count()       { return time_.count(); }
+	int time(int i)   { return time_[i]; }
+	int status(int i) { return status_[i]; }
+
+	void add(int t,int s) { time_.add(t); status_.add(s); }
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	events(const events&);
+	events& operator=(const events&);
+
+// -- Members
+	
+	array<int> time_;
+	array<int> status_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const events& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(events**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(events);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/extent.h b/ecflow_4_0_7/view/src/extent.h
new file mode 100644
index 0000000..7865a98
--- /dev/null
+++ b/ecflow_4_0_7/view/src/extent.h
@@ -0,0 +1,74 @@
+#ifndef extent_H
+#define extent_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+template<class T>
+class extent {
+public:
+	extent();
+
+	virtual ~extent(); // Change to virtual if base class
+
+	static void delete_all();
+
+	extent<T>* next_;
+	extent<T>* prev_;
+
+	static extent<T>* first_;
+	static extent<T>* last_;
+
+	static T* first() { return (T*)first_; }
+	T* next()         { return (T*)next_; }
+};
+
+template<class T> extent<T>* extent<T>::first_ = 0;
+template<class T> extent<T>* extent<T>::last_  = 0;
+
+template<class T>
+extent<T>::extent():
+	next_(0),
+	prev_(last_)
+{
+	if(last_) 
+		last_->next_ = this;
+	else 
+		first_ = this;
+	last_ = this;
+}
+
+template<class T>
+extent<T>::~extent()
+{
+	if(prev_) prev_->next_ = next_; else first_ = next_;
+	if(next_) next_->prev_ = prev_; else last_  = prev_;
+}
+
+
+template<class T>
+void extent<T>::delete_all()
+{
+	while(first_) delete first_;
+}
+
+// gcc is broken
+#if defined (__GNUC__) || defined (hpux) || defined(mips) || defined(_AIX)
+#define IMP(T)
+#else
+#define IMP(T) extent<T>* extent<T>::first_;extent<T>* extent<T>::last_;
+#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/external.cc b/ecflow_4_0_7/view/src/external.cc
new file mode 100644
index 0000000..c03ea4c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/external.cc
@@ -0,0 +1,64 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "external.h"
+#include "host.h"
+#include "ecf_node.h"
+
+static  external* head_ = 0;
+
+external::external(const char *name):
+  node(host::dummy(),ecf_node::dummy_node())
+{
+  name_ = name;
+  next_          = head_;
+  head_          = this;
+}
+
+external::~external()
+{
+}
+
+Boolean external::is_external(const char *name)
+{
+  return True;
+}
+
+external& external::get(const char *name)
+{
+  external* e = head_;
+  while(e) {
+    if(strcmp(name,e->name().c_str()) == 0)
+      return *e;
+    e = (external*)e->next_;
+  }
+  return *(new external(name));
+}
+
+void external::info(std::ostream&)
+{
+}
+
+void external::perlify(FILE* f)
+{
+}
+
+template<> 
+void ecf_concrete_node<external>::set_graphic_ptr(node* n)
+{}
+
+template<> 
+void ecf_concrete_node<external>::make_subtree() {}
+
diff --git a/ecflow_4_0_7/view/src/external.h b/ecflow_4_0_7/view/src/external.h
new file mode 100644
index 0000000..64818fa
--- /dev/null
+++ b/ecflow_4_0_7/view/src/external.h
@@ -0,0 +1,53 @@
+#ifndef external_H
+#define external_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node.h"
+
+class external : public node {
+  std::string name_;
+public:
+	external(const char*);
+	~external(); // Change to virtual if base class
+
+	virtual Boolean menus()       { return False;      }
+	virtual Boolean selectable() { return False;      }
+	virtual const std::string& full_name()  const  { return name();     }
+	virtual void info(std::ostream&);
+
+	virtual const char* type_name() const  { return "external"; }
+	virtual const char* status_name() const  { return "unknown"; }
+	virtual const std::string& name() const   { return name_; }
+	virtual const std::string toString() const   { return name(); }
+
+	static Boolean is_external(const std::string& path) { return is_external(path.c_str()); }
+	static Boolean is_external(const char*);
+	virtual std::ostream& print(std::ostream&s) const { return s << "extern_node\n";};
+
+	static external& get(const std::string& path) { return get(path.c_str()); }
+	static external& get(const char*);
+
+private:
+
+	external(const external&);
+	external& operator=(const external&);
+
+	virtual void perlify(FILE*);
+};
+
+inline void destroy(external**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/find.cc b/ecflow_4_0_7/view/src/find.cc
new file mode 100644
index 0000000..d1e398a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/find.cc
@@ -0,0 +1,173 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdarg.h>
+#include "find.h"
+#include "host.h"
+#include "runnable.h"
+#include <Xm/List.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+#include <Xm/PushB.h>
+#include "gui.h"
+#include "extent.h"
+#include "flags.h"
+#include "pixmap.h"
+#include "result.h"
+#include <X11/IntrinsicP.h>
+#include <stdarg.h>
+
+extern "C" {
+#include "xec.h"
+}
+
+struct quick_find : public extent<quick_find> {
+
+	str  text_;
+	str  title_;
+	bool regexp_;
+	bool case_;
+
+	quick_find(const str& title,const str& text,bool regexp,bool cas):
+		text_(text),
+		title_(title), regexp_(regexp),case_(cas) {}
+
+	static void init(Widget);
+};
+
+void quick_find::init(Widget m)
+{
+  quick_find* f = quick_find::first();
+  while(f)
+    {
+      Widget w = XmCreatePushButton(m,(char*)f->title_.c_str(),0,0);
+      xec_SetUserData(w,f);
+      XtManageChild(w);
+      f = f->next();
+    }
+}
+
+static quick_find qf1("An ECF variable","%[^%]+%",true,false);
+static quick_find qf2("A shell variable",
+		      "(\\$\\{[_a-z0-9]+\\})|(\\$[_a-z0-9]+)",true,false);
+static quick_find qf3("A MARS error","^mars - (ERROR|FATAL)",true,true);
+
+static quick_find qf4("ecflow_client","ecflow_client",false,true);
+static quick_find qf5(" --abort"," --abort",false,true);
+static quick_find qf6(" --complete"," --complete",false,true);
+static quick_find qf7(" --init"," --init",false,true);
+static quick_find qf8("smsabort","smsabort",false,true);
+
+find::find():
+	pending_(0)
+{
+	_xd_rootwidget = 0;
+}
+
+find::~find()
+{
+	if(_xd_rootwidget)
+	XtDestroyWidget(_xd_rootwidget);
+	delete pending_;
+}
+
+void find::closeCB(Widget,XtPointer)  
+{
+	hide();
+}
+
+void find::hide()
+{
+	if(_xd_rootwidget) {
+		no_message();
+		XtUnmanageChild(form_);
+	}
+}
+
+void find::findCB(Widget,XtPointer)
+{
+	char* p = XmTextGetString(find_text_);
+	search(p,XmToggleButtonGetState(case_),
+		 XmToggleButtonGetState(regexp_),
+		 XmToggleButtonGetState(back_),
+		 XmToggleButtonGetState(wrap_));
+	XtFree(p);
+}
+
+void find::make(Widget top)
+{
+	while(!XtIsShell(top))
+		top = XtParent(top);
+
+	if(!_xd_rootwidget)
+	{
+		find_shell_c::create(top);
+		pixmap::find("QuickFind").set_label(quick_find_);
+		quick_find::init(quick_menu_);
+	}
+
+}
+
+void find::raise(Widget top)
+{
+	make(top);
+	XtManageChild(form_);
+	XMapRaised(XtDisplay(_xd_rootwidget),XtWindow(_xd_rootwidget));
+}
+
+void find::message(const char* fmt,...)
+{
+	if(!_xd_rootwidget)
+		return;
+
+	char buf[1024];
+    va_list   args;
+    va_start(args,fmt);
+	vsprintf(buf,fmt,args);
+	xec_SetLabel(message_,buf);
+    va_end(args);
+
+	XtManageChild(message_);
+}
+
+void find::no_message()
+{
+	if(_xd_rootwidget)
+		XtUnmanageChild(message_);
+}
+
+void find::regexCB(Widget,XtPointer data)
+{
+	XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*) data;
+	if(cb->set) 
+		XmToggleButtonSetState(back_,False,False);
+	else
+		XmToggleButtonSetState(case_,True,False);
+		
+	XtSetSensitive(back_,!cb->set);
+	XtSetSensitive(case_, cb->set);
+}
+
+void find::entryCB(Widget,XtPointer data)
+{
+  XmRowColumnCallbackStruct *cb = (XmRowColumnCallbackStruct *) data;
+  quick_find *w = (quick_find*) xec_GetUserData (cb->widget);
+  XmTextSetString(find_text_,(char*)w->text_.c_str());
+  XmToggleButtonSetState(regexp_, w->regexp_,True);
+  if(w->regexp_)
+    XmToggleButtonSetState(case_, w->case_  ,True);
+
+}
+IMP(quick_find)
diff --git a/ecflow_4_0_7/view/src/find.h b/ecflow_4_0_7/view/src/find.h
new file mode 100644
index 0000000..f1a6227
--- /dev/null
+++ b/ecflow_4_0_7/view/src/find.h
@@ -0,0 +1,58 @@
+#ifndef find_H
+#define find_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+class host;
+
+#include "uifind.h"
+
+class runnable;
+
+class find : public find_shell_c {
+public:
+	find();
+
+	~find(); // Change to virtual if base class
+
+	void make(Widget);
+	void raise(Widget);
+	void hide();
+	void message(const char*,...);
+	void no_message();
+	virtual void search(const char*,bool,bool,bool,bool) = 0;
+
+	void pending(runnable* r) { pending_ = r; }
+
+private:
+
+	find(const find&);
+	find& operator=(const find&);
+
+	runnable* pending_;
+
+	void closeCB(Widget,XtPointer);
+	void findCB(Widget,XtPointer);
+	void regexCB(Widget,XtPointer);
+	void entryCB(Widget,XtPointer);
+};
+
+inline void destroy(find**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/flags.cc b/ecflow_4_0_7/view/src/flags.cc
new file mode 100644
index 0000000..5a6a6b3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/flags.cc
@@ -0,0 +1,85 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <strings.h>
+#include "ecflowview.h"
+#include "flags.h"
+#include "globals.h"
+#include "str.h"
+#include "selection.h"
+
+#ifdef linux
+extern "C" char *cuserid(char*);
+#endif
+
+flags::~flags()
+{
+}
+
+Boolean eventFlag::eval(node* n)
+{
+  if (!n) return False;
+  return n->status() == status_;
+}
+
+Boolean statusFlag::eval(node* n)
+{
+  if (!n) return False;
+  XECFDEBUG printf("statusFlag: %d %d %d \n", n->isSimpleNode() ? 1:0,n->status(),status_);
+  return n->isSimpleNode() && (n->status() == status_);
+}
+
+Boolean typeFlag::eval(node* n)
+{
+  if (!n) return False;
+  if (type_ == NODE_REPEAT) {
+    int i = n->type();
+    return i == NODE_REPEAT ||
+      i == NODE_REPEAT_E || i == NODE_REPEAT_I ||
+      i == NODE_REPEAT_S || i == NODE_REPEAT_D;    
+  }
+  return n->type() == type_;
+}
+
+Boolean procFlag::eval(node* n)
+{
+  if (!n) return False;
+  return (n->*proc_)();
+}
+
+Boolean userFlag::eval(node* n)
+{
+  /*	static char* names[] = {
+	    (char*) "CDPUSER",
+	    (char*) "CDPOPER",
+	    (char*) "CDPADMIN",
+	};
+
+	const char* v = n->variable(names[level_]).c_str();
+	if(v) {
+		static str me(cuserid(0));
+		return strcmp(me.c_str(),v) == 0;
+	}
+  */
+  return (globals::user_level() == level_);
+}
+
+Boolean selectionFlag::eval(node* n)
+{
+  return selection::current_node() != 0 && selection::current_node() != n;
+}
diff --git a/ecflow_4_0_7/view/src/flags.h b/ecflow_4_0_7/view/src/flags.h
new file mode 100644
index 0000000..0818f15
--- /dev/null
+++ b/ecflow_4_0_7/view/src/flags.h
@@ -0,0 +1,117 @@
+#ifndef flags_H
+#define flags_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef ecflowview_H
+#include "ecflowview.h"
+#endif
+
+#include "node.h"
+
+class flags {
+public:
+	  virtual Boolean eval (node *) = 0;
+	  virtual ~flags();
+};
+
+
+class flagNot : public flags
+{
+	flags *f_;
+	virtual Boolean eval (node * n) { return !f_->eval (n); }
+public:
+	flagNot (flags * f) : f_ (f) { }
+	~flagNot() { delete f_; }
+};
+
+class flagOr : public flags {
+	flags *a_;
+	flags *b_;
+	virtual Boolean eval (node * n) { return a_->eval (n) || b_->eval (n); }
+public:
+	flagOr (flags * a, flags * b): a_(a), b_(b) { }
+	~flagOr() { delete a_; delete b_; }
+};
+
+class flagAnd : public flags {
+	flags *a_;
+	flags *b_;
+	virtual Boolean eval (node * n) { return a_->eval (n) && b_->eval (n); }
+public:
+	flagAnd (flags * a, flags * b): a_(a), b_(b) { }
+	~flagAnd() { delete a_; delete b_; }
+};
+
+class typeFlag : public flags { 
+	int type_;
+public:
+	virtual Boolean eval(node *);
+	typeFlag(int t) : type_(t) {}
+};
+
+class statusFlag : public flags { 
+	int status_;
+public:
+	virtual Boolean eval(node *);
+	statusFlag(int t) : status_(t) {}
+};
+
+class eventFlag : public flags { 
+	int status_;
+public:
+	virtual Boolean eval(node *);
+	eventFlag(int t) : status_(t) {}
+};
+
+class procFlag : public flags { 
+	typedef Boolean (node::*Proc)() const;
+	Proc proc_;
+public:
+	virtual Boolean eval(node *);
+	procFlag(Proc p) : proc_(p) {}
+};
+
+class flagAll : public flags {
+	virtual Boolean eval (node * n) { return True; }
+};
+
+class flagNone : public flags {
+	virtual Boolean eval (node * n) { return False; }
+};
+
+class showFlag : public flags {
+	int show_;
+public:
+	virtual Boolean eval(node *);
+	showFlag(int t) : show_(t) {}
+};
+
+
+class userFlag : public flags {
+	int level_;
+public:
+	virtual Boolean eval(node *);
+	userFlag(int t) : level_(t) {}
+};
+
+class selectionFlag : public flags {
+public:
+	virtual Boolean eval(node *);
+	selectionFlag() {}
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/fonts_prefs.cc b/ecflow_4_0_7/view/src/fonts_prefs.cc
new file mode 100644
index 0000000..ba5a339
--- /dev/null
+++ b/ecflow_4_0_7/view/src/fonts_prefs.cc
@@ -0,0 +1,24 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "fonts_prefs.h"
+
+void fonts_prefs::create(Widget w,char*) 
+{ 
+	fonts_form_c::create(w); 
+	prefs::setup(w); 
+}
+
+// static fonts_prefs hp;
diff --git a/ecflow_4_0_7/view/src/fonts_prefs.h b/ecflow_4_0_7/view/src/fonts_prefs.h
new file mode 100644
index 0000000..3a2f78a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/fonts_prefs.h
@@ -0,0 +1,133 @@
+#ifndef fonts_prefs_H
+#define fonts_prefs_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#ifndef prefs_H
+#include "prefs.h"
+#endif
+
+#ifndef uifonts
+#include "uifonts.h"
+#endif
+
+
+class fonts_prefs : public prefs, public fonts_form_c {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	fonts_prefs() {}
+
+// -- Destructor
+
+	~fonts_prefs() {}
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	virtual Widget widget() { return _xd_rootwidget; }
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	fonts_prefs(const fonts_prefs&);
+	fonts_prefs& operator=(const fonts_prefs&);
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+	virtual void changedCB( Widget w, XtPointer ) { pref_editor::changed(w); }
+	virtual void useCB( Widget w, XtPointer )     { pref_editor::use(w);     }
+
+	virtual void create(Widget w,char*);
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const fonts_prefs& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(fonts_prefs**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(fonts_prefs);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/fsb.cc b/ecflow_4_0_7/view/src/fsb.cc
new file mode 100644
index 0000000..cf787d2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/fsb.cc
@@ -0,0 +1,91 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdarg.h>
+#include <stdio.h>
+#include "fsb.h"
+#include "gui.h"
+extern "C" {
+#include "xec.h"
+}
+
+fsb::fsb():
+	file_(0)
+{
+	create(gui::top());
+}
+
+fsb::~fsb()
+{
+	if(file_) XtFree(file_);
+}
+
+
+const char* fsb::ask(const char* title,
+	const char* file,const char* filter,
+	const char* dir)
+{
+	return instance().choose(title,file,filter,dir);
+}
+
+
+const char* fsb::choose(const char* title,
+	const char* deffile,const char* filter,
+	const char* directory)
+
+{
+	if(file_) XtFree(file_);
+	file_ = 0;
+
+	set(XmNdirSpec,deffile);
+	set(XmNpattern,filter);
+	set(XmNdirectory,directory);
+
+	instance().modal(title,True);
+
+	return file_;
+
+}
+
+void fsb::set(const char* res,const char* val)
+{
+	if(!val) return;
+	XmString s = XmStringCreateSimple((char*)val);
+	XtVaSetValues(form_,res,s,NULL);
+	XmStringFree(s);
+}
+
+void fsb::okCB(Widget,XtPointer data)
+{
+	XmFileSelectionBoxCallbackStruct* cb = (XmFileSelectionBoxCallbackStruct*)data;
+
+	char buf[1024];
+
+	char *f = (char*)xec_GetString(cb->value);
+	char *d = (char*)xec_GetString(cb->dir);
+
+	if(*f == '/')
+		strcpy(buf,f);
+	else    
+		sprintf(buf,"%s%s",d,f);
+
+	XtFree(f);
+	XtFree(d);
+
+	file_ = XtNewString(buf);
+
+	ok_   = true;
+	stop_ = true;
+}
diff --git a/ecflow_4_0_7/view/src/fsb.h b/ecflow_4_0_7/view/src/fsb.h
new file mode 100644
index 0000000..6143b3a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/fsb.h
@@ -0,0 +1,125 @@
+#ifndef fsb_H
+#define fsb_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#include "uifsb.h"
+#include "dialog.h"
+
+class fsb : public dialog<fsb,fsb_shell_c> {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	fsb();
+
+// -- Destructor
+
+	~fsb(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+	static const char* ask(const char* title, 
+		const char* file   = 0,
+		const char* filter = 0,
+		const char* dir    = 0);
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	fsb(const fsb&);
+	fsb& operator=(const fsb&);
+
+
+	char* file_;
+
+// -- Methods
+
+	void set(const char*,const char*);
+
+	const char* choose(const char*,const char*,
+		const char*,const char*);
+
+
+// -- Overridden methods
+
+	virtual void okCB( Widget, XtPointer ) ;
+
+// -- Class members
+
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const fsb& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(fsb**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(fsb);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/gen.sh b/ecflow_4_0_7/view/src/gen.sh
new file mode 100755
index 0000000..3734468
--- /dev/null
+++ b/ecflow_4_0_7/view/src/gen.sh
@@ -0,0 +1,21 @@
+#!/bin/ksh
+#-transparent-color E79D 
+CMD="convert -size 16x16 -background #e5e5e5e5e5e5 -fill"
+CMD="convert -size 16x16 -background grey90 -fill"
+# convert -list color | grep 229
+
+CIRCLE="circle 1,1 5,5;"
+$CMD 'orange'   -draw "$CIRCLE text 8,12 'u'" circle_red.svg icon_force_abort.xpm
+$CMD 'green' -draw "$CIRCLE text 8,12 'e'" circle_red.svg icon_user_edit.xpm
+$CMD 'red' -draw "$CIRCLE   text 8,12 'a'" circle_red.svg icon_task_aborted.xpm
+$CMD 'red' -draw "$CIRCLE   text 8,12 'e'" circle_red.svg icon_edit_failed.xpm
+$CMD 'red' -draw "$CIRCLE   text 8,12 'c'" circle_red.svg icon_cmd_failed.xpm
+$CMD 'red' -draw "$CIRCLE   text 8,12 's'" circle_red.svg icon_no_script.xpm
+$CMD 'red' -draw "$CIRCLE   text 8,12 'k'" circle_red.svg icon_killed.xpm
+$CMD 'green' -draw "$CIRCLE text 8,12 'r'" circle_red.svg icon_byrule.xpm
+$CMD 'green' -draw "$CIRCLE text 8,12 'q'" circle_red.svg icon_queuelimit.xpm
+
+for f in *xpm; do perl xpm2cc $f > $(basename $f xpm)cc; done
+
+
+
diff --git a/ecflow_4_0_7/view/src/gen_translator.h b/ecflow_4_0_7/view/src/gen_translator.h
new file mode 100644
index 0000000..780ce49
--- /dev/null
+++ b/ecflow_4_0_7/view/src/gen_translator.h
@@ -0,0 +1,25 @@
+#ifndef gen_translator_H
+#define gen_translator_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+template<class From,class To>
+class translator {
+public:
+	To operator()(const From& from);
+};
+
+#endif // gen_translator_H
diff --git a/ecflow_4_0_7/view/src/globals.cc b/ecflow_4_0_7/view/src/globals.cc
new file mode 100644
index 0000000..eb4f790
--- /dev/null
+++ b/ecflow_4_0_7/view/src/globals.cc
@@ -0,0 +1,92 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include "globals.h"
+#include "str.h"
+#include "option.h"
+#include "configurator.h"
+#include "choice.h"
+#include "gui.h"
+#include <string>
+
+static option<int>  s0(globals::instance(),"timeout",60);
+static option<int>  s1(globals::instance(),"maximum",60);
+static option<bool> s3(globals::instance(),"drift",true);
+static option<bool> s4(globals::instance(),"poll",true);
+static option<bool> s5(globals::instance(),"aborted",true);
+static option<bool> s6(globals::instance(),"late",true);
+static option<bool> s7(globals::instance(),"restarted",true);
+static option<bool> s8(globals::instance(),"new_suites",false);
+static option<bool> s9(globals::instance(),"direct_read",true);
+
+static option<bool> s10(globals::instance(),"zombied",false);
+static option<bool> s11(globals::instance(),"aliases",false);
+static option<bool> s13(globals::instance(),"late_family",false);
+
+static option<bool> e1(globals::instance(),"send_as_alias",false);
+static option<int> s12(globals::instance(),"jobfile_length",10000);
+
+// User
+
+static option<choice> u0(globals::instance(),"user_level",0);
+
+
+globals::globals()
+#ifdef alpha
+	:configurable("user.default")
+#endif
+{
+}
+
+globals::~globals()
+{
+}
+
+const char* globals::name() const
+{
+	return "user.default";
+}
+
+globals* globals::instance()
+{
+	static globals* g = new globals();
+	return g;
+}
+
+
+void globals::changed(resource& c)
+{
+	gui::changed(c);
+}
+
+void globals::set_resource(const str& name,int value)
+{
+	option<int> o(instance(),name,value);
+	o = value;
+	XECFDEBUG std::cout << "# resource: " << name.c_str() << "   " << value << std::endl;
+}
+
+int globals::get_resource(const str& name,int value)
+{
+	option<int> o(instance(),name,value);
+	return o;
+}
+
+int globals::user_level()
+{
+	choice c = u0;
+	return c;
+}
diff --git a/ecflow_4_0_7/view/src/globals.h b/ecflow_4_0_7/view/src/globals.h
new file mode 100644
index 0000000..95dd2b3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/globals.h
@@ -0,0 +1,53 @@
+#ifndef globals_H
+#define globals_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef option_H
+#include "option.h"
+#endif
+
+#ifndef configurable_H
+#include "configurable.h"
+#endif
+
+
+class globals : public configurable {
+public:
+
+	globals();
+
+	~globals(); // Change to virtual if base class
+
+	static globals* instance();
+
+	static void set_resource(const str&,int);
+	static int  get_resource(const str&,int);
+
+	static int  user_level();
+
+private:
+
+	globals(const globals&);
+	globals& operator=(const globals&);
+
+	virtual const char* name() const;
+	virtual void changed(resource&);
+};
+
+inline void destroy(globals**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/graph_layout.cc b/ecflow_4_0_7/view/src/graph_layout.cc
new file mode 100644
index 0000000..12b1552
--- /dev/null
+++ b/ecflow_4_0_7/view/src/graph_layout.cc
@@ -0,0 +1,455 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "arch.h"
+#include "graph_layout.h"
+#include "node.h"
+#include "reach.h"
+#include "observer.h"
+#include "dummy_node.h"
+#include "trigger_panel.h"
+#include "trigger_lister.h"
+#include "selection.h"
+#include "xec.h"
+#include "str.h"
+#include "Hyper.h"
+#include "tmp_file.h"
+#include <Xm/PushBG.h>
+#include <Xm/SeparatoG.h>
+
+class graph_node : public observer, public xnode {
+protected:
+
+  graph_layout& owner_;
+  
+  void notification(observable*)	{ redraw(); }
+  void adoption(observable* o,observable* n)  { node_ = (node*)n; }
+  void gone(observable*)		{ owner_.remove(this); delete this; }
+  
+  void draw(Widget w,XRectangle* r)  { node_->drawNode(w,r,false); }
+  
+  void size(Widget w,XRectangle* r)  { node_->sizeNode(w,r,false); }
+  
+public:
+	graph_node(graph_layout&,node*); 
+};
+
+graph_node::graph_node(graph_layout& t,node *n):
+	xnode(n),
+	owner_(t)
+{
+	observe(n);
+}
+
+//===============================================================
+
+struct node_relation {
+	node*	       trigger_;
+	node*	       through_;
+	int	       mode_;
+	node_relation* next_;
+
+	node_relation(node* tg,node* th,int m):
+		trigger_(tg), through_(th), mode_(m), next_(0) {}
+};
+
+//===============================================================
+
+graph_layout::graph_layout(trigger_panel& t,Widget w):
+	layout(t,w),
+	link_(false)
+{
+	add_input_CB();
+}
+
+graph_layout::~graph_layout()
+{
+	clear();
+}
+
+Widget graph_layout::menu1()
+{
+	if(link_)
+		return owner_.linkMenu();
+	else
+		return owner_.infoMenu();
+}
+
+Widget graph_layout::menu2()
+{
+	return menu1();
+}
+
+xnode* graph_layout::xnode_of(node& n)
+{
+	for(int i = 0; i < nodes_.count(); i++)
+		if(nodes_[i]->get_node() == &n)
+			return nodes_[i];
+	return 0;
+}
+
+void graph_layout::clear()
+{
+	int i;
+	NodeReset(widget_);
+	for(i = 0; i < nodes_.count(); i++)
+		delete nodes_[i];
+	nodes_.clear();
+
+	for(i = 0; i < relations_.count(); i++)
+		delete relations_[i];
+	relations_.clear();
+
+	link_ = false;
+}
+
+
+
+class nl1 : public trigger_lister {
+	int	    n_;
+	graph_layout&	t_;
+	node* g_;
+	bool e_;
+public:
+
+	nl1(graph_layout& t,node* g,bool e) : n_(0), t_(t), g_(g), e_(e) {}
+
+	void next_node(node& n,node* p,int mode,node* t) {
+		t_.relation(&n,g_,p,mode,t);
+		n_++;
+	}
+
+	Boolean parents() { return e_; }
+	Boolean kids() { return e_; }
+
+	int count() { return n_; }
+};
+
+class nl2 : public trigger_lister {
+	int	    n_;
+	graph_layout&	t_;
+	node* g_;
+	bool e_;
+public:
+
+	nl2(graph_layout& t,node* g,bool e) :  n_(0), t_(t), g_(g), e_(e) {}
+	void next_node(node& n,node* p,int mode,node* t) {
+		t_.relation(g_,&n,p,mode,t);
+		n_++;
+	}
+	Boolean parents() { return e_; }
+	Boolean kids()	  { return e_; }
+
+	int count() { return n_; }
+};
+
+graph_node *graph_layout::get_graph_node(node* n)
+{
+	if(!n) return 0;
+
+	n = n->graph_node();
+
+	graph_node* t = (graph_node*)xnode_of(*n);
+	if(t) return t;
+
+	t = new graph_node(*this,n);
+	t->getBox(widget_);
+	t->visibility(True);
+
+	nodes_.add(t);
+
+	return t;
+}
+
+void graph_layout::remove(graph_node* g)
+{
+	nodes_.remove(g);
+}
+
+void graph_layout::click1(node* n,Boolean shift,Boolean control)
+{
+	if(n != 0) node_window::click1(n,shift,control);
+}
+
+
+void graph_layout::click2(node* n,Boolean shift,Boolean control)
+{
+	grow(n);
+
+	if(shift && !control)
+	{
+		node *p = n->parent();
+		if(p) {
+			relation(p,n,0,trigger_lister::hierarchy,0);
+			grow(p);
+		}
+	}
+
+	if(control)
+	{
+		grow(n,True);
+	}
+
+	if(shift && control)
+	{
+		int count = 0;
+		while(count != nodes_.count())
+		{
+			count = nodes_.count();
+			for(int i = 0; i < count; i++)
+				grow(nodes_[i]->get_node());
+		}
+	}
+}
+
+void graph_layout::show(node& n)
+{
+	clear();
+	grow(&n,False);
+
+	graph_node *g = get_graph_node(&n); 
+	if(g) {
+		g->select();
+		g->setFocus();
+	}
+}
+
+static void clear_menu(Widget menu)
+{
+	WidgetList wl = 0;
+	int count = 0;
+
+	XtVaGetValues(menu,
+			XmNchildren,&wl,
+			XtNnumChildren,&count,
+			NULL);
+	XtUnmanageChildren(wl,count);
+}
+
+
+static void add_button(Widget menu,node* n,const char* a,const char* b)
+{	
+	WidgetList wl = 0;
+	int count = 0;
+	Widget w = 0;
+
+	XtVaGetValues(menu,
+		      XmNchildren,&wl,
+		      XtNnumChildren,&count,
+		      NULL);
+
+	for(int i = 0 ; i < count; i++)
+		if(!XtIsManaged(wl[i]))
+		{
+			w = wl[i];
+			break;
+		}
+
+	if(!w) 
+	  w = XmCreatePushButtonGadget(menu,"button",NULL,0);
+
+	xmstring s = xmstring(a,"bold") + xmstring(" ") + xmstring(b);
+
+	XtVaSetValues(w,
+		      XmNlabelString, XmString(s),
+		      XmNuserData,    n,
+		      NULL);
+
+	XtManageChild(w);	       
+}
+
+static void add_separator(Widget menu)
+{	
+	WidgetList wl = 0;
+	int count = 0;
+	Widget w = 0;
+
+	XtVaGetValues(menu,
+		      XmNchildren,&wl,
+		      XtNnumChildren,&count,
+		      NULL);
+
+	for(int i = 0 ; i < count; i++)
+		if(!XtIsManaged(wl[i]))
+		{
+			w = wl[i];
+			break;
+		}
+
+	if(!w) w = XmCreateSeparatorGadget(menu,"button",NULL,0);
+	XtManageChild(w);
+}
+
+static void tidy_menu(Widget menu)
+{
+  WidgetList wl = 0;
+  int count = 0;
+  XtVaGetValues(menu, XmNchildren,&wl, XtNnumChildren,&count, NULL);
+
+  for(int i = 0 ; i < count; i++)
+    if(XmIsPushButtonGadget(wl[i]))
+      if(xec_GetUserData(wl[i]) == 0)
+	XtUnmanageChild(wl[i]);
+}
+
+void graph_layout::link(XEvent* event_node,node* n1,node* n2)
+{
+  graph_node *g1 = get_graph_node(n1);
+  graph_node *g2 = get_graph_node(n2);
+  node* n = 0;
+  
+  link_ = false;
+  
+  if(g1 && g2)
+    {
+      link_ = true;
+      
+      node_relation* r = (node_relation*)g1->relation_data(g2);
+      
+      tmp_file tmp(tmpnam(0));
+      FILE *f = fopen(tmp.c_str(),"w");
+      
+      if(f) {
+	fprintf(f,"From: {%s}\n",n1->full_name().c_str());
+	fprintf(f,"To	 : {%s}\n",n2->full_name().c_str());
+      }
+      
+      clear_menu(owner_.linkMenu());
+      add_button(owner_.linkMenu(),n1,"From",n1->full_name().c_str());
+      add_button(owner_.linkMenu(),n2,"To",n2->full_name().c_str());
+      
+      while(r)
+	{
+	  if(f) fprintf(f,"\n");
+	  add_separator(owner_.linkMenu());
+	  
+	  if((n = r->trigger_)) {
+	    if(f) fprintf(f,"Trigger: %s\n",n->definition().c_str());
+	    add_button(owner_.linkMenu(),n,"Trigger",n->definition().c_str());
+	  }
+	  else add_button(owner_.linkMenu(),0,"-","-");
+	  
+	  if((n = r->through_)) {
+	    
+	    if(f) fprintf(f,"Through: {%s}\n",n->full_name().c_str());
+	    add_button(owner_.linkMenu(),n,"Through",n->full_name().c_str());
+	  }
+	  else add_button(owner_.linkMenu(),0,"-","-");
+	  
+	  r = r->next_;
+	}
+      tidy_menu(owner_.linkMenu());
+      
+      if(f) fclose(f);
+      HyperLoadFile(owner_.dependHyperText(),(char*)tmp.c_str());
+      if(event_node->xbutton.button == 1)
+	owner_.showDependWindow();
+    }
+  
+  if(!link_) {
+    HyperSetText(owner_.dependHyperText(),"");
+    owner_.hideDependWindow();
+  }
+}
+
+void graph_layout::selectNode(node *n)
+{
+  if(n)
+    {
+      graph_node* g = (graph_node*)xnode_of(*n);
+      if(g) g->show();
+      selection::notify_new_selection(n);
+    }
+}
+
+int graph_layout::grow(node* n,Boolean )
+{
+  nl1 l1(*this,n,owner().extended());
+  if(owner().triggers()) n->triggers(l1);
+  
+  nl2 l2(*this,n,owner().extended());
+  if(owner().triggered()) n->triggered(l2);
+  
+  return l1.count() + l2.count();
+}
+
+void graph_layout::relation(node* from, node* to, 
+			    node* through, int mode,node *trigger)
+{
+  graph_node* from_g    = get_graph_node(from);
+  graph_node* to_g      = get_graph_node(to);
+  
+  from_g->relation(to_g);
+  
+  node_relation* n = (node_relation*)from_g->relation_data(to_g);
+  while(n)
+    {
+      if(n->trigger_ == trigger &&
+	 n->through_ == through &&
+	 n->mode_    == mode)
+	break;
+      
+      n = n->next_;
+    }
+  
+  if(n == 0) {
+    
+    n = new node_relation(trigger,through,mode);
+    relations_.add(n);
+    
+    void* x = from_g->relation_data(to_g,n);
+		if(x) n->next_ = (node_relation*)x;
+  }
+  
+  switch(mode)
+    {
+    case trigger_lister::normal:
+      break;
+      
+    case trigger_lister::child:
+      /* from_g->relation_gc(to_g,gui::colorGC(STATUS_SUBMITTED)); */
+      from_g->relation_gc(to_g,gui::blueGC());
+      break;
+      
+    case trigger_lister::parent:
+      //from_g->relation_gc(to_g,gui::colorGC(STATUS_COMPLETE));
+      from_g->relation_gc(to_g,gui::blueGC());
+      break;
+      
+    case trigger_lister::hierarchy:
+      from_g->relation_gc(to_g,gui::colorGC(STATUS_ABORTED));
+      break;
+    }
+}
+
+class graph_layout_reacher : public reach_lister {
+  graph_layout& g_;
+public:
+  graph_layout_reacher(graph_layout& g) : g_(g) {}
+  
+  void next(node* from, node* to,node* through, int mode,node *trigger)
+  {
+    g_.relation(from,to,through,mode,trigger);
+  }
+};
+
+void graph_layout::reach(node* n1,node* n2)
+{
+  graph_layout_reacher rl(*this);
+  clear();
+  reach::join(n1,n2,rl);
+}
+
+//====================================================================
diff --git a/ecflow_4_0_7/view/src/graph_layout.h b/ecflow_4_0_7/view/src/graph_layout.h
new file mode 100644
index 0000000..a9c2712
--- /dev/null
+++ b/ecflow_4_0_7/view/src/graph_layout.h
@@ -0,0 +1,74 @@
+#ifndef graph_layout_H
+#define graph_layout_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "array.h"
+
+#ifndef node_window_H
+#include "node_window.h"
+#endif
+
+#ifndef layout_H
+#include "layout.h"
+#endif
+
+class graph_node;
+struct node_relation;
+
+class graph_layout : public layout, 
+		         public node_window {
+public:
+	graph_layout(trigger_panel&,Widget);
+
+	~graph_layout(); // Change to virtual if base class
+
+	graph_node* get_graph_node(node*);
+	int grow(node*,Boolean = False);
+	void siblings(node*);
+
+	virtual void show(node&);
+	virtual void clear();
+	virtual void reach(node*,node*);
+	virtual void selectNode(node*);
+	virtual xnode* xnode_of(node&);
+	virtual void click1(node*,Boolean,Boolean);
+	virtual void click2(node*,Boolean,Boolean);
+
+	Widget node_widget() { return widget_; }
+	void remove(graph_node*);
+
+	void relation(node*,node*,node*,int,node*);
+
+private:
+
+	graph_layout(const graph_layout&);
+	graph_layout& operator=(const graph_layout&);
+	
+	array<graph_node*>    nodes_;
+	array<node_relation*> relations_;
+	bool  link_;
+
+	void scan(node*,node*);
+
+	virtual Widget menu1();
+	virtual Widget menu2();
+
+	virtual void link(XEvent*,node*,node*);
+};
+
+inline void destroy(graph_layout**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/gui.cc b/ecflow_4_0_7/view/src/gui.cc
new file mode 100644
index 0000000..335d006
--- /dev/null
+++ b/ecflow_4_0_7/view/src/gui.cc
@@ -0,0 +1,377 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdarg.h>
+#include <stdio.h>
+#include "gui.h"
+#include "top.h"
+#include "str.h"
+#include "option.h"
+#include "host.h"
+#include "globals.h"
+#include "Str.hpp"
+
+#include <string.h> /* strerror */
+using namespace ecf;
+
+static interface* intf_= 0;
+
+// Colors
+
+static resource* gui_resources[] = {
+	new option<str>(globals::instance(),"color_black","black"),
+	new option<str>(globals::instance(),"color_blue","blue"),
+	new option<str>(globals::instance(),"color_red","red"),
+
+	new option<str>(globals::instance(),"color_unknown",   "grey"),
+	new option<str>(globals::instance(),"color_suspended", "orange"),
+	new option<str>(globals::instance(),"color_complete",  "yellow"),
+	new option<str>(globals::instance(),"color_queued",    "lightblue"),
+	new option<str>(globals::instance(),"color_submitted", "turquoise"),
+	new option<str>(globals::instance(),"color_active",    "green"),
+	new option<str>(globals::instance(),"color_aborted",   "red"),
+	new option<str>(globals::instance(),"color_shutdown",  "pink"),
+	new option<str>(globals::instance(),"color_halted",    "violet"),
+
+	new option<str>(globals::instance(),"color_meter_low",  "blue"),
+	new option<str>(globals::instance(),"color_threshold",  "blue"),
+	new option<str>(globals::instance(),"color_event",      "blue"),
+
+	new option<str>(globals::instance(),"normal_font_plain", 
+			"-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*"),
+
+	new option<str>(globals::instance(),"normal_font_bold",  
+			"-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*"),
+
+	new option<str>(globals::instance(),"small_font_plain",  
+			"-*-helvetica-medium-r-normal-*-11-*-*-*-*-*-*-*"),
+
+	new option<str>(globals::instance(),"small_font_bold",   
+			"-*-helvetica-bold-r-normal-*-11-*-*-*-*-*-*-*"),
+
+	new option<str>(globals::instance(),"tiny_font_plain",  
+			"-*-*-*-*-*-*-7-*-*-*-*-*-*-*"),
+
+	new option<str>(globals::instance(),"tiny_font_bold",   
+			"-*-*-bold-*-*-*-7-*-*-*-*-*-*-*"),
+};
+
+class tidy_gui_resources {
+public:
+	~tidy_gui_resources() {
+		for(unsigned int i = 0; i < XtNumber(gui_resources) ; i++)
+                  delete gui_resources[i];
+	}
+};
+
+void split_msg(std::string& msg) {
+  std::vector< std::string > lineTokens;
+  Str::split(msg, lineTokens);
+  msg.clear();
+  for (size_t i=0; i<lineTokens.size(); ++i) {
+    msg += lineTokens[i];
+    if (i%10 == 0) msg += "\n";
+    else msg += " ";
+  }
+}
+
+#if !defined(_AIX)
+static tidy_gui_resources tgr;
+#endif
+
+void gui::login(const char* host)
+{
+  if (intf_) intf_->login(host);
+}
+
+void gui::logout(const char* host)
+{
+  if (intf_) intf_->logout(host);
+}
+
+void gui::add_host(const std::string& host)
+{
+  if (intf_) intf_->add_host(host);
+}
+
+void gui::message(const char* fmt,...)
+{
+    char buf[1024];
+    va_list   args;
+    va_start(args,fmt);
+    vsprintf(buf,fmt,args);
+    intf_->message(buf);
+    va_end(args);
+
+    va_start(args,fmt);    
+    va_end(args);
+}
+
+void gui::raise()
+{
+  Widget w = top();
+  if(w && XtIsRealized(w))
+    XMapRaised(XtDisplay(w),XtWindow(w));
+}
+
+Widget gui::top()
+{
+	return intf_->top_shell();
+}
+
+Widget gui::trees()
+{
+	return intf_->trees();
+}
+
+Widget gui::windows()
+{
+	return intf_->windows();
+}
+
+void gui::watch(Boolean)
+{
+}
+
+void gui::clear()
+{
+	intf_->clear();
+}
+
+
+Pixel gui::pixel(const char* name)
+{
+	static str grey("grey");
+
+	char buf[1024];
+
+	sprintf(buf,"color_%s",name);
+
+	str s = option<str>(globals::instance(),buf,grey);
+
+	XrmValue from_value, to_value;
+
+	from_value.addr = (char*)s.c_str();
+	from_value.size = strlen(from_value.addr) + 1;
+
+	Pixel p = 0;
+
+	to_value.addr = (char*)&p;
+	to_value.size = sizeof(Pixel);
+
+	XtConvertAndStore(gui::top(),
+		XmRString, &from_value,
+		XmRPixel, &to_value);
+
+	return p;
+}
+
+
+static GC makegc(Pixel p)
+{
+	XGCValues values;
+	XtGCMask  valuemask  = GCForeground;
+	values.foreground     = p;
+
+	Widget w = gui::top();
+	return XCreateGC(XtDisplay(w),XtWindow(w),valuemask,&values);
+}
+
+static XmFontList makefont(const char* name)
+{
+	XrmValue from_value, to_value;
+
+	from_value.addr = (char*)name;
+	from_value.size = strlen( from_value.addr ) + 1;
+
+	XmFontList p = 0;
+
+	to_value.addr = (char*)&p;
+	to_value.size = sizeof(XmFontList);
+
+	XtConvertAndStore(gui::top(),
+		XmRString, &from_value,
+		XmRFontList, &to_value);
+
+	return p;
+}
+
+static XmFontList font(const char* name)
+{
+	char buf[1024];
+
+	sprintf(buf,"%s_plain",name);
+	str plain = option<str>(globals::instance(),buf,"fixed");
+
+	sprintf(buf,"%s_bold",name);
+	str bold  = option<str>(globals::instance(),buf,"fixed");
+
+	str f = plain + str("=normal,") + bold + str("=bold");
+	return makefont(f.c_str());
+}
+
+inline GC makegc(const char* p)
+{
+  return makegc(gui::pixel(p));
+}
+
+static Pixel *status_colors = 0;
+
+char *ecf_colors_name[]
+= { (char*)"unknown", (char*)"suspended", (char*)"complete", (char*)"queued", (char*)"submitted", (char*)"active",
+    (char*)"aborted", (char*)"shutdown",  (char*)"halted"  ,  
+    (char*)"meter_low",(char*)"threshold"  ,   (char*)"event"  ,  
+    NULL };
+
+Pixel gui::colors(unsigned int n)
+{
+	if(status_colors == 0)
+	{
+          status_colors = new Pixel[XtNumber(::ecf_colors_name)];
+          for(unsigned int i = 0 ; i < XtNumber(::ecf_colors_name); i++)
+            status_colors[i] = gui::pixel(::ecf_colors_name[i]);
+	}
+	return status_colors[n];
+}
+
+static XmFontList normalFont = 0;
+static XmFontList smallFont  = 0;
+static XmFontList tinyFont  = 0;
+
+XmFontList gui::fontlist(void)
+{
+	if(normalFont == 0)
+		normalFont = font("normal_font");
+	return normalFont;
+}
+
+XmFontList gui::smallfont(void)
+{
+	if(smallFont == 0)
+		smallFont = font("small_font");
+	return smallFont;
+}
+
+XmFontList gui::tinyfont(void)
+{
+	if(tinyFont == 0)
+		tinyFont = font("tiny_font");
+	return tinyFont;
+}
+
+GC gui::blackGC(void)
+{
+	static GC gc = makegc("black");
+	return gc;
+}
+
+GC gui::blueGC(void)
+{
+	static GC gc = makegc("blue");
+	return gc;
+}
+
+GC gui::redGC(void)
+{
+	static GC gc = makegc("red");
+	return gc;
+}
+
+static GC* status_gc = 0;
+GC gui::colorGC(unsigned int n)
+{
+	if(status_gc == 0)
+	{
+          status_gc = new GC[XtNumber(::ecf_colors_name)];
+          for(unsigned int i = 0 ; i < XtNumber(::ecf_colors_name); i++)
+            status_gc[i] = makegc(colors(i));
+	}
+	if(n < 0 || n>= XtNumber(::ecf_colors_name)) return blackGC();
+	return status_gc[n];
+}
+
+
+void gui::changed(resource& c)
+{
+	for(unsigned int i = 0; i < XtNumber(gui_resources) ; i++)
+	{
+		if(&c == gui_resources[i])
+		{
+			delete[] status_colors; status_colors = 0;
+			delete[] status_gc;     status_gc     = 0;
+
+			normalFont = 0;
+			smallFont  = 0;
+
+			host::redraw_all();
+			break;
+		}
+	}
+}
+
+void gui::rename_host(const std::string& a,const std::string& b)
+{
+	intf_->rename_host(a,b);
+}
+
+void gui::remove_host(const std::string& a)
+{
+	intf_->remove_host(a);
+}
+
+void gui::set_interface(interface* i)
+{
+	intf_= i;
+}
+
+void gui::error(const char* fmt,...)
+{
+        char buf[10240];
+	va_list arg;
+	va_start(arg,fmt);
+
+	vsprintf(buf,fmt,arg);
+	va_end(arg);
+
+	std::string msg = buf;
+	split_msg(msg);
+	intf_->error(msg.c_str());
+}
+
+void gui::error(ecf_list *l)
+{    
+  // char buf[10240];
+    char buf[240];
+    buf[0] = 0;
+    while(l)
+    {
+      if(strlen(l->name().c_str()) + 2 >= sizeof(buf))
+            break;
+        if(buf[0]) strcat(buf,"\n");
+        strcat(buf,l->name().c_str());
+        l = l->next;
+    }
+	intf_->error(buf);
+}
+
+void gui::syserr(const char* msg)
+{
+  gui::error("%s",msg);
+}
+
+bool gui::visible()
+{
+	return intf_->visible();
+}
diff --git a/ecflow_4_0_7/view/src/gui.h b/ecflow_4_0_7/view/src/gui.h
new file mode 100644
index 0000000..c1ddd6a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/gui.h
@@ -0,0 +1,83 @@
+#ifndef gui_H
+#define gui_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "ecflowview.h"
+#include <Xm/Xm.h>
+#include <string>
+
+class resource;
+class interface;
+class node;
+
+class gui {
+public:
+
+	gui() {}
+
+	static void clear();
+	static void message(const char* fmt,...);
+	static void watch(Boolean);
+
+	static void add_host(const std::string&);
+	static void rename_host(const std::string&,const std::string&);
+	static void remove_host(const std::string&);
+
+	static void login(const char*);
+	static void logout(const char*);
+
+	static Widget top();
+	static Widget trees();
+	static Widget windows();
+
+	static void raise();
+
+	//--------------------------------------
+
+	static void       changed(resource&);
+
+	static GC         blackGC();
+	static GC         blueGC();
+	static GC         redGC();
+
+	static XmFontList smallfont();
+	static XmFontList fontlist();
+	static XmFontList tinyfont();
+	static Pixel      colors(unsigned int);
+	static GC         colorGC(unsigned int);
+
+	static void set_interface(interface*);
+	static Pixel pixel(const char* name);
+
+
+	//------------------------------------------------------
+
+	static bool visible();
+
+	static void error(const char*,...);
+	void error(ecf_list *l);
+	static void syserr(const char*);
+
+private:
+
+	gui(const gui&);
+	gui& operator=(const gui&);
+
+};
+
+inline void destroy(gui**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/history.cc b/ecflow_4_0_7/view/src/history.cc
new file mode 100644
index 0000000..2a7f623
--- /dev/null
+++ b/ecflow_4_0_7/view/src/history.cc
@@ -0,0 +1,116 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "history.h"
+#include "node.h"
+#include "host.h"
+#include "selection.h"
+#include <Xm/List.h>
+extern "C" {
+#include "xec.h"
+}
+
+const int kMaxLines = 400;
+
+history::history(panel_window& w):
+	panel(w),
+	timeout(30),
+	last_("")
+{
+  panel::detach();
+}
+
+history::~history()
+{
+}
+
+void history::clear()
+{
+	last_ = "";
+	XmListDeleteAllItems(list_);
+	timeout::disable();
+}
+
+void history::show(node& n)
+{
+	timeout::enable();
+	add(n.serv());
+}
+
+void history::run()
+{
+	if(get_node())
+		add(get_node()->serv());
+	else 
+		clear();
+}
+
+Boolean history::enabled(node& n)
+{
+  return n.type() == NODE_SUPER;
+}
+
+void history::browseCB(Widget,XtPointer data)
+{
+	XmListCallbackStruct* cb = (XmListCallbackStruct*)data;
+	char *p = (char*)xec_GetString(cb->item);
+
+	if(get_node())
+	{
+		node* n = get_node()->find_match(p);
+		if(n)  selection::notify_new_selection(n);
+	}
+	else
+		clear();
+
+	XtFree(p); 
+}
+
+void history::add(host& h)
+{
+  std::list<std::string>& l = h.history(last_);
+  int pos = 0;
+  XtVaGetValues(list_,XmNitemCount,&pos,NULL);
+  std::string prev = last_;
+  std::list<std::string>::const_iterator j;
+  for(j = l.begin(); j != l.end() ; ++j) 
+    {
+      if (j->empty()) {}
+      else if (*j == "") {}
+      /* filter out line with time stamp older than last */
+      else if (last_ != "" && strcmp(j->c_str()+3, last_.c_str()+3) <= 0) {}
+      /* filter out some commands */
+      else if (j->find("command:LogCmd") != std::string::npos) {}
+      else if (j->find("--log=get") != std::string::npos) {}
+      else if (j->find("--news") != std::string::npos) {}
+      /* add interesting lines */
+      else {
+	if(pos >= kMaxLines)
+	  XmListDeletePos(list_,1); 
+	else
+	  pos++;
+	
+	int err = j->substr(0, 4)=="ERR:"; /* bold ? */
+	xec_AddFontListItem(list_,(char*)j->c_str(),err);
+	prev = *j;
+      }
+    }
+  
+  XmListSetBottomPos(list_,pos);
+  l.clear();
+  last_ = prev;
+}
+
+// static panel_maker<history> maker(PANEL_HISTORY);
diff --git a/ecflow_4_0_7/view/src/history.h b/ecflow_4_0_7/view/src/history.h
new file mode 100644
index 0000000..87794cb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/history.h
@@ -0,0 +1,59 @@
+#ifndef history_H
+#define history_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#include "timeout.h"
+#include "ecflowview.h"
+#include "uihistory.h"
+
+class host;
+
+class history : public panel, public history_form_c, public timeout {
+public:
+
+	history(panel_window&);
+
+	~history(); // Change to virtual if base class
+
+	virtual const char* name() const { return "History"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+
+private:
+
+	history(const history&);
+	history& operator=(const history&);
+
+	std::string last_;
+
+	void run();
+	void add(host&);
+	void update() {}
+
+	virtual void browseCB(Widget,XtPointer);
+
+};
+
+inline void destroy(history**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/host.cc b/ecflow_4_0_7/view/src/host.cc
new file mode 100644
index 0000000..ec91213
--- /dev/null
+++ b/ecflow_4_0_7/view/src/host.cc
@@ -0,0 +1,1791 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #122 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string>
+#include <list>
+#include <algorithm>
+#include <boost/lexical_cast.hpp>
+#include "UrlCmd.hpp"
+#include <time.h>
+
+#include "ecflowview.h"
+#include "ecflow.h"
+#include "super_node.h"
+#include <ostream>
+
+#include "show.h"
+#include "edit.h"
+
+#ifndef scripting_H
+#include "scripting.h"
+#endif
+
+#ifndef late_H
+#include "late.h"
+#endif
+
+#ifndef zombie_H
+#include "zombie.h"
+#endif
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+#ifndef to_check_H
+#include "to_check.h"
+#endif
+
+#ifndef directory_H
+#include "directory.h"
+#endif
+
+#ifndef aborted_H
+#include "aborted.h"
+#endif
+
+#ifndef restart_H
+#include "restart.h"
+#endif
+
+#ifndef host_H
+#include "host.h"
+#endif
+
+#ifndef passwrd_H
+#include "passwrd.h"
+#endif
+
+#ifndef error_H
+#include "error.h"
+#endif
+
+#ifndef confirm_H
+#include "confirm.h"
+#endif
+
+#ifndef selection_H
+#include "selection.h"
+#endif
+
+#ifndef init_H
+#include "init.h"
+#endif
+
+#ifndef tree_H
+#include "tree.h"
+#endif
+
+#ifndef gui_H
+#include "gui.h"
+#endif
+
+#ifndef mail_H
+#include "mail.h"
+#endif
+
+#ifndef configurator_H
+#include "configurator.h"
+#endif
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+#ifndef logsvr_H
+#include "logsvr.h"
+#endif
+
+#include "Version.hpp"
+#include "ChangeMgrSingleton.hpp"
+
+#include "panel_window.h"
+#include <stdio.h>
+#include <assert.h>
+#include <boost/bind.hpp>
+
+#include "menus.h"
+/* #include <proc/readproc.h> */
+
+bool Updating::do_full_redraw_ = false;
+
+class SelectNode {
+public:
+  SelectNode(const std::string& name)
+   {
+     node* n = selection::current_node();
+     if (!n) return;
+     if (name == n->serv().name()) {
+       hostname_ = n->serv().name();
+       current_ = selection::current_path();
+     }
+   }
+
+   ~SelectNode()
+   {
+     if (hostname_.empty()) return;
+     host* h = host::find(hostname_);
+     if (h && !current_.empty()) {
+       node *n = h->top()->find(current_);
+       if (n) {
+	  selection::notify_new_selection(n);
+	}
+     }  
+   }
+
+private:
+  std::string current_, hostname_;
+};
+
+host::host( const std::string& name, const std::string& host, int number )
+         : timeout(5)
+#ifdef alpha
+	 , configurable(name),
+#endif
+	 , observable()
+	 , host_(host)
+	 , number_(number)
+	 , name_(name)
+	 , connected_(false)
+	 , after_command_(true)
+	 , passwd_("-none-")
+	 , timeout_(this, "timeout", 5)
+	 , maximum_(this, "maximum", 60)
+	 , drift_(this, "drift", true)
+	 , connect_(this, "connect", false)
+	 , suites_(this, "suites", std::vector<std::string>())
+	 , aborted_(this, "aborted", true)
+	 , restarted_(this, "restarted", true)
+	 , late_(this, "late", true)
+	 , poll_(this, "poll", true)
+	 , direct_read_(this, "direct_read", true)
+	 , new_suites_(this, "new_suites", true)
+	 , zombie_(this, "zombie", false)
+	 , aliases_(this, "aliases", false)
+	 , late_family_(this, "late_family", false)
+	 , to_check_(this, "to_check", false)
+	 , chkmail_(true)
+	 , top_(0)
+	 , tree_(0)
+	 , mail_(0)
+	 , last_(0)
+	 , history_len_(100)
+	 , updating_(false)
+	 , jobfile_length_(this, "jobfile_length", 10000)
+{
+   if (number < 1) return; // dummy server OK;
+
+   if (number_) {
+      tree_ = tree::new_tree(this);
+      gui::add_host(name);
+   }
+
+   if (timeout_ < 1) timeout_ = 1;
+   if (maximum_ < 1) maximum_ = 1;
+
+   frequency(timeout_);
+}
+
+host::~host()
+{
+   if (tree_) {
+      delete tree_;
+   }
+}
+
+ehost::ehost( const std::string& name, const std::string& h, int number )
+         : host(name, h, number)
+{
+   try {
+      std::string port = boost::lexical_cast<std::string>(number);
+      client_.set_host_port(host_.c_str(), port);
+      client_.set_retry_connection_period(1);
+   }
+   catch ( std::exception& e ) {
+      gui::message("# Exception caught in host::host ");
+      gui::message(e.what());
+   }
+   if (connect_) login();
+}
+
+ehost::~ehost()
+{
+   connect_ = connected_;
+   logout();
+}
+
+void host::remove_host( const std::string& name )
+{
+   gui::remove_host(name);
+   ecf_nick_delete(name);
+   ecf_nick_write();
+   host* h = host::find(name);
+   if (h) {
+      h->logout();
+      delete h;
+   }
+}
+
+void host::broadcast( bool save )
+{
+   if (save) ecf_nick_write();
+}
+
+void host::login( const std::string& name )
+{
+   host* h = host::find(name);
+   if (h) h->login();
+}
+
+void host::logout( const std::string& name )
+{
+   host* h = host::find(name);
+   if (h) h->logout();
+}
+
+host* host::find( const std::string& machine, int number )
+{
+   host *h = extent < host > ::first();
+   while ( h ) {
+      if (h->host_ == machine && h->number_ == number) return h;
+      h = h->extent < host > ::next();
+   }
+   return 0x0;
+}
+
+host* host::find( const std::string& name )
+{
+   host *h = extent < host > ::first();
+   while ( h ) {
+      if (h->name() && h->name() == name) return h;
+      h = h->extent < host > ::next();
+   }
+   return 0;
+}
+
+node* host::find( const std::string& hostname, const std::string& n )
+{
+   host* h = find(hostname);
+   if (h && h->top_) 
+     return h->top_->find(n.c_str());
+
+   return 0x0;
+}
+
+void host::status( Boolean force )
+{
+   host *h = extent < host > ::first();
+   while ( h ) {
+      if (force) h->reset(force);
+      h->status();
+      h = h->extent < host > ::next();
+   }
+}
+
+void host::redraw_all()
+{
+   host *h = extent < host > ::first();
+   while ( h ) {
+      h->redraw();
+      h = h->extent < host > ::next();
+   }
+}
+
+void host::search( node_lister& s )
+{
+   if (top_) top_->search(s);
+}
+
+void host::logout()
+{
+   if (connected_) gui::logout(name());
+   searchable::active(False);
+   connected_ = false;
+
+   if (tree_) {
+      tree_->connected(False);
+      tree_->xd_hide();
+   }
+
+   destroy_top(top_);
+   top_ = 0x0;
+
+   notify_observers();
+}
+
+void host::destroy_top(node* the_top) const
+{
+   if (the_top) {
+      if (the_top->__node__()) {
+         the_top->__node__()->nokids(); // Suites + all children
+         the_top->__node__()->unlink();
+         delete the_top->__node__(); // Defs
+      }
+      node::destroy(the_top);
+   }
+}
+
+void ehost::logout()
+{
+   if (!connected_) return;
+
+   try {  client_.ch1_drop(); }
+   catch ( std::exception &e ) {
+      gui::message("host::logout-error: %s", e.what());
+   }
+
+   host::logout();
+}
+
+void host::run()
+{
+   if (!poll_) return;
+   update();
+   if (drift_) drift(5, maximum_ * 60);
+}
+
+tmp_file host::file( node& n, std::string name )
+{
+   return tmp_file(NULL);
+}
+
+tmp_file host::edit( node& n, std::list<Variable>& l, Boolean preproc )
+{
+   return tmp_file(NULL);
+}
+
+tmp_file host::jobcheck( node& n, const std::string &cmd )
+{
+   return tmp_file(NULL);
+}
+
+tmp_file ehost::jobcheck( node& n, const std::string &cmd )
+{
+   std::string subcmd = n.variable(cmd);
+   //std::string user = n.variable("USER");
+   std::string job = n.variable("ECF_JOB");
+   std::string stat = job + ".stat";
+   if (n.__node__()) 
+     if (n.__node__()->get_node()) 
+       n.__node__()->get_node()->variableSubsitution(subcmd);
+   std::string check = "sh " + subcmd;
+   command(check);
+   return tmp_file(stat.c_str(), false);
+}
+
+tmp_file host::jobstatus( node& n, const std::string &cmd )
+{
+   return tmp_file(0);
+}
+
+tmp_file ehost::jobstatus( node& n, const std::string &cmd )
+{
+   command(clientName, "--status", n.full_name().c_str(), 0x0);
+   return tmp_file(0);
+}
+
+bool host::zombies( int mode, const char* name )
+{
+   return false;
+}
+
+const std::vector<std::string>& ehost::messages( const node&n ) const
+{
+   try {
+      client_.edit_history(n.full_name());
+   }
+   catch ( std::exception &e ) {
+      gui::message("host::messages: %s", e.what());
+   }
+   return client_.server_reply().get_string_vec();
+}
+
+const std::vector<std::string>& host::messages( const node&n ) const
+{
+   static std::vector<std::string> vct;
+   return vct;
+}
+
+bool host::get_zombies_list( std::vector<std::string>& list )
+{
+   return true;
+}
+
+bool ehost::get_zombies_list( std::vector<std::string>& list )
+{
+   gui::message("%s: fetching zombies_panel", this->name());
+   try {
+      client_.zombieGet();
+   }
+   catch ( std::exception &e ) {
+      gui::message("host::zombies-error: %s", e.what());
+      return false;
+   }
+   std::vector<Zombie> vect = client_.server_reply().zombies();
+
+   if (vect.size() == 0) {
+      gui::message("%s: No zombies at the moment", this->name());
+      return false;
+   }
+
+   std::sort(
+            vect.begin(),
+            vect.end(),
+            boost::bind(std::less<int>(), boost::bind(&Zombie::calls, _1),
+                        boost::bind(&Zombie::calls, _2)));
+   Zombie::pretty_print(vect, list);
+   return true;
+}
+
+bool ehost::zombies( int mode, const char* name )
+{
+
+   if (!name) return false;
+
+   try {
+      gui::message("%s: updating zombies_panel", this->name());
+      switch ( mode ) {
+         case 1:
+            client_.zombieFobCli(name);
+            break;
+         case 2:
+            client_.zombieRemoveCli(name);
+            break;
+         case 3:
+            client_.zombieFailCli(name);
+            break;
+         case 4:
+            client_.zombieAdoptCli(name);
+            break;
+         case 5:
+            client_.zombieKillCli(name);
+            break;
+            // case X: client_.zombieBlockCli(name); break; // ???
+         default:
+            break;
+      }
+   }
+   catch ( std::exception &e ) {
+      gui::message("host::zombies-error: %s", e.what());
+      return false;
+   }
+   return true;
+}
+
+void ehost::dir( node& n, const char* path, lister<ecf_dir>& l )
+{
+   loghost_ = n.variable("ECF_LOGHOST", true);
+   logport_ = n.variable("ECF_LOGPORT");
+   if (loghost_ == ecf_node::none()) {
+      loghost_ = n.variable("LOGHOST", true);
+      logport_ = n.variable("LOGPORT");
+   }
+   std::string::size_type pos = loghost_.find(n.variable("ECF_MICRO"));
+   if (std::string::npos != pos) return;
+   host::dir(n, path, l);
+}
+
+void host::dir( node& n, const char* path, lister<ecf_dir>& l )
+{
+   gui::message("%s: fetching file list", name());
+   if (loghost_ != ecf_node::none()) {
+      logsvr the_log_server(loghost_, logport_);
+
+      if (the_log_server.ok()) {
+         std::auto_ptr<ecf_dir> dir(the_log_server.getdir(path));
+
+         if (dir.get()) {
+            l.scan(dir.get());
+            return;
+         }
+      }
+   }
+
+   if (path && direct_read_) {
+
+      const char* p = path;
+      const char* q = 0;
+
+      while ( *p ) {
+         if (*p == '/') q = p;
+         p++;
+      }
+
+      if (q) {
+         char basename[1024];
+         char dirname[1024];
+         strcpy(dirname, path);
+         dirname[q - path] = 0;
+         strcpy(basename, q + 1);
+
+         char* c = basename;
+         while ( *c ) {
+            if (*c == '.') {
+               if (*(c + 1)) {
+                  *(c + 1) = 0;
+                  break;
+               } /* 201311 Pontus Request */
+               else {
+                  *c = 0;
+               }
+            }
+            c++;
+         }
+
+         std::auto_ptr<ecf_dir> dir(ecf_file_dir(dirname, basename, true));
+         if (dir.get()) {
+            l.scan(dir.get());
+         }
+      }
+   }
+}
+
+tmp_file host::script( node& n )
+{
+   return file(n, "ECF_SCRIPT");
+}
+
+tmp_file host::output( node& n )
+{
+   return file(n, "ECF_JOBOUT");
+}
+
+tmp_file host::job( node& n )
+{
+   return file(n, "ECF_JOB");
+}
+
+int host::status()
+{
+   int e = update();
+   frequency(timeout_);
+   return e;
+}
+
+void host::check_mail()
+{
+}
+
+int ehost::command( const char* cmd, ... )
+{
+   int ac = 0;
+   char *av[100], *s;
+   va_list ap;
+
+   va_start(ap, cmd);
+   av[ac++] = strdup(cmd);
+   while ( (s = va_arg(ap, char*)) )
+      av[ac++] = strdup(s);
+   va_end(ap);
+
+   return command(ac, av);
+}
+
+int ehost::command( const std::string& str )
+{
+   const char *cmd = str.c_str();
+   if (!cmd) return -1;
+
+   if (str.substr(0, 3) == "sh ") {
+      int pid = 0;
+      if ((pid = fork()) == 0) /* the child */{
+         execl("/bin/sh", "sh", "-c", str.substr(3).c_str(), NULL);
+         _exit(127);
+         return 0;
+      }
+      if (pid == -1)
+         return 1;
+      else
+         return 0;
+   }
+   else if (str == "write menu") {
+      menus::write();
+      return 0;
+   }
+
+   int e = 0, ac = 0;
+   char* av[100];
+   char* line = strdup(cmd);
+
+   char *c = (char*) "\"";
+   char* s = strtok(line, c);
+   if (s == 0)
+      e = command(1, &line);
+   else {
+      c = (char*) "'";
+      s = strtok(line, c);
+      if (s == 0)
+         e = command(1, &line);
+      else {
+         c = (char*) " ";
+         s = strtok(line, c);
+      }
+   }
+   do {
+      av[ac++] = s;
+      s = strtok(NULL, c);
+   }
+   while ( s != NULL );
+   e = command(ac, av);
+
+   if (line) free(line);
+   return e;
+}
+
+int host::maxLines = 25000;
+
+class init_hosts : public init {
+   void run( int argc, char **argv )
+   {
+      scripting::init();
+      host::init();
+   }
+};
+
+void host::chat()
+{
+}
+
+void host::check_all_mail()
+{
+   host *h = extent < host > ::first();
+   while ( h ) {
+      h->check_mail();
+      h = h->extent < host > ::next();
+   }
+}
+
+#include <fstream>
+
+void mem_use( double& vmu, double& res )
+{
+   using std::ios_base;
+   using std::ifstream;
+   using std::string;
+   unsigned long vsize;
+   long rss;
+   vmu = 0.0;
+   res = 0.0;
+   std::ifstream stat("/proc/self/stat", std::ios_base::in);
+   std::string pid, comm, state, ppid, pgrp, session, tty_nr, tpgid, flags, minflt, cminflt;
+   std::string majflt, cmajflt, utime, stime, cstime, priority, nice, O, itrealvalue, starttime;
+   stat >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr >> tpgid >> flags >> minflt
+            >> cminflt >> majflt >> cmajflt >> utime >> stime >> cstime >> priority >> nice >> O
+            >> itrealvalue >> starttime >> vsize >> rss;
+   stat.close();
+   long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024;
+   vmu = vsize / 1024.0;
+   res = rss * page_size_kb;
+}
+
+bool ehost::create_tree( int hh, int min, int sec )
+{
+   int then_sec = 0;
+   XECFDEBUG {
+      time_t now;
+      time(&now);
+      struct tm* then = localtime(&now);
+      then_sec = then->tm_sec;
+      gui::message("%s: build %02d:%02d:%02d", name(), then->tm_hour, then->tm_min, then->tm_sec);
+      if (sec != then->tm_sec) {
+         printf("# time get: %02d:%02d:%02d %s\n", hh, min, sec, name());
+         printf("# time got: %02d:%02d:%02d %s\n", then->tm_hour, then->tm_min, then->tm_sec,
+                name());
+      }
+   }
+
+   node *top = make_xnode<Defs>(client_.defs().get(), 0x0, *this);
+
+   XECFDEBUG {
+      time_t nnow;
+      time(&nnow);
+      struct tm* next = localtime(&nnow);
+      if (then_sec != next->tm_sec) printf("# time blt: %02d:%02d:%02d %s\n", next->tm_hour,
+                                           next->tm_min, next->tm_sec, name());
+      gui::message("%s: built %02d:%02d:%02d", name(), next->tm_hour, next->tm_min, next->tm_sec);
+   }
+
+   if (!top) { 
+     // XECFDEBUG { std::cout << "# no top\n"; }
+     return false;
+   }
+   if (top_) {
+      top->scan(top_);
+      destroy_top(top_);
+   }
+   top_ = top;
+   top_->active(poll_);
+   notify_observers();
+   top_->up_to_date();
+
+   redraw();
+   XECFDEBUG {
+      double vmu, res;
+      mem_use(vmu, res);
+      if (top) { 
+	int num = 0; node *n = top->kids(); 
+	while (n) { num += 1; n = n->next(); } 
+	// std::cout << "# num " << num << "\n";
+      }
+      std::cout << "# usage: " << vmu << " " << res << "\n";
+   }
+   return true;
+}
+
+void ehost::reset( bool full, bool sync )
+{
+   if (!connected_ || !connect_) return;
+   time_t now;
+   time(&now);
+   struct tm* curr = localtime(&now);
+   gui::message("%s: full tree %02d:%02d:%02d", name(), curr->tm_hour, curr->tm_min, curr->tm_sec);
+   SelectNode select(this->name());
+   try {
+      if (!tree_) tree_ = tree::new_tree(this);
+
+      if (full) {
+ 	 XECFDEBUG std::cerr << "# reset full\n";
+         const std::vector<std::string>& s = suites_;
+         destroy_top(top_);
+         top_ = 0x0;
+         notify_observers();
+
+         if (!s.empty()) {
+            //   /* registering with empty set would lead
+            //      to retrieve all server content,
+            //      opposive of expected result */
+            // } else
+            // get all suite previously registered in GUI, and register
+            // them with the server The associated handle is retained in
+            // client_
+            try { client_.ch1_drop(); }
+            catch ( std::exception &e ) {
+               std::cout << "# no drop possible: " << e.what() << "\n";
+            }
+
+            client_.reset(); // reset client handle + defs
+            // This will add a new handle to client_
+            client_.ch_register(new_suites_, s);
+         }
+      }
+   }
+   catch ( std::exception &e ) {
+      XECFDEBUG std::cerr << "# reset exception " << e.what() << "\n";
+      if (client_.defs().get()) {
+         gui::error("host::reset-reg-error: %s", e.what());
+      }
+   }
+
+   int hour = 0, min = 0, sec = 0;
+   XECFDEBUG {
+      time_t now;
+      time(&now);
+      struct tm* curr = localtime(&now);
+      hour = curr->tm_hour, min = curr->tm_min, sec = curr->tm_sec;
+      gui::message("%s: start %02d:%02d:%02d", name(), hour, min, sec);
+   }
+
+   try {
+      if (sync) client_.sync_local(); // this returns full defs
+      searchable::active(False);
+      create_tree(hour, min, sec);
+      XECFDEBUG std::cerr << "# reset create tree\n";
+   }
+   catch ( std::exception &e ) {
+     // XECFDEBUG 
+      std::cerr << "# sync exception " << e.what() << "\n";
+      gui::error("host::reset-sync-error: %s", e.what());
+      const std::vector<std::string>& s = suites_;
+      /* load one set
+       then another
+       checkpoint
+       kill the server
+       then restart the server
+       + view update command */
+      try {
+         client_.reset();
+         client_.ch_register(new_suites_, s);
+      }
+      catch ( std::exception &e ) {
+         gui::error("host::reset-register-error: %s", e.what());
+      }
+   }
+   searchable::active(True);
+}
+
+void host::aborted( node& n )
+{
+   if (n.type() == NODE_ALIAS) {
+      if (aliases_) aborted::show(n);
+   }
+   else if (aborted_) aborted::show(n);
+}
+
+void host::restarted( node& n )
+{
+   if (n.type() == NODE_ALIAS) {
+      if (aliases_) restart::show(n);
+   }
+   else if (restarted_) restart::show(n);
+}
+
+void host::late( node& n )
+{
+  if (late_family_ && n.type() == NODE_FAMILY)
+    late::show(n);
+  else if (late_) late::show(n);
+}
+
+void host::zombie( node& n )
+{
+   if (zombie_) zombie::show(n);
+}
+
+void host::to_check( node& n )
+{
+   if (to_check_) to_check::show(n);
+}
+
+void host::changed( resource& r )
+{
+   if (&r == &timeout_) frequency(timeout_);
+}
+
+void ehost::changed( resource& r )
+{
+   host::changed(r);
+   if (&r == &poll_) {
+      if (top_) top_->active(poll_);
+      client_.set_host_port(machine(), boost::lexical_cast<std::string>(number()));
+      connect_mngt(true);
+      if (connected_ && poll_) status();
+   }
+
+   if ((&r == &new_suites_) && connected_) {
+      // ch1_auto_add is used to control whether suites are
+      // automatically added to handle. It should only be called if
+      // suites had previously been registered
+      try {
+         if (client_.client_handle()) {
+            client_.ch1_auto_add(new_suites_);
+         }
+         else {
+            XECFDEBUG std::cerr << "# No suites previously registered ?";
+         }
+      }
+      catch ( std::exception &e ) {
+         gui::message("host::server-error: %s", e.what());
+      }
+   }
+}
+
+void host::redraw( bool create )
+{
+   if (create) {
+     SelectNode select(this->name());
+      XECFDEBUG {
+         std::cout << ChangeMgrSingleton::instance()->no_of_node_observers() << std::endl
+                   << ChangeMgrSingleton::instance()->no_of_def_observers() << std::endl;
+      }
+
+      if (top_) top_->unlink(true);
+      XECFDEBUG {
+         std::cout << ChangeMgrSingleton::instance()->no_of_node_observers() << std::endl
+                   << ChangeMgrSingleton::instance()->no_of_def_observers() << std::endl;
+         // assert(ChangeMgrSingleton::instance()->no_of_node_observers() == 0);
+         // assert(ChangeMgrSingleton::instance()->no_of_def_observers() == 0);
+      }
+      create_tree(0, 0, 0);
+   }
+   else if (tree_) tree_->update_tree(true);
+   if (top_) top_->reset();
+}
+
+str host::logfile() const
+{
+   char buf[1024];
+   buf[0] = 0;
+   return str(buf);
+}
+
+str ehost::logfile() const
+{
+   const char* home = top_ ? top_->variable("ECF_HOME").c_str() : 0;
+   const char* log = top_ ? top_->variable("ECF_LOG").c_str() : 0;
+   char buf[1024];
+   buf[0] = 0;
+
+   if (log) {
+      if (log[0] != '/' && home)
+         sprintf(buf, "%s/%s", home, log);
+      else
+         strcpy(buf, log);
+   }
+   return str(buf);
+}
+
+host& host::dummy()
+{
+   static host* h = new host("user.default", "user.default", 0);
+   return *h;
+}
+
+void host::plug( node* from )
+{
+   do_plug(selection::current_node(), from);
+}
+
+void host::comp( node* from, const char* a, const char* b )
+{
+   do_comp(selection::current_node(), from, a, b);
+}
+
+int host::do_comp( node* into, node* from, const std::string& a, const std::string& b )
+{
+   if (!into || !from) return 0;
+   std::stringstream out;
+   out << "${COMPARE:=/home/ma/map/bin/compare.sh} " << from->full_name() << ":";
+   if (from->variable("ECF_NODE") != "(none)") {
+      out << from->variable("ECF_NODE") << ":" << from->variable("ECF_PORT") << ":"
+          << from->variable("ECF_LOGHOST", true) << ":" << from->variable("ECF_LOGPORT", true)
+          << ":" << from->variable("ECF_JOBOUT", true) << " \t";
+   }
+   else {
+      out << from->variable("SMSNODE") << ":" << from->variable("SMS_PROG") << ":"
+          << from->variable("SMSLOGHOST", true) << ":" << from->variable("SMSLOGPORT", true) << ":"
+          << from->variable("SMSJOBOUT", true) << " \t";
+   }
+
+   out << into->full_name() << ":";
+   if (into->variable("ECF_NODE") != "(none)") {
+      out << into->variable("ECF_NODE") << ":" << into->variable("ECF_PORT") << ":"
+          << into->variable("ECF_LOGHOST", true) << ":" << into->variable("ECF_LOGPORT", true)
+          << ":" << into->variable("ECF_JOBOUT", true) << " \t";
+   }
+   else {
+      out << into->variable("SMSNODE") << ":" << into->variable("SMS_PROG") << ":"
+          << into->variable("SMSLOGHOST", true) << ":" << into->variable("SMSLOGPORT", true) << ":"
+          << into->variable("SMSJOBOUT", true) << " \t";
+   }
+   out << a << " \t" << b << "\n";
+   const std::string cmd = out.str();
+   std::cout << cmd;
+
+   int pid = fork();
+   if (pid == 0) { /* the child */
+      execl("/bin/sh", "sh", "-c", cmd.c_str(), NULL);
+      _exit(127);
+      return 0;
+   }
+   if (pid == -1) return 1;
+   return 0;
+}
+
+int host::do_plug( node* into, node* from )
+{
+   if (!into || !from) return 1;
+
+   str sf(from->full_name().c_str());
+   str si(into->full_name().c_str());
+   str sn = si + str("/") + str(from->name());
+
+   host *destination = &into->serv();
+   host *source = &from->serv();
+
+   if (destination == source) {
+      gui::error("# Node cannot be pluged to the same server");
+      return 1;
+   }
+
+   if (!confirm::ask(false, "You are about pluging %s %s of %s into %s %s of %s.\n"
+                     "Note that you will have to resume %s in the ECF %s.\n"
+                     "Proceed?",
+                     from->type_name(), sf.c_str(), source->name(), into->type_name(), si.c_str(),
+                     destination->name(), sn.c_str(), destination->name())) return 1;
+
+   str sp(from->parent()->full_name().c_str());
+   if (sp != si) {
+      if (!confirm::ask(false, "You are about to move the %s '%s' from a sub-tree named '%s' to\n"
+                        "a sub-tree named '%s'. This may cause some problems,\n"
+                        "specially if there are any active tasks. Do you want to proceed?",
+                        from->type_name(), from->name().c_str(), sp.c_str(), si.c_str())) return 1;
+   }
+
+   if (destination->status()) {
+      gui::error("# Cannot get status for %s. Pluging aborted.", destination->name());
+      return 1;
+   }
+   if (source->status()) {
+      gui::error("Cannot get status for %s. Pluging aborted.", source->name());
+      return 1;
+   }
+
+   node *nfrom = source->top()->find(sf.c_str());
+   std::string cmd;
+
+   if (!(nfrom->status() == STATUS_SUSPENDED)) {
+      if (source->command(clientName, "--suspend", nfrom->full_name().c_str(), 0x0)) {
+         gui::error("Cannot suspend %s. Pluging aborted", sf.c_str());
+         return 1;
+      }
+   }
+
+   if (nfrom == 0) {
+      cmd = "One of the node is gone after status.\n";
+      cmd += "It must have been canceled. Pluging aborted.";
+      gui::error(cmd.c_str());
+      return 1;
+   }
+
+   gui::message("Pluging from %s to %s", source->name(), destination->name());
+   cmd = "//";
+   cmd += destination->machine();
+   cmd += ":";
+   cmd += (boost::lexical_cast<std::string>(destination->number())).c_str();
+   cmd += si.c_str();
+   if (source->command(clientName, "--plug", sf.c_str(), cmd.c_str(), 0x0)) {
+      gui::error("Pluging aborted.");
+      return 1;
+   }
+
+   source->status();
+   destination->status();
+   return 0;
+}
+
+tmp_file ehost::sfile( node& n, std::string name )
+{
+   loghost_ = n.variable("ECF_LOGHOST", true);
+   logport_ = n.variable("ECF_LOGPORT");
+   if (loghost_ == ecf_node::none()) {
+      loghost_ = n.variable("LOGHOST", true);
+      logport_ = n.variable("LOGPORT");
+   }
+   return host::sfile(n, name);
+}
+
+tmp_file host::sfile( node& n, std::string name )
+{
+   if (name == ecf_node::none()) return tmp_file((const char*) NULL);
+   const char *cname = name.c_str();
+
+   std::string::size_type pos = loghost_.find(n.variable("ECF_MICRO"));
+   if (std::string::npos == pos && loghost_ != ecf_node::none()) {
+      logsvr log_server(loghost_, logport_);
+      if (log_server.ok()) {
+         tmp_file tmp = log_server.getfile(name);
+         if (access(tmp.c_str(), R_OK) == 0) return tmp;
+      }
+   }
+
+   if ((access(cname, R_OK) == 0)) {
+      return tmp_file(cname, false);
+   }
+
+   try {
+      n.serv().command(clientName, "--file", "-n", cname, host::maxLines, 0x0);
+   } catch ( std::exception &e ) {
+      gui::error("cannot get file from server: %s", e.what());
+   }
+
+   return tmp_file(cname, false);
+   // return tmp_file((const char*) NULL); // FIXME
+}
+
+const str& host::timefile()
+{
+   if (timefile_.c_str()[0] == 0)
+      timefile_ = logfile();
+   else if (!strncmp("(none)/(none)", timefile_.c_str(), 13)) timefile_ = logfile();
+   return timefile_;
+}
+
+void host::hosts( host_lister& l )
+{
+   host *h = extent < host > ::first();
+   while ( h ) {
+      l.next(*h);
+      h = h->extent < host > ::next();
+   }
+}
+
+void host::change( const std::string& name, const std::string& machine, int number )
+{
+   bool logged = false;
+
+   if (connected_) {
+      logout();
+      logged = true;
+   }
+
+   gui::rename_host(this->name(), name);
+
+   ecf_nick_update(name, machine, number);
+
+   name_ = name;
+   host_ = machine;
+   number_ = number;
+   if (logged) login();
+}
+
+int host::origin() const
+{
+   return ecf_nick_origin(name());
+}
+
+static init_hosts init_hosts_instance;
+std::map<int, host_maker*> host_maker::map_;
+int host_maker::port_max = 65535;
+static host_builder<ehost> ehost_builder_instance(0);
+
+host* host::new_host( const std::string& p, const std::string& m, int n )
+{
+   ecf_nick_update(p, m, n);
+   return host_maker::make_host(p, m, n);
+}
+
+IMP(host)
+
+void host::login()
+{
+}
+
+bool check_version( const char* v1, const char* v2 )
+{
+   int num = 0;
+   while ( v1 && v2 && num < 2 ) {
+      if (*v1 == '.') num++;
+      if (*v1 != *v2) return false;
+      v1++;
+      v2++;
+   }
+   return true;
+}
+
+void get_server_version( ClientInvoker& client, std::string& server_version )
+{
+   // ECF_ALLOW_NEW_CLIENT_OLD_SERVER allows each client ('client.allow_new_client_old_server')
+   // to have its own archive version, hence FIRST:  go with what ever was set
+   // See notes: ACore/src/boost_archive.hpp
+
+   for(int av = ecf::boost_archive::version()-1; av >= ecf::boost_archive::version_1_47(); --av) {
+
+      // First time in loop, go with what ever was set, including if client.allow_new_client_old_server() !=0
+      try {
+         client.server_version();
+         server_version = client.server_reply().get_string();
+         if (!server_version.empty()) return;
+      }
+      catch ( ... ) {}
+
+      client.allow_new_client_old_server(av);
+   }
+}
+
+void ehost::login()
+{
+   gui::message("Login to %s", name());
+   host::logout();
+   host::login();
+   reset(true, true);
+
+   client_.set_throw_on_error(true);
+   try {
+      client_.set_host_port(machine(), boost::lexical_cast<std::string>(number()));
+      if (!connect_mngt(true)) {
+         gui::message("%s: no reply", name());
+         logout();
+         connected_ = false; // tree_->connected(false);
+         connect_ = false;
+         return;
+      }
+
+      // if we can not get the server version, attempt backward compatibility
+      std::string server_version;
+      get_server_version(client_, server_version);
+      if (server_version.empty()) {
+         if (!confirm::ask( false, "%s (%s@%d): Could not connect\nTry again ?", name(), machine(), number())) {
+             connect_ = false;
+             connected_ = false;
+             return;
+          }
+      }
+      else {
+         if (!check_version(server_version.c_str(), ecf::Version::raw().c_str())) {
+            if (!confirm::ask(
+                     false,
+                     "%s (%s@%d): version mismatch, server is %s, client is %s\ntry to connect anyway?",
+                     name(), machine(), number(), server_version.c_str(),
+                     ecf::Version::raw().c_str())) {
+               connect_ = false;
+               connected_ = false;
+               return;
+            }
+         }
+      }
+      connect_ = true;
+      connected_ = true;
+
+      if (!tree_) tree_ = tree::new_tree(this);
+      reset(true); // done later with update (test empty server)
+
+      enable();
+      if (tree_ != 0x0) {
+         tree_->xd_show();
+         tree_->connected(True);
+         redraw();
+      }
+      gui::login(name());
+      searchable::active(True);
+   }
+   catch ( std::exception& e ) {
+      searchable::active(False);
+      gui::error("Login to %s failed (%s)", name(), e.what());
+      if (!tree_) return;
+      if (connected_) {
+         tree_->update_tree(false);
+      }
+      else {
+         tree_->connected(False);
+         if (!top_) 
+	   top_ = make_xnode<Defs>(0x0, 0, *this);
+      }
+   }
+
+   update();
+}
+
+tmp_file ehost::file( node& n, std::string name )
+{
+  std::string error;
+   bool read = direct_read_;
+  if (name == "ECF_SCRIPT") {
+    error = "no script!\n"
+      "check ECF_FILES or ECF_HOME directories, for read access\n"
+      "check for file presence and read access below files directory\n"
+      "or this may be a 'dummy' task.\n";    
+  } else if (name == "ECF_JOB") {
+    std::string filename = n.variable(name);
+    if (read && (access(filename.c_str(), R_OK) == 0))
+      return tmp_file(filename.c_str(), false);
+
+    if (std::string::npos != filename.find(".job0")) {
+	error = "job0: no job to be generated yet!";
+	return tmp_file(error);
+      } else 
+	  error = "no script!\n"
+      "check ECF_HOME,directory for read/write access\n"
+      "check for file presence and read access below\n"
+      "The file may have been deleted\n"
+      "or this may be a 'dummy' task.\n";    
+  } else if (boost::algorithm::ends_with(name, ".0")) {
+    error = "no output to be expected when TRYNO is 0!\n";
+    return tmp_file(error);
+  } else if (name != ecf_node::none()) { // Try logserver
+      loghost_ = n.variable("ECF_LOGHOST", true);
+      logport_ = n.variable("ECF_LOGPORT");
+      if (loghost_ == ecf_node::none()) {
+         loghost_ = n.variable("LOGHOST", true);
+         logport_ = n.variable("LOGPORT");
+      }
+      std::string::size_type pos = loghost_.find(n.variable("ECF_MICRO"));
+      if (std::string::npos == pos && loghost_ != ecf_node::none()) {
+         logsvr the_log_server(loghost_, logport_);
+         if (the_log_server.ok()) {
+            tmp_file tmp = the_log_server.getfile(name); // allow more than latest output
+            if (access(tmp.c_str(), R_OK) == 0) return tmp;
+         }
+      }
+   }
+   if (read && (access(name.c_str(), R_OK) == 0)) {
+      return tmp_file(name.c_str(), false);
+   } else {
+      gui::message("%s: fetching %s", this->name(), name.c_str());
+      try {
+         if (name == "ECF_SCRIPT")
+            client_.file(n.full_name(), "script");
+         else if (name == "ECF_JOB") {
+	   client_.file(n.full_name(), "job", 
+			boost::lexical_cast<std::string>(jobfile_length_));
+	 }
+         else if (name == "ECF_JOBOUT")
+            client_.file(n.full_name(), "jobout");
+         else {
+            client_.file(n.full_name(), "jobout");
+         }
+
+         // Do *not* assign 'client_.server_reply().get_string()' to a separate string, since
+         // in the case of job output the string could be several megabytes.
+         return tmp_file( client_.server_reply().get_string()
+			  + "\n# file is served by ecflow-server\n" );
+      } catch ( std::exception &e ) {
+ 	std::cerr << "host::file-error:" << e.what() << "\n";
+         gui::message("host::file-error: %s", e.what());
+      }
+   }
+
+   return tmp_file(error);
+}
+
+tmp_file ehost::edit( node& n, std::list<Variable>& l, Boolean preproc )
+{
+   gui::message("%s: fetching source", name());
+   try {
+      if (preproc)
+         client_.edit_script_preprocess(n.full_name());
+      else
+         client_.edit_script_edit(n.full_name());
+      return tmp_file(client_.server_reply().get_string());
+   } catch ( std::exception &e ) {
+       gui::error("host::edit-error: %s", e.what());
+   } catch ( ... ) {
+       gui::error("host::edit-error");
+   }
+  std::string error = "no script!\n"
+"\n"
+"check server->History:\n"
+"\tsome suite variable may be 'unterminated' (micro character missing) in script or include files\n"
+"\tcheck duplicate occurences of micro character when it is expected in the job (%% becomes %)\n"
+"\tuse %nopp ... %end or %includenopp <file.h> to disable job preprocessing where needed\n"
+"\tan include file may not be found\n"
+"check ECF_FILE directory is accessible, by opening the Script panel\n"
+"check ECF_INCLUDE directory is accessible from the server\n"
+"\tit must contain the included files (or links)\n"
+"client must be capable to create temporary file:\n"
+"\tcheck /tmp directory with write access, and space available,\n"
+"or preprocessed file may be truncated beyond some size.\n";
+   return tmp_file(error);
+}
+
+tmp_file host::manual( node& n )
+{
+   std::string man = "no manual...";
+   return tmp_file(man);
+}
+
+tmp_file ehost::manual( node& n )
+{
+   gui::message("%s: fetching manual", name());
+   try {
+      client_.file(n.full_name(), "manual");
+      if (client_.server_reply().get_string().empty()) {
+         std::string man = "no manual...";
+         return tmp_file(man);
+      }
+      return tmp_file(client_.server_reply().get_string());
+   }
+   catch ( std::exception &e ) {
+      gui::message("host::manual-error: %s", e.what());
+   }
+
+   std::string man = "no manual...";
+   return tmp_file(man);
+}
+
+void host::send( node& n, Boolean alias, Boolean run, NameValueVec& v, 
+		 const char* file )
+{
+}
+
+void ehost::send( node& n, Boolean alias, Boolean run, NameValueVec& v, 
+		  const char* file )
+{
+   std::vector<std::string> content;
+   char line[4096];
+   FILE *f = fopen(file, "r");
+   if (!f) {
+      gui::syserr(file);
+      return;
+   }
+   while ( fgets(line, sizeof(line), f) ) {
+      line[strlen(line) - 1] = 0;
+      content.push_back(line);
+   }
+   gui::message("%s: sending script_panel", name());
+
+   try {
+      client_.edit_script_submit(n.full_name(), v, content, alias, run);
+   }
+   catch ( std::exception &e ) {
+      gui::error("host::send-error: %s", e.what());
+   }
+   status();
+   fclose(f);
+}
+
+const std::vector<std::string>& host::suites() const
+{
+   return suites_;
+}
+
+void ehost::suites( int which, std::vector<std::string>& l )
+/* Menu Suites..., or Suites tab */
+{
+   try {
+      switch ( which ) {
+         case SUITES_LIST:
+            client_.suites();
+            l = client_.server_reply().get_string_vec();
+            break;
+         case SUITES_MINE:
+            l = suites_;
+            break;
+         case SUITES_REG:
+            gui::message("%s: registering to suites", name());
+            suites_ = l;
+            try {
+               if (l.empty()) {
+                  try { client_.ch1_drop(); }
+                  catch ( std::exception &e ) {
+                     std::cout << "# no drop possible: " << e.what() << "\n";
+                  }
+
+                  // reset handle to zero , and clear the defs
+                  client_.reset();
+               }
+               client_.ch_register(new_suites_, suites_);
+               status();
+               redraw();
+            }
+            catch ( std::exception &e ) {
+               gui::error("host::suites-reg-error: %s", e.what());
+            }
+            break;
+         default:
+            gui::message("%s: suites, what?");
+            break;
+      }
+   }
+   catch ( std::exception &e ) {
+      if (client_.defs().get()) { /* ignore empty server */
+         gui::error("host::suites-error: %s", e.what());
+      }
+   }
+}
+
+void host::suites( node* n, bool one )
+/* register only one suite with menu hide-other-suites (right-mouse-button,
+ on the server area, close to server node, not on the node itself */
+{
+   while ( n ) {
+      if (n->type() == NODE_SUITE) {
+         static std::vector<std::string> l;
+         if (!one) l = suites_;
+         l.push_back(n->name());
+         suites(SUITES_REG, l);
+         break;
+      }
+      n = n->parent();
+   }
+}
+
+int host::update()
+{
+   return TRUE;
+}
+extern XtAppContext app_context;
+
+void ehost::update_reg_suites( bool get_ch_suites )
+{
+   if (new_suites_) { // SUP-398 // temporary add higher load on the server
+      if (get_ch_suites) {
+         try {
+            client_.ch_suites();
+         }
+         catch ( std::exception& e ) {
+            gui::message("host::update-reg-suite-error: %s", e.what());
+         }
+         const std::vector<std::pair<unsigned int, std::vector<std::string> > >& vct = client_.server_reply().get_client_handle_suites();
+         for(size_t i = 0; i < vct.size(); ++i) {
+            if (vct[i].first == (unsigned int) client_.client_handle()) {
+               suites_ = vct[i].second;
+               break;
+            }
+         }
+      }
+      else {
+         const std::vector<suite_ptr>& suites_vec = client_.defs()->suiteVec();
+         std::vector<std::string> suites;
+         suites.reserve(suites_vec.size());
+         for(size_t i = 0; i < suites_vec.size(); ++i) {
+            suites.push_back(suites_vec[i]->name());
+         }
+         suites_ = suites;
+      }
+   }
+}
+
+int ehost::update()
+{
+   int err = -1;
+   if (!connected_) return err;
+
+   SelectNode select(this->name());
+   if (updating_) return 0; // SUP-423
+   Updating update(this);   // SUP-423
+   gui::watch(True);
+   last_ = ::time(0);
+
+   try {
+      if (app_context) XtAppAddTimeOut(app_context, 20 * 1000, NULL, NULL);
+
+      time_t now;
+      time(&now);
+      struct tm* curr = localtime(&now);
+      gui::message("%s: checking status %02d:%02d:%02d", name(), curr->tm_hour, curr->tm_min,
+                   curr->tm_sec);
+      client_.news_local(); // call the server
+      if (tree_) tree_->connected(True);
+
+      XECFDEBUG {
+         struct tm* next;
+         time_t now;
+         time(&now);
+         next = localtime(&now);
+         if (curr->tm_sec != next->tm_sec) {
+            printf("# time chk: %02d:%02d:%02d %s\n", curr->tm_hour, curr->tm_min, curr->tm_sec,
+                   name());
+            printf("# time nws: %02d:%02d:%02d %s\n", next->tm_hour, next->tm_min, next->tm_sec,
+                   name());
+         }
+      }
+      switch ( client_.server_reply().get_news() ) {
+         case ServerReply::NO_NEWS:
+            gui::message("::nonews\n");
+            if (top_) top_->up_to_date();
+            return 0;
+            break;
+         case ServerReply::DO_FULL_SYNC: // 4 calls to the server:
+            /* ch_suites + drop + reg_suites + sync_local */
+            gui::message("::fullsync\n");
+            if (top_) top_->up_to_date();
+            update_reg_suites(true);
+            reset(true);
+            return 0;
+            break;
+         case ServerReply::NO_DEFS:
+            reset(true);
+            return 0;
+            break;
+         case ServerReply::NEWS:
+            // there were some kind of changes in the server
+            // request the changes from the server & sync with
+            // defs on client_
+
+            client_.sync_local();
+            // full_sync==true:  no notification on the GUI side
+
+            // full_sync==false: incremental change, notification
+            // received through ::update (ecf_node)
+
+            gui::message("%s: receiving status", name());
+
+            if (client_.server_reply().full_sync()) {
+               update_reg_suites(false); // new suite may have been added
+               reset(false, false); // SUP-398
+            }
+            else {
+               gui::message("%s: updating status", name());
+               XECFDEBUG std::cout << "# " << name() << ": small update\n";
+
+               if (Updating::full_redraw()) {
+                  redraw(true);
+               }
+               else if (tree_) tree_->update_tree(false); 
+	       // fp:60043 Issue with Ecflow updating on console VM
+               // redraw(false); // too much blinking with this
+            }
+            err = 0;
+            break;
+         default:
+            break;
+      }
+   }
+   catch ( std::exception& e ) {
+      if (tree_ != 0x0) tree_->connected(False);
+      err = -1;
+      gui::message("host::news-error: %s", e.what());
+      XECFDEBUG std::cerr << "# host::news-error: " << e.what() << "\n";
+   }
+   return err;
+}
+
+int ehost::command( int argc, char **argv )
+{
+   int result = -1;
+
+   if (argc < 1) return FALSE;
+
+   if (!strcmp(argv[1], "--enable_logging")) {
+      client_.enable_logging("ecflow_client.log");
+      return true;
+   }
+   if (!strcmp(argv[1], "--disable_logging")) {
+      client_.disable_logging();
+      return true;
+   }
+   else if (!strcmp(argv[1], "--url")) {
+      if (argc == 3) {
+         UrlCmd urlCmd(client_.defs(), argv[2]);
+         try {
+            urlCmd.execute();
+         }
+         catch ( ... ) {
+            gui::error("cannot-open-url or substitution-error\n%s", argv[2]);
+         }
+         return true;
+      }
+   }
+
+   gui::message("command issued ...");
+   if (!strcmp(argv[0], clientName)) {
+      try {
+         int i = 0;
+         std::cout << "# CMD: ";
+         while ( i < argc )
+            std::cout << argv[i++] << " ";
+         result = client_.invoke(argc, argv);
+         std::cout << "--port " << number() << " --host " << machine() << " # ack\n";
+      }
+      catch ( std::exception &e ) {
+         gui::error("host::command-error:\n%s\n", e.what());
+      }
+   }
+   else {
+      int pid = fork();
+      if (pid == 0) { /* the child */
+         execl("/bin/sh", "sh", "-c", argv, NULL);
+         _exit(127);
+         return 0;
+      }
+      if (pid == -1) return 1;
+   }
+   if (after_command_) status();
+
+   return result;
+}
+
+std::list<std::string>& host::history( std::string& last )
+{
+   return hist_;
+}
+
+std::list<std::string>& ehost::history( std::string& last )
+{
+   gui::message("%s: fetching history", name());
+   try {
+      client_.getLog(history_len_);
+      boost::split(hist_, client_.server_reply().get_string(), boost::is_any_of("\n"));
+   }
+   catch ( std::exception& e ) {
+      gui::message("history failed: ", e.what());
+   }
+   return hist_;
+}
+
+bool host::connect_mngt( bool connect )
+{
+   return true;
+}
+
+bool ehost::connect_mngt( bool connect )
+{
+   if (!connect) return true;
+   if (!connect_) return true;
+   bool rc = true;
+   try {
+      gui::message("%s: ping", name());
+      client_.pingServer();
+
+      if (connect) {
+         rc = true;
+         connected_ = true;
+      }
+      else {
+         connected_ = false;
+         rc = false;
+      }
+   }
+   catch ( std::exception &e ) {
+      connected_ = false;
+      rc = false;
+      gui::message("# Exception caught in ehost::connect_mngt");
+      gui::message(e.what());
+   }
+
+   if (tree_) tree_->connected(rc);
+   if (!rc) gui::logout(name());
+   return rc;
+}
+
+const std::string host::reply() const
+{
+   return "";
+}
+
+const std::string ehost::reply() const
+{
+   return client_.server_reply().get_string();
+}
+
+void host::init()
+{
+   ecf_nick_load();
+}
+
+host* host_maker::make_host( std::string name, std::string machine, int port )
+{
+   std::map<int, host_maker*>::const_iterator it = map_.begin();
+   host * out = 0x0;
+   if (port < host_maker::port_max) {
+      it = map_.find(0);
+      if (it != map_.end())
+         out = it->second->make(name, machine, port);
+      else XECFDEBUG std::cerr << "# cannot create ehost\n";
+   }
+   else {
+      it = map_.find(1);
+      if (it != map_.end())
+         out = it->second->make(name, machine, port);
+      else XECFDEBUG std::cerr << "# cannot create shost " << name << "\t" << machine << "\t"
+                               << port << "\n";
+   }
+
+   return out;
+}
+
+void host::login( const std::string& name, int num )
+{
+   host *h = NULL;
+   if (num) h = host::find(name, num);
+   if (!h) h = host::find(name, ECF_PROG);
+   if (!h) h = host::find(name, SMS_PROG);
+   if (!h) h = host_maker::make_host(name, name, num);
+   if (h) h->login();
+}
+
+void ehost::stats( std::ostream& buf )
+{
+   gui::message("%s: fetching stats", name());
+   try {
+      client_.stats();
+      client_.server_reply().stats().show(buf);
+   }
+   catch ( std::exception& e ) {
+   }
+}
diff --git a/ecflow_4_0_7/view/src/host.h b/ecflow_4_0_7/view/src/host.h
new file mode 100644
index 0000000..f7b9410
--- /dev/null
+++ b/ecflow_4_0_7/view/src/host.h
@@ -0,0 +1,353 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #33 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef host_H
+#define host_H
+
+#include <time.h>
+#include <stdio.h>
+
+#include "ecf_node.h"
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+#ifndef timeout_H
+#include "timeout.h"
+#endif
+
+#ifndef tmp_file_H
+#include "tmp_file.h"
+#endif
+
+#ifndef searchable_H
+#include "searchable.h"
+#endif
+
+#ifndef observable_H
+#include "observable.h"
+#endif
+#include "text_lister.h"
+
+class node;
+class tree;
+#ifndef lister_H
+#include "lister.h"
+#endif
+
+#ifndef option_H
+#include "option.h"
+#endif
+
+#ifndef configurable_H
+#include "configurable.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#ifndef SINGLETON_H
+#include "singleton.h"
+#endif
+
+class Client;
+class configurator;
+class host;
+class url;
+#include <map>
+
+class host_maker {
+  virtual host* make(const std::string& name, const std::string& machine, int port) = 0;
+protected:
+  static std::map<int, host_maker*> map_;
+  static int port_max;
+public:
+  static host* make_host(std::string name, std::string machine, int port);
+  virtual ~host_maker() {}
+};
+
+template<typename T>
+class host_builder : public host_maker {
+  virtual host* make(const std::string& name, const std::string& machine, int port) 
+  { return new T(name, machine, port); }
+public:
+  host_builder(int port_max) { map_[port_max] = this; }
+};
+
+class host_lister {
+public:
+	virtual void next(host&) = 0;
+	virtual ~host_lister() {}
+};
+
+
+class host : public extent<host>
+, public timeout
+  , public searchable
+  , public configurable
+  , public observable 
+{
+ public:
+	static void status(Boolean);
+	static void login(const std::string&,int);
+	static void login(const std::string&);
+ 	static void logout(const std::string&);
+	static void broadcast(bool = false);
+	static void check_all_mail();
+
+	static node* find(const std::string&,const std::string&);
+	static host* find(const std::string&);
+	static void redraw_all();
+	static void plug(node*);
+	static void comp(node*, const char* a, const char* b );
+	static host* new_host(const std::string&,const std::string&,int);
+	static void  remove_host(const std::string&);
+	static host& dummy();
+	static void chat();
+
+ protected:
+	static host* find(const std::string&,int);
+	void update_reg_suites(bool ) {};
+
+  static void hosts(host_lister&);
+  static int maxLines;
+  host( const std::string& name, const std::string& host, int number );
+
+ public:
+  virtual const std::string reply() const;
+
+  virtual ~host();
+
+  void call_after_commands(bool b) { after_command_ = b; }
+  
+  static void init();
+
+  virtual void login();
+  virtual void logout();
+  int status();
+  void check_mail();
+
+  virtual int update();
+  virtual int command(const std::string& str) { return TRUE; };
+  virtual int command(const char*,...) { return TRUE; };
+  virtual int command(int,char**) { return TRUE; };
+  virtual std::list<std::string>& history(std::string&);
+  node* top() { return top_; }
+  tree* where() { return tree_; }
+
+  virtual tmp_file file(node& n,std::string name);
+  virtual tmp_file sfile( node& n, std::string name );
+  virtual tmp_file manual(node&);
+  virtual tmp_file script(node&);
+  virtual tmp_file output(node&);
+  virtual tmp_file job(node&);
+  virtual tmp_file jobstatus(node&, const std::string &);
+  virtual tmp_file jobcheck(node&, const std::string &);
+
+  virtual tmp_file edit(node& n,std::list<Variable>& l,Boolean preproc);
+  virtual void send(node& n,Boolean alias,Boolean run,NameValueVec& v,const char* file);
+  virtual void dir(node&,const char*,lister<ecf_dir>&);
+
+  void send(const char*,std::vector< std::string >&);
+
+  virtual bool zombies(int mode,const char* name);
+  virtual bool get_zombies_list(std::vector<std::string>& list); 
+
+  const std::vector<std::string>& suites() const;
+  virtual void suites(int, std::vector<std::string>&) {};
+  void suites(node*,bool=true);
+
+  void redraw(bool create=false);
+  virtual bool create_tree(int hh=0, int min=0, int sec=0) { return false; } 
+	time_t last() { return last_; }
+
+	virtual void change(const std::string&,const std::string&,int);
+
+	void aborted(node&);
+	void restarted(node&);
+	void late(node&);
+	void zombie(node&);
+	void to_check(node&);
+
+	void changed(resource&);
+
+	virtual str logfile() const ;
+	static int do_plug(node*,node*);
+	static int do_comp(node*,node*, 
+                            const std::string& kind, const std::string& meth);
+
+	// From timeout
+	void run();
+
+	// From searchable
+	inline const char* name() const { return name_.c_str(); }
+	const std::string& name_ref() const { return name_; }
+
+	const char* machine() const { return host_.c_str(); }
+	int number()  const      { return number_; }
+	void search(node_lister&);
+
+	void timefile(const str& s) { timefile_ = s; }
+	const str& timefile();
+	
+	virtual const std::vector<std::string>& messages(const node&n) const;
+
+ protected:
+	host(const host&);
+	host& operator=(const host&);
+
+	void destroy_top(node*) const;
+
+	str     host_;
+	int     number_;
+
+	std::string name_;
+
+ 	bool    connected_;
+	bool    after_command_;
+
+	str     user_;
+	str     passwd_;
+	virtual int origin() const;
+
+	option<int>       timeout_;
+	option<int>       maximum_;
+	option<bool>      drift_;
+	option<bool>      connect_;
+	option<std::vector<std::string> > suites_;
+
+	option<bool>      aborted_;
+
+	option<bool>      restarted_;
+	option<bool>      late_;
+	option<bool>      poll_;
+
+	option<bool>      direct_read_;
+	option<bool>      new_suites_;
+
+	option<bool>      zombie_;
+	option<bool>      aliases_;
+	option<bool>      late_family_;
+	option<bool>      to_check_;
+
+	bool  chkmail_;
+
+	node*       top_;
+	tree*       tree_;
+	int         mail_;
+	time_t      last_;
+	str         timefile_;
+	std::list<std::string> hist_;
+	int history_len_;
+	std::string loghost_;
+	std::string logport_;
+
+	virtual void reset(bool full=false, bool sync=true) {};
+	virtual bool connect_mngt(bool connect);
+
+	bool updating_; // SUP-423
+	option<int>       jobfile_length_;
+ public:
+	void updating(bool b) { updating_ = b; }
+        virtual void stats(std::ostream& f) { };
+};
+
+class ehost : public host {
+ public:
+  ehost( const std::string& name,const std::string& h,int number );
+  virtual ~ehost();
+  virtual void dir(node&,const char*,lister<ecf_dir>&);
+
+  bool zombies(int mode, const char *name);
+  bool get_zombies_list(std::vector<std::string>& list); 
+
+  void login();
+  void logout();
+  void changed( resource& r );
+  virtual std::list<std::string>& history(std::string&);
+
+  virtual str logfile() const ;
+  virtual int command(int argc, char **argv);
+  int command(const std::string& str);
+  int command(const char* cmd, ... );
+
+  virtual tmp_file edit(node& n,std::list<Variable>& l,Boolean preproc);
+  virtual void send(node& n,Boolean alias,Boolean run,NameValueVec& v,const char* file);
+  virtual void suites(int, std::vector<std::string>&) ;
+  tmp_file sfile(node&,std::string);
+  tmp_file file(node& n,std::string name);
+  tmp_file manual( node& n );
+  tmp_file jobcheck( node& n, const std::string &cmd );
+  tmp_file jobstatus( node& n, const std::string &cmd );
+  
+  const std::string reply() const;
+  virtual int update();
+  
+  virtual const std::vector<std::string>& messages(const node&n) const;
+
+  void stats(std::ostream& f);
+ protected:
+  virtual bool connect_mngt(bool connect);
+  ClientInvoker client_;
+  bool create_tree(int hh=0, int min=0, int sec=0);
+
+  virtual void reset(bool full=false, bool sync=true);
+ protected:
+	void update_reg_suites(bool get_ch_suites);
+
+	ehost(const ehost&);
+	ehost& operator=(const ehost&);
+};
+struct host_locker {
+protected:
+   host* host_;
+   int e_;
+public:
+   host_locker( host* h );
+   ~host_locker();
+   int err() { return e_; }
+};
+
+class Updating {
+public:
+ Updating(host* h) : host_(h) {
+    do_full_redraw_ = false;
+    host_->updating(true);
+  }
+
+  ~Updating() {
+    host_->updating(false);
+  }
+
+  static void set_full_redraw() {
+    do_full_redraw_ = true;
+  }
+
+  static bool full_redraw() {
+    return do_full_redraw_;
+  }
+
+private:
+  host* host_;
+  static bool do_full_redraw_;
+};
+
+#endif
+
diff --git a/ecflow_4_0_7/view/src/host_prefs.cc b/ecflow_4_0_7/view/src/host_prefs.cc
new file mode 100644
index 0000000..99261da
--- /dev/null
+++ b/ecflow_4_0_7/view/src/host_prefs.cc
@@ -0,0 +1,24 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "host_prefs.h"
+
+void host_prefs::create(Widget w,char*) 
+{ 
+	option_form_c::create(w); 
+	prefs::setup(w); 
+}
+
+// static host_prefs hp;
diff --git a/ecflow_4_0_7/view/src/host_prefs.h b/ecflow_4_0_7/view/src/host_prefs.h
new file mode 100644
index 0000000..8824b69
--- /dev/null
+++ b/ecflow_4_0_7/view/src/host_prefs.h
@@ -0,0 +1,46 @@
+#ifndef host_prefs_H
+#define host_prefs_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef prefs_H
+#include "prefs.h"
+#endif
+
+#ifndef uioption_H
+#include "uioption.h"
+#endif
+
+class host_prefs : public prefs, public option_form_c {
+public:
+  host_prefs() {}
+  
+  ~host_prefs() {}
+  
+  virtual Widget widget() { return _xd_rootwidget; }
+
+private:
+
+  host_prefs(const host_prefs&);
+  host_prefs& operator=(const host_prefs&);
+  
+  virtual void changedCB( Widget w, XtPointer ) { pref_editor::changed(w); }
+  virtual void useCB( Widget w, XtPointer )     { pref_editor::use(w); }
+  virtual void create(Widget w,char*);
+};
+
+inline void destroy(host_prefs**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/html_lister.cc b/ecflow_4_0_7/view/src/html_lister.cc
new file mode 100644
index 0000000..2503eb5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/html_lister.cc
@@ -0,0 +1,72 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdarg.h>
+#include "html_lister.h"
+
+html_lister::html_lister(node *n):
+	node_(n),
+	nodes_(0), 
+	cancels_(0)
+{
+	buf_[0] = 0;
+}
+
+html_lister::~html_lister()
+{
+}
+
+void html_lister::push(node* n)
+{
+	char buf[1024];
+	sprintf(buf,"<a href=\"%s\">%s</a>",
+		n->net_name().c_str(), // TODO +1,
+		n->node_name().c_str());
+	strcat(buf_,buf);
+	nodes_++;
+}
+
+void html_lister::push(const char* p,...) 
+{ 
+	char buf[1024];
+	va_list arg;
+	va_start(arg,p);
+	vsprintf(buf,p,arg);
+	va_end(arg);
+	strcat(buf_,buf);
+}
+
+void html_lister::cancel()
+{
+	cancels_++;
+}
+
+void html_lister::endline()
+{
+  if(cancels_) {
+		if(cancels_ >= nodes_)
+		{
+			//printf("Canceling line %s\n",buf_);
+			buf_[0] = 0;
+		}
+		else
+		{
+			//printf("Not canceling line %s\n",buf_);
+		}
+  }
+	line(buf_);
+	buf_[0] = 0;
+	nodes_ = cancels_ = 0;
+}
diff --git a/ecflow_4_0_7/view/src/html_lister.h b/ecflow_4_0_7/view/src/html_lister.h
new file mode 100644
index 0000000..8dd62db
--- /dev/null
+++ b/ecflow_4_0_7/view/src/html_lister.h
@@ -0,0 +1,133 @@
+#ifndef html_lister_H
+#define html_lister_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#include "node.h"
+#include "text_lister.h"
+
+class html_lister : public text_lister {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	html_lister(node*);
+
+// -- Destructor
+
+	virtual ~html_lister(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	
+	virtual void line(const char*) = 0;
+
+// -- Overridden methods
+
+	void push(node* n);
+	void push(const char* p,...);
+	void endline();
+	void cancel();
+	node* source() const { return node_; }
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	html_lister(const html_lister&);
+	html_lister& operator=(const html_lister&);
+
+// -- Members
+
+	node*  node_;
+	int    nodes_;
+	int    cancels_;
+	char   buf_[1024];
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const html_lister& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(html_lister**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(html_lister);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/http.cc b/ecflow_4_0_7/view/src/http.cc
new file mode 100644
index 0000000..468be9c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/http.cc
@@ -0,0 +1,112 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <string.h>
+
+#ifndef http_H
+#include "http.h"
+#endif
+
+#ifndef init_H
+#include "init.h"
+#endif
+
+#ifndef host_H
+#include "host.h"
+#endif
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+#ifndef url_H
+#include "url.h"
+#endif
+
+
+http::http(int port,int argc,char** argv):
+	server(port)
+{
+	init::initialize(argc,argv);
+}
+
+http::~http()
+{
+}
+
+static const char *json = getenv("ECFLOW_JSON");
+
+void http::serve(int soc)
+{
+	url u(soc);
+
+	char what[1024];
+	char serv[128];
+	char from[1024];
+	char suit[128] = {0, };
+	strncpy(what,u.what(), 1024);
+	
+	char *p = strtok(what,"/");
+	strncpy(serv,p?p:"", 128);
+
+	p = strtok(0,"/");
+	snprintf(suit,128, "%s",p?p:"");
+
+	p = strtok(0,"?");
+	snprintf(from,1024, "/%s/%s",suit,p?p:"");
+	
+	if (json) { // set by environment variable
+	    node::is_json = true;
+	} else {
+	    node::is_json = false;
+	}
+	if (strlen(suit) > 5) {
+	  if (!strncmp(".json", suit+strlen(from) - 5, 5)) {
+	    suit[strlen(suit) - 5] = '\0';
+	  }
+	}
+	if (strlen(from) > 5) {
+	  if (!strncmp(".json", from+strlen(from) - 5, 5)) {
+	    from[strlen(from) - 5] = '\0';
+	    node::is_json = true; // set by url name
+	  }
+	}
+	printf("get [%s] [%s] [%s]\n",serv,suit,from);
+
+	// host::login(serv);
+
+	host* ho = host::find(serv);      
+	if(ho) { 
+	  if (suit[0] != 0) {
+	    std::vector<std::string> regist;
+	    regist.push_back(suit);
+	    ho->suites(SUITES_REG, regist);
+	  }
+	  ho->login();
+	  ho->status();
+	}
+	node* n = host::find(serv,from);
+
+	u.process(n);
+
+}
+
+int wmain(int argc,char** argv)
+{
+	char *p = getenv("ECFLOW_HTTP_PORT");
+	http s(atol(p),argc,argv);
+	s.run();
+	return 0;
+}
diff --git a/ecflow_4_0_7/view/src/http.h b/ecflow_4_0_7/view/src/http.h
new file mode 100644
index 0000000..d9a8bc8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/http.h
@@ -0,0 +1,143 @@
+#ifndef http_H
+#define http_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <stdio.h>
+
+#ifndef server_H
+#include "server.h"
+#endif
+
+#ifndef interface_H
+#include "interface.h"
+#endif
+
+
+class http : public interface , public server  {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	http(int,int,char**);
+
+// -- Destructor
+
+	~http(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	// From server
+
+	virtual void serve(int);
+
+
+	// From interface
+
+	virtual void clear() {}
+	virtual void message(const char* p) { fprintf(stderr,"-> %s\n",p); }
+	virtual void watch(Boolean) {}
+
+	virtual void add_host(const std::string&) {}
+	virtual void remove_host(const std::string&) {}
+	virtual void rename_host(const std::string&, const std::string&) {}
+
+	virtual void login(const char*) {}
+	virtual void logout(const char*) {}
+
+	virtual Widget top_shell() { return 0; }
+	virtual Widget trees()  { return 0; }
+	virtual Widget windows()  { return 0; }
+
+	virtual void error(const char*) {}
+
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	http(const http&);
+	http& operator=(const http&);
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const http& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(http**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(http);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/hyper_lister.cc b/ecflow_4_0_7/view/src/hyper_lister.cc
new file mode 100644
index 0000000..efdd2cd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/hyper_lister.cc
@@ -0,0 +1,73 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdarg.h>
+#include "hyper_lister.h"
+
+const int hyper_lister::dim_ = 1024;
+
+hyper_lister::hyper_lister(panel& o,node *n):
+  owner_(o),
+  node_(n),
+  nodes_(0), 
+  cancels_(0)
+{
+  buf_[0] = 0;
+}
+
+hyper_lister::~hyper_lister()
+{
+}
+
+void hyper_lister::push(node* n)
+{
+  char buf[dim_];
+  snprintf(buf,dim_,"{%s}",n->node_name().c_str());
+  strcat(buf_,buf);
+  nodes_++;
+
+  owner_.observe(n);
+}
+
+void hyper_lister::push(const char* p,...) 
+{ 
+  char buf[dim_];
+  va_list arg;
+  va_start(arg,p);
+  vsnprintf(buf,dim_,p,arg);
+  va_end(arg);
+  strcat(buf_,buf);
+}
+
+void hyper_lister::cancel()
+{
+  cancels_++;
+}
+
+void hyper_lister::endline()
+{
+  if(cancels_) {
+    if(cancels_ >= nodes_) {
+      //printf("Canceling line %s\n",buf_);
+      buf_[0] = 0;
+    }
+    else {
+      //printf("Not canceling line %s\n",buf_);
+    }
+  }
+  line(buf_);
+  buf_[0] = 0;
+  nodes_ = cancels_ = 0;
+}
diff --git a/ecflow_4_0_7/view/src/hyper_lister.h b/ecflow_4_0_7/view/src/hyper_lister.h
new file mode 100644
index 0000000..9ef0bb9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/hyper_lister.h
@@ -0,0 +1,57 @@
+#ifndef hyper_lister_H
+#define hyper_lister_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node.h"
+#include "panel.h"
+#include "text_lister.h"
+
+
+class hyper_lister : public text_lister {
+public:
+
+  hyper_lister(panel&,node*);
+  
+  virtual ~hyper_lister(); // Change to virtual if base class
+  
+  virtual void line(const char*) = 0;
+  
+  void push(node* n);
+  void push(const char* p,...);
+  void endline();
+  void cancel();
+  node* source() const { return node_; }
+        
+private:
+  static const int dim_;
+
+  hyper_lister(const hyper_lister&);
+  hyper_lister& operator=(const hyper_lister&);
+  
+  panel& owner_;
+  node*  node_;
+  int    nodes_;
+  int    cancels_;
+  char   buf_[1024];
+
+ protected:
+  panel& owner() { return owner_; }
+};
+
+inline void destroy(hyper_lister**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/icon_Josstatus3.cc b/ecflow_4_0_7/view/src/icon_Josstatus3.cc
new file mode 100644
index 0000000..2a9b2bd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_Josstatus3.cc
@@ -0,0 +1,41 @@
+#include "pixmap.h"
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static const char * bits[] = {
+"16 16 5 1",
+" 	c None",
+".	c #000000",
+"+	c #0000FF",
+"@	c #00FF00",
+"#	c #FF0000",
+"................",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+"................",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+"................",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+"................"};
+static pixmap p("Josstatus3",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_W.cc b/ecflow_4_0_7/view/src/icon_W.cc
new file mode 100644
index 0000000..3184a5f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_W.cc
@@ -0,0 +1,86 @@
+#include "pixmap.h"
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static const char * bits[] = {
+"16 16 50 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #E7E3E3",
+"@	c #E9CDCD",
+"#	c #EEA3A3",
+"$	c #FF0000",
+"%	c #FA2A2A",
+"&	c #F64E4E",
+"*	c #F93434",
+"=	c #FB1C1C",
+"-	c #F46464",
+";	c #FD0E0E",
+">	c #EDA9A9",
+",	c #E8D7D7",
+"'	c #FB2222",
+")	c #FE0606",
+"!	c #ECB5B5",
+"~	c #FA2727",
+"{	c #EDABAB",
+"]	c #F83E3E",
+"^	c #EF9494",
+"/	c #E7E5E5",
+"(	c #EE9F9F",
+"_	c #F36D6D",
+":	c #F08D8D",
+"<	c #F74646",
+"[	c #ECB0B0",
+"}	c #FE0404",
+"|	c #FA2828",
+"1	c #E8DBDB",
+"2	c #E9CACA",
+"3	c #FD1313",
+"4	c #FD1212",
+"5	c #EACACA",
+"6	c #E7E6E6",
+"7	c #F65555",
+"8	c #E7DFDF",
+"9	c #E8DCDC",
+"0	c #FA2929",
+"a	c #ECAFAF",
+"b	c #F18484",
+"c	c #F74949",
+"d	c #E7E0E0",
+"e	c #F27D7D",
+"f	c #FE0101",
+"g	c #F46868",
+"h	c #F93939",
+"i	c #F93131",
+"j	c #FD0B0B",
+"k	c #EDA6A6",
+"................",
+"................",
+"....+@@@@@@@@...",
+"....#$$%&*$$=...",
+"....-;>.,'$)!...",
+"....~{.+]$$^....",
+".../(..-$$_.....",
+"......:$$</.....",
+".....[}$|1......",
+"....23$45.678...",
+"...90$}a..b0....",
+"...c$$:.defg....",
+"...$$)hij$$k....",
+"................",
+"................",
+"................"};
+static pixmap p("W",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_byrule.cc b/ecflow_4_0_7/view/src/icon_byrule.cc
new file mode 100644
index 0000000..c597702
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_byrule.cc
@@ -0,0 +1,38 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 14 1",
+"  c #000080800000",
+". c #3196965F3196",
+"X c #3E359BF03E35",
+"o c #4FC7A3AF4FC7",
+"O c #82B4BA2682B4",
+"+ c #84AEBB0584AE",
+"@ c #9B2CC4F09B2C",
+"# c #9EC3C6869EC3",
+"$ c #CDA2DB32CDA2",
+"% c #D3DDDDF1D3DD",
+"& c #D778DF88D778",
+"* c #D8EFE02DD8EF",
+"= c #E331E4B4E331",
+"- c #E5E5E5E5E5E5",
+/* pixels */
+"       #--------",
+"       O--------",
+"       @--------",
+"       $--------",
+"      o---------",
+"      *-  X.----",
+"    o*--  @%----",
+"@+@$----  &-----",
+"--------  =-----",
+"--------  ------",
+"--------  ------",
+"--------  ------",
+"----------------",
+"----------------",
+"----------------",
+"----------------"
+};
+static pixmap p("byrule",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_cmd_failed.cc b/ecflow_4_0_7/view/src/icon_cmd_failed.cc
new file mode 100644
index 0000000..88f581a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_cmd_failed.cc
@@ -0,0 +1,52 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 28 1",
+"  c #FFFF00000000",
+". c #FF4806500650",
+"X c #FE760D860D86",
+"o c #FE27103A103A",
+"O c #FD3B18571857",
+"+ c #FA7830AF30AF",
+"@ c #F9583A9A3A9A",
+"# c #F93E3B813B81",
+"$ c #F6F04FC74FC7",
+"% c #F6F84F844F84",
+"& c #F5405EAA5EAA",
+"* c #F4BD632C632C",
+"= c #F3D16B496B49",
+"- c #F0EF84AE84AE",
+"; c #F0218BBD8BBD",
+": c #F0078CA48CA4",
+"> c #F12882B482B4",
+", c #EE619B2C9B2C",
+"< c #EDF99EC39EC3",
+"1 c #EBA0B368B368",
+"2 c #EB6CB536B536",
+"3 c #E97AC657C657",
+"4 c #E8C5CC93CC93",
+"5 c #E8A6CDA2CDA2",
+"6 c #E7A2D691D691",
+"7 c #E73ADA2DDA2D",
+"8 c #E682E07CE07C",
+"9 c #E5E5E5E5E5E5",
+/* pixels */
+"       <99999999",
+"       >99999999",
+"       ,99999999",
+"       499999999",
+"      $999999999",
+"      798*o. at 399",
+"    $799= :2 +99",
+",-,59999O 799999",
+"99999999  999999",
+"99999999O 699999",
+"99999999= ;1 +99",
+"999999998&X. at 399",
+"9999999999999999",
+"9999999999999999",
+"9999999999999999",
+"9999999999999999"
+};
+static pixmap p("cmd_failed",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_edit_failed.cc b/ecflow_4_0_7/view/src/icon_edit_failed.cc
new file mode 100644
index 0000000..143b31e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_edit_failed.cc
@@ -0,0 +1,54 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 30 1",
+"  c #FFFF00000000",
+". c #FF96039B039B",
+"X c #FF4806500650",
+"o c #FE420F540F54",
+"O c #FE27103A103A",
+"+ c #FD70168A168A",
+"@ c #FD071A251A25",
+"# c #FC841EA71EA7",
+"$ c #F98C38CC38CC",
+"% c #F6F04FC74FC7",
+"& c #F6F84F844F84",
+"* c #F5255F905F90",
+"= c #F4D762456245",
+"- c #F43A67AE67AE",
+"; c #F3686EE46EE4",
+": c #F33470B270B2",
+"> c #F0EF84AE84AE",
+", c #F0218BBD8BBD",
+"< c #F12882B482B4",
+"1 c #EF8491269126",
+"2 c #EE619B2C9B2C",
+"3 c #EDF99EC39EC3",
+"4 c #EBBBB282B282",
+"5 c #E8C5CC93CC93",
+"6 c #E8A6CDA2CDA2",
+"7 c #E7D7D4C4D4C4",
+"8 c #E71FDB13DB13",
+"9 c #E69CDF95DF95",
+"0 c #E668E163E163",
+"q c #E5E5E5E5E5E5",
+/* pixels */
+"       3qqqqqqqq",
+"       <qqqqqqqq",
+"       2qqqqqqqq",
+"       5qqqqqqqq",
+"      %qqqqqqqqq",
+"      8q9=oo=0qq",
+"    %8qq; ,1 :qq",
+"2>26qqqq@ 78 #qq",
+"qqqqqqqq      qq",
+"qqqqqqqq+ 8qqqqq",
+"qqqqqqqq- >4 $qq",
+"qqqqqqqq0*OX%6qq",
+"qqqqqqqqqqqq0qqq",
+"qqqqqqqqqqqq00qq",
+"qqqqqqqqqqqqqqqq",
+"qqqqqqqqqqqqqqqq"
+};
+static pixmap p("edit_failed",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_force_abort.cc b/ecflow_4_0_7/view/src/icon_force_abort.cc
new file mode 100644
index 0000000..b2a24aa
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_force_abort.cc
@@ -0,0 +1,39 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 15 1",
+"  c #FFFFA5A50000",
+". c #FDA4AB7114BC",
+"X c #FC6AAE771F8E",
+"o c #F6F0BBF14FC7",
+"O c #F488C1DD64F9",
+"+ c #F0EFCABA84AE",
+"@ c #F128CA2C82B4",
+"# c #EE61D1039B2C",
+"$ c #EDFAD2019EB8",
+"% c #EBA0D7C9B368",
+"& c #E8A6DF1DCDA2",
+"* c #E80BE09AD2F6",
+"= c #E75EE246D8EF",
+"- c #E64EE4E3E24A",
+"; c #E5E5E5E5E5E5",
+/* pixels */
+"       $;;;;;;;;",
+"       @;;;;;;;;",
+"       #;;;;;;;;",
+"       &;;;;;;;;",
+"      o;;;;;;;;;",
+"      =;  ;;  ;;",
+"    o=;;  ;;  ;;",
+"#+#&;;;;  ;;  ;;",
+";;;;;;;;  ;;  ;;",
+";;;;;;;;  -*  ;;",
+";;;;;;;;X %O  ;;",
+";;;;;;;;$.X%  ;;",
+";;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;"
+};
+static pixmap p("force_abort",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_killed.cc b/ecflow_4_0_7/view/src/icon_killed.cc
new file mode 100644
index 0000000..76729eb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_killed.cc
@@ -0,0 +1,47 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 23 1",
+"  c #FFFF00000000",
+". c #FEF909040904",
+"X c #FDF312081208",
+"o c #FD5617711771",
+"O c #FCD31BF31BF3",
+"+ c #FD21193E193E",
+"@ c #F98C38CC38CC",
+"# c #F852439E439E",
+"$ c #F6F04FC74FC7",
+"% c #F39C6D166D16",
+"& c #F0EF84AE84AE",
+"* c #EFED8D8B8D8B",
+"= c #F12882B482B4",
+"- c #EE619B2C9B2C",
+"; c #EDF99EC39EC3",
+": c #ED0FA6C9A6C9",
+"> c #EC72AC32AC32",
+", c #EA17C0EEC0EE",
+"< c #E960C73EC73E",
+"1 c #E8A6CDA2CDA2",
+"2 c #E92CC90CC90C",
+"3 c #E75ED8EFD8EF",
+"4 c #E5E5E5E5E5E5",
+/* pixels */
+"       ;44444444",
+"       =44444444",
+"       -44444444",
+"       1  444444",
+"      $4  444444",
+"      34  4<Oo<4",
+"    $344  <+X,44",
+"-&-14444  + *444",
+"44444444  .X at 444",
+"44444444  :% >44",
+"44444444  42 @44",
+"44444444  44# >4",
+"4444444444444444",
+"4444444444444444",
+"4444444444444444",
+"4444444444444444"
+};
+static pixmap p("killed",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_no_script.cc b/ecflow_4_0_7/view/src/icon_no_script.cc
new file mode 100644
index 0000000..47d0b94
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_no_script.cc
@@ -0,0 +1,56 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 32 1",
+"  c #FFFF00000000",
+". c #FF6205690569",
+"X c #FEF909040904",
+"o c #FE420F540F54",
+"O c #FCD31BF31BF3",
+"+ c #FC35215B215B",
+"@ c #FB2F2A5F2A5F",
+"# c #FA922FC82FC8",
+"$ c #FA44327D327D",
+"% c #F9233C673C67",
+"& c #F88641D041D0",
+"* c #F6F84F844F84",
+"= c #F69452F152F1",
+"- c #F0EF84AE84AE",
+"; c #F0218BBD8BBD",
+": c #F12882B482B4",
+"> c #EF5092F492F4",
+", c #EF0195A895A8",
+"< c #EE619B2C9B2C",
+"1 c #EDF99EC39EC3",
+"2 c #EC72AC32AC32",
+"3 c #EC23AEE6AEE6",
+"4 c #EB86B44FB44F",
+"5 c #EACFBA9FBA9F",
+"6 c #E9E3C2BCC2BC",
+"7 c #E97AC657C657",
+"8 c #E8C5CC93CC93",
+"9 c #E8A6CDA2CDA2",
+"0 c #E92CC90CC90C",
+"q c #E769D888D888",
+"w c #E71FDB13DB13",
+"e c #E5E5E5E5E5E5",
+/* pixels */
+"       1eeeeeeee",
+"       :eeeeeeee",
+"       <eeeeeeee",
+"       8eeeeeeee",
+"      *eeeeeeeee",
+"      qe4$.X%0ee",
+"    =qeeO 72 $ee",
+"<-<9eeeeo @;weee",
+"eeeeeeee>o  o,ee",
+"eeeeeeeeew1= oee",
+"eeeeeeee# 36 +ee",
+"eeeeeeee0&X.$5ee",
+"eeeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeeee"
+};
+static pixmap p("no_script",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_queuelimit.cc b/ecflow_4_0_7/view/src/icon_queuelimit.cc
new file mode 100644
index 0000000..fdc5e6f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_queuelimit.cc
@@ -0,0 +1,47 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 23 1",
+"  c #000080800000",
+". c #0D8686770D86",
+"X c #1121880E1121",
+"o c #15A38A0B15A3",
+"O c #344A9790344A",
+"+ c #353197F63531",
+"@ c #4FC7A3AF4FC7",
+"# c #52F1A51552F1",
+"$ c #5A28A8435A28",
+"% c #6245ABD76245",
+"& c #82B4BA2682B4",
+"* c #84AEBB0584AE",
+"= c #8CA4BE888CA4",
+"- c #9A89C4A89A89",
+"; c #9B2CC4F09B2C",
+": c #9EC3C6869EC3",
+"> c #A5E2C9AAA5E2",
+", c #CC9DDABFCC9D",
+"< c #CDA2DB32CDA2",
+"1 c #D129DCC0D129",
+"2 c #D874DFF7D874",
+"3 c #E417E519E417",
+"4 c #E5E5E5E5E5E5",
+/* pixels */
+"       :44444444",
+"       &44444444",
+"       -44444444",
+"       ,44444444",
+"      @444444444",
+"      241+.=  44",
+"    #244# *%  44",
+";*;<4444X 22  44",
+"44444444  33  44",
+"44444444o 2,  44",
+"44444444$ =@  44",
+"444444442+X>  44",
+"444444444444  44",
+"444444444444  44",
+"4444444444444444",
+"4444444444444444"
+};
+static pixmap p("queuelimit",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_task_aborted.cc b/ecflow_4_0_7/view/src/icon_task_aborted.cc
new file mode 100644
index 0000000..5b6ac09
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_task_aborted.cc
@@ -0,0 +1,53 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 29 1",
+"  c #FFFF00000000",
+". c #FF7C04820482",
+"X c #FF13081D081D",
+"o c #FEC50AD20AD2",
+"O c #FD70168A168A",
+"+ c #FD3B18571857",
+"@ c #FB6428922892",
+"# c #FAC72DFB2DFB",
+"$ c #F97239B339B3",
+"% c #F88641D041D0",
+"& c #F6F04FC74FC7",
+"* c #F6F84F844F84",
+"= c #F5C35A285A28",
+"- c #F43A67AE67AE",
+"; c #F1907F1E7F1E",
+": c #F0EF84AE84AE",
+"> c #F12882B482B4",
+", c #EECD97769776",
+"< c #EE619B2C9B2C",
+"1 c #EDF99EC39EC3",
+"2 c #ECF5A7B0A7B0",
+"3 c #EB86B44FB44F",
+"4 c #EB03B8D1B8D1",
+"5 c #E9C9C3A3C3A3",
+"6 c #E8C5CC93CC93",
+"7 c #E8A6CDA2CDA2",
+"8 c #E73ADA2DDA2D",
+"9 c #E64EE24AE24A",
+"0 c #E5E5E5E5E5E5",
+/* pixels */
+"       100000000",
+"       >00000000",
+"       <00000000",
+"       600000000",
+"      &000000000",
+"      805$X. at 200",
+"    &800#,94 +00",
+"<:<7000003-@  00",
+"00000000; %3  00",
+"00000000X 88  00",
+"00000000O 3>  00",
+"00000000<Xo=  00",
+"0000000000000000",
+"0000000000000000",
+"0000000000000000",
+"0000000000000000"
+};
+static pixmap p("task_aborted",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/icon_user_edit.cc b/ecflow_4_0_7/view/src/icon_user_edit.cc
new file mode 100644
index 0000000..d38cc79
--- /dev/null
+++ b/ecflow_4_0_7/view/src/icon_user_edit.cc
@@ -0,0 +1,52 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 28 1",
+"  c #000080800000",
+". c #065083490650",
+"X c #0F5487420F54",
+"o c #103A87A8103A",
+"O c #1A258C081A25",
+"+ c #1EA78E051EA7",
+"@ c #38CC998D38CC",
+"# c #3F1C9C553F1C",
+"$ c #4FC7A3AF4FC7",
+"% c #5F90AAA65F90",
+"& c #6245ABD76245",
+"* c #67AEAE3A67AE",
+"= c #6EE4B1686EE4",
+"- c #70B2B23470B2",
+"; c #82B4BA2682B4",
+": c #84AEBB0584AE",
+"> c #8BBDBE228BBD",
+", c #9126C0859126",
+"< c #9B2CC4F09B2C",
+"1 c #9EC3C6869EC3",
+"2 c #B282CF3BB282",
+"3 c #CDA2DB32CDA2",
+"4 c #D4C4DE57D4C4",
+"5 c #D91BE041D91B",
+"6 c #DB13E11FDB13",
+"7 c #DF95E31CDF95",
+"8 c #E163E3E8E163",
+"9 c #E5E5E5E5E5E5",
+/* pixels */
+"       199999999",
+"       ;99999999",
+"       <99999999",
+"       399999999",
+"      $999999999",
+"      597&XX&899",
+"    $599= >, -99",
+"<:<39999O 46 +99",
+"99999999     .99",
+"99999999O 599999",
+"99999999* :2 @99",
+"999999997%o.#399",
+"9999999999999999",
+"9999999999999999",
+"9999999999999999",
+"9999999999999999"
+};
+static pixmap p("user_edit",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/info.cc b/ecflow_4_0_7/view/src/info.cc
new file mode 100644
index 0000000..81e868b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/info.cc
@@ -0,0 +1,55 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "info.h"
+#include "node.h"
+#include "error.h"
+#include "selection.h"
+#include "Hyper.h"
+#include <stdio.h>
+#include "ecf_node.h"
+
+info::info(panel_window& w):
+  panel(w)
+{
+}
+
+info::~info()
+{
+}
+
+void info::clear()
+{
+  forget_all();
+  HyperSetText(text_,(char*)"No node selected.");
+}
+
+void info::show(node& n)
+{
+  forget_all();
+  std::stringstream ss;
+  n.info(ss);
+  HyperSetText(text_,(char*) ss.str().c_str());
+}
+
+void info::hyperCB(Widget w,XtPointer data)
+{
+  panel::hyper(w,data);
+}
+
+Boolean info::enabled(node& n)
+{
+  return n.hasInfo();
+}
diff --git a/ecflow_4_0_7/view/src/info.h b/ecflow_4_0_7/view/src/info.h
new file mode 100644
index 0000000..11da7ce
--- /dev/null
+++ b/ecflow_4_0_7/view/src/info.h
@@ -0,0 +1,46 @@
+#ifndef info_H
+#define info_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiinfo.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+class info : public panel, public info_form_c {
+public:
+	info(panel_window&);
+
+	~info(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Info"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+	virtual Boolean enabled(node&);
+
+private:
+
+	info(const info&);
+	info& operator=(const info&);
+
+	virtual void hyperCB(Widget,XtPointer);
+};
+
+inline void destroy(info**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/init.cc b/ecflow_4_0_7/view/src/init.cc
new file mode 100644
index 0000000..9a84a8d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/init.cc
@@ -0,0 +1,36 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "init.h"
+
+init::init()
+{
+}
+
+init::~init()
+{
+}
+
+void init::initialize(int argc,char** argv)
+{
+  init* p = first();
+  while(p) {
+    p->run(argc,argv);
+    p = p->next();
+  }
+}
+
+IMP(init)
+
diff --git a/ecflow_4_0_7/view/src/init.h b/ecflow_4_0_7/view/src/init.h
new file mode 100644
index 0000000..9a4e9af
--- /dev/null
+++ b/ecflow_4_0_7/view/src/init.h
@@ -0,0 +1,127 @@
+#ifndef init_H
+#define init_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+// 
+
+class init : public extent<init> {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	init();
+
+// -- Destructor
+
+	virtual ~init(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	
+	virtual void run(int,char**) = 0;
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+	static void initialize(int,char**);
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	init(const init&);
+	init& operator=(const init&);
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const init& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(init**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(init);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/inlimit_node.cc b/ecflow_4_0_7/view/src/inlimit_node.cc
new file mode 100644
index 0000000..2518535
--- /dev/null
+++ b/ecflow_4_0_7/view/src/inlimit_node.cc
@@ -0,0 +1,71 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "inlimit_node.h"
+#include "ecf_node.h"
+#include "NodeAttr.hpp"
+
+inlimit_node::inlimit_node(host& h,ecf_node* n) 
+  : node(h,n)
+  , buf_()
+ {
+   if (owner_) buf_ = owner_->toString();
+   full_name_ = parent()->full_name();
+   full_name_ += ":";
+   full_name_ += buf_;
+}
+
+#ifdef BRIDGE
+extern "C" {
+#define new _new
+#define delete _delete
+#include "smsproto.h"
+}
+inlimit_node::inlimit_node(host& h,sms_node* n, char b) 
+  : node(h,n,b) 
+  , buf_("limited by: ")
+  , full_name_ ("inlimit: ")
+{
+  if (n) { buf_ += n->name;
+    full_name_ = sms_node_full_name(n); 
+  }
+}
+#endif
+
+inlimit_node::~inlimit_node() {
+}
+
+xmstring inlimit_node::make_label_tree()
+{
+  char buf[1024];
+  sprintf(buf,"%s",buf_.c_str());
+  return xmstring(buf);
+}
+
+void inlimit_node::perlify(FILE* f) 
+{
+  perl_member(f,"limit",owner_->name().c_str());
+  // perl_member(f,"usage",owner_->usage());
+}
+
+bool inlimit_node::match(const char* p)
+{
+  return strstr(owner_->name().c_str(), p) != 0;
+}
+
+const std::string& inlimit_node::full_name() const
+{
+  return full_name_;
+}
diff --git a/ecflow_4_0_7/view/src/inlimit_node.h b/ecflow_4_0_7/view/src/inlimit_node.h
new file mode 100644
index 0000000..d42cd5e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/inlimit_node.h
@@ -0,0 +1,49 @@
+#ifndef INLIMIT_NODE_H
+#define INLIMIT_NODE_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #10 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "node.h"
+#include "show.h"
+
+class inlimit_node : public node {
+
+	std::string buf_, full_name_;
+	virtual bool match(const char*);
+
+	virtual void info(std::ostream&) {}
+	virtual xmstring make_label_tree();
+
+	virtual const std::string& name()   const { return buf_; }
+	virtual const std::string& full_name() const;
+	virtual Boolean menus()       { return False;      }
+	virtual Boolean selectable() { return True;      }
+
+	virtual Boolean visible()  const  { return show::want(show::inlimit);      }
+
+	virtual void triggered(trigger_lister&) {}
+	virtual void triggers(trigger_lister&)  {}
+	virtual void perlify(FILE*);
+
+public:
+  inlimit_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+  inlimit_node(host& h,sms_node* n, char b); // : node(h,n,b) {}
+#endif
+  ~inlimit_node();
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/input.cc b/ecflow_4_0_7/view/src/input.cc
new file mode 100644
index 0000000..70940eb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/input.cc
@@ -0,0 +1,67 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <strings.h>
+#include "ecflowview.h"
+#include "input.h"
+
+extern XtAppContext app_context;
+
+void input::inputCB(XtPointer data,int*,XtInputId* id)
+{
+	input* p = ((input*)data);
+	char buf[1024];
+
+	if(fgets(buf,sizeof(buf),p->file_))
+	{
+		if(buf[0]) buf[strlen(buf)-1] = 0;
+		p->ready(buf);
+	}
+	else 
+		p->done(p->file_);
+}
+
+input::input():
+	id_(0),
+	file_(0)
+{
+}
+
+input::~input()
+{
+	stop();
+}
+
+void input::stop()
+{
+	if(file_)
+	{
+		XtRemoveInput(id_);
+		file_ = 0;
+	}
+}
+
+void input::start(FILE* f)
+{
+	if(file_ == 0)
+	{
+		file_ = f;
+		id_ = XtAppAddInput(app_context,fileno(f),
+			XtPointer(XtInputReadMask),
+			inputCB,this);
+	}
+}
+
diff --git a/ecflow_4_0_7/view/src/input.h b/ecflow_4_0_7/view/src/input.h
new file mode 100644
index 0000000..d224682
--- /dev/null
+++ b/ecflow_4_0_7/view/src/input.h
@@ -0,0 +1,127 @@
+#ifndef input_H
+#define input_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <Xm/Xm.h>
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+
+// 
+
+#include <stdio.h>
+
+class input {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	input();
+
+// -- Destructor
+
+	virtual ~input(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+	void start(FILE*);
+	void stop();
+
+	virtual void ready(const char*) = 0;
+	virtual void done(FILE*)        = 0;
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	input(const input&);
+	input& operator=(const input&);
+
+// -- Members
+
+	XtInputId  id_;
+	FILE*       file_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+
+// -- Class methods
+	// None
+	static void inputCB(XtPointer,int*,XtInputId*);
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const input& p)
+	//	{ p.print(s); return s; }
+
+};
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/interface.cc b/ecflow_4_0_7/view/src/interface.cc
new file mode 100644
index 0000000..6894fc3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/interface.cc
@@ -0,0 +1,26 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "interface.h"
+#include "gui.h"
+
+interface::interface()
+{
+	gui::set_interface(this);
+}
+
+interface::~interface()
+{
+}
diff --git a/ecflow_4_0_7/view/src/interface.h b/ecflow_4_0_7/view/src/interface.h
new file mode 100644
index 0000000..90fb8c7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/interface.h
@@ -0,0 +1,55 @@
+#ifndef interface_H
+#define interface_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <Xm/Xm.h>
+#include <string>
+
+class interface {
+public:
+
+	interface();
+
+	~interface(); // Change to virtual if base class
+
+	virtual void clear() = 0;
+	virtual void message(const char*) = 0;
+	virtual void watch(Boolean) = 0;
+
+	virtual void add_host(const std::string&) = 0;
+	virtual void remove_host(const std::string&) = 0;
+	virtual void rename_host(const std::string&,const std::string&) = 0;
+
+	virtual void login(const char*) = 0;
+	virtual void logout(const char*) = 0;
+
+	virtual Widget top_shell() = 0;
+	virtual Widget trees() = 0;
+	virtual Widget windows() = 0;
+
+	virtual bool visible() { return top_shell() != 0; }
+	virtual void error(const char*) = 0;
+private:
+
+	interface(const interface&);
+	interface& operator=(const interface&);
+
+};
+
+inline void destroy(interface**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/job.cc b/ecflow_4_0_7/view/src/job.cc
new file mode 100644
index 0000000..1f671aa
--- /dev/null
+++ b/ecflow_4_0_7/view/src/job.cc
@@ -0,0 +1,61 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "job.h"
+#include "node.h"
+#include "host.h"
+#include "ecf_node.h"
+#include <Xm/Text.h>
+extern "C" {
+#include "xec.h"
+}
+
+job::job(panel_window& w):
+	panel(w),
+	text_window(false)
+{
+}
+
+job::~job()
+{
+}
+
+void job::clear()
+{
+	XmTextSetString(name_,"");
+	text_window::clear();
+}
+
+void job::show(node& n)
+{
+  const std::string& job = n.__node__() ? 
+    n.variable("ECF_JOB") : n.variable("SMSJOB");
+  XmTextSetString(name_, (char*) job.c_str());
+  load(n.serv().job(n));
+}
+
+Boolean job::enabled(node& n)
+{
+  if (n.type() != NODE_TASK && n.type() != NODE_ALIAS) return False;  
+  const std::string& job = n.__node__() ? 
+    n.variable("ECF_JOB") : n.variable("SMSJOB");
+  return job.size() > 7;
+}
+
+void job::create (Widget parent, char *widget_name )
+{
+	job_form_c::create(parent,widget_name);
+}
+
diff --git a/ecflow_4_0_7/view/src/job.h b/ecflow_4_0_7/view/src/job.h
new file mode 100644
index 0000000..337b087
--- /dev/null
+++ b/ecflow_4_0_7/view/src/job.h
@@ -0,0 +1,65 @@
+#ifndef job_H
+#define job_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uijob.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef text_window_H
+#include "text_window.h"
+#endif
+
+class job : public panel, public job_form_c, public text_window {
+public:
+
+	job(panel_window&);
+
+	~job(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Job"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return job_form_c::xd_rootwidget(); }
+
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()   { return text_; }
+	virtual void create (Widget parent, char *widget_name = 0 );
+
+private:
+
+	job(const job&);
+	job& operator=(const job&);
+
+	virtual void externalCB(Widget ,XtPointer ) 
+		{ text_window::open_viewer();}
+
+	virtual void searchCB(Widget ,XtPointer ) 
+		{ text_window::open_search();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+};
+
+inline void destroy(job**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/jobcheck_panel.cc b/ecflow_4_0_7/view/src/jobcheck_panel.cc
new file mode 100644
index 0000000..64c6fb9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/jobcheck_panel.cc
@@ -0,0 +1,92 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "jobcheck_panel.h"
+#include "node.h"
+#include "host.h"
+#include <Xm/Text.h>
+extern "C" {
+#include "xec.h"
+}
+
+static const std::string cmd_str_ecf = "ECF_CHECK_CMD";
+static const std::string cmd_str_sms = "SMS_CHECK_CMD";
+
+jobcheck_panel::jobcheck_panel(panel_window& w):
+	panel(w),
+	text_window(false)
+{
+}
+
+jobcheck_panel::~jobcheck_panel()
+{
+}
+
+void jobcheck_panel::clear()
+{
+  text_window::clear();
+}
+
+void jobcheck_panel::show(node& n)
+{
+  const std::string& cmd = n.__node__() ? cmd_str_ecf : cmd_str_sms;
+  const char* p = n.variable(cmd).c_str();
+
+  if(p) 
+    XmTextSetString(name_,(char*)p);
+  else 
+    XmTextSetString(name_,(char*)"");
+
+  if (n.type() != NODE_TASK && n.type() != NODE_ALIAS)
+    return;
+  if (n.status() != STATUS_SUBMITTED &&
+      n.status() != STATUS_ACTIVE    &&
+      n.status() != STATUS_SUSPENDED) 
+    return;
+  tmp_file f = n.serv().jobcheck(n, cmd);
+  text_window::load(f);
+}
+
+Boolean jobcheck_panel::enabled(node& n)
+{
+  if (n.type() != NODE_TASK && n.type() != NODE_ALIAS) return False;
+  if (n.status() != STATUS_SUBMITTED && n.status() != STATUS_ACTIVE) return False;
+  const std::string& cmd = n.__node__() ? cmd_str_ecf : cmd_str_sms;
+  return n.variable(cmd).size() > 7;
+}
+
+void jobcheck_panel::create (Widget parent, char *widget_name )
+{
+	jobcheck_form_c::create(parent,widget_name);
+}
+
+void jobcheck_panel::update()
+{
+}
+
+void jobcheck_panel::changed(node &)
+{
+	clear();
+}
+
+void jobcheck_panel::refresh()
+{
+	node* n = get_node();
+	if(n) 
+		show(*n);
+	else 
+		clear();
+}
+
diff --git a/ecflow_4_0_7/view/src/jobcheck_panel.h b/ecflow_4_0_7/view/src/jobcheck_panel.h
new file mode 100644
index 0000000..ff69cbe
--- /dev/null
+++ b/ecflow_4_0_7/view/src/jobcheck_panel.h
@@ -0,0 +1,66 @@
+#ifndef jobcheck_panel_H
+#define jobcheck_panel_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uijobcheck.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef text_window_H
+#include "text_window.h"
+#endif
+
+class jobcheck_panel : public panel
+  , public jobcheck_form_c
+  , public text_window 
+{
+public:
+	jobcheck_panel(panel_window&);
+	
+	~jobcheck_panel(); // Change to virtual if base class
+
+	void refresh();
+
+	virtual const char* name() const { return "Check"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return jobcheck_form_c::xd_rootwidget(); }
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()   { return text_; }
+	virtual void create (Widget parent, char *widget_name = 0 );
+
+private:
+
+	jobcheck_panel(const jobcheck_panel&);
+	jobcheck_panel& operator=(const jobcheck_panel&);
+
+	virtual void update();
+	virtual void changed(node&);
+
+	virtual void refreshCB(Widget, XtPointer ) { refresh();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+};
+
+inline void destroy(jobcheck_panel**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/jobstatus.cc b/ecflow_4_0_7/view/src/jobstatus.cc
new file mode 100644
index 0000000..e585e71
--- /dev/null
+++ b/ecflow_4_0_7/view/src/jobstatus.cc
@@ -0,0 +1,109 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "jobstatus.h"
+#include "node.h"
+#include "host.h"
+#include <Xm/Text.h>
+#include "ecf_node.h"
+extern "C" {
+#include "xec.h"
+}
+
+static const std::string cmd_str_ecf = "ECF_STATUS_CMD";
+static const std::string cmd_str_sms = "SMSSTATUSCMD";
+
+jobstatus::jobstatus(panel_window& w):
+  panel(w),  
+  text_window(false)
+  , reload_(true)
+{
+}
+
+jobstatus::~jobstatus()
+{
+}
+
+void jobstatus::clear()
+{
+  XmTextSetString(name_,(char*)"");
+  text_window::clear();
+}
+
+void jobstatus::show(node& n)
+{
+  ecf_node* ecf = n.__node__();
+  const std::string& scmd = ecf ? cmd_str_ecf : cmd_str_sms;
+  const std::string var = n.variable(scmd, true);
+  const std::string& job = ecf ? n.variable("ECF_JOB") : n.variable("SMSJOB");
+
+  // const char *p = var.c_str();
+  // const std::string cmd = (ecf && p) ? ecf->substitute(var) : var;
+  std::string stat   = job + ".stat";
+
+  if (!var.empty())
+    XmTextSetString(name_,(char*)var.c_str());
+  else if(!scmd.empty()) 
+    XmTextSetString(name_,(char*)scmd.c_str());
+  else {
+    std::string cmd = scmd + "%s variable does not exist";
+    XmTextSetString(name_,(char*)cmd.c_str());
+  }
+  if (n.type() != NODE_TASK && n.type() != NODE_ALIAS) {
+    XmTextSetString(name_,(char*)"not a task");
+    return;
+  } 
+  if (n.status() != STATUS_SUBMITTED &&
+      n.status() != STATUS_ACTIVE    &&
+      n.status() != STATUS_SUSPENDED) {
+    XmTextSetString(name_,(char*)"not submitted not active");
+    return;
+  }
+  if (reload_) {  reload_ = false; ; 
+    tmp_file (n.serv().jobstatus(n, "")); 
+  }
+  tmp_file f (stat.c_str(), false);
+  text_window::load(f);
+}
+
+void jobstatus::updateCB(Widget,XtPointer data)
+{
+  reload_ = true;
+  if(get_node())
+    show(*get_node());
+  else
+    clear();
+  XmTextShowPosition(text_,XmTextGetLastPosition(text_));
+}
+
+Boolean jobstatus::enabled(node& n)
+{
+
+  if (n.type() != NODE_TASK && n.type() != NODE_ALIAS)
+    return False;
+
+  if (n.status() != STATUS_SUBMITTED && 
+      n.status() != STATUS_ACTIVE    &&
+      n.status() != STATUS_SUSPENDED)
+    return False;
+
+  const std::string& cmd = n.__node__() ? cmd_str_ecf : cmd_str_sms;
+  return n.variable(cmd).size() > 6; 
+}
+
+void jobstatus::create (Widget parent, char *widget_name )
+{
+	jobstatus_form_c::create(parent,widget_name);
+}
diff --git a/ecflow_4_0_7/view/src/jobstatus.h b/ecflow_4_0_7/view/src/jobstatus.h
new file mode 100644
index 0000000..77e5d96
--- /dev/null
+++ b/ecflow_4_0_7/view/src/jobstatus.h
@@ -0,0 +1,71 @@
+#ifndef jobstatus_H
+#define jobstatus_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uijobstatus.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef text_window_H
+#include "text_window.h"
+#endif
+
+class jobstatus : public panel
+  , public jobstatus_form_c
+  , public text_window {
+public:
+
+	jobstatus(panel_window&);
+
+	~jobstatus(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Jobstatus"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return jobstatus_form_c::xd_rootwidget(); }
+
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()   { return text_; }
+	virtual void create (Widget parent, char *widget_name = 0 );
+
+private:
+
+	jobstatus(const jobstatus&);
+	jobstatus& operator=(const jobstatus&);
+
+        virtual void updateCB(Widget,XtPointer);
+
+	virtual void externalCB(Widget w,XtPointer p) 
+		{ text_window::open_viewer();}
+
+	virtual void searchCB(Widget w,XtPointer p) 
+		{ text_window::open_search();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+
+	int reload_;
+};
+
+inline void destroy(jobstatus**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/label.cc b/ecflow_4_0_7/view/src/label.cc
new file mode 100644
index 0000000..acad886
--- /dev/null
+++ b/ecflow_4_0_7/view/src/label.cc
@@ -0,0 +1,89 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "label_node.h"
+#include "show.h"
+#include "text_lister.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+const Label& label_node::get() {
+  ecf_concrete_node<const Label>* base = 
+    dynamic_cast<ecf_concrete_node<const Label>*> (owner_);
+  if (base) return *(base->get());
+  if (parent() && parent()->__node__())
+    return parent()->__node__()->get_label(name());
+  return Label::EMPTY();
+}
+
+xmstring label_node::make_label_tree()
+{  
+  return xmstring(name().c_str(),"bold") + xmstring(": ","bold") 
+    + xmstring(value());
+}
+
+void label_node::drawNode(Widget w,XRectangle* r,bool)
+{
+    XmStringDraw(XtDisplay(w),XtWindow(w),
+        smallfont(),
+        labelTree(),
+        blackGC(),
+        r->x+2,
+        r->y+2,
+        r->width,
+        XmALIGNMENT_BEGINNING, XmSTRING_DIRECTION_L_TO_R, r);
+	shadow(w,r);
+}
+
+void label_node::info(std::ostream& f)
+{
+	node::info(f);
+	f << "\nText:\n";
+	f << "-----\n";
+	f << value();
+	f << "\n\nDefault:\n";
+	f << "-------\n";
+	f << def() << "\n";
+}
+
+void label_node::perlify(FILE* f)
+{
+  perl_member(f,"value",  value());
+  perl_member(f,"default",def());
+}
+
+const char* label_node::value()
+{
+  // static bool prb = false; if (prb) return 0x0; prb = true; 
+#ifdef BRIDGE
+  if (tree_) return ((sms_label*) tree_)->value;
+#endif
+  const Label& lab = get();
+  if (lab.new_value().empty() || lab.new_value() == "") 
+    return def();
+  return lab.new_value().c_str();
+}
+
+const char* label_node::def()
+{
+#ifdef BRIDGE
+  if (tree_) return ((sms_label*) tree_)->def;
+#endif
+  return get().value().c_str();
+}
+
+Boolean label_node::visible() const { return show::want(show::label); }
diff --git a/ecflow_4_0_7/view/src/label_node.h b/ecflow_4_0_7/view/src/label_node.h
new file mode 100644
index 0000000..00957de
--- /dev/null
+++ b/ecflow_4_0_7/view/src/label_node.h
@@ -0,0 +1,53 @@
+#ifndef label_node_H
+#define label_node_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "node.h"
+
+class label_node : public node {
+public:
+
+ label_node(host& h,ecf_node* n) : node(h,n) {}
+#ifdef BRIDGE
+ label_node(host& h,sms_node* n, char b) : node(h,n,b) {}
+#endif
+	const char* value();
+	const char* def();
+
+protected:
+
+private:
+
+	label_node(const label_node&);
+	label_node& operator=(const label_node&);
+
+	const Label& get();
+
+	virtual void info(std::ostream&);
+	virtual xmstring make_label_tree();
+	virtual void drawNode(Widget,XRectangle*,bool);
+
+	virtual Boolean visible() const;
+	virtual void triggered(trigger_lister&) {}
+	virtual void triggers(trigger_lister&)  {}
+
+	virtual void perlify(FILE*);
+};
+
+inline void destroy(label_node**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/late.cc b/ecflow_4_0_7/view/src/late.cc
new file mode 100644
index 0000000..e6ae595
--- /dev/null
+++ b/ecflow_4_0_7/view/src/late.cc
@@ -0,0 +1,32 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "late.h"
+#include "node.h"
+
+
+late::late():
+	node_alert<late>("Late nodes")
+{
+}
+
+late::~late()
+{
+}
+
+bool late::keep(node* n)
+{
+	return n->isLate();
+}
diff --git a/ecflow_4_0_7/view/src/late.h b/ecflow_4_0_7/view/src/late.h
new file mode 100644
index 0000000..6a15017
--- /dev/null
+++ b/ecflow_4_0_7/view/src/late.h
@@ -0,0 +1,109 @@
+#ifndef late_H
+#define late_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node_alert.h"
+
+class node;
+
+class late : public node_alert<late> {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	late();
+
+// -- Destructor
+
+	~late(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	late(const late&);
+	late& operator=(const late&);
+
+// -- Methods
+
+
+// -- Overridden methods
+
+	virtual bool keep(node*);
+
+// -- Class members
+
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const late& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(late**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(late);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/late_node.cc b/ecflow_4_0_7/view/src/late_node.cc
new file mode 100644
index 0000000..524ee57
--- /dev/null
+++ b/ecflow_4_0_7/view/src/late_node.cc
@@ -0,0 +1,29 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "late_node.h"
+
+xmstring late_node::make_label_tree()
+{
+  if (!owner_) return xmstring("late: ","bold") + xmstring(label_.c_str());
+  return xmstring(label_.c_str());
+}
+
+void late_node::perlify(FILE* f)
+{
+  perl_member(f,"value",label_.c_str());
+}
+
+const std::string& late_node::name() const { return label_; }
diff --git a/ecflow_4_0_7/view/src/late_node.h b/ecflow_4_0_7/view/src/late_node.h
new file mode 100644
index 0000000..0119648
--- /dev/null
+++ b/ecflow_4_0_7/view/src/late_node.h
@@ -0,0 +1,49 @@
+#ifndef LATE_NODE_H
+#define LATE_NODE_H
+
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #11 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "node.h"
+#include "show.h"
+
+class late_node : public node {
+
+	virtual bool is_my_parent(node*) const { return false; }
+	virtual void info(std::ostream&) {}
+
+	virtual xmstring make_label_tree();
+
+	virtual const std::string& name()  const;
+	virtual const std::string& full_name() const    { return name(); }
+	virtual Boolean menus()       { return False;      }
+	virtual Boolean selectable() { return False;      }
+
+	virtual Boolean visible() const { 
+          return show::want(show::late); }
+
+	virtual void perlify(FILE* f);
+
+public:
+ late_node(host& h,ecf_node* n) : node(h,n), label_(n ? n->toString() : "late") {}
+#ifdef BRIDGE
+	late_node(host& h,sms_node* n, char b);
+#endif
+ 
+protected:
+	const std::string label_;
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/layout.cc b/ecflow_4_0_7/view/src/layout.cc
new file mode 100644
index 0000000..e968a27
--- /dev/null
+++ b/ecflow_4_0_7/view/src/layout.cc
@@ -0,0 +1,26 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "layout.h"
+
+layout::layout(trigger_panel& o,Widget w):
+	widget_(w),
+	owner_(o)
+{
+}
+
+layout::~layout()
+{
+}
diff --git a/ecflow_4_0_7/view/src/layout.h b/ecflow_4_0_7/view/src/layout.h
new file mode 100644
index 0000000..8dbbf9e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/layout.h
@@ -0,0 +1,134 @@
+#ifndef layout_H
+#define layout_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#include <Xm/Xm.h>
+
+class node;
+class trigger_panel;
+
+class layout {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	layout(trigger_panel&,Widget);
+
+// -- Destructor
+
+	virtual ~layout(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	virtual void clear() = 0;
+	virtual void show(node&) = 0 ;
+	virtual void reach(node*,node*) = 0;
+	virtual void selectNode(node*) {}
+
+	trigger_panel& owner() { return owner_; }
+	Widget layout_widget() { return widget_; }
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	
+	Widget widget_;
+	trigger_panel& owner_;
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	layout(const layout&);
+	layout& operator=(const layout&);
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const layout& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(layout**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(layout);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/lexyacc.h b/ecflow_4_0_7/view/src/lexyacc.h
new file mode 100644
index 0000000..31e71ef
--- /dev/null
+++ b/ecflow_4_0_7/view/src/lexyacc.h
@@ -0,0 +1,70 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <Xm/Xm.h>
+#include "SimpleTime.h"
+
+typedef struct _flags   flags;
+typedef struct _menu    menu;
+typedef struct _item    item;
+typedef struct _action  action;
+typedef struct _node    node;
+
+#ifdef hpux
+/* hpux X11 headers are wromg */
+#undef bcopy
+#undef bzero
+#undef bcmp
+#endif
+
+int   menus_version(int rel, int maj, int min);
+menu* menus_chain_menus(menu *a,menu *b);
+item* menus_chain_items(item *a,item *b);
+void  menus_root(menu *m);
+menu* menus_create_2(char* a,item* b);
+item* menus_create_6(flags* a,flags* b,char* c,action* d,char* e,int f);
+
+action* menus_command(char* a);
+action* menus_window(char* a);
+action* menus_separator();
+action* menus_sub_menu();
+
+flags* new_flagNone();
+flags* new_typeFlag(int a);
+flags* new_flagNot(flags* a);
+flags* new_flagOr(flags* a,flags* b);
+flags* new_flagAnd(flags* a,flags* b);
+
+flags* new_flagAll();
+flags* new_eventFlag(int a);
+flags* new_selectionFlag();
+flags* new_statusFlag(int a);
+flags* new_userFlag(int a);
+
+flags* new_procFlag_node_hasTriggers();
+flags* new_procFlag_node_hasDate();
+flags* new_procFlag_node_hasTime();
+flags* new_procFlag_node_hasText();
+flags* new_procFlag_node_isMigrated();
+flags* new_procFlag_node_isLocked();
+flags* new_procFlag_node_isZombie();
+
+action* menus_internal_host_plug();
+action* menus_internal_host_compare(char*a, char*b);
+
+void log_event_meter_event(DateTime* a,node* b,int c);
+void log_event_event_event(DateTime* a,node* b,int c);
+void log_event_status_event(DateTime* a,node* b,int c);
+node *log_event_find(char* a);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Apply.cc b/ecflow_4_0_7/view/src/libicon/icon_Apply.cc
new file mode 100644
index 0000000..064c8b0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Apply.cc
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 6 1",
+" 	c #E79DE79DE79D",
+".	c #0000EFBE0000",
+"X	c #0000FFFF0000",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #00008A280000",
+"                ",
+"                ",
+"                ",
+"                ",
+"      ....      ",
+"     .XXXXo     ",
+"    .XOXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"     +XXXX+     ",
+"      ++++      ",
+"                ",
+"                ",
+"                ",
+"                "};
+static pixmap p("Apply",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Apply.xpm b/ecflow_4_0_7/view/src/libicon/icon_Apply.xpm
new file mode 100644
index 0000000..09df84e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Apply.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char * Apply_xpm[] = {
+"16 16 6 1",
+" 	c #E79DE79DE79D",
+".	c #0000EFBE0000",
+"X	c #0000FFFF0000",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #00008A280000",
+"                ",
+"                ",
+"                ",
+"                ",
+"      ....      ",
+"     .XXXXo     ",
+"    .XOXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"     +XXXX+     ",
+"      ++++      ",
+"                ",
+"                ",
+"                ",
+"                "};
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Chat.cc b/ecflow_4_0_7/view/src/libicon/icon_Chat.cc
new file mode 100644
index 0000000..514323d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Chat.cc
@@ -0,0 +1,41 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 5 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #000000",
+"@	c #CECECE",
+"#	c #808080",
+"................",
+"...........++...",
+"..........+@@+..",
+".........+@@@+..",
+"........+@@@@@+.",
+"........+@@@@@+.",
+".........+@@@@+.",
+"..........+@@@+.",
+"...........+@#+.",
+"...++.....+@@+..",
+"..+@@+...+@@#+..",
+".+@@@@+.+@@#+...",
+"+#@@@@@+@@#+....",
+"+###@@@@##+.....",
+".++#####++......",
+"...+++++........"};
+static pixmap p("Chat",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Chat.xpm b/ecflow_4_0_7/view/src/libicon/icon_Chat.xpm
new file mode 100644
index 0000000..10b1aa5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Chat.xpm
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Chat_xpm[] = {
+"16 16 5 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+"X	c #CECECECECECE",
+"o	c #7B7B7B7B7B7B",
+"O	c #8C8C8C8C8C8C",
+"                ",
+"           ..   ",
+"          .  .  ",
+"         .XX .  ",
+"        .XXXX . ",
+"        .oXXX . ",
+"         .oXX . ",
+"          ..X . ",
+"           .X . ",
+"   ..     . X.  ",
+"  .  .   . XX.  ",
+" .XXXX. . XX.   ",
+".oXXXX..XXX.    ",
+".OOXXXXXXX.     ",
+" ..oOoXX..      ",
+"   .....        "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Check.cc b/ecflow_4_0_7/view/src/libicon/icon_Check.cc
new file mode 100644
index 0000000..72d5092
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Check.cc
@@ -0,0 +1,71 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 35 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #C1C1C1",
+"@	c #959595",
+"#	c #CECECE",
+"$	c #808080",
+"%	c #D6D6D6",
+"&	c #7E7E7E",
+"*	c #C5C5C5",
+"=	c #D4D4D4",
+"-	c #7A7A7A",
+";	c #DDDDDD",
+">	c #C6C6C6",
+",	c #E5E5E5",
+"'	c #A0A0A0",
+")	c #AEAEAE",
+"!	c #B3B3B3",
+"~	c #939393",
+"{	c #D2D2D2",
+"]	c #9E9E9E",
+"^	c #DBDBDB",
+"/	c #DFDFDF",
+"(	c #8B8B8B",
+"_	c #B5B5B5",
+":	c #999999",
+"<	c #B7B7B7",
+"[	c #DADADA",
+"}	c #E1E1E1",
+"|	c #767676",
+"1	c #D8D8D8",
+"2	c #C3C3C3",
+"3	c #B1B1B1",
+"4	c #AAAAAA",
+"5	c #828282",
+"6	c #B9B9B9",
+"................",
+".............+ at .",
+"............#$%.",
+"...........#&*..",
+"..........=-*...",
+".........;$>....",
+"........,').....",
+"........!~,.....",
+"{]*....=&^......",
+"/+(_...:<.......",
+"..[$>.;&}.......",
+"...#|12'........",
+"....345#........",
+"..../$(.........",
+".....6>.........",
+"................"};
+static pixmap p("Check",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Check.xpm b/ecflow_4_0_7/view/src/libicon/icon_Check.xpm
new file mode 100644
index 0000000..09f87d0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Check.xpm
@@ -0,0 +1,69 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * icon_Check_xpm[] = {
+"16 16 35 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #C1C1C1",
+"@	c #959595",
+"#	c #CECECE",
+"$	c #808080",
+"%	c #D6D6D6",
+"&	c #7E7E7E",
+"*	c #C5C5C5",
+"=	c #D4D4D4",
+"-	c #7A7A7A",
+";	c #DDDDDD",
+">	c #C6C6C6",
+",	c #E5E5E5",
+"'	c #A0A0A0",
+")	c #AEAEAE",
+"!	c #B3B3B3",
+"~	c #939393",
+"{	c #D2D2D2",
+"]	c #9E9E9E",
+"^	c #DBDBDB",
+"/	c #DFDFDF",
+"(	c #8B8B8B",
+"_	c #B5B5B5",
+":	c #999999",
+"<	c #B7B7B7",
+"[	c #DADADA",
+"}	c #E1E1E1",
+"|	c #767676",
+"1	c #D8D8D8",
+"2	c #C3C3C3",
+"3	c #B1B1B1",
+"4	c #AAAAAA",
+"5	c #828282",
+"6	c #B9B9B9",
+"................",
+".............+ at .",
+"............#$%.",
+"...........#&*..",
+"..........=-*...",
+".........;$>....",
+"........,').....",
+"........!~,.....",
+"{]*....=&^......",
+"/+(_...:<.......",
+"..[$>.;&}.......",
+"...#|12'........",
+"....345#........",
+"..../$(.........",
+".....6>.........",
+"................"};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Edit.cc b/ecflow_4_0_7/view/src/libicon/icon_Edit.cc
new file mode 100644
index 0000000..e40ff98
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Edit.cc
@@ -0,0 +1,47 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 11 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #000000",
+"@	c #5F5F5F",
+"#	c #FFFFFF",
+"$	c #DFDFDF",
+"%	c #FF0000",
+"&	c #A0A09C",
+"*	c #FFEB00",
+"=	c #EDDA00",
+"-	c #7B7B7B",
+".......++ at ......",
+"......@##+......",
+".....@##+.......",
+"....@##+#+$...%%",
+"...@##+###+..&%%",
+"..++++##..#+&*=&",
+"..+-###.##.&*=&.",
+"..+###.##.&*=&..",
+"...+####.&*=&+..",
+"....+##.&*=&#+..",
+".....+##+=&#+...",
+"......+#+&#+....",
+".......+##+.....",
+"......-+#+......",
+".....--++.......",
+"......++........"};
+static pixmap p("Edit",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Edit.xpm b/ecflow_4_0_7/view/src/libicon/icon_Edit.xpm
new file mode 100644
index 0000000..0576202
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Edit.xpm
@@ -0,0 +1,43 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Edit_xpm[] = {
+"16 16 9 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+"X	c #FFFFFFFFFFFF",
+"o	c #CECECECECECE",
+"O	c #8C8C8C8C8C8C",
+"+	c #FFFF73739494",
+"@	c #FFFFFFFF0000",
+"#	c #BDBDB5B5B5B5",
+"$	c #FFFFCECE9C9C",
+"     ...        ",
+"    .XXo.     ..",
+"   .XXoO.    .+.",
+"  .XXoO.    . at . ",
+" .XXoO.O.... at .  ",
+"...oO.O#.$. at .   ",
+".OO..O#.$. at .$.  ",
+".Oo.O#o.....$$..",
+" .Xo o .$$$$$$..",
+"  .Xo ....$$$$..",
+"   .Xo.Xo#......",
+"    .Xoo#.    ..",
+"   ...o#.       ",
+"  .O#.#.        ",
+"  .#o..         ",
+"   ...          "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Info.cc b/ecflow_4_0_7/view/src/libicon/icon_Info.cc
new file mode 100644
index 0000000..16391cf
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Info.cc
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 4 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #ABF0FF",
+"@	c #0000FF",
+"................",
+"................",
+".......+ at +......",
+".......@@@......",
+".......+ at +......",
+"................",
+"......@@@@......",
+".......@@@......",
+".......@@@......",
+".......@@@......",
+".......@@@......",
+".......@@@......",
+"......@@@@@.....",
+"................",
+"................",
+"................"};
+static pixmap p("Info",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Info.xpm b/ecflow_4_0_7/view/src/libicon/icon_Info.xpm
new file mode 100644
index 0000000..9c144a5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Info.xpm
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Info_xpm[] = {
+"16 16 5 1",
+" 	c #E7E7E7E7E7E7",
+".	c #00000000FFFF",
+"X	c #BDBDB5B5B5B5",
+"o	c #7B7B7B7B7B7B",
+"O	c #8C8C8C8C8C8C",
+"                ",
+"                ",
+"       .X       ",
+"      ...o      ",
+"       .O       ",
+"       o        ",
+"     ....       ",
+"      ...o      ",
+"      ...O      ",
+"      ...O      ",
+"      ...o      ",
+"      ...O      ",
+"     .....o     ",
+"      oOOOO     ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Jobstatus.cc b/ecflow_4_0_7/view/src/libicon/icon_Jobstatus.cc
new file mode 100644
index 0000000..d344bd3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Jobstatus.cc
@@ -0,0 +1,41 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 5 1",
+" 	c None",
+".	c #000000",
+"+	c #0000FF",
+"@	c #00FF00",
+"#	c #FF0000",
+"................",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+"................",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+"................",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+"................"};
+static pixmap p("Jobstatus",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Jobstatus.xpm b/ecflow_4_0_7/view/src/libicon/icon_Jobstatus.xpm
new file mode 100644
index 0000000..66471eb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Jobstatus.xpm
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * icon_Josstatus_xpm[] = {
+"16 16 5 1",
+" 	c None",
+".	c #000000",
+"+	c #0000FF",
+"@	c #00FF00",
+"#	c #FF0000",
+"................",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+"................",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+"................",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+"................"};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Josstatus3.xpm b/ecflow_4_0_7/view/src/libicon/icon_Josstatus3.xpm
new file mode 100644
index 0000000..66471eb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Josstatus3.xpm
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * icon_Josstatus_xpm[] = {
+"16 16 5 1",
+" 	c None",
+".	c #000000",
+"+	c #0000FF",
+"@	c #00FF00",
+"#	c #FF0000",
+"................",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+".+++++++@@@@###.",
+"................",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+".+++++++@@#####.",
+"................",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+".+++++++++++###.",
+"................"};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Load.cc b/ecflow_4_0_7/view/src/libicon/icon_Load.cc
new file mode 100644
index 0000000..fd904a4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Load.cc
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 4 1",
+" 	c #E7E7E7E7E7E7",
+".	c #E5E5E5E5E5E5",
+"X	c #000000000000",
+"o	c #FFFFFFFFFFFF",
+"                ",
+"                ",
+"   ...XXXXXXX   ",
+"   ..XXoooooX   ",
+"   .XoXoooooX   ",
+"   XXXXoooooX.  ",
+"   XooooooooX.  ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XXXXXXXXXX   ",
+"                ",
+"                "};
+static pixmap p("Load",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Load.xpm b/ecflow_4_0_7/view/src/libicon/icon_Load.xpm
new file mode 100644
index 0000000..1e0d2c4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Load.xpm
@@ -0,0 +1,38 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Load_xpm[] = {
+"16 16 4 1",
+" 	c #E7E7E7E7E7E7",
+".	c #E5E5E5E5E5E5",
+"X	c #000000000000",
+"o	c #FFFFFFFFFFFF",
+"                ",
+"                ",
+"   ...XXXXXXX   ",
+"   ..XXoooooX   ",
+"   .XoXoooooX   ",
+"   XXXXoooooX.  ",
+"   XooooooooX.  ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XooooooooX   ",
+"   XXXXXXXXXX   ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Manual.cc b/ecflow_4_0_7/view/src/libicon/icon_Manual.cc
new file mode 100644
index 0000000..b7b898e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Manual.cc
@@ -0,0 +1,56 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 20 1",
+" 	c #E7E7E7E7E7E7",
+".	c #CECECECECECE",
+"X	c #BDBDB5B5B5B5",
+"o	c #94949C9C9C9C",
+"O	c #73738C8C7B7B",
+"+	c #5A5A73736363",
+"@	c #42425A5A4A4A",
+"#	c #EFEFC6C6CECE",
+"$	c #C6C69C9CA5A5",
+"%	c #9C9C73737B7B",
+"&	c #737342425252",
+"*	c #7B7B7B7B7B7B",
+"=	c #4A4A5A5A5A5A",
+"-	c #52525A5A5A5A",
+";	c #84848C8C8C8C",
+":	c #A5A584848C8C",
+">	c #B5B58C8C9494",
+",	c #DEDEDEDEDEDE",
+"<	c #A5A5A5A5A5A5",
+"1	c #A5A57B7B8484",
+"     .XoO+@     ",
+"#$%& .XoO+@     ",
+"#$%& .X+O+@ .o*=",
+"#%%& .X-O+@ .;*-",
+"#%%& .X-O+@ X=;=",
+"#:%& .X=O+@ .@*=",
+"#:%& .X=O+@ .@*=",
+"#%%& .X+O+@ X@*-",
+"#*%& .X;;+@ .-*=",
+"#>%& .X;O+@ .;*=",
+"#>%& .XoO+@ .o*=",
+"#$%& .XoO+@,.<*=",
+"#$%& .XoO+@ .o*=",
+"#>%& .<;O+@ .;*=",
+"#1%& .XOO+@ .+*=",
+"#:%& .Xo;+@,.;*="};
+static pixmap p("Manual",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Manual.xpm b/ecflow_4_0_7/view/src/libicon/icon_Manual.xpm
new file mode 100644
index 0000000..62a20e0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Manual.xpm
@@ -0,0 +1,54 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Manual_xpm[] = {
+"16 16 20 1",
+" 	c #E7E7E7E7E7E7",
+".	c #CECECECECECE",
+"X	c #BDBDB5B5B5B5",
+"o	c #94949C9C9C9C",
+"O	c #73738C8C7B7B",
+"+	c #5A5A73736363",
+"@	c #42425A5A4A4A",
+"#	c #EFEFC6C6CECE",
+"$	c #C6C69C9CA5A5",
+"%	c #9C9C73737B7B",
+"&	c #737342425252",
+"*	c #7B7B7B7B7B7B",
+"=	c #4A4A5A5A5A5A",
+"-	c #52525A5A5A5A",
+";	c #84848C8C8C8C",
+":	c #A5A584848C8C",
+">	c #B5B58C8C9494",
+",	c #DEDEDEDEDEDE",
+"<	c #A5A5A5A5A5A5",
+"1	c #A5A57B7B8484",
+"     .XoO+@     ",
+"#$%& .XoO+@     ",
+"#$%& .X+O+@ .o*=",
+"#%%& .X-O+@ .;*-",
+"#%%& .X-O+@ X=;=",
+"#:%& .X=O+@ .@*=",
+"#:%& .X=O+@ .@*=",
+"#%%& .X+O+@ X@*-",
+"#*%& .X;;+@ .-*=",
+"#>%& .X;O+@ .;*=",
+"#>%& .XoO+@ .o*=",
+"#$%& .XoO+@,.<*=",
+"#$%& .XoO+@ .o*=",
+"#>%& .<;O+@ .;*=",
+"#1%& .XOO+@ .+*=",
+"#:%& .Xo;+@,.;*="};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Merge.cc b/ecflow_4_0_7/view/src/libicon/icon_Merge.cc
new file mode 100644
index 0000000..4e13d48
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Merge.cc
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 4 1",
+" 	c #FFFFFFFFFFFF",
+".	c #E7E7E7E7E7E7",
+"X	c #E5E5E5E5E5E5",
+"o	c #000000000000",
+" ...............",
+" ...XXXooooooo..",
+" ...XXoo     o..",
+" .XXXoooooo  o..",
+" .XXoo    o  oX.",
+" .Xo o    o  oX.",
+" .oooo    o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       oooo..",
+" .o       o.....",
+" ..oooooooo.....",
+"                "};
+static pixmap p("Merge",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Merge.xpm b/ecflow_4_0_7/view/src/libicon/icon_Merge.xpm
new file mode 100644
index 0000000..212eea1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Merge.xpm
@@ -0,0 +1,38 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Merge_xpm[] = {
+"16 16 4 1",
+" 	c #FFFFFFFFFFFF",
+".	c #E7E7E7E7E7E7",
+"X	c #E5E5E5E5E5E5",
+"o	c #000000000000",
+" ...............",
+" ...XXXooooooo..",
+" ...XXoo     o..",
+" .XXXoooooo  o..",
+" .XXoo    o  oX.",
+" .Xo o    o  oX.",
+" .oooo    o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       o  o..",
+" .o       oooo..",
+" .o       o.....",
+" ..oooooooo.....",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Messages.cc b/ecflow_4_0_7/view/src/libicon/icon_Messages.cc
new file mode 100644
index 0000000..2058e8d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Messages.cc
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 4 1",
+" 	c None",
+".	c #E5E5E5",
+"+	c #000000",
+"@	c #F5F97A",
+"................",
+"................",
+"................",
+"..+++++++++++...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@+++++...",
+"..+@@@@@+@@+....",
+"..+@@@@@+ at +.....",
+"..++++++++......",
+"................",
+"................"};
+static pixmap p("Messages",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Messages.xpm b/ecflow_4_0_7/view/src/libicon/icon_Messages.xpm
new file mode 100644
index 0000000..dffbc2f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Messages.xpm
@@ -0,0 +1,41 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * message_xpm[] = {
+"16 16 7 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #C9C9CDCD4C4C",
+"o	c #FFFFFFFFFFFF",
+"O	c #F5F5F9F97A7A",
+"+	c #545454545454",
+"@	c #98989B9B3838",
+"                ",
+"                ",
+"                ",
+"  ...........   ",
+"  .XXXXXXXXX.   ",
+"  .XXXXXXXXX.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOX.....   ",
+"  .oOOXX+OO.    ",
+"  .oXXX.O at +     ",
+"  .....++       ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Output.cc b/ecflow_4_0_7/view/src/libicon/icon_Output.cc
new file mode 100644
index 0000000..56eca3f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Output.cc
@@ -0,0 +1,45 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 9 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #7B7B7B",
+"@	c #000000",
+"#	c #CECECE",
+"$	c #DEDEDE",
+"%	c #A5A5A5",
+"&	c #BDB5B5",
+"*	c #949C9C",
+".++++++++++++++.",
+".+............+.",
+".+............+.",
+".+.@#$%%#%%&@.+.",
+".+....##.$$...+.",
+".+.@##%%#..#@.+.",
+".+....$$......+.",
+".+.@#..#$$$#@.+.",
+".+....$%**%#..+.",
+".+.@#..$$$##@.+.",
+".+....$#..$...+.",
+".+.@#$%%$$&&@.+.",
+".+....##$#$...+.",
+".+.@#.$%*%$#@.+.",
+".+............+.",
+".++++++++++++++."};
+static pixmap p("Output",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Output.xpm b/ecflow_4_0_7/view/src/libicon/icon_Output.xpm
new file mode 100644
index 0000000..5b811c2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Output.xpm
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Output_xpm[] = {
+"16 16 8 1",
+" 	c #E7E7E7E7E7E7",
+".	c #7B7B7B7B7B7B",
+"X	c #CECECECECECE",
+"o	c #DEDEDEDEDEDE",
+"O	c #000000000000",
+"+	c #A5A5A5A5A5A5",
+"@	c #BDBDB5B5B5B5",
+"#	c #94949C9C9C9C",
+" .............. ",
+" .  XXXXXXXX  . ",
+" .    Xo Xo   . ",
+" . OXo++X++ at O . ",
+" .    XX oo   . ",
+" . OXX++X  XO . ",
+" .    oo      . ",
+" . OX  XoooXO . ",
+" .    o+##+X  . ",
+" . OX  oooXXO . ",
+" .    oX  o   . ",
+" . OXo++oo@@O . ",
+" .    XXoXo   . ",
+" . OX o+#+oXO . ",
+" .  XXX@@@XX  . ",
+" .............. "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_QuickFind.cc b/ecflow_4_0_7/view/src/libicon/icon_QuickFind.cc
new file mode 100644
index 0000000..5f664ce
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_QuickFind.cc
@@ -0,0 +1,38 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ........    ",
+"    ........    ",
+"     ......     ",
+"     ......     ",
+"      ....      ",
+"      ....      ",
+"       ..       ",
+"       ..       ",
+"                ",
+"                ",
+"                ",
+"                "};
+static pixmap p("QuickFind",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_QuickFind.xpm b/ecflow_4_0_7/view/src/libicon/icon_QuickFind.xpm
new file mode 100644
index 0000000..8ae9918
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_QuickFind.xpm
@@ -0,0 +1,36 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * QuickFind_xpm[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ........    ",
+"    ........    ",
+"     ......     ",
+"     ......     ",
+"      ....      ",
+"      ....      ",
+"       ..       ",
+"       ..       ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Script.cc b/ecflow_4_0_7/view/src/libicon/icon_Script.cc
new file mode 100644
index 0000000..519e807
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Script.cc
@@ -0,0 +1,43 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 7 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #000000",
+"@	c #5F5F5F",
+"#	c #FFFFFF",
+"$	c #DFDFDF",
+"%	c #7B7B7B",
+".......++ at ......",
+"......@##+......",
+".....@##+.......",
+"....@##+#+$.....",
+"...@##+###+.....",
+"..++++##..#+....",
+"..+%###.##.#+...",
+"..+###.##.###+..",
+"...+####.##.#+..",
+"....+##.##.##+..",
+".....+###.##+...",
+"......+#.##+....",
+".......+##+.....",
+"......%+#+......",
+".....%%++.......",
+"......++........"};
+static pixmap p("Script",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Script.xpm b/ecflow_4_0_7/view/src/libicon/icon_Script.xpm
new file mode 100644
index 0000000..9dc7aec
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Script.xpm
@@ -0,0 +1,41 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Script_xpm[] = {
+"16 16 7 1",
+" 	c #E79DE79DE79D",
+".	c #DF7DDF7DDF7D",
+"X	c #000000000000",
+"o	c #FFFFFFFFFFFF",
+"O	c #CF3CCF3CFFFF",
+"+	c #8A288A288A28",
+"@	c #AAAAAAAAAAAA",
+"      .XXX.     ",
+"     .XooOX     ",
+"    .XooO+X     ",
+"   .XooO+X.     ",
+"  .XooO+X+X.    ",
+"  XXXO+X++ at X.   ",
+"  X++XX++O. at X.  ",
+"  X+OXO+O.Oo+X  ",
+"   XoO.O.OoO at X  ",
+"    XoO.OoOO at X  ",
+"     XoOoOO at X   ",
+"      XoOO at X    ",
+"     XXXO at X     ",
+"    X+ at X@X      ",
+"    X at OXX       ",
+"     XXX        "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Search.cc b/ecflow_4_0_7/view/src/libicon/icon_Search.cc
new file mode 100644
index 0000000..8c3c228
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Search.cc
@@ -0,0 +1,49 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 13 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #7B7B7B",
+"@	c #000000",
+"#	c #4A4239",
+"$	c #8C8C8C",
+"%	c #FFFFFF",
+"&	c #CECECE",
+"*	c #BDB5B5",
+"=	c #E8E8E8",
+"-	c #C9C7C7",
+";	c #8C5A39",
+">	c #FFCE9C",
+"................",
+"................",
+"....+@##$.......",
+"...++%%%++......",
+"...#%%%%%+&.....",
+"..*+%%%%=+*.....",
+"..*+%%%=-+*.....",
+"...#%===-+&.....",
+"...$#---+$......",
+"....$@#@++*.....",
+".........;;>....",
+"..........;;>...",
+"...........;;*..",
+"............;;..",
+".............&..",
+"................"};
+static pixmap p("Search",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Search.xpm b/ecflow_4_0_7/view/src/libicon/icon_Search.xpm
new file mode 100644
index 0000000..5ada9e7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Search.xpm
@@ -0,0 +1,45 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Search_xpm[] = {
+"16 16 11 1",
+" 	c #E7E7E7E7E7E7",
+".	c #7B7B7B7B7B7B",
+"X	c #000000000000",
+"o	c #4A4A42423939",
+"O	c #8C8C8C8C8C8C",
+"+	c #BDBDB5B5B5B5",
+"@	c #CECECECECECE",
+"#	c #F7F7EFEFDEDE",
+"$	c #FFFFFFFFFFFF",
+"%	c #8C8C5A5A3939",
+"&	c #FFFFCECE9C9C",
+"                ",
+"                ",
+"    .XooO       ",
+"   ..+@@..      ",
+"   oO++  .@     ",
+"  +.#+@@$.+     ",
+"  +.$ @@$.+     ",
+"   o $$$@.@     ",
+"   Oo+ at +.O      ",
+"    OXoX..+     ",
+"         %%&    ",
+"        # %%&   ",
+"           %%+  ",
+"           $O&  ",
+"            #@# ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Status.cc b/ecflow_4_0_7/view/src/libicon/icon_Status.cc
new file mode 100644
index 0000000..a9140a7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Status.cc
@@ -0,0 +1,50 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 14 1",
+" 	c #E7E7E7E7E7E7",
+".	c #FFFFFFFFFFFF",
+"X	c #FFFFCECE9C9C",
+"o	c #FFFF73739494",
+"O	c #FFFF29292929",
+"+	c #FFFF00000000",
+"@	c #8C8C5A5A3939",
+"#	c #CECECECECECE",
+"$	c #8C8C8C8C8C8C",
+"%	c #F7F7EFEFDEDE",
+"&	c #000000000000",
+"*	c #4A4A42423939",
+"=	c #BDBDB5B5B5B5",
+"-	c #7B7B7B7B7B7B",
+"                ",
+"    .XoX        ",
+"   XO++@#       ",
+"  X+++++$       ",
+" %++++O&$       ",
+" o+++**$   .o%  ",
+"%+++**     o+O  ",
+" +++*#    ++++o ",
+"%O++*    +++++++",
+".+++ at .    X+++*$",
+" o+++=    O++@* ",
+" %O+++ooo++++&$ ",
+"  X+++++++++**  ",
+"   oO++++++**=  ",
+"    =@@+****#   ",
+"     .=$-$=.    "};
+static pixmap p("Status",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Status.xpm b/ecflow_4_0_7/view/src/libicon/icon_Status.xpm
new file mode 100644
index 0000000..e66705d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Status.xpm
@@ -0,0 +1,48 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Status_xpm[] = {
+"16 16 14 1",
+" 	c #E7E7E7E7E7E7",
+".	c #FFFFFFFFFFFF",
+"X	c #FFFFCECE9C9C",
+"o	c #FFFF73739494",
+"O	c #FFFF29292929",
+"+	c #FFFF00000000",
+"@	c #8C8C5A5A3939",
+"#	c #CECECECECECE",
+"$	c #8C8C8C8C8C8C",
+"%	c #F7F7EFEFDEDE",
+"&	c #000000000000",
+"*	c #4A4A42423939",
+"=	c #BDBDB5B5B5B5",
+"-	c #7B7B7B7B7B7B",
+"                ",
+"    .XoX        ",
+"   XO++@#       ",
+"  X+++++$       ",
+" %++++O&$       ",
+" o+++**$   .o%  ",
+"%+++**     o+O  ",
+" +++*#    ++++o ",
+"%O++*    +++++++",
+".+++ at .    X+++*$",
+" o+++=    O++@* ",
+" %O+++ooo++++&$ ",
+"  X+++++++++**  ",
+"   oO++++++**=  ",
+"    =@@+****#   ",
+"     .=$-$=.    "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Submit.cc b/ecflow_4_0_7/view/src/libicon/icon_Submit.cc
new file mode 100644
index 0000000..9251a93
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Submit.cc
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 6 1",
+" 	c #E79DE79DE79D",
+".	c #0000EFBE0000",
+"X	c #0000FFFF0000",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #00008A280000",
+"                ",
+"                ",
+"                ",
+"                ",
+"      ....      ",
+"     .XXXXo     ",
+"    .XOXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"     +XXXX+     ",
+"      ++++      ",
+"                ",
+"                ",
+"                ",
+"                "};
+static pixmap p("Submit",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Submit.xpm b/ecflow_4_0_7/view/src/libicon/icon_Submit.xpm
new file mode 100644
index 0000000..6bda407
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Submit.xpm
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+* XPM */
+static char * Submit_xpm[] = {
+"16 16 6 1",
+" 	c #E79DE79DE79D",
+".	c #0000EFBE0000",
+"X	c #0000FFFF0000",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #00008A280000",
+"                ",
+"                ",
+"                ",
+"                ",
+"      ....      ",
+"     .XXXXo     ",
+"    .XOXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"    .XXXXXX+    ",
+"     +XXXX+     ",
+"      ++++      ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Time_line.cc b/ecflow_4_0_7/view/src/libicon/icon_Time_line.cc
new file mode 100644
index 0000000..e83043a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Time_line.cc
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 6 1",
+" 	c None",
+".	c #E5E5E5",
+"+	c #888888",
+"@	c #000000",
+"#	c #CCCCCC",
+"$	c #837B7B",
+"................",
+"....+@@@@@+.....",
+"...@@#####@@....",
+"..@####@####@...",
+".+@####@####@+..",
+".@#####@#####@..",
+".@#####@#####@..",
+".@#$###@###$#@..",
+".@######@####@..",
+".@#######@###@..",
+".+@#########@+..",
+"..@####$####@...",
+"...@@#####@@....",
+"....+@@@@@+.....",
+"................",
+"................"};
+static pixmap p("Time_line",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Time_line.xpm b/ecflow_4_0_7/view/src/libicon/icon_Time_line.xpm
new file mode 100644
index 0000000..5fb6e28
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Time_line.xpm
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * clock_xpm[] = {
+"16 16 6 1",
+" 	c #E5E5E5E5E5E5",
+".	c #888888888888",
+"X	c #000000000000",
+"o	c #CCCCCCCCCCCC",
+"O	c #FFFFFFFFFFFF",
+"+	c #444444444444",
+"                ",
+"    .XXXXX.     ",
+"   XXoooooXX    ",
+"  XoooOXOoOoX   ",
+" .XooOOXOOoOX.  ",
+" XooOOOXOOOoOX  ",
+" XoOOOoXoOoOoX  ",
+" Xo+OoOXOoO+OX  ",
+" XoOOOoOXOoOoX  ",
+" XooOoOoOXOoOX  ",
+" .XoOOoOoOoOX.  ",
+"  XooOO+OoOOX   ",
+"   XXooOoOXX    ",
+"    .XXXXX.     ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Triggers.cc b/ecflow_4_0_7/view/src/libicon/icon_Triggers.cc
new file mode 100644
index 0000000..807b45b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Triggers.cc
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 3 1",
+" 	c #E7E7E7E7E7E7",
+".	c #FFFFFFFFFFFF",
+"X	c #7B7B7B7B7B7B",
+"     ......X    ",
+"     .     X    ",
+"     .     X    ",
+"     .XXXXXX    ",
+"        X       ",
+"        X       ",
+"        X       ",
+"        X       ",
+"   XXXXXXXXXX   ",
+"   X        X   ",
+"   X        X   ",
+"   X        X   ",
+" .....X  .....X ",
+" .    X  .    X ",
+" .    X  .    X ",
+" .XXXXX  .XXXXX "};
+static pixmap p("Triggers",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Triggers.xpm b/ecflow_4_0_7/view/src/libicon/icon_Triggers.xpm
new file mode 100644
index 0000000..28b7457
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Triggers.xpm
@@ -0,0 +1,37 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Triggers_xpm[] = {
+"16 16 3 1",
+" 	c #E7E7E7E7E7E7",
+".	c #FFFFFFFFFFFF",
+"X	c #7B7B7B7B7B7B",
+"     ......X    ",
+"     .     X    ",
+"     .     X    ",
+"     .XXXXXX    ",
+"        X       ",
+"        X       ",
+"        X       ",
+"        X       ",
+"   XXXXXXXXXX   ",
+"   X        X   ",
+"   X        X   ",
+"   X        X   ",
+" .....X  .....X ",
+" .    X  .    X ",
+" .    X  .    X ",
+" .XXXXX  .XXXXX "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Update.cc b/ecflow_4_0_7/view/src/libicon/icon_Update.cc
new file mode 100644
index 0000000..0840f0c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Update.cc
@@ -0,0 +1,50 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 14 1",
+" 	c #E7E7E7E7E7E7",
+".	c #FFFFFFFFFFFF",
+"X	c #FFFFCECE9C9C",
+"o	c #FFFF73739494",
+"O	c #FFFF29292929",
+"+	c #FFFF00000000",
+"@	c #8C8C5A5A3939",
+"#	c #CECECECECECE",
+"$	c #8C8C8C8C8C8C",
+"%	c #F7F7EFEFDEDE",
+"&	c #000000000000",
+"*	c #4A4A42423939",
+"=	c #BDBDB5B5B5B5",
+"-	c #7B7B7B7B7B7B",
+"                ",
+"    .XoX        ",
+"   XO++@#       ",
+"  X+++++$       ",
+" %++++O&$       ",
+" o+++**$   .o%  ",
+"%+++**     o+O  ",
+" +++*#    ++++o ",
+"%O++*    +++++++",
+".+++ at .    X+++*$",
+" o+++=    O++@* ",
+" %O+++ooo++++&$ ",
+"  X+++++++++**  ",
+"   oO++++++**=  ",
+"    =@@+****#   ",
+"     .=$-$=.    "};
+static pixmap p("Update",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Update.xpm b/ecflow_4_0_7/view/src/libicon/icon_Update.xpm
new file mode 100644
index 0000000..e66705d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Update.xpm
@@ -0,0 +1,48 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Status_xpm[] = {
+"16 16 14 1",
+" 	c #E7E7E7E7E7E7",
+".	c #FFFFFFFFFFFF",
+"X	c #FFFFCECE9C9C",
+"o	c #FFFF73739494",
+"O	c #FFFF29292929",
+"+	c #FFFF00000000",
+"@	c #8C8C5A5A3939",
+"#	c #CECECECECECE",
+"$	c #8C8C8C8C8C8C",
+"%	c #F7F7EFEFDEDE",
+"&	c #000000000000",
+"*	c #4A4A42423939",
+"=	c #BDBDB5B5B5B5",
+"-	c #7B7B7B7B7B7B",
+"                ",
+"    .XoX        ",
+"   XO++@#       ",
+"  X+++++$       ",
+" %++++O&$       ",
+" o+++**$   .o%  ",
+"%+++**     o+O  ",
+" +++*#    ++++o ",
+"%O++*    +++++++",
+".+++ at .    X+++*$",
+" o+++=    O++@* ",
+" %O+++ooo++++&$ ",
+"  X+++++++++**  ",
+"   oO++++++**=  ",
+"    =@@+****#   ",
+"     .=$-$=.    "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Use_external_editor.cc b/ecflow_4_0_7/view/src/libicon/icon_Use_external_editor.cc
new file mode 100644
index 0000000..62e7ae4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Use_external_editor.cc
@@ -0,0 +1,43 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 7 1",
+" 	c None",
+".	c #E5E5E5",
+"+	c #000000",
+"@	c #FF0505",
+"#	c #A9A9A9",
+"$	c #FFFFFF",
+"%	c #D3D3D3",
+"................",
+"................",
+"..........++....",
+".........+@@+...",
+".........+#@+...",
+"........+$#+....",
+"........+%#+....",
+".......+$#+.....",
+".......+%#+.....",
+"......+$#+......",
+"......+%#+......",
+".....+%#+.......",
+".....+##+.......",
+".....+#+........",
+".....++.........",
+"................"};
+static pixmap p("Use_external_editor",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Use_external_editor.xpm b/ecflow_4_0_7/view/src/libicon/icon_Use_external_editor.xpm
new file mode 100644
index 0000000..c0edf3e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Use_external_editor.xpm
@@ -0,0 +1,43 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * pen_xpm[] = {
+"16 16 9 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #FFFF6666CCCC",
+"o	c #999966669999",
+"O	c #FFFFFFFFCCCC",
+"+	c #FFFFCCCC9999",
+"@	c #FFFF66663333",
+"#	c #AAAAAAAAAAAA",
+"$	c #555555555555",
+"                ",
+"                ",
+"          ..    ",
+"         .XX.   ",
+"         ..o.   ",
+"        .O..    ",
+"        .+ at .    ",
+"       .O at .     ",
+"       .+ at .     ",
+"      .O at .      ",
+"      .+ at .      ",
+"      ...       ",
+"      ..        ",
+"#o$o$#.         ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Use_external_viewer.cc b/ecflow_4_0_7/view/src/libicon/icon_Use_external_viewer.cc
new file mode 100644
index 0000000..91e5cd7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Use_external_viewer.cc
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #8 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 6 1",
+" 	c None",
+".	c #E5E5E5",
+"+	c #000000",
+"@	c #FFFFFF",
+"#	c #DED9D9",
+"$	c #CAC6C6",
+"................",
+"................",
+"................",
+"................",
+"....++.......++.",
+"...+..+.....+..+",
+"..+........+....",
+".+++...++++.....",
+"+@##+.+@##+.....",
+"+##$+++##$+.....",
+"+#$$+.+#$$+.....",
+".+++...+++......",
+"................",
+"................",
+"................",
+"................"};
+static pixmap p("Use_external_viewer",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Use_external_viewer.xpm b/ecflow_4_0_7/view/src/libicon/icon_Use_external_viewer.xpm
new file mode 100644
index 0000000..a55da81
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Use_external_viewer.xpm
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * viewer_xpm[] = {
+"16 16 6 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #FFFFFFFFFFFF",
+"o	c #CCCCCCCCFFFF",
+"O	c #66666666CCCC",
+"+	c #99999999FFFF",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..       .. ",
+"   .  .     .  .",
+"  .   .    .   .",
+" ...   ....     ",
+".XoO. .XoO.     ",
+".oX+...oX+.     ",
+".O++. .O++.     ",
+" ...   ...      ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Variables.cc b/ecflow_4_0_7/view/src/libicon/icon_Variables.cc
new file mode 100644
index 0000000..0ef2e06
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Variables.cc
@@ -0,0 +1,38 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"  ..        ..  ",
+" .  .        .  ",
+" .  . ....   .  ",
+" ....        .  ",
+" .  . ....   .  ",
+" .  .       ... ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
+static pixmap p("Variables",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Variables.xpm b/ecflow_4_0_7/view/src/libicon/icon_Variables.xpm
new file mode 100644
index 0000000..770591d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Variables.xpm
@@ -0,0 +1,36 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * Variables_xpm[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"  ..        ..  ",
+" .  .        .  ",
+" .  . ....   .  ",
+" ....        .  ",
+" .  . ....   .  ",
+" .  .       ... ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_W.xpm b/ecflow_4_0_7/view/src/libicon/icon_W.xpm
new file mode 100644
index 0000000..53a05fb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_W.xpm
@@ -0,0 +1,84 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * icon_W_xpm[] = {
+"16 16 50 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #E7E3E3",
+"@	c #E9CDCD",
+"#	c #EEA3A3",
+"$	c #FF0000",
+"%	c #FA2A2A",
+"&	c #F64E4E",
+"*	c #F93434",
+"=	c #FB1C1C",
+"-	c #F46464",
+";	c #FD0E0E",
+">	c #EDA9A9",
+",	c #E8D7D7",
+"'	c #FB2222",
+")	c #FE0606",
+"!	c #ECB5B5",
+"~	c #FA2727",
+"{	c #EDABAB",
+"]	c #F83E3E",
+"^	c #EF9494",
+"/	c #E7E5E5",
+"(	c #EE9F9F",
+"_	c #F36D6D",
+":	c #F08D8D",
+"<	c #F74646",
+"[	c #ECB0B0",
+"}	c #FE0404",
+"|	c #FA2828",
+"1	c #E8DBDB",
+"2	c #E9CACA",
+"3	c #FD1313",
+"4	c #FD1212",
+"5	c #EACACA",
+"6	c #E7E6E6",
+"7	c #F65555",
+"8	c #E7DFDF",
+"9	c #E8DCDC",
+"0	c #FA2929",
+"a	c #ECAFAF",
+"b	c #F18484",
+"c	c #F74949",
+"d	c #E7E0E0",
+"e	c #F27D7D",
+"f	c #FE0101",
+"g	c #F46868",
+"h	c #F93939",
+"i	c #F93131",
+"j	c #FD0B0B",
+"k	c #EDA6A6",
+"................",
+"................",
+"....+@@@@@@@@...",
+"....#$$%&*$$=...",
+"....-;>.,'$)!...",
+"....~{.+]$$^....",
+".../(..-$$_.....",
+"......:$$</.....",
+".....[}$|1......",
+"....23$45.678...",
+"...90$}a..b0....",
+"...c$$:.defg....",
+"...$$)hij$$k....",
+"................",
+"................",
+"................"};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Why_.cc b/ecflow_4_0_7/view/src/libicon/icon_Why_.cc
new file mode 100644
index 0000000..fadb700
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Why_.cc
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #5 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 6 1",
+" 	c #E7E7E7E7E7E7",
+".	c #BDBDB5B5B5B5",
+"X	c #4A4A42423939",
+"o	c #7B7B7B7B7B7B",
+"O	c #CECECECECECE",
+"+	c #8C8C8C8C8C8C",
+"                ",
+"                ",
+"                ",
+"      .XXXo     ",
+"     .XO  XO    ",
+"     o.   o+    ",
+"     .   .X     ",
+"        .XO     ",
+"       .XO      ",
+"       XO       ",
+"      .o        ",
+"                ",
+"      .O        ",
+"      o.        ",
+"                ",
+"                "};
+static pixmap p("Why_",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Why_.xpm b/ecflow_4_0_7/view/src/libicon/icon_Why_.xpm
new file mode 100644
index 0000000..57aa80e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Why_.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char * Why__xpm[] = {
+"16 16 6 1",
+" 	c #E7E7E7E7E7E7",
+".	c #BDBDB5B5B5B5",
+"X	c #4A4A42423939",
+"o	c #7B7B7B7B7B7B",
+"O	c #CECECECECECE",
+"+	c #8C8C8C8C8C8C",
+"                ",
+"                ",
+"                ",
+"      .XXXo     ",
+"     .XO  XO    ",
+"     o.   o+    ",
+"     .   .X     ",
+"        .XO     ",
+"       .XO      ",
+"       XO       ",
+"      .o        ",
+"                ",
+"      .O        ",
+"      o.        ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Z.cc b/ecflow_4_0_7/view/src/libicon/icon_Z.cc
new file mode 100644
index 0000000..bebc1bd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Z.cc
@@ -0,0 +1,86 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 50 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #E7E3E3",
+"@	c #E9CDCD",
+"#	c #EEA3A3",
+"$	c #FF0000",
+"%	c #FA2A2A",
+"&	c #F64E4E",
+"*	c #F93434",
+"=	c #FB1C1C",
+"-	c #F46464",
+";	c #FD0E0E",
+">	c #EDA9A9",
+",	c #E8D7D7",
+"'	c #FB2222",
+")	c #FE0606",
+"!	c #ECB5B5",
+"~	c #FA2727",
+"{	c #EDABAB",
+"]	c #F83E3E",
+"^	c #EF9494",
+"/	c #E7E5E5",
+"(	c #EE9F9F",
+"_	c #F36D6D",
+":	c #F08D8D",
+"<	c #F74646",
+"[	c #ECB0B0",
+"}	c #FE0404",
+"|	c #FA2828",
+"1	c #E8DBDB",
+"2	c #E9CACA",
+"3	c #FD1313",
+"4	c #FD1212",
+"5	c #EACACA",
+"6	c #E7E6E6",
+"7	c #F65555",
+"8	c #E7DFDF",
+"9	c #E8DCDC",
+"0	c #FA2929",
+"a	c #ECAFAF",
+"b	c #F18484",
+"c	c #F74949",
+"d	c #E7E0E0",
+"e	c #F27D7D",
+"f	c #FE0101",
+"g	c #F46868",
+"h	c #F93939",
+"i	c #F93131",
+"j	c #FD0B0B",
+"k	c #EDA6A6",
+"................",
+"................",
+"....+@@@@@@@@...",
+"....#$$%&*$$=...",
+"....-;>.,'$)!...",
+"....~{.+]$$^....",
+".../(..-$$_.....",
+"......:$$</.....",
+".....[}$|1......",
+"....23$45.678...",
+"...90$}a..b0....",
+"...c$$:.defg....",
+"...$$)hij$$k....",
+"................",
+"................",
+"................"};
+static pixmap p("Z",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Z.xpm b/ecflow_4_0_7/view/src/libicon/icon_Z.xpm
new file mode 100644
index 0000000..cbba22b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Z.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static char * icon_Z_xpm[] = {
+"16 16 50 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #E7E3E3",
+"@	c #E9CDCD",
+"#	c #EEA3A3",
+"$	c #FF0000",
+"%	c #FA2A2A",
+"&	c #F64E4E",
+"*	c #F93434",
+"=	c #FB1C1C",
+"-	c #F46464",
+";	c #FD0E0E",
+">	c #EDA9A9",
+",	c #E8D7D7",
+"'	c #FB2222",
+")	c #FE0606",
+"!	c #ECB5B5",
+"~	c #FA2727",
+"{	c #EDABAB",
+"]	c #F83E3E",
+"^	c #EF9494",
+"/	c #E7E5E5",
+"(	c #EE9F9F",
+"_	c #F36D6D",
+":	c #F08D8D",
+"<	c #F74646",
+"[	c #ECB0B0",
+"}	c #FE0404",
+"|	c #FA2828",
+"1	c #E8DBDB",
+"2	c #E9CACA",
+"3	c #FD1313",
+"4	c #FD1212",
+"5	c #EACACA",
+"6	c #E7E6E6",
+"7	c #F65555",
+"8	c #E7DFDF",
+"9	c #E8DCDC",
+"0	c #FA2929",
+"a	c #ECAFAF",
+"b	c #F18484",
+"c	c #F74949",
+"d	c #E7E0E0",
+"e	c #F27D7D",
+"f	c #FE0101",
+"g	c #F46868",
+"h	c #F93939",
+"i	c #F93131",
+"j	c #FD0B0B",
+"k	c #EDA6A6",
+"................",
+"................",
+"....+@@@@@@@@...",
+"....#$$%&*$$=...",
+"....-;>.,'$)!...",
+"....~{.+]$$^....",
+".../(..-$$_.....",
+"......:$$</.....",
+".....[}$|1......",
+"....23$45.678...",
+"...90$}a..b0....",
+"...c$$:.defg....",
+"...$$)hij$$k....",
+"................",
+"................",
+"................"};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Zbw.cc b/ecflow_4_0_7/view/src/libicon/icon_Zbw.cc
new file mode 100644
index 0000000..abb4988
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Zbw.cc
@@ -0,0 +1,68 @@
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 47 1",
+" 	g None",
+".	g #E7E7E7",
+"+	g #E4E4E4",
+"@	g #D3D3D3",
+"#	g #B3B3B3",
+"$	g #363636",
+"%	g #565656",
+"&	g #727272",
+"*	g #5E5E5E",
+"=	g #4B4B4B",
+"-	g #838383",
+";	g #414141",
+">	g #B7B7B7",
+",	g #DBDBDB",
+"'	g #505050",
+")	g #3B3B3B",
+"!	g #C1C1C1",
+"~	g #545454",
+"{	g #B9B9B9",
+"]	g #666666",
+"^	g #A7A7A7",
+"/	g #E5E5E5",
+"(	g #B0B0B0",
+"_	g #898989",
+":	g #A2A2A2",
+"<	g #6C6C6C",
+"[	g #BDBDBD",
+"}	g #393939",
+"|	g #555555",
+"1	g #DEDEDE",
+"2	g #D1D1D1",
+"3	g #454545",
+"4	g #444444",
+"5	g #E6E6E6",
+"6	g #777777",
+"7	g #E1E1E1",
+"8	g #DFDFDF",
+"9	g #BCBCBC",
+"0	g #9B9B9B",
+"a	g #6E6E6E",
+"b	g #969696",
+"c	g #373737",
+"d	g #868686",
+"e	g #626262",
+"f	g #5C5C5C",
+"g	g #3E3E3E",
+"h	g #B5B5B5",
+"................",
+"................",
+"....+@@@@@@@@...",
+"....#$$%&*$$=...",
+"....-;>.,'$)!...",
+"....~{.+]$$^....",
+".../(..-$$_.....",
+"......:$$</.....",
+".....[}$|1......",
+"....23$42.567...",
+"...8|$}9..0|....",
+"...a$$:.7bcd....",
+"...$$)efg$$h....",
+"................",
+"................",
+"................"};
+static pixmap p("Zbw",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_Zbw.xpm b/ecflow_4_0_7/view/src/libicon/icon_Zbw.xpm
new file mode 100644
index 0000000..e574bdf
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_Zbw.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * icon_Zbw_xpm[] = {
+"16 16 47 1",
+" 	g None",
+".	g #E7E7E7",
+"+	g #E4E4E4",
+"@	g #D3D3D3",
+"#	g #B3B3B3",
+"$	g #363636",
+"%	g #565656",
+"&	g #727272",
+"*	g #5E5E5E",
+"=	g #4B4B4B",
+"-	g #838383",
+";	g #414141",
+">	g #B7B7B7",
+",	g #DBDBDB",
+"'	g #505050",
+")	g #3B3B3B",
+"!	g #C1C1C1",
+"~	g #545454",
+"{	g #B9B9B9",
+"]	g #666666",
+"^	g #A7A7A7",
+"/	g #E5E5E5",
+"(	g #B0B0B0",
+"_	g #898989",
+":	g #A2A2A2",
+"<	g #6C6C6C",
+"[	g #BDBDBD",
+"}	g #393939",
+"|	g #555555",
+"1	g #DEDEDE",
+"2	g #D1D1D1",
+"3	g #454545",
+"4	g #444444",
+"5	g #E6E6E6",
+"6	g #777777",
+"7	g #E1E1E1",
+"8	g #DFDFDF",
+"9	g #BCBCBC",
+"0	g #9B9B9B",
+"a	g #6E6E6E",
+"b	g #969696",
+"c	g #373737",
+"d	g #868686",
+"e	g #626262",
+"f	g #5C5C5C",
+"g	g #3E3E3E",
+"h	g #B5B5B5",
+"................",
+"................",
+"....+@@@@@@@@...",
+"....#$$%&*$$=...",
+"....-;>.,'$)!...",
+"....~{.+]$$^....",
+".../(..-$$_.....",
+"......:$$</.....",
+".....[}$|1......",
+"....23$42.567...",
+"...8|$}9..0|....",
+"...a$$:.7bcd....",
+"...$$)efg$$h....",
+"................",
+"................",
+"................"};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_calendar.cc b/ecflow_4_0_7/view/src/libicon/icon_calendar.cc
new file mode 100644
index 0000000..f03c4d5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_calendar.cc
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 4 1",
+" 	c None",
+".	c #E7E7E7",
+"+	c #000000",
+"@	c #F7FB79",
+"................",
+"..++++++++++++..",
+"..+@@@@@@@@@@+..",
+"..+@@@@@@@@@@+..",
+"..+@@@@@@@@@@+..",
+"..+@@@@++@@@@+..",
+"..+@@@+++@@@@+..",
+"..+@@@@++@@@@+..",
+"..+@@@@++@@@@+..",
+"..+@@@@++@@@@+..",
+"..+@@@@++@@@@+..",
+"..+@@@++++@@@+..",
+"..+@@@@@@@@@@+..",
+"...+@@@@@@@@@+..",
+"....++++++++++..",
+"................"};
+static pixmap p("calendar",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_calendar.xpm b/ecflow_4_0_7/view/src/libicon/icon_calendar.xpm
new file mode 100644
index 0000000..08e4401
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_calendar.xpm
@@ -0,0 +1,38 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * calendar_xpm[] = {
+"16 16 4 1",
+" 	c #E79DE79DE79D",
+".	c #AAAAAAAAAAAA",
+"X	c #000000000000",
+"o	c #F7DEFBEE79E7",
+"                ",
+"   ..........   ",
+"  XXXXXXXXXX.   ",
+"  XooooooooX.   ",
+"  XooooooooX.   ",
+"  XooooXoooX.   ",
+"  XooXXXoooX.   ",
+"  XoooXXoooX.   ",
+"  XoooXXoooX.   ",
+"  XoooXXoooX.   ",
+"  XoooXXoooX.   ",
+"  XooXXXXooX.   ",
+"  XooooooooX.   ",
+"   XoooooooX.   ",
+"    XXXXXXXX    ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_clock.cc b/ecflow_4_0_7/view/src/libicon/icon_clock.cc
new file mode 100644
index 0000000..e962a11
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_clock.cc
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 6 1",
+" 	c None",
+".	c #E5E5E5",
+"+	c #888888",
+"@	c #000000",
+"#	c #CCCCCC",
+"$	c #837B7B",
+"................",
+"....+@@@@@+.....",
+"...@@#####@@....",
+"..@####@####@...",
+".+@####@####@+..",
+".@#####@#####@..",
+".@#####@#####@..",
+".@#$###@###$#@..",
+".@######@####@..",
+".@#######@###@..",
+".+@#########@+..",
+"..@####$####@...",
+"...@@#####@@....",
+"....+@@@@@+.....",
+"................",
+"................"};
+static pixmap p("clock",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_clock.xpm b/ecflow_4_0_7/view/src/libicon/icon_clock.xpm
new file mode 100644
index 0000000..452f5d4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_clock.xpm
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * clock_xpm[] = {
+"16 16 6 1",
+" 	c #E5E5E5E5E5E5",
+".	c #888888888888",
+"X	c #000000000000",
+"o	c #CCCCCCCCCCCC",
+"O	c #FFFFFFFFFFFF",
+"+	c #444444444444",
+"                ",
+"    .XXXXX.     ",
+"   XXoooooXX    ",
+"  XoooOXOoOoX   ",
+" .XooOOXOOoOX.  ",
+" XooOOOXOOOoOX  ",
+" XoOOOoXoOoOoX  ",
+" Xo+OoOXOoO+OX  ",
+" XoOOOoOXOoOoX  ",
+" XooOoOoOXOoOX  ",
+" .XoOOoOoOoOX.  ",
+"  XooOO+OoOOX   ",
+"   XXooOoOXX    ",
+"    .XXXXX.     ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_clock_free.cc b/ecflow_4_0_7/view/src/libicon/icon_clock_free.cc
new file mode 100644
index 0000000..6b1acca
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_clock_free.cc
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 6 1",
+" 	c None",
+".	c #E5E5E5",
+"+	c #888888",
+"@	c #000000",
+"#	c #F7FB79",
+"$	c #837B7B",
+"................",
+"....+@@@@@+.....",
+"...@@#####@@....",
+"..@####@####@...",
+".+@####@####@+..",
+".@#####@#####@..",
+".@#####@#####@..",
+".@#$###@###$#@..",
+".@######@####@..",
+".@#######@###@..",
+".+@#########@+..",
+"..@####$####@...",
+"...@@#####@@....",
+"....+@@@@@+.....",
+"................",
+"................"};
+static pixmap p("clock_free",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_complete.cc b/ecflow_4_0_7/view/src/libicon/icon_complete.cc
new file mode 100644
index 0000000..042a666
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_complete.cc
@@ -0,0 +1,65 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+/* 
+static char * bits[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+" ...  ... .   . ",
+".   ..   ... .. ",
+".    .   .. . . ",
+".    .   ..   . ",
+".   ..   ..   . ",
+" ...  ... .   . ",
+"....  .    .... ",
+".   . .    .    ",
+"....  .    ...  ",
+".     .    .    ",
+".     .... .... ",
+"..... ....      ",
+"  .   .         ",
+"  .   ...       ",
+"  .   .         ",
+"  .   ....      "};
+*/
+static const char * bits[] = {
+"16 16 3 1",	   
+" 	c #E5E5E5E5E5E5",   
+".	c #FFFFFF",
+"#	c #FF0000",
+"     ......     ",
+"   ..######..   ",
+"  .##########.  ",
+" .############. ",
+" .############. ",
+".##############.",
+".##############.",
+".#............#.",
+".#............#.",
+".##############.",
+".##############.",
+" .############. ",
+" .############. ",
+"  .##########.  ",
+"   ..######..   ",
+"     ......     "};
+
+
+
+
+static pixmap p("complete",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_complete.xpm b/ecflow_4_0_7/view/src/libicon/icon_complete.xpm
new file mode 100644
index 0000000..4d70781
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_complete.xpm
@@ -0,0 +1,57 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+/* 
+static char * complete_xpm[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+" ...  ... .   . ",
+".   ..   ... .. ",
+".    .   .. . . ",
+".    .   ..   . ",
+".   ..   ..   . ",
+" ...  ... .   . ",
+"....  .    .... ",
+".   . .    .    ",
+"....  .    ...  ",
+".     .    .    ",
+".     .... .... ",
+"..... ....      ","  .   .         ",
+"  .   ...       ",
+"  .   .         ",
+"  .   ....      "};
+*/
+static char * icon_complete_xpm[] = {
+"16 16 5 1",
+" 	c None",
+".	c #FFFFFF",
+"+	c #0000FF",
+"@	c #00FF00",
+"#	c #FF0000",
+"    ........    "
+"   .########.   "
+"  .##########.  "
+".##..#...###...."
+".#.##.#.#....#..#"
+".#.####.#.#....."
+".###.##.#.#..##."
+".#.##.#.#.#..##."
+" .#..##.#....#. "
+"  .#########.   "
+"    ........    "};
+
+
diff --git a/ecflow_4_0_7/view/src/libicon/icon_defstatus.cc b/ecflow_4_0_7/view/src/libicon/icon_defstatus.cc
new file mode 100644
index 0000000..ca39e0c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_defstatus.cc
@@ -0,0 +1,164 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 128 2",
+"  	c #E5E5E5",
+". 	c #D6D8BA",
+"+ 	c #C2BF70",
+"@ 	c #B6B04A",
+"# 	c #A89D12",
+"$ 	c #A89B12",
+"% 	c #E7E377",
+"& 	c #F3F489",
+"* 	c #F4F387",
+"= 	c #F4F484",
+"- 	c #F2F381",
+"; 	c #F0F37E",
+"> 	c #F0F37B",
+", 	c #EFF379",
+"' 	c #EFF376",
+") 	c #EDF373",
+"! 	c #EDF271",
+"~ 	c #E0E35F",
+"{ 	c #B7B14A",
+"] 	c #F1F58F",
+"^ 	c #ECF277",
+"/ 	c #E3EE5D",
+"( 	c #E2ED5C",
+"_ 	c #E1EC5B",
+": 	c #DFEA59",
+"< 	c #DDE858",
+"[ 	c #DCE756",
+"} 	c #DAE654",
+"| 	c #D9E453",
+"1 	c #E1EA64",
+"2 	c #E9F274",
+"3 	c #C7C46C",
+"4 	c #F0F592",
+"5 	c #E1EF66",
+"6 	c #DFEE62",
+"7 	c #F4F8CD",
+"8 	c #E3EE78",
+"9 	c #D6E852",
+"0 	c #D5E651",
+"a 	c #DEE975",
+"b 	c #F2F6CB",
+"c 	c #D6E35C",
+"d 	c #D2E154",
+"e 	c #E6F278",
+"f 	c #C3C054",
+"g 	c #EEF491",
+"h 	c #E1EE66",
+"i 	c #F6F9CE",
+"j 	c #FFFFFF",
+"k 	c #FDF8F5",
+"l 	c #E0EC77",
+"m 	c #DFEA77",
+"n 	c #F1F5CC",
+"o 	c #CEDE4F",
+"p 	c #E5F276",
+"q 	c #C3C051",
+"r 	c #ECF48E",
+"s 	c #DFED64",
+"t 	c #E2EE79",
+"u 	c #DCE675",
+"v 	c #E5F274",
+"w 	c #F0F386",
+"x 	c #E5E750",
+"y 	c #DFE340",
+"z 	c #E6E767",
+"A 	c #FDF7F3",
+"B 	c #DFDE63",
+"C 	c #D6D73B",
+"D 	c #D3D539",
+"E 	c #E7EF69",
+"F 	c #C2BE4E",
+"G 	c #F0ED7A",
+"H 	c #E3E049",
+"I 	c #DEDB38",
+"J 	c #E4E063",
+"K 	c #DDD960",
+"L 	c #D3CD33",
+"M 	c #D1CC31",
+"N 	c #EAEC5C",
+"O 	c #C0BB47",
+"P 	c #EFE976",
+"Q 	c #E1DD48",
+"R 	c #E3DF62",
+"S 	c #FCF7F3",
+"T 	c #DBD65F",
+"U 	c #D0CA31",
+"V 	c #EAEB56",
+"W 	c #BEB73C",
+"X 	c #EFEA73",
+"Y 	c #DFDB46",
+"Z 	c #F3F2C5",
+"` 	c #DEDB60",
+" .	c #F0EEC4",
+"..	c #CFC930",
+"+.	c #E9EB52",
+"@.	c #BEB83A",
+"#.	c #EFEB70",
+"$.	c #DDD943",
+"%.	c #DAD643",
+"&.	c #D5D134",
+"*.	c #D4D033",
+"=.	c #D2CC40",
+"-.	c #D1CD34",
+";.	c #E7EA4F",
+">.	c #BEB739",
+",.	c #BCB656",
+"'.	c #EEEA6D",
+").	c #E5E157",
+"!.	c #DAD63E",
+"~.	c #D5D034",
+"{.	c #D2CD31",
+"].	c #D1CB31",
+"^.	c #D3CF36",
+"/.	c #DFDE43",
+"(.	c #E8EA4C",
+"_.	c #C7C369",
+":.	c #CBC888",
+"<.	c #E1DD5B",
+"[.	c #EEEB68",
+"}.	c #EEEB65",
+"|.	c #EDEB62",
+"1.	c #EDEB5F",
+"2.	c #ECEA5C",
+"3.	c #ECEB59",
+"4.	c #DCDD3F",
+"5.	c #E0E0D0",
+"6.	c #CBC789",
+"7.	c #BDB658",
+"                                ",
+"  . + @ # # # # # # $ # @ + .   ",
+"  + % & * = - ; > , ' ) ! ~ +   ",
+"  { ] ^ / ( _ : < [ } | 1 2 3   ",
+"  $ 4 5 6 7 8 9 0 a b c d e f   ",
+"  # g h i j k l m k j n o p q   ",
+"  # r s t k j k k j k u o v q   ",
+"  # w x y z A j j A B C D E F   ",
+"  # G H I J A j j A K L M N O   ",
+"  # P Q R A j A A j S T U V W   ",
+"  # X Y Z j A ` K S j  ...+. at .  ",
+"  # #.$.%.Z K &.*.T  .=.-.;.>.  ",
+"  ,.'.).!.~.*.L {.]...^./.(._.  ",
+"  :.<.[.}.|.1.2.3.V +.;.(.4.:.  ",
+"  5.6.7.$ # # $ # # # $ 7.6.5.  ",
+"                                "};
+static pixmap p("defstatus",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_defstatus.xpm b/ecflow_4_0_7/view/src/libicon/icon_defstatus.xpm
new file mode 100644
index 0000000..0737c5f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_defstatus.xpm
@@ -0,0 +1,162 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * defstatus_xpm[] = {
+"16 16 128 2",
+"  	c #E5E5E5",
+". 	c #D6D8BA",
+"+ 	c #C2BF70",
+"@ 	c #B6B04A",
+"# 	c #A89D12",
+"$ 	c #A89B12",
+"% 	c #E7E377",
+"& 	c #F3F489",
+"* 	c #F4F387",
+"= 	c #F4F484",
+"- 	c #F2F381",
+"; 	c #F0F37E",
+"> 	c #F0F37B",
+", 	c #EFF379",
+"' 	c #EFF376",
+") 	c #EDF373",
+"! 	c #EDF271",
+"~ 	c #E0E35F",
+"{ 	c #B7B14A",
+"] 	c #F1F58F",
+"^ 	c #ECF277",
+"/ 	c #E3EE5D",
+"( 	c #E2ED5C",
+"_ 	c #E1EC5B",
+": 	c #DFEA59",
+"< 	c #DDE858",
+"[ 	c #DCE756",
+"} 	c #DAE654",
+"| 	c #D9E453",
+"1 	c #E1EA64",
+"2 	c #E9F274",
+"3 	c #C7C46C",
+"4 	c #F0F592",
+"5 	c #E1EF66",
+"6 	c #DFEE62",
+"7 	c #F4F8CD",
+"8 	c #E3EE78",
+"9 	c #D6E852",
+"0 	c #D5E651",
+"a 	c #DEE975",
+"b 	c #F2F6CB",
+"c 	c #D6E35C",
+"d 	c #D2E154",
+"e 	c #E6F278",
+"f 	c #C3C054",
+"g 	c #EEF491",
+"h 	c #E1EE66",
+"i 	c #F6F9CE",
+"j 	c #FFFFFF",
+"k 	c #FDF8F5",
+"l 	c #E0EC77",
+"m 	c #DFEA77",
+"n 	c #F1F5CC",
+"o 	c #CEDE4F",
+"p 	c #E5F276",
+"q 	c #C3C051",
+"r 	c #ECF48E",
+"s 	c #DFED64",
+"t 	c #E2EE79",
+"u 	c #DCE675",
+"v 	c #E5F274",
+"w 	c #F0F386",
+"x 	c #E5E750",
+"y 	c #DFE340",
+"z 	c #E6E767",
+"A 	c #FDF7F3",
+"B 	c #DFDE63",
+"C 	c #D6D73B",
+"D 	c #D3D539",
+"E 	c #E7EF69",
+"F 	c #C2BE4E",
+"G 	c #F0ED7A",
+"H 	c #E3E049",
+"I 	c #DEDB38",
+"J 	c #E4E063",
+"K 	c #DDD960",
+"L 	c #D3CD33",
+"M 	c #D1CC31",
+"N 	c #EAEC5C",
+"O 	c #C0BB47",
+"P 	c #EFE976",
+"Q 	c #E1DD48",
+"R 	c #E3DF62",
+"S 	c #FCF7F3",
+"T 	c #DBD65F",
+"U 	c #D0CA31",
+"V 	c #EAEB56",
+"W 	c #BEB73C",
+"X 	c #EFEA73",
+"Y 	c #DFDB46",
+"Z 	c #F3F2C5",
+"` 	c #DEDB60",
+" .	c #F0EEC4",
+"..	c #CFC930",
+"+.	c #E9EB52",
+"@.	c #BEB83A",
+"#.	c #EFEB70",
+"$.	c #DDD943",
+"%.	c #DAD643",
+"&.	c #D5D134",
+"*.	c #D4D033",
+"=.	c #D2CC40",
+"-.	c #D1CD34",
+";.	c #E7EA4F",
+">.	c #BEB739",
+",.	c #BCB656",
+"'.	c #EEEA6D",
+").	c #E5E157",
+"!.	c #DAD63E",
+"~.	c #D5D034",
+"{.	c #D2CD31",
+"].	c #D1CB31",
+"^.	c #D3CF36",
+"/.	c #DFDE43",
+"(.	c #E8EA4C",
+"_.	c #C7C369",
+":.	c #CBC888",
+"<.	c #E1DD5B",
+"[.	c #EEEB68",
+"}.	c #EEEB65",
+"|.	c #EDEB62",
+"1.	c #EDEB5F",
+"2.	c #ECEA5C",
+"3.	c #ECEB59",
+"4.	c #DCDD3F",
+"5.	c #E0E0D0",
+"6.	c #CBC789",
+"7.	c #BDB658",
+"                                ",
+"  . + @ # # # # # # $ # @ + .   ",
+"  + % & * = - ; > , ' ) ! ~ +   ",
+"  { ] ^ / ( _ : < [ } | 1 2 3   ",
+"  $ 4 5 6 7 8 9 0 a b c d e f   ",
+"  # g h i j k l m k j n o p q   ",
+"  # r s t k j k k j k u o v q   ",
+"  # w x y z A j j A B C D E F   ",
+"  # G H I J A j j A K L M N O   ",
+"  # P Q R A j A A j S T U V W   ",
+"  # X Y Z j A ` K S j  ...+. at .  ",
+"  # #.$.%.Z K &.*.T  .=.-.;.>.  ",
+"  ,.'.).!.~.*.L {.]...^./.(._.  ",
+"  :.<.[.}.|.1.2.3.V +.;.(.4.:.  ",
+"  5.6.7.$ # # $ # # # $ 7.6.5.  ",
+"                                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_folded.cc b/ecflow_4_0_7/view/src/libicon/icon_folded.cc
new file mode 100644
index 0000000..0eeb150
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_folded.cc
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 3 1",
+" 	c #E5E5E5E5E5E5",
+".	c #7E7E7E7E7E7E",
+"X	c #FFFFFFFFFFFF",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"..  ...  ...  ..",
+"XX  XXX  XXX  XX",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
+static pixmap p("folded",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_folded.xpm b/ecflow_4_0_7/view/src/libicon/icon_folded.xpm
new file mode 100644
index 0000000..e39a4e5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_folded.xpm
@@ -0,0 +1,37 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * folded_xpm[] = {
+"16 16 3 1",
+" 	c #E5E5E5E5E5E5",
+".	c #7E7E7E7E7E7E",
+"X	c #FFFFFFFFFFFF",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"..  ...  ...  ..",
+"XX  XXX  XXX  XX",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_late.cc b/ecflow_4_0_7/view/src/libicon/icon_late.cc
new file mode 100644
index 0000000..7cec98a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_late.cc
@@ -0,0 +1,39 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 3 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #F5F5F9F97A7A",
+"       .        ",
+"      .X.       ",
+"      .X.       ",
+"     .XXX.      ",
+"     .X.X.      ",
+"    .XX.XX.     ",
+"    .XX.XX.     ",
+"   .XXX.XXX.    ",
+"   .XXX.XXX.    ",
+"  .XXXX.XXXX.   ",
+"  .XXXXXXXXX.   ",
+" .XXXXX.XXXXX.  ",
+" .XXXXX.XXXXX.  ",
+".XXXXXXXXXXXXX. ",
+"............... ",
+"                "};
+static pixmap p("late",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_late.xpm b/ecflow_4_0_7/view/src/libicon/icon_late.xpm
new file mode 100644
index 0000000..070ead2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_late.xpm
@@ -0,0 +1,37 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * late_xpm[] = {
+"16 16 3 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #F5F5F9F97A7A",
+"       .        ",
+"      .X.       ",
+"      .X.       ",
+"     .XXX.      ",
+"     .X.X.      ",
+"    .XX.XX.     ",
+"    .XX.XX.     ",
+"   .XXX.XXX.    ",
+"   .XXX.XXX.    ",
+"  .XXXX.XXXX.   ",
+"  .XXXXXXXXX.   ",
+" .XXXXX.XXXXX.  ",
+" .XXXXX.XXXXX.  ",
+".XXXXXXXXXXXXX. ",
+"............... ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_limit0.cc b/ecflow_4_0_7/view/src/libicon/icon_limit0.cc
new file mode 100644
index 0000000..bc4aca6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_limit0.cc
@@ -0,0 +1,32 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"8 8 4 1",
+" 	c #E5E5E5E5E5E5",
+".	c #FFFFFFFFFFFF",
+"X	c #000000000000",
+"o	c #7E7E7E7E7E7E",
+"  ....  ",
+" .    X ",
+".  .   o",
+".      o",
+".      o",
+".      o",
+" o    o ",
+"  oooo  "};
+static pixmap p("limit0",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_limit0.xpm b/ecflow_4_0_7/view/src/libicon/icon_limit0.xpm
new file mode 100644
index 0000000..0f00646
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_limit0.xpm
@@ -0,0 +1,30 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * limit0_xpm[] = {
+"8 8 4 1",
+" 	c #E5E5E5E5E5E5",
+".	c #FFFFFFFFFFFF",
+"X	c #000000000000",
+"o	c #7E7E7E7E7E7E",
+"  ....  ",
+" .    X ",
+".  .   o",
+".      o",
+".      o",
+".      o",
+" o    o ",
+"  oooo  "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_limit1.cc b/ecflow_4_0_7/view/src/libicon/icon_limit1.cc
new file mode 100644
index 0000000..ce1a5cf
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_limit1.cc
@@ -0,0 +1,34 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"8 8 6 1",
+" 	c #E5E5E5E5E5E5",
+".	c #0000EEEE0000",
+"X	c #0000FFFF0000",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #000088880000",
+"  ....  ",
+" .XXXXo ",
+".XOXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+" +XXXX+ ",
+"  ++++  "};
+static pixmap p("limit1",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_limit1.xpm b/ecflow_4_0_7/view/src/libicon/icon_limit1.xpm
new file mode 100644
index 0000000..9286c0d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_limit1.xpm
@@ -0,0 +1,32 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * limit1_xpm[] = {
+"8 8 6 1",
+" 	c #E5E5E5E5E5E5",
+".	c #0000EEEE0000",
+"X	c #0000FFFF0000",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #000088880000",
+"  ....  ",
+" .XXXXo ",
+".XOXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+" +XXXX+ ",
+"  ++++  "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_limit2.cc b/ecflow_4_0_7/view/src/libicon/icon_limit2.cc
new file mode 100644
index 0000000..43c18ad
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_limit2.cc
@@ -0,0 +1,34 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"8 8 6 1",
+" 	c #E5E5E5E5E5E5",
+".	c #00000000EEEE",
+"X	c #00000000FFFF",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #000000008888",
+"  ....  ",
+" .XXXXo ",
+".XOXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+" +XXXX+ ",
+"  ++++  "};
+static pixmap p("limit2",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_limit2.xpm b/ecflow_4_0_7/view/src/libicon/icon_limit2.xpm
new file mode 100644
index 0000000..ddd2743
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_limit2.xpm
@@ -0,0 +1,32 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * limit2_xpm[] = {
+"8 8 6 1",
+" 	c #E5E5E5E5E5E5",
+".	c #00000000EEEE",
+"X	c #00000000FFFF",
+"o	c #000000000000",
+"O	c #FFFFFFFFFFFF",
+"+	c #000000008888",
+"  ....  ",
+" .XXXXo ",
+".XOXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+".XXXXXX+",
+" +XXXX+ ",
+"  ++++  "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_locked.cc b/ecflow_4_0_7/view/src/libicon/icon_locked.cc
new file mode 100644
index 0000000..727c981
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_locked.cc
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 4 1",
+" 	c #E5E5E5E5E5E5",
+".	c #282828282828",
+"X	c #FFFFFFFFFFFF",
+"o	c #ADADADADADAD",
+"                ",
+"      ....      ",
+"    ..    ..    ",
+"   .        .   ",
+"  .          .  ",
+"  XXXXXXXXXXX.  ",
+"  Xoooooooooo.  ",
+"  Xoooo..oooo.  ",
+"  Xooo....ooo.  ",
+"  Xoooo..oooo.  ",
+"  Xoooo..oooo.  ",
+"  Xoooo..oooo.  ",
+"  Xoooooooooo.  ",
+"  Xoooooooooo.  ",
+"  ............  ",
+"  XXXXXXXXXXXX  "};
+static pixmap p("locked",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_locked.xpm b/ecflow_4_0_7/view/src/libicon/icon_locked.xpm
new file mode 100644
index 0000000..d8cd614
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_locked.xpm
@@ -0,0 +1,38 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * locked_xpm[] = {
+"16 16 4 1",
+" 	c #E5E5E5E5E5E5",
+".	c #282828282828",
+"X	c #FFFFFFFFFFFF",
+"o	c #ADADADADADAD",
+"                ",
+"      ....      ",
+"    ..    ..    ",
+"   .        .   ",
+"  .          .  ",
+"  XXXXXXXXXXX.  ",
+"  Xoooooooooo.  ",
+"  Xoooo..oooo.  ",
+"  Xooo....ooo.  ",
+"  Xoooo..oooo.  ",
+"  Xoooo..oooo.  ",
+"  Xoooo..oooo.  ",
+"  Xoooooooooo.  ",
+"  Xoooooooooo.  ",
+"  ............  ",
+"  XXXXXXXXXXXX  "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_memo.cc b/ecflow_4_0_7/view/src/libicon/icon_memo.cc
new file mode 100644
index 0000000..f25cb76
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_memo.cc
@@ -0,0 +1,15 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include "pixmap.h"
diff --git a/ecflow_4_0_7/view/src/libicon/icon_memo.xpm b/ecflow_4_0_7/view/src/libicon/icon_memo.xpm
new file mode 100644
index 0000000..81590a6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_memo.xpm
@@ -0,0 +1,67 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * icon_memo_xpm[] = {
+"32 32 17 1",
+" 	c None",
+".	c #000000",
+"+	c #800000",
+"@	c #008000",
+"#	c #808000",
+"$	c #000080",
+"%	c #800080",
+"&	c #008080",
+"*	c #808080",
+"=	c #C0C0C0",
+"-	c #FF0000",
+";	c #00FF00",
+">	c #FFFF00",
+",	c #0000FF",
+"'	c #FF00FF",
+")	c #00FFFF",
+"!	c #FFFFFF",
+"             *   *   *   *   *  ",
+"            * * * * * * * * * * ",
+"         ...*...*...*...*...*...",
+"         .>!*!>!*!>!*!>!*!>!*!>.",
+"        .>!>!>!>!>!>!>!>!>!>!>..",
+"        .!>!>!>!>!>!>!>!>!>!>!..",
+"       .!>!>!>.........>!>!>!.=.",
+"       .>!>!>!.!!!!!!!.!>!>!>.=.",
+"      .>!>!>!.!!....!.!>!>!>.=!.",
+"      .!>!>!>.!.!..!!.>!>!>!.=!.",
+"     .!>!>!>.!!!!!!!.>!>!>!.*!!.",
+"     .>!>!>!.........!>!>!>.=!!.",
+"    .>!>!>!>!>!>!>!>!>!>!>.=!>!.",
+"    .!>!>!>!>!>!>!>!>!>!>!.=!!!.",
+"   .!>!>!>!>!>!>!>!>!>!>!.***!!.",
+"   .>!>!>!>!>!>!>!>!>!>!>.=!!!!.",
+"  .>!>!>!>!>!>!>!>!>!>!>.=!!!>!.",
+"  .!>!>!>!>!>!>!>!>!>!>!.=!!!!!.",
+" .!>!>!>!>!>!>!>!>!>!>!.*****!!.",
+" .>!>!>!>!>!>!>!>!>!>!>.=!!!!!!.",
+".>!>!>!>!>!>!>!>!>!>!>.=!>!!!>!.",
+".......................=!!!!!!!.",
+"         .==*****************!!.",
+"         .!!!!!!!!!!!!!!!!!!!!!.",
+"         .!!!>!!!>!!!>!!!>!!!>!.",
+"         .!!!!!!!!!!!!!!!!!!!!!.",
+"         .!>*****************!!.",
+"         .!!!!!!!!!!!!!!!!!!!!!.",
+"         .!!!>!!!>!!!>!!!>!!!>!.",
+"         .!!!!!!!!!!!!!!!!!!!!!.",
+"         .!>!!!>!!!>!!!>!!!>!!!.",
+"         ......................."};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_message.cc b/ecflow_4_0_7/view/src/libicon/icon_message.cc
new file mode 100644
index 0000000..eeff47c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_message.cc
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 4 1",
+" 	c None",
+".	c #E5E5E5",
+"+	c #000000",
+"@	c #F5F97A",
+"................",
+"................",
+"................",
+"..+++++++++++...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@+...",
+"..+@@@@@+++++...",
+"..+@@@@@+@@+....",
+"..+@@@@@+ at +.....",
+"..++++++++......",
+"................",
+"................"};
+static pixmap p("message",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_message.xpm b/ecflow_4_0_7/view/src/libicon/icon_message.xpm
new file mode 100644
index 0000000..aa3ddb5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_message.xpm
@@ -0,0 +1,41 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * message_xpm[] = {
+"16 16 7 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #C9C9CDCD4C4C",
+"o	c #FFFFFFFFFFFF",
+"O	c #F5F5F9F97A7A",
+"+	c #545454545454",
+"@	c #98989B9B3838",
+"                ",
+"                ",
+"                ",
+"  ...........   ",
+"  .XXXXXXXXX.   ",
+"  .XXXXXXXXX.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOOOOOO.   ",
+"  .oOOOX.....   ",
+"  .oOOXX+OO.    ",
+"  .oXXX.O at +     ",
+"  .....++       ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_migrated.cc b/ecflow_4_0_7/view/src/libicon/icon_migrated.cc
new file mode 100644
index 0000000..a8757d2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_migrated.cc
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 3 1",
+" 	c #E79DE79DE79D",
+".	c #000000000000",
+"X	c #F7DEFBEE79E7",
+"                ",
+"     .....      ",
+"    .XXXXX.     ",
+"   .XXXXXXX.    ",
+"  .XXXXXXXXX.   ",
+" .XXXXXXXXXXX.  ",
+" .XXXX...XXXX.  ",
+" .XXXX. .XXXX.  ",
+" .XXXX...XXXX.  ",
+" .XXXXXXXXXXX.  ",
+"  .XXXXXXXXX.   ",
+"   .XXXXXXX.    ",
+"    .XXXXX.     ",
+"     .........  ",
+"                ",
+"                "};
+static pixmap p("migrated",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_migrated.xpm b/ecflow_4_0_7/view/src/libicon/icon_migrated.xpm
new file mode 100644
index 0000000..251d828
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_migrated.xpm
@@ -0,0 +1,37 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * migrated_xpm[] = {
+"16 16 3 1",
+" 	c #E79DE79DE79D",
+".	c #000000000000",
+"X	c #F7DEFBEE79E7",
+"                ",
+"     .....      ",
+"    .XXXXX.     ",
+"   .XXXXXXX.    ",
+"  .XXXXXXXXX.   ",
+" .XXXXXXXXXXX.  ",
+" .XXXX...XXXX.  ",
+" .XXXX. .XXXX.  ",
+" .XXXX...XXXX.  ",
+" .XXXXXXXXXXX.  ",
+"  .XXXXXXXXX.   ",
+"   .XXXXXXX.    ",
+"    .XXXXX.     ",
+"     .........  ",
+"                ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_noway.cc b/ecflow_4_0_7/view/src/libicon/icon_noway.cc
new file mode 100644
index 0000000..cf56c8b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_noway.cc
@@ -0,0 +1,65 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+// Description : 
+//=============================================================================================
+
+#include "pixmap.h"
+/* XPM */
+/* 
+static const char * bits[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+" ...  ... .   . ",
+".   ..   ... .. ",
+".    .   .. . . ",
+".    .   ..   . ",
+".   ..   ..   . ",
+" ...  ... .   . ",
+"....  .    .... ",
+".   . .    .    ",
+"....  .    ...  ",
+".     .    .    ",
+".     .... .... ",
+"..... ....      ",
+"  .   .         ",
+"  .   ...       ",
+"  .   .         ",
+"  .   ....      "};
+*/
+static const char * bits[] = {
+"16 16 3 1",	   
+" 	c #E5E5E5E5E5E5",   
+".	c #FFFFFF",
+"#	c #FF0000",
+"     ......     ",
+"   ..######..   ",
+"  .##########.  ",
+" .############. ",
+" .############. ",
+".##############.",
+".##############.",
+".#............#.",
+".#............#.",
+".##############.",
+".##############.",
+" .############. ",
+" .############. ",
+"  .##########.  ",
+"   ..######..   ",
+"     ......     "};
+
+
+
+
+static pixmap p("noway",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_noway.xpm b/ecflow_4_0_7/view/src/libicon/icon_noway.xpm
new file mode 100644
index 0000000..e1804fb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_noway.xpm
@@ -0,0 +1,63 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+/* 
+static char * icon_complete[] = {
+"16 16 2 1",
+" 	c #E7E7E7E7E7E7",
+".	c #000000000000",
+" ...  ... .   . ",
+".   ..   ... .. ",
+".    .   .. . . ",
+".    .   ..   . ",
+".   ..   ..   . ",
+" ...  ... .   . ",
+"....  .    .... ",
+".   . .    .    ",
+"....  .    ...  ",
+".     .    .    ",
+".     .... .... ",
+"..... ....      ",
+"  .   .         ",
+"  .   ...       ",
+"  .   .         ",
+"  .   ....      "};
+*/
+static char * icon_noway_xpm[] = {
+"16 16 3 1",	   
+" 	c #E5E5E5E5E5E5",   
+".	c #FFFFFF",
+"#	c #FF0000",
+"     ......     ",
+"   ..######..   ",
+"  .##########.  ",
+" .############. ",
+" .############. ",
+".##############.",
+".##############.",
+".#............#.",
+".#............#.",
+".##############.",
+".##############.",
+" .############. ",
+" .############. ",
+"  .##########.  ",
+"   ..######..   ",
+"     ......     "};
+
+
+
+
diff --git a/ecflow_4_0_7/view/src/libicon/icon_rerun.cc b/ecflow_4_0_7/view/src/libicon/icon_rerun.cc
new file mode 100644
index 0000000..ac631f0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_rerun.cc
@@ -0,0 +1,39 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #1 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 3 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #F5F5F3F35454",
+"                ",
+"     .....      ",
+"   ..XXXXX..    ",
+"  .XXXXXXXXX.   ",
+" .XXXXXXXXXXX.  ",
+" .XXX.XXX.XXX.  ",
+".XXX...X...XXX. ",
+".XXXX.XXX.XXXX. ",
+".XXXXXXXXXXXXX. ",
+".XXXXX...XXXXX. ",
+".XXXX.XXX.XXXX. ",
+" .XX.XXXXX.XX.  ",
+" .XXXXXXXXXXX.  ",
+"  .XXXXXXXXX.   ",
+"   ..XXXXX..    ",
+"     .....      "};
+static pixmap p("rerun",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_rerun.xpm b/ecflow_4_0_7/view/src/libicon/icon_rerun.xpm
new file mode 100644
index 0000000..c7be610
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_rerun.xpm
@@ -0,0 +1,37 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * rerun_xpm[] = {
+"16 16 3 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"X	c #F5F5F3F35454",
+"                ",
+"     .....      ",
+"   ..XXXXX..    ",
+"  .XXXXXXXXX.   ",
+" .XXXXXXXXXXX.  ",
+" .XXX.XXX.XXX.  ",
+".XXX...X...XXX. ",
+".XXXX.XXX.XXXX. ",
+".XXXXXXXXXXXXX. ",
+".XXXXX...XXXXX. ",
+".XXXX.XXX.XXXX. ",
+" .XX.XXXXX.XX.  ",
+" .XXXXXXXXXXX.  ",
+"  .XXXXXXXXX.   ",
+"   ..XXXXX..    ",
+"     .....      "};
diff --git a/ecflow_4_0_7/view/src/libicon/icon_waiting.cc b/ecflow_4_0_7/view/src/libicon/icon_waiting.cc
new file mode 100644
index 0000000..7eed8ac
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_waiting.cc
@@ -0,0 +1,38 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "pixmap.h"
+/* XPM */
+static const char * bits[] = {
+"16 16 2 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"                ",
+"         .......",
+"         ..  ...",
+"         .   .. ",
+"            ..  ",
+"           ..   ",
+"     ....  ..   ",
+"     .  . ..   .",
+"       . ...  ..",
+"      .  .......",
+"     .  .       ",
+" ... ....       ",
+"  .             ",
+" .              ",
+" ...            ",
+"                "};
+static pixmap p("waiting",(const char**)bits);
diff --git a/ecflow_4_0_7/view/src/libicon/icon_waiting.xpm b/ecflow_4_0_7/view/src/libicon/icon_waiting.xpm
new file mode 100644
index 0000000..1dc3ed6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/icon_waiting.xpm
@@ -0,0 +1,36 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* XPM */
+static char * waiting_xpm[] = {
+"16 16 2 1",
+" 	c #E5E5E5E5E5E5",
+".	c #000000000000",
+"                ",
+"         .......",
+"         ..  ...",
+"         .   .. ",
+"            ..  ",
+"           ..   ",
+"     ....  ..   ",
+"     .  . ..   .",
+"       . ...  ..",
+"      .  .......",
+"     .  .       ",
+" ... ....       ",
+"  .             ",
+" .              ",
+" ...            ",
+"                "};
diff --git a/ecflow_4_0_7/view/src/libicon/xpm2cc b/ecflow_4_0_7/view/src/libicon/xpm2cc
new file mode 100644
index 0000000..751d578
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libicon/xpm2cc
@@ -0,0 +1,27 @@
+#!/usr/local/share/perl
+#!/usr/bin/perl
+$n=$ARGV[0];
+
+$n =~ /icon_(.*)\.xpm/;
+$m = $1;
+
+print <<EOF;
+#include "pixmap.h"
+EOF
+
+open(IN,"<$n") || die @$;
+
+while(<IN>)
+{
+	if(/static char \*\s*(.*)\[\](.*)/)
+	{
+		$_ = "static const char * bits[] = {\n";
+	}
+
+	print $_;
+}
+
+print <<EOF;
+static pixmap p("$m",(const char**)bits);
+EOF
+
diff --git a/ecflow_4_0_7/view/src/libui/uiask.cc b/ecflow_4_0_7/view/src/libui/uiask.cc
new file mode 100644
index 0000000..4638cf2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiask.cc
@@ -0,0 +1,84 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/MessageB.h>
+#include <Xm/TextF.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushBG.h>
+#include <Xm/SeparatoG.h>
+
+
+#include "uiask.h"
+
+ask_shell_p ask_shell = (ask_shell_p) NULL;
+
+
+
+void ask_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[7];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget button20 = (Widget)NULL;
+	Widget button21 = (Widget)NULL;
+	Widget button22 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "ask_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	XtSetArg(al[ac], XmNtransient, TRUE); ac++;
+	ask_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = ask_shell;
+	XtSetArg(al[ac], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); ac++;
+	XtSetArg(al[ac], XmNdialogType, XmDIALOG_QUESTION); ac++;
+	XtSetArg(al[ac], XmNmessageAlignment, XmALIGNMENT_CENTER); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonType, XmDIALOG_CANCEL_BUTTON); ac++;
+	form_ = XmCreateMessageBox ( ask_shell, "form_", al, ac );
+	ac = 0;
+	button20 = XmMessageBoxGetChild ( form_, XmDIALOG_CANCEL_BUTTON );
+	button21 = XmMessageBoxGetChild ( form_, XmDIALOG_HELP_BUTTON );
+	label_ = XmMessageBoxGetChild ( form_, XmDIALOG_MESSAGE_LABEL );
+	button22 = XmMessageBoxGetChild ( form_, XmDIALOG_OK_BUTTON );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetValues ( button21,al, ac );
+	ac = 0;
+	value_ = XmCreateTextField ( form_, "value_", al, ac );
+	XtAddCallback (form_, XmNokCallback,&ask_shell_c:: okCB, (XtPointer) this);
+	XtAddCallback (form_, XmNcancelCallback,&ask_shell_c:: cancelCB, (XtPointer) this);
+	XtAddCallback (form_, XmNhelpCallback,&ask_shell_c:: helpCB, (XtPointer) this);
+	children[ac++] = value_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void ask_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	ask_shell_p instance = (ask_shell_p) client_data;
+	instance->helpCB ( widget, call_data );
+}
+
+void ask_shell_c::cancelCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	ask_shell_p instance = (ask_shell_p) client_data;
+	instance->cancelCB ( widget, call_data );
+}
+
+void ask_shell_c::okCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	ask_shell_p instance = (ask_shell_p) client_data;
+	instance->okCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiask.h b/ecflow_4_0_7/view/src/libui/uiask.h
new file mode 100644
index 0000000..6737c78
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiask.h
@@ -0,0 +1,34 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiask_h
+#define _uiask_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class ask_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget ask_shell;
+	Widget form_;
+	Widget label_;
+	Widget value_;
+public:
+	static void helpCB( Widget, XtPointer, XtPointer );
+	virtual void helpCB( Widget, XtPointer ) = 0;
+	static void cancelCB( Widget, XtPointer, XtPointer );
+	virtual void cancelCB( Widget, XtPointer ) = 0;
+	static void okCB( Widget, XtPointer, XtPointer );
+	virtual void okCB( Widget, XtPointer ) = 0;
+};
+
+typedef ask_shell_c *ask_shell_p;
+
+
+extern ask_shell_p ask_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uicollector.cc b/ecflow_4_0_7/view/src/libui/uicollector.cc
new file mode 100644
index 0000000..1a8e299
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uicollector.cc
@@ -0,0 +1,204 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/CascadeB.h>
+#include <Xm/Command.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/SelectioB.h>
+#include <Xm/Separator.h>
+#include <Xm/Text.h>
+#include <Xm/LabelG.h>
+
+
+#include "uicollector.h"
+
+collector_shell_p collector_shell = (collector_shell_p) NULL;
+
+
+
+void collector_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledList1 = (Widget)NULL;
+	Widget menuBar1 = (Widget)NULL;
+	Widget cascade1 = (Widget)NULL;
+	Widget menu1 = (Widget)NULL;
+	Widget separator1 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+	Widget cascade3 = (Widget)NULL;
+	Widget menu3 = (Widget)NULL;
+	Widget cascade2 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "collector_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, FALSE); ac++;
+	collector_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = collector_shell;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( collector_shell, "form_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNchildPlacement, XmPLACE_BELOW_SELECTION); ac++;
+	XtSetArg(al[ac], XmNhistoryVisibleItemCount, 6); ac++;
+	command_ = XmCreateCommand ( form_, "command_", al, ac );
+	ac = 0;
+	text_ = XmCommandGetChild ( command_, XmDIALOG_COMMAND_TEXT );
+
+	XtSetArg(al[ac], XmNvisibleItemCount, 11); ac++;
+	XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form_, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+	menuBar1 = XmCreateMenuBar ( form_, "menuBar1", al, ac );
+	cascade1 = XmCreateCascadeButton ( menuBar1, "File", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	menu1 = XmCreatePulldownMenu ( menuBar1, "menu1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	stop_ = XmCreatePushButton ( menu1, "Stop", al, ac );
+	ac = 0;
+	separator1 = XmCreateSeparator ( menu1, "separator1", al, ac );
+	button1 = XmCreatePushButton ( menu1, "Close", al, ac );
+	cascade3 = XmCreateCascadeButton ( menuBar1, "Selection", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	menu3 = XmCreatePulldownMenu ( menuBar1, "menu3", al, ac );
+	ac = 0;
+	remove_ = XmCreatePushButton ( menu3, "Remove", al, ac );
+	all_ = XmCreatePushButton ( menu3, "Select All", al, ac );
+	none_ = XmCreatePushButton ( menu3, "Select None", al, ac );
+	cascade2 = XmCreateCascadeButton ( menuBar1, "Commands", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	blocks_ = XmCreatePulldownMenu ( menuBar1, "blocks_", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, menuBar1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( command_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, menuBar1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, command_); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( menuBar1,al, ac );
+	ac = 0;
+	XtAddCallback (command_, XmNcommandEnteredCallback,&collector_shell_c:: applyCB, (XtPointer) this);
+	XtAddCallback (list_, XmNmultipleSelectionCallback,&collector_shell_c:: selectCB, (XtPointer) this);
+	XtManageChild(list_);
+	XtAddCallback (stop_, XmNactivateCallback,&collector_shell_c:: stopCB, (XtPointer) this);
+	XtAddCallback (button1, XmNactivateCallback,&collector_shell_c:: closeCB, (XtPointer) this);
+	children[ac++] = stop_;
+	children[ac++] = separator1;
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu1); ac++;
+	XtSetValues ( cascade1, al, ac );
+	ac = 0;
+	XtAddCallback (remove_, XmNactivateCallback,&collector_shell_c:: removeCB, (XtPointer) this);
+	XtAddCallback (all_, XmNactivateCallback,&collector_shell_c:: allCB, (XtPointer) this);
+	XtAddCallback (none_, XmNactivateCallback,&collector_shell_c:: noneCB, (XtPointer) this);
+	children[ac++] = remove_;
+	children[ac++] = all_;
+	children[ac++] = none_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu3); ac++;
+	XtSetValues ( cascade3, al, ac );
+	ac = 0;
+	XtAddCallback (blocks_, XmNentryCallback,&collector_shell_c:: entryCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNsubMenuId, blocks_); ac++;
+	XtSetValues ( cascade2, al, ac );
+	ac = 0;
+	children[ac++] = cascade1;
+	children[ac++] = cascade3;
+	children[ac++] = cascade2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = command_;
+	children[ac++] = menuBar1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void collector_shell_c::stopCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->stopCB ( widget, call_data );
+}
+
+void collector_shell_c::entryCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->entryCB ( widget, call_data );
+}
+
+void collector_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->closeCB ( widget, call_data );
+}
+
+void collector_shell_c::selectCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->selectCB ( widget, call_data );
+}
+
+void collector_shell_c::applyCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->applyCB ( widget, call_data );
+}
+
+void collector_shell_c::removeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->removeCB ( widget, call_data );
+}
+
+void collector_shell_c::noneCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->noneCB ( widget, call_data );
+}
+
+void collector_shell_c::allCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	collector_shell_p instance = (collector_shell_p) client_data;
+	instance->allCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uicollector.h b/ecflow_4_0_7/view/src/libui/uicollector.h
new file mode 100644
index 0000000..8327883
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uicollector.h
@@ -0,0 +1,50 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uicollector_h
+#define _uicollector_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class collector_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget collector_shell;
+	Widget form_;
+	Widget command_;
+	Widget text_;
+	Widget list_;
+	Widget stop_;
+	Widget remove_;
+	Widget all_;
+	Widget none_;
+	Widget blocks_;
+public:
+	static void stopCB( Widget, XtPointer, XtPointer );
+	virtual void stopCB( Widget, XtPointer ) = 0;
+	static void entryCB( Widget, XtPointer, XtPointer );
+	virtual void entryCB( Widget, XtPointer ) = 0;
+	static void closeCB( Widget, XtPointer, XtPointer );
+	virtual void closeCB( Widget, XtPointer ) = 0;
+	static void selectCB( Widget, XtPointer, XtPointer );
+	virtual void selectCB( Widget, XtPointer ) = 0;
+	static void applyCB( Widget, XtPointer, XtPointer );
+	virtual void applyCB( Widget, XtPointer ) = 0;
+	static void removeCB( Widget, XtPointer, XtPointer );
+	virtual void removeCB( Widget, XtPointer ) = 0;
+	static void noneCB( Widget, XtPointer, XtPointer );
+	virtual void noneCB( Widget, XtPointer ) = 0;
+	static void allCB( Widget, XtPointer, XtPointer );
+	virtual void allCB( Widget, XtPointer ) = 0;
+};
+
+typedef collector_shell_c *collector_shell_p;
+
+
+extern collector_shell_p collector_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uicolors.cc b/ecflow_4_0_7/view/src/libui/uicolors.cc
new file mode 100644
index 0000000..3e40d69
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uicolors.cc
@@ -0,0 +1,495 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/Label.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+#include <Xm/LabelG.h>
+#include <Xm/ToggleBG.h>
+
+
+#include "uicolors.h"
+
+colors_form_p colors_form = (colors_form_p) NULL;
+
+
+
+void colors_form_c::create (Widget parent, char *widget_name)
+{
+  Widget children[12];      /* Children to manage */
+  Arg al[64];                    /* Arg List */
+  register int ac = 0;           /* Arg Count */
+  Widget frame2 = (Widget)NULL;
+  Widget label2 = (Widget)NULL;
+  Widget rowcol4 = (Widget)NULL;
+  Widget rowcol9 = (Widget)NULL;
+  Widget toggle2 = (Widget)NULL;
+  Widget separator7 = (Widget)NULL;
+  Widget label7 = (Widget)NULL;
+  Widget text1 = (Widget)NULL;
+  Widget rowcol10 = (Widget)NULL;
+  Widget toggle8 = (Widget)NULL;
+  Widget separator8 = (Widget)NULL;
+  Widget label11 = (Widget)NULL;
+  Widget text5 = (Widget)NULL;
+  Widget rowcol11 = (Widget)NULL;
+  Widget toggle9 = (Widget)NULL;
+  Widget separator9 = (Widget)NULL;
+  Widget label12 = (Widget)NULL;
+  Widget text6 = (Widget)NULL;
+  Widget rowcol12 = (Widget)NULL;
+  Widget toggle10 = (Widget)NULL;
+  Widget separator10 = (Widget)NULL;
+  Widget label13 = (Widget)NULL;
+  Widget text7 = (Widget)NULL;
+  Widget rowcol13 = (Widget)NULL;
+  Widget toggle11 = (Widget)NULL;
+  Widget separator11 = (Widget)NULL;
+  Widget label14 = (Widget)NULL;
+  Widget text8 = (Widget)NULL;
+  Widget rowcol14 = (Widget)NULL;
+  Widget toggle12 = (Widget)NULL;
+  Widget separator12 = (Widget)NULL;
+  Widget label15 = (Widget)NULL;
+  Widget text9 = (Widget)NULL;
+  Widget rowcol15 = (Widget)NULL;
+  Widget toggle13 = (Widget)NULL;
+  Widget separator13 = (Widget)NULL;
+  Widget label16 = (Widget)NULL;
+  Widget text10 = (Widget)NULL;
+  Widget rowcol16 = (Widget)NULL;
+  Widget toggle14 = (Widget)NULL;
+  Widget separator14 = (Widget)NULL;
+  Widget label17 = (Widget)NULL;
+  Widget text11 = (Widget)NULL;
+  Widget rowcol17 = (Widget)NULL;
+  Widget toggle15 = (Widget)NULL;
+  Widget separator15 = (Widget)NULL;
+  Widget label18 = (Widget)NULL;
+  Widget text12 = (Widget)NULL;
+  Widget label3 = (Widget)NULL;
+
+  Widget toggle100 = (Widget)NULL;
+  Widget rowcol100 = (Widget)NULL;
+  Widget separator100 = (Widget)NULL;
+  Widget text100 = (Widget)NULL;
+  Widget label100 = (Widget)NULL;
+
+  Widget rowcol101 = (Widget)NULL;
+  Widget separator101 = (Widget)NULL;
+  Widget text101 = (Widget)NULL;
+  Widget toggle101 = (Widget)NULL;
+  Widget label101 = (Widget)NULL;
+
+  Widget rowcol102 = (Widget)NULL;
+  Widget separator102 = (Widget)NULL;
+  Widget text102 = (Widget)NULL;
+  Widget toggle102 = (Widget)NULL;
+  Widget label102 = (Widget)NULL;
+
+  if ( !widget_name )
+    widget_name = "Colours";
+
+  XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+  colors_form = XmCreateForm ( parent, widget_name, al, ac );
+  ac = 0;
+  _xd_rootwidget = colors_form;
+  XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+  form_ = XmCreateForm ( colors_form, "form_", al, ac );
+  ac = 0;
+  frame2 = XmCreateFrame ( form_, "frame2", al, ac );
+  XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+  label2 = XmCreateLabel ( frame2, "Colours", al, ac );
+
+  ac = 0;
+  rowcol4 = XmCreateRowColumn ( frame2, "rowcol4", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol9 = XmCreateRowColumn ( rowcol4, "rowcol9", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle2 = XmCreateToggleButtonGadget ( rowcol9, "@color_unknown", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator7 = XmCreateSeparator ( rowcol9, "separator7", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label7 = XmCreateLabel ( rowcol9, "Unknown", al, ac );
+  ac = 0;
+  text1 = XmCreateTextField ( rowcol9, "color_unknown", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol10 = XmCreateRowColumn ( rowcol4, "rowcol10", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle8 = XmCreateToggleButtonGadget ( rowcol10, "@color_suspended", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator8 = XmCreateSeparator ( rowcol10, "separator8", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label11 = XmCreateLabel ( rowcol10, "Suspended", al, ac );
+  ac = 0;
+  text5 = XmCreateTextField ( rowcol10, "color_suspended", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol11 = XmCreateRowColumn ( rowcol4, "rowcol11", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle9 = XmCreateToggleButtonGadget ( rowcol11, "@color_complete", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator9 = XmCreateSeparator ( rowcol11, "separator9", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label12 = XmCreateLabel ( rowcol11, "Complete", al, ac );
+  ac = 0;
+  text6 = XmCreateTextField ( rowcol11, "color_complete", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol12 = XmCreateRowColumn ( rowcol4, "rowcol12", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle10 = XmCreateToggleButtonGadget ( rowcol12, "@color_queued", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator10 = XmCreateSeparator ( rowcol12, "separator10", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label13 = XmCreateLabel ( rowcol12, "Queued", al, ac );
+  ac = 0;
+  text7 = XmCreateTextField ( rowcol12, "color_queued", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol13 = XmCreateRowColumn ( rowcol4, "rowcol13", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle11 = XmCreateToggleButtonGadget ( rowcol13, "@color_submitted", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator11 = XmCreateSeparator ( rowcol13, "separator11", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label14 = XmCreateLabel ( rowcol13, "Submitted", al, ac );
+  ac = 0;
+  text8 = XmCreateTextField ( rowcol13, "color_submitted", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol14 = XmCreateRowColumn ( rowcol4, "rowcol14", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle12 = XmCreateToggleButtonGadget ( rowcol14, "@color_active", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator12 = XmCreateSeparator ( rowcol14, "separator12", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label15 = XmCreateLabel ( rowcol14, "Active", al, ac );
+  ac = 0;
+  text9 = XmCreateTextField ( rowcol14, "color_active", al, ac );
+
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol15 = XmCreateRowColumn ( rowcol4, "rowcol15", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle13 = XmCreateToggleButtonGadget ( rowcol15, "@color_aborted", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator13 = XmCreateSeparator ( rowcol15, "separator13", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label16 = XmCreateLabel ( rowcol15, "Aborted", al, ac );
+  ac = 0;
+  text10 = XmCreateTextField ( rowcol15, "color_aborted", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol16 = XmCreateRowColumn ( rowcol4, "rowcol16", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle14 = XmCreateToggleButtonGadget ( rowcol16, "@color_halted", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator14 = XmCreateSeparator ( rowcol16, "separator14", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label17 = XmCreateLabel ( rowcol16, "Halted", al, ac );
+  ac = 0;
+  text11 = XmCreateTextField ( rowcol16, "color_halted", al, ac );
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol17 = XmCreateRowColumn ( rowcol4, "rowcol17", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle15 = XmCreateToggleButtonGadget ( rowcol17, "@color_shutdown", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator15 = XmCreateSeparator ( rowcol17, "separator15", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label18 = XmCreateLabel ( rowcol17, "Shutdown", al, ac );
+  ac = 0;
+  text12 = XmCreateTextField ( rowcol17, "color_shutdown", al, ac );
+  label3 = XmCreateLabelGadget ( form_, "warn", al, ac );
+
+  {
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol100 = XmCreateRowColumn ( rowcol4, "rowcol100", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle100 = XmCreateToggleButtonGadget ( rowcol100, "@color_meter_low", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator100 = XmCreateSeparator ( rowcol100, "separator100", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label100 = XmCreateLabel ( rowcol100, "Meter", al, ac );
+  ac = 0;
+  text100 = XmCreateTextField ( rowcol100, "color_meter_low", al, ac );
+
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol101 = XmCreateRowColumn ( rowcol4, "rowcol101", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle101 = XmCreateToggleButtonGadget ( rowcol101, "@color_threshold", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator101 = XmCreateSeparator ( rowcol101, "separator101", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label101 = XmCreateLabel ( rowcol101, "Threshold", al, ac );
+  ac = 0;
+  text101 = XmCreateTextField ( rowcol101, "color_threshold", al, ac );
+
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+  rowcol102 = XmCreateRowColumn ( rowcol4, "rowcol102", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+  XtSetArg(al[ac], XmNset, FALSE); ac++;
+  toggle102 = XmCreateToggleButtonGadget ( rowcol102, "@color_event", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+  separator102 = XmCreateSeparator ( rowcol102, "separator102", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNwidth, 100); ac++;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+  label102 = XmCreateLabel ( rowcol102, "Event", al, ac );
+  ac = 0;
+  text102 = XmCreateTextField ( rowcol102, "color_event", al, ac );
+  }
+
+  ac=0;
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetValues ( form_,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+  XtSetArg(al[ac], XmNtopWidget, label3); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+  XtSetValues ( frame2,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+  XtSetValues ( label3,al, ac );
+  ac = 0;
+
+  XtAddCallback (toggle2, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text1, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle2;
+  children[ac++] = separator7;
+  children[ac++] = label7;
+  children[ac++] = text1;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (toggle8, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text5, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle8;
+  children[ac++] = separator8;
+  children[ac++] = label11;
+  children[ac++] = text5;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (toggle9, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text6, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle9;
+  children[ac++] = separator9;
+  children[ac++] = label12;
+  children[ac++] = text6;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (toggle10, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text7, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle10;
+  children[ac++] = separator10;
+  children[ac++] = label13;
+  children[ac++] = text7;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (toggle11, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text8, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle11;
+  children[ac++] = separator11;
+  children[ac++] = label14;
+  children[ac++] = text8;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (rowcol14, XmNtearOffMenuDeactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  XtAddCallback (toggle12, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text9, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle12;
+  children[ac++] = separator12;
+  children[ac++] = label15;
+  children[ac++] = text9;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (toggle13, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text10, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle13;
+  children[ac++] = separator13;
+  children[ac++] = label16;
+  children[ac++] = text10;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (toggle14, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text11, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle14;
+  children[ac++] = separator14;
+  children[ac++] = label17;
+  children[ac++] = text11;
+  XtManageChildren(children, ac);
+  ac = 0;
+  XtAddCallback (toggle15, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text12, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle15;
+  children[ac++] = separator15;
+  children[ac++] = label18;
+  children[ac++] = text12;
+  XtManageChildren(children, ac);
+
+  {
+  ac = 0;
+  XtAddCallback (toggle100, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text100, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle100;
+  children[ac++] = separator100;
+  children[ac++] = label100;
+  children[ac++] = text100;
+  XtManageChildren(children, ac);
+
+  ac = 0;
+  XtAddCallback (toggle101, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text101, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle101;
+  children[ac++] = separator101;
+  children[ac++] = label101;
+  children[ac++] = text101;
+  XtManageChildren(children, ac);
+
+  ac = 0;
+  XtAddCallback (toggle102, XmNvalueChangedCallback,&colors_form_c:: useCB, (XtPointer) this);
+  XtAddCallback (text102, XmNactivateCallback,&colors_form_c:: changedCB, (XtPointer) this);
+  children[ac++] = toggle102;
+  children[ac++] = separator102;
+  children[ac++] = label102;
+  children[ac++] = text102;
+  XtManageChildren(children, ac);
+
+  }
+
+  ac = 0;
+  children[ac++] = rowcol9;
+  children[ac++] = rowcol10;
+  children[ac++] = rowcol11;
+  children[ac++] = rowcol12;
+  children[ac++] = rowcol13;
+  children[ac++] = rowcol14;
+  children[ac++] = rowcol15;
+  children[ac++] = rowcol16;
+  children[ac++] = rowcol17;
+  { children[ac++] = rowcol100;
+  children[ac++] = rowcol101;
+  children[ac++] = rowcol102; }
+  XtManageChildren(children, ac);
+
+  ac = 0;
+  children[ac++] = label2;
+  children[ac++] = rowcol4;
+  XtManageChildren(children, ac);
+  ac = 0;
+  children[ac++] = frame2;
+  children[ac++] = label3;
+  XtManageChildren(children, ac);
+  ac = 0;
+  children[ac++] = form_;
+  XtManageChildren(children, ac);
+  ac = 0;
+}
+
+void colors_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+  colors_form_p instance = (colors_form_p) client_data;
+  instance->useCB ( widget, call_data );
+}
+
+void colors_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+  colors_form_p instance = (colors_form_p) client_data;
+  instance->changedCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uicolors.h b/ecflow_4_0_7/view/src/libui/uicolors.h
new file mode 100644
index 0000000..41fbc84
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uicolors.h
@@ -0,0 +1,30 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uicolors_h
+#define _uicolors_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class colors_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget colors_form;
+	Widget form_;
+public:
+	static void useCB( Widget, XtPointer, XtPointer );
+	virtual void useCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+};
+
+typedef colors_form_c *colors_form_p;
+
+
+extern colors_form_p colors_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiconfirm.cc b/ecflow_4_0_7/view/src/libui/uiconfirm.cc
new file mode 100644
index 0000000..865877a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiconfirm.cc
@@ -0,0 +1,79 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/MessageB.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushBG.h>
+#include <Xm/SeparatoG.h>
+
+
+#include "uiconfirm.h"
+
+confirm_shell_p confirm_shell = (confirm_shell_p) NULL;
+
+
+
+void confirm_shell_c::create (Widget parent, char *widget_name)
+{
+  /* Widget children[6];      // Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget button20 = (Widget)NULL;
+	Widget button21 = (Widget)NULL;
+	Widget button22 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "confirm_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	XtSetArg(al[ac], XmNtransient, TRUE); ac++;
+	confirm_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = confirm_shell;
+	XtSetArg(al[ac], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); ac++;
+	XtSetArg(al[ac], XmNdialogType, XmDIALOG_QUESTION); ac++;
+	XtSetArg(al[ac], XmNmessageAlignment, XmALIGNMENT_CENTER); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonType, XmDIALOG_CANCEL_BUTTON); ac++;
+	form_ = XmCreateMessageBox ( confirm_shell, "form_", al, ac );
+	ac = 0;
+	button20 = XmMessageBoxGetChild ( form_, XmDIALOG_CANCEL_BUTTON );
+	button21 = XmMessageBoxGetChild ( form_, XmDIALOG_HELP_BUTTON );
+	label_ = XmMessageBoxGetChild ( form_, XmDIALOG_MESSAGE_LABEL );
+	button22 = XmMessageBoxGetChild ( form_, XmDIALOG_OK_BUTTON );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetValues ( button21,al, ac );
+	ac = 0;
+	XtAddCallback (form_, XmNhelpCallback,&confirm_shell_c:: helpCB, (XtPointer) this);
+	XtAddCallback (form_, XmNcancelCallback,&confirm_shell_c:: cancelCB, (XtPointer) this);
+	XtAddCallback (form_, XmNokCallback,&confirm_shell_c:: okCB, (XtPointer) this);
+}
+
+void confirm_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	confirm_shell_p instance = (confirm_shell_p) client_data;
+	instance->helpCB ( widget, call_data );
+}
+
+void confirm_shell_c::cancelCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	confirm_shell_p instance = (confirm_shell_p) client_data;
+	instance->cancelCB ( widget, call_data );
+}
+
+void confirm_shell_c::okCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	confirm_shell_p instance = (confirm_shell_p) client_data;
+	instance->okCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiconfirm.h b/ecflow_4_0_7/view/src/libui/uiconfirm.h
new file mode 100644
index 0000000..3db6a3d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiconfirm.h
@@ -0,0 +1,33 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiconfirm_h
+#define _uiconfirm_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class confirm_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget confirm_shell;
+	Widget form_;
+	Widget label_;
+public:
+	static void helpCB( Widget, XtPointer, XtPointer );
+	virtual void helpCB( Widget, XtPointer ) = 0;
+	static void cancelCB( Widget, XtPointer, XtPointer );
+	virtual void cancelCB( Widget, XtPointer ) = 0;
+	static void okCB( Widget, XtPointer, XtPointer );
+	virtual void okCB( Widget, XtPointer ) = 0;
+};
+
+typedef confirm_shell_c *confirm_shell_p;
+
+
+extern confirm_shell_p confirm_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uidepend.cc b/ecflow_4_0_7/view/src/libui/uidepend.cc
new file mode 100644
index 0000000..dec4d78
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uidepend.cc
@@ -0,0 +1,122 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawnB.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/ScrolledW.h>
+#include <Xm/Protocols.h>  
+#include "flags.h"
+
+
+extern "C" {
+#include "Hyper.h"
+#define XmCreateDrawnButton CreateHyper
+}
+
+#include "uidepend.h"
+
+depend_shell_p depend_shell = (depend_shell_p) NULL;
+
+
+
+void depend_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget scrolledWin1 = (Widget)NULL;
+	Widget scrollbar1 = (Widget)NULL;
+	Widget scrollbar2 = (Widget)NULL;
+	Widget children[2];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+
+	if ( !widget_name )
+	  widget_name = (char*) "depend_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	depend_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = depend_shell;
+	XmAddWMProtocolCallback( depend_shell, XmInternAtom(XtDisplay(depend_shell), (char*)"WM_DELETE_WINDOW", False),&depend_shell_c:: closeCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNresizePolicy, XmRESIZE_ANY); ac++;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( depend_shell, (char*) "form_", al, ac );
+
+	XtSetArg(al[ac], XmNscrollingPolicy, XmAUTOMATIC); ac++;
+	scrolledWin1 = XmCreateScrolledWindow ( form_, "scrolledWin1", al, ac );
+
+	ac = 0;
+	button_close = XmCreatePushButton ( form_, (char *) "button_close", al, ac );
+	hyper_ = XmCreateDrawnButton ( scrolledWin1, (char*) "hyper_", al, ac );
+	XtSetArg(al[ac], XmNcancelButton, button_close); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 30); ac++; // editres
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+	XtSetValues ( hyper_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 30); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+	XtSetValues ( scrolledWin1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+	XtSetValues ( button_close,al, ac );
+	ac = 0;
+
+	XmScrolledWindowSetAreas(scrolledWin1, scrollbar1, scrollbar2, hyper_ );
+	XtAddCallback (button_close, XmNactivateCallback,&depend_shell_c:: closeCB, (XtPointer) this);
+	XtAddCallback (hyper_, XmNactivateCallback,&depend_shell_c:: hyperCB, (XtPointer) this);
+	ac = 0;
+	children[ac++] = button_close;
+	children[ac++] = scrolledWin1;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	children[ac++] = hyper_;
+	XtManageChildren(children, ac);
+}
+
+void depend_shell_c::hyperCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	depend_shell_p instance = (depend_shell_p) client_data;
+	instance->hyperCB ( widget, call_data );
+}
+
+void depend_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	depend_shell_p instance = (depend_shell_p) client_data;
+	instance->closeCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uidepend.h b/ecflow_4_0_7/view/src/libui/uidepend.h
new file mode 100644
index 0000000..0efd6d7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uidepend.h
@@ -0,0 +1,32 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uidepend_h
+#define _uidepend_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class depend_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget depend_shell;
+	Widget form_;
+	Widget button_close;
+	Widget hyper_;
+public:
+	static void hyperCB( Widget, XtPointer, XtPointer );
+	virtual void hyperCB( Widget, XtPointer ) = 0;
+	static void closeCB( Widget, XtPointer, XtPointer );
+	virtual void closeCB( Widget, XtPointer ) = 0;
+};
+
+typedef depend_shell_c *depend_shell_p;
+
+
+extern depend_shell_p depend_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiedit.cc b/ecflow_4_0_7/view/src/libui/uiedit.cc
new file mode 100644
index 0000000..9604ff5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit.cc
@@ -0,0 +1,160 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+
+
+#include "uiedit.h"
+
+edit_p edit_form = (edit_p) NULL;
+
+
+
+void edit_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[4];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form1 = (Widget)NULL;
+	Widget scrolledText5 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget drawingArea1 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "edit_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	edit_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = edit_form;
+	form1 = XmCreateForm ( edit_form, "form1", al, ac );
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( form1, "text_", al, ac );
+	ac = 0;
+	scrolledText5 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( form1, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	external_ = XmCreatePushButton ( tools_, "Use external editor", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Search", al, ac );
+	drawingArea1 = XmCreateDrawingArea ( tools_, "drawingArea1", al, ac );
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button1 = XmCreatePushButton ( tools_, "Submit", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools2_ = XmCreateRowColumn ( form1, "tools2_", al, ac );
+	ac = 0;
+	alias_ = XmCreateToggleButton ( tools2_, "alias_", al, ac );
+	preprocess_ = XmCreateToggleButton ( tools2_, "preprocess_", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools2_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledText5,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, tools_); ac++;
+	XtSetValues ( tools2_,al, ac );
+	ac = 0;
+	XtAddCallback (text_, XmNvalueChangedCallback,&edit_form_c:: changedCB, (XtPointer) this);
+	XtManageChild(text_);
+	XtAddCallback (external_, XmNactivateCallback,&edit_form_c:: externalCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&edit_form_c:: searchCB, (XtPointer) this);
+	XtAddCallback (button1, XmNactivateCallback,&edit_form_c:: submitCB, (XtPointer) this);
+	children[ac++] = external_;
+	children[ac++] = button3;
+	children[ac++] = drawingArea1;
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (preprocess_, XmNvalueChangedCallback,&edit_form_c:: preprocCB, (XtPointer) this);
+	children[ac++] = alias_;
+	children[ac++] = preprocess_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	children[ac++] = tools2_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void edit_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_form_p instance = (edit_form_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
+void edit_form_c::preprocCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_form_p instance = (edit_form_p) client_data;
+	instance->preprocCB ( widget, call_data );
+}
+
+void edit_form_c::submitCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_form_p instance = (edit_form_p) client_data;
+	instance->submitCB ( widget, call_data );
+}
+
+void edit_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_form_p instance = (edit_form_p) client_data;
+	instance->externalCB ( widget, call_data );
+}
+
+void edit_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_form_p instance = (edit_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiedit.h b/ecflow_4_0_7/view/src/libui/uiedit.h
new file mode 100644
index 0000000..b9bf9fd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit.h
@@ -0,0 +1,43 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiedit_h
+#define _uiedit_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class edit_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget edit_form;
+	Widget text_;
+	Widget tools_;
+	Widget external_;
+	Widget tools2_;
+	Widget alias_;
+	Widget preprocess_;
+public:
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+	static void preprocCB( Widget, XtPointer, XtPointer );
+	virtual void preprocCB( Widget, XtPointer ) = 0;
+	static void submitCB( Widget, XtPointer, XtPointer );
+	virtual void submitCB( Widget, XtPointer ) = 0;
+	static void externalCB( Widget, XtPointer, XtPointer );
+	virtual void externalCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+};
+
+typedef edit_form_c *edit_form_p;
+class edit;
+typedef edit *edit_p;
+
+
+extern edit_p edit_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_label.cc b/ecflow_4_0_7/view/src/libui/uiedit_label.cc
new file mode 100644
index 0000000..75be6f9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_label.cc
@@ -0,0 +1,139 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+
+
+#include "uiedit_label.h"
+
+edit_label_p edit_label_form = (edit_label_p) NULL;
+
+
+
+void edit_label_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget button1 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget frame1 = (Widget)NULL;
+	Widget scrolledText1 = (Widget)NULL;
+	Widget label1 = (Widget)NULL;
+	Widget frame2 = (Widget)NULL;
+	Widget scrolledText2 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "edit_label_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	edit_label_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = edit_label_form;
+	tools_ = XmCreateRowColumn ( edit_label_form, "tools_", al, ac );
+	button1 = XmCreatePushButton ( tools_, "Apply", al, ac );
+	form1 = XmCreateForm ( edit_label_form, "form1", al, ac );
+	frame1 = XmCreateFrame ( form1, "frame1", al, ac );
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	value_ = XmCreateScrolledText ( frame1, "value_", al, ac );
+	ac = 0;
+	scrolledText1 = XtParent ( value_ );
+
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	label1 = XmCreateLabel ( frame1, "Value:", al, ac );
+	ac = 0;
+	frame2 = XmCreateFrame ( form1, "frame2", al, ac );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	default_ = XmCreateScrolledText ( frame2, "default_", al, ac );
+	ac = 0;
+	scrolledText2 = XtParent ( default_ );
+
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	label2 = XmCreateLabel ( frame2, "Default:", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+	XtAddCallback (button1, XmNactivateCallback,&edit_label_form_c:: applyCB, (XtPointer) this);
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNbottomPosition, 50); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( frame1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNtopPosition, 50); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( frame2,al, ac );
+	ac = 0;
+	XtAddCallback (value_, XmNvalueChangedCallback,&edit_label_form_c:: changedCB, (XtPointer) this);
+	XtManageChild(value_);
+	children[ac++] = label1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (default_, XmNvalueChangedCallback,&edit_label_form_c:: changedCB, (XtPointer) this);
+	XtManageChild(default_);
+	children[ac++] = label2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = frame1;
+	children[ac++] = frame2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void edit_label_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_label_form_p instance = (edit_label_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
+void edit_label_form_c::applyCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_label_form_p instance = (edit_label_form_p) client_data;
+	instance->applyCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_label.h b/ecflow_4_0_7/view/src/libui/uiedit_label.h
new file mode 100644
index 0000000..10466e3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_label.h
@@ -0,0 +1,34 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiedit_label_h
+#define _uiedit_label_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class edit_label_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget edit_label_form;
+	Widget tools_;
+	Widget value_;
+	Widget default_;
+public:
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+	static void applyCB( Widget, XtPointer, XtPointer );
+	virtual void applyCB( Widget, XtPointer ) = 0;
+};
+
+typedef edit_label_form_c *edit_label_form_p;
+class edit_label;
+typedef edit_label *edit_label_p;
+
+
+extern edit_label_p edit_label_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_limit.cc b/ecflow_4_0_7/view/src/libui/uiedit_limit.cc
new file mode 100644
index 0000000..85be999
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_limit.cc
@@ -0,0 +1,139 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/TextF.h>
+
+
+#include "uiedit_limit.h"
+
+edit_limit_p edit_limit_form = (edit_limit_p) NULL;
+
+
+
+void edit_limit_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[4];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget rowcol1 = (Widget)NULL;
+	Widget label3 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+	Widget scrolledList1 = (Widget)NULL;
+	Widget rowcol2 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "edit_limit_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	edit_limit_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = edit_limit_form;
+	XtSetArg(al[ac], XmNnumColumns, 2); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	rowcol1 = XmCreateRowColumn ( edit_limit_form, "rowcol1", al, ac );
+	ac = 0;
+	label3 = XmCreateLabel ( rowcol1, "Maximum", al, ac );
+	max_ = XmCreateTextField ( rowcol1, "max_", al, ac );
+	tools_ = XmCreateRowColumn ( edit_limit_form, "tools_", al, ac );
+	button1 = XmCreatePushButton ( tools_, "Apply", al, ac );
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( edit_limit_form, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+	rowcol2 = XmCreateRowColumn ( edit_limit_form, "rowcol2", al, ac );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	remove_ = XmCreatePushButton ( rowcol2, "Remove", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( rowcol1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, rowcol1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, rowcol2); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, rowcol1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( rowcol2,al, ac );
+	ac = 0;
+	XtAddCallback (max_, XmNvalueChangedCallback,&edit_limit_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = label3;
+	children[ac++] = max_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (button1, XmNactivateCallback,&edit_limit_form_c:: applyCB, (XtPointer) this);
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&edit_limit_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+	XtAddCallback (remove_, XmNactivateCallback,&edit_limit_form_c:: removeCB, (XtPointer) this);
+	children[ac++] = remove_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = rowcol1;
+	children[ac++] = tools_;
+	children[ac++] = rowcol2;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void edit_limit_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_limit_form_p instance = (edit_limit_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
+void edit_limit_form_c::removeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_limit_form_p instance = (edit_limit_form_p) client_data;
+	instance->removeCB ( widget, call_data );
+}
+
+void edit_limit_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_limit_form_p instance = (edit_limit_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
+void edit_limit_form_c::applyCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_limit_form_p instance = (edit_limit_form_p) client_data;
+	instance->applyCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_limit.h b/ecflow_4_0_7/view/src/libui/uiedit_limit.h
new file mode 100644
index 0000000..0f25676
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_limit.h
@@ -0,0 +1,39 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiedit_limit_h
+#define _uiedit_limit_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class edit_limit_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget edit_limit_form;
+	Widget max_;
+	Widget tools_;
+	Widget list_;
+	Widget remove_;
+public:
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+	static void removeCB( Widget, XtPointer, XtPointer );
+	virtual void removeCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+	static void applyCB( Widget, XtPointer, XtPointer );
+	virtual void applyCB( Widget, XtPointer ) = 0;
+};
+
+typedef edit_limit_form_c *edit_limit_form_p;
+class edit_limit;
+typedef edit_limit *edit_limit_p;
+
+
+extern edit_limit_p edit_limit_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_meter.cc b/ecflow_4_0_7/view/src/libui/uiedit_meter.cc
new file mode 100644
index 0000000..73175c1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_meter.cc
@@ -0,0 +1,117 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/TextF.h>
+
+
+#include "uiedit_meter.h"
+
+edit_meter_p edit_meter_form = (edit_meter_p) NULL;
+
+
+
+void edit_meter_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[8];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget rowcol1 = (Widget)NULL;
+	Widget label1 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+	Widget label3 = (Widget)NULL;
+	Widget label4 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "edit_meter_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	edit_meter_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = edit_meter_form;
+	XtSetArg(al[ac], XmNnumColumns, 2); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	rowcol1 = XmCreateRowColumn ( edit_meter_form, "rowcol1", al, ac );
+	ac = 0;
+	label1 = XmCreateLabel ( rowcol1, "Minimum", al, ac );
+	label2 = XmCreateLabel ( rowcol1, "Value", al, ac );
+	label3 = XmCreateLabel ( rowcol1, "Maximum", al, ac );
+	label4 = XmCreateLabel ( rowcol1, "Threshold", al, ac );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	min_ = XmCreateTextField ( rowcol1, "min_", al, ac );
+	ac = 0;
+	value_ = XmCreateTextField ( rowcol1, "value_", al, ac );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	max_ = XmCreateTextField ( rowcol1, "max_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	threshold_ = XmCreateTextField ( rowcol1, "threshold_", al, ac );
+	ac = 0;
+	tools_ = XmCreateRowColumn ( edit_meter_form, "tools_", al, ac );
+	button1 = XmCreatePushButton ( tools_, "Apply", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( rowcol1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtAddCallback (min_, XmNvalueChangedCallback,&edit_meter_form_c:: changedCB, (XtPointer) this);
+	XtAddCallback (value_, XmNvalueChangedCallback,&edit_meter_form_c:: changedCB, (XtPointer) this);
+	XtAddCallback (max_, XmNvalueChangedCallback,&edit_meter_form_c:: changedCB, (XtPointer) this);
+	XtAddCallback (threshold_, XmNvalueChangedCallback,&edit_meter_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = label1;
+	children[ac++] = label2;
+	children[ac++] = label3;
+	children[ac++] = label4;
+	children[ac++] = min_;
+	children[ac++] = value_;
+	children[ac++] = max_;
+	children[ac++] = threshold_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (button1, XmNactivateCallback,&edit_meter_form_c:: applyCB, (XtPointer) this);
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = rowcol1;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void edit_meter_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_meter_form_p instance = (edit_meter_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
+void edit_meter_form_c::applyCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_meter_form_p instance = (edit_meter_form_p) client_data;
+	instance->applyCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_meter.h b/ecflow_4_0_7/view/src/libui/uiedit_meter.h
new file mode 100644
index 0000000..5512439
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_meter.h
@@ -0,0 +1,36 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiedit_meter_h
+#define _uiedit_meter_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class edit_meter_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget edit_meter_form;
+	Widget min_;
+	Widget value_;
+	Widget max_;
+	Widget threshold_;
+	Widget tools_;
+public:
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+	static void applyCB( Widget, XtPointer, XtPointer );
+	virtual void applyCB( Widget, XtPointer ) = 0;
+};
+
+typedef edit_meter_form_c *edit_meter_form_p;
+class edit_meter;
+typedef edit_meter *edit_meter_p;
+
+
+extern edit_meter_p edit_meter_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_repeat.cc b/ecflow_4_0_7/view/src/libui/uiedit_repeat.cc
new file mode 100644
index 0000000..775ef1a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_repeat.cc
@@ -0,0 +1,126 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/TextF.h>
+
+
+#include "uiedit_repeat.h"
+
+edit_repeat_p edit_repeat_form = (edit_repeat_p) NULL;
+
+
+
+void edit_repeat_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget button1 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "edit_repeat_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	edit_repeat_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = edit_repeat_form;
+	tools_ = XmCreateRowColumn ( edit_repeat_form, "tools_", al, ac );
+	button1 = XmCreatePushButton ( tools_, "Apply", al, ac );
+	form1 = XmCreateForm ( edit_repeat_form, "form1", al, ac );
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form1, "list_", al, ac );
+	ac = 0;
+	show_list_ = XtParent ( list_ );
+
+	show_text_ = XmCreateForm ( form1, "show_text_", al, ac );
+	text_ = XmCreateTextField ( show_text_, "text_", al, ac );
+	label_ = XmCreateLabel ( show_text_, "label_", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+	XtAddCallback (button1, XmNactivateCallback,&edit_repeat_form_c:: applyCB, (XtPointer) this);
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( show_list_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( show_text_,al, ac );
+	ac = 0;
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&edit_repeat_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, label_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( text_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( label_,al, ac );
+	ac = 0;
+	children[ac++] = text_;
+	children[ac++] = label_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void edit_repeat_form_c::applyCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_repeat_form_p instance = (edit_repeat_form_p) client_data;
+	instance->applyCB ( widget, call_data );
+}
+
+void edit_repeat_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_repeat_form_p instance = (edit_repeat_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_repeat.h b/ecflow_4_0_7/view/src/libui/uiedit_repeat.h
new file mode 100644
index 0000000..75e182f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_repeat.h
@@ -0,0 +1,37 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiedit_repeat_h
+#define _uiedit_repeat_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class edit_repeat_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget edit_repeat_form;
+	Widget tools_;
+	Widget show_list_;
+	Widget list_;
+	Widget show_text_;
+	Widget text_;
+	Widget label_;
+public:
+	static void applyCB( Widget, XtPointer, XtPointer );
+	virtual void applyCB( Widget, XtPointer ) = 0;
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+};
+
+typedef edit_repeat_form_c *edit_repeat_form_p;
+class edit_repeat;
+typedef edit_repeat *edit_repeat_p;
+
+
+extern edit_repeat_p edit_repeat_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_variable.cc b/ecflow_4_0_7/view/src/libui/uiedit_variable.cc
new file mode 100644
index 0000000..1941488
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_variable.cc
@@ -0,0 +1,110 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/TextF.h>
+
+
+#include "uiedit_variable.h"
+
+edit_variable_p edit_variable_form = (edit_variable_p) NULL;
+
+
+
+void edit_variable_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[2];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget button1 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "edit_variable_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	edit_variable_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = edit_variable_form;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( edit_variable_form, "tools_", al, ac );
+	ac = 0;
+	button1 = XmCreatePushButton ( tools_, "Apply", al, ac );
+	form1 = XmCreateForm ( edit_variable_form, "form1", al, ac );
+	name_ = XmCreateLabel ( form1, "name", al, ac );
+	value_ = XmCreateTextField ( form1, "value", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+	XtAddCallback (button1, XmNactivateCallback,&edit_variable_form_c:: applyCB, (XtPointer) this);
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 2); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 2); ac++;
+	XtSetValues ( name_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 2); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 2); ac++;
+	XtSetArg(al[ac], XmNleftWidget, name_); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 2); ac++;
+	XtSetValues ( value_,al, ac );
+	ac = 0;
+	XtAddCallback (value_, XmNvalueChangedCallback,&edit_variable_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = name_;
+	children[ac++] = value_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void edit_variable_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_variable_form_p instance = (edit_variable_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
+void edit_variable_form_c::applyCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	edit_variable_form_p instance = (edit_variable_form_p) client_data;
+	instance->applyCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiedit_variable.h b/ecflow_4_0_7/view/src/libui/uiedit_variable.h
new file mode 100644
index 0000000..8013d00
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiedit_variable.h
@@ -0,0 +1,34 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiedit_variable_h
+#define _uiedit_variable_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class edit_variable_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget edit_variable_form;
+	Widget tools_;
+	Widget name_;
+	Widget value_;
+public:
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+	static void applyCB( Widget, XtPointer, XtPointer );
+	virtual void applyCB( Widget, XtPointer ) = 0;
+};
+
+typedef edit_variable_form_c *edit_variable_form_p;
+class edit_variable;
+typedef edit_variable *edit_variable_p;
+
+
+extern edit_variable_p edit_variable_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uierror.cc b/ecflow_4_0_7/view/src/libui/uierror.cc
new file mode 100644
index 0000000..c7af749
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uierror.cc
@@ -0,0 +1,72 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/MessageB.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushBG.h>
+#include <Xm/SeparatoG.h>
+
+
+#include "uierror.h"
+
+error_shell_p error_shell = (error_shell_p) NULL;
+
+
+
+void error_shell_c::create (Widget parent, char *widget_name)
+{
+  /* Widget children[6];      // Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget button28 = (Widget)NULL;
+	Widget button30 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "error_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	XtSetArg(al[ac], XmNtransient, TRUE); ac++;
+	error_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = error_shell;
+	XtSetArg(al[ac], XmNdialogType, XmDIALOG_ERROR); ac++;
+	form_ = XmCreateMessageBox ( error_shell, "form_", al, ac );
+	ac = 0;
+	button28 = XmMessageBoxGetChild ( form_, XmDIALOG_CANCEL_BUTTON );
+	label_ = XmMessageBoxGetChild ( form_, XmDIALOG_MESSAGE_LABEL );
+	button30 = XmMessageBoxGetChild ( form_, XmDIALOG_OK_BUTTON );
+	XtAddCallback (form_, XmNokCallback,&error_shell_c:: okCB, (XtPointer) this);
+	XtAddCallback (form_, XmNcancelCallback,&error_shell_c:: cancelCB, (XtPointer) this);
+	XtAddCallback (form_, XmNhelpCallback,&error_shell_c:: helpCB, (XtPointer) this);
+	XtUnmanageChild ( button28 );
+}
+
+void error_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	error_shell_p instance = (error_shell_p) client_data;
+	instance->helpCB ( widget, call_data );
+}
+
+void error_shell_c::cancelCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	error_shell_p instance = (error_shell_p) client_data;
+	instance->cancelCB ( widget, call_data );
+}
+
+void error_shell_c::okCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	error_shell_p instance = (error_shell_p) client_data;
+	instance->okCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uierror.h b/ecflow_4_0_7/view/src/libui/uierror.h
new file mode 100644
index 0000000..48a228e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uierror.h
@@ -0,0 +1,33 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uierror_h
+#define _uierror_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class error_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget error_shell;
+	Widget form_;
+	Widget label_;
+public:
+	static void helpCB( Widget, XtPointer, XtPointer );
+	virtual void helpCB( Widget, XtPointer ) = 0;
+	static void cancelCB( Widget, XtPointer, XtPointer );
+	virtual void cancelCB( Widget, XtPointer ) = 0;
+	static void okCB( Widget, XtPointer, XtPointer );
+	virtual void okCB( Widget, XtPointer ) = 0;
+};
+
+typedef error_shell_c *error_shell_p;
+
+
+extern error_shell_p error_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uifind.cc b/ecflow_4_0_7/view/src/libui/uifind.cc
new file mode 100644
index 0000000..28bfa6c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uifind.cc
@@ -0,0 +1,229 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/CascadeB.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+#include <Xm/ToggleB.h>
+
+#include <Xm/Protocols.h>  
+#include "flags.h"
+#include "uifind.h"
+
+find_shell_p find_shell = (find_shell_p) NULL;
+
+
+
+void find_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[8];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget drawingArea2 = (Widget)NULL;
+	Widget rowcol1 = (Widget)NULL;
+	Widget menuBar1 = (Widget)NULL;
+	Widget separator1 = (Widget)NULL;
+	Widget drawingArea1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "find_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	find_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = find_shell;
+	XmAddWMProtocolCallback( find_shell, XmInternAtom(XtDisplay(find_shell), "WM_DELETE_WINDOW", False),&find_shell_c:: closeCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNresizePolicy, XmRESIZE_ANY); ac++;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( find_shell, "form_", al, ac );
+	ac = 0;
+	button_find = XmCreatePushButton ( form_, "button_find", al, ac );
+	button_close = XmCreatePushButton ( form_, "button_close", al, ac );
+	drawingArea2 = XmCreateDrawingArea ( form_, "drawingArea2", al, ac );
+	find_text_ = XmCreateTextField ( form_, "find_text_", al, ac );
+	message_ = XmCreateLabel ( form_, "find_message", al, ac );
+	XtSetArg(al[ac], XmNnumColumns, 2); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	rowcol1 = XmCreateRowColumn ( form_, "rowcol1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	case_ = XmCreateToggleButton ( rowcol1, "Case sensitive", al, ac );
+	ac = 0;
+	back_ = XmCreateToggleButton ( rowcol1, "Backwards", al, ac );
+	regexp_ = XmCreateToggleButton ( rowcol1, "Regular expression", al, ac );
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	wrap_ = XmCreateToggleButton ( rowcol1, "Wrap around", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNshadowThickness, 1); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	menuBar1 = XmCreateMenuBar ( form_, "menuBar1", al, ac );
+	ac = 0;
+	quick_find_ = XmCreateCascadeButton ( menuBar1, "quick_find_", al, ac );
+	quick_menu_ = XmCreatePulldownMenu ( menuBar1, "quick_menu_", al, ac );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	edit_ = XmCreatePushButton ( quick_menu_, "Edit...", al, ac );
+	ac = 0;
+	separator1 = XmCreateSeparator ( quick_menu_, "separator1", al, ac );
+	drawingArea1 = XmCreateDrawingArea ( form_, "drawingArea1", al, ac );
+	XtSetArg(al[ac], XmNcancelButton, button_close); ac++;
+	XtSetArg(al[ac], XmNdefaultButton, button_find); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 3); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( button_find,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 3); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( button_close,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 3); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNleftWidget, button_close); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightWidget, button_find); ac++;
+	XtSetValues ( drawingArea2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, message_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightWidget, menuBar1); ac++;
+	XtSetValues ( find_text_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 2); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 2); ac++;
+	XtSetValues ( message_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, find_text_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 2); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 2); ac++;
+	XtSetValues ( rowcol1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, message_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( menuBar1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, rowcol1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 2); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, button_close); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 148); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( drawingArea1,al, ac );
+	ac = 0;
+	XtAddCallback (button_find, XmNactivateCallback,&find_shell_c:: findCB, (XtPointer) this);
+	XtAddCallback (button_close, XmNactivateCallback,&find_shell_c:: closeCB, (XtPointer) this);
+	XtAddCallback (regexp_, XmNvalueChangedCallback,&find_shell_c:: regexCB, (XtPointer) this);
+	children[ac++] = case_;
+	children[ac++] = back_;
+	children[ac++] = regexp_;
+	children[ac++] = wrap_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (quick_menu_, XmNentryCallback,&find_shell_c:: entryCB, (XtPointer) this);
+	children[ac++] = edit_;
+	children[ac++] = separator1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, quick_menu_); ac++;
+	XtSetValues ( quick_find_, al, ac );
+	ac = 0;
+	children[ac++] = quick_find_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = button_find;
+	children[ac++] = button_close;
+	children[ac++] = drawingArea2;
+	children[ac++] = find_text_;
+	children[ac++] = rowcol1;
+	children[ac++] = menuBar1;
+	children[ac++] = drawingArea1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void find_shell_c::entryCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	find_shell_p instance = (find_shell_p) client_data;
+	instance->entryCB ( widget, call_data );
+}
+
+void find_shell_c::regexCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	find_shell_p instance = (find_shell_p) client_data;
+	instance->regexCB ( widget, call_data );
+}
+
+void find_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	find_shell_p instance = (find_shell_p) client_data;
+	instance->closeCB ( widget, call_data );
+}
+
+void find_shell_c::findCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	find_shell_p instance = (find_shell_p) client_data;
+	instance->findCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uifind.h b/ecflow_4_0_7/view/src/libui/uifind.h
new file mode 100644
index 0000000..08eb1dc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uifind.h
@@ -0,0 +1,45 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uifind_h
+#define _uifind_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class find_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget find_shell;
+	Widget form_;
+	Widget button_find;
+	Widget button_close;
+	Widget find_text_;
+	Widget message_;
+	Widget case_;
+	Widget back_;
+	Widget regexp_;
+	Widget wrap_;
+	Widget quick_find_;
+	Widget quick_menu_;
+	Widget edit_;
+public:
+	static void entryCB( Widget, XtPointer, XtPointer );
+	virtual void entryCB( Widget, XtPointer ) = 0;
+	static void regexCB( Widget, XtPointer, XtPointer );
+	virtual void regexCB( Widget, XtPointer ) = 0;
+	static void closeCB( Widget, XtPointer, XtPointer );
+	virtual void closeCB( Widget, XtPointer ) = 0;
+	static void findCB( Widget, XtPointer, XtPointer );
+	virtual void findCB( Widget, XtPointer ) = 0;
+};
+
+typedef find_shell_c *find_shell_p;
+
+
+extern find_shell_p find_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uifonts.cc b/ecflow_4_0_7/view/src/libui/uifonts.cc
new file mode 100644
index 0000000..74f0783
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uifonts.cc
@@ -0,0 +1,421 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/Label.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+#include <Xm/LabelG.h>
+#include <Xm/ToggleBG.h>
+
+
+#include "uifonts.h"
+
+fonts_form_p fonts_form = (fonts_form_p) NULL;
+
+
+
+void fonts_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[4];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget frame2 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget form2 = (Widget)NULL;
+	Widget toggle2 = (Widget)NULL;
+	Widget separator7 = (Widget)NULL;
+	Widget label7 = (Widget)NULL;
+	Widget text1 = (Widget)NULL;
+	Widget form3 = (Widget)NULL;
+	Widget toggle8 = (Widget)NULL;
+	Widget separator8 = (Widget)NULL;
+	Widget label11 = (Widget)NULL;
+	Widget text5 = (Widget)NULL;
+	Widget form4 = (Widget)NULL;
+	Widget toggle9 = (Widget)NULL;
+	Widget separator9 = (Widget)NULL;
+	Widget label12 = (Widget)NULL;
+	Widget text6 = (Widget)NULL;
+	Widget form5 = (Widget)NULL;
+	Widget toggle10 = (Widget)NULL;
+	Widget separator10 = (Widget)NULL;
+	Widget label13 = (Widget)NULL;
+	Widget text7 = (Widget)NULL;
+	Widget label3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "Fonts";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	fonts_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = fonts_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( fonts_form, "form_", al, ac );
+	ac = 0;
+	frame2 = XmCreateFrame ( form_, "frame2", al, ac );
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	label2 = XmCreateLabel ( frame2, "Fonts", al, ac );
+	ac = 0;
+	form1 = XmCreateForm ( frame2, "form1", al, ac );
+	form2 = XmCreateForm ( form1, "form2", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle2 = XmCreateToggleButtonGadget ( form2, "@normal_font_plain", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator7 = XmCreateSeparator ( form2, "separator7", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNwidth, 100); ac++;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+	XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+	label7 = XmCreateLabel ( form2, "Normal font, plain", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNcolumns, 40); ac++;
+	text1 = XmCreateTextField ( form2, "normal_font_plain", al, ac );
+	ac = 0;
+	form3 = XmCreateForm ( form1, "form3", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle8 = XmCreateToggleButtonGadget ( form3, "@normal_font_bold", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator8 = XmCreateSeparator ( form3, "separator8", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNwidth, 100); ac++;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+	XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+	label11 = XmCreateLabel ( form3, "Normal font, bold", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNcolumns, 40); ac++;
+	text5 = XmCreateTextField ( form3, "normal_font_bold", al, ac );
+	ac = 0;
+	form4 = XmCreateForm ( form1, "form4", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle9 = XmCreateToggleButtonGadget ( form4, "@small_font_plain", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator9 = XmCreateSeparator ( form4, "separator9", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNwidth, 100); ac++;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+	XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+	label12 = XmCreateLabel ( form4, "Small font, plain", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNcolumns, 40); ac++;
+	text6 = XmCreateTextField ( form4, "small_font_plain", al, ac );
+	ac = 0;
+	form5 = XmCreateForm ( form1, "form5", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle10 = XmCreateToggleButtonGadget ( form5, "@small_font_bold", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator10 = XmCreateSeparator ( form5, "separator10", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNwidth, 100); ac++;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+	XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++;
+	label13 = XmCreateLabel ( form5, "Small font, bold", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNcolumns, 40); ac++;
+	text7 = XmCreateTextField ( form5, "small_font_bold", al, ac );
+	ac = 0;
+	label3 = XmCreateLabelGadget ( form_, "warn", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNtopWidget, label3); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( frame2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( label3,al, ac );
+	ac = 0;
+
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( form2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form2); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( form3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form3); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( form4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( form5,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( toggle2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle2); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator7,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator7); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( label7,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftWidget, label7); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( text1,al, ac );
+	ac = 0;
+	XtAddCallback (toggle2, XmNvalueChangedCallback,&fonts_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (text1, XmNactivateCallback,&fonts_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle2;
+	children[ac++] = separator7;
+	children[ac++] = label7;
+	children[ac++] = text1;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle8,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle8); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator8,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator8); ac++;
+	XtSetValues ( label11,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftWidget, label11); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( text5,al, ac );
+	ac = 0;
+	XtAddCallback (toggle8, XmNvalueChangedCallback,&fonts_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (text5, XmNactivateCallback,&fonts_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle8;
+	children[ac++] = separator8;
+	children[ac++] = label11;
+	children[ac++] = text5;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle9,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle9); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator9,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator9); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( label12,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftWidget, label12); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( text6,al, ac );
+	ac = 0;
+	XtAddCallback (toggle9, XmNvalueChangedCallback,&fonts_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (text6, XmNactivateCallback,&fonts_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle9;
+	children[ac++] = separator9;
+	children[ac++] = label12;
+	children[ac++] = text6;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetValues ( toggle10,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle10); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator10,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator10); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( label13,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftWidget, label13); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( text7,al, ac );
+	ac = 0;
+	XtAddCallback (toggle10, XmNvalueChangedCallback,&fonts_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (text7, XmNactivateCallback,&fonts_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle10;
+	children[ac++] = separator10;
+	children[ac++] = label13;
+	children[ac++] = text7;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form2;
+	children[ac++] = form3;
+	children[ac++] = form4;
+	children[ac++] = form5;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = label2;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = frame2;
+	children[ac++] = label3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void fonts_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	fonts_form_p instance = (fonts_form_p) client_data;
+	instance->useCB ( widget, call_data );
+}
+
+void fonts_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	fonts_form_p instance = (fonts_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uifonts.h b/ecflow_4_0_7/view/src/libui/uifonts.h
new file mode 100644
index 0000000..aec8b9d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uifonts.h
@@ -0,0 +1,30 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uifonts_h
+#define _uifonts_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class fonts_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget fonts_form;
+	Widget form_;
+public:
+	static void useCB( Widget, XtPointer, XtPointer );
+	virtual void useCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+};
+
+typedef fonts_form_c *fonts_form_p;
+
+
+extern fonts_form_p fonts_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uifsb.cc b/ecflow_4_0_7/view/src/libui/uifsb.cc
new file mode 100644
index 0000000..8942ff7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uifsb.cc
@@ -0,0 +1,80 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/FileSB.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/SelectioB.h>
+#include <Xm/TextF.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushBG.h>
+#include <Xm/SeparatoG.h>
+
+
+#include "uifsb.h"
+
+fsb_shell_p fsb_shell = (fsb_shell_p) NULL;
+
+
+
+void fsb_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[14];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget button42 = (Widget)NULL;
+	Widget button44 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "fsb_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	fsb_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = fsb_shell;
+	XtSetArg(al[ac], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); ac++;
+	form_ = XmCreateFileSelectionBox ( fsb_shell, "form_", al, ac );
+	ac = 0;
+	button42 = XmSelectionBoxGetChild ( form_, XmDIALOG_CANCEL_BUTTON );
+	button44 = XmSelectionBoxGetChild ( form_, XmDIALOG_OK_BUTTON );
+
+
+	label_ = XmCreateLabel ( form_, "label_", al, ac );
+	XtAddCallback (form_, XmNokCallback,&fsb_shell_c:: okCB, (XtPointer) this);
+	XtAddCallback (form_, XmNcancelCallback,&fsb_shell_c:: cancelCB, (XtPointer) this);
+	XtAddCallback (form_, XmNhelpCallback,&fsb_shell_c:: helpCB, (XtPointer) this);
+	children[ac++] = label_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void fsb_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	fsb_shell_p instance = (fsb_shell_p) client_data;
+	instance->helpCB ( widget, call_data );
+}
+
+void fsb_shell_c::cancelCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	fsb_shell_p instance = (fsb_shell_p) client_data;
+	instance->cancelCB ( widget, call_data );
+}
+
+void fsb_shell_c::okCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	fsb_shell_p instance = (fsb_shell_p) client_data;
+	instance->okCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uifsb.h b/ecflow_4_0_7/view/src/libui/uifsb.h
new file mode 100644
index 0000000..fac96b0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uifsb.h
@@ -0,0 +1,33 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uifsb_h
+#define _uifsb_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class fsb_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget fsb_shell;
+	Widget form_;
+	Widget label_;
+public:
+	static void helpCB( Widget, XtPointer, XtPointer );
+	virtual void helpCB( Widget, XtPointer ) = 0;
+	static void cancelCB( Widget, XtPointer, XtPointer );
+	virtual void cancelCB( Widget, XtPointer ) = 0;
+	static void okCB( Widget, XtPointer, XtPointer );
+	virtual void okCB( Widget, XtPointer ) = 0;
+};
+
+typedef fsb_shell_c *fsb_shell_p;
+
+
+extern fsb_shell_p fsb_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uihistory.cc b/ecflow_4_0_7/view/src/libui/uihistory.cc
new file mode 100644
index 0000000..3ca68e0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uihistory.cc
@@ -0,0 +1,62 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/List.h>
+#include <Xm/ScrollBar.h>
+
+
+#include "uihistory.h"
+
+history_p history_form = (history_p) NULL;
+
+
+
+void history_form_c::create (Widget parent, char *widget_name)
+{
+  /* Widget children[3];      // Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledList9 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "history_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	history_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = history_form;
+	XtSetArg(al[ac], XmNlistSpacing, 2); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmCONSTANT); ac++;
+	list_ = XmCreateScrolledList ( history_form, "list_", al, ac );
+	ac = 0;
+	scrolledList9 = XtParent ( list_ );
+
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledList9,al, ac );
+	ac = 0;
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&history_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+}
+
+void history_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	history_form_p instance = (history_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uihistory.h b/ecflow_4_0_7/view/src/libui/uihistory.h
new file mode 100644
index 0000000..dd25c67
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uihistory.h
@@ -0,0 +1,30 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uihistory_h
+#define _uihistory_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class history_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget history_form;
+	Widget list_;
+public:
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+};
+
+typedef history_form_c *history_form_p;
+class history;
+typedef history *history_p;
+
+
+extern history_p history_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiinfo.cc b/ecflow_4_0_7/view/src/libui/uiinfo.cc
new file mode 100644
index 0000000..70b5e92
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiinfo.cc
@@ -0,0 +1,81 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawnB.h>
+#include <Xm/Form.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/ScrolledW.h>
+
+#include "Hyper.h"
+#define XmCreateDrawnButton CreateHyper
+#include "uiinfo.h"
+
+extern void info_pop_callback(Widget, XtPointer, XtPointer) ;
+extern void shell_popup_callback(Widget, XtPointer, XtPointer) ;
+info_form_p info_form = (info_form_p) NULL;
+
+
+
+void info_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledWin1 = (Widget)NULL;
+	Widget scrollbar25 = (Widget)NULL;
+	Widget scrollbar26 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "info_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	info_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = info_form;
+	XtSetArg(al[ac], XmNscrollingPolicy, XmAUTOMATIC); ac++;
+	scrolledWin1 = XmCreateScrolledWindow ( info_form, "scrolledWin1", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNhorizontalScrollBar, &scrollbar25 ); ac++;
+	XtSetArg(al[ac], XmNverticalScrollBar, &scrollbar26 ); ac++;
+	XtGetValues(scrolledWin1, al, ac );
+	ac = 0;
+	text_ = XmCreateDrawnButton ( scrolledWin1, "text_", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 5); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( scrolledWin1,al, ac );
+	ac = 0;
+	XtAddCallback (text_, XmNactivateCallback,&info_form_c:: hyperCB, (XtPointer) this);
+	children[ac++] = text_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XmScrolledWindowSetAreas(scrolledWin1, scrollbar25, scrollbar26, text_ );
+	children[ac++] = scrolledWin1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void info_form_c::hyperCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	info_form_p instance = (info_form_p) client_data;
+	instance->hyperCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiinfo.h b/ecflow_4_0_7/view/src/libui/uiinfo.h
new file mode 100644
index 0000000..dfb8e60
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiinfo.h
@@ -0,0 +1,28 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiinfo_h
+#define _uiinfo_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class info_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget info_form;
+	Widget text_;
+public:
+	static void hyperCB( Widget, XtPointer, XtPointer );
+	virtual void hyperCB( Widget, XtPointer ) = 0;
+};
+
+typedef info_form_c *info_form_p;
+
+
+extern info_form_p info_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uijob.cc b/ecflow_4_0_7/view/src/libui/uijob.cc
new file mode 100644
index 0000000..aa547f1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uijob.cc
@@ -0,0 +1,120 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+
+#include "uijob.h"
+
+script_p job_form = (script_p) NULL;
+
+
+
+void job_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledText1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "job_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	job_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = job_form;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( job_form, "text_", al, ac );
+	ac = 0;
+	scrolledText1 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNhighlightThickness, 1); ac++;
+	XtSetArg(al[ac], XmNshadowThickness, 1); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	name_ = XmCreateTextField ( job_form, "name_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( job_form, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button2 = XmCreatePushButton ( tools_, "Use external viewer", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Search", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, name_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledText1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightWidget, tools_); ac++;
+	XtSetValues ( name_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (button2, XmNactivateCallback,&job_form_c:: externalCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&job_form_c:: searchCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = name_;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void job_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	job_form_p instance = (job_form_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
+void job_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	job_form_p instance = (job_form_p) client_data;
+	instance->externalCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uijob.h b/ecflow_4_0_7/view/src/libui/uijob.h
new file mode 100644
index 0000000..3f09230
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uijob.h
@@ -0,0 +1,34 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uijob_h
+#define _uijob_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class job_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget job_form;
+	Widget text_;
+	Widget name_;
+	Widget tools_;
+public:
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+	static void externalCB( Widget, XtPointer, XtPointer );
+	virtual void externalCB( Widget, XtPointer ) = 0;
+};
+
+typedef job_form_c *job_form_p;
+class script;
+typedef script *script_p;
+
+
+extern script_p job_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uijobcheck.cc b/ecflow_4_0_7/view/src/libui/uijobcheck.cc
new file mode 100644
index 0000000..b30e80a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uijobcheck.cc
@@ -0,0 +1,100 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+#include "uijobcheck.h"
+
+jobcheck_p jobcheck_form = (jobcheck_p) NULL;
+
+
+
+void jobcheck_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledText4 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "jobcheck_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	jobcheck_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = jobcheck_form;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( jobcheck_form, "text_", al, ac );
+	ac = 0;
+	scrolledText4 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNhighlightThickness, 1); ac++;// 201106
+	XtSetArg(al[ac], XmNshadowThickness, 1); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	name_ = XmCreateTextField ( jobcheck_form, "name_", al, ac );
+	ac = 0;// 201106
+
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( jobcheck_form, "tools_", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Update", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	// XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNtopWidget, name_); ac++; // 201106
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( scrolledText4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (button3, XmNactivateCallback,&jobcheck_form_c:: refreshCB, (XtPointer) this);
+	children[ac++] = button3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void jobcheck_form_c::refreshCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	jobcheck_form_p instance = (jobcheck_form_p) client_data;
+	instance->refreshCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uijobcheck.h b/ecflow_4_0_7/view/src/libui/uijobcheck.h
new file mode 100644
index 0000000..5dd9899
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uijobcheck.h
@@ -0,0 +1,32 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uijobcheck_h
+#define _uijobcheck_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class jobcheck_form_c: public xd_XmForm_c {
+public:
+        virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+        Widget jobcheck_form;
+        Widget text_;
+        Widget name_;
+        Widget tools_;
+public:
+        static void refreshCB( Widget, XtPointer, XtPointer );
+        virtual void refreshCB( Widget, XtPointer ) = 0;
+};
+
+typedef jobcheck_form_c *jobcheck_form_p;
+class jobcheck;
+typedef jobcheck *jobcheck_p;
+
+
+extern jobcheck_p jobcheck_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uijobstatus.cc b/ecflow_4_0_7/view/src/libui/uijobstatus.cc
new file mode 100644
index 0000000..90da896
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uijobstatus.cc
@@ -0,0 +1,150 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #1 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+/*
+** Generated by X-Designer   // edited in the lack of X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+
+#include "uijobstatus.h"
+
+script_p jobstatus_form = (script_p) NULL;
+
+
+
+void jobstatus_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[4];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledText1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "jobstatus_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	jobstatus_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = jobstatus_form;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( jobstatus_form, "text_", al, ac );
+	ac = 0;
+	scrolledText1 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNhighlightThickness, 1); ac++;
+	XtSetArg(al[ac], XmNshadowThickness, 1); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	name_ = XmCreateTextField ( jobstatus_form, "name_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( jobstatus_form, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button2 = XmCreatePushButton ( tools_, "Use external viewer", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Search", al, ac );
+        XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+        XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+        XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+        button1 = XmCreatePushButton ( tools_, "Update", al, ac );
+        ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, name_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledText1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightWidget, tools_); ac++;
+	XtSetValues ( name_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (button2, XmNactivateCallback,&jobstatus_form_c:: externalCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&jobstatus_form_c:: searchCB, (XtPointer) this);
+        XtAddCallback (button1, XmNactivateCallback,&jobstatus_form_c:: updateCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = name_;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void jobstatus_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	jobstatus_form_p instance = (jobstatus_form_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
+void jobstatus_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	jobstatus_form_p instance = (jobstatus_form_p) client_data;
+	instance->externalCB ( widget, call_data );
+}
+
+void jobstatus_form_c::updateCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+        jobstatus_form_p instance = (jobstatus_form_p) client_data;
+        instance->updateCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uijobstatus.h b/ecflow_4_0_7/view/src/libui/uijobstatus.h
new file mode 100644
index 0000000..1c80d76
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uijobstatus.h
@@ -0,0 +1,48 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#ifndef _uijobstatus_h
+#define _uijobstatus_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class jobstatus_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget jobstatus_form;
+	Widget text_;
+	Widget name_;
+	Widget tools_;
+public:
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+	static void externalCB( Widget, XtPointer, XtPointer );
+	virtual void externalCB( Widget, XtPointer ) = 0;
+	static void updateCB( Widget, XtPointer, XtPointer );
+	virtual void updateCB( Widget, XtPointer ) = 0;
+};
+
+typedef jobstatus_form_c *jobstatus_form_p;
+class script;
+typedef script *script_p;
+
+
+extern script_p jobstatus_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uimail.cc b/ecflow_4_0_7/view/src/libui/uimail.cc
new file mode 100644
index 0000000..a6014e1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimail.cc
@@ -0,0 +1,136 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/CascadeB.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+#include <Xm/Protocols.h>  
+
+#include "uimail.h"
+
+mail_shell_p mail_shell = (mail_shell_p) NULL;
+
+
+
+void mail_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[4];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget menuBar1 = (Widget)NULL;
+	Widget cascade1 = (Widget)NULL;
+	Widget menu1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget scrolledText1 = (Widget)NULL;
+	Widget scrolledList1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "mail_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	mail_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = mail_shell;
+	XmAddWMProtocolCallback( mail_shell, XmInternAtom(XtDisplay(mail_shell), "WM_DELETE_WINDOW", False),&mail_shell_c:: closeCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( mail_shell, "form_", al, ac );
+	ac = 0;
+	menuBar1 = XmCreateMenuBar ( form_, "menuBar1", al, ac );
+	cascade1 = XmCreateCascadeButton ( menuBar1, "File", al, ac );
+	menu1 = XmCreatePulldownMenu ( menuBar1, "menu1", al, ac );
+	button2 = XmCreatePushButton ( menu1, "Close", al, ac );
+	XtSetArg(al[ac], XmNcolumns, 40); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	XtSetArg(al[ac], XmNrows, 10); ac++;
+	text_ = XmCreateScrolledText ( form_, "text_", al, ac );
+	ac = 0;
+	scrolledText1 = XtParent ( text_ );
+
+	input_ = XmCreateTextField ( form_, "input_", al, ac );
+	XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form_, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( menuBar1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, menuBar1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, input_); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, scrolledList1); ac++;
+	XtSetValues ( scrolledText1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, scrolledList1); ac++;
+	XtSetValues ( input_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, menuBar1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+	XtAddCallback (button2, XmNactivateCallback,&mail_shell_c:: closeCB, (XtPointer) this);
+	children[ac++] = button2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu1); ac++;
+	XtSetValues ( cascade1, al, ac );
+	ac = 0;
+	children[ac++] = cascade1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (input_, XmNactivateCallback,&mail_shell_c:: sendCB, (XtPointer) this);
+	XtManageChild(list_);
+	children[ac++] = menuBar1;
+	children[ac++] = input_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void mail_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	mail_shell_p instance = (mail_shell_p) client_data;
+	instance->closeCB ( widget, call_data );
+}
+
+void mail_shell_c::sendCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	mail_shell_p instance = (mail_shell_p) client_data;
+	instance->sendCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uimail.h b/ecflow_4_0_7/view/src/libui/uimail.h
new file mode 100644
index 0000000..6e2d9b8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimail.h
@@ -0,0 +1,33 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uimail_h
+#define _uimail_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class mail_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget mail_shell;
+	Widget form_;
+	Widget text_;
+	Widget input_;
+	Widget list_;
+public:
+	static void closeCB( Widget, XtPointer, XtPointer );
+	virtual void closeCB( Widget, XtPointer ) = 0;
+	static void sendCB( Widget, XtPointer, XtPointer );
+	virtual void sendCB( Widget, XtPointer ) = 0;
+};
+
+typedef mail_shell_c *mail_shell_p;
+
+
+extern mail_shell_p mail_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uimanual.cc b/ecflow_4_0_7/view/src/libui/uimanual.cc
new file mode 100644
index 0000000..4eda464
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimanual.cc
@@ -0,0 +1,102 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+
+
+#include "uimanual.h"
+
+manual_p manual_form = (manual_p) NULL;
+
+
+
+void manual_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledText2 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "manual_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	manual_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = manual_form;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( manual_form, "text_", al, ac );
+	ac = 0;
+	scrolledText2 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( manual_form, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button2 = XmCreatePushButton ( tools_, "Use external viewer", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Search", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledText2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (button2, XmNactivateCallback,&manual_form_c:: externalCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&manual_form_c:: searchCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void manual_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	manual_form_p instance = (manual_form_p) client_data;
+	instance->externalCB ( widget, call_data );
+}
+
+void manual_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	manual_form_p instance = (manual_form_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uimanual.h b/ecflow_4_0_7/view/src/libui/uimanual.h
new file mode 100644
index 0000000..95a559e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimanual.h
@@ -0,0 +1,33 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uimanual_h
+#define _uimanual_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class manual_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget manual_form;
+	Widget text_;
+	Widget tools_;
+public:
+	static void externalCB( Widget, XtPointer, XtPointer );
+	virtual void externalCB( Widget, XtPointer ) = 0;
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+};
+
+typedef manual_form_c *manual_form_p;
+class manual;
+typedef manual *manual_p;
+
+
+extern manual_p manual_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uimenu.cc b/ecflow_4_0_7/view/src/libui/uimenu.cc
new file mode 100644
index 0000000..1c197a1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimenu.cc
@@ -0,0 +1,229 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+#include <Xm/CascadeBG.h>
+#include <Xm/LabelG.h>
+
+
+#include "uimenu.h"
+
+menu_form_p menu_form = (menu_form_p) NULL;
+
+
+
+void menu_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[4];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledList1 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget rowcol1 = (Widget)NULL;
+	Widget rowcol2 = (Widget)NULL;
+	Widget label1 = (Widget)NULL;
+	Widget optionMenu1 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+	Widget cascade1 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget button4 = (Widget)NULL;
+	Widget separator2 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "Command menus";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	menu_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = menu_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( menu_form, "form_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNvisibleItemCount, 17); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmCONSTANT); ac++;
+	list_ = XmCreateScrolledList ( form_, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+	form1 = XmCreateForm ( form_, "form1", al, ac );
+	XtSetArg(al[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
+	rowcol1 = XmCreateRowColumn ( form1, "rowcol1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	add_ = XmCreatePushButton ( rowcol1, "Add", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	update_ = XmCreatePushButton ( rowcol1, "Update", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	remove_ = XmCreatePushButton ( rowcol1, "Remove", al, ac );
+	ac = 0;
+	rowcol2 = XmCreateRowColumn ( form1, "rowcol2", al, ac );
+	label1 = XmCreateLabel ( rowcol2, "Title:", al, ac );
+	title_ = XmCreateTextField ( rowcol2, "title_", al, ac );
+	optionMenu1 = XmCreateOptionMenu ( rowcol2, "optionMenu1", al, ac );
+	label2 = XmOptionLabelGadget ( optionMenu1 );
+	cascade1 = XmOptionButtonGadget ( optionMenu1 );
+	actions_ = XmCreatePulldownMenu ( optionMenu1, "actions_", al, ac );
+	button1 = XmCreatePushButton ( actions_, "Ecf command", al, ac );
+	button2 = XmCreatePushButton ( actions_, "Separator", al, ac );
+	button3 = XmCreatePushButton ( actions_, "Window", al, ac );
+	button4 = XmCreatePushButton ( actions_, "Internal", al, ac );
+	separator2 = XmCreateSeparator ( form1, "separator2", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 5); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightWidget, form1); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 5); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&menu_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( rowcol1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( rowcol2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, rowcol2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, rowcol1); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( separator2,al, ac );
+	ac = 0;
+	XtAddCallback (add_, XmNactivateCallback,&menu_form_c:: addCB, (XtPointer) this);
+	XtAddCallback (update_, XmNactivateCallback,&menu_form_c:: updateCB, (XtPointer) this);
+	XtAddCallback (remove_, XmNactivateCallback,&menu_form_c:: removeCB, (XtPointer) this);
+	children[ac++] = add_;
+	children[ac++] = update_;
+	children[ac++] = remove_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (title_, XmNvalueChangedCallback,&menu_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = button1;
+	children[ac++] = button2;
+	children[ac++] = button3;
+	children[ac++] = button4;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, actions_); ac++;
+	XtSetValues ( cascade1, al, ac );
+	ac = 0;
+	children[ac++] = label1;
+	children[ac++] = title_;
+	children[ac++] = optionMenu1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = rowcol1;
+	children[ac++] = rowcol2;
+	children[ac++] = separator2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void menu_form_c::updateCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	menu_form_p instance = (menu_form_p) client_data;
+	instance->updateCB ( widget, call_data );
+}
+
+void menu_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	menu_form_p instance = (menu_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
+void menu_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	menu_form_p instance = (menu_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
+void menu_form_c::removeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	menu_form_p instance = (menu_form_p) client_data;
+	instance->removeCB ( widget, call_data );
+}
+
+void menu_form_c::addCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	menu_form_p instance = (menu_form_p) client_data;
+	instance->addCB ( widget, call_data );
+}
+
+void menu_form_c::menuCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	menu_form_p instance = (menu_form_p) client_data;
+	instance->menuCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uimenu.h b/ecflow_4_0_7/view/src/libui/uimenu.h
new file mode 100644
index 0000000..99bd3d4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimenu.h
@@ -0,0 +1,44 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uimenu_h
+#define _uimenu_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class menu_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget menu_form;
+	Widget form_;
+	Widget list_;
+	Widget add_;
+	Widget update_;
+	Widget remove_;
+	Widget title_;
+	Widget actions_;
+public:
+	static void updateCB( Widget, XtPointer, XtPointer );
+	virtual void updateCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+	static void removeCB( Widget, XtPointer, XtPointer );
+	virtual void removeCB( Widget, XtPointer ) = 0;
+	static void addCB( Widget, XtPointer, XtPointer );
+	virtual void addCB( Widget, XtPointer ) = 0;
+	static void menuCB( Widget, XtPointer, XtPointer );
+	virtual void menuCB( Widget, XtPointer ) = 0;
+};
+
+typedef menu_form_c *menu_form_p;
+
+
+extern menu_form_p menu_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uimessages.cc b/ecflow_4_0_7/view/src/libui/uimessages.cc
new file mode 100644
index 0000000..2730c73
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimessages.cc
@@ -0,0 +1,103 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+
+
+#include "uimessages.h"
+
+script_p messages_form = (script_p) NULL;
+
+
+
+void messages_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledText1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "messages_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	messages_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = messages_form;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( messages_form, "text_", al, ac );
+	ac = 0;
+	scrolledText1 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( messages_form, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button2 = XmCreatePushButton ( tools_, "Use external viewer", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Search", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, tools_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledText1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (button2, XmNactivateCallback,&messages_form_c:: externalCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&messages_form_c:: searchCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void messages_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	messages_form_p instance = (messages_form_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
+void messages_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	messages_form_p instance = (messages_form_p) client_data;
+	instance->externalCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uimessages.h b/ecflow_4_0_7/view/src/libui/uimessages.h
new file mode 100644
index 0000000..7422c58
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uimessages.h
@@ -0,0 +1,33 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uimessages_h
+#define _uimessages_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class messages_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget messages_form;
+	Widget text_;
+	Widget tools_;
+public:
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+	static void externalCB( Widget, XtPointer, XtPointer );
+	virtual void externalCB( Widget, XtPointer ) = 0;
+};
+
+typedef messages_form_c *messages_form_p;
+class script;
+typedef script *script_p;
+
+
+extern script_p messages_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uinode_alert.cc b/ecflow_4_0_7/view/src/libui/uinode_alert.cc
new file mode 100644
index 0000000..d763160
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uinode_alert.cc
@@ -0,0 +1,164 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/ScrollBar.h>
+
+
+#include "uinode_alert.h"
+
+node_alert_shell_p node_alert_shell = (node_alert_shell_p) NULL;
+
+
+
+void node_alert_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[6];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledList1 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+	Widget drawingArea1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "node_alert_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	node_alert_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = node_alert_shell;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( node_alert_shell, "form_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNvisibleItemCount, 12); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form_, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+	button1 = XmCreatePushButton ( form_, "Collect all nodes", al, ac );
+	close_ = XmCreatePushButton ( form_, "Close", al, ac );
+	clear_ = XmCreatePushButton ( form_, "Clear & Close", al, ac );
+	drawingArea1 = XmCreateDrawingArea ( form_, "drawingArea1", al, ac );
+	label_ = XmCreateLabel ( form_, "label_", al, ac );
+	XtSetArg(al[ac], XmNcancelButton, close_); ac++;
+	XtSetArg(al[ac], XmNdefaultButton, clear_); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, label_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 2); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, clear_); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, scrolledList1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 2); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( button1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, scrolledList1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 2); ac++;
+	XtSetArg(al[ac], XmNrightWidget, clear_); ac++;
+	XtSetValues ( close_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 2); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 2); ac++;
+	XtSetValues ( clear_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNtopWidget, scrolledList1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 2); ac++;
+	XtSetArg(al[ac], XmNleftWidget, button1); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 2); ac++;
+	XtSetArg(al[ac], XmNrightWidget, close_); ac++;
+	XtSetValues ( drawingArea1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 2); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 2); ac++;
+	XtSetValues ( label_,al, ac );
+	ac = 0;
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&node_alert_shell_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+	XtAddCallback (button1, XmNactivateCallback,&node_alert_shell_c:: collectCB, (XtPointer) this);
+	XtAddCallback (close_, XmNactivateCallback,&node_alert_shell_c:: closeCB, (XtPointer) this);
+	XtAddCallback (clear_, XmNactivateCallback,&node_alert_shell_c:: clearCloseCB, (XtPointer) this);
+	children[ac++] = button1;
+	children[ac++] = close_;
+	children[ac++] = clear_;
+	children[ac++] = drawingArea1;
+	children[ac++] = label_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void node_alert_shell_c::collectCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	node_alert_shell_p instance = (node_alert_shell_p) client_data;
+	instance->collectCB ( widget, call_data );
+}
+
+void node_alert_shell_c::clearCloseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	node_alert_shell_p instance = (node_alert_shell_p) client_data;
+	instance->clearCloseCB ( widget, call_data );
+}
+
+void node_alert_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	node_alert_shell_p instance = (node_alert_shell_p) client_data;
+	instance->closeCB ( widget, call_data );
+}
+
+void node_alert_shell_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	node_alert_shell_p instance = (node_alert_shell_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uinode_alert.h b/ecflow_4_0_7/view/src/libui/uinode_alert.h
new file mode 100644
index 0000000..c004440
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uinode_alert.h
@@ -0,0 +1,38 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uinode_alert_h
+#define _uinode_alert_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class node_alert_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget node_alert_shell;
+	Widget form_;
+	Widget list_;
+	Widget close_;
+	Widget clear_;
+	Widget label_;
+public:
+	static void collectCB( Widget, XtPointer, XtPointer );
+	virtual void collectCB( Widget, XtPointer ) = 0;
+	static void clearCloseCB( Widget, XtPointer, XtPointer );
+	virtual void clearCloseCB( Widget, XtPointer ) = 0;
+	static void closeCB( Widget, XtPointer, XtPointer );
+	virtual void closeCB( Widget, XtPointer ) = 0;
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+};
+
+typedef node_alert_shell_c *node_alert_shell_p;
+
+
+extern node_alert_shell_p node_alert_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uioption.cc b/ecflow_4_0_7/view/src/libui/uioption.cc
new file mode 100644
index 0000000..1751c02
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uioption.cc
@@ -0,0 +1,1022 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/Label.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+#include <Xm/ToggleB.h>
+#include <Xm/LabelG.h>
+#include <Xm/ToggleBG.h>
+
+
+#include "uioption.h"
+
+option_form_p option_form = (option_form_p) NULL;
+
+
+
+void option_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[10];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget frame1 = (Widget)NULL;
+	Widget label1 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget form7 = (Widget)NULL;
+	Widget toggle1 = (Widget)NULL;
+	Widget separator3 = (Widget)NULL;
+	Widget form8 = (Widget)NULL;
+	Widget toggle4 = (Widget)NULL;
+	Widget separator1 = (Widget)NULL;
+	Widget separator13 = (Widget)NULL;
+	Widget separator14 = (Widget)NULL;
+	Widget form9 = (Widget)NULL;
+	Widget toggle5 = (Widget)NULL;
+	Widget separator2 = (Widget)NULL;
+	Widget frame3 = (Widget)NULL;
+	Widget label8 = (Widget)NULL;
+	Widget form10 = (Widget)NULL;
+	Widget form11 = (Widget)NULL;
+	Widget toggle3 = (Widget)NULL;
+	Widget separator8 = (Widget)NULL;
+	Widget form12 = (Widget)NULL;
+	Widget form13 = (Widget)NULL;
+	Widget form14 = (Widget)NULL;
+	Widget toggle10 = (Widget)NULL;
+	Widget toggle13 = (Widget)NULL;
+	Widget toggle14 = (Widget)NULL;
+	Widget separator9 = (Widget)NULL;
+	Widget frame2 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+	Widget form2 = (Widget)NULL;
+	Widget form4 = (Widget)NULL;
+	Widget toggle2 = (Widget)NULL;
+	Widget separator7 = (Widget)NULL;
+	Widget form6 = (Widget)NULL;
+	Widget toggle6 = (Widget)NULL;
+	Widget separator4 = (Widget)NULL;
+	Widget label3 = (Widget)NULL;
+	Widget label5 = (Widget)NULL;
+	Widget form5 = (Widget)NULL;
+	Widget toggle7 = (Widget)NULL;
+	Widget separator5 = (Widget)NULL;
+	Widget form3 = (Widget)NULL;
+	Widget toggle8 = (Widget)NULL;
+	Widget separator6 = (Widget)NULL;
+	Widget label4 = (Widget)NULL;
+        Widget label6 = (Widget)NULL;
+        Widget label7 = (Widget)NULL;
+
+        Widget label20 = (Widget)NULL;
+        Widget label21 = (Widget)NULL;
+        Widget form21 = (Widget)NULL;
+        Widget toggle20 = (Widget)NULL;
+        Widget separator20 = (Widget)NULL;
+
+	Widget form15 = (Widget)NULL;
+	Widget toggle15 = (Widget)NULL;
+	Widget separator15 = (Widget)NULL;
+
+        if ( !widget_name )
+                widget_name = "Server options";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	option_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = option_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( option_form, "form_", al, ac );
+	ac = 0;
+	frame1 = XmCreateFrame ( form_, "frame1", al, ac );
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	label1 = XmCreateLabel ( frame1, "Automaticaly open these windows:", al, ac );
+	ac = 0;
+	form1 = XmCreateForm ( frame1, "form1", al, ac );
+	form7 = XmCreateForm ( form1, "form7", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle1 = XmCreateToggleButtonGadget ( form7, "@aborted", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator3 = XmCreateSeparator ( form7, "separator3", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	aborted = XmCreateToggleButton ( form7, "aborted", al, ac );
+	ac = 0;
+	form8 = XmCreateForm ( form1, "form8", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle4 = XmCreateToggleButtonGadget ( form8, "@restarted", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator1 = XmCreateSeparator ( form8, "separator1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	restarted = XmCreateToggleButton ( form8, "restarted", al, ac );
+
+	ac = 0;
+	form9 = XmCreateForm ( form1, "form9", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle5 = XmCreateToggleButtonGadget ( form9, "@late", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator2 = XmCreateSeparator ( form9, "separator2", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	late = XmCreateToggleButton ( form9, "late", al, ac );
+
+	ac = 0;
+	form13 = XmCreateForm ( form1, "form13", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle13 = XmCreateToggleButtonGadget ( form13, "@zombied", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator13 = XmCreateSeparator ( form13, "separator1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	zombied = XmCreateToggleButton ( form13, "zombied", al, ac );
+
+	ac = 0;
+	form14 = XmCreateForm ( form1, "form14", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle14 = XmCreateToggleButtonGadget ( form14, "@aliases", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator14 = XmCreateSeparator ( form14, "separator1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	aliases = XmCreateToggleButton ( form14, "aliases", al, ac );
+
+	/* 20150216 */
+	ac = 0;
+	form15 = XmCreateForm ( form1, "form15", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle15 = XmCreateToggleButtonGadget ( form15, "@late_family", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator15 = XmCreateSeparator ( form15, "separator1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	late_family = XmCreateToggleButton ( form15, "late_family", al, ac );
+
+	ac = 0;
+	frame3 = XmCreateFrame ( form_, "frame3", al, ac );
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	label8 = XmCreateLabel ( frame3, "Miscellaneous:", al, ac );
+	ac = 0;
+	form10 = XmCreateForm ( frame3, "form10", al, ac );
+	form11 = XmCreateForm ( form10, "form11", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle3 = XmCreateToggleButtonGadget ( form11, "@new_suites", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator8 = XmCreateSeparator ( form11, "separator8", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+        new_suites = XmCreateToggleButton ( form11, "new_suites", al, ac );
+
+        ac = 0;
+        form12 = XmCreateForm ( form10, "form12", al, ac );
+        XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+        XtSetArg(al[ac], XmNset, FALSE); ac++;
+        toggle10 = XmCreateToggleButtonGadget ( form12, "@direct_read", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator9 = XmCreateSeparator ( form12, "separator9", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+        direct_read = XmCreateToggleButton ( form12, "direct_read", al, ac );
+
+        /* 201404 */
+        ac = 0;
+        form21 = XmCreateForm ( form10, "form21", al, ac );
+        XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+        XtSetArg(al[ac], XmNset, FALSE); ac++;
+        toggle20 = XmCreateToggleButtonGadget ( form21, "@jobfile_length", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+        separator20 = XmCreateSeparator ( form21, "separator20", al, ac );
+
+        ac = 0;
+        XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+        label20 = XmCreateLabel ( form21, "Job file maximum length", al, ac );
+        ac = 0;
+        jobfile_length = XmCreateTextField ( form21, "jobfile_length", al, ac );
+        XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+        label21 = XmCreateLabel ( form21, "lines", al, ac );
+        ac = 0;
+        /* */
+
+        ac = 0;
+        frame2 = XmCreateFrame ( form_, "frame2", al, ac );
+        XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	label2 = XmCreateLabel ( frame2, "Get server status:", al, ac );
+	ac = 0;
+	form2 = XmCreateForm ( frame2, "form2", al, ac );
+	form4 = XmCreateForm ( form2, "form4", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle2 = XmCreateToggleButtonGadget ( form4, "@poll", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator7 = XmCreateSeparator ( form4, "separator7", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	poll = XmCreateToggleButton ( form4, "poll", al, ac );
+	ac = 0;
+	form6 = XmCreateForm ( form2, "form6", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle6 = XmCreateToggleButtonGadget ( form6, "@timeout", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator4 = XmCreateSeparator ( form6, "separator4", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	label3 = XmCreateLabel ( form6, "Call server every", al, ac );
+	ac = 0;
+	timeout = XmCreateTextField ( form6, "timeout", al, ac );
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	label5 = XmCreateLabel ( form6, "seconds", al, ac );
+	ac = 0;
+	form5 = XmCreateForm ( form2, "form5", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle7 = XmCreateToggleButtonGadget ( form5, "@drift", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator5 = XmCreateSeparator ( form5, "separator5", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	drift = XmCreateToggleButton ( form5, "drift", al, ac );
+	ac = 0;
+	form3 = XmCreateForm ( form2, "form3", al, ac );
+	XtSetArg(al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
+	XtSetArg(al[ac], XmNset, FALSE); ac++;
+	toggle8 = XmCreateToggleButtonGadget ( form3, "@maximum", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmVERTICAL); ac++;
+	separator6 = XmCreateSeparator ( form3, "separator6", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	label4 = XmCreateLabel ( form3, "Don't reduce frequency over", al, ac );
+	ac = 0;
+	maximum = XmCreateTextField ( form3, "maximum", al, ac );
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	label6 = XmCreateLabel ( form3, "minutes", al, ac );
+	ac = 0;
+	label7 = XmCreateLabelGadget ( form_, "warn2", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNtopPosition, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNbottomPosition, 100); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNleftPosition, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNrightPosition, 100); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( frame1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( frame3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNtopWidget, label7); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( frame2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( label7,al, ac );
+	ac = 0;
+
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form7,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form7); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form8,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form8); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form9,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form9); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form13,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form13); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form14,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form14); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form15,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle1); ac++;
+	XtSetValues ( separator3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( aborted,al, ac );
+	ac = 0;
+	XtAddCallback (toggle1, XmNvalueChangedCallback,&option_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (aborted, XmNvalueChangedCallback,&option_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle1;
+	children[ac++] = separator3;
+	children[ac++] = aborted;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle4); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator1); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( restarted,al, ac );
+	ac = 0;
+	XtAddCallback (toggle4, XmNvalueChangedCallback,&option_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (restarted, XmNvalueChangedCallback,&option_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle4;
+	children[ac++] = separator1;
+	children[ac++] = restarted;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle5,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator2); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( late,al, ac );
+        ac = 0;
+        XtAddCallback (toggle5, XmNvalueChangedCallback,
+                       &option_form_c:: useCB, (XtPointer) this);
+        XtAddCallback (late, XmNvalueChangedCallback,
+                       &option_form_c:: changedCB, (XtPointer) this);
+        children[ac++] = toggle5;
+        children[ac++] = separator2;
+        children[ac++] = late;
+	XtManageChildren(children, ac);
+
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle13,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle13); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator13,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator13); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( zombied,al, ac );
+        ac = 0;
+        XtAddCallback (toggle13, XmNvalueChangedCallback,
+                       &option_form_c:: useCB, (XtPointer) this);
+        XtAddCallback (zombied, XmNvalueChangedCallback,
+                       &option_form_c:: changedCB, (XtPointer) this);
+        children[ac++] = toggle13;
+        children[ac++] = separator13;
+        children[ac++] = zombied;
+	XtManageChildren(children, ac);
+
+        
+	ac = 0;
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle14,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle14); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator14,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator14); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( aliases,al, ac );
+        ac = 0;
+        XtAddCallback (toggle14, XmNvalueChangedCallback,
+                       &option_form_c:: useCB, (XtPointer) this);
+        XtAddCallback (aliases,  XmNvalueChangedCallback,
+                       &option_form_c:: changedCB, (XtPointer) this);
+
+        children[ac++] = toggle14;
+        children[ac++] = separator14;
+	children[ac++] = aliases;
+	XtManageChildren(children, ac);
+
+	ac = 0;
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle15,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle15); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator15,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator15); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( late_family,al, ac );
+        ac = 0;
+        XtAddCallback (toggle15, XmNvalueChangedCallback,
+                       &option_form_c:: useCB, (XtPointer) this);
+        XtAddCallback (late_family,  XmNvalueChangedCallback,
+                       &option_form_c:: changedCB, (XtPointer) this);
+
+        children[ac++] = toggle15;
+        children[ac++] = separator15;
+	children[ac++] = late_family;
+	XtManageChildren(children, ac);
+
+	ac = 0;
+	children[ac++] = form7;
+	children[ac++] = form8;
+	children[ac++] = form9;
+	children[ac++] = form13;
+	children[ac++] = form14;
+	children[ac++] = form15;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = label1;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+
+	ac = 0;
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form11,al, ac );
+        ac = 0;
+
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+        XtSetArg(al[ac], XmNtopWidget, form11); ac++;
+        XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( form12,al, ac );
+        ac = 0;
+
+        /* 201404 */
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+        XtSetArg(al[ac], XmNtopWidget, form12); ac++;
+        XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( form21,al, ac );
+        ac = 0;
+
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+        XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( toggle20,al, ac );
+        ac = 0;
+
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+        XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+        XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+        XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+        XtSetArg(al[ac], XmNleftWidget, toggle20); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+        XtSetValues ( separator20,al, ac );
+        ac = 0;
+
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+        XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+        XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+        XtSetArg(al[ac], XmNleftWidget, separator20); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+        XtSetValues ( label20,al, ac );
+        ac = 0;
+
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+        XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+        XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+        XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+        XtSetArg(al[ac], XmNleftWidget, label20); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+        XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+        XtSetArg(al[ac], XmNrightWidget, label21); ac++;
+        XtSetValues ( jobfile_length,al, ac );
+        ac = 0;
+
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+        XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+        XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+        XtSetValues ( label21,al, ac );
+        ac = 0;
+        XtAddCallback (toggle20, XmNvalueChangedCallback,
+                       &option_form_c:: useCB, (XtPointer) this);
+        XtAddCallback (jobfile_length, XmNactivateCallback,
+                       &option_form_c:: changedCB, (XtPointer) this);
+        children[ac++] = toggle20;
+        children[ac++] = separator20;
+        children[ac++] = label20;
+        children[ac++] = jobfile_length;
+        children[ac++] = label21;
+        XtManageChildren(children, ac);
+        ac = 0;
+        /* */
+
+        XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+        XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator8,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator8); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( new_suites,al, ac );
+        ac = 0;
+        XtAddCallback (toggle3, XmNvalueChangedCallback,
+                       &option_form_c:: useCB, (XtPointer) this);
+        XtAddCallback (new_suites, XmNvalueChangedCallback,
+                       &option_form_c:: changedCB, (XtPointer) this);
+        children[ac++] = toggle3;
+        children[ac++] = separator8;
+        children[ac++] = new_suites;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle10,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle10); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator9,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator9); ac++;
+        XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+        XtSetValues ( direct_read,al, ac );
+        ac = 0;
+        XtAddCallback (toggle10, XmNvalueChangedCallback,
+                       &option_form_c:: useCB, (XtPointer) this);
+        XtAddCallback (direct_read, XmNvalueChangedCallback,
+                       &option_form_c:: changedCB, (XtPointer) this);
+        children[ac++] = toggle10;
+        children[ac++] = separator9;
+        children[ac++] = direct_read;
+        XtManageChildren(children, ac);
+        ac = 0;
+        children[ac++] = form11;
+        children[ac++] = form12;
+        children[ac++] = form21;
+        XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = label8;
+	children[ac++] = form10;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form6,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form6); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form5,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle2); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator7,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator7); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( poll,al, ac );
+	ac = 0;
+	XtAddCallback (toggle2, XmNvalueChangedCallback,&option_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (poll, XmNvalueChangedCallback,&option_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle2;
+	children[ac++] = separator7;
+	children[ac++] = poll;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle6,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle6); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator4); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( label3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftWidget, label3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, label5); ac++;
+	XtSetValues ( timeout,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( label5,al, ac );
+	ac = 0;
+	XtAddCallback (toggle6, XmNvalueChangedCallback,&option_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (timeout, XmNactivateCallback,&option_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle6;
+	children[ac++] = separator4;
+	children[ac++] = label3;
+	children[ac++] = timeout;
+	children[ac++] = label5;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle7,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle7); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator5,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( drift,al, ac );
+	ac = 0;
+	XtAddCallback (toggle7, XmNvalueChangedCallback,&option_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (drift, XmNvalueChangedCallback,&option_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle7;
+	children[ac++] = separator5;
+	children[ac++] = drift;
+	XtManageChildren(children, ac);
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( toggle8,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, toggle8); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( separator6,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+	XtSetArg(al[ac], XmNleftWidget, separator6); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( label4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftWidget, label4); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightWidget, label6); ac++;
+	XtSetValues ( maximum,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( label6,al, ac );
+	ac = 0;
+	XtAddCallback (toggle8, XmNvalueChangedCallback,&option_form_c:: useCB, (XtPointer) this);
+	XtAddCallback (maximum, XmNactivateCallback,&option_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle8;
+	children[ac++] = separator6;
+	children[ac++] = label4;
+	children[ac++] = maximum;
+	children[ac++] = label6;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form4;
+	children[ac++] = form6;
+	children[ac++] = form5;
+	children[ac++] = form3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = label2;
+	children[ac++] = form2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = frame1;
+	children[ac++] = frame3;
+	children[ac++] = frame2;
+	children[ac++] = label7;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void option_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	option_form_p instance = (option_form_p) client_data;
+	instance->useCB ( widget, call_data );
+}
+
+void option_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	option_form_p instance = (option_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uioption.h b/ecflow_4_0_7/view/src/libui/uioption.h
new file mode 100644
index 0000000..80846d1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uioption.h
@@ -0,0 +1,45 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uioption_h
+#define _uioption_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class option_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget option_form;
+	Widget form_;
+	Widget aborted;
+	Widget restarted;
+	Widget late;
+
+	Widget zombied;
+	Widget aliases;
+	Widget late_family;
+
+	Widget new_suites;
+	Widget direct_read;
+	Widget poll;
+	Widget timeout;
+	Widget drift;
+	Widget maximum;
+	Widget jobfile_length;
+public:
+	static void useCB( Widget, XtPointer, XtPointer );
+	virtual void useCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+};
+
+typedef option_form_c *option_form_p;
+
+
+extern option_form_p option_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uioutput.cc b/ecflow_4_0_7/view/src/libui/uioutput.cc
new file mode 100644
index 0000000..021a98d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uioutput.cc
@@ -0,0 +1,166 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+
+#include "uioutput.h"
+
+output_panel_p output_form = (output_panel_p) NULL;
+
+
+
+void output_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[4];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form1 = (Widget)NULL;
+	Widget scrolledText3 = (Widget)NULL;
+	Widget scrolledList11 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "output_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	output_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = output_form;
+	form1 = XmCreateForm ( output_form, "form1", al, ac );
+	XtSetArg(al[ac], XmNhighlightThickness, 1); ac++;
+	XtSetArg(al[ac], XmNshadowThickness, 1); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	name_ = XmCreateTextField ( form1, "name_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( form1, "text_", al, ac );
+	ac = 0;
+	scrolledText3 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNvisibleItemCount, 6); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form1, "list_", al, ac );
+	ac = 0;
+	scrolledList11 = XtParent ( list_ );
+
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( form1, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button2 = XmCreatePushButton ( tools_, "Use external viewer", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Search", al, ac );
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button1 = XmCreatePushButton ( tools_, "Update", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, tools_); ac++;
+	XtSetValues ( name_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, name_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, scrolledList11); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledText3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledList11,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&output_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+	XtAddCallback (button2, XmNactivateCallback,&output_form_c:: externalCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&output_form_c:: searchCB, (XtPointer) this);
+	XtAddCallback (button1, XmNactivateCallback,&output_form_c:: updateCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = name_;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void output_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	output_form_p instance = (output_form_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
+void output_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	output_form_p instance = (output_form_p) client_data;
+	instance->externalCB ( widget, call_data );
+}
+
+void output_form_c::updateCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	output_form_p instance = (output_form_p) client_data;
+	instance->updateCB ( widget, call_data );
+}
+
+void output_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	output_form_p instance = (output_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uioutput.h b/ecflow_4_0_7/view/src/libui/uioutput.h
new file mode 100644
index 0000000..9dba4dd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uioutput.h
@@ -0,0 +1,39 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uioutput_h
+#define _uioutput_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class output_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget output_form;
+	Widget name_;
+	Widget text_;
+	Widget list_;
+	Widget tools_;
+public:
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+	static void externalCB( Widget, XtPointer, XtPointer );
+	virtual void externalCB( Widget, XtPointer ) = 0;
+	static void updateCB( Widget, XtPointer, XtPointer );
+	virtual void updateCB( Widget, XtPointer ) = 0;
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+};
+
+typedef output_form_c *output_form_p;
+class output_panel;
+typedef output_panel *output_panel_p;
+
+
+extern output_panel_p output_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uipanel.cc b/ecflow_4_0_7/view/src/libui/uipanel.cc
new file mode 100644
index 0000000..3cf1d24
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uipanel.cc
@@ -0,0 +1,200 @@
+#include <Xm/Protocols.h>
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/CascadeB.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Separator.h>
+#include <Xm/ToggleB.h>
+
+#include "Tab.h"
+#include <Xm/Protocols.h>
+
+#include "uipanel.h"
+
+panel_window_p panel_top = (panel_window_p) NULL;
+
+
+
+void panel_top_c::create (Widget parent, char *widget_name)
+{
+	Widget children[6];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget menu1 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+	Widget separator1 = (Widget)NULL;
+	Widget separator3 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget menu2 = (Widget)NULL;
+	Widget separator2 = (Widget)NULL;
+	Widget menu3 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "panel_top";
+
+	XtSetArg(al[ac], XmNallowShellResize, FALSE); ac++;
+	XtSetArg(al[ac], XmNtransient, FALSE); ac++;
+	panel_top = XtCreatePopupShell ( widget_name, topLevelShellWidgetClass, parent, al, ac );
+	ac = 0;
+	_xd_rootwidget = panel_top;
+	XmAddWMProtocolCallback( panel_top, XmInternAtom(XtDisplay(panel_top), "WM_DELETE_WINDOW", False),&panel_top_c:: unmapCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( panel_top, "form_", al, ac );
+	ac = 0;
+#define XmCreateDrawingArea CreateTab
+	tab_ = XmCreateDrawingArea ( form_, "tab_", al, ac );
+	ac = 0;
+	menubar_ = XmCreateMenuBar ( form_, "menubar_", al, ac );
+	file_menu = XmCreateCascadeButton ( menubar_, "file_menu", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	menu1 = XmCreatePulldownMenu ( menubar_, "menu1", al, ac );
+	ac = 0;
+	button1 = XmCreatePushButton ( menu1, "new_window", al, ac );
+	separator1 = XmCreateSeparator ( menu1, "separator1", al, ac );
+	save_ = XmCreatePushButton ( menu1, "Save...", al, ac );
+	print_ = XmCreatePushButton ( menu1, "Print...", al, ac );
+	separator3 = XmCreateSeparator ( menu1, "separator3", al, ac );
+	button2 = XmCreatePushButton ( menu1, "close", al, ac );
+	options_menu = XmCreateCascadeButton ( menubar_, "options_menu", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	menu2 = XmCreatePulldownMenu ( menubar_, "menu2", al, ac );
+	ac = 0;
+	detached_ = XmCreateToggleButton ( menu2, "detached_", al, ac );
+	frozen_ = XmCreateToggleButton ( menu2, "current_node", al, ac );
+	separator2 = XmCreateSeparator ( menu2, "separator2", al, ac );
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	close_on_apply_ = XmCreateToggleButton ( menu2, "close_on_apply_", al, ac );
+	ac = 0;
+	help_menu = XmCreateCascadeButton ( menubar_, "help_menu", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	menu3 = XmCreatePulldownMenu ( menubar_, "menu3", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( menu3, "button3", al, ac );
+	XtSetArg(al[ac], XmNmenuHelpWidget, help_menu); ac++;
+	XtSetValues ( menubar_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, menubar_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tab_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( menubar_,al, ac );
+	ac = 0;
+	XtAddCallback (form_, XmNunmapCallback,&panel_top_c:: unmapCB, (XtPointer) this);
+	XtAddCallback (form_, XmNmapCallback,&panel_top_c:: mapCB, (XtPointer) this);
+	XtAddCallback (tab_, XmNresizeCallback,&panel_top_c:: resizeCB, (XtPointer) this);
+	XtAddCallback (button1, XmNactivateCallback,&panel_top_c:: cloneCB, (XtPointer) this);
+	XtAddCallback (save_, XmNactivateCallback,&panel_top_c:: saveCB, (XtPointer) this);
+	XtAddCallback (print_, XmNactivateCallback,&panel_top_c:: printCB, (XtPointer) this);
+	XtAddCallback (button2, XmNactivateCallback,&panel_top_c:: unmapCB, (XtPointer) this);
+	children[ac++] = button1;
+	children[ac++] = separator1;
+	children[ac++] = save_;
+	children[ac++] = print_;
+	children[ac++] = separator3;
+	children[ac++] = button2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu1); ac++;
+	XtSetValues ( file_menu, al, ac );
+	ac = 0;
+	XtAddCallback (detached_, XmNvalueChangedCallback,&panel_top_c:: freezeCB, (XtPointer) this);
+	XtAddCallback (frozen_, XmNvalueChangedCallback,&panel_top_c:: nodeCB, (XtPointer) this);
+	children[ac++] = detached_;
+	children[ac++] = frozen_;
+	children[ac++] = separator2;
+	children[ac++] = close_on_apply_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu2); ac++;
+	XtSetValues ( options_menu, al, ac );
+	ac = 0;
+	children[ac++] = button3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu3); ac++;
+	XtSetValues ( help_menu, al, ac );
+	ac = 0;
+	children[ac++] = file_menu;
+	children[ac++] = options_menu;
+	children[ac++] = help_menu;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tab_;
+	children[ac++] = menubar_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtManageChild ( form_);
+}
+
+void panel_top_c::printCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->printCB ( widget, call_data );
+}
+
+void panel_top_c::saveCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->saveCB ( widget, call_data );
+}
+
+void panel_top_c::resizeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->resizeCB ( widget, call_data );
+}
+
+void panel_top_c::freezeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->freezeCB ( widget, call_data );
+}
+
+void panel_top_c::nodeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->nodeCB ( widget, call_data );
+}
+
+void panel_top_c::cloneCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->cloneCB ( widget, call_data );
+}
+
+void panel_top_c::unmapCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->unmapCB ( widget, call_data );
+}
+
+void panel_top_c::mapCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	panel_top_p instance = (panel_top_p) client_data;
+	instance->mapCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uipanel.h b/ecflow_4_0_7/view/src/libui/uipanel.h
new file mode 100644
index 0000000..264cf35
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uipanel.h
@@ -0,0 +1,55 @@
+#include <Xm/Protocols.h>
+/*
+** Generated by X-Designer
+*/
+#ifndef _uipanel_h
+#define _uipanel_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class panel_top_c: public xd_TopLevelShell_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget panel_top;
+	Widget form_;
+	Widget tab_;
+	Widget menubar_;
+	Widget file_menu;
+	Widget save_;
+	Widget print_;
+	Widget options_menu;
+	Widget detached_;
+	Widget frozen_;
+	Widget close_on_apply_;
+	Widget help_menu;
+public:
+	static void printCB( Widget, XtPointer, XtPointer );
+	virtual void printCB( Widget, XtPointer ) = 0;
+	static void saveCB( Widget, XtPointer, XtPointer );
+	virtual void saveCB( Widget, XtPointer ) = 0;
+	static void resizeCB( Widget, XtPointer, XtPointer );
+	virtual void resizeCB( Widget, XtPointer ) = 0;
+	static void freezeCB( Widget, XtPointer, XtPointer );
+	virtual void freezeCB( Widget, XtPointer ) = 0;
+	static void nodeCB( Widget, XtPointer, XtPointer );
+	virtual void nodeCB( Widget, XtPointer ) = 0;
+	static void cloneCB( Widget, XtPointer, XtPointer );
+	virtual void cloneCB( Widget, XtPointer ) = 0;
+	static void unmapCB( Widget, XtPointer, XtPointer );
+	virtual void unmapCB( Widget, XtPointer ) = 0;
+	static void mapCB( Widget, XtPointer, XtPointer );
+	virtual void mapCB( Widget, XtPointer ) = 0;
+};
+
+typedef panel_top_c *panel_top_p;
+class panel_window;
+typedef panel_window *panel_window_p;
+
+
+extern panel_window_p panel_top;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uipasswd.cc b/ecflow_4_0_7/view/src/libui/uipasswd.cc
new file mode 100644
index 0000000..4ec03dc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uipasswd.cc
@@ -0,0 +1,135 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/SelectioB.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushBG.h>
+#include <Xm/SeparatoG.h>
+
+
+#include "uipasswd.h"
+
+passwd_shell_p passwd_shell = (passwd_shell_p) NULL;
+
+
+
+void passwd_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[8];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	XmString xmstrings[16];    /* temporary storage for XmStrings */
+	Widget form1 = (Widget)NULL;
+	Widget label3 = (Widget)NULL;
+	Widget separator3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "passwd_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	passwd_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = passwd_shell;
+	XtSetArg(al[ac], XmNdialogType, XmDIALOG_PROMPT); ac++;
+	form_ = XmCreateSelectionBox ( passwd_shell, "form_", al, ac );
+	ac = 0;
+	password = XmSelectionBoxGetChild ( form_, XmDIALOG_SELECTION_LABEL );
+	passwd_ = XmSelectionBoxGetChild ( form_, XmDIALOG_TEXT );
+	xmstrings[0] = XmStringCreateLtoR ( "Password:", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	XtSetValues ( password,al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	form1 = XmCreateForm ( form_, "form1", al, ac );
+	user_ = XmCreateTextField ( form1, "user_", al, ac );
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	label3 = XmCreateLabel ( form1, "User:", al, ac );
+	ac = 0;
+	label_ = XmCreateLabel ( form1, "label_", al, ac );
+	separator3 = XmCreateSeparator ( form1, "separator3", al, ac );
+	XtAddCallback (form_, XmNokCallback,&passwd_shell_c:: okCB, (XtPointer) this);
+	XtAddCallback (form_, XmNcancelCallback,&passwd_shell_c:: cancelCB, (XtPointer) this);
+	XtAddCallback (form_, XmNhelpCallback,&passwd_shell_c:: helpCB, (XtPointer) this);
+	XtAddCallback (passwd_, XmNvalueChangedCallback,&passwd_shell_c:: modifyCB, (XtPointer) this);
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, label3); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( user_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, separator3); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( label3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( label_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, label_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( separator3,al, ac );
+	ac = 0;
+	XtAddCallback (user_, XmNmodifyVerifyCallback,&passwd_shell_c:: modifyCB, (XtPointer) this);
+	children[ac++] = user_;
+	children[ac++] = label3;
+	children[ac++] = label_;
+	children[ac++] = separator3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void passwd_shell_c::modifyCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	passwd_shell_p instance = (passwd_shell_p) client_data;
+	instance->modifyCB ( widget, call_data );
+}
+
+void passwd_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	passwd_shell_p instance = (passwd_shell_p) client_data;
+	instance->helpCB ( widget, call_data );
+}
+
+void passwd_shell_c::cancelCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	passwd_shell_p instance = (passwd_shell_p) client_data;
+	instance->cancelCB ( widget, call_data );
+}
+
+void passwd_shell_c::okCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	passwd_shell_p instance = (passwd_shell_p) client_data;
+	instance->okCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uipasswd.h b/ecflow_4_0_7/view/src/libui/uipasswd.h
new file mode 100644
index 0000000..a576046
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uipasswd.h
@@ -0,0 +1,38 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uipasswd_h
+#define _uipasswd_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class passwd_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget passwd_shell;
+	Widget form_;
+	Widget password;
+	Widget passwd_;
+	Widget user_;
+	Widget label_;
+public:
+	static void modifyCB( Widget, XtPointer, XtPointer );
+	virtual void modifyCB( Widget, XtPointer ) = 0;
+	static void helpCB( Widget, XtPointer, XtPointer );
+	virtual void helpCB( Widget, XtPointer ) = 0;
+	static void cancelCB( Widget, XtPointer, XtPointer );
+	virtual void cancelCB( Widget, XtPointer ) = 0;
+	static void okCB( Widget, XtPointer, XtPointer );
+	virtual void okCB( Widget, XtPointer ) = 0;
+};
+
+typedef passwd_shell_c *passwd_shell_p;
+
+
+extern passwd_shell_p passwd_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uipref.cc b/ecflow_4_0_7/view/src/libui/uipref.cc
new file mode 100644
index 0000000..5b69e71
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uipref.cc
@@ -0,0 +1,105 @@
+#include <Xm/Protocols.h>
+#include "Tab.h"
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/CascadeB.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+
+#include <Xm/Protocols.h>  
+#include "flags.h"
+#include "uipref.h"
+
+pref_shell_p pref_shell = (pref_shell_p) NULL;
+
+
+
+void pref_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[2];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget menuBar1 = (Widget)NULL;
+	Widget cascade1 = (Widget)NULL;
+	Widget menu1 = (Widget)NULL;
+
+	if ( !widget_name )
+	  widget_name = (char*) "pref_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, FALSE); ac++;
+	pref_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = pref_shell;
+	XmAddWMProtocolCallback( pref_shell, XmInternAtom(XtDisplay(pref_shell), (char*) "WM_DELETE_WINDOW", False),&pref_shell_c:: closeCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNresizePolicy, XmRESIZE_ANY); ac++;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( pref_shell, (char*)"form_", al, ac );
+	ac = 0;
+#define XmCreateDrawingArea CreateTab
+	tab_ = XmCreateDrawingArea ( form_, (char*)"tab_", al, ac );
+	ac = 0;
+	menuBar1 = XmCreateMenuBar ( form_, (char*)"menuBar1", al, ac );
+	cascade1 = XmCreateCascadeButton ( menuBar1, (char*)"File", al, ac );
+	menu1 = XmCreatePulldownMenu ( menuBar1, (char*)"menu1", al, ac );
+	button_close = XmCreatePushButton ( menu1, (char*)"button_close", al, ac );
+	XtSetArg(al[ac], XmNcancelButton, button_close); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, menuBar1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tab_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( menuBar1,al, ac );
+	ac = 0;
+	XtAddCallback (form_, XmNmapCallback,&pref_shell_c:: mapCB, (XtPointer) this);
+	XtAddCallback (button_close, XmNactivateCallback,&pref_shell_c:: closeCB, (XtPointer) this);
+	children[ac++] = button_close;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu1); ac++;
+	XtSetValues ( cascade1, al, ac );
+	ac = 0;
+	children[ac++] = cascade1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tab_;
+	children[ac++] = menuBar1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void pref_shell_c::mapCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	pref_shell_p instance = (pref_shell_p) client_data;
+	instance->mapCB ( widget, call_data );
+}
+
+void pref_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	pref_shell_p instance = (pref_shell_p) client_data;
+	instance->closeCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uipref.h b/ecflow_4_0_7/view/src/libui/uipref.h
new file mode 100644
index 0000000..9dc2d8b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uipref.h
@@ -0,0 +1,34 @@
+#include <Xm/Protocols.h>
+#include "Tab.h"
+/*
+** Generated by X-Designer
+*/
+#ifndef _uipref_h
+#define _uipref_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class pref_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget pref_shell;
+	Widget form_;
+	Widget tab_;
+	Widget button_close;
+public:
+	static void mapCB( Widget, XtPointer, XtPointer );
+	virtual void mapCB( Widget, XtPointer ) = 0;
+	static void closeCB( Widget, XtPointer, XtPointer );
+	virtual void closeCB( Widget, XtPointer ) = 0;
+};
+
+typedef pref_shell_c *pref_shell_p;
+
+
+extern pref_shell_p pref_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiscript.cc b/ecflow_4_0_7/view/src/libui/uiscript.cc
new file mode 100644
index 0000000..ee29d6e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiscript.cc
@@ -0,0 +1,126 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+
+#include "uiscript.h"
+
+script_p script_form = (script_p) NULL;
+
+
+
+void script_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledText4 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "script_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	script_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = script_form;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
+	text_ = XmCreateScrolledText ( script_form, "text_", al, ac );
+	ac = 0;
+	scrolledText4 = XtParent ( text_ );
+
+	XtSetArg(al[ac], XmNhighlightThickness, 1); ac++;
+	XtSetArg(al[ac], XmNshadowThickness, 1); ac++;
+	XtSetArg(al[ac], XmNeditable, FALSE); ac++;
+	XtSetArg(al[ac], XmNcursorPositionVisible, FALSE); ac++;
+	name_ = XmCreateTextField ( script_form, "name_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( script_form, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button2 = XmCreatePushButton ( tools_, "Use external viewer", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Search", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, name_); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( scrolledText4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightWidget, tools_); ac++;
+	XtSetValues ( name_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+	XtManageChild(text_);
+	XtAddCallback (button2, XmNactivateCallback,&script_form_c:: externalCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&script_form_c:: searchCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = name_;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void script_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	script_form_p instance = (script_form_p) client_data;
+	instance->externalCB ( widget, call_data );
+}
+
+void script_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	script_form_p instance = (script_form_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiscript.h b/ecflow_4_0_7/view/src/libui/uiscript.h
new file mode 100644
index 0000000..3fa9d62
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiscript.h
@@ -0,0 +1,34 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiscript_h
+#define _uiscript_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class script_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget script_form;
+	Widget text_;
+	Widget name_;
+	Widget tools_;
+public:
+	static void externalCB( Widget, XtPointer, XtPointer );
+	virtual void externalCB( Widget, XtPointer ) = 0;
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+};
+
+typedef script_form_c *script_form_p;
+class script;
+typedef script *script_p;
+
+
+extern script_p script_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uisearch.cc b/ecflow_4_0_7/view/src/libui/uisearch.cc
new file mode 100644
index 0000000..80996a9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uisearch.cc
@@ -0,0 +1,565 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+// #pragma GCC diagnostic ignored "-Wwrite-strings"
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/TextF.h>
+#include <Xm/Label.h>
+#include <Xm/LabelG.h>
+#include <Xm/ToggleB.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/Protocols.h>  
+#include "flags.h"
+#include "uisearch.h"
+
+search_shell_p search_shell = (search_shell_p) NULL;
+
+
+
+void search_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[20];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget drawingArea1 = (Widget)NULL;
+	Widget drawingArea2 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget frame7 = (Widget)NULL;
+	Widget frame6 = (Widget)NULL;
+	Widget frame5 = (Widget)NULL;
+	Widget frame4 = (Widget)NULL;
+	Widget frame1 = (Widget)NULL;
+	Widget toggle59 = (Widget)NULL;
+	Widget toggle60 = (Widget)NULL;
+	Widget toggle61 = (Widget)NULL;
+	Widget toggle62 = (Widget)NULL;
+	Widget toggle63 = (Widget)NULL;
+	Widget toggle64 = (Widget)NULL;
+	Widget toggle65 = (Widget)NULL;
+	Widget frame2 = (Widget)NULL;
+	Widget toggle21 = (Widget)NULL;
+	Widget toggle22 = (Widget)NULL;
+	Widget toggle23 = (Widget)NULL;
+	Widget toggle24 = (Widget)NULL;
+	Widget toggle25 = (Widget)NULL;
+	Widget toggle26 = (Widget)NULL;
+	Widget toggle27 = (Widget)NULL;
+	Widget toggle28 = (Widget)NULL;
+	Widget toggle29 = (Widget)NULL;
+	Widget toggle30 = (Widget)NULL;
+	Widget toggle31 = (Widget)NULL;
+	Widget toggle32 = (Widget)NULL;
+	Widget toggle2 = (Widget)NULL;
+	Widget toggle3 = (Widget)NULL;
+	Widget frame3 = (Widget)NULL;
+	Widget toggle41 = (Widget)NULL;
+	Widget toggle42 = (Widget)NULL;
+	Widget toggle1 = (Widget)NULL;
+	Widget toggle43 = (Widget)NULL;
+	Widget toggle44 = (Widget)NULL;
+	Widget toggle45 = (Widget)NULL;
+	Widget toggle66 = (Widget)NULL;
+	toggle11_ = (Widget)NULL;
+	toggle12_ = (Widget)NULL;
+	toggle13_ = (Widget)NULL;
+	fname_ = (Widget)NULL;
+	icase_ = (Widget)NULL;
+	if ( !widget_name )
+	  widget_name = (char*) "search_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	search_shell = XmCreateDialogShell ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = search_shell;
+	XmAddWMProtocolCallback( search_shell, XmInternAtom(XtDisplay(search_shell), (char*) "WM_DELETE_WINDOW", False),&search_shell_c:: closeCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNresizePolicy, XmRESIZE_ANY); ac++;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( search_shell, (char*) "form_", al, ac );
+	ac = 0;
+	button_search = XmCreatePushButton ( form_, "button_search", al, ac );
+	drawingArea1 = XmCreateDrawingArea ( form_, "drawingArea1", al, ac );
+	button_close = XmCreatePushButton ( form_, "button_close", al, ac );
+	drawingArea2 = XmCreateDrawingArea ( form_, "drawingArea2", al, ac );
+	form1 = XmCreateForm ( form_, "form1", al, ac );
+	frame5 = XmCreateFrame ( form1, "frame5", al, ac );
+	what_text_ = XmCreateTextField ( frame5, "what_text_", al, ac );
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	what_ = XmCreateToggleButton ( frame5, "what_", al, ac );
+	ac = 0;
+	frame4 = XmCreateFrame ( form1, "frame4", al, ac );
+	XtSetArg(al[ac], XmNnumColumns, 3); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	where_rowcol_ = XmCreateRowColumn ( frame4, "where_rowcol_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	where_ = XmCreateToggleButton ( frame4, "where_", al, ac );
+	ac = 0;
+	frame1 = XmCreateFrame ( form1, "frame1", al, ac );
+	XtSetArg(al[ac], XmNnumColumns, 2); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	status_rowcol_ = XmCreateRowColumn ( frame1, "status_rowcol_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new statusFlag(STATUS_UNKNOWN)); ac++;
+	toggle59 = XmCreateToggleButton ( status_rowcol_, "Unknown", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new statusFlag(STATUS_SUSPENDED)); ac++;
+	toggle60 = XmCreateToggleButton ( status_rowcol_, "Suspended", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new statusFlag(STATUS_COMPLETE)); ac++;
+	toggle61 = XmCreateToggleButton ( status_rowcol_, "Complete", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new statusFlag(STATUS_QUEUED)); ac++;
+	toggle62 = XmCreateToggleButton ( status_rowcol_, "Queued", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new statusFlag(STATUS_SUBMITTED)); ac++;
+	toggle63 = XmCreateToggleButton ( status_rowcol_, "Submitted", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new statusFlag(STATUS_ACTIVE)); ac++;
+	toggle64 = XmCreateToggleButton ( status_rowcol_, "Active", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new statusFlag(STATUS_ABORTED)); ac++;
+	toggle65 = XmCreateToggleButton ( status_rowcol_, "Aborted", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	status_ = XmCreateToggleButton ( frame1, "Status:", al, ac );
+	ac = 0;
+	frame2 = XmCreateFrame ( form1, "frame2", al, ac );
+	XtSetArg(al[ac], XmNnumColumns, 3); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	type_rowcol_ = XmCreateRowColumn ( frame2, "type_rowcol_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_SUITE)); ac++;
+	toggle21 = XmCreateToggleButton ( type_rowcol_, "toggle21", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_FAMILY)); ac++;
+	toggle22 = XmCreateToggleButton ( type_rowcol_, "toggle22", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_TASK)); ac++;
+	toggle23 = XmCreateToggleButton ( type_rowcol_, "toggle23", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_ALIAS)); ac++;
+	toggle24 = XmCreateToggleButton ( type_rowcol_, "toggle24", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_LABEL)); ac++;
+	toggle25 = XmCreateToggleButton ( type_rowcol_, "toggle25", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_METER)); ac++;
+	toggle26 = XmCreateToggleButton ( type_rowcol_, "toggle26", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_EVENT)); ac++;
+	toggle27 = XmCreateToggleButton ( type_rowcol_, "toggle27", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_REPEAT)); ac++;
+	toggle28 = XmCreateToggleButton ( type_rowcol_, "toggle28", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_TIME)); ac++;
+	toggle29 = XmCreateToggleButton ( type_rowcol_, "toggle29", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_DATE)); ac++;
+	toggle30 = XmCreateToggleButton ( type_rowcol_, "toggle30", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_TRIGGER)); ac++;
+	toggle31 = XmCreateToggleButton ( type_rowcol_, "toggle31", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_VARIABLE)); ac++;
+	toggle32 = XmCreateToggleButton ( type_rowcol_, "toggle32", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_LIMIT)); ac++;
+	toggle2 = XmCreateToggleButton ( type_rowcol_, "toggle2", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_INLIMIT)); ac++;
+	toggle3 = XmCreateToggleButton ( type_rowcol_, "toggle3", al, ac );
+
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new typeFlag(NODE_SUPER)); ac++;
+	toggle66 = XmCreateToggleButton ( type_rowcol_, "toggle66", al, ac );
+
+	ac = 0;
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	type_ = XmCreateToggleButton ( frame2, "Type:", al, ac );
+	ac = 0;
+	frame3 = XmCreateFrame ( form1, "frame3", al, ac );
+	XtSetArg(al[ac], XmNnumColumns, 2); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	special_rowcol_ = XmCreateRowColumn ( frame3, "special_rowcol_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new procFlag(&node::isTimeDependent)); ac++;
+	toggle41 = XmCreateToggleButton ( special_rowcol_, "toggle41", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new procFlag(&node::isLate)); ac++;
+	toggle42 = XmCreateToggleButton ( special_rowcol_, "toggle42", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new procFlag(&node::isWaiting)); ac++;
+	toggle1 = XmCreateToggleButton ( special_rowcol_, "Waiting nodes", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new procFlag(&node::isZombie)); ac++;
+	toggle43 = XmCreateToggleButton ( special_rowcol_, "toggle43", al, ac ); 
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new procFlag(&node::isRerun)); ac++;
+	toggle44 = XmCreateToggleButton ( special_rowcol_, "toggle44", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new procFlag(&node::hasMessages)); ac++;
+	toggle45 = XmCreateToggleButton ( special_rowcol_, "toggle45", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	special_ = XmCreateToggleButton ( frame3, "Special:", al, ac );
+
+	ac = 0;
+	frame6 = XmCreateFrame ( form1, "frame6", al, ac );
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	timed_rowcol_ = XmCreateRowColumn ( frame6, "timed_rowcol_", al, ac );
+	ac = 0;
+	timed_text_since_ = XmCreateTextField(timed_rowcol_,"timed_text_since",al,ac);
+	timed_text_from_ = XmCreateTextField(timed_rowcol_,"timed_text_from",al,ac);
+	XmTextFieldSetString(timed_text_since_, "0");
+	XmTextFieldSetString(timed_text_from_, "86400");
+	Widget label44 = XmCreateLabel ( timed_rowcol_, "from-to (seconds)", al, ac );
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	timed_ = XmCreateToggleButton ( frame6, "Status time:", al, ac );
+
+	ac = 0;
+	frame7 = XmCreateFrame ( form1, "frame7", al, ac );
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	misc_rowcol_ = XmCreateRowColumn ( frame7, "misc_rowcol_", al, ac );
+	ac = 0;
+	icase_ = XmCreateToggleButton(misc_rowcol_, "ignore case",al,ac);
+
+	ac = 0;
+	fname_ = XmCreateRadioBox ( misc_rowcol_, "search_kind", al, ac );
+	toggle11_ = XmCreateToggleButtonGadget ( fname_, "reg. exp.", al, ac );
+	toggle12_ = XmCreateToggleButtonGadget ( fname_, "glob", al, ac );
+	toggle13_ = XmCreateToggleButtonGadget ( fname_, "substring", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form_,al, ac );
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	misc_ = XmCreateToggleButton ( frame7, "Misc.:", al, ac );
+
+	ac = 0;
+	XtSetArg(al[ac], XmNcancelButton, button_close); ac++;
+	XtSetArg(al[ac], XmNdefaultButton, button_search); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 3); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( button_search,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, button_close); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 88); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, button_search); ac++;
+	XtSetValues ( drawingArea1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 3); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+	XtSetValues ( button_close,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, button_close); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 98); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, button_search); ac++;
+	XtSetValues ( drawingArea2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, drawingArea2); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+	XtAddCallback (form_, XmNmapCallback,&search_shell_c:: mapCB, (XtPointer) this);
+	XtAddCallback (button_search, XmNactivateCallback,&search_shell_c:: searchCB, (XtPointer) this);
+	XtAddCallback (button_close, XmNactivateCallback,&search_shell_c:: closeCB, (XtPointer) this);
+
+	XtAddCallback (toggle13_, XmNvalueChangedCallback, &search_shell_c::radioCB, (XtPointer) this);
+	XtAddCallback (toggle11_, XmNvalueChangedCallback, &search_shell_c::radioCB, (XtPointer) this);
+	XtAddCallback (toggle12_, XmNvalueChangedCallback, &search_shell_c::radioCB, (XtPointer) this);
+	XtAddCallback (fname_, XmNsimpleCallback,&search_shell_c::radioCB,(XtPointer)this);
+	/* http://www.cs.cf.ac.uk/Dave/X_lecture/node8.html */
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 3); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( frame5,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 3); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame5); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( frame4,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 3); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame4); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( frame1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 3); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame1); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( frame2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 3); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( frame3,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 3); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame3); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( frame6,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 3); ac++;
+	XtSetArg(al[ac], XmNtopWidget, frame6); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 3); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 3); ac++;
+	XtSetValues ( frame7,al, ac );
+	ac = 0;
+
+	XtAddCallback (what_, XmNvalueChangedCallback,&search_shell_c:: whatCB, (XtPointer) this);
+	children[ac++] = what_text_;
+	children[ac++] = what_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (where_, XmNvalueChangedCallback,&search_shell_c:: whereCB, (XtPointer) this);
+	children[ac++] = where_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = toggle59;
+	children[ac++] = toggle60;
+	children[ac++] = toggle61;
+	children[ac++] = toggle62;
+	children[ac++] = toggle63;
+	children[ac++] = toggle64;
+	children[ac++] = toggle65;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (status_, XmNvalueChangedCallback,&search_shell_c:: statusCB, (XtPointer) this);
+	children[ac++] = status_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = toggle21;
+	children[ac++] = toggle22;
+	children[ac++] = toggle23;
+	children[ac++] = toggle24;
+	children[ac++] = toggle25;
+	children[ac++] = toggle26;
+	children[ac++] = toggle27;
+	children[ac++] = toggle28;
+	children[ac++] = toggle29;
+	children[ac++] = toggle30;
+	children[ac++] = toggle31;
+	children[ac++] = toggle32;
+	children[ac++] = toggle2;
+	children[ac++] = toggle3;
+	children[ac++] = toggle66;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (type_, XmNvalueChangedCallback,&search_shell_c:: typeCB, (XtPointer) this);
+	children[ac++] = type_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = toggle41;
+	children[ac++] = toggle42;
+	children[ac++] = toggle1;
+	children[ac++] = toggle43;
+	children[ac++] = toggle44;
+	children[ac++] = toggle45;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (special_, XmNvalueChangedCallback,
+		       &search_shell_c::specialCB, (XtPointer) this);
+	children[ac++] = special_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = timed_text_from_;
+	children[ac++] = timed_text_since_;
+	children[ac++] = label44;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (timed_, XmNvalueChangedCallback,
+		       &search_shell_c::timedCB, (XtPointer) this);
+	children[ac++] = timed_;
+	XtManageChildren(children, ac);
+
+	ac = 0;
+	children[ac++] = fname_;
+	children[ac++] = icase_;
+	// children[ac++] = radio_;
+	XtManageChildren(children, ac);
+
+
+	ac = 0;
+	children[ac++] = toggle11_;
+	children[ac++] = toggle12_;
+	children[ac++] = toggle13_;
+	XtManageChildren(children, ac);
+
+	ac = 0;
+	XtAddCallback (misc_, XmNvalueChangedCallback,
+		       &search_shell_c::miscCB, (XtPointer) this);
+	children[ac++] = misc_;
+	XtManageChildren(children, ac);
+
+	ac = 0;
+	children[ac++] = frame5;
+	children[ac++] = frame4;
+	children[ac++] = frame1;
+	children[ac++] = frame2;
+	children[ac++] = frame3;
+	children[ac++] = frame7;
+	children[ac++] = frame6;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = button_search;
+	children[ac++] = drawingArea1;
+	children[ac++] = button_close;
+	children[ac++] = drawingArea2;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void search_shell_c::specialCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->specialCB ( widget, call_data );
+}
+
+void search_shell_c::typeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->typeCB ( widget, call_data );
+}
+
+void search_shell_c::statusCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->statusCB ( widget, call_data );
+}
+
+void search_shell_c::whereCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->whereCB ( widget, call_data );
+}
+
+void search_shell_c::whatCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->whatCB ( widget, call_data );
+}
+
+void search_shell_c::mapCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->mapCB ( widget, call_data );
+}
+
+void search_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->closeCB ( widget, call_data );
+}
+
+void search_shell_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
+void search_shell_c::timedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->timedCB ( widget, call_data );
+}
+
+void search_shell_c::miscCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->miscCB ( widget, call_data );
+}
+
+void search_shell_c::radioCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	search_shell_p instance = (search_shell_p) client_data;
+	instance->radioCB ( widget, call_data );
+}
diff --git a/ecflow_4_0_7/view/src/libui/uisearch.h b/ecflow_4_0_7/view/src/libui/uisearch.h
new file mode 100644
index 0000000..b665e24
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uisearch.h
@@ -0,0 +1,65 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uisearch_h
+#define _uisearch_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class search_shell_c: public xd_XmDialog_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+	Widget regex_, icase_, subst_, fname_, toggle11_, toggle12_, toggle13_;
+protected:
+	Widget search_shell;
+	Widget form_;
+	Widget button_search;
+	Widget button_close;
+	Widget what_text_;
+	Widget what_;
+	Widget where_rowcol_;
+	Widget where_;
+	Widget status_rowcol_;
+	Widget status_;
+	Widget type_rowcol_;
+	Widget type_;
+	Widget special_rowcol_;
+	Widget special_;
+	Widget timed_, misc_;
+	Widget timed_rowcol_, timed_rowcol2_, misc_rowcol_;
+	Widget timed_text_since_, timed_text_from_;
+public:
+	static void radioCB( Widget, XtPointer, XtPointer );
+	virtual void radioCB( Widget, XtPointer ) = 0;
+
+	static void miscCB( Widget, XtPointer, XtPointer );
+	virtual void miscCB( Widget, XtPointer ) = 0;
+	static void timedCB( Widget, XtPointer, XtPointer );
+	virtual void timedCB( Widget, XtPointer ) = 0;
+	static void specialCB( Widget, XtPointer, XtPointer );
+	virtual void specialCB( Widget, XtPointer ) = 0;
+	static void typeCB( Widget, XtPointer, XtPointer );
+	virtual void typeCB( Widget, XtPointer ) = 0;
+	static void statusCB( Widget, XtPointer, XtPointer );
+	virtual void statusCB( Widget, XtPointer ) = 0;
+	static void whereCB( Widget, XtPointer, XtPointer );
+	virtual void whereCB( Widget, XtPointer ) = 0;
+	static void whatCB( Widget, XtPointer, XtPointer );
+	virtual void whatCB( Widget, XtPointer ) = 0;
+	static void mapCB( Widget, XtPointer, XtPointer );
+	virtual void mapCB( Widget, XtPointer ) = 0;
+	static void closeCB( Widget, XtPointer, XtPointer );
+	virtual void closeCB( Widget, XtPointer ) = 0;
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+};
+
+typedef search_shell_c *search_shell_p;
+
+
+extern search_shell_p search_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiservers.cc b/ecflow_4_0_7/view/src/libui/uiservers.cc
new file mode 100644
index 0000000..9901c7c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiservers.cc
@@ -0,0 +1,225 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+
+
+#include "uiservers.h"
+
+servers_form_p servers_form = (servers_form_p) NULL;
+
+
+
+void servers_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[6];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledList1 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget rowcol1 = (Widget)NULL;
+	Widget separator1 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget rowcol2 = (Widget)NULL;
+	Widget label1 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+	Widget label3 = (Widget)NULL;
+	Widget separator2 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "Servers";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	servers_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = servers_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( servers_form, "form_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNvisibleItemCount, 17); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmCONSTANT); ac++;
+	list_ = XmCreateScrolledList ( form_, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+	form1 = XmCreateForm ( form_, "form1", al, ac );
+	XtSetArg(al[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
+	rowcol1 = XmCreateRowColumn ( form1, "rowcol1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	add_ = XmCreatePushButton ( rowcol1, "Add", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	update_ = XmCreatePushButton ( rowcol1, "Update", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	remove_ = XmCreatePushButton ( rowcol1, "Remove", al, ac );
+	ac = 0;
+	separator1 = XmCreateSeparator ( rowcol1, "separator1", al, ac );
+
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	button3 = XmCreatePushButton ( rowcol1, "Scan network...", al, ac );
+	ac = 0;
+
+	rowcol2 = XmCreateRowColumn ( form1, "rowcol2", al, ac );
+	label1 = XmCreateLabel ( rowcol2, "Name:", al, ac );
+	name_ = XmCreateTextField ( rowcol2, "name_", al, ac );
+	label2 = XmCreateLabel ( rowcol2, "Host:", al, ac );
+	host_ = XmCreateTextField ( rowcol2, "host_", al, ac );
+	label3 = XmCreateLabel ( rowcol2, "Port:", al, ac );
+	number_ = XmCreateTextField ( rowcol2, "number_", al, ac );
+	separator2 = XmCreateSeparator ( form1, "separator2", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 5); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightWidget, form1); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 5); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&servers_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( rowcol1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( rowcol2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, rowcol2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, rowcol1); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( separator2,al, ac );
+	ac = 0;
+	XtAddCallback (add_, XmNactivateCallback,&servers_form_c:: addCB, (XtPointer) this);
+	XtAddCallback (update_, XmNactivateCallback,&servers_form_c:: updateCB, (XtPointer) this);
+	XtAddCallback (remove_, XmNactivateCallback,&servers_form_c:: removeCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&servers_form_c:: serversCB, (XtPointer) this);
+	children[ac++] = add_;
+	children[ac++] = update_;
+	children[ac++] = remove_;
+	children[ac++] = separator1;
+	children[ac++] = button3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (name_, XmNvalueChangedCallback,&servers_form_c:: changedCB, (XtPointer) this);
+	XtAddCallback (host_, XmNvalueChangedCallback,&servers_form_c:: changedCB, (XtPointer) this);
+	XtAddCallback (number_, XmNvalueChangedCallback,&servers_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = label1;
+	children[ac++] = name_;
+	children[ac++] = label2;
+	children[ac++] = host_;
+	children[ac++] = label3;
+	children[ac++] = number_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = rowcol1;
+	children[ac++] = rowcol2;
+	children[ac++] = separator2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void servers_form_c::updateCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	servers_form_p instance = (servers_form_p) client_data;
+	instance->updateCB ( widget, call_data );
+}
+
+void servers_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	servers_form_p instance = (servers_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
+void servers_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	servers_form_p instance = (servers_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
+void servers_form_c::removeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	servers_form_p instance = (servers_form_p) client_data;
+	instance->removeCB ( widget, call_data );
+}
+
+void servers_form_c::addCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	servers_form_p instance = (servers_form_p) client_data;
+	instance->addCB ( widget, call_data );
+}
+
+void servers_form_c::serversCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	servers_form_p instance = (servers_form_p) client_data;
+	instance->serversCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiservers.h b/ecflow_4_0_7/view/src/libui/uiservers.h
new file mode 100644
index 0000000..2d100e3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiservers.h
@@ -0,0 +1,45 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiservers_h
+#define _uiservers_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class servers_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget servers_form;
+	Widget form_;
+	Widget list_;
+	Widget add_;
+	Widget update_;
+	Widget remove_;
+	Widget name_;
+	Widget host_;
+	Widget number_;
+public:
+	static void updateCB( Widget, XtPointer, XtPointer );
+	virtual void updateCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+	static void removeCB( Widget, XtPointer, XtPointer );
+	virtual void removeCB( Widget, XtPointer ) = 0;
+	static void addCB( Widget, XtPointer, XtPointer );
+	virtual void addCB( Widget, XtPointer ) = 0;
+	static void serversCB( Widget, XtPointer, XtPointer );
+	virtual void serversCB( Widget, XtPointer ) = 0;
+};
+
+typedef servers_form_c *servers_form_p;
+
+
+extern servers_form_p servers_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uisuites.cc b/ecflow_4_0_7/view/src/libui/uisuites.cc
new file mode 100644
index 0000000..43cf501
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uisuites.cc
@@ -0,0 +1,127 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+
+
+#include "uisuites.h"
+
+suites_form_p suites_form = (suites_form_p) NULL;
+
+
+
+void suites_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form2 = (Widget)NULL;
+	Widget scrolledList1 = (Widget)NULL;
+	Widget rowcol2 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "suites_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	suites_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = suites_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form2 = XmCreateForm ( suites_form, "form2", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form2, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+	tools_ = XmCreateRowColumn ( form2, "tools_", al, ac );
+	apply_ = XmCreatePushButton ( tools_, "Apply", al, ac );
+	rowcol2 = XmCreateRowColumn ( form2, "rowcol2", al, ac );
+	button1 = XmCreatePushButton ( rowcol2, "all_on", al, ac );
+	button2 = XmCreatePushButton ( rowcol2, "all_off", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, rowcol2); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( rowcol2,al, ac );
+	ac = 0;
+
+	XtManageChild(list_);
+	XtAddCallback (apply_, XmNactivateCallback,&suites_form_c:: tellCB, (XtPointer) this);
+	children[ac++] = apply_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (button1, XmNactivateCallback,&suites_form_c:: onCB, (XtPointer) this);
+	XtAddCallback (button2, XmNactivateCallback,&suites_form_c:: offCB, (XtPointer) this);
+	children[ac++] = button1;
+	children[ac++] = button2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = tools_;
+	children[ac++] = rowcol2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form2;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void suites_form_c::tellCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	suites_form_p instance = (suites_form_p) client_data;
+	instance->tellCB ( widget, call_data );
+}
+
+void suites_form_c::offCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	suites_form_p instance = (suites_form_p) client_data;
+	instance->offCB ( widget, call_data );
+}
+
+void suites_form_c::onCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	suites_form_p instance = (suites_form_p) client_data;
+	instance->onCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uisuites.h b/ecflow_4_0_7/view/src/libui/uisuites.h
new file mode 100644
index 0000000..e7b348c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uisuites.h
@@ -0,0 +1,34 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uisuites_h
+#define _uisuites_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class suites_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget suites_form;
+	Widget list_;
+	Widget tools_;
+	Widget apply_;
+public:
+	static void tellCB( Widget, XtPointer, XtPointer );
+	virtual void tellCB( Widget, XtPointer ) = 0;
+	static void offCB( Widget, XtPointer, XtPointer );
+	virtual void offCB( Widget, XtPointer ) = 0;
+	static void onCB( Widget, XtPointer, XtPointer );
+	virtual void onCB( Widget, XtPointer ) = 0;
+};
+
+typedef suites_form_c *suites_form_p;
+
+
+extern suites_form_p suites_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uitimetable.cc b/ecflow_4_0_7/view/src/libui/uitimetable.cc
new file mode 100644
index 0000000..1f94e5a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitimetable.cc
@@ -0,0 +1,351 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/ScrolledW.h>
+#include <Xm/Separator.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+#include <Xm/ToggleBG.h>
+
+extern "C" {
+#include "SimpleTime.h"
+#include "Hyper.h"
+}
+#define XmCreateDrawnButton CreateHyper
+#include <xdclass.h>
+
+class timetable_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget timetable_form;
+	Widget file_;
+	Widget from_;
+	Widget to_;
+	Widget all_;
+	Widget tasks_;
+	Widget by_name_;
+	Widget by_time_;
+	Widget time_;
+	Widget menu_;
+	Widget label_;
+	Widget set_from_;
+	Widget set_to_;
+	Widget set_both_;
+	Widget tools_;
+public:
+	static void optionsCB( Widget, XtPointer, XtPointer );
+	virtual void optionsCB( Widget, XtPointer ) = 0;
+	static void resetCB( Widget, XtPointer, XtPointer );
+	virtual void resetCB( Widget, XtPointer ) = 0;
+	static void setBothCB( Widget, XtPointer, XtPointer );
+	virtual void setBothCB( Widget, XtPointer ) = 0;
+	static void setToCB( Widget, XtPointer, XtPointer );
+	virtual void setToCB( Widget, XtPointer ) = 0;
+	static void setFromCB( Widget, XtPointer, XtPointer );
+	virtual void setFromCB( Widget, XtPointer ) = 0;
+	static void activateCB( Widget, XtPointer, XtPointer );
+	virtual void activateCB( Widget, XtPointer ) = 0;
+	static void updateCB( Widget, XtPointer, XtPointer );
+	virtual void updateCB( Widget, XtPointer ) = 0;
+	static void loadCB( Widget, XtPointer, XtPointer );
+	virtual void loadCB( Widget, XtPointer ) = 0;
+	static void mergeCB( Widget, XtPointer, XtPointer );
+	virtual void mergeCB( Widget, XtPointer ) = 0;
+};
+
+typedef timetable_form_c *timetable_form_p;
+class timetable;
+typedef timetable *timetable_p;
+
+timetable_p timetable_form = (timetable_p) NULL;
+
+
+
+void timetable_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[6];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form2 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget radioBox1 = (Widget)NULL;
+	Widget radioBox2 = (Widget)NULL;
+	Widget scrolledWin1 = (Widget)NULL;
+	Widget scrollbar1 = (Widget)NULL;
+	Widget scrollbar2 = (Widget)NULL;
+	Widget separator2 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget button4 = (Widget)NULL;
+	Widget button5 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "timetable_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	timetable_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = timetable_form;
+	form2 = XmCreateForm ( timetable_form, "form2", al, ac );
+	form1 = XmCreateForm ( form2, "form1", al, ac );
+	file_ = XmCreateTextField ( form1, "file_", al, ac );
+	XtSetArg(al[ac], XmNcolumns, 19); ac++;
+	from_ = XmCreateText ( form1, "from_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNcolumns, 19); ac++;
+	to_ = XmCreateText ( form1, "to_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_TIGHT); ac++;
+	radioBox1 = XmCreateRadioBox ( form1, "radioBox1", al, ac );
+	ac = 0;
+	all_ = XmCreateToggleButtonGadget ( radioBox1, "All", al, ac );
+	tasks_ = XmCreateToggleButtonGadget ( radioBox1, "Tasks only", al, ac );
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_TIGHT); ac++;
+	radioBox2 = XmCreateRadioBox ( form1, "radioBox2", al, ac );
+	ac = 0;
+	by_name_ = XmCreateToggleButtonGadget ( radioBox2, "Sort by name", al, ac );
+	by_time_ = XmCreateToggleButtonGadget ( radioBox2, "Sort by time", al, ac );
+	XtSetArg(al[ac], XmNscrollingPolicy, XmAUTOMATIC); ac++;
+	scrolledWin1 = XmCreateScrolledWindow ( form2, "scrolledWin1", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNhorizontalScrollBar, &scrollbar1 ); ac++;
+	XtSetArg(al[ac], XmNverticalScrollBar, &scrollbar2 ); ac++;
+	XtGetValues(scrolledWin1, al, ac );
+	ac = 0;
+#define XmCreateDrawingArea CreateTime
+	time_ = XmCreateDrawingArea ( scrolledWin1, "time_", al, ac );
+	ac = 0;
+	menu_ = XmCreatePopupMenu ( time_, "menu_", al, ac );
+	XtSetArg(al[ac], XmNx, 2); ac++;
+	XtSetArg(al[ac], XmNy, 2); ac++;
+	label_ = XmCreateLabel ( menu_, "timeline_label", al, ac );
+	ac = 0;
+	separator2 = XmCreateSeparator ( menu_, "separator2", al, ac );
+	XtSetArg(al[ac], XmNx, 2); ac++;
+	XtSetArg(al[ac], XmNy, 22); ac++;
+	set_from_ = XmCreatePushButton ( menu_, "Set start of display range to this date", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNx, 2); ac++;
+	XtSetArg(al[ac], XmNy, 44); ac++;
+	set_to_ = XmCreatePushButton ( menu_, "Set end of display range to this date", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNx, 2); ac++;
+	XtSetArg(al[ac], XmNy, 66); ac++;
+	set_both_ = XmCreatePushButton ( menu_, "Set display range to these dates", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNx, 2); ac++;
+	XtSetArg(al[ac], XmNy, 88); ac++;
+	button2 = XmCreatePushButton ( menu_, "Reset display range", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	tools_ = XmCreateRowColumn ( form2, "tools_", al, ac );
+	ac = 0;
+	button3 = XmCreatePushButton ( tools_, "Merge", al, ac );
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button4 = XmCreatePushButton ( tools_, "Load", al, ac );
+	ac = 0;
+	button5 = XmCreatePushButton ( tools_, "Update", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, tools_); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledWin1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, radioBox1); ac++;
+	XtSetValues ( file_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, to_); ac++;
+	XtSetValues ( from_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( to_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, radioBox2); ac++;
+	XtSetValues ( radioBox1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, from_); ac++;
+	XtSetValues ( radioBox2,al, ac );
+	ac = 0;
+	XtAddCallback (file_, XmNactivateCallback,&timetable_form_c:: activateCB, (XtPointer) this);
+	XtAddCallback (from_, XmNactivateCallback,&timetable_form_c:: activateCB, (XtPointer) this);
+	XtAddCallback (to_, XmNactivateCallback,&timetable_form_c:: activateCB, (XtPointer) this);
+	XtAddCallback (all_, XmNvalueChangedCallback,&timetable_form_c:: optionsCB, (XtPointer) this);
+	XtAddCallback (tasks_, XmNvalueChangedCallback,&timetable_form_c:: optionsCB, (XtPointer) this);
+	children[ac++] = all_;
+	children[ac++] = tasks_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (by_name_, XmNvalueChangedCallback,&timetable_form_c:: optionsCB, (XtPointer) this);
+	XtAddCallback (by_time_, XmNvalueChangedCallback,&timetable_form_c:: optionsCB, (XtPointer) this);
+	children[ac++] = by_name_;
+	children[ac++] = by_time_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = file_;
+	children[ac++] = from_;
+	children[ac++] = to_;
+	children[ac++] = radioBox1;
+	children[ac++] = radioBox2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (set_from_, XmNactivateCallback,&timetable_form_c:: setFromCB, (XtPointer) this);
+	XtAddCallback (set_to_, XmNactivateCallback,&timetable_form_c:: setToCB, (XtPointer) this);
+	XtAddCallback (set_both_, XmNactivateCallback,&timetable_form_c:: setBothCB, (XtPointer) this);
+	XtAddCallback (button2, XmNactivateCallback,&timetable_form_c:: resetCB, (XtPointer) this);
+	children[ac++] = label_;
+	children[ac++] = separator2;
+	children[ac++] = set_from_;
+	children[ac++] = set_to_;
+	children[ac++] = set_both_;
+	children[ac++] = button2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = time_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XmScrolledWindowSetAreas(scrolledWin1, scrollbar1, scrollbar2, time_ );
+	XtAddCallback (button3, XmNactivateCallback,&timetable_form_c:: mergeCB, (XtPointer) this);
+	XtAddCallback (button4, XmNactivateCallback,&timetable_form_c:: loadCB, (XtPointer) this);
+	XtAddCallback (button5, XmNactivateCallback,&timetable_form_c:: updateCB, (XtPointer) this);
+	children[ac++] = button3;
+	children[ac++] = button4;
+	children[ac++] = button5;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form1;
+	children[ac++] = scrolledWin1;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form2;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void timetable_form_c::optionsCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->optionsCB ( widget, call_data );
+}
+
+void timetable_form_c::resetCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->resetCB ( widget, call_data );
+}
+
+void timetable_form_c::setBothCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->setBothCB ( widget, call_data );
+}
+
+void timetable_form_c::setToCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->setToCB ( widget, call_data );
+}
+
+void timetable_form_c::setFromCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->setFromCB ( widget, call_data );
+}
+
+void timetable_form_c::activateCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->activateCB ( widget, call_data );
+}
+
+void timetable_form_c::updateCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->updateCB ( widget, call_data );
+}
+
+void timetable_form_c::loadCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->loadCB ( widget, call_data );
+}
+
+void timetable_form_c::mergeCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	timetable_form_p instance = (timetable_form_p) client_data;
+	instance->mergeCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uitimetable.h b/ecflow_4_0_7/view/src/libui/uitimetable.h
new file mode 100644
index 0000000..d6727e0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitimetable.h
@@ -0,0 +1,59 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uitimetable_h
+#define _uitimetable_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class timetable_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget timetable_form;
+	Widget file_;
+	Widget from_;
+	Widget to_;
+	Widget all_;
+	Widget tasks_;
+	Widget by_name_;
+	Widget by_time_;
+	Widget time_;
+	Widget menu_;
+	Widget label_;
+	Widget set_from_;
+	Widget set_to_;
+	Widget set_both_;
+	Widget tools_;
+public:
+	static void optionsCB( Widget, XtPointer, XtPointer );
+	virtual void optionsCB( Widget, XtPointer ) = 0;
+	static void resetCB( Widget, XtPointer, XtPointer );
+	virtual void resetCB( Widget, XtPointer ) = 0;
+	static void setBothCB( Widget, XtPointer, XtPointer );
+	virtual void setBothCB( Widget, XtPointer ) = 0;
+	static void setToCB( Widget, XtPointer, XtPointer );
+	virtual void setToCB( Widget, XtPointer ) = 0;
+	static void setFromCB( Widget, XtPointer, XtPointer );
+	virtual void setFromCB( Widget, XtPointer ) = 0;
+	static void activateCB( Widget, XtPointer, XtPointer );
+	virtual void activateCB( Widget, XtPointer ) = 0;
+	static void updateCB( Widget, XtPointer, XtPointer );
+	virtual void updateCB( Widget, XtPointer ) = 0;
+	static void loadCB( Widget, XtPointer, XtPointer );
+	virtual void loadCB( Widget, XtPointer ) = 0;
+	static void mergeCB( Widget, XtPointer, XtPointer );
+	virtual void mergeCB( Widget, XtPointer ) = 0;
+};
+
+typedef timetable_form_c *timetable_form_p;
+class timetable;
+typedef timetable *timetable_p;
+
+
+extern timetable_p timetable_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uitip.cc b/ecflow_4_0_7/view/src/libui/uitip.cc
new file mode 100644
index 0000000..f2858d8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitip.cc
@@ -0,0 +1,71 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+
+
+#include "uitip.h"
+
+tip_shell_p tip_shell = (tip_shell_p) NULL;
+
+
+
+void tip_shell_c::create (Widget parent, char *widget_name)
+{
+	Widget children[1];      /* Children to manage */
+	Display *display = XtDisplay ( parent );
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	XrmValue from_value, to_value; /* For resource conversion */
+
+	if ( !widget_name )
+		widget_name = "tip_shell";
+
+	XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
+	XtSetArg(al[ac], XmNoverrideRedirect, TRUE); ac++;
+	XtSetArg(al[ac], XmNsaveUnder, TRUE); ac++;
+	XtSetArg(al[ac], XmNtransient, FALSE); ac++;
+	tip_shell = XtCreatePopupShell ( widget_name, topLevelShellWidgetClass, parent, al, ac );
+	ac = 0;
+	_xd_rootwidget = tip_shell;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( tip_shell, "form_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNborderWidth, 1); ac++;
+	if (DefaultDepthOfScreen(DefaultScreenOfDisplay(display)) != 1) {
+	from_value.addr = "#f469f468a87c" ;
+	from_value.size = strlen( from_value.addr ) + 1;
+	to_value.addr = NULL;
+	XtConvertAndStore (form_, XmRString, &from_value, XmRPixel, &to_value);
+	if ( to_value.addr )
+	{
+		XtSetArg(al[ac], XmNbackground, *(unsigned int *)to_value.addr); ac++;
+	}
+	}
+	label_ = XmCreateLabel ( form_, "label_", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( label_,al, ac );
+	ac = 0;
+	children[ac++] = label_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtManageChild ( form_);
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uitip.h b/ecflow_4_0_7/view/src/libui/uitip.h
new file mode 100644
index 0000000..9f71557
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitip.h
@@ -0,0 +1,26 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uitip_h
+#define _uitip_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class tip_shell_c: public xd_TopLevelShell_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget tip_shell;
+	Widget form_;
+	Widget label_;
+};
+
+typedef tip_shell_c *tip_shell_p;
+
+
+extern tip_shell_p tip_shell;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uitop.cc b/ecflow_4_0_7/view/src/libui/uitop.cc
new file mode 100644
index 0000000..a6bd8f0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitop.cc
@@ -0,0 +1,1053 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/RepType.h>
+#include <Xm/CascadeB.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/ScrolledW.h>
+#include <Xm/Separator.h>
+#include <Xm/ToggleB.h>
+#include <Xm/PushBG.h>
+
+#define XDESIGNER
+#include "ecflowview.h"
+#include "SimpleTree.h"
+#include "show.h"
+#include "top.h"
+#include <Xm/Protocols.h>
+#define main xmain
+#include "Version.hpp"
+
+#include "uitop.h"
+
+XmStringCharSet char_set=XmSTRING_DEFAULT_CHARSET;
+
+void add_accelerator(Widget w,char * acc_text,char * key)
+/* adds an accelerator to a menu option. */
+{
+    int ac;
+    Arg al[10];
+ 
+    ac=0;
+    XtSetArg(al[ac],XmNacceleratorText,
+        XmStringCreate(acc_text,XmSTRING_DEFAULT_CHARSET)); ac++;
+    XtSetArg(al[ac],XmNaccelerator,key); ac++;
+    XtSetValues(w,al,ac);
+}
+/* */
+
+void XDmanage_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtManageChild ( *(Widget *)client_data );
+}
+
+void XDunmanage_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtUnmanageChild ( *(Widget *)client_data );
+}
+
+void XDpopup_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtPopup ( *(Widget *)client_data, XtGrabNone );
+}
+
+void XDpopdown_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtPopdown ( *(Widget *)client_data );
+}
+
+void XDmap_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtMapWidget (*(Widget *)client_data);
+}
+
+void XDunmap_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtUnmapWidget (*(Widget *)client_data);
+}
+
+void XDenable_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtSetSensitive (*(Widget *)client_data, TRUE);
+}
+
+void XDdisable_link ( Widget, XtPointer client_data, XtPointer )
+{
+	if ( client_data && *(Widget *)client_data )
+		XtSetSensitive (*(Widget *)client_data, FALSE);
+}
+
+
+top_p top_shell = (top_p) NULL;
+
+
+
+void top_shell_c::create (Display *display, char *app_name, int app_argc, char **app_argv, char *app_class_name)
+{
+	Widget children[17];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	XmString xmstrings[16];    /* temporary storage for XmStrings */
+	Widget form2 = (Widget)NULL;
+        Widget button184 = (Widget)NULL;
+        Widget button5 = (Widget)NULL;
+        Widget button10 = (Widget)NULL;
+        Widget button99 = (Widget)NULL;
+        Widget button4 = (Widget)NULL;
+        Widget button11 = (Widget)NULL;
+        Widget button9 = (Widget)NULL;
+	Widget button16 = (Widget)NULL;
+	Widget button13 = (Widget)NULL;
+	Widget button7 = (Widget)NULL;
+	Widget button14 = (Widget)NULL;
+	Widget button6 = (Widget)NULL;
+	Widget drawingArea1 = (Widget)NULL;
+	Widget button8 = (Widget)NULL;
+	Widget button177 = (Widget)NULL;
+	Widget drawingArea2 = (Widget)NULL;
+	Widget button189 = (Widget)NULL;
+        Widget scrolledWin1 = (Widget)NULL;
+        Widget scrollbar61 = (Widget)NULL;
+        Widget scrollbar62 = (Widget)NULL;
+        Widget cascade55 = (Widget)NULL;
+        Widget menu52 = (Widget)NULL;
+        Widget button15 = (Widget)NULL;
+        Widget button1 = (Widget)NULL;
+	Widget separator3 = (Widget)NULL;
+	Widget button194 = (Widget)NULL;
+	Widget cascade1 = (Widget)NULL;
+	Widget menu1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget separator7 = (Widget)NULL;
+	Widget button12 = (Widget)NULL;
+	Widget snapshot = (Widget)NULL;
+	Widget cascade56 = (Widget)NULL;
+	Widget separator64 = (Widget)NULL;
+	Widget separator65 = (Widget)NULL;
+	Widget cascade4 = (Widget)NULL;
+	Widget toggle15 = (Widget)NULL;
+	Widget toggle16 = (Widget)NULL;
+	Widget toggle17 = (Widget)NULL;
+	// Widget toggle18 = (Widget)NULL;
+	Widget toggle19 = (Widget)NULL;
+	Widget toggle20 = (Widget)NULL;
+	Widget cascade5 = (Widget)NULL;
+	Widget toggle7 = (Widget)NULL;
+	Widget toggle8 = (Widget)NULL;
+	Widget toggle9 = (Widget)NULL;
+	Widget toggle10 = (Widget)NULL;
+	Widget toggle11 = (Widget)NULL;
+	Widget toggle12 = (Widget)NULL;
+	Widget toggle13 = (Widget)NULL;
+	Widget toggle14 = (Widget)NULL;
+        Widget toggle39 = (Widget)NULL;
+        Widget toggle40 = (Widget)NULL;
+        Widget toggle73 = (Widget)NULL;
+        Widget toggle41 = (Widget)NULL;
+        Widget cascade6 = (Widget)NULL;
+        // Widget cascade7 = (Widget)NULL;
+        Widget toggle66 = (Widget)NULL;
+        Widget toggle67 = (Widget)NULL;
+        Widget toggle68 = (Widget)NULL;
+	Widget toggle69 = (Widget)NULL;
+        Widget toggle70 = (Widget)NULL;
+        // Widget toggle71 = (Widget)NULL;
+        Widget toggle72 = (Widget)NULL;
+        // Widget toggle74 = (Widget)NULL; Widget toggle75 = (Widget)NULL; Widget toggle76 = (Widget)NULL; Widget toggle77 = (Widget)NULL;
+        Widget toggle78 = (Widget)NULL;
+        Widget toggle79 = (Widget)NULL;
+        Widget cascade58 = (Widget)NULL;
+        Widget cascade3 = (Widget)NULL;
+        Widget menu53 = (Widget)NULL;
+        Widget button197 = (Widget)NULL;
+        Widget button198 = (Widget)NULL;
+        Widget separator5 = (Widget)NULL;
+
+        if ( !app_class_name )
+                app_class_name = appName;
+
+	std::string title = appName;
+	title += " (" + ecf::Version::raw();
+#ifdef DEBUG 
+	title += "-debug";
+#endif
+	title += ")";
+
+        XtSetArg(al[ac], XmNallowShellResize, FALSE); ac++;
+        XtSetArg(al[ac], XmNtitle, title.c_str()); ac++;
+        XtSetArg(al[ac], XmNiconName, appName); ac++;
+        XtSetArg(al[ac], XmNargc, app_argc); ac++;
+        XtSetArg(al[ac], XmNargv, app_argv); ac++;
+        top_shell = XtAppCreateShell ( app_name, app_class_name, applicationShellWidgetClass, display, al, ac );
+	ac = 0;
+	_xd_rootwidget = top_shell;
+	XmAddWMProtocolCallback( top_shell, XmInternAtom(XtDisplay(top_shell), "WM_DELETE_WINDOW", False),&top_shell_c:: quitCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( top_shell, "form_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form2 = XmCreateForm ( form_, "form2", al, ac );
+	ac = 0;
+	xmstrings[0] = XmStringCreateLtoR ( "-\n", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	message_ = XmCreateLabel ( form2, "message_", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNspacing, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
+	tools_ = XmCreateRowColumn ( form2, "tools_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+
+	button184 = XmCreatePushButton ( tools_, "Info", al, ac );
+	ac = 0;
+        XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+        XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+        XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+XtSetArg(al[ac],XmNmnemonic,'i'); ac++;        /* mnemonic */
+
+
+        button5 = XmCreatePushButton ( tools_, "Script", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+        XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+        XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+XtSetArg(al[ac],XmNmnemonic,'s'); ac++;        /* mnemonic */
+
+        button10 = XmCreatePushButton ( tools_, "Manual", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+        XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+        XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+XtSetArg(al[ac],XmNmnemonic,'m'); ac++;        /* mnemonic */
+
+        button99 = XmCreatePushButton ( tools_, "Jobstatus", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+        XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+        XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+        button4 = XmCreatePushButton ( tools_, "Output", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button11 = XmCreatePushButton ( tools_, "Triggers", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button9 = XmCreatePushButton ( tools_, "Why?", al, ac );
+	ac = 0;
+        XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+        XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+        XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+        button16 = XmCreatePushButton ( tools_, "Check", al, ac );
+        ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button13 = XmCreatePushButton ( tools_, "Time line", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button7 = XmCreatePushButton ( tools_, "Variables", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button14 = XmCreatePushButton ( tools_, "Messages", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button6 = XmCreatePushButton ( tools_, "Edit", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNwidth, 10); ac++;
+	XtSetArg(al[ac], XmNheight, 10); ac++;
+	drawingArea1 = XmCreateDrawingArea ( tools_, "drawingArea1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button8 = XmCreatePushButton ( tools_, "Chat", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button177 = XmCreatePushButton ( tools_, "Search", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNwidth, 10); ac++;
+	XtSetArg(al[ac], XmNheight, 10); ac++;
+	drawingArea2 = XmCreateDrawingArea ( tools_, "drawingArea2", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNdefaultButtonShadowThickness, 0); ac++;
+	button189 = XmCreatePushButton ( tools_, "Status", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNscrollingPolicy, XmAUTOMATIC); ac++;
+	scrolledWin1 = XmCreateScrolledWindow ( form_, "scrolledWin1", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNhorizontalScrollBar, &scrollbar61 ); ac++;
+	XtSetArg(al[ac], XmNverticalScrollBar, &scrollbar62 ); ac++;
+	XtGetValues(scrolledWin1, al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+        trees_ = XmCreateRowColumn ( scrolledWin1, "trees_", al, ac );
+        ac = 0;
+        menu_bar = XmCreateMenuBar ( form_, "menu_bar", al, ac );
+
+        cascade55 = XmCreateCascadeButton ( menu_bar, "File", al, ac );
+
+        if (1) { 
+	   XmString label_str = XmStringCreateLocalized ("File");
+           XtSetArg(al[ac], XmNmnemonic, XStringToKeysym("F")); ac++;
+           XtSetArg(al[ac], XmNlabelString, label_str); ac++;
+           XtSetArg(al[ac], XmNaccelerator, "Ctrl<Key>F"); ac++;
+           XtSetArg(al[ac], XmNacceleratorText, 
+           XmStringCreateLocalized("Ctrl+F")); ac++;
+	   // XmStringFree(label_str);
+        }
+
+        XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+        menu52 = XmCreatePulldownMenu ( menu_bar, "m_file", al, ac );
+        ac = 0;
+        button15 = XmCreatePushButton ( menu52, "Login", al, ac );
+        add_accelerator(button15, "Ctrl+L", "Ctrl<Key>L");
+
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+        button1 = XmCreatePushButton ( menu52, "Scan network...", al, ac );
+        // add_accelerator(button1, "Ctrl+S", "Ctrl<Key>S");
+
+        XtSetArg(al[ac], XmNheight, 2); ac++;
+        XtSetArg(al[ac], XmNmargin, 0); ac++;
+        separator3 = XmCreateSeparator ( menu52, "separator3", al, ac );
+        ac = 0;
+        if (1) {
+	  XmString label_str = XmStringCreateLocalized ("Quit");
+          XtSetArg(al[ac], XmNmnemonic, XStringToKeysym("Q")); ac++;
+          XtSetArg(al[ac], XmNlabelString, label_str); ac++;
+          XtSetArg(al[ac], XmNaccelerator, "Ctrl<Key>Q"); ac++;
+          XtSetArg(al[ac], XmNacceleratorText,
+          XmStringCreateLocalized("Ctrl+Q")); ac++;
+	}
+        button194 = XmCreatePushButtonGadget ( menu52, "Quit", al, ac );
+	// add_accelerator(button194, "Ctrl+Q", "Ctrl<Key>Q");
+
+        if (1) { ac = 0;
+	  XmString  label_str = XmStringCreateLocalized ("Edit");
+	  XtSetArg(al[ac], XmNmnemonic, XStringToKeysym("E")); ac++;
+	  XtSetArg(al[ac], XmNlabelString, label_str); ac++;
+	  XtSetArg(al[ac], XmNaccelerator, "Ctrl<Key>E"); ac++;
+	  XtSetArg(al[ac], XmNacceleratorText, XmStringCreateLocalized("Ctrl+E")); ac++;
+	}
+        cascade1 = XmCreateCascadeButton ( menu_bar, "Edit", al, ac );
+        // add_accelerator(cascade1, "Ctrl+E", "Ctrl<Key>E");
+
+        XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+        menu1 = XmCreatePulldownMenu ( menu_bar, "menu1", al, ac );
+        ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Servers menu...", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	button2 = XmCreatePushButton ( menu1, "button2", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Command menu...", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	button3 = XmCreatePushButton ( menu1, "button3", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	separator7 = XmCreateSeparator ( menu1, "separator7", al, ac );
+	xmstrings[0] = XmStringCreateLtoR ( "Preferences...", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+        button12 = XmCreatePushButton ( menu1, "pref", al, ac );
+
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	// separator7 = XmCreateSeparator ( menu1, "separator7", al, ac );
+	xmstrings[0] = XmStringCreateLtoR ( "Snapshot", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+        snapshot = XmCreatePushButton ( menu1, "snap", al, ac );
+
+        ac = 0;
+        XmStringFree ( xmstrings [ 0 ] );
+
+        cascade56 = XmCreateCascadeButton ( menu_bar, "Show", al, ac );
+        // add_accelerator(cascade56, "Ctrl<Key>S", "Ctrl+S");
+
+        XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+        show0_ = XmCreatePulldownMenu ( menu_bar, "show0_", al, ac );
+        ac = 0;
+	XtSetArg(al[ac], XmNuserData, new show(show::unknown)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Unknown", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_unknown = XmCreateToggleButton ( show0_, "unknown", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::suspended)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Suspended", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_suspended = XmCreateToggleButton ( show0_, "suspended", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::complete)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Complete", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_complete = XmCreateToggleButton ( show0_, "complete", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::queued)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Queued", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_queued = XmCreateToggleButton ( show0_, "queued", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::submitted)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Submitted", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_submitted = XmCreateToggleButton ( show0_, "submitted", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::active)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Active", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_active = XmCreateToggleButton ( show0_, "active", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::aborted)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Aborted", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_aborted = XmCreateToggleButton ( show0_, "aborted", al, ac );
+
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	separator64 = XmCreateSeparator ( show0_, "separator64", al, ac );
+	cascade4 = XmCreateCascadeButton ( show0_, "Special", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	show2_ = XmCreatePulldownMenu ( show0_, "show2_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new show(show::time_dependant)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Time dependent", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle15 = XmCreateToggleButton ( show2_, "toggle15", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::late_nodes)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Late nodes", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle16 = XmCreateToggleButton ( show2_, "toggle16", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::waiting_nodes)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Waiting nodes", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle17 = XmCreateToggleButton ( show2_, "toggle17", al, ac );
+	/* ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::migrated_nodes)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Migrated nodes", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle18 = XmCreateToggleButton ( show2_, "toggle18", al, ac ); */
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::rerun_tasks)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Rerun tasks", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle19 = XmCreateToggleButton ( show2_, "toggle19", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::nodes_with_messages)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Nodes with messages", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle20 = XmCreateToggleButton ( show2_, "toggle20", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	cascade5 = XmCreateCascadeButton ( show0_, "Type", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	show1_ = XmCreatePulldownMenu ( show0_, "show1_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNuserData, new show(show::label)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Labels", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle7 = XmCreateToggleButton ( show1_, "toggle7", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::meter)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Meters", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle8 = XmCreateToggleButton ( show1_, "toggle8", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::event)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Events", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle9 = XmCreateToggleButton ( show1_, "toggle9", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::repeat)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Repeats", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle10 = XmCreateToggleButton ( show1_, "toggle10", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::time)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Times", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle11 = XmCreateToggleButton ( show1_, "toggle11", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::date)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Dates", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle12 = XmCreateToggleButton ( show1_, "toggle12", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::trigger)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Triggers", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle13 = XmCreateToggleButton ( show1_, "toggle13", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::variable)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Variables", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle14 = XmCreateToggleButton ( show1_, "toggle14", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::genvar)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Generated variables", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle39 = XmCreateToggleButton ( show1_, "toggle39", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::late)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Late", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle40 = XmCreateToggleButton ( show1_, "toggle40", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::limit)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Limits", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle73 = XmCreateToggleButton ( show1_, "toggle73", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::inlimit)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Limiters", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+        XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+        toggle41 = XmCreateToggleButton ( show1_, "toggle41", al, ac );
+        ac = 0;
+        XmStringFree ( xmstrings [ 0 ] );
+        cascade6 = XmCreateCascadeButton ( show0_, "Icons", al, ac );
+        XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+        show3_ = XmCreatePulldownMenu ( show0_, "show3_", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNuserData, new show(show::time_icon)); ac++;
+        xmstrings[0] = XmStringCreateLtoR ( "Time icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle66 = XmCreateToggleButton ( show3_, "time_icon", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::date_icon)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Date icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle67 = XmCreateToggleButton ( show3_, "date_icon", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::late_icon)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Late icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle68 = XmCreateToggleButton ( show3_, "late_icon", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::waiting_icon)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Waiting icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle69 = XmCreateToggleButton ( show3_, "waiting_icon", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::rerun_icon)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Rerun icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle70 = XmCreateToggleButton ( show3_, "rerun_icon", al, ac );
+	/* ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::migrated_icon)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "Migrated icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	toggle71 = XmCreateToggleButton ( show3_, "migrated_icon", al, ac ); */
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::message_icon)); ac++;
+        xmstrings[0] = XmStringCreateLtoR ( "Message icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+        XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+        toggle72 = XmCreateToggleButton ( show3_, "message_icon", al, ac );
+
+        ac = 0;
+        XmStringFree ( xmstrings [ 0 ] );
+        XtSetArg(al[ac], XmNuserData, new show(show::defstatus_icon)); ac++;
+        xmstrings[0] = XmStringCreateLtoR ( "Complete icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+        XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+        toggle78 = XmCreateToggleButton ( show3_, "defstatus_icon", al, ac );
+
+        ac = 0;
+        XmStringFree ( xmstrings [ 0 ] );
+        XtSetArg(al[ac], XmNuserData, new show(show::zombie_icon)); ac++;
+        xmstrings[0] = XmStringCreateLtoR ( "Zombie icons", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+        XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+        toggle79 = XmCreateToggleButton ( show3_, "zombie_icon", al, ac );
+
+	/* 20110125 */
+	separator65 = XmCreateSeparator ( show0_, "separator65", al, ac );
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::all)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "all", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_all = XmCreateToggleButton ( show0_, "all", al, ac );	
+	// show_all = XmCreatePushButton ( show0_, "all", al, ac );	
+        // XtAddCallback (show_all, XmNactivateCallback,&top_shell_c::show2CB, (XtPointer) this);
+	ac = 0;
+	XmStringFree ( xmstrings [ 0 ] );
+	XtSetArg(al[ac], XmNuserData, new show(show::none)); ac++;
+	xmstrings[0] = XmStringCreateLtoR ( "none", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	show_none = XmCreateToggleButton ( show0_, "none", al, ac );
+	// show_none = XmCreatePushButton ( show0_, "none", al, ac );
+    // XtAddCallback (show_none, XmNactivateCallback,&top_shell_c::show2CB, (XtPointer) this);
+
+        /* ac = 0;
+        XmStringFree ( xmstrings [ 0 ] );
+        XtSetArg(al[ac], XmNsensitive, XCDP_COMPARE_ENABLED); ac++; 
+        XtSetArg(al[ac], XmNsensitive, getenv("XCDP_COMPARE_ENABLED")); ac++;
+        cascade7 = XmCreateCascadeButton ( show0_, "Compare", al, ac );
+        XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+        show4_ = XmCreatePulldownMenu ( show0_, "show4_", al, ac );
+        ac = 0;
+         XtSetArg(al[ac], XmNuserData, new show(show::compare_variables)); ac++;
+	   xmstrings[0] = XmStringCreateLtoR ( "Variables", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	   XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	   toggle75 = XmCreateToggleButton ( show4_, "compare_variables", al, ac );
+	   ac = 0;
+	   XtSetArg(al[ac], XmNuserData, new show(show::compare_scripts)); ac++;
+	   xmstrings[0] = XmStringCreateLtoR ( "Scripts", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	   XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	   toggle74 = XmCreateToggleButton ( show4_, "compare_scripts", al, ac );
+	   ac = 0;
+	   XtSetArg(al[ac], XmNuserData, new show(show::compare_includes)); ac++;
+	   xmstrings[0] = XmStringCreateLtoR ( "Includes", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	   XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	   toggle76 = XmCreateToggleButton ( show4_, "compare_includes", al, ac );
+	   ac = 0;
+	   XtSetArg(al[ac], XmNuserData, new show(show::compare_outputs)); ac++;
+	   xmstrings[0] = XmStringCreateLtoR ( "Outputs", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG );
+	   XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++;
+	   toggle77 = XmCreateToggleButton ( show4_, "compare_outputs", al, ac );
+	*/
+	    ac = 0; 
+        XmStringFree ( xmstrings [ 0 ] );
+        cascade58 = XmCreateCascadeButton ( menu_bar, "Servers", al, ac );
+	XtSetArg(al[ac], XmNnumColumns, 3); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	XtSetArg(al[ac], XmNradioAlwaysOne, TRUE); ac++;
+	XtSetArg(al[ac], XmNradioBehavior, FALSE); ac++;
+	servers_menu_ = XmCreatePulldownMenu ( menu_bar, "servers_menu_", al, ac );
+	ac = 0;
+	cascade3 = XmCreateCascadeButton ( menu_bar, "Windows", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	windows_menu_ = XmCreatePulldownMenu ( menu_bar, "windows_menu_", al, ac );
+	ac = 0;
+	help = XmCreateCascadeButton ( menu_bar, "Help", al, ac );
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	menu53 = XmCreatePulldownMenu ( menu_bar, "menu53", al, ac );
+        ac = 0;
+        button197 = XmCreatePushButton ( menu53, "Help", al, ac );
+        XtSetArg(al[ac], XmNmenuHelpWidget, help); ac++;
+        button198 = XmCreatePushButton ( menu53, "Version", al, ac );
+        XtSetValues ( menu_bar,al, ac );
+
+        ac = 0;
+        separator5 = XmCreateSeparator ( form_, "separator5", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNtopWidget, menu_bar); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, separator5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledWin1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+	XtSetValues ( menu_bar,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form2); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( separator5,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, tools_); ac++;
+	XtSetValues ( message_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( tools_,al, ac );
+	ac = 0;
+        XtAddCallback (button184, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+        XtAddCallback (button5, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+        XtAddCallback (button10, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+        XtAddCallback (button99, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+        XtAddCallback (button4, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+        XtAddCallback (button11, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+        XtAddCallback (button9, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+	XtAddCallback (button16, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+	XtAddCallback (button13, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+	XtAddCallback (button7, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+	XtAddCallback (button14, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+	XtAddCallback (button6, XmNactivateCallback,&top_shell_c:: windowCB, (XtPointer) this);
+	// XtAddCallback (button8, XmNactivateCallback,&top_shell_c:: chatCB, (XtPointer) this);
+	XtAddCallback (button177, XmNactivateCallback,&top_shell_c:: searchCB, (XtPointer) this);
+	XtAddCallback (button189, XmNactivateCallback,&top_shell_c:: statusCB, (XtPointer) this);
+        children[ac++] = button184;
+        children[ac++] = button5;
+        children[ac++] = button10;
+        children[ac++] = button99;
+        children[ac++] = button4;
+        children[ac++] = button11;
+        children[ac++] = button9;
+	children[ac++] = button16;
+	children[ac++] = button13;
+	children[ac++] = button7;
+	children[ac++] = button14;
+	children[ac++] = button6;
+	children[ac++] = drawingArea1;
+	// children[ac++] = button8;
+	children[ac++] = button177;
+	children[ac++] = drawingArea2;
+	children[ac++] = button189;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = message_;
+	children[ac++] = tools_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = trees_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XmScrolledWindowSetAreas(scrolledWin1, scrollbar61, scrollbar62, trees_ );
+	XtAddCallback (button15, XmNactivateCallback,&top_shell_c:: loginCB, (XtPointer) this);
+	XtAddCallback (button1, XmNactivateCallback,&top_shell_c:: serverCB, (XtPointer) this);
+	XtAddCallback (button194, XmNactivateCallback,&top_shell_c:: quitCB, (XtPointer) this);
+	children[ac++] = button15;
+	children[ac++] = button1;
+	children[ac++] = separator3;
+	children[ac++] = button194;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu52); ac++;
+	XtSetValues ( cascade55, al, ac );
+	ac = 0;
+	XtAddCallback (button12, XmNactivateCallback,&top_shell_c:: prefCB, (XtPointer) this);
+	XtAddCallback (snapshot, XmNactivateCallback,&top_shell_c:: snapshotCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	children[ac++] = separator7;
+	children[ac++] = button12;
+	children[ac++] = snapshot;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu1); ac++;
+	XtSetValues ( cascade1, al, ac );
+	ac = 0;
+	XtAddCallback (show0_, XmNentryCallback,&top_shell_c:: showCB, (XtPointer) this);
+	XtAddCallback (show2_, XmNentryCallback,&top_shell_c:: showCB, (XtPointer) this);
+	children[ac++] = toggle15;
+	children[ac++] = toggle16;
+	children[ac++] = toggle17;
+	// children[ac++] = toggle18;
+	children[ac++] = toggle19;
+	children[ac++] = toggle20;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, show2_); ac++;
+	XtSetValues ( cascade4, al, ac );
+	ac = 0;
+	XtAddCallback (show1_, XmNentryCallback,&top_shell_c:: showCB, (XtPointer) this);
+	children[ac++] = toggle7;
+	children[ac++] = toggle8;
+	children[ac++] = toggle9;
+	children[ac++] = toggle10;
+	children[ac++] = toggle11;
+	children[ac++] = toggle12;
+	children[ac++] = toggle13;
+	children[ac++] = toggle14;
+	children[ac++] = toggle39;
+	children[ac++] = toggle40;
+	children[ac++] = toggle73;
+	children[ac++] = toggle41;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, show1_); ac++;
+	XtSetValues ( cascade5, al, ac );
+	ac = 0;
+	XtAddCallback (show3_, XmNentryCallback,&top_shell_c:: showCB, (XtPointer) this);
+	children[ac++] = toggle66;
+	children[ac++] = toggle67;
+	children[ac++] = toggle68;
+	children[ac++] = toggle69;
+        children[ac++] = toggle70;
+        // children[ac++] = toggle71;
+        children[ac++] = toggle72;
+        children[ac++] = toggle78;
+        children[ac++] = toggle79;
+        XtManageChildren(children, ac);
+        ac = 0;
+        XtSetArg(al[ac], XmNsubMenuId, show3_); ac++;
+        XtSetValues ( cascade6, al, ac );
+
+	/*        ac = 0;
+        XtAddCallback (show4_, XmNentryCallback,&top_shell_c:: showCB, (XtPointer) this);
+        children[ac++] = toggle74;
+        children[ac++] = toggle75;
+        children[ac++] = toggle76;
+        children[ac++] = toggle77;
+        XtManageChildren(children, ac); 
+        ac = 0;
+        XtSetArg(al[ac], XmNsubMenuId, show4_); ac++;
+        XtSetValues ( cascade7, al, ac ); */
+	
+        ac = 0;
+        children[ac++] = show_unknown;
+        children[ac++] = show_suspended;
+	children[ac++] = show_complete;
+	children[ac++] = show_queued;
+	children[ac++] = show_submitted;
+	children[ac++] = show_active;
+	children[ac++] = show_aborted;
+	children[ac++] = separator64;
+        children[ac++] = cascade4;
+        children[ac++] = cascade5;
+        children[ac++] = cascade6;
+
+	children[ac++] = separator65;
+	children[ac++] = show_all;
+	children[ac++] = show_none;
+
+        // children[ac++] = cascade7;
+        XtManageChildren(children, ac);
+        ac = 0;
+        XtSetArg(al[ac], XmNsubMenuId, show0_); ac++;
+	XtSetValues ( cascade56, al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, servers_menu_); ac++;
+	XtSetValues ( cascade58, al, ac );
+	ac = 0;
+	XtAddCallback (windows_menu_, XmNentryCallback,&top_shell_c:: windowsCB, (XtPointer) this);
+	XtSetArg(al[ac], XmNsubMenuId, windows_menu_); ac++;
+        XtSetValues ( cascade3, al, ac );
+        ac = 0;
+        XtAddCallback (button197, XmNactivateCallback,&top_shell_c:: helpCB, (XtPointer) this);
+        XtAddCallback (button198, XmNactivateCallback,&top_shell_c:: releaseCB, (XtPointer) this);
+        children[ac++] = button197;
+        children[ac++] = button198;
+        XtManageChildren(children, ac);
+        ac = 0;
+        XtSetArg(al[ac], XmNsubMenuId, menu53); ac++;
+	XtSetValues ( help, al, ac );
+	ac = 0;
+	children[ac++] = cascade55;
+	children[ac++] = cascade1;
+	children[ac++] = cascade56;
+	children[ac++] = cascade58;
+	children[ac++] = cascade3;
+	children[ac++] = help;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form2;
+	children[ac++] = scrolledWin1;
+	children[ac++] = menu_bar;
+	children[ac++] = separator5;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtManageChild ( form_);
+}
+
+void top_shell_c::loginCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->loginCB ( widget, call_data );
+}
+
+void top_shell_c::prefCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->prefCB ( widget, call_data );
+}
+
+void top_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+        instance->helpCB ( widget, call_data );
+}
+
+void top_shell_c::releaseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+        top_shell_p instance = (top_shell_p) client_data;
+        instance->releaseCB ( widget, call_data );
+}
+
+void top_shell_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+        top_shell_p instance = (top_shell_p) client_data;
+	instance->searchCB ( widget, call_data );
+}
+
+void top_shell_c::windowsCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->windowsCB ( widget, call_data );
+}
+
+void top_shell_c::chatCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->chatCB ( widget, call_data );
+}
+
+void top_shell_c::showCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->showCB ( widget, call_data );
+}
+
+void top_shell_c::serverCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->serverCB ( widget, call_data );
+}
+
+void top_shell_c::statusCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->statusCB ( widget, call_data );
+}
+
+void top_shell_c::snapshotCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+  top_shell_p instance = (top_shell_p) client_data;
+  instance->snapshotCB ( widget, call_data );
+}
+
+void top_shell_c::windowCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->windowCB ( widget, call_data );
+}
+
+void top_shell_c::quitCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	top_shell_p instance = (top_shell_p) client_data;
+	instance->quitCB ( widget, call_data );
+}
+
+XtAppContext app_context;
+Display *display;
+// sym_entry_type *rp = NULL;
+
+int main(int argc, char **argv)
+{
+  XtSetLanguageProc ((XtAppContext) NULL, 
+		     (XtLanguageProc) NULL, 
+		     (XtPointer) NULL);
+  XtToolkitInitialize ();
+  app_context = XtCreateApplicationContext ();
+  display = XtOpenDisplay (app_context, NULL, argv[0], appName,
+			   NULL, 0, &argc, argv);
+  if (!display) {
+      printf("%s: can't open display, exiting...\n", argv[0]);
+      exit (-1);
+  }
+  
+  XmRepTypeInstallTearOffModelConverter();
+  
+  top_shell = new top;
+  top_shell->create ( display, argv[0], argc, argv, appName );
+  XtRealizeWidget (top_shell->xd_rootwidget());
+  // UilDumpSymbolTable(rp);
+
+  XtAppMainLoop (app_context);
+  
+  exit (0);
+  
+  return 0;
+
+  /* 
+     ./bin/gcc-4.5/debug/ecflowview -geometry=640x880+620+240
+     -display -bg -fg
+   */
+
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uitop.h b/ecflow_4_0_7/view/src/libui/uitop.h
new file mode 100644
index 0000000..1b9e719
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitop.h
@@ -0,0 +1,79 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uitop_h
+#define _uitop_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class top_shell_c: public xd_ApplicationShell_c {
+public:
+	virtual void create (Display *display, char *app_name, int app_argc, char **app_argv, char *app_class_name = NULL);
+protected:
+	Widget top_shell;
+	Widget form_;
+	Widget message_;
+	Widget tools_;
+	Widget trees_;
+	Widget menu_bar;
+	Widget show0_;
+	Widget show_unknown;
+	Widget show_suspended;
+	Widget show_complete;
+	Widget show_queued;
+	Widget show_submitted;
+	Widget show_active;
+	Widget show_aborted;
+	Widget show_all; Widget show_none;
+	Widget show1_;
+	Widget show2_;
+	Widget show3_;
+	Widget show4_;
+	Widget servers_menu_;
+	Widget windows_menu_;
+	Widget help;
+	Widget snaphot;
+
+#ifndef file_widget
+#define file_menu cascade55
+#endif
+
+	Widget cascade55; // = (Widget)NULL;
+
+public:
+	static void loginCB( Widget, XtPointer, XtPointer );
+	virtual void loginCB( Widget, XtPointer ) = 0;
+	static void prefCB( Widget, XtPointer, XtPointer );
+	virtual void prefCB( Widget, XtPointer ) = 0;
+	static void helpCB( Widget, XtPointer, XtPointer );
+	virtual void helpCB( Widget, XtPointer ) = 0;
+	static void searchCB( Widget, XtPointer, XtPointer );
+	virtual void searchCB( Widget, XtPointer ) = 0;
+	static void windowsCB( Widget, XtPointer, XtPointer );
+	virtual void windowsCB( Widget, XtPointer ) = 0;
+	static void chatCB( Widget, XtPointer, XtPointer );
+	virtual void chatCB( Widget, XtPointer ) = 0;
+	static void showCB( Widget, XtPointer, XtPointer );
+	virtual void showCB( Widget, XtPointer ) = 0;
+	static void serverCB( Widget, XtPointer, XtPointer );
+	virtual void serverCB( Widget, XtPointer ) = 0;
+	static void statusCB( Widget, XtPointer, XtPointer );
+	virtual void statusCB( Widget, XtPointer ) = 0;
+	static void windowCB( Widget, XtPointer, XtPointer );
+	virtual void windowCB( Widget, XtPointer ) = 0;
+	static void quitCB( Widget, XtPointer, XtPointer );
+	virtual void quitCB( Widget, XtPointer ) = 0;
+
+	static void releaseCB( Widget, XtPointer, XtPointer );
+	virtual void releaseCB( Widget, XtPointer ) = 0;
+        static void snapshotCB( Widget, XtPointer, XtPointer );
+        virtual void snapshotCB( Widget, XtPointer ) = 0;
+};
+
+typedef top_shell_c *top_shell_p;
+class top;
+typedef top *top_p;
+extern top_p top_shell;
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uitree.cc b/ecflow_4_0_7/view/src/libui/uitree.cc
new file mode 100644
index 0000000..744428e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitree.cc
@@ -0,0 +1,144 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Separator.h>
+
+#include "SimpleTree.h"
+#define XmCreateDrawingArea CreateTree
+#include "uitree.h"
+#include "ecflowview.h"
+
+tree_p tree_ = (tree_p) NULL;
+
+void tree_c::create (Widget parent, char *widget_name)
+{
+	Widget children[6];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+        register int ac = 0;           /* Arg Count */
+        Widget button179 = (Widget)NULL;
+        Widget button180 = (Widget)NULL;
+
+        if ( !widget_name )
+                widget_name = "tree_";
+
+	tree_ = XmCreateDrawingArea ( parent, widget_name, al, ac );
+	_xd_rootwidget = tree_;
+	see_menu_ = XmCreatePopupMenu ( tree_, "see_menu_", al, ac );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	XtSetArg(al[ac], XmNmarginTop, 0); ac++;
+	XtSetArg(al[ac], XmNmarginBottom, 0); ac++;
+	XtSetArg(al[ac], XmNmarginLeft, 0); ac++;
+	XtSetArg(al[ac], XmNmarginRight, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 2); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	show_current_ = XmCreatePushButton ( see_menu_, "menu_show_current", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginTop, 0); ac++;
+	XtSetArg(al[ac], XmNmarginBottom, 0); ac++;
+	XtSetArg(al[ac], XmNmarginLeft, 0); ac++;
+	XtSetArg(al[ac], XmNmarginRight, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 2); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	button179 = XmCreatePushButton ( see_menu_, "menu_unfold_all", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNmarginTop, 0); ac++;
+	XtSetArg(al[ac], XmNmarginBottom, 0); ac++;
+	XtSetArg(al[ac], XmNmarginLeft, 0); ac++;
+	XtSetArg(al[ac], XmNmarginRight, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 2); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 2); ac++;
+	button180 = XmCreatePushButton ( see_menu_, "menu_fold_all", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	fold_around_ = XmCreatePushButton ( see_menu_, "fold_around_", al, ac );
+        ac = 0;
+        XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+        hide_other_ = XmCreatePushButton ( see_menu_, "hide_other_", al, ac );
+
+        ac = 0;
+        XtSetArg(al[ac], XmNsensitive, XECF_SNAP_ENABLED); ac++;
+        snapshot_ = XmCreatePushButton ( see_menu_, "snapshot", al, ac );
+
+        ac = 0;
+        XtSetArg(al[ac], XmNspacing, 0); ac++;
+        XtSetArg(al[ac], XmNentryBorder, 0); ac++;
+	XtSetArg(al[ac], XmNmarginWidth, 0); ac++;
+	XtSetArg(al[ac], XmNmarginHeight, 0); ac++;
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_TIGHT); ac++;
+	XtSetArg(al[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
+	why_menu_ = XmCreatePopupMenu ( tree_, "why_menu", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+	why_label_ = XmCreateLabel ( why_menu_, "why_label_", al, ac );
+	ac = 0;
+	XtAddCallback (show_current_, XmNactivateCallback,&tree_c:: showCB, (XtPointer) this);
+	XtAddCallback (button179, XmNactivateCallback,&tree_c:: unfoldCB, (XtPointer) this);
+        XtAddCallback (button180, XmNactivateCallback,&tree_c:: foldCB, (XtPointer) this);
+        XtAddCallback (fold_around_, XmNactivateCallback,&tree_c:: aroundCB, (XtPointer) this);
+        XtAddCallback (hide_other_, XmNactivateCallback,&tree_c:: hideOtherCB, (XtPointer) this);
+        XtAddCallback (snapshot_, XmNactivateCallback,&tree_c:: snapshotCB, (XtPointer) this);
+        children[ac++] = show_current_;
+        children[ac++] = button179;
+        children[ac++] = button180;
+        children[ac++] = fold_around_;
+        children[ac++] = hide_other_;
+        children[ac++] = snapshot_;
+        XtManageChildren(children, ac);
+        ac = 0;
+        children[ac++] = why_label_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void tree_c::hideOtherCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	tree_p instance = (tree_p) client_data;
+        instance->hideOtherCB ( widget, call_data );
+}
+
+void tree_c::snapshotCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+  tree_p instance = (tree_p) client_data;
+  instance->snapshotCB ( widget, call_data );
+}
+
+void tree_c::aroundCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+        tree_p instance = (tree_p) client_data;
+	instance->aroundCB ( widget, call_data );
+}
+
+void tree_c::foldCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	tree_p instance = (tree_p) client_data;
+	instance->foldCB ( widget, call_data );
+}
+
+void tree_c::unfoldCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	tree_p instance = (tree_p) client_data;
+	instance->unfoldCB ( widget, call_data );
+}
+
+void tree_c::showCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	tree_p instance = (tree_p) client_data;
+	instance->showCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uitree.h b/ecflow_4_0_7/view/src/libui/uitree.h
new file mode 100644
index 0000000..0274810
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitree.h
@@ -0,0 +1,45 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uitree_h
+#define _uitree_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class tree_c: public xd_XmDrawingArea_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget tree_;
+	Widget see_menu_;
+	Widget show_current_;
+	Widget fold_around_;
+	Widget hide_other_;
+	Widget snapshot_;
+	Widget why_menu_;
+	Widget why_label_;
+public:
+	static void hideOtherCB( Widget, XtPointer, XtPointer );
+	virtual void hideOtherCB( Widget, XtPointer ) = 0;
+	static void aroundCB( Widget, XtPointer, XtPointer );
+	virtual void aroundCB( Widget, XtPointer ) = 0;
+	static void foldCB( Widget, XtPointer, XtPointer );
+	virtual void foldCB( Widget, XtPointer ) = 0;
+	static void unfoldCB( Widget, XtPointer, XtPointer );
+	virtual void unfoldCB( Widget, XtPointer ) = 0;
+        static void showCB( Widget, XtPointer, XtPointer );
+        virtual void showCB( Widget, XtPointer ) = 0;
+
+        static void snapshotCB( Widget, XtPointer, XtPointer );
+        virtual void snapshotCB( Widget, XtPointer ) = 0;
+};
+
+typedef tree_c *tree_p;
+
+
+extern tree_p tree_;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uitriggers.cc b/ecflow_4_0_7/view/src/libui/uitriggers.cc
new file mode 100644
index 0000000..56da2d2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitriggers.cc
@@ -0,0 +1,298 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/CascadeB.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawingA.h>
+#include <Xm/DrawnB.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/ScrolledW.h>
+#include <Xm/Separator.h>
+#include <Xm/ToggleB.h>
+#include <Xm/ToggleBG.h>
+
+extern "C" {
+#include "SimpleGraph.h"
+#include "Hyper.h"
+}
+#define XmCreateDrawnButton CreateHyper
+#include <xdclass.h>
+
+class triggers_menu_c: public xd_XmCascadeButton_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget triggers_menu;
+	Widget triggers_button_;
+	Widget triggered_button_;
+public:
+	static void reachCB( Widget, XtPointer, XtPointer );
+	virtual void reachCB( Widget, XtPointer ) = 0;
+	static void fullCB( Widget, XtPointer, XtPointer );
+	virtual void fullCB( Widget, XtPointer ) = 0;
+	static void triggeredCB( Widget, XtPointer, XtPointer );
+	virtual void triggeredCB( Widget, XtPointer ) = 0;
+	static void triggersCB( Widget, XtPointer, XtPointer );
+	virtual void triggersCB( Widget, XtPointer ) = 0;
+};
+
+typedef triggers_menu_c *triggers_menu_p;
+
+class triggers_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget triggers_form;
+	Widget tgraph_;
+	Widget ttext_;
+	Widget dependencies_button_;
+	Widget graph_;
+	Widget info_menu_;
+	Widget link_menu_;
+	Widget text_;
+public:
+	static void linkCB( Widget, XtPointer, XtPointer );
+	virtual void linkCB( Widget, XtPointer ) = 0;
+	static void hyperCB( Widget, XtPointer, XtPointer );
+	virtual void hyperCB( Widget, XtPointer ) = 0;
+	static void entryCB( Widget, XtPointer, XtPointer );
+	virtual void entryCB( Widget, XtPointer ) = 0;
+	static void dependCB( Widget, XtPointer, XtPointer );
+	virtual void dependCB( Widget, XtPointer ) = 0;
+};
+
+typedef triggers_form_c *triggers_form_p;
+class triggers;
+typedef triggers *triggers_p;
+
+triggers_menu_p triggers_menu = (triggers_menu_p) NULL;
+triggers_p triggers_form = (triggers_p) NULL;
+
+
+
+void triggers_menu_c::create (Widget parent, char *widget_name)
+{
+	Widget children[6];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget menu2 = (Widget)NULL;
+	Widget separator1 = (Widget)NULL;
+	Widget toggle3 = (Widget)NULL;
+	Widget separator2 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "triggers_menu";
+
+	triggers_menu = XmCreateCascadeButton ( parent, widget_name, al, ac );
+	_xd_rootwidget = triggers_menu;
+	XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED); ac++;
+	menu2 = XmCreatePulldownMenu ( parent, "menu2", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	triggers_button_ = XmCreateToggleButton ( menu2, "triggers", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	triggered_button_ = XmCreateToggleButton ( menu2, "triggered", al, ac );
+	ac = 0;
+	separator1 = XmCreateSeparator ( menu2, "separator1", al, ac );
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	toggle3 = XmCreateToggleButton ( menu2, "toggle3", al, ac );
+	ac = 0;
+	separator2 = XmCreateSeparator ( menu2, "separator2", al, ac );
+	button1 = XmCreatePushButton ( menu2, "Reach selection", al, ac );
+	XtAddCallback (triggers_button_, XmNvalueChangedCallback,&triggers_menu_c:: triggersCB, (XtPointer) this);
+	XtAddCallback (triggered_button_, XmNvalueChangedCallback,&triggers_menu_c:: triggeredCB, (XtPointer) this);
+	XtAddCallback (toggle3, XmNvalueChangedCallback,&triggers_menu_c:: fullCB, (XtPointer) this);
+	XtAddCallback (button1, XmNactivateCallback,&triggers_menu_c:: reachCB, (XtPointer) this);
+	children[ac++] = triggers_button_;
+	children[ac++] = triggered_button_;
+	children[ac++] = separator1;
+	children[ac++] = toggle3;
+	children[ac++] = separator2;
+	children[ac++] = button1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtSetArg(al[ac], XmNsubMenuId, menu2); ac++;
+	XtSetValues ( triggers_menu, al, ac );
+	ac = 0;
+}
+
+void triggers_menu_c::reachCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_menu_p instance = (triggers_menu_p) client_data;
+	instance->reachCB ( widget, call_data );
+}
+
+void triggers_menu_c::fullCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_menu_p instance = (triggers_menu_p) client_data;
+	instance->fullCB ( widget, call_data );
+}
+
+void triggers_menu_c::triggeredCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_menu_p instance = (triggers_menu_p) client_data;
+	instance->triggeredCB ( widget, call_data );
+}
+
+void triggers_menu_c::triggersCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_menu_p instance = (triggers_menu_p) client_data;
+	instance->triggersCB ( widget, call_data );
+}
+
+
+void triggers_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form2 = (Widget)NULL;
+	Widget form1 = (Widget)NULL;
+	Widget radioBox1 = (Widget)NULL;
+	Widget scrolledWin1 = (Widget)NULL;
+	Widget scrollbar1 = (Widget)NULL;
+	Widget scrollbar2 = (Widget)NULL;
+	Widget rowcol1 = (Widget)NULL;
+	Widget label1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "triggers_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	triggers_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = triggers_form;
+	form2 = XmCreateForm ( triggers_form, "form2", al, ac );
+	form1 = XmCreateForm ( form2, "form1", al, ac );
+	XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
+	XtSetArg(al[ac], XmNpacking, XmPACK_TIGHT); ac++;
+	radioBox1 = XmCreateRadioBox ( form1, "radioBox1", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNset, TRUE); ac++;
+	tgraph_ = XmCreateToggleButtonGadget ( radioBox1, "Graph", al, ac );
+	ac = 0;
+	ttext_ = XmCreateToggleButtonGadget ( radioBox1, "Text", al, ac );
+	dependencies_button_ = XmCreateToggleButton ( form1, "dependencies_button_", al, ac );
+	XtSetArg(al[ac], XmNscrollingPolicy, XmAUTOMATIC); ac++;
+	scrolledWin1 = XmCreateScrolledWindow ( form2, "scrolledWin1", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNhorizontalScrollBar, &scrollbar1 ); ac++;
+	XtSetArg(al[ac], XmNverticalScrollBar, &scrollbar2 ); ac++;
+	XtGetValues(scrolledWin1, al, ac );
+	ac = 0;
+	rowcol1 = XmCreateRowColumn ( scrolledWin1, "rowcol1", al, ac );
+#define XmCreateDrawingArea CreateGraph
+	graph_ = XmCreateDrawingArea ( rowcol1, "graph_", al, ac );
+	ac = 0;
+	info_menu_ = XmCreatePopupMenu ( graph_, "info_menu_", al, ac );
+	label1 = XmCreateLabel ( info_menu_, "Click either on a node or on an arrow.", al, ac );
+	link_menu_ = XmCreatePopupMenu ( graph_, "link_menu_", al, ac );
+	text_ = XmCreateDrawnButton ( rowcol1, "text_", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNtopWidget, form1); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledWin1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, dependencies_button_); ac++;
+	XtSetValues ( radioBox1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( dependencies_button_,al, ac );
+	ac = 0;
+	XtAddCallback (radioBox1, XmNentryCallback,&triggers_form_c:: entryCB, (XtPointer) this);
+	children[ac++] = tgraph_;
+	children[ac++] = ttext_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (dependencies_button_, XmNvalueChangedCallback,&triggers_form_c:: dependCB, (XtPointer) this);
+	children[ac++] = radioBox1;
+	children[ac++] = dependencies_button_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = label1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XtAddCallback (link_menu_, XmNentryCallback,&triggers_form_c:: linkCB, (XtPointer) this);
+	XtAddCallback (text_, XmNactivateCallback,&triggers_form_c:: hyperCB, (XtPointer) this);
+	children[ac++] = graph_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = rowcol1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XmScrolledWindowSetAreas(scrolledWin1, scrollbar1, scrollbar2, rowcol1 );
+	children[ac++] = form1;
+	children[ac++] = scrolledWin1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form2;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void triggers_form_c::linkCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_form_p instance = (triggers_form_p) client_data;
+	instance->linkCB ( widget, call_data );
+}
+
+void triggers_form_c::hyperCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_form_p instance = (triggers_form_p) client_data;
+	instance->hyperCB ( widget, call_data );
+}
+
+void triggers_form_c::entryCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_form_p instance = (triggers_form_p) client_data;
+	instance->entryCB ( widget, call_data );
+}
+
+void triggers_form_c::dependCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	triggers_form_p instance = (triggers_form_p) client_data;
+	instance->dependCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uitriggers.h b/ecflow_4_0_7/view/src/libui/uitriggers.h
new file mode 100644
index 0000000..088c5b4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uitriggers.h
@@ -0,0 +1,66 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uitriggers_h
+#define _uitriggers_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class triggers_menu_c: public xd_XmCascadeButton_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget triggers_menu;
+	Widget triggers_button_;
+	Widget triggered_button_;
+public:
+	static void reachCB( Widget, XtPointer, XtPointer );
+	virtual void reachCB( Widget, XtPointer ) = 0;
+	static void fullCB( Widget, XtPointer, XtPointer );
+	virtual void fullCB( Widget, XtPointer ) = 0;
+	static void triggeredCB( Widget, XtPointer, XtPointer );
+	virtual void triggeredCB( Widget, XtPointer ) = 0;
+	static void triggersCB( Widget, XtPointer, XtPointer );
+	virtual void triggersCB( Widget, XtPointer ) = 0;
+};
+
+typedef triggers_menu_c *triggers_menu_p;
+
+
+class triggers_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget triggers_form;
+	Widget tgraph_;
+	Widget ttext_;
+	Widget dependencies_button_;
+	Widget graph_;
+	Widget info_menu_;
+	Widget link_menu_;
+	Widget text_;
+public:
+	static void linkCB( Widget, XtPointer, XtPointer );
+	virtual void linkCB( Widget, XtPointer ) = 0;
+	static void hyperCB( Widget, XtPointer, XtPointer );
+	virtual void hyperCB( Widget, XtPointer ) = 0;
+	static void entryCB( Widget, XtPointer, XtPointer );
+	virtual void entryCB( Widget, XtPointer ) = 0;
+	static void dependCB( Widget, XtPointer, XtPointer );
+	virtual void dependCB( Widget, XtPointer ) = 0;
+};
+
+typedef triggers_form_c *triggers_form_p;
+class triggers;
+typedef triggers *triggers_p;
+
+
+extern triggers_menu_p triggers_menu;
+
+extern triggers_p triggers_form;
+
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiuser.cc b/ecflow_4_0_7/view/src/libui/uiuser.cc
new file mode 100644
index 0000000..0c14724
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiuser.cc
@@ -0,0 +1,107 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/Label.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ToggleBG.h>
+
+
+#include "uiuser.h"
+
+user_form_p user_form = (user_form_p) NULL;
+
+
+
+void user_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget frame2 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+	Widget radioBox1 = (Widget)NULL;
+	Widget toggle1 = (Widget)NULL;
+	Widget toggle2 = (Widget)NULL;
+	Widget toggle3 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "User level";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	user_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = user_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form_ = XmCreateForm ( user_form, "form_", al, ac );
+	ac = 0;
+	frame2 = XmCreateFrame ( form_, "frame2", al, ac );
+	XtSetArg(al[ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+	label2 = XmCreateLabel ( frame2, "User level", al, ac );
+	ac = 0;
+	radioBox1 = XmCreateRadioBox ( frame2, "user_level", al, ac );
+	toggle1 = XmCreateToggleButtonGadget ( radioBox1, "Normal", al, ac );
+	toggle2 = XmCreateToggleButtonGadget ( radioBox1, "Operator", al, ac );
+	toggle3 = XmCreateToggleButtonGadget ( radioBox1, "Administrator", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( frame2,al, ac );
+	ac = 0;
+
+	XtAddCallback (toggle1, XmNvalueChangedCallback,&user_form_c:: changedCB, (XtPointer) this);
+	XtAddCallback (toggle2, XmNvalueChangedCallback,&user_form_c:: changedCB, (XtPointer) this);
+	XtAddCallback (toggle3, XmNvalueChangedCallback,&user_form_c:: changedCB, (XtPointer) this);
+	children[ac++] = toggle1;
+	children[ac++] = toggle2;
+	children[ac++] = toggle3;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = label2;
+	children[ac++] = radioBox1;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = frame2;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form_;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void user_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	user_form_p instance = (user_form_p) client_data;
+	instance->useCB ( widget, call_data );
+}
+
+void user_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	user_form_p instance = (user_form_p) client_data;
+	instance->changedCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiuser.h b/ecflow_4_0_7/view/src/libui/uiuser.h
new file mode 100644
index 0000000..b9d8e9a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiuser.h
@@ -0,0 +1,30 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiuser_h
+#define _uiuser_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class user_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget user_form;
+	Widget form_;
+public:
+	static void useCB( Widget, XtPointer, XtPointer );
+	virtual void useCB( Widget, XtPointer ) = 0;
+	static void changedCB( Widget, XtPointer, XtPointer );
+	virtual void changedCB( Widget, XtPointer ) = 0;
+};
+
+typedef user_form_c *user_form_p;
+
+
+extern user_form_p user_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiusers.cc b/ecflow_4_0_7/view/src/libui/uiusers.cc
new file mode 100644
index 0000000..d0cb222
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiusers.cc
@@ -0,0 +1,76 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/List.h>
+#include <Xm/ScrollBar.h>
+
+
+#include "uiusers.h"
+
+users_form_p users_form = (users_form_p) NULL;
+
+
+
+void users_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form2 = (Widget)NULL;
+	Widget scrolledList1 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "users_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	users_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = users_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	form2 = XmCreateForm ( users_form, "form2", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT); ac++;
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form2, "list_", al, ac );
+	ac = 0;
+	scrolledList1 = XtParent ( list_ );
+
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtManageChild(list_);
+	children[ac++] = form2;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void users_form_c::sendCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	users_form_p instance = (users_form_p) client_data;
+	instance->sendCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiusers.h b/ecflow_4_0_7/view/src/libui/uiusers.h
new file mode 100644
index 0000000..0659ecb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiusers.h
@@ -0,0 +1,28 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiusers_h
+#define _uiusers_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class users_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget users_form;
+	Widget list_;
+public:
+	static void sendCB( Widget, XtPointer, XtPointer );
+	virtual void sendCB( Widget, XtPointer ) = 0;
+};
+
+typedef users_form_c *users_form_p;
+
+
+extern users_form_p users_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uivariables.cc b/ecflow_4_0_7/view/src/libui/uivariables.cc
new file mode 100644
index 0000000..9c90972
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uivariables.cc
@@ -0,0 +1,216 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/TextF.h>
+
+
+#include "uivariables.h"
+
+variables_p variables_form = (variables_p) NULL;
+
+
+
+void variables_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[7];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form1 = (Widget)NULL;
+	Widget scrolledList20 = (Widget)NULL;
+	Widget label1 = (Widget)NULL;
+	Widget label2 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "variables_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	variables_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = variables_form;
+	form1 = XmCreateForm ( variables_form, "form1", al, ac );
+	XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+	list_ = XmCreateScrolledList ( form1, "list_", al, ac );
+	ac = 0;
+	scrolledList20 = XtParent ( list_ );
+
+	edit_ = XmCreateForm ( form1, "edit_", al, ac );
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	set_ = XmCreatePushButton ( edit_, "set_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
+	delete_ = XmCreatePushButton ( edit_, "delete_", al, ac );
+	ac = 0;
+	XtSetArg(al[ac], XmNsensitive, TRUE); ac++;
+	find_ = XmCreatePushButton ( edit_, "find_", al, ac );
+	ac = 0;
+	label1 = XmCreateLabel ( edit_, "vvalue", al, ac );
+	label2 = XmCreateLabel ( edit_, "vname", al, ac );
+	name_ = XmCreateTextField ( edit_, "name_", al, ac );
+	value_ = XmCreateTextField ( edit_, "value_", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNbottomWidget, edit_); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( scrolledList20,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( edit_,al, ac );
+	ac = 0;
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&variables_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNtopPosition, 55); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNbottomPosition, 95); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNrightPosition, 20); ac++;
+	XtSetValues ( set_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNtopPosition, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNbottomPosition, 45); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNrightPosition, 20); ac++;
+	XtSetValues ( delete_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNtopPosition, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNbottomPosition, 45); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNleftPosition, 20); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNrightPosition, 30); ac++;
+	XtSetValues ( find_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNtopPosition, 50); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNleftPosition, 30); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNrightPosition, 50); ac++;
+	XtSetValues ( label1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNbottomPosition, 50); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNleftPosition, 30); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNrightPosition, 50); ac++;
+	XtSetValues ( label2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNbottomPosition, 50); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNleftPosition, 50); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( name_,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNtopPosition, 50); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_POSITION); ac++;
+	XtSetArg(al[ac], XmNleftPosition, 50); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( value_,al, ac );
+	ac = 0;
+	XtAddCallback (set_, XmNactivateCallback,&variables_form_c:: setCB, (XtPointer) this);
+	XtAddCallback (delete_, XmNactivateCallback,&variables_form_c:: deleteCB, (XtPointer) this);
+	XtAddCallback (find_, XmNactivateCallback,&variables_form_c:: findCB, (XtPointer) this);
+	XtAddCallback (name_, XmNvalueChangedCallback,&variables_form_c:: nameCB, (XtPointer) this);
+	XtAddCallback (value_, XmNvalueChangedCallback,&variables_form_c:: valueCB, (XtPointer) this);
+	children[ac++] = set_;
+	children[ac++] = delete_;
+	children[ac++] = label1;
+	children[ac++] = label2;
+	children[ac++] = name_;
+	children[ac++] = value_;
+	children[ac++] = find_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = edit_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void variables_form_c::valueCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	variables_form_p instance = (variables_form_p) client_data;
+	instance->valueCB ( widget, call_data );
+}
+
+void variables_form_c::nameCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	variables_form_p instance = (variables_form_p) client_data;
+	instance->nameCB ( widget, call_data );
+}
+
+void variables_form_c::deleteCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	variables_form_p instance = (variables_form_p) client_data;
+	instance->deleteCB ( widget, call_data );
+}
+
+void variables_form_c::findCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	variables_form_p instance = (variables_form_p) client_data;
+	instance->findCB ( widget, call_data );
+}
+
+void variables_form_c::setCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	variables_form_p instance = (variables_form_p) client_data;
+	instance->setCB ( widget, call_data );
+}
+
+void variables_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	variables_form_p instance = (variables_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uivariables.h b/ecflow_4_0_7/view/src/libui/uivariables.h
new file mode 100644
index 0000000..9b27f00
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uivariables.h
@@ -0,0 +1,46 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uivariables_h
+#define _uivariables_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class variables_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget variables_form;
+	Widget list_;
+	Widget edit_;
+	Widget set_;
+	Widget delete_;
+	Widget name_;
+	Widget value_;
+	Widget find_;
+public:
+	static void valueCB( Widget, XtPointer, XtPointer );
+	virtual void valueCB( Widget, XtPointer ) = 0;
+	static void nameCB( Widget, XtPointer, XtPointer );
+	virtual void nameCB( Widget, XtPointer ) = 0;
+	static void deleteCB( Widget, XtPointer, XtPointer );
+	virtual void deleteCB( Widget, XtPointer ) = 0;
+	static void setCB( Widget, XtPointer, XtPointer );
+	virtual void setCB( Widget, XtPointer ) = 0;
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+	static void findCB( Widget, XtPointer, XtPointer );
+	virtual void findCB( Widget, XtPointer ) = 0;
+};
+
+typedef variables_form_c *variables_form_p;
+class variables;
+typedef variables *variables_p;
+
+
+extern variables_p variables_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uiwhy.cc b/ecflow_4_0_7/view/src/libui/uiwhy.cc
new file mode 100644
index 0000000..eb1693f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiwhy.cc
@@ -0,0 +1,81 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawnB.h>
+#include <Xm/Form.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/ScrolledW.h>
+
+#include "Hyper.h"
+#define XmCreateDrawnButton CreateHyper
+#include "uiwhy.h"
+
+extern void why_pop_callback(Widget, XtPointer, XtPointer) ;
+extern void shell_popup_callback(Widget, XtPointer, XtPointer) ;
+why_form_p why_form = (why_form_p) NULL;
+
+
+
+void why_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[3];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget scrolledWin1 = (Widget)NULL;
+	Widget scrollbar25 = (Widget)NULL;
+	Widget scrollbar26 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "why_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	why_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = why_form;
+	XtSetArg(al[ac], XmNscrollingPolicy, XmAUTOMATIC); ac++;
+	scrolledWin1 = XmCreateScrolledWindow ( why_form, "scrolledWin1", al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNhorizontalScrollBar, &scrollbar25 ); ac++;
+	XtSetArg(al[ac], XmNverticalScrollBar, &scrollbar26 ); ac++;
+	XtGetValues(scrolledWin1, al, ac );
+	ac = 0;
+	text_ = XmCreateDrawnButton ( scrolledWin1, "text_", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomOffset, 5); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftOffset, 5); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightOffset, 5); ac++;
+	XtSetValues ( scrolledWin1,al, ac );
+	ac = 0;
+	XtAddCallback (text_, XmNactivateCallback,&why_form_c:: hyperCB, (XtPointer) this);
+	children[ac++] = text_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	XmScrolledWindowSetAreas(scrolledWin1, scrollbar25, scrollbar26, text_ );
+	children[ac++] = scrolledWin1;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void why_form_c::hyperCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	why_form_p instance = (why_form_p) client_data;
+	instance->hyperCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uiwhy.h b/ecflow_4_0_7/view/src/libui/uiwhy.h
new file mode 100644
index 0000000..90bc3b4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uiwhy.h
@@ -0,0 +1,28 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uiwhy_h
+#define _uiwhy_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class why_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget why_form;
+	Widget text_;
+public:
+	static void hyperCB( Widget, XtPointer, XtPointer );
+	virtual void hyperCB( Widget, XtPointer ) = 0;
+};
+
+typedef why_form_c *why_form_p;
+
+
+extern why_form_p why_form;
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libui/uizombies.cc b/ecflow_4_0_7/view/src/libui/uizombies.cc
new file mode 100644
index 0000000..5d3eea8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uizombies.cc
@@ -0,0 +1,143 @@
+/*
+** Generated by X-Designer
+*/
+/*
+**LIBS: -lXm -lXt -lX11
+*/
+
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/ScrollBar.h>
+
+#include "uizombies.h"
+
+zombies_form_p zombies_form = (zombies_form_p) NULL;
+
+void zombies_form_c::create (Widget parent, char *widget_name)
+{
+	Widget children[5];      /* Children to manage */
+	Arg al[64];                    /* Arg List */
+	register int ac = 0;           /* Arg Count */
+	Widget form2 = (Widget)NULL;
+	Widget scrolledList1 = (Widget)NULL;
+	Widget button2 = (Widget)NULL;
+	Widget button3 = (Widget)NULL;
+	Widget button1 = (Widget)NULL;
+	Widget button4 = (Widget)NULL;
+	Widget button5 = (Widget)NULL;
+
+	if ( !widget_name )
+		widget_name = "zombies_form";
+
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+	zombies_form = XmCreateForm ( parent, widget_name, al, ac );
+	ac = 0;
+	_xd_rootwidget = zombies_form;
+	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
+       form2 = XmCreateForm ( zombies_form, "form2", al, ac );
+       ac = 0;
+       XtSetArg(al[ac], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); ac++;
+       XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT); ac++;
+       list_ = XmCreateScrolledList ( form2, "list_", al, ac );
+       ac = 0;
+       scrolledList1 = XtParent ( list_ );
+
+	XtSetArg(al[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
+	buttons_ = XmCreateRowColumn ( form2, "buttons_", al, ac );
+	ac = 0;
+	button2 = XmCreatePushButton ( buttons_, "Terminate", al, ac );
+	button3 = XmCreatePushButton ( buttons_, "Rescue", al, ac );
+	button1 = XmCreatePushButton ( buttons_, "Fob off", al, ac );
+	button4 = XmCreatePushButton ( buttons_, "Delete", al, ac );
+	button5 = XmCreatePushButton ( buttons_, "Kill", al, ac );
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( form2,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+	XtSetArg(al[ac], XmNrightWidget, buttons_); ac++;
+	XtSetValues ( scrolledList1,al, ac );
+	ac = 0;
+
+	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
+	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+	XtSetValues ( buttons_,al, ac );
+	ac = 0;
+
+	XtAddCallback (list_, XmNbrowseSelectionCallback,&zombies_form_c:: browseCB, (XtPointer) this);
+	XtAddCallback (list_, XmNmultipleSelectionCallback,&zombies_form_c:: browseCB, (XtPointer) this);
+	XtManageChild(list_);
+	XtAddCallback (button2, XmNactivateCallback,&zombies_form_c:: terminateCB, (XtPointer) this);
+	XtAddCallback (button3, XmNactivateCallback,&zombies_form_c:: rescueCB, (XtPointer) this);
+	XtAddCallback (button1, XmNactivateCallback,&zombies_form_c:: acceptCB, (XtPointer) this);
+	XtAddCallback (button4, XmNactivateCallback,&zombies_form_c:: deleteCB, (XtPointer) this);
+	XtAddCallback (button5, XmNactivateCallback,&zombies_form_c:: killCB, (XtPointer) this);
+	children[ac++] = button2;
+	children[ac++] = button3;
+	children[ac++] = button1;
+	children[ac++] = button4;
+	children[ac++] = button5;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = buttons_;
+	XtManageChildren(children, ac);
+	ac = 0;
+	children[ac++] = form2;
+	XtManageChildren(children, ac);
+	ac = 0;
+}
+
+void zombies_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	zombies_form_p instance = (zombies_form_p) client_data;
+	instance->browseCB ( widget, call_data );
+}
+
+void zombies_form_c::deleteCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	zombies_form_p instance = (zombies_form_p) client_data;
+	instance->deleteCB ( widget, call_data );
+}
+
+void zombies_form_c::acceptCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	zombies_form_p instance = (zombies_form_p) client_data;
+	instance->acceptCB ( widget, call_data );
+}
+
+void zombies_form_c::rescueCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	zombies_form_p instance = (zombies_form_p) client_data;
+	instance->rescueCB ( widget, call_data );
+}
+
+void zombies_form_c::terminateCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	zombies_form_p instance = (zombies_form_p) client_data;
+	instance->terminateCB ( widget, call_data );
+}
+
+void zombies_form_c::killCB( Widget widget, XtPointer client_data, XtPointer call_data )
+{
+	zombies_form_p instance = (zombies_form_p) client_data;
+	instance->killCB ( widget, call_data );
+}
+
diff --git a/ecflow_4_0_7/view/src/libui/uizombies.h b/ecflow_4_0_7/view/src/libui/uizombies.h
new file mode 100644
index 0000000..87aae9e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libui/uizombies.h
@@ -0,0 +1,37 @@
+/*
+** Generated by X-Designer
+*/
+#ifndef _uizombies_h
+#define _uizombies_h
+
+#define XD_MOTIF
+
+#include <xdclass.h>
+
+class zombies_form_c: public xd_XmForm_c {
+public:
+	virtual void create (Widget parent, char *widget_name = NULL);
+protected:
+	Widget zombies_form;
+	Widget list_;
+	Widget buttons_;
+public:
+	static void browseCB( Widget, XtPointer, XtPointer );
+	virtual void browseCB( Widget, XtPointer ) = 0;
+	static void deleteCB( Widget, XtPointer, XtPointer );
+	virtual void deleteCB( Widget, XtPointer ) = 0;
+	static void acceptCB( Widget, XtPointer, XtPointer );
+	virtual void acceptCB( Widget, XtPointer ) = 0;
+	static void rescueCB( Widget, XtPointer, XtPointer );
+	virtual void rescueCB( Widget, XtPointer ) = 0;
+	static void terminateCB( Widget, XtPointer, XtPointer );
+	virtual void terminateCB( Widget, XtPointer ) = 0;
+	static void killCB( Widget, XtPointer, XtPointer );
+	virtual void killCB( Widget, XtPointer ) = 0;
+};
+
+typedef zombies_form_c *zombies_form_p;
+
+extern zombies_form_p zombies_form;
+
+#endif
diff --git a/ecflow_4_0_7/view/src/libxec/xec_Cursor.c b/ecflow_4_0_7/view/src/libxec/xec_Cursor.c
new file mode 100644
index 0000000..294ab68
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_Cursor.c
@@ -0,0 +1,52 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <X11/X.h>
+#include <X11/cursorfont.h>
+#include <Xm/Xm.h>
+
+/*----------------------------------------------------
+
+	Set the cursor to a watch shape. 
+	Usualy pass the Top Shell as argument.
+
+----------------------------------------------------*/
+
+void xec_SetWatchCursor(w)
+Widget w;
+{
+	static Cursor watch = 0;
+
+	if(!watch)
+		watch = XCreateFontCursor(XtDisplay(w),XC_watch);
+
+	XDefineCursor(XtDisplay(w),XtWindow(w),watch);
+	XmUpdateDisplay(w);
+}
+
+/*----------------------------------------------------
+
+	Reset the cursor to its default shape. 
+	Usualy pass the Top Shell as argument.
+
+----------------------------------------------------*/
+
+void xec_ResetCursor(w)
+Widget w;
+{
+	XUndefineCursor(XtDisplay(w),XtWindow(w));
+	XmUpdateDisplay(w);
+}
+
diff --git a/ecflow_4_0_7/view/src/libxec/xec_Label.c b/ecflow_4_0_7/view/src/libxec/xec_Label.c
new file mode 100644
index 0000000..2c724b5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_Label.c
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <Xm/Xm.h>
+#include "xec.h"
+
+/*-----------------------------------------------
+
+	Change the title of a Label or Button
+
+-------------------------------------------------*/
+
+void xec_SetLabel(Widget w,const char *title)
+{
+	XmString	s = xec_NewString(title);
+	XtVaSetValues(w,XmNlabelString,s,NULL);
+	XmStringFree(s);
+}
+
+void xec_VaSetLabel(Widget w,const char *fmt,...)
+{
+	va_list   args;
+	char      str[1000];  /* DANGER: Fixed buffer size */
+	va_start(args,fmt);
+	vsprintf(str, fmt, args);
+	xec_SetLabel(w,str);
+	va_end(args);
+}
diff --git a/ecflow_4_0_7/view/src/libxec/xec_List.c b/ecflow_4_0_7/view/src/libxec/xec_List.c
new file mode 100644
index 0000000..f1ae405
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_List.c
@@ -0,0 +1,276 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #2 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <Xm/Xm.h>
+#include <Xm/ListP.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include "xec.h"
+
+
+/*-----------------------------------------------------
+
+	Remove one line to a list
+
+------------------------------------------------------*/
+
+void xec_RemoveListItem(Widget w,char *p)
+{
+	XmString item= XmStringCreateSimple(p);
+	XmListDeleteItem(w,item);
+	XmStringFree(item);
+}
+
+void xec_ListItemSelect(Widget w,const char* p)
+{
+	XmString item= XmStringCreateSimple((char*)p);
+	int n = XmListItemPos(w,item);
+
+	XmListDeselectAllItems(w);
+	if(n) {
+		int vis_count;
+		XtVaGetValues(w,XmNvisibleItemCount,&vis_count,NULL);
+		XmListSelectPos(w,n,False);
+		if(n<((XmListWidget)w)->list.top_position || 
+			n > ((XmListWidget)w)->list.top_position + vis_count)
+			XmListSetPos(w,n);
+	}
+
+	XmStringFree(item);
+}
+
+#if 0
+/*----------------------------------------------------
+
+	Add to a list with max number of items
+
+-----------------------------------------------------*/
+
+void xec_AddListMax(Widget w,int max,char* p)
+{
+	ARG_DEF(1);
+	int n;
+
+	SetArg(XmNitemCount,&n);
+	GetValues(w);
+	if(n>=max) XmListDeletePos(w,1);
+	xec_AddListItem(w,p);
+
+	SetArg(XmNitemCount,&n);
+	GetValues(w);
+	XmListSetBottomPos(w,n);
+}
+
+void xec_VaAddListMax(Widget  w,int max,char *fmt,...)
+{
+	va_list   args;
+	char      str[1000];  /* DANGER: Fixed buffer size */
+				 
+	va_start(args,fmt);
+	vsprintf(str, fmt, args);
+    xec_AddListMax(w,max,str);
+	va_end(args);
+}
+
+#endif
+
+void xec_ListSelectAll(Widget w)
+{
+	int n,i;
+	XtVaGetValues(w,XmNitemCount,&n,NULL);
+	XmListDeselectAllItems(w);
+	for(i=1;i<=n;i++) XmListSelectPos(w,i,False);
+
+}
+							   
+
+/*-----------------------------------------------------
+
+	Add one line to a list
+
+------------------------------------------------------*/
+
+void xec_AddListItem(Widget w,char *p)
+{
+	XmString item= XmStringCreateSimple(p);
+	XmListAddItemUnselected(w,item,0);
+	XmStringFree(item);
+}
+
+Boolean xec_AddListItemUnique(Widget w,char *p,Boolean sel)
+{
+	XmString item= XmStringCreateSimple(p);
+	int added = 0;
+	if(!XmListItemExists(w,item))
+	{
+		XmListAddItemUnselected(w,item,0);
+		if(sel) XmListSelectItem(w,item,0);
+		added = 1;
+	}
+	XmStringFree(item);
+	return added;
+}
+
+
+void xec_VaAddListItem(Widget w,char *fmt,...)
+{
+	va_list   args;
+	char      str[1000];  /* DANGER: Fixed buffer size */
+				 
+	va_start(args,fmt);
+	vsprintf(str, fmt, args);
+	xec_AddListItem(w,str);
+	va_end(args);
+}
+
+void xec_ReplaceListItem(Widget w,const char* from,const char* to)
+{
+	XmString a= XmStringCreateSimple((char*)from);
+	XmString b= XmStringCreateSimple((char*)to);
+	XmListReplaceItems(w,&a,1,&b);
+	XmStringFree(a);
+	XmStringFree(b);
+}
+
+#if 0
+
+/*-----------------------------------------------------
+
+	Replace all items in a list
+
+------------------------------------------------------*/
+void xec_SetListItems(Widget w,XmString list[],int count)
+{
+	ARG_DEF(2);
+
+	SetArg(XmNitems, list );
+	SetArg(XmNitemCount, count );
+	SetValues(w);
+
+}
+
+/*---------------------------------------------------*/
+int xec_DumpList(FILE *f,char *fmt,Widget w)
+{
+	ARG_DEF(2);
+	int 	count;
+	XmString *list;
+	int i;
+	int ret = 0;
+
+	SetArg(XmNitems,&list);
+	SetArg(XmNitemCount,&count);
+	GetValues(w);
+
+	for(i=0;i<count;i++)
+	{
+		char *p = (char*)xec_GetString(list[i]);
+		fprintf(f,fmt,p);
+		if(errno) ret = errno;
+		XtFree((XtPointer)p);
+	}
+	return errno = ret;
+}
+/*-----------------------------------------------------*/
+
+/*--------------------------------------------------
+
+	Search the regexp 'word' in the list 'w'.
+	Return TRUE in the text was found.
+	if 'nocase' is TRUE the search is not case sensitive.
+	if 'fromstart' is TRUE the search start from the
+	fisrt char, else from the current position.
+	if 'wrap' is TRUE the search is done all the text.
+
+	---------------------------------------------------*/
+
+Boolean xec_ListSearch(Widget w,char   *word,Boolean nocase,Boolean fromstart,Boolean wrap)
+{
+  // ARG_DEF(5);
+	int first = 0;
+	int count,sel_count,vis_count;
+	XmString	*items,*sel_items;
+	char        *p;
+	int			from,to,i;
+
+	SetArg(XmNitemCount,&count);
+	SetArg(XmNselectedItemCount,&sel_count);
+	SetArg(XmNitems,&items);
+	SetArg(XmNselectedItems,&sel_items);
+	SetArg(XmNvisibleItemCount,&vis_count);
+	GetValues(w);
+
+	if(!fromstart)
+		if(sel_count) first = ((XmListWidget)w)->list.selectedIndices[0];
+
+	while(TRUE)
+	{
+		for(i=first;i<count;i++)
+		{
+			p = xec_GetString(items[i]);
+			if(regexp_find(word,p,nocase,&from,&to))
+			{
+				int n = i+1;
+
+				XmListDeselectAllItems(w);
+				XmListSelectPos(w,n,False);
+				if(n<((XmListWidget)w)->list.top_position || 
+				    n > ((XmListWidget)w)->list.top_position + vis_count)
+					XmListSetPos(w,n);
+				XtFree((XtPointer)p);
+				return TRUE;
+			}
+			XtFree((XtPointer)p);
+		}
+		if(!wrap) break;
+		first = 0;
+		wrap = FALSE;
+	}
+	return FALSE;
+}
+
+void xec_ListSelect(Widget w,int n)
+{
+	ARG_DEF(5);
+	int vis_count;
+
+	SetArg(XmNvisibleItemCount,&vis_count);
+	GetValues(w);
+
+	XmListDeselectAllItems(w);
+	XmListSelectPos(w,n,False);
+
+	/* printf("xec_ListSelect %d\n",n); */
+
+	if(n<((XmListWidget)w)->list.top_position || 
+		    n > ((XmListWidget)w)->list.top_position + vis_count)
+
+	XmListSetPos(w,n);
+}
+
+#endif
+
+static char *fonts[] = {
+	"normal","bold", };
+
+void xec_AddFontListItem(Widget list,char *buffer,Boolean bold)
+{
+   int index = (bold) ? 1 : 0 ;
+   XmString s = XmStringCreateLtoR(buffer,fonts[index]);
+   XmListAddItem(list,s,0);
+   XmStringFree(s);
+}
+
diff --git a/ecflow_4_0_7/view/src/libxec/xec_Regexp.c b/ecflow_4_0_7/view/src/libxec/xec_Regexp.c
new file mode 100644
index 0000000..4fe540a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_Regexp.c
@@ -0,0 +1,91 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/*=====================
+
+Include regexp once for compatibility
+
+======================*/
+
+#include <stdio.h>
+
+#define ESIZE 1024
+
+#ifdef NO_REGEXP
+
+static char *loc1,*loc2;
+static int len;
+
+static compile(w,buf,end,dummy)
+char *w,*buf;
+int end;
+int dummy;
+{
+    strcpy(buf,w);
+    len = strlen(w);
+}
+
+static step(w,buf)
+char *w;
+char *buf;
+{
+    loc1 = w;
+    while(*loc1)
+    {
+        if(strncmp(loc1,buf,len) == 0)
+        {
+            loc2 = loc1+len;
+            return 1;
+        }
+        loc1++;
+    }
+    return 0;
+}
+
+
+#else
+
+/* size of regexp buffer */
+
+
+#define INIT        register char *sp = instring;
+#define GETC()      (*sp++)
+#define PEEKC()     (*sp)
+#define UNGETC(c)   (--sp)
+#define RETURN(c)   return;
+#define ERROR(c)    fprintf(stderr,"Warning regexp error %d\n",c)
+
+#include <regexp.h>
+
+#endif
+
+static char  expbuf[ESIZE];
+char *xec_loc1;
+char *xec_loc2;
+
+void xec_compile(w)
+char *w;
+{
+	compile(w,expbuf,&expbuf[ESIZE],'\0');
+}
+
+int xec_step(p)
+char *p;
+{
+	int s =  step(p,expbuf);
+	xec_loc1 = loc1;
+	xec_loc2 = loc2;
+	return s;
+}
diff --git a/ecflow_4_0_7/view/src/libxec/xec_Strings.c b/ecflow_4_0_7/view/src/libxec/xec_Strings.c
new file mode 100644
index 0000000..88f2c13
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_Strings.c
@@ -0,0 +1,134 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include <Xm/Xm.h>
+#include <string.h>
+#include <malloc.h>
+
+/*-----------------------------------------------------
+
+	Create a new XmString from a char*
+
+	This function can deal with embedded 'newline' and
+	is equivalent to the obsolete XmStringCreateLtoR,
+	except it does not use non AES compliant charset
+	XmSTRING_DEFAULT_CHARSET
+
+------------------------------------------------------*/
+
+
+XmString xec_NewString(const char* s)
+{
+	XmString xms1;
+	XmString xms2;
+	XmString line;
+	XmString separator;
+	char     *p;
+	char     *t = XtNewString(s);	/* Make a copy for strtok not to */
+                                 	/* damage the original string    */
+
+	separator = XmStringSeparatorCreate();
+	p         = strtok(t,"\n");
+	xms1      = XmStringCreateSimple(p);
+
+	while ((p = strtok(NULL,"\n")))
+	{
+		line = XmStringCreateSimple(p);
+		xms2 = XmStringConcat(xms1,separator);
+		XmStringFree(xms1);
+		xms1 = XmStringConcat(xms2,line);
+		XmStringFree(xms2);
+		XmStringFree(line);
+	}
+
+	XmStringFree(separator);
+	XtFree(t);
+	return xms1;
+}
+
+
+/*-----------------------------------------------------
+
+	Build an XmString list from char*
+
+------------------------------------------------------*/
+
+void xec_BuildXmStringList(XmString** list, char* p, int *count)
+{
+	XmString	*l = *list;
+
+	if(!l) {
+		*count = 0;
+		l = (XmString*)malloc(0);
+	}
+
+	(*count)++;
+	l = (XmString*)XtRealloc((char*) l,sizeof(XmString)*(*count));
+	l[(*count-1)] = xec_NewString(p);
+
+	*list = l;
+}
+
+/*-----------------------------------------------------
+
+	Free an XmString list 
+
+------------------------------------------------------*/
+
+void xec_FreeXmStringList(XmString* list, int count)
+{
+	int i;
+
+	if(list)
+	{
+		for(i=0;i<count;i++) XmStringFree(list[i]);
+		XtFree((XtPointer)list);
+	}
+}
+
+char *xec_GetString(XmString string)
+{
+	XmStringContext  context;
+	char             *text;
+	XmStringCharSet   charset;
+	XmStringDirection dir;
+	Boolean           separator;
+	char             *buf = NULL;
+	int               done = FALSE;
+
+	XmStringInitContext (&context, string);
+	while (!done)
+		if(XmStringGetNextSegment (context, &text, &charset, &dir, &separator))
+		{
+			if(separator) /* Stop when next segment is a separator */
+				done = TRUE;
+
+			if(buf)
+			{
+				buf = XtRealloc(buf, strlen(buf) + strlen(text) + 2);
+				strcat(buf, text);
+			}
+			else
+				buf = XtNewString(text);
+
+			XtFree((XtPointer)charset);
+			XtFree((XtPointer)text);
+		}
+		else
+			done = TRUE;
+
+	XmStringFreeContext (context);
+	return buf;
+
+}
diff --git a/ecflow_4_0_7/view/src/libxec/xec_Text.c b/ecflow_4_0_7/view/src/libxec/xec_Text.c
new file mode 100644
index 0000000..7bbf9c8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_Text.c
@@ -0,0 +1,551 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #2 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <Xm/Xm.h>
+#include <Xm/Text.h>
+#include <Xm/TextP.h>
+#include <Xm/Form.h>
+#include <Xm/TextStrSoP.h>
+#include <Xm/CutPaste.h>
+#include "xec.h"
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <regex.h>
+#include <setjmp.h>
+#include <signal.h>
+
+/* Avi: Added to fix: warning: implicit declaration of function ‘_XmTextUpdateLineTable’ */
+extern void _XmTextUpdateLineTable(
+                        Widget widget,
+                        XmTextPosition start,
+                        XmTextPosition end,
+                        XmTextBlock block,
+                        // int update) ; // JIRA:ECFLOW-48
+                        Boolean update) ; // JIRA:ECFLOW-48
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *)(-1))
+#endif
+
+int  regexp_find(const char *word,const char *buffer,
+	int nocase,int *from,int *to)
+{
+	regex_t re;
+	regmatch_t pmatch[1];
+	int e;
+
+	if((e = regcomp(&re,word,REG_NEWLINE | REG_EXTENDED | (nocase? REG_ICASE : 0) )))
+	{
+		char buf[1024];
+		regerror(e,&re,buf,sizeof(buf));
+		return False;
+	}
+
+	if((e = regexec(&re,buffer,XtNumber(pmatch),pmatch,0)))
+	{
+		char buf[1024];
+		regerror(e,&re,buf,sizeof(buf));
+		regfree(&re);
+		return False;
+	}
+
+	*from = pmatch[0].rm_so;
+	*to   = pmatch[0].rm_eo;
+
+	regfree(&re);
+
+	return True;
+}
+
+char* xec_TextGetString(Widget w,long *length)
+{
+#if 0
+	return XmTextGetString(w);
+#else
+	XmTextSource s = XmTextGetSource(w);
+	*length = s->data->length;
+	return s->data->ptr;
+#endif
+}
+
+void xec_TextFreeString(char* p)
+{
+#if 0
+	XtFree(p);
+#endif
+}
+
+static jmp_buf env;
+
+static void catch_sigv(int sig)
+{
+	fprintf(stderr,"SIGV received...\n");
+	longjmp(env,1);
+}
+
+/*--------------------------------------------------
+---------------------------------------------------*/
+
+/*--------------------------------------------------
+
+	Search the regexp 'word' in the text 'w'.
+	Return TRUE in the text was found.
+	if 'nocase' is TRUE the search is not case sensitive.
+	if 'fromstart' is TRUE the search start from the
+	fisrt char, else from the current position.
+	if 'wrap' is TRUE the search is done all the text.
+
+---------------------------------------------------*/
+
+Boolean xec_TextSearch(Widget w,char *word,
+	Boolean nocase,
+	Boolean regex,
+	Boolean back,
+	Boolean fromstart,
+	Boolean wrap)
+{
+
+	Boolean			success,more;
+	XmTextPosition 	offset,dummy;
+	int from,to;
+	long length = 0;
+	char 			*p=xec_TextGetString(w,&length);
+
+	if(fromstart)
+	{
+		offset = (!regex && back) ? XmTextGetLastPosition(w) - strlen(word) : 0;
+		wrap   = FALSE;
+	}
+	else
+	{
+		XmTextGetSelectionPosition(w,&dummy,&offset);
+		if(dummy == offset) offset = XmTextGetInsertionPosition(w);
+
+		if(back) { 
+			if(dummy)
+				offset = dummy-1; 
+			else if(wrap)
+			{
+				offset = XmTextGetLastPosition(w) - strlen(word);
+			}
+		}
+	}
+
+	do
+	{
+
+		if(regex) 
+		{
+			success =  regexp_find(word,p+offset,nocase,&from,&to);
+			if(success && ((from+offset > length) || (to + offset > length)))
+				success = False;
+		}
+		else  {
+
+			success = 0;
+
+			 /* Because we use mmap, XmTextFindString may crash */
+
+			signal(SIGSEGV,catch_sigv);
+			if(setjmp(env) == 0)
+			{
+				success = XmTextFindString(w,offset,word, 
+					back ? XmTEXT_BACKWARD : XmTEXT_FORWARD,&dummy);
+			}
+			signal(SIGSEGV,SIG_DFL);
+
+
+
+			if(success) {
+
+				from = dummy - offset;
+				to   = from + strlen(word);
+
+			}
+		}
+			
+
+		if(success)
+		{
+			XmTextShowPosition(w,to+offset);
+			XmTextSetSelection(w,from+offset,to+offset,CurrentTime);
+		}
+
+		more = wrap && !success;
+
+		if(wrap)
+		{
+			wrap = FALSE;
+			offset = (!regex && back) ? XmTextGetLastPosition(w)  - strlen(word): 0;
+		}
+
+	}while(more);
+
+	xec_TextFreeString(p);
+
+	return success;
+
+}
+
+
+
+/*-------------------------------------------------
+
+	Copy the content of a Text in a buffer.
+
+--------------------------------------------------*/
+
+char *xec_GetText(w,buf)
+Widget w;
+char   buf[];
+{
+	char *q = (char*)XmTextGetString(w);
+
+	strcpy(buf,q);
+	XtFree((XtPointer)q);
+
+	return buf;
+}
+
+
+/*-------------------------------------------------
+
+	Load a file into a text widget.
+	if include is TRUE the text if included.
+
+--------------------------------------------------*/
+
+int xec_LoadText(Widget Text,const char *fname,Boolean include)
+{
+	FILE    *fp = NULL;
+	char    *p;
+	long    length;
+	int 	ret = 0;
+
+
+	errno = 0;
+
+	if (!fname) return -1;
+
+	if ((fp = fopen(fname,"r")))
+	{
+		fseek(fp,0L,2);
+		if (errno)
+		{
+			ret = errno;
+			fclose(fp);
+			return errno = ret;
+		}
+
+		length=ftell(fp);
+		if (errno)
+		{
+			ret = errno;
+			fclose(fp);
+			return errno = ret;
+		}
+
+		fseek(fp,0L,0);
+		if (errno)
+		{
+			ret = errno;
+			fclose(fp);
+			return errno = ret;
+		}
+
+		p = (char*)XtMalloc(length+1);
+		p[length] = 0;
+
+		fread(p,length,1,fp);
+		if (errno)
+		{
+			ret = errno;
+			fclose(fp);
+			return errno = ret;
+		}
+
+		XmTextDisableRedisplay(Text);
+		if (include)
+			xec_ReplaceTextSelection(Text,p,FALSE);
+		else
+		{
+			XmTextSetInsertionPosition(Text,0);
+			XmTextSetSelection(Text,0,0,CurrentTime);
+			XmTextSetString(Text,p);
+		}
+		XmTextEnableRedisplay(Text);
+
+		XtFree(p);
+		fclose(fp);
+	} 
+	else 
+	{
+		perror(fname);
+		ret = errno;
+		if (!include) XmTextSetString(Text,"");
+	}
+	return errno = ret;
+
+}
+
+/* ================================================== */
+
+
+typedef struct mapped_text {
+	XmTextSource    source_;
+	FILE*           file_;
+	Widget          text_;
+	XmSourceDataRec save_;
+} mapped_text;
+
+void* xec_MapText(Widget w,const char *fname,int* z)
+{
+	FILE    *fp = NULL;
+	long    length;
+	int 	ret = 0;
+	char *m;
+	mapped_text *p;
+	XEvent ev;
+	XmTextBlockRec block;
+	int i; 
+
+
+	errno = 0;
+
+	if (!fname) return NULL;
+
+	if ((fp = fopen(fname,"r")))
+	{
+		fseek(fp,0L,2);
+		if (errno)
+		{
+			ret = errno;
+			fclose(fp);
+			return NULL;
+		}
+
+		length=ftell(fp);
+		if (errno)
+		{
+			ret = errno;
+			fclose(fp);
+			return NULL;
+		}
+
+		fseek(fp,0L,0);
+		if (errno)
+		{
+			ret = errno;
+			fclose(fp);
+			return NULL;
+		}
+
+		/* f = w; */
+		/* while(f && !XmIsForm(f)) */
+			/* f = XtParent(f); */
+
+		/* if(!f) return NULL; */
+
+
+		m = mmap(NULL,length,PROT_READ,MAP_SHARED,fileno(fp),0);
+		if((void*)m == MAP_FAILED)
+		{
+			perror(fname);
+			return NULL;
+		}
+		(*z) = 0;
+		for(i = 0 ; i < length; i++)
+			if(m[i] == 0) (*z)++;
+
+		XmTextDisableRedisplay(w);
+		XmTextClearSelection(w,CurrentTime);
+		XmTextSetInsertionPosition(w,0);
+		XmTextSetTopCharacter(w,0);
+		XmTextShowPosition(w,0);
+		XmTextEnableRedisplay(w);
+		XmTextSetString(w,"");
+	
+		p = XtNew(mapped_text);
+
+		/* p->text1_ = XmCreateText(f,"dummy",0,0); */
+		/* p->text2_ = XmCreateText(f,"dummy",0,0); */
+
+		p->source_               = XmTextGetSource(w);
+		p->file_                 = fp;
+		p->text_                 = w;
+		p->save_                 = *p->source_->data;
+
+		p->source_->data->ptr        = m;
+		p->source_->data->length     = length;
+		p->source_->data->maxlength  = length;
+		p->source_->data->value      = m;
+		p->source_->data->old_length = length;
+		p->source_->data->gap_start  = 0;
+		p->source_->data->gap_end    = 0;
+
+
+		((XmTextWidget)w)->text.needs_refigure_lines = True;
+		/* _XmTextNumLines((XmTextWidget)w); */
+
+		block.ptr    = m;
+		block.length = length;
+		block.format = XmFMT_8_BIT;
+
+		_XmTextUpdateLineTable(w,0, XmTextGetLastPosition(w),&block,1);
+
+#if 1
+		/* ((XmTextWidget)w)->text.needs_refigure_lines = True; */
+		/* printf("Num lines : %d\n",_XmTextNumLines((XmTextWidget)w)); */
+		/* _XmTextValueChanged((XmTextWidget)w,&ev); */
+		
+		memset(&ev,0,sizeof(ev));
+		ev.type = Expose;
+		ev.xexpose.display = XtDisplay(w);
+		ev.xexpose.window  = XtWindow(w);
+
+		XSendEvent(XtDisplay(w),XtWindow(w),True,ExposureMask,&ev);
+#endif
+
+		return p;
+
+	}
+	return NULL;
+
+}
+
+void xec_UnmapText(void *x)
+{
+	if(x)
+	{
+		XmTextBlockRec block;
+		mapped_text* p = (mapped_text*)x;
+		Widget w = p->text_;
+
+		((XmTextWidget)w)->text.needs_refigure_lines = True;
+		/* _XmTextNumLines((XmTextWidget)w); */
+
+		block.ptr    = NULL;
+		block.length = 0;
+		block.format = XmFMT_8_BIT;
+		_XmTextUpdateLineTable(w,0, XmTextGetLastPosition(w),&block,1);
+
+		XmTextDisableRedisplay(w);
+		XmTextClearSelection(w,CurrentTime);
+		XmTextSetInsertionPosition(w,0);
+		XmTextSetTopCharacter(w,0);
+		XmTextShowPosition(w,0);
+
+		XmTextEnableRedisplay(w);
+
+		munmap(p->source_->data->ptr,p->source_->data->length);
+		*p->source_->data = p->save_;
+		fclose(p->file_);
+
+		XtFree((char*)p);
+
+		XmTextSetString(w,"");
+	}
+
+}
+
+/*-------------------------------------------------
+
+	Save a text into a file
+
+--------------------------------------------------*/
+
+/* Open file, save text and close file */
+
+int xec_SaveText(Widget w,char *fname)
+{
+	FILE    *fp = NULL;
+	char    *p = XmTextGetString(w);
+	int 	ret;
+
+	errno = 0;
+
+	if (!fname) return -1;
+
+	if ((fp = fopen(fname,"w")))
+		if (fwrite(p,strlen(p),1,fp)) fclose(fp);
+
+	ret = errno;
+	XtFree(p);
+	return errno = ret;
+}
+
+
+/* File is already opened: just save text */
+
+int xec_DumpText(FILE *fp,Widget w)
+{
+	char    *p = XmTextGetString(w);
+
+	errno = 0;
+	fwrite(p,strlen(p),1,fp);
+	XtFree((XtPointer)p);
+	return errno;
+}
+
+
+/*-------------------------------------------------
+
+	Print a text
+
+--------------------------------------------------*/
+
+void xec_PrintText(Widget w,char * cmd)
+{
+	char    *tmp = tmpnam(NULL);
+	char	buf[1024];
+
+	xec_SaveText(w,tmp);
+	if(cmd)
+		sprintf(buf,"%s %s",cmd,tmp);
+	else
+		sprintf(buf,"lpr %s",tmp);
+
+	system(buf);
+	unlink(tmp);
+
+
+}
+
+/*-------------------------------------------------
+
+	Replace the selection by a char*
+	If sel the inserted text is selected
+
+--------------------------------------------------*/
+
+void xec_ReplaceTextSelection(Widget w,char *p,Boolean sel)
+{
+	XmTextPosition	from,to;
+
+	XmTextGetSelectionPosition(w,&from,&to);
+	if(from == to) from = to = XmTextGetInsertionPosition(w);
+	XmTextReplace(w,from,to,p);
+	if(sel)
+		XmTextSetSelection(w,from,from+strlen(p),CurrentTime);
+	else
+		XmTextSetSelection(w,from+strlen(p),from+strlen(p),CurrentTime);
+	XmTextSetInsertionPosition(w,from+strlen(p));
+}
+
diff --git a/ecflow_4_0_7/view/src/libxec/xec_Toggle.c b/ecflow_4_0_7/view/src/libxec/xec_Toggle.c
new file mode 100644
index 0000000..c2e502c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_Toggle.c
@@ -0,0 +1,41 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include <Xm/Xm.h>
+#include <stdio.h>
+#include "xec.h"
+
+/*-----------------------------------------------
+
+	Set or reset a toggle button
+
+-------------------------------------------------*/
+
+void xec_SetToggle(Widget w,int set)
+{
+	Arg arg;
+
+	XtSetArg(arg,XmNset,set?1:0); 
+	XtSetValues(w,&arg,1);
+}
+
+int xec_GetToggle(Widget w)
+{
+	Boolean set;Arg arg;
+
+	XtSetArg(arg,XmNset, &set); 
+	XtGetValues(w,&arg,1);
+
+	return set;
+}
diff --git a/ecflow_4_0_7/view/src/libxec/xec_Widget.c b/ecflow_4_0_7/view/src/libxec/xec_Widget.c
new file mode 100644
index 0000000..3814bbd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/libxec/xec_Widget.c
@@ -0,0 +1,215 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #1 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include <stdio.h>
+#include <Xm/Xm.h>
+#include <Xm/ScrolledW.h>
+#include <Xm/ScrollBar.h>
+#include <X11/IntrinsicP.h>
+#include "xec.h"
+
+
+void *xec_GetUserData(Widget w)
+{
+	void *p;
+	XtVaGetValues(w,XmNuserData,&p,NULL);
+	return p;
+}
+
+/*-------------------------------------------------
+
+	Attach a pointer to a widget
+
+-------------------------------------------------*/
+
+void xec_SetUserData(Widget w, void* p)
+{
+	XtVaSetValues(w,XmNuserData,p,NULL);
+}
+
+/*-------------------------------------------------
+
+	Sets a color
+
+--------------------------------------------------*/
+
+
+void xec_SetColor(Widget w, Pixel p, const char* which)
+{
+	XtVaSetValues(w,which,p,NULL);
+}
+
+/*-------------------------------------------------
+
+	Scroll a window to make a widget visible
+
+--------------------------------------------------*/
+
+#if 1
+
+void xec_ShowWidget(Widget w)
+{
+
+	Widget v_scroll,h_scroll;
+
+
+	Position 	x_parent,y_parent;
+	Position 	x_widget,y_widget;
+	Dimension 	h_widget,w_widget;
+	Position 	x_clip,y_clip;
+	Dimension 	h_clip,w_clip;
+	Position 	dv=0,dh=0;
+	int min,max;
+	int	v_val,v_size,v_inc,v_page;
+	int	h_val,h_size,h_inc,h_page;
+	Widget clip;
+	Widget parent;
+	Widget scroll_window;
+
+	Position x,y;
+
+
+	if(!XtIsManaged(w)) return;
+
+	if(!(parent          = XtParent(w)))      return;
+	if(!(clip   		 = XtParent(parent))) return;
+	if(!(scroll_window   = XtParent(clip)))   return;
+
+	if(!XmIsScrolledWindow(scroll_window)) return;
+
+	XtVaGetValues(scroll_window,
+		XmNhorizontalScrollBar, &h_scroll,
+		XmNverticalScrollBar, &v_scroll ,
+		NULL);
+
+
+	XtVaGetValues(parent,
+		XmNx,&x_parent,
+		XmNy,&y_parent,
+		NULL);
+
+
+	XtVaGetValues(w,
+		XmNheight,&h_widget,
+		XmNwidth,&w_widget,
+		NULL);
+
+
+	XtVaGetValues(scroll_window,
+		XmNclipWindow,&clip,
+		NULL);
+
+	XtVaGetValues(clip,
+		XmNheight,&h_clip,
+		XmNwidth,&w_clip,
+		NULL);
+
+
+	XtTranslateCoords(w,0,0,	&x_widget,&y_widget);
+	XtTranslateCoords(clip,0,0,&x_clip,&y_clip);
+
+
+	x = x_widget - x_clip;
+	y = y_widget - y_clip;
+
+
+	if( y < 0 || (Dimension) (y + h_widget) > h_clip)
+	{
+		dv = (y + h_widget / 2)  - h_clip / 2;
+
+		XtVaGetValues(v_scroll,
+			XmNminimum,&min,
+			XmNmaximum,&max,
+			NULL);
+
+		XmScrollBarGetValues(v_scroll,&v_val,&v_size,&v_inc,&v_page);
+
+		max -= v_size;
+
+		if( dv + v_val > max ) dv = max - v_val;
+		if( dv + v_val < min ) dv = min - v_val;
+
+
+	}
+
+	if( x < 0 || (Dimension) (x + w_widget) > w_clip)
+	{
+		dh = (x + w_widget / 2)  - w_clip / 2;
+
+		XtVaGetValues(h_scroll,
+			XmNminimum,&min,
+			XmNmaximum,&max,
+			NULL);
+
+		XmScrollBarGetValues(h_scroll,&h_val,&h_size,&h_inc,&h_page);
+
+		max -= h_size;
+
+		if( dh + h_val > max ) dh = max - h_val;
+		if( dh + h_val < min ) dh = min - h_val;
+
+	}
+
+
+	if(dv || dh)
+	{
+		Position x = x_parent-dh;
+		Position y = y_parent-dv;
+
+		XtVaSetValues(parent,
+			XmNx,x,
+			XmNy,y,
+			NULL);
+
+		/*
+		XtMoveWidget(parent,x_parent-dh,y_parent-dv);
+		*/
+
+		if(dv) XmScrollBarSetValues(v_scroll,v_val+dv,v_size,v_inc,v_page,TRUE);
+		if(dh) XmScrollBarSetValues(h_scroll,h_val+dh,h_size,h_inc,h_page,TRUE);
+
+
+		/* force redraw */
+		/*
+
+		XtUnmanageChild(parent);
+		XtManageChild(parent);
+		*/
+	}
+
+
+}
+
+#endif
+void xec_Invert(Widget w)
+{
+	Pixel fg,bg;
+	XtVaGetValues(w,XmNbackground,&bg,XmNforeground,&fg,NULL);
+	XtVaSetValues(w,XmNbackground,fg,XmNforeground,bg,NULL);
+}
+
+void xec_ManageAll(Widget w)
+{
+	CompositeWidget c = (CompositeWidget)w;
+	XtManageChildren(c->composite.children,
+	    c->composite.num_children);
+}
+
+void xec_UnmanageAll(Widget w)
+{
+	CompositeWidget c = (CompositeWidget)w;
+	XtUnmanageChildren(c->composite.children,
+	    c->composite.num_children);
+}
+
diff --git a/ecflow_4_0_7/view/src/limit_node.cc b/ecflow_4_0_7/view/src/limit_node.cc
new file mode 100644
index 0000000..3de1d57
--- /dev/null
+++ b/ecflow_4_0_7/view/src/limit_node.cc
@@ -0,0 +1,459 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "node.h"
+#include "show.h"
+#include "pixmap.h"
+#include <math.h>
+// #include "text_lister.h"
+#include "node_lister.h"
+#include "limit_node.h"
+#include <Xm/ManagerP.h>
+#include "ecf_node.h"
+
+#ifndef M_PI_2
+#define M_PI_2 1.57079632679489661923
+#endif
+
+static Pixmap images[3] = {XmUNSPECIFIED_PIXMAP, };
+
+Limit* limit_node::get() const {
+#ifdef BRIDGE
+  if (tree_) return 0x0;
+#endif
+  if (!owner_) return 0x0;
+  return dynamic_cast<ecf_concrete_node<Limit>*>(owner_)->get();
+  /*  ecf_concrete_node<const Limit>* base = 
+    dynamic_cast<ecf_concrete_node<const Limit>*> (owner_);
+  if (base) return *(base->get());
+  if (parent() && parent()->__node__())
+      return parent()->__node__()->get_limit(name_);
+      return 0x0; */
+}
+
+xmstring limit_node::make_label_tree()
+{
+  if (get()) {
+    char buf[30];
+    xmstring s(owner_->name().c_str(),"bold"); 
+    sprintf(buf,"%d/%d", get()->value(), get()->theLimit());
+    s += xmstring(": ","bold");
+    s += xmstring(buf);
+    return s; 
+  } 
+#ifdef BRIDGE
+  else if (!tree_) return xmstring ("nolimit");
+  sms_limit* n = (sms_limit*) tree_;
+  xmstring s(n->name,"bold");
+  s += xmstring(": ","bold");
+
+  char buf[80];
+
+  if(n->base)
+    sprintf(buf,"%d - %d - %d",n->base,n->status,n->limit);
+  else
+    sprintf(buf,"%d/%d",n->status,n->limit);
+
+  s += xmstring(buf);
+  
+  if(n->unit)
+    {
+      sprintf(buf," (%s)",n->unit);
+      s += xmstring(buf);
+    }
+  
+  return s;
+#endif
+  return xmstring(": ","bold");
+}
+
+const int kPixSize = 8;
+const int kHMargins = 4;
+const int kVMargins = 2;
+
+inline int max(int a,int b) { return a>b?a:b; }
+
+void limit_node::drawNode(Widget w,XRectangle* r,bool tree)
+{
+  int m = 0, v = 0; 
+  if (get()) { 
+    m = get()->theLimit();
+    v = get()->value();
+  }
+
+  XmString s = labelTree();
+  XRectangle x = *r;
+  x.width      = XmStringWidth(smallfont(),s)  + 2*kHMargins;
+
+  XmStringDraw(XtDisplay(w),XtWindow(w),
+	    smallfont(),
+	    s,
+	    blackGC(),    
+	    r->x, 
+	    r->y,
+	    x.width,
+	    XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, NULL);
+
+  for(int i = 0; i < max(m, v); i++)
+    XCopyArea(XtDisplay(w),
+	      images[(i<v)?(i>=m?2:1):0],XtWindow(w),
+	      blackGC(),
+	      0,0,kPixSize,kPixSize,
+	      r->x + x.width + (i*kPixSize),
+	      r->y + (r->height - kPixSize) / 2);
+
+  sizeNode( w, r, tree);
+}
+
+
+void limit_node::sizeNode(Widget w,XRectangle* r,bool tree)
+{
+  int m = maximum(), v = value();
+  if(images[0] == XmUNSPECIFIED_PIXMAP) {
+    images[0] = pixmap::find("limit0").pixels();
+    images[1] = pixmap::find("limit1").pixels();
+    images[2] = pixmap::find("limit2").pixels();
+  }
+  
+  XmString s = labelTree();
+  r->height = XmStringHeight(smallfont(),s);
+  r->width  = XmStringWidth(smallfont(),s) + 2*kHMargins + max(m,v) * kPixSize;
+  if(r->height < kPixSize) r->height = kPixSize;
+}
+
+void limit_node::perlify(FILE* f)
+{
+  perl_member(f,"value",value());
+  perl_member(f,"maximum",maximum());
+  // FILL perl_member(f,"tasks",n->tasks);  
+}
+
+void limit_node::info(std::ostream& f)
+{
+  Limit* n= get(); if (n) {
+    const std::set<std::string>& list = n->paths();
+    std::set<std::string>::const_iterator it;
+    node::info(f);
+  
+    f << "value    : " << value() << "\n";
+    f << "maximum  : " << maximum()  << "\n";
+    //    1234567890
+  
+    if(!list.empty())
+      f << "\nNodes in this limit_node:" << "\n-------------------------\n";
+    
+    for (it = list.begin(); it != list.end(); ++it) {    
+      f << *it;
+      node* p = find(*it); 
+      if(p) 
+	f << "   " << p->type_name() << ' ' 
+	  << " (" << p->status_name() << ")\n";
+    }
+  } 
+#ifdef BRIDGE
+else if (tree_) {
+    sms_limit *n = (sms_limit*)tree_; if (!n) return;
+	sms_list*  l = n->tasks;
+
+	node::info(f);
+
+	f << "value    : " << n->status << "\n";
+	f << "maximum  : " << n->limit  << "\n";
+	//    1234567890
+
+	if(l)
+		f << "\nNodes in this limit_node:" 
+		  << "\n--------------------\n";
+	while(l)
+	{
+	  node* p = find(l->name);
+		if(p) 
+		  f << p->type_name() << ' ' << p << " (" 
+		    << p->status_name() << ')';
+		else
+		  f << l->name;
+		f << "\n";
+		l = l->next;
+	}
+  }
+#endif
+}
+
+const char* limit_node::status_name() const
+{
+  static char buf[20];
+  if(value() >= maximum()) return "full";
+  if(value() <= 0 )        return "empty";
+  sprintf(buf,"%d%%",int((value()*100.0/maximum())+0.5));
+  return buf; 
+}
+
+bool limit_node::evaluate() const
+{
+  return (value() >= maximum());  
+}
+
+int limit_node::maximum() const
+{
+  Limit* n= get();
+  if (n) return n->theLimit();
+#ifdef BRIDGE
+  if (tree_) return ((sms_limit*) tree_)->limit;
+#endif
+  return 0;
+}
+
+int limit_node::value() const
+{
+  if (get()) return get()->value();
+#ifdef BRIDGE
+  if (tree_) return ((sms_limit*) tree_)->status;
+#endif
+  return 0;
+}
+
+void limit_node::nodes(node_lister& node_list)
+{
+  Limit* n= get(); 
+  if (n) {
+    const std::set<std::string>& list = n->paths();
+    std::set<std::string>::const_iterator it;
+    for (it = list.begin(); it != list.end(); ++it) {
+      node* p = find(*it);
+      if(p) node_list.next(*p);
+      else  node_list.next(*it);
+    }    
+    return;
+  } else {
+#ifdef BRIDGE
+    sms_limit *n = (sms_limit*)tree_; if (!n) return;
+    sms_list*  l = n->tasks;
+
+    while(l) {
+      node* p = find(l->name);
+      if(p) node_list.next(*p);
+      l = l->next;
+    }
+#endif
+  }
+}
+
+bool limit_node::match(const char* p)
+{
+  return p == parent()->full_name() + ":" + name();
+}
+
+//===============================================================
+
+const double kLength   = 30;
+const double kMark     = 5;
+const double kVuHeight = 2 + (kLength + kMark); 
+const double kVuWidth  = (kLength + kMark)*2.0;
+
+
+
+void limit_integer_node::sizeNode(Widget w,XRectangle* r,bool)
+{
+#if 1
+	XmString s = labelTree();
+	r->width   = XmStringWidth(smallfont(),s) +  2 * kHMargins ;
+	r->height  = XmStringHeight(smallfont(),s) + 2 * kVMargins + kVuHeight;
+
+	if(r->width < kVuWidth) r->width  = kVuWidth;
+#else
+	r->width   = kVuWidth;
+	r->height  = 2 * kVMargins  + kVuHeight;
+#endif
+}
+
+void limit_integer_node::drawNode(Widget w,XRectangle* r,bool)
+{
+	XRectangle y = *r;
+	y.width  = kVuWidth;
+	y.height = kVuHeight;
+	y.y += kVMargins;
+	drawMeter(w,&y);
+
+	char buffer[1024];
+	if (get()) sprintf(buffer,"%s",get()->name().c_str());
+#ifdef BRIDGE
+	else if (tree_) sprintf(buffer,"%s",((sms_limit*)tree_)->name);
+#endif
+	xmstring s(buffer);
+	XmFontList f = gui::tinyfont();
+
+	XmStringDraw(XtDisplay(w),XtWindow(w),
+	    f,
+	    s,
+	    blackGC(),    
+	    r->x, 
+	    r->y + (r->height - XmStringHeight(f,s)) / 2 ,
+	    r->width,
+	    XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, r);	
+#if 0
+	y   = *r;
+	y.y += kVuHeight + kVMargins;
+
+	XmString s = labelTree();
+	XmStringDraw(XtDisplay(w),XtWindow(w),
+	    smallfont(),
+	    s,
+	    blackGC(),    
+	    y.x, 
+	    y.y,
+	    y.width,
+	    XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, NULL);
+
+	/* shadow(w,r); */
+#endif
+  node::update(-1,-1,-1);notify_observers();
+}
+
+void limit_integer_node::drawMeter(Widget w,XRectangle* r)
+{
+#if 0
+	int xcenter = 80;
+	int ycenter = 55;
+	int lastxs  = xcenter;
+	int lastys  = ycenter;
+
+	double min_ = 0;
+	double max_ = 5000;
+	double v_   = 15;
+
+	int length = 30;
+	int mark  = 5;
+
+	int ticks = 5;
+#endif
+	const double round  = 20;
+
+	const double angle = 120;
+	const double pi2   = M_PI_2;
+	const double twopi = M_PI * 2.0;
+	const int ticks = 5;
+
+	const double a = angle / 360.0 * twopi;
+
+	double maxval = maximum(); // n->limit;
+	double minval = 0.0;       // n->min;
+	double curval = value();   // n->status;
+
+	double	xcenter = r->width / 2.0;
+	double	ycenter = r->height;
+
+	double d = (maxval - minval);
+	double c = (curval - minval)/d*a - a/2.0;
+
+	if(c > pi2) c = pi2;
+
+	int xs = cos(c  - pi2) * kLength + xcenter;
+	int ys = sin(c  - pi2) * kLength + ycenter;
+
+	GC gc = (curval > maxval) ? redGC() : blueGC();
+
+	XSetLineAttributes(XtDisplay(w),gc, 2,0,0,0);
+
+	XDrawLine(XtDisplay(w),XtWindow(w),
+		gc,
+		r->x + xcenter, r->y + ycenter-1, r->x + xs, r->y + ys);
+
+	XSetLineAttributes(XtDisplay(w),gc, 1,0,0,0);
+	/*
+	// --- base
+	if(n->base) {
+
+		double c1 =  - a/2.0;
+		double c2 =  (n->base - minval)/d*a - a/2.0;
+
+		c1 = twopi - c1 + pi2;
+		c2 = twopi - c2 + pi2;
+		// c1 -= pi2; 
+		// c2 -= pi2; 
+
+		double size = kLength+kMark + 2;
+
+		XFillArc(XtDisplay(w),XtWindow(w),
+			XmParentBottomShadowGC(w),
+			r->x + xcenter - size,
+			r->y + ycenter - size,
+			size * 2,
+			size * 2,
+
+			(c1 / twopi * 360) * 64,
+			(c2 / twopi * 360) * 64   - (c1 / twopi * 360) * 64);
+	}
+	*/
+#if 0
+		g.setColor(Color.gray);
+		g.fillArc(xcenter-round/2,ycenter-round/2,round,round,0,180);
+#endif
+
+	for(int i = 0 ; i < ticks ; i++)
+	{
+		double v = i*d/(ticks-1);
+		c = v/d*a - a/2;
+		int x1 = cos(c  - pi2) * kLength + xcenter;
+		int y1 = sin(c  - pi2) * kLength + ycenter;
+	
+		int x2 = cos(c  - pi2) * (kLength+kMark) + xcenter;
+		int y2 = sin(c  - pi2) * (kLength+kMark) + ycenter;
+
+		XDrawLine(XtDisplay(w),XtWindow(w),
+			blackGC(),r->x + x1,r->y + y1, r->x + x2, r->y + y2);
+	}
+
+	XFillArc(XtDisplay(w),XtWindow(w),
+		XmParentBackgroundGC(w),
+		r->x + xcenter-round/2,
+		r->y + ycenter-round/2,
+		round,
+		round,0,180*64);
+	
+	const	int drop_shadow  = 10;
+	XDrawArc(XtDisplay(w),XtWindow(w),XmParentBottomShadowGC(w),
+		r->x + xcenter-round/2,
+		r->y + ycenter-round/2,round,round,64,(90-drop_shadow) * 64);
+
+	XDrawArc(XtDisplay(w),XtWindow(w),XmParentTopShadowGC(w),
+		r->x + xcenter-round/2,
+		r->y + ycenter-round/2,round,round, (90+drop_shadow)*64,180*64 - (90+drop_shadow)*64);
+
+
+	char buf[80];
+	sprintf(buf,"%d",value());
+
+	xmstring t(buf);
+	XmFontList f = gui::tinyfont();
+
+	XmStringDraw(XtDisplay(w),XtWindow(w),
+		f,
+		t,
+		(curval > maxval) ? redGC() : blueGC(),
+		r->x + xcenter-round/2 + 2,
+		r->y + ycenter-round/2 + 3,
+		round,
+	    XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, NULL);
+
+	shadow(w,r,false);
+}
+
+//===============================================================
+
+
+//===============================================================
+
+Boolean limit_node::visible() const { return show::want(show::limit); }
+
diff --git a/ecflow_4_0_7/view/src/limit_node.h b/ecflow_4_0_7/view/src/limit_node.h
new file mode 100644
index 0000000..5f2445d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/limit_node.h
@@ -0,0 +1,74 @@
+#ifndef limit_node_H
+#define limit_node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node.h"
+class Limit;
+
+class limit_node : public node {
+public:
+
+ limit_node(host& h,ecf_node* n) : node(h,n) {}
+#ifdef BRIDGE
+ limit_node(host& h,sms_node* n,char b) : node(h,n,b) {}
+#endif
+  int maximum() const;
+  int value() const;
+  void nodes(node_lister&);
+ protected:
+  Limit* get() const;
+
+private:
+
+	limit_node(const limit_node&);
+	limit_node& operator=(const limit_node&);
+
+	virtual bool evaluate() const;
+	virtual void drawNode(Widget w,XRectangle* r,bool);
+	virtual void sizeNode(Widget w,XRectangle* r,bool);
+	virtual xmstring make_label_tree();
+
+	virtual void info(std::ostream&);
+	virtual const char* status_name() const;
+	virtual Boolean visible()  const;
+	virtual bool match(const char*);
+
+	virtual void perlify(FILE*);
+};
+
+class limit_integer_node : public limit_node {
+	void sizeNode(Widget w,XRectangle* r,bool);
+	void drawNode(Widget w,XRectangle* r,bool);
+	void drawMeter(Widget w,XRectangle* r);
+public:
+  limit_integer_node(host& h,ecf_node* n): limit_node(h,n) {}
+#ifdef BRIDGE
+ limit_integer_node(host& h,sms_node* n,char b) : limit_node(h,n,b) {}
+#endif
+};
+
+class limit_boolean_node : public limit_node {
+public:
+  limit_boolean_node(host& h,ecf_node* n): limit_node(h,n) {}
+#ifdef BRIDGE
+  limit_boolean_node(host& h,sms_node* n,char b) : limit_node(h,n,b) {}
+#endif    
+};
+
+inline void destroy(limit_node**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/line.c b/ecflow_4_0_7/view/src/line.c
new file mode 100644
index 0000000..1afd42e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/line.c
@@ -0,0 +1,42 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <stdio.h>
+
+main(int argc,char **argv)
+{
+	FILE* f = argc>2 ? fopen(argv[2],"r"):stdin;
+	int l = atol(argv[1]);
+	int n = 0;
+
+	char line[1024];
+
+	if(!f)
+	{
+		perror(argv[2]);
+		exit(1);
+	}
+
+	while(fgets(line,sizeof(line),f))
+		if(++n == l)
+		{ 
+			printf("%s\n",line);
+			exit(0);
+		}
+
+
+	exit(1);
+
+}
diff --git a/ecflow_4_0_7/view/src/lister.cc b/ecflow_4_0_7/view/src/lister.cc
new file mode 100644
index 0000000..dd32505
--- /dev/null
+++ b/ecflow_4_0_7/view/src/lister.cc
@@ -0,0 +1,65 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+/* 
+#ifndef lister_H
+#include "lister.h"
+#endif
+*/
+
+template<class T>
+T* lister<T>::scan(T* first)
+{
+	if(sort())
+	{
+		int swap = 1;
+
+		while(swap)
+		{
+			T *d = first;
+			T *p = 0;
+			T *n = d?d->next:0;
+			swap = 0;
+
+			while(d && n)
+			{
+				if(compare(*n,*d))
+				{
+					T* q = n->next;
+				
+					n->next = d;
+					d->next = q;
+
+					if(p) p->next = n;
+					else  first   = n;
+
+					swap++;
+					break;
+				}
+					
+				p = d;
+				d = n;
+				n = n->next;
+			}
+		}
+	}
+	T *d = first;
+	while(d)
+	{
+		next(*d);
+		d = d->next;
+	}
+	return first;
+}
diff --git a/ecflow_4_0_7/view/src/lister.h b/ecflow_4_0_7/view/src/lister.h
new file mode 100644
index 0000000..8454931
--- /dev/null
+++ b/ecflow_4_0_7/view/src/lister.h
@@ -0,0 +1,42 @@
+#ifndef lister_H
+#define lister_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+template<class T>
+class lister {
+public:
+	virtual void next(T&)  = 0;
+	virtual bool sort()              { return false; }
+	virtual bool compare(T& a,T& b);
+	virtual T* scan(T*);
+};
+
+template<class T>
+bool lister<T>::compare(T& a,T& b)  
+{ return strcmp(a.name().c_str(),b.name().c_str()) < 0; }
+
+#if defined(__GNUC__) || defined(hpux) || defined(_AIX)
+#include "lister.cc"
+#endif
+
+/* 
+#ifdef AIX
+#pragma implementation("lister.cc") 
+#endif
+*/
+
+#endif
diff --git a/ecflow_4_0_7/view/src/log_event.cc b/ecflow_4_0_7/view/src/log_event.cc
new file mode 100644
index 0000000..41a88be
--- /dev/null
+++ b/ecflow_4_0_7/view/src/log_event.cc
@@ -0,0 +1,355 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #10 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdlib.h>
+#include "log_event.h"
+#include "ecflowview.h"
+#include "gui.h"
+#include "host.h"
+#include "node.h"
+#include "parser.h"
+#include "array.h"
+#include "ecf_node.h"
+
+const int boxSize = 3;
+
+namespace status {
+const char *status_name[10]= { 
+  (char*)"unknown", (char*)"suspended", (char*)"complete", (char*)"queued",
+  (char*)"submitted", (char*)"active", (char*)"aborted", (char*)"shutdown",  
+  (char*)"halted"  ,  NULL };
+}
+
+static event_sorter* sorter = 0;
+
+class log_cache : public array<log_event*> {
+public:
+	void reset();
+	void sort();
+	~log_cache() { reset(); }
+};
+
+static log_cache  cache;
+static str        cached;
+
+void log_cache::reset()
+{
+	int c = count();
+	for(int i = 0; i < c ; i++)
+		(*this)[i]->detach();
+	clear();
+}
+
+static int compare(const void* a,const void* b)
+{
+	log_event** ea = (log_event**)a;
+	log_event** eb = (log_event**)b;
+	return sorter->compare(*ea,*eb);
+}
+
+void log_cache::sort()
+{
+	qsort(values_,count_,sizeof(log_event*),compare);
+}
+
+static node* gn = 0;
+
+log_event::log_event(node* n,const DateTime& time):
+	time_(time),
+	node_(n)
+{
+	attach();
+	cache.add(this);
+	observe(n);
+}
+
+log_event::~log_event()
+{
+}
+
+
+void log_event::load(host& h,const char* name,bool reset)
+{
+  if(reset)
+    {
+      cache.reset();
+      cached = str();
+    }
+  
+  if(str(name) != cached)
+    {
+      gn = h.top();
+      std::string varlog = gn->variable("ECF_LOG");
+      std::string varhom = gn->variable("ECF_HOME");
+      std::string varnod = gn->variable("ECF_NODE");   
+
+      if (gn->variable("ECF_PORT") == ecf_node::none()) {
+	varlog = gn->variable("SMSLOG");
+	varhom = gn->variable("SMSHOME");
+	varnod = gn->variable("SMSNODE");
+      }
+      char* vartmp = getenv("TMPDIR");
+      
+      char buf[1024];
+      const char* p = name;
+      
+      while(*p)
+	{
+	  int i = 0;
+	  while(*p && *p != ' ')
+	    buf[i++] = *p++;
+	  buf[i] = 0;
+	  
+	  if(i) {
+	    struct stat st;
+	    if (stat(buf, &st) == (-1)) {
+	      if (vartmp) { 
+		char cmd[1024];
+
+		sprintf(cmd,"%s/%s",vartmp,varlog.c_str());
+		if (stat(cmd, &st) == (-1)) {
+		  sprintf(cmd,"rcp %s:%s/%s %s/.", varnod.c_str(), varhom.c_str(), varlog.c_str(), 
+			  getenv((char*)"TMPDIR"));
+		  printf("%s\n", cmd);
+		  system(cmd);
+		  
+		  ::sleep(1);
+		  sprintf(cmd,"%s/%s",vartmp,varlog.c_str());
+		  { if (stat(cmd, &st) == (-1)) {
+		      sprintf(cmd,"scp %s:%s/%s %s/.", varnod.c_str(), varhom.c_str(), varlog.c_str(), 
+			      getenv((char*)"TMPDIR"));
+		      printf("%s\n", cmd);
+		      system(cmd);
+		    }
+		    sprintf(cmd,"%s/%s",vartmp,varlog.c_str());
+		    ::sleep(1);
+		  }
+
+		  if (stat(cmd, &st) != (-1)) parser::parse(cmd);
+		} else {
+		  parser::parse(cmd);
+		};
+	      }
+	    } else {
+	      parser::parse(buf);
+	    }
+	  }
+	  if(*p) p++;
+	}
+      
+      gn = 0;
+      cached = name;
+	}  
+}
+
+void log_event::sort(event_sorter& l)
+{
+	sorter = &l;
+	cache.sort();
+	sorter = 0;
+}
+
+void log_event::scan(node* n,event_lister& l)
+{
+	int c = cache.count();
+	for(int i = 0; i < c ; i++)
+		if(cache[i]->node_ != 0)
+			if(cache[i]->node_->is_my_parent(n))
+				l.next(cache[i]);
+}
+
+const node* log_event::find(const char* name)
+{
+	return gn?gn->find(name):0;
+}
+
+
+void log_event::size(Widget,XRectangle* r)
+{
+	r->width = r->height = 2*boxSize;
+}
+
+void log_event::draw(Widget w,XRectangle* r)
+{
+	GC gc  = gui::blackGC();
+	XFillRectangles(XtDisplay(w), XtWindow(w), gc, r, 1); // was comment
+	XDrawLine(XtDisplay(w), XtWindow(w), gc,
+		r->x,
+		r->y,
+		r->x + r->width,
+		r->y + r->height);
+
+	XDrawLine(XtDisplay(w), XtWindow(w), gc,
+		r->x,
+		r->y + r->height,
+		r->x + r->width,
+		r->y);
+}
+
+class status_event : public log_event {
+	int status_;
+	virtual void draw(Widget,XRectangle*);
+
+	virtual bool start();
+	virtual bool end();
+	virtual char* text(char*);
+
+	virtual int status() { return status_; }
+
+public:
+	status_event(node* n,const DateTime& time,int status):
+		log_event(n,time), status_(status) {}
+};
+
+char* status_event::text(char* buf)
+{
+	sprintf(buf,"%s %s is %s",node_->type_name(),node_->full_name().c_str(),
+		status::status_name[status_]);
+	return buf;
+}
+
+class event_event : public log_event {
+	bool set_;
+	virtual node* owner() { return node_->parent(); }
+	virtual void draw(Widget,XRectangle*);
+	virtual char* text(char*);
+public:
+	event_event(node* n,const DateTime& time,bool s): log_event(n,time), set_(s) {}
+};
+
+char* event_event::text(char* buf)
+{
+	sprintf(buf,"event %s is %s",
+		node_->full_name().c_str(),
+		set_?"set":"cleared");
+	return buf;
+}
+
+//===========================================
+void event_event::draw(Widget w,XRectangle* r)
+{
+	if(set_)
+		XFillRectangles(XtDisplay(w),XtWindow(w),
+			gui::blueGC(),r,1);
+	else
+		XDrawRectangles(XtDisplay(w),XtWindow(w),
+			gui::blueGC(),r,1);
+}
+
+//===========================================
+class meter_event : public log_event {
+	int step_;
+	virtual node* owner() { return node_->parent(); }
+	virtual void draw(Widget,XRectangle*); 
+	virtual char* text(char*);
+public:
+	meter_event(node* n,const DateTime& time,int s): log_event(n,time), step_(s) {}
+};
+
+char* meter_event::text(char* buf)
+{
+  sprintf(buf,"meter %s reaches %d",node_->full_name().c_str(),step_);
+  return buf;
+}
+
+void meter_event::draw(Widget w,XRectangle* r)
+{
+	XDrawArc(XtDisplay(w),
+			XtWindow(w),
+			gui::blackGC(),
+			r->x,
+			r->y,
+			r->height,
+			r->height,
+			0,360*64);	
+#if 0
+	char buf[80];
+	sprintf(buf,"%d",step_);
+	xmstring s(buf);
+    XmStringDraw(XtDisplay(w),XtWindow(w),
+        gui::tinyfont(),
+        s,
+        gui::blackGC(),
+        r->x,
+        r->y,
+        r->width,
+        XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, r);
+#endif
+}
+
+bool status_event::start() 
+{ 
+	return status_ == STATUS_SUBMITTED; 
+}
+
+bool status_event::end()   
+{ 
+	return status_ == STATUS_COMPLETE; 
+}
+
+//=========================================================
+
+void status_event::draw(Widget w,XRectangle* r)
+{
+	GC gc        = gui::colorGC(status_);
+#if 1
+	XFillArc(XtDisplay(w),
+			XtWindow(w),
+			gc,
+			r->x,
+			r->y,
+			r->height,
+			r->height,
+			0,360*64);	
+#else
+	XDrawLine(XtDisplay(w), XtWindow(w), gc,
+		r->x,
+		r->y,
+		r->x + r->width,
+		r->y + r->height);
+
+	XDrawLine(XtDisplay(w), XtWindow(w), gc,
+		r->x,
+		r->y + r->height,
+		r->x + r->width,
+		r->y);
+#endif
+}
+
+void log_event::status_event(const DateTime& t,node* n,int s)
+{
+  if (0) {
+    if (n)
+      std::cout << "# event: " << t.date << " " << t.time << " " << n->full_name() << " " << status::status_name[s] << "\n";
+    else 
+      std::cout << "# event: " << t.date << " " << t.time << " no path " << status::status_name[s] << "\n";
+  }
+  if(n)	new ::status_event(n,t,s);
+}
+
+void log_event::event_event(const DateTime& t,node* n,bool set)
+{
+  if(n) new ::event_event(n,t,set);
+}
+
+void log_event::meter_event(const DateTime& t,node* n,int s)
+{
+  if(n) new ::meter_event(n,t,s);
+}
+
+void log_event::gone(observable*)
+{
+  node_ = 0;
+}
diff --git a/ecflow_4_0_7/view/src/log_event.h b/ecflow_4_0_7/view/src/log_event.h
new file mode 100644
index 0000000..6f8f53a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/log_event.h
@@ -0,0 +1,132 @@
+#ifndef log_event_H
+#define log_event_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#ifndef counted_H
+#include "counted.h"
+#endif
+
+#ifndef observer_H
+#include "observer.h"
+#endif
+
+#include <Xm/Xm.h>
+#include "SimpleTime.h"
+
+class node;
+class host;
+class log_event;
+class str;
+
+class event_lister {
+public:
+	virtual void next(log_event*) = 0;
+};
+
+class event_sorter {
+public:
+	virtual int compare(log_event*,log_event*) = 0;
+};
+
+inline
+bool operator<(const DateTime& d1,const DateTime& d2)
+{
+	return d1.date < d2.date || (d1.date == d2.date && d1.time < d2.time);
+}
+
+inline
+bool operator>(const DateTime& d1,const DateTime& d2)
+{
+	return d2 < d1;
+}
+
+inline
+bool operator<=(const DateTime& d1,const DateTime& d2)
+{
+	return d1.date <= d2.date || (d1.date == d2.date && d1.time <= d2.time);
+}
+
+
+inline
+bool operator==(const DateTime& d1,const DateTime& d2)
+{
+	return (d1.date == d2.date) && (d1.time == d2.time);
+}
+
+inline
+bool operator!=(const DateTime& d1,const DateTime& d2)
+{
+	return !(d1==d2);
+}
+
+const DateTime kSmallDate = { 19000101, 0};
+const DateTime kLargeDate = { 21000101, 0};
+
+class log_event : public counted, public observer {
+public:
+
+	log_event(node*,const DateTime&);
+
+	const DateTime& time() const { return time_; }
+
+	virtual bool start() { return false; }
+	virtual bool end() { return false; }
+
+	virtual node* owner() { return node_; }
+	virtual node* get_node() { return node_; }
+
+	virtual int status() { return -1; }
+
+	virtual char* text(char*)  = 0;
+
+	virtual void draw(Widget,XRectangle*);
+	virtual void size(Widget,XRectangle*);
+
+	static void status_event(const DateTime&,node*,int);
+	static void event_event(const DateTime&,node*,bool);
+	static void meter_event(const DateTime&,node*,int);
+
+	static void load(host&,const char*,bool = false);
+	static void scan(node*,event_lister&);
+	static void sort(event_sorter&);
+	static const node* find(const char*);
+
+	static int compare(const log_event*,const log_event*);
+
+protected:
+
+	virtual ~log_event(); // Change to virtual if base class
+
+	DateTime   time_;
+	node*      node_;
+
+private:
+
+	log_event(const log_event&);
+	log_event& operator=(const log_event&);
+
+	void notification(observable*)              {                   }
+	void adoption(observable* o,observable* n)  { node_ = (node*)n; }
+	void gone(observable*);
+};
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/log_file.h b/ecflow_4_0_7/view/src/log_file.h
new file mode 100644
index 0000000..e689aec
--- /dev/null
+++ b/ecflow_4_0_7/view/src/log_file.h
@@ -0,0 +1,129 @@
+#ifndef log_file_H
+#define log_file_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef input_H
+#include "input.h"
+#endif
+
+#include "stl.h"
+
+
+class host;
+class log_event;
+
+class log_file : public input {
+public:
+
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	log_file(host&,const char*);
+
+// -- Destructor
+
+	~log_file(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	bool update();
+
+// -- Overridden methods
+
+	
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	log_file(const log_file&);
+	log_file& operator=(const log_file&);
+
+// -- Members
+	 
+	 string path_;
+	 bool   loading_;
+	 bool   ready_;
+	 time_t last_;
+	 host& owner_;
+
+// -- Methods
+
+	void cleanup();
+
+// -- Overridden methods
+
+	void ready(const char*);
+	void done(FILE*);
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const log_file& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(log_file**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(log_file);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/logsvr.cc b/ecflow_4_0_7/view/src/logsvr.cc
new file mode 100644
index 0000000..3991e94
--- /dev/null
+++ b/ecflow_4_0_7/view/src/logsvr.cc
@@ -0,0 +1,246 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef logsvr_H
+#include "logsvr.h"
+#endif
+
+#ifndef gui_H
+#include "gui.h"
+#endif
+
+#include "tmp_file.h"
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#ifdef AIX
+#include <memory.h>
+#endif
+
+#include "auto_alarm.h" 
+
+#define FAIL(a) do { perror(a); exit(1); } while(0)
+
+logsvr::logsvr(std::string host,std::string cport)
+  : soc_(-1)
+  , host_ (host)
+  , port_ (cport)
+{
+  struct hostent *ht = gethostbyname( host.c_str() );
+  if (ht == NULL) { soc_ = -1; return; }
+  connect(host,!cport.empty() ? atoi(cport.c_str()) : 19999);
+}
+
+static jmp_buf env;
+/* static void (*old_alarm)(int); */
+
+static void catch_alarm(int)
+{
+	printf("got alarm\n");
+	/* longjmp(env,1); */
+}
+
+void logsvr::connect(std::string host,int port)
+{
+	/* typedef unsigned long addr_type; */
+	typedef in_addr_t addr_type;
+	
+	/* addr_type none = (addr_type)-1; */
+	addr_type addr;
+
+	struct sockaddr_in s_in;
+	struct hostent *him;
+
+	soc_ = socket(AF_INET, SOCK_STREAM, 0);
+	if(soc_ < 0)
+	{
+		gui::syserr("Cannot create socket");	
+		return;
+	}
+
+	bzero(&s_in,sizeof(s_in));
+
+	s_in.sin_port = htons(port);
+	s_in.sin_family = AF_INET;
+	addr = inet_addr(host.c_str());
+	s_in.sin_addr.s_addr = addr;
+#ifdef SVR4
+	if(addr == (in_addr_t) 0xffffffff)
+#else
+	if(addr == INADDR_NONE)
+#endif
+	{
+	  if ((him=gethostbyname(host.c_str()))==NULL)
+		{
+		  gui::error("Unknown Host %s",host.c_str());
+			return;
+		}
+		s_in.sin_family = him->h_addrtype;
+		bcopy(him->h_addr_list[0],&s_in.sin_addr,him->h_length);
+	}
+
+	char* timeout = getenv ("ECFLOWVIEW_LOGTIMEOUT");
+	int time_out = timeout ? atoi(timeout) : 3;
+
+	struct sigaction sa = { { 0, },  };
+	struct sigaction old;
+	sa.sa_handler = catch_alarm;
+	sigemptyset(&sa.sa_mask);
+
+	if(sigaction(SIGALRM, &sa, &old))
+		perror("sigaction");
+
+	::alarm(time_out);
+	perror("alarm");
+
+	if(setjmp(env) == 0) 
+	{ 
+	  printf("connect %s\n",host.c_str());
+	    if(::connect(soc_,(struct sockaddr*)&s_in,sizeof(s_in)) < 0) 
+		{
+			perror("connect");
+			close(soc_);
+			soc_ = -1;
+		}
+	}
+	else 
+	{
+		printf("cleanup up\n");
+		close(soc_);
+		soc_ = -1;
+	}
+	::alarm(0);
+	sigaction(SIGALRM, &old, &sa);
+	
+}
+
+logsvr::~logsvr()
+{
+	close(soc_);
+}
+
+tmp_file logsvr::getfile(std::string name)
+{
+  tmp_file empty((char*)"",false);
+  if(soc_ < 0)
+    return empty;
+
+	write(soc_,"get ",4);	
+	write(soc_,name.c_str(),name.size());
+	write(soc_,"\n",1);	
+
+	const int size = 64*1204;
+	char buf[size];
+	unsigned int len = 0;
+	int total = 0;
+
+	tmp_file out(tmpnam(NULL));
+	FILE *f = fopen(out.c_str(),"w");
+
+	if(!f)
+	{
+	  char buf[2048];
+	  sprintf(buf,"Cannot create %s",out.c_str());
+	  gui::syserr(buf);
+	  return empty;
+	}
+	
+	while( (len = read(soc_,buf,size)) > 0)
+	{
+	  if(fwrite(buf,1,len,f) != len)
+	    {
+	      char buf[2048];
+	      sprintf(buf,"Write error on %s",out.c_str());
+	      gui::syserr(buf);
+	      fclose(f);
+	      return empty;
+	    }
+	  total += len;
+	}
+
+	sprintf(buf, "\n# served by %s@%s # telnet %s %s # get %s",
+		host_.c_str(), port_.c_str(), 
+		host_.c_str(), port_.c_str(), 
+		name.c_str());
+	fwrite(buf,1,size,f);
+
+	if(fclose(f))
+	{
+	  char buf[2048];
+	  sprintf(buf,"Write error on %s",out.c_str());
+	  gui::syserr(buf); 
+	  return empty;
+	}
+
+	if(total)
+		return out;
+
+	return empty;
+}
+
+ecf_dir *logsvr::getdir(const char* name)
+{
+	if(soc_ < 0)
+		return 0;
+
+	write(soc_,"list ",5);	
+	write(soc_,name,strlen(name));
+	write(soc_,"\n",1);	
+
+	FILE* f = fdopen(soc_,"r");
+
+	char buf[2048];
+
+	ecf_dir* dir = 0;
+
+	while(fgets(buf,sizeof(buf),f))
+	{
+		ecf_dir *s;
+		if( (s = new ecf_dir()))
+		{
+		  s->next = 0x0;
+			char name[2048];
+			sscanf(buf,"%d %d %d %d %d %d %d %s",
+			       & s->mode,
+			       & s->uid,
+			       & s->gid,
+			       & s->size,
+			       & s->atime,
+			       & s->mtime,
+			       & s->ctime,
+			       name);
+				
+			s->name_ = strdup(name);
+			// ecf_list_add(&dir,s);
+			if (dir) {
+			  s->next = dir->next;
+			  dir->next = s;
+			} else dir = s;
+		}
+	}
+
+	return dir;
+}
diff --git a/ecflow_4_0_7/view/src/logsvr.h b/ecflow_4_0_7/view/src/logsvr.h
new file mode 100644
index 0000000..4377618
--- /dev/null
+++ b/ecflow_4_0_7/view/src/logsvr.h
@@ -0,0 +1,54 @@
+#ifndef logsvr_H
+#define logsvr_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef ecflowview_H
+#include "ecflowview.h"
+#endif
+
+
+#ifndef tmp_file_H
+#include "tmp_file.h"
+#endif
+
+
+class logsvr {
+public:
+
+  logsvr(std::string host,std::string port);
+
+  ~logsvr(); // Change to virtual if base class
+  
+  tmp_file getfile(std::string name);
+  ecf_dir* getdir(const char* name);
+  bool     ok() const { return soc_ >= 0; }
+
+private:
+
+	logsvr(const logsvr&);
+	logsvr& operator=(const logsvr&);
+
+	int  soc_;
+
+	void connect(std::string,int);
+
+	std::string host_, port_;
+};
+
+inline void destroy(logsvr**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/mail.cc b/ecflow_4_0_7/view/src/mail.cc
new file mode 100644
index 0000000..cf05ab0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/mail.cc
@@ -0,0 +1,246 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "mail.h"
+#include "host.h"
+#include "runnable.h"
+#include <Xm/List.h>
+#include <Xm/Text.h>
+#include "gui.h"
+#include "extent.h"
+
+extern "C" {
+#include "xec.h"
+}
+
+
+class mail_user : public extent<mail_user> {
+	char *host_;
+	char *user_;
+	bool mark_;
+public:
+
+	mail_user(const char* h,const char* u):
+		host_(XtNewString(h)),
+		user_(XtNewString(u)),
+		mark_(true)
+	{
+	}
+
+	~mail_user()
+	{
+		XtFree(host_);
+		XtFree(user_);
+	}
+	
+	static void add(mail&,const char*,const char*);
+	static void remove(mail&,const char*);
+
+	static void mark();
+	static void sweep(mail&,const char*);
+};
+
+void mail_user::mark()
+{
+	mail_user *p = first();
+	while(p)
+	{
+		p->mark_ = false;
+		p = p->next();
+	}
+}
+
+void mail_user::add(mail& m,const char* h,const char* u)
+{
+	mail_user *p = first();
+	while(p)
+	{
+		if(strcmp(p->host_,h) == 0 && strcmp(p->user_,u) == 0)
+		{
+			p->mark_ = true;
+			return;
+		}
+		p = p->next();
+	}
+	new mail_user(h,u);
+	m.add(h,u);
+}
+
+void mail_user::remove(mail& m,const char* h)
+{
+	mail_user *p = first();
+	while(p)
+	{
+		mail_user* n = p->next();
+		if(strcmp(p->host_,h) == 0)
+		{
+			m.remove(p->host_,p->user_);
+			delete p;
+		}
+		p = n;
+	}
+}
+
+void mail_user::sweep(mail& m,const char* h)
+{
+	mail_user *p = first();
+	while(p)
+	{
+		mail_user* n = p->next();
+		if(strcmp(p->host_,h) == 0 && !p->mark_)
+		{
+			m.remove(p->host_,p->user_);
+			delete p;
+		}
+		p = n;
+	}
+}
+
+mail& mail::instance()
+{
+	static mail *m = new mail();
+	return *m;
+}
+
+mail::mail():
+	timeout(1)
+{
+	create(gui::top());
+}
+
+mail::~mail()
+{
+}
+
+void mail::run()
+{
+	//printf("mail::run\n");
+	host::check_all_mail();
+	drift(1,3600*24);
+}
+
+void mail::recieved(host* h,std::list< std::string >&l,bool show)
+{
+	instance().new_mail(h,l,show);
+}
+
+class show_mail : public runnable {
+	Widget widget_;
+	void run()  { XtManageChild(widget_); disable(); gui::raise(); }
+public:
+	show_mail() : widget_(0) {}
+	void show(Widget w) { widget_ = w; enable(); }
+};
+
+
+void mail::add(const char* buf)
+{
+	long len = XmTextGetLastPosition(text_);
+    XmTextSetInsertionPosition(text_,len);
+	XmTextReplace(text_,len,len,(char*)buf);
+	len += strlen(buf);
+	XmTextSetInsertionPosition(text_,len);
+	XmTextShowPosition(text_,len);
+}
+
+
+void mail::new_mail(host* h,std::list<std::string>& l,bool show)
+{
+	mail_user::mark();
+
+	static show_mail s;
+	observe(h);
+	if(show) {
+		s.show(form_);
+		enable();
+	}
+
+	mail_user::sweep(*this,h->name());
+}
+
+void mail::sendCB(Widget,XtPointer)
+{
+	int count;
+	XtVaGetValues(list_,XmNselectedItemCount,&count,NULL);
+	if(count == 0)
+	{
+		/* xec_ListSelectAll(list_); */
+		/* XtVaGetValues(list_,XmNselectedItemCount,&count,0); */
+		gui::error("No recipient selected");
+		return;
+	}
+
+	XmString *items;
+	XtVaGetValues(list_,XmNselectedItems,&items,NULL);
+
+	char* p = XmTextGetString(input_);
+	XmTextSetString(input_,"");	
+
+	for(int i = 0 ; i < count; i++)
+	{
+		char *u = xec_GetString(items[i]);
+		char *q = u;
+		while(*q && *q != '@') q++;
+		*q = 0;
+
+		(void)host::find(q+1);
+		XtFree(u);
+	}
+
+	add(p);
+	add("\n");
+
+	XtFree(p);
+	run();
+	frequency(1);
+}
+
+void mail::closeCB(Widget,XtPointer)  
+{
+	disable();
+	XtUnmanageChild(form_);
+}
+
+void mail::gone(observable* h)
+{
+	mail_user::remove(*this,((host*)h)->name());
+}
+
+void mail::add(const char* h,const char* u)
+{
+	char buf[1024];
+	sprintf(buf,"%s@%s",u,h);
+	xec_AddListItem(list_,buf);
+}
+
+void mail::remove(const char* h,const char* u)
+{
+	char buf[1024];
+	sprintf(buf,"%s@%s",u,h);
+	xec_RemoveListItem(list_,buf);
+}
+
+
+void mail::login(const char* n)
+{
+  // FILL recieved(host::find(n),0,false);	
+}
+
+void mail::logout(const char* n)
+{
+	instance().gone(host::find(n));
+}
+
+IMP(mail_user)
diff --git a/ecflow_4_0_7/view/src/mail.h b/ecflow_4_0_7/view/src/mail.h
new file mode 100644
index 0000000..45aef5d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/mail.h
@@ -0,0 +1,67 @@
+#ifndef mail_H
+#define mail_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include<list>
+#include "uimail.h"
+#include "observer.h"
+#include "timeout.h"
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#include <string>
+
+class host;
+
+class mail : public observer, public mail_shell_c, public timeout {
+public:
+
+	mail();
+
+	~mail(); // Change to virtual if base class
+
+	void add(const char*,const char*); 
+	void remove(const char*,const char*); 
+
+	static void recieved(host*,std::list< std::string >&,bool = true);
+	static void login(const char*);
+	static void logout(const char*);
+
+private:
+
+	mail(const mail&);
+	mail& operator=(const mail&);
+
+	void new_mail(host* h,std::list<std::string>& l,bool show);
+	  // void new_mail(host*,std::list< std::string >&,bool);
+	  void add(const char*);
+
+	virtual void run();
+	virtual void adoption(observable*,observable*) {}
+	virtual void notification(observable*) {}
+	virtual void gone(observable*);
+
+	static mail& instance();
+
+	void sendCB(Widget,XtPointer);
+	void closeCB(Widget,XtPointer);
+};
+
+inline void destroy(mail**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/manual.cc b/ecflow_4_0_7/view/src/manual.cc
new file mode 100644
index 0000000..12e5b6c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/manual.cc
@@ -0,0 +1,53 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "manual.h"
+#include "host.h"
+#include "node.h"
+#include <Xm/Text.h>
+
+extern "C" {
+#include "xec.h"
+}
+
+manual::manual(panel_window& w):
+	panel(w),
+	text_window(false)
+{
+}
+
+manual::~manual()
+{
+}
+
+void manual::clear()
+{
+	text_window::clear();
+}
+
+void manual::show(node& n)
+{
+	load(n.serv().manual(n));
+}
+
+Boolean manual::enabled(node& n)
+{
+	return n.hasManual();
+}
+
+void manual::create (Widget parent, char *widget_name )
+{
+	manual_form_c::create(parent,widget_name);
+}
diff --git a/ecflow_4_0_7/view/src/manual.h b/ecflow_4_0_7/view/src/manual.h
new file mode 100644
index 0000000..a920f2b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/manual.h
@@ -0,0 +1,66 @@
+#ifndef manual_H
+#define manual_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uimanual.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef text_window_H
+#include "text_window.h"
+#endif
+
+class manual : public panel, public manual_form_c, public text_window {
+public:
+
+	manual(panel_window&);
+
+	~manual(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Manual"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return manual_form_c::xd_rootwidget(); }
+
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()   { return text_; }
+	virtual void create (Widget parent, char *widget_name = 0 );
+
+private:
+
+	manual(const manual&);
+	manual& operator=(const manual&);
+
+	virtual void externalCB(Widget ,XtPointer ) 
+		{ text_window::open_viewer();}
+
+	virtual void searchCB(Widget ,XtPointer ) 
+		{ text_window::open_search();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+
+};
+
+inline void destroy(manual**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/menu2c.sh b/ecflow_4_0_7/view/src/menu2c.sh
new file mode 100644
index 0000000..5276576
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menu2c.sh
@@ -0,0 +1,16 @@
+#!/bin/ksh
+
+## Copyright 2009-2012 ECMWF. 
+## This software is licensed under the terms of the Apache Licence version 2.0 
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+## In applying this licence, ECMWF does not waive the privileges and immunities 
+## granted to it by virtue of its status as an intergovernmental organisation 
+## nor does it submit to any jurisdiction. 
+
+
+# cat ecflowview.menu | menu2c.sh  > ecflowview.menu.h
+while read -r line ; do
+    l=$(echo $line | sed -e 's:":\\":gi')
+  echo "(char*) \" $l \","
+done
+echo NULL
diff --git a/ecflow_4_0_7/view/src/menu_prefs.cc b/ecflow_4_0_7/view/src/menu_prefs.cc
new file mode 100644
index 0000000..3e0889a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menu_prefs.cc
@@ -0,0 +1,75 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "arch.h"
+#include "menu_prefs.h"
+#include "gui.h"
+#include "xec.h"
+#include "extent.h"
+#include <ctype.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+#include <Xm/List.h>
+#include "menus.h"
+
+void menu_prefs::create(Widget w,char*) 
+{ 
+	menu_form_c::create(w); 
+	prefs::setup(w); 
+	build_list();
+}
+
+void menu_prefs::build_list()
+{
+	XmListDeleteAllItems(list_);
+	menus::fillList(list_);
+}
+
+void menu_prefs::menuCB(Widget,XtPointer)
+{
+}
+
+void menu_prefs::addCB(Widget,XtPointer)
+{
+
+}
+
+void menu_prefs::removeCB(Widget,XtPointer)
+{
+
+}
+
+void menu_prefs::check_remove()
+{
+}
+
+void menu_prefs::browseCB(Widget,XtPointer data)
+{
+  XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+  char *p = xec_GetString(cb->item);
+  char *q = p;
+  while(*q && *q == ' ') q++;
+  XmTextSetString(title_,q);
+  XtFree(p);
+}
+
+
+void menu_prefs::changedCB(Widget,XtPointer data)
+{
+}
+
+void menu_prefs::updateCB(Widget,XtPointer data)
+{
+}
diff --git a/ecflow_4_0_7/view/src/menu_prefs.h b/ecflow_4_0_7/view/src/menu_prefs.h
new file mode 100644
index 0000000..1f9f794
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menu_prefs.h
@@ -0,0 +1,60 @@
+#ifndef menu_prefs_H
+#define menu_prefs_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef prefs_H
+#include "prefs.h"
+#endif
+
+#ifndef uimenu
+#include "uimenu.h"
+#endif
+
+class menu_prefs : public prefs, public menu_form_c {
+public:
+	menu_prefs() : changing_(false) {}
+
+	~menu_prefs() {}
+
+	void check_remove();
+
+	virtual Widget widget() { return _xd_rootwidget; }
+
+	static void add_host(const char*);
+
+private:
+
+	menu_prefs(const menu_prefs&);
+	menu_prefs& operator=(const menu_prefs&);
+
+	bool       changing_;
+
+	void build_list();
+
+	virtual void browseCB( Widget w, XtPointer );
+
+	virtual void menuCB( Widget w, XtPointer );
+	virtual void addCB( Widget w, XtPointer );
+	virtual void removeCB( Widget w, XtPointer );
+	virtual void updateCB( Widget w, XtPointer );
+	virtual void changedCB( Widget w, XtPointer );
+
+	virtual void create(Widget w,char*);
+};
+
+inline void destroy(menu_prefs**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/menul.c b/ecflow_4_0_7/view/src/menul.c
new file mode 100644
index 0000000..9d519bf
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menul.c
@@ -0,0 +1,3230 @@
+
+#line 3 "<stdout>"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif	/* defined (__STDC__) */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart(yyin  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+     *       access to the local variable yy_act. Since yyless() is a macro, it would break
+     *       existing scanners that call yyless() from OUTSIDE yylex. 
+     *       One obvious solution it to make yy_act a global. I tried that, and saw
+     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
+     *       normally declared as a register variable-- so it is not worth it.
+     */
+    #define  YY_LESS_LINENO(n) \
+            do { \
+                int yyl;\
+                for ( yyl = n; yyl < yyleng; ++yyl )\
+                    if ( yytext[yyl] == '\n' )\
+                        --yylineno;\
+            }while(0)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
+		YY_RESTORE_YY_MORE_OFFSET \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart (FILE *input_file  );
+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE yy_create_buffer (FILE *file,int size  );
+void yy_delete_buffer (YY_BUFFER_STATE b  );
+void yy_flush_buffer (YY_BUFFER_STATE b  );
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void yypop_buffer_state (void );
+
+static void yyensure_buffer_stack (void );
+static void yy_load_buffer_state (void );
+static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
+
+void *yyalloc (yy_size_t  );
+void *yyrealloc (void *,yy_size_t  );
+void yyfree (void *  );
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        yyensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        yyensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+typedef unsigned char YY_CHAR;
+
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+#define YY_FLEX_LEX_COMPAT
+extern int yylineno;
+
+int yylineno = 1;
+
+extern char yytext[];
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	(yytext_ptr) = yy_bp; \
+	yyleng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
+	*yy_cp = '\0'; \
+	if ( yyleng + (yy_more_offset) >= YYLMAX ) \
+		YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \
+	yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \
+	yyleng += (yy_more_offset); \
+	(yy_prev_more_offset) = (yy_more_offset); \
+	(yy_more_offset) = 0; \
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 139
+#define YY_END_OF_BUFFER 140
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_acclist[903] =
+    {   0,
+      140,  135,  139,  134,  135,  139,  136,  139,  135,  139,
+    16385,   69,  135,  139,  135,  138,  139,   70,  135,  139,
+       68,  135,  139,   68,  135,  139,   68,  135,  139,   68,
+      135,  139,   68,  135,  139,   68,  135,  139,   68,  135,
+      139,   68,  135,  139,   68,  135,  139,   68,  135,  139,
+       68,  135,  139,   68,  135,  139,   68,  135,  139,   68,
+      135,  139,   68,  135,  139,   68,  135,  139,   68,  135,
+      139,   68,  135,  139,   68,  135,  139,   68,  135,  139,
+       68,  135,  139,   68,  135,  139,  135,  139,   68,  135,
+      139,   68,  135,  139,   68,  135,  139,   68,  135,  139,
+
+       68,  135,  139,  133,  139,  132,  133,  139,  132,  133,
+      139,  133,  139,16385,  133,  138,  139,  133,  139,  131,
+      133,  139,  129,  130,  133,  139,  130,  133,  139,  130,
+      133,  139,  130,  133,  139,  130,  133,  139,  130,  133,
+      139,  130,  133,  139,  130,  133,  139,  130,  133,  139,
+      130,  133,  139,  130,  133,  139,  130,  133,  139,  130,
+      133,  139,  130,  133,  139,  130,  133,  139,  130,  133,
+      139,  130,  133,  139,  130,  133,  139,  130,  133,  139,
+      130,  133,  139,  130,  133,  139,  130,  133,  139,  130,
+      133,  139,  133,  139,  130,  133,  139,16385, 8193,   68,
+
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+       68,   68,   68,   68,   68,   40,   68,   68,   68,   68,
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+       68,   68,   68,   68,   68,   68,   68,   68,  131,  129,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,   68,
+       68,   68,   68,    6,   68,   68,   68,   68,   68,   68,
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+
+       68,   68,   68,   68,   68,   68,   68,   15,   68,   68,
+       20,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+       39,   68,   68,   68,   68,   68,   68,   68,   68,  130,
+      130,  130,  130,16504,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,   68,   68,   68,   68,   68,   43,
+       68,   68,   68,   68,   68,   68,   68,   68,   68,    4,
+       68,   68,   68,   21,   68,    5,   68,   46,   68,   42,
+
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+       24,   68,   68,   45,   68,   68,   68,    3,   68,   68,
+    16434,16435,   48,16433,16436,16444,16445,16443,16504, 8312,
+      130,16504,16446,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,16484,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,16474,  130,   79,  130,  130,  130,16508,
+      130,  130,  130,   58,   68,   68,   47,   68,   31,   68,
+       14,   68,   68,   25,   68,   68,   68,   68,   68,   68,
+       27,   68,   26,   68,   68,   28,   68,   68,   68,   68,
+
+       68,   68,   68,   68,   68,   22,   68,   68,   68,   68,
+       68,   68,16434, 8242,16435, 8243,16433, 8241,16436, 8244,
+    16444, 8252,16445, 8253,16443, 8251,16446, 8254,  130,  130,
+      130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+      130,16484, 8292,16491,  130,  130,16489,  130,  130,  130,
+    16497,  130,  130,  130,  130,  130,16495,  130,  130,  130,
+      130,  130,16474, 8282,  130,16485,16486,  130,  130,  130,
+    16508, 8316,16487,  130,  130,  130,   68,   12,   68,   68,
+       23,   68,   17,   68,   68,   68,   68,   68,   68,   18,
+       68,   68,   10,   68,   30,   68,   68,   68,   19,   68,
+
+       68,   68,   68,   68,   68,   41,   68,   68,   55,   56,
+       53,   54,   57,16507,16506,16470,  130,  130,16499,  130,
+      130,16496,  130,16467,  130,   80,  130,  130,  130,  130,
+    16491, 8299,  130,16500,16489, 8297,  130,16493,16494,  130,
+    16469,16497, 8305,16476,  130,  130,  130,16475,16495, 8303,
+      130,  130,  130,  130,  130,16486,16485,16486, 8293, 8294,
+    16485,16486,16501,  130,  130,16487, 8295,  130,  130,16512,
+      130,   63,   13,   68,   68,   68,   68,   68,   68,   68,
+       68,   68,   68,   68,   68,   68,    7,   68,   68,    2,
+       68,16505,16507, 8315,16506, 8314,16470, 8278,  130,   73,
+
+    16499, 8307,  130,  130,16496, 8304,   81,16467, 8275,  130,
+      130,  130,16498,  130,  130,16500, 8308,16494,16493,16494,
+     8301, 8302,16493,16494,  130,16469, 8277,16476, 8284,16477,
+    16488,  130,16475, 8283,   72,  130,  130,  130,16482,16486,
+     8294,16486,16501, 8309,  130,  130,  130,  130,16512, 8320,
+      130,    9,   68,   35,   68,   36,   68,   34,   68,   68,
+       68,   32,   68,   68,   68,   16,   68,   68,   68,   29,
+       68,  126,16505, 8313,   78,  130,  130,  130,16466,16511,
+      130,16498, 8306,  130,  130,16494, 8302,16494,  130,16477,
+     8285,16488, 8296,  130,16478,16480,  130,16482, 8290,  130,
+
+    16481,16483,  130,   76,   68,   37,   68,   44,   68,   38,
+       68,   11,   68,    8,   68,  130,  130,  130,16466,16511,
+     8274, 8319,16466,16511,16466,16511,   71,  130,16490,16521,
+    16471,16478, 8286,16480, 8288,16479,  130,16481, 8289,16483,
+     8291,  130,   65,   66,   64,   67,   68,  130,  130,  130,
+    16466,16511,16466,16511,  130,16490, 8298,16521, 8329,16471,
+     8279,16479, 8287,   77,16503,16492,   68,16473,16468,16466,
+    16511,16466,16511,  130,16503, 8311,16492, 8300,   33,   68,
+    16473, 8281,16468, 8276,16466,16511,16466,16511,  130,   75,
+    16466,16511,   74,16466,16511,16502,16502, 8310,16472,16472,
+
+     8280,  125
+    } ;
+
+static yyconst flex_int16_t yy_accept[802] =
+    {   0,
+        1,    1,    1,    1,    1,    2,    4,    7,    9,   12,
+       15,   18,   21,   24,   27,   30,   33,   36,   39,   42,
+       45,   48,   51,   54,   57,   60,   63,   66,   69,   72,
+       75,   78,   81,   84,   87,   89,   92,   95,   98,  101,
+      104,  106,  109,  112,  115,  118,  120,  123,  127,  130,
+      133,  136,  139,  142,  145,  148,  151,  154,  157,  160,
+      163,  166,  169,  172,  175,  178,  181,  184,  187,  190,
+      193,  195,  198,  199,  200,  201,  202,  203,  204,  205,
+      206,  207,  208,  209,  210,  211,  212,  213,  214,  215,
+      216,  218,  219,  220,  221,  222,  223,  224,  225,  226,
+
+      227,  228,  229,  230,  231,  232,  233,  234,  234,  235,
+      236,  237,  238,  239,  239,  239,  239,  240,  242,  243,
+      244,  245,  246,  247,  248,  249,  250,  251,  252,  253,
+      254,  255,  256,  257,  258,  259,  260,  261,  262,  263,
+      264,  265,  266,  267,  268,  269,  270,  271,  272,  273,
+      274,  275,  276,  277,  278,  279,  279,  280,  281,  282,
+      283,  284,  286,  287,  288,  289,  290,  291,  292,  293,
+      294,  295,  296,  297,  298,  299,  300,  301,  302,  303,
+      304,  305,  306,  307,  308,  310,  311,  313,  314,  315,
+      316,  317,  318,  319,  320,  321,  323,  324,  325,  325,
+
+      325,  325,  325,  325,  326,  327,  328,  329,  330,  330,
+      330,  330,  330,  330,  331,  332,  333,  335,  336,  337,
+      338,  339,  340,  341,  342,  343,  344,  345,  346,  347,
+      348,  349,  350,  351,  352,  353,  354,  355,  356,  357,
+      358,  359,  360,  361,  362,  363,  364,  365,  366,  367,
+      368,  369,  370,  371,  372,  373,  374,  374,  374,  374,
+      374,  374,  375,  376,  377,  378,  379,  380,  382,  383,
+      384,  385,  386,  387,  388,  389,  390,  392,  393,  394,
+      396,  398,  400,  402,  403,  404,  405,  406,  407,  408,
+      409,  410,  411,  413,  414,  416,  417,  418,  420,  421,
+
+      421,  421,  421,  421,  421,  422,  423,  424,  425,  426,
+      426,  426,  426,  426,  426,  427,  428,  429,  430,  431,
+      433,  434,  435,  436,  437,  438,  439,  440,  441,  442,
+      443,  444,  445,  446,  447,  448,  449,  450,  451,  452,
+      453,  454,  455,  456,  457,  458,  459,  460,  461,  462,
+      463,  464,  465,  466,  467,  468,  469,  470,  471,  472,
+      473,  473,  474,  474,  474,  474,  474,  474,  475,  476,
+      477,  479,  481,  483,  484,  486,  487,  488,  489,  490,
+      491,  493,  495,  496,  498,  499,  500,  501,  502,  503,
+      504,  505,  506,  508,  509,  510,  511,  512,  513,  513,
+
+      513,  513,  513,  513,  514,  515,  516,  517,  518,  519,
+      520,  521,  521,  521,  521,  521,  521,  522,  523,  524,
+      525,  526,  527,  528,  529,  530,  531,  532,  533,  534,
+      535,  536,  537,  538,  539,  540,  541,  542,  543,  544,
+      545,  546,  547,  548,  549,  550,  551,  552,  553,  554,
+      555,  556,  557,  558,  559,  560,  561,  562,  563,  564,
+      565,  565,  566,  568,  569,  570,  571,  572,  573,  573,
+      574,  575,  576,  576,  577,  577,  577,  577,  577,  577,
+      578,  580,  581,  583,  585,  586,  587,  588,  589,  590,
+      592,  593,  595,  597,  598,  599,  601,  602,  603,  604,
+
+      605,  606,  608,  609,  610,  611,  612,  613,  614,  614,
+      614,  614,  615,  616,  617,  618,  619,  620,  621,  622,
+      623,  624,  625,  626,  627,  628,  629,  630,  631,  632,
+      633,  634,  635,  636,  637,  637,  638,  640,  641,  642,
+      643,  644,  645,  646,  647,  648,  649,  650,  651,  652,
+      653,  654,  655,  656,  657,  659,  661,  663,  664,  665,
+      666,  666,  667,  668,  669,  670,  671,  672,  672,  672,
+      673,  673,  673,  675,  676,  677,  678,  679,  680,  681,
+      682,  683,  684,  685,  686,  687,  689,  690,  692,  692,
+      692,  693,  694,  695,  696,  697,  698,  699,  700,  701,
+
+      702,  703,  704,  705,  706,  707,  708,  709,  710,  711,
+      712,  713,  714,  715,  716,  717,  718,  719,  721,  723,
+      725,  726,  727,  728,  729,  730,  731,  732,  733,  734,
+      735,  736,  737,  738,  739,  740,  741,  742,  743,  744,
+      745,  746,  747,  747,  748,  749,  750,  751,  752,  752,
+      752,  752,  752,  754,  756,  758,  760,  761,  762,  764,
+      765,  766,  768,  769,  770,  772,  772,  773,  774,  775,
+      776,  777,  778,  779,  781,  782,  783,  784,  785,  786,
+      787,  788,  789,  790,  791,  792,  793,  794,  795,  796,
+      797,  798,  799,  800,  801,  802,  802,  803,  804,  805,
+
+      805,  805,  805,  805,  806,  808,  810,  812,  814,  816,
+      816,  817,  818,  819,  821,  823,  825,  827,  828,  829,
+      830,  831,  832,  833,  834,  835,  836,  837,  838,  839,
+      840,  840,  841,  842,  843,  844,  845,  846,  847,  848,
+      848,  849,  850,  851,  853,  855,  856,  857,  858,  859,
+      860,  861,  862,  863,  864,  865,  866,  867,  868,  868,
+      869,  869,  870,  872,  874,  875,  876,  877,  878,  879,
+      881,  881,  882,  883,  883,  884,  885,  887,  889,  890,
+      890,  890,  893,  896,  897,  897,  897,  898,  899,  899,
+      899,  899,  900,  900,  901,  902,  902,  902,  902,  903,
+
+      903
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    4,    5,    6,    7,    8,    9,    1,   10,    1,
+        1,   11,    1,    1,   12,   13,   14,   15,   15,   15,
+       15,   15,   15,   15,   15,   15,   15,   16,    1,   17,
+        1,    1,    1,    1,   18,   19,   20,   21,   22,   23,
+       24,   25,   26,   27,   28,   29,   30,   31,   32,   33,
+       34,   35,   36,   37,   38,   39,   40,   41,   42,   43,
+        1,    1,    1,    1,   44,    1,   45,   46,   47,   48,
+
+       49,   50,   51,   52,   53,   54,   55,   56,   57,   58,
+       59,   60,   61,   62,   63,   64,   65,   66,   67,   27,
+       68,   69,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst flex_int32_t yy_meta[70] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    3,    4,    3,    1,    4,    4,    4,
+        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
+        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
+        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
+        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
+        4,    4,    4,    4,    4,    4,    4,    4,    4
+    } ;
+
+static yyconst flex_int16_t yy_base[863] =
+    {   0,
+        0,   63,  103,   65, 1222, 1223, 1223, 1223, 1218, 1223,
+     1223, 1223,    0,   54,   47, 1181, 1201, 1200, 1181,   63,
+       56, 1184, 1182, 1185, 1175, 1190,  151, 1193,   55, 1192,
+     1183, 1186, 1158, 1157, 1201, 1185,   61,  156,  157,   62,
+     1223, 1223,  158, 1200, 1223, 1190,    0, 1186,    0, 1181,
+     1164, 1162, 1171, 1178,  131, 1146,  139,   48,  137,   18,
+     1135,  135,   45, 1131, 1136, 1126,  137,  141,  139, 1132,
+     1185, 1156, 1184, 1223,    0, 1154, 1148, 1154,   73, 1161,
+     1152, 1159, 1150,  176, 1135, 1159, 1147, 1156,  177, 1151,
+      178, 1152, 1135, 1150, 1138,  182, 1132, 1133,  194, 1132,
+
+     1139, 1144, 1130, 1133, 1127, 1104, 1099,  202, 1136, 1124,
+      198, 1134, 1122, 1144, 1087,  175,    0, 1139,    0, 1129,
+     1117, 1127, 1129, 1114, 1089, 1083, 1082, 1081, 1093, 1085,
+     1093, 1092, 1083,  178, 1077, 1085, 1088, 1080, 1073, 1088,
+      164, 1082, 1074, 1083, 1082, 1084, 1079,  180, 1069,  181,
+      183, 1064, 1068,  176, 1069,  226, 1099, 1087, 1095, 1094,
+     1101,    0, 1100, 1084, 1085, 1089, 1077, 1069, 1069, 1089,
+     1084, 1081, 1070, 1085, 1071, 1083, 1082, 1068, 1078, 1063,
+     1078, 1077, 1080, 1058,    0, 1059,    0, 1065, 1057, 1060,
+     1064, 1060, 1055, 1063, 1067,    0, 1022, 1023, 1066, 1049,
+
+     1051, 1046, 1063, 1064, 1063, 1062, 1061, 1060, 1063, 1070,
+     1014, 1023, 1018, 1054, 1053, 1052,  266, 1051, 1004, 1012,
+     1015, 1004, 1009, 1014, 1013, 1014,  140, 1009, 1008, 1040,
+      991,  996, 1004, 1005, 1007, 1001, 1000,  198,  983,  989,
+      997,  977,  979,  984,  977,  976, 1024,  991,  200,  981,
+      977, 1020,  986,  976, 1021,  974, 1012,  995,  997,  992,
+     1009, 1010,  988,  985,  992,  986,  986,  991,  982,  989,
+      995,  215,  984,  986,  977,  991,    0,  977,  993,    0,
+        0,    0,    0,  988,  991,  988,  972,  984,  984,  978,
+      981,  980,    0,  969,    0,  982,  967,    0,  945,  973,
+
+      961,  971,  970,  958,  989,  988, 1223,  987,  986,  976,
+      925,  924,  918,  926,  980,  979,  978,  977, 1223,  283,
+      976,  914,  911,  914,  203,  917,  925,  918,  910,  926,
+      914,  905,  910,  964,  210,  902,  949,  915,  900,  906,
+      945,  902,  894,  913,  904,  894,  939,  905,  887,  903,
+      207,  948,  300, 1223,  884,  896,  899,  944,  303,  883,
+      887,  885,  919,  907,  917,  916,  904, 1223,  916,  915,
+        0,    0,    0,  914,    0,  893,  913,  915,  296,  902,
+        0,    0,  910,    0,  893,  908,  891,  890,  908,  890,
+      892,  886,    0,  891,  881,  901,  879,  859,  901,  900,
+
+      899,  898,  897,  909, 1223,  908, 1223,  907, 1223,  906,
+     1223,  904,  842,  859,  842,  853,  900, 1223,  899, 1223,
+      898, 1223,  897, 1223,  287,  850,  882,  852,  847,  879,
+      838,  221,  877,  834,  842,  841,  841,  885, 1223,  884,
+      833,  869,  881,  362,  830,  866,  878,  864,  815,  822,
+      826,  860,  872,  826,  824,  807,  814,  821,  866, 1223,
+      852,  379,  317,  851,  802,  807,  861, 1223,  798,  859,
+      796,  804,  800,  791,  841,  840,  839,  838,  837,  831,
+        0,  814,    0,    0,  813,  808,  818,  821,  827,    0,
+      823,    0,    0,  818,  806,    0,  802,  804,  819,  808,
+
+      809,    0,  779, 1223, 1223, 1223, 1223, 1223,  773,  779,
+      785,  830,  829,  828,  782,  813,  825,  769,  766,  822,
+      808,  820,  763, 1223,  773,  756,  803,  769,  814, 1223,
+      760,  812,  811, 1223,  797,  396,  318,  743,  808,  807,
+     1223,  806,  792,  791,  754,  802,  801, 1223,  787,  740,
+      752,  747,  783,  321,  322, 1223,  323,  795,  733,  748,
+      732,  791, 1223,  729,  747,  788,  732,  776,  775, 1223,
+      774,  773,    0,  763,  762,  746,  760,  757,  754,  758,
+      746,  745,  745,  753,  752,    0,  751,    0,  708,  722,
+      767,  766, 1223,  765, 1223,  764, 1223,  750, 1223,  762,
+
+     1223,  717,  714,  759, 1223, 1223,  758, 1223,  707,  629,
+      556,  590,  519,  470,  515, 1223,  324,  325, 1223,  326,
+      468,  513, 1223,  512, 1223,  511,  510,  448,  508, 1223,
+     1223,  494,  493,  444,  504,  327, 1223,  329,  502, 1223,
+      455,  487,  453,  485,  436,  494, 1223,  480,  484,  483,
+      482,  481,    0,    0,    0,    0,  467,  468,    0,  458,
+      453,    0,  466,  465,    0,  432, 1223,   84, 1223, 1223,
+      191,  209,  200,  396,  243,  258, 1223,  215,  247,  332,
+     1223,  341,  282,  320, 1223,  343, 1223,  331,  346,  347,
+      335,  349, 1223,  305,  351,  307,  353,  309, 1223,  351,
+
+      352,  353,  357,  355,    0,    0,    0,    0,    0,  326,
+      338,  347,  350,  412, 1223,  413,  414, 1223,  366,  417,
+      418,  419,  420, 1223,  421, 1223,  422,  411,  425, 1223,
+      413,  427, 1223,  415, 1223, 1223, 1223, 1223,  397,  377,
+      418,  431,  420,  434,  435,  390,  437, 1223,  438, 1223,
+      439, 1223,  440, 1223, 1223,  441,  442,  410,  443,  445,
+      401,  447,  448,  449,  390,  451, 1223,  452, 1223,    0,
+      393,  454, 1223,  413,  456, 1223,  457,  458,  446,  399,
+      401,  463,  464,  465,  406,  421,  468, 1223,  412,  457,
+      425,  472,  418,  474, 1223,  430,  431,  433, 1223, 1223,
+
+      521,  478,  523,  480,  527,  531,  535,  539,  543,  547,
+      551,  555,  559,  563,  567,  571,  575,  579,  583,  587,
+      591,  595,  599,  603,  607,  611,  615,  619,  623,  627,
+      631,  635,  639,  643,  647,  651,  655,  659,  663,  667,
+      671,  675,  679,  683,  687,  691,  695,  699,  703,  707,
+      711,  715,  719,  723,  727,  731,  735,  739,  743,  747,
+      751,  755
+    } ;
+
+static yyconst flex_int16_t yy_def[863] =
+    {   0,
+      800,    1,  800,    3,  800,  800,  800,  800,  801,  800,
+      800,  800,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  800,  802,  802,  802,  802,  802,
+      800,  800,  800,  801,  800,  800,  803,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      800,  804,  801,  800,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+
+      802,  802,  802,  802,  802,  802,  802,  800,  802,  802,
+      802,  802,  802,  800,  800,  800,  803,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  800,  804,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  800,  800,
+
+      800,  800,  800,  802,  802,  802,  802,  802,  800,  800,
+      800,  800,  800,  804,  804,  804,  805,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  800,  800,  800,  800,
+      800,  804,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  800,
+
+      800,  800,  800,  800,  806,  807,  800,  808,  809,  800,
+      800,  800,  800,  800,  810,  811,  812,  813,  800,  805,
+      814,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  815,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  816,  817,  800,  804,  804,  804,  818,  804,  804,
+      800,  804,  800,  800,  800,  800,  800,  800,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  800,  800,
+
+      800,  800,  800,  806,  800,  807,  800,  808,  800,  809,
+      800,  800,  800,  800,  800,  800,  810,  800,  811,  800,
+      812,  800,  814,  800,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  804,  815,  800,  819,
+      804,  804,  820,  821,  804,  804,  822,  804,  804,  804,
+      804,  804,  823,  804,  804,  804,  804,  804,  816,  800,
+      824,  817,  825,  804,  804,  804,  818,  800,  800,  826,
+      804,  804,  800,  804,  800,  800,  800,  800,  800,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+
+      802,  802,  802,  800,  800,  800,  800,  800,  800,  800,
+      800,  827,  828,  829,  804,  804,  830,  804,  804,  831,
+      804,  832,  804,  800,  804,  804,  804,  804,  819,  800,
+      804,  833,  820,  800,  834,  821,  835,  804,  836,  822,
+      800,  837,  804,  804,  804,  838,  823,  800,  804,  804,
+      804,  804,  804,  839,  825,  800,  825,  840,  804,  804,
+      800,  826,  800,  804,  804,  841,  804,  800,  800,  800,
+      800,  800,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  802,  802,  802,  800,  800,
+      842,  827,  800,  828,  800,  829,  800,  804,  800,  830,
+
+      800,  804,  804,  831,  800,  800,  832,  800,  804,  804,
+      804,  843,  804,  804,  833,  800,  844,  835,  800,  835,
+      804,  836,  800,  837,  800,  845,  846,  804,  838,  800,
+      800,  804,  804,  804,  847,  839,  800,  839,  840,  800,
+      804,  804,  800,  804,  804,  841,  800,  804,  800,  800,
+      800,  800,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  802,  802,  800,  800,  842,  800,  800,
+      804,  804,  804,  848,  804,  843,  800,  804,  804,  844,
+      800,  844,  804,  845,  800,  846,  800,  804,  849,  850,
+      804,  847,  800,  804,  851,  800,  852,  804,  800,  800,
+
+      800,  800,  800,  802,  802,  802,  802,  802,  802,  800,
+      804,  804,  804,  848,  800,  848,  848,  800,  804,  853,
+      854,  855,  849,  800,  850,  800,  856,  804,  851,  800,
+      800,  852,  800,  804,  800,  800,  800,  800,  802,  800,
+      804,  804,  804,  848,  848,  804,  853,  800,  854,  800,
+      855,  800,  856,  800,  800,  857,  858,  802,  800,  859,
+      800,  860,  848,  848,  804,  857,  800,  858,  800,  802,
+      800,  859,  800,  800,  860,  800,  848,  848,  804,  800,
+      800,  848,  848,  861,  800,  800,  861,  800,  800,  800,
+      800,  862,  800,  862,  800,  800,  800,  800,  800,    0,
+
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800
+    } ;
+
+static yyconst flex_int16_t yy_nxt[1293] =
+    {   0,
+        6,    7,    8,    7,    9,   10,    6,    6,   11,   12,
+        6,    6,    6,    6,   13,    6,    6,   14,   13,   15,
+       13,   16,   17,   13,   18,   19,   13,   13,   20,   21,
+       22,   23,   24,   25,   26,   27,   28,   29,   30,   31,
+       13,   32,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   33,   13,   13,   13,
+       13,   13,   13,   13,   13,   34,   13,   13,   13,   35,
+      138,   71,   76,   77,   78,   80,  139,   89,   81,  113,
+       86,   90,   79,   36,   37,  101,  669,  104,   87,  143,
+      102,   38,   39,   72,   88,  110,  134,  144,  161,   82,
+
+      135,  162,   40,   41,   42,    8,   43,   44,   41,   41,
+       41,   45,   41,   41,   46,   41,   47,   48,   41,   41,
+       49,   49,   49,   50,   51,   49,   49,   49,   49,   49,
+       49,   49,   52,   49,   49,   53,   49,   49,   49,   49,
+       49,   49,   54,   49,   49,   49,   49,   55,   56,   57,
+       58,   59,   60,   49,   49,   49,   61,   49,   62,   63,
+       49,   64,   65,   66,   67,   68,   69,   70,   49,   49,
+       49,   49,   96,   86,  114,   97,  125,  126,   89,  141,
+       98,   87,   90,  130,  136,  148,  127,  111,   99,  150,
+      131,  153,  112,  142,  132,  128,  330,  133,  176,  331,
+
+      154,  149,  137,  115,  167,  151,  152,  173,  177,  236,
+      182,  168,  188,  174,  183,  354,  184,  172,  185,  189,
+      254,  206,  199,  200,  211,  440,  244,  237,  250,  190,
+      201,  202,  212,  228,  213,  378,  522,  229,  248,  711,
+      245,  203,  246,  255,  249,  251,  257,  258,  355,  428,
+      342,  379,  457,  712,  259,  260,  343,  713,  718,  441,
+      677,  719,  720,  458,  429,  261,  318,  318,  319,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      523,  318,  318,  318,  318,  319,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  721,  318,  318,
+
+      461,  461,  514,  461,  461,  461,  461,  461,  461,  461,
+      461,  461,  461,  461,  469,  463,  461,  486,  470,  556,
+      619,  487,  685,  637,  556,  556,  681,  619,  619,  637,
+      488,  637,  557,  620,  681,  515,  638,  557,  557,  682,
+      620,  620,  638,  681,  638,  687,  722,  682,  724,  726,
+      727,  693,  728,  730,  731,  733,  682,  734,  735,  736,
+      737,  471,  535,  535,  738,  535,  535,  535,  535,  535,
+      535,  535,  535,  535,  535,  535,  739,  537,  535,  461,
+      461,  740,  461,  461,  461,  461,  461,  461,  461,  461,
+      461,  461,  461,  741,  554,  461,  535,  535,  715,  535,
+
+      535,  535,  535,  535,  535,  535,  535,  535,  535,  535,
+      742,  617,  535,  743,  715,  715,  715,  716,  746,  748,
+      750,  752,  724,  726,  754,  717,  755,  730,  756,  733,
+      757,  758,  759,  760,  761,  762,  715,  715,  765,  748,
+      750,  752,  754,  767,  769,  770,  771,  773,  774,  776,
+      715,  715,  779,  767,  769,  780,  773,  781,  776,  715,
+      715,  784,  745,  785,  786,  715,  715,  788,  789,  790,
+      788,  791,  792,  793,  795,  796,  795,  797,  744,  798,
+      799,   75,  763,  119,  710,  709,  708,  707,  706,  705,
+      704,  703,  702,  701,  700,  699,  647,  778,  764,  698,
+
+      697,  696,  695,  694,  640,  777,  693,  691,  690,  689,
+      630,  688,  687,  685,  625,  623,  683,  616,  679,  783,
+      782,   73,   73,   73,   73,  117,  117,  320,  320,  320,
+      320,  404,  404,  404,  404,  406,  406,  406,  406,  408,
+      408,  408,  408,  410,  410,  410,  410,  417,  417,  417,
+      417,  419,  419,  419,  419,  421,  421,  421,  421,  318,
+      318,  318,  318,  423,  423,  423,  423,  438,  438,  438,
+      438,  459,  459,  459,  459,  462,  678,  462,  462,  467,
+      467,  467,  467,  529,  529,  529,  529,  533,  533,  533,
+      533,  536,  677,  536,  536,  540,  540,  540,  540,  547,
+
+      547,  547,  547,  461,  675,  461,  461,  555,  555,  555,
+      555,  562,  562,  562,  562,  592,  592,  592,  592,  594,
+      594,  594,  594,  596,  596,  596,  596,  600,  600,  600,
+      600,  604,  604,  604,  604,  607,  607,  607,  607,  615,
+      615,  615,  615,  535,  674,  535,  535,  618,  618,  618,
+      618,  622,  622,  622,  622,  624,  624,  624,  624,  629,
+      629,  629,  629,  636,  636,  636,  636,  639,  639,  639,
+      639,  646,  646,  646,  646,  668,  668,  668,  668,  676,
+      676,  676,  676,  680,  680,  680,  680,  684,  684,  684,
+      684,  686,  686,  686,  686,  692,  692,  692,  692,  714,
+
+      714,  714,  714,  723,  723,  723,  723,  725,  725,  725,
+      725,  729,  729,  729,  729,  732,  732,  732,  732,  747,
+      747,  747,  747,  749,  749,  749,  749,  751,  751,  751,
+      751,  753,  753,  753,  753,  766,  766,  766,  766,  768,
+      768,  768,  768,  772,  772,  772,  772,  775,  775,  775,
+      775,  787,  787,  787,  787,  794,  794,  794,  794,  673,
+      608,  605,  672,  671,  601,  670,  597,  595,  593,  669,
+      667,  666,  665,  664,  663,  662,  661,  660,  659,  658,
+      657,  656,  655,  654,  653,  652,  651,  650,  649,  648,
+      647,  645,  644,  563,  643,  642,  641,  640,  635,  634,
+
+      633,  632,  631,  548,  630,  628,  627,  626,  625,  541,
+      623,  621,  617,  534,  616,  614,  530,  613,  612,  611,
+      610,  609,  608,  606,  605,  603,  602,  601,  599,  598,
+      597,  595,  593,  591,  590,  589,  588,  587,  586,  585,
+      584,  583,  582,  581,  580,  579,  578,  577,  576,  575,
+      574,  573,  572,  571,  570,  569,  568,  567,  566,  565,
+      564,  563,  561,  468,  560,  559,  558,  554,  460,  553,
+      552,  551,  550,  549,  548,  546,  545,  544,  543,  542,
+      541,  539,  538,  534,  532,  531,  530,  439,  528,  527,
+      526,  525,  524,  521,  520,  519,  518,  517,  516,  424,
+
+      422,  420,  418,  513,  512,  511,  510,  509,  411,  409,
+      407,  405,  508,  507,  506,  505,  504,  503,  502,  501,
+      500,  499,  498,  497,  496,  495,  494,  493,  492,  491,
+      490,  489,  485,  484,  483,  482,  481,  480,  479,  478,
+      477,  476,  475,  474,  473,  472,  468,  466,  465,  464,
+      460,  456,  455,  454,  453,  452,  451,  450,  449,  448,
+      447,  446,  445,  444,  443,  442,  439,  437,  436,  435,
+      434,  433,  432,  431,  430,  427,  426,  425,  424,  319,
+      422,  420,  418,  416,  415,  414,  413,  412,  411,  409,
+      407,  405,  403,  402,  401,  400,  399,  398,  397,  396,
+
+      395,  394,  393,  392,  391,  390,  389,  388,  387,  386,
+      385,  384,  383,  382,  381,  380,  377,  376,  375,  374,
+      373,  372,  371,  370,  369,  368,  367,  366,  365,  364,
+      363,  362,  361,  360,  359,  358,  357,  356,  353,  352,
+      351,  350,  349,  348,  347,  346,  345,  344,  341,  340,
+      339,  338,  337,  336,  335,  334,  333,  332,  329,  328,
+      327,  326,  325,  324,  323,  322,  321,  317,  316,  315,
+      314,  313,  312,  311,  310,  309,  308,  307,  306,  305,
+      304,  303,  302,  301,  300,  299,  298,  297,  296,  295,
+      294,  293,  292,  291,  290,  289,  288,  287,  286,  285,
+
+      284,  283,  282,  281,  280,  279,  278,  277,  276,  275,
+      274,  273,  272,  271,  270,  269,  268,  267,  266,  265,
+      264,  263,  262,  256,  253,  252,  247,  243,  242,  241,
+      240,  239,  238,  235,  234,  233,  232,  231,  230,  227,
+      226,  225,  224,  223,  222,  221,  220,  219,  218,  217,
+      216,  215,  214,  118,  210,  209,  208,  207,  205,  204,
+      198,  197,  196,  195,  194,  193,  192,  191,  187,  186,
+      181,  180,  179,  178,  175,  172,  171,  170,  169,  166,
+      165,  164,  163,  160,  159,  158,   74,  157,  156,  155,
+      147,  146,  145,  140,  129,  124,  123,  122,  121,  120,
+
+      118,  116,   74,  109,  108,  107,  106,  105,  104,  103,
+      100,   95,   94,   93,   92,   91,   85,   84,   83,   82,
+       74,  800,    5,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800
+
+    } ;
+
+static yyconst flex_int16_t yy_chk[1293] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
+       60,    4,   14,   14,   14,   15,   60,   21,   15,   40,
+       20,   21,   14,    2,    2,   29,  668,   40,   20,   63,
+       29,    2,    2,    4,   20,   37,   58,   63,   79,   37,
+
+       58,   79,    2,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,   27,   38,   43,   27,   55,   55,   39,   62,
+       27,   38,   39,   57,   59,   67,   55,   38,   27,   68,
+       57,   69,   39,   62,   57,   55,  227,   57,   91,  227,
+
+       69,   67,   59,   43,   84,   68,   68,   89,   91,  141,
+       96,   84,   99,   89,   96,  249,   96,  111,   96,   99,
+      154,  111,  108,  108,  116,  335,  148,  141,  151,   99,
+      108,  108,  116,  134,  116,  272,  432,  134,  150,  671,
+      148,  108,  148,  154,  150,  151,  156,  156,  249,  325,
+      238,  272,  351,  672,  156,  156,  238,  673,  675,  335,
+      676,  678,  679,  351,  325,  156,  217,  217,  217,  217,
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      432,  217,  217,  320,  320,  320,  320,  320,  320,  320,
+      320,  320,  320,  320,  320,  320,  320,  683,  320,  320,
+
+      353,  353,  425,  353,  353,  353,  353,  353,  353,  353,
+      353,  353,  353,  353,  359,  353,  353,  379,  359,  463,
+      537,  379,  684,  554,  555,  557,  617,  618,  620,  636,
+      379,  638,  463,  537,  680,  425,  554,  555,  557,  617,
+      618,  620,  636,  682,  638,  686,  688,  680,  689,  690,
+      691,  692,  694,  695,  696,  697,  682,  698,  700,  701,
+      702,  359,  444,  444,  703,  444,  444,  444,  444,  444,
+      444,  444,  444,  444,  444,  444,  704,  444,  444,  462,
+      462,  710,  462,  462,  462,  462,  462,  462,  462,  462,
+      462,  462,  462,  711,  462,  462,  536,  536,  674,  536,
+
+      536,  536,  536,  536,  536,  536,  536,  536,  536,  536,
+      712,  536,  536,  713,  714,  716,  717,  674,  719,  720,
+      721,  722,  723,  725,  727,  674,  728,  729,  731,  732,
+      734,  739,  740,  741,  742,  743,  744,  745,  746,  747,
+      749,  751,  753,  756,  757,  758,  759,  760,  761,  762,
+      763,  764,  765,  766,  768,  771,  772,  774,  775,  777,
+      778,  779,  717,  780,  781,  782,  783,  784,  785,  786,
+      787,  789,  790,  791,  792,  793,  794,  796,  716,  797,
+      798,  802,  744,  804,  666,  664,  663,  661,  660,  658,
+      657,  652,  651,  650,  649,  648,  646,  764,  745,  645,
+
+      644,  643,  642,  641,  639,  763,  635,  634,  633,  632,
+      629,  628,  627,  626,  624,  622,  621,  615,  614,  778,
+      777,  801,  801,  801,  801,  803,  803,  805,  805,  805,
+      805,  806,  806,  806,  806,  807,  807,  807,  807,  808,
+      808,  808,  808,  809,  809,  809,  809,  810,  810,  810,
+      810,  811,  811,  811,  811,  812,  812,  812,  812,  813,
+      813,  813,  813,  814,  814,  814,  814,  815,  815,  815,
+      815,  816,  816,  816,  816,  817,  613,  817,  817,  818,
+      818,  818,  818,  819,  819,  819,  819,  820,  820,  820,
+      820,  821,  612,  821,  821,  822,  822,  822,  822,  823,
+
+      823,  823,  823,  824,  611,  824,  824,  825,  825,  825,
+      825,  826,  826,  826,  826,  827,  827,  827,  827,  828,
+      828,  828,  828,  829,  829,  829,  829,  830,  830,  830,
+      830,  831,  831,  831,  831,  832,  832,  832,  832,  833,
+      833,  833,  833,  834,  610,  834,  834,  835,  835,  835,
+      835,  836,  836,  836,  836,  837,  837,  837,  837,  838,
+      838,  838,  838,  839,  839,  839,  839,  840,  840,  840,
+      840,  841,  841,  841,  841,  842,  842,  842,  842,  843,
+      843,  843,  843,  844,  844,  844,  844,  845,  845,  845,
+      845,  846,  846,  846,  846,  847,  847,  847,  847,  848,
+
+      848,  848,  848,  849,  849,  849,  849,  850,  850,  850,
+      850,  851,  851,  851,  851,  852,  852,  852,  852,  853,
+      853,  853,  853,  854,  854,  854,  854,  855,  855,  855,
+      855,  856,  856,  856,  856,  857,  857,  857,  857,  858,
+      858,  858,  858,  859,  859,  859,  859,  860,  860,  860,
+      860,  861,  861,  861,  861,  862,  862,  862,  862,  609,
+      607,  604,  603,  602,  600,  598,  596,  594,  592,  591,
+      590,  589,  587,  585,  584,  583,  582,  581,  580,  579,
+      578,  577,  576,  575,  574,  572,  571,  569,  568,  567,
+      566,  565,  564,  562,  561,  560,  559,  558,  553,  552,
+
+      551,  550,  549,  547,  546,  545,  544,  543,  542,  540,
+      539,  538,  535,  533,  532,  531,  529,  528,  527,  526,
+      525,  523,  522,  521,  520,  519,  518,  517,  516,  515,
+      514,  513,  512,  511,  510,  509,  503,  501,  500,  499,
+      498,  497,  495,  494,  491,  489,  488,  487,  486,  485,
+      482,  480,  479,  478,  477,  476,  475,  474,  473,  472,
+      471,  470,  469,  467,  466,  465,  464,  461,  459,  458,
+      457,  456,  455,  454,  453,  452,  451,  450,  449,  448,
+      447,  446,  445,  443,  442,  441,  440,  438,  437,  436,
+      435,  434,  433,  431,  430,  429,  428,  427,  426,  423,
+
+      421,  419,  417,  416,  415,  414,  413,  412,  410,  408,
+      406,  404,  403,  402,  401,  400,  399,  398,  397,  396,
+      395,  394,  392,  391,  390,  389,  388,  387,  386,  385,
+      383,  380,  378,  377,  376,  374,  370,  369,  367,  366,
+      365,  364,  363,  362,  361,  360,  358,  357,  356,  355,
+      352,  350,  349,  348,  347,  346,  345,  344,  343,  342,
+      341,  340,  339,  338,  337,  336,  334,  333,  332,  331,
+      330,  329,  328,  327,  326,  324,  323,  322,  321,  318,
+      317,  316,  315,  314,  313,  312,  311,  310,  309,  308,
+      306,  305,  304,  303,  302,  301,  300,  299,  297,  296,
+
+      294,  292,  291,  290,  289,  288,  287,  286,  285,  284,
+      279,  278,  276,  275,  274,  273,  271,  270,  269,  268,
+      267,  266,  265,  264,  263,  262,  261,  260,  259,  258,
+      257,  256,  255,  254,  253,  252,  251,  250,  248,  247,
+      246,  245,  244,  243,  242,  241,  240,  239,  237,  236,
+      235,  234,  233,  232,  231,  230,  229,  228,  226,  225,
+      224,  223,  222,  221,  220,  219,  218,  216,  215,  214,
+      213,  212,  211,  210,  209,  208,  207,  206,  205,  204,
+      203,  202,  201,  200,  199,  198,  197,  195,  194,  193,
+      192,  191,  190,  189,  188,  186,  184,  183,  182,  181,
+
+      180,  179,  178,  177,  176,  175,  174,  173,  172,  171,
+      170,  169,  168,  167,  166,  165,  164,  163,  161,  160,
+      159,  158,  157,  155,  153,  152,  149,  147,  146,  145,
+      144,  143,  142,  140,  139,  138,  137,  136,  135,  133,
+      132,  131,  130,  129,  128,  127,  126,  125,  124,  123,
+      122,  121,  120,  118,  115,  114,  113,  112,  110,  109,
+      107,  106,  105,  104,  103,  102,  101,  100,   98,   97,
+       95,   94,   93,   92,   90,   88,   87,   86,   85,   83,
+       82,   81,   80,   78,   77,   76,   73,   72,   71,   70,
+       66,   65,   64,   61,   56,   54,   53,   52,   51,   50,
+
+       48,   46,   44,   36,   35,   34,   33,   32,   31,   30,
+       28,   26,   25,   24,   23,   22,   19,   18,   17,   16,
+        9,    5,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800
+
+    } ;
+
+/* Table of booleans, true if rule could match eol. */
+static yyconst flex_int32_t yy_rule_can_match_eol[140] =
+    {   0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
+        };
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+static int yy_more_offset = 0;
+static int yy_prev_more_offset = 0;
+#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext ))
+#define YY_NEED_STRLEN
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET \
+	{ \
+	(yy_more_offset) = (yy_prev_more_offset); \
+	yyleng -= (yy_more_offset); \
+	}
+#ifndef YYLMAX
+#define YYLMAX 8192
+#endif
+
+char yytext[YYLMAX];
+char *yytext_ptr;
+#line 1 "menul.l"
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #11 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#line 17 "menul.l"
+#if defined(linux) || defined(mips) || defined(hpux) || defined(_AIX)
+int yylineno;
+#define NEWLINE yylineno++
+#else
+#define NEWLINE 
+#endif
+
+#undef ECHO
+/* #define ECHO printf("<%s>",yytext) */
+#define ECHO /**/
+
+/*
+on HP lex -Xa10000
+p4 edit src/menul.c src/menuy.c && cd src && lex  -t menul.l > menul.c && yacc  menuy.y && mv -f y.tab.c menuy.c && cd ../ && make menu && make prof # ./env.sh cc
+
+ecflow_client | xargs addr2line -e ecflow_client -f
+*/
+
+#if defined (linux) || defined(alpha) || defined(SVR4) || defined(SGI) || defined(_AIX)
+#define yyinput input
+#endif
+
+
+
+#line 1211 "<stdout>"
+
+#define INITIAL 0
+#define LOGFILE 1
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy (void );
+
+int yyget_debug (void );
+
+void yyset_debug (int debug_flag  );
+
+YY_EXTRA_TYPE yyget_extra (void );
+
+void yyset_extra (YY_EXTRA_TYPE user_defined  );
+
+FILE *yyget_in (void );
+
+void yyset_in  (FILE * in_str  );
+
+FILE *yyget_out (void );
+
+void yyset_out  (FILE * out_str  );
+
+int yyget_leng (void );
+
+char *yyget_text (void );
+
+int yyget_lineno (void );
+
+void yyset_lineno (int line_number  );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap (void );
+#else
+extern int yywrap (void );
+#endif
+#endif
+
+    static void yyunput (int c,char *buf_ptr  );
+    
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+		{ \
+		int c = '*'; \
+		int n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(yyin); \
+			} \
+		}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	if ( yyleng > 0 ) \
+		YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+				(yytext[yyleng - 1] == '\n'); \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+    
+#line 56 "menul.l"
+
+
+#line 1400 "<stdout>"
+
+	if ( !(yy_init) )
+		{
+		(yy_init) = 1;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+        /* Create the reject buffer large enough to save one state per allowed character. */
+        if ( ! (yy_state_buf) )
+            (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE  );
+            if ( ! (yy_state_buf) )
+                YY_FATAL_ERROR( "out of dynamic memory in yylex()" );
+
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			yyensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				yy_create_buffer(yyin,YY_BUF_SIZE );
+		}
+
+		yy_load_buffer_state( );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = (yy_c_buf_p);
+
+		/* Support of yytext. */
+		*yy_cp = (yy_hold_char);
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = (yy_start);
+		yy_current_state += YY_AT_BOL();
+
+		(yy_state_ptr) = (yy_state_buf);
+		*(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 801 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			*(yy_state_ptr)++ = yy_current_state;
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 1223 );
+
+yy_find_action:
+		yy_current_state = *--(yy_state_ptr);
+		(yy_lp) = yy_accept[yy_current_state];
+find_rule: /* we branch to this label when backing up */
+		for ( ; ; ) /* until we find what rule we matched */
+			{
+			if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+				{
+				yy_act = yy_acclist[(yy_lp)];
+				if ( yy_act & YY_TRAILING_HEAD_MASK ||
+				     (yy_looking_for_trail_begin) )
+					{
+					if ( yy_act == (yy_looking_for_trail_begin) )
+						{
+						(yy_looking_for_trail_begin) = 0;
+						yy_act &= ~YY_TRAILING_HEAD_MASK;
+						break;
+						}
+					}
+				else if ( yy_act & YY_TRAILING_MASK )
+					{
+					(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+					(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+					(yy_full_match) = yy_cp;
+					(yy_full_state) = (yy_state_ptr);
+					(yy_full_lp) = (yy_lp);
+					}
+				else
+					{
+					(yy_full_match) = yy_cp;
+					(yy_full_state) = (yy_state_ptr);
+					(yy_full_lp) = (yy_lp);
+					break;
+					}
+				++(yy_lp);
+				goto find_rule;
+				}
+			--yy_cp;
+			yy_current_state = *--(yy_state_ptr);
+			(yy_lp) = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+		if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+			{
+			int yyl;
+			for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl )
+				if ( yytext[yyl] == '\n' )
+					   
+    yylineno++;
+;
+			}
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 58 "menul.l"
+;
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 60 "menul.l"
+return VERSION;
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 61 "menul.l"
+return MENU;
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 62 "menul.l"
+return MENU;
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 63 "menul.l"
+return NONE;
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 64 "menul.l"
+return ALL;
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 65 "menul.l"
+return UNKNOWN;
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 66 "menul.l"
+return SUSPENDED;
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 67 "menul.l"
+return COMPLETE;
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 68 "menul.l"
+return QUEUED;
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 69 "menul.l"
+return SUBMITTED;
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 70 "menul.l"
+return ACTIVE;
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 71 "menul.l"
+return ABORTED;
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 72 "menul.l"
+return CLEAR;
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 73 "menul.l"
+return SET;
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 74 "menul.l"
+return SHUTDOWN;
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 75 "menul.l"
+return HALTED;
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 76 "menul.l"
+return LOCKED;
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 77 "menul.l"
+return SERVER;
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 78 "menul.l"
+return SMS;
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 79 "menul.l"
+return NODE;
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 80 "menul.l"
+return SUITE;
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 81 "menul.l"
+return FAMILY;
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 82 "menul.l"
+return TASK;
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 83 "menul.l"
+return EVENT;
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 84 "menul.l"
+return LIMIT;
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 85 "menul.l"
+return LABEL;
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 86 "menul.l"
+return METER;
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 87 "menul.l"
+return VARIABLE;
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 88 "menul.l"
+return REPEAT;
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 89 "menul.l"
+return ALIAS;
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 90 "menul.l"
+return MIGRATED;
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 91 "menul.l"
+return HAS_TRIGGERS;
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 92 "menul.l"
+return HAS_TIME;
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 93 "menul.l"
+return HAS_DATE;
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 94 "menul.l"
+return HAS_TEXT;
+	YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 95 "menul.l"
+return IS_ZOMBIE;
+	YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 96 "menul.l"
+return SEPARATOR;
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 97 "menul.l"
+return DEFAULT_YES;
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 98 "menul.l"
+return DEFAULT_NO;
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 99 "menul.l"
+return WINDOW;
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 100 "menul.l"
+return PLUG;
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 101 "menul.l"
+return COMP;
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 102 "menul.l"
+return SELECTION;
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 104 "menul.l"
+return USER;
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 105 "menul.l"
+return OPER;
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 106 "menul.l"
+return ADMIN;
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 108 "menul.l"
+{ BEGIN LOGFILE; }
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 109 "menul.l"
+{ return JUNK; }
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 110 "menul.l"
+{ return JUNK; } 
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 111 "menul.l"
+{ return JUNK; } 
+	YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 112 "menul.l"
+{ return JUNK; } 
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 113 "menul.l"
+{ ECHO; BEGIN LOGFILE; }
+	YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 114 "menul.l"
+{ ECHO; BEGIN LOGFILE; }
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 115 "menul.l"
+{ ECHO; BEGIN LOGFILE; } 
+	YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 116 "menul.l"
+{ ECHO; BEGIN LOGFILE; } 
+	YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 117 "menul.l"
+{ ECHO; BEGIN LOGFILE; } 
+	YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 119 "menul.l"
+{ }
+	YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 120 "menul.l"
+{  return JUNK; }
+	YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 121 "menul.l"
+{  return JUNK; }
+	YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 122 "menul.l"
+{  return JUNK; }
+	YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 123 "menul.l"
+{  return JUNK; }
+	YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 125 "menul.l"
+ECHO;
+	YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 126 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 127 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 128 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 129 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 132 "menul.l"
+return IDENT;
+	YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 134 "menul.l"
+{
+		int c,q = yytext[0];
+		yyleng = 0;
+		while((c = yyinput()) && c != q && c != '\n')
+		  if(c == '\\') {
+		    yytext[yyleng++] = c;
+		    yytext[yyleng++] = yyinput();
+		  } else 
+                    yytext[yyleng++] = c;
+		yytext[yyleng++] = 0;
+                return STRING;
+	    }
+	YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 147 "menul.l"
+{
+		int c,q = yytext[0];
+		yyleng = 0;
+		while((c = yyinput()) && c != q && c != '\n')
+		  if(c == '\\') {
+		    yytext[yyleng++] = c;
+		    yytext[yyleng++] = yyinput();
+		  } else 
+                    yytext[yyleng++] = c;
+		yytext[yyleng++] = 0;
+                return STRING;
+	    }
+	YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 159 "menul.l"
+{ ECHO; return COMPLETE; }
+	YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 160 "menul.l"
+{ ECHO; return QUEUED; }
+	YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 161 "menul.l"
+{ ECHO; return ACTIVE; }
+	YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 162 "menul.l"
+{ ECHO; return METER; }
+	YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 163 "menul.l"
+{ ECHO; return EVENT; }
+	YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 164 "menul.l"
+{ return UNKNOWN; }
+	YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 165 "menul.l"
+{ ECHO; return SUBMITTED; }
+	YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 166 "menul.l"
+{ ECHO; return ABORTED; }
+	YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 167 "menul.l"
+{ ECHO; return SET; }
+	YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 168 "menul.l"
+{ ECHO; return CLEAR; }
+	YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 169 "menul.l"
+{ ECHO; return CANCEL; }
+	YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 171 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 172 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 173 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 174 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 175 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 176 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 177 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 178 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 179 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 180 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 181 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 182 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 183 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 184 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 185 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 186 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 187 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 188 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 189 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 190 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 191 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 192 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 193 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 194 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 195 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 196 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 197 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 198 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 199 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 200 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 201 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 202 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 203 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 204 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 205 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 206 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 207 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 208 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 209 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 210 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 211 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 212 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 213 "menul.l"
+{ ECHO; return JUNK; }
+	YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 215 "menul.l"
+;
+	YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 216 "menul.l"
+;
+	YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 217 "menul.l"
+{ return JUNK; }
+	YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 218 "menul.l"
+{ return JUNK; }
+	YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 220 "menul.l"
+{ ECHO; return NUMBER; }
+	YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 221 "menul.l"
+{ ECHO; return IDENT;}
+	YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 222 "menul.l"
+{ ECHO; return NODE_NAME;}
+	YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 223 "menul.l"
+ECHO;
+	YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 224 "menul.l"
+{ ECHO; return *yytext; }
+	YY_BREAK
+case 134:
+YY_RULE_SETUP
+#line 225 "menul.l"
+;
+	YY_BREAK
+case 135:
+YY_RULE_SETUP
+#line 226 "menul.l"
+return *yytext;
+	YY_BREAK
+case 136:
+/* rule 136 can match eol */
+YY_RULE_SETUP
+#line 227 "menul.l"
+{ BEGIN INITIAL; NEWLINE; }
+	YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 228 "menul.l"
+{ return ANY; }
+	YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 230 "menul.l"
+
+	YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 231 "menul.l"
+ECHO;
+	YY_BREAK
+#line 2244 "<stdout>"
+			case YY_STATE_EOF(INITIAL):
+			case YY_STATE_EOF(LOGFILE):
+				yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = (yy_hold_char);
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state(  );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++(yy_c_buf_p);
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = (yy_c_buf_p);
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer(  ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				(yy_did_buffer_switch_on_eof) = 0;
+
+				if ( yywrap( ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+	else
+		{
+			int num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), (size_t) num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	if ( (yy_n_chars) == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart(yyin  );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+		/* Extend the array by 50%, plus the number we really need. */
+		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
+		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+	}
+
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+    
+	yy_current_state = (yy_start);
+	yy_current_state += YY_AT_BOL();
+
+	(yy_state_ptr) = (yy_state_buf);
+	*(yy_state_ptr)++ = yy_current_state;
+
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 801 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		*(yy_state_ptr)++ = yy_current_state;
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+	register int yy_is_jam;
+    
+	register YY_CHAR yy_c = 1;
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 801 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 800);
+	if ( ! yy_is_jam )
+		*(yy_state_ptr)++ = yy_current_state;
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+    static void yyunput (int c, register char * yy_bp )
+{
+	register char *yy_cp;
+    
+    yy_cp = (yy_c_buf_p);
+
+	/* undo effects of setting up yytext */
+	*yy_cp = (yy_hold_char);
+
+	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = (yy_n_chars) + 2;
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+		register char *source =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+    if ( c == '\n' ){
+        --yylineno;
+    }
+
+	(yytext_ptr) = yy_bp;
+	(yy_hold_char) = *yy_cp;
+	(yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+	int c;
+    
+	*(yy_c_buf_p) = (yy_hold_char);
+
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			/* This was really a NUL. */
+			*(yy_c_buf_p) = '\0';
+
+		else
+			{ /* need more input */
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
+
+			switch ( yy_get_next_buffer(  ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart(yyin );
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap( ) )
+						return EOF;
+
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					(yy_c_buf_p) = (yytext_ptr) + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve yytext */
+	(yy_hold_char) = *++(yy_c_buf_p);
+
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
+		   
+    yylineno++;
+;
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void yyrestart  (FILE * input_file )
+{
+    
+	if ( ! YY_CURRENT_BUFFER ){
+        yyensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            yy_create_buffer(yyin,YY_BUF_SIZE );
+	}
+
+	yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+	yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		yypop_buffer_state();
+	 *		yypush_buffer_state(new_buffer);
+     */
+	yyensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	yy_load_buffer_state( );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state  (void)
+{
+    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
+{
+	YY_BUFFER_STATE b;
+    
+	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2  );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	yy_init_buffer(b,file );
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * 
+ */
+    void yy_delete_buffer (YY_BUFFER_STATE  b )
+{
+    
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yyfree((void *) b->yy_ch_buf  );
+
+	yyfree((void *) b  );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+    
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+	int oerrno = errno;
+    
+	yy_flush_buffer(b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then yy_init_buffer was _probably_
+     * called from yyrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+    
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void yy_flush_buffer (YY_BUFFER_STATE  b )
+{
+    	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+    	if (new_buffer == NULL)
+		return;
+
+	yyensure_buffer_stack();
+
+	/* This block is copied from yy_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from yy_switch_to_buffer. */
+	yy_load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void yypop_buffer_state (void)
+{
+    	if (!YY_CURRENT_BUFFER)
+		return;
+
+	yy_delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		yy_load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+	int num_to_alloc;
+    
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+								  
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+				
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
+
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+    
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer(b  );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
+{
+    
+	return yy_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+    
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = _yybytes_len + 2;
+	buf = (char *) yyalloc(n  );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < _yybytes_len; ++i )
+		buf[i] = yybytes[i];
+
+	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer(buf,n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		yytext[yyleng] = (yy_hold_char); \
+		(yy_c_buf_p) = yytext + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		yyleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ * 
+ */
+int yyget_lineno  (void)
+{
+        
+    return yylineno;
+}
+
+/** Get the input stream.
+ * 
+ */
+FILE *yyget_in  (void)
+{
+        return yyin;
+}
+
+/** Get the output stream.
+ * 
+ */
+FILE *yyget_out  (void)
+{
+        return yyout;
+}
+
+/** Get the length of the current token.
+ * 
+ */
+int yyget_leng  (void)
+{
+        return yyleng;
+}
+
+/** Get the current token.
+ * 
+ */
+
+char *yyget_text  (void)
+{
+        return yytext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void yyset_lineno (int  line_number )
+{
+    
+    yylineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE *  in_str )
+{
+        yyin = in_str ;
+}
+
+void yyset_out (FILE *  out_str )
+{
+        yyout = out_str ;
+}
+
+int yyget_debug  (void)
+{
+        return yy_flex_debug;
+}
+
+void yyset_debug (int  bdebug )
+{
+        yy_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+        /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from yylex_destroy(), so don't allocate here.
+     */
+
+    /* We do not touch yylineno unless the option is enabled. */
+    yylineno =  1;
+    
+    (yy_buffer_stack) = 0;
+    (yy_buffer_stack_top) = 0;
+    (yy_buffer_stack_max) = 0;
+    (yy_c_buf_p) = (char *) 0;
+    (yy_init) = 0;
+    (yy_start) = 0;
+
+    (yy_state_buf) = 0;
+    (yy_state_ptr) = 0;
+    (yy_full_match) = 0;
+    (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    yyin = stdin;
+    yyout = stdout;
+#else
+    yyin = (FILE *) 0;
+    yyout = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * yylex_init()
+     */
+    return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		yy_delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		yypop_buffer_state();
+	}
+
+	/* Destroy the stack itself. */
+	yyfree((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
+
+    yyfree ( (yy_state_buf) );
+    (yy_state_buf)  = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * yylex() is called, initialization will occur. */
+    yy_init_globals( );
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *yyalloc (yy_size_t  size )
+{
+	return (void *) malloc( size );
+}
+
+void *yyrealloc  (void * ptr, yy_size_t  size )
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void yyfree (void * ptr )
+{
+	free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 231 "menul.l"
diff --git a/ecflow_4_0_7/view/src/menul.l b/ecflow_4_0_7/view/src/menul.l
new file mode 100644
index 0000000..44af199
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menul.l
@@ -0,0 +1,230 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #11 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+%{
+#if defined(linux) || defined(mips) || defined(hpux) || defined(_AIX)
+int yylineno;
+#define NEWLINE yylineno++
+#else
+#define NEWLINE 
+#endif
+
+#undef ECHO
+/* #define ECHO printf("<%s>",yytext) */
+#define ECHO /**/
+
+/*
+on HP lex -Xa10000
+p4 edit src/menul.c src/menuy.c && cd src && lex  -t menul.l > menul.c && yacc  menuy.y && mv -f y.tab.c menuy.c && cd ../ && make menu && make prof # ./env.sh cc
+
+ecflow_client | xargs addr2line -e ecflow_client -f
+*/
+
+#if defined (linux) || defined(alpha) || defined(SVR4) || defined(SGI) || defined(_AIX)
+#define yyinput input
+#endif
+
+
+%}
+
+IDENT   [_0-9A-Za-z]+
+NUMBER  [0-9]+
+NODE    \/[_0-9A-Za-z:\/]*
+
+%option yylineno
+%array
+
+%s LOGFILE
+%e 1600
+%p 8000
+%a 15000
+%n 5000
+%o 10000
+
+%%
+
+!.*$            ;
+
+<INITIAL>version         return VERSION;
+<INITIAL>menu            return MENU;
+<INITIAL>MENU            return MENU;
+<INITIAL>NONE            return NONE;
+<INITIAL>ALL             return ALL;
+<INITIAL>UNKNOWN         return UNKNOWN;
+<INITIAL>SUSPENDED       return SUSPENDED;
+<INITIAL>COMPLETE        return COMPLETE;
+<INITIAL>QUEUED          return QUEUED;
+<INITIAL>SUBMITTED       return SUBMITTED;
+<INITIAL>ACTIVE          return ACTIVE;
+<INITIAL>ABORTED         return ABORTED;
+<INITIAL>CLEAR           return CLEAR;
+<INITIAL>SET             return SET;
+<INITIAL>SHUTDOWN        return SHUTDOWN;
+<INITIAL>HALTED          return HALTED;
+<INITIAL>LOCKED          return LOCKED;
+<INITIAL>SERVER          return SERVER;
+<INITIAL>SMS             return SMS;
+<INITIAL>NODE            return NODE;
+<INITIAL>SUITE           return SUITE;
+<INITIAL>FAMILY          return FAMILY;
+<INITIAL>TASK            return TASK;
+<INITIAL>EVENT           return EVENT;
+<INITIAL>LIMIT           return LIMIT;
+<INITIAL>LABEL           return LABEL;
+<INITIAL>METER           return METER;
+<INITIAL>VARIABLE        return VARIABLE;
+<INITIAL>REPEAT          return REPEAT;
+<INITIAL>ALIAS           return ALIAS;
+<INITIAL>MIGRATED        return MIGRATED;
+<INITIAL>HAS_TRIGGERS    return HAS_TRIGGERS;
+<INITIAL>HAS_TIME        return HAS_TIME;
+<INITIAL>HAS_DATE        return HAS_DATE;
+<INITIAL>HAS_TEXT        return HAS_TEXT;
+<INITIAL>IS_ZOMBIE       return IS_ZOMBIE;
+<INITIAL>SEPARATOR       return SEPARATOR;
+<INITIAL>YES             return DEFAULT_YES;
+<INITIAL>NO              return DEFAULT_NO;
+<INITIAL>WINDOW          return WINDOW;
+<INITIAL>PLUG            return PLUG;
+<INITIAL>COMP            return COMP;
+<INITIAL>SELECTION       return SELECTION;
+
+<INITIAL>USER            return USER;
+<INITIAL>OPER            return OPER;
+<INITIAL>ADMIN           return ADMIN;
+
+<INITIAL>^LOG:        { BEGIN LOGFILE; }
+<INITIAL>^MSG:.*$     { return JUNK; }
+<INITIAL>^DBG:.*$     { return JUNK; } 
+<INITIAL>^ERR:.*$     { return JUNK; } 
+<INITIAL>^WAR:.*$     { return JUNK; } 
+<INITIAL>^"# LOG:"     { ECHO; BEGIN LOGFILE; }
+<INITIAL>^"# MSG:"     { ECHO; BEGIN LOGFILE; }
+<INITIAL>^"# DBG:"     { ECHO; BEGIN LOGFILE; } 
+<INITIAL>^"# ERR:"     { ECHO; BEGIN LOGFILE; } 
+<INITIAL>^"# WAR:"     { ECHO; BEGIN LOGFILE; } 
+
+<LOGFILE>^LOG:     { }
+<LOGFILE>MSG:.*$     {  return JUNK; }
+<LOGFILE>DBG:.*$     {  return JUNK; }
+<LOGFILE>ERR:.*$     {  return JUNK; }
+<LOGFILE>WAR:.*$     {  return JUNK; }
+
+<LOGFILE>^"# LOG:"     ECHO;
+<LOGFILE>^"# MSG:.*$"     { ECHO; return JUNK; }
+<LOGFILE>^"# DBG:.*$"     { ECHO; return JUNK; }
+<LOGFILE>^"# ERR:.*$"     { ECHO; return JUNK; }
+<LOGFILE>^"# WAR:.*$"     { ECHO; return JUNK; }
+
+
+<INITIAL>{IDENT}     return IDENT;
+
+<INITIAL>\" {
+		int c,q = yytext[0];
+		yyleng = 0;
+		while((c = yyinput()) && c != q && c != '\n')
+		  if(c == '\\') {
+		    yytext[yyleng++] = c;
+		    yytext[yyleng++] = yyinput();
+		  } else 
+                    yytext[yyleng++] = c;
+		yytext[yyleng++] = 0;
+                return STRING;
+	    }
+
+<INITIAL>\' {
+		int c,q = yytext[0];
+		yyleng = 0;
+		while((c = yyinput()) && c != q && c != '\n')
+		  if(c == '\\') {
+		    yytext[yyleng++] = c;
+		    yytext[yyleng++] = yyinput();
+		  } else 
+                    yytext[yyleng++] = c;
+		yytext[yyleng++] = 0;
+                return STRING;
+	    }
+<LOGFILE>complete:       { ECHO; return COMPLETE; }
+<LOGFILE>queued:         { ECHO; return QUEUED; }
+<LOGFILE>active:         { ECHO; return ACTIVE; }
+<LOGFILE>command:Meter   { ECHO; return METER; }
+<LOGFILE>command:Event   { ECHO; return EVENT; }
+<LOGFILE>unknown:        { return UNKNOWN; }
+<LOGFILE>submitted:      { ECHO; return SUBMITTED; }
+<LOGFILE>aborted:        { ECHO; return ABORTED; }
+<LOGFILE>set:            { ECHO; return SET; }
+<LOGFILE>clear:          { ECHO; return CLEAR; }
+<LOGFILE>cancel:         { ECHO; return CANCEL; }
+
+<LOGFILE>command:.*$              { ECHO; return JUNK; }
+<LOGFILE>check:.*$                { ECHO; return JUNK; }
+<LOGFILE>checkpoint:.*$           { ECHO; return JUNK; }
+<LOGFILE>label:.*$                { ECHO; return JUNK; }
+<LOGFILE>abort:.*$                { ECHO; return JUNK; }
+<LOGFILE>midnight:.*$             { ECHO; return JUNK; }
+<LOGFILE>"autorepeat date":.*$    { ECHO; return JUNK; }
+<LOGFILE>autocancel:.*$           { ECHO; return JUNK; }
+<LOGFILE>run:.*$                  { ECHO; return JUNK; }
+<LOGFILE>order:.*$                { ECHO; return JUNK; }
+<LOGFILE>login:.*$                { ECHO; return JUNK; }
+<LOGFILE>logout:.*$               { ECHO; return JUNK; }
+<LOGFILE>recover:.*$              { ECHO; return JUNK; }
+<LOGFILE>resubmit:.*$             { ECHO; return JUNK; }
+<LOGFILE>requeue:.*$              { ECHO; return JUNK; }
+<LOGFILE>suspend:.*$              { ECHO; return JUNK; }
+<LOGFILE>resume:.*$               { ECHO; return JUNK; }
+<LOGFILE>timeout:.*$              { ECHO; return JUNK; }
+<LOGFILE>dir:.*$                  { ECHO; return JUNK; }
+<LOGFILE>send:.*$                 { ECHO; return JUNK; }
+<LOGFILE>send(.*):.*$             { ECHO; return JUNK; }
+<LOGFILE>time:.*$                 { ECHO; return JUNK; }
+<LOGFILE>manual:.*$               { ECHO; return JUNK; }
+<LOGFILE>file:.*$                 { ECHO; return JUNK; }
+<LOGFILE>editfile:.*$             { ECHO; return JUNK; }
+<LOGFILE>edit:.*$                 { ECHO; return JUNK; }
+<LOGFILE>translate:.*$            { ECHO; return JUNK; }
+<LOGFILE>force:.*$                { ECHO; return JUNK; }
+<LOGFILE>force(.*):.*$            { ECHO; return JUNK; }
+<LOGFILE>play:.*$                 { ECHO; return JUNK; }
+<LOGFILE>begin:.*$                { ECHO; return JUNK; }
+<LOGFILE>late:.*$                 { ECHO; return JUNK; }
+<LOGFILE>delete:.*$               { ECHO; return JUNK; }
+<LOGFILE>alter:.*$                { ECHO; return JUNK; }
+<LOGFILE>event:.*$                { ECHO; return JUNK; }
+<LOGFILE>setev:.*$                { ECHO; return JUNK; }
+<LOGFILE>dependencies:.*$         { ECHO; return JUNK; }
+<LOGFILE>time-used:.*$          { ECHO; return JUNK; }
+<LOGFILE>PID.*$                 { ECHO; return JUNK; }
+<LOGFILE>--force.*$          { ECHO; return JUNK; }
+<LOGFILE>--ping.*$          { ECHO; return JUNK; }
+<LOGFILE>--news.*$          { ECHO; return JUNK; }
+<LOGFILE>svr:.*$          { ECHO; return JUNK; }
+
+<LOGFILE>" <--- still suspended"              ;
+<LOGFILE>" by rule"                           ;
+<LOGFILE>command:.*$                { return JUNK; }
+<LOGFILE>try-no.*$                  { return JUNK; }
+
+<LOGFILE>{NUMBER}     { ECHO; return NUMBER; }
+<LOGFILE>{IDENT}      { ECHO; return IDENT;}
+<LOGFILE>{NODE}       { ECHO; return NODE_NAME;}
+<LOGFILE>[ \t]        ECHO;
+<LOGFILE>.            { ECHO; return *yytext; }
+<INITIAL>[ \t]         ;
+<INITIAL>.            return *yytext;
+\n                    { BEGIN INITIAL; NEWLINE; }
+<LOGFILE>job_size:.*$          { return ANY; }
+
+%
diff --git a/ecflow_4_0_7/view/src/menus.cc b/ecflow_4_0_7/view/src/menus.cc
new file mode 100644
index 0000000..c4f6296
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menus.cc
@@ -0,0 +1,796 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef menus_H
+#include "menus.h"
+#endif
+
+#ifndef selection_H
+#include "selection.h"
+#endif
+
+#ifndef flags_H
+#include "flags.h"
+#endif
+
+#ifndef tip_H
+#include "tip.h"
+#endif
+
+#ifndef xec_H
+#include "xec.h"
+#endif
+
+#ifndef collector_H
+#include "collector.h"
+#endif
+
+#ifndef confirm_H
+#include "confirm.h"
+#endif
+
+#ifndef panel_window_H
+#include "panel_window.h"
+#endif
+
+#ifndef parser_H
+#include "parser.h"
+#endif
+
+#ifndef directory_H
+#include "directory.h"
+#endif
+
+#include "log_event.h"
+
+#include <unistd.h>
+#include <fstream>
+#include <iostream>
+
+#include <Xm/Label.h>
+#include <Xm/PushB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Separator.h>
+#include <Xm/CascadeBG.h>
+#include <Xm/PushBG.h>
+#include <Xm/SeparatoG.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/RowColumnP.h>
+
+extern "C"
+{
+#include "xec.h"
+}
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+#ifndef host_H
+#include "host.h"
+#endif
+
+#include "ecflowview.h"
+#undef  XECFDEBUG
+#define XECFDEBUG if(0)
+#define MENU_REL 1
+#define MENU_MAJ 0
+#define MENU_MIN 0
+
+#define NUM_MENUS 2
+static Widget cmd_menu_popup[NUM_MENUS] = { 0, 0, };
+static Widget cmd_menu_name[NUM_MENUS] = { 0, 0, };
+
+static char* defaultMenu[] = {
+#include "ecflowview.menu.h"
+};
+
+static char* xcdpMenu[] = {
+#include "xcdp.menu.h"
+};
+
+/* #define YYDEBUG 1 */
+
+class node;
+class item;
+#include <string>
+class menu {
+  friend int script_menus(node*, const char *cmd);
+	static menu *root_[NUM_MENUS];
+        std::string name_;
+	item *item_;
+	menu *next_;
+	Widget widget_;
+        int page_;
+  static int init(int page, bool def);
+public:
+  static int num_;
+
+  menu(std::string name, item * i)
+    : name_(name), item_(i), next_(0), widget_(0), page_(num_)
+  { XECFDEBUG  printf("# menu creation: %s\n", name.c_str());
+    if (root_[page_] == NULL) root_[page_] = this; }
+
+  menu *chain(menu * n);
+  void create(Widget);
+  void update(node *);
+  void merge(item *);
+	void fill(Widget list,int depth);
+
+  static menu *find(const char *, int page=-1, bool verb=true);
+  static void root(menu *m);
+};
+
+menu *menu::chain(menu * n)
+{
+  if (n) { 
+    menu *m = menu::find(n->name_.c_str(), n->page_, false);
+    if (m) { 
+      m->merge(n->item_); delete n;
+      XECFDEBUG	printf("# menu already there (chain) %s\n", n->name_.c_str());
+    } else if (n->page_ == page_)
+      next_ = n;
+  }
+  return this;
+}
+
+void menu::root(menu *m) {
+  if (root_[num_] == NULL) root_[num_] = m;
+  else if (m) { 
+    menu *men = menu::find(m->name_.c_str(), m->page_);
+    XECFDEBUG { 
+      if (!men) printf("# menu chained %s\n", m->name_.c_str());
+      else	  printf("# menu already there %s\n", m->name_.c_str()); }
+  }
+}
+
+class action {
+protected:
+  Widget widget_;
+  item*  item_;
+  
+  action() : widget_(0),item_(0) {}
+public:
+  virtual ~action() {}
+  void owner(item* i) { item_ = i; }
+  
+  virtual void create(Widget, item *) = 0;
+  virtual void fill(Widget, int) {}
+  
+  Widget widget() { return widget_; }
+  virtual void run(node *) { }
+};
+
+class command : public action {
+  char *name_;
+  virtual void create(Widget, item *);
+public:
+  command(char *name): name_(name) { }
+  virtual void run(node *);
+};
+
+class window_cmd : public action {
+  char *name_;
+  virtual void create(Widget, item *);
+public:
+  window_cmd(char *name): name_(name) { }
+  virtual void run(node *);
+};
+
+typedef void (*nodeproc)(node*);
+typedef void (*nodeproc_a_b)(node*, const char* a, const char* b);
+
+class internal: public action {	
+  nodeproc proc_;
+  virtual void create(Widget, item *);
+public:
+  internal(nodeproc p): proc_(p) { }
+  virtual void run(node *);
+};
+
+class internal_a_b: public action {	
+  nodeproc_a_b proc_;
+  const std::string a_, b_;
+  virtual void create(Widget, item *);
+public:
+  internal_a_b(nodeproc_a_b p, const char* a, const char*b)
+  : proc_(p) 
+  , a_(a)
+  , b_(b)
+  { }
+  virtual void run(node *);
+};
+
+
+class sub_menu : public action {
+        virtual void create(Widget, item *);
+	virtual void fill(Widget, int);
+public:
+	sub_menu() { }
+};
+
+class separator : public action {
+  virtual void create(Widget, item *);
+};
+
+menu *menu::root_[NUM_MENUS] = { 0, 0, };
+
+class item {
+public:
+  item    *next_;
+private:
+  friend int script_menus(node*, const char *cmd);
+  flags   *visible_;
+  flags   *enabled_;
+  char    *title_;
+  action  *action_;
+  char    *question_;
+  Boolean answer_;
+  int     page_;
+
+public:
+
+  int page() const { return page_; }
+
+  item(flags * visible,flags * enabled,
+       char *title, action * action, char *question, Boolean answer)
+    : next_(0), visible_(visible), enabled_(enabled)	
+    , title_(title), action_(action), question_(question)
+    , answer_(answer), page_(menu::num_)
+  { if(action_) action_->owner(this); }
+
+  void update(node *);
+  
+  void create(Widget parent)
+  {
+    action_->create(parent, this);
+    if(next_) 
+      next_->create(parent);
+  }
+  
+  item *chain(item * n)
+  {
+    if (n->page_ == page_)
+      next_ = n;
+    return this;
+  }
+  
+  char *title() { return title_; }
+  
+  item *find(const char* name);
+  
+  void run(node * n)
+  {
+    str question = n->substitute(question_);
+    if(question_[0] == 0 || confirm::ask(answer_,question))
+      action_->run(n);
+  }
+  
+  void fill(Widget list,int depth)
+  {
+    XECFDEBUG printf("# item::fill %p %d\n",list,depth);
+    char buf[1024];
+    memset(buf,' ',depth);
+    sprintf(buf+depth,"%s",title_);
+    xec_AddListItem(list,buf);
+    action_->fill(list,depth);
+    if(next_) 	   
+      next_->fill(list,depth);
+  }
+};
+
+item* item::find(const char* title)
+{
+  for (item* run=this; run; run=run->next_)
+    if (!strcmp(run->title(),title)) return run;
+  return 0;
+}
+
+menus::menus()
+{
+}
+
+menus::~menus()
+{
+}
+
+void menus::write()
+{
+  int lineno = 0;
+  char *line;
+  std::ofstream outfile;
+  std::string fname = directory::user() + std::string("/ecflowview.menu");
+  outfile.open(fname.c_str());
+  std::cerr << "# creating menu file " << fname << "\n";
+  while ((line = defaultMenu[lineno])) {
+    outfile << line << "\n";
+    lineno++;
+  } 
+}
+
+void menus::fillList(Widget list)
+{
+  XECFDEBUG printf("# menus::fill %p\n",list);
+  menu *m = menu::find("MAIN"); if(m) m->fill(list,0);
+}
+
+void menu::fill(Widget list,int depth)
+{
+  item_->fill(list,depth);
+}
+
+void menus::show(Widget parent, XEvent * event_node, node * n)
+{
+
+  if (parent==NULL) fprintf(stderr, "menus::show null widget\n");
+	if(n == 0 || !n->menus())
+	{
+		selection::menu_node(0);
+		return;
+	}
+
+	selection::menu_node(n);
+	int page = n->__node__() ? 0 : 1;
+
+	if(cmd_menu_popup[page] == 0)
+	{
+		cmd_menu_popup[page] = XmCreatePopupMenu(parent, "cmd_menu_popup", 0, 0);
+		cmd_menu_name[page] = XmCreateLabel(cmd_menu_popup[page], "name", 0, 0);
+		Widget w = XmCreateSeparator(cmd_menu_popup[page], "-", 0, 0);
+
+		XtManageChild(cmd_menu_name[page]);
+		XtManageChild(w);
+
+		XtAddCallback(cmd_menu_popup[page], XmNentryCallback, menus::entryCB, 0);
+		tip::makeTips(cmd_menu_popup[page]);
+	}
+
+	menu *m = menu::find("MAIN", page);
+	if(m)
+	{
+	  m->create(cmd_menu_popup[page]);
+	  m->update(n);
+	}
+
+	xec_VaSetLabel(cmd_menu_name[page], "%s %s",n->type_name(),n->node_name().c_str());
+	xec_SetColor(cmd_menu_name[page], n->color(), XmNbackground);
+
+	XmMenuPosition(cmd_menu_popup[page],(XButtonPressedEvent *) event_node);
+	XtManageChild(cmd_menu_popup[page]);
+
+}
+
+int menu::num_ = 0;
+
+int menus::version(int rel, int maj, int min) {
+  if (rel > MENU_REL || (rel == MENU_REL && maj > MENU_MAJ)) {
+    std::cerr << "# menus definition file(s) shall be upgraded\n";
+    std::cerr << "# app  is " 
+	      << MENU_REL << " " 
+	      << MENU_MAJ << " " 
+	      << MENU_MIN;
+    std::cerr << "\n# file is " << rel << " " << maj << " " << min;
+    std::cerr << "\n";
+
+    return 1;
+  } // else { std::cout << "# menus version compatible " << rel << " " << maj << " " << min << "\n"; }
+  return 0;
+}
+
+int menu::init(int page, bool def) {
+#ifndef BRIDGE
+  page = 0;
+#endif
+  const char* name = page ? "xcdp.menu" : "ecflowview.menu";
+  bool  read = false;
+  num_ = page;
+  /* 0: ecflowview menu
+     1: xcdp       menu
+
+     system\user 0   1
+     0          tmp  user
+     1          sys  both, user overwrites
+  */
+  std::string path = directory::user();
+  path += "/";
+  path += name;
+  const char* fname = path.c_str();
+  if(!def && !access(fname,F_OK)) { 
+    std::cout << "# reading menu file: " << fname << "\n";
+    parser::parse(fname); 
+    read = true; 
+  } else std::cerr << "# menu file not found: " << fname << "\n";
+ 
+  path = directory::system();
+  path += "/";
+  path += name;
+  fname = path.c_str();
+
+  if (!def && !access(fname,F_OK)) {
+    std::cout << "# reading menu file: " << fname << "\n";
+    parser::parse(fname); 
+    read = true; 
+  } else std::cerr << "# menu file not found: " << fname << "\n";
+
+  if(!read) {
+    char* tmp = getenv("TMPDIR");
+    path = tmp ? tmp : "/tmp";
+    path += "/";
+    path += name;
+    fname = path.c_str();
+
+    // if(access(fname,F_OK)) /* create if not already there */
+    { /* create always */
+      std::cerr << "# creating menu file " << fname << "\n";
+      std::ofstream outfile;
+      outfile.open(fname);
+      int lineno = 0;
+      char *line;
+      while ((line = (page ? xcdpMenu[lineno] : defaultMenu[lineno]))) {
+	outfile << line << "\n";
+	lineno++;
+      } 
+      outfile.close();
+    }
+    std::cout << "# menu file read: " << fname << "\n";
+    parser::parse(fname);
+  }
+  return TRUE;
+}
+
+menu *menu::find(const char *name, int page, bool verb)
+{
+#ifndef BRIDGE
+  page = 0;
+#endif
+  if (page >= NUM_MENUS || page < 0) page = 0;
+
+  if(root_[page] == NULL) init(page, false);  
+  if(root_[page] == NULL) init(page, true);  
+  menu *m = root_[page];
+  while(m) {
+    if(m->name_ == name)
+      return m;
+    m = m->next_;
+  }
+  if (verb) printf("# Cannot find menu called %s\n", name);
+  return 0;
+}
+
+void menu::create(Widget parent)
+{
+  widget_ = parent;
+  XECFDEBUG printf("# menu::create %p %p\n",widget_,parent);
+  if(item_) 
+      item_->create(parent);
+  tip::makeTips(parent);
+}
+
+void sub_menu::create(Widget parent, item * i)
+{
+  if(widget_ == 0) {
+    Arg arg;
+    Widget sub = XmCreatePulldownMenu(parent, i->title(), 0, 0);
+    menu *m = menu::find(i->title(), i->page());
+    if(m) 
+	m->create(sub);
+    XtSetArg(arg, XmNsubMenuId, sub);
+    widget_ = XmCreateCascadeButtonGadget(parent, i->title(), &arg, 1);
+    XtManageChild(widget_);
+    xec_SetUserData(widget_, i);
+    XtAddCallback(sub, XmNentryCallback, menus::entryCB, 0);
+  }
+}
+
+void sub_menu::fill(Widget list,int depth)
+{
+  menu *m = menu::find(item_->title(), item_->page());
+  if(m) 
+    m->fill(list,depth+3);
+}
+
+void command::create(Widget parent, item * i)
+{
+  if(widget_ == 0) {
+    widget_ = XmCreatePushButtonGadget(parent, i->title(), 0, 0);
+    XtManageChild(widget_);
+    xec_SetUserData(widget_, i);
+  }
+}
+
+void window_cmd::create(Widget parent, item * i)
+{
+  if(widget_ == 0) {
+    widget_ = XmCreatePushButtonGadget(parent, i->title(), 0, 0);
+    XtManageChild(widget_);
+    xec_SetUserData(widget_, i);
+  }
+}
+
+void internal::create(Widget parent, item * i)
+{
+  if(widget_ == 0) {
+    widget_ = XmCreatePushButtonGadget(parent, i->title(), 0, 0);
+    XtManageChild(widget_);
+    xec_SetUserData(widget_, i);
+  }
+}
+
+void internal_a_b::create(Widget parent, item * i) /* internal:: */
+{
+  if(widget_ == 0) {
+    widget_ = XmCreatePushButtonGadget(parent, i->title(), 0, 0);
+    XtManageChild(widget_);
+    xec_SetUserData(widget_, i);
+  }
+}
+
+void separator::create(Widget parent, item * i)
+{
+  if(widget_ == 0) {
+    widget_ = XmCreateSeparatorGadget(parent, "-", 0, 0);
+    XtManageChild(widget_);
+    xec_SetUserData(widget_, i);
+  }
+}
+
+void menu::update(node * n)
+{
+  if(item_) item_->update(n);
+  if(next_) next_->update(n);
+  if(!widget_) return;
+  
+  int    cnt  = 0;
+  Widget last = 0;
+  
+  CompositeWidget c = CompositeWidget(widget_);
+  
+  XECFDEBUG printf("# menu::update %d\n",c->composite.num_children);
+  
+  for(unsigned i = 0 ; i < c->composite.num_children; i++)
+    {
+      Widget p = c->composite.children[i];
+      if(!XtIsManaged(p)) continue;
+
+      XECFDEBUG printf("#    %s ",XtName(p));
+      
+      if(XtName(p)[0] == '-')
+	{
+	  XtUnmanageChild(p);
+	  last = p;
+	  XECFDEBUG printf("# sep\n");
+	}
+      else
+	{
+	  if(last)
+	    {
+	      XECFDEBUG printf("# (%d) ",cnt);
+	      if(cnt) XtManageChild(last);
+	      cnt  = 0;
+	      last = 0;
+	    }
+	  cnt++;
+	  XECFDEBUG printf("# %d\n",cnt);
+	}
+    }
+  XECFDEBUG printf("# menu::update\n");
+}
+
+void item::update(node * n)
+{
+  if(!action_->widget())
+    return;
+  int page = n->__node__() ? 0 : 1;
+#ifndef BRIDGE
+  page = 0;
+#endif
+  if (page_ != page) XtUnmanageChild(action_->widget()); else
+  if(visible_->eval(n))
+    XtManageChild(action_->widget());
+  else
+    XtUnmanageChild(action_->widget());
+  
+  XtSetSensitive(action_->widget(),enabled_->eval(n));
+  
+  if(next_) next_->update(n);
+}
+
+void menus::entryCB(Widget w, XtPointer, XtPointer cb_data)
+{
+  XmRowColumnCallbackStruct *cb =(XmRowColumnCallbackStruct *) cb_data;
+  item *i =(item *) xec_GetUserData(cb->widget);
+  if(i && selection::menu_node())
+    i->run(selection::menu_node());
+}
+
+void command::run(node* n)
+{
+  n->command(name_);
+}
+
+void window_cmd::run(node* n)
+{
+  if (n != 0 && strncmp("Collect", name_, 7) == 0) collector::show(*n); else
+  panel_window::new_window(n,name_,true,true);
+}
+
+void internal::run(node* n)
+{
+  proc_(n);
+}
+
+void internal_a_b::run(node* n)
+{
+  proc_(n, a_.c_str(), b_.c_str());
+}
+
+void  menus::root(menu* m)
+{
+  menu::root(m);
+}
+
+menu* menus::chain(menu* a,menu* b)
+{
+  return a->chain(b);
+}
+
+item* menus::chain(item* a,item* b)
+{
+  return a->chain(b);
+}
+
+menu* menus::create(char* a,item* b)
+{
+  XECFDEBUG printf("# create menus %s\n", a);
+  return new menu(a,b);
+}
+
+item* menus::create(flags* a,flags* b,char* c,action* d,char* e,bool f)
+{
+  XECFDEBUG printf("# create item %d %d %s %s %d\n", 
+		   a->eval(0) ? 1 : 0, b->eval(0) ? 1 : 0,
+		   c, e, f ? 1:0);
+  return new item(a,b,c,d,e,f);
+}
+
+action* menus::command(char* a)
+{
+  return new ::command(a);
+}
+
+action* menus::separator()
+{
+  return new ::separator();
+}
+
+action* menus::sub_menu()
+{
+  return new ::sub_menu();
+}
+
+action* menus::window(char* a)
+{
+  return new ::window_cmd(a);
+}
+
+action* menus::internal(nodeproc a)
+{
+  return new ::internal(a);
+}
+
+action* menus::internal_a_b(nodeproc_a_b a, const char*b, const char *c)
+{
+  return new ::internal_a_b(a, b, c);
+}
+
+void menu::merge(item *i) {
+  if (!i) return; 
+  /* menu is old original menu, 
+     its items are moved away, 
+     new items take place
+     only the old items not found are kept */
+  if (!item_) { item_ = i; return; }
+  item *run, *next, *old = item_, *last = i; 
+  while (last->next_) { last = last->next_; }
+  item_ = i; 
+  for (run = old; run; ) {
+    next = run->next_; run->next_ = 0;
+    if (!item_->find(run->title())) { last->next_ = run; last = run; }
+    run = next;
+  }
+  last->next_ = 0;
+}
+
+extern "C" {
+// The stuff is here because in some os, lex and yacc are broken with c++
+
+int   menus_version(int rel, int maj, int min) { return menus::version(rel, maj, min); }
+menu* menus_chain_menus(menu *a,menu *b) { return menus::chain(a,b); }
+item* menus_chain_items(item *a,item *b) { return menus::chain(a,b); }
+void  menus_root(menu *m)                { menus::root(m); }
+menu* menus_create_2(char* a,item* b)    { return menus::create(a,b); }
+item* menus_create_6(flags* a,flags* b,char* c,action* d,char* e,int f)
+  { return menus::create(a,b,c,d,e,f); }
+
+action* menus_command(char* a) { return  menus::command(a); }
+action* menus_window(char* a)  { return  menus::window(a); }
+action* menus_separator()      { return  menus::separator(); }
+action* menus_sub_menu()       { return  menus::sub_menu(); }
+
+flags* new_flagNone()                  { return new flagNone(); }
+flags* new_typeFlag(int a)             { return new typeFlag(a); }
+flags* new_flagNot(flags* a)           { return new flagNot(a); }
+flags* new_flagOr(flags* a,flags* b)   { return new flagOr(a,b); }
+flags* new_flagAnd(flags* a,flags* b)  { return new flagAnd(a,b); }
+
+flags* new_flagAll()                   { return new flagAll(); }
+flags* new_eventFlag(int a)            { return new eventFlag(a); }
+flags* new_selectionFlag()             { return new selectionFlag(); }
+flags* new_statusFlag(int a)           { return new statusFlag(a); }
+flags* new_userFlag(int a)             { return new userFlag(a); }
+
+flags* new_procFlag_node_hasTriggers() { return new procFlag(&node::hasTriggers); }
+flags* new_procFlag_node_hasDate() { return  new procFlag(&node::hasDate); }
+flags* new_procFlag_node_hasTime() { return  new procFlag(&node::hasTimeHolding); }
+flags* new_procFlag_node_isMigrated() { return new procFlag(&node::isMigrated); }
+flags* new_procFlag_node_isLocked() { return  new procFlag(&node::isLocked); }
+flags* new_procFlag_node_hasText() { return  new procFlag(&node::hasText); }
+flags* new_procFlag_node_isZombie() { return  new procFlag(&node::isZombie); }
+
+action* menus_internal_host_plug()  { return menus::internal(&host::plug); }
+action* menus_internal_host_comp(const char*a, const char*b)  { 
+  return menus::internal_a_b(&host::comp, a, b); }
+
+void log_event_meter_event(const DateTime& a,node* b,int c) { 
+  log_event::meter_event(a,b,c); }
+void log_event_event_event(const DateTime& a,node* b,int c) { 
+  log_event::event_event(a,b,c); }
+void log_event_status_event(const DateTime& a,node* b,int c) { 
+  log_event::status_event(a,b,c); }
+const node *log_event_find(char* a) { return log_event::find(a); }
+}
+
+int script_menus(node*, const char *cmd)
+{
+  menu *m = menu::find("MAIN");
+  if (!m) { std::cerr << "# no menu available!"; return 1; }
+  node *n = selection::current_node();
+  const char* arg = cmd + 5;
+  unsigned int size = arg? strlen(arg) : 0;
+  if (!n) { std::cerr << "# no node selected!"; return 1; }
+  while (m) {
+    item *i = m->item_;
+    while (i) {
+      if (i->visible_ && i->visible_->eval(n)) {
+	if (i->enabled_ && i->enabled_->eval(n)) {
+	  if (i->action_) {
+	    if (size && !strncasecmp(arg, i->title_, size)) {
+	      std::cout << "# cmd issued:   " << i->title_ << "\n";
+	      i->action_->run(n);
+	    } else 
+	      std::cout << "# item:         " << i->title_ << "\n";
+	  } else
+	    std::cout << "# item enabled: " << i->title_ << "\n";
+	} else
+	  std::cout <<   "# item visible: " << i->title_ << "\n";      
+      }
+      i = i->next_;
+    }
+    m = m->next_;
+  }
+
+  return 0;
+}
+
diff --git a/ecflow_4_0_7/view/src/menus.h b/ecflow_4_0_7/view/src/menus.h
new file mode 100644
index 0000000..1217a7c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menus.h
@@ -0,0 +1,73 @@
+#ifndef menus_H
+#define menus_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#include <Xm/Xm.h>
+
+class node;
+class menu;
+class item;
+class action;
+class flags;
+
+class menus {
+public:
+
+	menus();
+	~menus(); // Change to virtual if base class
+
+	static void entryCB(Widget,XtPointer,XtPointer);
+
+	static void show(Widget,XEvent*,node*);
+
+	static void  root(menu*);
+	static menu* chain(menu*,menu*);
+	static item* chain(item*,item*);
+	static menu* create(char*,item*);
+	static item* create(flags*,flags*,char*,action*,char*,bool);
+	static action* command(char*);
+	static action* separator();
+	static action* sub_menu();
+	static action* internal( void (*)(node*) );
+	static action* internal_a_b( void (*)(node*, const char*, const char*),
+                                     const char *a, const char *b);
+	static action* window(char*);
+
+	static void  install(Widget,const char*);
+
+	static void fillList(Widget); 
+
+	static void realize();
+	static void write();
+
+	static int version(int rel, int maj, int min);
+
+private:
+
+	menus(const menus&);
+	menus& operator=(const menus&);
+};
+
+inline void destroy(menus**) {}
+
+int script_menus(node*, const char *cmd);
+
+#endif
diff --git a/ecflow_4_0_7/view/src/menuy.c b/ecflow_4_0_7/view/src/menuy.c
new file mode 100644
index 0000000..56ed1a9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menuy.c
@@ -0,0 +1,2428 @@
+
+/* A Bison parser, made by GNU Bison 2.4.1.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.4.1"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+
+
+/* Copy the first part of user declarations.  */
+
+/* Line 189 of yacc.c  */
+#line 16 "menuy.y"
+
+#include "lexyacc.h"
+#include "ecflow.h"
+int yyone = 0;
+extern int yylineno;
+
+#ifdef __cplusplus
+ void yylex(void);
+#endif
+
+#if defined(_AIX) 
+ extern char yytext[];
+ int yydebug;
+#elif defined(hpux) 
+ void yyerror(char * msg);
+ int yydebug;
+#elif defined(YYBISON) 
+ extern char yytext[]; /* ARRAY */
+ void yyerror(char * msg);
+ int yydebug;
+#elif defined (linux)
+ extern char yytext[];
+ void yyerror(char * msg);
+ int yydebug;
+#elif defined(alpha) || defined(SGI) 
+ extern char yytext[]; /* ARRAY */
+#elif defined(SVR4) 
+ extern char yytext[]; /* ARRAY */
+#elif defined(alpha) 
+ extern unsigned char yytext[];
+#else
+ extern char yytext[];
+ void yyerror(char * msg);
+ int yydebug;
+#endif
+
+
+/* Line 189 of yacc.c  */
+#line 111 "y.tab.c"
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     VERSION = 258,
+     MENU = 259,
+     IDENT = 260,
+     NONE = 261,
+     ALL = 262,
+     UNKNOWN = 263,
+     SUSPENDED = 264,
+     COMPLETE = 265,
+     QUEUED = 266,
+     SUBMITTED = 267,
+     ACTIVE = 268,
+     ABORTED = 269,
+     CLEAR = 270,
+     SET = 271,
+     SHUTDOWN = 272,
+     HALTED = 273,
+     LOCKED = 274,
+     MIGRATED = 275,
+     SELECTION = 276,
+     SERVER = 277,
+     SMS = 278,
+     NODE = 279,
+     SUITE = 280,
+     FAMILY = 281,
+     TASK = 282,
+     EVENT = 283,
+     LABEL = 284,
+     METER = 285,
+     REPEAT = 286,
+     VARIABLE = 287,
+     TRIGGER = 288,
+     LIMIT = 289,
+     ALIAS = 290,
+     HAS_TRIGGERS = 291,
+     HAS_TIME = 292,
+     HAS_DATE = 293,
+     HAS_TEXT = 294,
+     IS_ZOMBIE = 295,
+     SEPARATOR = 296,
+     STRING = 297,
+     DEFAULT_YES = 298,
+     DEFAULT_NO = 299,
+     WINDOW = 300,
+     PLUG = 301,
+     COMP = 302,
+     USER = 303,
+     OPER = 304,
+     ADMIN = 305,
+     NUMBER = 306,
+     JUNK = 307,
+     EOL = 308,
+     NODE_NAME = 309,
+     CANCEL = 310,
+     ANY = 311
+   };
+#endif
+/* Tokens.  */
+#define VERSION 258
+#define MENU 259
+#define IDENT 260
+#define NONE 261
+#define ALL 262
+#define UNKNOWN 263
+#define SUSPENDED 264
+#define COMPLETE 265
+#define QUEUED 266
+#define SUBMITTED 267
+#define ACTIVE 268
+#define ABORTED 269
+#define CLEAR 270
+#define SET 271
+#define SHUTDOWN 272
+#define HALTED 273
+#define LOCKED 274
+#define MIGRATED 275
+#define SELECTION 276
+#define SERVER 277
+#define SMS 278
+#define NODE 279
+#define SUITE 280
+#define FAMILY 281
+#define TASK 282
+#define EVENT 283
+#define LABEL 284
+#define METER 285
+#define REPEAT 286
+#define VARIABLE 287
+#define TRIGGER 288
+#define LIMIT 289
+#define ALIAS 290
+#define HAS_TRIGGERS 291
+#define HAS_TIME 292
+#define HAS_DATE 293
+#define HAS_TEXT 294
+#define IS_ZOMBIE 295
+#define SEPARATOR 296
+#define STRING 297
+#define DEFAULT_YES 298
+#define DEFAULT_NO 299
+#define WINDOW 300
+#define PLUG 301
+#define COMP 302
+#define USER 303
+#define OPER 304
+#define ADMIN 305
+#define NUMBER 306
+#define JUNK 307
+#define EOL 308
+#define NODE_NAME 309
+#define CANCEL 310
+#define ANY 311
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 214 of yacc.c  */
+#line 140 "menuy.y"
+
+	char       *str;
+	long        num;
+	flags      *flg;
+	item       *itm;
+	menu       *men;
+	action     *act;
+	node*       nod;
+	double      dbl;
+	DateTime    dti;
+
+
+
+/* Line 214 of yacc.c  */
+#line 273 "y.tab.c"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 264 of yacc.c  */
+#line 285 "y.tab.c"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
+#endif
+{
+  return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  YYSIZE_T yyi;				\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (YYID (0))
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
+	Stack = &yyptr->Stack_alloc;					\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  22
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   200
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  70
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  22
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  91
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  153
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   311
+
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    65,     2,
+      60,    62,     2,     2,    61,     2,    68,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    67,    57,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    66,     2,    69,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    58,    64,    59,    63,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint16 yyprhs[] =
+{
+       0,     0,     3,     6,     8,    10,    12,    18,    21,    23,
+      26,    32,    34,    36,    39,    41,    55,    65,    68,    70,
+      72,    74,    76,    78,    80,    82,    84,    86,    88,    90,
+      92,    94,    96,    98,   100,   102,   104,   106,   108,   110,
+     112,   114,   116,   118,   120,   122,   124,   126,   128,   130,
+     132,   134,   136,   138,   140,   142,   144,   148,   152,   156,
+     158,   160,   162,   164,   166,   171,   173,   180,   182,   184,
+     186,   188,   190,   193,   194,   198,   200,   202,   215,   219,
+     223,   227,   232,   236,   240,   244,   248,   252,   260,   263,
+     265,   267
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int8 yyrhs[] =
+{
+      71,     0,    -1,    72,    73,    -1,    73,    -1,    89,    -1,
+      84,    -1,     3,    75,    75,    75,    57,    -1,    74,    73,
+      -1,    74,    -1,    74,     1,    -1,     4,    75,    58,    76,
+      59,    -1,     5,    -1,    42,    -1,    77,    76,    -1,    77,
+      -1,    60,    79,    61,    79,    61,    80,    61,    81,    61,
+      82,    61,    83,    62,    -1,    60,    79,    61,    79,    61,
+      80,    61,    81,    62,    -1,    63,    78,    -1,     6,    -1,
+       7,    -1,     8,    -1,     9,    -1,    10,    -1,    11,    -1,
+      12,    -1,    13,    -1,    14,    -1,    15,    -1,    16,    -1,
+      17,    -1,    18,    -1,    22,    -1,    23,    -1,    25,    -1,
+      26,    -1,    27,    -1,    24,    -1,    28,    -1,    29,    -1,
+      30,    -1,    31,    -1,    32,    -1,    33,    -1,    35,    -1,
+      34,    -1,    36,    -1,    38,    -1,    37,    -1,    39,    -1,
+      40,    -1,    20,    -1,    19,    -1,    48,    -1,    49,    -1,
+      50,    -1,    21,    -1,    60,    79,    62,    -1,    78,    64,
+      79,    -1,    78,    65,    79,    -1,    78,    -1,    42,    -1,
+      42,    -1,    41,    -1,     4,    -1,    45,    60,    75,    62,
+      -1,    46,    -1,    47,    60,    75,    61,    75,    62,    -1,
+      42,    -1,    43,    -1,    44,    -1,    85,    -1,    86,    -1,
+      85,    86,    -1,    -1,    88,    91,    91,    -1,    89,    -1,
+       1,    -1,    66,    91,    67,    91,    67,    91,    91,    68,
+      91,    68,    91,    69,    -1,    87,    10,    90,    -1,    87,
+      11,    90,    -1,    87,    13,    90,    -1,    87,    12,    90,
+      56,    -1,    87,    12,    90,    -1,    87,    14,    90,    -1,
+      87,     8,    90,    -1,    87,    16,    90,    -1,    87,    15,
+      90,    -1,    87,    30,    66,    90,    91,    90,    69,    -1,
+      87,    52,    -1,    52,    -1,    54,    -1,    51,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint16 yyrline[] =
+{
+       0,   155,   155,   156,   157,   158,   161,   165,   166,   167,
+     170,   173,   174,   177,   178,   181,   183,   187,   188,   189,
+     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   229,   230,   231,
+     234,   237,   238,   239,   240,   241,   242,   245,   248,   249,
+     254,   257,   258,   261,   262,   263,   264,   267,   274,   275,
+     276,   277,   279,   281,   282,   283,   284,   285,   288,   289,
+     292,   295
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "VERSION", "MENU", "IDENT", "NONE",
+  "ALL", "UNKNOWN", "SUSPENDED", "COMPLETE", "QUEUED", "SUBMITTED",
+  "ACTIVE", "ABORTED", "CLEAR", "SET", "SHUTDOWN", "HALTED", "LOCKED",
+  "MIGRATED", "SELECTION", "SERVER", "SMS", "NODE", "SUITE", "FAMILY",
+  "TASK", "EVENT", "LABEL", "METER", "REPEAT", "VARIABLE", "TRIGGER",
+  "LIMIT", "ALIAS", "HAS_TRIGGERS", "HAS_TIME", "HAS_DATE", "HAS_TEXT",
+  "IS_ZOMBIE", "SEPARATOR", "STRING", "DEFAULT_YES", "DEFAULT_NO",
+  "WINDOW", "PLUG", "COMP", "USER", "OPER", "ADMIN", "NUMBER", "JUNK",
+  "EOL", "NODE_NAME", "CANCEL", "ANY", "';'", "'{'", "'}'", "'('", "','",
+  "')'", "'~'", "'|'", "'&'", "'['", "':'", "'.'", "']'", "$accept",
+  "first", "version", "menus", "menu", "name", "menu_items", "menu_item",
+  "flag", "flags", "title", "action", "question", "answer", "logfile",
+  "loglines", "logline", "date", "event", "junk", "node_name", "number", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,    59,   123,   125,
+      40,    44,    41,   126,   124,    38,    91,    58,    46,    93
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    70,    71,    71,    71,    71,    72,    73,    73,    73,
+      74,    75,    75,    76,    76,    77,    77,    78,    78,    78,
+      78,    78,    78,    78,    78,    78,    78,    78,    78,    78,
+      78,    78,    78,    78,    78,    78,    78,    78,    78,    78,
+      78,    78,    78,    78,    78,    78,    78,    78,    78,    78,
+      78,    78,    78,    78,    78,    78,    78,    79,    79,    79,
+      80,    81,    81,    81,    81,    81,    81,    82,    83,    83,
+      84,    85,    85,    86,    86,    86,    86,    87,    88,    88,
+      88,    88,    88,    88,    88,    88,    88,    88,    89,    89,
+      90,    91
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     2,     1,     1,     1,     5,     2,     1,     2,
+       5,     1,     1,     2,     1,    13,     9,     2,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     3,     3,     3,     1,
+       1,     1,     1,     1,     4,     1,     6,     1,     1,     1,
+       1,     1,     2,     0,     3,     1,     1,    12,     3,     3,
+       3,     4,     3,     3,     3,     3,     3,     7,     2,     1,
+       1,     1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       0,    76,     0,     0,    89,     0,     0,     0,     3,     0,
+       5,     0,    71,     0,     0,    75,    11,    12,     0,     0,
+      91,     0,     1,     2,     9,     7,    72,    75,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    88,     0,     0,
+       0,     0,    90,    84,    78,    79,    82,    80,    83,    86,
+      85,     0,    74,     0,     0,     0,    14,     0,    81,     0,
+       6,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    51,    50,    55,    31,    32,    36,
+      33,    34,    35,    37,    38,    39,    40,    41,    42,    44,
+      43,    45,    47,    46,    48,    49,    52,    53,    54,     0,
+       0,    59,     0,    10,    13,     0,     0,     0,    17,     0,
+       0,     0,     0,     0,    56,    57,    58,     0,     0,    87,
+       0,     0,    60,     0,     0,     0,     0,    63,    62,    61,
+       0,    65,     0,     0,     0,     0,     0,     0,    16,    77,
+       0,     0,    67,     0,    64,     0,     0,     0,    68,    69,
+       0,    66,    15
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,     6,     7,     8,     9,    18,    55,    56,   101,   102,
+     123,   133,   143,   150,    10,    11,    12,    13,    14,    15,
+      43,    21
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -47
+static const yytype_int16 yypact[] =
+{
+       9,   -47,     6,     6,   -47,   -31,    26,    33,   -47,    18,
+     -47,    16,   -47,    19,   -31,    44,   -47,   -47,     6,   -11,
+     -47,   -22,   -47,   -47,   -47,   -47,   -47,   -47,    -4,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,   -12,   -47,   -31,     6,
+      -2,   -31,   -47,   -47,   -47,   -47,     3,   -47,   -47,   -47,
+     -47,    -4,   -47,     5,   137,     1,    -2,     0,   -47,   -31,
+     -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,
+     -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,
+     -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,
+     -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   137,
+     137,   -26,     8,   -47,   -47,   -31,    -4,     4,   -47,   137,
+     137,   137,   -31,     7,   -47,   -47,   -47,    11,     2,   -47,
+      31,   -31,   -47,    13,    12,    10,   -31,   -47,   -47,   -47,
+      17,   -47,    21,   -21,    15,     6,     6,    36,   -47,   -47,
+      23,    22,   -47,    25,   -47,     6,    -1,    27,   -47,   -47,
+      28,   -47,   -47
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int8 yypgoto[] =
+{
+     -47,   -47,   -47,    14,   -47,    -3,    32,   -47,    -9,   -46,
+     -47,   -47,   -47,   -47,   -47,   -47,    76,   -47,   -47,    82,
+     -27,   -13
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -74
+static const yytype_int16 yytable[] =
+{
+      19,    38,    44,    45,    46,    47,    48,    49,    50,   -73,
+       1,    16,     2,     3,   127,    39,   -70,     1,    -8,    24,
+      20,    23,     3,    25,    59,    52,    22,    28,    57,    29,
+      30,    31,    32,    33,    34,    35,    53,     3,   109,   110,
+     137,   138,   148,   149,    -4,    41,   106,    40,    17,    36,
+      42,   128,   129,   107,    51,   130,   131,   132,    54,    58,
+     103,     4,    60,   115,   116,   117,   114,   105,     4,   111,
+     121,    37,   120,   122,   125,     5,   119,   135,   142,   113,
+     126,   136,     5,   145,   139,   144,   146,    26,   104,   151,
+     152,   108,   112,    27,     0,     0,     0,     0,     0,   118,
+       0,     0,     0,     0,     0,     0,     0,     0,   124,     0,
+       0,     0,     0,   134,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   140,   141,     0,     0,     0,     0,     0,     0,
+       0,     0,   147,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,     0,     0,
+       0,     0,     0,     0,     0,    96,    97,    98,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    99,     0,     0,
+     100
+};
+
+static const yytype_int16 yycheck[] =
+{
+       3,    14,    29,    30,    31,    32,    33,    34,    35,     0,
+       1,     5,     3,     4,     4,    18,     0,     1,     0,     1,
+      51,     7,     4,     9,    51,    38,     0,     8,    41,    10,
+      11,    12,    13,    14,    15,    16,    39,     4,    64,    65,
+      61,    62,    43,    44,     0,    67,    59,    58,    42,    30,
+      54,    41,    42,    99,    66,    45,    46,    47,    60,    56,
+      59,    52,    57,   109,   110,   111,    62,    67,    52,    61,
+      68,    52,    61,    42,    61,    66,    69,    60,    42,   106,
+      68,    60,    66,    61,    69,    62,    61,    11,    56,    62,
+      62,   100,   105,    11,    -1,    -1,    -1,    -1,    -1,   112,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   121,    -1,
+      -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   135,   136,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   145,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    48,    49,    50,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    60,    -1,    -1,
+      63
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,     1,     3,     4,    52,    66,    71,    72,    73,    74,
+      84,    85,    86,    87,    88,    89,     5,    42,    75,    75,
+      51,    91,     0,    73,     1,    73,    86,    89,     8,    10,
+      11,    12,    13,    14,    15,    16,    30,    52,    91,    75,
+      58,    67,    54,    90,    90,    90,    90,    90,    90,    90,
+      90,    66,    91,    75,    60,    76,    77,    91,    56,    90,
+      57,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    48,    49,    50,    60,
+      63,    78,    79,    59,    76,    67,    91,    79,    78,    64,
+      65,    61,    91,    90,    62,    79,    79,    79,    91,    69,
+      61,    68,    42,    80,    91,    61,    68,     4,    41,    42,
+      45,    46,    47,    81,    91,    60,    60,    61,    62,    69,
+      75,    75,    42,    82,    62,    61,    61,    75,    43,    44,
+      83,    62,    62
+};
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL		goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK (1);						\
+      goto yybackup;						\
+    }								\
+  else								\
+    {								\
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;							\
+    }								\
+while (YYID (0))
+
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (YYID (N))                                                    \
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)			\
+     fprintf (File, "%d.%d-%d.%d",			\
+	      (Loc).first_line, (Loc).first_column,	\
+	      (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
+    int yyrule;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       );
+      YYFPRINTF (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+

+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+	switch (*++yyp)
+	  {
+	  case '\'':
+	  case ',':
+	    goto do_not_strip_quotes;
+
+	  case '\\':
+	    if (*++yyp != '\\')
+	      goto do_not_strip_quotes;
+	    /* Fall through.  */
+	  default:
+	    if (yyres)
+	      yyres[yyn] = *yyp;
+	    yyn++;
+	    break;
+
+	  case '"':
+	    if (yyres)
+	      yyres[yyn] = '\0';
+	    return yyn;
+	  }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
+
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+	 constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+		    + sizeof yyexpecting - 1
+		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+		       * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+	 YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	  {
+	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+	      {
+		yycount = 1;
+		yysize = yysize0;
+		yyformat[sizeof yyunexpected - 1] = '\0';
+		break;
+	      }
+	    yyarg[yycount++] = yytname[yyx];
+	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+	    yysize_overflow |= (yysize1 < yysize);
+	    yysize = yysize1;
+	    yyfmt = yystpcpy (yyfmt, yyprefix);
+	    yyprefix = yyor;
+	  }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+	return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+	{
+	  /* Avoid sprintf, as that infringes on the user's name space.
+	     Don't have undefined behavior even if the translation
+	     produced a string with the wrong number of "%s"s.  */
+	  char *yyp = yyresult;
+	  int yyi = 0;
+	  while ((*yyp = *yyf) != '\0')
+	    {
+	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		{
+		  yyp += yytnamerr (yyp, yyarg[yyi++]);
+		  yyf += 2;
+		}
+	      else
+		{
+		  yyp++;
+		  yyf++;
+		}
+	    }
+	}
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
+

+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  YYUSE (yyvaluep);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+
+      default:
+	break;
+    }
+}
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*-------------------------.
+| yyparse or yypush_parse.  |
+`-------------------------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
+
+    /* The stacks and their tools:
+       `yyss': related to states.
+       `yyvs': related to semantic values.
+
+       Refer to the stacks thru separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
+
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
+
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
+
+    YYSIZE_T yystacksize;
+
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken;
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY; /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack.  Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	yytype_int16 *yyss1 = yyss;
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow (YY_("memory exhausted"),
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	yytype_int16 *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyexhaustedlab;
+	YYSTACK_RELOCATE (yyss_alloc, yyss);
+	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 2:
+
+/* Line 1455 of yacc.c  */
+#line 155 "menuy.y"
+    { menus_root((yyvsp[(2) - (2)].men)); }
+    break;
+
+  case 3:
+
+/* Line 1455 of yacc.c  */
+#line 156 "menuy.y"
+    { menus_root((yyvsp[(1) - (1)].men)); }
+    break;
+
+  case 6:
+
+/* Line 1455 of yacc.c  */
+#line 162 "menuy.y"
+    { (yyval.num) = menus_version(atol((yyvsp[(2) - (5)].str)), atol((yyvsp[(3) - (5)].str)), atol((yyvsp[(4) - (5)].str))); }
+    break;
+
+  case 7:
+
+/* Line 1455 of yacc.c  */
+#line 165 "menuy.y"
+    { (yyval.men) = menus_chain_menus((yyvsp[(1) - (2)].men),(yyvsp[(2) - (2)].men)); }
+    break;
+
+  case 9:
+
+/* Line 1455 of yacc.c  */
+#line 167 "menuy.y"
+    { (yyval.men) = (yyvsp[(1) - (2)].men); }
+    break;
+
+  case 10:
+
+/* Line 1455 of yacc.c  */
+#line 170 "menuy.y"
+    { (yyval.men) = menus_create_2((yyvsp[(2) - (5)].str),(yyvsp[(4) - (5)].itm)); }
+    break;
+
+  case 11:
+
+/* Line 1455 of yacc.c  */
+#line 173 "menuy.y"
+    { (yyval.str) = strdup(yytext); }
+    break;
+
+  case 12:
+
+/* Line 1455 of yacc.c  */
+#line 174 "menuy.y"
+    { (yyval.str) = strdup(yytext); }
+    break;
+
+  case 13:
+
+/* Line 1455 of yacc.c  */
+#line 177 "menuy.y"
+    { (yyval.itm) = menus_chain_items((yyvsp[(1) - (2)].itm),(yyvsp[(2) - (2)].itm)); }
+    break;
+
+  case 15:
+
+/* Line 1455 of yacc.c  */
+#line 182 "menuy.y"
+    { (yyval.itm) = menus_create_6((yyvsp[(2) - (13)].flg),(yyvsp[(4) - (13)].flg),(yyvsp[(6) - (13)].str),(yyvsp[(8) - (13)].act),(yyvsp[(10) - (13)].str),(yyvsp[(12) - (13)].num)); }
+    break;
+
+  case 16:
+
+/* Line 1455 of yacc.c  */
+#line 184 "menuy.y"
+    { (yyval.itm) = menus_create_6((yyvsp[(2) - (9)].flg),(yyvsp[(4) - (9)].flg),(yyvsp[(6) - (9)].str),(yyvsp[(8) - (9)].act),"",1); }
+    break;
+
+  case 17:
+
+/* Line 1455 of yacc.c  */
+#line 187 "menuy.y"
+    { (yyval.flg) = new_flagNot((yyvsp[(2) - (2)].flg));        }
+    break;
+
+  case 18:
+
+/* Line 1455 of yacc.c  */
+#line 188 "menuy.y"
+    { (yyval.flg) = new_flagNone();       }
+    break;
+
+  case 19:
+
+/* Line 1455 of yacc.c  */
+#line 189 "menuy.y"
+    { (yyval.flg) = new_flagAll();        }
+    break;
+
+  case 20:
+
+/* Line 1455 of yacc.c  */
+#line 190 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_UNKNOWN);    }
+    break;
+
+  case 21:
+
+/* Line 1455 of yacc.c  */
+#line 191 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_SUSPENDED);  }
+    break;
+
+  case 22:
+
+/* Line 1455 of yacc.c  */
+#line 192 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_COMPLETE);   }
+    break;
+
+  case 23:
+
+/* Line 1455 of yacc.c  */
+#line 193 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_QUEUED);     }
+    break;
+
+  case 24:
+
+/* Line 1455 of yacc.c  */
+#line 194 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_SUBMITTED);  }
+    break;
+
+  case 25:
+
+/* Line 1455 of yacc.c  */
+#line 195 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_ACTIVE);     }
+    break;
+
+  case 26:
+
+/* Line 1455 of yacc.c  */
+#line 196 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_ABORTED);    }
+    break;
+
+  case 27:
+
+/* Line 1455 of yacc.c  */
+#line 197 "menuy.y"
+    { (yyval.flg) = new_eventFlag(0);      }
+    break;
+
+  case 28:
+
+/* Line 1455 of yacc.c  */
+#line 198 "menuy.y"
+    { (yyval.flg) = new_eventFlag(1);        }
+    break;
+
+  case 29:
+
+/* Line 1455 of yacc.c  */
+#line 199 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_SHUTDOWN);   }
+    break;
+
+  case 30:
+
+/* Line 1455 of yacc.c  */
+#line 200 "menuy.y"
+    { (yyval.flg) = new_statusFlag(STATUS_HALTED);     }
+    break;
+
+  case 31:
+
+/* Line 1455 of yacc.c  */
+#line 201 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_SUPER) ; }
+    break;
+
+  case 32:
+
+/* Line 1455 of yacc.c  */
+#line 202 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_SUPER) ; }
+    break;
+
+  case 33:
+
+/* Line 1455 of yacc.c  */
+#line 203 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_SUITE) ; }
+    break;
+
+  case 34:
+
+/* Line 1455 of yacc.c  */
+#line 204 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_FAMILY) ; }
+    break;
+
+  case 35:
+
+/* Line 1455 of yacc.c  */
+#line 205 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_TASK) ; }
+    break;
+
+  case 36:
+
+/* Line 1455 of yacc.c  */
+#line 206 "menuy.y"
+    { (yyval.flg) = new_flagOr(new_flagOr(new_typeFlag(NODE_SUITE),new_typeFlag(NODE_FAMILY)),new_typeFlag(NODE_TASK)); }
+    break;
+
+  case 37:
+
+/* Line 1455 of yacc.c  */
+#line 207 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_EVENT) ; }
+    break;
+
+  case 38:
+
+/* Line 1455 of yacc.c  */
+#line 208 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_LABEL) ; }
+    break;
+
+  case 39:
+
+/* Line 1455 of yacc.c  */
+#line 209 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_METER) ; }
+    break;
+
+  case 40:
+
+/* Line 1455 of yacc.c  */
+#line 210 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_REPEAT) ; }
+    break;
+
+  case 41:
+
+/* Line 1455 of yacc.c  */
+#line 211 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_VARIABLE) ; }
+    break;
+
+  case 42:
+
+/* Line 1455 of yacc.c  */
+#line 212 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_TRIGGER) ; }
+    break;
+
+  case 43:
+
+/* Line 1455 of yacc.c  */
+#line 213 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_ALIAS) ; }
+    break;
+
+  case 44:
+
+/* Line 1455 of yacc.c  */
+#line 214 "menuy.y"
+    { (yyval.flg) = new_typeFlag(NODE_LIMIT) ; }
+    break;
+
+  case 45:
+
+/* Line 1455 of yacc.c  */
+#line 215 "menuy.y"
+    { (yyval.flg) = new_procFlag_node_hasTriggers(); }
+    break;
+
+  case 46:
+
+/* Line 1455 of yacc.c  */
+#line 216 "menuy.y"
+    { (yyval.flg) = new_procFlag_node_hasDate(); }
+    break;
+
+  case 47:
+
+/* Line 1455 of yacc.c  */
+#line 217 "menuy.y"
+    { (yyval.flg) = new_procFlag_node_hasTime(); }
+    break;
+
+  case 48:
+
+/* Line 1455 of yacc.c  */
+#line 218 "menuy.y"
+    { (yyval.flg) = new_procFlag_node_hasText(); }
+    break;
+
+  case 49:
+
+/* Line 1455 of yacc.c  */
+#line 219 "menuy.y"
+    { (yyval.flg) = new_procFlag_node_isZombie(); }
+    break;
+
+  case 50:
+
+/* Line 1455 of yacc.c  */
+#line 220 "menuy.y"
+    { (yyval.flg) = new_procFlag_node_isMigrated(); }
+    break;
+
+  case 51:
+
+/* Line 1455 of yacc.c  */
+#line 221 "menuy.y"
+    { (yyval.flg) = new_procFlag_node_isLocked(); }
+    break;
+
+  case 52:
+
+/* Line 1455 of yacc.c  */
+#line 222 "menuy.y"
+    { (yyval.flg) = new_userFlag(0); }
+    break;
+
+  case 53:
+
+/* Line 1455 of yacc.c  */
+#line 223 "menuy.y"
+    { (yyval.flg) = new_userFlag(1); }
+    break;
+
+  case 54:
+
+/* Line 1455 of yacc.c  */
+#line 224 "menuy.y"
+    { (yyval.flg) = new_userFlag(2); }
+    break;
+
+  case 55:
+
+/* Line 1455 of yacc.c  */
+#line 225 "menuy.y"
+    { (yyval.flg) = new_selectionFlag(); }
+    break;
+
+  case 56:
+
+/* Line 1455 of yacc.c  */
+#line 226 "menuy.y"
+    { (yyval.flg) = (yyvsp[(2) - (3)].flg);                     }
+    break;
+
+  case 57:
+
+/* Line 1455 of yacc.c  */
+#line 229 "menuy.y"
+    { (yyval.flg) = new_flagOr((yyvsp[(1) - (3)].flg),(yyvsp[(3) - (3)].flg)); }
+    break;
+
+  case 58:
+
+/* Line 1455 of yacc.c  */
+#line 230 "menuy.y"
+    { (yyval.flg) = new_flagAnd((yyvsp[(1) - (3)].flg),(yyvsp[(3) - (3)].flg)); }
+    break;
+
+  case 60:
+
+/* Line 1455 of yacc.c  */
+#line 234 "menuy.y"
+    { (yyval.str) = strdup(yytext); }
+    break;
+
+  case 61:
+
+/* Line 1455 of yacc.c  */
+#line 237 "menuy.y"
+    { (yyval.act) = menus_command(strdup(yytext));  }
+    break;
+
+  case 62:
+
+/* Line 1455 of yacc.c  */
+#line 238 "menuy.y"
+    { (yyval.act) = menus_separator();              }
+    break;
+
+  case 63:
+
+/* Line 1455 of yacc.c  */
+#line 239 "menuy.y"
+    { (yyval.act) = menus_sub_menu(); }
+    break;
+
+  case 64:
+
+/* Line 1455 of yacc.c  */
+#line 240 "menuy.y"
+    { (yyval.act) = menus_window((yyvsp[(3) - (4)].str)); }
+    break;
+
+  case 65:
+
+/* Line 1455 of yacc.c  */
+#line 241 "menuy.y"
+    { (yyval.act) = menus_internal_host_plug(); }
+    break;
+
+  case 66:
+
+/* Line 1455 of yacc.c  */
+#line 242 "menuy.y"
+    { (yyval.act) = menus_internal_host_comp((yyvsp[(3) - (6)].str), (yyvsp[(5) - (6)].str)); }
+    break;
+
+  case 67:
+
+/* Line 1455 of yacc.c  */
+#line 245 "menuy.y"
+    { (yyval.str) = strdup(yytext); }
+    break;
+
+  case 68:
+
+/* Line 1455 of yacc.c  */
+#line 248 "menuy.y"
+    { (yyval.num) = 1; }
+    break;
+
+  case 69:
+
+/* Line 1455 of yacc.c  */
+#line 249 "menuy.y"
+    { (yyval.num) = 0; }
+    break;
+
+  case 74:
+
+/* Line 1455 of yacc.c  */
+#line 262 "menuy.y"
+    { if(yyone) return 0; }
+    break;
+
+  case 76:
+
+/* Line 1455 of yacc.c  */
+#line 264 "menuy.y"
+    { /* extern int yylineno; printf("error line %d [%s]\n",yylineno, yytext); */ }
+    break;
+
+  case 77:
+
+/* Line 1455 of yacc.c  */
+#line 268 "menuy.y"
+    { 
+	    (yyval.dti).date = ((yyvsp[(11) - (12)].num) * 10000 + (yyvsp[(9) - (12)].num) * 100 + (yyvsp[(7) - (12)].num));
+	    (yyval.dti).time = ((yyvsp[(2) - (12)].num)  * 10000 + (yyvsp[(4) - (12)].num) * 100 + (yyvsp[(6) - (12)].num));
+	  }
+    break;
+
+  case 78:
+
+/* Line 1455 of yacc.c  */
+#line 274 "menuy.y"
+    { log_event_status_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),STATUS_COMPLETE); }
+    break;
+
+  case 79:
+
+/* Line 1455 of yacc.c  */
+#line 275 "menuy.y"
+    { log_event_status_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),STATUS_QUEUED); }
+    break;
+
+  case 80:
+
+/* Line 1455 of yacc.c  */
+#line 276 "menuy.y"
+    { log_event_status_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),STATUS_ACTIVE); }
+    break;
+
+  case 81:
+
+/* Line 1455 of yacc.c  */
+#line 278 "menuy.y"
+    { log_event_status_event(&(yyvsp[(1) - (4)].dti),(yyvsp[(3) - (4)].nod),STATUS_SUBMITTED); }
+    break;
+
+  case 82:
+
+/* Line 1455 of yacc.c  */
+#line 280 "menuy.y"
+    { log_event_status_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),STATUS_SUBMITTED); }
+    break;
+
+  case 83:
+
+/* Line 1455 of yacc.c  */
+#line 281 "menuy.y"
+    { log_event_status_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),STATUS_ABORTED);}
+    break;
+
+  case 84:
+
+/* Line 1455 of yacc.c  */
+#line 282 "menuy.y"
+    { log_event_status_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),STATUS_UNKNOWN);}
+    break;
+
+  case 85:
+
+/* Line 1455 of yacc.c  */
+#line 283 "menuy.y"
+    { log_event_event_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),1); }
+    break;
+
+  case 86:
+
+/* Line 1455 of yacc.c  */
+#line 284 "menuy.y"
+    { log_event_event_event(&(yyvsp[(1) - (3)].dti),(yyvsp[(3) - (3)].nod),0); }
+    break;
+
+  case 87:
+
+/* Line 1455 of yacc.c  */
+#line 285 "menuy.y"
+    { log_event_meter_event(&(yyvsp[(1) - (7)].dti),(yyvsp[(6) - (7)].nod),(yyvsp[(5) - (7)].num)); }
+    break;
+
+  case 90:
+
+/* Line 1455 of yacc.c  */
+#line 292 "menuy.y"
+    { (yyval.nod) = log_event_find(yytext); }
+    break;
+
+  case 91:
+
+/* Line 1455 of yacc.c  */
+#line 295 "menuy.y"
+    { (yyval.num) = atol(yytext); }
+    break;
+
+
+
+/* Line 1455 of yacc.c  */
+#line 2185 "y.tab.c"
+      default: break;
+    }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+	  {
+	    YYSIZE_T yyalloc = 2 * yysize;
+	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
+	    if (yymsg != yymsgbuf)
+	      YYSTACK_FREE (yymsg);
+	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+	    if (yymsg)
+	      yymsg_alloc = yyalloc;
+	    else
+	      {
+		yymsg = yymsgbuf;
+		yymsg_alloc = sizeof yymsgbuf;
+	      }
+	  }
+
+	if (0 < yysize && yysize <= yymsg_alloc)
+	  {
+	    (void) yysyntax_error (yymsg, yystate, yychar);
+	    yyerror (yymsg);
+	  }
+	else
+	  {
+	    yyerror (YY_("syntax error"));
+	    if (yysize != 0)
+	      goto yyexhaustedlab;
+	  }
+      }
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+	{
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
+	}
+      else
+	{
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#if !defined(yyoverflow) || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+		 yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+		  yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+
+/* Line 1675 of yacc.c  */
+#line 298 "menuy.y"
+
+
+#include "menul.c"
+
+int yywrap() {
+	return 1;
+}
+
+#ifdef AIX
+int yyerror(char * msg)
+#else
+void yyerror(char * msg)
+#endif
+{
+  /* printf("!menu parsing issue?\n");
+     printf("%s line %d last token <%s>\n",msg,yylineno,yytext); */
+  if (!strncmp("MSG:", yytext, 4)) {} 
+  else if (!strncmp("DBG:", yytext, 4)) {}
+  else if (!strncmp("ERR:", yytext, 4)) {}
+  else if (!strncmp("WAR:", yytext, 4)) {}
+  else if (!strncmp("try-no:", yytext, 6)) {}
+  else if (!strncmp("File", yytext, 4)) {}
+  else if (!strncmp("Variable", yytext, 8)) {}
+  else if (!strncmp("Directory", yytext, 9)) {}
+  else if (!strncmp("Search", yytext, 6)) {}
+  else if (*yytext == '[') {} 
+  else if (*yytext == ':') {} 
+  else if (*yytext == '/') {} 
+  else printf("!%s:%d:<%s>\n",msg,yylineno,yytext);
+}
+
+
diff --git a/ecflow_4_0_7/view/src/menuy.y b/ecflow_4_0_7/view/src/menuy.y
new file mode 100644
index 0000000..f460398
--- /dev/null
+++ b/ecflow_4_0_7/view/src/menuy.y
@@ -0,0 +1,328 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #17 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+%{
+#include "lexyacc.h"
+#include "ecflow.h"
+int yyone = 0;
+extern int yylineno;
+
+#ifdef __cplusplus
+ void yylex(void);
+#endif
+
+#if defined(_AIX) 
+ extern char yytext[];
+ int yydebug;
+#elif defined(hpux) 
+ void yyerror(char * msg);
+ int yydebug;
+#elif defined(YYBISON) 
+ extern char yytext[]; /* ARRAY */
+ void yyerror(char * msg);
+ int yydebug;
+#elif defined (linux)
+ extern char yytext[];
+ void yyerror(char * msg);
+ int yydebug;
+#elif defined(alpha) || defined(SGI) 
+ extern char yytext[]; /* ARRAY */
+#elif defined(SVR4) 
+ extern char yytext[]; /* ARRAY */
+#elif defined(alpha) 
+ extern unsigned char yytext[];
+#else
+ extern char yytext[];
+ void yyerror(char * msg);
+ int yydebug;
+#endif
+%}
+
+%token VERSION
+%token MENU
+%token IDENT
+%token NONE
+%token ALL
+%token UNKNOWN
+%token SUSPENDED
+%token COMPLETE
+%token QUEUED
+%token SUBMITTED
+%token ACTIVE
+%token ABORTED
+%token CLEAR
+%token SET
+%token SHUTDOWN
+%token HALTED
+%token LOCKED
+%token MIGRATED
+%token SELECTION
+
+%token SERVER
+%token SMS
+%token NODE
+%token SUITE
+%token FAMILY
+%token TASK
+%token EVENT
+%token LABEL
+%token METER
+%token REPEAT
+%token VARIABLE
+%token TRIGGER
+%token LIMIT
+%token ALIAS
+
+%token HAS_TRIGGERS
+%token HAS_TIME
+%token HAS_DATE
+%token HAS_TEXT
+
+%token IS_ZOMBIE
+
+%token SEPARATOR
+%token STRING
+%token DEFAULT_YES
+%token DEFAULT_NO
+
+%token WINDOW
+%token PLUG
+%token COMP
+
+%token USER
+%token OPER
+%token ADMIN
+
+
+%token NUMBER
+%token JUNK
+%token EOL
+%token NODE_NAME
+%token CANCEL
+%token ANY
+
+%type<flg> flags;
+%type<flg> flag;
+
+%type<str> question;
+%type<str> title;
+%type<act> action;
+%type<str> name;
+%type<num> answer;
+%type<num> version;
+
+%type<itm> menu_items;
+%type<itm> menu_item;
+
+%type<men> menu;
+%type<men> menus;
+
+%type<nod> node_name;
+%type<num> number;
+
+%type<dti> date;
+
+
+%start first
+
+%union {
+	char       *str;
+	long        num;
+	flags      *flg;
+	item       *itm;
+	menu       *men;
+	action     *act;
+	node*       nod;
+	double      dbl;
+	DateTime    dti;
+};
+
+
+%%
+
+first : version menus { menus_root($2); }
+      | menus { menus_root($1); }
+      | junk
+      | logfile
+      ;
+
+version : VERSION name name name ';'
+          { $$ = menus_version(atol($2), atol($3), atol($4)); } 
+          ;
+
+menus : menu menus { $$ = menus_chain_menus($1,$2); }
+	  | menu
+	  | menu error { $$ = $1; }
+	  ;
+
+menu : MENU name '{' menu_items '}' { $$ = menus_create_2($2,$4); }
+     ;
+
+name : IDENT  { $$ = strdup(yytext); }
+     | STRING { $$ = strdup(yytext); }
+     ;
+
+menu_items : menu_item menu_items { $$ = menus_chain_items($1,$2); }
+		   | menu_item
+		   ;
+
+menu_item : '(' flags ',' flags ',' title ',' action ',' question ',' answer ')'
+			{ $$ = menus_create_6($2,$4,$6,$8,$10,$12); }
+		| '('  flags ',' flags ','  title ',' action ')'
+			{ $$ = menus_create_6($2,$4,$6,$8,"",1); }
+          ;
+
+flag         : '~' flag        { $$ = new_flagNot($2);        }
+  | NONE            { $$ = new_flagNone();       }
+  | ALL             { $$ = new_flagAll();        }
+  | UNKNOWN         { $$ = new_statusFlag(STATUS_UNKNOWN);    }
+  | SUSPENDED       { $$ = new_statusFlag(STATUS_SUSPENDED);  }
+  | COMPLETE        { $$ = new_statusFlag(STATUS_COMPLETE);   }
+  | QUEUED          { $$ = new_statusFlag(STATUS_QUEUED);     }
+  | SUBMITTED       { $$ = new_statusFlag(STATUS_SUBMITTED);  }
+  | ACTIVE          { $$ = new_statusFlag(STATUS_ACTIVE);     }
+  | ABORTED         { $$ = new_statusFlag(STATUS_ABORTED);    }
+  | CLEAR           { $$ = new_eventFlag(0);      }
+  | SET             { $$ = new_eventFlag(1);        }
+  | SHUTDOWN        { $$ = new_statusFlag(STATUS_SHUTDOWN);   }
+  | HALTED          { $$ = new_statusFlag(STATUS_HALTED);     }
+  | SERVER         { $$ = new_typeFlag(NODE_SUPER) ; }
+  | SMS            { $$ = new_typeFlag(NODE_SUPER) ; }
+  | SUITE          { $$ = new_typeFlag(NODE_SUITE) ; }
+  | FAMILY         { $$ = new_typeFlag(NODE_FAMILY) ; }
+  | TASK           { $$ = new_typeFlag(NODE_TASK) ; }
+  | NODE           { $$ = new_flagOr(new_flagOr(new_typeFlag(NODE_SUITE),new_typeFlag(NODE_FAMILY)),new_typeFlag(NODE_TASK)); }
+  | EVENT          { $$ = new_typeFlag(NODE_EVENT) ; }
+  | LABEL          { $$ = new_typeFlag(NODE_LABEL) ; }
+  | METER          { $$ = new_typeFlag(NODE_METER) ; }
+  | REPEAT         { $$ = new_typeFlag(NODE_REPEAT) ; }
+  | VARIABLE       { $$ = new_typeFlag(NODE_VARIABLE) ; }
+  | TRIGGER        { $$ = new_typeFlag(NODE_TRIGGER) ; }
+  | ALIAS          { $$ = new_typeFlag(NODE_ALIAS) ; }
+  | LIMIT          { $$ = new_typeFlag(NODE_LIMIT) ; }
+  | HAS_TRIGGERS   { $$ = new_procFlag_node_hasTriggers(); }
+  | HAS_DATE       { $$ = new_procFlag_node_hasDate(); }
+  | HAS_TIME       { $$ = new_procFlag_node_hasTime(); }
+  | HAS_TEXT       { $$ = new_procFlag_node_hasText(); }
+  | IS_ZOMBIE      { $$ = new_procFlag_node_isZombie(); }
+  | MIGRATED       { $$ = new_procFlag_node_isMigrated(); }
+  | LOCKED       { $$ = new_procFlag_node_isLocked(); }
+  | USER           { $$ = new_userFlag(0); }
+  | OPER           { $$ = new_userFlag(1); }
+  | ADMIN          { $$ = new_userFlag(2); }
+  | SELECTION       { $$ = new_selectionFlag(); }
+  | '(' flags ')'   { $$ = $2;                     }
+;
+
+flags        : flag '|' flags { $$ = new_flagOr($1,$3); }
+  | flag '&' flags { $$ = new_flagAnd($1,$3); }
+  | flag
+			 ;
+
+title : STRING { $$ = strdup(yytext); }
+      ;
+
+action  : STRING      { $$ = menus_command(strdup(yytext));  }
+        | SEPARATOR   { $$ = menus_separator();              }
+	| MENU        { $$ = menus_sub_menu(); }
+	| WINDOW '(' name ')'  { $$ = menus_window($3); }
+	| PLUG        { $$ = menus_internal_host_plug(); }
+        | COMP '(' name ',' name ')' { $$ = menus_internal_host_comp($3, $5); }
+	;
+
+question: STRING { $$ = strdup(yytext); }
+		;
+
+answer  : DEFAULT_YES    { $$ = 1; }
+        | DEFAULT_NO     { $$ = 0; }
+		;
+
+/*-------------------------------------------------------------*/
+
+logfile : loglines 
+		;
+
+loglines: logline
+	| loglines logline
+        ;
+
+logline : 
+| event number number { if(yyone) return 0; }
+| junk
+| error  { /* extern int yylineno; printf("error line %d [%s]\n",yylineno, yytext); */ }
+;
+
+date   : '[' number ':' number ':' number  number '.' number '.' number ']'
+          { 
+	    $$.date = ($11 * 10000 + $9 * 100 + $7);
+	    $$.time = ($2  * 10000 + $4 * 100 + $6);
+	  }
+          ;
+
+event : date COMPLETE   node_name  { log_event_status_event(&$1,$3,STATUS_COMPLETE); }
+  | date QUEUED     node_name  { log_event_status_event(&$1,$3,STATUS_QUEUED); }
+  | date ACTIVE     node_name  { log_event_status_event(&$1,$3,STATUS_ACTIVE); }
+  | date SUBMITTED  node_name ANY
+    { log_event_status_event(&$1,$3,STATUS_SUBMITTED); }
+  | date SUBMITTED  node_name 
+    { log_event_status_event(&$1,$3,STATUS_SUBMITTED); }
+  | date ABORTED    node_name  { log_event_status_event(&$1,$3,STATUS_ABORTED);}
+  | date UNKNOWN    node_name  { log_event_status_event(&$1,$3,STATUS_UNKNOWN);}
+  | date SET        node_name  { log_event_event_event(&$1,$3,1); }
+  | date CLEAR      node_name  { log_event_event_event(&$1,$3,0); }
+  | date METER '[' node_name number node_name ']'  { log_event_meter_event(&$1,$6,$5); }
+;
+
+junk  : date JUNK
+      | JUNK
+      ;
+
+node_name : NODE_NAME { $$ = log_event_find(yytext); }
+		  ;
+
+number    : NUMBER { $$ = atol(yytext); }
+		  ;
+
+%%
+
+#include "menul.c"
+
+int yywrap() {
+	return 1;
+}
+
+#ifdef AIX
+int yyerror(char * msg)
+#else
+void yyerror(char * msg)
+#endif
+{
+  /* printf("!menu parsing issue?\n");
+     printf("%s line %d last token <%s>\n",msg,yylineno,yytext); */
+  if (!strncmp("MSG:", yytext, 4)) {} 
+  else if (!strncmp("DBG:", yytext, 4)) {}
+  else if (!strncmp("ERR:", yytext, 4)) {}
+  else if (!strncmp("WAR:", yytext, 4)) {}
+  else if (!strncmp("try-no:", yytext, 6)) {}
+  else if (!strncmp("File", yytext, 4)) {}
+  else if (!strncmp("Variable", yytext, 8)) {}
+  else if (!strncmp("Directory", yytext, 9)) {}
+  else if (!strncmp("Search", yytext, 6)) {}
+  else if (*yytext == '[') {} 
+  else if (*yytext == ':') {} 
+  else if (*yytext == '/') {} 
+  else printf("!%s:%d:<%s>\n",msg,yylineno,yytext);
+}
+
diff --git a/ecflow_4_0_7/view/src/messages.cc b/ecflow_4_0_7/view/src/messages.cc
new file mode 100644
index 0000000..7ecbb66
--- /dev/null
+++ b/ecflow_4_0_7/view/src/messages.cc
@@ -0,0 +1,78 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "messages.h"
+#include "node.h"
+#include "host.h"
+#include "selection.h"
+#include "tmp_file.h"
+#include "Hyper.h"
+#include <stdio.h>
+extern "C" {
+#include "xec.h"
+}
+
+messages::messages(panel_window& w)
+  :panel(w)
+  ,text_window(false)
+{
+}
+
+messages::~messages()
+{
+}
+
+void messages::create (Widget parent, char *widget_name )
+{
+  messages_form_c::create(parent,widget_name);
+}
+
+
+void messages::clear()
+{
+  text_window::clear();
+}
+
+struct ml : public lister<ecf_list> {
+  FILE* f_;
+  void next(ecf_list& l) { if (f_) fprintf(f_,"%s\n",l.name().c_str()); }
+public:
+  ml(FILE* f): f_(f) {}
+};
+
+void messages::show(node& n)
+{
+  tmp_file tmp(tmpnam(0));
+  FILE *f = fopen(tmp.c_str(),"w");
+  if(!f) 	{ return; }
+  
+  const std::vector<std::string>& l = n.messages();
+  std::vector<std::string>::const_iterator it = l.begin();
+  
+  while (it != l.end()) {
+    fprintf(f, "%s\n", it->c_str());
+    ++it;
+  }
+  fclose(f);
+  
+  load(tmp);
+}
+
+Boolean messages::enabled(node& n)
+{
+  return n.hasMessages();
+}
+
+// static panel_maker<messages> maker(PANEL_MESSAGES);
diff --git a/ecflow_4_0_7/view/src/messages.h b/ecflow_4_0_7/view/src/messages.h
new file mode 100644
index 0000000..b6d7237
--- /dev/null
+++ b/ecflow_4_0_7/view/src/messages.h
@@ -0,0 +1,68 @@
+#ifndef messages_H
+#define messages_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uimessages.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef text_window_H
+#include "text_window.h"
+#endif
+
+// 
+
+class messages : public panel, public messages_form_c, public text_window {
+public:
+
+	messages(panel_window&);
+
+	~messages(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Messages"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Widget widget() { return messages_form_c::xd_rootwidget(); }
+	virtual Boolean enabled(node&);
+
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()   { return text_; }
+	virtual void create (Widget parent, char *widget_name = 0 );
+
+
+
+private:
+
+	messages(const messages&);
+	messages& operator=(const messages&);
+
+	virtual void externalCB(Widget ,XtPointer ) 
+		{ text_window::open_viewer();}
+
+	virtual void searchCB(Widget ,XtPointer ) 
+		{ text_window::open_search();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+};
+
+inline void destroy(messages**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/meter_node.cc b/ecflow_4_0_7/view/src/meter_node.cc
new file mode 100644
index 0000000..d60b3bc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/meter_node.cc
@@ -0,0 +1,160 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #22 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "show.h"
+#include "meter_node.h"
+#include "text_lister.h"
+#include "ecf_node.h"
+#include "ecflowview.h"
+#include "NodeAttr.hpp"
+
+#ifdef BRIDGE
+meter_node::meter_node(host& h,sms_node* n, char b) 
+  : node (h,n,b) 
+  , name_ (n ? n->name : "STEP")
+{}
+#endif
+
+meter_node::meter_node(host& h,ecf_node* n) 
+  : node  (h,n)
+  , name_ (n ? n->name() : "STEP") 
+{
+}
+
+const Meter&  meter_node::get() const {
+  ecf_concrete_node<const Meter>* base = 
+    dynamic_cast<ecf_concrete_node<const Meter>*> (owner_);
+  if (base) return *(base->get());
+  if (parent() && parent()->__node__())
+      return parent()->__node__()->get_meter(name_);
+  return Meter::EMPTY();
+}
+
+xmstring meter_node::make_label_tree()
+{
+  char buff[80], name[80];
+  snprintf(name,80, " %s: ", name_.c_str());
+  snprintf(buff,80, "%d", value());
+  return xmstring(name,"bold") + xmstring(buff);
+}
+
+void meter_node::drawNode(Widget w,XRectangle* r,bool tree)
+{
+	drawBackground(w,r,tree);
+
+	XmString s = tree?labelTree():labelTrigger();
+	XRectangle x = *r;
+	int width,mark;
+
+	x.x += (x.height - 10)/2;
+	x.height = 10;
+	x.width  = 50;
+
+	width = (float)x.width / (float)(maximum() - minimum())
+	  * (float)(value() - minimum());
+
+	mark  = (float)x.width / (float)(maximum() - minimum())
+	  * (float)(threshold() - minimum());
+
+	XFillRectangles(XtDisplay(w),XtWindow(w),colorGC(0),&x,1);
+
+	if (value() > threshold())
+          XFillRectangle(XtDisplay(w),XtWindow(w),gui::colorGC(STATUS_MAX+1),x.x,x.y,width,x.height);
+        else
+          XFillRectangle(XtDisplay(w),XtWindow(w),gui::colorGC(STATUS_MAX),x.x,x.y,width,x.height);
+
+	shadow(w,&x);
+
+	if(mark < width)
+	{
+		x.width = mark;
+		shadow(w,&x);
+	}
+
+	XmStringDraw(XtDisplay(w),XtWindow(w),
+	    smallfont(),
+	    s,
+	    blackGC(),    
+	    r->x + 52,
+	    r->y,
+	    r->width - 52,
+	    XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, NULL);
+
+	node::update(-1,-1,-1);
+}
+
+void meter_node::sizeNode(Widget w,XRectangle* r,bool tree)
+{
+	XmString s = tree?labelTree():labelTrigger();
+	r->height = XmStringHeight(smallfont(),s);
+	r->width  = XmStringWidth(smallfont(),s) + 54 ;
+	if(r->height<10) r->height = 10;
+}
+
+const char* meter_node::status_name() const
+{
+  static char buf[10];
+  sprintf(buf,"%d",value());
+  return buf;
+}
+
+void meter_node::info(std::ostream& f)
+{
+  node::info(f);
+  f << "value    : " << value()     << "\n";
+  f << "minimum  : " << minimum()   << "\n";
+  f << "maximum  : " << maximum()   << "\n";
+  f << "threshold: " << threshold() << "\n";
+}
+
+int meter_node::minimum()
+{
+#ifdef BRIDGE
+  if (tree_) return ((sms_meter*) tree_)->min;
+#endif
+  return get().min();
+}
+
+int meter_node::maximum()
+{
+#ifdef BRIDGE
+  if (tree_) return ((sms_meter*) tree_)->max;
+#endif
+  return get().max();
+}
+
+int meter_node::value() const
+{
+#ifdef BRIDGE
+  if (tree_) return ((sms_meter*) tree_)-> status;
+#endif
+  return get().value();
+}
+
+int meter_node::threshold()
+{
+#ifdef BRIDGE
+  if (tree_) return ((sms_meter*) tree_)->color;
+#endif
+  return get().colorChange();
+}
+
+void meter_node::perlify(FILE* f)
+{
+}
+
+Boolean meter_node::visible() const { return show::want(show::meter); }
+
+
diff --git a/ecflow_4_0_7/view/src/meter_node.h b/ecflow_4_0_7/view/src/meter_node.h
new file mode 100644
index 0000000..8f1d914
--- /dev/null
+++ b/ecflow_4_0_7/view/src/meter_node.h
@@ -0,0 +1,59 @@
+#ifndef meter_node_H
+#define meter_node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+
+class meter_node : public node {
+public:
+
+  const std::string name_;
+  meter_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+  meter_node(host& h,sms_node* n, char b);
+#endif
+  int minimum();
+  int maximum();
+  int value() const;
+  int threshold();
+
+protected:
+
+  virtual void perlify(FILE*);
+
+private:
+
+	meter_node(const meter_node&);
+	meter_node& operator=(const meter_node&);
+
+	virtual void info(std::ostream&);
+	virtual void drawNode(Widget w,XRectangle* r,bool);
+	virtual void sizeNode(Widget w,XRectangle* r,bool);
+	virtual xmstring make_label_tree();
+
+	virtual Boolean visible() const;
+	virtual const char* status_name() const;
+
+	const Meter& get() const;
+};
+
+inline void destroy(meter_node**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/node.cc b/ecflow_4_0_7/view/src/node.cc
new file mode 100644
index 0000000..7c90ee1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node.cc
@@ -0,0 +1,1086 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #49 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "node.h"
+#include "gui.h"
+#include <Xm/ManagerP.h>
+#include <Xm/DrawP.h>
+#include <algorithm>
+#include <typeinfo>
+#include <Flag.hpp>
+
+#ifndef node_lister_H
+#include "node_lister.h"
+#endif
+
+#include "dummy_node.h"
+#include "variable_node.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+#ifndef globals_H
+#include "globals.h"
+#endif
+
+#ifndef host_H
+#include "host.h"
+#endif
+
+#include "trigger_lister.h"
+#include "selection.h"
+#include "substitute.h"
+#include "relation.h"
+#include "str.h"
+#include "option.h"
+#include "array.h"
+#include <Suite.hpp>
+
+class node_data {
+
+	xmstring labelTrigger_;
+	array<node*> triggered_;
+	array<node*> triggers_;
+	array<node_info*> info_;
+
+public:
+	node_data();
+	~node_data();
+
+	const xmstring& labelTrigger() { return labelTrigger_; }
+	void labelTrigger(const xmstring&);
+
+	void add_triggered(node*,node*);
+	void triggered(trigger_lister&);
+
+	void add(node_info*);
+	void remove(node_info*);
+	void remove(const str& s) { remove(get(s)); }
+	node_info* get(const str&);
+};
+
+
+node_data::node_data():
+	labelTrigger_()
+{
+}
+
+node_data::~node_data()
+{
+	labelTrigger(xmstring());	
+	for(int i = 0; i < info_.count(); i++)
+		delete info_[i];
+}
+
+void node_data::add(node_info* n)
+{
+	for(int i = 0; i < info_.count(); i++)
+	{
+		if(info_[i]->name() == n->name())
+		{
+			delete info_[i];
+			info_[i] = n;
+			return;
+		}
+	}
+	info_.add(n);
+}
+
+void node_data::remove(node_info *n)
+{
+	info_.remove(n);
+}
+
+node_info* node_data::get(const str& s)
+{
+	for(int i = 0; i < info_.count(); i++)
+		if(info_[i]->name() == s)
+			return info_[i];
+	return 0;
+}
+
+
+void node_data::labelTrigger(const xmstring& s)
+{
+	labelTrigger_ = s;
+}
+
+void node_data::add_triggered(node* n,node* t)
+{
+	triggered_.add(n);
+	triggers_.add(t);
+}
+
+void node_data::triggered(trigger_lister& l)
+{
+  for(int i = 0; i < triggered_.count(); i++)
+    l.next_node(*triggered_[i],0,trigger_lister::normal,triggers_[i]);
+}
+
+int node::status() const
+{ 
+#ifdef BRIDGE
+  if (tree_) return tree_->status;  
+#endif
+  return owner_ ? owner_->status() : STATUS_UNKNOWN;
+}
+
+node_data* node::get_node_data()
+{
+  if(data_ == 0)
+    data_ = new node_data();
+  return data_;
+}
+
+template<class T>
+inline node* _node_of(T* n)
+{  
+  return n ? n->xnode() : 0x0;
+}
+
+node::node(host& h,ecf_node* owner)
+  : 
+  xnode(this)
+  ,type_(owner ? owner->type() : NODE_UNKNOWN)
+  ,tree_(0) // BRIDGE
+  ,next_(0)
+  ,kids_(0)
+  ,owner_(owner)
+  ,host_(h)
+  ,folded_(True)
+  ,labelTree_()
+  ,helper_(0)
+  ,data_(0)
+  ,triggered_(false)
+{
+}
+
+node::~node()
+{
+  // std::cerr << "# node del: " << full_name() << std::endl;
+  if (data_) delete data_;
+  data_ = 0x0;
+}
+
+void node::reset()
+{
+  if(data_)      
+    data_->labelTrigger(xmstring());
+  
+  labelTree_ = xmstring();
+  
+  if(kids_) kids_->reset();
+  if(next_) next_->reset();
+  
+  redraw();
+}
+
+void node::scan(node* first,node *current)
+{
+  node *n = current;
+  if (n)
+  if(n && n->name() != name()) {
+    n = first;
+    while(n && n->name() != name()) {
+      n = n->next_;
+    }
+  }
+
+  if(n) {
+    adopt(n);
+    if(kids_) 
+      kids_->scan(n->kids_,n->kids_);
+  } else {
+    create();
+    if(kids_) 
+      kids_->scan(0,0);
+  }
+
+  if(next_) 
+    next_->scan(first,n);
+}
+
+void node::adopt(node* old)
+{
+  folded_ = old->folded_;
+  old->notify_adoption(this);
+  notify_observers();
+}
+
+void node::create()
+{
+}
+
+#ifdef BRIDGE
+node_builder* node_builder::builders_[NODE_MAX] = { 0, };
+
+node* node::find(sms_node* n)
+{ return (node*) (n ? n->user_ptr : 0x0); }
+
+node::node(host& h,sms_node* owner,char b)
+  : xnode(this)
+  , type_(owner ? owner->type : NODE_UNKNOWN) 
+  , name_ (owner->name ? owner->name : "/")
+  , full_name_ (sms_node_full_name(owner))
+  , tree_(owner)
+  , next_(0)
+  , kids_(0)
+  , owner_(new ecf_concrete_node<node>((int)0, 0))
+  , host_(h)
+  , folded_(True)
+  , labelTree_()
+  , helper_(0)
+  , data_(0)
+  , triggered_(false)
+{
+  if (owner) {
+    // if (owner->name) name_ = owner->name;
+    kids_ = node::create(h,owner->kids,b);
+    next_ = node::create(h,owner->next,b);
+    owner->user_ptr = this;
+  }
+}
+
+node* node_builder::build(host& h,sms_node* n,char b)
+{
+  if(n->type >= 0 && 
+     n->type < NODE_MAX && builders_[n->type] != 0) {
+    if (builders_[n->type] != 0x0)
+      return builders_[n->type]->make(h,n,b);
+    else
+      std::cerr << "unregistered type " << n->type << "\n";
+  }
+  return 0;
+}
+
+node* node::create(host& h, sms_node* n, char b)
+{
+  if(!n) return 0x0;
+  node* p = node_builder::build(h,n,b);
+  return p?p:node::create(h,n->next,b);
+}
+
+void node::schanged(sms_node *n,int oldstatus,int oldtryno,int oldflags,void*)
+{
+  node* p = 0x0;
+  if (n) p = (node*) n->user_ptr;
+  if(p) {
+    try {
+      p->update(oldstatus,oldtryno,oldflags);
+      p->notify_observers();
+      p->redraw();
+    } catch (...) {
+      printf(" exception in node::changed\n");
+    }
+  } else {
+    if (n->type >= NODE_MAX) return;
+    printf("# Got NID for %s",::ecf_node_name(n->type));
+    // while(n) {printf("#  %s",n->full_name().c_str()); n = n->parent; }
+    printf("# --- \n");
+  }
+}
+
+#endif
+
+void node::destroy(node* n)
+{
+  while(n) {
+    Widget w = n->widget();
+    node*  next = n->next_;
+    CompositeWidget c = (CompositeWidget)w;
+    if (c) XtUnmanageChildren(c->composite.children,
+			      c->composite.num_children);
+
+    destroy(n->kids_);
+    n->kids_ = 0x0;
+    if (n->owner_) 
+      n->owner_->adopt(0x0);    
+
+    delete n;
+    n = next;
+  }
+  // n = 0x0;
+}
+
+void node::drawBackground(Widget w,XRectangle* r,bool tree)
+{
+  if(!tree)
+    XClearArea(XtDisplay(w),XtWindow(w),
+	       r->x,r->y,r->width,r->height,False);
+}
+
+void node::drawNode(Widget w,XRectangle* r,bool tree)
+{
+	drawBackground(w,r,tree);
+
+	XmString s   = tree ? labelTree() : labelTrigger();
+	XmFontList f = smallfont();
+        
+        XmStringDraw(XtDisplay(w),XtWindow(w),
+                     f,
+                     s,
+                     blackGC(),
+                     r->x,
+                     r->y+2,
+                     r->width,
+                     XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, r);
+}
+
+void node::sizeNode(Widget w,XRectangle* r,bool tree)
+{
+	XmString s   = tree ? labelTree() : labelTrigger();
+	XmFontList f = smallfont();
+	r->width    = XmStringWidth(f,s)  + 4;
+	r->height   = XmStringHeight(f,s) + 4;
+}
+
+void node::shadow(Widget w,XRectangle *r,bool out)
+{
+	XmManagerWidget m = (XmManagerWidget)w;
+	_XmDrawShadows(XtDisplay(w),XtWindow(w),
+                       m->manager.top_shadow_GC,
+                       m->manager.bottom_shadow_GC, 
+                       r->x,
+                       r->y,
+                       r->width,
+                       r->height,
+                       1,out?XmSHADOW_OUT:XmSHADOW_IN);
+}
+
+
+const xmstring& node::labelTree()
+{
+  if(labelTree_ == 0)
+    labelTree_ = make_label_tree();
+  return labelTree_;
+}
+
+xmstring node::make_label_tree()
+{
+  return xmstring(name().c_str());
+}
+
+const xmstring& node::labelTrigger()
+{
+  node_data* d = get_node_data();
+  if(d->labelTrigger() == 0)
+    d->labelTrigger(make_label_trigger());
+  return d->labelTrigger();
+}
+
+xmstring node::make_label_trigger()
+{
+  return xmstring(full_name().c_str());
+}
+
+void node::append(node* n)
+{
+  if (!n) return;
+  node *k = kids_;
+  node *p = 0;
+  while(k) {
+    p = k;
+    k = k->next_;
+  }
+  if(p) p->next_ = n;
+  else  kids_    = n;
+}
+
+void node::insert(node* n)
+{
+  if (!n) return;
+  node* k = kids_; kids_ = n; append(k);
+}
+
+void node::changed(ecf_node *n,int oldstatus,int oldtryno,int oldflags,void*)
+{
+  node* p = _node_of(n);
+  if (!n) return;
+  if(p) {
+    try {
+      p->update(oldstatus,oldtryno,oldflags);
+      p->notify_observers();
+      p->redraw();
+    } catch (...) { printf(" exception in node::changed\n"); }
+  } else {
+#ifdef BRIDGE
+    if (n->type() >= NODE_MAX) return;
+    printf("# Got NID for %s",::ecf_node_name(n->type()));
+    while(n) {
+      printf("#  %s",n->full_name().c_str());
+      n = n->parent();    
+    }
+    printf("# --- \n");
+#endif
+  }
+}
+
+void node::update(int,int,int)
+{
+  labelTree_ = xmstring();
+  if(data_) data_->labelTrigger(xmstring());
+}
+
+Boolean node::visible() const
+{
+  return True;
+}
+
+int node::type()   const { 
+  return type_;
+}
+
+Boolean node::show_it() const
+{
+  return this == selection::current_node();
+}
+
+const std::string& node::name() const
+{
+#ifdef BRIDGE
+  if (tree_) { return name_; }
+#endif
+  if (owner_) return owner_->name();
+  return ecf_node::no_owner();
+}
+
+const std::string& node::full_name() const
+{
+#ifdef BRIDGE
+  if (tree_) { return full_name_; }
+#endif
+  if (owner_) return owner_->full_name();
+  return ecf_node::no_owner();
+}
+
+const std::string& node::net_name() const
+{
+#ifdef BRIDGE
+  if (tree_) { static std::string fn = sms_node_full_name(tree_); return fn; }
+#endif
+  if (owner_) return owner_->full_name();
+  return ecf_node::no_owner();
+}
+
+Pixel node::color() const
+{
+  return colors(STATUS_UNKNOWN);
+}
+
+
+void node::search(node_lister& s)
+{
+  node *n = this;
+  while(n) {
+    s.next(*n);
+    node* k = n->kids();
+    if(k) k->search(s);
+    n = n->next();
+  }
+}
+
+std::string node::variable(const std::string& name, bool subsitute)
+{
+  for (node* run = kids(); run; run = run->next())
+    if (run->type() == NODE_VARIABLE && run->name() == name) {
+      return ((variable_node*) run)->get_var(subsitute);
+    }
+  
+  return ecf_node::none();
+}
+
+node* node::find(ecf_node* n)
+{
+  return _node_of(n);
+}
+
+static node* finder(const std::string& name, const node* start) {
+   node *n = const_cast<node*> (start);
+   while (n) {
+      if (n->type() == NODE_TRIGGER || n->type() == NODE_COMPLETE) {
+         if (n->definition() == name)
+            return n;
+         else if (n->__node__()->name() == name)
+            return n;
+         else if (n->__node__()->toString() == name)
+            return n;
+         ecf_node *owner = n->__node__();
+         if (owner) {
+            ExpressionWrapper *exp = dynamic_cast<ecf_concrete_node<ExpressionWrapper>*> (owner)
+	           ->get();
+            if (exp && exp->expression() == name)
+               return n;
+         }
+      }
+      node *k = 0;
+      if ((k = finder(name, n->kids())))
+         return k;
+      n = n->next();
+   }
+   return 0;
+}
+
+node* node::find_trigger(const std::string& name) const
+{
+  node* k = finder(name, this);
+  return k ? k : &dummy_node::get(name);
+}
+
+node* node::find_limit(const std::string& path, const std::string& name)
+{
+   node *f = this;
+   // if (!strncmp("/", path.c_str(), 1))
+   if (!path.empty() && path[0] == '/')
+      if (! (f = serv().top()->find(path)))
+         return &dummy_node::get(path + ":" + name);
+
+   for (node *n = f->kids(); n != 0; n = n->next()) {
+      if (n->type() == NODE_LIMIT && n->name() == name)
+         return n;
+   }
+
+   for (node *p = f->parent()->kids(); p != 0; p = p->next()) {
+      if (p->type() == NODE_FAMILY || p->type() == NODE_TASK || p->type() == NODE_SUITE)
+         if (p->name() == path.substr(0, p->name().size())) {
+            std::string::size_type next = path.find('/');
+            if (next != std::string::npos)
+               return p->find_limit(path.substr(next+1, path.size()), name);
+         }
+   }
+
+   return &dummy_node::get(path + ":" + name);
+}
+
+// Trigger proccessing
+
+struct triggered_lister : public trigger_lister {
+  node*           n_;
+public:
+  triggered_lister(node* n) : n_(n) {}
+  
+  void next_node(node& n,node*,int,node* t) 
+  { n.add_triggered(n_,t); }
+};
+
+void node::add_triggered(node* n,node* t)
+{
+  if(data_ == 0) data_ = new node_data();
+  data_->add_triggered(n,t);
+}
+
+void node::gather_triggered(node* p)
+{
+  while(p) {
+    triggered_lister tl(p);
+    p->triggers(tl);
+    p->triggered_ = true;
+    gather_triggered(p->kids());
+    p = p->next();
+  }
+}
+
+struct kids_triggered_lister : public trigger_lister {
+  trigger_lister& l_;
+  node* k_;
+  node* n_;
+public:
+  kids_triggered_lister(node *n, node* k,trigger_lister& l):
+     l_(l), k_(k), n_(n)  {}
+  
+  void next_node(node& n,node* p,int,node* t) {
+    if(!n.is_my_parent(n_))
+      l_.next_node(n,k_,trigger_lister::child,t);
+  }
+};
+
+static void triggered_by_kids(node* n,node *k,trigger_lister& l)
+{
+  while(k) {
+    kids_triggered_lister ktl(n,k,l);
+    k->triggered(ktl);
+    triggered_by_kids(n,k->kids(),l);
+    k = k->next();
+  }
+}
+
+struct parent_triggered_lister : public trigger_lister {
+  node* n_;
+  node* p_;
+  trigger_lister& l_;
+public:
+  parent_triggered_lister(node *n, node* p,trigger_lister& l):
+    n_(n), p_(p), l_(l) {}
+  
+  void next_node(node& n,node* p,int,node* t) {
+    l_.next_node(n,p_,trigger_lister::parent,t);
+  }
+};
+
+static void triggered_by_parent(node* n,node *p,trigger_lister& l)
+{
+  while(p) {
+    parent_triggered_lister ptl(n,p,l);
+    p->triggered(ptl);
+    p = p->parent();
+  }
+}
+
+void node::triggered(trigger_lister& l)
+{       
+  if(!triggered_) // Scan all tree
+    gather_triggered(serv().top());
+  
+  if(data_) data_->triggered(l);
+  
+  if(l.kids()) triggered_by_kids(this,kids(),l);
+  if(l.parents()) triggered_by_parent(this,parent(),l);
+}
+
+void node::triggers(trigger_lister&)
+{
+}
+
+//============================================================
+
+const std::vector<std::string>& node::messages() const 
+{ 
+#ifdef BRIDGE
+  if (tree_) return serv().messages(*this);
+#endif
+  return serv().messages(*this);  
+} 
+
+//============================================================
+node* node_find(node* n, std::string path) {
+  std::string::size_type pos = path.find("/");
+  std::string::size_type beg = 0;
+  if (!n) return n;
+  while (path[beg] == '/') ++beg;
+  node *kid = n->kids();
+  while (kid) {
+    if (kid->type() != NODE_SUITE && 
+	kid->type() != NODE_FAMILY && 
+	kid->type() != NODE_TASK ) {kid = kid->next(); continue;}
+    if (kid->name() == path.substr(beg, pos-beg)) {
+      if (pos ==  std::string::npos)
+	return kid;
+      else 
+	return node_find(kid, path.substr(pos));
+    }
+    kid = kid->next();      
+  }
+  return kid;
+}
+
+node* node::find(const std::string name) 
+{
+  node * top = 0x0;
+  node_ptr ptr;
+  std::string::size_type pos = name.find(":");
+  if (pos == std::string::npos) { // not an attribute
+    ecf_concrete_node<Defs> * ecfn = 0x0;
+    if (0x0 != (top = serv().top())) {
+    ecfn = dynamic_cast<ecf_concrete_node<Defs>*>(top->__node__());
+    if (0x0 != ecfn) // ok with a node, NOK with attribute
+      try {
+	if (const_cast<Defs*>(ecfn->get()))
+	  ptr = const_cast<Defs*>(ecfn->get())->findAbsNode(name);    
+      } catch (...) { 
+         fprintf(stderr, "exception with node.cc:find %s\n", name.c_str());
+      }
+    }
+  } else {
+    const char* fname = full_name().c_str();
+    size_t len1 = name.size(), len2 = strlen(fname);
+    if (len1==len2 && !strcmp(name.c_str(), fname)) return this;
+    if (len2 < len1 && !strncmp(name.c_str(), fname, len2) 
+	&& kids_) return kids_->find(name);
+    if (next_) return next_->find(name);
+    return 0x0;
+  }
+  if (0x0 != ptr.get()) {
+    return (node*) ptr.get()->graphic_ptr(); 
+  } 
+  else if (name == "/") 
+    return serv().top();
+
+  return node_find(serv().top(), name);
+  /*   if (item == 0x0) 
+    std::cout << "# not found:" << name << "\n";
+    return item; */
+}
+
+//============================================================
+
+node* node::parent() const
+{  
+#ifdef BRIDGE
+  if (tree_) if (tree_->parent) return (node*) tree_->parent->user_ptr;
+#endif
+  if (owner_) { 
+    ecf_node *p = owner_->parent();
+    return p ? p->xnode() : 0x0;
+  }
+  return 0x0;
+}
+
+const char* node::type_name() const
+{
+  
+  return ecf_node_name(type());	
+}
+
+const char* node::status_name() const
+{
+  return "??";
+}
+
+//============================================================
+
+node* node::variableOwner(const char *name)
+{
+  std::vector<Variable>::const_iterator it;
+  node *m = this;
+  while(m) {
+    { std::vector<Variable> var; m->variables(var);
+      for (it = var.begin(); it != var.end(); ++it)
+	if (it->name() == name) return m;
+    }
+    { std::vector<Variable> var; m->genvars(var);
+      for (it = var.begin(); it != var.end(); ++it)
+	if (it->name() == name) return m;
+    }
+    m = m->parent();
+  }
+  return 0;
+}
+
+Boolean node::isGenVariable(const char *name) { return False; }
+
+void node::folded(Boolean f)
+{ 
+  if(f) {
+    folded_ = false;
+    node *k = kids_;
+    while(k) {
+      if(k->visible() || k->show_it()) {
+	folded_ = true;
+	break;
+      }
+      k = k->next();
+    }
+  } else 
+    folded_ = f;
+  
+  redraw();
+}
+
+void node::why(std::ostream&)
+{
+}
+
+bool node::evaluate() const
+{
+  return false;
+}
+
+void node::tell_me_why(std::ostream&)
+{
+}
+
+void node::suspended(std::ostream&)
+{
+}
+
+void node::aborted(std::ostream&)
+{
+}
+
+void node::queued(std::ostream&)
+{
+}
+
+bool node::is_my_parent(node* p) const
+{
+  const node* n = this;
+  while(n) {
+    if(n == p)
+      return true;
+    n = n->parent();
+  }
+  return false;
+}
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+void node::info(std::ostream& f)
+{
+  using namespace boost::posix_time;
+  using namespace boost::gregorian;
+
+  f << "name     : " << name() << "\n";
+  f << "type     : " << type_name() << "\n";
+  f << "status   : " << status_name() << "\n";
+
+  if (owner_) {
+    // if (owner_->type() == NODE_TASKtas ) 
+    {
+       boost::posix_time::ptime state_change_time = owner_->status_time();
+       if (!state_change_time.is_special()) {
+          f << "at       : " << to_simple_string(state_change_time) << "\n"; // https://software.ecmwf.int/issues/browse/SUP-649
+       }
+    }
+  }
+  f << "----------\n";
+  //    1234567890
+}
+
+const std::string node::toString() const
+{ 
+#ifdef BRIDGE
+  if (tree_) { return sms_node_full_name(tree_); }
+#endif
+  if (owner_) return owner_->toString();
+  return ecf_node::none();
+}
+
+node* node::find_match(const char* p) 
+{
+  if (p == NULL) return 0;
+  const char* found = find_name(p);
+  if (found == NULL) return 0;
+  return find(found);
+}
+
+const char* node::find_name(const char* p)
+{
+  static char name[1024];
+  strcpy(name,p);   
+
+  char *q = name;
+  
+  while(*q && *q != '/') q++;
+  if(*q) {
+    char* r =  q;
+    while(*q && *q != ' ' && *q != '\t') q++;
+    *q = 0;
+    return r;
+  }
+  return 0;
+}
+
+time_t node::suite_time()
+{
+  node *xnode = this;
+  while(xnode) {
+    if(xnode->type() == NODE_SUITE)
+      return 0; // FILL
+    xnode = xnode->parent();
+  }   
+  return 0;
+}
+
+bool node::match(const char* n)
+{
+  return strstr(name().c_str(),n) != 0;
+}
+
+void node::command(const char* cmd)
+{
+  serv().command(substitute(cmd));
+}
+
+std::string node::substitute(const char* cmd)
+{
+  try {
+    return substitute::scan(cmd,this);
+  } catch ( std::exception& e ) {
+    return cmd;
+  }
+
+}
+
+void node::edit(node_editor&)
+{
+}
+
+void node::apply(node_editor&)
+{
+}
+
+node_info* node::get_node_info(const str& s)
+{
+	return data_?data_->get(s):0;
+}
+
+void node::add_node_info(node_info* n)
+{
+	get_node_data()->add(n);
+}
+
+void node::remove_node_info(node_info* n)
+{
+	if(data_) data_->remove(n);
+}
+
+void node::remove_node_info(const str& n)
+{
+	if(data_) data_->remove(n);
+}
+
+const char* node::html_page(url& u)
+{
+	return "node.html";
+}
+
+void node::html_name(FILE* f,url& u)
+{
+  fprintf(f,"<a href=\"%s\">%s</a>",net_name().c_str()+1,name().c_str());
+}
+
+void node::html_title(FILE* f,url& u)
+{
+  if(parent()) parent()->html_title(f,u);
+  fprintf(f,"/<a href=\"%s\">%s</a>",net_name().c_str()+1,name().c_str());
+}
+
+bool node::is_json = false; // set by url.cc
+void node::as_perl(FILE* f,bool full)
+{
+  if (node::is_json) {
+    fprintf(f,"{\n");
+  } else 
+    fprintf(f,"bless({\n");
+
+  perl_member(f,"name",name());
+  perl_member(f,"full", full_name());
+  perl_member(f,"status", status());
+  perl_member(f,"status_name", status_name());
+  
+  if(full) perlify(f);
+  
+  if (node::is_json) {
+    fprintf(f,"\"class\": \"%s\" }", perl_class());
+  } else fprintf(f,"},'ecf::node::%s')",perl_class()); 
+}
+
+void node::perl_member(FILE* f,const char* p,const char* v)
+{
+  if(v) {
+    if (node::is_json) { 
+      unsigned int i = 0; char *c; char bak[1024]; strncpy(bak, v, 1024);
+      for (c = bak; i<strlen(v) && i<1024; c++, i++) {
+	if (*c == '"') *c = '\'';
+      }
+      fprintf(f,"\"%s\": \"%s\",\n",p,bak); } else 
+      fprintf(f,"%s=>'%s',\n",p,v);
+  }
+}
+
+void node::perl_member(FILE* f,const std::string& p,const std::string&v)
+{
+  perl_member(f, p.c_str(), v.c_str()); /*
+  if (node::is_json) { 
+    std::string bak = v;
+    for (unsigned int i=0; i<bak.size(); i++) {
+      if (bak[i] == '"') bak[i] = '\'';
+    }
+    fprintf(f,"\"%s\": \"%s\",\n",p.c_str(),bak.c_str()); } else 
+    { fprintf(f,"%s=>%s,\n",p.c_str(),v.c_str()); } */
+}
+
+void node::perl_member(FILE* f,const char * p, int v)
+{
+  if (node::is_json) fprintf(f,"\"%s\": \"%d\",\n",p,v); else 
+  fprintf(f,"%s=>%d,\n",p,v);
+}
+
+void node::perl_member(FILE* f,const char* p,ecf_list* v)
+{
+  if (node::is_json) {
+    fprintf(f,"\"%s\": [\n",p);
+    while(v) {
+      fprintf(f,"'name': '%s',\n",v->name().c_str());
+      v = v->next;
+    }
+    fprintf(f,"\n],\n");
+  return; }
+
+  fprintf(f,"%s=>[\n",p);
+  while(v) {
+    fprintf(f,"'%s',",v->name().c_str());
+    v = v->next;
+  }
+  fprintf(f,"\n],\n");
+} 
+
+static proc_substitute s_full_name("<full_name>",&node::full_name);
+static proc_substitute s_node_name("<node_name>",&node::node_name);
+static proc_substitute s_parent_name("<parent_name>",&node::parent_name);
+
+void node::check() {
+  if (__node__() == 0x0) 
+    std::cerr << "# node: no owner: " << name() << "\n";
+  if (parent() == 0x0) 
+    std::cerr << "# node: no parent: " << name() << "\n";
+  node *n;
+  for(n = kids(); n; n = n->next())
+    { n->check(); }
+  if ((n = next())) n->check();
+}
+
+bool node::ondemand(bool full) 
+{
+  // ecf_node *ec = owner_;
+  // if (0 == ec) return false;
+  // else if (0 != kids()) return false; // gen variables at least 
+  // printf("demanding\n");
+  // ec->make_subtree(); node *xnode = ec->create_tree(serv()); ec->adopt(xnode); 
+  // serv().redraw();
+  return false;
+}
+
+const std::string& node::parent_name() const 
+{
+  if (parent())
+    return parent()->full_name();
+  return ecf_node::none();
+}
+
+void node::delvars() {
+}
+
+void node::unlink(bool detach) { 
+  if (__node__()) __node__()->unlink(detach); 
+  for (node *run = kids(); run; run = run->next()) 
+    { run->unlink(detach); }
+}
+
+void node::remove() {
+  node *top = parent();
+  if (!top) return;
+  node *run = top->kids_;
+  
+  if (run == this) {
+    top->kids_ = this->next_;
+  } else
+    while (run) {
+      if (run->next_ == this) {
+	run->next_ = this->next_;
+	break;
+      }
+      run = run->next_;
+    }
+}
diff --git a/ecflow_4_0_7/view/src/node.h b/ecflow_4_0_7/view/src/node.h
new file mode 100644
index 0000000..cf70f28
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node.h
@@ -0,0 +1,350 @@
+#ifndef node_H
+#define node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #33 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "ecflowview.h"
+
+class host;
+class node;
+class trigger_lister;
+class node_lister;
+class node_editor;
+class node_data;
+class ostream;
+class url;
+#include "ecf_node.h" // class ecf_node;
+
+#ifndef xnode_H
+#include "xnode.h"
+#endif
+
+#ifndef observable_H
+#include "observable.h"
+#endif
+
+#ifndef gui_H
+#include "gui.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifndef xmstring_H
+#include "xmstring.h"
+#endif
+
+#ifdef BRIDGE
+extern "C" {
+#define new _new
+#define delete _delete
+#undef NODE_MAX
+#include "sms.h"
+#include "smsproto.h"
+#undef new
+#undef delete
+}
+#endif
+
+template<class T>
+class lister;
+
+class node_info {
+public:
+	virtual ~node_info()      {}
+	virtual const str& name() = 0;
+};
+
+class node : public observable, public xnode {
+  friend class ecf_node;
+  friend class tree;
+  int type_;
+public:
+
+  static bool is_json;
+
+	void scan(node* n) { scan(n,n); }
+
+	virtual void update(int,int,int);
+	void remove();
+
+	node* next()  const { return next_; }
+	node* kids()  const { return kids_; }
+	host& serv()  const { return host_; }
+
+	virtual node* parent() const;
+
+	virtual Boolean visible() const;
+	virtual Boolean show_it() const;
+	virtual Boolean visible_kid() const { return false; }
+
+	virtual Boolean menus()      { return True; }
+	virtual Boolean selectable() { return True; }
+
+	virtual const std::string& name() const;
+	virtual const std::string& full_name() const;
+	virtual const std::string& node_name() const { return name(); }
+	virtual const std::string& net_name() const;
+	virtual const std::string& parent_name() const; 
+	virtual const std::string& definition() const { return full_name(); }
+
+	virtual void adopt(node*);
+	virtual void create();
+
+#ifdef BRIDGE
+	const std::string name_;
+	const std::string full_name_;
+	static node* create(host&h,sms_node* n,char = 0);
+	static void schanged(sms_node*,int,int,int,void*);
+	static node* find(sms_node*);
+
+ protected:
+	node(host& h,sms_node* owner, char b);
+	sms_node
+#else
+ protected:
+	void
+#endif
+	  *tree_;
+ public:
+	virtual void reset();
+	void delvars();
+
+	virtual void search(node_lister&);
+	virtual void info(std::ostream&);
+	virtual const std::string toString() const;
+	virtual std::string substitute(const char*);
+	virtual void command(const char*);
+
+	virtual void tell_me_why(std::ostream&);
+	virtual void why(std::ostream&);
+	virtual bool evaluate() const;
+	virtual void suspended(std::ostream&);
+	virtual void aborted(std::ostream&);
+	virtual void queued(std::ostream&);
+
+	virtual void triggers(trigger_lister&);
+	virtual void triggered(trigger_lister&);
+
+	Boolean folded()       { return folded_; }
+	virtual void folded(Boolean f);
+
+	virtual Boolean ecfFlag(int)  const { return False; }
+
+	virtual void genvars(std::vector<Variable>&) {};
+	virtual void variables(std::vector<Variable>&) {};
+
+	virtual const char*         type_name() const;
+	virtual const char*         status_name() const;
+
+	void insert(node*);
+
+	virtual int type()   const;
+	virtual int status() const;
+	virtual boost::posix_time::ptime status_time() const 
+	  { return boost::posix_time::ptime(); }
+
+	virtual int tryno()  const { return 0; }
+	virtual int flags()  const { return 0; }
+	const std::vector<std::string>& messages() const;
+
+	virtual Boolean isSimpleNode()const { return False; }
+	virtual Boolean hasTriggers() const { return False; }
+	virtual Boolean hasDate() const     { return False; }
+	virtual Boolean hasTime() const     { return False; }
+
+	virtual Boolean hasTimeHolding() const     { return False; }
+
+	virtual Boolean hasManual() const   { return False; }
+	virtual Boolean hasInfo() const     { return True;  }
+	virtual Boolean isMigrated() const  { return False; }
+	virtual Boolean isLate() const      { return False; }
+	virtual Boolean isWaiting() const   { return False; }
+	virtual Boolean hasMessages() const { return False; }
+	virtual Boolean isTimeDependent() const   { return False; }
+	virtual Boolean isRerun() const     { return  False; }
+	virtual Boolean isLocked() const    { return  False; }
+
+	virtual Boolean isDefComplete() const     { return False; }
+	virtual Boolean isZombie() const    { return  False; }
+	virtual Boolean hasZombieAttr() const    { return  False; }
+	virtual Boolean isToBeChecked() const    { return  False; }
+	virtual Boolean hasText() const    { return  False; }
+
+	virtual Boolean isForceAbort() const    { return  False; }
+	virtual Boolean isUserEdit() const    { return  False; }
+	virtual Boolean isTaskAbort() const    { return  False; }
+	virtual Boolean isEditFailed() const    { return  False; }
+	virtual Boolean isCmdFailed() const    { return  False; }
+	virtual Boolean isScriptMissing() const    { return  False; }
+	virtual Boolean isKilled() const    { return  False; }
+	virtual Boolean isByRule() const    { return  False; }
+	virtual Boolean isQueueLimit() const    { return  False; }
+
+	Boolean isFolded() const      { return folded_; }
+
+	virtual void active(bool) {}
+	virtual void up_to_date() {}
+
+	virtual bool trigger_kids() const { return false; }
+	virtual bool trigger_parent() const { return false; }
+	virtual bool show_in_dependancies() const { return false; }
+	virtual void add_triggered(node*,node*);
+	void unlink(bool detach=true);
+
+	void check();
+// ---------------------------
+
+	time_t suite_time();
+	node* find_trigger(const std::string& name) const;
+	node* find_limit(const std::string& path, const std::string& name);
+	node* find(const std::string n);
+	static const char* find_name(const char* name);
+	node* find_match(const char* name);
+
+// ---------------------------
+
+	virtual Pixel color() const;
+
+	virtual void drawNode(Widget,XRectangle*,bool);
+	virtual void sizeNode(Widget,XRectangle*,bool);
+	virtual void drawBackground(Widget,XRectangle*,bool);
+
+// ---------------
+
+	virtual void edit(node_editor&);
+	virtual void apply(node_editor&);
+
+// ---------------
+
+	virtual std::string variable(const std::string&, bool substitute=false);
+	virtual node* variableOwner(const char*);
+	virtual Boolean isGenVariable(const char*);
+
+	virtual bool is_my_parent(node*) const;
+
+	virtual bool match(const char*);
+
+	virtual node* graph_node() { return this; }
+
+// ----------------
+
+	virtual bool show_in_html(url&) { return false; }
+
+	virtual const char* html_page(url&);
+
+	virtual void html_name(FILE*,url&);
+	virtual void html_title(FILE*,url&);
+
+	virtual void html_why(FILE*,url&)       {}
+	virtual void html_output(FILE*,url&)    {}
+	virtual void html_manual(FILE*,url&)    {}
+	virtual void html_script(FILE*,url&)    {}
+	virtual void html_job(FILE*,url&)       {}
+	virtual void html_jobstatus(FILE*,url&) {}
+	virtual void html_kids(FILE*,url&)      {}
+	virtual void html_variables(FILE*,url&) {}
+
+	// ------------------------------
+	virtual void as_perl(FILE*,bool);
+	virtual void perlify(FILE*) = 0;
+	virtual const char* perl_class() { return type_name(); }
+
+	void perl_member(FILE*,const char*,const char*);
+	void perl_member(FILE*,const std::string&,const std::string&);
+	void perl_member(FILE*,const char*,int);
+	void perl_member(FILE*,const char*,ecf_list*);
+
+	static void destroy(node*);
+	static void changed(ecf_node*,int a=-1,int b=-1,int c=-1,void *d=0x0);
+	static node* find(ecf_node*);
+
+	static GC         blackGC()      { return gui::blackGC();   }
+	static GC         blueGC()       { return gui::blueGC();    }
+	static GC         redGC()        { return gui::redGC();     }
+	static XmFontList smallfont()    { return gui::smallfont(); }
+	static XmFontList fontlist()     { return gui::fontlist();  }
+	static Pixel      colors(int n)  { return gui::colors(n);   }
+	static GC         colorGC(int n) { return gui::colorGC(n);  }
+
+	void  helper(void* h) { helper_ = h;    }
+	void* helper()        { return helper_; }
+
+	node_info* get_node_info(const str&);
+	void add_node_info(node_info*);
+	void remove_node_info(const str&);
+	void remove_node_info(node_info*);
+
+	ecf_node* __node__() const { if (tree_) return 0x0; return owner_; }
+	bool ondemand(bool full=false); 
+protected:
+	node(host&,ecf_node*);
+
+	virtual ~node(); // Change to virtual if base class
+
+	node*     next_;
+	node*     kids_;
+	ecf_node *owner_;
+	host&     host_;
+	Boolean   folded_;
+
+	void append(node*);
+	const xmstring& labelTree();
+	const xmstring& labelTrigger();
+	static void shadow(Widget,XRectangle*,bool = true);
+
+ protected:
+	xmstring   labelTree_;
+
+private:
+
+	node(const node&);
+	node& operator=(const node&);
+
+	void*      helper_;
+	node_data* data_;
+	bool       triggered_;
+
+	node_data* get_node_data();
+
+	void scan(node*,node*);
+	void gather_triggered(node*);
+
+	virtual xmstring make_label_tree();
+	virtual xmstring make_label_trigger();
+
+	virtual void draw(Widget w,XRectangle* r) { drawNode(w,r,true); }
+	virtual void size(Widget w,XRectangle* r) { sizeNode(w,r,true); }
+};
+
+#ifdef BRIDGE
+class node_builder {
+protected:
+	static node_builder* builders_[NODE_MAX];
+public:
+	virtual node* make(host&,sms_node* n,char) = 0;
+	static  node* build(host& h,sms_node* n,char b);
+};
+
+template<class T> class node_maker : public node_builder {
+public:
+  node_maker(int n) { builders_[n] = this; }
+  virtual node* make(host& h,sms_node* n,char b) { return new T(h,n,b); }
+};
+#endif
+#endif
+
diff --git a/ecflow_4_0_7/view/src/node_alert.cc b/ecflow_4_0_7/view/src/node_alert.cc
new file mode 100644
index 0000000..1eebe2e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_alert.cc
@@ -0,0 +1,112 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "node_alert.h"
+#include "gui.h"
+#include "ecflowview.h"
+#include "node.h"
+#include "host.h"
+#include "selection.h"
+#include "collector.h"
+#include <Xm/List.h>
+extern "C" {
+#include "xec.h"
+}
+
+template<class T>
+node_alert<T>::node_alert(const char* title,int bg)
+  : alert_(getenv("ecflow_view_alert"))
+  , title_(title)
+  , bg_ (bg)
+{
+  create(gui::top());
+  set_menu(title);
+  XtVaSetValues(_xd_rootwidget,XmNtitle,title,NULL);
+  xec_SetLabel(label_,title);
+  if(bg != -1) {
+      XtVaSetValues(label_,XmNbackground,gui::colors(bg),NULL);
+      /* XtVaSetValues(form_,XmNforeground,gui::colors(bg),0); */     
+      /* XtVaSetValues(list_,XmNbackground,gui::colors(bg),0); */
+      /* XtVaSetValues(list_,XmNforeground,gui::colors(bg),0); */
+    }
+}
+
+
+template<class T>
+node_alert<T>::~node_alert()
+{}
+
+
+template<class T>
+void node_alert<T>::browseCB(Widget,XtPointer data)
+{
+    XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+	selection::notify_new_selection(find(cb->item));
+}
+
+
+
+template<class T>
+void node_alert<T>::clearCloseCB(Widget,XtPointer)
+{
+	reset();
+	XtUnmanageChild(form_);
+}
+
+template<class T>
+void node_alert<T>::closeCB(Widget,XtPointer)
+{
+	XtUnmanageChild(form_);
+}
+
+template<class T>
+void node_alert<T>::collectCB(Widget,XtPointer)
+{
+	XmString* items = 0;
+	int count = 0;
+
+	XtVaGetValues(list_,XmNitems,&items,XmNitemCount,&count,NULL);
+
+	for(int i = 0; i < count ; i++)
+	{
+		node *n = find(items[i]);
+		if(n) collector::show(*n);
+	}
+}
+  
+template<class T>
+void node_alert<T>::notify_system(node* n) {
+#ifdef linux
+/*
+  export ecflow_view_alert=1
+  notify-send -i 'dialog-information' 'Summary' \
+    '<b><font color=red>Message body.'
+ */
+  if(1 && alert_) {
+    char buff[1024];
+    const char *cmd = "kdialog --title ecFlowview::%s --passivepopup '<b><font color=%s> %s' 5; %s";
+    const char *sound = "play -q /usr/share/xemacs/xemacs-packages/etc/sounds/boing.wav";
+    snprintf(buff, 1024, cmd, 
+	     title_.c_str(),
+	     bg_ == STATUS_ABORTED ? "red" : "black",
+	     n ? name(n) : "",
+	     bg_ == STATUS_ABORTED ? sound : ""
+	     );
+    if (system(buff)) { std::cerr << "#node_alert!\n"; }
+  }
+#endif
+  }
diff --git a/ecflow_4_0_7/view/src/node_alert.h b/ecflow_4_0_7/view/src/node_alert.h
new file mode 100644
index 0000000..7cd41bd
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_alert.h
@@ -0,0 +1,76 @@
+#ifndef node_alert_H
+#define node_alert_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uinode_alert.h"
+#include "window.h"
+#include "singleton.h"
+#include "node_list.h"
+#include "gui.h"
+#include "node.h"
+
+class node;
+
+template<class T>
+class node_alert : public node_alert_shell_c, public window, 
+  public singleton<T>, public node_list {
+
+  const char* alert_;
+  void notify_system(node* n);
+ public:
+
+  node_alert(const char*,int = -1);
+  
+  virtual ~node_alert(); // Change to virtual if base class
+  
+  virtual Widget shell() { return _xd_rootwidget; }
+  virtual Widget list()  { return list_; }
+  virtual Widget form()  { return form_; }
+  
+  // HP compiler wants the 'singleton<T>::' specifier :-(
+  static void show()        
+  { if(gui::visible()) { singleton<T>::instance().add(0);singleton<T>::instance().notify_system(0);}}
+  
+  static void show(node& n) 
+  { if(gui::visible()) { singleton<T>::instance().add(&n);singleton<T>::instance().notify_system(&n); }}
+  
+  static void hide(node& n) 
+  { if(gui::visible()) singleton<T>::instance().remove(&n); }
+
+  static void clear()       
+  { if(gui::visible()) singleton<T>::instance().reset();  }
+
+private:
+
+	node_alert(const node_alert<T>&);
+	node_alert<T>& operator=(const node_alert<T>&);
+
+	std::string title_;
+	int bg_;
+
+	void browseCB(Widget,XtPointer);
+	void clearCloseCB( Widget, XtPointer ) ;
+	void closeCB( Widget, XtPointer ) ;
+	void collectCB( Widget, XtPointer ) ;
+};
+
+
+#if defined(__GNUC__) || defined(hpux) || defined(_AIX)
+#include "node_alert.cc"
+#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/node_editor.cc b/ecflow_4_0_7/view/src/node_editor.cc
new file mode 100644
index 0000000..3f77fc6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_editor.cc
@@ -0,0 +1,66 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "node_editor.h"
+
+#ifndef translator_H
+#include "translator.h"
+#endif
+
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+#include <Xm/Label.h>
+#include "xec.h"
+
+template<class T>
+static void node_editor_set(node_editor& e,const char* name, const T& t)
+{
+	str v = translator<T,str>()(t);
+	e.set(name,v);
+}
+
+template<class T>
+static void node_editor_get(node_editor& e,const char* name, T& t)
+{
+	str v;
+	e.get(name,v);
+	t = translator<str,T>()(v);
+}
+
+void node_editor::set(const char* name,int value)
+{
+	node_editor_set(*this,name,value);
+}
+
+void node_editor::get(const char* name,int& value)
+{
+	node_editor_get(*this,name,value);
+}
+
+void node_editor::set(const char* name,const str& value)
+{
+	Widget w = find(name); if(!w) return;
+	if(XmIsLabel(w))     xec_SetLabel(w,(char*)value.c_str());
+	if(XmIsText(w))      XmTextSetString(w,(char*)value.c_str());
+	if(XmIsTextField(w)) XmTextSetString(w,(char*)value.c_str());
+}
+
+void node_editor::get(const char* name,str& value)
+{
+	Widget w = find(name); if(!w) return;
+	char* p = XmTextGetString(w);
+	value = str(p);
+	XtFree(p);
+}
diff --git a/ecflow_4_0_7/view/src/node_editor.h b/ecflow_4_0_7/view/src/node_editor.h
new file mode 100644
index 0000000..a8f389f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_editor.h
@@ -0,0 +1,134 @@
+#ifndef node_editor_H
+#define node_editor_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifndef editor_H
+#include "editor.h"
+#endif
+
+
+class node_editor : public editor {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	node_editor() {}
+
+// -- Destructor
+
+	virtual ~node_editor() {} // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	virtual void set(const char*,const str&);
+	virtual void get(const char*,str&);
+
+	virtual void set(const char*,int);
+	virtual void get(const char*,int&);
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	node_editor(const node_editor&);
+	node_editor& operator=(const node_editor&);
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const node_editor& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(node_editor**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(node_editor);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/node_list.cc b/ecflow_4_0_7/view/src/node_list.cc
new file mode 100644
index 0000000..001d28f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_list.cc
@@ -0,0 +1,129 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "node_list.h"
+#include "opener.h"
+#include "node.h"
+#include "host.h"
+#include "str.h"
+#include "gui.h"
+#include "relation.h"
+#include "counted.h"
+#include "opener.h"
+#include <Xm/List.h>
+
+extern "C" {
+#include "xec.h"
+}
+
+class node_list_data : public counted {
+  str name_;
+public:
+  node_list_data(const char* n) : name_(n) {}
+  const char* name() { return name_.c_str(); }
+};
+
+node_list::node_list()
+{
+}
+
+node_list::~node_list()
+{
+}
+
+
+void node_list::remove(node* n)
+{
+  if (forget(n))
+    xec_RemoveListItem(list(),(char*)name(n));
+}
+
+
+void node_list::add(node* n,bool sel)
+{
+  if(n) {
+    const char *p = name(n);
+    if(xec_AddListItemUnique(list(),(char*)p,sel)) {
+      observe(n);
+      relation::set_data(this,n,new node_list_data(p));
+    }
+  }
+
+  static opener o;
+  o.show(form());
+  gui::raise();
+}
+
+
+void node_list::reset()
+{
+  forget_all();
+  XmListDeleteAllItems(list());
+}
+
+
+node* node_list::find(XmString s)
+{
+       char *p = xec_GetString(s);
+       char *q = p;
+
+       while(*q != ' ') q++;
+       *q = 0; q++;
+       while(*q == ' ') *q++ = 0;
+
+       node* n =   host::find(p,q);
+
+       if(!n) {
+         printf("node_list::find cannot find <%s> <%s>\n",p,q);
+       }
+
+       XtFree(p);
+       return n;
+}
+
+node* node_list::find(const char *p)
+{
+  xmstring s(p);
+       return find(s);
+}
+
+
+const char* node_list::name(node* n)
+{
+       static char buf[1024];
+       sprintf(buf,"%-8s %s",n->serv().name(),n->full_name().c_str());
+       return buf;
+}
+
+
+void node_list::notification(observable* o)
+{
+  node* n = (node*)o;
+  if(!keep(n))
+    remove(n);
+}
+
+void node_list::adoption(observable*,observable* o)
+{
+  node* n = (node*)o;
+  if(!keep(n))
+    remove(n);
+}
+
+void node_list::gone(observable* o)
+{
+  node_list_data* p = (node_list_data*)relation::get_data(this,o);
+  if(p) xec_RemoveListItem(list(),(char*)p->name());
+}
diff --git a/ecflow_4_0_7/view/src/node_list.h b/ecflow_4_0_7/view/src/node_list.h
new file mode 100644
index 0000000..d45efd1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_list.h
@@ -0,0 +1,62 @@
+#ifndef node_list_H
+#define node_list_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+class node;
+
+#include <Xm/Xm.h>
+#ifndef observer_H
+#include "observer.h"
+#endif
+
+class node_list : public observer {
+public:
+
+	node_list();
+
+	~node_list(); // Change to virtual if base class
+
+	virtual Widget list() = 0;
+	virtual Widget form() = 0;
+	virtual bool keep(node*) = 0;
+
+	virtual void add(node* n,bool sel = false);
+	virtual void remove(node* n);
+	virtual void reset();
+
+protected:
+
+	node* find(XmString);
+	node* find(const char*);
+	const char* name(node*);
+
+private:
+
+	node_list(const node_list&);
+	node_list& operator=(const node_list&);
+
+	virtual void notification(observable*);
+	virtual void adoption(observable*,observable*);
+	virtual void gone(observable*);
+};
+
+inline void destroy(node_list**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/node_lister.h b/ecflow_4_0_7/view/src/node_lister.h
new file mode 100644
index 0000000..069dfea
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_lister.h
@@ -0,0 +1,41 @@
+#ifndef node_lister_H
+#define node_lister_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef observer_H
+#include "observer.h"
+#endif
+
+#include <string>
+class node;
+
+class node_lister {
+public:
+
+	node_lister() {}
+
+	virtual ~node_lister() {}
+
+	virtual void next(node&) = 0;
+	virtual void next(const std::string) {}
+private:
+	node_lister(const node_lister&);
+	node_lister& operator=(const node_lister&);
+};
+
+inline void destroy(node_lister**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/node_window.cc b/ecflow_4_0_7/view/src/node_window.cc
new file mode 100644
index 0000000..af7f674
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_window.cc
@@ -0,0 +1,253 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "node_window.h"
+#include "menus.h"
+#include <Xm/Frame.h>
+#include <Xm/Label.h>
+#include <Xm/RowColumn.h>
+#include "xnode.h"
+#include "collector.h"
+#include "host.h"
+#ifdef AIX
+#include <X11/keysym.h>
+#endif
+node_window::node_window()
+{
+}
+
+node_window::~node_window()
+{
+}
+
+void node_window::linkCB(Widget w,XtPointer from,XtPointer cb_data)
+{
+	LinkCallbackStruct* cb = (LinkCallbackStruct*)cb_data;
+	node_window* t = (node_window*)from;
+
+		
+	xnode* x1 = (xnode*)cb->data1;
+	xnode* x2 = (xnode*)cb->data2;
+
+	node* n1 = x1?x1->get_node():0;
+	node* n2 = x2?x2->get_node():0;
+
+	t->link(cb->event,n1,n2);
+}
+
+void node_window::inputCB(Widget w,XtPointer from,XtPointer cb_data)
+{
+  XmDrawingAreaCallbackStruct* cb = (XmDrawingAreaCallbackStruct*)cb_data;
+
+  // printf("inputCB %d\n", cb->event->type);
+  if(cb->event->type == ButtonPress || cb->event->type == KeyPress) {
+    node_window* t = (node_window*)from;
+    t->click(cb->event); 
+  }
+}
+
+void node_window::click1(node* n,Boolean shift,Boolean control)
+{
+  // printf("raw_click1 %p %d %d\n",n,shift,control);
+  if(control && n)     collector::show(*n);
+  else if (shift && n) this->click2(n,0,control);
+  else                 selection::notify_new_selection(n);
+}
+
+void node_window::click2(node* n,Boolean shift,Boolean control)
+{
+}
+
+void node_window::click3(node* n,Boolean shift,Boolean control)
+{
+}
+
+void node_window::raw_click1(XEvent* event,xnode* x)
+{
+	node*  n = x ? x->get_node() : 0;
+	selection::menu_node(n);
+	unsigned int modifiers = event->xbutton.state;
+	Boolean shift   = (modifiers & ShiftMask) != 0;
+	Boolean control = (modifiers & ControlMask) != 0;
+	click1(n,shift,control);
+}
+
+void node_window::raw_click2(XEvent* event,xnode* x)
+{
+	node*  n = x ? x->get_node() : 0;
+	selection::menu_node(n);
+	unsigned int modifiers = event->xbutton.state;
+	Boolean shift   = (modifiers & ShiftMask) != 0;
+	Boolean control = (modifiers & ControlMask) != 0;
+	if(n) this->click2(n,shift,control);
+}
+
+void node_window::raw_click3(XEvent* event,xnode* x)
+{
+	node*  n = x ? x->get_node() : 0;
+	selection::menu_node(n);
+	unsigned int modifiers = event->xbutton.state;
+	Boolean shift   = (modifiers & ShiftMask) != 0;
+	Boolean control = (modifiers & ControlMask) != 0;
+
+	if(n) click3(n,shift,control);
+	if( shift && n)
+	{
+	  XmMenuPosition(menu2(),(XButtonPressedEvent*)event);
+	  XtManageChild(menu2());
+	}
+	else if(n)
+	{
+	  // menus::show(node_widget(),event,n); // 20141119
+	  menus::show(menu1(),event,n);
+	  //XmMenuPosition(g_cmd_menu,(XButtonPressedEvent*)event);
+	  //XtManageChild(g_cmd_menu);
+	} else {
+	  XmMenuPosition(menu1(),(XButtonPressedEvent*)event);
+	  XtManageChild(menu1());
+	}
+}
+
+node* next_node(node* n)
+{
+  node *out = n;
+  while (n) {
+    if (n->type() == NODE_TASK   || 
+	n->type() == NODE_FAMILY ||
+	n->type() == NODE_SUITE  ||
+	n->type() == NODE_ALIAS)
+      return n;
+    n = n->next();
+  }
+  return out;
+}
+
+node* next_host(node* n, bool first) {
+  host *h = 0x0;
+  if (!n) return n;
+  if (first) h = extent<host>::first();
+  else h = &n->serv();
+  while ((h= h->extent<host>::next())) {
+    if (h->top())
+      return h->top();    
+  }
+  if (first) return n;
+  return next_host(n, true);
+}
+
+void node_window::keypress(XEvent* event)
+{
+  xnode* x     = (xnode*)NodeFind(node_widget(),event);
+  node*  n = 0x0;
+  KeySym keysym = XLookupKeysym(&(event->xkey), 0);
+
+  if (keysym == XK_KP_Space || keysym == XK_space) {
+    raw_click1(event,x);
+    // } else if (keysym == XK_F2) { raw_click2(event,x);
+  } else if (keysym == XK_KP_Enter || keysym == XK_Return) {
+    if ((event->xbutton.state & ShiftMask) != 0)
+      n = selection::current_node();
+    if (n) 
+      menus::show(node_widget(),event,n);
+    else
+      raw_click3(event,x);
+  } else if (keysym == XK_Up) {
+    node* first = n = selection::current_node();
+    if (!n) return;
+    n = n->parent();
+
+    if (!n) /* reach server node */
+      n = next_host(selection::current_node(), true);
+
+    if (!n) return;
+    selection::notify_new_selection(n);
+
+    n = n->kids();
+    if (n==first) n = n->parent();
+
+    if (n) click1(n,0,0);
+  } else if (keysym == XK_Down) {
+    n = selection::current_node();
+    if (!n) return;
+    n = n->next();
+    if (!n) {
+      n = selection::current_node()->parent();
+      if (n) n = n->next();
+    }
+    if (!n) /* reach server node */
+      n = next_host(selection::current_node(), false);    
+    if (n) click1(n,0,0);
+  } else if (keysym == XK_Left) {
+    n = selection::current_node();
+    if (!n) return;
+    n = n->parent(); 
+    if (!n) /* reach server node */
+      n = next_host(selection::current_node(), true);    
+    if (!n) return;
+    click2(n,0,0);
+    click1(n,0,0);
+  } else if (keysym == XK_Right) {
+    n = selection::current_node();
+    if (!n) return;
+    click2(n,0,0);
+    if (n->kids()) n = n->kids();
+    else n = n->next();
+    n = next_node(n);
+    if (n) click1(n,0,0);	  
+    }
+}
+
+void node_window::click(XEvent* event)
+{
+  int button   = event->xbutton.button;
+  xnode* x     = (xnode*)NodeFind(node_widget(),event);
+  
+  switch(button) {
+  case 1: raw_click1(event,x); break;
+  case 2:	raw_click2(event,x); break;
+  case 3:	raw_click3(event,x); break;
+  default: keypress(event);
+  }
+}
+
+void node_window::show_node(node&)
+{
+}
+
+void node_window::new_selection(node& n)
+{
+  xnode* x = xnode_of(n);
+  if(x && x->widget() == node_widget() ) { 
+    show_node(n);
+    x->select();
+  }
+  else 
+    selection_cleared();
+}
+
+void node_window::selection_cleared()
+{
+  XtVaSetValues(node_widget(),XtNselected,-1,NULL);
+}
+
+void node_window::add_input_CB()
+{
+  XtAddCallback( node_widget(), XmNinputCallback, inputCB, this);
+  XtAddCallback( node_widget(), XtNlinkCallback,  linkCB, this);
+}
+
+void node_window::link(XEvent*,node*,node*)
+{
+}
diff --git a/ecflow_4_0_7/view/src/node_window.h b/ecflow_4_0_7/view/src/node_window.h
new file mode 100644
index 0000000..c37712f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/node_window.h
@@ -0,0 +1,73 @@
+#ifndef node_window_H
+#define node_window_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+#ifndef selection_H
+#include "selection.h"
+#endif
+
+class xnode;
+
+class node_window : public selection {
+public:
+	node_window();
+
+	~node_window(); // Change to virtual if base class
+
+	void add_input_CB();
+
+	virtual xnode* xnode_of(node&) = 0;
+	virtual Widget node_widget() = 0;
+
+	virtual void new_selection(node&);
+	virtual void selection_cleared();
+
+protected:
+
+	virtual void show_node(node&);
+	virtual void click(XEvent*);
+
+	virtual void link(XEvent*,node*,node*);
+
+	virtual void keypress(XEvent* event);
+	virtual void click1(node*,Boolean,Boolean);
+	virtual void click2(node*,Boolean,Boolean);
+	virtual void click3(node*,Boolean,Boolean);
+
+	virtual void raw_click1(XEvent* event,xnode*);
+	virtual void raw_click2(XEvent* event,xnode*);
+	virtual void raw_click3(XEvent* event,xnode*);
+
+	virtual Widget menu1() = 0;
+	virtual Widget menu2() = 0;
+
+	static void inputCB(Widget,XtPointer,XtPointer);
+	static void linkCB(Widget,XtPointer,XtPointer);
+
+private:
+
+	node_window(const node_window&);
+	node_window& operator=(const node_window&);
+
+};
+
+inline void destroy(node_window**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/not_enqueued.cc b/ecflow_4_0_7/view/src/not_enqueued.cc
new file mode 100644
index 0000000..d5e8658
--- /dev/null
+++ b/ecflow_4_0_7/view/src/not_enqueued.cc
@@ -0,0 +1,32 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "not_enqueued.h"
+#include "node.h"
+
+
+not_enqueued::not_enqueued(): node_alert<not_enqueued>("Not_Enqueued tasks")
+{
+}
+
+not_enqueued::~not_enqueued()
+{
+}
+
+bool not_enqueued::keep(node* n)
+{
+  return false; // return n->isNotEnqueued();
+}
diff --git a/ecflow_4_0_7/view/src/not_enqueued.h b/ecflow_4_0_7/view/src/not_enqueued.h
new file mode 100644
index 0000000..a5daed8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/not_enqueued.h
@@ -0,0 +1,45 @@
+#ifndef not_enqueued_H
+#define not_enqueued_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node_alert.h"
+
+class node;
+
+class not_enqueued : public node_alert<not_enqueued> {
+public:
+	not_enqueued();
+	~not_enqueued(); // Change to virtual if base class
+
+protected:
+
+private:
+
+// No copy allowed
+
+	not_enqueued(const not_enqueued&);
+	not_enqueued& operator=(const not_enqueued&);
+
+        //
+
+	virtual bool keep(node*);
+
+};
+
+inline void destroy(not_enqueued**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/observable.cc b/ecflow_4_0_7/view/src/observable.cc
new file mode 100644
index 0000000..b7074ac
--- /dev/null
+++ b/ecflow_4_0_7/view/src/observable.cc
@@ -0,0 +1,79 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef observable_H
+#include "observable.h"
+#endif
+
+#ifndef relation_H
+#include "relation.h"
+#endif
+
+#include "observer.h"
+
+observable::observable()
+ : observed_(false)
+{
+}
+
+struct gone_iter : public observer_iterator {
+	observable* o_;
+	void next(observer* o) { o->gone(o_); }
+public:
+	gone_iter(observable* o) : o_(o) {}
+};
+
+observable::~observable()
+{
+	if(observed_) {
+		gone_iter gi(this);
+		relation::scan(this,gi);
+		relation::remove(this);
+	}
+}
+
+
+struct notify_iter : public observer_iterator {
+	observable* o_;
+	void next(observer* o) { o->notification(o_); }
+public:
+	notify_iter(observable* o) : o_(o) {}
+};
+
+void observable::notify_observers()
+{
+	if(observed_) {
+		notify_iter ni(this);
+		relation::scan(this,ni);
+	}
+}
+
+struct adopt_iter : public observer_iterator {
+	observable* o_;
+	observable* n_;
+	void next(observer* o) { o->adoption(o_,n_); }
+public:
+	adopt_iter(observable* o,observable* n) : o_(o), n_(n) {}
+};
+
+void observable::notify_adoption(observable* n) 
+{
+	if(observed_ && n) {
+		adopt_iter ai(this,n);
+		relation::scan(this,ai);
+		relation::replace(this,n);
+		n->observed_ = true;
+	}
+}
diff --git a/ecflow_4_0_7/view/src/observable.h b/ecflow_4_0_7/view/src/observable.h
new file mode 100644
index 0000000..cfabbe4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/observable.h
@@ -0,0 +1,45 @@
+#ifndef observable_H
+#define observable_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+class observable  {
+public:
+
+	observable();
+
+	virtual ~observable(); // Change to virtual if base class
+
+	void notify_observers();
+	void notify_adoption(observable*);
+
+private:
+
+	observable(const observable&);
+	observable& operator=(const observable&);
+
+	bool observed_;
+
+	friend class relation;
+};
+
+/* #include "observable.cc" */
+
+#endif
diff --git a/ecflow_4_0_7/view/src/observer.cc b/ecflow_4_0_7/view/src/observer.cc
new file mode 100644
index 0000000..31f7750
--- /dev/null
+++ b/ecflow_4_0_7/view/src/observer.cc
@@ -0,0 +1,48 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef observer_H
+#include "observer.h"
+#endif
+
+#ifndef relation_H
+#include "relation.h"
+#endif
+
+
+observer::observer()
+{
+}
+
+observer::~observer()
+{
+	relation::remove(this);
+}
+
+void observer::observe(observable* t)
+{
+	relation::add(this,t);
+}
+
+int observer::forget(observable* t)
+{
+  return relation::remove(this,t);
+}
+
+void observer::forget_all()
+{
+	relation::remove(this);
+}
+
diff --git a/ecflow_4_0_7/view/src/observer.h b/ecflow_4_0_7/view/src/observer.h
new file mode 100644
index 0000000..99b535b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/observer.h
@@ -0,0 +1,48 @@
+#ifndef observer_H
+#define observer_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+class observable;
+class relation_data;
+ 
+class observer {
+public:
+
+	observer();
+
+	virtual ~observer(); // Change to virtual if base class
+
+	void observe(observable*);
+	int forget(observable*);
+	void forget_all();
+
+	virtual void notification(observable*)          = 0;
+	virtual void adoption(observable*,observable*) = 0;
+	virtual void gone(observable*)                 = 0;
+
+	void set_data(observable*,relation_data*);
+	relation_data* get_data(observable*);
+
+private:
+
+	observer(const observer&);
+	observer& operator=(const observer&);
+};
+
+/* #include "observer.cc" */
+
+#endif
diff --git a/ecflow_4_0_7/view/src/opener.h b/ecflow_4_0_7/view/src/opener.h
new file mode 100644
index 0000000..3b5bea3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/opener.h
@@ -0,0 +1,126 @@
+#ifndef opener_H
+#define opener_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#include <Xm/Xm.h>
+#include "runnable.h"
+
+class opener : public runnable {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	opener() : widget_(0) {}
+
+// -- Destructor
+
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	void show(Widget w) { widget_ = w; enable(); }
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	opener(const opener&);
+	opener& operator=(const opener&);
+
+// -- Members
+
+	Widget widget_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	void run()  { if(!XtIsManaged(widget_)) XtManageChild(widget_); disable();}
+
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const opener& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(opener**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(opener);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/option.cc b/ecflow_4_0_7/view/src/option.cc
new file mode 100644
index 0000000..c411710
--- /dev/null
+++ b/ecflow_4_0_7/view/src/option.cc
@@ -0,0 +1,205 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <string>
+#include <list>
+
+#ifndef option_H
+#include "option.h"
+#endif
+
+#ifndef translator_H
+#include "translator.h"
+#endif
+
+#ifndef choice_H
+#include "choice.h"
+#endif
+
+
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#include "ecflow.h"
+
+template<class T>
+option<T>::option(configurable* o,const str& name,const T& val):
+	resource(o,name,translator<T,str>()(val))
+{
+	value_ = translator<str,T>()(get());
+}
+
+template<class T>
+option<T>::~option()
+{
+}
+
+template<class T>
+bool option<T>::changed()
+{
+	T old = value_;
+	value_ = translator<str,T>()(get());
+	return old != value_;
+}
+
+
+template<class T>
+void option<T>::put(const T& v)
+{
+	set(translator<T,str>()(v));
+}
+
+//==========================================================
+
+inline
+void init_widget(Widget w,const str& s)
+{
+	XmTextSetString(w,(char*)s.c_str());
+}
+
+inline
+void init_widget(Widget w,int n)
+{
+	str s = translator<int,str>()(n);
+	XmTextSetString(w,(char*)s.c_str());
+}
+
+inline
+void init_widget(Widget w,long n)
+{
+	str s = translator<long,str>()(n);
+	XmTextSetString(w,(char*)s.c_str());
+}
+
+inline
+void init_widget(Widget w,uint64_t n)
+{
+	str s = translator<uint64_t,str>()(n);
+	XmTextSetString(w,(char*)s.c_str());
+}
+
+inline
+void init_widget(Widget w,bool v)
+{
+	XmToggleButtonSetState(w,v,False);
+}
+
+inline
+void init_widget(Widget,std::vector< std::string >&)
+{
+} 
+
+inline
+void init_widget(Widget w,const choice& c)
+{
+	WidgetList wl = 0;
+	int count = 0;
+
+    XtVaGetValues(w, XmNchildren,&wl, XtNnumChildren,&count, NULL);
+
+	for(int i = 0; i < count; i++)
+		XmToggleButtonSetState(wl[i],i == c,False);	
+}
+
+
+inline
+str read_widget(Widget w,const str&)
+{
+	char* p = XmTextGetString(w);
+	str b(p);
+	XtFree(p);
+	return b;
+}
+
+inline 
+int read_widget(Widget w,int)
+{
+	char* p = XmTextGetString(w);
+	int n = atol(p);
+	XtFree(p);
+	return n;
+}
+
+inline 
+long read_widget(Widget w,long)
+{
+	char* p = XmTextGetString(w);
+	long n = atol(p);
+	XtFree(p);
+	return n;
+}
+
+inline 
+long read_widget(Widget w,uint64_t)
+{
+	char* p = XmTextGetString(w);
+	uint64_t n = atoll(p);
+	XtFree(p);
+	return n;
+}
+
+inline
+bool read_widget(Widget w,bool)
+{
+	return XmToggleButtonGetState(w);
+}
+
+inline
+ecf_list* read_widget(Widget,ecf_list*)
+{
+  return 0;
+} 
+
+inline
+std::vector< std::string > read_widget(Widget,std::vector< std::string >&)
+{
+  std::vector< std::string > out;
+  return out;
+}
+
+inline
+int read_widget(Widget w,const choice& c)
+{
+	WidgetList wl = 0;
+	int count = 0;
+
+	XtVaGetValues(w, XmNchildren,&wl, XtNnumChildren,&count, NULL);
+
+	for(int i = 0; i < count; i++)
+		if(XmToggleButtonGetState(wl[i]) )
+			return i;
+	return c;
+}
+
+template<class T>
+void option<T>::initWidget(Widget w)
+{
+	init_widget(w,value_);
+}
+
+template<class T>
+bool option<T>::readWidget(Widget w)
+{
+	T b = read_widget(w,value_);
+	bool x = (b != value_);
+	if(x) put(b);
+	return x;
+}
diff --git a/ecflow_4_0_7/view/src/option.h b/ecflow_4_0_7/view/src/option.h
new file mode 100644
index 0000000..6865c59
--- /dev/null
+++ b/ecflow_4_0_7/view/src/option.h
@@ -0,0 +1,48 @@
+#ifndef option_H
+#define option_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "resource.h"
+
+template<class T>
+class option : public resource {
+public:
+	option(configurable*,const str&,const T&);
+
+	~option(); // Change to virtual if base class
+
+	operator const T&() const      { return value_;         }
+	const T& operator=(const T& v) { put(v); return value_; }
+
+	virtual void initWidget(Widget);
+	virtual bool readWidget(Widget);
+	virtual bool changed();
+
+private:
+
+	option(const option<T>&);
+	option<T>& operator=(const option<T>&);
+
+	T             value_;
+
+	void put(const T&);
+};
+
+#if defined(__GNUC__) || defined(hpux) || defined(_AIX)
+#include "option.cc"
+#endif
+#endif
diff --git a/ecflow_4_0_7/view/src/option_panel.cc b/ecflow_4_0_7/view/src/option_panel.cc
new file mode 100644
index 0000000..64c55f8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/option_panel.cc
@@ -0,0 +1,60 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "option_panel.h"
+#include "node.h"
+#include "host.h"
+#include "ecflowview.h"
+#include <Xm/Label.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+extern "C" {
+#include "xec.h"
+}
+
+option_panel::option_panel(panel_window& w):
+	panel(w)
+{
+}
+
+option_panel::~option_panel()
+{
+}
+
+void option_panel::create (Widget parent, char *widget_name )
+{
+	option_form_c::create(parent,widget_name);
+}
+
+void option_panel::clear()
+{
+}
+
+void option_panel::show(node& n)
+{
+	resource::init(n.serv(),*this);
+	freeze();
+}
+
+Boolean option_panel::enabled(node& n)
+{
+  return n.type() == NODE_SUPER;
+}
+
+configurable* option_panel::owner()
+{
+  return get_node() ? &(get_node()->serv()) : 0;
+}
+
diff --git a/ecflow_4_0_7/view/src/option_panel.h b/ecflow_4_0_7/view/src/option_panel.h
new file mode 100644
index 0000000..8c25aad
--- /dev/null
+++ b/ecflow_4_0_7/view/src/option_panel.h
@@ -0,0 +1,58 @@
+#ifndef option_panel_H
+#define option_panel_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "uioption.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef pref_editor_H
+#include "pref_editor.h"
+#endif
+
+class option_panel : public panel, public option_form_c , public pref_editor{
+public:
+
+  option_panel(panel_window&);
+  
+  ~option_panel(); // Change to virtual if base class
+  
+  virtual const char* name() const { return "Options"; }
+  virtual void show(node&);
+  virtual void clear();
+  virtual Boolean enabled(node&);
+  
+  virtual Widget widget() { return option_form_c::xd_rootwidget(); }
+  
+  virtual void create (Widget parent, char *widget_name = NULL);
+  
+private:
+
+  option_panel(const option_panel&);
+  option_panel& operator=(const option_panel&);
+  
+  virtual void changedCB( Widget w, XtPointer ) { pref_editor::changed(w); }
+  virtual void useCB( Widget w, XtPointer )     { pref_editor::use(w);     }
+  
+  virtual Widget form()   { return form_; }
+  virtual configurable* owner();  
+};
+
+inline void destroy(option_panel**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/output.cc b/ecflow_4_0_7/view/src/output.cc
new file mode 100644
index 0000000..6fb2084
--- /dev/null
+++ b/ecflow_4_0_7/view/src/output.cc
@@ -0,0 +1,221 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "output.h"
+#include "node.h"
+#include "host.h"
+#include <Xm/Text.h>
+#include <Xm/TextStrSoP.h>
+#include <Xm/List.h>
+#include "ecf_node.h"
+extern "C" {
+#include "xec.h"
+}
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+output::output(panel_window& w):
+	text_window(true),
+	panel(w),
+	file_(0x0)
+{
+}
+
+output::~output()
+{
+	if(file_)
+		free(file_);
+}
+
+void output::create (Widget parent, char *widget_name )
+{
+	output_form_c::create(parent,widget_name);
+}
+
+void output::clear()
+{
+	if(file_) free(file_);
+	file_ = 0x0;
+	XmTextSetString(name_,(char*) "");
+	XmListDeleteAllItems(list_);
+	//active(False);
+	text_window::clear();
+}
+
+class output_lister : public lister<ecf_dir> {
+	Widget list_;
+	bool sort() { return true; }
+	bool compare(ecf_dir&,ecf_dir&);
+	void next(ecf_dir&);
+public:
+	output_lister(Widget l) : list_(l) {}
+};
+
+void output_lister::next(ecf_dir& d)
+{
+  if(S_ISREG(d.mode))
+    {
+      time_t t   = d.mtime;	
+      time_t now = time(0);
+      
+      int delta  = now - t;
+      if(delta<0) delta = 0;
+
+      char buf[80];
+      strcpy(buf,"Right now");
+      
+      if(delta >=1  && delta < 60)
+	{
+	  sprintf(buf,"%d second%s ago",delta,delta>1?"s":"");
+	}
+      
+      if(delta >= 60 && delta < 60*60)
+	{
+	  sprintf(buf,"%d minute%s ago",delta/60,delta/60>1?"s":"");
+	}
+      
+      if(delta >= 60*60 && delta < 60*60*24)
+	{
+	  sprintf(buf,"%d hour%s ago",delta/60/60,delta/60/60>1?"s":"");
+	}
+      
+      if(delta >= 60*60*24)
+	{
+	  sprintf(buf,"%d day%s ago",delta/60/60/24,delta/60/60/24>1?"s":"");
+	}
+      
+      xec_VaAddListItem(list_,(char*) "%-60s (%s)",d.name_,buf);
+    }
+}
+
+bool output_lister::compare(ecf_dir& a,ecf_dir& b)
+{
+  return a.mtime > b.mtime;
+}
+
+class search_me : public runnable {
+	find& find_;
+
+	void run() {
+	  /* text case regexp back wrap */
+	  find_.search("System Billing Units",true,false,false,true);
+	  find_.search("smscomplete",true,false,false,true);
+	  find_.search("smsabort",true,false,false,true);
+	  // display init but not appreciated when updating for tail:
+	  // find_.search("ecflow_client",true,false,false,true); 
+	  find_.search("xcomplete",true,false,false,true);
+	  find_.search("xabort",true,false,false,true);
+	  find_.search(" --complete",true,false,false,true);
+	  find_.search(" --abort",true,false,false,true);
+	  find_.no_message();
+	  find_.pending(0);
+	  delete this;
+	}
+
+public:
+	search_me(find& f)  : find_(f) { find_.pending(this); enable();}
+};
+
+void output::show(node& n)
+{
+  std::string jobout = n.variable("ECF_JOBOUT");
+  if (!n.__node__()) 
+    jobout = n.variable("SMSJOBOUT");
+  else if (!n.__node__()) return;
+  else if (!n.__node__()->get_node()) return;
+  else n.__node__()->get_node()->variableSubsitution(jobout);
+
+  if(jobout == ecf_node::none()) {     
+    clear();        
+    return;    
+  }
+
+  /* output variable may contain micro */
+
+  if(file_) free(file_);
+  file_ = strdup(jobout.c_str());
+  load(n);
+  XmListDeleteAllItems(list_);
+  
+  output_lister ol(list_);
+  n.serv().dir(n,file_,ol);
+  
+  std::string remote = n.variable("ECF_OUT");
+  std::string job    = n.variable("ECF_JOB");
+  if (!n.__node__()) { 
+    remote = n.variable("SMSOUT"); 
+    job    = n.variable("SMSJOB"); 
+  }
+  if (!remote.empty() && !job.empty()) {
+    /* display both remote and local dir */
+    if (remote == job) {
+      output_lister rem(list_);
+      n.serv().dir(n,job.c_str(),rem);
+    }
+  }
+  new search_me(*this);  
+}
+
+void output::load(node& n)
+{
+	if(file_) 
+		XmTextSetString(name_,(char*)file_);
+	else 
+		clear();
+
+	if(file_) {
+	  tmp_file f = n.serv().file(n,file_);
+	  text_window::load(f);
+	} else {	  
+	  tmp_file f = n.serv().output(n);
+	  text_window::load(f);
+	}
+}
+
+void output::updateCB(Widget,XtPointer data)
+{
+	if(get_node())
+		show(*get_node());
+	else
+		clear();
+	XmTextShowPosition(text_,XmTextGetLastPosition(text_));
+}
+
+void output::browseCB(Widget,XtPointer data)
+{
+	XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+	if(file_) free(file_);
+
+	char *p = xec_GetString(cb->item);
+	char buf[1024];
+	sscanf(p,"%s",buf);
+	XtFree(p);
+
+	file_ = strdup(buf);
+
+	if(get_node())
+		load(*get_node());
+	else
+		clear();
+}
+
+Boolean output::enabled(node& n)
+{
+  if (n.type() != NODE_TASK && n.type() != NODE_ALIAS) return False;
+  if (!n.__node__()) 
+    return n.variable("SMSJOBOUT") != ecf_node::none();
+  return n.variable("ECF_JOBOUT") != ecf_node::none();
+}
diff --git a/ecflow_4_0_7/view/src/output.h b/ecflow_4_0_7/view/src/output.h
new file mode 100644
index 0000000..63d9350
--- /dev/null
+++ b/ecflow_4_0_7/view/src/output.h
@@ -0,0 +1,67 @@
+#ifndef output_H
+#define output_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uioutput.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#include "host.h"
+#include "text_window.h"
+
+
+class output : public output_form_c, public text_window, public panel {
+public:
+	output(panel_window&);
+
+	~output(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Output"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Boolean enabled(node&);
+	virtual Widget widget() { return output_form_c::xd_rootwidget(); }
+
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()   { return text_; }
+	virtual void create (Widget parent, char *widget_name = 0 );
+
+private:
+	output(const output&);
+	output& operator=(const output&);
+
+	char *file_;
+
+	void load(node&);
+
+	virtual void browseCB(Widget,XtPointer);
+	virtual void updateCB(Widget,XtPointer);
+	virtual void externalCB(Widget ,XtPointer ) 
+	{ text_window::open_viewer();}
+	virtual void searchCB(Widget ,XtPointer ) 
+		{ text_window::open_search();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+};
+
+inline void destroy(output**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/panel.cc b/ecflow_4_0_7/view/src/panel.cc
new file mode 100644
index 0000000..ad81de3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/panel.cc
@@ -0,0 +1,125 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <Xm/Xm.h>
+#include "Hyper.h"
+
+
+#include "panel.h"
+#include "node.h"
+#include "host.h"
+#include "panel_window.h"
+#include "tip.h"
+extern "C" {
+#include "xec.h"
+}
+
+panel::panel(panel_window& owner):
+	next_(0),
+	node_(0),
+	owner_(owner)
+{
+}
+
+panel::~panel()
+{
+	delete next_;
+}
+
+panel_factory* panel_factory::factories_[PANEL_MAX_FACTORIES];
+
+panel_factory::panel_factory(int n)
+{
+  if(n < 0 || n >= PANEL_MAX_FACTORIES || factories_[n])
+    fprintf(stderr, "panel_factory::panel_factory: internal error %d\n",n);
+  factories_[n] = this;
+}
+
+panel* panel_factory::create_all(panel_window& w,Widget parent)
+{
+	panel *first = 0;
+	for(int i = 0; i < PANEL_MAX_FACTORIES ; i++)
+		if(factories_[i])
+		{
+			panel* x = factories_[i]->create(w,parent);
+			XtManageChild(x->widget());
+
+			if(x->tools())
+				tip::makeTips(x->tools());
+
+			x->next_ = first;
+			first = x;
+		}
+	return first;
+}
+
+void panel::update()
+{
+	if(owner_.frozen()) 
+		return;
+
+	if(node_)
+		show(*node_);
+	else
+		clear();
+}
+
+void panel::post_update()
+{
+	if(!owner_.frozen())
+		enable();
+}
+
+void panel::run()
+{
+	update();
+	disable();
+}
+
+void panel::detach()
+{
+	owner_.detach();
+}
+
+void panel::freeze()
+{
+	owner_.freeze();
+}
+
+void panel::hyper(Widget,XtPointer data,node *n)
+{
+	hyperCallbackStruct* cb = (hyperCallbackStruct*)data;
+	if(n == 0) n = get_node();
+	if(n) n = n->find(cb->text);
+
+	if(n == 0)
+	{
+		host* h = host::find(cb->text);
+		if(h) n = h->top();
+	}
+
+	if(n) {
+		if(cb->event->xbutton.button == 2)
+			owner_.new_window(n);
+		else
+			selection::notify_new_selection(n);
+	}
+}
+
+void panel::submit()
+{
+  owner_.submit();
+}
diff --git a/ecflow_4_0_7/view/src/panel.h b/ecflow_4_0_7/view/src/panel.h
new file mode 100644
index 0000000..3c19b08
--- /dev/null
+++ b/ecflow_4_0_7/view/src/panel.h
@@ -0,0 +1,110 @@
+#ifndef panel_H
+#define panel_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "ecflowview.h"
+#include "runnable.h"
+#include "observer.h"
+
+class node;
+class panel_window;
+
+class panel : public runnable, public observer  {
+public:
+
+	panel(panel_window&);
+
+	virtual ~panel(); // Change to virtual if base class
+
+	virtual void update();
+	virtual void detach();
+	virtual void freeze();
+	virtual void submit();
+	virtual void post_update();
+
+	virtual void copy(panel*) {}
+
+	virtual void  clear()        = 0;
+	virtual void  show(node&)    = 0;
+	virtual void  changed(node& n) { show(n); }
+	virtual Boolean enabled(node& n) { return False; }
+
+	virtual const char* name() const { return "(none)"; };
+	virtual Widget widget()          = 0;
+	virtual Widget menus(Widget) { return 0; }
+	virtual Widget tools()       { return 0; } 
+
+
+	virtual void print() {}
+	virtual void save()  {}
+
+	virtual bool can_print() { return false; }
+	virtual bool can_save() { return false; }
+
+protected:
+
+	node* get_node() { return node_; }	
+	void hyper(Widget,XtPointer, node* = 0);
+
+private:
+
+	panel(const panel&);
+	panel& operator=(const panel&);
+
+	panel* next_;
+	node* node_;
+	panel_window& owner_;
+
+	void run();
+	void notification(observable*)           { post_update(); }
+	void gone(observable*)                   { post_update(); }
+	void adoption(observable*,observable*)  { post_update(); }
+
+	friend class panel_factory;
+	friend class panel_window;
+};
+
+inline void destroy(panel**) {}
+
+#ifndef panel_factories_H
+#include "panel_factories.h"
+#endif
+
+class panel_factory {
+  static panel_factory* factories_[PANEL_MAX_FACTORIES];
+public:
+  panel_factory(int);
+  virtual panel* create(panel_window&,Widget) = 0;
+  static panel* create_all(panel_window&,Widget);
+};
+
+template<class T>
+class panel_maker : public panel_factory {
+public:
+	panel_maker(int n) : panel_factory(n) {}
+	virtual panel* create(panel_window&,Widget);
+};
+
+template<class T>
+panel* panel_maker<T>::create(panel_window& w,Widget parent)
+{
+	T* p = new T(w);
+	p->create(parent,(char*)p->name());
+	return p;
+}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/panel_factories.h b/ecflow_4_0_7/view/src/panel_factories.h
new file mode 100644
index 0000000..c646cca
--- /dev/null
+++ b/ecflow_4_0_7/view/src/panel_factories.h
@@ -0,0 +1,40 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#define PANEL_INFO		     0
+#define PANEL_MANUAL		 (PANEL_INFO+1)
+#define PANEL_SCRIPT		 (PANEL_MANUAL+1)
+#define PANEL_JOB		 (PANEL_SCRIPT+1)
+#define PANEL_JOBSTATUS		 (PANEL_JOB+1)
+#define PANEL_OUTPUT		 (PANEL_JOBSTATUS+1)
+#define PANEL_WHY		 (PANEL_OUTPUT+1)
+#define PANEL_TRIGGER            (PANEL_WHY+1)
+#define PANEL_JOBCHECK           (PANEL_TRIGGER+1)
+#define PANEL_TIMETABLE          (PANEL_JOBCHECK+1)
+#define PANEL_VARIABLES		 (PANEL_TIMETABLE+1)
+#define PANEL_EDIT_TASK		 (PANEL_VARIABLES+1)
+#define PANEL_EDIT_LABEL	 (PANEL_EDIT_TASK+1)
+#define PANEL_EDIT_LIMIT	 (PANEL_EDIT_LABEL+1)
+#define PANEL_EDIT_VARIABLE	 (PANEL_EDIT_LIMIT+1)
+#define PANEL_EDIT_METER	 (PANEL_EDIT_VARIABLE+1)
+#define PANEL_EDIT_REPEAT	 (PANEL_EDIT_METER+1)
+#define PANEL_HISTORY		 (PANEL_EDIT_REPEAT+1)
+#define PANEL_MESSAGES	  	 (PANEL_HISTORY+1)
+#define PANEL_SUITES             (PANEL_MESSAGES+1)
+#define PANEL_USERS		 (PANEL_SUITES+1)
+#define PANEL_ZOMBIES		 (PANEL_USERS+1)
+#define PANEL_ECF_OPTIONS 	 (PANEL_ZOMBIES+1)
+
+#define PANEL_MAX_FACTORIES      (PANEL_ECF_OPTIONS+1)
diff --git a/ecflow_4_0_7/view/src/panel_window.cc b/ecflow_4_0_7/view/src/panel_window.cc
new file mode 100644
index 0000000..3eddf9e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/panel_window.cc
@@ -0,0 +1,432 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include "gui.h"
+#include "panel_window.h"
+#include "panel.h"
+#include "node.h"
+#include "globals.h"
+#include "Tab.h"
+#include <Xm/ToggleB.h>
+#include <Xm/PushB.h>
+
+const char* kDefault = "Info";
+
+extern "C" {
+#include "xec.h"
+}
+
+panel_window::panel_window():
+	panels_(0),
+	node_(0),
+	current_(0)
+{
+	create(gui::top());
+	set_node(0,"Info",true);
+	load_size();
+	XtRealizeWidget(panel_top);
+}
+
+panel_window::panel_window(panel_window* other):
+	panels_(0),
+	node_(0),
+	current_(0)
+{
+	create(gui::top());
+
+	panel* p = panels_;
+	panel* o = other->panels_;
+
+	while(p && o)
+	{
+		p->copy(o);
+		p = p->next_;
+		o = o->next_;
+	}
+
+	other->save_size();
+	set_node(other->node_,XtName(TabGetCurrent(other->tab_)),true);
+	load_size();
+	XtRealizeWidget(panel_top);
+	XmToggleButtonSetState(detached_,other->detached(),True);
+	XmToggleButtonSetState(frozen_,other->frozen(),True);
+	XmToggleButtonSetState(close_on_apply_,
+		XmToggleButtonGetState(other->close_on_apply_),True);
+}
+
+panel_window::panel_window(node* n,bool detached,bool frozen,const char* tab):
+	panels_(0),
+	node_(0),
+	current_(0)
+{
+	create(gui::top());
+	set_node(n,tab,true);
+	load_size();
+	XtRealizeWidget(panel_top);
+	XmToggleButtonSetState(detached_,detached,True);
+	XmToggleButtonSetState(frozen_,frozen,True);
+}
+
+panel_window::panel_window(panel_window* other,node* n,bool detached,bool frozen):
+	panels_(0),
+	node_(0),
+	current_(0)
+{
+	create(gui::top());
+
+	panel* p = panels_;
+	panel* o = other->panels_;
+
+	while(p && o)
+	{
+		p->copy(o);
+		p = p->next_;
+		o = o->next_;
+	}
+
+	other->save_size();
+	set_node(n,XtName(TabGetCurrent(other->tab_)),true);
+	load_size();
+	XtRealizeWidget(panel_top);
+	XmToggleButtonSetState(detached_,detached,True);
+	XmToggleButtonSetState(frozen_,frozen,True);
+}
+
+
+panel_window::~panel_window()
+{
+	save_size();
+	delete panels_;
+	XtDestroyWidget(xd_rootwidget());
+}
+
+void panel_window::save_size()
+{
+	Dimension w,h;
+
+	XtVaGetValues(form_,
+		XmNwidth, &w,
+		XmNheight,&h,
+		NULL);
+
+	char *n = XtName(TabGetCurrent(tab_));
+	char wname[1024]; sprintf(wname,"panel_%s_width", n);
+	char hname[1024]; sprintf(hname,"panel_%s_heigth",n);
+
+	globals::set_resource(wname,w);
+	globals::set_resource(hname,h);
+}
+
+void panel_window::load_size()
+{
+	Dimension w,h;
+
+	char *n = XtName(TabGetCurrent(tab_));
+	char wname[1024]; sprintf(wname,"panel_%s_width", n);
+	char hname[1024]; sprintf(hname,"panel_%s_heigth",n);
+
+	w = globals::get_resource(wname,500);
+	h = globals::get_resource(hname,500);
+
+	XtVaSetValues(form_,
+		XmNwidth, w,
+		XmNheight,h,
+		NULL);
+}
+
+void panel_window::create (Widget parent, char *widget_name)
+{
+  panel_top_c::create(parent,widget_name);
+  panels_ = panel_factory::create_all(*this,tab_);
+  XtAddCallback(tab_, XmNvalueChangedCallback, tabCB, this);
+}
+
+void panel_window::tabCB(Widget w,XtPointer call)
+{
+	TabCallbackStruct* cb = (TabCallbackStruct*)call;
+	set(find(cb->widget));
+	if (!current_) return;
+	if(node_)
+		current_->show(*node_);
+	else
+		current_->clear();
+}
+
+void panel_window::set_tab(const char* tab)
+{
+	panel *p = find(tab);
+	if (p) {
+	  TabSetCurrent(tab_,p->widget(),False);
+	  current_ = p;
+	}
+}
+
+void panel_window::tabCB(Widget w, XtPointer client, XtPointer call)
+{
+	panel_window* i = (panel_window*)client;
+	i->tabCB(w,call);
+}
+
+void panel_window::selection_cleared()
+{
+	if(detached()) return;
+	set_node(0,0,true);
+}
+
+void panel_window::title()
+{
+  std::string name;
+  name = node_ ? node_->node_name() : "-";
+  if(detached()) name += " (detached)";
+  if(frozen())   name += " (frozen)";  
+  XtVaSetValues(xd_rootwidget(),XmNtitle,name.c_str(),NULL);
+
+  if (!current_) return;
+
+  name = std::string(current_->name()) + ":";
+  if (node_) 
+    name += node_->node_name();
+  else 
+    name += "-";
+  set_menu(name.c_str());
+}
+
+void panel_window::new_selection(node& n)
+{
+	if(detached()) return;
+	set_node(&n,0,true);
+}
+
+void panel_window::set(panel* c)
+{
+  if (!c) return;
+
+  if(current_ && current_ != c) 
+    current_->clear();
+
+	current_ = c;
+
+	XtUnmanageChild(tab_);
+
+	Widget w = current_->widget();
+	
+	panel* p = panels_;
+	while(p) {
+
+		bool ok = (node_?p->enabled(*node_):false);
+		if(ok)
+			XtManageChild(p->widget()); 
+		else
+			XtUnmanageChild(p->widget()); 
+		p = p->next_;
+	}
+
+	if(w && !XtIsManaged(w))
+	{
+		current_ = find(kDefault);
+		w = current_->widget();
+		XtManageChild(w);
+	}
+
+	TabSetCurrent(tab_,w,False);
+
+	p = panels_;
+	while(p) {
+		Widget m = p->menus(menubar_);
+		if(m) {
+			if(p == current_)
+				XtManageChild(m);
+			else
+				XtUnmanageChild(m);
+		}
+		p = p->next_;
+	}
+
+	XtManageChild(tab_);
+
+	XtSetSensitive(save_,current_->can_save());
+	XtSetSensitive(print_,current_->can_print());
+}
+
+void panel_window::cloneCB(Widget w,XtPointer)
+{
+	panel_window *p = new panel_window(this);
+	p->xd_show();
+}
+
+void panel_window::unmapCB(Widget,XtPointer)
+{
+	delete this;
+}
+
+void panel_window::mapCB(Widget,XtPointer)
+{
+}
+
+void panel_window::nodeCB(Widget,XtPointer data)
+{
+//	XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*) data;
+	/* detached_ = !cb->set; */
+	title();
+}
+
+void panel_window::freezeCB(Widget,XtPointer data)
+{
+//	XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*) data;
+	/* frozen_ = !cb->set; */
+	title();
+}
+
+void panel_window::xd_show()
+{
+	Map();
+}
+
+void panel_window::notification(observable* n)
+{
+	set(current_);
+	current_->changed(*node_);
+}
+
+void panel_window::gone(observable* n)
+{
+	set_node(0,0,true);
+}
+
+void panel_window::adoption(observable* o,observable *n)
+{
+	set_node((node*)n,0,!frozen());
+}
+
+panel* panel_window::find(Widget w) 
+{
+	if(!w) w = TabGetCurrent(tab_);
+	panel* p = panels_;
+	while(p)
+	{
+		if(p->widget() == w) 
+			return p;
+		p = p->next_;
+	}
+	return 0;
+}
+
+void panel_window::set_node(node* n,const char* tab,bool update)
+{
+	// if(n == node_) return;
+
+	forget(node_);
+
+	panel* p = panels_;
+	while(p)
+	{
+		p->node_ = n;
+		p = p->next_;
+	}
+	node_ = n;
+	observe(node_);
+
+	if(tab) set_tab(tab);
+	if(n && !current_->enabled(*n))
+		set_tab(kDefault);
+
+	if(update) {
+		if(n)
+			current_->show(*n);
+		else
+			current_->clear();
+		set(current_);
+		title();	
+	}
+}
+
+void panel_window::detach()
+{
+	XmToggleButtonSetState(detached_,True, True);
+}
+
+void panel_window::freeze()
+{
+	XmToggleButtonSetState(detached_,True, True);
+	XmToggleButtonSetState(frozen_,True,True);
+}
+
+
+void panel_window::new_window(node* n,const char* tab,bool detached,bool frozen)
+{
+	panel_window *p = new panel_window(n,detached,frozen,tab);
+	p->xd_show();
+}
+
+void panel_window::new_window(node* n)
+{
+	panel_window *p = new panel_window(this,n,true,true);
+	p->xd_show();
+}
+
+panel* panel_window::find(const char* name)
+{
+	panel* p = panels_;
+	while(p)
+	{
+		bool ok = node_?p->enabled(*node_):false;
+		if(ok && (strcmp(p->name(),name) == 0))
+			return p;
+		p = p->next_;
+	}
+
+	p = panels_;   
+	while(p)  
+	{
+		if(strcmp(p->name(),kDefault) == 0)  
+			return p;   
+		p = p->next_;
+	}
+
+	abort();
+	return 0;
+}
+
+void panel_window::submit()
+{
+	if(XmToggleButtonGetState(close_on_apply_))
+		delete this;
+}
+
+void panel_window::resizeCB(Widget,XtPointer)
+{
+	save_size();
+}
+
+bool panel_window::frozen()
+{
+	return XmToggleButtonGetState(frozen_);
+}
+
+bool panel_window::detached()
+{
+	return XmToggleButtonGetState(detached_);
+}
+
+void panel_window::printCB(Widget,XtPointer)
+{
+	current_->print();
+}
+
+void panel_window::saveCB(Widget,XtPointer)
+{
+	current_->save();
+}
diff --git a/ecflow_4_0_7/view/src/panel_window.h b/ecflow_4_0_7/view/src/panel_window.h
new file mode 100644
index 0000000..78b5520
--- /dev/null
+++ b/ecflow_4_0_7/view/src/panel_window.h
@@ -0,0 +1,118 @@
+#ifndef panel_window_H
+#define panel_window_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef uipanel_H
+#include "uipanel.h"
+#endif
+
+#ifndef selection_H
+#include "selection.h"
+#endif
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef observer_H
+#include "observer.h"
+#endif
+
+#ifndef window_H
+#include "window.h"
+#endif
+
+
+class panel_window 
+  : public panel_top_c
+  , public selection
+  , public observer
+  , public window 
+{
+public:
+	panel_window();
+	panel_window(node*,bool,bool,const char*);
+	panel_window(panel_window*);
+	panel_window(panel_window*,node*,bool,bool);
+
+	~panel_window(); // Change to virtual if base class
+
+	bool frozen();
+	bool detached();
+
+	void detach();
+	void freeze();
+
+	void title();
+	void show(const char*);
+	void new_window( node*);
+	void submit();
+
+	virtual void create (Widget parent, char *widget_name = 0);
+	virtual Widget shell() { return _xd_rootwidget; }
+
+	// From selection
+	virtual void new_selection(node&);
+	virtual void selection_cleared();
+
+	// From panel_top_c
+	void cloneCB(Widget,XtPointer);
+	void unmapCB(Widget,XtPointer);
+	void mapCB(Widget,XtPointer);
+	void nodeCB(Widget,XtPointer);
+	void freezeCB(Widget,XtPointer);
+	void resizeCB(Widget,XtPointer);
+
+	virtual void xd_show();
+
+	static panel_window* find(node*);
+	static void new_window(node*,const char*,bool,bool);
+
+private:
+	panel_window(const panel_window&);
+	panel_window& operator=(const panel_window&);
+
+	panel*  panels_;
+	node*   node_;
+	panel*  current_;
+
+	void set(panel*);
+	void set_tab(const char*);
+	void copy(panel_window&);
+	virtual void tabCB(Widget,XtPointer);
+
+	void set_node(node*,const char*,bool);
+
+	panel* find(const char*);
+	panel* find(Widget);
+
+	void save_size();
+	void load_size();
+
+	// From observer<node>
+	virtual void notification(observable*);
+	virtual void gone(observable*);
+	virtual void adoption(observable*,observable*);
+
+	virtual void printCB(Widget,XtPointer);
+	virtual void saveCB(Widget,XtPointer);
+
+	static void tabCB(Widget,XtPointer,XtPointer);
+};
+
+inline void destroy(panel_window**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/parser.cc b/ecflow_4_0_7/view/src/parser.cc
new file mode 100644
index 0000000..ee5dcec
--- /dev/null
+++ b/ecflow_4_0_7/view/src/parser.cc
@@ -0,0 +1,101 @@
+
+#ifndef parser_H
+#include "parser.h"
+#endif
+
+#ifndef gui_H
+#include "gui.h"
+#endif
+
+#ifndef menus_H
+#include "menus.h"
+#endif
+
+#ifndef log_event_H
+#include "log_event.h"
+#endif
+
+#if 0
+#ifndef __sgi
+inline const char* gettxt(const char* a,const char* b) { return b; }
+#endif
+#endif
+
+/* #define YYDEBUG */
+/* #ifdef linux
+#undef YYDEBUG
+#endif
+*/
+#ifndef error_H
+#include "error.h"
+#endif
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+extern "C" {
+   extern int yylineno;
+	extern int yydebug;
+	extern int yyone;
+	extern FILE* yyin; 
+	extern int yyparse();
+}
+
+void parser::parse(const char* fname)
+{
+	char buf[1024];
+
+	yydebug  = getenv("YYDEBUG") != 0;
+	yylineno = 0;
+
+	int z = strlen(fname);
+	if(fname[z-1] == 'Z' && fname[z-2] == '.')
+	{
+		sprintf(buf,"|zcat %s",fname);
+		fname = buf;
+	}
+
+	if(fname[z-1] == 'z' && fname[z-2] == 'g' && fname[z-3] == '.')
+	{
+		sprintf(buf,"|zcat %s",fname);
+		fname = buf;
+	}
+
+	yyin = (fname[0] == '|') ? popen(fname+1,"r") : fopen(fname, "r");
+	if(yyin)
+	{
+		yyparse();
+		if(fname[0] == '|') pclose(yyin); else fclose(yyin);
+	}
+	else gui::syserr(fname);
+}
+
+void parser::parse(FILE *f)
+{
+	extern int yylineno;
+	yylineno = 0;
+	yydebug  = getenv("YYDEBUG") != 0;
+	yyin = f;
+	yyparse();
+}
+
+void parser::parse1(FILE *f)
+{
+	yyone = 1;
+	yydebug  = getenv("YYDEBUG") != 0;
+	yyparse();
+	yyone = 0;
+}
diff --git a/ecflow_4_0_7/view/src/parser.h b/ecflow_4_0_7/view/src/parser.h
new file mode 100644
index 0000000..54756a6
--- /dev/null
+++ b/ecflow_4_0_7/view/src/parser.h
@@ -0,0 +1,125 @@
+#ifndef parser_H
+#define parser_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#include <stdio.h>
+
+class parser {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	parser();
+
+// -- Destructor
+
+	~parser(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+
+	static void parse(const char*);
+	static void parse(FILE*);
+	static void parse1(FILE*);
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	parser(const parser&);
+	parser& operator=(const parser&);
+
+// -- Members
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const parser& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(parser**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(parser);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/passwrd.cc b/ecflow_4_0_7/view/src/passwrd.cc
new file mode 100644
index 0000000..932eb1a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/passwrd.cc
@@ -0,0 +1,71 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "passwrd.h"
+#include "gui.h"
+#include "str.h"
+extern "C" {
+#include "xec.h"
+}
+#include "ecflowview.h"
+
+#include <Xm/Text.h>
+
+#ifdef linux
+extern "C" char* cuserid(char*);
+#endif
+
+
+passwrd::passwrd()
+{
+	create(gui::top());
+}
+
+passwrd::~passwrd()
+{
+}
+
+
+Boolean passwrd::ask(const str& title,str& user,str& pass)
+{
+	return instance().prompt(title,user,pass);
+}
+
+Boolean passwrd::prompt(const str& title,str& user,str& pass)
+{
+
+	XmTextSetString(user_,(char*)(user.c_str()[0]?user.c_str():cuserid(0)));
+	XmTextSetString(passwd_,(char*)(pass.c_str()));
+
+	if(modal(title.c_str(),True))
+	{
+		char *p = XmTextGetString(user_);
+		user = p;
+		XtFree(p);
+
+		p = XmTextGetString(passwd_);
+		pass = p;
+		XtFree(p);
+		return True;
+	}
+
+	return False;
+}
+
+void passwrd::modifyCB( Widget, XtPointer )
+{
+}
diff --git a/ecflow_4_0_7/view/src/passwrd.h b/ecflow_4_0_7/view/src/passwrd.h
new file mode 100644
index 0000000..4332a8c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/passwrd.h
@@ -0,0 +1,116 @@
+#ifndef passwrd_H
+#define passwrd_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uipasswd.h"
+#include "dialog.h"
+
+class str;
+
+class passwrd : public dialog<passwrd,passwd_shell_c> {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	passwrd();
+
+// -- Destructor
+
+	~passwrd(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+	static Boolean ask(const str&,str&,str&);
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	passwrd(const passwrd&);
+	passwrd& operator=(const passwrd&);
+
+
+
+// -- Methods
+
+	Boolean prompt(const str&,str&,str&);
+
+// -- Overridden methods
+
+	virtual void modifyCB( Widget, XtPointer );
+
+// -- Class members
+
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const passwrd& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(passwrd**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(passwrd);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/patch.pl b/ecflow_4_0_7/view/src/patch.pl
new file mode 100644
index 0000000..1038873
--- /dev/null
+++ b/ecflow_4_0_7/view/src/patch.pl
@@ -0,0 +1,20 @@
+#!/bin/perl -n
+
+
+if(/void ([\w_]+)::create /)
+{
+        $c=$1;
+}
+
+if( /(^.*)( [\w_]+CB)(, \(XtPointer\) this\);.*$)/ )
+{
+        $_  = $1;
+        $_ .= "&";
+        $_ .= $c;
+        $_ .= "::";
+        $_ .= $2;
+        $_ .= $3;
+        $_ .= "\n";
+}
+
+print $_;
diff --git a/ecflow_4_0_7/view/src/persist.cc b/ecflow_4_0_7/view/src/persist.cc
new file mode 100644
index 0000000..1df0e24
--- /dev/null
+++ b/ecflow_4_0_7/view/src/persist.cc
@@ -0,0 +1,149 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "ecflowview.h"
+#include "persist.h"
+
+persist::persist(const char* kind,const char* name):
+	kind_(kind),
+	name_(name),
+	f_(0),
+	write_(0)
+{
+}
+
+persist::~persist()
+{
+	close();
+}
+
+void persist::close()
+{
+	if(f_) {
+		if(fclose(f_))
+			perror("persist::~persist");
+	}
+}
+
+bool persist::open(bool w)
+{
+	if(w != write_ || f_ == 0)
+	{
+		close();
+
+		char buf[1024];
+		const char * rcdir = getenv("ECFLOWRC") ? getenv("ECFLOWRC") : "ecflowrc";
+
+		sprintf(buf,"%s/.%s/%s.%s",rcdir, getenv("HOME"),kind_,name_);
+
+		f_  = fopen(buf, w ? "w" : "r");
+		if(!f_) perror(buf);
+
+		write_ = w;
+
+	}
+	return f_ != 0;
+}
+
+
+void persist::set(const char* p,int n)
+{
+	if(!open(true)) return;
+	fprintf(f_,"%s: %d\n",p,n);
+}
+
+void persist::set(const char* p,const char* s)
+{
+	if(!open(true)) return;
+	fprintf(f_,"%s: %s\n",p,s);
+}
+
+/* 
+void persist::set(const char* p,sms_list* l)
+{
+	if(!open(true)) return;
+
+	while(l) 
+	{
+		fprintf(f_,"%s: %s\n",p,l->name);
+		l = l->next;
+	}
+}
+
+bool persist::get(const char* p,sms_list*& l)
+{
+	if(!open(false)) return false;
+	rewind(f_);
+
+	l = 0;
+	const char* x;
+	while(( x = read(p)))
+	{
+		sms_list *m = (sms_list*)ecf_node_create((char*)x);
+		m->next = l;
+		l = m;
+	}
+
+	return l != 0;
+
+}
+*/
+
+bool persist::get(const char* p,int& n)
+{
+	if(!open(false)) return false;
+	rewind(f_);
+
+	const char* x;
+
+	if(( x = read(p)))
+	{
+		n = atoi(x);
+		return true;
+	}
+	return false;
+}
+
+bool persist::get(const char* p, char* n)
+{
+	if(!open(false)) return false;
+	rewind(f_);
+	const char* x;
+	if(( x = read(p)))
+	{
+		strcpy(n,x);
+		return true;
+	}
+	return false;
+}
+
+const char* persist::read(const char* p)
+{
+
+	static char line[1024];
+	int len = strlen(p);
+
+	for(;;)
+	{
+		if(!fgets(line,sizeof(line),f_))
+			return 0;
+
+		line[strlen(line)-1] = 0;
+
+		if(line[len] == ':' && strncmp(line,p,len) == 0)
+			return line + len + 2;
+	
+	}
+}
diff --git a/ecflow_4_0_7/view/src/persist.h b/ecflow_4_0_7/view/src/persist.h
new file mode 100644
index 0000000..b4401f5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/persist.h
@@ -0,0 +1,139 @@
+#ifndef persist_H
+#define persist_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+struct sms_list;
+
+class persist {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	persist(const char* kind,const char* name);
+
+// -- Destructor
+
+	~persist(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	void set(const char*,const char*);
+	void set(const char*,int);
+	void set(const char*,sms_list*);
+
+	bool get(const char*,char*);
+	bool get(const char*,int&);
+	bool get(const char*,sms_list*&);
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	persist(const persist&);
+	persist& operator=(const persist&);
+
+// -- Members
+
+	const char* kind_;
+	const char* name_;
+	FILE *f_;
+	bool write_;
+
+// -- Methods
+
+	bool open(bool);
+	void close();
+	const char* read(const char*);
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const persist& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(persist**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(persist);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/pixmap.cc b/ecflow_4_0_7/view/src/pixmap.cc
new file mode 100644
index 0000000..1ebcaee
--- /dev/null
+++ b/ecflow_4_0_7/view/src/pixmap.cc
@@ -0,0 +1,103 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <X11/xpm.h>
+#include <ctype.h>
+#include "pixmap.h"
+#include "gui.h"
+#include "directory.h"
+
+pixmap::pixmap(const char* name):
+	pixmap_(0),
+	name_(clean(name)),
+	bits_(0)
+{
+}
+
+pixmap::pixmap(const char* name,const char** bits):
+	pixmap_(0),
+	name_(clean(name)),
+	bits_(bits)
+{
+}
+
+
+pixmap::~pixmap()
+{
+}
+
+pixmap& pixmap::find(const char* name)
+{
+	pixmap *r = first();
+	const char* n = clean(name);
+	while(r)
+	{
+		if(strcmp(n,r->name_.c_str()) == 0)
+			return *r;
+		r = r->next();
+	}
+	return *(new pixmap(name));
+}
+
+void pixmap::set_label(Widget w)
+{
+	XtVaSetValues(w,
+		XmNlabelType, XmPIXMAP,
+		XmNlabelPixmap,pixels(),
+		NULL);
+}
+
+Pixmap pixmap::pixels()
+{
+	if(pixmap_) return pixmap_;
+
+	XpmAttributes xpm_attributes;
+	xpm_attributes.valuemask = XpmCloseness;
+	xpm_attributes.closeness = 65535;
+
+	Display* dpy = XtDisplay(gui::top());
+
+	if(bits_)
+	{
+		if(XpmCreatePixmapFromData(dpy,
+			DefaultRootWindow(dpy),
+			(char**)bits_,&pixmap_,0,&xpm_attributes))
+				pixmap_ = XmUNSPECIFIED_PIXMAP;
+	}
+	else {
+	  char buf[1024];
+	  sprintf(buf,"%s/icons/%s.xpm",directory::system(),name_.c_str());
+	  
+	  if(XpmReadFileToPixmap(dpy,
+				 DefaultRootWindow(dpy),
+				 buf, &pixmap_, 0, &xpm_attributes))
+	    {
+	      pixmap_ =  XmUNSPECIFIED_PIXMAP;
+	    }
+	}
+	
+	return pixmap_;       
+}
+
+const char* pixmap::clean(const char* s)
+{
+	static char n[1024];
+	strcpy(n,s);
+	char *p = n;
+	while(*p) { if(!isalnum(*p)) *p = '_'; p++; }
+	return n;
+}
+
+IMP(pixmap)
diff --git a/ecflow_4_0_7/view/src/pixmap.h b/ecflow_4_0_7/view/src/pixmap.h
new file mode 100644
index 0000000..9c565a3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/pixmap.h
@@ -0,0 +1,53 @@
+#ifndef pixmap_H
+#define pixmap_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <Xm/Xm.h>
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+
+class pixmap : public extent<pixmap> {
+public:
+	pixmap(const char*);
+	pixmap(const char*,const char**);
+	~pixmap(); // Change to virtual if base class
+
+	Pixmap pixels();
+	void set_label(Widget);
+
+	static pixmap& find(const char*);
+
+private:
+	pixmap(const pixmap&);
+	pixmap& operator=(const pixmap&);
+
+	Pixmap pixmap_;
+	str    name_;
+	const char** bits_;
+
+	static const char* clean(const char*);
+};
+
+inline void destroy(pixmap**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/pref_editor.cc b/ecflow_4_0_7/view/src/pref_editor.cc
new file mode 100644
index 0000000..d87f524
--- /dev/null
+++ b/ecflow_4_0_7/view/src/pref_editor.cc
@@ -0,0 +1,87 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "pref_editor.h"
+#include "node.h"
+#include "host.h"
+#include "ecflowview.h"
+#include "str.h"
+#include <Xm/Label.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+extern "C" {
+#include "xec.h"
+}
+
+
+void pref_editor::init(resource& x)
+{
+	Widget w = find(x.name().c_str()); if(!w) return;
+	x.initWidget(w);
+	sensitive(w,x.name().c_str(),x.isSet());
+}
+
+void pref_editor::sensitive(Widget w, const char* n, bool set)
+{
+	Widget p = toggle(n); if(!p) return;
+	XtSetSensitive(w,set);
+	XmToggleButtonSetState(p,!set,False);
+}
+
+Widget pref_editor::toggle(const char* n)
+{
+	char buf[1024];
+	sprintf(buf,"@%s",n);
+	return find(buf); 
+}
+
+bool pref_editor::modified(resource& x)
+{
+	Widget w     = find(x.name().c_str());   if(!w) return false;
+	bool on      = XtIsSensitive(w);
+
+	if(on != x.isSet())
+	{
+		x.setset(on);
+		if(on)  x.readWidget(w);
+		return true;
+	}
+
+
+	return on ? x.readWidget(w) : false;
+}
+
+void pref_editor::changed(Widget w)
+{
+	configurable* c = owner();
+	if(c) 
+	{
+		resource::modified(*c,*this);
+		resource::init(*c,*this);
+	}
+}
+
+void pref_editor::use(Widget w)
+{
+	bool s  = XmToggleButtonGetState(w);
+	char* p = XtName(w);
+
+	
+	Widget z = find(p+1);
+	if(z) XtSetSensitive(z,!s);
+
+	changed(w);
+}
+
diff --git a/ecflow_4_0_7/view/src/pref_editor.h b/ecflow_4_0_7/view/src/pref_editor.h
new file mode 100644
index 0000000..ebbbcac
--- /dev/null
+++ b/ecflow_4_0_7/view/src/pref_editor.h
@@ -0,0 +1,55 @@
+#ifndef pref_editor_H
+#define pref_editor_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <Xm/Xm.h>
+
+#ifndef option_H
+#include "option.h"
+#endif
+
+#ifndef configurator_H
+#include "configurator.h"
+#endif
+
+#ifndef editor_H
+#include "editor.h"
+#endif
+
+class configurable;
+
+class pref_editor : public configurator, public editor {
+public:
+
+	virtual configurable* owner() = 0;
+
+	virtual void init(resource&);
+	virtual bool modified(resource&);
+
+protected:
+	
+	void changed(Widget);
+	void use(Widget);
+
+private:
+
+	void sensitive(Widget,const char*,bool);
+	Widget toggle(const char* n);
+};
+
+inline void destroy(pref_editor**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/pref_window.cc b/ecflow_4_0_7/view/src/pref_window.cc
new file mode 100644
index 0000000..9f974d3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/pref_window.cc
@@ -0,0 +1,54 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "pref_window.h"
+#include "gui.h"
+#include "prefs.h"
+
+pref_window& pref_window::instance()
+{
+	static pref_window *m = new pref_window();
+	return *m;
+}
+
+pref_window::pref_window()
+{
+	create(gui::top());
+	prefs::create_all(tab_);
+}
+
+pref_window::~pref_window()
+{
+}
+
+void pref_window::closeCB(Widget,XtPointer)  
+{
+	XtUnmanageChild(form_);
+}
+
+void pref_window::mapCB(Widget,XtPointer)
+{
+}
+
+void pref_window::raise()
+{
+	XtManageChild(form_);
+	XMapRaised(XtDisplay(_xd_rootwidget),XtWindow(_xd_rootwidget));
+}
+
+void pref_window::show()
+{
+	instance().raise();
+}
diff --git a/ecflow_4_0_7/view/src/pref_window.h b/ecflow_4_0_7/view/src/pref_window.h
new file mode 100644
index 0000000..5445700
--- /dev/null
+++ b/ecflow_4_0_7/view/src/pref_window.h
@@ -0,0 +1,51 @@
+#ifndef pref_window_H
+#define pref_window_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uipref.h"
+
+class pref_window : public pref_shell_c {
+public:
+
+	pref_window();
+
+	~pref_window(); // Change to virtual if base class
+
+	static void show();
+
+private:
+
+	pref_window(const pref_window&);
+	pref_window& operator=(const pref_window&);
+
+	void raise();
+
+	static pref_window& instance();
+
+	void closeCB(Widget,XtPointer);
+	void mapCB(Widget,XtPointer);
+
+	/* void searchCB(Widget,XtPointer); */
+	/* void whatCB(Widget,XtPointer); */
+	/* void whereCB(Widget,XtPointer); */
+	/* void statusCB(Widget,XtPointer); */
+	/* void typeCB(Widget,XtPointer); */
+	/* void specialCB(Widget,XtPointer); */
+};
+
+inline void destroy(pref_window**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/prefs.cc b/ecflow_4_0_7/view/src/prefs.cc
new file mode 100644
index 0000000..3840049
--- /dev/null
+++ b/ecflow_4_0_7/view/src/prefs.cc
@@ -0,0 +1,41 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "prefs.h"
+#include "globals.h"
+#include "resource.h"
+
+void prefs::create_all(Widget w)
+{
+	prefs* p = first();
+	while(p)
+	{
+		p->create(w);
+		XtManageChild(p->widget());
+		p = p->next();
+	}
+}
+
+void prefs::setup(Widget w)
+{
+	resource::init(*owner(),*this);
+}
+
+configurable* prefs::owner() 
+{
+	return globals::instance();
+}
+
+IMP(prefs)
diff --git a/ecflow_4_0_7/view/src/prefs.h b/ecflow_4_0_7/view/src/prefs.h
new file mode 100644
index 0000000..c6dc853
--- /dev/null
+++ b/ecflow_4_0_7/view/src/prefs.h
@@ -0,0 +1,126 @@
+#ifndef prefs_H
+#define prefs_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+#ifndef pref_editor_H
+#include "pref_editor.h"
+#endif
+
+
+class prefs : public extent<prefs>, public pref_editor {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	prefs() {};
+
+// -- Destructor
+
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+	virtual void create(Widget,char* = 0) = 0;
+	virtual Widget widget() = 0;
+
+
+	void setup(Widget);
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+	static void create_all(Widget);
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+
+
+// -- Methods
+	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	prefs(const prefs&);
+	prefs& operator=(const prefs&);
+
+// -- Members
+
+// -- Methods
+
+
+// -- Overridden methods
+	// None
+
+	virtual Widget form()         { return widget(); }
+	virtual configurable* owner();
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/re.h b/ecflow_4_0_7/view/src/re.h
new file mode 100644
index 0000000..aa6ae75
--- /dev/null
+++ b/ecflow_4_0_7/view/src/re.h
@@ -0,0 +1,54 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#if defined(linux) || defined(alpha)
+#include <regex.h>
+
+
+class re {
+	regex_t re_;
+	char *loc_;
+public:
+	re(const char* r): loc_(0) { regcomp(&re_,r,0); }
+
+	~re() { regfree(&re_); }
+
+	char* match(char* a,char* b)
+	{
+		regmatch_t   pmatch;
+		if(!regexec(&re_,a,1,&pmatch,0))
+			return 0;
+
+		loc_ = a+pmatch.rm_so;
+		return a+pmatch.rm_eo;
+	}
+
+	char* loc() { return loc_; }
+};
+
+#else
+#include <stdlib.h>
+#include <libgen.h>
+
+class re {
+	char *re_;
+public:
+	re(const char* r) : re_(::regcmp(r,0)) {}
+	~re() { ::free(re_); }
+	char* match(char* a,char* b)  { return ::regex(a,b); }
+	char* loc() { return ::__loc1; }
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/reach.cc b/ecflow_4_0_7/view/src/reach.cc
new file mode 100644
index 0000000..e129c66
--- /dev/null
+++ b/ecflow_4_0_7/view/src/reach.cc
@@ -0,0 +1,255 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "arch.h"
+#include "reach.h"
+#include "node.h"
+#include "array.h"
+#include "node_lister.h"
+#include "trigger_lister.h"
+#include "host.h"
+
+struct path {
+
+	bool  use_;
+	bool  mark_;
+	bool  ignore_;
+
+	node* from_;
+	node* to_;
+	node* through_;
+	int   mode_;
+	node* trigger_;
+
+	path(node* from = 0, node* to = 0,node* through = 0, int mode = 0,node *trigger = 0):
+	   use_(false), mark_(false), ignore_(false), from_(from),to_(to),through_(through),mode_(mode), trigger_(trigger)
+		{}
+	
+#ifdef AIX
+	bool operator==(const path&) { return 0; }
+#endif
+};
+
+struct trigger_collector : public trigger_lister {
+
+static array<path> paths_;
+
+	array<node*> nodes_;
+	int count_;
+	bool triggered_;
+	node* current_;
+
+	trigger_collector(node *n): count_(0),triggered_(0),current_(0)  
+		{ add(n); add_all(n->kids()); }
+
+	void next_node(node& n,node*,int,node*);
+	void add(node*);
+	void add_all(node*);
+	void add(node*,node*,node*,int,node*);
+
+	void mode(node* c,bool t) { current_ = c; triggered_ = t; }
+
+	Boolean kids() { return True; }
+	Boolean parents() { return True; }
+};
+
+array<path> trigger_collector::paths_;
+
+void trigger_collector::next_node(node& n,node* th,int mode,node* tr)
+{ 
+	add(&n);	
+	if(triggered_)
+		add(current_,&n,th,mode,tr);
+	else
+		add(&n,current_,th,mode,tr);
+}
+
+void trigger_collector::add(node* from, node* to,node* through, int mode,node *trigger)
+{
+#if 0
+	if(through)
+	{
+		if(from->is_my_parent(through) || through->is_my_parent(from))
+			paths_.add( path(from,through,0,trigger_lister::hierarchy,0) );	
+		else
+			paths_.add( path(from,through,0,mode,trigger) );	
+
+		if(to->is_my_parent(through) || through->is_my_parent(to))
+			paths_.add( path(through,to,0,trigger_lister::hierarchy,0) );	
+		else
+			paths_.add( path(through,to,0,mode,trigger) );	
+
+	}
+	else
+#endif
+		paths_.add( path(from,to,through,mode,trigger) );
+}
+
+void trigger_collector::add(node* n)
+{
+	for(int i = 0; i < nodes_.count(); i++)
+		if(nodes_[i] == n)
+			return;
+	nodes_.add(n);	
+}
+
+void trigger_collector::add_all(node* k)
+{
+	while(k)
+	{
+		add(k);
+		add_all(k->kids());
+		k = k->next();
+	}
+}
+
+/*
+static bool sect(trigger_collector& a,trigger_collector& b)
+{
+	for(int i = 0; i < a.nodes_.count(); i++)
+		for(int j = 0; j < b.nodes_.count(); j++)
+			if(a.nodes_[i] == b.nodes_[j])
+				return true;
+	return false;
+}
+*/
+static bool can_reach(node* from,node* to)
+{
+	bool ok = false;
+
+	if(from == to)
+		return true;
+
+	for(int i = 0; i < trigger_collector::paths_.count(); i++)
+	{
+		path& p = trigger_collector::paths_[i];
+		if(!p.ignore_ && !p.mark_ && from == p.from_) {
+			if(p.use_) 
+				ok = true;
+			else
+			{
+				p.mark_ = true;
+				if(can_reach(p.to_,to))
+					ok = p.use_ = true; 
+				else
+					p.ignore_ = true;
+				p.mark_ = false;
+			}
+		}
+	}
+	return ok;
+}
+
+// Not used ?
+//static void fill(node* p,node* k)
+//{
+//	while(k)
+//	{
+//
+//		trigger_collector::paths_.add( path(p,k,0,
+//			trigger_lister::hierarchy,0) );
+//		trigger_collector::paths_.add( path(k,p,0,
+//			trigger_lister::hierarchy,0) );
+//		fill(k,k->kids());
+//		k = k->next();
+//	}
+//}
+
+bool reach::join(node* a,node* b,reach_lister& rl)
+{
+
+	if(!a || !b) return false;
+
+	trigger_collector::paths_.clear();
+
+	node* top = a->serv().top();
+	if(top != b->serv().top())
+		return false;
+
+	trigger_collector ta(a);
+	trigger_collector tb(b);
+
+	/* while( ! sect(ta,tb) ) */
+	for(;;)
+	{
+		printf("0\n");
+
+		int abefore = ta.count_;
+		int bbefore = tb.count_;
+
+		ta.count_ = ta.nodes_.count();
+		tb.count_ = tb.nodes_.count();
+
+		int aafter = ta.count_;
+		int bafter = tb.count_;
+                int i;
+
+		for(i = abefore ; i < aafter; i++)
+		{
+			ta.mode(ta.nodes_[i],true);
+			ta.nodes_[i]->triggered(ta);
+		}
+
+		for(i = bbefore ; i < bafter; i++)
+		{
+			tb.mode(tb.nodes_[i],false);
+			tb.nodes_[i]->triggers(tb);
+		}
+
+		printf("%d %d %d %d\n",abefore,aafter,bbefore,bafter);
+
+		if(abefore == aafter && bbefore == bafter)
+		{
+			/* trigger_collector::paths_.clear(); */
+			break;
+			//return false;
+		}
+	}
+
+
+	printf("1\n");
+	can_reach(a,b);
+	printf("2\n");
+#if 0
+	for(int i = 0; i < ta.nodes_.count(); i++)
+		rl.next(ta.nodes_[i]);
+
+	for(    i = 0; i < tb.nodes_.count(); i++)
+		rl.next(tb.nodes_[i]);
+#endif
+
+	int x =0;
+        int i;
+	for(i = 0; i < trigger_collector::paths_.count(); i++)
+	{
+		path& p = trigger_collector::paths_[i];
+		if(p.use_)
+			x++;
+	}
+
+	printf("paths %d\n",x);
+
+	for(i = 0; i < trigger_collector::paths_.count(); i++)
+	{
+		path& p = trigger_collector::paths_[i];
+		if(p.use_)
+			rl.next(p.from_,p.to_,p.through_,p.mode_,p.trigger_);
+
+	}
+	trigger_collector::paths_.clear();
+	return false;
+}
+
+
diff --git a/ecflow_4_0_7/view/src/reach.h b/ecflow_4_0_7/view/src/reach.h
new file mode 100644
index 0000000..c3f85c2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/reach.h
@@ -0,0 +1,48 @@
+#ifndef reach_H
+#define reach_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+class node;
+class reach_lister {
+public:
+	virtual void next(node*,node*,node*,int,node*) = 0;
+};
+
+class reach {
+public:
+
+	static bool join(node*,node*,reach_lister&);
+
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/relation.cc b/ecflow_4_0_7/view/src/relation.cc
new file mode 100644
index 0000000..4baca77
--- /dev/null
+++ b/ecflow_4_0_7/view/src/relation.cc
@@ -0,0 +1,186 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "runnable.h"
+#include "relation.h"
+#include "observable.h"
+#include "counted.h"
+#include <stdio.h>
+
+class run_gc : public runnable {
+	void run()  { if(!relation::gc()) disable();}
+};
+
+
+static run_gc dogc;
+
+relation::relation(observer* a,observable* b):
+  observer_(a),
+  observable_(b),
+  data_(0),
+  valid_(true)
+{
+}
+
+relation::~relation()
+{
+  if(data_) 
+    data_->detach();
+}
+
+void relation::add(observer* a,observable* b)
+{
+  if(a && b) {
+    b->observed_ = true;
+    new relation(a,b);
+  }
+}
+
+void relation::stats(const char* p)
+{  
+  relation* r = first();
+  int c = 0; int v = 0;
+  while(r) {
+    relation* n = r->next();
+    c++;
+    if(r->valid_) v++;
+    r = n;
+  }
+  
+  // printf("relation::stat %s %d relation(s) %d valid(s)\n",p,c,v);
+}
+
+int relation::remove(observer* a,observable* b)
+{	
+  int rc = 0;
+  relation* r = first();
+  while(r) {
+    relation* n = r->next();
+    if(r->observer_ == a && r->observable_ == b) {
+      r->valid_ = false;
+      rc++;
+    }
+    r = n;
+  }
+
+  dogc.enable();
+  return rc;
+}
+
+int relation::remove(observer* a)
+{
+  int rc = 0;
+  relation* r = first();
+  while(r) {
+    relation* n = r->next();
+    if(r->observer_ == a) {
+      r->valid_ = false;
+      rc++;
+    }
+    r = n;
+  }
+
+  dogc.enable();  
+  return rc;
+}
+
+int relation::remove(observable* b)
+{
+  int rc = 0;
+  relation* r = first();
+  while(r) {
+    relation* n = r->next();
+    if(r->observable_ == b) {
+      r->valid_ = false;
+      rc++;
+    }
+    r = n;
+  }
+
+  dogc.enable();
+  return rc;
+}
+
+void relation::replace(observable* o,observable* x)
+{
+  relation* r = first();
+  while(r) {
+    relation* n = r->next();
+    if(r->observable_ == o)
+      r->observable_ = x;
+    r = n;
+  }
+}
+
+void relation::scan(observable* b,observer_iterator& i)
+{
+  relation* r = first();
+  
+  while(r) {
+    relation* n = r->next();
+    if(r->observable_ == b && r->valid_)
+      i.next(r->observer_);
+    r = n;
+  }
+}
+
+bool relation::gc()
+{
+  relation* r = first();
+  
+  stats("relation::gc"); 
+  
+  while(r) {
+    relation* n = r->next();
+    if(!r->valid_) {
+      delete r;
+      return true;
+    }
+    r = n;
+  }
+  
+  return false;
+}
+
+void relation::set_data(observer* a,observable* b,counted* x)
+{
+  relation* r = first();
+  while(r) {
+    relation* n = r->next();
+    if(r->observer_ == a && r->observable_ == b) {
+      if(x != r->data_) {
+	if(r->data_) r->data_->detach();
+	r->data_ = x;
+	if(r->data_) r->data_->attach();
+      }
+      return;
+    }
+    r = n;
+  }
+}
+
+counted* relation::get_data(observer* a,observable* b)
+{
+  relation* r = first();
+  while(r) {
+    relation* n = r->next();
+    if(r->observer_ == a && r->observable_ == b)
+      return r->data_;
+    r = n;
+  }
+  return 0;
+}
+
+IMP(relation)
diff --git a/ecflow_4_0_7/view/src/relation.h b/ecflow_4_0_7/view/src/relation.h
new file mode 100644
index 0000000..07a1ea3
--- /dev/null
+++ b/ecflow_4_0_7/view/src/relation.h
@@ -0,0 +1,74 @@
+#ifndef relation_H
+#define relation_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+class observer;
+class observable;
+class counted;
+
+class observer_iterator {
+public:
+	virtual void next(observer*) = 0;
+};
+
+class observable_iterator {
+public:
+	virtual void next(observable*) = 0;
+};
+
+
+class relation : public extent<relation>  {
+public:
+	relation(observer*,observable*);
+
+	~relation(); // Change to virtual if base class
+
+	static void add(observer*,observable*);
+	static int remove(observer*,observable*);
+	static int remove(observer*);
+	static int remove(observable*);
+	static void replace(observable*,observable*);
+
+	static void scan(observer*,  observable_iterator&);
+	static void scan(observable*,observer_iterator& );
+	static bool gc();
+
+
+	static void set_data(observer*,observable*,counted*);
+	static counted* get_data(observer*,observable*);
+
+	static void stats(const char*);
+
+private:
+
+	relation(const relation&);
+	relation& operator=(const relation&);
+
+	observer*   observer_;
+	observable* observable_;
+	counted*    data_;
+	bool        valid_;
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/repeat.h b/ecflow_4_0_7/view/src/repeat.h
new file mode 100644
index 0000000..e95a353
--- /dev/null
+++ b/ecflow_4_0_7/view/src/repeat.h
@@ -0,0 +1,151 @@
+#ifndef REPEAT_H
+#define REPEAT_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #23 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include "repeat_node.h" 
+
+/**********************************************/
+class repeat_date_node : public repeat_node {
+  virtual int last() const {
+    return (ecf_repeat_date_to_julian(repeat_node::last()) -
+            ecf_repeat_date_to_julian(repeat_node::start())) / step() + ink;
+  }
+
+  virtual int current() const {
+    if (owner_ && get()) { 
+      return (ecf_repeat_date_to_julian(get()->index_or_value()) - 
+	      ecf_repeat_date_to_julian(start())) / step();
+    }
+    return repeat_node::current(); }
+
+  virtual void value(char* n,int i) const {
+    if (n)
+      sprintf(n,"%ld", 
+              (ecf_repeat_julian_to_date
+               (ecf_repeat_date_to_julian(start()) + i * step())));   
+  }
+  virtual const char* perl_class() { 
+    return "repeat::date"; }
+
+public:
+ repeat_date_node(host& h,ecf_node* r) : repeat_node(h,r) {}
+};
+
+/**********************************************/
+class repeat_integer_node : public repeat_node {
+  virtual int last() const {
+    return (repeat_node::last() - repeat_node::start()) / step() + ink; }
+  virtual int current() const {
+    return (repeat_node::current() - repeat_node::start()) / step(); }
+  virtual void value(char*n,int i) const {
+    if (n) sprintf(n,"%d",start() + i*step()); }
+  virtual const char* perl_class() { 
+    return "repeat::integer"; }
+
+public:
+ repeat_integer_node(host& h,ecf_node* r) : repeat_node(h,r) {}
+};
+
+/**********************************************/
+class repeat_day_node : public repeat_node {
+  virtual int last() const {
+    return (repeat_node::last() - repeat_node::start()) / step() + ink; }
+  virtual int current() const { 
+    return step(); }
+  virtual void value(char*n,int i) const {
+    if (n) sprintf(n,"%d",step()); }
+  virtual const char* perl_class() { 
+    return "repeat::day"; }
+
+public:
+ repeat_day_node(host& h,ecf_node* r) : repeat_node(h,r) {}
+};
+
+/**********************************************/
+class repeat_string_node : public repeat_node {
+  virtual int last() const { 
+    if (owner_) 
+      return repeat_node::last() + ink;
+    return repeat_node::last(); }
+  virtual int current() const { 
+    return repeat_node::current(); }
+  virtual void value(char* n,int i) const {
+    if (n && get()) 
+      sprintf(n,"%s",get()->value_as_string(i).c_str()); }
+  virtual int index(const char*) const { 
+    return current(); }
+  virtual bool can_use_text() { 
+    return false; }
+  virtual void perlify(FILE* f) {
+    if (get()) 
+      perl_member(f, "values",get()->toString().c_str()); 
+    repeat_node::perlify(f); }
+  virtual const char* perl_class() { 
+    return "repeat::string"; }
+
+public:
+  repeat_string_node(host& h,ecf_node* r) : repeat_node(h,r) {}
+};
+
+/**********************************************/
+class repeat_enumerated_node : public repeat_node {
+  virtual int last() const { 
+    if (owner_) 
+      return repeat_node::last() + ink;
+    return repeat_node::last(); }
+  virtual int current() const { 
+    return repeat_node::current(); }
+  virtual void value(char* n,int i) const {
+    if (n && get()) sprintf(n,"%s",get()->value_as_string(i).c_str()); }
+  virtual int index(const char*) const {
+    return current(); }
+  virtual bool can_use_text() { 
+    return false; }
+  
+  virtual void perlify(FILE* f) {
+    if (get()) 
+      perl_member(f, "values",get()->toString().c_str()); 
+    repeat_node::perlify(f); }
+
+  virtual const char* perl_class() { 
+    return "repeat::enumerated"; }
+
+public:
+  repeat_enumerated_node(host& h,ecf_node *r) : repeat_node(h,r) {}
+};
+
+/**********************************************/
+#ifdef BRIDGE
+class repeat_node_maker : public node_maker<repeat_node> {
+ protected:
+  static std::map<std::string, repeat_node_maker*> map_;
+ public:
+  repeat_node_maker() : node_maker<repeat_node>(NODE_REPEAT) {}
+  virtual node* make(host& h,ecf_node* n) {
+    return map_[n->type_name()]->make(h, n); }
+};
+
+std::map<std::string, repeat_node_maker*> repeat_node_maker::map_;
+
+template <class T, class W>
+class repeat_node_builder : public repeat_node_maker {
+public:
+  repeat_node_builder() { 
+    map_[typeid(T).name()] = this; }  
+  ~repeat_node_builder() {}
+};
+#endif
+#endif
diff --git a/ecflow_4_0_7/view/src/repeat_node.cc b/ecflow_4_0_7/view/src/repeat_node.cc
new file mode 100644
index 0000000..9456449
--- /dev/null
+++ b/ecflow_4_0_7/view/src/repeat_node.cc
@@ -0,0 +1,308 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #36 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+// .AUTHOR   Baudouin Raoult
+// .DATE     28-JUN-2001 / 28-JUN-2001
+
+#include "arch.h"
+#include "repeat_node.h"
+#include "show.h"
+// #include "text_lister.h"
+#include "host.h"
+const int  REPEAT_SHOWN = 3;
+#include "ecflowview.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+const int kPixSize  = 8;
+const int kHMargins = 4;
+const int kVMargins = 2;
+
+repeat_node::repeat_node(host& h,ecf_node* n) 
+  : node(h,n)
+  , name_("none")
+{
+  if (get()) 
+    name_ = get()->name();
+  else if (n)  
+    name_ = n->name();
+  if (n) {
+    if (n->parent() && n->parent()->get_node())
+      full_name_ = n->parent()->get_node()->absNodePath();
+    full_name_ += ":";
+    full_name_ += n->name(); 
+  }
+}
+
+#ifdef BRIDGE
+repeat_node::repeat_node(host& h,sms_node* n,char b) 
+  : node(h,n,b) 
+  , name_(n ? n->name : "unknown")
+{
+  full_name_ = n ? sms_node_full_name(n) : "unknown";
+}
+#endif
+
+/**********************************************/
+
+RepeatBase* repeat_node::get() const
+{
+  if (parent()) 
+    if (parent()->__node__())
+      return parent()->__node__()->get_repeat().repeatBase();
+  Node * nnn = 0x0;
+
+  if (nnn) 
+    return nnn->findRepeat(full_name_).repeatBase();      
+  return 0x0;
+}
+
+ void repeat_node::drawNode(Widget w,XRectangle* r,bool tree) {
+   node::update(-1,-1,-1);
+   node::drawNode(w,r,true);
+   sizeNode(w,r,tree);
+}
+
+void repeat_node::sizeNode(Widget w,XRectangle* r,bool tree) {
+  int extra = 0;
+  XmString   s = tree?labelTree():labelTrigger();
+  r->width  = XmStringWidth(smallfont(),s)  + 2*kHMargins +  extra * kPixSize;
+  r->height = XmStringHeight(smallfont(),s) + 2*kVMargins;
+  if(r->height < kPixSize + 2*kVMargins) r->height = kPixSize + 2*kVMargins;
+}
+
+int repeat_node::start() const
+{
+#ifdef BRIDGE
+  if (tree_) 
+    return ((sms_repeat*) tree_)->start;
+#endif
+  if (get()) 
+    return get()->start();
+  return 0;
+}
+
+int repeat_node::last() const
+{
+#ifdef BRIDGE
+  if (tree_) { 
+    sms_repeat* r = (sms_repeat*)tree_;
+    switch (r->mode) {
+    case REPEAT_INTEGER: 
+      return (r->end - r->start)/r->step + 1;
+    case REPEAT_ENUMERATED:    
+    case REPEAT_STRING: { int n = 0; sms_list *l = r->str;
+        while(l) { n++; l = l->next; }
+        return n; }
+    case REPEAT_DATE: {
+      return (ecf_repeat_date_to_julian(r->end) - 
+              ecf_repeat_date_to_julian(r->start))/
+        r->step + 1; }
+    default: 
+      return r->end;
+    }
+  }
+#endif
+  if (get()) 
+    return get()->end(); 
+  return 0;
+}
+
+int repeat_node::step() const
+{
+#ifdef BRIDGE
+  if (tree_) 
+    return ((sms_repeat*) tree_)->step;
+#endif
+  if (get()) 
+    return get()->step() > 0 ? get()->step() : 1;
+  return 1;
+}
+
+int repeat_node::current() const
+{
+#ifdef BRIDGE
+  if (tree_) { 
+    sms_repeat* r = (sms_repeat*)tree_;
+    switch (r->mode) {
+    case REPEAT_INTEGER: 
+      return (r->status - r->start)/r->step;
+    case REPEAT_ENUMERATED: { int rc = 0;
+       sms_list *item = r->str;
+       char current[255];
+       while (item) {
+         sprintf(current,"%d",r->status);
+         if (!strcmp(item->name, current)) 
+	   return rc;
+         rc++; item = item->next;
+       }
+       return rc; }
+    case REPEAT_STRING: 
+      return r->status;
+    case REPEAT_DATE: 
+      return (ecf_repeat_date_to_julian(r->status) - 
+              ecf_repeat_date_to_julian(r->start))/r->step; 
+    default: 
+      return r->status;
+    }
+  }
+#endif
+  if (get()) 
+    return get()->index_or_value();
+  return 0;
+}
+
+void repeat_node::value(char* n,int i) const
+{
+#ifdef BRIDGE
+  if (tree_) {
+    sms_repeat* r = (sms_repeat*)tree_;
+    switch (r->mode) {
+    case REPEAT_INTEGER: { 
+      sprintf(n,"%d",r->start + i*r->step); 
+      return; }
+    case REPEAT_ENUMERATED:    
+    case REPEAT_STRING: { int j = 0; sms_list *l = r->str;
+        while(l && j != i) { j++; l = l->next; } if(l) strcpy(n,l->name); 
+	return; }
+    case REPEAT_DATE: {
+      sprintf(n,"%ld",ecf_repeat_julian_to_date
+              (ecf_repeat_date_to_julian(r->start) + i*r->step)); 
+      return; }
+    default: 
+      return;
+    }
+  }
+#endif
+  if (get() && n) 
+    sprintf(n,"%s",get()->value_as_string(i).c_str());
+}
+
+//===============================================================
+
+xmstring repeat_node::make_label_tree()
+{
+        str80 vals[REPEAT_SHOWN];
+        str80 buf;
+        int end    = last();
+        int curr   = current();
+        int first  = curr - REPEAT_SHOWN/2;
+        static xmstring space(" ");
+        {
+        if(first<0)             first = 0;
+        if(end -first<REPEAT_SHOWN)    first = end  - REPEAT_SHOWN;
+        if(end <=REPEAT_SHOWN)         first = 0;
+
+        int m = MIN(REPEAT_SHOWN,end);
+        int i;
+
+        for(i = 0 ; i < REPEAT_SHOWN ; i++)
+                vals[i][0] = 0;
+
+        for(i=0 ; i < m ; i++)
+                value(vals[i],i+first);
+
+        if(first>0)          
+                strcpy(vals[0],      "...");
+
+        if( first+REPEAT_SHOWN < end) 
+                strcpy(vals[REPEAT_SHOWN-1],"...");
+
+        curr = curr - first;
+
+        strcpy(buf,name_.c_str());
+        strcat(buf,"=");
+
+        xmstring s(buf);
+
+        m = 0;
+        for(i = 0; i < REPEAT_SHOWN ; i ++)
+        {               
+                if(m != 0)
+                        s += space;
+
+                s += xmstring(vals[i], (i==curr)?"bold":"normal" );
+
+                m = strlen(vals[i]);
+        }
+
+        return s;
+        }
+}
+
+void repeat_node::info(std::ostream& f)
+{
+  if (get()) {
+    f << get()->toString() << "\n";
+  }
+  f << "Values are:\n";
+  f << "-----------\n";
+
+  str80 buf;
+
+  int end = last();
+  int cur = current();
+  int i;
+
+  if(end > 50) {
+    for(i=0 ; i < 22 ; i++) {
+      value(buf,i);
+      f << char( (i == cur) ? '>' : ' ') << buf << "\n";
+    }
+    
+    f << "...\n";
+
+    for(i= end-22 ; i < end ; i++) {
+      value(buf,i);
+      f << char( (i == cur) ? '>' : ' ') << buf << "\n";
+    }
+    return;
+  }
+
+  for(i=0 ; i < end ; i++) {
+    value(buf,i);
+    f << char( (i == cur) ? '>' : ' ') << buf << "\n";
+  }
+  f << "-----------" << "\n";
+}
+
+const char* repeat_node::status_name() const
+{
+  static char buf[80];
+  int end    = last();
+  int cur    = current();
+
+  if(cur < 0)    
+    return "not started";
+  if(cur >= end) 
+    return "finished";
+
+  value(buf,cur);
+  return buf;
+}
+
+void repeat_node::perlify(FILE* f)
+{
+  perl_member(f,"start",  start());
+  perl_member(f,"end",    last());
+  perl_member(f,"step",   step());
+  perl_member(f,"current",current());  
+}
+
+Boolean repeat_node::visible() const { 
+  return show::want(show::repeat); 
+}
diff --git a/ecflow_4_0_7/view/src/repeat_node.h b/ecflow_4_0_7/view/src/repeat_node.h
new file mode 100644
index 0000000..472e759
--- /dev/null
+++ b/ecflow_4_0_7/view/src/repeat_node.h
@@ -0,0 +1,66 @@
+#ifndef repeat_node_H
+#define repeat_node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef node_H
+#include "node.h"
+#endif
+typedef char str80[80];
+#include <RepeatAttr.hpp>
+class repeat_node : public node {
+public:
+  // const Repeat& get();
+  RepeatBase* get() const;
+
+  repeat_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+  repeat_node(host& h,sms_node* n,char b);
+#endif
+  virtual int  start() const;
+  virtual int  last() const;
+  virtual int  step() const;
+  virtual int  current() const;
+  virtual void value(char*,int) const;
+  virtual int  index(const char* p) const { return atol(p); }   
+  virtual bool can_use_text()             { return true; }
+  virtual void perlify(FILE*);
+
+  virtual void drawNode(Widget w,XRectangle* r,bool);
+  virtual void sizeNode(Widget w,XRectangle* r,bool);
+  
+ protected:
+  static const int ink = 1;
+private:
+  std::string name_,full_name_;
+  
+  repeat_node(const repeat_node&);
+  repeat_node& operator=(const repeat_node&);
+  
+  virtual void info(std::ostream&);
+  virtual xmstring make_label_tree();
+  
+  virtual const char* status_name() const;
+
+  virtual const std::string& full_name() const { return full_name_; }
+  virtual const std::string& name() const { return name_; }
+
+  virtual bool is_my_parent(node*) const { return false; }
+  virtual Boolean visible() const;
+};
+
+inline void destroy(repeat_node**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/resource.cc b/ecflow_4_0_7/view/src/resource.cc
new file mode 100644
index 0000000..9db79c8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/resource.cc
@@ -0,0 +1,112 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <strings.h>
+
+#ifndef option_H
+#include "option.h"
+#endif
+
+#ifndef base_H
+#include "base.h"
+#endif
+
+#include "configurable.h"
+#include "configurator.h"
+
+resource::resource(configurable* o,const str& name,const str& value):
+	owner_(o),
+	base_(base::lookup(o->name())),
+	name_(name),
+	value_(value),
+	set_(0)
+{
+	base_->attach();	
+	base_->defaults(name_,value_);
+	set_ = base_->fetch(name_,value_);
+}
+
+resource::~resource()
+{
+	base_->detach();
+}
+
+void resource::setset(bool on)
+{
+	set_ = on;
+
+	if(on) 
+		base_->store(name_,value_,true);
+	else
+		base_->remove(name_);
+
+	base_->fetch(name_,value_);
+
+	resource* r = first();
+	while(r)
+	{
+		if(r->name() == name_)
+			if(r->changed())
+				r->owner_->changed(*r);
+		r = r->next();
+	}
+}
+
+void resource::set(const str& v)
+{
+
+	value_ = v;
+	base_->store(name_,value_,true);
+	set_   = true;
+
+	resource* r = first();
+	while(r)
+	{
+		if(r->name() == name_)
+			if(r->changed())
+				r->owner_->changed(*r);
+		r = r->next();
+	}
+}
+
+const str& resource::get()
+{
+	base_->fetch(name_,value_);
+	return value_;
+}
+
+void resource::init(configurable& a, configurator& c)
+{
+	resource* r = first();
+	while(r)
+	{
+		if(r->owner_ == &a) c.init(*r);
+		r = r->next();
+	}
+}
+
+void resource::modified(configurable& a, configurator& c)
+{
+	resource* r = first();
+	while(r)
+	{
+		if(r->owner_ == &a) 
+			if(c.modified(*r))
+				a.changed(*r);
+		r = r->next();
+	}
+}
+
+IMP(resource)
diff --git a/ecflow_4_0_7/view/src/resource.h b/ecflow_4_0_7/view/src/resource.h
new file mode 100644
index 0000000..38c4812
--- /dev/null
+++ b/ecflow_4_0_7/view/src/resource.h
@@ -0,0 +1,71 @@
+#ifndef resource_H
+#define resource_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef configurable_H
+#include "configurable.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#include <Xm/Xm.h>
+
+class base;
+
+#ifndef resource_H
+#include "resource.h"
+#endif
+#include "extent.h"
+
+class resource : public extent<resource> {
+public:
+
+	resource(configurable*,const str&,const str&);
+
+	virtual ~resource(); // Change to virtual if base class
+
+	const str name() const { return name_; }
+
+	virtual void initWidget(Widget) = 0;
+	virtual bool readWidget(Widget) = 0;
+	virtual bool changed() = 0;
+
+	virtual void       set(const str&);
+	virtual const str& get();
+
+	virtual bool isSet() { return set_;  }
+	virtual void setset(bool);
+
+	static void init(configurable&,configurator&);
+	static void modified(configurable&,configurator&);
+
+private:
+
+	resource(const resource&);
+	resource& operator=(const resource&);
+
+	configurable* owner_;
+	base*         base_;
+	str           name_;
+	str           value_;
+	bool          set_;
+};
+
+inline void destroy(resource**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/restart.cc b/ecflow_4_0_7/view/src/restart.cc
new file mode 100644
index 0000000..9424adf
--- /dev/null
+++ b/ecflow_4_0_7/view/src/restart.cc
@@ -0,0 +1,32 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "restart.h"
+#include "node.h"
+
+
+restart::restart():
+	node_alert<restart>("Restarted tasks",STATUS_SUBMITTED)
+{
+}
+
+restart::~restart()
+{
+}
+
+bool restart::keep(node* n)
+{
+	return n->isRerun();
+}
diff --git a/ecflow_4_0_7/view/src/restart.h b/ecflow_4_0_7/view/src/restart.h
new file mode 100644
index 0000000..2cd63e8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/restart.h
@@ -0,0 +1,109 @@
+#ifndef restart_H
+#define restart_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "node_alert.h"
+
+class node;
+
+class restart : public node_alert<restart> {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	restart();
+
+// -- Destructor
+
+	~restart(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	restart(const restart&);
+	restart& operator=(const restart&);
+
+// -- Methods
+
+
+// -- Overridden methods
+
+	virtual bool keep(node*);
+
+// -- Class members
+
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const restart& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(restart**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(restart);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/result.cc b/ecflow_4_0_7/view/src/result.cc
new file mode 100644
index 0000000..040a27a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/result.cc
@@ -0,0 +1,32 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "result.h"
+
+result::result():
+	node_alert<result>("Search results")
+{
+}
+
+result::~result()
+{
+}
+
+
+bool result::keep(node* n)
+{
+	return true;
+}
+
diff --git a/ecflow_4_0_7/view/src/result.h b/ecflow_4_0_7/view/src/result.h
new file mode 100644
index 0000000..a679fda
--- /dev/null
+++ b/ecflow_4_0_7/view/src/result.h
@@ -0,0 +1,38 @@
+#ifndef result_H
+#define result_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node_alert.h"
+
+class node;
+
+class result : public node_alert<result> {
+public:
+
+	result();
+	~result(); // Change to virtual if base class
+
+private:
+
+	result(const result&);
+	result& operator=(const result&);
+
+	virtual bool keep(node*);
+};
+
+inline void destroy(result**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/runnable.cc b/ecflow_4_0_7/view/src/runnable.cc
new file mode 100644
index 0000000..12dc670
--- /dev/null
+++ b/ecflow_4_0_7/view/src/runnable.cc
@@ -0,0 +1,64 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "ecflowview.h"
+#include "runnable.h"
+
+/* do a process in the "background" */
+
+Boolean runnable::workCB(XtPointer)
+{
+    runnable *p = first();
+    int active = 0;
+    while(p) {
+      runnable* n = p->next();
+      
+      if(p->actived_) {
+	active++;
+	p->run();
+      }
+      
+      p = n;
+    }
+    return (active == 0);
+}
+
+runnable::runnable():
+	actived_(False)
+{
+}
+
+runnable::~runnable()
+{
+}
+
+void runnable::enable()
+{
+  if(actived_) return;
+
+  extern XtAppContext app_context;
+  if(app_context != 0) 
+    XtAppAddWorkProc(app_context,workCB,NULL);
+
+  actived_ = True;
+}
+
+
+void runnable::disable()
+{
+	actived_ = False;
+}
+
+IMP(runnable)
diff --git a/ecflow_4_0_7/view/src/runnable.h b/ecflow_4_0_7/view/src/runnable.h
new file mode 100644
index 0000000..614f4ec
--- /dev/null
+++ b/ecflow_4_0_7/view/src/runnable.h
@@ -0,0 +1,49 @@
+#ifndef runnable_H
+#define runnable_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <Xm/Xm.h>
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+class runnable : public extent<runnable> {
+public:
+	runnable();
+
+	virtual ~runnable(); // Change to virtual if base class
+
+	void enable();
+	void disable();
+	bool actived() { return actived_; }
+
+	virtual void run() = 0;
+
+private:
+	runnable(const runnable&);
+	runnable& operator=(const runnable&);
+
+	Boolean actived_;
+
+	static Boolean workCB(XtPointer);
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/script_panel.cc b/ecflow_4_0_7/view/src/script_panel.cc
new file mode 100644
index 0000000..a1c8768
--- /dev/null
+++ b/ecflow_4_0_7/view/src/script_panel.cc
@@ -0,0 +1,61 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "script_panel.h"
+#include "node.h"
+#include "host.h"
+#include "ecf_node.h"
+#include "variable_node.h"
+#include <Xm/Text.h>
+extern "C" {
+#include "xec.h"
+}
+
+script_panel::script_panel(panel_window& w)
+  :panel(w)
+  ,text_window(false)
+{
+}
+
+script_panel::~script_panel()
+{
+}
+
+void script_panel::clear()
+{
+  XmTextSetString(name_,(char*)"");
+  text_window::clear();
+}
+
+void script_panel::show(node& n)
+{
+  std::string p = n.variable("ECF_SCRIPT");
+  if (!n.__node__()) p = n.variable("SMSSCRIPT");
+  XmTextSetString(name_,p.empty() ? (char*) "" : (char*)p.c_str());
+  load(n.serv().script(n));
+}
+
+Boolean script_panel::enabled(node& n)
+{  
+  if (n.type() != NODE_TASK && n.type() != NODE_ALIAS) return False;
+  if (!n.__node__()) 
+    return n.variable("SMSSCRIPT").size() > 7;
+  return n.variable("ECF_SCRIPT").size() > 7;
+}
+
+void script_panel::create (Widget parent, char *widget_name )
+{
+	script_form_c::create(parent,widget_name);
+}
diff --git a/ecflow_4_0_7/view/src/script_panel.h b/ecflow_4_0_7/view/src/script_panel.h
new file mode 100644
index 0000000..8a17007
--- /dev/null
+++ b/ecflow_4_0_7/view/src/script_panel.h
@@ -0,0 +1,64 @@
+#ifndef script_panel_H
+#define script_panel_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiscript.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef text_window_H
+#include "text_window.h"
+#endif
+
+class script_panel : public panel, public script_form_c, public text_window {
+public:
+
+	script_panel(panel_window&);
+
+	~script_panel(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Script"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return script_form_c::xd_rootwidget(); }
+	virtual Widget tools()  { return tools_; }
+	virtual Widget text()   { return text_; }
+	virtual void create (Widget parent, char *widget_name = 0 );
+
+private:
+
+	script_panel(const script_panel&);
+	script_panel& operator=(const script_panel&);
+
+	virtual void externalCB(Widget ,XtPointer ) 
+		{ text_window::open_viewer();}
+
+	virtual void searchCB(Widget ,XtPointer ) 
+		{ text_window::open_search();}
+
+	virtual bool can_print() { return true; }
+	virtual bool can_save()  { return true; }
+	virtual void print()     { text_window::print(); }
+	virtual void save()      { text_window::save(); }
+};
+
+inline void destroy(script_panel**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/scripting.cc b/ecflow_4_0_7/view/src/scripting.cc
new file mode 100644
index 0000000..3b1ad1e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/scripting.cc
@@ -0,0 +1,390 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <strings.h>
+#include "ecflowview.h"
+#include "scripting.h"
+#include "directory.h"
+#include "input.h"
+// cmd
+#include "gui.h"
+#include "node.h"
+#include "host.h"
+#include "selection.h"
+#include "panel_window.h"
+#include "uitop.h"
+#include "menus.h"
+
+// #include <sys/types.h>
+// #include <sys/stat.h> 
+#include <fcntl.h> 
+#include "ecflowview.h"
+
+int select_cmd(const char *host_name, const char *node_name)
+{
+  gui::raise();
+  host::login(host_name);
+  node* n = host::find(host_name,node_name);
+  if(n) selection::notify_new_selection(n);
+  return True;
+}
+
+int order_cmd(const char *path, const char *kind) 
+{
+  gui::raise();
+  char *c = (char*) path; // host:/path
+  const char* host_name = 0x0;
+  const char* node_name = path;
+  while (c) { 
+    if (*c == ':') { *c = '\0'; node_name = ++c; } else {++c;}} 
+  if (!host_name) host_name="localhost";
+  host::login(host_name);
+  node* xnode = host::find(host_name,node_name);
+  if(xnode) { 
+    selection::notify_new_selection(xnode);
+    xnode->serv().command(clientName, "--order", node_name, kind, NULL);
+  }
+  return True;
+}
+
+int menu_cmd(const char *cmd)
+{
+  return script_menus(0, cmd);
+}
+
+int window_cmd(const char *name, int detached, int frozen)
+{
+  panel_window::new_window(selection::current_node(),name,detached,frozen);
+  return True;
+}
+
+int login_cmd(const char *name)
+{
+  host::login(name);
+  return True;
+}
+
+int logout_cmd(const char *name)
+{
+  host::logout(name);
+  return True;
+}
+
+int quit_cmd()
+{
+  top_shell_c::quitCB(0x0, 0x0, 0x0);
+  return True;
+}
+
+int process_command(const char *cmd) {
+  if (!cmd) return 1;
+
+  if (!strncmp("select", cmd, 6)) {
+      char host[80] = { 0, };
+      char node[1024] = { 0, };
+      sscanf(cmd, "select %s %s", host, node);
+      if (host[0] != 0 && node[0] != 0) {
+	select_cmd(host, node);
+      } else {
+	std::cerr << "#CMD (scripting): err: " << cmd << "\n";
+	return 1;
+      }
+
+  } else if (!strncmp("order", cmd, 5)) {
+      char kind[80] = { 0, };
+      char node[1024] = { 0, };
+      sscanf(cmd, "order %s %s", node, kind);
+      if (kind[0] != 0 && node[0] != 0) {
+	order_cmd(node, kind);
+      } else {
+	std::cerr << "#CMD (scripting): err: " << cmd << "\n";
+	return 1;
+      }
+
+  } else if (!strncmp("menu", cmd, 4)) {
+    menu_cmd(cmd);
+
+  } else if (!strncmp("quit", cmd, 4)) {
+    quit_cmd();
+
+  } else if (!strncmp("login", cmd, 5)) {
+      char host[80] = { 0, };
+      sscanf(cmd, "login %s", host);
+      if (host[0] != 0) {
+	login_cmd(host);
+      }
+
+  } else if (!strncmp("logout", cmd, 6)) {
+      char host[80] = { 0, };
+      sscanf(cmd, "logout %s", host);
+      if (host[0] != 0) {
+	logout_cmd(host);
+      }
+
+  } else if (!strncmp("window", cmd, 6)) {
+      int detached = 0;
+      int frozen   = 0;
+      int len;
+      char name[32] = { 0, };
+      const char *ptr = cmd; 
+      while ((sscanf(ptr, "%31[^ ]%n", name, &len) == 1)) {
+	std::cerr << "#field: " << name << "\n";
+	ptr += len;
+	if (!strncmp("-d", name, 2)) detached = 1;
+	if (!strncmp("-f", name, 2)) frozen   = 1;
+	if (*ptr != ' ') { break; /* skip separator */ }
+	ptr++;
+	std::cerr << "#CMD (scripting): process: " << name << "\n";
+      }
+      if (name[0] != 0) {
+	window_cmd(name, detached, frozen);
+      } else {
+	std::cerr << "#CMD (scripting): err: " << cmd << "\n";
+	return 1;
+      }
+  } else if (!strncmp("\n", cmd, 1)) {
+
+  } else {
+    std::cerr << "#CMD (scripting): ignored: " << cmd << "\n";
+    return 1;
+  }
+  
+  std::cout << "#CMD (scripting): " << cmd << "\n";
+  return 0;
+}
+
+#undef SCRIPT_PYTHON
+#ifdef SCRIPT_PYTHON
+#ifdef linux
+#undef _POSIX_C_SOURCE
+#undef _XOPEN_SOURCE
+#include <boost/python.hpp> 
+#include <boost/python/module.hpp> 
+#include <boost/detail/lightweight_test.hpp>
+using namespace boost::python;
+namespace python = boost::python;
+
+void runit(std::string const &script)
+{
+   python::dict global;
+   // python::object result = 
+   python::exec(oost::python::str(script), global, global);
+   // BOOST_TEST(python::extract<int>(global["number"]) ==  42);
+}
+
+BOOST_PYTHON_MODULE(ecflowView)  
+{
+      def("window", window_cmd, args("name", "detached", "frozen"), "open a window detached/frozen");
+      def("select", select_cmd, args("host", "node"), "select a node");
+}
+
+#endif
+#endif
+
+extern XtAppContext app_context;
+
+class ecflowview_input {       
+  std::string        name_;
+  XtInputId  id_;
+  int        fd_;
+  std::string        line_;
+
+public:
+
+	ecflowview_input(const char* name):
+		name_(name),
+		fd_(-1)
+	{
+		open();
+	}
+
+	~ecflowview_input()
+	{
+		if(fd_ >= 0) XtRemoveInput(id_);
+	}
+
+	void done()
+	{
+		if(fd_ >= 0) XtRemoveInput(id_);
+		::close(fd_);
+		fd_ = -1;
+		// We should check if its a pipe
+
+		struct stat st;
+		if(stat(name_.c_str(),&st) == 0)
+		{
+			if(S_ISFIFO(st.st_mode))
+				open();
+			else
+				delete this;
+		}
+		else {
+			perror(name_.c_str());
+			delete this;
+		}
+	}
+
+	void open()
+	{
+		fd_ = ::open(name_.c_str(),O_RDONLY|O_NONBLOCK); // |O_NDELAY);
+		if(fd_ < 0) {
+			perror(name_.c_str());
+			delete this;
+			return;
+		}
+
+		id_ = XtAppAddInput(app_context,fd_, XtPointer(XtInputReadMask),
+			inputCB,this);
+	}
+
+	void input()
+	{
+		char c[2];
+		if(::read(fd_,&c[0],1) != 1)
+		{
+			done();
+		}
+		if(c[0] == '\n')
+		{
+#ifdef SCRIPT_PYTHON
+#ifdef linux
+		  // Py_Initialize();
+  init_module_ecflowView(); // thanks to boost macro
+  bool error_expected = false;
+  // Py_InitModule("ecflowView", ecflowViewMethods);
+  std::cout << line_.c_str() << "\n";
+  if ( 	// python::handle_exception(exec_test) ||
+      python::handle_exception(boost::bind(runit, line_)))
+	{
+		if (PyErr_Occurred())
+		{
+			if (!error_expected) 
+			  std::cerr << "Python Error detected";
+			PyErr_Print();
+		}
+		else
+		{
+		  std::cerr << "A C++ exception was thrown  for which "
+			    << "there was no exception translator registered.";
+		}
+	}
+	// Boost.Python doesn't support Py_Finalize yet, so don't call it!
+  line_ = "";
+  return; // boost::report_errors();
+  // PyRun_SimpleString(line_.c_str());
+  // Py_Finalize(); // not supported by Boost
+#endif
+#else
+		  process_command(line_.c_str());
+		  line_ = "";
+		  return;
+#endif
+		}
+		else {
+			c[1] = 0;
+			line_ += c;
+		}
+	}
+
+	static void inputCB(XtPointer data,int*,XtInputId*)
+	{
+		ecflowview_input* p = ((ecflowview_input*)data);
+		p->input();
+	}
+};
+
+scripting::scripting(const char* name):
+	name_(name)
+{
+}
+
+scripting::~scripting()
+{
+}
+
+void scripting::init()
+{
+	char buf[1024];
+
+	sprintf(buf,"%s/startup.script",directory::system());
+	run(buf);
+
+	sprintf(buf,"%s/startup.script",directory::user());
+	run(buf);
+
+	const char* file = getenv("ECFLOWVIEW_INPUT");
+	if(file != 0) { new ecflowview_input(file);
+	  std::cout << "# ecflowview listening: " << file << "\n";
+	}
+}
+
+void scripting::run(const char* file)
+{
+	FILE* f = fopen(file,"r");
+	if(!f) {
+		//perror(file);
+		return;
+	}
+
+	char line[1024];
+	while(fgets(line,sizeof(line),f))
+	{
+		if(line[0]) line[strlen(line)-1] = 0;
+		execute(line);
+	}
+	fclose(f);
+}
+
+void scripting::execute(const char* cmd)
+{
+#ifdef SCRIPT_PYTHON
+#ifdef linux
+  // Py_Initialize();
+  init_module_ecflowView();
+  // Py_InitModule("ecflowView", ecflowViewMethods);
+  std::cout << cmd << "\n";
+  python::handle_exception(boost::bind(runit, cmd));
+  // PyRun_SimpleString(cmd);
+  // Py_Finalize();
+#endif
+#else
+
+  process_command(cmd);
+
+#endif
+}
+
+scripting* scripting::find(const char* name)
+{
+	scripting* s = first();
+	while(s)
+	{
+		if(strcmp(s->name_,name) == 0)
+			return s;
+		s = s->next();
+	}
+	return 0;
+}
+
+int scripting::dispatch(int argc,char **argv)
+{
+	scripting* s = find(argv[0]);
+	if(s) return s->execute(argc,argv);
+	fprintf(stderr,"cannot find command %s\n",argv[0]);
+	return 1;
+}
+
+IMP(scripting)
diff --git a/ecflow_4_0_7/view/src/scripting.h b/ecflow_4_0_7/view/src/scripting.h
new file mode 100644
index 0000000..4b9d50a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/scripting.h
@@ -0,0 +1,49 @@
+#ifndef scripting_H
+#define scripting_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+class scripting : public extent<scripting> {
+public:
+
+	scripting(const char*);
+
+	~scripting(); // Change to virtual if base class
+
+	virtual int execute(int,char**) = 0;
+
+	static void init();
+	static void run(const char*);
+	static void execute(const char*);
+
+	static scripting* find(const char* name);
+
+	static int dispatch(int,char**);
+
+private:
+
+	scripting(const scripting&);
+	scripting& operator=(const scripting&);
+	
+	const char* name_;
+};
+
+inline void destroy(scripting**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/search.cc b/ecflow_4_0_7/view/src/search.cc
new file mode 100644
index 0000000..2e41b41
--- /dev/null
+++ b/ecflow_4_0_7/view/src/search.cc
@@ -0,0 +1,288 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+//=============================================================================================
+
+#include "search.h"
+#include "host.h"
+#include "runnable.h"
+#include <Xm/List.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+#include "gui.h"
+#include "extent.h"
+#include "flags.h"
+#include "result.h"
+#include <X11/IntrinsicP.h>
+
+
+extern "C" {
+#include "xec.h"
+}
+
+search& search::instance()
+{
+  static search *m = new search();
+  return *m;
+}
+
+search::search():
+  name_(0)
+  , timed_since_(0)
+  , timed_from_(86400*3) // 3 days
+{
+	create(gui::top());
+}
+
+search::~search()
+{
+}
+
+
+void search::searchCB(Widget,XtPointer)
+{
+  if(name_)  XtFree(name_);
+  name_ = 0;
+  
+  if(XmToggleButtonGetState(what_)) {
+    char* p = XmTextGetString(what_text_);        
+    if(*p) 
+      name_ = XtNewString(p);
+    else 
+      name_ = 0;
+    XtFree(p);
+  }
+
+  type_flags_.clear();
+  if(XmToggleButtonGetState(type_))
+    scan(type_rowcol_,type_flags_);
+  
+  status_flags_.clear();
+  if(XmToggleButtonGetState(status_))
+    scan(status_rowcol_,status_flags_);
+  
+  special_flags_.clear();
+  if(XmToggleButtonGetState(special_))
+    scan(special_rowcol_,special_flags_);
+  
+  if(XmToggleButtonGetState(timed_)) {
+    char *since = XmTextGetString(timed_text_since_);
+    char *from  = XmTextGetString(timed_text_from_);
+    if(since) 
+      timed_since_ = atoi(since);
+    if(from) 
+      timed_from_ = atoi(from);
+    fprintf (stdout, "# from: %d\tsince: %d\n", timed_from_, timed_since_);
+    XtFree(since);
+    XtFree(from);
+  } else {
+    timed_from_  = 86400;
+    timed_since_ = 0;
+  }
+
+  if(XmToggleButtonGetState(misc_)) {
+    icas_ = XmToggleButtonGetState(icase_);
+    rege_ = XmToggleButtonGetState(toggle11_);
+    glob_ = XmToggleButtonGetState(toggle12_);
+    subs_ = XmToggleButtonGetState(toggle13_);
+  } else { icas_ = true; subs_ = true; rege_ = glob_ = false; }
+
+  result::clear();
+  searchable::look_for(*this, !XmToggleButtonGetState(where_));
+  result::show();
+}
+
+void search::closeCB(Widget,XtPointer)  
+{
+  XtUnmanageChild(form_);
+}
+
+void search::mapCB(Widget,XtPointer)
+{
+   searchable::parent(where_rowcol_);
+}
+
+void search::raise()
+{
+  XtManageChild(form_);
+  XMapRaised(XtDisplay(_xd_rootwidget),XtWindow(_xd_rootwidget));
+}
+
+void search::show()
+{
+  instance().raise();
+}
+
+#include <sys/types.h>
+#include <regex.h>
+#include <boost/algorithm/string.hpp>    
+#include <fnmatch.h>
+
+void search::next(node& n)
+{
+  bool ok = true;
+  ok &= check(n,type_flags_);	
+  if (ok) ok &= check(n,status_flags_);
+  if (ok) ok &= check(n,special_flags_);	
+  if (ok && name_) {
+    if (subs_) {
+      bool res = n.match(name_);
+      if (icas_) 
+    	res |= !strncasecmp(name_, n.name().c_str(), strlen(name_));      
+      else 	
+	res |= !strncmp(name_, n.name().c_str(), strlen(name_));
+      ok &= res;
+    } else if (glob_) {
+	std::string path (n.name());
+	std::string pattern (name_);    
+	if (name_[0] == '/') 
+	  path = n.full_name();
+	if (icas_) {
+	  boost::algorithm::to_lower(path);
+	  boost::algorithm::to_lower(pattern);
+	}
+	ok &= 0==fnmatch(pattern.c_str(), path.c_str(), 0);
+      } else if (rege_) {
+	regex_t exp; int flags = REG_EXTENDED;
+	std::string path (n.name());
+	std::string pattern (name_);    
+	if (name_[0] == '/') 
+	  path = n.full_name();
+	if (icas_) 
+	  flags &= REG_ICASE;
+	int rv = regcomp(&exp, pattern.c_str(), flags);
+	if (rv!=0) 
+	  std::cerr << "regcomp failed %d" << rv << "\n";
+	else
+	  ok &= 0==regexec(&exp, path.c_str(), 0, NULL, 0);
+	regfree(&exp);
+    } else if (icas_) { // ignore case
+      ok &= strcasestr(n.name().c_str(),name_) != 0; 
+    } else { // case sensitive, accept longest names
+       	ok &= n.match(name_);
+    } 
+      //    }
+  }
+  if (ok && XmToggleButtonGetState(timed_))
+  if (n.type() == NODE_TASK || n.type() == NODE_FAMILY || n.type() == NODE_SUITE) {
+    boost::posix_time::ptime now(boost::posix_time::second_clock::local_time());
+    int diff = (now - n.status_time()).total_seconds();
+    ok &= (-1 < timed_since_ && timed_since_ < diff) && diff < timed_from_;
+  }
+  if(ok) result::show(n);
+}
+
+bool search::check(node& n,array<flags*>& f)
+{
+  int c = f.count();
+  bool ok = (c == 0);
+  for(int i = 0; i < c ; i++)
+    ok = ok || f[i]->eval(&n);
+  return ok;
+}
+
+
+void search::whatCB(Widget,XtPointer)
+{
+  if(XmToggleButtonGetState(what_))
+    XtManageChild(what_text_);
+  else
+    XtUnmanageChild(what_text_);
+}
+
+void search::whereCB(Widget,XtPointer)
+{
+  if(XmToggleButtonGetState(where_))
+    XtManageChild(where_rowcol_);
+  else
+    XtUnmanageChild(where_rowcol_);
+}
+
+void search::statusCB(Widget,XtPointer)
+{
+  if(XmToggleButtonGetState(status_))
+    XtManageChild(status_rowcol_);
+  else
+    XtUnmanageChild(status_rowcol_);
+}
+
+void search::typeCB(Widget,XtPointer)
+{
+  if(XmToggleButtonGetState(type_))
+    XtManageChild(type_rowcol_);
+  else
+    XtUnmanageChild(type_rowcol_);
+}
+
+void search::specialCB(Widget,XtPointer)
+{
+  if(XmToggleButtonGetState(special_))
+    XtManageChild(special_rowcol_);
+  else
+    XtUnmanageChild(special_rowcol_);
+}
+
+void search::timedCB(Widget,XtPointer)
+{
+  if(XmToggleButtonGetState(timed_)) {
+    XtManageChild(timed_rowcol_);
+    XtManageChild(timed_text_from_);
+    XtManageChild(timed_text_since_);
+  } else {
+    XtUnmanageChild(timed_rowcol_);
+    XtUnmanageChild(timed_text_from_);
+    XtUnmanageChild(timed_text_since_);
+  }
+}
+
+void search::radioCB(Widget w, XtPointer data) {
+  rege_ = XmToggleButtonGetState(toggle11_);
+  glob_ = XmToggleButtonGetState(toggle12_);
+  subs_ = XmToggleButtonGetState(toggle13_);
+}
+
+void search::miscCB(Widget,XtPointer)
+{
+  if(XmToggleButtonGetState(misc_)) {
+    XmToggleButtonSetState(icase_, True, False);
+    // XmToggleButtonSetState(toggle12_, True, False); // glob
+    XmToggleButtonSetState(toggle13_, True, False); // substring
+    XtManageChild(misc_rowcol_); 
+    XtManageChild(fname_); 
+    XtManageChild(icase_);
+  } else {
+    XtUnmanageChild(misc_rowcol_); 
+    XtUnmanageChild(icase_);
+    XtUnmanageChild(fname_); 
+  }
+}
+
+void search::scan(Widget w,array<flags*>& f)
+{
+  f.clear();
+  CompositeWidget c = (CompositeWidget)w;
+  for(unsigned int i = 0 ; i < c->composite.num_children; i++) {
+    Widget p = c->composite.children[i];
+    if(XmIsToggleButton(p)) {
+      flags *s = (flags*)xec_GetUserData(p);
+      if(s && XmToggleButtonGetState(p)) {
+	f.add(s);
+      }
+    }
+  }
+}
+/*
+^[^#]\s*\w+\s*:(?<data>.*?)$
+
+*/
diff --git a/ecflow_4_0_7/view/src/search.h b/ecflow_4_0_7/view/src/search.h
new file mode 100644
index 0000000..c00d823
--- /dev/null
+++ b/ecflow_4_0_7/view/src/search.h
@@ -0,0 +1,82 @@
+#ifndef search_H
+#define search_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#include "uisearch.h"
+#include "node_lister.h"
+#include "array.h"
+
+class flags;
+
+class search : public search_shell_c, public node_lister {
+public:
+
+	search();
+
+	~search(); // Change to virtual if base class
+
+	static void show();
+
+private:
+
+	search(const search&);
+	search& operator=(const search&);
+
+	char *name_;
+	array<flags*> status_flags_;
+	array<flags*> special_flags_;
+	array<flags*> type_flags_;
+	int  timed_since_, timed_from_, subs_, rege_, icas_, glob_ ;
+
+// -- Methods
+
+	void raise();
+	void scan(Widget,array<flags*>&);
+
+
+// -- Overridden methods
+
+	void next(node&);
+	bool check(node&,array<flags*>&);
+
+// -- Class members
+
+	static search& instance();
+
+// -- Class methods
+
+	void closeCB(Widget,XtPointer);
+	void searchCB(Widget,XtPointer);
+	void mapCB(Widget,XtPointer);
+
+	void whatCB(Widget,XtPointer);
+	void whereCB(Widget,XtPointer);
+	void statusCB(Widget,XtPointer);
+	void typeCB(Widget,XtPointer);
+	void specialCB(Widget,XtPointer);
+	void timedCB(Widget,XtPointer);
+	void miscCB(Widget,XtPointer);
+	void radioCB(Widget,XtPointer);
+};
+
+inline void destroy(search**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/searchable.cc b/ecflow_4_0_7/view/src/searchable.cc
new file mode 100644
index 0000000..2f0730b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/searchable.cc
@@ -0,0 +1,151 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "top.h"
+#include "searchable.h"
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+
+Widget searchable::parent_ = 0;
+
+searchable::searchable():
+	toggle_(0),
+	active_(False)
+{
+}
+
+searchable::~searchable()
+{
+	if(toggle_)
+		XtDestroyWidget(toggle_);
+}
+
+void searchable::look_for(node_lister& p,bool all)
+{
+	searchable* s = first();
+	while(s)
+	{
+		if( all || (s->toggle_ && XtIsManaged(s->toggle_) && 
+						 XmToggleButtonGetState(s->toggle_)))
+			s->search(p);
+		s = s->next();
+	}
+}
+
+void searchable::parent(Widget w)
+{
+  parent_ = w;
+  
+  searchable* s = first();
+  while(s)
+    {
+      if(s->toggle_ == 0)
+	{
+	  s->toggle_ = XmCreateToggleButton(parent_,(char*)s->name(),0,0);
+	  if(s->active_) XtManageChild(s->toggle_);
+	}
+      s = s->next();
+    }
+}
+
+void searchable::active(Boolean a)
+{
+	active_ = a;
+
+	if(!toggle_ && parent_)
+		parent(parent_);
+
+	if(toggle_) {
+		if(active_) 
+			XtManageChild(toggle_);
+		else 
+			XtUnmanageChild(toggle_);
+	}
+}
+
+IMP(searchable)
+
+
+
+#if 0
+static char sccsid[] = "%W% %E% B.Raoult";
+
+#include "ecflowview.h"
+#include <Xm/List.h>
+#include <Xm/Text.h>
+
+static Widget text;
+static int    ignorecase = TRUE;
+static Widget last_shell = NULL;
+
+void search_set_text_callback(Widget w,Widget t,XtPointer cb)
+{
+	char *p;
+	Arg arg;
+
+	text = t;
+	while(!XtIsShell(t))
+		t = XtParent(t);
+
+	last_shell = t;
+
+	XtSetArg(arg,XmNtitle,&p);
+	XtGetValues(t,&arg,1);
+
+	xec_SetLabel(label_search_text,p);
+
+	XtManageChild(search_form);
+	XMapRaised(XtDisplay(search),XtWindow(search));
+
+}
+
+void hide_search_callback(Widget w,XtPointer cd,XtPointer cb)
+{
+
+	while(!XtIsShell(w))
+		w = XtParent(w);
+
+	if(last_shell == w)
+	{
+		XtUnmanageChild(search_form);
+		last_shell = NULL;
+	}
+}
+
+
+void search_case_callback(Widget w,int nocase,
+XmToggleButtonCallbackStruct *cb)
+{
+	if(cb->set) ignorecase = nocase;
+}
+
+void search_next_callback(Widget w,XtPointer cd,XtPointer cb)
+{
+	char *p = (char*)XmTextGetString(search_text);
+	Boolean (*f)(Widget,char*,Boolean,Boolean,Boolean);
+
+	if(!*p) return;
+	if(XmIsList(text)) 
+		f = xec_ListSearch;
+	else 
+		if(XmIsText(text)) 
+			f = xec_TextSearch;
+	else f = help_search;
+
+	if(!(*f)(text,p,ignorecase,FALSE,TRUE)) ring(1);
+
+	XtFree((XtPointer)p);
+}
+#endif
diff --git a/ecflow_4_0_7/view/src/searchable.h b/ecflow_4_0_7/view/src/searchable.h
new file mode 100644
index 0000000..6a3bde0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/searchable.h
@@ -0,0 +1,61 @@
+#ifndef searchable_H
+#define searchable_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#ifndef ecflowview_H
+#include "ecflowview.h"
+#endif
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+class node_lister;
+
+class searchable : public extent<searchable> {
+public:
+	searchable();
+
+	virtual ~searchable(); // Change to virtual if base class
+
+	void active(Boolean);
+
+	virtual const char* name() const = 0;
+	virtual void search(node_lister&) = 0;
+
+	static void look_for(node_lister&,bool);
+	static void parent(Widget);
+
+protected:
+
+	Widget toggle_;
+	Boolean active_;
+
+private:
+
+	searchable(const searchable&);
+	searchable& operator=(const searchable&);
+
+	static Widget parent_;
+};
+
+inline void destroy(searchable**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/selection.cc b/ecflow_4_0_7/view/src/selection.cc
new file mode 100644
index 0000000..e90d322
--- /dev/null
+++ b/ecflow_4_0_7/view/src/selection.cc
@@ -0,0 +1,153 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "selection.h"
+#include "node.h"
+#include "observer.h"
+#include "host.h"
+
+class selection_observer :public observer {
+  node* n_;
+  void gone(observable*);
+  void adoption(observable*,observable*);
+  void notification(observable*);
+
+  std::string location, top;
+
+public:
+
+  selection_observer() : n_(0), location ("") {}
+  void  set(node*);
+  node* get() { return n_; }
+  const std::string path() { return location; }
+  const std::string server() { return top; }
+};
+
+static selection_observer current;
+static selection_observer menu;
+
+void selection_observer::set(node* n)
+{
+	if(n == n_)
+	  return;
+
+	if(n_) 
+	  forget(&(n_->serv()));
+
+	forget(n_);
+	n_ = n;
+	observe(n_);
+
+	if(n_) {
+	  observe((&n_->serv()));
+	  top = n_->serv().name();
+	  location = n_->full_name();
+	}
+}
+
+void selection_observer::adoption(observable* o,observable* n)
+{
+  if(o == n_)
+    n_ = (node*)n;
+  else
+    fprintf(stderr, "Selection adoption: bad value\n");
+}
+
+void selection_observer::gone(observable*)
+{
+  // printf("Selection gone\n");
+  n_ = 0;
+}
+
+void selection_observer::notification(observable*)
+{
+}
+
+
+selection::selection()
+{
+}
+
+selection::~selection()
+{
+}
+
+void selection::notify_new_selection(node* n)
+{
+  if(n == current.get())
+    return;
+  
+  if(n == 0) {
+    notify_selection_cleared();
+    return;
+  }
+  
+  // printf("selection is %s %s %02d\n", n->full_name().c_str(), n->type_name(), n->type());
+  
+  // if(!n->selectable()) return;
+  
+  selection* w = first();
+  
+  current.set(n);
+  
+  while(w) {
+    w->new_selection(*n);
+    w = w->next();
+  }
+}
+
+void selection::notify_selection_cleared()
+{
+  if(current.get() == 0)
+    return;
+  
+  // printf("selection is cleared\n");
+  
+  selection* w = first();
+  
+  current.set(0);
+  
+  while(w)
+    {
+      w->selection_cleared();
+      w = w->next();
+    }
+}
+
+void selection::menu_node(node* n)
+{
+	menu.set(n);
+}
+
+node *selection::menu_node()
+{
+  return menu.get();
+}
+
+node *selection::current_node()
+{
+  return current.get();
+}
+
+const std::string selection::current_path()
+{
+  return current.path();
+}
+
+const std::string selection::server()
+{
+  return current.server();
+}
+IMP(selection)
diff --git a/ecflow_4_0_7/view/src/selection.h b/ecflow_4_0_7/view/src/selection.h
new file mode 100644
index 0000000..7260444
--- /dev/null
+++ b/ecflow_4_0_7/view/src/selection.h
@@ -0,0 +1,56 @@
+#ifndef selection_H
+#define selection_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+#include <string>
+
+class host;
+class node;
+class ecf_node;
+
+class selection : public extent<selection> {
+public:
+
+	selection();
+
+	virtual ~selection(); // Change to virtual if base class
+
+	virtual void selection_cleared()  = 0;
+	virtual void new_selection(node&) = 0;
+
+	static void notify_new_selection(node*);
+	static void notify_selection_cleared();
+
+	static node* menu_node();
+	static void  menu_node(node*);
+	static node* current_node();
+	static const std::string current_path();
+	static const std::string server();
+
+private:
+
+	selection(const selection&);
+	selection& operator=(const selection&);
+
+	friend class selection_observer;
+};
+
+inline void destroy(selection**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/server.cc b/ecflow_4_0_7/view/src/server.cc
new file mode 100644
index 0000000..d1d60af
--- /dev/null
+++ b/ecflow_4_0_7/view/src/server.cc
@@ -0,0 +1,179 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef server_H
+#include "server.h"
+#endif
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <string.h>
+
+
+#ifdef AIX
+#include <memory.h>
+#endif
+
+#define FAIL(a) do { perror(a); exit(1); } while(0)
+
+server::server(int port):
+	soc_(-1)
+{
+	int flg;
+	struct sockaddr_in sin;
+
+#ifdef SO_LINGER
+	struct  linger ling;
+#endif
+
+	soc_ = socket(AF_INET, SOCK_STREAM, 0);
+
+	if (soc_ < 0)
+		FAIL("socket");
+
+	flg = 1 ;
+	if(setsockopt(soc_, SOL_SOCKET, SO_REUSEADDR, &flg, sizeof(flg))<0)
+		FAIL("setsockopt SO_REUSEADDR");
+
+	flg = 1 ;
+	if(setsockopt(soc_, SOL_SOCKET, SO_KEEPALIVE, &flg, sizeof(flg))<0)
+		FAIL("setsockopt SO_KEEPALIVE");
+
+#ifdef SO_REUSEPORT
+	flg = 1 ;
+	if(setsockopt(soc_, SOL_SOCKET, SO_REUSEPORT, &flg, sizeof(flg))<0)
+		FAIL("setsockopt SO_REUSEPORT");
+#endif
+
+#ifdef SO_LINGER
+	ling.l_onoff = 0;
+	ling.l_linger = 0;
+	if(setsockopt(soc_, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling))<0)
+		FAIL("setsockopt SO_LINGER");
+#else
+#ifdef SO_DONTLINGER
+	if(setsockopt(soc_, SOL_SOCKET, SO_DONTLINGER, NULL, 0)<0)
+		FAIL("setsockopt SO_DONTLINGER");
+#endif
+#endif
+
+
+	memset(&sin, 0, sizeof(struct sockaddr_in));
+	sin.sin_port        = htons(port);
+	sin.sin_family      = AF_INET;
+	sin.sin_addr.s_addr = INADDR_ANY;
+
+	while (bind(soc_, (struct sockaddr*)&sin, sizeof(struct sockaddr_in)) == -1)
+	{
+		FAIL("bind");
+		sleep(5);
+	}
+
+	/* socket_buffers(s); */
+
+	if(listen(soc_, 5)==-1)
+	{
+		close(soc_);
+		FAIL("listen");
+	}
+
+	signal(SIGPIPE,SIG_IGN);
+}
+
+server::~server()
+{
+	close(soc_);
+}
+
+void server::run()
+{
+	struct sockaddr_in from;
+//#ifdef AIX
+//	unsigned long fromlen;
+//#else
+	socklen_t fromlen; // int fromlen;
+//#endif
+	int cnt = 0;
+	int clients = 0;
+
+	/* Start real server */
+
+	if(soc_ < 0) FAIL("Exiting server");
+
+	/* Dont't get killed by pipes */
+	signal(SIGPIPE,SIG_IGN);
+
+	/* Ignore hang up */
+	signal(SIGHUP,SIG_IGN);
+
+	for(;;)
+	{
+	   int snew;
+		fromlen = sizeof(from);
+		if((snew = accept(soc_, (struct sockaddr*)&from, &fromlen))<0)
+		{
+			if(errno != EINTR)
+				/* Interrupted system call : got on SIGCHLD signals */
+				FAIL("accept");
+		}
+		else
+		{
+
+			if(from.sin_family != AF_INET)
+			{
+				FAIL("connection is not from internet");
+				close(snew);
+				continue;
+			}
+
+			fflush(0);
+			sighold(SIGCHLD);
+
+			if(!fork_)
+			{
+				serve(snew);
+				close(snew);
+			}
+			else switch(fork())
+			{
+			case 0:
+				close(soc_);
+				serve(snew);
+				exit(0);
+				break;
+
+			case -1:
+				FAIL("Cannot fork");
+				close(snew);
+				break;
+
+			default:
+				cnt++;
+				clients++;
+				close(snew);
+				break;
+			}
+			sigrelse(SIGCHLD);
+		}
+	}
+}
diff --git a/ecflow_4_0_7/view/src/server.h b/ecflow_4_0_7/view/src/server.h
new file mode 100644
index 0000000..82dd217
--- /dev/null
+++ b/ecflow_4_0_7/view/src/server.h
@@ -0,0 +1,40 @@
+#ifndef server_H
+#define server_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+class server {
+public:
+
+	server(int port);
+	virtual ~server();
+
+	void run();
+	virtual void serve(int) = 0;
+
+private:
+
+	server(const server&);
+	server& operator=(const server&);
+
+	int  soc_;
+	bool fork_;
+
+};
+
+inline void destroy(server**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/servers_prefs.cc b/ecflow_4_0_7/view/src/servers_prefs.cc
new file mode 100644
index 0000000..708a259
--- /dev/null
+++ b/ecflow_4_0_7/view/src/servers_prefs.cc
@@ -0,0 +1,259 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "servers_prefs.h"
+#include "host.h"
+#include "observer.h"
+#include "gui.h"
+#include "xec.h"
+#include "extent.h"
+#include <ctype.h>
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+#include <Xm/List.h>
+
+/* user hosts are added in map order in the 'servers' file:
+   order then appears as different according to creation order and 
+   alphabetic/map order
+*/
+static bool valid_name(const str& n)
+{
+  const char* p = n.c_str();
+  
+  if(*p == 0) return true;
+  
+  while(*p) {
+    if(*p != '_' && !isalnum(*p)) 
+      return false;
+    p++;
+  }
+  
+  return true;
+}
+
+static bool valid_host(const str& n)
+{
+  const char* p = n.c_str();
+  
+  if(*p == 0) return false;
+  
+  while(*p) {
+    if(*p != '-' && *p != '.' && !isalnum(*p)) 
+      return false;
+    p++;
+  }
+  
+  return true;
+}
+
+static bool valid_num(int)
+{
+  return true;
+}
+
+void servers_prefs::add_host(const std::string& h)
+{
+  str host = h;
+  instance().add(host);
+}
+
+void servers_prefs::create(Widget w,char*) 
+{ 
+	servers_form_c::create(w); 
+	prefs::setup(w); 
+	build_list();
+}
+
+void servers_prefs::build_list()
+{
+  XmListDeleteAllItems(list_);
+  
+  array<str> x = hosts_;
+  hosts_.clear();
+  
+  for(int i = 0; i < x.count(); i++) {
+    add(x[i]);
+  }
+  xec_ListItemSelect(list_,current_.c_str());
+}
+
+void servers_prefs::add(str&h)
+{
+  hosts_.add(h);
+  if(_xd_rootwidget == 0)
+    return;
+  
+  host *x = host::find(h.c_str());
+  if(x)
+    xec_AddListItem(list_,(char*)h.c_str());	
+}
+
+void servers_prefs::serversCB(Widget,XtPointer)
+{
+  host::broadcast(true);
+}
+
+str servers_prefs::name()
+{
+	char *p = XmTextGetString(name_);
+	char *h = XmTextGetString(host_);
+
+	str x(*p?p:h);
+
+	XtFree(p);
+	XtFree(h);
+
+	return x;
+}
+
+str servers_prefs::machine()
+{
+	char *p = XmTextGetString(name_);
+	char *h = XmTextGetString(host_);
+
+	str x(*h?h:p);
+
+	XtFree(p);
+	XtFree(h);
+
+	return x;
+}
+
+int servers_prefs::number()
+{
+	
+	char *n = XmTextGetString(number_);
+	int x = atol(n);
+	XtFree(n);
+
+	return x?x: 3141 ;
+}
+
+void servers_prefs::addCB(Widget,XtPointer)
+{
+	str p = name();
+	str h = machine();
+	int n = number();
+
+	host* y = host::find(p.c_str());
+
+	int v = valid_name(p) && valid_host(h) && valid_num(n);
+
+	if(v && (y == 0))
+	{
+		host::new_host(p.c_str(),h.c_str(),n);
+		current_ = p;
+		xec_ListItemSelect(list_,p.c_str());
+
+		build_list(); // TBD
+		XtSetSensitive(update_,false);
+		XtSetSensitive(add_,false);
+		XtSetSensitive(remove_,true);
+		ecf_nick_write(); // TBD
+	}
+}
+
+void servers_prefs::removeCB(Widget,XtPointer)
+{
+	xec_RemoveListItem(list_,(char*)current_.c_str());
+	host::remove_host(current_.c_str());
+
+	hosts_.remove(current_);
+	current_ = "";
+
+	XtSetSensitive(remove_,false);
+	XtSetSensitive(update_,false);
+	XtSetSensitive(add_,false);
+
+	XmTextSetString(name_,"");
+	XmTextSetString(host_,"");
+	XmTextSetString(number_,"");
+
+	ecf_nick_write();
+}
+
+void servers_prefs::check_remove()
+{
+}
+
+void servers_prefs::browseCB(Widget,XtPointer data)
+{
+    XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+	char *p = xec_GetString(cb->item);
+
+	current_ = p;
+
+	host *x = host::find(p);
+	if(x)
+	{
+		changing_ = true;
+		XmTextSetString(name_,(char*)x->name());
+		XmTextSetString(host_,(char*)x->machine());
+
+		char buf[80];
+		sprintf(buf,"%d",x->number());
+		XmTextSetString(number_,buf);
+		changing_ = false;
+	}
+
+	XtFree(p);
+
+	XtSetSensitive(remove_,true);
+	XtSetSensitive(update_,false);
+	XtSetSensitive(add_,false);
+}
+
+void servers_prefs::changedCB(Widget,XtPointer data)
+{
+	if(changing_) return;
+
+	str p = name();
+	str h = machine();
+	int n = number();
+
+	host* x = host::find(current_.c_str());
+	host* y = host::find(p.c_str());
+
+	int v = valid_name(p) && valid_host(h) && valid_num(n);
+
+	if(x) {
+		bool c = (current_ != p) || (h != str(x->machine())) ||
+				 (n != x->number());
+		XtSetSensitive(update_,v && (y == x || y == 0) && c);
+	}
+
+	XtSetSensitive(add_,v && (y == 0));
+}
+
+void servers_prefs::updateCB(Widget,XtPointer data)
+{
+	str p = name();
+	str h = machine();
+	int n = number();
+
+	host* x = host::find(current_.c_str());
+	host* y = host::find(p.c_str());
+
+	int v = valid_name(p) && valid_host(h) && valid_num(n);
+	if(v && x && (x == y || y == 0))
+	{
+		x->change(p.c_str(),h.c_str(),n);
+		xec_ReplaceListItem(list_,current_.c_str(),p.c_str());
+		xec_ListItemSelect(list_,p.c_str());
+		current_ = p;
+		XtSetSensitive(update_,false);
+		XtSetSensitive(add_,false);
+	}
+}
diff --git a/ecflow_4_0_7/view/src/servers_prefs.h b/ecflow_4_0_7/view/src/servers_prefs.h
new file mode 100644
index 0000000..21adc06
--- /dev/null
+++ b/ecflow_4_0_7/view/src/servers_prefs.h
@@ -0,0 +1,79 @@
+#ifndef servers_prefs_H
+#define servers_prefs_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef prefs_H
+#include "prefs.h"
+#endif
+
+#ifndef uiservers
+#include "uiservers.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifndef array_H
+#include "array.h"
+#endif
+
+#ifndef Singleton_H
+#include "singleton.h"
+#endif
+
+class servers_prefs : public singleton<servers_prefs>, public prefs
+  , public servers_form_c {
+public:
+
+	servers_prefs() : changing_(false) {}
+
+	~servers_prefs() {}
+
+	void check_remove();
+
+	virtual Widget widget() { return _xd_rootwidget; }
+
+	static void add_host(const std::string&);
+private:
+
+	servers_prefs(const servers_prefs&);
+	servers_prefs& operator=(const servers_prefs&);
+
+	array<str> hosts_;
+	bool       changing_;
+	str        current_;
+
+	int number();
+	str name();
+	str machine();
+
+	void add(str&);
+	void build_list();
+
+	virtual void browseCB( Widget w, XtPointer );
+	virtual void serversCB( Widget w, XtPointer );
+	virtual void addCB( Widget w, XtPointer );
+	virtual void removeCB( Widget w, XtPointer );
+	virtual void updateCB( Widget w, XtPointer );
+	virtual void changedCB( Widget w, XtPointer );
+	virtual void create(Widget w,char*);
+};
+
+inline void destroy(servers_prefs**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/show.cc b/ecflow_4_0_7/view/src/show.cc
new file mode 100644
index 0000000..536e6b9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/show.cc
@@ -0,0 +1,93 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "show.h"
+#include "globals.h"
+option<int> show::status32_ (globals::instance(), "show_mask32", 0);
+
+option<int> show::status_ (globals::instance(), "show_mask", 
+			     (1<<show::unknown)    
+			     |(1<<show::suspended) 
+			     |(1<<show::complete) 
+			     |(1<<show::queued) 
+			     |(1<<show::submitted) 
+			     |(1<<show::active)   
+			     |(1<<show::aborted)  
+			     |(1<<show::time_dependant) 
+			     |(1<<show::late_nodes)    
+			   //			     |(1<<show::migrated_nodes)
+			     |(1<<show::rerun_tasks)   
+			     |(1<<show::nodes_with_messages) 
+			     |(1<<show::label)     
+			     |(1<<show::meter)    
+			     |(1<<show::event)   
+			     |(1<<show::repeat)   
+			     |(1<<show::time)   
+			     |(1<<show::date)   
+			     |(1<<show::late)   
+			     |(1<<show::inlimit)   
+			     |(1<<show::limit)   
+			     |(1<<show::trigger)
+			     //	& (~(1<<show::variable))
+			     //	& (~(1<<show::genvar))
+			     |(1<<show::time_icon) 
+			     |(1<<show::date_icon) 
+			     |(1<<show::late_icon) 
+			     |(1<<show::waiting_icon) 
+			     |(1<<show::rerun_icon) 
+			   // |(1<<show::migrated_icon) 
+			     |(1<<show::message_icon)
+ // & (~(1<<show::defstatus_icon)) & (~(1<<show::zombie_icon))
+			     ); 
+
+show::show(int f) : flag_(f) {
+  status_ = status_ & (~(1<<show::variable));
+  status_ = status_ & (~(1<<show::genvar));
+}
+
+show::~show() {}
+
+void show::on()
+{
+  if (flag_ > 31) {
+    status32_ = int(status32_) | (1<<(flag_-32));
+  } else {
+    status_   = int(status_  ) | (1<<(flag_));
+  }
+}
+
+void show::off()
+{
+  if (flag_ == show::all) { 
+    status_ = 0xFFFF ; status32_ = 0xFFFF;
+    status32_ = (int) (status32_) & (~(1<<(show::none-32)));
+    status32_ = (int) (status32_) & (~(1<<(show::all -32))); 
+  } else if (flag_ == show::none) {
+    status_ = 0; status32_ = 0; 
+  } else if (flag_ > 31) {
+    status32_ = int(status32_) & (~(1<<(flag_-32))); 
+  } else { 
+    status_   = int(status_)   & (~(1<<flag_)); 
+  }
+}
+
+bool show::wanted()
+{
+  if (flag_ > 31) {
+    return (int(status32_) & (1<<(flag_-32))) != 0;
+  } else {
+    return (int(status_  ) & (1<<flag_))    != 0;
+  }
+}
diff --git a/ecflow_4_0_7/view/src/show.h b/ecflow_4_0_7/view/src/show.h
new file mode 100644
index 0000000..b439e31
--- /dev/null
+++ b/ecflow_4_0_7/view/src/show.h
@@ -0,0 +1,104 @@
+#ifndef show_H
+#define show_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+// #include <inttypes.h>
+
+#ifndef option_H
+#include "option.h"
+#endif
+
+#ifdef WITH_INT128
+#define VLONG uint128
+#else
+// #define VLONG uint64_t
+// #define VLONG unsigned long long 
+// #define VLONG __int64 
+#define VLONG int 
+#endif
+
+
+class show {
+ 	int flag_;
+        static option< VLONG > status_;
+        static option< VLONG > status32_;
+
+public:
+
+	enum {
+		unknown ,
+		suspended ,
+		complete ,
+		queued ,
+		submitted ,
+		active ,
+		aborted ,
+		time_dependant ,
+		late_nodes ,
+		waiting_nodes ,
+		migrated_nodes ,
+		rerun_tasks ,
+		nodes_with_messages ,
+		label ,
+		meter,
+		event ,
+		repeat ,
+		time ,
+		date ,
+		late ,
+		trigger,
+		variable,
+		genvar,
+		limit,
+		inlimit,
+		time_icon,
+		date_icon,
+		late_icon,
+		waiting_icon,
+		rerun_icon,
+		migrated_icon,
+		message_icon,
+
+                defstatus_icon, zombie_icon, // time_holding_icon, date_holding_icon
+                all, none
+	};
+
+	// show(int f) : flag_(f) {};
+ show(int f);
+	~show();
+
+	void on();
+	void off();
+	bool wanted();
+
+	static inline bool want(int flag) { 
+	  return (flag > 31) ? 
+	    (int(status32_) & (1<<(flag-32))) != 0 : 
+	    (int(status_) & (1<<flag))!=0; }
+
+	 static inline bool want32(int flag)  
+	{ return (flag > 31) ? 
+	    (int(status32_) & (1<<(flag-32))) != 0 : 
+	    false; }
+
+	static inline VLONG status() { return int(status_); }
+
+	VLONG flag() const { return flag_; }
+private:
+	show(const show&);
+	show& operator=(const show&);
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/simple_node.cc b/ecflow_4_0_7/view/src/simple_node.cc
new file mode 100644
index 0000000..ef9f7dc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/simple_node.cc
@@ -0,0 +1,1062 @@
+//===================================================================================(variable_node* run==========
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #53 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "arch.h"
+#include "simple_node.h"
+#include "host.h"
+#include "show.h"
+#include "flags.h"
+#include "external.h"
+#include "selection.h"
+#include "pixmap.h"
+#include "url.h"
+#include "tree.h"
+#include "variable_node.h"
+#include "tip.h"
+
+#ifndef FLAG_HPP_
+#include "Flag.hpp"
+#endif
+#include "RepeatAttr.hpp"
+
+#include <X11/X.h>
+#include <Xm/ManagerP.h>
+#include <Xm/DrawP.h>
+#include <sstream>
+
+#include "trigger_lister.h"
+#include "text_lister.h"
+#include "html_lister.h"
+
+#ifndef events_H
+#include "events.h"
+#endif
+#include "dummy_node.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+namespace ecf {
+const char *status_name[10]
+  = { "unknown", "suspended", "complete", "queued", "submitted", "active",
+      "aborted", "shutdown",  "halted"  , NULL };
+}
+
+const int kHMargins = 4;
+const int kVMargins = 1;
+
+static struct {
+  char*   name_;
+  int     vers_;
+  pixmap* pixmap_;
+  flags*  flag_;
+  int     show_;
+} pix[] = {
+  {(char*)"waiting", 0, 0, new procFlag(&node::isWaiting), show::waiting_icon},
+  
+  {(char*)"clock", 0, 0, new procFlag(&node::hasTimeHolding), show::time_icon},  
+  {(char*)"calendar", 0, 0, new procFlag(&node::hasDate), show::date_icon},
+  
+  {(char*)"late", 0, 0, new procFlag(&node::isLate), show::late_icon},
+
+  {(char*)"rerun", 0, 0, new procFlag(&node::isRerun), show::rerun_icon},
+
+  {(char*)"migrated", 0, 0, new procFlag(&node::isMigrated), 
+     show::migrated_icon},
+
+  {(char*)"message", 0, 0, new procFlag(&node::hasMessages), 
+   show::message_icon},
+
+  {(char*)"defstatus", 0, 0, new procFlag(&node::isDefComplete), 
+   show::defstatus_icon},
+
+  {(char*)"Zbw", 1, 0, new procFlag(&node::hasZombieAttr), show::zombie_icon},
+
+  {(char*)"Z", 1, 0, new procFlag(&node::isZombie), show::zombie_icon},
+
+  {(char*)"force_abort", 1, 0, new procFlag(&node::isForceAbort), 1},
+  {(char*)"user_edit", 1, 0, new procFlag(&node::isUserEdit), 1},
+  {(char*)"task_aborted", 1, 0, new procFlag(&node::isTaskAbort), 1},
+  {(char*)"edit_failed", 1, 0, new procFlag(&node::isEditFailed), 1},
+  {(char*)"cmd_failed", 1, 0, new procFlag(&node::isCmdFailed), 1},
+  {(char*)"no_script", 1, 0, new procFlag(&node::isScriptMissing), 1},
+  {(char*)"killed", 1, 0, new procFlag(&node::isKilled), 1},
+  {(char*)"byrule", 1, 0, new procFlag(&node::isByRule), 1},
+  {(char*)"queuelimit", 1, 0, new procFlag(&node::isQueueLimit), 1},
+
+  {(char*)"folded", 0, 0, new procFlag(&node::isFolded), 0},
+
+  {(char*)"locked", 0, 0, new procFlag(&node::isLocked), 0}, /* --- shall appear last */
+
+  {(char*)"clock_free", 0, 0, new procFlag(&node::hasTime), show::time_icon},
+
+};
+
+simple_node::simple_node(host& h,ecf_node* n) : node(h,n)
+					      , old_status_(-1)
+					      , old_tryno_(-1)
+					      , old_flags_(-1)
+{
+   old_flags_ = flags();
+   old_status_ = status();
+   old_tryno_ = tryno();
+}
+
+const int kPixSize = 16;
+
+#ifdef BRIDGE
+simple_node::simple_node(host& h,sms_node* n, char b) 
+  : node(h,n,b)
+  , old_status_(-1)
+  , old_tryno_(-1)
+  , old_flags_(-1)
+{
+  insert(node::create(h,(sms_node*)n->label));
+  insert(node::create(h,(sms_node*)n->meter));
+  insert(node::create(h,(sms_node*)n->event));
+  if (n->complete)
+    insert(node::create(h,(sms_node*)n->complete,'c'));
+  insert(node::create(h,(sms_node*)n->trigger, 't'));
+  
+  insert(node::create(h,(sms_node*)n->repeat));
+  insert(node::create(h,(sms_node*)n->genvars,'g'));
+  insert(node::create(h,(sms_node*)n->variable));
+  
+  insert(node::create(h,(sms_node*)n->limit));
+  insert(node::create(h,(sms_node*)n->inlimit));
+  
+  insert(node::create(h,(sms_node*)n->date));
+  insert(node::create(h,(sms_node*)n->time));
+  insert(node::create(h,(sms_node*)n->autocm,'c'));
+  
+  // if(n->late) n->late->parent = owner_;
+  insert(node::create(h,(sms_node*)n->late,'l'));
+}
+
+/* void simple_node::scan(sms_tree* m,text_lister& f,bool b) {} */
+
+   void simple_node::scan(sms_tree* m,trigger_lister& f,bool b) {} 
+
+#endif
+
+simple_node::~simple_node()
+{
+}
+
+inline bool wanted(int n)
+{
+  return (n == 0 || show::want(n));
+}
+
+void simple_node::sizeNode(Widget w,XRectangle* r,bool tree)
+{
+  if(!tree) {
+    node::sizeNode(w,r,false);
+    return;
+  }
+
+  int extra = 0;
+  unsigned int i;
+  
+  if(pix[0].pixmap_ == 0)
+    {
+      for(i = 0; i < XtNumber(pix); i++)
+        pix[i].pixmap_ = &(pixmap::find(pix[i].name_));
+    }
+  
+  for(i = 0; i < XtNumber(pix) ; i++)
+    if(wanted(pix[i].show_) && pix[i].flag_->eval(this))
+      extra++;
+  
+  XmString s  = tree?labelTree():labelTrigger();
+  XmFontList f = tree?fontlist():smallfont();
+  
+  r->width    = XmStringWidth(f,s)  + 2*kHMargins +  extra * kPixSize;
+  r->height   = XmStringHeight(f,s) + 2*kVMargins;
+  if(r->height < kPixSize + 2*kVMargins) r->height = kPixSize + 2*kVMargins;
+}
+
+void simple_node::drawBackground(Widget w,XRectangle* r,bool tree)
+{
+  node::drawBackground(w,r,tree);
+  GC gc = colorGC(status());
+  XFillRectangles(XtDisplay(w),XtWindow(w),gc,r,1);
+}
+
+void simple_node::drawNode(Widget w,XRectangle* r,bool tree)
+{
+  if(!tree) {
+    node::drawNode(w,r,tree);
+    shadow(w,r);
+    return;
+  }
+
+  unsigned int extra = 0;
+  Pixmap images[XtNumber(pix)];
+  
+  XmString s  = tree?labelTree():labelTrigger();
+  XmFontList f = tree?fontlist():smallfont();
+  unsigned int i;
+  
+  for(i = 0; i < XtNumber(pix) ; i++)
+    if(wanted(pix[i].show_) && pix[i].flag_->eval(this))
+      images[extra++] = pix[i].pixmap_->pixels();
+  
+  XRectangle x = *r;
+  x.width      = XmStringWidth(f,s)  + 2*kHMargins;
+  XRectangle y = x; // *r;
+  
+  drawBackground(w,&y,tree);
+  
+  
+  XmStringDraw(XtDisplay(w),XtWindow(w),
+               f,
+               s,
+               blackGC(),
+               r->x /*+ kHMargins*/,
+               r->y + kVMargins,
+               x.width,
+               XmALIGNMENT_CENTER, 
+               XmSTRING_DIRECTION_L_TO_R, r);
+  
+  for(i = 0 ; i < extra ; i++)
+    {
+      /* XSetClipMask(XtDisplay(w),blackGC(),masks[i]); */
+      XCopyArea(XtDisplay(w),
+                images[i],
+                XtWindow(w),
+                blackGC(),
+                0,0,kPixSize,kPixSize,
+                r->x + x.width + (i*kPixSize),
+                r->y + (r->height - kPixSize) / 2);
+      /* XSetClipMask(XtDisplay(w),blackGC(),None); */
+    }
+  
+  shadow(w,&y);
+}
+
+
+Pixel simple_node::color() const
+{
+  return colors(status());
+}
+
+int simple_node::tryno()  const {
+#ifdef BRIDGE 
+  if (tree_) return tree_->tryno;
+#endif
+  return owner_ ? owner_->tryno() : -1; 
+}
+
+Boolean simple_node::hasTriggers() const 
+{ 
+#ifdef BRIDGE 
+  if (tree_) return tree_->trigger != 0;
+#endif
+  return owner_ ? owner_->hasTrigger() : False;
+}
+
+Boolean simple_node::hasTime() const /* time is free , yellow background icon */
+{ 
+#ifdef BRIDGE 
+  if (tree_) return tree_->time != 0;
+#endif
+  if (hasTimeHolding()) return False;
+  return owner_ ? owner_->hasTime() : False;
+}
+
+Boolean simple_node::hasDate() const 
+{ 
+#ifdef BRIDGE 
+  if (tree_) return tree_->date != 0;
+#endif
+  return owner_ ? owner_->hasDate() : False;
+}
+
+Boolean simple_node::hasTimeHolding() const /* grey */
+{
+  if (owner_)
+    if (owner_->hasTime()) {
+      Node *node = owner_->get_node();
+      if (!node) return False;
+      TimeDepAttrs *attr = node->get_time_dep_attrs();
+      if (!attr) return False;
+      return !attr->time_today_cron_is_free();
+    }
+  return False;
+}
+
+Boolean simple_node::hasZombieAttr() const  
+{ 
+#ifdef BRIDGE 
+  if (tree_) return ecfFlag(FLAG_ZOMBIE);
+#endif
+  return owner_ ? owner_->hasZombieAttr() : False;
+}
+
+Boolean simple_node::hasManual() const 
+{ return True; }
+
+Boolean simple_node::isDefComplete() const {   
+#ifdef BRIDGE
+  if (tree_) {
+    if (tree_->defstatus == STATUS_COMPLETE) 
+      return True;
+    // else if (tree_ && sms_variable_getvar("SMSNOSCRIPT", tree_))
+    //   return True;
+    else if (tree_->complete != 0 && 
+             (sms_status_trigger(tree_->complete) == FALSE))
+      return True;
+  }
+#endif
+  if (!owner_) return False;
+  else if (!owner_) 
+    return False;
+  else if (owner_->defstatus() == STATUS_COMPLETE) 
+    return True;
+  Node* ecf = __node__() ? __node__()->get_node() : 0;
+  if (ecf) {
+    AstTop* t = ecf->completeAst();
+    if (t)
+      if (t->evaluate())
+        return True;
+  }
+  return False;
+}
+
+std::string simple_node::variable(const std::string& name, bool substitute)
+{
+  if (__node__())
+    if (__node__()->get_node()) {    
+      const Variable & var = __node__()->get_node()->findVariable(name);
+      if (!var.empty())  {
+        std::string value = var.theValue();
+        if (substitute)
+          __node__()->get_node()->variableSubsitution(value);
+        return value; 
+      } // return var.theValue();
+    }
+  for (node *run = kids(); run; run = run->next()) {
+    if (run->type() == NODE_VARIABLE && run->name() == name) {
+      variable_node *nvar = (variable_node*) run;
+      if (nvar->get_var() != ecf_node::none())
+        return nvar->get_var();      
+    }
+  }
+  if (!parent())
+    return ecf_node::none();
+  return parent()->variable(name, substitute);
+}
+
+void simple_node::info(std::ostream& f)
+{
+  static const std::string inc = "  ";
+  node::info(f);
+  f << type_name() << " " << name() << "\n";
+  {
+    if (owner_) {
+
+      if (owner_->type() == NODE_SUITE) {
+	Suite* suite = dynamic_cast<Suite*>(owner_->get_node());
+	// f << "clock    : "; 
+	if (suite->clockAttr()) {
+	  suite->clockAttr().get()->print(f); // f << "\n";
+	}
+      }
+
+      int defs = owner_->defstatus();
+      if (defs != STATUS_QUEUED && defs != STATUS_UNKNOWN)
+        f << inc << "defstatus " << ecf::status_name[defs] << "\n";
+
+      Node* node = owner_->get_node();
+      if (node) {
+        // if (node->repeat().toString() != "") // repeat // duplicated on suite node
+        //  f << inc << node->repeat().toString() << "\n";
+
+        /* zombies attribute */
+        const std::vector<ZombieAttr> & vect = node->zombies();
+        std::vector<ZombieAttr>::const_iterator it;
+        for (it = vect.begin(); it != vect.end(); ++it)
+          f << inc << it->toString() << "\n";
+
+        /* autocancel */
+        if (node->hasAutoCancel() && node->get_autocancel())
+          f << inc << node->get_autocancel()->toString() << "\n";
+      }
+    }
+    if(status() == STATUS_SUSPENDED)
+      f << inc << "# " << type_name() << " " << this->name() << " is " << status_name() 
+        << "\n";
+    }   
+  {
+    std::vector<Variable> gvar;
+    std::vector<Variable>::const_iterator it, gvar_end;
+    ecf_node* prox = __node__();
+    if (!prox) return;
+
+         Defs* defs = 0;
+         Node* ecf = 0;
+         if (dynamic_cast<ecf_concrete_node<Node>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Node>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Task>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Task>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Family>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Family>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Suite>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Suite>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Defs>*>(prox)) {
+            defs = dynamic_cast<ecf_concrete_node<Defs>*>(prox)->get();
+         }
+         if (!ecf && !defs) {
+	   return;
+         }
+
+         if (ecf ) {
+            gvar.clear();
+
+	    if (ecf->hasTimeDependencies()) {	      
+	      f << inc << "# time-date-dependencies: ";
+	      if (ecf->isTimeFree()) f << "free\n"; 
+	      else f << "holding\n"; 
+	    }
+            ecf->gen_variables(gvar);
+            for(it = gvar.begin(); it != gvar.end(); ++it) {
+	      f << inc << "# edit " << (*it).name() << " '" << (*it).theValue() << "'\n";
+            }
+
+            gvar = ecf->variables();
+            for(it = gvar.begin(); it != gvar.end(); ++it) {
+	      f << inc << "edit " << (*it).name() << " '" << (*it).theValue() << "'\n";
+            }
+         }
+         if (defs) {
+            const std::vector<Variable>& gvar = defs->server().user_variables();
+            for(it = gvar.begin(); it != gvar.end(); ++it) {
+	      f << inc << "# edit " << (*it).name() << " '" << (*it).theValue() << "'\n";
+            }
+            const std::vector<Variable>& var = defs->server().server_variables();
+            for(it = var.begin(); it != var.end(); ++it) {
+	      f << inc << "edit " << (*it).name() << " '" << (*it).theValue() << "'\n";
+            }
+         }}
+
+  for (node *run=kids(); run; run=run->next()) 
+    if (run->type() == NODE_VARIABLE) {
+      /* variable_node *var = dynamic_cast<variable_node*> (run);
+      if (var && var->name() == "") { f << inc << "# empty variable!" << "\n"; continue; }
+      if (var->isGenVariable(0x0))
+        f << inc << "# edit " << run->name() << " '" << var->get_var() << "'" << "\n";
+      else 
+      f << inc << "edit " << run->name() << " '" << var->get_var() << "'" << "\n";*/
+    } else { 
+      f << inc;
+      int i = run->type();
+      if (!owner_ || (i == NODE_SUITE || i == NODE_FAMILY ||
+                      i == NODE_TASK  || i == NODE_ALIAS))
+        f << run->type_name() << " ";
+      f << run->toString() << "\n";
+      // f << run->dump() << "\n";
+    }
+  f << "end" << type_name() << " # " << name() << "\n";
+}
+
+void simple_node::scan(Ast *m,trigger_lister& tlr,node* trg)
+{
+  if(!m) return;
+  std::string path = "";
+  { AstNode     *an = dynamic_cast<AstNode*>     (m); 
+    if(an) { path = an->nodePath(); path = m->expression(); } }
+  { AstVariable *an = dynamic_cast<AstVariable*> (m); 
+    if(an) { path = an->nodePath(); path = m->expression(); } }
+
+  if (path != "") {
+    node* n = parent() ? parent()->find(path) : node::find(path);
+
+    if(n) {
+      tlr.next_node(*n,0,trigger_lister::normal,trg);
+    } else if (external::is_external(path))
+      tlr.next_node(external::get(path),0,trigger_lister::normal,trg);
+  } 
+  {
+    scan(m->left(), tlr,trg);
+    scan(m->right(),tlr,trg);
+  }
+}
+
+/*******************************/
+
+class fik : public trigger_lister {
+  node*     n_;
+  node*     k_;
+  trigger_lister& l_;
+public:
+
+  fik(node* n,node* k,trigger_lister& l): n_(n),k_(k),l_(l) {};
+  
+  void next_node(node& n, node*,int type,node *t) {
+    if(!n.is_my_parent(n_)) {
+      // k is a kid of n whose trigger_panel is outside its subtree
+      l_.next_node(n,k_,trigger_lister::child,t);
+    }
+  }
+};
+
+class fip : public trigger_lister {
+  node* p_;
+  trigger_lister& l_;
+
+public:
+  fip(node* p,trigger_lister& l) : p_(p), l_(l) {}
+
+  void next_node(node& n, node*,int type,node *t) 
+  { l_.next_node(n,p_,trigger_lister::parent,t); }
+};
+
+/*******************************/
+
+static void find_in_kids(node& n,node* k,trigger_lister& tlr)
+{
+  while(k) {
+    fik f(&n,k,tlr);
+    k->triggers(f);
+    find_in_kids(n,k->kids(),tlr);
+    k = k->next();
+  }
+}
+#include <ExprAstVisitor.hpp>
+
+class AstCollateXNodesVisitor : public ecf::ExprAstVisitor {
+public:
+  AstCollateXNodesVisitor( std::set<node*>& );
+  virtual ~AstCollateXNodesVisitor();
+  
+  virtual void visitTop(AstTop*){}
+  virtual void visitRoot(AstRoot*){}
+  virtual void visitAnd(AstAnd*){}
+  virtual void visitNot(AstNot*){}
+  virtual void visitPlus(AstPlus*){}
+  virtual void visitMinus(AstMinus*){}
+  virtual void visitDivide(AstDivide*){}
+  virtual void visitMultiply(AstMultiply*){}
+  virtual void visitModulo(AstModulo*){}
+  virtual void visitOr(AstOr*){}
+  virtual void visitEqual(AstEqual*){}
+  virtual void visitNotEqual(AstNotEqual*){}
+  virtual void visitLessEqual(AstLessEqual*){}
+  virtual void visitGreaterEqual(AstGreaterEqual*){}
+  virtual void visitGreaterThan(AstGreaterThan*){}
+  virtual void visitLessThan(AstLessThan*){}
+  virtual void visitLeaf(AstLeaf*){}
+  virtual void visitInteger(AstInteger*){}
+  virtual void visitString(AstString*){}
+  virtual void visitNodeState(AstNodeState*){}
+  virtual void visitEventState(AstEventState*);
+  virtual void visitNode(AstNode*);
+  virtual void visitVariable(AstVariable*);
+  
+private:
+  std::set<node*>& theSet_;
+};
+
+
+AstCollateXNodesVisitor::AstCollateXNodesVisitor( std::set<node*>& s) : theSet_(s) {}
+AstCollateXNodesVisitor::~AstCollateXNodesVisitor() {}
+
+void AstCollateXNodesVisitor::visitEventState(AstEventState* astNode)
+{
+}
+
+void AstCollateXNodesVisitor::visitNode(AstNode* astNode)
+{
+  Node* referencedNode = astNode->referencedNode(); 
+  node* xnode = NULL;
+  if (referencedNode)
+    xnode = (node*) referencedNode->graphic_ptr();
+  if ( xnode ) theSet_.insert(xnode);
+}
+
+void AstCollateXNodesVisitor::visitVariable(AstVariable* astVar)
+{
+  Node* referencedNode = astVar->referencedNode();
+  if (referencedNode) {
+    simple_node* xnode = (simple_node*) referencedNode->graphic_ptr();
+    if (0 == xnode) return;
+
+    int type;
+    node* run;
+    for (run = xnode->kids(); 0 != run; run = run->next()) {
+      if (run->name() == astVar->name()) {
+        type = run->type();
+        if (type == NODE_EVENT 
+            || type == NODE_METER 
+            || type == NODE_VARIABLE) {
+          theSet_.insert(run);
+        }
+      }
+    }
+  }
+}
+
+void simple_node::triggers(trigger_lister& tlr)
+{
+  if(tlr.self()) {
+#ifdef BRIDGE
+    if (tree_) {
+      sms_node* ow = tree_;
+      if(ow->trigger)  
+        scan(((sms_trigger*)ow->trigger)->math,tlr,node::find((sms_node*) ow->trigger));
+
+      if(ow->complete) 
+        scan(((sms_trigger*)ow->complete)->math,tlr,node::find((sms_node*) ow->complete));
+
+      sms_limit* x = (sms_limit*) (ow->inlimit);
+      while(x)
+        {
+          node* n = node::find((sms_node*) x->limit);
+          if(n) tlr.next_node(*n,0,trigger_lister::normal,n);
+          x = x->next;
+        }
+      
+      sms_date* d = ow->date;
+      while(d) {
+        node* n = node::find((sms_node*) d);
+        if(n) tlr.next_node(*n,0,trigger_lister::normal,n);
+        d = d->next;
+      }
+      
+      sms_time* t = ow->time;
+      while(t) {
+        node* n = node::find((sms_node*) t);
+        if(n) tlr.next_node(*n,0,trigger_lister::normal,n);
+        t = t->next;
+      }
+    }
+    else 
+#endif
+    if (owner_) {
+     if (type() != NODE_SUPER && type() != NODE_SUITE) {
+       Node* ecf = __node__() ? __node__()->get_node() : 0;
+       std::set<node*> theSet;
+       std::set<node*>::iterator sit;
+       AstCollateXNodesVisitor astVisitor(theSet);
+
+     if (ecf) {
+       if (ecf->completeAst()) {
+         ecf->completeAst()->accept(astVisitor);
+       }
+       if (ecf->triggerAst()) {
+         ecf->triggerAst()->accept(astVisitor);
+       }
+     }
+     for (sit = theSet.begin(); sit != theSet.end(); ++sit)
+       tlr.next_node( *(*sit), 0, trigger_lister::normal, *sit);
+     }
+     
+     for (node *n = this->kids(); n ; n = n->next()) {
+        int type = n->type();
+        {
+           ecf_concrete_node<InLimit const> *c =
+                    dynamic_cast<ecf_concrete_node<InLimit const>*> (n->__node__());
+           InLimit const * i = c ? c->get() : 0;
+           if (i) {
+              node *xn = 0;
+              if ((xn = find_limit(i->pathToNode(), i->name())))
+                 tlr.next_node(*xn,0,trigger_lister::normal,xn);
+           }
+        } 
+        if (type == NODE_DATE || type == NODE_TIME)
+           tlr.next_node(*n,0,trigger_lister::normal,n);
+     }
+    }
+  } 
+   if(tlr.parents()) {
+     node* p = parent();
+     while(p) {
+       fip f(p,tlr);
+       p->triggers(f);
+       p = p->parent();
+     }
+   }
+  
+   if(tlr.kids())
+      find_in_kids(*this,kids(),tlr);
+  }
+
+boost::posix_time::ptime simple_node::status_time() const { 
+  if (owner_) return owner_->status_time();
+  return boost::posix_time::ptime();
+}
+
+int simple_node::flags()  const { 
+#ifdef BRIDGE
+  if (tree_) return tree_->flags;
+#endif
+  // FIXME defs
+  return owner_ ? owner_->flags() : 0;
+}
+
+Boolean simple_node::ecfFlag(int n) const
+{  
+  return (flags() & (1<<n)) != 0;
+}
+
+Boolean simple_node::show_it() const
+{
+  if(((node*)this) == selection::current_node())
+    return True;  
+  
+  if(show::want(show::time_dependant) && (hasDate() || hasTime()))
+    return True;
+  
+  if(show::want(show::late_nodes) && isLate())
+    return True;
+  
+  if(show::want(show::migrated_nodes) && isMigrated())
+     return True;
+  
+  if(show::want(show::rerun_tasks) && tryno() > 1)
+    return True;
+  
+  if(show::want(show::nodes_with_messages) && hasMessages())
+    return True;
+  
+  if(show::want(show::waiting_nodes) && isWaiting())
+    return True;
+  
+  if(show::want(show::defstatus_icon) && isDefComplete())
+    return True;
+  
+  if(show::want(show::zombie_icon) && isZombie())
+    return True;
+  
+  node* k = kids();
+  while(k) {
+    if(k->show_it())
+      return True;
+    k = k->next();
+  }
+  
+  return False;
+}
+
+Boolean simple_node::visible() const
+{
+  int wanted = status() - STATUS_UNKNOWN + show::unknown;
+  if((wanted < 32 && (show::want(wanted))) || show::want32(wanted)) 
+    return True;
+
+  node* n = kids_;
+  while(n) {
+    if(n->visible_kid()) return True;
+    n = n->next();
+  }
+  return False;
+}
+
+Boolean simple_node::visible_kid() const
+{
+  return visible();
+}
+
+
+const char* simple_node::status_name() const 
+{
+#ifdef BRIDGE
+  if (tree_) return ecf::status_name[tree_->status];
+#endif
+  return ecf::status_name[owner_ ? owner_->status() : 0]; 
+}
+
+void simple_node::why(std::ostream& f)
+{
+  if (owner_) 
+    owner_->why(f);
+  else if(status() == STATUS_SUSPENDED) {
+    f << type_name() << " " << this << " is " << status_name() << "\n";
+  }
+}
+
+void simple_node::scan_limit(Ast* m,std::ostream& f) 
+{
+  if(!m)  return;
+  
+  AstNode *an = dynamic_cast<AstNode*> (m);
+  if(an) {
+    const node* n = node::find(an->nodePath());
+    if(!n)
+      f << "limit_node not found??\n";
+    else if(n->evaluate())
+      f << n->type_name() << " " << n->name() << " is " << n->status_name() << "\n";
+  } else {
+    scan_limit(m->left(),f);
+    scan_limit(m->right(),f);
+  }
+}
+
+int kind(Ast *t) {
+  int rc = 0;
+  if (!t) return rc;
+
+  ++rc ; if (t->type() == "or")  return rc;
+  ++rc ; if (t->type() == "and") return rc;
+  ++rc ; if (t->type() == "equal") return rc;
+  ++rc ; if (t->type() == "not-equal") return rc;
+  ++rc ; if (t->type() == "less-than") return rc;
+  ++rc ; if (t->type() == "less-equal") return rc;
+  ++rc ; if (t->type() == "greater-than") return rc;
+  ++rc ; if (t->type() == "greater-equal") return rc;
+  ++rc ; if (t->type() == "plus") return rc;
+  ++rc ; if (t->type() == "minus") return rc;
+  ++rc ; // if (t->type == "multiply") return rc;
+  ++rc ; // if (t->type == "divide") return rc;
+  ++rc ; // if (t->type == "mod") return rc;
+  ++rc ; // if (t->type == "pow") return rc;
+  ++rc ; if (t->type() == "not") return rc;
+  ++rc ; if (t->type() == "unary") return rc;
+  ++rc ; if (t->type() == "open") return rc;
+  ++rc ; if (t->type() == "close") return rc;
+  ++rc ; if (t->type() == "node") return rc;
+  if (t->type() == "variable") return rc;
+  if (t->type() == "event_state") return rc;
+  return 0;
+}
+
+static struct {
+  int eval_;
+  int   print_;
+  char* pos_;
+  char*  neg_;
+} names [] = {
+ {0,0,(char*)"",(char*)"",},   // M_NIL
+ {1,0,(char*)"",(char*)"",},   // M_OR 
+ {1,0,(char*)"",(char*)"",},   // M_AND
+ {1,1,(char*)"is",                    (char*)"is not",},   // M_EQ 
+ {1,1,(char*)"is not",                (char*)"is",},   // M_NE 
+ {1,1,(char*)"is less than",          (char*)"is greater or equal to",},   // M_LT
+ {1,1,(char*)"is less or equal to",   (char*)"is greater than",},   // M_LE
+ {1,1,(char*)"is greater than",       (char*)"is less or equal to",},   // M_GT
+ {1,1,(char*)"is greater or equal to",(char*)"is less than",},   // M_GE
+ {0,1,(char*)" + ",(char*)" + ",},   // M_ADD
+ {0,1,(char*)" - ",(char*)" - ",},   // M_SUB
+ {0,0,(char*)"",(char*)"",},   // M_MUL
+ {0,0,(char*)"",(char*)"",},   // M_DIV
+ {0,0,(char*)"",(char*)"",},   // M_MOD
+ {0,0,(char*)"",(char*)"",},   // M_POW
+ {0,0,(char*)"",(char*)"",},   // M_NOT
+ {0,0,(char*)"",(char*)"",},   // M_UNARY
+ {0,0,(char*)"",(char*)"",},   // M_OPEN
+ {0,0,(char*)"",(char*)"",},   // M_CLOSE
+ {0,0,(char*)"",(char*)"",},   // M_NAME
+};
+
+void simple_node::scan(Ast* m,std::ostream& f,bool b) 
+{
+  if(m == 0) return;
+  std::cout << "# scan:" << m->expression() << "\n";
+  std::string cp = "";
+
+  { AstNode     *an = dynamic_cast<AstNode*>     (m); 
+    if(an) { cp = an->nodePath(); cp = m->expression();} }
+  { AstVariable *an = dynamic_cast<AstVariable*> (m); 
+    if(an) { cp = an->nodePath(); cp = m->expression();} }
+  
+  if(cp != "") {
+    const node* n = node::find(cp);
+    if(!n) {
+      if(external::is_external(cp))
+        f << " (unknown)";
+      else
+        f << cp << " (not found?)";
+      return;
+    }
+      
+    f << n->type_name() << ' ' << n->name() << '(' << n->status_name() << ')';      
+    // node* s = f.source(); if(s && n->is_my_parent(s)) f << cancel;
+  } else {
+    if(external::is_external(cp))
+      f << " (unknown)";
+  } 
+    
+  if(m->type() == "not")
+    b = !b;
+  
+  scan(m->left(),f,b);
+
+  f << ' ' << (b ? names[kind(m)].pos_ : names[kind(m)].neg_) << ' ';
+  
+  scan(m->right(),f,b);
+  
+  if(names[kind(m)].print_)
+    f << "\n";
+}
+
+class why_triggers : public trigger_lister {
+  std::ostream& f_;
+
+public:
+
+  virtual Boolean self()      { return False; }
+  virtual Boolean kids()      { return True; }
+  virtual Boolean parents()   { return True; }
+  
+  why_triggers(std::ostream& f) : f_(f) {}
+  
+  void next_node(node& n, node* p,int type,node*) {
+    if(p && p->status() == STATUS_QUEUED)
+      p->why(f_);
+  }
+};
+
+void simple_node::tell_me_why(std::ostream& f)
+{
+  this->why(f); 
+  // if (0x0 != parent())    parent()->tell_me_why(f);
+}
+
+void simple_node::queued(std::ostream& f)
+{
+  // Check parents
+  node* p = this;
+  p->why(f);
+  
+  // Check for suspended kids
+  suspended(f);
+  
+  // Other triggers
+  why_triggers wp(f);
+  triggers(wp);
+}
+
+void simple_node::aborted(std::ostream& f)
+{
+  node* k = kids();
+  while(k) {
+    k->aborted(f);
+    k = k->next();
+  }
+}
+
+void simple_node::suspended(std::ostream& f)
+{
+  if (type() != NODE_FAMILY && type() != NODE_TASK)
+    return;
+
+  if(status() == STATUS_SUSPENDED)
+    f << "  # " << type_name() << ' ' << this->name() << " is suspended\n";
+  
+  node* k = kids();
+  while(k) {
+    k->suspended(f);
+    k = k->next();
+  }
+}
+
+void simple_node::perlify(FILE* f)
+{
+  if (node::is_json)
+    fprintf(f,"\"kids\": [\n");
+  else
+    fprintf(f,"kids => [\n");
+  
+  node* k = kids();
+  while(k) {
+    k->as_perl(f,!k->isSimpleNode());
+    fprintf(f,",\n");
+    k = k->next();
+  }
+  
+  if (node::is_json)
+    fprintf(f,"{} ],\n");
+  else
+    fprintf(f,"],\n");
+}
+
+Boolean simple_node::isZombie() const
+{ 
+  return ecfFlag(FLAG_ZOMBIE);
+}
+
+Boolean simple_node::isToBeChecked() const
+{ 
+  int s = status();
+  return  s == STATUS_SUSPENDED || s == STATUS_ACTIVE || s == STATUS_SUBMITTED;
+}
+
+Boolean suite_node::visible () const { return show_it() ; }
+
+Boolean suite_node::show_it() const {
+  if (serv().suites().empty()) 
+    return True; // show_all
+
+  std::vector<std::string>::const_iterator it;
+  for (it = serv().suites().begin(); it != serv().suites().end(); ++it)
+    if (*it == name())
+      return simple_node::visible();
+
+  return False;
+}
+
+Boolean simple_node::isGenVariable(const char *name) {
+ for (node *run = kids(); 0 != run; run = run->next()) {
+    if (run->type() == NODE_VARIABLE)
+      if (run->name() == name)
+        return run->isGenVariable(name);
+ }
+ return False;
+}
+
+void simple_node::genvars(std::vector<Variable>& var) 
+{ 
+  for (node *run = kids(); run; run = run->next()) {
+    if (run->type() == NODE_VARIABLE) {
+      if (run->name() == "") std::cerr << "# empty variable!\n";
+      else if (run->isGenVariable(0))
+        var.push_back(Variable(run->name(), ((variable_node*) run)->get_var(), false/*dont check names*/));
+    }
+  }
+  return;
+}
+
+void simple_node::variables(std::vector<Variable>& var) 
+{
+  for (node *run = kids(); 0 != run; run = run->next()) {
+    if (run->type() == NODE_VARIABLE){ 
+      if (run->name() == "") std::cerr << "# empty variable!\n";
+      else if (!run->isGenVariable(0)) {
+        var.push_back(Variable(run->name(), ((variable_node*) run)->get_var(), false/*dont check names*/));
+      }
+  }
+}
+}
+
+Boolean simple_node::hasMessages() const
+{ 
+  if (ecfFlag(FLAG_MESSAGE)) return True;
+  // FIXME // cannot call this below while it is called during node redraw
+  if (type() == NODE_SUPER) 
+    return True;
+    // return serv().messages(*this).size() > 0;
+  return False; // serv().messages(*this).size() > 0;
+}
+
+// void simple_node::unlink() { 
+//   if (__node__()) __node__()->unlink(); 
+//   for (node *run = kids(); run; run = run->next()) { run->unlink(); }
+// }
diff --git a/ecflow_4_0_7/view/src/simple_node.h b/ecflow_4_0_7/view/src/simple_node.h
new file mode 100644
index 0000000..b230947
--- /dev/null
+++ b/ecflow_4_0_7/view/src/simple_node.h
@@ -0,0 +1,158 @@
+#ifndef simple_node_H
+#define simple_node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #18 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+class simple_node : public node {
+public:
+  simple_node(host&,ecf_node*);
+#ifdef BRIDGE
+  simple_node(host&,sms_node*,char);
+#endif
+  ~simple_node();
+  
+  virtual std::string variable(const std::string&, bool substitute=false);
+  virtual const char* status_name() const;
+
+  virtual void info(std::ostream&);
+  virtual void triggers(trigger_lister&);
+  
+  virtual Boolean hasTriggers() const;
+  virtual Boolean hasDate() const;
+  virtual Boolean hasTime() const;
+
+  virtual Boolean hasTimeHolding() const;
+
+  virtual Boolean hasManual() const;
+  virtual Boolean isSimpleNode() const { return True; }
+  virtual Boolean isGenVariable(const char*);
+  virtual void genvars(std::vector<Variable>&);
+  virtual void variables(std::vector<Variable>&);
+  
+  virtual Boolean visible() const;
+  virtual Boolean visible_kid() const;
+  virtual Boolean show_it() const;
+  
+  virtual void tell_me_why(std::ostream&);
+  virtual void why(std::ostream&);
+  virtual void suspended(std::ostream&);
+  virtual void aborted(std::ostream&);
+  virtual void queued(std::ostream&);
+  
+  virtual int tryno()  const;
+  virtual int flags() const;
+  virtual boost::posix_time::ptime status_time() const;
+  
+  virtual Boolean isMigrated() const  { return ecfFlag(FLAG_MIGRATED); }
+  virtual Boolean isLate() const      { return ecfFlag(FLAG_LATE);     }
+  virtual Boolean isWaiting() const   { return ecfFlag(FLAG_WAIT);     }
+  virtual Boolean hasMessages() const;
+  
+  virtual Boolean isTimeDependent() const { return hasDate() || hasTime(); }
+  
+  virtual Boolean isForceAbort() const    { return  ecfFlag(FLAG_FORCE_ABORT); }
+  virtual Boolean isUserEdit() const    { return  ecfFlag(FLAG_USER_EDIT); }
+  virtual Boolean isTaskAbort() const    { return  ecfFlag(FLAG_TASK_ABORTED); }
+  virtual Boolean isEditFailed() const    { return  ecfFlag(FLAG_EDIT_FAILED); }
+  virtual Boolean isCmdFailed() const    { return  ecfFlag(FLAG_CMD_FAILED); }
+  virtual Boolean isScriptMissing() const    { return  ecfFlag(FLAG_NO_SCRIPT); }
+  virtual Boolean isKilled() const    { return  ecfFlag(FLAG_KILLED); }
+  virtual Boolean isByRule() const    { return  ecfFlag(FLAG_BYRULE); }
+  virtual Boolean isQueueLimit() const    { return  ecfFlag(FLAG_QUEUELIMIT); }
+  
+  virtual Boolean isRerun() const     { return  tryno() > 1; }
+  virtual Boolean isZombie() const;
+  virtual Boolean hasZombieAttr() const;
+  virtual Boolean isToBeChecked() const;
+  virtual Boolean isDefComplete() const;
+  
+  virtual bool trigger_kids() const { return true; }
+  virtual bool trigger_parent() const { return true; }
+  
+  virtual Boolean ecfFlag(int) const;
+  
+  // void unlink();
+  
+ protected:
+  
+  virtual void perlify(FILE*);
+  int old_status_, old_tryno_, old_flags_;
+ private:
+  
+  simple_node(const simple_node&);
+  simple_node& operator=(const simple_node&);
+  
+  virtual void drawNode(Widget,XRectangle*,bool);
+  virtual void sizeNode(Widget,XRectangle*,bool);
+  virtual void drawBackground(Widget,XRectangle*,bool);
+  
+  void scan(Ast*,trigger_lister&,node*);
+  void scan(Ast*,std::ostream&,bool);
+  void scan(node*,std::ostream&);
+#ifdef BRIDGE
+  void scan(sms_tree* m,trigger_lister& f,bool b);
+  void scan(sms_tree* m,std::ostream& f,bool b);
+  // void scan(sms_tree* m,std::ostream& f,bool b);
+#endif
+  void scan_limit(Ast*,std::ostream&);
+  
+  virtual Pixel color() const;
+};
+
+inline void destroy(simple_node**) {}
+
+class suite_node : public simple_node {
+ public:
+  suite_node(host& h,ecf_node* n) : simple_node(h,n) {}
+#ifdef BRIDGE
+  suite_node(host& h,sms_node* n,char b) : simple_node(h,n,b) {}
+#endif
+  virtual Boolean show_it() const;
+  virtual Boolean visible() const;
+
+  // virtual void info(std::ostream&);
+};
+#define FLAG_ISSET(flag) (1<<(flag))
+#include "late.h"
+
+class family_node : public simple_node {
+  virtual bool trigger_kids()   const { return false; }
+  virtual bool trigger_parent() const { return false; }
+public:
+  family_node(host& h,ecf_node* n) : simple_node(h,n) {}
+#ifdef BRIDGE
+  family_node(host& h,sms_node* n,char b) : simple_node(h,n,b) {}
+#endif
+  void update(int oldstatus,int oldtryno,int oldflags) {
+    bool is_late  = flags()    & FLAG_ISSET(FLAG_LATE);
+    bool was_late = old_flags_ & FLAG_ISSET(FLAG_LATE);
+    simple_node::update(oldstatus,oldtryno,oldflags);    
+    if(is_late != was_late) {
+      if(is_late)
+	serv().late(*this);
+      else
+	late::hide(*this);
+    }
+    old_flags_ = flags();
+}
+
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/singleton.h b/ecflow_4_0_7/view/src/singleton.h
new file mode 100644
index 0000000..ef3344f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/singleton.h
@@ -0,0 +1,32 @@
+#ifndef singleton_H
+#define singleton_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+template<class T>
+class singleton {
+public:
+  static T& instance();
+};
+
+template<class T>
+T& singleton<T>::instance()
+{
+  static T p;
+  return p;
+}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/std.h b/ecflow_4_0_7/view/src/std.h
new file mode 100644
index 0000000..f403129
--- /dev/null
+++ b/ecflow_4_0_7/view/src/std.h
@@ -0,0 +1,6 @@
+
+#include <list>
+#include <vector>
+#include <map>
+#include <typeinfo>
+#include <string>
diff --git a/ecflow_4_0_7/view/src/stl.h b/ecflow_4_0_7/view/src/stl.h
new file mode 100644
index 0000000..dba7f51
--- /dev/null
+++ b/ecflow_4_0_7/view/src/stl.h
@@ -0,0 +1,19 @@
+#if 1
+#include <set>
+#include <map>
+#include <list>
+#include <vector>
+#include <string>
+#include <algorithm>
+using std::string;
+using std::set;
+using std::map;
+using std::list;
+using std::vector;
+#else
+#include <algo.h>
+#include <tree.h>
+#include <mstring.h>
+#include <map.h>
+#include <set.h>
+#endif
diff --git a/ecflow_4_0_7/view/src/str.cc b/ecflow_4_0_7/view/src/str.cc
new file mode 100644
index 0000000..2581635
--- /dev/null
+++ b/ecflow_4_0_7/view/src/str.cc
@@ -0,0 +1,99 @@
+#ifndef str_H
+#include "str.h"
+#endif
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <string.h>
+#include <strings.h>
+#include <stdio.h>
+
+str_imp::str_imp(const char* p):
+	str_ (new char[strlen(p) + 1])
+{
+	//if(!str_) { printf("Out of memory"); exit(1); }	
+	strcpy(str_,p);
+}
+
+str_imp::~str_imp()
+{
+	delete[] str_;
+}
+
+
+str::str()
+{
+	static str empty("");
+	imp_ = empty.imp_;
+	imp_->attach();	
+}
+
+str::~str()
+{
+	imp_->detach();
+}
+
+str::str(const char* n):
+	imp_(new str_imp(n))
+{
+	imp_->attach(); 
+}
+
+str::str(const str& other):
+	imp_(other.imp_)
+{
+	imp_->attach(); 
+}
+
+str::str(const std::string& other):
+  imp_(new str_imp(other.c_str()))
+{
+	imp_->attach(); 
+}
+
+str& str::operator=(const str& other)
+{
+	other.imp_->attach();
+	imp_->detach();
+	imp_ = other.imp_;
+	return *this;
+}
+
+
+bool str::operator==(const str& other) const
+{
+	return strcmp(c_str(),other.c_str()) == 0;
+}
+
+bool str::operator!=(const str& other) const
+{
+	return strcmp(c_str(),other.c_str()) != 0;
+}
+
+str operator+(const str& a,const str& b)
+{
+	char* p = new char[strlen(a.c_str()) + strlen(b.c_str()) + 1 ];
+	strcpy(p,a.c_str());
+	strcat(p,b.c_str());
+	str s(p);
+	delete[] p;
+	return s;
+}
+
+str& str::operator+=(const str& s)
+{
+	*this = *this + s;
+	return *this;
+}
diff --git a/ecflow_4_0_7/view/src/str.h b/ecflow_4_0_7/view/src/str.h
new file mode 100644
index 0000000..d6655b0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/str.h
@@ -0,0 +1,59 @@
+#ifndef str_H
+#define str_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <string>
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#include "counted.h"
+
+struct str_imp : public counted {
+	char* str_;
+	str_imp(const char*);
+	~str_imp();
+};
+
+class str {
+public:
+	str();
+	str(const char*);
+	str(const str&);
+	str(const std::string&);
+
+	~str(); // Change to virtual if base class
+
+	str& operator=(const str&);
+
+	bool operator==(const str&) const;
+	bool operator!=(const str&) const;
+
+	str& operator+=(const str&);
+
+	const char* c_str() const { return imp_->str_; }
+
+private:
+
+	str_imp* imp_;
+};
+
+str operator+(const str&,const str&);
+str operator+(const char*,const str&);
+str operator+(const str&,const char*);
+
+#endif
diff --git a/ecflow_4_0_7/view/src/substitute.cc b/ecflow_4_0_7/view/src/substitute.cc
new file mode 100644
index 0000000..52f0609
--- /dev/null
+++ b/ecflow_4_0_7/view/src/substitute.cc
@@ -0,0 +1,139 @@
+
+#ifndef substitute_H
+#include "substitute.h"
+#endif
+
+#ifndef node_H
+#include "node.h"
+#endif
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <strings.h>
+
+#include <Xm/PushB.h>
+
+extern "C" {
+#include "xec.h"
+}
+
+static char* debug = getenv("DEBUG");
+substitute::substitute(const std::string& name):
+  name_(name)
+{
+}
+
+substitute::~substitute()
+{
+}
+
+const char* substitute::scan(const char* cmd,node* n)
+{
+  static char buf[1024];
+  int i = 0, j = 0, k= 0, cont = 1;
+  char word[1024], edit[1024];
+  bool var = false, col = false;
+  substitute* s;
+  word[0] = 0; edit[0] = 0;
+
+  if (debug) std::cout << "# substituted1:" << cmd << "\n";
+  std::string replace (cmd);
+  if (replace.find("%") != std::string::npos) {
+    if (n->__node__()) {
+      if (n->__node__()->type() == NODE_SUPER) {
+	ecf_concrete_node<Defs> *ecfn = dynamic_cast<ecf_concrete_node<Defs>*>(n->__node__());
+	if (0x0 != ecfn) // ok with a node, NOK with attribute
+	  if (const_cast<Defs*>(ecfn->get())) {
+	    const_cast<Defs*>(ecfn->get())-> variableSubsitution(replace);
+	    strcat(buf, replace.c_str());
+	    return buf;
+	  }
+      } else if (n->__node__()-> get_node()) {
+	n->__node__()-> get_node()-> variableSubsitution(replace);
+	strcat(buf, replace.c_str());
+	if (debug) std::cout << "# substituted2:" << replace << "\n";
+	if (debug) std::cout << "# substituted2:" << buf << "\n";
+	return buf;
+      } 
+    }
+    return cmd;
+  }
+
+  while(*cmd && cont) {
+    switch(*cmd) {
+    case '<':
+	  var       = true;
+	  j         = 0;
+	  word[j++] = '<';
+	  break;
+	  
+    case '>':	  
+	  var       = false;
+	  word[j++] = '>';
+	  word[j]   = 0;
+	  
+	  s = first();
+	  while(s) {
+	    if(s->name_ == word) {
+	      strcpy(word,s->eval(n).c_str());
+	      break;
+	    }
+	    s = s->next();
+	  }
+	  
+	  buf[i] = 0;
+	  strcat(buf,word);
+	  i += strlen(word);
+	  if (debug) std::cout << "# substituted:" << buf << "-" << word <<"-\n";
+	  j = 0;
+	  break;
+	  
+    default:
+      if (col) edit[k++] = *cmd;
+      else if(var)
+	word[j++] = *cmd;
+      else
+	buf[i++] = *cmd;
+      break;
+    }
+      
+    cmd++;
+  }
+   
+  if(k) {
+    buf[i] = 0;
+    strcat(buf,edit);
+    i += strlen(edit);
+  } else if(j) {
+    buf[i] = 0;
+    strcat(buf,word);
+    i += strlen(word);
+  }
+ 
+  if (debug) std::cout << "# substituted:" << buf << "-" << word << "-" << edit <<"-\n";
+  buf[i] = 0;
+  return buf;
+}
+
+void substitute::fill(Widget w)
+{
+  substitute* s = first();
+  while(s) {
+    XtManageChild(XmCreatePushButton(w,(char*)s->name_.c_str(),0,0));
+    s = s->next();
+  }
+}
+
+IMP(substitute)
diff --git a/ecflow_4_0_7/view/src/substitute.h b/ecflow_4_0_7/view/src/substitute.h
new file mode 100644
index 0000000..fd4d470
--- /dev/null
+++ b/ecflow_4_0_7/view/src/substitute.h
@@ -0,0 +1,55 @@
+#ifndef substitute_H
+#define substitute_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+#include <Xm/Xm.h>
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+class substitute : public extent<substitute> {
+public:
+  substitute(const std::string&);
+
+  ~substitute(); // Change to virtual if base class
+  virtual const std::string eval(node*) = 0;
+
+  static const char* scan(const char*, node*);
+  static void fill(Widget);
+
+private:
+	substitute(const substitute&);
+	substitute& operator=(const substitute&);
+
+	const std::string name_;
+};
+
+inline void destroy(substitute**) {}
+
+class proc_substitute : public substitute {
+  typedef const std::string& (node::*procc)() const; procc procc_;
+  const std::string eval(node* n) { return (n->*procc_)(); }
+public:
+ proc_substitute(const std::string& name,procc p): substitute(name), procc_(p)
+  {}
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/suites_panel.cc b/ecflow_4_0_7/view/src/suites_panel.cc
new file mode 100644
index 0000000..a557c1e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/suites_panel.cc
@@ -0,0 +1,146 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "suites_panel.h"
+#include "node.h"
+#include "host.h"
+#include "ecflowview.h"
+#include <Xm/Label.h>
+#include <Xm/Text.h>
+#include <Xm/List.h>
+extern "C" {
+#include "xec.h"
+}
+
+suites_panel::suites_panel(panel_window& w):
+	panel(w)
+	, done (false)
+{
+}
+
+suites_panel::~suites_panel()
+{
+}
+
+void suites_panel::create (Widget parent, char *widget_name )
+{
+  suites_form_c::create(parent,widget_name);
+}
+
+void suites_panel::clear()
+{
+  if (done) return; 
+  XmListDeleteAllItems(list_);
+}
+
+struct suite_lister1 { 
+  Widget                   list_;
+  unsigned int             pos_;
+  std::vector<std::string> suites_;
+  void next(suite_lister1&);
+  std::string name() 
+  { return (pos_ < suites_.size()) ? suites_[pos_] : ""; }
+  void run()
+  { for (unsigned int i=0; i<suites_.size(); ++i) next(*this); }
+
+public:
+  suite_lister1(Widget list, std::vector<std::string> suites) 
+    : list_(list), pos_(0), suites_(suites) {
+    std::sort(suites_.begin(), suites_.end());
+  }
+};
+
+void suite_lister1::next(suite_lister1& l)
+{ 
+  if (pos_ < suites_.size() && suites_[pos_] != "*") {
+    xec_AddListItem(list_,(char*)name().c_str());
+  }
+  ++pos_;
+}
+
+struct suite_lister2 {
+  Widget                   list_;
+  unsigned int             pos_;
+  std::vector<std::string> suites_;
+  void next(suite_lister2& l);
+  std::string name() 
+  { return (pos_ < suites_.size()) ? suites_[pos_] : ""; }
+  void run() 
+  { for (unsigned int i=0; i<suites_.size(); ++i) next(*this); };
+
+public:
+  suite_lister2(Widget list, std::vector<std::string> suites) 
+    : list_(list), pos_(0), suites_(suites) {}
+};
+
+void suite_lister2::next(suite_lister2&)
+{ 
+  if (pos_ < suites_.size() && suites_[pos_] != "*") {
+    XmString s = XmStringCreateSimple((char*)name().c_str());
+    XmListSelectItem(list_,s,False);
+    XmStringFree(s);
+  }
+  ++pos_;
+}
+
+void suites_panel::show(node& n)
+{
+  if (done) return; done = true; clear();
+  // XmListDeleteAllItems(list_);  
+  { std::vector<std::string> sv1; n.serv().suites(SUITES_LIST,sv1); 
+    suite_lister1 sl1(list_, sv1); sl1.run(); }
+  { std::vector<std::string> sv2; n.serv().suites(SUITES_MINE,sv2); 
+    suite_lister2 sl2(list_, sv2); sl2.run(); }
+}
+
+Boolean suites_panel::enabled(node& n)
+{
+  return n.type() == NODE_SUPER;
+}
+
+void suites_panel::tellCB( Widget, XtPointer )
+{
+  XmString *items;
+  int count;
+  std::vector<std::string> l;
+  
+  XtVaGetValues(list_,
+		XmNselectedItems,    &items,
+		XmNselectedItemCount,&count,
+		NULL);
+    
+  for(int i = 0; i < count ; ++i) {
+    char* p = xec_GetString(items[i]);
+    l.push_back(std::string (p));
+    XtFree(p);
+  }
+  if(get_node())
+    get_node()->serv().suites(SUITES_REG, l);
+  else
+    clear();	
+  submit();
+}
+
+void suites_panel::offCB( Widget, XtPointer )
+{
+	XmListDeselectAllItems(list_);	
+}
+
+void suites_panel::onCB( Widget, XtPointer )
+{
+	xec_ListSelectAll(list_);
+}
+
+// static panel_maker<suites_panel> maker(PANEL_SUITES);
diff --git a/ecflow_4_0_7/view/src/suites_panel.h b/ecflow_4_0_7/view/src/suites_panel.h
new file mode 100644
index 0000000..241de11
--- /dev/null
+++ b/ecflow_4_0_7/view/src/suites_panel.h
@@ -0,0 +1,54 @@
+#ifndef suites_panel_H
+#define suites_panel_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "uisuites.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+class suites_panel : public panel, public suites_form_c {
+public:
+
+	suites_panel(panel_window&);
+
+	~suites_panel(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Suites"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Boolean enabled(node&);
+	virtual Widget widget() { return suites_form_c::xd_rootwidget(); }
+	virtual Widget tools() { return tools_; }
+
+	virtual void create (Widget parent, char *widget_name = NULL);
+
+private:
+
+	bool done;
+
+	suites_panel(const suites_panel&);
+	suites_panel& operator=(const suites_panel&);
+
+	virtual void tellCB( Widget, XtPointer );
+	virtual void offCB( Widget, XtPointer );
+	virtual void onCB( Widget, XtPointer );
+};
+
+inline void destroy(suites_panel**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/super_node.cc b/ecflow_4_0_7/view/src/super_node.cc
new file mode 100644
index 0000000..e554672
--- /dev/null
+++ b/ecflow_4_0_7/view/src/super_node.cc
@@ -0,0 +1,96 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "simple_node.h"
+#include "host.h"
+#include "timeout.h"
+
+#include "super_node.h"
+
+void super_node::why(std::ostream &w)
+{
+  if(isLocked())
+    w << "The server " << this << " is locked\n";
+  if (owner_)
+    owner_->why(w);
+}
+
+void super_node::run()
+{
+  decay_++;
+  /* printf("node run .. %s %d\n",node_name(),decay_); */
+  redraw();
+}
+
+void super_node::active(bool b)
+{
+  /* printf("node activate %s %d\n",node_name(),int(b)); */
+  if(b != active_) {
+    active_ = b;
+    redraw();
+  }
+}
+
+void super_node::up_to_date()
+{
+  frequency(60); // This will  reset the timeout 
+  if(decay_) {
+    decay_ = 0;
+    redraw();
+  }
+}
+
+void super_node::drawBackground(Widget w,XRectangle* r,bool)
+{
+  if(true /*active_*/ ) {
+    XRectangle a = *r;
+    
+    // All grey after 1 hours    
+    double x = a.width * ( decay_ / 60.0 );
+    
+    if(x > a.width) x = a.width;
+    
+    a.width  -= x;
+    
+    /* printf("%d %d\n",r->width,a.width); */    
+    /* a.width  -= x + 0.5;  a.x += x/2.0 + 0.5; */
+    /* a.height -= y + 0.5;  a.y += y/2.0 + 0.5; */
+    
+#if 0
+    printf("%d x y = %g %g %d.%d.%d.%d %d.%d.%d.%d\n", decay_, x , y ,
+	   r->x,r->y,r->width,r->height,
+	   a.x,a.y,a.width,a.height
+	   );
+#endif
+    
+    GC gc = colorGC(STATUS_UNKNOWN);
+    XFillRectangles(XtDisplay(w),XtWindow(w),gc,r,1);
+
+    gc = colorGC(status());
+    XFillRectangles(XtDisplay(w),XtWindow(w),gc,&a,1);
+  }
+  else {
+    GC gc = colorGC(STATUS_UNKNOWN);
+    XFillRectangles(XtDisplay(w),XtWindow(w),gc,r,1);
+  }
+}
+
+void super_node::info(std::ostream& f)
+{
+  serv().stats(f);
+  simple_node::info(f);
+}
+
+// static node_maker<super_node> super_maker(NODE_SUPER);
diff --git a/ecflow_4_0_7/view/src/super_node.h b/ecflow_4_0_7/view/src/super_node.h
new file mode 100644
index 0000000..04d7e1a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/super_node.h
@@ -0,0 +1,72 @@
+#ifndef super_node_H
+#define super_node_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #12 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#ifndef simple_node_H
+#include "simple_node.h"
+#endif
+#ifndef host_H
+#include "host.h"
+#endif
+#ifndef timeout_H
+#include "timeout.h"
+#endif
+class super_node : public simple_node, public timeout {
+  virtual void why(std::ostream&);
+	virtual Boolean visible() const { return True; }
+	virtual Boolean show_it() const { return True; } 
+	virtual const std::string& name() const { return serv().name_ref(); } 
+	virtual const std::string& node_name() const { return serv().name_ref(); } 
+	virtual const char* type_name() const { return "server"; } 
+	virtual void run();
+	virtual void up_to_date();
+	virtual void active(bool);
+	virtual void drawBackground(Widget w,XRectangle* r,bool);
+	virtual void info(std::ostream&);
+
+	virtual bool trigger_kids() const { return false; }
+	virtual bool trigger_parent() const { return false; }
+	virtual bool timeTable() { return true; }
+
+	Boolean isLocked() const { return ecfFlag(FLAG_LOCKED); }
+
+	virtual Boolean hasManual() const   { return False; }
+	virtual Boolean hasTriggers() const { return False; }
+	virtual Boolean hasInfo() const     { return True; }
+
+	bool active_;
+	int decay_;
+
+public:
+ super_node(host& h,ecf_node* n)
+   : simple_node(h,n) 
+	  , timeout(60)
+	  , active_(true)
+	  , decay_(0)
+	  { folded_ = False;  enable(); }
+
+#ifdef BRIDGE
+ super_node(host& h,sms_node* n, char b)
+   : simple_node(h,n,b) 
+	  , timeout(60)
+	  , active_(true)
+	  , decay_(0)
+	  { folded_ = False;  enable(); }
+#endif
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/task_node.cc b/ecflow_4_0_7/view/src/task_node.cc
new file mode 100644
index 0000000..f8a23de
--- /dev/null
+++ b/ecflow_4_0_7/view/src/task_node.cc
@@ -0,0 +1,281 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #15 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "task_node.h"
+#include "text_lister.h"
+#include "late.h"
+#include "zombie.h"
+#include "to_check.h"
+#include "host.h"
+#include "url.h"
+#include "re.h"
+#include "ecf_node.h"
+
+char *ecf_flag_name[]  = { (char*)"has been forced to aborted",
+      (char*)"user edit failed",
+      (char*)"the job failed",
+      (char*)"editing failed (.job file can not be created)",
+      (char*)"job could not be submitted (ECF_CMD failed)",
+      (char*)"ECF could not find the script",
+      (char*)"killed by user",
+			   (char*)"", // has been migrated",
+      (char*)"is late",
+      (char*)"has user messages",
+      (char*)"complete by rule",
+      (char*)"queue limit reached",
+      (char*)"running task is waiting for trigger",
+      (char*)"node is locked by a user",
+      (char*)"zombie is trying to communicate",
+      (char*)"task is submitted or active (ecf) but not matching job visible",
+      NULL };
+
+#ifdef BRIDGE
+task_node::task_node(host& h,sms_node* n, char b):
+  simple_node(h,n, b)
+{}
+#endif
+
+task_node::task_node(host& h,ecf_node* n):
+	simple_node(h,n)
+{
+  if (kids_ == 0x0) {
+    folded_ = False; 
+  } else {
+    folded_ = True; 
+  }
+}
+
+
+task_node::~task_node()
+{
+}
+
+void task_node::info(std::ostream& f) {
+  simple_node::info(f);
+  if (0 == owner_) return;
+  if (status() == STATUS_ABORTED && owner_->get_node()) {
+    f << owner_->get_node()->abortedReason() << "\n";
+  }
+  f << owner_->toString() << "\n";
+}
+
+void task_node::update(int oldstatus,int oldtryno,int oldflags)
+{
+	simple_node::update(oldstatus,oldtryno,oldflags);
+	check(oldstatus,oldtryno,oldflags);
+}
+
+void task_node::adopt(node* n)
+{
+	simple_node::adopt(n);
+	check(0,0,0);
+}
+
+void task_node::create()
+{
+	simple_node::create();
+	check(0,0,0);
+}
+
+#ifdef FLAG_ISSET
+#undef FLAG_ISSET
+#endif
+#define FLAG_ISSET(flag) (1<<(flag))
+inline bool is_late(int f) { return (f & FLAG_ISSET(FLAG_LATE)); } 
+inline bool is_zombie(int f) { return (f & FLAG_ISSET(FLAG_ZOMBIE)); }
+inline bool is_to_check(int f) { return (f& FLAG_ISSET(FLAG_TO_CHECK));}
+
+void task_node::check(int,int,int)
+{
+   int new_status = status();
+   int new_flags =  flags();
+   int new_try_no = tryno();
+
+	if(new_status != old_status_ && new_status == STATUS_ABORTED)
+		serv().aborted(*this);
+
+	if(new_try_no > 1 && new_try_no != old_tryno_ && (
+	         new_status == STATUS_SUBMITTED ||
+	         new_status == STATUS_ACTIVE))
+		      serv().restarted(*this);
+
+	bool new_is_late = is_late(new_flags);
+	if(new_is_late != is_late(old_flags_)) {
+		if(new_is_late)
+                  serv().late(*this);
+		else
+                  late::hide(*this);
+	}
+
+	bool new_is_zombie = is_zombie(new_flags);
+	if(new_is_zombie != is_zombie(old_flags_)) {
+		if(new_is_zombie)
+                  serv().zombie(*this);
+		else
+                  zombie::hide(*this);
+	}
+
+//
+//	if(is_to_check(new_flags) != is_to_check(old_flags_)) {
+//		if(is_to_check(new_flags))
+//                  serv().to_check(*this);
+//		else
+//                  to_check::hide(*this);
+//	}
+
+	old_flags_ = new_flags;
+	old_status_ = new_status;
+	old_tryno_ = new_try_no;
+}
+
+void task_node::aborted(std::ostream& f)
+{
+	if(status() == STATUS_ABORTED)
+	{
+		f << "task " << this << " is aborted";
+		long flg = flags();
+		int i = 0;
+		while(flg>0)
+		{
+			if(flg%2) 
+			{
+				f << " (" << ::ecf_flag_name[i] << ")";
+			}
+			flg /= 2;
+			i++;
+		}
+		f << "\n";
+	}
+	simple_node::aborted(f);
+}
+
+const char* task_node::html_page(url& u)
+{
+	return "node.html";
+}
+
+
+void task_node::html_name(FILE* f,url& u)
+{
+	node::html_name(f,u);
+}
+
+
+class cpp_translator: public url_translator {
+	re re_;
+	node* n_;
+public:
+	cpp_translator(node* n);
+	~cpp_translator();
+
+	virtual void save(FILE*,const char *line);
+};
+
+cpp_translator::cpp_translator(node* n):
+	re_("%([^%]+)$0%"),
+	n_(n)
+{
+}
+
+cpp_translator::~cpp_translator()
+{
+}
+
+void cpp_translator::save(FILE* f,const char *line)
+{
+	if(strncmp(line,"%manual",7) == 0)
+	{
+		fprintf(f,"<b>");
+		url_translator::save(f,line);
+		fprintf(f,"</b>");
+		fprintf(f,"<i>");
+		return;
+	}
+
+	if(strncmp(line,"%end",4) == 0)
+	{
+		fprintf(f,"</i>");
+		fprintf(f,"<b>");
+		url_translator::save(f,line);
+		fprintf(f,"</b>");
+		return;
+	}
+
+	if(strncmp(line,"%include",8) == 0)
+	{
+		fprintf(f,"<b>");
+		url_translator::save(f,line);
+		fprintf(f,"</b>");
+		return;
+	}
+
+
+	char val[1024];
+	char buf[1024];
+
+	strcpy(buf,line);
+	char *p = buf;
+	char *q;
+
+	while((q = re_.match(p,val)))
+	{
+		char *loc = re_.loc();
+		char w = *loc;
+		*loc = 0;
+		url_translator::save(f,p);
+		*loc = w;
+
+		node *n = n_->variableOwner(val);
+		if(n == 0) n = n_;
+
+		// TODO fprintf(f,"<b><a href=\"%s:%s\">%%",n->html_url(),val);
+		url_translator::save(f,val);
+		fprintf(f,"%%</a></b>");
+		p = q;
+	}
+
+	url_translator::save(f,p);
+}
+
+void task_node::html_script(FILE* f,url& u)
+{
+	cpp_translator cpp(this);
+	tmp_file tmp = serv().script(*this);
+	u.add(tmp,cpp);
+}
+
+void task_node::html_output(FILE* f,url& u)
+{
+	url_translator t;
+	tmp_file tmp = serv().output(*this);
+	u.add(tmp,t);
+}
+
+void task_node::html_job(FILE* f,url& u)
+{
+	url_translator t;
+	tmp_file tmp = serv().job(*this);
+	u.add(tmp,t);
+}
+
+void task_node::html_jobstatus(FILE* f,url& u)
+{
+	url_translator t;
+	std::string job    = variable("ECF_JOB");
+	std::string stat   = job + ".stat";
+	serv().jobstatus(*this, "");
+	tmp_file tmp (stat); 
+	u.add(tmp,t);
+}
diff --git a/ecflow_4_0_7/view/src/task_node.h b/ecflow_4_0_7/view/src/task_node.h
new file mode 100644
index 0000000..e1f4ee8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/task_node.h
@@ -0,0 +1,58 @@
+#ifndef task_node_H
+#define task_node_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "simple_node.h"
+
+class task_node : public simple_node {
+public:
+	task_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+	task_node(host& h,sms_node* n, char b);
+#endif
+	~task_node(); // Change to virtual if base class
+
+private:
+	task_node(const task_node&);
+	task_node& operator=(const task_node&);
+
+	virtual void adopt(node*);
+	virtual void create();
+	virtual void update(int,int,int);
+	virtual void check(int,int,int);
+	virtual void info(std::ostream&);
+
+	virtual void aborted(std::ostream&);
+	virtual void html_output(FILE*,url&);
+	virtual void html_script(FILE*,url&);
+	virtual void html_job(FILE*,url&);
+	virtual void html_jobstatus(FILE*,url&);
+	virtual void html_name(FILE*,url&);
+	virtual const char* html_page(url&);
+};
+
+class alias_node : public task_node {
+  void why(std::ostream&);
+public:
+	alias_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+	alias_node(host& h,sms_node* n, char b);
+#endif
+	~alias_node();
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/text_layout.cc b/ecflow_4_0_7/view/src/text_layout.cc
new file mode 100644
index 0000000..dfc7139
--- /dev/null
+++ b/ecflow_4_0_7/view/src/text_layout.cc
@@ -0,0 +1,123 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "text_layout.h"
+#include "node.h"
+#include "trigger_panel.h"
+#include "Hyper.h"
+#include "tmp_file.h"
+#include <stdio.h>
+#include "error.h"
+#include "trigger_lister.h"
+
+text_layout::text_layout(trigger_panel& t,Widget w):
+	layout(t,w)
+{
+}
+
+text_layout::~text_layout()
+{
+}
+
+void text_layout::clear()
+{
+	owner().forget_all();
+	HyperSetText(widget_,"");
+}
+
+struct info_lister : public trigger_lister {
+	panel& p_;
+	FILE* f_;
+	char* t_;
+	Boolean e_;
+public:
+	info_lister(panel& p,FILE* f,char *t,Boolean e) : p_(p),f_(f), t_(t), e_(e) {}	
+	void next_node(node& n, node*,int,node*);
+	Boolean parents() { return e_; }
+	Boolean kids() { return e_; }
+};
+
+void info_lister::next_node(node& n, node* p,int mode,node*)
+{
+	// Title 
+	if(t_) {
+			int n = fprintf(f_,"\n%s:\n",t_) - 2;
+			while(n--) fputc('-',f_);
+			fputc('\n',f_);
+			t_ = 0;
+	}
+
+	p_.observe(&n);
+	fprintf(f_,"%s {%s}",n.type_name(), n.full_name().c_str());
+	if(p) {
+		fprintf(f_," through ");
+		p_.observe(p);
+
+		switch(mode)
+		{
+			case trigger_lister::parent:  fprintf(f_,"parent "); break;
+			case trigger_lister::child:   fprintf(f_,"child ");  break;
+		}
+
+		fprintf(f_,"%s {%s}",p->type_name(),p->full_name().c_str());
+	}
+	fputc('\n',f_);
+}
+
+
+void text_layout::show(node& n)
+{
+    owner().forget_all();
+
+    tmp_file tmp(tmpnam(0));
+
+    FILE *f = fopen(tmp.c_str(),"w");
+
+    if(!f)
+    {
+        gui::syserr(tmp.c_str());
+        return;
+    }
+
+    info_lister i1(owner(),f,"Nodes triggering this node",owner().extended());
+    if(owner().triggers())
+      n.triggers(i1);
+    
+    info_lister i2(owner(),f,"Nodes triggered by this node",owner().extended());
+    if(owner().triggered())
+      n.triggered(i2);
+    
+    fclose(f);
+
+    HyperLoadFile(widget_,(char*)tmp.c_str());
+}
+
+void text_layout::adoption(observable*,observable*)
+{
+}
+
+void text_layout::gone(observable*)
+{
+}
+
+void text_layout::notification(observable*)
+{
+}
+
+void text_layout::reach(node* n1,node* n2)
+{
+	clear();
+	HyperSetText(widget_,"This functionality is only available in graphic mode.");
+}
diff --git a/ecflow_4_0_7/view/src/text_layout.h b/ecflow_4_0_7/view/src/text_layout.h
new file mode 100644
index 0000000..6704fd7
--- /dev/null
+++ b/ecflow_4_0_7/view/src/text_layout.h
@@ -0,0 +1,143 @@
+#ifndef text_layout_H
+#define text_layout_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+
+
+#ifndef layout_H
+#include "layout.h"
+#endif
+
+#ifndef observer_H
+#include "observer.h"
+#endif
+
+
+// 
+
+class text_layout : public layout, public observer {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	text_layout(trigger_panel&,Widget);
+
+// -- Destructor
+
+	~text_layout(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+
+// -- Overridden methods
+
+	virtual void show(node&);
+	virtual void clear();
+	virtual void reach(node*,node*);
+
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	text_layout(const text_layout&);
+	text_layout& operator=(const text_layout&);
+
+// -- Members
+	
+
+// -- Methods
+
+
+	void notification(observable*);
+	void adoption(observable*,observable*);
+	void gone(observable*);
+
+// -- Overridden methods
+
+	// From triigers_menu_c
+
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const text_layout& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(text_layout**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(text_layout);
+//#endif
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/text_lister.h b/ecflow_4_0_7/view/src/text_lister.h
new file mode 100644
index 0000000..d3c876f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/text_lister.h
@@ -0,0 +1,79 @@
+#ifndef text_lister_H
+#define text_lister_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <stdio.h>
+
+class node;
+
+class text_lister {
+public:
+  
+  text_lister() {}
+  
+  virtual node* source() const         = 0;
+  virtual void push(node*)           = 0;
+  // virtual void pusher(node*)           = 0;
+  virtual void push(const char*,...) = 0;
+  virtual void push(const std::string&) = 0;
+  virtual void endline()             = 0;
+  virtual void cancel()              = 0;
+  
+  virtual FILE* file()  { return 0; }
+
+private:
+
+  text_lister(const text_lister&);
+  text_lister& operator=(const text_lister&);
+};
+
+inline
+text_lister& operator<<(text_lister& s,int n) 
+{ s.push("%d",n); return s; }
+
+inline
+text_lister& operator<<(text_lister& s,char n)
+{ s.push("%c",n); return s; }
+
+inline
+text_lister& operator<<(text_lister& s,double n)
+{ s.push("%g",n); return s; }
+
+inline
+text_lister& operator<<(text_lister& s,const char* n)
+{ s.push("%s",n); return s; }
+inline
+text_lister& operator<<(text_lister& s,const std::string n)
+{ s.push("%s",n.c_str()); return s; }
+
+inline
+text_lister& operator<<(text_lister& s,node* n) 
+{ s.push(n); return s; }
+
+inline
+text_lister& operator<<(text_lister& s,node& n) 
+{ s.push(&n); return s; }
+
+inline
+text_lister& operator<<(text_lister& s, void (*proc)(text_lister&)) 
+{ proc(s); return s; }
+
+inline void cancel(text_lister& s)  { s.cancel();   }
+inline void endl(text_lister& s)    { s.endline();  }
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/text_window.cc b/ecflow_4_0_7/view/src/text_window.cc
new file mode 100644
index 0000000..24fe02e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/text_window.cc
@@ -0,0 +1,194 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "text_window.h"
+#include <string>
+#include "viewer.h"
+#include "fsb.h"
+#include "ask.h"
+#include "globals.h"
+#include <Xm/Text.h>
+extern "C" {
+#include "xec.h"
+}
+
+text_window::text_window(bool map_it):
+	file_(0,false),
+	text_map_(0),
+	map_it_(map_it)
+{
+#if 1
+	map_it_ = 0;
+#endif
+}
+
+
+text_window::~text_window()
+{
+	xec_UnmapText(text_map_);
+	text_map_ = 0;
+}
+
+void text_window::clear()
+{
+	find::hide();
+	xec_UnmapText(text_map_);
+	text_map_ = 0;
+	XmTextSetString(text(),"");
+	file_ = tmp_file(0,false);
+}
+
+
+void text_window::load(const tmp_file& x)
+{
+	file_ = x;
+	xec_UnmapText(text_map_); text_map_ = 0;
+	const int MAXLEN = 512;
+        char cmsg[MAXLEN];
+	snprintf(cmsg, MAXLEN, "Could not load file %s", file_.c_str());
+
+	if(file_.c_str())
+	{
+		int zeros = 0;
+		if(map_it_) {
+			text_map_ = xec_MapText(text(),file_.c_str(),&zeros);
+			if(text_map_ == 0)
+				XmTextSetString(text(),cmsg);
+			if(zeros) {
+				find::make(text());
+				find::message("This file contains %d null character%s.\n"
+					"The find will not work properly.",
+					zeros,
+					zeros>1?"s":""
+					);
+			}
+			else {
+				find::no_message();
+			}
+		}
+		else {
+			int err = xec_LoadText(text(),file_.c_str(),False);
+			if(err)
+			  XmTextSetString(text(),cmsg);
+		}
+	}
+	else
+	  XmTextSetString(text(),cmsg);
+}
+
+class text_viewer : public viewer {
+  tmp_file tmp_;
+public:
+     text_viewer(const tmp_file& t);
+};
+
+text_viewer::text_viewer(const tmp_file& t)
+ : tmp_(t)
+{
+  if (!tmp_.c_str()) return;
+  char buf[1024];
+  const char* xpager = getenv("XPAGER");
+  if (xpager)
+    sprintf(buf,"${XPAGER:=xterm -e more} %s",tmp_.c_str());
+  else
+    sprintf(buf,"xterm -e ${PAGER:=more} %s",tmp_.c_str());
+  FILE *f = popen(buf,"r");
+  if(!f) {
+    std::cerr << "# error: " << buf << "\n";
+    return;
+  }
+  start(f);
+}
+
+void text_window::open_viewer()
+{
+  new text_viewer(file_);
+}
+
+
+void text_window::search(const char* p,bool case_sens,bool regex,
+	bool back,bool wrap)
+{
+
+	bool  found = xec_TextSearch(text(),(char*)p,!case_sens,regex,back,
+		false,wrap);
+
+	if(!found)
+		message("Text not found");
+	else
+		no_message();
+}
+
+
+void text_window::open_search()
+{
+	find::raise(text());
+}
+
+
+//-------------------------------------------------------
+
+class text_saver : public viewer {
+     tmp_file tmp_;
+public:
+     text_saver(const tmp_file& t);
+};
+
+text_saver::text_saver(const tmp_file& t):
+   tmp_(t)
+{
+   const char* p = fsb::ask("Save as:");
+   if(p)
+   {
+	   char buf[2048];
+	   sprintf(buf,"cp %s %s 2>&1",tmp_.c_str(),p);
+	   show(buf);
+   }
+   else delete this;
+}
+
+void text_window::save()
+{
+ 	new text_saver(file_);
+}
+
+//-------------------------------------------------------
+
+class text_printer : public viewer {
+     tmp_file tmp_;
+public:
+     text_printer(const tmp_file& t);
+};
+
+text_printer::text_printer(const tmp_file& t):
+   tmp_(t)
+{
+   static option<str> cmd(globals::instance(),"print_command","lpr");
+	
+   str c = cmd;
+
+   if(ask::show(c,"Print command:"))
+   {
+	   cmd = c;
+	   char buf[2048];
+	   sprintf(buf,"%s %s 2>&1",c.c_str(),tmp_.c_str());
+	   show(buf);
+   }
+}
+
+void text_window::print()
+{
+ 	new text_printer(file_);
+}
diff --git a/ecflow_4_0_7/view/src/text_window.h b/ecflow_4_0_7/view/src/text_window.h
new file mode 100644
index 0000000..254b372
--- /dev/null
+++ b/ecflow_4_0_7/view/src/text_window.h
@@ -0,0 +1,65 @@
+#ifndef text_window_H
+#define text_window_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef find_H
+#include "find.h"
+#endif
+
+#ifndef tmp_file_H
+#include "tmp_file.h"
+#endif
+
+
+class text_window : public find {
+public:
+
+	text_window(bool);
+
+	~text_window(); // Change to virtual if base class
+
+	void load(const tmp_file&);
+	void clear();
+
+	void print();
+	void save();
+
+	virtual Widget text()  = 0;
+
+protected:
+
+	void open_search();
+	void open_viewer();
+
+	virtual void search(const char*,bool,bool,bool,bool);
+
+private:
+
+	text_window(const text_window&);
+	text_window& operator=(const text_window&);
+
+	tmp_file file_;
+	void*    text_map_;
+	bool     map_it_;
+
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/time.cc b/ecflow_4_0_7/view/src/time.cc
new file mode 100644
index 0000000..4990fdc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/time.cc
@@ -0,0 +1,163 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #14 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <string>
+#include "time_node.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+#ifdef BRIDGE
+
+static char *week[] = {
+  (char*)"sunday",(char*) "monday",(char*)"tueday",
+  (char*)"wednesday",(char*)"thursday", (char*)"friday",
+  (char*)"saturday"};
+
+static char *month[] = { 
+  (char*)"january", (char*)"february", (char*)"march", 
+  (char*)"april", (char*)"may", (char*)"june",
+  (char*)"july", (char*)"august", (char*)"september", 
+  (char*)"october", (char*)"november", (char*)"december",
+};
+
+static char* ext[] = {
+  (char*)"st",(char*)"nd",(char*)"rd",(char*)"th",(char*)"th",
+  (char*)"th",(char*)"th",(char*)"th",(char*)"th",(char*)"th",
+  (char*)"th",(char*)"th",(char*)"th",(char*)"th",(char*)"th",
+  (char*)"th",(char*)"th",(char*)"th",(char*)"th",(char*)"th",
+  (char*)"st",(char*)"nd",(char*)"rd",(char*)"th",(char*)"th",
+  (char*)"th",(char*)"th",(char*)"th",(char*)"th",(char*)"th",
+  (char*)"st", 
+};
+
+time_node::time_node(host& h,sms_node* n, char b) 
+  : node(h,n,b)
+  , time_("time")
+{
+}
+#endif
+
+time_node::time_node(host& h,ecf_node* n) 
+  : node(h,n)
+  , time_("time")
+{
+  full_name_ = parent()->full_name();
+  full_name_ += ":";
+  if (owner_) full_name_ += owner_->toString();
+}
+
+char* time_node::string(char* s)
+{
+  s[0] = 0; 
+#ifdef BRIDGE
+  if (tree_) {
+  sms_time *t = (sms_time*)tree_;
+	
+	char buf[1024];
+	s[0] = 0;
+
+	sprintf(buf,t->hour[0]<0?"*":"%02d",t->hour[0]);
+	strcat(s,buf);
+
+	strcat(s,":");
+
+	sprintf(buf,t->minute[0]<0?"*":"%02d",t->minute[0]);
+	strcat(s,buf);
+
+	if(t->repeat)
+	{
+		sprintf(buf," to %02d:%02d",t->hour[1],t->minute[1]);
+		strcat(s,buf);
+
+		sprintf(buf," by %02d:%02d",t->hour[2],t->minute[2]);
+		strcat(s,buf);
+	}
+
+
+	if(t->iscron)
+	{
+		long w = t->weekdays;
+		int n = 0;
+		while(w)
+		{
+			if(w%2) 
+			{
+				sprintf(buf," %s",week[n]);
+				strcat(s,buf);
+			}
+			w >>= 1;
+			n++;
+		}
+
+		w = t->monthdays;
+		n = 0;
+		while(w)
+		{
+			if(w%2)
+			{
+				sprintf(buf," %d%s",n+1,ext[n]);
+				strcat(s,buf);
+			}
+			n++;
+			w >>= 1;
+		}
+
+		w = t->months;
+		n = 0;
+		while(w)
+		{
+			if(w%2) 
+			{
+				sprintf(buf," %s",month[n]);
+				strcat(s,buf);
+			}
+			w >>= 1;
+			n++;
+		}
+	}
+	return s;
+}
+#endif
+  if (owner_) { sprintf(s, owner_->toString().c_str()); return s; }
+  return s;
+}
+
+xmstring time_node::make_label_tree()
+{
+  char s[1024];
+#ifdef BRIDGE
+  sms_time *t = (sms_time*)tree_;
+  if (t && t->iscron)
+    {
+      xmstring c("cron: ","bold");
+      xmstring x(this->string(s));
+      return c + x;
+    }
+#endif 
+  return xmstring(this->string(s));
+}
+
+void time_node::perlify(FILE* f) 
+{
+	char buf[1034];
+	perl_member(f,"value",string(buf));
+}
+
+node* time_node::graph_node()
+{
+  return &dummy_node::get(full_name());
+}
diff --git a/ecflow_4_0_7/view/src/time_node.h b/ecflow_4_0_7/view/src/time_node.h
new file mode 100644
index 0000000..246343c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/time_node.h
@@ -0,0 +1,49 @@
+#ifndef TIME_H
+#define TIME_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #10 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+#include "node.h"
+#include "show.h"
+#include "dummy_node.h"
+
+class time_node : public node {
+  std::string time_, full_name_;
+	virtual node* graph_node();
+
+	virtual bool is_my_parent(node*) const { return false; }
+	virtual void info(std::ostream&) {}
+
+	virtual xmstring make_label_tree();
+	virtual xmstring make_label_trigger() {
+		return make_label_tree();
+	}
+
+	virtual const std::string& name()  const        { return time_; }
+	const std::string& full_name() const { return full_name_; }
+	virtual Boolean menus()       { return False;      }
+	virtual Boolean selectable() { return False;      }
+
+	virtual Boolean visible() const { return show::want(show::time); }
+
+	char* string(char*);
+	virtual void perlify(FILE*);
+
+public:
+	time_node(host& h,ecf_node* n);
+#ifdef BRIDGE
+	time_node(host& h,sms_node* n, char b);
+#endif
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/timeout.cc b/ecflow_4_0_7/view/src/timeout.cc
new file mode 100644
index 0000000..32ae490
--- /dev/null
+++ b/ecflow_4_0_7/view/src/timeout.cc
@@ -0,0 +1,86 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "ecflowview.h"
+#include "timeout.h"
+
+extern XtAppContext app_context;
+
+void timeout::timeoutCB(XtPointer data,XtIntervalId* id)
+{
+  timeout* t = (timeout*)data;
+  
+  if(t->actived_) 
+    {
+      t->running_ = True;
+      t->run();
+      t->running_ = False;
+    }
+  
+  if(t->actived_) 
+    t->id_ = XtAppAddTimeOut(app_context,t->frequency_*1000,timeoutCB,t);
+}
+
+timeout::timeout(double frequency):
+  actived_(False),
+  frequency_(frequency),
+  id_(0),
+  running_(False)
+{
+}
+
+timeout::~timeout()
+{
+  disable();
+}
+
+void timeout::enable()
+{
+  if(!actived_ && app_context)
+    {
+      id_      = XtAppAddTimeOut(app_context,frequency_*1000,timeoutCB,this);
+      actived_ = True;
+    }
+}
+
+
+void timeout::disable()
+{
+  if(actived_ && id_)
+    {
+      XtRemoveTimeOut(id_);
+      id_      = 0;
+      actived_ = False;
+    }
+}
+
+void timeout::frequency(double n)
+{
+  frequency_ = n;
+  if(!running_ && actived_)
+    {
+      disable();
+      enable();
+    }
+}
+
+void timeout::drift(double n,double maximum)
+{
+  double x = frequency_ + n;
+  if(x>maximum) x = maximum;
+  frequency(x);
+}
+
+IMP(timeout)
diff --git a/ecflow_4_0_7/view/src/timeout.h b/ecflow_4_0_7/view/src/timeout.h
new file mode 100644
index 0000000..264272b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/timeout.h
@@ -0,0 +1,53 @@
+#ifndef timeout_H
+#define timeout_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <Xm/Xm.h>
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+class timeout : public extent<timeout> {
+public:
+
+	timeout(double);
+
+	virtual ~timeout(); // Change to virtual if base class
+
+	void enable();
+	void disable();
+	void frequency(double);
+	void drift(double,double);
+
+	virtual void run() = 0;
+
+private:
+
+	timeout(const timeout&);
+	timeout& operator=(const timeout&);
+
+	Boolean actived_;
+	double frequency_;
+	XtIntervalId id_;
+	int running_;
+
+	static void timeoutCB(XtPointer,XtIntervalId*);
+
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/timetable_panel.cc b/ecflow_4_0_7/view/src/timetable_panel.cc
new file mode 100644
index 0000000..2cdea84
--- /dev/null
+++ b/ecflow_4_0_7/view/src/timetable_panel.cc
@@ -0,0 +1,731 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #7 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdlib.h>
+#include "arch.h"
+#include "timetable_panel.h"
+#include "node.h"
+#include "host.h"
+#include "fsb.h"
+#include "gui.h"
+#include "xnode.h"
+#include "xmstring.h"
+#include "globals.h"
+#include "tmp_file.h"
+#include <Xm/Text.h>
+#include <Xm/ToggleB.h>
+
+#include "log_event.h"
+extern "C" {
+#include "SimpleTime.h"
+#include "Hyper.h"
+}
+
+namespace timetatble_status {
+const char *status_name[10]
+  = { "unknown", "suspended", "complete", "queued", "submitted", "active",
+      "aborted", "shutdown",  "halted"  ,  NULL };
+}
+
+extern "C" {
+#include "xec.h"
+}
+static void date2str(char* buf,const DateTime& dt)
+{
+	int ddd = dt.date;
+	int ttt = dt.time;
+
+	int yy = ddd / 10000; ddd %= 10000;
+	int mm = ddd / 100; ddd %= 100;
+	int dd = ddd;
+	int HH = ttt / 10000; ttt %= 10000;
+	int MM = ttt / 100; ttt %= 100;
+        int ss = ttt ;
+	sprintf(buf,"%04d-%02d-%02d %02d:%02d:%02d", 
+		yy,mm,dd,HH,MM,ss);
+}
+
+
+static int sec2str(char* buf,int s)
+{
+	buf[0] = 0;
+	if(s) {
+			
+		long x = s>0?s:-s;
+		long n;
+		char sec[20];
+		char min[20];
+		char hou[20];
+		char day[20];
+
+		*sec = *min = *hou = *day = 0;
+		if((n = x % 60)) sprintf(sec,"%ld sec ",n);
+		x /= 60;
+		if((n = x % 60)) sprintf(min,"%ld min ",n);
+		x /= 60;
+		if((n = x % 24)) sprintf(hou,"%ld hour ",n);
+		x /= 24;
+		if((n = x)) sprintf(day,"%ld day ",n);
+
+		sprintf(buf,"%s%s%s%s", day,hou,min,sec);
+	}
+	return s;
+}
+
+static int range2str(char* buf,const DateTime& dt1,const DateTime& dt2)
+{
+	return sec2str(buf,TimeDiff(dt1,dt2));
+}
+
+static void date2widget(Widget w,DateTime& x)
+{
+	char buf[80];
+	if(x == kSmallDate)
+		strcpy(buf,"-infinite");
+	else if(x == kLargeDate)
+		strcpy(buf,"+infinite");
+	else
+	{
+		TimeAdd(&x,0);
+		date2str(buf,x);
+	}
+
+	XmTextSetString(w,buf);
+}
+
+class timetable_node : public xnode {
+#if 1
+	// important: and alos in log_event
+	void notification(observable*)        { redraw(); }
+	void adoption(observable* o,observable* n) { node_ = (node*)n; }
+	void gone(observable*)                { owner_.remove(this); delete this; }
+#endif
+protected:
+	timetable_panel& owner_;
+	log_event*       event_;
+public:
+	timetable_node(Widget w,timetable_panel& t,log_event* e);
+	virtual ~timetable_node();
+	log_event* event() { return event_; }
+    	virtual DateTime date() { return event_->time();  }
+	virtual char* text(char* b) { return event_->text(b); }
+	virtual bool is_name() { return false; }
+	virtual bool change_fold() {  return false; }
+};
+
+timetable_node::timetable_node(Widget w,timetable_panel& o,log_event* e): 
+	xnode(e->get_node()), owner_(o), event_(e) 
+{ 
+	event_->attach();
+}
+
+timetable_node::~timetable_node()
+{
+	event_->detach();
+}
+
+//====================================================================
+
+class time_event_node : public timetable_node {
+protected:
+
+	void draw(Widget w,XRectangle* r) { event_->draw(w,r); }
+	void size(Widget w,XRectangle* r) { event_->size(w,r); }
+	
+public:
+	time_event_node(Widget w,timetable_panel&,log_event*);
+	~time_event_node() {}
+};
+
+time_event_node::time_event_node(Widget w,timetable_panel& o,log_event* e):
+	timetable_node(w,o,e)
+{
+	TimeSetTime(w,getBox(w),e->time());
+}
+
+//====================================================================
+
+class time_name_node : public timetable_node {
+	bool fold_;
+    void draw(Widget w,XRectangle* r);
+	void size(Widget w,XRectangle* r);
+public:
+	time_name_node(Widget w,timetable_panel&,log_event*);
+	~time_name_node() {}
+	virtual char* text(char* b) { 
+	  strcpy(b,node_->full_name().c_str());return b; }
+	virtual bool is_name() { return true; }
+	virtual bool change_fold() {  fold_ = !fold_; redraw(); return fold_; }
+};
+
+time_name_node::time_name_node(Widget w,timetable_panel& o,log_event* e):
+	timetable_node(w,o,e),
+	fold_(false)
+{ 
+	node_ = e->owner();
+	getBox(w);
+}
+
+void time_name_node::draw(Widget w,XRectangle* r)
+{
+  xmstring s(node_->full_name().c_str(),fold_?"bold":"normal");
+
+	XmFontList f = gui::tinyfont();
+    XmStringDraw(XtDisplay(w),XtWindow(w),
+        f,
+        s,
+        gui::blackGC(),
+        r->x,
+        r->y,
+        r->width,
+        XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, r);
+}
+
+void time_name_node::size(Widget w,XRectangle* r)
+{
+        xmstring s(node_->full_name().c_str(),fold_?"bold":"normal");
+
+	XmFontList f = gui::tinyfont();
+	r->width    = XmStringWidth(f,s);
+	r->height   = XmStringHeight(f,s);
+}
+
+
+//====================================================================
+
+timetable_panel::timetable_panel(panel_window& w):
+	panel(w),
+	last_(kSmallDate),
+	min_time_(kSmallDate),
+	max_time_(kLargeDate)
+{
+	sorted_by_time_ = globals::get_resource("timeline_sorted_by_time",false);
+	tasks_only_     = globals::get_resource("timeline_tasks_only",false);
+}
+
+timetable_panel::~timetable_panel()
+{
+	 clear();
+}
+
+void timetable_panel::create(Widget parent, char *widget_name )
+{
+	timetable_form_c::create(parent,widget_name);
+
+	add_input_CB();
+
+	date2widget(from_,min_time_);
+	date2widget(to_,max_time_);
+
+	XmToggleButtonSetState(by_time_,sorted_by_time_,False);
+	XmToggleButtonSetState(by_name_,!sorted_by_time_,False);
+
+	XmToggleButtonSetState(all_,!tasks_only_,False);
+	XmToggleButtonSetState(tasks_,tasks_only_,False);
+}
+
+void timetable_panel::clear()
+{
+	NodeReset(time_);
+	for(int i = 0; i < nodes_.count(); i++) 
+		delete nodes_[i];
+	nodes_.clear();
+	XmTextSetString(file_,"");
+ 	last_ = kSmallDate;
+	depend::hide();
+}
+
+void timetable_panel::show(node& n)
+{
+	clear();
+	reload(false);
+}
+
+void timetable_panel::reload(bool reset)
+{
+  if(get_node())
+    load(get_node()->serv().timefile().c_str(),reset);
+  else 
+    clear();
+}
+
+void timetable_panel::changed(node& n)
+{
+}
+
+void timetable_panel::remove(timetable_node *t)
+{
+	nodes_.remove(t);
+}
+
+void timetable_panel::next(log_event* n)
+{
+	if(n->time() < min_time_ || n->time() > max_time_)
+		return;
+
+	if(tasks_only_ && n->owner()->type() != NODE_TASK) return;
+
+	time_event_node *t = new time_event_node(time_,*this,n);
+	int c = nodes_.count();
+	bool found = false;
+
+	for(int i = c-1 ; i >= 0; i--)
+		if(nodes_[i]->event()->owner() == n->owner())
+		{
+			nodes_[i]->relation(t);
+			found = true;
+			break;
+		}
+
+	if(!found) {
+		time_name_node *x = new time_name_node(time_,*this,n);
+		nodes_.add(x);
+		x->relation(t);
+		x->visibility(true);
+	}
+
+	t->visibility(true);
+	nodes_.add(t);
+
+}
+
+Boolean timetable_panel::enabled(node& n)
+{
+	return TRUE; 
+}
+
+struct sort_by_name : public event_sorter {
+public:
+	int compare(log_event* a,log_event* b) {
+		char sa[1024];
+		char sb[1024];
+
+		node *nodea = a->get_node();
+		node *nodeb = b->get_node();
+
+		const char *ca = nodea ? nodea->full_name().c_str() : "none";
+		const char *cb = nodeb ? nodeb->full_name().c_str() : "none";
+
+		strcpy(sa,ca);
+		strcpy(sb,cb);
+		return strcmp(sa,sb);
+	}
+};
+
+struct sort_by_time : public event_sorter {
+public:
+	int compare(log_event* a,log_event* b) {
+		return TimeDiff(a->time(),b->time());
+	}
+};
+
+
+static DateTime widget2date(Widget w)
+{
+	char *p = XmTextGetString(w);
+	char buf[80];
+	char *q = p;
+	int i = 0;
+	int j = 0;
+
+	while(*q)
+	{
+		if(*q >= '0' && *q <= '9') buf[i++] = *q;
+		if(*q == ' ') { buf[i++] = 0; j = i; }
+		q++;
+	}
+
+	buf[i] = 0;
+	XtFree(p);
+
+	DateTime dt;
+	dt.date = atol(buf);
+	dt.time = atol(buf+j);
+
+	TimeAdd(&dt,0);
+
+	return dt;
+}
+
+void timetable_panel::load(const char* fname,bool reset)
+{
+	clear();
+	if(get_node())
+	{
+		str path = fname;
+
+		if(!reset && path != get_node()->serv().timefile()) 
+			path = path + str(" ") + str(fname);
+
+		get_node()->serv().timefile(path);
+
+		min_time_ = widget2date(from_);
+		max_time_ = widget2date(to_);
+
+		if(min_time_ < kSmallDate) min_time_ = kSmallDate;
+		if(max_time_ < kSmallDate) max_time_ = kLargeDate;
+
+		date2widget(from_,min_time_);
+		date2widget(to_,max_time_);
+
+
+		XmTextSetString(file_,(char*)path.c_str());
+		log_event::load(get_node()->serv(),path.c_str(),reset);
+
+
+		if(sorted_by_time_)
+		{
+			sort_by_time sbt;
+			log_event::sort(sbt);
+		}
+		else
+		{
+			sort_by_name sbn;
+			log_event::sort(sbn);
+		}
+
+		log_event::scan(get_node(),*this);
+
+	}
+}
+
+void timetable_panel::load(bool reset)
+{
+	const char* p = 0;
+	if((p = fsb::ask("Load a timefile")))
+		load(p,reset);
+}
+
+void timetable_panel::chooseCB( Widget, XtPointer data)
+{
+	load(true);
+}
+
+void timetable_panel::loadCB( Widget, XtPointer data)
+{
+	load(true);
+}
+
+void timetable_panel::mergeCB( Widget, XtPointer data)
+{
+	load(false);
+}
+
+void timetable_panel::activateCB(Widget w, XtPointer data)
+{
+	char* p = XmTextGetString(file_);
+	load(p, w == file_);
+	str s(p);
+	XtFree(p);
+}
+
+
+void timetable_panel::updateCB( Widget, XtPointer data)
+{
+	reload(true);
+}
+
+
+void timetable_panel::hyperCB(Widget w, XtPointer data)
+{
+	panel::hyper(w,data);
+}
+
+static int compare(const void* a,const void *b)
+{
+	timetable_node** ta = (timetable_node**)a;
+	timetable_node** tb = (timetable_node**)b;
+
+	return TimeDiff( (*ta)->event()->time(), (*tb)->event()->time());
+}
+
+void timetable_panel::raw_click1(XEvent* e,xnode* x)
+{
+	char buf[1024];
+
+	if(x == 0) x = (xnode*)TimeFindByY(time_,e); 
+
+	timetable_node* t = main((timetable_node*)x);
+	if(!t) return;
+
+
+	node *m = t->get_node();
+
+	tmp_file tmp(tmpnam(0));
+	FILE *f = fopen(tmp.c_str(),"w");
+	if(!f) return;
+
+	range(t,dt1_,dt2_);
+
+	if (m) fprintf(f,"{%s}",m->full_name().c_str());
+	if(range2str(buf,dt1_,dt2_))
+		fprintf(f," total time: %s",buf);
+	fprintf(f,"\n\n");
+
+	timetable_node** nodes = new timetable_node*[nodes_.count()];
+	int count = 0;
+        int i;
+
+	for(i = 0; i < nodes_.count(); i++)
+		if(!nodes_[i]->is_name() && nodes_[i]->event()->owner() == m)
+			nodes[count++] = nodes_[i];
+
+	qsort(nodes,count,sizeof(nodes[0]),compare);
+
+
+	bool ok = false;
+	int elapsed[STATUS_MAX];
+	for(i = 0; i < STATUS_MAX; i++)
+		elapsed[i] = 0;
+
+	int prev_i = -1;
+
+	for(i = 0; i < count; i++)
+	{
+		date2str(buf,nodes[i]->event()->time());
+		fprintf(f,"%s",buf);
+		fprintf(f," %s",nodes[i]->text(buf));
+
+		if(i)
+		{
+			if(range2str(buf,
+				nodes[i-1]->event()->time(),
+				nodes[i]->event()->time()))
+					fprintf(f," (%slater)",buf);
+
+		}
+
+		if(prev_i >= 0 && nodes[i]->event()->status() >= 0) 
+		{
+			elapsed[nodes[prev_i]->event()->status()] += 
+				TimeDiff(nodes[i]->event()->time(), 
+					 nodes[prev_i]->event()->time());
+			ok = true;
+		}
+
+		int s = nodes[i]->event()->status();
+		if(s >= 0) prev_i = i;
+
+		fprintf(f,"\n");
+	}	
+
+	delete[] nodes;
+
+	if(ok) {
+		fprintf(f,"\nSummary:");
+		fprintf(f,"\n--------\n");
+
+		for(i = 0; i < STATUS_MAX; i++)
+		  if(elapsed[i])
+		    {
+		      sec2str(buf,elapsed[i]);
+		      fprintf(f,"%-10s: %s\n",timetatble_status::status_name[i],buf);
+		    }
+	}
+
+	fclose(f);
+	depend::make(widget());
+	HyperLoadFile(hyper_,(char*)tmp.c_str());
+	depend::raise(widget());
+}
+
+void timetable_panel::setToCB(Widget,XtPointer)
+{
+	date2widget(to_,dt2_);
+	reload(false);
+}
+
+void timetable_panel::setFromCB(Widget,XtPointer)
+{
+	date2widget(from_,dt1_);
+	reload(false);
+}
+
+void timetable_panel::setBothCB(Widget,XtPointer)
+{
+	date2widget(from_,dt1_);
+	date2widget(to_,dt2_);
+	reload(false);
+}
+
+void timetable_panel::resetCB(Widget w,XtPointer d)
+{
+	dt1_ = kSmallDate; dt2_ = kLargeDate;
+	setBothCB(w,d);
+}
+
+void timetable_panel::raw_click2(XEvent* e,xnode* x)
+{
+	timetable_node *t = (timetable_node*)x;
+
+	if(t && t->is_name())
+	{
+		node *m = t->get_node();
+		bool x = !t->change_fold();
+
+		for(int i = 0; i < nodes_.count(); i++)
+			if(nodes_[i]->get_node() != m)
+			  if(nodes_[i]->get_node())
+			    if(nodes_[i]->get_node()->is_my_parent(m))
+			      nodes_[i]->visibility(x);
+		NodeUpdate(time_);
+	}
+	else {
+	}
+}
+
+timetable_node* timetable_panel::main(timetable_node* t)
+{
+	if(!t) return 0;
+
+	node *m = t->get_node();
+	for(int i = 0; i < nodes_.count(); i++)
+		if(nodes_[i]->is_name() && nodes_[i]->get_node() == m)
+			return nodes_[i];
+	return 0;
+}
+
+
+
+void timetable_panel::range(timetable_node* z,DateTime& dt1,DateTime& dt2)
+{	
+
+	dt1 = dt2 = z->event()->time();
+
+	if(z->is_name())
+	{
+
+		node *m = z->get_node();
+
+		for(int i = 0; i < nodes_.count(); i++)
+			if(!nodes_[i]->is_name() && nodes_[i]->get_node() == m)
+			{
+				DateTime t = nodes_[i]->event()->time();
+				if(t < dt1) dt1 = t;
+				if(t > dt2) dt2 = t;
+			}
+	}
+
+}
+	
+void timetable_panel::raw_click3(XEvent* e,xnode* x)
+{
+	char buf[1024];
+
+
+	timetable_node* z = (timetable_node*)x;
+
+	xmstring s("-");
+	static xmstring cr("\n");
+
+	XtUnmanageChild(set_both_);
+	XtManageChild(set_to_);
+	XtManageChild(set_from_);
+
+
+	if(z) {
+
+		z->text(buf);
+		range(z,dt1_,dt2_);
+
+		s = xmstring(buf);
+
+		if(z->is_name())
+		{
+			date2str(buf,dt1_);
+			s += cr;
+			s += xmstring("From   : ","bold");
+			s += xmstring(buf);
+
+			date2str(buf,dt2_);
+			s += cr;
+			s += xmstring("To     : ","bold");
+			s += xmstring(buf);
+
+			if(range2str(buf,dt1_,dt2_))
+			{
+				s += cr;
+				s += xmstring("Elapsed: ","bold");
+				s += xmstring(buf);
+			}
+
+			XtManageChild(set_both_);
+			XtUnmanageChild(set_to_);
+			XtUnmanageChild(set_from_);
+
+		}
+		else {
+
+			date2str(buf,dt1_);
+			s = xmstring(buf) + cr + s;
+
+			if(last_ != kSmallDate)
+			{
+				if(range2str(buf,last_,dt1_))
+				{
+					s += cr;
+					s += xmstring("From last click: ","bold");
+					s += xmstring(buf);
+				}
+			}
+
+			last_ = dt1_;
+
+		}
+	}
+	else {
+		TimeEventTime(time_,e,&dt1_);
+		date2str(buf,dt1_);
+		s = xmstring(buf);
+		dt2_  = dt1_;
+		last_ = kSmallDate;
+	}
+
+	XtVaSetValues(label_, XmNlabelString, XmString(s), NULL);
+
+	node_window::raw_click3(e,0);		
+}
+
+
+Widget timetable_panel::menu1()
+{
+	return menu_;
+}
+
+Widget timetable_panel::menu2()
+{
+    return menu1();
+}
+
+xnode* timetable_panel::xnode_of(node& n)
+{
+#if 0
+    for(int i = 0; i < nodes_.count(); i++)
+        if(nodes_[i]->get_node() == &n)
+            return nodes_[i];
+#endif
+    return 0;
+}
+
+void timetable_panel::optionsCB(Widget,XtPointer)
+{
+	globals::set_resource("timeline_sorted_by_time",
+		sorted_by_time_ = XmToggleButtonGetState(by_time_));
+
+	globals::set_resource("timeline_tasks_only",
+		tasks_only_ = XmToggleButtonGetState(tasks_));
+
+	reload(false);
+}
diff --git a/ecflow_4_0_7/view/src/timetable_panel.h b/ecflow_4_0_7/view/src/timetable_panel.h
new file mode 100644
index 0000000..5fbb4cb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/timetable_panel.h
@@ -0,0 +1,123 @@
+#ifndef timetable_panel_H
+#define timetable_panel_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uitimetable.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef node_window_H
+#include "node_window.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifndef array_H
+#include "array.h"
+#endif
+
+#ifndef log_event_H
+#include "log_event.h"
+#endif
+
+#ifndef depend_H
+#include "depend.h"
+#endif
+
+class layout;
+class host;
+class timetable_node;
+
+class timetable_panel : public panel
+  , public node_window
+  , public depend
+  , public event_lister
+  , public timetable_form_c {
+public:
+
+	timetable_panel(panel_window&);
+
+	~timetable_panel(); // Change to virtual if base class
+
+	void remove(timetable_node*);
+
+	virtual void create (Widget parent, char *widget_name = NULL);
+	virtual void show(node&);
+	virtual void changed(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual const char* name() const { return "Time line"; }
+	virtual Widget widget() { return timetable_form_c::xd_rootwidget(); }
+	virtual Widget tools() { return tools_; }
+
+private:
+
+	timetable_panel(const timetable_panel&);
+	timetable_panel& operator=(const timetable_panel&);
+
+	array<timetable_node*> nodes_;
+
+	DateTime last_;
+	DateTime min_time_;
+	DateTime max_time_;
+	
+	bool sorted_by_time_;
+	bool tasks_only_;
+
+	DateTime dt1_;
+	DateTime dt2_;
+
+	void load(bool);
+	void load(const char*,bool);
+	timetable_node* add(log_event*);
+	void range(timetable_node*,DateTime&,DateTime&);
+	timetable_node* main(timetable_node*);
+
+	void reload(bool);
+
+	virtual void chooseCB( Widget, XtPointer );
+	virtual void loadCB( Widget, XtPointer );
+	virtual void mergeCB( Widget, XtPointer );
+	virtual void updateCB( Widget, XtPointer );
+	virtual void activateCB( Widget, XtPointer );
+	virtual void optionsCB( Widget, XtPointer );
+
+	virtual void setFromCB( Widget, XtPointer );
+	virtual void setToCB( Widget, XtPointer );
+	virtual void setBothCB( Widget, XtPointer );
+	virtual void resetCB( Widget, XtPointer );
+	virtual void hyperCB( Widget, XtPointer );
+
+	// From node_window
+	virtual xnode* xnode_of(node &);
+	virtual Widget node_widget() { return time_; }
+	virtual Widget menu1();
+	virtual Widget menu2();
+
+	virtual void raw_click1(XEvent*,xnode*);
+	virtual void raw_click2(XEvent*,xnode*);
+	virtual void raw_click3(XEvent*,xnode*);
+
+	virtual void next(log_event*);
+};
+
+inline void destroy(timetable_panel**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/tip.cc b/ecflow_4_0_7/view/src/tip.cc
new file mode 100644
index 0000000..c46f47b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/tip.cc
@@ -0,0 +1,114 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #9 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <X11/IntrinsicP.h>
+#include <Xm/Xm.h>
+#include <Xm/PushB.h>
+#include <stdio.h>
+#include "tip.h"
+#include "gui.h"
+#include "pixmap.h"
+extern "C" {
+#include "xec.h"
+}
+
+tip::tip(Widget w):
+	timeout(0.5),
+	in_(false),
+	widget_(w)
+{
+  if(XmIsPushButton(w)) {
+    XtAddEventHandler(w,EnterWindowMask,False,enterCB,this);
+    XtAddEventHandler(w,LeaveWindowMask|ButtonPressMask,False,leaveCB,this);
+  }
+  
+  create(gui::top(),NULL);
+  xec_SetLabel(label_,XtName(w));
+  XtRealizeWidget(_xd_rootwidget);
+
+  pixmap::find(XtName(w)).set_label(w);
+}
+
+tip::~tip()
+{
+}
+
+void tip::enter()
+{
+  if (1) { 
+    in_ = true; 
+    enable(); 
+  }
+  else 
+    in_ = false;
+}
+
+void tip::leave()
+{
+  in_ = false;
+  disable();
+  XUnmapWindow(XtDisplay(_xd_rootwidget),XtWindow(_xd_rootwidget));
+}
+
+void tip::enterCB(Widget w,XtPointer data,XEvent*,Boolean*)
+{
+  ((tip*)data)->enter();
+}
+
+void tip::leaveCB(Widget w,XtPointer data,XEvent*,Boolean*)
+{
+  ((tip*)data)->leave();
+}
+
+#include <Xm/XmP.h>
+
+void tip::makeTips(Widget w)
+{
+  CompositeWidget c = (CompositeWidget)w;
+  for(unsigned int i = 0 ; i < c->composite.num_children; i++)
+    {
+      Widget p = c->composite.children[i];
+      if(XmIsPushButton(p))	new tip(p);
+      // else { printf("# xtname: %s\n", XtName(p)); new tip(p); }
+    }
+}
+
+void tip::run()
+{
+  Position x,y;	
+  Dimension h,w,lw,lh;
+  XmString  ls;
+
+  if (widget_==NULL) return;  
+  XtTranslateCoords(widget_,0,0,&x,&y);
+  
+  if (0) {
+    XtVaGetValues(widget_,XmNheight,&h,NULL);
+    XtVaSetValues(tip_shell,XmNx,x,XmNy,y + h, NULL);
+  } else {
+    XmFontList fl = NULL;
+    XtVaGetValues(widget_, XmNfontList, &fl, NULL);
+    if (fl == NULL) return; /* ??? 20120119 */    
+    ls = XmStringCreateSimple(XtName(widget_));
+    lw = XmStringWidth(fl,  ls)+6;
+    lh = XmStringHeight(fl, ls)+6;
+    XmStringFree(ls);
+    XtVaGetValues(widget_,XmNheight,&h,XmNwidth,&w,NULL);
+    XtVaSetValues(tip_shell, XmNx,x + w,XmNy,y + h, 
+		  XmNwidth,lw,XmNheight,lh,NULL);
+  }
+  XMapRaised(XtDisplay(_xd_rootwidget),XtWindow(_xd_rootwidget));
+  disable();
+}
diff --git a/ecflow_4_0_7/view/src/tip.h b/ecflow_4_0_7/view/src/tip.h
new file mode 100644
index 0000000..23df961
--- /dev/null
+++ b/ecflow_4_0_7/view/src/tip.h
@@ -0,0 +1,52 @@
+#ifndef tip_H
+#define tip_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef timeout_H
+#include "timeout.h"
+#endif
+
+#include "uitip.h"
+
+class tip : public timeout, public tip_shell_c {
+public:
+
+	tip(Widget);
+
+	~tip(); // Change to virtual if base class
+
+	static void makeTips(Widget);
+
+private:
+
+	tip(const tip&);
+	tip& operator=(const tip&);
+
+	Boolean in_;
+	Widget  widget_;
+
+	void enter();
+	void leave();
+	void run();
+	
+	static void enterCB(Widget,XtPointer,XEvent*,Boolean*);
+	static void leaveCB(Widget,XtPointer,XEvent*,Boolean*);
+};
+
+inline void destroy(tip**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/tmp_file.cc b/ecflow_4_0_7/view/src/tmp_file.cc
new file mode 100644
index 0000000..14b4f0b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/tmp_file.cc
@@ -0,0 +1,109 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "tmp_file.h"
+#include <iostream>
+#include <fstream>
+#include <ecflowview.h>
+
+tmp_file_imp::tmp_file_imp(const char* p,bool del):
+	str_(p ? strdup(p) : 0),
+	del_(del)
+{
+}
+
+tmp_file_imp::~tmp_file_imp()
+{
+  if(str_) {
+    if(del_) { 
+      unlink(str_);
+    }
+    free(str_);
+  }
+}
+
+const char* tmp_file_imp::str()
+{
+	return str_;
+}
+
+tmp_file::tmp_file(const char* p,bool del):
+	imp_(new tmp_file_imp(p,del))
+{
+	imp_->attach();
+}
+
+tmp_file::tmp_file(const std::string& p,bool del):
+  imp_(new tmp_file_imp(tmpnam((char*)tmpName),del)) 
+{
+  imp_->attach();
+  std::ofstream f (imp_->str());
+  if (f.is_open())
+    { 
+      f << p; 
+      f.close(); 
+    }
+}
+
+const char* tmp_file::c_str() { 
+    if (imp_) return imp_->str(); 
+    return 0x0;
+}
+
+tmp_file::~tmp_file()
+{
+  if(imp_) 
+    imp_->detach();
+}
+
+tmp_file::tmp_file(const tmp_file& other):
+	imp_(other.imp_)
+{
+	imp_->attach();
+}
+
+tmp_file& tmp_file::operator=(const tmp_file& other)
+{
+  if (other.imp_)
+    other.imp_->attach();
+  if (imp_) {
+    imp_->detach();
+  }
+  imp_ = other.imp_;
+  return *this;
+}
+
+#if defined(linux) || defined(_AIX)
+
+char * tmpnam(char *) __THROW {
+  char *path = getenv("SCRATCH");
+  char *s = (char*) malloc(128);
+  if (!path || !access(path, R_OK))
+    path=getenv("TMPDIR");
+  if (!path || !access(path, R_OK))
+    path=(char*)"/tmp";
+  snprintf(s, 128, "%s/%sXXXXXX", path, appName);
+  // int fid = 
+    mkstemp(s);
+  // return s = tempnam(path, appName);
+  return s;
+}
+
+#endif
+
diff --git a/ecflow_4_0_7/view/src/tmp_file.h b/ecflow_4_0_7/view/src/tmp_file.h
new file mode 100644
index 0000000..46ce765
--- /dev/null
+++ b/ecflow_4_0_7/view/src/tmp_file.h
@@ -0,0 +1,83 @@
+#ifndef tmp_file_H
+#define tmp_file_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#ifndef counted_H
+#include "counted.h"
+#endif
+
+#include <string>
+
+/** char * tmpnam(s)	char *s;
+ *  enable P_tmpdir local definition to change default /tmp directory
+ *  enable using new location up to 44 char
+ */
+
+#ifndef __THROW
+#define __THROW
+#endif
+#ifdef linux 
+
+extern "C" {
+  extern char * tempnam(const char *d, const char* s) __THROW;
+}
+
+#ifndef tmpnam1
+#include <stdlib.h>
+#define tmpnam1 
+char * tmpnam(char *) __THROW;
+#endif
+
+#endif
+
+class tmp_file_imp : public counted {
+	char* str_;
+	bool  del_;
+public:
+	tmp_file_imp(const char*,bool);
+	~tmp_file_imp();
+	const char* str();
+};
+
+class tmp_file {
+ public:
+  
+  tmp_file(const char* str,bool = true);
+  
+  // str input IS the file content, not filename
+  tmp_file(const std::string& str,bool = true);
+  tmp_file(const tmp_file&);
+  
+  ~tmp_file();
+  
+  tmp_file& operator=(const tmp_file&);
+  
+  const char* c_str(); /* { if (imp_) return imp_->str(); 
+			  return load.c_str();} */
+
+private:
+
+  tmp_file_imp* imp_;
+};
+
+inline void destroy(tmp_file**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/tmpnam.c b/ecflow_4_0_7/view/src/tmpnam.c
new file mode 100644
index 0000000..efa2ef9
--- /dev/null
+++ b/ecflow_4_0_7/view/src/tmpnam.c
@@ -0,0 +1,63 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <stdio.h>
+
+/*
+ * Use /tmp instead of /usr/tmp, because L_tmpname is only 14 chars
+ * on some machines (like NeXT machines) and /usr/tmp will cause
+ * buffer overflows.
+ */
+
+#ifdef P_tmpdir
+#   undef P_tmpdir
+#endif
+#define	P_tmpdir	"/tmp"
+
+char *
+tmpnam(s)
+	char *s;
+{
+	static char name[50];
+        char * file_name;
+	char *mktemp();
+
+	if (!s)
+		s = name;
+
+	file_name = getenv ("TMPDIR");
+
+	if (file_name && strlen (file_name) < 42)
+	  (void)sprintf(s, "%s/XXXXXX", file_name);	  
+	else
+	  (void)sprintf(s, "%s/XXXXXX", P_tmpdir);
+
+	if (mkstemp(s))
+	  return s;
+	else
+	  return NULL;
+}
+
+#if UTEST
+
+int main (int argc, char ** argv) 
+{
+  char *name = tmpnam (NULL);
+  printf ("%s\n", name);
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/to_check.h b/ecflow_4_0_7/view/src/to_check.h
new file mode 100644
index 0000000..6251272
--- /dev/null
+++ b/ecflow_4_0_7/view/src/to_check.h
@@ -0,0 +1,40 @@
+#ifndef to_check_H
+#define to_check_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "node_alert.h"
+
+class node;
+
+class to_check : public node_alert<to_check> {
+public:
+  to_check();
+
+   ~to_check(); // Change to virtual if base class
+
+private:
+
+	to_check(const to_check&);
+	to_check& operator=(const to_check&);
+
+	virtual bool keep(node* n);
+
+};
+
+inline void destroy(to_check**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/top.cc b/ecflow_4_0_7/view/src/top.cc
new file mode 100644
index 0000000..d86f9cc
--- /dev/null
+++ b/ecflow_4_0_7/view/src/top.cc
@@ -0,0 +1,512 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #20 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "top.h"
+#include "ecflowview.h"
+#include "gui.h"
+#include "mail.h"            
+#include "servers_prefs.h"            
+#ifndef tree_H
+#include "tree.h"
+#endif
+#include <Xm/PushB.h>
+
+#ifndef panel_window_H
+#include "panel_window.h"
+#endif
+
+#ifndef window_H
+#include "window.h"
+#endif
+
+#ifndef error_H
+#include "error.h"
+#endif
+
+
+#ifndef runnable_H
+#include "runnable.h"
+#endif
+
+#ifndef init_H
+#include "init.h"
+#endif
+
+#ifndef show_H
+#include "show.h"
+#endif
+
+#ifndef host_H
+#include "host.h"
+#endif
+
+#ifndef tip_H
+#include "tip.h"
+#endif
+
+#ifndef search_H
+#include "search.h"
+#endif
+
+#ifndef option_H
+#include "option.h"
+#endif
+
+#ifndef pref_window_H
+#include "pref_window.h"
+#endif
+
+#ifndef ask_H
+#include "ask.h"
+#endif
+
+
+#ifndef error_H
+#include "error.h"
+#endif
+
+
+#include "late.h"
+#include "restart.h"
+#include "aborted.h"
+
+extern "C" {
+#include "xec.h"
+}
+
+#include <X11/IntrinsicP.h>
+#include <Xm/ToggleB.h>
+
+#ifndef globals_H
+#include "globals.h"
+#endif
+
+#include "Version.hpp"
+
+static option<int> top_width(globals::instance(), "top_width",500);
+static option<int> top_height(globals::instance(),"top_height",500);
+static option<int> top_xoff(globals::instance(),"top_xoff",0);
+static option<int> top_yoff(globals::instance(),"top_yoff",0);
+
+top::top():
+	timeout(60)
+{
+}
+
+
+top::~top()
+{
+	Dimension w,h;
+	Position x,y;
+
+	XtVaGetValues(this->form_,
+		XmNwidth, &w,
+		XmNheight,&h,
+		XmNx,&x,
+		XmNy,&y,
+		NULL);
+
+	top_width = w;
+	top_height = h;
+	top_xoff  = x;
+	top_yoff  = y;
+}
+
+class initor : public runnable {
+
+	int  argc_;
+	char **argv_;
+
+	void run() {
+		disable();
+		init::initialize(argc_,argv_);
+		delete this;
+	}
+
+public:
+	initor(int argc,char** argv) : argc_(argc),argv_(argv) { enable(); }
+};
+
+static void set_show(Widget w, int flag)
+{
+  CompositeWidget c = CompositeWidget(w);
+  for(unsigned i = 0 ; i < c->composite.num_children; i++) {
+    Widget p = c->composite.children[i];
+    if(XmIsToggleButton(p)) {
+      show *s = (show*)xec_GetUserData(p);
+      Boolean b = False;
+      bool wanted = s->wanted();
+      if (flag == show::all) {
+	b = True; wanted = true; }
+      if ((s->flag() == show::all) || (s->flag() == show::none)) {
+	b = False; wanted = false; }
+      XmToggleButtonSetState(p,wanted,b);
+    }
+  }
+}
+
+static int xerror(Display *d, XErrorEvent *e)
+{
+	char buf[1024];
+	XGetErrorText(d,e->error_code,buf,sizeof(buf));
+	printf("xerror %s\n",buf);
+	return 0;
+}
+
+void top::create(Display *display, char *app_name, 	
+	int app_argc, char **app_argv, char *app_class_name)
+{
+
+#if 1
+   // XSynchronize should *only* be enabled for debug, it should not be enabled in the production build.
+   //   See: [JIRA] (SUP-349) ecflowview performance slow with ecflow 3_1_rc1
+   // It can cause refresh issues when displaying synchronisation enabled.
+   //	XSynchronize(display,1);
+	XSetErrorHandler(xerror);
+#endif
+
+#include "xresources.h"		
+
+	XrmDatabase db = XrmGetStringDatabase(xresources);
+	XrmSetDatabase(display,db);
+
+	top_shell_c::create(display,app_name,app_argc,app_argv,app_class_name);
+
+	Dimension w,h;
+	Position x,y, ac = 0;
+	char color[20];
+	snprintf(color, 20, "#e5e5e5e5e5e5");
+
+	w = top_width;
+	h = top_height;
+	x = top_xoff;
+	y = top_yoff;
+
+	while (ac < app_argc) {
+	  /* accept command line directives for display */
+	  if (!strncmp("-geometry=",app_argv[ac],10)) {	  
+	    int ww=0, hh=0, xx=0, yy=0;
+	    sscanf(app_argv[ac], "-geometry=%dx%d+%d+%d", &ww, &hh, &xx, &yy);
+	    fprintf(stdout, "# geometry: %dx%d+%d+%d\n", ww, hh, xx, yy);
+	    w=ww; h=hh; x=xx; y=yy;
+	  } else if (!strncmp("-b",app_argv[ac],2)) {
+	      if (!strncmp("-bg=",app_argv[ac],4)) {
+		sscanf(app_argv[ac], "-bg=%s", color);
+	      } else if (!strncmp("-background=",app_argv[ac],12)) {
+		sscanf(app_argv[ac], "-background=%s", color);
+	      } 
+		
+	      std::string res = "ecFlowview*background: ";
+	      res += color;
+	      std::cout << "# bg color change: " << res << "\n";
+	      db = XrmGetStringDatabase(res.c_str());
+	      XrmSetDatabase(display,db);
+	  } else if (!strncmp("-rc=",app_argv[ac],4)) {	         
+	    char rcdir[1024] = { 0 };
+	    sscanf(app_argv[1], "-rc=%s", rcdir);
+	    if (rcdir[0] != 0) {
+	      std::string var = "ECFLOWRC="; var += rcdir;
+	      putenv((char*) var.c_str());
+	      fprintf(stdout, "# rcdir: %s\n", rcdir);
+	    }
+	  }
+	  ac++;
+	}
+
+	XtVaSetValues(this->form_,
+		XmNwidth, w,
+		XmNheight,h,
+		XmNx, x,
+		XmNy, y,
+// XmNbackground, (int)pixel(color),
+// XtVaTypedArg, XmNbackground, XmRString, color.c_str(), size, // 201403
+		NULL);
+#if 0
+	XtGetApplicationResources(_xd_rootwidget,
+				  (XtPointer)&globals,
+				  resources,
+				  XtNumber(resources),
+				  NULL,NULL);
+       
+	XtGCMask valuemask  = (GCForeground | GCFont);
+	XFontStruct* font   = XLoadQueryFont(XtDisplay(_xd_rootwidget),"fixed");
+
+	XGCValues values;
+	values.font         = font->fid;
+	values.foreground   = globals.black;
+
+	globals.blackGC   = XtGetGC(_xd_rootwidget,valuemask,&values);
+	values.foreground = globals.blue;
+	globals.blueGC    = XtGetGC(_xd_rootwidget,valuemask,&values);
+
+	for(int j=0;j<STATUS_MAX;j++)
+	{
+		values.foreground = globals.colors[j];
+		globals.colGC[j]  = XtGetGC(_xd_rootwidget,valuemask,&values);
+	}
+#endif
+	set_show(show0_,0); set_show(show1_,0);
+	set_show(show2_,0); set_show(show3_,0);
+
+	tip::makeTips(tools_);
+	//==========================================
+
+	new initor(app_argc,app_argv);
+
+	// Update and start clock
+	run();
+	enable();
+}
+
+void top::serverCB(Widget,XtPointer)
+{
+	host::broadcast();
+}
+
+static void hostCB(Widget w,XtPointer,XtPointer cb_data)
+{
+  XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*)cb_data;
+  char* name = XtName(w);
+  if(cb->set)
+    host::login(name);
+  else
+    host::logout(name);
+}
+
+void top::add_host(const std::string& host)
+{
+  Widget w;
+  if(!(w=XtNameToWidget(servers_menu_,host.c_str())))
+    {
+      w = XmCreateToggleButton(servers_menu_,
+			       (char*)host.c_str(),NULL,0);
+      XtAddCallback(w,XmNvalueChangedCallback,hostCB,NULL);
+    }
+  XtManageChild(w);
+  servers_prefs::add_host(host);                       
+}
+
+void top::remove_host(const std::string& host)
+{
+  Widget w = XtNameToWidget(servers_menu_,host.c_str());
+  XtUnmanageChild(w);
+}
+
+void top::login(const char* host)
+{
+  Widget w = XtNameToWidget(servers_menu_,host);
+  if(w) 
+    XmToggleButtonSetState(w,True,False);
+  mail::login(host); 
+}
+
+void top::logout(const char* host)
+{
+  Widget w = XtNameToWidget(servers_menu_,host);
+  if(w) XmToggleButtonSetState(w,False,False);
+  mail::logout(host);   
+}
+
+class reset_message : public runnable {
+	void run() { gui::clear(); disable(); }
+};
+
+void top::clear()
+{
+	run();
+}
+
+void top::message(const char* buf)
+{
+	static reset_message reset;
+ 	xec_SetLabel(message_,buf);
+    	XmUpdateDisplay(message_);
+	reset.enable();
+}
+
+
+Widget top::top_shell()
+{
+	return xd_rootwidget();
+}
+
+Widget top::trees()
+{
+	return trees_;
+}
+
+Widget top::windows()
+{
+	return windows_menu_;
+}
+
+void top::run()
+{
+	time_t t = time(0);
+	char buf[1024];
+	// strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M" ,gmtime(&t));
+	strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S" ,gmtime(&t));
+	xec_SetLabel(message_,buf);
+}
+
+void top::watch(Boolean)
+{
+}
+
+void top::quitCB(Widget,XtPointer)
+{
+  extent<host>::delete_all(); 
+  delete this;
+  exit(0);
+}
+
+void top::snapshotCB( Widget w, XtPointer p )
+{
+  char cmd[1024];
+  FILE *f = 0;
+
+  gui::message("using SNAPSHOT ; press button \n");
+  sprintf(cmd,"${SNAPSHOT:=import} %s\n", snapshotName);
+  
+  f = popen(cmd,"r");
+  if(!f) {
+    gui::error("Cannot create snapshot : %s", cmd);
+    return;
+  }
+  else if (!pclose(f)) {
+    gui::message("%s # generated\n", snapshotName);
+    sprintf(cmd,"${SNAPVISU:=firefox} %s\n", snapshotName);  
+    f = popen(cmd,"r");
+  } 
+  else {
+    gui::error("Cannot create snapshot : %s", cmd);
+    return;
+  }
+}
+
+void top::statusCB(Widget,XtPointer data)
+{
+  XmPushButtonCallbackStruct* cb = (XmPushButtonCallbackStruct*)data;
+  host::status((cb->event->xbutton.state & ShiftMask) != 0);
+}
+
+void top::windowCB(Widget w,XtPointer data)
+{
+  XmPushButtonCallbackStruct *cb = (XmPushButtonCallbackStruct *) data;
+  
+  panel_window::new_window
+    (selection::current_node(),
+     XtName(w), 
+     (cb->event->xbutton.state & ShiftMask) != 0,
+     (cb->event->xbutton.state & ShiftMask) != 0
+     );
+}
+
+void top::showCB(Widget w,XtPointer data)
+{
+  XmRowColumnCallbackStruct *cb = (XmRowColumnCallbackStruct *) data;
+  show *s = (show*)xec_GetUserData(cb->widget);
+  if(s && XmIsToggleButton(cb->widget)) {
+    int flag = s->flag();
+    if (((flag == show::none) | (flag == show::all))) {
+       s->off();
+       set_show(show0_, flag); set_show(show1_, flag); 
+       set_show(show2_, flag); set_show(show3_, flag);   
+       XmToggleButtonSetState(cb->widget,false,False);   
+    } else if (XmToggleButtonGetState(cb->widget))
+      s->on();
+    else
+      s->off();     
+    tree::update_all(true);
+  }
+}
+
+void top::chatCB(Widget w,XtPointer)
+{
+  host::chat();
+}
+
+void top::windowsCB(Widget,XtPointer data)   
+{
+  XmRowColumnCallbackStruct *cb = (XmRowColumnCallbackStruct *) data;
+  window *w = (window*) xec_GetUserData (cb->widget);
+  w->raise();
+}
+
+void top::searchCB(Widget w,XtPointer)
+{
+	search::show();
+}
+
+void top::releaseCB(Widget w,XtPointer)
+{
+   std::string version = "version " + ecf::Version::raw();
+   gui::message(version.c_str());
+  char cmd[1024];
+  snprintf(cmd, 1024, "${ECFLOWVIEW_HELP:=firefox --new-tab %s}\n", urlRef);
+  // snprintf(cmd, 1024, "%s %s\n", browserName, urlRef);
+  std::cerr << "#INF: " << cmd;
+  if (system(cmd)) { std::cerr << "#ERR release\n"; }
+  // execlp(browserName, urlRef, NULL);
+  sleep (1);
+}
+
+void top::helpCB(Widget w,XtPointer)
+{
+   const char *link="http://intra.ecmwf.int/metapps/manuals/ecflow/index.html";
+   // const char *jira="http://software.ecmwf.int/issues/browse/ECFLOW";
+   // const char *link="http://wedit.ecmwf.int/publications/manuals/ecFlow";
+   char cmd[1024];
+
+   gui::message("ecFlowView help (ECFLOWVIEW_HELP); press button\n");
+   snprintf(cmd, 1024, "${ECFLOWVIEW_HELP:=firefox --new-tab %s}\n", link);
+   std::cerr << "#INF: " << cmd;
+
+   if (1) { 
+     if (system(cmd)) { std::cerr << "#ERR system\n"; }
+   } else {
+      FILE* f = popen(cmd,"r");
+      if(!f) {
+         gui::error("Cannot access : %s", link);
+         return;
+      } else if (!pclose(f)) {
+      } else {
+         gui::error("Cannot access : %s", link);
+         return;
+      }
+   }
+}
+
+void top::prefCB(Widget w,XtPointer)
+{
+  pref_window::show();
+}
+
+void top::loginCB(Widget w,XtPointer)
+{
+  static str s;
+  if(ask::show(s,"Login to (host [port]): ")) {
+    char h[80] = { 0 };
+    int  n = 3141;
+    sscanf(s.c_str(),"%s %d",h,&n);
+    if (h[0] != 0)
+      host::login(h,n);
+  }
+}
+
+void top::error(const char* msg)
+{
+  error::show(msg);
+}
diff --git a/ecflow_4_0_7/view/src/top.h b/ecflow_4_0_7/view/src/top.h
new file mode 100644
index 0000000..13ad50c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/top.h
@@ -0,0 +1,72 @@
+#ifndef top_H
+#define top_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uitop.h"
+#include "timeout.h"
+#include "interface.h"
+
+class top : public top_shell_c, public timeout, public interface {
+public:
+
+	top();
+	~top(); // Change to virtual if base class
+
+	virtual void create (Display *display, char *app_name, 
+			     int app_argc, char **app_argv, 
+			     char *app_class_name = NULL);
+
+	virtual void run();
+
+	virtual void clear();
+	virtual void message(const char*);
+	virtual void watch(Boolean);
+
+	virtual void add_host(const std::string&);
+	virtual void remove_host(const std::string&);
+	virtual void rename_host(const std::string&,const std::string&) {}
+
+	virtual void login(const char*);
+	virtual void logout(const char*);
+
+	virtual Widget top_shell();
+	virtual Widget trees();
+	virtual Widget windows();
+
+	virtual void error(const char*);
+private:
+
+	top(const top&);
+	top& operator=(const top&);
+
+	virtual void quitCB(Widget,XtPointer);
+	virtual void serverCB(Widget,XtPointer);
+	virtual void statusCB(Widget,XtPointer);
+	virtual void windowCB(Widget,XtPointer);
+	virtual void showCB(Widget,XtPointer);
+	virtual void chatCB(Widget,XtPointer);
+	virtual void windowsCB(Widget,XtPointer);
+	virtual void searchCB(Widget,XtPointer);
+	virtual void helpCB(Widget,XtPointer);
+	virtual void prefCB(Widget,XtPointer);
+	virtual void loginCB(Widget,XtPointer);
+	virtual void releaseCB(Widget,XtPointer);
+	virtual void snapshotCB(Widget,XtPointer);
+};
+
+inline void destroy(top**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/trans.sh b/ecflow_4_0_7/view/src/trans.sh
new file mode 100644
index 0000000..00aa0c0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/trans.sh
@@ -0,0 +1,5 @@
+while read -r line ; do
+    l=$(echo $line | sed -e 's:":\\":gi')
+  echo "(char*) \" $l \","
+done
+echo NULL
\ No newline at end of file
diff --git a/ecflow_4_0_7/view/src/translator.cc b/ecflow_4_0_7/view/src/translator.cc
new file mode 100644
index 0000000..c4a106f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/translator.cc
@@ -0,0 +1,211 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef translator_H
+#include "translator.h"
+#endif
+
+#ifndef str_H
+#include "str.h"
+#endif
+
+#ifndef choice_H
+#include "choice.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string>
+
+str translator<int,str>::operator()(int n) 
+{
+	char buf[80];
+	sprintf(buf,"%d",n);
+	return str(buf);
+}
+
+const str& translator<str,str>::operator()(const str& x) 
+{ 
+  return x; 
+}
+
+int translator<str,int>::operator()(const str& x)
+{
+	return atol(x.c_str());
+}
+
+str translator<long long int,str>::operator()(long long int n) 
+{
+	char buf[80];
+	sprintf(buf,"%lld",n);
+	return str(buf);
+}
+
+long long int translator<str,long long int>::operator()(const str& x)
+{
+	return atoll(x.c_str());
+}
+
+str translator<uint64_t,str>::operator()(uint64_t n) 
+{
+	char buf[80];
+	sprintf(buf,"%ld",n);
+	return str(buf);
+}
+
+uint64_t translator<str,uint64_t>::operator()(const str& x)
+{
+	return atoll(x.c_str());
+}
+
+#ifdef WITH_INT128
+str translator<uint128,str>::operator()(uint128 n) 
+{
+	char buf[80];
+	sprintf(buf,"%lld",n);
+	return str(buf);
+}
+
+uint128 translator<str,uint128>::operator()(const str& x)
+{
+	return atoll(x.c_str());
+}
+#endif
+
+str translator<ULL,str>::operator()(ULL n) 
+{
+	char buf[80];
+	sprintf(buf,"%ulld",n);
+	return str(buf);
+}
+ULL translator<str,ULL>::operator()(const str& x)
+{
+	return atoll(x.c_str());
+}
+
+
+const str& translator<bool,str>::operator()(bool n) 
+{
+	static str t("true");
+	static str f("false");
+
+	return n ? t : f;
+}
+
+bool translator<str,bool>::operator()(const str& x)
+{
+	char z = x.c_str()[0];
+	return z == 't' || z == 'T' || z == '1';
+}
+
+ecf_list* translator<str,ecf_list*>::operator()(const str& x)
+{
+	ecf_list* l = 0;
+	const char* p = x.c_str();
+	char word[1024];
+	int i = 0;
+
+	while(*p)
+	{
+		if(*p == ' ') 
+		{
+			word[i] = 0;
+			if(i) {
+				ecf_list *z = ecf_node_create(word); 
+				z->next = l;
+				l = z;
+			}
+			i = 0;
+		}
+		else {
+			word[i++] = *p;
+		}
+		p++;
+			
+	}
+
+	word[i] = 0;
+	if(i) {
+		ecf_list *z = ecf_node_create(word); 
+		z->next = l;
+		l = z;
+	}
+	return l;
+}
+
+str translator<ecf_list*,str>::operator()(ecf_list* x)
+{
+	str s;
+	str space = " ";
+	while(x)
+	{
+	  s = s + str(x->name().c_str());		
+	  if(x->next) s = s + space;
+	  x = x->next;
+	}
+	return s;
+}
+
+#define t_vs std::vector<std::string> 
+t_vs translator<str,t_vs >::operator()(const str& x)
+{
+  t_vs l;
+  const char* p = x.c_str();
+  char word[1024];
+  int i = 0;
+
+  while(*p) {
+    if(*p == ' ') {
+      word[i] = 0;
+      if(i) {
+	l.push_back(std::string(word));
+      }
+      i = 0;
+    } else {
+      word[i++] = *p;
+    }
+    p++;			
+  }
+
+  word[i] = 0;
+  if(i) {
+    l.push_back(std::string(word));
+  }
+  return l;
+}
+
+// translator<str, std::vector<std::string> >::operator()(str const&)
+
+str translator<t_vs, str>::operator()(t_vs x) 
+{
+  str s, space = " ";
+  t_vs::iterator j;
+  for (j = x.begin(); j != x.end(); ++j) {
+    s += str(j->c_str());
+    if(j != x.end()) 
+      s += space;
+  }
+  return s;
+}
+
+str translator<choice,str>::operator()(const choice& n) 
+{
+	return translator<int,str>()(n);
+}
+
+choice translator<str,choice>::operator()(const str& x)
+{
+	return choice(atol(x.c_str()));
+}
diff --git a/ecflow_4_0_7/view/src/translator.h b/ecflow_4_0_7/view/src/translator.h
new file mode 100644
index 0000000..ee1c92c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/translator.h
@@ -0,0 +1,114 @@
+#ifndef translator_H
+#define translator_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <vector>
+// #include <inttypes.h>
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+#include "ecflow.h"
+class str;
+class choice;
+#include "gen_translator.h"
+
+template<> class translator<str,str> {
+public:
+  const str& operator()(const str& x);
+};
+
+template<> class translator<str,bool> {
+public:
+	bool operator()(const str&);
+};
+
+template<> class translator<bool,str> {
+public:
+	const str& operator()(bool x);
+};
+
+template<> class translator<str,int> {
+public:
+	int operator()(const str&);
+};
+
+template<> class translator<int,str> {
+public:
+	str operator()(int x);
+};
+
+template<> class translator<str,long long int> {
+public:
+  long long int operator()(const str&);
+};
+template<> class translator<long long int,str> {
+public:
+	str operator()(long long int x);
+};
+
+// #define ULL long long
+// #define ULL uint64_t
+#define ULL unsigned int
+template<> class translator<str,ULL> {public:	ULL operator()(const str&); };
+template<> class translator<ULL,str> {public:	str operator()(ULL x); };
+
+template<> class translator<str,uint64_t> {
+public:
+  uint64_t operator()(const str&);
+};
+template<> class translator<uint64_t,str> {
+public:
+	str operator()(uint64_t x);
+};
+
+#ifdef WITH_INT128
+template<> class translator<uint128,str> {public: str operator()(uint128 x);};
+template<> class translator<str,uint128> {public: uint128 operator()(const str&); };
+#endif
+
+template<> class translator<str,std::vector<std::string> > {
+public:
+  std::vector<std::string> operator()(const str&);
+};
+
+template<> class translator<std::vector<std::string> ,str> {
+public:
+	str operator()(std::vector<std::string> );
+};
+
+template<> class translator<str,ecf_list*> {
+public:
+	ecf_list* operator()(const str&);
+};
+
+template<> class translator<ecf_list*,str> {
+public:
+	str operator()(ecf_list*);
+};
+
+template<> class translator<str,choice> {
+public:
+	choice operator()(const str&);
+};
+
+template<> class translator<choice,str> {
+public:
+	str operator()(const choice&);
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/tree.cc b/ecflow_4_0_7/view/src/tree.cc
new file mode 100644
index 0000000..ce4b942
--- /dev/null
+++ b/ecflow_4_0_7/view/src/tree.cc
@@ -0,0 +1,340 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+
+#ifndef tree_H
+#include "tree.h"
+#endif
+
+#ifndef init_H
+#include "init.h"
+#endif
+
+#ifndef ecflowview_H
+#include "ecflowview.h"
+#endif
+
+#ifndef host_H
+#include "host.h"
+#endif
+
+#ifndef menus_H
+#include "menus.h"
+#endif
+
+#ifndef gui_H
+#include "gui.h"
+#endif
+
+#ifndef tmp_file_H
+#include "tmp_file.h"
+#endif
+#ifndef globals_H
+#include "globals.h"
+#endif
+
+#include "ecf_node.h"
+
+extern "C" {
+#include "xec.h"
+#include "SimpleTree.h"
+}
+
+#include <Xm/Frame.h>
+#include <Xm/Label.h>
+#include <Xm/RowColumn.h>
+
+
+//===========================================
+
+
+tree::tree(host* h):
+	host_(h)
+{
+	observe(h);
+
+#if 0	
+	XtAddCallback( tree, XmNhelpCallback, help_callback, 
+	(XtPointer) 0 );
+#endif
+
+	tree_c::create(gui::trees(),(char*)h->name());
+
+	add_input_CB();
+}
+
+tree::~tree()
+{
+	XtDestroyWidget(tree_);
+}
+
+void tree::xd_show()
+{
+	XtManageChild(tree_);
+}
+
+void tree::xd_hide()
+{
+	XtUnmanageChild(tree_);
+}
+
+void tree::build_tree(node* n,int p)
+{
+  while(n) {
+    int w = n->getBox(tree_);
+    NodeAddRelation(tree_,p,w);
+    build_tree(n->kids(),w);
+    n = n->next();
+  }
+}
+
+int tree::count(node* n)
+{
+	int c = 0;
+	while(n)
+	{
+		c += count(n->kids()) + 1;
+		n = n->next();
+	}
+	return c;
+}
+
+void tree::notification(observable* o)
+{
+	host* h = (host*)o;
+
+	NodeReset(tree_);
+
+	NodeReserve(tree_,count(h->top()));
+
+	build_tree(h->top(),-1);
+
+	if (!h->top()) return;
+	if (h->name() == selection::server()) {
+	  node* n = h->top()->find(selection::current_path());
+	  if(n) show_node(*n);
+	}
+	update_all(false);
+}
+
+void tree::selection_cleared()
+{
+	XtSetSensitive(show_current_,False);
+	XtSetSensitive(fold_around_,False);
+	XtSetSensitive(hide_other_,False);
+	node_window::selection_cleared();
+}
+
+void tree::new_selection(node& n)
+{
+	XtSetSensitive(show_current_,True);
+	XtSetSensitive(fold_around_,True);
+	XtSetSensitive(hide_other_,True);
+	node_window::new_selection(n);
+}
+
+tree* tree::new_tree(host* h)
+{
+	if(gui::trees() == 0)
+		return 0;
+
+	Widget w = XtNameToWidget(gui::trees(),h->name());
+	tree*  t = 0;
+
+	if(w == 0)
+		t = new tree(h);
+	else
+		t = (tree*)xec_GetUserData(w);
+
+	return t;
+}
+
+long tree::update_tree(node* n,bool visible)
+{
+  long changes = 0;
+  
+  while(n) {
+    Boolean vis = visible && ( n->visible() || n->show_it());
+    Boolean old = n->visibility(vis);
+    
+    if(old != vis) changes++;
+      
+    changes += update_tree(n->kids(),vis && !n->folded());
+    
+    n = n->next();
+  }
+  
+  return changes;
+}
+
+void tree::update_tree(bool redraw)
+{
+  long changes = host_ ? update_tree(host_->top(),True) : 0;
+  if(redraw)  NodeNewSizeAll(tree_);
+  if(changes) NodeUpdate(tree_);
+}
+
+void tree::fold_unfold_all(node *n,Boolean folding)
+{
+  while(n) {
+    n->folded(folding);   
+    // n->ondemand(false); // 20120705
+    fold_unfold_all(n->kids(),folding);
+    n = n->next();
+  }
+}
+
+void tree::click2(node* n,Boolean shift,Boolean control)
+{
+  if(!n) return;
+  
+  // n->ondemand(true); build_tree(n, -1); update_tree(true); // 20120705
+
+  if (shift && control)
+    fold_unfold_all(n,!n->folded());
+  else if(shift) {    
+    tmp_file f = n->serv().host::output(*n);
+    char buf[10240];
+    const char *p = getenv("PAGER");    
+    const char *fname = f.c_str();
+    if (!fname) return;
+    sprintf(buf,"xterm -e %s %s&",p?p:"more",fname);
+    system(buf);    
+    return;
+  }	
+  else if(control)
+    NodeTreeFlip(tree_,n->getBox(tree_));
+  else n->folded(!n->folded());
+  
+  update_tree(false);
+}
+
+xnode* tree::xnode_of(node& n)
+{
+	return &n;
+}
+
+void tree::show_node(node& n)
+{
+	node* p = n.parent();
+	while(p)
+	{
+		p->folded(False);
+		// 201207 update_tree(true); // p->serv().redraw(); // 201107
+		p = p->parent();
+	}
+	update_tree(false);
+	n.select();
+}
+void tree::hideOtherCB( Widget w, XtPointer p )
+{
+	node* n = selection::current_node();
+	if(!n) return;
+	
+	if(n->serv().where() != this) 
+		n->serv().where()->hideOtherCB(w,p);
+	else
+		n->serv().suites(n);
+}
+
+void tree::snapshotCB( Widget w, XtPointer p )
+{
+  char cmd[1024];
+  FILE *f = 0;
+
+  gui::message("using SNAPSHOT ; press button \n");
+  sprintf(cmd,"${SNAPSHOT:=import} %s\n", snapshotName);
+  
+  f = popen(cmd,"r");
+  if(!f) {
+    gui::error("Cannot create snapshot : %s", cmd);
+    return;
+  } else if (!pclose(f)) {
+    gui::message("%s # generated\n", snapshotName);
+    sprintf(cmd,"${SNAPVISU:=firefox} %s\n", snapshotName);  
+    f = popen(cmd,"r");
+  } 
+  else {
+    gui::error("Cannot create snapshot : %s", cmd);
+    return;
+  }
+}
+
+void tree::aroundCB( Widget w, XtPointer p)
+{
+	node* n = selection::current_node();
+	if(!n) return;
+	
+	if(n->serv().where() != this) 
+	  n->serv().where()->aroundCB(w,p);
+	else
+	{
+	  if (host_) fold_unfold_all(host_->top(),True);
+	  show_node(*n);
+	  fold_unfold_all(n,False);
+	  n->select();
+	  update_tree(false);
+	}
+}
+
+void tree::foldCB( Widget, XtPointer )
+{
+        if (host_) fold_unfold_all(host_->top(),True);
+	update_tree(false);
+}
+
+void tree::unfoldCB( Widget, XtPointer )
+{
+  if (host_) {
+	  fold_unfold_all(host_->top(),False);
+	  // 201207 build_tree(host_->top(), -1);
+  }
+  update_tree(true);
+}
+
+void tree::showCB( Widget, XtPointer )
+{
+	node* n = selection::current_node();
+	if(n) {
+		tree* t = n->serv().where();
+		t->show_node(*n);
+		n->select();
+	}
+}
+
+void tree::connected(Boolean ok)
+{
+  if(ok) {
+    XtVaSetValues(tree_,XmNbackgroundPixmap,XmUNSPECIFIED_PIXMAP,NULL);
+  } else {
+    Pixel fg,bg;
+    XtVaGetValues(tree_,XmNforeground, &fg, XmNbackground, &bg,NULL);
+    XtVaSetValues(tree_,XmNbackgroundPixmap,
+		  XmGetPixmap(XtScreen(tree_),"25_foreground",fg,bg),NULL);
+  }
+}
+
+void tree::update_all(bool redraw)
+{
+	tree *t = extent<tree>::first();
+	while(t)
+	{
+		t->update_tree(redraw);
+		t = t->extent<tree>::next();
+	}
+}
+
+IMP(tree)
diff --git a/ecflow_4_0_7/view/src/tree.h b/ecflow_4_0_7/view/src/tree.h
new file mode 100644
index 0000000..8cb7bb2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/tree.h
@@ -0,0 +1,105 @@
+#ifndef tree_H
+#define tree_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #8 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uitop.h"
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+#ifndef node_window_H
+#include "node_window.h"
+#endif
+
+#ifndef observer_H
+#include "observer.h"
+#endif
+
+#ifndef uitree_H
+#include "uitree.h"
+#endif
+
+#ifndef extent_H
+#include "extent.h"
+#endif
+
+class tree_node;
+
+class tree : public node_window
+  , public tree_c
+  , public extent<tree>
+  , public observer {
+ public:
+	tree(host*);
+
+	~tree(); // Change to virtual if base class
+
+	void xd_show();
+	void xd_hide();
+
+	void connected(Boolean);
+	void update_tree(bool);
+
+	virtual xnode* xnode_of(node& n);
+
+	static tree* new_tree(host*);
+	static void update_all(bool);
+
+	virtual void click2(node*,Boolean,Boolean);
+private:
+	// void ondemand(node&, bool full=false);
+
+	tree(const tree&);
+	tree& operator=(const tree&);
+
+	host* host_;
+
+	void build_tree(node*,int);
+	int count(node*);
+
+	void fold_unfold_all(node*,Boolean);
+	long update_tree(node*,bool);
+
+	// From node window
+	virtual void show_node(node&);
+
+	virtual Widget menu1() { return see_menu_; }
+	virtual Widget menu2() { return why_menu_; }
+
+	// From observer<host>
+	void notification(observable*);
+
+	void gone(observable*)           {}
+	void adoption(observable*,observable*) {}
+
+	virtual void new_selection(node&);
+	virtual void selection_cleared();
+
+	Widget node_widget() { return tree_; }
+
+	virtual void hideOtherCB( Widget, XtPointer );
+	virtual void aroundCB( Widget, XtPointer );
+	virtual void foldCB( Widget, XtPointer );
+	virtual void unfoldCB( Widget, XtPointer );
+	virtual void showCB( Widget, XtPointer );
+
+	virtual void snapshotCB( Widget, XtPointer );
+};
+
+inline void destroy(tree**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/trigger_lister.h b/ecflow_4_0_7/view/src/trigger_lister.h
new file mode 100644
index 0000000..1953c66
--- /dev/null
+++ b/ecflow_4_0_7/view/src/trigger_lister.h
@@ -0,0 +1,41 @@
+#ifndef trigger_lister_H
+#define trigger_lister_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+class trigger_lister {
+public:
+
+    trigger_lister() {}
+ 
+    enum { normal    = 0,   // Normal trigger_node
+           parent    = 1,   // Through parent
+           child     = 2,   // Through child
+	   hierarchy = 3    // Through child
+    }; 
+
+    virtual void next_node(node&, node*,int,node*) = 0;
+    virtual Boolean parents()          { return False; }
+    virtual Boolean kids()             { return False; }
+    virtual Boolean self()             { return True; }
+
+private:
+	trigger_lister(const trigger_lister&);
+	trigger_lister& operator=(const trigger_lister&);
+};
+
+inline void destroy(trigger_lister**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/trigger_node.cc b/ecflow_4_0_7/view/src/trigger_node.cc
new file mode 100644
index 0000000..54d3d05
--- /dev/null
+++ b/ecflow_4_0_7/view/src/trigger_node.cc
@@ -0,0 +1,274 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "trigger_node.h"
+#include "ExprAst.hpp"
+// #include "text_lister.h"
+
+trigger_node::trigger_node(host& h,ecf_node* n) 
+  : node(h,n) 
+  , expression_ ("empty")
+  , full_name_ ("empty")
+  , complete_ (false)
+{
+  if (!n) return;
+  complete_ = (n->kind() == 'c'); 
+  expression_ = n->toString();
+  full_name_  = n->parent()->full_name();
+  full_name_ += ":trigger";
+}
+
+const AstTop* trigger_node::get() const
+{
+  if (!owner_) return 0x0;
+  return dynamic_cast<ecf_concrete_node<ExpressionWrapper>*>
+    (owner_)->get()->get_ast_top();
+}
+
+xmstring trigger_node::make_label_tree()
+{
+  int inc = 0;
+  if (expression_.size() > 9) {
+    inc = complete_ ? 9 : 8;
+  }    
+#ifdef BRIDGE
+  if (tree_) inc = 0;
+#endif
+  return xmstring(expression_.c_str() + inc);
+}
+
+void trigger_node::drawNode(Widget w,XRectangle* r,bool tree)
+{
+  XmStringDraw(XtDisplay(w),XtWindow(w),
+               smallfont(),
+               tree?labelTree():labelTrigger(),
+               complete_?blueGC():blackGC(),
+               r->x+2,
+               r->y+2,
+               r->width,
+               XmALIGNMENT_BEGINNING, XmSTRING_DIRECTION_L_TO_R, NULL);
+
+  shadow(w,r);
+}
+
+void trigger_node::info(std::ostream& f)
+{
+  const AstTop *ast = get();
+  if (ast) {
+    std::string str = ast->expression(true);
+    f << str << "\n";
+  }
+}
+
+// const std::string& trigger_node::definition() const {  return expression_; }
+
+const std::string& trigger_node::name() const
+{
+  static std::string trigger_ = "trigger";
+  return trigger_; 
+}
+
+void trigger_node::perlify(FILE* f)
+{
+  perl_member(f, "math", expression_.c_str());
+}
+
+#ifdef BRIDGE
+#define K_NIL    0      
+#define K_OR     1
+#define K_AND    2
+#define K_EQ     3
+#define K_NE     4
+#define K_LT     5
+#define K_LE     6
+#define K_GT     7
+#define K_GE     8
+#define K_ADD    9
+#define K_SUB   10
+#define K_MUL   11
+#define K_DIV   12
+#define K_MOD   13
+#define K_POW   14
+#define K_NOT   15     
+#define K_UNARY 16     
+#define K_OPEN  17     
+#define K_CLOSE 18     
+#define K_NAME  19     
+#define K_PRECEDENCE 9             
+
+static std::string buf;
+
+inline void add(char* s,char* p,Boolean done)
+{
+  strcat(s,p);
+}
+
+static bool match_math(const Ast *m, sms_tree *t, const char* n)
+{
+  if (m) return m->evaluate();
+  else if (t) {
+    if (t->mtype == K_NAME) return strstr(t->name, n) != 0;
+    return match_math(0, t->left, n) || match_math(0, t->right, n); 
+  }
+  return false;
+}
+
+bool trigger_node::match(const char* n)
+{
+  return match_math(get(),(sms_tree*)tree_, n);
+}
+
+static void print_math(char* s,sms_tree *m,Boolean done)
+{
+  if(!m) return;
+
+  if(m->mtype == K_NAME)    {
+    add(s,m->name,done);
+    return;
+  }
+
+  switch(m->mtype)    {
+
+   case K_NAME:
+          add(s,m->name,done);
+          break;
+
+   case K_OR   :
+      print_math(s,m->left,done);
+      add(s,(char*)" or ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_AND  :
+      print_math(s,m->left,done);
+      add(s,(char*)" and ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_EQ   :
+      print_math(s,m->left,done);
+      add(s,(char*)" == ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_NE   :
+      print_math(s,m->left,done);
+      add(s,(char*)" != ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_LT   :
+      print_math(s,m->left,done);
+      add(s,(char*)" < ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_LE   :
+      print_math(s,m->left,done);
+      add(s,(char*)" <= ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_GT   :
+      print_math(s,m->left,done);
+      add(s,(char*)" > ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_GE   :
+      print_math(s,m->left,done);
+      add(s,(char*)" >= ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_ADD  :
+      print_math(s,m->left,done);
+      add(s,(char*)" + ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_SUB  :
+      print_math(s,m->left,done);
+      add(s,(char*)" - ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_MUL  :
+      print_math(s,m->left,done);
+      add(s,(char*)" * ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_DIV  :
+      print_math(s,m->left,done);
+      add(s,(char*)" / ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_MOD  :
+      print_math(s,m->left,done);
+      add(s,(char*)" % ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_POW  :
+      print_math(s,m->left,done);
+      add(s,(char*)" ** ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_NOT  :
+     add(s,(char*)"not ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_UNARY:
+     add(s,(char*)"- ",done);
+      print_math(s,m->right,done);
+      break;
+
+   case K_OPEN :
+     add(s,(char*)"(",done);
+      print_math(s,m->right,done);
+      add(s,(char*)")",done);
+      break;
+
+   default :
+     add(s,(char*)"--\?\?\?--",done);
+      break;
+    }
+}
+
+extern "C" {
+#define new _new
+#define delete _delete
+#include "smsproto.h"
+}
+
+trigger_node::trigger_node(host& h,sms_node* n, char b) 
+  : node(h,n,b) 
+  , expression_ ()
+  , complete_ (b == 'c')
+{
+  char buf[10240] = { 0 }; 
+  sms_trigger* trg = (sms_trigger*) n;
+  if (!trg) return;
+  tree_ = (sms_node*) trg->math;
+  print_math(buf, (sms_tree*) trg->math, False);
+  expression_ = buf;
+  full_name_  = sms_node_full_name(n->parent);
+  full_name_ += ":trigger";
+}
+#endif
diff --git a/ecflow_4_0_7/view/src/trigger_node.h b/ecflow_4_0_7/view/src/trigger_node.h
new file mode 100644
index 0000000..70ae70e
--- /dev/null
+++ b/ecflow_4_0_7/view/src/trigger_node.h
@@ -0,0 +1,59 @@
+#ifndef TRIGGER_NODE_H
+#define TRIGGER_NODE_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #13 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "node.h"
+#include "show.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+
+class trigger_node : public node {
+  std::string expression_;
+  std::string full_name_;
+  bool complete_;
+
+  const AstTop* get() const;
+  
+  virtual xmstring make_label_tree();
+  void drawNode(Widget w,XRectangle* r,bool);
+
+  virtual const std::string& name() const;
+  virtual const std::string& full_name() const { return full_name_; }
+  virtual const std::string& definition() const { return expression_; }
+  virtual Boolean menus() { return False; }
+  virtual Boolean selectable() { return True; }
+
+  virtual Boolean visible() const { return show::want(show::trigger); }
+
+  virtual void triggered(trigger_lister&) {}
+  virtual void triggers(trigger_lister&)  {}
+  virtual void perlify(FILE*);
+
+public:
+  trigger_node(host& h,ecf_node* n);
+  ~trigger_node() {}
+
+  virtual void info(std::ostream&);
+
+#ifdef BRIDGE
+  virtual bool match(const char*);
+  trigger_node(host& h,sms_node* n, char b);
+#endif
+};
+#endif
diff --git a/ecflow_4_0_7/view/src/trigger_panel.cc b/ecflow_4_0_7/view/src/trigger_panel.cc
new file mode 100644
index 0000000..fb63b90
--- /dev/null
+++ b/ecflow_4_0_7/view/src/trigger_panel.cc
@@ -0,0 +1,160 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "trigger_panel.h"
+#include "node.h"
+#include "graph_layout.h"
+#include "text_layout.h"
+#include "selection.h"
+#include "Hyper.h"
+#include <Xm/ToggleB.h>
+
+extern "C" {
+#include "xec.h"
+}
+
+trigger_panel::trigger_panel(panel_window& w):
+	panel(w),
+	full_(True),
+	triggers_(True),
+	triggered_(True),
+	depend_(False),
+	layout_(0)
+{
+}
+
+trigger_panel::~trigger_panel()
+{
+	delete (layout*)xec_GetUserData(tgraph_);
+	delete (layout*)xec_GetUserData(ttext_);
+}
+
+void trigger_panel::create(Widget parent, char *widget_name )
+{
+	triggers_form_c::create(parent,widget_name);
+	xec_SetUserData(tgraph_,layout_ = new graph_layout(*this,graph_));
+	xec_SetUserData(ttext_,new text_layout(*this,text_));
+}
+
+void trigger_panel::clear()
+{
+	layout_->clear();
+	hide();
+}
+
+void trigger_panel::show(node& n)
+{
+	layout_->show(n);
+}
+
+Boolean trigger_panel::enabled(node& n)
+{
+	return True;
+}
+
+Widget trigger_panel::menus(Widget bar)
+{
+	if(triggers_menu_c::xd_rootwidget() == 0)
+		triggers_menu_c::create(bar,(char*)name());
+	return triggers_menu_c::xd_rootwidget();
+}
+
+void trigger_panel::fullCB( Widget, XtPointer data)
+{
+	XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*) data;
+	full_ = cb->set;
+	update();
+}
+
+void trigger_panel::triggeredCB( Widget, XtPointer data)
+{
+	XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*) data;
+	triggered_ = cb->set;
+	update();
+}
+
+void trigger_panel::triggersCB( Widget, XtPointer data)
+{
+	XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*) data;
+	triggers_ = cb->set;
+	update();
+}
+
+void trigger_panel::dependCB( Widget, XtPointer data)
+{
+	XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct*) data;
+	depend_ = cb->set;
+	clear();
+	update();
+}
+
+void trigger_panel::entryCB(Widget, XtPointer data)
+{
+	XmRowColumnCallbackStruct* cb = (XmRowColumnCallbackStruct*)data;
+
+	if(XmToggleButtonGetState(cb->widget))
+	{
+		layout *l = (layout*)xec_GetUserData(cb->widget);
+		XtUnmanageChild(layout_->layout_widget());
+		XtManageChild(l->layout_widget());
+		layout_ = l;
+		if(get_node())
+			l->show(*get_node());
+		else
+			l->clear();
+	}
+	hide();
+}
+
+void trigger_panel::hyperCB(Widget w,XtPointer data)
+{
+	panel::hyper(w,data);
+}
+
+void trigger_panel::reachCB(Widget w,XtPointer data)
+{
+	XmToggleButtonSetState(dependencies_button_,True,False);
+	XmToggleButtonSetState(triggers_button_,True,False);
+	XmToggleButtonSetState(triggered_button_,True,False);
+
+	depend_ = triggers_ = triggered_ = true;
+	clear();
+	layout_->reach(get_node(),selection::current_node());
+}
+
+void trigger_panel::linkCB(Widget w,XtPointer data)
+{
+	XmRowColumnCallbackStruct* cb = (XmRowColumnCallbackStruct*)data;
+	node* n = (node*)xec_GetUserData(cb->widget);
+	layout_->selectNode(n);
+}
+
+void trigger_panel::showDependWindow()
+{
+	depend::raise(widget());
+}
+
+Widget trigger_panel::dependHyperText()
+{
+	depend::make(widget());
+	return depend::hyper_;
+}
+
+void trigger_panel::hideDependWindow()
+{
+	depend::hide();
+}
+
+// static panel_maker<trigger_panel> maker(PANEL_TRIGGER);
diff --git a/ecflow_4_0_7/view/src/trigger_panel.h b/ecflow_4_0_7/view/src/trigger_panel.h
new file mode 100644
index 0000000..fd11fb0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/trigger_panel.h
@@ -0,0 +1,85 @@
+#ifndef trigger_panel_H
+#define trigger_panel_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "uitriggers.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef node_window_H
+#include "node_window.h"
+#endif
+
+#ifndef depend_H
+#include "depend.h"
+#endif
+
+class layout;
+
+class trigger_panel : public panel, 
+                      public depend,
+	              public triggers_form_c , 
+	              public triggers_menu_c {
+public:
+	trigger_panel(panel_window&);
+
+	~trigger_panel(); // Change to virtual if base class
+
+	virtual void create (Widget parent, char *widget_name = NULL);
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual const char* name() const { return "Triggers"; }
+	Widget  menus(Widget);
+	virtual Widget widget() { return triggers_form_c::xd_rootwidget(); }
+
+	Boolean triggers()  { return triggers_;  }
+	Boolean triggered() { return triggered_; }
+	Boolean extended()  { return depend_;    }
+
+	Widget infoMenu()    { return info_menu_; }
+	Widget linkMenu()    { return link_menu_; }
+
+	void   showDependWindow();
+	void   hideDependWindow();
+	Widget dependHyperText();
+
+private:
+
+	trigger_panel(const trigger_panel&);
+	trigger_panel& operator=(const trigger_panel&);
+	
+	Boolean full_;
+	Boolean triggers_;
+	Boolean triggered_;
+	Boolean depend_;
+	layout* layout_;
+
+	virtual void fullCB( Widget, XtPointer );
+	virtual void triggeredCB( Widget, XtPointer );
+	virtual void triggersCB( Widget, XtPointer );
+	virtual void dependCB( Widget, XtPointer );
+	virtual void entryCB( Widget, XtPointer );
+	virtual void hyperCB( Widget, XtPointer );
+	virtual void reachCB( Widget, XtPointer );
+
+	virtual void linkCB( Widget, XtPointer );
+};
+
+inline void destroy(trigger_panel**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/url.cc b/ecflow_4_0_7/view/src/url.cc
new file mode 100644
index 0000000..e50108b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/url.cc
@@ -0,0 +1,240 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "url.h"
+#include "re.h"
+#include "tmp_file.h"
+#include "str.h"
+#include "node.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+url::url(int soc):
+	soc_(soc),
+	code_(200),
+	in_(fdopen(soc_,"r")),
+	out_(fdopen(soc_,"w")),
+	tmp_(tmpfile())
+{
+	char line[1024];
+	method_[0] = what_[0] = 0;
+
+	while(fgets(line,sizeof(line),in_))
+	{
+		if(method_[0] == 0)
+			sscanf(line,"%s %s",method_,what_);
+		printf("url->%s<-",line);
+		if(strlen(line) == 2) break;
+	}
+
+	char *p = what_;
+	char *s = what_;
+
+	while(*s)
+	{
+		if(*s == '+')
+		{
+			*p =  ' ';	
+		} 
+		else if(*s == '%')
+		{
+			char h = s[1]; if(!h) break;
+			char l = s[2]; if(!l) break;
+
+			unsigned int a = (h>='A')?(h-'A'+10):(h-'0');
+			unsigned int b = (l>='A')?(l-'A'+10):(l-'0');
+
+			*p =   char(a * 16 + b);
+			s += 2;
+		}
+		else *p = *s;
+
+		p++;
+		s++;
+	}
+	*p = 0;
+}
+
+void url::process(node* n)
+{
+  if (! node::is_json) {
+
+	fprintf(out_,"\nHTTP/1.0 %d Document follows\r\n",code_);
+	fprintf(out_,"MIME-Version: 1.0\r\n");
+	fprintf(out_,"Content-Type: text/html\r\n");
+	fprintf(out_,"\r\n");
+
+	  if(n) {
+	    n->as_perl(out_,true);
+	  } else 
+	    fprintf(out_,"bless({},'ecflow::node::error')");
+  } else {
+	  if (n) {
+	    n->as_perl(out_,true);	    
+	  } else
+	    fprintf(out_,"{ }");
+	}
+
+	fflush(out_);
+}
+
+url::~url()
+{
+
+	fflush(tmp_);
+	long len = ftell(tmp_);
+	rewind(tmp_);
+
+	if (!node::is_json) {
+	  fprintf(out_,"\n");
+	  fprintf(out_,"HTTP/1.0 %d Document follows\r\n",code_);
+	  fprintf(out_,"MIME-Version: 1.0\r\n");
+	  fprintf(out_,"Content-Type: text/html\r\n");
+	  fprintf(out_,"Content-Length: %ld\r\n",len);
+	  fprintf(out_,"\r\n");
+	}
+	copy(tmp_,out_);
+
+	fflush(out_);
+
+	if(in_)  fclose(in_);
+	if(out_) fclose(out_);
+	if(tmp_) fclose(tmp_);
+}
+
+
+void url::add(tmp_file& t,text_translator& trans)
+{
+	FILE* f = fopen(t.c_str(),"r");
+	if(f) 
+	{
+		char line[1024];
+		while(fgets(line,sizeof(line),f))
+			trans.save(tmp_,line);
+		fclose(f);
+	}
+	else {
+		fprintf(tmp_,"Cannot open %s\n",t.c_str());
+	}
+}
+
+void url::add(tmp_file& t)
+{
+	url_translator trans;
+	add(t,trans);
+}
+
+void url::copy(FILE* in,FILE* out)
+{
+	char line[1024];
+	long len;
+
+	while( (len = fread(line,1,sizeof(line),in)) > 0)
+		fwrite(line,1,len,out);
+}
+
+void url_translator::save(FILE* f,const char* p)
+{
+	while(*p)
+	{
+		switch(*p)
+		{
+			/* case '\n': fprintf(f,"<br>\n"); break; */
+
+			case '<': fprintf(f,"<"); break;
+			case '>': fprintf(f,">"); break;
+			case '&': fprintf(f,"&"); break;
+
+			default: fputc(*p,f); break;
+		}
+
+		p++;
+
+	}
+}
+
+class scan_translator: public text_translator {
+	re  re_;
+	node* n_;
+	url&  u_;
+public:
+	scan_translator(node* n,url& u);
+	~scan_translator();
+
+	virtual void save(FILE*,const char *line);
+};
+
+scan_translator::scan_translator(node* n,url& u):
+	re_("<!-- wcdp ([^ ]*)$0 -->"),
+	n_(n),
+	u_(u)
+{
+}
+
+scan_translator::~scan_translator()
+{
+}
+
+void scan_translator::save(FILE* f,const char *line)
+{
+	char val[1024];
+	char buf[1024];
+
+	strcpy(buf,line);
+	char *p = buf;
+	char *q;
+
+	while((q = re_.match(p,val)))
+	{ 
+		char *loc = re_.loc();
+		char w = *loc;
+		*loc = 0;
+		fprintf(f,"%s",buf);
+		*loc = w;
+
+		// We need a factory here
+
+		if(strcmp(val,"title") == 0)  n_->html_title(u_,u_);
+		if(strcmp(val,"kids") == 0)   n_->html_kids(u_,u_);
+		if(strcmp(val,"output") == 0) n_->html_output(u_,u_);
+		if(strcmp(val,"script") == 0) n_->html_script(u_,u_);
+		if(strcmp(val,"name") == 0)   n_->html_name(u_,u_);
+		if(strcmp(val,"why") == 0)    n_->html_why(u_,u_);
+
+
+		p = q;
+	}
+	fprintf(f,"%s",p);
+}
+
+void url::scan(node* n)
+{
+	tmp_file page(n->html_page(*this),false);
+	scan_translator s(n,*this);
+	add(page,s);
+}
+
+
+/*
+perl -e'print q|{"foo":"XX","bar":1234567890000000000000000}|' |\
+              json_pp -f json -t dumper -json_opt pretty,utf8,allow_bignum
+
+wget http://127.0.0.1:8081/lhost/elaw_37r3
+cat elaw_37r3 | grep -v -E '(HTTP|MIME|Content-)' | json_pp -f eval -t json -json_opt pretty,utf8,allow_bignum
+
+/tmp/map/work/PythonWeb.org/examples/ecflow
+
+*/
diff --git a/ecflow_4_0_7/view/src/url.h b/ecflow_4_0_7/view/src/url.h
new file mode 100644
index 0000000..dda6f6b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/url.h
@@ -0,0 +1,142 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef url_H
+#define url_H
+
+#include <stdio.h>
+class tmp_file;
+class node;
+
+class text_translator {
+public:
+   virtual ~text_translator() {}
+	virtual void save(FILE*,const char*) = 0;
+};
+
+class url_translator: public text_translator {
+public:
+	virtual void save(FILE*,const char*);
+};
+
+class url {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	url(int);
+
+// -- Destructor
+
+	~url(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+
+	operator FILE*() { return tmp_; }
+
+// -- Methods
+
+	void process(node*);
+	void scan(node*);
+
+	const char* method() const { return method_; }
+	const char* what() const { return what_; }
+
+	void not_found() { code_ = 404; }
+
+	void add(tmp_file&);
+	void add(tmp_file&,text_translator&);
+	void copy(FILE*,FILE*);
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	url(const url&);
+	url& operator=(const url&);
+
+// -- Members
+	
+	char method_[1024];
+	char what_[1024];
+	int soc_;
+	int code_;
+	FILE* in_;
+	FILE* out_;
+	FILE* tmp_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const url& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(url**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(url);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/user_prefs.cc b/ecflow_4_0_7/view/src/user_prefs.cc
new file mode 100644
index 0000000..a03e7ae
--- /dev/null
+++ b/ecflow_4_0_7/view/src/user_prefs.cc
@@ -0,0 +1,24 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "user_prefs.h"
+
+void user_prefs::create(Widget w,char*) 
+{ 
+	user_form_c::create(w); 
+	prefs::setup(w); 
+}
+
+// static user_prefs hp;
diff --git a/ecflow_4_0_7/view/src/user_prefs.h b/ecflow_4_0_7/view/src/user_prefs.h
new file mode 100644
index 0000000..eacf05c
--- /dev/null
+++ b/ecflow_4_0_7/view/src/user_prefs.h
@@ -0,0 +1,49 @@
+#ifndef user_prefs_H
+#define user_prefs_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifndef prefs_H
+#include "prefs.h"
+#endif
+
+#ifndef uiuser
+#include "uiuser.h"
+#endif
+
+
+class user_prefs : public prefs, public user_form_c {
+public:
+
+  user_prefs() {}
+  
+  ~user_prefs() {}
+  
+  virtual Widget widget() { return _xd_rootwidget; }
+
+private:
+
+  user_prefs(const user_prefs&);
+  user_prefs& operator=(const user_prefs&);
+  
+  virtual void changedCB( Widget w, XtPointer ) { pref_editor::changed(w); }
+  virtual void useCB( Widget w, XtPointer )     { pref_editor::use(w);     }
+  
+  virtual void create(Widget w,char*);
+};
+
+inline void destroy(user_prefs**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/users.cc b/ecflow_4_0_7/view/src/users.cc
new file mode 100644
index 0000000..b99fb1b
--- /dev/null
+++ b/ecflow_4_0_7/view/src/users.cc
@@ -0,0 +1,62 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "users.h"
+#include "node.h"
+#include "host.h"
+#include "ecflowview.h"
+#include <Xm/Label.h>
+#include <Xm/Text.h>
+#include <Xm/List.h>
+extern "C" {
+#include "xec.h"
+}
+
+users::users(panel_window& w):
+	panel(w)
+{
+}
+
+users::~users()
+{
+}
+
+void users::create (Widget parent, char *widget_name )
+{
+	users_form_c::create(parent,widget_name);
+}
+
+void users::clear()
+{
+	XmListDeleteAllItems(list_);
+}
+
+void users::show(node& n)
+{
+	XmListDeleteAllItems(list_);
+}
+
+Boolean users::enabled(node& n)
+{
+  return False;
+  // return n.type() == NODE_SUPER;
+}
+
+
+void users::sendCB( Widget, XtPointer )
+{
+}
+
+// static panel_maker<users> maker(PANEL_USERS);
diff --git a/ecflow_4_0_7/view/src/users.h b/ecflow_4_0_7/view/src/users.h
new file mode 100644
index 0000000..3994161
--- /dev/null
+++ b/ecflow_4_0_7/view/src/users.h
@@ -0,0 +1,136 @@
+#ifndef users_H
+#define users_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+
+#include "uiusers.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+// 
+
+class users : public panel, public users_form_c {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	users(panel_window&);
+
+// -- Destructor
+
+	~users(); // Change to virtual if base class
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	virtual const char* name() const { return "Users"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Boolean enabled(node&);
+	virtual Widget widget() { return users_form_c::xd_rootwidget(); }
+
+	virtual void create (Widget parent, char *widget_name = NULL);
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	users(const users&);
+	users& operator=(const users&);
+
+// -- Members
+
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+	virtual void sendCB( Widget, XtPointer );
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const users& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(users**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(users);
+//#endif
+
+
+#endif
diff --git a/ecflow_4_0_7/view/src/variable_node.cc b/ecflow_4_0_7/view/src/variable_node.cc
new file mode 100644
index 0000000..8d7556d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/variable_node.cc
@@ -0,0 +1,135 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #17 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "variable_node.h"
+
+#ifndef ecf_node_
+#include "ecf_node.h"
+#endif
+struct ecf_variable {
+	int type;
+	char *name;
+	struct ecf_variable *next;
+	int status;
+	int nid;
+	int act_no;
+	class ecf_node *parent;
+	void* user_ptr;
+	int user_int;
+	class ecf_node *kids;
+	char *value;
+};
+typedef struct ecf_variable ecf_variable;
+
+const xmstring& variable_node::labelTree()
+{
+  labelTree_ = make_label_tree();
+  return labelTree_;
+}
+
+#ifdef BRIDGE
+variable_node::variable_node(host& h,sms_node* n, char b) 
+  : node(h,n,b) 
+  , generated_(b == 'g') 
+{}
+#endif
+
+variable_node::variable_node(host& h,ecf_node* n) 
+  : node(h,n)
+  , generated_(false) 
+{
+  generated_ = n ? (n->kind() == 'g') : false;
+}
+
+std::string variable_node::get_var(bool substitute) {
+#ifdef BRIDGE
+  if (tree_) {
+    ecf_variable *var = (ecf_variable*) tree_;
+    if (var) return var->value;
+  } else 
+#endif
+    if (parent()) 
+      if (parent()->__node__())
+        return parent()->__node__()->get_var(name(), 
+                                             generated_, 
+                                             substitute);
+  return ecf_node::none();
+}
+
+xmstring variable_node::make_label_tree()
+{
+  const std::string& v = get_var();
+  return xmstring(name().c_str()) + xmstring("=") + xmstring(v.c_str());
+}
+
+void variable_node::drawNode(Widget w,XRectangle *r,bool)
+{
+  XmStringDraw(XtDisplay(w),XtWindow(w),
+	       smallfont(),
+	       labelTree(),
+	       generated_?blueGC():blackGC(),
+	       r->x+2,
+	       r->y+2,
+	       r->width,
+	       XmALIGNMENT_BEGINNING, XmSTRING_DIRECTION_L_TO_R, NULL);
+  /* shadow(w,r); */
+}
+
+Boolean variable_node::visible() const 
+{ 
+  return 
+    generated_ ?
+    show::want(show::genvar) :
+    show::want(show::variable);      
+}
+
+void variable_node::info(std::ostream&f)
+{
+  if (generated_)
+    f << "  #  ( " << name() << "\t: " << get_var() + ")\n";
+  else
+    f << "  edit " << name() <<  "\t" <<  get_var() << "\n";
+}
+
+bool variable_node::match(const char* p)
+{
+  return (strstr(name().c_str(),p) != 0) 
+    || (strstr(get_var().c_str(),p) != 0);
+}
+
+void variable_node::edit(node_editor& e)
+{
+  e.set("name", str(name()));
+  e.set("value",str(get_var()));
+}
+
+void variable_node::apply(node_editor& e)
+{
+  str value;
+  e.get("value",value);
+  const char* name = this->name().c_str();
+  const char* kind = "add"; 
+  for (node* n = parent()->kids(); n; n = n->next())
+    if (n->type() == NODE_VARIABLE && n->name() == name)
+      { kind = "change"; break; }
+  serv().command(clientName,"--alter", kind, "variable",
+		 name, value.c_str(), parent()->full_name().c_str(),
+		 NULL);
+}
+
+void variable_node::perlify(FILE* f)
+{
+  perl_member(f,"value",get_var().c_str());
+}
diff --git a/ecflow_4_0_7/view/src/variable_node.h b/ecflow_4_0_7/view/src/variable_node.h
new file mode 100644
index 0000000..28f5a6a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/variable_node.h
@@ -0,0 +1,54 @@
+#ifndef VARIABLE_NODE
+#define VARIABLE_NODE
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #12 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+
+#include "node.h"
+#include "show.h"
+#include "host.h"
+#include "node_editor.h"
+
+class variable_node : public node {
+
+	bool generated_;
+
+	virtual void info(std::ostream&);
+	virtual const xmstring& labelTree();
+	virtual xmstring make_label_tree();
+	virtual void drawNode(Widget w,XRectangle *r,bool);
+
+	virtual Boolean visible() const;
+	virtual bool match(const char*);
+
+	virtual void edit(node_editor&);
+	virtual void apply(node_editor&);
+
+	virtual void triggered(trigger_lister&) {}
+	virtual void triggers(trigger_lister&)  {}
+
+	virtual void perlify(FILE*);
+
+public:
+	variable_node(host& h,ecf_node* n);
+	Boolean isGenVariable(const char *name) { return generated_; }
+	std::string get_var(bool subsitute=false);
+#ifdef BRIDGE
+	variable_node(host& h,sms_node* n, char b);
+#endif
+
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/src/variables.cc b/ecflow_4_0_7/view/src/variables.cc
new file mode 100644
index 0000000..0dfc3a2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/variables.cc
@@ -0,0 +1,417 @@
+//=============================================================================================
+// Name        :
+// Author      :
+// Revision    : $Revision: #19 $
+//
+// Copyright 2009-2012 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//=============================================================================================
+
+#include "variables.h"
+#include "variable_node.h"
+#include "node.h"
+#include "host.h"
+#include "ecf_node.h"
+
+#include <Xm/List.h>
+#include <Xm/Text.h>
+#include "confirm.h"
+
+extern "C" {
+#include "xec.h"
+}
+
+variables::variables( panel_window& w )
+         : panel(w), loading_(false)
+{
+}
+
+variables::~variables()
+{
+   clear();
+}
+
+void variables::clear()
+{
+   loading_ = true;
+   XmListDeleteAllItems(list_);
+   XtSetSensitive(edit_, False);
+   XmTextSetString(name_, (char*) "");
+   XmTextSetString(value_, (char*) "");
+   loading_ = false;
+}
+
+struct cless_than {
+   inline bool operator()( const Variable& v1, const Variable& v2 )
+   {
+      return (v1.name() < v2.name());
+   }
+};
+
+void variables::show( node& n )
+{
+   loading_ = true;
+
+   int varsize = 0;
+   int valsize = 0;
+   char fmt1[256];
+   char fmt2[256];
+   node* m = &n;
+
+   XtSetSensitive(edit_, True);
+   XmListDeleteAllItems(list_);
+   std::vector<Variable> gvar;
+   std::vector<Variable>::const_iterator it, gvar_end;
+   ecf_node* prox;
+
+   while ( m != 0 ) {
+      /* for (node* run = m->kids(); run; run = run->next())
+       if (run->type() == NODE_VARIABLE) {
+       varsize = std::max(varsize, (int) run->name().size());
+       valsize = std::max(valsize, (int) ((variable_node*) run)->get_var().size());
+       } */
+      {
+         prox = m->__node__();
+         if (!prox) return;
+
+         Defs* defs = 0;
+         Node* ecf = 0;
+         if (dynamic_cast<ecf_concrete_node<Node>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Node>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Task>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Task>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Family>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Family>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Suite>*>(prox)) {
+            ecf = dynamic_cast<ecf_concrete_node<Suite>*>(prox)->get();
+         }
+         else if (dynamic_cast<ecf_concrete_node<Defs>*>(prox)) {
+            defs = dynamic_cast<ecf_concrete_node<Defs>*>(prox)->get();
+         }
+         if (!ecf && !defs) {
+            break;
+         }
+
+         if (ecf ) {
+            gvar.clear();
+            ecf->gen_variables(gvar);
+            for(it = gvar.begin(); it != gvar.end(); ++it) {
+               varsize = std::max(varsize, (int) (*it).name().size());
+               valsize = std::max(valsize, (int) (*it).theValue().size());
+            }
+
+            gvar = ecf->variables();
+            for(it = gvar.begin(); it != gvar.end(); ++it) {
+               varsize = std::max(varsize, (int) (*it).name().size());
+               valsize = std::max(valsize, (int) (*it).theValue().size());
+            }
+         }
+         if (defs) {
+            const std::vector<Variable>& gvar = defs->server().user_variables();
+            for(it = gvar.begin(); it != gvar.end(); ++it) {
+                varsize = std::max(varsize, (int) (*it).name().size());
+                valsize = std::max(valsize, (int) (*it).theValue().size());
+            }
+            const std::vector<Variable>& var = defs->server().server_variables();
+            for(it = var.begin(); it != var.end(); ++it) {
+                varsize = std::max(varsize, (int) (*it).name().size());
+                valsize = std::max(valsize, (int) (*it).theValue().size());
+            }
+         }
+      }
+      m = m->parent();
+   }
+
+   if (!varsize) return;
+   snprintf(fmt1, 256, "(%%-%ds = %%-%ds)", varsize, valsize);
+   snprintf(fmt2, 256, " %%-%ds = %%-%ds ", varsize, valsize);
+   {
+      char buffer[1024];
+      node *m = &n;
+      while ( m != 0 ) {
+	snprintf(buffer, 1024, "Variables defined for %s %s", m->type_name(), m->name().c_str());
+         xec_AddFontListItem(list_, buffer, 1);
+         {
+            prox = m->__node__();
+            if (!prox) break;
+
+            Defs* defs = 0;
+            Node* ecf = 0;
+            if (dynamic_cast<ecf_concrete_node<Node>*>(prox)) {
+               ecf = dynamic_cast<ecf_concrete_node<Node>*>(prox)->get();
+            }
+            else if (dynamic_cast<ecf_concrete_node<Task>*>(prox)) {
+               ecf = dynamic_cast<ecf_concrete_node<Task>*>(prox)->get();
+            }
+            else if (dynamic_cast<ecf_concrete_node<Family>*>(prox)) {
+               ecf = dynamic_cast<ecf_concrete_node<Family>*>(prox)->get();
+            }
+            else if (dynamic_cast<ecf_concrete_node<Suite>*>(prox)) {
+               ecf = dynamic_cast<ecf_concrete_node<Suite>*>(prox)->get();
+            }
+            else if (dynamic_cast<ecf_concrete_node<Defs>*>(prox)) {
+                defs = dynamic_cast<ecf_concrete_node<Defs>*>(prox)->get();
+            }
+            if (!ecf && !defs) break;
+
+            if (ecf) {
+               gvar.clear();
+               ecf->gen_variables(gvar);
+               for(it = gvar.begin(); it != gvar.end(); ++it) {
+                  if ((*it).name() == "" || 
+		      *it == Variable::EMPTY() || 
+		      (*it).name() == "ECF_PASS") 
+		    continue;
+                  snprintf(buffer, 1024, fmt1, (*it).name().c_str(), (*it).theValue().c_str());
+                  xec_AddFontListItem(list_, buffer, 0);
+               }
+
+               gvar = ecf->variables();
+               std::sort(gvar.begin(), gvar.end(), cless_than());
+               gvar_end = gvar.end();
+               for(it = gvar.begin(); it != gvar_end; ++it) {
+		 snprintf(buffer, 1024, fmt2, (*it).name().c_str(), (*it).theValue().c_str());
+                  xec_AddFontListItem(list_, buffer, 0);
+               }
+            }
+            if (defs) {
+               gvar = defs->server().server_variables();
+               for(it = gvar.begin(); it !=  gvar.end(); ++it) {
+		 snprintf(buffer, 1024, fmt1, (*it).name().c_str(), (*it).theValue().c_str());
+                  xec_AddFontListItem(list_, buffer, 0);
+               }
+
+               gvar = defs->server().user_variables();
+               std::sort(gvar.begin(), gvar.end(), cless_than());
+               for(it = gvar.begin(); it !=  gvar.end(); ++it) {
+		 snprintf(buffer, 1024, fmt2, (*it).name().c_str(), (*it).theValue().c_str());
+		 xec_AddFontListItem(list_, buffer, 0);
+               }
+            }
+         }
+         m = m->parent();
+      }
+   }
+   loading_ = false;
+}
+
+Boolean variables::enabled( node& n )
+{
+   int type = n.type();
+   if (type == NODE_SUPER || type == NODE_FAMILY || type == NODE_TASK || type == NODE_ALIAS) return True;
+   for(node* run = n.kids(); run; run = run->next())
+      if (run->type() == NODE_VARIABLE) return True;
+   return False;
+}
+
+void variables::browseCB( Widget w, XtPointer data )
+{
+   XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+   char *p = xec_GetString(cb->item);
+   if (*p == 'V') {
+      XmTextSetString(name_, (char*) "");
+      XmTextSetString(value_, (char*) "");
+   }
+   else {
+      char *q = p + 1;
+      char *r = p + 1;
+
+      while ( *r && *r != '=' )
+         r++;
+
+      *r = 0;
+
+      while ( *q && q[strlen(q) - 1] == ' ' )
+         q[strlen(q) - 1] = 0;
+
+      r += 2;
+
+      if (*p == '(') r[strlen(r) - 1] = 0;
+
+      while ( *r && r[strlen(r) - 1] == ' ' )
+         r[strlen(r) - 1] = 0;
+
+      XmTextSetString(name_, q);
+      XmTextSetString(value_, r);
+   }
+   nameCB(w, data);
+   valueCB(w, data);
+
+   XtFree(p);
+}
+
+/* from: http://www.ist.co.uk/motif/books/vol6A/ch-13.fm.html */
+/* find the item in the list that matches the specified pattern */
+#include <Xm/TextF.h>
+#define _REGEX_RE_COMP
+#include <regex.h>
+void search_item( Widget text_w, XtPointer client_data, XtPointer call_data, Widget nam,
+                  Widget val )
+{
+   Widget list_w = (Widget) client_data;
+   char *exp, *text, *newtext = XmTextFieldGetString(text_w);
+   XmString *strlist, *selectlist = NULL;
+   int cnt, j = 0;
+
+   if (!newtext || !*newtext) {
+      XtFree(newtext);
+      return;
+   }
+
+   if ((exp = re_comp(newtext))) {
+      printf("Error with re_comp(%s): %s\n", newtext, exp);
+      XtFree(newtext);
+      return;
+   }
+
+   XtVaGetValues(list_w, XmNitemCount, &cnt, XmNitems, &strlist, NULL);
+
+   while ( cnt-- ) {
+      if (!(text = (char *) xec_GetString(strlist[cnt]))) break;
+
+      if (re_exec(text) > 0) {
+         selectlist = (XmString *) XtRealloc((char *) selectlist, (j + 1) * (sizeof(XmString *)));
+         selectlist[j++] = XmStringCopy(strlist[cnt]);
+
+         char *p = xec_GetString(strlist[cnt]);
+         char *q = p + 1;
+         char *r = p + 1;
+         while ( *r && *r != '=' )
+            r++;
+         *r = 0;
+         while ( *q && q[strlen(q) - 1] == ' ' )
+            q[strlen(q) - 1] = 0;
+         r += 2;
+         if (*p == '(') r[strlen(r) - 1] = 0;
+         while ( *r && r[strlen(r) - 1] == ' ' )
+            r[strlen(r) - 1] = 0;
+         XmTextSetString(nam, q);
+         XmTextSetString(val, r);
+         *r = '=';
+         XtFree(p);
+      }
+      XtFree(text);
+   }
+   free(exp);
+   XtFree(newtext);
+
+   XtVaSetValues(list_w, XmNselectedItems, selectlist, XmNselectedItemCount, j, NULL);
+
+   while ( j-- )
+      XmStringFree(selectlist[j]);
+   // XmTextFieldSetString (text_w, "");
+}
+/* */
+
+void variables::findCB( Widget, XtPointer )
+{
+   char *name = XmTextGetString(name_);
+   search_item(name_, list_, NULL, name_, value_);
+   XtFree(name);
+}
+
+void variables::deleteCB( Widget, XtPointer )
+{
+   if (get_node()) {
+      char *name = XmTextGetString(name_);
+      const char* fullname = get_node()->full_name().c_str();
+      if (confirm::ask(False, "Delete variable %s for node %s", name, fullname)) {
+         // repeat get_node while suite may have been cancelled by another
+         // while answering this question
+         if (get_node()) {
+            if (get_node()->__node__()) /* ecflow */
+               get_node()->serv().command(clientName, "--alter", "delete", "variable", name,
+                                          fullname, NULL);
+            else
+               get_node()->serv().command("alter", "-vr", fullname, name, NULL);
+         }
+      }
+      XtFree(name);
+      update();
+   }
+   else
+      clear();
+}
+
+void variables::setCB( Widget, XtPointer )
+{
+   if (get_node()) {
+
+      char *name = XmTextGetString(name_);
+      char *value = XmTextGetString(value_);
+      Boolean ok = True;
+      node* n = get_node()->variableOwner(name);
+
+      if (n != 0 && n != get_node()) {
+         ok = confirm::ask(True, "This variable is already defined in the %s %s\n"
+                           "A new variable will be created for the selected node\n"
+                           "and hide the previous one\n"
+                           "Do you want to proceed?",
+                           n->type_name(), n->full_name().c_str());
+      }
+
+      if (n != 0 && n->isGenVariable(name) && ok) {
+         ok = confirm::ask(True, "This variable is a generated variable\n"
+                           "Do you want to proceed?");
+      }
+
+      if (ok) {
+         bool add = true;
+         if (get_node()->__node__()) add = get_node()->__node__()->variable(name)
+                  == ecf_node::none();
+         if (get_node()->__node__())
+            get_node()->serv().command(clientName, "--alter", add ? "add" : "change", "variable",
+                                       name, value, get_node()->full_name().c_str(), NULL);
+         else
+            get_node()->serv().command("alter", "-v", get_node()->full_name().c_str(), name, value,
+                                       NULL);
+         if (add) update();
+      }
+      XtFree(name);
+      XtFree(value);
+   }
+   else
+      clear();
+}
+
+void variables::nameCB( Widget, XtPointer )
+{
+   if (loading_) return;
+
+   char *p = XmTextGetString(name_);
+   if (get_node()) {
+      node *n = get_node()->variableOwner(p);
+      XtSetSensitive(delete_, n != 0 && (!n->isGenVariable(p) || n != get_node()));
+   }
+   else {
+      clear();
+   }
+   XtFree(p);
+}
+
+void variables::valueCB( Widget, XtPointer )
+{
+   if (loading_) return;
+
+   char *p = XmTextGetString(name_);
+   char *v = XmTextGetString(value_);
+   if (get_node()) {
+      const char *x = get_node()->variable(p).c_str();
+      XtSetSensitive(set_, (x == 0 || strcmp(x, v) != 0) && v[0] != 0);
+   }
+   else {
+      clear();
+   }
+   XtFree(v);
+   XtFree(p);
+}
+
diff --git a/ecflow_4_0_7/view/src/variables.h b/ecflow_4_0_7/view/src/variables.h
new file mode 100644
index 0000000..89c8b97
--- /dev/null
+++ b/ecflow_4_0_7/view/src/variables.h
@@ -0,0 +1,58 @@
+#ifndef variables_H
+#define variables_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uivariables.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+// 
+
+class variables : public panel, public variables_form_c {
+public:
+
+	variables(panel_window&);
+
+	~variables(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Variables"; }
+	virtual void show(node&);
+	virtual Boolean enabled(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+
+private:
+
+	variables(const variables&);
+	variables& operator=(const variables&);
+
+	bool loading_;
+
+	virtual void browseCB( Widget, XtPointer ) ;
+	virtual void deleteCB( Widget, XtPointer ) ;
+	virtual void nameCB( Widget, XtPointer ) ;
+	virtual void setCB( Widget, XtPointer ) ;
+	virtual void valueCB( Widget, XtPointer ) ;
+	virtual void findCB( Widget, XtPointer ) ;
+
+};
+
+inline void destroy(variables**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/viewer.cc b/ecflow_4_0_7/view/src/viewer.cc
new file mode 100644
index 0000000..8cd0a5d
--- /dev/null
+++ b/ecflow_4_0_7/view/src/viewer.cc
@@ -0,0 +1,57 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#ifndef viewer_H
+#include "viewer.h"
+#endif
+
+#ifndef gui_H
+#include "gui.h"
+#endif
+
+
+viewer::viewer()
+{
+}
+
+bool viewer::show(const char* cmd)
+{
+	FILE *f = popen(cmd,"r");
+	if(!f) {
+		gui::syserr(cmd);
+		return false;
+	}
+	start(f);
+	return true;
+}
+
+void viewer::ready(const char* line)
+{
+	gui::error("%s",line);
+}
+
+void viewer::done(FILE* f)
+{
+	end(pclose(f));
+}
+
+void viewer::end(bool)
+{
+	delete this;
+}
+
+viewer::~viewer()
+{
+}
diff --git a/ecflow_4_0_7/view/src/viewer.h b/ecflow_4_0_7/view/src/viewer.h
new file mode 100644
index 0000000..6029806
--- /dev/null
+++ b/ecflow_4_0_7/view/src/viewer.h
@@ -0,0 +1,134 @@
+#ifndef viewer_H
+#define viewer_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#ifdef NO_BOOL
+#include "bool.h"
+#endif
+
+#ifndef input_H
+#include "input.h"
+#endif
+
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+class viewer : public input {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	viewer();
+
+// -- Destructor
+
+    virtual ~viewer();
+
+// -- Convertors
+	// None
+
+// -- Operators
+	// None
+
+// -- Methods
+
+     virtual bool show(const char*);
+	 virtual void end(bool);
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+	viewer(const viewer&);
+	viewer& operator=(const viewer&);
+
+// -- Members
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+
+     void ready(const char*);
+     void done(FILE*);
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const viewer& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(viewer**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(viewer);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/why.cc b/ecflow_4_0_7/view/src/why.cc
new file mode 100644
index 0000000..742d6b4
--- /dev/null
+++ b/ecflow_4_0_7/view/src/why.cc
@@ -0,0 +1,64 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "why.h"
+#include "node.h"
+#include "error.h"
+#include "selection.h"
+#include "tmp_file.h"
+#include "Hyper.h"
+#include <stdio.h>
+#include <stdarg.h>
+
+/***********************************/
+
+why::why(panel_window& w):
+	panel(w)
+{
+}
+
+why::~why()
+{
+  forget_all();
+}
+
+void why::clear()
+{
+	forget_all();
+	HyperSetText(text_,"");
+}
+
+void why::show(node& n)
+{
+	forget_all();
+	node* parent = n.parent(); // SUP-421
+	while (parent) {
+	  observe(parent);
+	  parent = parent->parent();
+	}
+        std::stringstream ss;
+	n.why(ss);
+        HyperSetText(text_,(char*) ss.str().c_str());
+}
+
+void why::hyperCB(Widget w,XtPointer data)
+{
+	panel::hyper(w,data);
+}
+
+Boolean why::enabled(node& n)
+{
+	return n.isSimpleNode();
+}
diff --git a/ecflow_4_0_7/view/src/why.h b/ecflow_4_0_7/view/src/why.h
new file mode 100644
index 0000000..fa9acb1
--- /dev/null
+++ b/ecflow_4_0_7/view/src/why.h
@@ -0,0 +1,49 @@
+#ifndef why_H
+#define why_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "uiwhy.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#ifndef node_H
+#include "node.h"
+#endif
+
+class why : public panel, public why_form_c {
+public:
+	why(panel_window&);
+
+	~why(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Why?"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Widget widget() { return xd_rootwidget(); }
+	virtual Boolean enabled(node&);
+
+private:
+	why(const why&);
+	why& operator=(const why&);
+
+	virtual void hyperCB(Widget,XtPointer);
+};
+
+inline void destroy(why**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/window.cc b/ecflow_4_0_7/view/src/window.cc
new file mode 100644
index 0000000..31f7922
--- /dev/null
+++ b/ecflow_4_0_7/view/src/window.cc
@@ -0,0 +1,59 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include "window.h"
+#include <Xm/PushB.h>
+#include <X11/IntrinsicP.h>
+
+
+extern "C" {
+#include "xec.h"
+}
+#include "gui.h"
+
+
+window::window()
+  : menu_(0)
+{
+}
+
+window::~window()
+{
+  if(menu_) 
+    XtDestroyWidget(menu_);
+}
+
+void window::raise()
+{
+  CompositeWidget c = (CompositeWidget)shell();
+  for(unsigned int i = 0 ; i < c->composite.num_children; i++)
+    XtManageChild(c->composite.children[i]);
+  
+  XMapRaised(XtDisplay(shell()),XtWindow(shell()));
+}
+
+void window::set_menu(const char* name)
+{
+  if(!menu_)
+    {
+      menu_ = XmCreatePushButton(gui::windows(),(char*)"menu",0,0);
+      xec_SetUserData(menu_,this);
+      XtManageChild(menu_);
+    }
+  xec_SetLabel(menu_,name);
+}
+
+IMP(window)
diff --git a/ecflow_4_0_7/view/src/window.h b/ecflow_4_0_7/view/src/window.h
new file mode 100644
index 0000000..ec2ec8a
--- /dev/null
+++ b/ecflow_4_0_7/view/src/window.h
@@ -0,0 +1,44 @@
+#ifndef window_H
+#define window_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <Xm/Xm.h>
+
+#include "extent.h"
+
+class window : public extent<window> {
+public:
+
+	window();
+
+	~window(); // Change to virtual if base class
+
+	void raise();
+	virtual Widget shell() = 0;
+
+	void set_menu(const char*);
+
+private:
+
+	window(const window&);
+	window& operator=(const window&);
+
+	Widget menu_;
+};
+
+inline void destroy(window**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/x.c b/ecflow_4_0_7/view/src/x.c
new file mode 100644
index 0000000..f8c5aeb
--- /dev/null
+++ b/ecflow_4_0_7/view/src/x.c
@@ -0,0 +1,19 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+void main()
+{
+	printf("hello\n");
+}
diff --git a/ecflow_4_0_7/view/src/xcdp.menu b/ecflow_4_0_7/view/src/xcdp.menu
new file mode 100644
index 0000000..471f9c8
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xcdp.menu
@@ -0,0 +1,257 @@
+!===========================================================
+! Name        : 
+! Author      : 
+! Revision    : $Revision: #17 $ 
+!
+! Copyright 2009-2012 ECMWF. 
+! This software is licensed under the terms of the Apache Licence version 2.0 
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+! In applying this licence, ECMWF does not waive the privileges and immunities 
+! granted to it by virtue of its status as an intergovernmental organisation 
+! nor does it submit to any jurisdiction. 
+!
+! Description : 
+! this file may be found in 
+! - sources in order to generate  xcdp.menu.h
+! - ~/.ecflowrc/xcdp.menu # edit backup remove (reset)
+! - ~/ is preferred to $HOME
+! - menus can call system command
+!===========================================================
+!
+! Format
+!-------
+! menu TITLE 
+! {
+!	(vis flg,enable flg,title,command,question,answer)
+! }
+!
+!===========================================================
+!
+! Values for the status flags
+!----------------------------
+!
+!NONE ALL UNKNOWN SUSPENDED COMPLETE QUEUED SUBMITTED ACTIVE
+!ABORTED CLEAR SET SHUTDOWN HALTED
+!
+! Values for type flags
+!----------------------
+!
+!NONE ALL SERVER SUITE FAMILY TASK EVENT
+!
+! Values for visible flags
+!-------------------------
+!
+!NONE ALL SERVER SUITE FAMILY TASK EVENT
+!
+! Values for special flags
+!-------------------------
+! 
+!NONE ALL  HAS_TRIGGERS HAS_TIME HAS_DATE
+!
+!===========================================================
+
+!==============================================================================
+! Main menu
+!==============================================================================
+
+version 1 0 0 ;
+
+menu 'MAIN'
+{
+  (~SUSPENDED & NODE, ALL, 'Suspend',  'suspend  <full_name>')
+  (SUSPENDED & NODE,  ALL, 'Resume',   'resume <full_name>')
+
+  ( TASK, ~ACTIVE & ~SUBMITTED, 'Rerun', 'force queued <full_name>')
+  ( FAMILY, ~ACTIVE & ~SUBMITTED, 'Rerun', 'run <full_name>')
+
+  (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set complete', 
+    'force complete <full_name>',
+    'Have you checked that the job is not active anymore (jobstatus) ?', YES)
+  (TASK|ALIAS, UNKNOWN|QUEUED|ABORTED, 'Set complete', 
+    'force complete <full_name>')
+  (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set aborted', 
+    'force aborted <full_name>',
+    'Have you checked that the job is not active anymore (jobstatus) ?', YES)
+  (TASK|ALIAS, UNKNOWN|QUEUED|COMPLETE, 'Set aborted', 
+     'force aborted <full_name>')
+
+  (TASK|ALIAS, ~ACTIVE & ~SUBMITTED, 'Execute', 'run <full_name>')
+
+  (SUITE|TASK|FAMILY, ~ACTIVE & ~SUBMITTED, 'Requeue',
+     'requeue -f <full_name>', 
+     'Confirm requeuing of <full_name>', YES)
+
+  (SUITE|FAMILY, ABORTED | SUSPENDED, 'Requeue aborted',
+    'requeue -a <full_name>', 
+    'Confirm requeuing of aborted tasks from <full_name>', YES)
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (SUITE|TASK|FAMILY,(QUEUED) & (HAS_TRIGGERS|HAS_TIME|HAS_DATE),'Delete',MENU)
+  (NODE|ALIAS,ALL,'Special', MENU)
+  (NODE& ADMIN, ALL,'Force', MENU)
+  ((NODE|ALIAS)& ADMIN, ALL,'Order', MENU)
+
+  (ALL,ALL,'-',SEPARATOR ,'',YES)
+  (SUITE|FAMILY|TASK, ALL, 'Web...', 'url <full_name> ', '', YES)
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (SUITE & (OPER|ADMIN) ,UNKNOWN|COMPLETE,'Begin',
+        'begin <full_name>','',YES)
+
+  (SUITE & (OPER|ADMIN) ,~SUBMITTED & ~ACTIVE,'Cancel',
+        'cancel -y <full_name>',
+        'Do you really want to cancel suite <full_name> ?',NO)
+
+! Events
+!---------------------------------
+
+  (EVENT, CLEAR,     'Set'  , 'force set <full_name>',   '',YES)
+  (EVENT, SET,       'Clear', 'force clear <full_name>', '',YES)
+
+!!-----------------------------------
+
+  (SERVER & (ADMIN|OPER) & LOCKED , ALL , 'Unlock', 'unlock -y',
+        'Before going further, please check why the server was locked.',NO)
+	(ALL,ALL,'-',SEPARATOR,'',YES)
+
+!!-----------------------------------
+
+  (SERVER,SHUTDOWN|HALTED, 'Restart',  
+    'restart -y','Restart the server in <node_name>?' ,NO)
+  (SERVER,~SHUTDOWN,       'Shutdown', 
+    'shutdown -y','Shutdown the server in <node_name>?',NO)
+  (SERVER,~HALTED,         'Halt',     
+    'halt -y','Halt the server in <node_name>?',NO)
+  (SERVER,HALTED,          'Terminate',
+    'terminate -y','Terminate the server in <node_name>?',NO)
+  (ALL,ALL,'-',SEPARATOR,'',YES)
+  (SERVER,ALL,             'Checkpoint','check','',YES)
+  (SERVER,HALTED,          'Recover',   
+    'recover -y','Recover the server in <node_name>?',NO)
+
+!!-----------------------------------
+
+  (LIMIT , ALL, 'Reset' , 
+      'reset <full_name>', 'Confirm resetting <full_name>', YES)
+  (ALIAS , ALL, 'Remove', 
+    'cancel -y <full_name>', 'Confirm remove alias <full_name>', YES)
+
+!!-----------------------------------
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (TASK|LIMIT|LABEL|METER|REPEAT|VARIABLE, ALL , 'Edit...', WINDOW(Edit))
+  (TASK|ALIAS, ALL , 'Output...', WINDOW(Output) )
+
+  (TASK|ALIAS, SUBMITTED|ACTIVE , 'Status...',   WINDOW(Jobstatus))
+  (ALIAS, ALL , 'Job...', WINDOW(Job) )
+  (TASK|ALIAS, ALL , 'Script...', WINDOW(Script) )
+
+  (SERVER, ALL ,  'Suites...',   WINDOW(Suites)   )
+  (SERVER, ALL ,  'History...',  WINDOW(History)  )
+  (SERVER, ALL ,  'Zombies...',  WINDOW(Zombies)  )
+  (ALL,ALL,'-',SEPARATOR)
+  (SERVER, ALL ,  'Options...',  WINDOW(Options)  )
+}
+
+!==============================================================================
+! Status submenu
+!==============================================================================
+
+menu 'Status'
+{
+  (SUITE|TASK|FAMILY, ~SUSPENDED,'Suspend', 'suspend <full_name>', '',YES)
+  (SUITE|TASK|FAMILY, SUSPENDED ,'Resume',  'resume <full_name>',  '',YES)
+
+  (ALL,ALL,'-',SEPARATOR)
+
+  (TASK, ~ACTIVE & ~SUBMITTED, 'Rerun', 'force queued <full_name>', '',YES)
+  (TASK, ~COMPLETE, 'Set complete', 'force complete <full_name>', '',YES)
+
+  (SUITE|TASK|FAMILY|ALIAS, ~ACTIVE & ~SUBMITTED,
+   'Requeue','requeue -f <full_name>', 'Confirm requeuing of <full_name>', YES)
+
+  (SUITE|FAMILY, ABORTED | SUSPENDED,
+	'Requeue aborted','requeue -a <full_name>', 
+	'Confirm requeuing aborted tasks below <full_name>', YES)
+}
+
+!==============================================================================
+! Suite submenu
+!==============================================================================
+
+menu 'Suite'
+{
+  (SUITE,UNKNOWN|COMPLETE,'Begin','begin <full_name>','',YES)
+
+  (SUITE,ALL,'Cancel','cancel -y <full_name>',
+    'Do you really want to cancel <full_name> ?',NO)
+
+  (ALL,ALL,'-',SEPARATOR)
+}
+
+!==============================================================================
+! Delete submenu
+!==============================================================================
+
+menu 'Delete'
+{
+  (ALL,HAS_TRIGGERS|HAS_TIME|HAS_DATE, 'All dependencies',
+    'delete -tdT <full_name>')
+  (ALL,HAS_TRIGGERS, 'Trigger dependencies','delete -T <full_name>')
+  (ALL,HAS_TIME, 'Time dependencies','delete -t <full_name>')
+  (ALL,QUEUED,   'Date dependencies','delete -d <full_name>')
+}
+
+menu "Order"
+{
+  (ALL,ALL,'Top','order -t top <full_name>')
+  (ALL,ALL,'Up','order -t up <full_name>')
+  (ALL,ALL,'Down','order -t down <full_name>')
+  (ALL,ALL,'Bottom','order -t bottom <full_name>')
+  (ALL,ALL,'Alphabetically','order -t alphabetical <full_name>')
+}
+
+menu "Force"
+{
+  (NODE, ~UNKNOWN, 'Unknown',   'force -q -r unknown <full_name>')
+  (NODE, ~COMPLETE & ~ACTIVE & ~SUBMITTED, 'Complete', 
+   'force =q -r complete <full_name>', 
+   'Check running/queued jobs and Confirm force complete of <full_name>', YES)
+  (NODE, ~QUEUED & ~ACTIVE & ~SUBMITTED,   'Queued',   
+   'force -q -r queued <full_name>')
+  (NODE, ~SUBMITTED & ~ACTIVE,'Submitted',
+   'force -q -r submitted <full_name>')
+  (NODE, ~ACTIVE,   'Active',   'force -q -r active <full_name>')
+  (NODE, ~ABORTED,  'Aborted',  'force -q -r aborted <full_name>', 
+   'Check running/queued jobs and Confirm force submitted of <full_name>', YES)
+}
+
+menu "Special"
+{
+  (SUITE|FAMILY,(ACTIVE|SUBMITTED|ABORTED),'Kill',
+   'kill <full_name>','',YES)
+  (TASK|ALIAS,(ACTIVE|SUBMITTED),'Kill','kill <full_name>','',YES)
+
+  (ALL,ALL,'Check',WINDOW(Check),'',YES)
+  (TASK|ALIAS,ALL,'Free password','alter -v <full_name> SMSPASS FREE')
+  (TASK|ALIAS,ALL,'ClearZ','alter -F zombie <full_name>')
+  ((SUITE|FAMILY), SELECTION, 'Plug into selected node', PLUG)
+  (SUITE|SERVER, ALL, 'Collect...',  WINDOW(Collector))
+  (SERVER|SUITE,ALL,'Windows', MENU)
+  (ALL,ALL,'echo', 'sh echo ok')
+}
+
+menu "Windows"
+{
+  (SERVER, ALL , 'Info...', WINDOW(Info))
+  (SERVER, ALL , 'Man...',  WINDOW(Manual))
+  (SERVER, ALL , 'Var...',  WINDOW(Variables))
+  (SERVER, ALL , 'Msg...',  WINDOW(Messages))
+  (SERVER, ALL , 'Why...',  WINDOW(Why))
+  (SERVER, ALL , 'Triggers...',  WINDOW(Triggers))
+  (SERVER, ALL , 'Check...',  WINDOW(Check))
+  (SERVER, ALL , 'Jobstatus...',  WINDOW(Jobstatus))
+}
diff --git a/ecflow_4_0_7/view/src/xcdp.menu.h b/ecflow_4_0_7/view/src/xcdp.menu.h
new file mode 100644
index 0000000..d4515e2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xcdp.menu.h
@@ -0,0 +1,258 @@
+(char*) " !=========================================================== ",
+(char*) " ! Name : ",
+(char*) " ! Author : ",
+(char*) " ! Revision : $Revision: #17 $ ",
+(char*) " ! ",
+(char*) " ! Copyright 2009-2012 ECMWF. ",
+(char*) " ! This software is licensed under the terms of the Apache Licence version 2.0 ",
+(char*) " ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. ",
+(char*) " ! In applying this licence, ECMWF does not waive the privileges and immunities ",
+(char*) " ! granted to it by virtue of its status as an intergovernmental organisation ",
+(char*) " ! nor does it submit to any jurisdiction. ",
+(char*) " ! ",
+(char*) " ! Description : ",
+(char*) " ! this file may be found in ",
+(char*) " ! - sources in order to generate xcdp.menu.h ",
+(char*) " ! - ~/.ecflowrc/xcdp.menu # edit backup remove (reset) ",
+(char*) " ! - ~/ is preferred to $HOME ",
+(char*) " ! - menus can call system command ",
+(char*) " !=========================================================== ",
+(char*) " ! ",
+(char*) " ! Format ",
+(char*) " !------- ",
+(char*) " ! menu TITLE ",
+(char*) " ! { ",
+(char*) " ! (vis flg,enable flg,title,command,question,answer) ",
+(char*) " ! } ",
+(char*) " ! ",
+(char*) " !=========================================================== ",
+(char*) " ! ",
+(char*) " ! Values for the status flags ",
+(char*) " !---------------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL UNKNOWN SUSPENDED COMPLETE QUEUED SUBMITTED ACTIVE ",
+(char*) " !ABORTED CLEAR SET SHUTDOWN HALTED ",
+(char*) " ! ",
+(char*) " ! Values for type flags ",
+(char*) " !---------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL SERVER SUITE FAMILY TASK EVENT ",
+(char*) " ! ",
+(char*) " ! Values for visible flags ",
+(char*) " !------------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL SERVER SUITE FAMILY TASK EVENT ",
+(char*) " ! ",
+(char*) " ! Values for special flags ",
+(char*) " !------------------------- ",
+(char*) " ! ",
+(char*) " !NONE ALL HAS_TRIGGERS HAS_TIME HAS_DATE ",
+(char*) " ! ",
+(char*) " !=========================================================== ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Main menu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " version 1 0 0 ; ",
+(char*) "  ",
+(char*) " menu 'MAIN' ",
+(char*) " { ",
+(char*) " (~SUSPENDED & NODE, ALL, 'Suspend', 'suspend <full_name>') ",
+(char*) " (SUSPENDED & NODE, ALL, 'Resume', 'resume <full_name>') ",
+(char*) "  ",
+(char*) " ( TASK, ~ACTIVE & ~SUBMITTED, 'Rerun', 'force queued <full_name>') ",
+(char*) " ( FAMILY, ~ACTIVE & ~SUBMITTED, 'Rerun', 'run <full_name>') ",
+(char*) "  ",
+(char*) " (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set complete', ",
+(char*) " 'force complete <full_name>', ",
+(char*) " 'Have you checked that the job is not active anymore (jobstatus) ?', YES) ",
+(char*) " (TASK|ALIAS, UNKNOWN|QUEUED|ABORTED, 'Set complete', ",
+(char*) " 'force complete <full_name>') ",
+(char*) " (TASK|ALIAS, SUBMITTED|ACTIVE, 'Set aborted', ",
+(char*) " 'force aborted <full_name>', ",
+(char*) " 'Have you checked that the job is not active anymore (jobstatus) ?', YES) ",
+(char*) " (TASK|ALIAS, UNKNOWN|QUEUED|COMPLETE, 'Set aborted', ",
+(char*) " 'force aborted <full_name>') ",
+(char*) "  ",
+(char*) " (TASK|ALIAS, ~ACTIVE & ~SUBMITTED, 'Execute', 'run <full_name>') ",
+(char*) "  ",
+(char*) " (SUITE|TASK|FAMILY, ~ACTIVE & ~SUBMITTED, 'Requeue', ",
+(char*) " 'requeue -f <full_name>', ",
+(char*) " 'Confirm requeuing of <full_name>', YES) ",
+(char*) "  ",
+(char*) " (SUITE|FAMILY, ABORTED | SUSPENDED, 'Requeue aborted', ",
+(char*) " 'requeue -a <full_name>', ",
+(char*) " 'Confirm requeuing of aborted tasks from <full_name>', YES) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (SUITE|TASK|FAMILY,(QUEUED) & (HAS_TRIGGERS|HAS_TIME|HAS_DATE),'Delete',MENU) ",
+(char*) " (NODE|ALIAS,ALL,'Special', MENU) ",
+(char*) " (NODE& ADMIN, ALL,'Force', MENU) ",
+(char*) " ((NODE|ALIAS)& ADMIN, ALL,'Order', MENU) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR ,'',YES) ",
+(char*) " (SUITE|FAMILY|TASK, ALL, 'Web...', 'url <full_name> ', '', YES) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (SUITE & (OPER|ADMIN) ,UNKNOWN|COMPLETE,'Begin', ",
+(char*) " 'begin <full_name>','',YES) ",
+(char*) "  ",
+(char*) " (SUITE & (OPER|ADMIN) ,~SUBMITTED & ~ACTIVE,'Cancel', ",
+(char*) " 'cancel -y <full_name>', ",
+(char*) " 'Do you really want to cancel suite <full_name> ?',NO) ",
+(char*) "  ",
+(char*) " ! Events ",
+(char*) " !--------------------------------- ",
+(char*) "  ",
+(char*) " (EVENT, CLEAR, 'Set' , 'force set <full_name>', '',YES) ",
+(char*) " (EVENT, SET, 'Clear', 'force clear <full_name>', '',YES) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (SERVER & (ADMIN|OPER) & LOCKED , ALL , 'Unlock', 'unlock -y', ",
+(char*) " 'Before going further, please check why the server was locked.',NO) ",
+(char*) " (ALL,ALL,'-',SEPARATOR,'',YES) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (SERVER,SHUTDOWN|HALTED, 'Restart', ",
+(char*) " 'restart -y','Restart the server in <node_name>?' ,NO) ",
+(char*) " (SERVER,~SHUTDOWN, 'Shutdown', ",
+(char*) " 'shutdown -y','Shutdown the server in <node_name>?',NO) ",
+(char*) " (SERVER,~HALTED, 'Halt', ",
+(char*) " 'halt -y','Halt the server in <node_name>?',NO) ",
+(char*) " (SERVER,HALTED, 'Terminate', ",
+(char*) " 'terminate -y','Terminate the server in <node_name>?',NO) ",
+(char*) " (ALL,ALL,'-',SEPARATOR,'',YES) ",
+(char*) " (SERVER,ALL, 'Checkpoint','check','',YES) ",
+(char*) " (SERVER,HALTED, 'Recover', ",
+(char*) " 'recover -y','Recover the server in <node_name>?',NO) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (LIMIT , ALL, 'Reset' , ",
+(char*) " 'reset <full_name>', 'Confirm resetting <full_name>', YES) ",
+(char*) " (ALIAS , ALL, 'Remove', ",
+(char*) " 'cancel -y <full_name>', 'Confirm remove alias <full_name>', YES) ",
+(char*) "  ",
+(char*) " !!----------------------------------- ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (TASK|LIMIT|LABEL|METER|REPEAT|VARIABLE, ALL , 'Edit...', WINDOW(Edit)) ",
+(char*) " (TASK|ALIAS, ALL , 'Output...', WINDOW(Output) ) ",
+(char*) "  ",
+(char*) " (TASK|ALIAS, SUBMITTED|ACTIVE , 'Status...', WINDOW(Jobstatus)) ",
+(char*) " (ALIAS, ALL , 'Job...', WINDOW(Job) ) ",
+(char*) " (TASK|ALIAS, ALL , 'Script...', WINDOW(Script) ) ",
+(char*) "  ",
+(char*) " (SERVER, ALL , 'Suites...', WINDOW(Suites) ) ",
+(char*) " (SERVER, ALL , 'History...', WINDOW(History) ) ",
+(char*) " (SERVER, ALL , 'Zombies...', WINDOW(Zombies) ) ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " (SERVER, ALL , 'Options...', WINDOW(Options) ) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Status submenu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " menu 'Status' ",
+(char*) " { ",
+(char*) " (SUITE|TASK|FAMILY, ~SUSPENDED,'Suspend', 'suspend <full_name>', '',YES) ",
+(char*) " (SUITE|TASK|FAMILY, SUSPENDED ,'Resume', 'resume <full_name>', '',YES) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) "  ",
+(char*) " (TASK, ~ACTIVE & ~SUBMITTED, 'Rerun', 'force queued <full_name>', '',YES) ",
+(char*) " (TASK, ~COMPLETE, 'Set complete', 'force complete <full_name>', '',YES) ",
+(char*) "  ",
+(char*) " (SUITE|TASK|FAMILY|ALIAS, ~ACTIVE & ~SUBMITTED, ",
+(char*) " 'Requeue','requeue -f <full_name>', 'Confirm requeuing of <full_name>', YES) ",
+(char*) "  ",
+(char*) " (SUITE|FAMILY, ABORTED | SUSPENDED, ",
+(char*) " 'Requeue aborted','requeue -a <full_name>', ",
+(char*) " 'Confirm requeuing aborted tasks below <full_name>', YES) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Suite submenu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " menu 'Suite' ",
+(char*) " { ",
+(char*) " (SUITE,UNKNOWN|COMPLETE,'Begin','begin <full_name>','',YES) ",
+(char*) "  ",
+(char*) " (SUITE,ALL,'Cancel','cancel -y <full_name>', ",
+(char*) " 'Do you really want to cancel <full_name> ?',NO) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'-',SEPARATOR) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " !============================================================================== ",
+(char*) " ! Delete submenu ",
+(char*) " !============================================================================== ",
+(char*) "  ",
+(char*) " menu 'Delete' ",
+(char*) " { ",
+(char*) " (ALL,HAS_TRIGGERS|HAS_TIME|HAS_DATE, 'All dependencies', ",
+(char*) " 'delete -tdT <full_name>') ",
+(char*) " (ALL,HAS_TRIGGERS, 'Trigger dependencies','delete -T <full_name>') ",
+(char*) " (ALL,HAS_TIME, 'Time dependencies','delete -t <full_name>') ",
+(char*) " (ALL,QUEUED, 'Date dependencies','delete -d <full_name>') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Order\" ",
+(char*) " { ",
+(char*) " (ALL,ALL,'Top','order -t top <full_name>') ",
+(char*) " (ALL,ALL,'Up','order -t up <full_name>') ",
+(char*) " (ALL,ALL,'Down','order -t down <full_name>') ",
+(char*) " (ALL,ALL,'Bottom','order -t bottom <full_name>') ",
+(char*) " (ALL,ALL,'Alphabetically','order -t alphabetical <full_name>') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Force\" ",
+(char*) " { ",
+(char*) " (NODE, ~UNKNOWN, 'Unknown', 'force -q -r unknown <full_name>') ",
+(char*) " (NODE, ~COMPLETE & ~ACTIVE & ~SUBMITTED, 'Complete', ",
+(char*) " 'force =q -r complete <full_name>', ",
+(char*) " 'Check running/queued jobs and Confirm force complete of <full_name>', YES) ",
+(char*) " (NODE, ~QUEUED & ~ACTIVE & ~SUBMITTED, 'Queued', ",
+(char*) " 'force -q -r queued <full_name>') ",
+(char*) " (NODE, ~SUBMITTED & ~ACTIVE,'Submitted', ",
+(char*) " 'force -q -r submitted <full_name>') ",
+(char*) " (NODE, ~ACTIVE, 'Active', 'force -q -r active <full_name>') ",
+(char*) " (NODE, ~ABORTED, 'Aborted', 'force -q -r aborted <full_name>', ",
+(char*) " 'Check running/queued jobs and Confirm force submitted of <full_name>', YES) ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Special\" ",
+(char*) " { ",
+(char*) " (SUITE|FAMILY,(ACTIVE|SUBMITTED|ABORTED),'Kill', ",
+(char*) " 'kill <full_name>','',YES) ",
+(char*) " (TASK|ALIAS,(ACTIVE|SUBMITTED),'Kill','kill <full_name>','',YES) ",
+(char*) "  ",
+(char*) " (ALL,ALL,'Check',WINDOW(Check),'',YES) ",
+(char*) " (TASK|ALIAS,ALL,'Free password','alter -v <full_name> SMSPASS FREE') ",
+(char*) " (TASK|ALIAS,ALL,'ClearZ','alter -F zombie <full_name>') ",
+(char*) " ((SUITE|FAMILY), SELECTION, 'Plug into selected node', PLUG) ",
+(char*) " (SUITE|SERVER, ALL, 'Collect...', WINDOW(Collector)) ",
+(char*) " (SERVER|SUITE,ALL,'Windows', MENU) ",
+(char*) " (ALL,ALL,'echo', 'sh echo ok') ",
+(char*) " } ",
+(char*) "  ",
+(char*) " menu \"Windows\" ",
+(char*) " { ",
+(char*) " (SERVER, ALL , 'Info...', WINDOW(Info)) ",
+(char*) " (SERVER, ALL , 'Man...', WINDOW(Manual)) ",
+(char*) " (SERVER, ALL , 'Var...', WINDOW(Variables)) ",
+(char*) " (SERVER, ALL , 'Msg...', WINDOW(Messages)) ",
+(char*) " (SERVER, ALL , 'Why...', WINDOW(Why)) ",
+(char*) " (SERVER, ALL , 'Triggers...', WINDOW(Triggers)) ",
+(char*) " (SERVER, ALL , 'Check...', WINDOW(Check)) ",
+(char*) " (SERVER, ALL , 'Jobstatus...', WINDOW(Jobstatus)) ",
+(char*) " } ",
+NULL
diff --git a/ecflow_4_0_7/view/src/xdclass.h b/ecflow_4_0_7/view/src/xdclass.h
new file mode 100644
index 0000000..bbe8c55
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xdclass.h
@@ -0,0 +1,225 @@
+#ifndef XDCLASS_H
+#define XDCLASS_H
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #4 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#ifdef __cplusplus
+
+#include <Xm/Xm.h>
+#include <stdlib.h>
+#pragma GCC diagnostic ignored "-Wwrite-strings"
+
+class xd_base_c
+{
+    public:
+	xd_base_c() {_xd_rootwidget=NULL;}
+	Widget xd_rootwidget() const {return _xd_rootwidget;}
+    protected:
+	Widget _xd_rootwidget;
+    private:
+	void operator=(xd_base_c&); // No assignment
+	// Certain C++ compilers (eg gcc 2.5) require there to be an
+	// implementation of the copy constructor. If your application
+	// fails to link try using the second version of the constructor
+	//xd_base_c(xd_base_c&) ;           // No default copy
+	xd_base_c(xd_base_c&) { abort();}   // No default copy
+};
+
+class xd_XtWidget_c: public xd_base_c
+{
+    public:
+	xd_XtWidget_c();
+	void SetValue(String name, XtArgVal value);
+	void SetValues(ArgList args, Cardinal num_args);
+	void VaSetValues(String name,...);
+	void GetValue(String name, void *value);
+	void GetValues(ArgList args, Cardinal num_args);
+	void VaGetValues(String name,...);
+	void Map();
+	void Unmap();
+	virtual void xd_enable();
+	virtual void xd_disable();
+	virtual void xd_destroy();
+};
+
+class xd_TopLevelShell_c: public xd_XtWidget_c
+{
+};
+
+class xd_ApplicationShell_c: public xd_TopLevelShell_c
+{
+    public:
+	void xd_exit(int status=0);
+	void Realize();
+};
+
+class xd_ChildWidget_c: public xd_XtWidget_c
+{
+    public:
+	virtual void xd_show()=0;
+	virtual void xd_hide()=0;
+	void Manage();
+	void Unmanage();
+};
+
+class xd_XmDialog_c: public xd_ChildWidget_c
+{
+    public:
+	xd_XmDialog_c();
+	virtual void xd_show();
+	virtual void xd_hide();
+	void Raise();
+    protected:
+	Widget xd_getchildwidget();
+	Widget xd_childwidget;
+};
+
+class xd_NonShellWidget_c: public xd_ChildWidget_c
+{
+    public:
+	virtual void xd_show();
+	virtual void xd_hide();
+};
+
+class xd_XmLabel_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmCascadeButton_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmDrawnButton_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmPushButton_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmToggleButton_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmArrowButton_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmList_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmScrollBar_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmSeparator_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmText_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmTextField_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmBulletinBoard_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmRowColumn_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmRadioBox_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmDrawingArea_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmPanedWindow_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmFrame_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmScale_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmScrolledWindow_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmScrolledText_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmScrolledList_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmMainWindow: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmSelectionBox_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmFileSelectionBox_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmCommand_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmMessageBox_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmMainWindow_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmForm_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmMenuBar_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmPulldownMenu_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmPopupMenu_c: public xd_NonShellWidget_c
+{
+};
+
+class xd_XmOptionMenu_c: public xd_NonShellWidget_c
+{
+};
+
+#endif /*__cplusplus*/
+#endif /*XDCLASS_H*/
diff --git a/ecflow_4_0_7/view/src/xdxmdialog.cc b/ecflow_4_0_7/view/src/xdxmdialog.cc
new file mode 100644
index 0000000..e65f691
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xdxmdialog.cc
@@ -0,0 +1,66 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <Xm/DialogS.h>
+
+#include <xdclass.h>
+
+xd_XmDialog_c::xd_XmDialog_c()
+{
+    xd_childwidget=0;
+    return;
+}
+
+Widget xd_XmDialog_c::xd_getchildwidget()
+{
+    if (!xd_childwidget)
+    {
+	Cardinal numchildren;
+	GetValue(XmNnumChildren, &numchildren);
+	if (numchildren!=0)
+	{
+	    WidgetList children;
+	    GetValue(XmNchildren, &children);
+	    xd_childwidget=*children;
+	}
+    }
+    return xd_childwidget;
+}
+
+void xd_XmDialog_c::xd_show()
+{
+    if (!_xd_rootwidget) // Nothing to show
+	return;
+    if (!xd_getchildwidget()) // Nothing to show
+	return;
+    XtManageChild(xd_childwidget);
+    return;
+}
+
+void xd_XmDialog_c::xd_hide()
+{
+    if (!_xd_rootwidget) // Nothing to hide
+	return;
+    if (!xd_getchildwidget()) // Nothing to hide
+	return;
+    XtUnmanageChild(xd_childwidget);
+    return;
+}
+
+void xd_XmDialog_c::Raise()
+{
+    (void) XRaiseWindow(XtDisplay(_xd_rootwidget), XtWindow(_xd_rootwidget));
+    return;
+}
diff --git a/ecflow_4_0_7/view/src/xdxtclass.cc b/ecflow_4_0_7/view/src/xdxtclass.cc
new file mode 100644
index 0000000..4bd9ee5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xdxtclass.cc
@@ -0,0 +1,223 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include <xdclass.h>
+
+xd_XtWidget_c::xd_XtWidget_c()
+{
+    _xd_rootwidget=0;
+    return;
+}
+
+void xd_XtWidget_c::SetValue(String name, XtArgVal value)
+{
+    Arg al[1];
+    Cardinal ac=0;
+    XtSetArg(al[ac], name, value); ac++;
+    XtSetValues(_xd_rootwidget, al, ac);
+    return;
+}
+
+void xd_XtWidget_c::SetValues(ArgList args, Cardinal num_args)
+{
+    XtSetValues(_xd_rootwidget, args, num_args);
+    return;
+}
+
+void xd_XtWidget_c::VaSetValues(String name,...)
+{
+    String attr;
+    int count=1;
+    va_list ap;
+
+    /* Ignore empty argument list */
+    if (name==NULL)
+	return;
+
+    /* First count the (non-empty) argument list */
+    va_start(ap, name);
+
+    va_arg(ap, XtArgVal); // Pop first value
+    for (attr = va_arg(ap, String); attr != NULL;
+			attr = va_arg(ap, String))
+    {
+	va_arg(ap, XtArgVal); // Pop value
+	++count;
+    }
+    va_end(ap);
+
+    /* Now transfer values into an ArgList and throw at XtSetValues*/
+
+    ArgList al=new Arg[count];
+    XtArgVal value;
+    Cardinal ac=0;
+
+    va_start(ap, name);
+    value=va_arg(ap, XtArgVal);
+    XtSetArg(al[ac], name, value); ac++;
+    for (attr = va_arg(ap, String); attr != NULL;
+			attr = va_arg(ap, String))
+    {
+	value=va_arg(ap, XtArgVal);
+	if (value)
+	{
+	    XtSetArg(al[ac], attr, value); ac++;
+	}
+    }
+    va_end(ap);
+    XtSetValues(_xd_rootwidget, al, ac);
+
+    /* Tidy up - commented out version is for aged compilers */
+    //delete [count]al;
+    delete []al;
+    return;
+}
+
+void xd_XtWidget_c::GetValue(String name, void* value)
+{
+    Arg al[1];
+    Cardinal ac=0;
+    XtSetArg(al[ac], name, value); ac++;
+    XtGetValues(_xd_rootwidget, al, ac);
+    return;
+}
+
+void xd_XtWidget_c::GetValues(ArgList args, Cardinal num_args)
+{
+    XtGetValues(_xd_rootwidget, args, num_args);
+    return;
+}
+
+void xd_XtWidget_c::VaGetValues(String name,...)
+{
+    String attr;
+    int count=1;
+    va_list ap;
+
+    /* Ignore empty argument list */
+    if (name==NULL)
+	return;
+
+    /* First count the (non-empty) argument list */
+    va_start(ap, name);
+
+    va_arg(ap, XtArgVal); // Pop first value
+    for (attr = va_arg(ap, String); attr != NULL;
+			attr = va_arg(ap, String))
+    {
+	va_arg(ap, XtArgVal); // Pop value
+	++count;
+    }
+    va_end(ap);
+
+    /* Now transfer values into an ArgList and throw at XtGetValues*/
+
+    ArgList al=new Arg[count];
+    XtArgVal value;
+    Cardinal ac=0;
+
+    va_start(ap, name);
+    value=va_arg(ap, XtArgVal);
+    XtSetArg(al[ac], name, value); ac++;
+    for (attr = va_arg(ap, String); attr != NULL;
+			attr = va_arg(ap, String))
+    {
+	value=va_arg(ap, XtArgVal);
+	if (value)
+	{
+	    XtSetArg(al[ac], attr, value); ac++;
+	}
+    }
+    va_end(ap);
+    XtGetValues(_xd_rootwidget, al, ac);
+
+    /* Tidy up - commented out version is for aged compilers */
+    //delete [count]al;
+    delete []al;
+    return;
+}
+
+void xd_XtWidget_c::Map()
+{
+    XtMapWidget(_xd_rootwidget);
+    return;
+}
+
+void xd_XtWidget_c::Unmap()
+{
+    XtUnmapWidget(_xd_rootwidget);
+    return;
+}
+
+void xd_XtWidget_c::xd_enable()
+{
+    XtSetSensitive(_xd_rootwidget, TRUE);
+    return;
+}
+
+void xd_XtWidget_c::xd_disable()
+{
+    XtSetSensitive(_xd_rootwidget, FALSE);
+    return;
+}
+
+void xd_XtWidget_c::xd_destroy()
+{
+    if (_xd_rootwidget){
+	XtDestroyWidget(_xd_rootwidget);
+	_xd_rootwidget=0;
+    }
+    return;
+}
+
+void xd_ApplicationShell_c::xd_exit(int status)
+{
+    exit(status);
+    return;
+}
+
+void xd_ApplicationShell_c::Realize()
+{
+    XtRealizeWidget(_xd_rootwidget);
+    return;
+}
+
+void xd_ChildWidget_c::Manage()
+{
+    XtManageChild(_xd_rootwidget);
+    return;
+}
+
+void xd_ChildWidget_c::Unmanage()
+{
+    XtUnmanageChild(_xd_rootwidget);
+    return;
+}
+
+void xd_NonShellWidget_c::xd_show()
+{
+    Map();
+    return;
+}
+
+void xd_NonShellWidget_c::xd_hide()
+{
+    Unmap();
+    return;
+}
diff --git a/ecflow_4_0_7/view/src/xec.h b/ecflow_4_0_7/view/src/xec.h
new file mode 100644
index 0000000..996048f
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xec.h
@@ -0,0 +1,24 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#include <stdio.h>
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+#include "xecp.h"
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
diff --git a/ecflow_4_0_7/view/src/xecp.h b/ecflow_4_0_7/view/src/xecp.h
new file mode 100644
index 0000000..f2a37a0
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xecp.h
@@ -0,0 +1,75 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #3 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+/* xec_Cursor.c */
+void xec_SetWatchCursor(Widget w);
+void xec_ResetCursor(Widget w);
+
+/* xec_Label.c */
+void xec_SetLabel(Widget w, const char *title);
+void xec_VaSetLabel(Widget w, const char *fmt, ...);
+
+/* xec_List.c */
+void xec_RemoveListItem(Widget w, char *p);
+void xec_AddListMax(Widget w, int max, char *p);
+void xec_VaAddListMax(Widget w, int max, char *fmt, ...);
+void xec_ListSelectAll(Widget w);
+void xec_AddListItem(Widget w, char *p);
+Boolean xec_AddListItemUnique(Widget w, char *p, Boolean sel);
+void xec_VaAddListItem(Widget w, char *fmt, ...);
+void xec_SetListItems(Widget w, XmString list[], int count);
+int xec_DumpList(FILE *f, char *fmt, Widget w);
+Boolean xec_ListSearch(Widget w, char *word, Boolean nocase, Boolean fromstart, Boolean wrap);
+void xec_ListSelect(Widget w, int n);
+void xec_ListItemSelect(Widget w, const char*);
+void xec_AddFontListItem(Widget list, char *buffer, Boolean bold);
+void xec_ReplaceListItem(Widget w,const char* from,const char* to);
+
+/* xec_Regexp.c */
+int xec_compile(char *w);
+int xec_step(char *p);
+
+/* xec_Strings.c */
+XmString xec_NewString(const char *s);
+int xec_BuildXmStringList(XmString **list, char *p, int *count);
+int xec_FreeXmStringList(XmString *list, int count);
+char *xec_GetString(XmString string);
+
+/* xec_Text.c */
+int regexp_find(const char *word, const char *buffer, int nocase, int *from, int *to);
+char *xec_TextGetString(Widget w, long *length);
+void xec_TextFreeString(char *p);
+Boolean xec_TextSearch(Widget w, char *word, Boolean nocase, Boolean regex, Boolean back, Boolean fromstart, Boolean wrap);
+char *xec_GetText(Widget w, char buf[]);
+int xec_LoadText(Widget Text, const char *fname, Boolean include);
+void *xec_MapText(Widget w, const char *fname, int *z);
+void xec_UnmapText(void *x);
+int xec_SaveText(Widget w, char *fname);
+int xec_DumpText(FILE *fp, Widget w);
+void xec_PrintText(Widget w, char *cmd);
+void xec_ReplaceTextSelection(Widget w, char *p, Boolean sel);
+
+/* xec_Toggle.c */
+void xec_SetToggle(Widget w, int set);
+int xec_GetToggle(Widget w);
+
+/* xec_Widget.c */
+void *xec_GetUserData(Widget w);
+void xec_SetUserData(Widget w, void *p);
+void xec_SetColor(Widget w, Pixel p, const char *which);
+void xec_ShowWidget(Widget w);
+void xec_Invert(Widget w);
+void xec_ManageAll(Widget w);
+void xec_UnmanageAll(Widget w);
diff --git a/ecflow_4_0_7/view/src/xmstring.cc b/ecflow_4_0_7/view/src/xmstring.cc
new file mode 100644
index 0000000..44ee4e5
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xmstring.cc
@@ -0,0 +1,107 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "xmstring.h"
+
+
+xmstring::xmstring(const char* s,const char* font):
+	str_(0)
+{
+
+	if(!s) return;
+
+	if(font == 0) font = "normal";
+
+
+	if(*s == '\n')
+	{
+		str_ = XmStringSeparatorCreate();
+		*this += xmstring(s+1,font);
+		return;
+	}
+
+
+	if(strchr(s,'\n'))
+	{
+
+		XmString xms1;
+		XmString xms2;
+		XmString line;
+		XmString separator;
+		char     *p;
+		char     *t = XtNewString(s);	/* Make a copy for strtok not to */
+                                 	/* damage the original string    */
+
+		separator = XmStringSeparatorCreate();
+		p         = strtok(t,"\n");
+		xms1      = XmStringCreateLtoR(p,(char*)font);
+
+		while ((p = strtok(NULL,"\n")))
+		{
+			line = XmStringCreateLtoR(p,(char*)font);
+			xms2 = XmStringConcat(xms1,separator);
+			XmStringFree(xms1);
+			xms1 = XmStringConcat(xms2,line);
+			XmStringFree(xms2);
+			XmStringFree(line);
+		}
+
+		XmStringFree(separator);
+		XtFree(t);
+
+		str_ =  xms1;
+	}
+	else str_ = XmStringCreateLtoR((char*)s,(char*)font);
+}
+
+xmstring::~xmstring()
+{
+	if(str_)
+		XmStringFree(str_);
+}
+
+xmstring::xmstring(XmString s):
+	str_(XmStringCopy(s))
+{
+}
+
+xmstring::xmstring(const xmstring& other):
+	str_(other.str_?XmStringCopy(other.str_):0)
+{
+}
+
+xmstring& xmstring::operator=(const xmstring& other)
+{
+	if(str_) XmStringFree(str_);
+	str_ = 0;
+	if(other.str_) str_ = XmStringCopy(other.str_);
+	return *this;
+}
+
+xmstring xmstring::operator+(const xmstring& other) const
+{
+	if(!other.str_) return *this;
+	if(!str_) return other;
+
+	xmstring x;
+	x.str_ = XmStringConcat(str_,other.str_);
+	return x;
+}
+
+xmstring& xmstring::operator+=(const xmstring& other)
+{
+	*this = *this + other;
+	return *this;
+}
diff --git a/ecflow_4_0_7/view/src/xmstring.h b/ecflow_4_0_7/view/src/xmstring.h
new file mode 100644
index 0000000..4ded974
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xmstring.h
@@ -0,0 +1,128 @@
+#ifndef xmstring_H
+#define xmstring_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+// Headers
+// #ifndef   machine_H
+// #include <machine.h>
+// #endif
+
+// Forward declarations
+
+// class ostream;
+// typedef class _Pvts os_typespec; // Remove if not persistant
+
+// 
+
+#include <Xm/Xm.h>
+
+class xmstring {
+public:
+
+// -- Exceptions
+	// None
+
+// -- Contructors
+
+	xmstring(const char* = 0, const char* set = 0);
+	xmstring(XmString);
+	xmstring(const xmstring&);
+	xmstring& operator=(const xmstring&);
+
+// -- Destructor
+
+	~xmstring();
+
+// -- Convertors
+	// None
+
+// -- Operators
+
+	operator XmString() const { return str_; }
+
+	xmstring operator+(const xmstring&) const; 
+	xmstring& operator+=(const xmstring&);
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+	// Uncomment for persistent, remove otherwise
+	// static os_typespec* get_os_typespec();
+
+protected:
+
+// -- Members
+	// None
+
+// -- Methods
+	
+	// void print(ostream&) const; // Change to virtual if base class	
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+private:
+
+// No copy allowed
+
+
+// -- Members
+
+	XmString str_;
+
+// -- Methods
+	// None
+
+// -- Overridden methods
+	// None
+
+// -- Class members
+	// None
+
+// -- Class methods
+	// None
+
+// -- Friends
+
+	//friend ostream& operator<<(ostream& s,const xmstring& p)
+	//	{ p.print(s); return s; }
+
+};
+
+inline void destroy(xmstring**) {}
+
+// If persistent, uncomment, otherwise remove
+//#ifdef _ODI_OSSG_
+//OS_MARK_SCHEMA_TYPE(xmstring);
+//#endif
+
+#endif
diff --git a/ecflow_4_0_7/view/src/xnode.cc b/ecflow_4_0_7/view/src/xnode.cc
new file mode 100644
index 0000000..d13ea84
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xnode.cc
@@ -0,0 +1,56 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+#include "xnode.h"
+
+xnode::xnode(node *n):
+  widget_(0),
+  node_(n),
+  box_(-1)
+{
+}
+
+xnode::~xnode()
+{
+}
+
+int xnode::getBox(Widget w)
+{
+  if(widget_ && widget_ != w)
+    return -1;
+
+  if(box_ == -1)
+  {
+    widget_ = w;
+    box_ =  NodeCreate(w,drawCB,sizeCB,this);
+  }
+  return box_;
+}
+
+void xnode::drawCB(Widget w,XRectangle* r,void *data)
+{
+  if (data) ((xnode*)data)->draw(w,r);
+}
+
+void xnode::sizeCB(Widget w,XRectangle* r,void *data)
+{
+  if (data) ((xnode*)data)->size(w,r);
+}
+
+void xnode::select()
+{
+  XtVaSetValues(widget_,XtNselected,box_,NULL);
+  NodeShow(widget_,box_);
+}
diff --git a/ecflow_4_0_7/view/src/xnode.h b/ecflow_4_0_7/view/src/xnode.h
new file mode 100644
index 0000000..41eb6be
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xnode.h
@@ -0,0 +1,85 @@
+#ifndef xnode_H
+#define xnode_H
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #6 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include <Xm/Xm.h>
+extern "C" {
+#include "SimpleBase.h"
+}
+
+class node;
+
+class xnode {
+public:
+  xnode(node*);
+
+  virtual ~xnode(); // Change to virtual if base class
+
+  node* get_node() { return node_; }
+
+  virtual int getBox(Widget) ;
+
+  virtual void draw(Widget,XRectangle*) = 0;
+  virtual void size(Widget,XRectangle*) = 0;
+
+  void select();
+
+  Widget widget() { return widget_; }
+
+  Boolean visibility(Boolean vis) 
+    { return NodeVisibility(widget_,box_,vis); }
+
+  void relation(xnode* o)
+    { NodeAddRelation(widget_,box_,o->box_); }
+
+  void* relation_data(xnode* o)
+    { return NodeGetRelationData(widget_,box_,o->box_); }
+
+  void* relation_data(xnode* o,void *d)
+    { return NodeSetRelationData(widget_,box_,o->box_,d); }
+
+  GC relation_gc(xnode* o,GC gc)
+    { return NodeSetRelationGC(widget_,box_,o->box_,gc); }
+
+  void redraw() { NodeNewSize(widget_,box_);NodeChanged(widget_,box_); }
+  void show()   { NodeShow(widget_,box_); }
+
+  void setFocus() { NodeSetFocus(widget_,box_); }
+
+  int group()       { return NodeGetGroup(widget_,box_); }
+  void group(int g) { NodeSetGroup(widget_,box_,g); }
+
+  static void drawCB(Widget,XRectangle*,XtPointer);
+  static void sizeCB(Widget,XRectangle*,XtPointer);
+
+  void *operator new(size_t n) { return XtMalloc(n); }
+  void  operator delete(void* d) { XtFree((char*)d); }
+
+protected:
+
+  Widget widget_;
+  node*  node_;
+  int    box_;
+
+private:
+
+  xnode(const xnode&);
+  xnode& operator=(const xnode&);
+};
+
+inline void destroy(xnode**) {}
+#endif
diff --git a/ecflow_4_0_7/view/src/xresources.h b/ecflow_4_0_7/view/src/xresources.h
new file mode 100644
index 0000000..d9d5301
--- /dev/null
+++ b/ecflow_4_0_7/view/src/xresources.h
@@ -0,0 +1,628 @@
+/*=============================================================================================*/
+/* Name        :                                                                               */
+/* Author      :                                                                               */
+/* Revision    : $Revision: #18 $                                                                    */
+/*                                                                                             */
+/* Copyright 2009-2012 ECMWF.                                                                  */
+/* This software is licensed under the terms of the Apache Licence version 2.0                 */
+/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.                        */
+/* In applying this licence, ECMWF does not waive the privileges and immunities                */
+/* granted to it by virtue of its status as an intergovernmental organisation                  */
+/* nor does it submit to any jurisdiction.                                                     */
+/*                                                                                             */
+/* Description :                                                                               */
+/*=============================================================================================*/
+
+#ifndef BRIDGE
+
+static char* xresources = (char*) "\n"
+"ecFlowview*File.accelerator: Ctrl<Key>f\n"
+"ecFlowview*File.mnemonic: F\n"
+"ecFlowview*Info.accelerator: Ctrl<Key>I\n"
+"ecFlowview*Script.accelerator: Ctrl<Key>S\n"
+"ecFlowview*Manual.accelerator: Ctrl<Key>M\n"
+"ecFlowview*Jobstatus.accelerator: Ctrl<Key>j\n"
+"ecFlowview*Job.accelerator: Ctrl<Key>J\n"
+"ecFlowview*Triggers.accelerator: Ctrl<Key>T\n"
+"ecFlowview*Why?.accelerator: Ctrl<Key>y\n"
+"ecFlowview*Variables.accelerator: Ctrl<Key>V\n"
+"ecFlowview*Messages.accelerator: Ctrl<Key>M\n"
+"ecFlowview*Edit.accelerator: Ctrl<Key>E\n"
+"ecFlowview*Search.accelerator: Ctrl<Key>c\n"
+"ecFlowview*Status.accelerator: Space<Key>\n"
+"ecFlowview*Login.accelerator: Ctrl<Key>L\n"
+"ecFlowview*Login.acceleratorText: Ctrl+L\n"
+"ecFlowview*Login.mnemonic: L\n"
+"ecFlowview*Login.title: Login...\n"
+"ecFlowview*Quit.accelerator: Ctrl<Key>Q\n"
+"ecFlowview*Quit.acceleratorText: Ctrl+Q\n"
+"ecFlowview*Quit.mnemonic: Q\n"
+"ecFlowview*Edit.accelerator: Ctrl<Key>E\n"
+"ecFlowview*Edit.mnemonic: E\n"
+"ecFlowview*pref.accelerator: Ctrl<Key>e\n"
+"ecFlowview*pref.mnemonic: e\n"
+"ecFlowview*pref.title: User preferences...\n"
+
+"ecFlowview*pref_shell.title: Preferences\n"
+
+"ecFlowview*Show.accelerator: Ctrl<Key>S\n"
+"ecFlowview*Show.mnemonic: S\n"
+"ecFlowview*Servers.accelerator: Ctrl<Key>v\n"
+"ecFlowview*Servers.mnemonic: v\n"
+"ecFlowview*Windows.accelerator: Ctrl<Key>W\n"
+"ecFlowview*Windows.mnemonic: W\n"
+"ecFlowview*Help.accelerator: Ctrl<Key>H\n"
+"ecFlowview*Help.mnemonic: H\n"
+
+"ecFlowview*Version.accelerator: Ctrl<Key>V\n"
+"ecFlowview*Version.mnemonic: V\n"
+
+"ecFlowview*file_menu.labelString: File\n"
+"ecFlowview*file_menu.mnemonic: F\n"
+"ecFlowview*Option.mnemonic: O\n"
+"ecFlowview*Print*.mnemonic: P\n"
+"ecFlowview*Save*.mnemonic: S\n"
+"ecFlowview*Close.mnemonic: C\n"
+"ecFlowview*help_menu.mnemonic: H\n"
+
+"ecFlowview*snapshot.accelerator: Ctrl<Key>t\n"
+"ecFlowview*snapshot.labelString: Snapshot\n"
+
+"ecFlowview*file_menu.title: File\n"
+"ecFlowview*file_menu.accelerator: Ctrl<Key>F\n"
+
+"ecFlowview*options_menu.labelString: Options\n"
+"ecFlowview*options_menu.mnemonic: O\n"
+
+"ecFlowview.*SimpleBase.baseTranslations: #augment \
+ Shift<Btn5Down>: increment(-1)  \\n\
+ Shift<Btn4Down>: increment(1)   \\n\
+      <Btn5Down>: increment(-10) \\n\
+      <Btn4Down>: increment(10)  \n"
+
+"ecFlowview.*Hyper.baseTranslations: #augment \
+ Shift<Btn5Down>: increment(-1)  \\n\
+ Shift<Btn4Down>: increment(1)   \\n\
+      <Btn5Down>: increment(-10) \\n\
+      <Btn4Down>: increment(10)  \n"
+
+"ecFlowview.*XmList.baseTranslations: #augment \
+ Shift<Btn5Down>: ListNextPage() \\n\
+ Shift<Btn4Down>: ListPrevPage() \\n\
+      <Btn5Down>: ListNextItem() \\n\
+      <Btn4Down>: ListPrevItem() \n"
+
+"ecFlowview.*XmScrollBar.baseTranslations: #augment \
+ Shift<Btn5Down>: IncrementDownOrRight(0) IncrementDownOrRight(1) \\n\
+ Shift<Btn4Down>: IncrementUpOrLeft(0) IncrementUpOrLeft(1) \\n\
+      <Btn5Down>: PageDownOrRight(0) PageDownOrRight(1) \\n\
+      <Btn4Down>: PageUpOrLeft(0) PageUpOrLeft(1) \n"
+
+"ecFlowview.*XmText.baseTranslations: #augment    \
+      <Key>osfUp:      scroll-one-line-up()\\n\
+      <Key>osfDown:    scroll-one-line-down()\\n\
+      <KeyUp>Prior:    previous-page()\\n\
+      <KeyUp>Next:     next-page()\\n\
+      <Key>Up:         scroll-one-line-up()   \\n\
+      <Key>Down:       scroll-one-line-down() \\n\
+      <KeyUp>KP_Prior: previous-page()\\n\
+      <KeyUp>KP_Next:  next-page()\\n\
+      <KeyUp>KP_Up:    scroll-one-line-up()   \\n\
+      <KeyUp>KP_Down:  scroll-one-line-down() \n\
+ Shift<Btn5Down>: previous-page()   \\n\
+ Shift<Btn4Down>: next-page() \\n\
+      <Btn5Down>: scroll-one-line-up()   \\n\
+      <Btn4Down>: scroll-one-line-down() \n"
+
+"ecFlowview.*DrawingAreaInput.baseTranslations: #augment    \
+      <Key>osfUp:      scroll-one-line-up()\\n\
+      <Key>osfDown:    scroll-one-line-down()\\n\
+      <KeyUp>Prior:    previous-page()\\n\
+      <KeyUp>Next:     next-page()\\n\
+      <Key>Up:         scroll-one-line-up()   \\n\
+      <Key>Down:       scroll-one-line-down() \\n\
+      <KeyUp>KP_Prior: previous-page()\\n\
+      <KeyUp>KP_Next:  next-page()\\n\
+      <KeyUp>KP_Up:    scroll-one-line-up()   \\n\
+      <KeyUp>KP_Down:  scroll-one-line-down() \n\
+ Shift<Btn5Down>: previous-page()   \\n\
+ Shift<Btn4Down>: next-page() \\n\
+      <Btn5Down>: scroll-one-line-up()   \\n\
+      <Btn4Down>: scroll-one-line-down() \n"
+"*XmSpinBox.accelerators: #augment \
+      <Btn5Down>: SpinBPrior()\\n\
+      <Btn5Up>:SpinBDisarm()\\n\
+      <Btn4Down>: SpinBNext()\\n\
+      <Btn4Up>: SpinBDisarm()\\n\
+      <Key>osfUp:SpinBNext()\\n\
+      <Key>osfDown: SpinBPrior()\\n\
+      <KeyUp>osfUp: SpinBDisarm()\\n\
+      <KeyUp>osfDown: SpinBDisarm()\\n\
+      <Key>osfLeft:  SpinBLeft()\\n\
+      <Key>osfRight: SpinBRight()\\n\
+      <KeyUp>osfLeft:  SpinBDisarm()\\n\
+      <KeyUp>osfRight: SpinBDisarm()\\n\
+      <Key>osfBeginLine: SpinBFirst()\\n\
+      <Key>osfEndLine: SpinBLast()\n"
+
+"ecFlowview*@zombied.labelString: Use default settings\n"
+"ecFlowview*@aliases.labelString: Use default settings\n"
+"ecFlowview*@late_family.labelString: Use default settings\n"
+"ecFlowview*zombied.labelString: Zombies\n"
+"ecFlowview*aliases.labelString: Aborted or restarted aliases\n"
+"ecFlowview*late_family.labelString: Late family\n"
+
+"ecFlowview*File.labelString: File\n"
+"ecFlowview*.XmText.background: OldLace\n"
+"ecFlowview*.XmTextField.background: OldLace\n"
+"ecFlowview*.scrollBarDisplayPolicy: STATIC\n"
+"ecFlowview*@aborted.labelString: Use default settings\n"
+"ecFlowview*@color_aborted.labelString: Use default settings\n"
+"ecFlowview*@color_active.labelString: Use default settings\n"
+"ecFlowview*@color_complete.labelString: Use default settings\n"
+"ecFlowview*@color_halted.labelString: Use default settings\n"
+"ecFlowview*@color_queued.labelString: Use default settings\n"
+"ecFlowview*@color_shutdown.labelString: Use default settings\n"
+"ecFlowview*@color_submitted.labelString: Use default settings\n"
+"ecFlowview*@color_suspended.labelString: Use default settings\n"
+"ecFlowview*@color_unknown.labelString: Use default settings\n"
+"ecFlowview*@color_meter_low.labelString: Use default settings\n"
+"ecFlowview*@color_threshold.labelString: Use default settings\n"
+"ecFlowview*@color_event.labelString: Use default settings\n"
+"ecFlowview*@direct_read.labelString: Use default settings\n"
+"ecFlowview*@drift.labelString: Use default settings\n"
+"ecFlowview*@late.labelString: Use default settings\n"
+"ecFlowview*@maximum.labelString: Use default settings\n"
+"ecFlowview*@jobfile_length.labelString: Use default settings\n"
+"ecFlowview*@new_suites.labelString: Use default settings\n"
+"ecFlowview*@normal_font_bold.labelString: Use default settings\n"
+"ecFlowview*@normal_font_plain.labelString: Use default settings\n"
+"ecFlowview*@poll.labelString: Use default settings\n"
+"ecFlowview*@restarted.labelString: Use default settings\n"
+"ecFlowview*@small_font_bold.labelString: Use default settings\n"
+"ecFlowview*@small_font_plain.labelString: Use default settings\n"
+"ecFlowview*@timeout.labelString: Use default settings\n"
+"ecFlowview*@timed_text_since.labelString: 600\n"
+"ecFlowview*@timed_text_from.labelString: 0\n"
+"ecFlowview*timed_text_from.labelString: 0\n"
+"ecFlowview*Aborted.labelString: Aborted\n"
+"ecFlowview*Active.labelString: Active\n"
+"ecFlowview*Apply.labelString: Apply\n"
+"ecFlowview*Backwards.labelString: Backwards\n"
+"ecFlowview*Colours.labelString: Colors\n"
+"ecFlowview*Complete.labelString: Complete\n"
+"ecFlowview*Get server status:.labelString: Getting server status\n"
+"ecFlowview*Hyper*highlightColor: Blue\n"
+"ecFlowview*Hyper*highlightFont:  7x13\n"
+"ecFlowview*Hyper*highlightOnEnter : false\n"
+"ecFlowview*Hyper*highlightThickness : 0\n"
+"ecFlowview*Hyper*navigationType : NONE\n"
+"ecFlowview*Hyper*normalFont:     7x13\n"
+"ecFlowview*Queued.labelString: Queued\n"
+"ecFlowview*Regular expression.labelString: Regular expression\n"
+"ecFlowview*SimpleTime.fontList: -*-*-*-*-*-*-7-*-*-*-*-*-*-*\n"
+"ecFlowview*Submitted.labelString: Submitted\n"
+"ecFlowview*Suspended.labelString: Suspended\n"
+"ecFlowview*Unknown.labelString: Unknown\n"
+"ecFlowview*Update.labelString: Update\n"
+"ecFlowview*Use external editor.labelString: External editor...\n"
+"ecFlowview*Use external viewer.labelString: External viewer...\n"
+"ecFlowview*Waiting nodes.labelString: Waiting nodes\n"
+"ecFlowview*XmList.fontList: 7x13=normal,7x13bold=bold\n"
+"ecFlowview*XmText.fontList:    7x13\n"
+"ecFlowview*XmToggleButton.fillOnSelect:       true\n"
+"ecFlowview*XmToggleButton.selectColor:        Blue\n"
+"ecFlowview*XmToggleButtonGadget.fillOnSelect:       true\n"
+"ecFlowview*XmToggleButtonGadget.fontList: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*\n"
+"ecFlowview*XmToggleButtonGadget.selectColor:        Green\n"
+"ecFlowview*aborted.labelString: Aborted tasks\n"
+"ecFlowview*alias_.labelString: Send as alias\n"
+"ecFlowview*all_off.labelString: All off\n"
+"ecFlowview*all_on.labelString: All on\n"
+"ecFlowview*ask_shell.title: ask\n"
+"ecFlowview*background: #e5e5e5e5e5e5\n"
+"ecFlowview*bottomShadowColor: #7e7e7e7e7e7e\n"
+"ecFlowview*button3.labelString: Help...\n"
+"ecFlowview*button_close.labelString: Close\n"
+"ecFlowview*button_find.labelString: Find...\n"
+"ecFlowview*button_search.labelString: Search...\n"
+"ecFlowview*close.labelString: Close\n"
+"ecFlowview*close_on_apply_.labelString: Close on Apply/Submit\n"
+"ecFlowview*collector_shell.title: Collector (ctrl-click1)\n"
+  /* "ecFlowview*collector_shell.title: Collector\n" */
+"ecFlowview*confirm_shell.title: Confirm\n"
+"ecFlowview*current_node.labelString: Frozen\n"
+"ecFlowview*delete_.labelString: Delete\n"
+"ecFlowview*find_.labelString: Find\n"
+"ecFlowview*depend_shell.title: Details\n"
+"ecFlowview*dependencies_button_.labelString: Dependencies\n"
+"ecFlowview*detached_.labelString: Detached\n"
+"ecFlowview*direct_read.labelString: Read files from disk when possible.\n"
+"ecFlowview*drift.labelString: Reduce call frequency when inactive\n"
+"ecFlowview*error_shell.title: Error\n"
+"ecFlowview*find_message.fontList: -*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*\n"
+"ecFlowview*find_message.foreground: red\n"
+"ecFlowview*find_message.labelString: -\n"
+"ecFlowview*find_shell.title: Find...\n"
+"ecFlowview*fold_around_.labelString: Fold around\n"
+"ecFlowview*XmList.fontList:    7x13=normal,7x13bold=bold\n"
+"ecFlowview*XmText.fontList:    7x13\n"
+"ecFlowview*help_menu.labelString: Help\n"
+"ecFlowview*hide_other_.labelString: Hide other suites\n"
+"ecFlowview*indicatorSize:     12\n"
+"ecFlowview*late.labelString: Late tasks\n"
+"ecFlowview*mail_shell.title: Chat\n"
+"ecFlowview*menu_fold_all.labelString: Fold all\n"
+"ecFlowview*menu_show_current.labelString: Show selected node\n"
+"ecFlowview*menu_unfold_all.accelerator: Ctrl<Key>U\n"
+"ecFlowview*menu_unfold_all.labelString: Unfold all\n"
+"ecFlowview*new_suites.labelString: Register to new suites\n"
+"ecFlowview*new_window.labelString: New window...\n"
+"ecFlowview*optionMenu1.labelString: Action:\n"
+"ecFlowview*poll.labelString: Get server status regularly\n"
+"ecFlowview*preprocess_.labelString: Pre-process\n"
+"ecFlowview*restarted.labelString: Restarted tasks\n"
+"ecFlowview*search_shell.title: Search...\n"
+"ecFlowview*set_.labelString: Set\n"
+"ecFlowview*timeline_label.fontList : 7x13=normal,7x13bold=bold\n"
+"ecFlowview*toggle2.labelString: Limits\n"
+"ecFlowview*toggle21.labelString: Suites\n"
+"ecFlowview*toggle22.labelString: Families\n"
+"ecFlowview*toggle23.labelString: Tasks\n"
+"ecFlowview*toggle24.labelString: Aliases\n"
+"ecFlowview*toggle25.labelString: Labels\n"
+"ecFlowview*toggle26.labelString: Meters\n"
+"ecFlowview*toggle27.labelString: Events\n"
+"ecFlowview*toggle28.labelString: Repeats\n"
+"ecFlowview*toggle29.labelString: Times\n"
+"ecFlowview*toggle3.labelString: Full names\n"
+"ecFlowview*toggle3.labelString: Limiters\n"
+"ecFlowview*toggle30.labelString: Dates\n"
+"ecFlowview*toggle31.labelString: Triggers\n"
+"ecFlowview*toggle32.labelString: Variables\n"
+"ecFlowview*toggle41.labelString: Time dependent\n"
+"ecFlowview*toggle42.labelString: Late nodes\n"
+"ecFlowview*toggle43.labelString: Zombie\n"
+"ecFlowview*toggle44.labelString: Rerun tasks\n"
+"ecFlowview*toggle45.labelString: Nodes with messages\n"
+"ecFlowview*toggle66.labelString: Servers\n"
+"ecFlowview*tools_*shadowThickness:1  \n"
+"ecFlowview*topShadowColor: white\n"
+"ecFlowview*triggered.labelString: Show triggered nodes\n"
+"ecFlowview*triggers.labelString: Show triggering nodes\n"
+"ecFlowview*vname.labelString: Variable name:\n"
+"ecFlowview*vvalue.labelString: Variable value:\n"
+"ecFlowview*warn.labelString: Don't forget to hit <return> when you enter a value in a text field.\n"
+"ecFlowview*warn2.labelString: Don't forget to hit <return> when you enter a value in a text field.\n"
+"ecFlowview*what_.labelString: What:\n"
+"ecFlowview*where_.labelString: Where:\n"
+"ecFlowview*why_label_.labelString: Use the Info window...\n"
+"ecFlowview.smallFont:  -*-helvetica-medium-r-normal-*-10-*-*-*-*-*-*-*\n"
+"ecFlowview.normalFont: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*\n"
+"ecFlowview*tools_.Info.accelerator: I\n"
+"ecFlowview*tools_.Script.accelerator: S\n"
+"ecFlowview*tools_.Manual.accelerator: M\n"
+"ecFlowview*tools_.JobStatus.accelerator: J\n"
+"ecFlowview*tools_.Output.accelerator: O\n"
+"ecFlowview*tools_.Triggers.accelerator: T\n"
+"ecFlowview*tools_.Why?.accelerator: W\n"
+"ecFlowview*tools_.Variables.accelerator: V\n"
+"ecFlowview*tools_.Messages.accelerator: M\n"
+"ecFlowview*tools_.Edit.accelerator: E\n"
+"ecFlowview*tools_.Status.accelerator: Return<Key>\n"
+"ecFlowview*tree_.accelerator: C\n"
+"ecFlowview*tree_.accelerator: Z\n"
+"ecFlowview*tree_.baseTranslations: #augment \
+C: collector::show(selection::current_node())\\n\
+A: selection::notify_new_selection(0)\\n\
+"
+
+;
+
+#else
+
+static char* xresources = (char*) "\n"
+"XCdp*File.accelerator: Ctrl<Key>f\n"
+"XCdp*File.mnemonic: F\n"
+"XCdp*Info.accelerator: Ctrl<Key>I\n"
+"XCdp*Script.accelerator: Ctrl<Key>S\n"
+"XCdp*Manual.accelerator: Ctrl<Key>M\n"
+"XCdp*Jobstatus.accelerator: Ctrl<Key>j\n"
+"XCdp*Job.accelerator: Ctrl<Key>J\n"
+"XCdp*Triggers.accelerator: Ctrl<Key>T\n"
+"XCdp*Why?.accelerator: Ctrl<Key>y\n"
+"XCdp*Variables.accelerator: Ctrl<Key>V\n"
+"XCdp*Messages.accelerator: Ctrl<Key>M\n"
+"XCdp*Edit.accelerator: Ctrl<Key>E\n"
+"XCdp*Search.accelerator: Ctrl<Key>c\n"
+"XCdp*Status.accelerator: Space<Key>\n"
+"XCdp*Login.accelerator: Ctrl<Key>L\n"
+"XCdp*Login.acceleratorText: Ctrl+L\n"
+"XCdp*Login.mnemonic: L\n"
+"XCdp*Login.title: Login...\n"
+"XCdp*Quit.accelerator: Ctrl<Key>Q\n"
+"XCdp*Quit.acceleratorText: Ctrl+Q\n"
+"XCdp*Quit.mnemonic: Q\n"
+"XCdp*Edit.accelerator: Ctrl<Key>E\n"
+"XCdp*Edit.mnemonic: E\n"
+"XCdp*pref.accelerator: Ctrl<Key>e\n"
+"XCdp*pref.mnemonic: e\n"
+"XCdp*pref.title: User preferences...\n"
+
+"XCdp*pref_shell.title: Preferences\n"
+
+"XCdp*Show.accelerator: Ctrl<Key>S\n"
+"XCdp*Show.mnemonic: S\n"
+"XCdp*Servers.accelerator: Ctrl<Key>v\n"
+"XCdp*Servers.mnemonic: v\n"
+"XCdp*Windows.accelerator: Ctrl<Key>W\n"
+"XCdp*Windows.mnemonic: W\n"
+"XCdp*Help.accelerator: Ctrl<Key>H\n"
+"XCdp*Help.mnemonic: H\n"
+
+"XCdp*Version.accelerator: Ctrl<Key>V\n"
+"XCdp*Version.mnemonic: V\n"
+
+"XCdp*file_menu.labelString: File\n"
+"XCdp*file_menu.mnemonic: F\n"
+"XCdp*Option.mnemonic: O\n"
+"XCdp*Print*.mnemonic: P\n"
+"XCdp*Save*.mnemonic: S\n"
+"XCdp*close.mnemonic: C\n"
+"XCdp*help_menu.mnemonic: H\n"
+
+"XCdp*snapshot.accelerator: Ctrl<Key>t\n"
+"XCdp*snapshot.labelString: Snapshot\n"
+
+"XCdp*file_menu.title: File\n"
+"XCdp*file_menu.accelerator: Ctrl<Key>F\n"
+
+"XCdp*options_menu.labelString: Options\n"
+"XCdp*options_menu.mnemonic: O\n"
+
+"XCdp.*SimpleBase.baseTranslations: #augment \
+ Shift<Btn5Down>: increment(-1)  \\n\
+ Shift<Btn4Down>: increment(1)   \\n\
+      <Btn5Down>: increment(-10) \\n\
+      <Btn4Down>: increment(10)  \n"
+
+"XCdp.*Hyper.baseTranslations: #augment \
+ Shift<Btn5Down>: increment(-1)  \\n\
+ Shift<Btn4Down>: increment(1)   \\n\
+      <Btn5Down>: increment(-10) \\n\
+      <Btn4Down>: increment(10)  \n"
+
+"XCdp.*XmList.baseTranslations: #augment \
+ Shift<Btn5Down>: ListNextPage() \\n\
+ Shift<Btn4Down>: ListPrevPage() \\n\
+      <Btn5Down>: ListNextItem() \\n\
+      <Btn4Down>: ListPrevItem() \n"
+
+"XCdp.*XmScrollBar.baseTranslations: #augment \
+ Shift<Btn5Down>: IncrementDownOrRight(0) IncrementDownOrRight(1) \\n\
+ Shift<Btn4Down>: IncrementUpOrLeft(0) IncrementUpOrLeft(1) \\n\
+      <Btn5Down>: PageDownOrRight(0) PageDownOrRight(1) \\n\
+      <Btn4Down>: PageUpOrLeft(0) PageUpOrLeft(1) \n"
+
+"XCdp.*XmText.baseTranslations: #augment    \
+      <Key>osfUp:      scroll-one-line-up()\\n\
+      <Key>osfDown:    scroll-one-line-down()\\n\
+      <KeyUp>Prior:    previous-page()\\n\
+      <KeyUp>Next:     next-page()\\n\
+      <Key>Up:         scroll-one-line-up()   \\n\
+      <Key>Down:       scroll-one-line-down() \\n\
+      <KeyUp>KP_Prior: previous-page()\\n\
+      <KeyUp>KP_Next:  next-page()\\n\
+      <KeyUp>KP_Up:    scroll-one-line-up()   \\n\
+      <KeyUp>KP_Down:  scroll-one-line-down() \n\
+ Shift<Btn5Down>: previous-page()   \\n\
+ Shift<Btn4Down>: next-page() \\n\
+      <Btn5Down>: scroll-one-line-up()   \\n\
+      <Btn4Down>: scroll-one-line-down() \n"
+
+"XCdp.*DrawingAreaInput.baseTranslations: #augment    \
+      <Key>osfUp:      scroll-one-line-up()\\n\
+      <Key>osfDown:    scroll-one-line-down()\\n\
+      <KeyUp>Prior:    previous-page()\\n\
+      <KeyUp>Next:     next-page()\\n\
+      <Key>Up:         scroll-one-line-up()   \\n\
+      <Key>Down:       scroll-one-line-down() \\n\
+      <KeyUp>KP_Prior: previous-page()\\n\
+      <KeyUp>KP_Next:  next-page()\\n\
+      <KeyUp>KP_Up:    scroll-one-line-up()   \\n\
+      <KeyUp>KP_Down:  scroll-one-line-down() \n\
+ Shift<Btn5Down>: previous-page()   \\n\
+ Shift<Btn4Down>: next-page() \\n\
+      <Btn5Down>: scroll-one-line-up()   \\n\
+      <Btn4Down>: scroll-one-line-down() \n"
+
+"*XmSpinBox.accelerators: #augment \
+      <Btn5Down>: SpinBPrior()\\n\
+      <Btn5Up>:SpinBDisarm()\\n\
+      <Btn4Down>: SpinBNext()\\n\
+      <Btn4Up>: SpinBDisarm()\\n\
+      <Key>osfUp:SpinBNext()\\n\
+      <Key>osfDown: SpinBPrior()\\n\
+      <KeyUp>osfUp: SpinBDisarm()\\n\
+      <KeyUp>osfDown: SpinBDisarm()\\n\
+      <Key>osfLeft:  SpinBLeft()\\n\
+      <Key>osfRight: SpinBRight()\\n\
+      <KeyUp>osfLeft:  SpinBDisarm()\\n\
+      <KeyUp>osfRight: SpinBDisarm()\\n\
+      <Key>osfBeginLine: SpinBFirst()\\n\
+      <Key>osfEndLine: SpinBLast()\n"
+
+"XCdp*@zombied.labelString: Use default settings\n"
+"XCdp*@aliases.labelString: Use default settings\n"
+"XCdp*@late_family.labelString: Use default settings\n"
+"XCdp*zombied.labelString: Zombies\n"
+"XCdp*aliases.labelString: Aborted or restarted aliases\n"
+"XCdp*late_family.labelString: Late family\n"
+
+"XCdp*File.labelString: File\n"
+"XCdp*.XmText.background: OldLace\n"
+"XCdp*.XmTextField.background: OldLace\n"
+"XCdp*.scrollBarDisplayPolicy: STATIC\n"
+"XCdp*@aborted.labelString: Use default settings\n"
+"XCdp*@color_aborted.labelString: Use default settings\n"
+"XCdp*@color_active.labelString: Use default settings\n"
+"XCdp*@color_complete.labelString: Use default settings\n"
+"XCdp*@color_halted.labelString: Use default settings\n"
+"XCdp*@color_queued.labelString: Use default settings\n"
+"XCdp*@color_shutdown.labelString: Use default settings\n"
+"XCdp*@color_submitted.labelString: Use default settings\n"
+"XCdp*@color_suspended.labelString: Use default settings\n"
+"XCdp*@color_unknown.labelString: Use default settings\n"
+"XCdp*@color_meter_low.labelString: Use default settings\n"
+"XCdp*@color_threshold.labelString: Use default settings\n"
+"XCdp*@color_event.labelString: Use default settings\n"
+"XCdp*@direct_read.labelString: Use default settings\n"
+"XCdp*@drift.labelString: Use default settings\n"
+"XCdp*@late.labelString: Use default settings\n"
+"XCdp*@maximum.labelString: Use default settings\n"
+"XCdp*@jobfile_length.labelString: Use default settings\n"
+"XCdp*@new_suites.labelString: Use default settings\n"
+"XCdp*@normal_font_bold.labelString: Use default settings\n"
+"XCdp*@normal_font_plain.labelString: Use default settings\n"
+"XCdp*@poll.labelString: Use default settings\n"
+"XCdp*@restarted.labelString: Use default settings\n"
+"XCdp*@small_font_bold.labelString: Use default settings\n"
+"XCdp*@small_font_plain.labelString: Use default settings\n"
+"XCdp*@timeout.labelString: Use default settings\n"
+"XCdp*Aborted.labelString: Aborted\n"
+"XCdp*Active.labelString: Active\n"
+"XCdp*Apply.labelString: Apply\n"
+"XCdp*Backwards.labelString: Backwards\n"
+"XCdp*Colours.labelString: Colors\n"
+"XCdp*Complete.labelString: Complete\n"
+"XCdp*Get server status:.labelString: Getting server status\n"
+"XCdp*Hyper*highlightColor: Blue\n"
+"XCdp*Hyper*highlightFont:  7x13\n"
+"XCdp*Hyper*highlightOnEnter : false\n"
+"XCdp*Hyper*highlightThickness : 0\n"
+"XCdp*Hyper*navigationType : NONE\n"
+"XCdp*Hyper*normalFont:     7x13\n"
+"XCdp*Queued.labelString: Queued\n"
+"XCdp*Regular expression.labelString: Regular expression\n"
+"XCdp*SimpleTime.fontList: -*-*-*-*-*-*-7-*-*-*-*-*-*-*\n"
+"XCdp*Submitted.labelString: Submitted\n"
+"XCdp*Suspended.labelString: Suspended\n"
+"XCdp*Unknown.labelString: Unknown\n"
+"XCdp*Update.labelString: Update\n"
+"XCdp*Use external editor.labelString: External editor...\n"
+"XCdp*Use external viewer.labelString: External viewer...\n"
+"XCdp*Waiting nodes.labelString: Waiting nodes\n"
+"XCdp*XmToggleButton.fillOnSelect:       true\n"
+"XCdp*XmToggleButton.selectColor:        Blue\n"
+"XCdp*XmToggleButtonGadget.fillOnSelect:       true\n"
+"XCdp*XmToggleButtonGadget.fontList:-*-helvetica-normal-r-normal-*-12-*-*-*-*-*-*-*\n"
+"XCdp*XmToggleButtonGadget.selectColor:        Green\n"
+"XCdp*aborted.labelString: Aborted tasks\n"
+"XCdp*alias_.labelString: Send as alias\n"
+"XCdp*all_off.labelString: All off\n"
+"XCdp*all_on.labelString: All on\n"
+"XCdp*ask_shell.title: ask\n"
+"XCdp*background: #e5e5e5e5e5e5\n"
+"XCdp*bottomShadowColor: #7e7e7e7e7e7e\n"
+"XCdp*button3.labelString: Help...\n"
+"XCdp*button_close.labelString: Close\n"
+"XCdp*button_find.labelString: Find...\n"
+"XCdp*button_search.labelString: Search...\n"
+"XCdp*close.labelString: Close\n"
+"XCdp*close_on_apply_.labelString: Close on Apply/Submit\n"
+"XCdp*collector_shell.title: Collector (ctrl-click1)\n"
+  /* "XCdp*collector_shell.title: Collector\n" */
+"XCdp*confirm_shell.title: Confirm\n"
+"XCdp*current_node.labelString: Frozen\n"
+"XCdp*delete_.labelString: Delete\n"
+"XCdp*find_.labelString: Find\n"
+"XCdp*depend_shell.title: Details\n"
+"XCdp*dependencies_button_.labelString: Dependencies\n"
+"XCdp*detached_.labelString: Detached\n"
+"XCdp*direct_read.labelString: Read output and other files from disk when possible.\n"
+"XCdp*drift.labelString: Reduce call frequency when inactive\n"
+"XCdp*error_shell.title: Error\n"
+"XCdp*find_message.fontList:-*-helvetica-bold-*-normal-*-12-*-*-*-*-*-*-*\n"
+"XCdp*find_message.foreground: red\n"
+"XCdp*find_message.labelString: -\n"
+"XCdp*find_shell.title: Find...\n"
+"XCdp*fold_around_.labelString: Fold around\n"
+"XCdp*XmList.fontList:  7x13=normal,7x13bold=bold\n"
+"XCdp*XmText.fontList:  7x13\n"
+"XCdp*XmText.font*: -*-helvetica-medium-*-normal-*-12-*-*-*-*-*-*-*\n"
+"XCdp*fontList:     -*-helvetica-normal-r-normal-*-12-*-*-*-*-*-*-*\n"
+"XCdp*help_menu.labelString: Help\n"
+"XCdp*hide_other_.labelString: Hide other suites\n"
+"XCdp*indicatorSize:     12\n"
+"XCdp*late.labelString: Late tasks\n"
+"XCdp*mail_shell.title: Chat\n"
+"XCdp*menu_fold_all.labelString: Fold all\n"
+"XCdp*menu_show_current.labelString: Show selected node\n"
+"XCdp*menu_unfold_all.accelerator: Ctrl<Key>U\n"
+"XCdp*menu_unfold_all.labelString: Unfold all\n"
+"XCdp*new_suites.labelString: Register to new suites\n"
+"XCdp*new_window.labelString: New window...\n"
+"XCdp*optionMenu1.labelString: Action:\n"
+"XCdp*poll.labelString: Get server status regularly\n"
+"XCdp*preprocess_.labelString: Pre-process\n"
+"XCdp*restarted.labelString: Restarted tasks\n"
+"XCdp*search_shell.title: Search...\n"
+"XCdp*set_.labelString: Set\n"
+"XCdp*timeline_label.fontList : 7x13=normal,7x13bold=bold\n"
+"XCdp*toggle2.labelString: Limits\n"
+"XCdp*toggle21.labelString: Suites\n"
+"XCdp*toggle22.labelString: Families\n"
+"XCdp*toggle23.labelString: Tasks\n"
+"XCdp*toggle24.labelString: Aliases\n"
+"XCdp*toggle25.labelString: Labels\n"
+"XCdp*toggle26.labelString: Meters\n"
+"XCdp*toggle27.labelString: Events\n"
+"XCdp*toggle28.labelString: Repeats\n"
+"XCdp*toggle29.labelString: Times\n"
+"XCdp*toggle3.labelString: Full names\n"
+"XCdp*toggle3.labelString: Limiters\n"
+"XCdp*toggle30.labelString: Dates\n"
+"XCdp*toggle31.labelString: Triggers\n"
+"XCdp*toggle32.labelString: Variables\n"
+"XCdp*toggle41.labelString: Time dependent\n"
+"XCdp*toggle42.labelString: Late nodes\n"
+"XCdp*toggle43.labelString: Zombie\n"
+"XCdp*toggle44.labelString: Rerun tasks\n"
+"XCdp*toggle45.labelString: Nodes with messages\n"
+"XCdp*toggle66.labelString: Servers\n"
+"XCdp*tools_*shadowThickness:1  \n"
+"XCdp*topShadowColor: white\n"
+"XCdp*triggered.labelString: Show triggered nodes\n"
+"XCdp*triggers.labelString: Show triggering nodes\n"
+"XCdp*vname.labelString: Variable name:\n"
+"XCdp*vvalue.labelString: Variable value:\n"
+"XCdp*warn.labelString: Don't forget to hit <return> when you enter a value in a text field.\n"
+"XCdp*warn2.labelString: Don't forget to hit <return> when you enter a value in a text field.\n"
+"XCdp*what_.labelString: What:\n"
+"XCdp*where_.labelString: Where:\n"
+"XCdp*why_label_.labelString: Use the Info window...\n"
+"XCdp.smallFont: -*-helvetica-medium-r-normal-*-11-*-*-*-*-*-*-*\n"
+"XCdp*tools_.Info.accelerator: I\n"
+"XCdp*tools_.Script.accelerator: S\n"
+"XCdp*tools_.Manual.accelerator: M\n"
+"XCdp*tools_.JobStatus.accelerator: J\n"
+"XCdp*tools_.Output.accelerator: O\n"
+"XCdp*tools_.Triggers.accelerator: T\n"
+"XCdp*tools_.Why?.accelerator: W\n"
+"XCdp*tools_.Variables.accelerator: V\n"
+"XCdp*tools_.Messages.accelerator: M\n"
+"XCdp*tools_.Edit.accelerator: E\n"
+"XCdp*tools_.Status.accelerator: Return<Key>\n"
+"XCdp*tree_.accelerator: C\n"
+"XCdp*tree_.accelerator: Z\n"
+"XCdp*tree_.baseTranslations: #augment \
+C: collector::show(selection::current_node())\\n\
+A: selection::notify_new_selection(0)\\n\
+"
+
+;
+
+/* 
+   xrdb -merge ~/.Xdefaults 
+*/
+#endif
diff --git a/ecflow_4_0_7/view/src/zombie.h b/ecflow_4_0_7/view/src/zombie.h
new file mode 100644
index 0000000..8f4f906
--- /dev/null
+++ b/ecflow_4_0_7/view/src/zombie.h
@@ -0,0 +1,39 @@
+#ifndef zombie_H
+#define zombie_H
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #3 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "node_alert.h"
+#include "node.h"
+
+class zombie : public node_alert<zombie> {
+public:
+  zombie() ;
+  ~zombie();
+
+private:
+
+  zombie(const zombie&);
+  zombie& operator=(const zombie&);
+
+  virtual bool keep(node* n); // { return n->isZombie(); }
+
+};
+
+inline void destroy(zombie**) {}
+
+#endif
diff --git a/ecflow_4_0_7/view/src/zombies_panel.cc b/ecflow_4_0_7/view/src/zombies_panel.cc
new file mode 100644
index 0000000..1703574
--- /dev/null
+++ b/ecflow_4_0_7/view/src/zombies_panel.cc
@@ -0,0 +1,125 @@
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #11 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+
+#include "zombies_panel.h"
+#include "node.h"
+#include "host.h"
+#include "ecflowview.h"
+#include <Xm/Label.h>
+#include <Xm/Text.h>
+#include <Xm/List.h>
+extern "C" {
+#include "xec.h"
+}
+// #include <sstream>
+
+zombies_panel::zombies_panel(panel_window& w):
+	panel(w),
+	name_(0)
+{
+}
+
+zombies_panel::~zombies_panel()
+{
+	XtFree(name_);
+}
+
+void zombies_panel::create (Widget parent, char *widget_name )
+{
+	zombies_form_c::create(parent,widget_name);
+}
+
+void zombies_panel::clear()
+{
+       selection_.clear();
+       XmListDeleteAllItems(list_);
+       XtSetSensitive(buttons_,False);
+}
+
+void zombies_panel::show(node& n)
+{
+  std::vector<std::string> list;
+  if (!n.serv().get_zombies_list(list)) {
+    return;
+  }
+  clear();
+
+  xec_AddFontListItem(list_,(char*)list[0].c_str(),true);
+  for(unsigned int i= 1; i < list.size(); ++i)
+    xec_AddListItem(list_,(char*)list[i].c_str());   
+}
+
+
+Boolean zombies_panel::enabled(node& n)
+{
+  return n.type() == NODE_SUPER;
+}
+
+
+void zombies_panel::browseCB( Widget, XtPointer data)
+{
+  XmListCallbackStruct *cb = (XmListCallbackStruct *) data;
+  char *p = xec_GetString(cb->item);
+  if(name_) XtFree(name_);
+  name_ = XtNewString(node::find_name(p));
+  if (name_) 
+    selection_.insert(name_);
+  XtSetSensitive(buttons_,name_ != 0);
+  XtFree(p);
+}
+
+void zombies_panel::deleteCB( Widget, XtPointer data)
+{
+  call(ZOMBIE_DELETE, data);
+}
+
+void zombies_panel::acceptCB( Widget, XtPointer data)
+{
+  call(ZOMBIE_FOB, data);
+}
+
+void zombies_panel::rescueCB( Widget, XtPointer data)
+{
+  call(ZOMBIE_RESCUE, data);
+}
+
+void zombies_panel::terminateCB( Widget, XtPointer data)
+{
+  call(ZOMBIE_FAIL, data);
+}
+
+void zombies_panel::killCB( Widget, XtPointer data)
+{
+  call(ZOMBIE_KILL, data);
+}
+
+void zombies_panel::call(int mode, XtPointer data)
+{
+  if(!name_)
+    XtSetSensitive(buttons_,false);
+
+  if(get_node()) {
+    std::set<std::string>::const_iterator item;
+    for (item = selection_.begin(); item != selection_.end(); ++item)
+      get_node()->serv().zombies(mode, (*item).c_str());
+
+  } else 
+    clear();
+  
+  post_update();
+}
+
+// static panel_maker<zombies_panel> maker(PANEL_ZOMBIES);
diff --git a/ecflow_4_0_7/view/src/zombies_panel.h b/ecflow_4_0_7/view/src/zombies_panel.h
new file mode 100644
index 0000000..e499bf2
--- /dev/null
+++ b/ecflow_4_0_7/view/src/zombies_panel.h
@@ -0,0 +1,62 @@
+#ifndef zombies_panel_H
+#define zombies_panel_H
+
+#include "uizombies.h"
+
+#ifndef panel_H
+#include "panel.h"
+#endif
+
+#include <set>
+
+//=============================================================================================
+// Name        : 
+// Author      : 
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : 
+//=============================================================================================
+
+class zombies_panel : public panel, public zombies_form_c {
+public:
+
+	zombies_panel(panel_window&);
+
+	~zombies_panel(); // Change to virtual if base class
+
+	virtual const char* name() const { return "Zombies"; }
+	virtual void show(node&);
+	virtual void clear();
+	virtual Boolean enabled(node&);
+	virtual Widget widget() { return zombies_form_c::xd_rootwidget(); }
+
+	virtual void create (Widget parent, char *widget_name = NULL);
+
+private:
+
+	zombies_panel(const zombies_panel&);
+	zombies_panel& operator=(const zombies_panel&);
+
+        char* name_;
+
+        void call(int, XtPointer);
+
+        virtual void browseCB( Widget, XtPointer );
+        virtual void deleteCB( Widget, XtPointer );
+	virtual void acceptCB( Widget, XtPointer );
+        virtual void rescueCB( Widget, XtPointer );
+        virtual void terminateCB( Widget, XtPointer );
+        virtual void killCB( Widget, XtPointer );
+
+        std::set<std::string> selection_;
+};
+
+inline void destroy(zombies_panel**) {}
+#endif
diff --git a/ecflow_4_0_7/view/test/TestRunner.cpp b/ecflow_4_0_7/view/test/TestRunner.cpp
new file mode 100644
index 0000000..071c110
--- /dev/null
+++ b/ecflow_4_0_7/view/test/TestRunner.cpp
@@ -0,0 +1,21 @@
+#define BOOST_TEST_MODULE TestView
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #4 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description :
+//============================================================================
+#include "ViewTestFixture.hpp"
+#include <boost/test/unit_test.hpp>
+
+// Global test fixture. Dues to boost deficiency this can't be accessed. hence
+// TestFixture makes use of global data.
+BOOST_GLOBAL_FIXTURE( ViewTestFixture );
diff --git a/ecflow_4_0_7/view/test/TestView.cpp b/ecflow_4_0_7/view/test/TestView.cpp
new file mode 100644
index 0000000..0f3ea16
--- /dev/null
+++ b/ecflow_4_0_7/view/test/TestView.cpp
@@ -0,0 +1,126 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #5 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//============================================================================
+#include <iostream>
+#include <limits> // for std::numeric_limits<int>::max()
+#include <fstream>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <fcntl.h>
+
+#include "boost/filesystem/operations.hpp"
+#include "boost/filesystem/path.hpp"
+#include <boost/test/unit_test.hpp>
+#include "ServerTestHarness.hpp"
+#include "DurationTimer.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "File.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+BOOST_AUTO_TEST_SUITE( TestView  )
+
+static std::string ECFLOWVIEW_NAME = "ecflowview";
+
+std::string find_ecflowview_path()
+{
+	std::string binDir;
+	fs::path current_path = fs::current_path();
+	if ( current_path.stem() == "Test"
+	     || current_path.stem() == "view")
+		binDir = "../view/bin/";
+	else binDir = "view/bin/";
+
+	// We have 3 variants debug,release,profile
+#ifdef DEBUG
+	return File::findPath( binDir, ECFLOWVIEW_NAME, "debug" );
+#else
+	std::string path = File::findPath( binDir, ECFLOWVIEW_NAME, "release" );
+	if (path.empty()) {
+		path = File::findPath( binDir, ECFLOWVIEW_NAME, "profile" );
+	}
+	return path;
+#endif
+}
+
+void send_cmd(int fd, char* cmd) {
+  std::cout << cmd;
+  write(fd, cmd, strlen(cmd));
+  ::sleep(2);
+}
+
+BOOST_AUTO_TEST_CASE( test_view )
+{
+   DurationTimer timer;
+   cout << "View:: ...test_view\n"<< flush;
+
+   std::string theViewInvokePath = find_ecflowview_path();
+   if (theViewInvokePath.empty()) {
+      std::cout << "ecflowview is not generated, test stops silently\n";
+      return;
+   }
+
+   Defs theDefs; {
+      suite_ptr suite = theDefs.add_suite( "test_view" ) ;
+      suite->add_variable("SLEEPTIME","0");
+      task_ptr task_a = suite->add_task("task_a");
+      task_a->addMeter( Meter("meter",0,20,20) );
+      task_a->addEvent( Event(1,"event") );
+      task_a->addLabel( Label("task_a_label","Label1") );
+   }
+
+   // Start server if not already started, load the defs, and start playing
+   // The test harness will create corresponding directory structure & default ecf file
+   ServerTestHarness serverTestHarness;
+   serverTestHarness.run(theDefs,
+			 ServerTestHarness::testDataDefsLocation("test_view.def"),
+			 30, // timeout
+			 false // do not wait for test completion
+			 );
+
+   // Ecflowview set up
+   std::string HOME = getenv("HOME");
+   std::string rcdir   = HOME + "/.ecflowrc_test";
+   if ( !fs::exists( rcdir ) )  fs::create_directory(rcdir);
+
+   std::string pipename = "/tmp/ecflowview_pipe";
+   std::string servers = rcdir + "/servers";
+   std::string options = rcdir + "/localhost.options";
+
+   std::string cmd = "echo localhost localhost ${ECF_PORT:-3141} > " + servers;
+   cmd += "\necho -e 'connect:false\nsuites: test_view\n' > " + options;
+   cmd += "\nexport ECFLOWVIEW_INPUT=" + pipename + " ECFLOWRC=" + rcdir;
+   cmd += "\nif [ ! -p $ECFLOWVIEW_INPUT ]; then rm -f $ECFLOWVIEW_INPUT; mknod $ECFLOWVIEW_INPUT p; fi;\n";
+   cmd += theViewInvokePath;
+   cmd += "&";
+     
+//   std::cout << cmd;
+   if ( system( cmd.c_str() ) != 0)  assert(false); // failed
+   ::sleep(2);
+   int fd = open(pipename.c_str(), O_WRONLY);
+   send_cmd(fd, (char*)"login localhost\n");
+   send_cmd(fd, (char*)"logout localhost\n");
+   send_cmd(fd, (char*)"quit\n");
+
+   // remove generated data
+   fs::remove(pipename.c_str());
+   fs::remove_all(rcdir);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/ecflow_4_0_7/view/test/ViewTestFixture.hpp b/ecflow_4_0_7/view/test/ViewTestFixture.hpp
new file mode 100644
index 0000000..6c9c012
--- /dev/null
+++ b/ecflow_4_0_7/view/test/ViewTestFixture.hpp
@@ -0,0 +1,33 @@
+#ifndef VIEWTESTFIXTURE_HPP_
+#define VIEWTESTFIXTURE_HPP_
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #13 $ 
+//
+// Copyright 2009-2012 ECMWF. 
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the privileges and immunities 
+// granted to it by virtue of its status as an intergovernmental organisation 
+// nor does it submit to any jurisdiction. 
+//
+// Description : This Fixture facilitates the test of client/server on different platforms
+//
+//============================================================================
+
+#include <string>
+#include "TestFixture.hpp"
+class Defs;
+
+struct ViewTestFixture : public TestFixture {
+
+	// Constructor will invoke the server, destructor will kill the server
+	// Since this class is static, the constructor/destructor can not call
+	// any of BOOST MACRO, since the unit test will not be there.
+	// When running across platforms will will assume server is already running
+   ViewTestFixture() : TestFixture("view") {}
+	~ViewTestFixture() {}
+};
+
+#endif
diff --git a/ecflow_4_0_7/view/test/test_flags.sh b/ecflow_4_0_7/view/test/test_flags.sh
new file mode 100755
index 0000000..81d7a4a
--- /dev/null
+++ b/ecflow_4_0_7/view/test/test_flags.sh
@@ -0,0 +1,27 @@
+#!/bin/ksh
+
+PORT=3199
+CLIENT="../Client/bin/gcc-4.5/debug/ecflow_client --port $PORT"
+DEF=tool/test.def
+SUITE=/gui
+
+flags="force_aborted  user_edit  task_aborted  edit_failed 
+       ecfcmd_failed  no_script  killed  migrated  late 
+       message  queue_limit complete task_waiting  locked  zombie" 
+# u(o) e(g) a e
+# s xx k triangle 
+# msg c xx xx xx Z
+
+$CLIENT --delete $SUITE
+$CLIENT --load $DEF
+$CLIENT --begin $SUITE
+
+# for cmd  in set_flag clear_flag; do
+for cmd  in set_flag; do
+for node in / $SUITE $SUITE/a $SUITE/a/b/cc; do
+for flag in $flags; do
+   $CLIENT --alter $cmd $flag $node
+done
+done
+sleep 5
+done
diff --git a/ecflow_4_0_7/view/tool/reload.sdef b/ecflow_4_0_7/view/tool/reload.sdef
new file mode 100644
index 0000000..f062f6d
--- /dev/null
+++ b/ecflow_4_0_7/view/tool/reload.sdef
@@ -0,0 +1,97 @@
+# alias ecf=/var/tmp/map/work/p4/merlin/workspace/MyProject/Client/bin/gcc-4.5/debug/ecflow_client
+# ecf --port 3199 --host ibis --replace /reload tool/reload.sdef
+suite reload
+  defstatus suspended
+  # repeat date YMD 20120101 20120101 1
+  limit  limit 30
+  inlimit /reload:limit
+  date 1.*.*
+  # time 12:00 # NOK
+  # cron 12:00 13:00 00:10
+  # meter step -1 100 90 # NOK
+  event 1
+  # label info "" # NOK
+
+  edit SMSTRIES 1 
+  edit ECF_TRIES 1
+
+  edit SMSCMD '%SMSJOB% > %SMSJOBOUT% 2>&1'
+  edit ECF_CMD '%SMSJOB% > %SMSJOBOUT% 2>&1'
+
+  edit SMSKILLCMD 'kill -15 %SMSRID%'
+  edit ECF_KILL_CMD 'kill -15 %ECF_RID%'
+
+  edit SMSSTATUSCMD   'ps -lf -p %SMSRID%'
+  edit ECF_STATUS_CMD 'ps -lf -p %ECF_RID%'
+
+  edit SMSFILES  /home/ma/map/bin/sms2ecf/smsfiles
+  edit ECF_FILES /home/ma/map/bin/sms2ecf/smsfiles
+
+  edit SMSINCLUDE  /home/ma/map/bin/sms2ecf/include
+  edit ECF_INCLUDE /home/ma/map/bin/sms2ecf/include
+
+  edit RELOAD_FROM_NODE localhost
+  edit RELOAD_FROM_PROG 314159
+  edit RELOAD_FROM_PORT 3199
+  edit RELOAD_FROM_PATH /ealadin
+  edit RELOAD_FROM_KIND ECF
+
+  edit RELOAD_TO_NODE localhost
+  edit RELOAD_TO_PROG 314159
+  edit RELOAD_TO_PORT 20130
+  edit RELOAD_TO_NAME /ealadin
+  edit RELOAD_TO_KIND ECF
+
+  family limits
+   limit  limit 30
+   limit mutex 1
+  endfamily
+
+  family process
+    inlimit limits:mutex
+    trigger process ne aborted
+
+    task get; label info ''
+    task convert; #      trigger get eq complete
+    task load; #         trigger convert eq complete
+  endfamily
+
+  family test_repeat
+  family date
+  date 1.*.*
+  today 12:00
+  task a1; repeat date YMD 20120101 20120101 1
+  task a2; repeat date YMD 20120101 20120102 1
+  task a3; repeat date YMD 20120101 20120103 1
+  task a4; repeat date YMD 20120101 20120104 1
+  task a5; repeat date YMD 20120101 20120105 1
+  
+  endfamily
+
+  family int
+  day sunday
+  task a1; repeat integer INT 20120101 20120101 1
+  task a2; repeat integer INT 20120101 20120102 1
+  task a3; repeat integer INT 20120101 20120103 1
+  task a4; repeat integer INT 20120101 20120104 1
+  task a5; repeat integer INT 20120101 20120105 1
+  endfamily
+
+  family str
+  task a1; repeat string STR "0" 
+  task a2; repeat string STR "0" "1"
+  task a3; repeat string STR "0" "1" "2"
+  task a4; repeat string STR "0" "1" "2" "3" 
+  task a5; repeat string STR "0" "1" "2" "3" "4"
+  endfamily
+
+  family enum
+  # task a1; repeat enumerate ENU "0" 
+  task a2; repeat enumerated ENU "0" "1"
+  task a3; repeat enumerated ENU "0" "1" "2"
+  task a4; repeat enumerated ENU "0" "1" "2" "3" 
+  task a5; repeat enumerated ENU "0" "1" "2" "3" "4"
+  endfamily
+
+  endfamily
+endsuite

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ecflow.git



More information about the debian-science-commits mailing list